Notebook

More About Strings

[1]:
s = 'Hello World'
type(s)
[1]:
str
[2]:
'Hello World'
[2]:
'Hello World'
[3]:
print(s)
Hello World
[4]:
s
[4]:
'Hello World'
[5]:
'We don\'t have much money'
[5]:
"We don't have much money"
[6]:
"We don't have much money"
[6]:
"We don't have much money"
[7]:
"\"'"
[7]:
'"\''
[8]:
windows_path = 'C:\Windows\neue Festplatte'
[9]:
print(windows_path)
C:\Windows
eue Festplatte
[10]:
windows_path = 'C:\\Windows\\neue Festplatte'
print(windows_path)
C:\Windows\neue Festplatte
[11]:
windows_path = r'C:\Windows\neue Festplatte'
print(windows_path)
C:\Windows\neue Festplatte
[12]:
line = '   1234 Joerg  Faschingbauer    [Lehrer]  '
[13]:
regex = r'^\s*(\d+)\s+(\.+)\s+(\.+)\s+[(\.+)]\s*$'
import re
match = re.search(regex, line)
print(match)
None

Multiline Strings (docstrings?)

[14]:
s = '''Hello
World'''
print(s)
Hello
World
[15]:
# This function adds two values. These two values can be anything,
# but both values must support the '+' operator.

# Parameters:
# * a
# * b
# Return: a+b (of the same type that the '+' operator produces
# when ....)
def add(a, b):
    return a+b
print(add(1, 2))
3
[16]:
def add(a, b):
    '''
    This function adds two values. These two values can be anything,
    but both values must support the '+' operator.

    Parameters:
    * a
    * b
    Return: a+b (of the same type that the '+' operator produces
    when ....)
    '''
    return a+b
print(add(1, 2))
3
[17]:
add
[17]:
<function __main__.add(a, b)>
[18]:
add.__doc__
[18]:
"\n    This function adds two values. These two values can be anything, \n    but both values must support the '+' operator.\n\n    Parameters:\n    * a\n    * b\n    Return: a+b (of the same type that the '+' operator produces \n    when ....)\n    "
[19]:
help(add)
Help on function add in module __main__:

add(a, b)
    This function adds two values. These two values can be anything,
    but both values must support the '+' operator.

    Parameters:
    * a
    * b
    Return: a+b (of the same type that the '+' operator produces
    when ....)

[20]:
import sys
help(sys)
Help on built-in module sys:

NAME
    sys

MODULE REFERENCE
    https://docs.python.org/3.9/library/sys

    The following documentation is automatically generated from the Python
    source files.  It may be incomplete, incorrect or include features that
    are considered implementation detail and may vary between Python
    implementations.  When in doubt, consult the module reference at the
    location listed above.

DESCRIPTION
    This module provides access to some objects used or maintained by the
    interpreter and to functions that interact strongly with the interpreter.

    Dynamic objects:

    argv -- command line arguments; argv[0] is the script pathname if known
    path -- module search path; path[0] is the script directory, else ''
    modules -- dictionary of loaded modules

    displayhook -- called to show results in an interactive session
    excepthook -- called to handle any uncaught exception other than SystemExit
      To customize printing in an interactive session or to install a custom
      top-level exception handler, assign other functions to replace these.

    stdin -- standard input file object; used by input()
    stdout -- standard output file object; used by print()
    stderr -- standard error object; used for error messages
      By assigning other file objects (or objects that behave like files)
      to these, it is possible to redirect all of the interpreter's I/O.

    last_type -- type of last uncaught exception
    last_value -- value of last uncaught exception
    last_traceback -- traceback of last uncaught exception
      These three are only available in an interactive session after a
      traceback has been printed.

    Static objects:

    builtin_module_names -- tuple of module names built into this interpreter
    copyright -- copyright notice pertaining to this interpreter
    exec_prefix -- prefix used to find the machine-specific Python library
    executable -- absolute path of the executable binary of the Python interpreter
    float_info -- a named tuple with information about the float implementation.
    float_repr_style -- string indicating the style of repr() output for floats
    hash_info -- a named tuple with information about the hash algorithm.
    hexversion -- version information encoded as a single integer
    implementation -- Python implementation information.
    int_info -- a named tuple with information about the int implementation.
    maxsize -- the largest supported length of containers.
    maxunicode -- the value of the largest Unicode code point
    platform -- platform identifier
    prefix -- prefix used to find the Python library
    thread_info -- a named tuple with information about the thread implementation.
    version -- the version of this interpreter as a string
    version_info -- version information as a named tuple
    __stdin__ -- the original stdin; don't touch!
    __stdout__ -- the original stdout; don't touch!
    __stderr__ -- the original stderr; don't touch!
    __displayhook__ -- the original displayhook; don't touch!
    __excepthook__ -- the original excepthook; don't touch!

    Functions:

    displayhook() -- print an object to the screen, and save it in builtins._
    excepthook() -- print an exception and its traceback to sys.stderr
    exc_info() -- return thread-safe information about the current exception
    exit() -- exit the interpreter by raising SystemExit
    getdlopenflags() -- returns flags to be used for dlopen() calls
    getprofile() -- get the global profiling function
    getrefcount() -- return the reference count for an object (plus one :-)
    getrecursionlimit() -- return the max recursion depth for the interpreter
    getsizeof() -- return the size of an object in bytes
    gettrace() -- get the global debug tracing function
    setdlopenflags() -- set the flags to be used for dlopen() calls
    setprofile() -- set the global profiling function
    setrecursionlimit() -- set the max recursion depth for the interpreter
    settrace() -- set the global debug tracing function

FUNCTIONS
    __breakpointhook__ = breakpointhook(...)
        breakpointhook(*args, **kws)

        This hook function is called by built-in breakpoint().

    __displayhook__ = displayhook(object, /)
        Print an object to sys.stdout and also save it in builtins._

    __excepthook__ = excepthook(exctype, value, traceback, /)
        Handle an exception by displaying it with a traceback on sys.stderr.

    __unraisablehook__ = unraisablehook(unraisable, /)
        Handle an unraisable exception.

        The unraisable argument has the following attributes:

        * exc_type: Exception type.
        * exc_value: Exception value, can be None.
        * exc_traceback: Exception traceback, can be None.
        * err_msg: Error message, can be None.
        * object: Object causing the exception, can be None.

    addaudithook(hook)
        Adds a new audit hook callback.

    audit(...)
        audit(event, *args)

        Passes the event to any audit hooks that are attached.

    call_tracing(func, args, /)
        Call func(*args), while tracing is enabled.

        The tracing state is saved, and restored afterwards.  This is intended
        to be called from a debugger from a checkpoint, to recursively debug
        some other code.

    exc_info()
        Return current exception information: (type, value, traceback).

        Return information about the most recent exception caught by an except
        clause in the current stack frame or in an older stack frame.

    exit(status=None, /)
        Exit the interpreter by raising SystemExit(status).

        If the status is omitted or None, it defaults to zero (i.e., success).
        If the status is an integer, it will be used as the system exit status.
        If it is another kind of object, it will be printed and the system
        exit status will be one (i.e., failure).

    get_asyncgen_hooks()
        Return the installed asynchronous generators hooks.

        This returns a namedtuple of the form (firstiter, finalizer).

    get_coroutine_origin_tracking_depth()
        Check status of origin tracking for coroutine objects in this thread.

    getallocatedblocks()
        Return the number of memory blocks currently allocated.

    getdefaultencoding()
        Return the current default encoding used by the Unicode implementation.

    getdlopenflags()
        Return the current value of the flags that are used for dlopen calls.

        The flag constants are defined in the os module.

    getfilesystemencodeerrors()
        Return the error mode used Unicode to OS filename conversion.

    getfilesystemencoding()
        Return the encoding used to convert Unicode filenames to OS filenames.

    getprofile()
        Return the profiling function set with sys.setprofile.

        See the profiler chapter in the library manual.

    getrecursionlimit()
        Return the current value of the recursion limit.

        The recursion limit is the maximum depth of the Python interpreter
        stack.  This limit prevents infinite recursion from causing an overflow
        of the C stack and crashing Python.

    getrefcount(object, /)
        Return the reference count of object.

        The count returned is generally one higher than you might expect,
        because it includes the (temporary) reference as an argument to
        getrefcount().

    getsizeof(...)
        getsizeof(object [, default]) -> int

        Return the size of object in bytes.

    getswitchinterval()
        Return the current thread switch interval; see sys.setswitchinterval().

    gettrace()
        Return the global debug tracing function set with sys.settrace.

        See the debugger chapter in the library manual.

    intern(string, /)
        ``Intern'' the given string.

        This enters the string in the (global) table of interned strings whose
        purpose is to speed up dictionary lookups. Return the string itself or
        the previously interned string object with the same value.

    is_finalizing()
        Return True if Python is exiting.

    set_asyncgen_hooks(...)
        set_asyncgen_hooks(* [, firstiter] [, finalizer])

        Set a finalizer for async generators objects.

    set_coroutine_origin_tracking_depth(depth)
        Enable or disable origin tracking for coroutine objects in this thread.

        Coroutine objects will track 'depth' frames of traceback information
        about where they came from, available in their cr_origin attribute.

        Set a depth of 0 to disable.

    setdlopenflags(flags, /)
        Set the flags used by the interpreter for dlopen calls.

        This is used, for example, when the interpreter loads extension
        modules. Among other things, this will enable a lazy resolving of
        symbols when importing a module, if called as sys.setdlopenflags(0).
        To share symbols across extension modules, call as
        sys.setdlopenflags(os.RTLD_GLOBAL).  Symbolic names for the flag
        modules can be found in the os module (RTLD_xxx constants, e.g.
        os.RTLD_LAZY).

    setprofile(...)
        setprofile(function)

        Set the profiling function.  It will be called on each function call
        and return.  See the profiler chapter in the library manual.

    setrecursionlimit(limit, /)
        Set the maximum depth of the Python interpreter stack to n.

        This limit prevents infinite recursion from causing an overflow of the C
        stack and crashing Python.  The highest possible limit is platform-
        dependent.

    setswitchinterval(interval, /)
        Set the ideal thread switching delay inside the Python interpreter.

        The actual frequency of switching threads can be lower if the
        interpreter executes long sequences of uninterruptible code
        (this is implementation-specific and workload-dependent).

        The parameter must represent the desired switching delay in seconds
        A typical value is 0.005 (5 milliseconds).

    settrace(...)
        settrace(function)

        Set the global debug tracing function.  It will be called on each
        function call.  See the debugger chapter in the library manual.

    unraisablehook(unraisable, /)
        Handle an unraisable exception.

        The unraisable argument has the following attributes:

        * exc_type: Exception type.
        * exc_value: Exception value, can be None.
        * exc_traceback: Exception traceback, can be None.
        * err_msg: Error message, can be None.
        * object: Object causing the exception, can be None.

DATA
    __stderr__ = <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf...
    __stdin__ = <_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8...
    __stdout__ = <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf...
    abiflags = ''
    api_version = 1013
    argv = ['/home/jfasch/venv/jfasch-home/lib64/python3.9/site-packages/i...
    base_exec_prefix = '/usr'
    base_prefix = '/usr'
    builtin_module_names = ('_abc', '_ast', '_codecs', '_collections', '_f...
    byteorder = 'little'
    copyright = 'Copyright (c) 2001-2021 Python Software Foundati...ematis...
    displayhook = <ipykernel.displayhook.ZMQShellDisplayHook object>
    dont_write_bytecode = False
    exec_prefix = '/home/jfasch/venv/jfasch-home'
    executable = '/home/jfasch/venv/jfasch-home/bin/python'
    flags = sys.flags(debug=0, inspect=0, interactive=0, opt...ation=1, is...
    float_info = sys.float_info(max=1.7976931348623157e+308, max_...epsilo...
    float_repr_style = 'short'
    hash_info = sys.hash_info(width=64, modulus=2305843009213693...iphash2...
    hexversion = 50923504
    implementation = namespace(name='cpython', cache_tag='cpython-39'...xv...
    int_info = sys.int_info(bits_per_digit=30, sizeof_digit=4)
    maxsize = 9223372036854775807
    maxunicode = 1114111
    meta_path = [<class '_frozen_importlib.BuiltinImporter'>, <class '_fro...
    modules = {'IPython': <module 'IPython' from '/home/jfasch/venv/jfasch...
    path = ['/home/jfasch/work/jfasch-home/trainings/log/detail/2021-12-01...
    path_hooks = [<class 'zipimport.zipimporter'>, <function FileFinder.pa...
    path_importer_cache = {'/home/jfasch/.ipython': FileFinder('/home/jfas...
    platform = 'linux'
    platlibdir = 'lib64'
    prefix = '/home/jfasch/venv/jfasch-home'
    ps1 = 'In : '
    ps2 = '...: '
    ps3 = 'Out: '
    pycache_prefix = None
    stderr = <ipykernel.iostream.OutStream object>
    stdin = <_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>
    stdout = <ipykernel.iostream.OutStream object>
    thread_info = sys.thread_info(name='pthread', lock='semaphore', versio...
    version = '3.9.7 (default, Aug 30 2021, 00:00:00) \n[GCC 11.2.1 202107...
    version_info = sys.version_info(major=3, minor=9, micro=7, releaseleve...
    warnoptions = []

FILE
    (built-in)


References

A variable refers to an object (an integer, with value 42 in this case)

[21]:
a = 42
id(a)
[21]:
140106795875920

Assigning variables to other variables only increments the reference count.

[22]:
b = a
id(b)
[22]:
140106795875920

Integer increment? Are integers mutable?

[23]:
c = 666
d = c
[24]:
id(c)
[24]:
140106669190640
[25]:
id(d)
[25]:
140106669190640
[26]:
c += 3
[27]:
c
[27]:
669
[28]:
d
[28]:
666

Ah: ‘+=’ creates a new object

[29]:
id(c)
[29]:
140106669191024

Compound Datatypes

List, Tuple

[30]:
l = ['one', 2, 3.0]
[31]:
type(l)
[31]:
list
[32]:
for element in l:
    print(element)
one
2
3.0
[33]:
l.append(complex(4,0))
[34]:
l
[34]:
['one', 2, 3.0, (4+0j)]
[35]:
l.extend([5, 6, 7])
l
[35]:
['one', 2, 3.0, (4+0j), 5, 6, 7]
[36]:
l.insert(0, None)
l
[36]:
[None, 'one', 2, 3.0, (4+0j), 5, 6, 7]
[37]:
for element in l:
    print(element)
None
one
2
3.0
(4+0j)
5
6
7
[38]:
del l[3]
[39]:
l
[39]:
[None, 'one', 2, (4+0j), 5, 6, 7]
[40]:
copied_l = l
[41]:
copied_l
[41]:
[None, 'one', 2, (4+0j), 5, 6, 7]
[42]:
l
[42]:
[None, 'one', 2, (4+0j), 5, 6, 7]
[43]:
id(l)
[43]:
140106669249856
[44]:
l.append(10000000)
l
[44]:
[None, 'one', 2, (4+0j), 5, 6, 7, 10000000]
[45]:
id(l)
[45]:
140106669249856
[46]:
id(copied_l)
[46]:
140106669249856
[47]:
copied_l
[47]:
[None, 'one', 2, (4+0j), 5, 6, 7, 10000000]

Enter Tuples …

[48]:
t = ('one', 2, 3.0)
[49]:
t
[49]:
('one', 2, 3.0)
[50]:
type(t)
[50]:
tuple
[51]:
copied_t = t
[52]:
try:
    t.append(10000000)
except Exception as e:
    print(type(e), e)
<class 'AttributeError'> 'tuple' object has no attribute 'append'
[53]:
tuple_containing_one_element = (1)
type(tuple_containing_one_element)
[53]:
int
[54]:
1 + 2 * 3
[54]:
7
[55]:
(1 + 2) * 3
[55]:
9
[56]:
tuple_containing_one_element = (1,)
type(tuple_containing_one_element)
[56]:
tuple

Sequence: ‘+’ operator

[57]:
l1 = [1,2,3]
l2 = [4,5,6]
l1 + l2
[57]:
[1, 2, 3, 4, 5, 6]
[58]:
l1
[58]:
[1, 2, 3]
[59]:
l2
[59]:
[4, 5, 6]

Dictionary

[60]:
trans = {
    'one': 1,
    'two': 2,
}
[61]:
type(trans)
[61]:
dict
[62]:
trans['three'] = 3
[63]:
trans
[63]:
{'one': 1, 'two': 2, 'three': 3}
[64]:
import pprint
[65]:
pprint.pprint(trans, width=10)
{'one': 1,
 'three': 3,
 'two': 2}
[66]:
trans['three']
[66]:
3
[67]:
try:
    trans['four']
except Exception as e:
    print(type(e), e)
<class 'KeyError'> 'four'
[68]:
value = trans.get('three')
if value:
    print(value)
else:
    print('na, leider nicht')
3
[69]:
value = trans.get('four')
if value:
    print(value)
else:
    print('na, leider nicht')
na, leider nicht

None? NoneType?

[70]:
print(value)
None
[71]:
type(value)
[71]:
NoneType

Boolean value of None?

[72]:
bool(None)
[72]:
False
[73]:
bool(5)
[73]:
True
[74]:
bool(0)
[74]:
False
[75]:
trans['zero'] = 0
pprint.pprint(trans, width=10)
{'one': 1,
 'three': 3,
 'two': 2,
 'zero': 0}
[76]:
value = trans.get('zero')
if value:    # "found"
    print(value)
else:
    print('na, leider nicht')
na, leider nicht
[77]:
value = trans.get('zero')
if value is not None:
    print(value)
else:
    print('na, leider nicht')
0

Remove entries

[78]:
del trans['zero']
[79]:
trans
[79]:
{'one': 1, 'two': 2, 'three': 3}

Set

[80]:
s = {1,2,3,4,5}
type(s)
[80]:
set
[81]:
4 in s
[81]:
True
[82]:
s.remove(4)
[83]:
4 in s
[83]:
False
[84]:
s.add(4)
[85]:
s
[85]:
{1, 2, 3, 4, 5}

Iteration

List

[86]:
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
for element in l:
    print(element)
1
2
3
4
5
6
7
8
9
0
[87]:
9 in l
[87]:
True

Tuple

[88]:
t = (1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
for element in t:
    print(element)
1
2
3
4
5
6
7
8
9
0

Set

[89]:
s = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
for element in s:
    print(element)
0
1
2
3
4
5
6
7
8
9

Note: sets are not ordered!

[90]:
9 in s
[90]:
True

Dictionary

[91]:
d = {
    'one': 1,
    'two': 2,
    'three': 3,
    }
[92]:
for element in d:
    print(element)
one
two
three
[93]:
'one' in d
[93]:
True
[94]:
for element in d.values():
    print(element)
1
2
3
[95]:
for element in d.keys():
    print(element)
one
two
three
[96]:
for element in d.items():
    print(element)
('one', 1)
('two', 2)
('three', 3)

Potschert: manual tuple unpacking

[97]:
for element in d.items():
    key = element[0]
    value = element[1]
    print(f'Key: {key}, Value: {value}')
Key: one, Value: 1
Key: two, Value: 2
Key: three, Value: 3
[98]:
for key, value in d.items():
    print(f'Key: {key}, Value: {value}')
Key: one, Value: 1
Key: two, Value: 2
Key: three, Value: 3

Tuple Unpacking: What Else

[99]:
l = [
    [1234, 'joerg', 55],
    [666, 'satan', 10**10],
    [42, 'queen', 10*2],
]
[100]:
for svnr, name, age in l:
    print(f'SVNr:{svnr}, Name:{name}, Age:{age}')
SVNr:1234, Name:joerg, Age:55
SVNr:666, Name:satan, Age:10000000000
SVNr:42, Name:queen, Age:20
[101]:
a, b = 1, 2
[102]:
a
[102]:
1
[103]:
b
[103]:
2

Same as:

[104]:
(a, b) = (1, 2)

Swap two variables:

[105]:
a, b = b, a
[106]:
a
[106]:
2
[107]:
b
[107]:
1
[108]:
a, b, = 1, 2,

Swap, traditional

[109]:
c = a
a = b
b = c
[110]:
a
[110]:
2
[111]:
b
[111]:
1

Function returns multiple values

[112]:
def f(a, b):
    return a+b
[113]:
f(1,2)
[113]:
3
[114]:
def f(a, b):
    return a+b, a-b, a*b, a/b
[115]:
sum, diff, prod, quot = f(100, 50)
[116]:
sum
[116]:
150
[117]:
diff
[117]:
50
[118]:
prod
[118]:
5000
[119]:
quot
[119]:
2.0

Comprehensions

[120]:
numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9)
[121]:
def squares(iterable):
    sq = []
    for i in iterable:
        sq.append(i**2)
    return sq
[122]:
result = squares(numbers)
result
[122]:
[1, 4, 9, 16, 25, 36, 49, 64, 81]

List comprehension

[123]:
result = [n**2 for n in numbers]
result
[123]:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
[124]:
[n**2 for n in numbers if n%2==0]
[124]:
[4, 16, 36, 64]

Set comprehension

[125]:
result = {n**2 for n in numbers}
result
[125]:
{1, 4, 9, 16, 25, 36, 49, 64, 81}

Dictionary comprehension

Mapping Number->Square number

[126]:
result = {n: n**2 for n in numbers}
pprint.pprint(result, width=5)
{1: 1,
 2: 4,
 3: 9,
 4: 16,
 5: 25,
 6: 36,
 7: 49,
 8: 64,
 9: 81}

WTF? How would I use that?

[127]:
resultset = [
    [1234, 'joerg', 55],
    [666, 'satan', 10**10],
    [42, 'queen', 10*2],
]

Dictionary: SVNr -> (Name, Age)

[128]:
def resultset_to_local_db(rs):
    d = {}
    for svnr, name, age in rs:
        d[svnr] = (name, age)
    return d
[129]:
my_local_db = resultset_to_local_db(resultset)
[130]:
my_local_db
[130]:
{1234: ('joerg', 55), 666: ('satan', 10000000000), 42: ('queen', 20)}

Potschert!!

[131]:
my_local_db = {svnr: (name, age) for svnr, name, age in resultset}
my_local_db
[131]:
{1234: ('joerg', 55), 666: ('satan', 10000000000), 42: ('queen', 20)}

os.path

[132]:
import os.path
[133]:
filename = '/home/jfasch/tmp/2021-12-01/tests/__init__.py'

Directory Name?

[134]:
dirname = os.path.dirname(filename)
dirname
[134]:
'/home/jfasch/tmp/2021-12-01/tests'
[135]:
os.path.basename(filename)
[135]:
'__init__.py'
[136]:
path = os.path.join(dirname, '../src')
path
[136]:
'/home/jfasch/tmp/2021-12-01/tests/../src'
[137]:
normalized_path = os.path.normpath(path)
normalized_path
[137]:
'/home/jfasch/tmp/2021-12-01/src'
[138]:
import os
[139]:
os.sep     # Doze: '\\' (r'\'))
[139]:
'/'
[140]:
os.path.join('..', 'src')
[140]:
'../src'
[141]:
os.path.split(normalized_path)
[141]:
('/home/jfasch/tmp/2021-12-01', 'src')

Iterable

[142]:
s = 'abc'
for element in s:
    print(element)
a
b
c
[143]:
l = [0, 1, 2, 3, 4]
for element in l:
    print(element)
0
1
2
3
4

``range()``

[144]:
l = []
i = 0
while i < 1000:
    l.append(i)
    i += 1
[145]:
l
[145]:
[0,
 1,
 2,
 3,
 4,
 5,
 6,
 7,
 8,
 9,
 10,
 11,
 12,
 13,
 14,
 15,
 16,
 17,
 18,
 19,
 20,
 21,
 22,
 23,
 24,
 25,
 26,
 27,
 28,
 29,
 30,
 31,
 32,
 33,
 34,
 35,
 36,
 37,
 38,
 39,
 40,
 41,
 42,
 43,
 44,
 45,
 46,
 47,
 48,
 49,
 50,
 51,
 52,
 53,
 54,
 55,
 56,
 57,
 58,
 59,
 60,
 61,
 62,
 63,
 64,
 65,
 66,
 67,
 68,
 69,
 70,
 71,
 72,
 73,
 74,
 75,
 76,
 77,
 78,
 79,
 80,
 81,
 82,
 83,
 84,
 85,
 86,
 87,
 88,
 89,
 90,
 91,
 92,
 93,
 94,
 95,
 96,
 97,
 98,
 99,
 100,
 101,
 102,
 103,
 104,
 105,
 106,
 107,
 108,
 109,
 110,
 111,
 112,
 113,
 114,
 115,
 116,
 117,
 118,
 119,
 120,
 121,
 122,
 123,
 124,
 125,
 126,
 127,
 128,
 129,
 130,
 131,
 132,
 133,
 134,
 135,
 136,
 137,
 138,
 139,
 140,
 141,
 142,
 143,
 144,
 145,
 146,
 147,
 148,
 149,
 150,
 151,
 152,
 153,
 154,
 155,
 156,
 157,
 158,
 159,
 160,
 161,
 162,
 163,
 164,
 165,
 166,
 167,
 168,
 169,
 170,
 171,
 172,
 173,
 174,
 175,
 176,
 177,
 178,
 179,
 180,
 181,
 182,
 183,
 184,
 185,
 186,
 187,
 188,
 189,
 190,
 191,
 192,
 193,
 194,
 195,
 196,
 197,
 198,
 199,
 200,
 201,
 202,
 203,
 204,
 205,
 206,
 207,
 208,
 209,
 210,
 211,
 212,
 213,
 214,
 215,
 216,
 217,
 218,
 219,
 220,
 221,
 222,
 223,
 224,
 225,
 226,
 227,
 228,
 229,
 230,
 231,
 232,
 233,
 234,
 235,
 236,
 237,
 238,
 239,
 240,
 241,
 242,
 243,
 244,
 245,
 246,
 247,
 248,
 249,
 250,
 251,
 252,
 253,
 254,
 255,
 256,
 257,
 258,
 259,
 260,
 261,
 262,
 263,
 264,
 265,
 266,
 267,
 268,
 269,
 270,
 271,
 272,
 273,
 274,
 275,
 276,
 277,
 278,
 279,
 280,
 281,
 282,
 283,
 284,
 285,
 286,
 287,
 288,
 289,
 290,
 291,
 292,
 293,
 294,
 295,
 296,
 297,
 298,
 299,
 300,
 301,
 302,
 303,
 304,
 305,
 306,
 307,
 308,
 309,
 310,
 311,
 312,
 313,
 314,
 315,
 316,
 317,
 318,
 319,
 320,
 321,
 322,
 323,
 324,
 325,
 326,
 327,
 328,
 329,
 330,
 331,
 332,
 333,
 334,
 335,
 336,
 337,
 338,
 339,
 340,
 341,
 342,
 343,
 344,
 345,
 346,
 347,
 348,
 349,
 350,
 351,
 352,
 353,
 354,
 355,
 356,
 357,
 358,
 359,
 360,
 361,
 362,
 363,
 364,
 365,
 366,
 367,
 368,
 369,
 370,
 371,
 372,
 373,
 374,
 375,
 376,
 377,
 378,
 379,
 380,
 381,
 382,
 383,
 384,
 385,
 386,
 387,
 388,
 389,
 390,
 391,
 392,
 393,
 394,
 395,
 396,
 397,
 398,
 399,
 400,
 401,
 402,
 403,
 404,
 405,
 406,
 407,
 408,
 409,
 410,
 411,
 412,
 413,
 414,
 415,
 416,
 417,
 418,
 419,
 420,
 421,
 422,
 423,
 424,
 425,
 426,
 427,
 428,
 429,
 430,
 431,
 432,
 433,
 434,
 435,
 436,
 437,
 438,
 439,
 440,
 441,
 442,
 443,
 444,
 445,
 446,
 447,
 448,
 449,
 450,
 451,
 452,
 453,
 454,
 455,
 456,
 457,
 458,
 459,
 460,
 461,
 462,
 463,
 464,
 465,
 466,
 467,
 468,
 469,
 470,
 471,
 472,
 473,
 474,
 475,
 476,
 477,
 478,
 479,
 480,
 481,
 482,
 483,
 484,
 485,
 486,
 487,
 488,
 489,
 490,
 491,
 492,
 493,
 494,
 495,
 496,
 497,
 498,
 499,
 500,
 501,
 502,
 503,
 504,
 505,
 506,
 507,
 508,
 509,
 510,
 511,
 512,
 513,
 514,
 515,
 516,
 517,
 518,
 519,
 520,
 521,
 522,
 523,
 524,
 525,
 526,
 527,
 528,
 529,
 530,
 531,
 532,
 533,
 534,
 535,
 536,
 537,
 538,
 539,
 540,
 541,
 542,
 543,
 544,
 545,
 546,
 547,
 548,
 549,
 550,
 551,
 552,
 553,
 554,
 555,
 556,
 557,
 558,
 559,
 560,
 561,
 562,
 563,
 564,
 565,
 566,
 567,
 568,
 569,
 570,
 571,
 572,
 573,
 574,
 575,
 576,
 577,
 578,
 579,
 580,
 581,
 582,
 583,
 584,
 585,
 586,
 587,
 588,
 589,
 590,
 591,
 592,
 593,
 594,
 595,
 596,
 597,
 598,
 599,
 600,
 601,
 602,
 603,
 604,
 605,
 606,
 607,
 608,
 609,
 610,
 611,
 612,
 613,
 614,
 615,
 616,
 617,
 618,
 619,
 620,
 621,
 622,
 623,
 624,
 625,
 626,
 627,
 628,
 629,
 630,
 631,
 632,
 633,
 634,
 635,
 636,
 637,
 638,
 639,
 640,
 641,
 642,
 643,
 644,
 645,
 646,
 647,
 648,
 649,
 650,
 651,
 652,
 653,
 654,
 655,
 656,
 657,
 658,
 659,
 660,
 661,
 662,
 663,
 664,
 665,
 666,
 667,
 668,
 669,
 670,
 671,
 672,
 673,
 674,
 675,
 676,
 677,
 678,
 679,
 680,
 681,
 682,
 683,
 684,
 685,
 686,
 687,
 688,
 689,
 690,
 691,
 692,
 693,
 694,
 695,
 696,
 697,
 698,
 699,
 700,
 701,
 702,
 703,
 704,
 705,
 706,
 707,
 708,
 709,
 710,
 711,
 712,
 713,
 714,
 715,
 716,
 717,
 718,
 719,
 720,
 721,
 722,
 723,
 724,
 725,
 726,
 727,
 728,
 729,
 730,
 731,
 732,
 733,
 734,
 735,
 736,
 737,
 738,
 739,
 740,
 741,
 742,
 743,
 744,
 745,
 746,
 747,
 748,
 749,
 750,
 751,
 752,
 753,
 754,
 755,
 756,
 757,
 758,
 759,
 760,
 761,
 762,
 763,
 764,
 765,
 766,
 767,
 768,
 769,
 770,
 771,
 772,
 773,
 774,
 775,
 776,
 777,
 778,
 779,
 780,
 781,
 782,
 783,
 784,
 785,
 786,
 787,
 788,
 789,
 790,
 791,
 792,
 793,
 794,
 795,
 796,
 797,
 798,
 799,
 800,
 801,
 802,
 803,
 804,
 805,
 806,
 807,
 808,
 809,
 810,
 811,
 812,
 813,
 814,
 815,
 816,
 817,
 818,
 819,
 820,
 821,
 822,
 823,
 824,
 825,
 826,
 827,
 828,
 829,
 830,
 831,
 832,
 833,
 834,
 835,
 836,
 837,
 838,
 839,
 840,
 841,
 842,
 843,
 844,
 845,
 846,
 847,
 848,
 849,
 850,
 851,
 852,
 853,
 854,
 855,
 856,
 857,
 858,
 859,
 860,
 861,
 862,
 863,
 864,
 865,
 866,
 867,
 868,
 869,
 870,
 871,
 872,
 873,
 874,
 875,
 876,
 877,
 878,
 879,
 880,
 881,
 882,
 883,
 884,
 885,
 886,
 887,
 888,
 889,
 890,
 891,
 892,
 893,
 894,
 895,
 896,
 897,
 898,
 899,
 900,
 901,
 902,
 903,
 904,
 905,
 906,
 907,
 908,
 909,
 910,
 911,
 912,
 913,
 914,
 915,
 916,
 917,
 918,
 919,
 920,
 921,
 922,
 923,
 924,
 925,
 926,
 927,
 928,
 929,
 930,
 931,
 932,
 933,
 934,
 935,
 936,
 937,
 938,
 939,
 940,
 941,
 942,
 943,
 944,
 945,
 946,
 947,
 948,
 949,
 950,
 951,
 952,
 953,
 954,
 955,
 956,
 957,
 958,
 959,
 960,
 961,
 962,
 963,
 964,
 965,
 966,
 967,
 968,
 969,
 970,
 971,
 972,
 973,
 974,
 975,
 976,
 977,
 978,
 979,
 980,
 981,
 982,
 983,
 984,
 985,
 986,
 987,
 988,
 989,
 990,
 991,
 992,
 993,
 994,
 995,
 996,
 997,
 998,
 999]

STUPID!

[146]:
r = range(3)
for element in r:
    print(element)
0
1
2

Iterator Protocol

A list is iterable

[147]:
l = [3, 4, 5]
iterator = iter(l)
[148]:
element = next(iterator)
element
[148]:
3
[149]:
element = next(iterator)
element
[149]:
4
[150]:
element = next(iterator)
element
[150]:
5
[151]:
try:
    element = next(iterator)
except Exception as e:
    print(type(e), e)
<class 'StopIteration'>

A ``range`` object is iterable

[152]:
r = range(3)
for element in r:
    print(element)
0
1
2
[153]:
for element in range(3, 6):
    print(element)
3
4
5
[154]:
for element in range(4, 20, 2):
    print(element)
4
6
8
10
12
14
16
18
[155]:
timeaxis = range(1000)
iterator = iter(timeaxis)
[156]:
next(iterator)
[156]:
0
[157]:
while True:
    try:
        print(next(iterator))
    except StopIteration:
        break
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999

yield

A naive function:

[158]:
def myrange(begin, end, step):
    l = []
    element = begin
    while element < end:
        l.append(element)
        element += step
    return l
[159]:
for element in myrange(4, 20, 2):
    print(element)
4
6
8
10
12
14
16
18
[160]:
for element in myrange(4, 20000, 2):
    print(element)
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44
46
48
50
52
54
56
58
60
62
64
66
68
70
72
74
76
78
80
82
84
86
88
90
92
94
96
98
100
102
104
106
108
110
112
114
116
118
120
122
124
126
128
130
132
134
136
138
140
142
144
146
148
150
152
154
156
158
160
162
164
166
168
170
172
174
176
178
180
182
184
186
188
190
192
194
196
198
200
202
204
206
208
210
212
214
216
218
220
222
224
226
228
230
232
234
236
238
240
242
244
246
248
250
252
254
256
258
260
262
264
266
268
270
272
274
276
278
280
282
284
286
288
290
292
294
296
298
300
302
304
306
308
310
312
314
316
318
320
322
324
326
328
330
332
334
336
338
340
342
344
346
348
350
352
354
356
358
360
362
364
366
368
370
372
374
376
378
380
382
384
386
388
390
392
394
396
398
400
402
404
406
408
410
412
414
416
418
420
422
424
426
428
430
432
434
436
438
440
442
444
446
448
450
452
454
456
458
460
462
464
466
468
470
472
474
476
478
480
482
484
486
488
490
492
494
496
498
500
502
504
506
508
510
512
514
516
518
520
522
524
526
528
530
532
534
536
538
540
542
544
546
548
550
552
554
556
558
560
562
564
566
568
570
572
574
576
578
580
582
584
586
588
590
592
594
596
598
600
602
604
606
608
610
612
614
616
618
620
622
624
626
628
630
632
634
636
638
640
642
644
646
648
650
652
654
656
658
660
662
664
666
668
670
672
674
676
678
680
682
684
686
688
690
692
694
696
698
700
702
704
706
708
710
712
714
716
718
720
722
724
726
728
730
732
734
736
738
740
742
744
746
748
750
752
754
756
758
760
762
764
766
768
770
772
774
776
778
780
782
784
786
788
790
792
794
796
798
800
802
804
806
808
810
812
814
816
818
820
822
824
826
828
830
832
834
836
838
840
842
844
846
848
850
852
854
856
858
860
862
864
866
868
870
872
874
876
878
880
882
884
886
888
890
892
894
896
898
900
902
904
906
908
910
912
914
916
918
920
922
924
926
928
930
932
934
936
938
940
942
944
946
948
950
952
954
956
958
960
962
964
966
968
970
972
974
976
978
980
982
984
986
988
990
992
994
996
998
1000
1002
1004
1006
1008
1010
1012
1014
1016
1018
1020
1022
1024
1026
1028
1030
1032
1034
1036
1038
1040
1042
1044
1046
1048
1050
1052
1054
1056
1058
1060
1062
1064
1066
1068
1070
1072
1074
1076
1078
1080
1082
1084
1086
1088
1090
1092
1094
1096
1098
1100
1102
1104
1106
1108
1110
1112
1114
1116
1118
1120
1122
1124
1126
1128
1130
1132
1134
1136
1138
1140
1142
1144
1146
1148
1150
1152
1154
1156
1158
1160
1162
1164
1166
1168
1170
1172
1174
1176
1178
1180
1182
1184
1186
1188
1190
1192
1194
1196
1198
1200
1202
1204
1206
1208
1210
1212
1214
1216
1218
1220
1222
1224
1226
1228
1230
1232
1234
1236
1238
1240
1242
1244
1246
1248
1250
1252
1254
1256
1258
1260
1262
1264
1266
1268
1270
1272
1274
1276
1278
1280
1282
1284
1286
1288
1290
1292
1294
1296
1298
1300
1302
1304
1306
1308
1310
1312
1314
1316
1318
1320
1322
1324
1326
1328
1330
1332
1334
1336
1338
1340
1342
1344
1346
1348
1350
1352
1354
1356
1358
1360
1362
1364
1366
1368
1370
1372
1374
1376
1378
1380
1382
1384
1386
1388
1390
1392
1394
1396
1398
1400
1402
1404
1406
1408
1410
1412
1414
1416
1418
1420
1422
1424
1426
1428
1430
1432
1434
1436
1438
1440
1442
1444
1446
1448
1450
1452
1454
1456
1458
1460
1462
1464
1466
1468
1470
1472
1474
1476
1478
1480
1482
1484
1486
1488
1490
1492
1494
1496
1498
1500
1502
1504
1506
1508
1510
1512
1514
1516
1518
1520
1522
1524
1526
1528
1530
1532
1534
1536
1538
1540
1542
1544
1546
1548
1550
1552
1554
1556
1558
1560
1562
1564
1566
1568
1570
1572
1574
1576
1578
1580
1582
1584
1586
1588
1590
1592
1594
1596
1598
1600
1602
1604
1606
1608
1610
1612
1614
1616
1618
1620
1622
1624
1626
1628
1630
1632
1634
1636
1638
1640
1642
1644
1646
1648
1650
1652
1654
1656
1658
1660
1662
1664
1666
1668
1670
1672
1674
1676
1678
1680
1682
1684
1686
1688
1690
1692
1694
1696
1698
1700
1702
1704
1706
1708
1710
1712
1714
1716
1718
1720
1722
1724
1726
1728
1730
1732
1734
1736
1738
1740
1742
1744
1746
1748
1750
1752
1754
1756
1758
1760
1762
1764
1766
1768
1770
1772
1774
1776
1778
1780
1782
1784
1786
1788
1790
1792
1794
1796
1798
1800
1802
1804
1806
1808
1810
1812
1814
1816
1818
1820
1822
1824
1826
1828
1830
1832
1834
1836
1838
1840
1842
1844
1846
1848
1850
1852
1854
1856
1858
1860
1862
1864
1866
1868
1870
1872
1874
1876
1878
1880
1882
1884
1886
1888
1890
1892
1894
1896
1898
1900
1902
1904
1906
1908
1910
1912
1914
1916
1918
1920
1922
1924
1926
1928
1930
1932
1934
1936
1938
1940
1942
1944
1946
1948
1950
1952
1954
1956
1958
1960
1962
1964
1966
1968
1970
1972
1974
1976
1978
1980
1982
1984
1986
1988
1990
1992
1994
1996
1998
2000
2002
2004
2006
2008
2010
2012
2014
2016
2018
2020
2022
2024
2026
2028
2030
2032
2034
2036
2038
2040
2042
2044
2046
2048
2050
2052
2054
2056
2058
2060
2062
2064
2066
2068
2070
2072
2074
2076
2078
2080
2082
2084
2086
2088
2090
2092
2094
2096
2098
2100
2102
2104
2106
2108
2110
2112
2114
2116
2118
2120
2122
2124
2126
2128
2130
2132
2134
2136
2138
2140
2142
2144
2146
2148
2150
2152
2154
2156
2158
2160
2162
2164
2166
2168
2170
2172
2174
2176
2178
2180
2182
2184
2186
2188
2190
2192
2194
2196
2198
2200
2202
2204
2206
2208
2210
2212
2214
2216
2218
2220
2222
2224
2226
2228
2230
2232
2234
2236
2238
2240
2242
2244
2246
2248
2250
2252
2254
2256
2258
2260
2262
2264
2266
2268
2270
2272
2274
2276
2278
2280
2282
2284
2286
2288
2290
2292
2294
2296
2298
2300
2302
2304
2306
2308
2310
2312
2314
2316
2318
2320
2322
2324
2326
2328
2330
2332
2334
2336
2338
2340
2342
2344
2346
2348
2350
2352
2354
2356
2358
2360
2362
2364
2366
2368
2370
2372
2374
2376
2378
2380
2382
2384
2386
2388
2390
2392
2394
2396
2398
2400
2402
2404
2406
2408
2410
2412
2414
2416
2418
2420
2422
2424
2426
2428
2430
2432
2434
2436
2438
2440
2442
2444
2446
2448
2450
2452
2454
2456
2458
2460
2462
2464
2466
2468
2470
2472
2474
2476
2478
2480
2482
2484
2486
2488
2490
2492
2494
2496
2498
2500
2502
2504
2506
2508
2510
2512
2514
2516
2518
2520
2522
2524
2526
2528
2530
2532
2534
2536
2538
2540
2542
2544
2546
2548
2550
2552
2554
2556
2558
2560
2562
2564
2566
2568
2570
2572
2574
2576
2578
2580
2582
2584
2586
2588
2590
2592
2594
2596
2598
2600
2602
2604
2606
2608
2610
2612
2614
2616
2618
2620
2622
2624
2626
2628
2630
2632
2634
2636
2638
2640
2642
2644
2646
2648
2650
2652
2654
2656
2658
2660
2662
2664
2666
2668
2670
2672
2674
2676
2678
2680
2682
2684
2686
2688
2690
2692
2694
2696
2698
2700
2702
2704
2706
2708
2710
2712
2714
2716
2718
2720
2722
2724
2726
2728
2730
2732
2734
2736
2738
2740
2742
2744
2746
2748
2750
2752
2754
2756
2758
2760
2762
2764
2766
2768
2770
2772
2774
2776
2778
2780
2782
2784
2786
2788
2790
2792
2794
2796
2798
2800
2802
2804
2806
2808
2810
2812
2814
2816
2818
2820
2822
2824
2826
2828
2830
2832
2834
2836
2838
2840
2842
2844
2846
2848
2850
2852
2854
2856
2858
2860
2862
2864
2866
2868
2870
2872
2874
2876
2878
2880
2882
2884
2886
2888
2890
2892
2894
2896
2898
2900
2902
2904
2906
2908
2910
2912
2914
2916
2918
2920
2922
2924
2926
2928
2930
2932
2934
2936
2938
2940
2942
2944
2946
2948
2950
2952
2954
2956
2958
2960
2962
2964
2966
2968
2970
2972
2974
2976
2978
2980
2982
2984
2986
2988
2990
2992
2994
2996
2998
3000
3002
3004
3006
3008
3010
3012
3014
3016
3018
3020
3022
3024
3026
3028
3030
3032
3034
3036
3038
3040
3042
3044
3046
3048
3050
3052
3054
3056
3058
3060
3062
3064
3066
3068
3070
3072
3074
3076
3078
3080
3082
3084
3086
3088
3090
3092
3094
3096
3098
3100
3102
3104
3106
3108
3110
3112
3114
3116
3118
3120
3122
3124
3126
3128
3130
3132
3134
3136
3138
3140
3142
3144
3146
3148
3150
3152
3154
3156
3158
3160
3162
3164
3166
3168
3170
3172
3174
3176
3178
3180
3182
3184
3186
3188
3190
3192
3194
3196
3198
3200
3202
3204
3206
3208
3210
3212
3214
3216
3218
3220
3222
3224
3226
3228
3230
3232
3234
3236
3238
3240
3242
3244
3246
3248
3250
3252
3254
3256
3258
3260
3262
3264
3266
3268
3270
3272
3274
3276
3278
3280
3282
3284
3286
3288
3290
3292
3294
3296
3298
3300
3302
3304
3306
3308
3310
3312
3314
3316
3318
3320
3322
3324
3326
3328
3330
3332
3334
3336
3338
3340
3342
3344
3346
3348
3350
3352
3354
3356
3358
3360
3362
3364
3366
3368
3370
3372
3374
3376
3378
3380
3382
3384
3386
3388
3390
3392
3394
3396
3398
3400
3402
3404
3406
3408
3410
3412
3414
3416
3418
3420
3422
3424
3426
3428
3430
3432
3434
3436
3438
3440
3442
3444
3446
3448
3450
3452
3454
3456
3458
3460
3462
3464
3466
3468
3470
3472
3474
3476
3478
3480
3482
3484
3486
3488
3490
3492
3494
3496
3498
3500
3502
3504
3506
3508
3510
3512
3514
3516
3518
3520
3522
3524
3526
3528
3530
3532
3534
3536
3538
3540
3542
3544
3546
3548
3550
3552
3554
3556
3558
3560
3562
3564
3566
3568
3570
3572
3574
3576
3578
3580
3582
3584
3586
3588
3590
3592
3594
3596
3598
3600
3602
3604
3606
3608
3610
3612
3614
3616
3618
3620
3622
3624
3626
3628
3630
3632
3634
3636
3638
3640
3642
3644
3646
3648
3650
3652
3654
3656
3658
3660
3662
3664
3666
3668
3670
3672
3674
3676
3678
3680
3682
3684
3686
3688
3690
3692
3694
3696
3698
3700
3702
3704
3706
3708
3710
3712
3714
3716
3718
3720
3722
3724
3726
3728
3730
3732
3734
3736
3738
3740
3742
3744
3746
3748
3750
3752
3754
3756
3758
3760
3762
3764
3766
3768
3770
3772
3774
3776
3778
3780
3782
3784
3786
3788
3790
3792
3794
3796
3798
3800
3802
3804
3806
3808
3810
3812
3814
3816
3818
3820
3822
3824
3826
3828
3830
3832
3834
3836
3838
3840
3842
3844
3846
3848
3850
3852
3854
3856
3858
3860
3862
3864
3866
3868
3870
3872
3874
3876
3878
3880
3882
3884
3886
3888
3890
3892
3894
3896
3898
3900
3902
3904
3906
3908
3910
3912
3914
3916
3918
3920
3922
3924
3926
3928
3930
3932
3934
3936
3938
3940
3942
3944
3946
3948
3950
3952
3954
3956
3958
3960
3962
3964
3966
3968
3970
3972
3974
3976
3978
3980
3982
3984
3986
3988
3990
3992
3994
3996
3998
4000
4002
4004
4006
4008
4010
4012
4014
4016
4018
4020
4022
4024
4026
4028
4030
4032
4034
4036
4038
4040
4042
4044
4046
4048
4050
4052
4054
4056
4058
4060
4062
4064
4066
4068
4070
4072
4074
4076
4078
4080
4082
4084
4086
4088
4090
4092
4094
4096
4098
4100
4102
4104
4106
4108
4110
4112
4114
4116
4118
4120
4122
4124
4126
4128
4130
4132
4134
4136
4138
4140
4142
4144
4146
4148
4150
4152
4154
4156
4158
4160
4162
4164
4166
4168
4170
4172
4174
4176
4178
4180
4182
4184
4186
4188
4190
4192
4194
4196
4198
4200
4202
4204
4206
4208
4210
4212
4214
4216
4218
4220
4222
4224
4226
4228
4230
4232
4234
4236
4238
4240
4242
4244
4246
4248
4250
4252
4254
4256
4258
4260
4262
4264
4266
4268
4270
4272
4274
4276
4278
4280
4282
4284
4286
4288
4290
4292
4294
4296
4298
4300
4302
4304
4306
4308
4310
4312
4314
4316
4318
4320
4322
4324
4326
4328
4330
4332
4334
4336
4338
4340
4342
4344
4346
4348
4350
4352
4354
4356
4358
4360
4362
4364
4366
4368
4370
4372
4374
4376
4378
4380
4382
4384
4386
4388
4390
4392
4394
4396
4398
4400
4402
4404
4406
4408
4410
4412
4414
4416
4418
4420
4422
4424
4426
4428
4430
4432
4434
4436
4438
4440
4442
4444
4446
4448
4450
4452
4454
4456
4458
4460
4462
4464
4466
4468
4470
4472
4474
4476
4478
4480
4482
4484
4486
4488
4490
4492
4494
4496
4498
4500
4502
4504
4506
4508
4510
4512
4514
4516
4518
4520
4522
4524
4526
4528
4530
4532
4534
4536
4538
4540
4542
4544
4546
4548
4550
4552
4554
4556
4558
4560
4562
4564
4566
4568
4570
4572
4574
4576
4578
4580
4582
4584
4586
4588
4590
4592
4594
4596
4598
4600
4602
4604
4606
4608
4610
4612
4614
4616
4618
4620
4622
4624
4626
4628
4630
4632
4634
4636
4638
4640
4642
4644
4646
4648
4650
4652
4654
4656
4658
4660
4662
4664
4666
4668
4670
4672
4674
4676
4678
4680
4682
4684
4686
4688
4690
4692
4694
4696
4698
4700
4702
4704
4706
4708
4710
4712
4714
4716
4718
4720
4722
4724
4726
4728
4730
4732
4734
4736
4738
4740
4742
4744
4746
4748
4750
4752
4754
4756
4758
4760
4762
4764
4766
4768
4770
4772
4774
4776
4778
4780
4782
4784
4786
4788
4790
4792
4794
4796
4798
4800
4802
4804
4806
4808
4810
4812
4814
4816
4818
4820
4822
4824
4826
4828
4830
4832
4834
4836
4838
4840
4842
4844
4846
4848
4850
4852
4854
4856
4858
4860
4862
4864
4866
4868
4870
4872
4874
4876
4878
4880
4882
4884
4886
4888
4890
4892
4894
4896
4898
4900
4902
4904
4906
4908
4910
4912
4914
4916
4918
4920
4922
4924
4926
4928
4930
4932
4934
4936
4938
4940
4942
4944
4946
4948
4950
4952
4954
4956
4958
4960
4962
4964
4966
4968
4970
4972
4974
4976
4978
4980
4982
4984
4986
4988
4990
4992
4994
4996
4998
5000
5002
5004
5006
5008
5010
5012
5014
5016
5018
5020
5022
5024
5026
5028
5030
5032
5034
5036
5038
5040
5042
5044
5046
5048
5050
5052
5054
5056
5058
5060
5062
5064
5066
5068
5070
5072
5074
5076
5078
5080
5082
5084
5086
5088
5090
5092
5094
5096
5098
5100
5102
5104
5106
5108
5110
5112
5114
5116
5118
5120
5122
5124
5126
5128
5130
5132
5134
5136
5138
5140
5142
5144
5146
5148
5150
5152
5154
5156
5158
5160
5162
5164
5166
5168
5170
5172
5174
5176
5178
5180
5182
5184
5186
5188
5190
5192
5194
5196
5198
5200
5202
5204
5206
5208
5210
5212
5214
5216
5218
5220
5222
5224
5226
5228
5230
5232
5234
5236
5238
5240
5242
5244
5246
5248
5250
5252
5254
5256
5258
5260
5262
5264
5266
5268
5270
5272
5274
5276
5278
5280
5282
5284
5286
5288
5290
5292
5294
5296
5298
5300
5302
5304
5306
5308
5310
5312
5314
5316
5318
5320
5322
5324
5326
5328
5330
5332
5334
5336
5338
5340
5342
5344
5346
5348
5350
5352
5354
5356
5358
5360
5362
5364
5366
5368
5370
5372
5374
5376
5378
5380
5382
5384
5386
5388
5390
5392
5394
5396
5398
5400
5402
5404
5406
5408
5410
5412
5414
5416
5418
5420
5422
5424
5426
5428
5430
5432
5434
5436
5438
5440
5442
5444
5446
5448
5450
5452
5454
5456
5458
5460
5462
5464
5466
5468
5470
5472
5474
5476
5478
5480
5482
5484
5486
5488
5490
5492
5494
5496
5498
5500
5502
5504
5506
5508
5510
5512
5514
5516
5518
5520
5522
5524
5526
5528
5530
5532
5534
5536
5538
5540
5542
5544
5546
5548
5550
5552
5554
5556
5558
5560
5562
5564
5566
5568
5570
5572
5574
5576
5578
5580
5582
5584
5586
5588
5590
5592
5594
5596
5598
5600
5602
5604
5606
5608
5610
5612
5614
5616
5618
5620
5622
5624
5626
5628
5630
5632
5634
5636
5638
5640
5642
5644
5646
5648
5650
5652
5654
5656
5658
5660
5662
5664
5666
5668
5670
5672
5674
5676
5678
5680
5682
5684
5686
5688
5690
5692
5694
5696
5698
5700
5702
5704
5706
5708
5710
5712
5714
5716
5718
5720
5722
5724
5726
5728
5730
5732
5734
5736
5738
5740
5742
5744
5746
5748
5750
5752
5754
5756
5758
5760
5762
5764
5766
5768
5770
5772
5774
5776
5778
5780
5782
5784
5786
5788
5790
5792
5794
5796
5798
5800
5802
5804
5806
5808
5810
5812
5814
5816
5818
5820
5822
5824
5826
5828
5830
5832
5834
5836
5838
5840
5842
5844
5846
5848
5850
5852
5854
5856
5858
5860
5862
5864
5866
5868
5870
5872
5874
5876
5878
5880
5882
5884
5886
5888
5890
5892
5894
5896
5898
5900
5902
5904
5906
5908
5910
5912
5914
5916
5918
5920
5922
5924
5926
5928
5930
5932
5934
5936
5938
5940
5942
5944
5946
5948
5950
5952
5954
5956
5958
5960
5962
5964
5966
5968
5970
5972
5974
5976
5978
5980
5982
5984
5986
5988
5990
5992
5994
5996
5998
6000
6002
6004
6006
6008
6010
6012
6014
6016
6018
6020
6022
6024
6026
6028
6030
6032
6034
6036
6038
6040
6042
6044
6046
6048
6050
6052
6054
6056
6058
6060
6062
6064
6066
6068
6070
6072
6074
6076
6078
6080
6082
6084
6086
6088
6090
6092
6094
6096
6098
6100
6102
6104
6106
6108
6110
6112
6114
6116
6118
6120
6122
6124
6126
6128
6130
6132
6134
6136
6138
6140
6142
6144
6146
6148
6150
6152
6154
6156
6158
6160
6162
6164
6166
6168
6170
6172
6174
6176
6178
6180
6182
6184
6186
6188
6190
6192
6194
6196
6198
6200
6202
6204
6206
6208
6210
6212
6214
6216
6218
6220
6222
6224
6226
6228
6230
6232
6234
6236
6238
6240
6242
6244
6246
6248
6250
6252
6254
6256
6258
6260
6262
6264
6266
6268
6270
6272
6274
6276
6278
6280
6282
6284
6286
6288
6290
6292
6294
6296
6298
6300
6302
6304
6306
6308
6310
6312
6314
6316
6318
6320
6322
6324
6326
6328
6330
6332
6334
6336
6338
6340
6342
6344
6346
6348
6350
6352
6354
6356
6358
6360
6362
6364
6366
6368
6370
6372
6374
6376
6378
6380
6382
6384
6386
6388
6390
6392
6394
6396
6398
6400
6402
6404
6406
6408
6410
6412
6414
6416
6418
6420
6422
6424
6426
6428
6430
6432
6434
6436
6438
6440
6442
6444
6446
6448
6450
6452
6454
6456
6458
6460
6462
6464
6466
6468
6470
6472
6474
6476
6478
6480
6482
6484
6486
6488
6490
6492
6494
6496
6498
6500
6502
6504
6506
6508
6510
6512
6514
6516
6518
6520
6522
6524
6526
6528
6530
6532
6534
6536
6538
6540
6542
6544
6546
6548
6550
6552
6554
6556
6558
6560
6562
6564
6566
6568
6570
6572
6574
6576
6578
6580
6582
6584
6586
6588
6590
6592
6594
6596
6598
6600
6602
6604
6606
6608
6610
6612
6614
6616
6618
6620
6622
6624
6626
6628
6630
6632
6634
6636
6638
6640
6642
6644
6646
6648
6650
6652
6654
6656
6658
6660
6662
6664
6666
6668
6670
6672
6674
6676
6678
6680
6682
6684
6686
6688
6690
6692
6694
6696
6698
6700
6702
6704
6706
6708
6710
6712
6714
6716
6718
6720
6722
6724
6726
6728
6730
6732
6734
6736
6738
6740
6742
6744
6746
6748
6750
6752
6754
6756
6758
6760
6762
6764
6766
6768
6770
6772
6774
6776
6778
6780
6782
6784
6786
6788
6790
6792
6794
6796
6798
6800
6802
6804
6806
6808
6810
6812
6814
6816
6818
6820
6822
6824
6826
6828
6830
6832
6834
6836
6838
6840
6842
6844
6846
6848
6850
6852
6854
6856
6858
6860
6862
6864
6866
6868
6870
6872
6874
6876
6878
6880
6882
6884
6886
6888
6890
6892
6894
6896
6898
6900
6902
6904
6906
6908
6910
6912
6914
6916
6918
6920
6922
6924
6926
6928
6930
6932
6934
6936
6938
6940
6942
6944
6946
6948
6950
6952
6954
6956
6958
6960
6962
6964
6966
6968
6970
6972
6974
6976
6978
6980
6982
6984
6986
6988
6990
6992
6994
6996
6998
7000
7002
7004
7006
7008
7010
7012
7014
7016
7018
7020
7022
7024
7026
7028
7030
7032
7034
7036
7038
7040
7042
7044
7046
7048
7050
7052
7054
7056
7058
7060
7062
7064
7066
7068
7070
7072
7074
7076
7078
7080
7082
7084
7086
7088
7090
7092
7094
7096
7098
7100
7102
7104
7106
7108
7110
7112
7114
7116
7118
7120
7122
7124
7126
7128
7130
7132
7134
7136
7138
7140
7142
7144
7146
7148
7150
7152
7154
7156
7158
7160
7162
7164
7166
7168
7170
7172
7174
7176
7178
7180
7182
7184
7186
7188
7190
7192
7194
7196
7198
7200
7202
7204
7206
7208
7210
7212
7214
7216
7218
7220
7222
7224
7226
7228
7230
7232
7234
7236
7238
7240
7242
7244
7246
7248
7250
7252
7254
7256
7258
7260
7262
7264
7266
7268
7270
7272
7274
7276
7278
7280
7282
7284
7286
7288
7290
7292
7294
7296
7298
7300
7302
7304
7306
7308
7310
7312
7314
7316
7318
7320
7322
7324
7326
7328
7330
7332
7334
7336
7338
7340
7342
7344
7346
7348
7350
7352
7354
7356
7358
7360
7362
7364
7366
7368
7370
7372
7374
7376
7378
7380
7382
7384
7386
7388
7390
7392
7394
7396
7398
7400
7402
7404
7406
7408
7410
7412
7414
7416
7418
7420
7422
7424
7426
7428
7430
7432
7434
7436
7438
7440
7442
7444
7446
7448
7450
7452
7454
7456
7458
7460
7462
7464
7466
7468
7470
7472
7474
7476
7478
7480
7482
7484
7486
7488
7490
7492
7494
7496
7498
7500
7502
7504
7506
7508
7510
7512
7514
7516
7518
7520
7522
7524
7526
7528
7530
7532
7534
7536
7538
7540
7542
7544
7546
7548
7550
7552
7554
7556
7558
7560
7562
7564
7566
7568
7570
7572
7574
7576
7578
7580
7582
7584
7586
7588
7590
7592
7594
7596
7598
7600
7602
7604
7606
7608
7610
7612
7614
7616
7618
7620
7622
7624
7626
7628
7630
7632
7634
7636
7638
7640
7642
7644
7646
7648
7650
7652
7654
7656
7658
7660
7662
7664
7666
7668
7670
7672
7674
7676
7678
7680
7682
7684
7686
7688
7690
7692
7694
7696
7698
7700
7702
7704
7706
7708
7710
7712
7714
7716
7718
7720
7722
7724
7726
7728
7730
7732
7734
7736
7738
7740
7742
7744
7746
7748
7750
7752
7754
7756
7758
7760
7762
7764
7766
7768
7770
7772
7774
7776
7778
7780
7782
7784
7786
7788
7790
7792
7794
7796
7798
7800
7802
7804
7806
7808
7810
7812
7814
7816
7818
7820
7822
7824
7826
7828
7830
7832
7834
7836
7838
7840
7842
7844
7846
7848
7850
7852
7854
7856
7858
7860
7862
7864
7866
7868
7870
7872
7874
7876
7878
7880
7882
7884
7886
7888
7890
7892
7894
7896
7898
7900
7902
7904
7906
7908
7910
7912
7914
7916
7918
7920
7922
7924
7926
7928
7930
7932
7934
7936
7938
7940
7942
7944
7946
7948
7950
7952
7954
7956
7958
7960
7962
7964
7966
7968
7970
7972
7974
7976
7978
7980
7982
7984
7986
7988
7990
7992
7994
7996
7998
8000
8002
8004
8006
8008
8010
8012
8014
8016
8018
8020
8022
8024
8026
8028
8030
8032
8034
8036
8038
8040
8042
8044
8046
8048
8050
8052
8054
8056
8058
8060
8062
8064
8066
8068
8070
8072
8074
8076
8078
8080
8082
8084
8086
8088
8090
8092
8094
8096
8098
8100
8102
8104
8106
8108
8110
8112
8114
8116
8118
8120
8122
8124
8126
8128
8130
8132
8134
8136
8138
8140
8142
8144
8146
8148
8150
8152
8154
8156
8158
8160
8162
8164
8166
8168
8170
8172
8174
8176
8178
8180
8182
8184
8186
8188
8190
8192
8194
8196
8198
8200
8202
8204
8206
8208
8210
8212
8214
8216
8218
8220
8222
8224
8226
8228
8230
8232
8234
8236
8238
8240
8242
8244
8246
8248
8250
8252
8254
8256
8258
8260
8262
8264
8266
8268
8270
8272
8274
8276
8278
8280
8282
8284
8286
8288
8290
8292
8294
8296
8298
8300
8302
8304
8306
8308
8310
8312
8314
8316
8318
8320
8322
8324
8326
8328
8330
8332
8334
8336
8338
8340
8342
8344
8346
8348
8350
8352
8354
8356
8358
8360
8362
8364
8366
8368
8370
8372
8374
8376
8378
8380
8382
8384
8386
8388
8390
8392
8394
8396
8398
8400
8402
8404
8406
8408
8410
8412
8414
8416
8418
8420
8422
8424
8426
8428
8430
8432
8434
8436
8438
8440
8442
8444
8446
8448
8450
8452
8454
8456
8458
8460
8462
8464
8466
8468
8470
8472
8474
8476
8478
8480
8482
8484
8486
8488
8490
8492
8494
8496
8498
8500
8502
8504
8506
8508
8510
8512
8514
8516
8518
8520
8522
8524
8526
8528
8530
8532
8534
8536
8538
8540
8542
8544
8546
8548
8550
8552
8554
8556
8558
8560
8562
8564
8566
8568
8570
8572
8574
8576
8578
8580
8582
8584
8586
8588
8590
8592
8594
8596
8598
8600
8602
8604
8606
8608
8610
8612
8614
8616
8618
8620
8622
8624
8626
8628
8630
8632
8634
8636
8638
8640
8642
8644
8646
8648
8650
8652
8654
8656
8658
8660
8662
8664
8666
8668
8670
8672
8674
8676
8678
8680
8682
8684
8686
8688
8690
8692
8694
8696
8698
8700
8702
8704
8706
8708
8710
8712
8714
8716
8718
8720
8722
8724
8726
8728
8730
8732
8734
8736
8738
8740
8742
8744
8746
8748
8750
8752
8754
8756
8758
8760
8762
8764
8766
8768
8770
8772
8774
8776
8778
8780
8782
8784
8786
8788
8790
8792
8794
8796
8798
8800
8802
8804
8806
8808
8810
8812
8814
8816
8818
8820
8822
8824
8826
8828
8830
8832
8834
8836
8838
8840
8842
8844
8846
8848
8850
8852
8854
8856
8858
8860
8862
8864
8866
8868
8870
8872
8874
8876
8878
8880
8882
8884
8886
8888
8890
8892
8894
8896
8898
8900
8902
8904
8906
8908
8910
8912
8914
8916
8918
8920
8922
8924
8926
8928
8930
8932
8934
8936
8938
8940
8942
8944
8946
8948
8950
8952
8954
8956
8958
8960
8962
8964
8966
8968
8970
8972
8974
8976
8978
8980
8982
8984
8986
8988
8990
8992
8994
8996
8998
9000
9002
9004
9006
9008
9010
9012
9014
9016
9018
9020
9022
9024
9026
9028
9030
9032
9034
9036
9038
9040
9042
9044
9046
9048
9050
9052
9054
9056
9058
9060
9062
9064
9066
9068
9070
9072
9074
9076
9078
9080
9082
9084
9086
9088
9090
9092
9094
9096
9098
9100
9102
9104
9106
9108
9110
9112
9114
9116
9118
9120
9122
9124
9126
9128
9130
9132
9134
9136
9138
9140
9142
9144
9146
9148
9150
9152
9154
9156
9158
9160
9162
9164
9166
9168
9170
9172
9174
9176
9178
9180
9182
9184
9186
9188
9190
9192
9194
9196
9198
9200
9202
9204
9206
9208
9210
9212
9214
9216
9218
9220
9222
9224
9226
9228
9230
9232
9234
9236
9238
9240
9242
9244
9246
9248
9250
9252
9254
9256
9258
9260
9262
9264
9266
9268
9270
9272
9274
9276
9278
9280
9282
9284
9286
9288
9290
9292
9294
9296
9298
9300
9302
9304
9306
9308
9310
9312
9314
9316
9318
9320
9322
9324
9326
9328
9330
9332
9334
9336
9338
9340
9342
9344
9346
9348
9350
9352
9354
9356
9358
9360
9362
9364
9366
9368
9370
9372
9374
9376
9378
9380
9382
9384
9386
9388
9390
9392
9394
9396
9398
9400
9402
9404
9406
9408
9410
9412
9414
9416
9418
9420
9422
9424
9426
9428
9430
9432
9434
9436
9438
9440
9442
9444
9446
9448
9450
9452
9454
9456
9458
9460
9462
9464
9466
9468
9470
9472
9474
9476
9478
9480
9482
9484
9486
9488
9490
9492
9494
9496
9498
9500
9502
9504
9506
9508
9510
9512
9514
9516
9518
9520
9522
9524
9526
9528
9530
9532
9534
9536
9538
9540
9542
9544
9546
9548
9550
9552
9554
9556
9558
9560
9562
9564
9566
9568
9570
9572
9574
9576
9578
9580
9582
9584
9586
9588
9590
9592
9594
9596
9598
9600
9602
9604
9606
9608
9610
9612
9614
9616
9618
9620
9622
9624
9626
9628
9630
9632
9634
9636
9638
9640
9642
9644
9646
9648
9650
9652
9654
9656
9658
9660
9662
9664
9666
9668
9670
9672
9674
9676
9678
9680
9682
9684
9686
9688
9690
9692
9694
9696
9698
9700
9702
9704
9706
9708
9710
9712
9714
9716
9718
9720
9722
9724
9726
9728
9730
9732
9734
9736
9738
9740
9742
9744
9746
9748
9750
9752
9754
9756
9758
9760
9762
9764
9766
9768
9770
9772
9774
9776
9778
9780
9782
9784
9786
9788
9790
9792
9794
9796
9798
9800
9802
9804
9806
9808
9810
9812
9814
9816
9818
9820
9822
9824
9826
9828
9830
9832
9834
9836
9838
9840
9842
9844
9846
9848
9850
9852
9854
9856
9858
9860
9862
9864
9866
9868
9870
9872
9874
9876
9878
9880
9882
9884
9886
9888
9890
9892
9894
9896
9898
9900
9902
9904
9906
9908
9910
9912
9914
9916
9918
9920
9922
9924
9926
9928
9930
9932
9934
9936
9938
9940
9942
9944
9946
9948
9950
9952
9954
9956
9958
9960
9962
9964
9966
9968
9970
9972
9974
9976
9978
9980
9982
9984
9986
9988
9990
9992
9994
9996
9998
10000
10002
10004
10006
10008
10010
10012
10014
10016
10018
10020
10022
10024
10026
10028
10030
10032
10034
10036
10038
10040
10042
10044
10046
10048
10050
10052
10054
10056
10058
10060
10062
10064
10066
10068
10070
10072
10074
10076
10078
10080
10082
10084
10086
10088
10090
10092
10094
10096
10098
10100
10102
10104
10106
10108
10110
10112
10114
10116
10118
10120
10122
10124
10126
10128
10130
10132
10134
10136
10138
10140
10142
10144
10146
10148
10150
10152
10154
10156
10158
10160
10162
10164
10166
10168
10170
10172
10174
10176
10178
10180
10182
10184
10186
10188
10190
10192
10194
10196
10198
10200
10202
10204
10206
10208
10210
10212
10214
10216
10218
10220
10222
10224
10226
10228
10230
10232
10234
10236
10238
10240
10242
10244
10246
10248
10250
10252
10254
10256
10258
10260
10262
10264
10266
10268
10270
10272
10274
10276
10278
10280
10282
10284
10286
10288
10290
10292
10294
10296
10298
10300
10302
10304
10306
10308
10310
10312
10314
10316
10318
10320
10322
10324
10326
10328
10330
10332
10334
10336
10338
10340
10342
10344
10346
10348
10350
10352
10354
10356
10358
10360
10362
10364
10366
10368
10370
10372
10374
10376
10378
10380
10382
10384
10386
10388
10390
10392
10394
10396
10398
10400
10402
10404
10406
10408
10410
10412
10414
10416
10418
10420
10422
10424
10426
10428
10430
10432
10434
10436
10438
10440
10442
10444
10446
10448
10450
10452
10454
10456
10458
10460
10462
10464
10466
10468
10470
10472
10474
10476
10478
10480
10482
10484
10486
10488
10490
10492
10494
10496
10498
10500
10502
10504
10506
10508
10510
10512
10514
10516
10518
10520
10522
10524
10526
10528
10530
10532
10534
10536
10538
10540
10542
10544
10546
10548
10550
10552
10554
10556
10558
10560
10562
10564
10566
10568
10570
10572
10574
10576
10578
10580
10582
10584
10586
10588
10590
10592
10594
10596
10598
10600
10602
10604
10606
10608
10610
10612
10614
10616
10618
10620
10622
10624
10626
10628
10630
10632
10634
10636
10638
10640
10642
10644
10646
10648
10650
10652
10654
10656
10658
10660
10662
10664
10666
10668
10670
10672
10674
10676
10678
10680
10682
10684
10686
10688
10690
10692
10694
10696
10698
10700
10702
10704
10706
10708
10710
10712
10714
10716
10718
10720
10722
10724
10726
10728
10730
10732
10734
10736
10738
10740
10742
10744
10746
10748
10750
10752
10754
10756
10758
10760
10762
10764
10766
10768
10770
10772
10774
10776
10778
10780
10782
10784
10786
10788
10790
10792
10794
10796
10798
10800
10802
10804
10806
10808
10810
10812
10814
10816
10818
10820
10822
10824
10826
10828
10830
10832
10834
10836
10838
10840
10842
10844
10846
10848
10850
10852
10854
10856
10858
10860
10862
10864
10866
10868
10870
10872
10874
10876
10878
10880
10882
10884
10886
10888
10890
10892
10894
10896
10898
10900
10902
10904
10906
10908
10910
10912
10914
10916
10918
10920
10922
10924
10926
10928
10930
10932
10934
10936
10938
10940
10942
10944
10946
10948
10950
10952
10954
10956
10958
10960
10962
10964
10966
10968
10970
10972
10974
10976
10978
10980
10982
10984
10986
10988
10990
10992
10994
10996
10998
11000
11002
11004
11006
11008
11010
11012
11014
11016
11018
11020
11022
11024
11026
11028
11030
11032
11034
11036
11038
11040
11042
11044
11046
11048
11050
11052
11054
11056
11058
11060
11062
11064
11066
11068
11070
11072
11074
11076
11078
11080
11082
11084
11086
11088
11090
11092
11094
11096
11098
11100
11102
11104
11106
11108
11110
11112
11114
11116
11118
11120
11122
11124
11126
11128
11130
11132
11134
11136
11138
11140
11142
11144
11146
11148
11150
11152
11154
11156
11158
11160
11162
11164
11166
11168
11170
11172
11174
11176
11178
11180
11182
11184
11186
11188
11190
11192
11194
11196
11198
11200
11202
11204
11206
11208
11210
11212
11214
11216
11218
11220
11222
11224
11226
11228
11230
11232
11234
11236
11238
11240
11242
11244
11246
11248
11250
11252
11254
11256
11258
11260
11262
11264
11266
11268
11270
11272
11274
11276
11278
11280
11282
11284
11286
11288
11290
11292
11294
11296
11298
11300
11302
11304
11306
11308
11310
11312
11314
11316
11318
11320
11322
11324
11326
11328
11330
11332
11334
11336
11338
11340
11342
11344
11346
11348
11350
11352
11354
11356
11358
11360
11362
11364
11366
11368
11370
11372
11374
11376
11378
11380
11382
11384
11386
11388
11390
11392
11394
11396
11398
11400
11402
11404
11406
11408
11410
11412
11414
11416
11418
11420
11422
11424
11426
11428
11430
11432
11434
11436
11438
11440
11442
11444
11446
11448
11450
11452
11454
11456
11458
11460
11462
11464
11466
11468
11470
11472
11474
11476
11478
11480
11482
11484
11486
11488
11490
11492
11494
11496
11498
11500
11502
11504
11506
11508
11510
11512
11514
11516
11518
11520
11522
11524
11526
11528
11530
11532
11534
11536
11538
11540
11542
11544
11546
11548
11550
11552
11554
11556
11558
11560
11562
11564
11566
11568
11570
11572
11574
11576
11578
11580
11582
11584
11586
11588
11590
11592
11594
11596
11598
11600
11602
11604
11606
11608
11610
11612
11614
11616
11618
11620
11622
11624
11626
11628
11630
11632
11634
11636
11638
11640
11642
11644
11646
11648
11650
11652
11654
11656
11658
11660
11662
11664
11666
11668
11670
11672
11674
11676
11678
11680
11682
11684
11686
11688
11690
11692
11694
11696
11698
11700
11702
11704
11706
11708
11710
11712
11714
11716
11718
11720
11722
11724
11726
11728
11730
11732
11734
11736
11738
11740
11742
11744
11746
11748
11750
11752
11754
11756
11758
11760
11762
11764
11766
11768
11770
11772
11774
11776
11778
11780
11782
11784
11786
11788
11790
11792
11794
11796
11798
11800
11802
11804
11806
11808
11810
11812
11814
11816
11818
11820
11822
11824
11826
11828
11830
11832
11834
11836
11838
11840
11842
11844
11846
11848
11850
11852
11854
11856
11858
11860
11862
11864
11866
11868
11870
11872
11874
11876
11878
11880
11882
11884
11886
11888
11890
11892
11894
11896
11898
11900
11902
11904
11906
11908
11910
11912
11914
11916
11918
11920
11922
11924
11926
11928
11930
11932
11934
11936
11938
11940
11942
11944
11946
11948
11950
11952
11954
11956
11958
11960
11962
11964
11966
11968
11970
11972
11974
11976
11978
11980
11982
11984
11986
11988
11990
11992
11994
11996
11998
12000
12002
12004
12006
12008
12010
12012
12014
12016
12018
12020
12022
12024
12026
12028
12030
12032
12034
12036
12038
12040
12042
12044
12046
12048
12050
12052
12054
12056
12058
12060
12062
12064
12066
12068
12070
12072
12074
12076
12078
12080
12082
12084
12086
12088
12090
12092
12094
12096
12098
12100
12102
12104
12106
12108
12110
12112
12114
12116
12118
12120
12122
12124
12126
12128
12130
12132
12134
12136
12138
12140
12142
12144
12146
12148
12150
12152
12154
12156
12158
12160
12162
12164
12166
12168
12170
12172
12174
12176
12178
12180
12182
12184
12186
12188
12190
12192
12194
12196
12198
12200
12202
12204
12206
12208
12210
12212
12214
12216
12218
12220
12222
12224
12226
12228
12230
12232
12234
12236
12238
12240
12242
12244
12246
12248
12250
12252
12254
12256
12258
12260
12262
12264
12266
12268
12270
12272
12274
12276
12278
12280
12282
12284
12286
12288
12290
12292
12294
12296
12298
12300
12302
12304
12306
12308
12310
12312
12314
12316
12318
12320
12322
12324
12326
12328
12330
12332
12334
12336
12338
12340
12342
12344
12346
12348
12350
12352
12354
12356
12358
12360
12362
12364
12366
12368
12370
12372
12374
12376
12378
12380
12382
12384
12386
12388
12390
12392
12394
12396
12398
12400
12402
12404
12406
12408
12410
12412
12414
12416
12418
12420
12422
12424
12426
12428
12430
12432
12434
12436
12438
12440
12442
12444
12446
12448
12450
12452
12454
12456
12458
12460
12462
12464
12466
12468
12470
12472
12474
12476
12478
12480
12482
12484
12486
12488
12490
12492
12494
12496
12498
12500
12502
12504
12506
12508
12510
12512
12514
12516
12518
12520
12522
12524
12526
12528
12530
12532
12534
12536
12538
12540
12542
12544
12546
12548
12550
12552
12554
12556
12558
12560
12562
12564
12566
12568
12570
12572
12574
12576
12578
12580
12582
12584
12586
12588
12590
12592
12594
12596
12598
12600
12602
12604
12606
12608
12610
12612
12614
12616
12618
12620
12622
12624
12626
12628
12630
12632
12634
12636
12638
12640
12642
12644
12646
12648
12650
12652
12654
12656
12658
12660
12662
12664
12666
12668
12670
12672
12674
12676
12678
12680
12682
12684
12686
12688
12690
12692
12694
12696
12698
12700
12702
12704
12706
12708
12710
12712
12714
12716
12718
12720
12722
12724
12726
12728
12730
12732
12734
12736
12738
12740
12742
12744
12746
12748
12750
12752
12754
12756
12758
12760
12762
12764
12766
12768
12770
12772
12774
12776
12778
12780
12782
12784
12786
12788
12790
12792
12794
12796
12798
12800
12802
12804
12806
12808
12810
12812
12814
12816
12818
12820
12822
12824
12826
12828
12830
12832
12834
12836
12838
12840
12842
12844
12846
12848
12850
12852
12854
12856
12858
12860
12862
12864
12866
12868
12870
12872
12874
12876
12878
12880
12882
12884
12886
12888
12890
12892
12894
12896
12898
12900
12902
12904
12906
12908
12910
12912
12914
12916
12918
12920
12922
12924
12926
12928
12930
12932
12934
12936
12938
12940
12942
12944
12946
12948
12950
12952
12954
12956
12958
12960
12962
12964
12966
12968
12970
12972
12974
12976
12978
12980
12982
12984
12986
12988
12990
12992
12994
12996
12998
13000
13002
13004
13006
13008
13010
13012
13014
13016
13018
13020
13022
13024
13026
13028
13030
13032
13034
13036
13038
13040
13042
13044
13046
13048
13050
13052
13054
13056
13058
13060
13062
13064
13066
13068
13070
13072
13074
13076
13078
13080
13082
13084
13086
13088
13090
13092
13094
13096
13098
13100
13102
13104
13106
13108
13110
13112
13114
13116
13118
13120
13122
13124
13126
13128
13130
13132
13134
13136
13138
13140
13142
13144
13146
13148
13150
13152
13154
13156
13158
13160
13162
13164
13166
13168
13170
13172
13174
13176
13178
13180
13182
13184
13186
13188
13190
13192
13194
13196
13198
13200
13202
13204
13206
13208
13210
13212
13214
13216
13218
13220
13222
13224
13226
13228
13230
13232
13234
13236
13238
13240
13242
13244
13246
13248
13250
13252
13254
13256
13258
13260
13262
13264
13266
13268
13270
13272
13274
13276
13278
13280
13282
13284
13286
13288
13290
13292
13294
13296
13298
13300
13302
13304
13306
13308
13310
13312
13314
13316
13318
13320
13322
13324
13326
13328
13330
13332
13334
13336
13338
13340
13342
13344
13346
13348
13350
13352
13354
13356
13358
13360
13362
13364
13366
13368
13370
13372
13374
13376
13378
13380
13382
13384
13386
13388
13390
13392
13394
13396
13398
13400
13402
13404
13406
13408
13410
13412
13414
13416
13418
13420
13422
13424
13426
13428
13430
13432
13434
13436
13438
13440
13442
13444
13446
13448
13450
13452
13454
13456
13458
13460
13462
13464
13466
13468
13470
13472
13474
13476
13478
13480
13482
13484
13486
13488
13490
13492
13494
13496
13498
13500
13502
13504
13506
13508
13510
13512
13514
13516
13518
13520
13522
13524
13526
13528
13530
13532
13534
13536
13538
13540
13542
13544
13546
13548
13550
13552
13554
13556
13558
13560
13562
13564
13566
13568
13570
13572
13574
13576
13578
13580
13582
13584
13586
13588
13590
13592
13594
13596
13598
13600
13602
13604
13606
13608
13610
13612
13614
13616
13618
13620
13622
13624
13626
13628
13630
13632
13634
13636
13638
13640
13642
13644
13646
13648
13650
13652
13654
13656
13658
13660
13662
13664
13666
13668
13670
13672
13674
13676
13678
13680
13682
13684
13686
13688
13690
13692
13694
13696
13698
13700
13702
13704
13706
13708
13710
13712
13714
13716
13718
13720
13722
13724
13726
13728
13730
13732
13734
13736
13738
13740
13742
13744
13746
13748
13750
13752
13754
13756
13758
13760
13762
13764
13766
13768
13770
13772
13774
13776
13778
13780
13782
13784
13786
13788
13790
13792
13794
13796
13798
13800
13802
13804
13806
13808
13810
13812
13814
13816
13818
13820
13822
13824
13826
13828
13830
13832
13834
13836
13838
13840
13842
13844
13846
13848
13850
13852
13854
13856
13858
13860
13862
13864
13866
13868
13870
13872
13874
13876
13878
13880
13882
13884
13886
13888
13890
13892
13894
13896
13898
13900
13902
13904
13906
13908
13910
13912
13914
13916
13918
13920
13922
13924
13926
13928
13930
13932
13934
13936
13938
13940
13942
13944
13946
13948
13950
13952
13954
13956
13958
13960
13962
13964
13966
13968
13970
13972
13974
13976
13978
13980
13982
13984
13986
13988
13990
13992
13994
13996
13998
14000
14002
14004
14006
14008
14010
14012
14014
14016
14018
14020
14022
14024
14026
14028
14030
14032
14034
14036
14038
14040
14042
14044
14046
14048
14050
14052
14054
14056
14058
14060
14062
14064
14066
14068
14070
14072
14074
14076
14078
14080
14082
14084
14086
14088
14090
14092
14094
14096
14098
14100
14102
14104
14106
14108
14110
14112
14114
14116
14118
14120
14122
14124
14126
14128
14130
14132
14134
14136
14138
14140
14142
14144
14146
14148
14150
14152
14154
14156
14158
14160
14162
14164
14166
14168
14170
14172
14174
14176
14178
14180
14182
14184
14186
14188
14190
14192
14194
14196
14198
14200
14202
14204
14206
14208
14210
14212
14214
14216
14218
14220
14222
14224
14226
14228
14230
14232
14234
14236
14238
14240
14242
14244
14246
14248
14250
14252
14254
14256
14258
14260
14262
14264
14266
14268
14270
14272
14274
14276
14278
14280
14282
14284
14286
14288
14290
14292
14294
14296
14298
14300
14302
14304
14306
14308
14310
14312
14314
14316
14318
14320
14322
14324
14326
14328
14330
14332
14334
14336
14338
14340
14342
14344
14346
14348
14350
14352
14354
14356
14358
14360
14362
14364
14366
14368
14370
14372
14374
14376
14378
14380
14382
14384
14386
14388
14390
14392
14394
14396
14398
14400
14402
14404
14406
14408
14410
14412
14414
14416
14418
14420
14422
14424
14426
14428
14430
14432
14434
14436
14438
14440
14442
14444
14446
14448
14450
14452
14454
14456
14458
14460
14462
14464
14466
14468
14470
14472
14474
14476
14478
14480
14482
14484
14486
14488
14490
14492
14494
14496
14498
14500
14502
14504
14506
14508
14510
14512
14514
14516
14518
14520
14522
14524
14526
14528
14530
14532
14534
14536
14538
14540
14542
14544
14546
14548
14550
14552
14554
14556
14558
14560
14562
14564
14566
14568
14570
14572
14574
14576
14578
14580
14582
14584
14586
14588
14590
14592
14594
14596
14598
14600
14602
14604
14606
14608
14610
14612
14614
14616
14618
14620
14622
14624
14626
14628
14630
14632
14634
14636
14638
14640
14642
14644
14646
14648
14650
14652
14654
14656
14658
14660
14662
14664
14666
14668
14670
14672
14674
14676
14678
14680
14682
14684
14686
14688
14690
14692
14694
14696
14698
14700
14702
14704
14706
14708
14710
14712
14714
14716
14718
14720
14722
14724
14726
14728
14730
14732
14734
14736
14738
14740
14742
14744
14746
14748
14750
14752
14754
14756
14758
14760
14762
14764
14766
14768
14770
14772
14774
14776
14778
14780
14782
14784
14786
14788
14790
14792
14794
14796
14798
14800
14802
14804
14806
14808
14810
14812
14814
14816
14818
14820
14822
14824
14826
14828
14830
14832
14834
14836
14838
14840
14842
14844
14846
14848
14850
14852
14854
14856
14858
14860
14862
14864
14866
14868
14870
14872
14874
14876
14878
14880
14882
14884
14886
14888
14890
14892
14894
14896
14898
14900
14902
14904
14906
14908
14910
14912
14914
14916
14918
14920
14922
14924
14926
14928
14930
14932
14934
14936
14938
14940
14942
14944
14946
14948
14950
14952
14954
14956
14958
14960
14962
14964
14966
14968
14970
14972
14974
14976
14978
14980
14982
14984
14986
14988
14990
14992
14994
14996
14998
15000
15002
15004
15006
15008
15010
15012
15014
15016
15018
15020
15022
15024
15026
15028
15030
15032
15034
15036
15038
15040
15042
15044
15046
15048
15050
15052
15054
15056
15058
15060
15062
15064
15066
15068
15070
15072
15074
15076
15078
15080
15082
15084
15086
15088
15090
15092
15094
15096
15098
15100
15102
15104
15106
15108
15110
15112
15114
15116
15118
15120
15122
15124
15126
15128
15130
15132
15134
15136
15138
15140
15142
15144
15146
15148
15150
15152
15154
15156
15158
15160
15162
15164
15166
15168
15170
15172
15174
15176
15178
15180
15182
15184
15186
15188
15190
15192
15194
15196
15198
15200
15202
15204
15206
15208
15210
15212
15214
15216
15218
15220
15222
15224
15226
15228
15230
15232
15234
15236
15238
15240
15242
15244
15246
15248
15250
15252
15254
15256
15258
15260
15262
15264
15266
15268
15270
15272
15274
15276
15278
15280
15282
15284
15286
15288
15290
15292
15294
15296
15298
15300
15302
15304
15306
15308
15310
15312
15314
15316
15318
15320
15322
15324
15326
15328
15330
15332
15334
15336
15338
15340
15342
15344
15346
15348
15350
15352
15354
15356
15358
15360
15362
15364
15366
15368
15370
15372
15374
15376
15378
15380
15382
15384
15386
15388
15390
15392
15394
15396
15398
15400
15402
15404
15406
15408
15410
15412
15414
15416
15418
15420
15422
15424
15426
15428
15430
15432
15434
15436
15438
15440
15442
15444
15446
15448
15450
15452
15454
15456
15458
15460
15462
15464
15466
15468
15470
15472
15474
15476
15478
15480
15482
15484
15486
15488
15490
15492
15494
15496
15498
15500
15502
15504
15506
15508
15510
15512
15514
15516
15518
15520
15522
15524
15526
15528
15530
15532
15534
15536
15538
15540
15542
15544
15546
15548
15550
15552
15554
15556
15558
15560
15562
15564
15566
15568
15570
15572
15574
15576
15578
15580
15582
15584
15586
15588
15590
15592
15594
15596
15598
15600
15602
15604
15606
15608
15610
15612
15614
15616
15618
15620
15622
15624
15626
15628
15630
15632
15634
15636
15638
15640
15642
15644
15646
15648
15650
15652
15654
15656
15658
15660
15662
15664
15666
15668
15670
15672
15674
15676
15678
15680
15682
15684
15686
15688
15690
15692
15694
15696
15698
15700
15702
15704
15706
15708
15710
15712
15714
15716
15718
15720
15722
15724
15726
15728
15730
15732
15734
15736
15738
15740
15742
15744
15746
15748
15750
15752
15754
15756
15758
15760
15762
15764
15766
15768
15770
15772
15774
15776
15778
15780
15782
15784
15786
15788
15790
15792
15794
15796
15798
15800
15802
15804
15806
15808
15810
15812
15814
15816
15818
15820
15822
15824
15826
15828
15830
15832
15834
15836
15838
15840
15842
15844
15846
15848
15850
15852
15854
15856
15858
15860
15862
15864
15866
15868
15870
15872
15874
15876
15878
15880
15882
15884
15886
15888
15890
15892
15894
15896
15898
15900
15902
15904
15906
15908
15910
15912
15914
15916
15918
15920
15922
15924
15926
15928
15930
15932
15934
15936
15938
15940
15942
15944
15946
15948
15950
15952
15954
15956
15958
15960
15962
15964
15966
15968
15970
15972
15974
15976
15978
15980
15982
15984
15986
15988
15990
15992
15994
15996
15998
16000
16002
16004
16006
16008
16010
16012
16014
16016
16018
16020
16022
16024
16026
16028
16030
16032
16034
16036
16038
16040
16042
16044
16046
16048
16050
16052
16054
16056
16058
16060
16062
16064
16066
16068
16070
16072
16074
16076
16078
16080
16082
16084
16086
16088
16090
16092
16094
16096
16098
16100
16102
16104
16106
16108
16110
16112
16114
16116
16118
16120
16122
16124
16126
16128
16130
16132
16134
16136
16138
16140
16142
16144
16146
16148
16150
16152
16154
16156
16158
16160
16162
16164
16166
16168
16170
16172
16174
16176
16178
16180
16182
16184
16186
16188
16190
16192
16194
16196
16198
16200
16202
16204
16206
16208
16210
16212
16214
16216
16218
16220
16222
16224
16226
16228
16230
16232
16234
16236
16238
16240
16242
16244
16246
16248
16250
16252
16254
16256
16258
16260
16262
16264
16266
16268
16270
16272
16274
16276
16278
16280
16282
16284
16286
16288
16290
16292
16294
16296
16298
16300
16302
16304
16306
16308
16310
16312
16314
16316
16318
16320
16322
16324
16326
16328
16330
16332
16334
16336
16338
16340
16342
16344
16346
16348
16350
16352
16354
16356
16358
16360
16362
16364
16366
16368
16370
16372
16374
16376
16378
16380
16382
16384
16386
16388
16390
16392
16394
16396
16398
16400
16402
16404
16406
16408
16410
16412
16414
16416
16418
16420
16422
16424
16426
16428
16430
16432
16434
16436
16438
16440
16442
16444
16446
16448
16450
16452
16454
16456
16458
16460
16462
16464
16466
16468
16470
16472
16474
16476
16478
16480
16482
16484
16486
16488
16490
16492
16494
16496
16498
16500
16502
16504
16506
16508
16510
16512
16514
16516
16518
16520
16522
16524
16526
16528
16530
16532
16534
16536
16538
16540
16542
16544
16546
16548
16550
16552
16554
16556
16558
16560
16562
16564
16566
16568
16570
16572
16574
16576
16578
16580
16582
16584
16586
16588
16590
16592
16594
16596
16598
16600
16602
16604
16606
16608
16610
16612
16614
16616
16618
16620
16622
16624
16626
16628
16630
16632
16634
16636
16638
16640
16642
16644
16646
16648
16650
16652
16654
16656
16658
16660
16662
16664
16666
16668
16670
16672
16674
16676
16678
16680
16682
16684
16686
16688
16690
16692
16694
16696
16698
16700
16702
16704
16706
16708
16710
16712
16714
16716
16718
16720
16722
16724
16726
16728
16730
16732
16734
16736
16738
16740
16742
16744
16746
16748
16750
16752
16754
16756
16758
16760
16762
16764
16766
16768
16770
16772
16774
16776
16778
16780
16782
16784
16786
16788
16790
16792
16794
16796
16798
16800
16802
16804
16806
16808
16810
16812
16814
16816
16818
16820
16822
16824
16826
16828
16830
16832
16834
16836
16838
16840
16842
16844
16846
16848
16850
16852
16854
16856
16858
16860
16862
16864
16866
16868
16870
16872
16874
16876
16878
16880
16882
16884
16886
16888
16890
16892
16894
16896
16898
16900
16902
16904
16906
16908
16910
16912
16914
16916
16918
16920
16922
16924
16926
16928
16930
16932
16934
16936
16938
16940
16942
16944
16946
16948
16950
16952
16954
16956
16958
16960
16962
16964
16966
16968
16970
16972
16974
16976
16978
16980
16982
16984
16986
16988
16990
16992
16994
16996
16998
17000
17002
17004
17006
17008
17010
17012
17014
17016
17018
17020
17022
17024
17026
17028
17030
17032
17034
17036
17038
17040
17042
17044
17046
17048
17050
17052
17054
17056
17058
17060
17062
17064
17066
17068
17070
17072
17074
17076
17078
17080
17082
17084
17086
17088
17090
17092
17094
17096
17098
17100
17102
17104
17106
17108
17110
17112
17114
17116
17118
17120
17122
17124
17126
17128
17130
17132
17134
17136
17138
17140
17142
17144
17146
17148
17150
17152
17154
17156
17158
17160
17162
17164
17166
17168
17170
17172
17174
17176
17178
17180
17182
17184
17186
17188
17190
17192
17194
17196
17198
17200
17202
17204
17206
17208
17210
17212
17214
17216
17218
17220
17222
17224
17226
17228
17230
17232
17234
17236
17238
17240
17242
17244
17246
17248
17250
17252
17254
17256
17258
17260
17262
17264
17266
17268
17270
17272
17274
17276
17278
17280
17282
17284
17286
17288
17290
17292
17294
17296
17298
17300
17302
17304
17306
17308
17310
17312
17314
17316
17318
17320
17322
17324
17326
17328
17330
17332
17334
17336
17338
17340
17342
17344
17346
17348
17350
17352
17354
17356
17358
17360
17362
17364
17366
17368
17370
17372
17374
17376
17378
17380
17382
17384
17386
17388
17390
17392
17394
17396
17398
17400
17402
17404
17406
17408
17410
17412
17414
17416
17418
17420
17422
17424
17426
17428
17430
17432
17434
17436
17438
17440
17442
17444
17446
17448
17450
17452
17454
17456
17458
17460
17462
17464
17466
17468
17470
17472
17474
17476
17478
17480
17482
17484
17486
17488
17490
17492
17494
17496
17498
17500
17502
17504
17506
17508
17510
17512
17514
17516
17518
17520
17522
17524
17526
17528
17530
17532
17534
17536
17538
17540
17542
17544
17546
17548
17550
17552
17554
17556
17558
17560
17562
17564
17566
17568
17570
17572
17574
17576
17578
17580
17582
17584
17586
17588
17590
17592
17594
17596
17598
17600
17602
17604
17606
17608
17610
17612
17614
17616
17618
17620
17622
17624
17626
17628
17630
17632
17634
17636
17638
17640
17642
17644
17646
17648
17650
17652
17654
17656
17658
17660
17662
17664
17666
17668
17670
17672
17674
17676
17678
17680
17682
17684
17686
17688
17690
17692
17694
17696
17698
17700
17702
17704
17706
17708
17710
17712
17714
17716
17718
17720
17722
17724
17726
17728
17730
17732
17734
17736
17738
17740
17742
17744
17746
17748
17750
17752
17754
17756
17758
17760
17762
17764
17766
17768
17770
17772
17774
17776
17778
17780
17782
17784
17786
17788
17790
17792
17794
17796
17798
17800
17802
17804
17806
17808
17810
17812
17814
17816
17818
17820
17822
17824
17826
17828
17830
17832
17834
17836
17838
17840
17842
17844
17846
17848
17850
17852
17854
17856
17858
17860
17862
17864
17866
17868
17870
17872
17874
17876
17878
17880
17882
17884
17886
17888
17890
17892
17894
17896
17898
17900
17902
17904
17906
17908
17910
17912
17914
17916
17918
17920
17922
17924
17926
17928
17930
17932
17934
17936
17938
17940
17942
17944
17946
17948
17950
17952
17954
17956
17958
17960
17962
17964
17966
17968
17970
17972
17974
17976
17978
17980
17982
17984
17986
17988
17990
17992
17994
17996
17998
18000
18002
18004
18006
18008
18010
18012
18014
18016
18018
18020
18022
18024
18026
18028
18030
18032
18034
18036
18038
18040
18042
18044
18046
18048
18050
18052
18054
18056
18058
18060
18062
18064
18066
18068
18070
18072
18074
18076
18078
18080
18082
18084
18086
18088
18090
18092
18094
18096
18098
18100
18102
18104
18106
18108
18110
18112
18114
18116
18118
18120
18122
18124
18126
18128
18130
18132
18134
18136
18138
18140
18142
18144
18146
18148
18150
18152
18154
18156
18158
18160
18162
18164
18166
18168
18170
18172
18174
18176
18178
18180
18182
18184
18186
18188
18190
18192
18194
18196
18198
18200
18202
18204
18206
18208
18210
18212
18214
18216
18218
18220
18222
18224
18226
18228
18230
18232
18234
18236
18238
18240
18242
18244
18246
18248
18250
18252
18254
18256
18258
18260
18262
18264
18266
18268
18270
18272
18274
18276
18278
18280
18282
18284
18286
18288
18290
18292
18294
18296
18298
18300
18302
18304
18306
18308
18310
18312
18314
18316
18318
18320
18322
18324
18326
18328
18330
18332
18334
18336
18338
18340
18342
18344
18346
18348
18350
18352
18354
18356
18358
18360
18362
18364
18366
18368
18370
18372
18374
18376
18378
18380
18382
18384
18386
18388
18390
18392
18394
18396
18398
18400
18402
18404
18406
18408
18410
18412
18414
18416
18418
18420
18422
18424
18426
18428
18430
18432
18434
18436
18438
18440
18442
18444
18446
18448
18450
18452
18454
18456
18458
18460
18462
18464
18466
18468
18470
18472
18474
18476
18478
18480
18482
18484
18486
18488
18490
18492
18494
18496
18498
18500
18502
18504
18506
18508
18510
18512
18514
18516
18518
18520
18522
18524
18526
18528
18530
18532
18534
18536
18538
18540
18542
18544
18546
18548
18550
18552
18554
18556
18558
18560
18562
18564
18566
18568
18570
18572
18574
18576
18578
18580
18582
18584
18586
18588
18590
18592
18594
18596
18598
18600
18602
18604
18606
18608
18610
18612
18614
18616
18618
18620
18622
18624
18626
18628
18630
18632
18634
18636
18638
18640
18642
18644
18646
18648
18650
18652
18654
18656
18658
18660
18662
18664
18666
18668
18670
18672
18674
18676
18678
18680
18682
18684
18686
18688
18690
18692
18694
18696
18698
18700
18702
18704
18706
18708
18710
18712
18714
18716
18718
18720
18722
18724
18726
18728
18730
18732
18734
18736
18738
18740
18742
18744
18746
18748
18750
18752
18754
18756
18758
18760
18762
18764
18766
18768
18770
18772
18774
18776
18778
18780
18782
18784
18786
18788
18790
18792
18794
18796
18798
18800
18802
18804
18806
18808
18810
18812
18814
18816
18818
18820
18822
18824
18826
18828
18830
18832
18834
18836
18838
18840
18842
18844
18846
18848
18850
18852
18854
18856
18858
18860
18862
18864
18866
18868
18870
18872
18874
18876
18878
18880
18882
18884
18886
18888
18890
18892
18894
18896
18898
18900
18902
18904
18906
18908
18910
18912
18914
18916
18918
18920
18922
18924
18926
18928
18930
18932
18934
18936
18938
18940
18942
18944
18946
18948
18950
18952
18954
18956
18958
18960
18962
18964
18966
18968
18970
18972
18974
18976
18978
18980
18982
18984
18986
18988
18990
18992
18994
18996
18998
19000
19002
19004
19006
19008
19010
19012
19014
19016
19018
19020
19022
19024
19026
19028
19030
19032
19034
19036
19038
19040
19042
19044
19046
19048
19050
19052
19054
19056
19058
19060
19062
19064
19066
19068
19070
19072
19074
19076
19078
19080
19082
19084
19086
19088
19090
19092
19094
19096
19098
19100
19102
19104
19106
19108
19110
19112
19114
19116
19118
19120
19122
19124
19126
19128
19130
19132
19134
19136
19138
19140
19142
19144
19146
19148
19150
19152
19154
19156
19158
19160
19162
19164
19166
19168
19170
19172
19174
19176
19178
19180
19182
19184
19186
19188
19190
19192
19194
19196
19198
19200
19202
19204
19206
19208
19210
19212
19214
19216
19218
19220
19222
19224
19226
19228
19230
19232
19234
19236
19238
19240
19242
19244
19246
19248
19250
19252
19254
19256
19258
19260
19262
19264
19266
19268
19270
19272
19274
19276
19278
19280
19282
19284
19286
19288
19290
19292
19294
19296
19298
19300
19302
19304
19306
19308
19310
19312
19314
19316
19318
19320
19322
19324
19326
19328
19330
19332
19334
19336
19338
19340
19342
19344
19346
19348
19350
19352
19354
19356
19358
19360
19362
19364
19366
19368
19370
19372
19374
19376
19378
19380
19382
19384
19386
19388
19390
19392
19394
19396
19398
19400
19402
19404
19406
19408
19410
19412
19414
19416
19418
19420
19422
19424
19426
19428
19430
19432
19434
19436
19438
19440
19442
19444
19446
19448
19450
19452
19454
19456
19458
19460
19462
19464
19466
19468
19470
19472
19474
19476
19478
19480
19482
19484
19486
19488
19490
19492
19494
19496
19498
19500
19502
19504
19506
19508
19510
19512
19514
19516
19518
19520
19522
19524
19526
19528
19530
19532
19534
19536
19538
19540
19542
19544
19546
19548
19550
19552
19554
19556
19558
19560
19562
19564
19566
19568
19570
19572
19574
19576
19578
19580
19582
19584
19586
19588
19590
19592
19594
19596
19598
19600
19602
19604
19606
19608
19610
19612
19614
19616
19618
19620
19622
19624
19626
19628
19630
19632
19634
19636
19638
19640
19642
19644
19646
19648
19650
19652
19654
19656
19658
19660
19662
19664
19666
19668
19670
19672
19674
19676
19678
19680
19682
19684
19686
19688
19690
19692
19694
19696
19698
19700
19702
19704
19706
19708
19710
19712
19714
19716
19718
19720
19722
19724
19726
19728
19730
19732
19734
19736
19738
19740
19742
19744
19746
19748
19750
19752
19754
19756
19758
19760
19762
19764
19766
19768
19770
19772
19774
19776
19778
19780
19782
19784
19786
19788
19790
19792
19794
19796
19798
19800
19802
19804
19806
19808
19810
19812
19814
19816
19818
19820
19822
19824
19826
19828
19830
19832
19834
19836
19838
19840
19842
19844
19846
19848
19850
19852
19854
19856
19858
19860
19862
19864
19866
19868
19870
19872
19874
19876
19878
19880
19882
19884
19886
19888
19890
19892
19894
19896
19898
19900
19902
19904
19906
19908
19910
19912
19914
19916
19918
19920
19922
19924
19926
19928
19930
19932
19934
19936
19938
19940
19942
19944
19946
19948
19950
19952
19954
19956
19958
19960
19962
19964
19966
19968
19970
19972
19974
19976
19978
19980
19982
19984
19986
19988
19990
19992
19994
19996
19998

STUPID!

A far less naive generator:

[161]:
def myrange(begin, end, step):
    element = begin
    while element < end:
        yield element
        element += step
[162]:
for element in myrange(4, 20000, 2):
    print(element)
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44
46
48
50
52
54
56
58
60
62
64
66
68
70
72
74
76
78
80
82
84
86
88
90
92
94
96
98
100
102
104
106
108
110
112
114
116
118
120
122
124
126
128
130
132
134
136
138
140
142
144
146
148
150
152
154
156
158
160
162
164
166
168
170
172
174
176
178
180
182
184
186
188
190
192
194
196
198
200
202
204
206
208
210
212
214
216
218
220
222
224
226
228
230
232
234
236
238
240
242
244
246
248
250
252
254
256
258
260
262
264
266
268
270
272
274
276
278
280
282
284
286
288
290
292
294
296
298
300
302
304
306
308
310
312
314
316
318
320
322
324
326
328
330
332
334
336
338
340
342
344
346
348
350
352
354
356
358
360
362
364
366
368
370
372
374
376
378
380
382
384
386
388
390
392
394
396
398
400
402
404
406
408
410
412
414
416
418
420
422
424
426
428
430
432
434
436
438
440
442
444
446
448
450
452
454
456
458
460
462
464
466
468
470
472
474
476
478
480
482
484
486
488
490
492
494
496
498
500
502
504
506
508
510
512
514
516
518
520
522
524
526
528
530
532
534
536
538
540
542
544
546
548
550
552
554
556
558
560
562
564
566
568
570
572
574
576
578
580
582
584
586
588
590
592
594
596
598
600
602
604
606
608
610
612
614
616
618
620
622
624
626
628
630
632
634
636
638
640
642
644
646
648
650
652
654
656
658
660
662
664
666
668
670
672
674
676
678
680
682
684
686
688
690
692
694
696
698
700
702
704
706
708
710
712
714
716
718
720
722
724
726
728
730
732
734
736
738
740
742
744
746
748
750
752
754
756
758
760
762
764
766
768
770
772
774
776
778
780
782
784
786
788
790
792
794
796
798
800
802
804
806
808
810
812
814
816
818
820
822
824
826
828
830
832
834
836
838
840
842
844
846
848
850
852
854
856
858
860
862
864
866
868
870
872
874
876
878
880
882
884
886
888
890
892
894
896
898
900
902
904
906
908
910
912
914
916
918
920
922
924
926
928
930
932
934
936
938
940
942
944
946
948
950
952
954
956
958
960
962
964
966
968
970
972
974
976
978
980
982
984
986
988
990
992
994
996
998
1000
1002
1004
1006
1008
1010
1012
1014
1016
1018
1020
1022
1024
1026
1028
1030
1032
1034
1036
1038
1040
1042
1044
1046
1048
1050
1052
1054
1056
1058
1060
1062
1064
1066
1068
1070
1072
1074
1076
1078
1080
1082
1084
1086
1088
1090
1092
1094
1096
1098
1100
1102
1104
1106
1108
1110
1112
1114
1116
1118
1120
1122
1124
1126
1128
1130
1132
1134
1136
1138
1140
1142
1144
1146
1148
1150
1152
1154
1156
1158
1160
1162
1164
1166
1168
1170
1172
1174
1176
1178
1180
1182
1184
1186
1188
1190
1192
1194
1196
1198
1200
1202
1204
1206
1208
1210
1212
1214
1216
1218
1220
1222
1224
1226
1228
1230
1232
1234
1236
1238
1240
1242
1244
1246
1248
1250
1252
1254
1256
1258
1260
1262
1264
1266
1268
1270
1272
1274
1276
1278
1280
1282
1284
1286
1288
1290
1292
1294
1296
1298
1300
1302
1304
1306
1308
1310
1312
1314
1316
1318
1320
1322
1324
1326
1328
1330
1332
1334
1336
1338
1340
1342
1344
1346
1348
1350
1352
1354
1356
1358
1360
1362
1364
1366
1368
1370
1372
1374
1376
1378
1380
1382
1384
1386
1388
1390
1392
1394
1396
1398
1400
1402
1404
1406
1408
1410
1412
1414
1416
1418
1420
1422
1424
1426
1428
1430
1432
1434
1436
1438
1440
1442
1444
1446
1448
1450
1452
1454
1456
1458
1460
1462
1464
1466
1468
1470
1472
1474
1476
1478
1480
1482
1484
1486
1488
1490
1492
1494
1496
1498
1500
1502
1504
1506
1508
1510
1512
1514
1516
1518
1520
1522
1524
1526
1528
1530
1532
1534
1536
1538
1540
1542
1544
1546
1548
1550
1552
1554
1556
1558
1560
1562
1564
1566
1568
1570
1572
1574
1576
1578
1580
1582
1584
1586
1588
1590
1592
1594
1596
1598
1600
1602
1604
1606
1608
1610
1612
1614
1616
1618
1620
1622
1624
1626
1628
1630
1632
1634
1636
1638
1640
1642
1644
1646
1648
1650
1652
1654
1656
1658
1660
1662
1664
1666
1668
1670
1672
1674
1676
1678
1680
1682
1684
1686
1688
1690
1692
1694
1696
1698
1700
1702
1704
1706
1708
1710
1712
1714
1716
1718
1720
1722
1724
1726
1728
1730
1732
1734
1736
1738
1740
1742
1744
1746
1748
1750
1752
1754
1756
1758
1760
1762
1764
1766
1768
1770
1772
1774
1776
1778
1780
1782
1784
1786
1788
1790
1792
1794
1796
1798
1800
1802
1804
1806
1808
1810
1812
1814
1816
1818
1820
1822
1824
1826
1828
1830
1832
1834
1836
1838
1840
1842
1844
1846
1848
1850
1852
1854
1856
1858
1860
1862
1864
1866
1868
1870
1872
1874
1876
1878
1880
1882
1884
1886
1888
1890
1892
1894
1896
1898
1900
1902
1904
1906
1908
1910
1912
1914
1916
1918
1920
1922
1924
1926
1928
1930
1932
1934
1936
1938
1940
1942
1944
1946
1948
1950
1952
1954
1956
1958
1960
1962
1964
1966
1968
1970
1972
1974
1976
1978
1980
1982
1984
1986
1988
1990
1992
1994
1996
1998
2000
2002
2004
2006
2008
2010
2012
2014
2016
2018
2020
2022
2024
2026
2028
2030
2032
2034
2036
2038
2040
2042
2044
2046
2048
2050
2052
2054
2056
2058
2060
2062
2064
2066
2068
2070
2072
2074
2076
2078
2080
2082
2084
2086
2088
2090
2092
2094
2096
2098
2100
2102
2104
2106
2108
2110
2112
2114
2116
2118
2120
2122
2124
2126
2128
2130
2132
2134
2136
2138
2140
2142
2144
2146
2148
2150
2152
2154
2156
2158
2160
2162
2164
2166
2168
2170
2172
2174
2176
2178
2180
2182
2184
2186
2188
2190
2192
2194
2196
2198
2200
2202
2204
2206
2208
2210
2212
2214
2216
2218
2220
2222
2224
2226
2228
2230
2232
2234
2236
2238
2240
2242
2244
2246
2248
2250
2252
2254
2256
2258
2260
2262
2264
2266
2268
2270
2272
2274
2276
2278
2280
2282
2284
2286
2288
2290
2292
2294
2296
2298
2300
2302
2304
2306
2308
2310
2312
2314
2316
2318
2320
2322
2324
2326
2328
2330
2332
2334
2336
2338
2340
2342
2344
2346
2348
2350
2352
2354
2356
2358
2360
2362
2364
2366
2368
2370
2372
2374
2376
2378
2380
2382
2384
2386
2388
2390
2392
2394
2396
2398
2400
2402
2404
2406
2408
2410
2412
2414
2416
2418
2420
2422
2424
2426
2428
2430
2432
2434
2436
2438
2440
2442
2444
2446
2448
2450
2452
2454
2456
2458
2460
2462
2464
2466
2468
2470
2472
2474
2476
2478
2480
2482
2484
2486
2488
2490
2492
2494
2496
2498
2500
2502
2504
2506
2508
2510
2512
2514
2516
2518
2520
2522
2524
2526
2528
2530
2532
2534
2536
2538
2540
2542
2544
2546
2548
2550
2552
2554
2556
2558
2560
2562
2564
2566
2568
2570
2572
2574
2576
2578
2580
2582
2584
2586
2588
2590
2592
2594
2596
2598
2600
2602
2604
2606
2608
2610
2612
2614
2616
2618
2620
2622
2624
2626
2628
2630
2632
2634
2636
2638
2640
2642
2644
2646
2648
2650
2652
2654
2656
2658
2660
2662
2664
2666
2668
2670
2672
2674
2676
2678
2680
2682
2684
2686
2688
2690
2692
2694
2696
2698
2700
2702
2704
2706
2708
2710
2712
2714
2716
2718
2720
2722
2724
2726
2728
2730
2732
2734
2736
2738
2740
2742
2744
2746
2748
2750
2752
2754
2756
2758
2760
2762
2764
2766
2768
2770
2772
2774
2776
2778
2780
2782
2784
2786
2788
2790
2792
2794
2796
2798
2800
2802
2804
2806
2808
2810
2812
2814
2816
2818
2820
2822
2824
2826
2828
2830
2832
2834
2836
2838
2840
2842
2844
2846
2848
2850
2852
2854
2856
2858
2860
2862
2864
2866
2868
2870
2872
2874
2876
2878
2880
2882
2884
2886
2888
2890
2892
2894
2896
2898
2900
2902
2904
2906
2908
2910
2912
2914
2916
2918
2920
2922
2924
2926
2928
2930
2932
2934
2936
2938
2940
2942
2944
2946
2948
2950
2952
2954
2956
2958
2960
2962
2964
2966
2968
2970
2972
2974
2976
2978
2980
2982
2984
2986
2988
2990
2992
2994
2996
2998
3000
3002
3004
3006
3008
3010
3012
3014
3016
3018
3020
3022
3024
3026
3028
3030
3032
3034
3036
3038
3040
3042
3044
3046
3048
3050
3052
3054
3056
3058
3060
3062
3064
3066
3068
3070
3072
3074
3076
3078
3080
3082
3084
3086
3088
3090
3092
3094
3096
3098
3100
3102
3104
3106
3108
3110
3112
3114
3116
3118
3120
3122
3124
3126
3128
3130
3132
3134
3136
3138
3140
3142
3144
3146
3148
3150
3152
3154
3156
3158
3160
3162
3164
3166
3168
3170
3172
3174
3176
3178
3180
3182
3184
3186
3188
3190
3192
3194
3196
3198
3200
3202
3204
3206
3208
3210
3212
3214
3216
3218
3220
3222
3224
3226
3228
3230
3232
3234
3236
3238
3240
3242
3244
3246
3248
3250
3252
3254
3256
3258
3260
3262
3264
3266
3268
3270
3272
3274
3276
3278
3280
3282
3284
3286
3288
3290
3292
3294
3296
3298
3300
3302
3304
3306
3308
3310
3312
3314
3316
3318
3320
3322
3324
3326
3328
3330
3332
3334
3336
3338
3340
3342
3344
3346
3348
3350
3352
3354
3356
3358
3360
3362
3364
3366
3368
3370
3372
3374
3376
3378
3380
3382
3384
3386
3388
3390
3392
3394
3396
3398
3400
3402
3404
3406
3408
3410
3412
3414
3416
3418
3420
3422
3424
3426
3428
3430
3432
3434
3436
3438
3440
3442
3444
3446
3448
3450
3452
3454
3456
3458
3460
3462
3464
3466
3468
3470
3472
3474
3476
3478
3480
3482
3484
3486
3488
3490
3492
3494
3496
3498
3500
3502
3504
3506
3508
3510
3512
3514
3516
3518
3520
3522
3524
3526
3528
3530
3532
3534
3536
3538
3540
3542
3544
3546
3548
3550
3552
3554
3556
3558
3560
3562
3564
3566
3568
3570
3572
3574
3576
3578
3580
3582
3584
3586
3588
3590
3592
3594
3596
3598
3600
3602
3604
3606
3608
3610
3612
3614
3616
3618
3620
3622
3624
3626
3628
3630
3632
3634
3636
3638
3640
3642
3644
3646
3648
3650
3652
3654
3656
3658
3660
3662
3664
3666
3668
3670
3672
3674
3676
3678
3680
3682
3684
3686
3688
3690
3692
3694
3696
3698
3700
3702
3704
3706
3708
3710
3712
3714
3716
3718
3720
3722
3724
3726
3728
3730
3732
3734
3736
3738
3740
3742
3744
3746
3748
3750
3752
3754
3756
3758
3760
3762
3764
3766
3768
3770
3772
3774
3776
3778
3780
3782
3784
3786
3788
3790
3792
3794
3796
3798
3800
3802
3804
3806
3808
3810
3812
3814
3816
3818
3820
3822
3824
3826
3828
3830
3832
3834
3836
3838
3840
3842
3844
3846
3848
3850
3852
3854
3856
3858
3860
3862
3864
3866
3868
3870
3872
3874
3876
3878
3880
3882
3884
3886
3888
3890
3892
3894
3896
3898
3900
3902
3904
3906
3908
3910
3912
3914
3916
3918
3920
3922
3924
3926
3928
3930
3932
3934
3936
3938
3940
3942
3944
3946
3948
3950
3952
3954
3956
3958
3960
3962
3964
3966
3968
3970
3972
3974
3976
3978
3980
3982
3984
3986
3988
3990
3992
3994
3996
3998
4000
4002
4004
4006
4008
4010
4012
4014
4016
4018
4020
4022
4024
4026
4028
4030
4032
4034
4036
4038
4040
4042
4044
4046
4048
4050
4052
4054
4056
4058
4060
4062
4064
4066
4068
4070
4072
4074
4076
4078
4080
4082
4084
4086
4088
4090
4092
4094
4096
4098
4100
4102
4104
4106
4108
4110
4112
4114
4116
4118
4120
4122
4124
4126
4128
4130
4132
4134
4136
4138
4140
4142
4144
4146
4148
4150
4152
4154
4156
4158
4160
4162
4164
4166
4168
4170
4172
4174
4176
4178
4180
4182
4184
4186
4188
4190
4192
4194
4196
4198
4200
4202
4204
4206
4208
4210
4212
4214
4216
4218
4220
4222
4224
4226
4228
4230
4232
4234
4236
4238
4240
4242
4244
4246
4248
4250
4252
4254
4256
4258
4260
4262
4264
4266
4268
4270
4272
4274
4276
4278
4280
4282
4284
4286
4288
4290
4292
4294
4296
4298
4300
4302
4304
4306
4308
4310
4312
4314
4316
4318
4320
4322
4324
4326
4328
4330
4332
4334
4336
4338
4340
4342
4344
4346
4348
4350
4352
4354
4356
4358
4360
4362
4364
4366
4368
4370
4372
4374
4376
4378
4380
4382
4384
4386
4388
4390
4392
4394
4396
4398
4400
4402
4404
4406
4408
4410
4412
4414
4416
4418
4420
4422
4424
4426
4428
4430
4432
4434
4436
4438
4440
4442
4444
4446
4448
4450
4452
4454
4456
4458
4460
4462
4464
4466
4468
4470
4472
4474
4476
4478
4480
4482
4484
4486
4488
4490
4492
4494
4496
4498
4500
4502
4504
4506
4508
4510
4512
4514
4516
4518
4520
4522
4524
4526
4528
4530
4532
4534
4536
4538
4540
4542
4544
4546
4548
4550
4552
4554
4556
4558
4560
4562
4564
4566
4568
4570
4572
4574
4576
4578
4580
4582
4584
4586
4588
4590
4592
4594
4596
4598
4600
4602
4604
4606
4608
4610
4612
4614
4616
4618
4620
4622
4624
4626
4628
4630
4632
4634
4636
4638
4640
4642
4644
4646
4648
4650
4652
4654
4656
4658
4660
4662
4664
4666
4668
4670
4672
4674
4676
4678
4680
4682
4684
4686
4688
4690
4692
4694
4696
4698
4700
4702
4704
4706
4708
4710
4712
4714
4716
4718
4720
4722
4724
4726
4728
4730
4732
4734
4736
4738
4740
4742
4744
4746
4748
4750
4752
4754
4756
4758
4760
4762
4764
4766
4768
4770
4772
4774
4776
4778
4780
4782
4784
4786
4788
4790
4792
4794
4796
4798
4800
4802
4804
4806
4808
4810
4812
4814
4816
4818
4820
4822
4824
4826
4828
4830
4832
4834
4836
4838
4840
4842
4844
4846
4848
4850
4852
4854
4856
4858
4860
4862
4864
4866
4868
4870
4872
4874
4876
4878
4880
4882
4884
4886
4888
4890
4892
4894
4896
4898
4900
4902
4904
4906
4908
4910
4912
4914
4916
4918
4920
4922
4924
4926
4928
4930
4932
4934
4936
4938
4940
4942
4944
4946
4948
4950
4952
4954
4956
4958
4960
4962
4964
4966
4968
4970
4972
4974
4976
4978
4980
4982
4984
4986
4988
4990
4992
4994
4996
4998
5000
5002
5004
5006
5008
5010
5012
5014
5016
5018
5020
5022
5024
5026
5028
5030
5032
5034
5036
5038
5040
5042
5044
5046
5048
5050
5052
5054
5056
5058
5060
5062
5064
5066
5068
5070
5072
5074
5076
5078
5080
5082
5084
5086
5088
5090
5092
5094
5096
5098
5100
5102
5104
5106
5108
5110
5112
5114
5116
5118
5120
5122
5124
5126
5128
5130
5132
5134
5136
5138
5140
5142
5144
5146
5148
5150
5152
5154
5156
5158
5160
5162
5164
5166
5168
5170
5172
5174
5176
5178
5180
5182
5184
5186
5188
5190
5192
5194
5196
5198
5200
5202
5204
5206
5208
5210
5212
5214
5216
5218
5220
5222
5224
5226
5228
5230
5232
5234
5236
5238
5240
5242
5244
5246
5248
5250
5252
5254
5256
5258
5260
5262
5264
5266
5268
5270
5272
5274
5276
5278
5280
5282
5284
5286
5288
5290
5292
5294
5296
5298
5300
5302
5304
5306
5308
5310
5312
5314
5316
5318
5320
5322
5324
5326
5328
5330
5332
5334
5336
5338
5340
5342
5344
5346
5348
5350
5352
5354
5356
5358
5360
5362
5364
5366
5368
5370
5372
5374
5376
5378
5380
5382
5384
5386
5388
5390
5392
5394
5396
5398
5400
5402
5404
5406
5408
5410
5412
5414
5416
5418
5420
5422
5424
5426
5428
5430
5432
5434
5436
5438
5440
5442
5444
5446
5448
5450
5452
5454
5456
5458
5460
5462
5464
5466
5468
5470
5472
5474
5476
5478
5480
5482
5484
5486
5488
5490
5492
5494
5496
5498
5500
5502
5504
5506
5508
5510
5512
5514
5516
5518
5520
5522
5524
5526
5528
5530
5532
5534
5536
5538
5540
5542
5544
5546
5548
5550
5552
5554
5556
5558
5560
5562
5564
5566
5568
5570
5572
5574
5576
5578
5580
5582
5584
5586
5588
5590
5592
5594
5596
5598
5600
5602
5604
5606
5608
5610
5612
5614
5616
5618
5620
5622
5624
5626
5628
5630
5632
5634
5636
5638
5640
5642
5644
5646
5648
5650
5652
5654
5656
5658
5660
5662
5664
5666
5668
5670
5672
5674
5676
5678
5680
5682
5684
5686
5688
5690
5692
5694
5696
5698
5700
5702
5704
5706
5708
5710
5712
5714
5716
5718
5720
5722
5724
5726
5728
5730
5732
5734
5736
5738
5740
5742
5744
5746
5748
5750
5752
5754
5756
5758
5760
5762
5764
5766
5768
5770
5772
5774
5776
5778
5780
5782
5784
5786
5788
5790
5792
5794
5796
5798
5800
5802
5804
5806
5808
5810
5812
5814
5816
5818
5820
5822
5824
5826
5828
5830
5832
5834
5836
5838
5840
5842
5844
5846
5848
5850
5852
5854
5856
5858
5860
5862
5864
5866
5868
5870
5872
5874
5876
5878
5880
5882
5884
5886
5888
5890
5892
5894
5896
5898
5900
5902
5904
5906
5908
5910
5912
5914
5916
5918
5920
5922
5924
5926
5928
5930
5932
5934
5936
5938
5940
5942
5944
5946
5948
5950
5952
5954
5956
5958
5960
5962
5964
5966
5968
5970
5972
5974
5976
5978
5980
5982
5984
5986
5988
5990
5992
5994
5996
5998
6000
6002
6004
6006
6008
6010
6012
6014
6016
6018
6020
6022
6024
6026
6028
6030
6032
6034
6036
6038
6040
6042
6044
6046
6048
6050
6052
6054
6056
6058
6060
6062
6064
6066
6068
6070
6072
6074
6076
6078
6080
6082
6084
6086
6088
6090
6092
6094
6096
6098
6100
6102
6104
6106
6108
6110
6112
6114
6116
6118
6120
6122
6124
6126
6128
6130
6132
6134
6136
6138
6140
6142
6144
6146
6148
6150
6152
6154
6156
6158
6160
6162
6164
6166
6168
6170
6172
6174
6176
6178
6180
6182
6184
6186
6188
6190
6192
6194
6196
6198
6200
6202
6204
6206
6208
6210
6212
6214
6216
6218
6220
6222
6224
6226
6228
6230
6232
6234
6236
6238
6240
6242
6244
6246
6248
6250
6252
6254
6256
6258
6260
6262
6264
6266
6268
6270
6272
6274
6276
6278
6280
6282
6284
6286
6288
6290
6292
6294
6296
6298
6300
6302
6304
6306
6308
6310
6312
6314
6316
6318
6320
6322
6324
6326
6328
6330
6332
6334
6336
6338
6340
6342
6344
6346
6348
6350
6352
6354
6356
6358
6360
6362
6364
6366
6368
6370
6372
6374
6376
6378
6380
6382
6384
6386
6388
6390
6392
6394
6396
6398
6400
6402
6404
6406
6408
6410
6412
6414
6416
6418
6420
6422
6424
6426
6428
6430
6432
6434
6436
6438
6440
6442
6444
6446
6448
6450
6452
6454
6456
6458
6460
6462
6464
6466
6468
6470
6472
6474
6476
6478
6480
6482
6484
6486
6488
6490
6492
6494
6496
6498
6500
6502
6504
6506
6508
6510
6512
6514
6516
6518
6520
6522
6524
6526
6528
6530
6532
6534
6536
6538
6540
6542
6544
6546
6548
6550
6552
6554
6556
6558
6560
6562
6564
6566
6568
6570
6572
6574
6576
6578
6580
6582
6584
6586
6588
6590
6592
6594
6596
6598
6600
6602
6604
6606
6608
6610
6612
6614
6616
6618
6620
6622
6624
6626
6628
6630
6632
6634
6636
6638
6640
6642
6644
6646
6648
6650
6652
6654
6656
6658
6660
6662
6664
6666
6668
6670
6672
6674
6676
6678
6680
6682
6684
6686
6688
6690
6692
6694
6696
6698
6700
6702
6704
6706
6708
6710
6712
6714
6716
6718
6720
6722
6724
6726
6728
6730
6732
6734
6736
6738
6740
6742
6744
6746
6748
6750
6752
6754
6756
6758
6760
6762
6764
6766
6768
6770
6772
6774
6776
6778
6780
6782
6784
6786
6788
6790
6792
6794
6796
6798
6800
6802
6804
6806
6808
6810
6812
6814
6816
6818
6820
6822
6824
6826
6828
6830
6832
6834
6836
6838
6840
6842
6844
6846
6848
6850
6852
6854
6856
6858
6860
6862
6864
6866
6868
6870
6872
6874
6876
6878
6880
6882
6884
6886
6888
6890
6892
6894
6896
6898
6900
6902
6904
6906
6908
6910
6912
6914
6916
6918
6920
6922
6924
6926
6928
6930
6932
6934
6936
6938
6940
6942
6944
6946
6948
6950
6952
6954
6956
6958
6960
6962
6964
6966
6968
6970
6972
6974
6976
6978
6980
6982
6984
6986
6988
6990
6992
6994
6996
6998
7000
7002
7004
7006
7008
7010
7012
7014
7016
7018
7020
7022
7024
7026
7028
7030
7032
7034
7036
7038
7040
7042
7044
7046
7048
7050
7052
7054
7056
7058
7060
7062
7064
7066
7068
7070
7072
7074
7076
7078
7080
7082
7084
7086
7088
7090
7092
7094
7096
7098
7100
7102
7104
7106
7108
7110
7112
7114
7116
7118
7120
7122
7124
7126
7128
7130
7132
7134
7136
7138
7140
7142
7144
7146
7148
7150
7152
7154
7156
7158
7160
7162
7164
7166
7168
7170
7172
7174
7176
7178
7180
7182
7184
7186
7188
7190
7192
7194
7196
7198
7200
7202
7204
7206
7208
7210
7212
7214
7216
7218
7220
7222
7224
7226
7228
7230
7232
7234
7236
7238
7240
7242
7244
7246
7248
7250
7252
7254
7256
7258
7260
7262
7264
7266
7268
7270
7272
7274
7276
7278
7280
7282
7284
7286
7288
7290
7292
7294
7296
7298
7300
7302
7304
7306
7308
7310
7312
7314
7316
7318
7320
7322
7324
7326
7328
7330
7332
7334
7336
7338
7340
7342
7344
7346
7348
7350
7352
7354
7356
7358
7360
7362
7364
7366
7368
7370
7372
7374
7376
7378
7380
7382
7384
7386
7388
7390
7392
7394
7396
7398
7400
7402
7404
7406
7408
7410
7412
7414
7416
7418
7420
7422
7424
7426
7428
7430
7432
7434
7436
7438
7440
7442
7444
7446
7448
7450
7452
7454
7456
7458
7460
7462
7464
7466
7468
7470
7472
7474
7476
7478
7480
7482
7484
7486
7488
7490
7492
7494
7496
7498
7500
7502
7504
7506
7508
7510
7512
7514
7516
7518
7520
7522
7524
7526
7528
7530
7532
7534
7536
7538
7540
7542
7544
7546
7548
7550
7552
7554
7556
7558
7560
7562
7564
7566
7568
7570
7572
7574
7576
7578
7580
7582
7584
7586
7588
7590
7592
7594
7596
7598
7600
7602
7604
7606
7608
7610
7612
7614
7616
7618
7620
7622
7624
7626
7628
7630
7632
7634
7636
7638
7640
7642
7644
7646
7648
7650
7652
7654
7656
7658
7660
7662
7664
7666
7668
7670
7672
7674
7676
7678
7680
7682
7684
7686
7688
7690
7692
7694
7696
7698
7700
7702
7704
7706
7708
7710
7712
7714
7716
7718
7720
7722
7724
7726
7728
7730
7732
7734
7736
7738
7740
7742
7744
7746
7748
7750
7752
7754
7756
7758
7760
7762
7764
7766
7768
7770
7772
7774
7776
7778
7780
7782
7784
7786
7788
7790
7792
7794
7796
7798
7800
7802
7804
7806
7808
7810
7812
7814
7816
7818
7820
7822
7824
7826
7828
7830
7832
7834
7836
7838
7840
7842
7844
7846
7848
7850
7852
7854
7856
7858
7860
7862
7864
7866
7868
7870
7872
7874
7876
7878
7880
7882
7884
7886
7888
7890
7892
7894
7896
7898
7900
7902
7904
7906
7908
7910
7912
7914
7916
7918
7920
7922
7924
7926
7928
7930
7932
7934
7936
7938
7940
7942
7944
7946
7948
7950
7952
7954
7956
7958
7960
7962
7964
7966
7968
7970
7972
7974
7976
7978
7980
7982
7984
7986
7988
7990
7992
7994
7996
7998
8000
8002
8004
8006
8008
8010
8012
8014
8016
8018
8020
8022
8024
8026
8028
8030
8032
8034
8036
8038
8040
8042
8044
8046
8048
8050
8052
8054
8056
8058
8060
8062
8064
8066
8068
8070
8072
8074
8076
8078
8080
8082
8084
8086
8088
8090
8092
8094
8096
8098
8100
8102
8104
8106
8108
8110
8112
8114
8116
8118
8120
8122
8124
8126
8128
8130
8132
8134
8136
8138
8140
8142
8144
8146
8148
8150
8152
8154
8156
8158
8160
8162
8164
8166
8168
8170
8172
8174
8176
8178
8180
8182
8184
8186
8188
8190
8192
8194
8196
8198
8200
8202
8204
8206
8208
8210
8212
8214
8216
8218
8220
8222
8224
8226
8228
8230
8232
8234
8236
8238
8240
8242
8244
8246
8248
8250
8252
8254
8256
8258
8260
8262
8264
8266
8268
8270
8272
8274
8276
8278
8280
8282
8284
8286
8288
8290
8292
8294
8296
8298
8300
8302
8304
8306
8308
8310
8312
8314
8316
8318
8320
8322
8324
8326
8328
8330
8332
8334
8336
8338
8340
8342
8344
8346
8348
8350
8352
8354
8356
8358
8360
8362
8364
8366
8368
8370
8372
8374
8376
8378
8380
8382
8384
8386
8388
8390
8392
8394
8396
8398
8400
8402
8404
8406
8408
8410
8412
8414
8416
8418
8420
8422
8424
8426
8428
8430
8432
8434
8436
8438
8440
8442
8444
8446
8448
8450
8452
8454
8456
8458
8460
8462
8464
8466
8468
8470
8472
8474
8476
8478
8480
8482
8484
8486
8488
8490
8492
8494
8496
8498
8500
8502
8504
8506
8508
8510
8512
8514
8516
8518
8520
8522
8524
8526
8528
8530
8532
8534
8536
8538
8540
8542
8544
8546
8548
8550
8552
8554
8556
8558
8560
8562
8564
8566
8568
8570
8572
8574
8576
8578
8580
8582
8584
8586
8588
8590
8592
8594
8596
8598
8600
8602
8604
8606
8608
8610
8612
8614
8616
8618
8620
8622
8624
8626
8628
8630
8632
8634
8636
8638
8640
8642
8644
8646
8648
8650
8652
8654
8656
8658
8660
8662
8664
8666
8668
8670
8672
8674
8676
8678
8680
8682
8684
8686
8688
8690
8692
8694
8696
8698
8700
8702
8704
8706
8708
8710
8712
8714
8716
8718
8720
8722
8724
8726
8728
8730
8732
8734
8736
8738
8740
8742
8744
8746
8748
8750
8752
8754
8756
8758
8760
8762
8764
8766
8768
8770
8772
8774
8776
8778
8780
8782
8784
8786
8788
8790
8792
8794
8796
8798
8800
8802
8804
8806
8808
8810
8812
8814
8816
8818
8820
8822
8824
8826
8828
8830
8832
8834
8836
8838
8840
8842
8844
8846
8848
8850
8852
8854
8856
8858
8860
8862
8864
8866
8868
8870
8872
8874
8876
8878
8880
8882
8884
8886
8888
8890
8892
8894
8896
8898
8900
8902
8904
8906
8908
8910
8912
8914
8916
8918
8920
8922
8924
8926
8928
8930
8932
8934
8936
8938
8940
8942
8944
8946
8948
8950
8952
8954
8956
8958
8960
8962
8964
8966
8968
8970
8972
8974
8976
8978
8980
8982
8984
8986
8988
8990
8992
8994
8996
8998
9000
9002
9004
9006
9008
9010
9012
9014
9016
9018
9020
9022
9024
9026
9028
9030
9032
9034
9036
9038
9040
9042
9044
9046
9048
9050
9052
9054
9056
9058
9060
9062
9064
9066
9068
9070
9072
9074
9076
9078
9080
9082
9084
9086
9088
9090
9092
9094
9096
9098
9100
9102
9104
9106
9108
9110
9112
9114
9116
9118
9120
9122
9124
9126
9128
9130
9132
9134
9136
9138
9140
9142
9144
9146
9148
9150
9152
9154
9156
9158
9160
9162
9164
9166
9168
9170
9172
9174
9176
9178
9180
9182
9184
9186
9188
9190
9192
9194
9196
9198
9200
9202
9204
9206
9208
9210
9212
9214
9216
9218
9220
9222
9224
9226
9228
9230
9232
9234
9236
9238
9240
9242
9244
9246
9248
9250
9252
9254
9256
9258
9260
9262
9264
9266
9268
9270
9272
9274
9276
9278
9280
9282
9284
9286
9288
9290
9292
9294
9296
9298
9300
9302
9304
9306
9308
9310
9312
9314
9316
9318
9320
9322
9324
9326
9328
9330
9332
9334
9336
9338
9340
9342
9344
9346
9348
9350
9352
9354
9356
9358
9360
9362
9364
9366
9368
9370
9372
9374
9376
9378
9380
9382
9384
9386
9388
9390
9392
9394
9396
9398
9400
9402
9404
9406
9408
9410
9412
9414
9416
9418
9420
9422
9424
9426
9428
9430
9432
9434
9436
9438
9440
9442
9444
9446
9448
9450
9452
9454
9456
9458
9460
9462
9464
9466
9468
9470
9472
9474
9476
9478
9480
9482
9484
9486
9488
9490
9492
9494
9496
9498
9500
9502
9504
9506
9508
9510
9512
9514
9516
9518
9520
9522
9524
9526
9528
9530
9532
9534
9536
9538
9540
9542
9544
9546
9548
9550
9552
9554
9556
9558
9560
9562
9564
9566
9568
9570
9572
9574
9576
9578
9580
9582
9584
9586
9588
9590
9592
9594
9596
9598
9600
9602
9604
9606
9608
9610
9612
9614
9616
9618
9620
9622
9624
9626
9628
9630
9632
9634
9636
9638
9640
9642
9644
9646
9648
9650
9652
9654
9656
9658
9660
9662
9664
9666
9668
9670
9672
9674
9676
9678
9680
9682
9684
9686
9688
9690
9692
9694
9696
9698
9700
9702
9704
9706
9708
9710
9712
9714
9716
9718
9720
9722
9724
9726
9728
9730
9732
9734
9736
9738
9740
9742
9744
9746
9748
9750
9752
9754
9756
9758
9760
9762
9764
9766
9768
9770
9772
9774
9776
9778
9780
9782
9784
9786
9788
9790
9792
9794
9796
9798
9800
9802
9804
9806
9808
9810
9812
9814
9816
9818
9820
9822
9824
9826
9828
9830
9832
9834
9836
9838
9840
9842
9844
9846
9848
9850
9852
9854
9856
9858
9860
9862
9864
9866
9868
9870
9872
9874
9876
9878
9880
9882
9884
9886
9888
9890
9892
9894
9896
9898
9900
9902
9904
9906
9908
9910
9912
9914
9916
9918
9920
9922
9924
9926
9928
9930
9932
9934
9936
9938
9940
9942
9944
9946
9948
9950
9952
9954
9956
9958
9960
9962
9964
9966
9968
9970
9972
9974
9976
9978
9980
9982
9984
9986
9988
9990
9992
9994
9996
9998
10000
10002
10004
10006
10008
10010
10012
10014
10016
10018
10020
10022
10024
10026
10028
10030
10032
10034
10036
10038
10040
10042
10044
10046
10048
10050
10052
10054
10056
10058
10060
10062
10064
10066
10068
10070
10072
10074
10076
10078
10080
10082
10084
10086
10088
10090
10092
10094
10096
10098
10100
10102
10104
10106
10108
10110
10112
10114
10116
10118
10120
10122
10124
10126
10128
10130
10132
10134
10136
10138
10140
10142
10144
10146
10148
10150
10152
10154
10156
10158
10160
10162
10164
10166
10168
10170
10172
10174
10176
10178
10180
10182
10184
10186
10188
10190
10192
10194
10196
10198
10200
10202
10204
10206
10208
10210
10212
10214
10216
10218
10220
10222
10224
10226
10228
10230
10232
10234
10236
10238
10240
10242
10244
10246
10248
10250
10252
10254
10256
10258
10260
10262
10264
10266
10268
10270
10272
10274
10276
10278
10280
10282
10284
10286
10288
10290
10292
10294
10296
10298
10300
10302
10304
10306
10308
10310
10312
10314
10316
10318
10320
10322
10324
10326
10328
10330
10332
10334
10336
10338
10340
10342
10344
10346
10348
10350
10352
10354
10356
10358
10360
10362
10364
10366
10368
10370
10372
10374
10376
10378
10380
10382
10384
10386
10388
10390
10392
10394
10396
10398
10400
10402
10404
10406
10408
10410
10412
10414
10416
10418
10420
10422
10424
10426
10428
10430
10432
10434
10436
10438
10440
10442
10444
10446
10448
10450
10452
10454
10456
10458
10460
10462
10464
10466
10468
10470
10472
10474
10476
10478
10480
10482
10484
10486
10488
10490
10492
10494
10496
10498
10500
10502
10504
10506
10508
10510
10512
10514
10516
10518
10520
10522
10524
10526
10528
10530
10532
10534
10536
10538
10540
10542
10544
10546
10548
10550
10552
10554
10556
10558
10560
10562
10564
10566
10568
10570
10572
10574
10576
10578
10580
10582
10584
10586
10588
10590
10592
10594
10596
10598
10600
10602
10604
10606
10608
10610
10612
10614
10616
10618
10620
10622
10624
10626
10628
10630
10632
10634
10636
10638
10640
10642
10644
10646
10648
10650
10652
10654
10656
10658
10660
10662
10664
10666
10668
10670
10672
10674
10676
10678
10680
10682
10684
10686
10688
10690
10692
10694
10696
10698
10700
10702
10704
10706
10708
10710
10712
10714
10716
10718
10720
10722
10724
10726
10728
10730
10732
10734
10736
10738
10740
10742
10744
10746
10748
10750
10752
10754
10756
10758
10760
10762
10764
10766
10768
10770
10772
10774
10776
10778
10780
10782
10784
10786
10788
10790
10792
10794
10796
10798
10800
10802
10804
10806
10808
10810
10812
10814
10816
10818
10820
10822
10824
10826
10828
10830
10832
10834
10836
10838
10840
10842
10844
10846
10848
10850
10852
10854
10856
10858
10860
10862
10864
10866
10868
10870
10872
10874
10876
10878
10880
10882
10884
10886
10888
10890
10892
10894
10896
10898
10900
10902
10904
10906
10908
10910
10912
10914
10916
10918
10920
10922
10924
10926
10928
10930
10932
10934
10936
10938
10940
10942
10944
10946
10948
10950
10952
10954
10956
10958
10960
10962
10964
10966
10968
10970
10972
10974
10976
10978
10980
10982
10984
10986
10988
10990
10992
10994
10996
10998
11000
11002
11004
11006
11008
11010
11012
11014
11016
11018
11020
11022
11024
11026
11028
11030
11032
11034
11036
11038
11040
11042
11044
11046
11048
11050
11052
11054
11056
11058
11060
11062
11064
11066
11068
11070
11072
11074
11076
11078
11080
11082
11084
11086
11088
11090
11092
11094
11096
11098
11100
11102
11104
11106
11108
11110
11112
11114
11116
11118
11120
11122
11124
11126
11128
11130
11132
11134
11136
11138
11140
11142
11144
11146
11148
11150
11152
11154
11156
11158
11160
11162
11164
11166
11168
11170
11172
11174
11176
11178
11180
11182
11184
11186
11188
11190
11192
11194
11196
11198
11200
11202
11204
11206
11208
11210
11212
11214
11216
11218
11220
11222
11224
11226
11228
11230
11232
11234
11236
11238
11240
11242
11244
11246
11248
11250
11252
11254
11256
11258
11260
11262
11264
11266
11268
11270
11272
11274
11276
11278
11280
11282
11284
11286
11288
11290
11292
11294
11296
11298
11300
11302
11304
11306
11308
11310
11312
11314
11316
11318
11320
11322
11324
11326
11328
11330
11332
11334
11336
11338
11340
11342
11344
11346
11348
11350
11352
11354
11356
11358
11360
11362
11364
11366
11368
11370
11372
11374
11376
11378
11380
11382
11384
11386
11388
11390
11392
11394
11396
11398
11400
11402
11404
11406
11408
11410
11412
11414
11416
11418
11420
11422
11424
11426
11428
11430
11432
11434
11436
11438
11440
11442
11444
11446
11448
11450
11452
11454
11456
11458
11460
11462
11464
11466
11468
11470
11472
11474
11476
11478
11480
11482
11484
11486
11488
11490
11492
11494
11496
11498
11500
11502
11504
11506
11508
11510
11512
11514
11516
11518
11520
11522
11524
11526
11528
11530
11532
11534
11536
11538
11540
11542
11544
11546
11548
11550
11552
11554
11556
11558
11560
11562
11564
11566
11568
11570
11572
11574
11576
11578
11580
11582
11584
11586
11588
11590
11592
11594
11596
11598
11600
11602
11604
11606
11608
11610
11612
11614
11616
11618
11620
11622
11624
11626
11628
11630
11632
11634
11636
11638
11640
11642
11644
11646
11648
11650
11652
11654
11656
11658
11660
11662
11664
11666
11668
11670
11672
11674
11676
11678
11680
11682
11684
11686
11688
11690
11692
11694
11696
11698
11700
11702
11704
11706
11708
11710
11712
11714
11716
11718
11720
11722
11724
11726
11728
11730
11732
11734
11736
11738
11740
11742
11744
11746
11748
11750
11752
11754
11756
11758
11760
11762
11764
11766
11768
11770
11772
11774
11776
11778
11780
11782
11784
11786
11788
11790
11792
11794
11796
11798
11800
11802
11804
11806
11808
11810
11812
11814
11816
11818
11820
11822
11824
11826
11828
11830
11832
11834
11836
11838
11840
11842
11844
11846
11848
11850
11852
11854
11856
11858
11860
11862
11864
11866
11868
11870
11872
11874
11876
11878
11880
11882
11884
11886
11888
11890
11892
11894
11896
11898
11900
11902
11904
11906
11908
11910
11912
11914
11916
11918
11920
11922
11924
11926
11928
11930
11932
11934
11936
11938
11940
11942
11944
11946
11948
11950
11952
11954
11956
11958
11960
11962
11964
11966
11968
11970
11972
11974
11976
11978
11980
11982
11984
11986
11988
11990
11992
11994
11996
11998
12000
12002
12004
12006
12008
12010
12012
12014
12016
12018
12020
12022
12024
12026
12028
12030
12032
12034
12036
12038
12040
12042
12044
12046
12048
12050
12052
12054
12056
12058
12060
12062
12064
12066
12068
12070
12072
12074
12076
12078
12080
12082
12084
12086
12088
12090
12092
12094
12096
12098
12100
12102
12104
12106
12108
12110
12112
12114
12116
12118
12120
12122
12124
12126
12128
12130
12132
12134
12136
12138
12140
12142
12144
12146
12148
12150
12152
12154
12156
12158
12160
12162
12164
12166
12168
12170
12172
12174
12176
12178
12180
12182
12184
12186
12188
12190
12192
12194
12196
12198
12200
12202
12204
12206
12208
12210
12212
12214
12216
12218
12220
12222
12224
12226
12228
12230
12232
12234
12236
12238
12240
12242
12244
12246
12248
12250
12252
12254
12256
12258
12260
12262
12264
12266
12268
12270
12272
12274
12276
12278
12280
12282
12284
12286
12288
12290
12292
12294
12296
12298
12300
12302
12304
12306
12308
12310
12312
12314
12316
12318
12320
12322
12324
12326
12328
12330
12332
12334
12336
12338
12340
12342
12344
12346
12348
12350
12352
12354
12356
12358
12360
12362
12364
12366
12368
12370
12372
12374
12376
12378
12380
12382
12384
12386
12388
12390
12392
12394
12396
12398
12400
12402
12404
12406
12408
12410
12412
12414
12416
12418
12420
12422
12424
12426
12428
12430
12432
12434
12436
12438
12440
12442
12444
12446
12448
12450
12452
12454
12456
12458
12460
12462
12464
12466
12468
12470
12472
12474
12476
12478
12480
12482
12484
12486
12488
12490
12492
12494
12496
12498
12500
12502
12504
12506
12508
12510
12512
12514
12516
12518
12520
12522
12524
12526
12528
12530
12532
12534
12536
12538
12540
12542
12544
12546
12548
12550
12552
12554
12556
12558
12560
12562
12564
12566
12568
12570
12572
12574
12576
12578
12580
12582
12584
12586
12588
12590
12592
12594
12596
12598
12600
12602
12604
12606
12608
12610
12612
12614
12616
12618
12620
12622
12624
12626
12628
12630
12632
12634
12636
12638
12640
12642
12644
12646
12648
12650
12652
12654
12656
12658
12660
12662
12664
12666
12668
12670
12672
12674
12676
12678
12680
12682
12684
12686
12688
12690
12692
12694
12696
12698
12700
12702
12704
12706
12708
12710
12712
12714
12716
12718
12720
12722
12724
12726
12728
12730
12732
12734
12736
12738
12740
12742
12744
12746
12748
12750
12752
12754
12756
12758
12760
12762
12764
12766
12768
12770
12772
12774
12776
12778
12780
12782
12784
12786
12788
12790
12792
12794
12796
12798
12800
12802
12804
12806
12808
12810
12812
12814
12816
12818
12820
12822
12824
12826
12828
12830
12832
12834
12836
12838
12840
12842
12844
12846
12848
12850
12852
12854
12856
12858
12860
12862
12864
12866
12868
12870
12872
12874
12876
12878
12880
12882
12884
12886
12888
12890
12892
12894
12896
12898
12900
12902
12904
12906
12908
12910
12912
12914
12916
12918
12920
12922
12924
12926
12928
12930
12932
12934
12936
12938
12940
12942
12944
12946
12948
12950
12952
12954
12956
12958
12960
12962
12964
12966
12968
12970
12972
12974
12976
12978
12980
12982
12984
12986
12988
12990
12992
12994
12996
12998
13000
13002
13004
13006
13008
13010
13012
13014
13016
13018
13020
13022
13024
13026
13028
13030
13032
13034
13036
13038
13040
13042
13044
13046
13048
13050
13052
13054
13056
13058
13060
13062
13064
13066
13068
13070
13072
13074
13076
13078
13080
13082
13084
13086
13088
13090
13092
13094
13096
13098
13100
13102
13104
13106
13108
13110
13112
13114
13116
13118
13120
13122
13124
13126
13128
13130
13132
13134
13136
13138
13140
13142
13144
13146
13148
13150
13152
13154
13156
13158
13160
13162
13164
13166
13168
13170
13172
13174
13176
13178
13180
13182
13184
13186
13188
13190
13192
13194
13196
13198
13200
13202
13204
13206
13208
13210
13212
13214
13216
13218
13220
13222
13224
13226
13228
13230
13232
13234
13236
13238
13240
13242
13244
13246
13248
13250
13252
13254
13256
13258
13260
13262
13264
13266
13268
13270
13272
13274
13276
13278
13280
13282
13284
13286
13288
13290
13292
13294
13296
13298
13300
13302
13304
13306
13308
13310
13312
13314
13316
13318
13320
13322
13324
13326
13328
13330
13332
13334
13336
13338
13340
13342
13344
13346
13348
13350
13352
13354
13356
13358
13360
13362
13364
13366
13368
13370
13372
13374
13376
13378
13380
13382
13384
13386
13388
13390
13392
13394
13396
13398
13400
13402
13404
13406
13408
13410
13412
13414
13416
13418
13420
13422
13424
13426
13428
13430
13432
13434
13436
13438
13440
13442
13444
13446
13448
13450
13452
13454
13456
13458
13460
13462
13464
13466
13468
13470
13472
13474
13476
13478
13480
13482
13484
13486
13488
13490
13492
13494
13496
13498
13500
13502
13504
13506
13508
13510
13512
13514
13516
13518
13520
13522
13524
13526
13528
13530
13532
13534
13536
13538
13540
13542
13544
13546
13548
13550
13552
13554
13556
13558
13560
13562
13564
13566
13568
13570
13572
13574
13576
13578
13580
13582
13584
13586
13588
13590
13592
13594
13596
13598
13600
13602
13604
13606
13608
13610
13612
13614
13616
13618
13620
13622
13624
13626
13628
13630
13632
13634
13636
13638
13640
13642
13644
13646
13648
13650
13652
13654
13656
13658
13660
13662
13664
13666
13668
13670
13672
13674
13676
13678
13680
13682
13684
13686
13688
13690
13692
13694
13696
13698
13700
13702
13704
13706
13708
13710
13712
13714
13716
13718
13720
13722
13724
13726
13728
13730
13732
13734
13736
13738
13740
13742
13744
13746
13748
13750
13752
13754
13756
13758
13760
13762
13764
13766
13768
13770
13772
13774
13776
13778
13780
13782
13784
13786
13788
13790
13792
13794
13796
13798
13800
13802
13804
13806
13808
13810
13812
13814
13816
13818
13820
13822
13824
13826
13828
13830
13832
13834
13836
13838
13840
13842
13844
13846
13848
13850
13852
13854
13856
13858
13860
13862
13864
13866
13868
13870
13872
13874
13876
13878
13880
13882
13884
13886
13888
13890
13892
13894
13896
13898
13900
13902
13904
13906
13908
13910
13912
13914
13916
13918
13920
13922
13924
13926
13928
13930
13932
13934
13936
13938
13940
13942
13944
13946
13948
13950
13952
13954
13956
13958
13960
13962
13964
13966
13968
13970
13972
13974
13976
13978
13980
13982
13984
13986
13988
13990
13992
13994
13996
13998
14000
14002
14004
14006
14008
14010
14012
14014
14016
14018
14020
14022
14024
14026
14028
14030
14032
14034
14036
14038
14040
14042
14044
14046
14048
14050
14052
14054
14056
14058
14060
14062
14064
14066
14068
14070
14072
14074
14076
14078
14080
14082
14084
14086
14088
14090
14092
14094
14096
14098
14100
14102
14104
14106
14108
14110
14112
14114
14116
14118
14120
14122
14124
14126
14128
14130
14132
14134
14136
14138
14140
14142
14144
14146
14148
14150
14152
14154
14156
14158
14160
14162
14164
14166
14168
14170
14172
14174
14176
14178
14180
14182
14184
14186
14188
14190
14192
14194
14196
14198
14200
14202
14204
14206
14208
14210
14212
14214
14216
14218
14220
14222
14224
14226
14228
14230
14232
14234
14236
14238
14240
14242
14244
14246
14248
14250
14252
14254
14256
14258
14260
14262
14264
14266
14268
14270
14272
14274
14276
14278
14280
14282
14284
14286
14288
14290
14292
14294
14296
14298
14300
14302
14304
14306
14308
14310
14312
14314
14316
14318
14320
14322
14324
14326
14328
14330
14332
14334
14336
14338
14340
14342
14344
14346
14348
14350
14352
14354
14356
14358
14360
14362
14364
14366
14368
14370
14372
14374
14376
14378
14380
14382
14384
14386
14388
14390
14392
14394
14396
14398
14400
14402
14404
14406
14408
14410
14412
14414
14416
14418
14420
14422
14424
14426
14428
14430
14432
14434
14436
14438
14440
14442
14444
14446
14448
14450
14452
14454
14456
14458
14460
14462
14464
14466
14468
14470
14472
14474
14476
14478
14480
14482
14484
14486
14488
14490
14492
14494
14496
14498
14500
14502
14504
14506
14508
14510
14512
14514
14516
14518
14520
14522
14524
14526
14528
14530
14532
14534
14536
14538
14540
14542
14544
14546
14548
14550
14552
14554
14556
14558
14560
14562
14564
14566
14568
14570
14572
14574
14576
14578
14580
14582
14584
14586
14588
14590
14592
14594
14596
14598
14600
14602
14604
14606
14608
14610
14612
14614
14616
14618
14620
14622
14624
14626
14628
14630
14632
14634
14636
14638
14640
14642
14644
14646
14648
14650
14652
14654
14656
14658
14660
14662
14664
14666
14668
14670
14672
14674
14676
14678
14680
14682
14684
14686
14688
14690
14692
14694
14696
14698
14700
14702
14704
14706
14708
14710
14712
14714
14716
14718
14720
14722
14724
14726
14728
14730
14732
14734
14736
14738
14740
14742
14744
14746
14748
14750
14752
14754
14756
14758
14760
14762
14764
14766
14768
14770
14772
14774
14776
14778
14780
14782
14784
14786
14788
14790
14792
14794
14796
14798
14800
14802
14804
14806
14808
14810
14812
14814
14816
14818
14820
14822
14824
14826
14828
14830
14832
14834
14836
14838
14840
14842
14844
14846
14848
14850
14852
14854
14856
14858
14860
14862
14864
14866
14868
14870
14872
14874
14876
14878
14880
14882
14884
14886
14888
14890
14892
14894
14896
14898
14900
14902
14904
14906
14908
14910
14912
14914
14916
14918
14920
14922
14924
14926
14928
14930
14932
14934
14936
14938
14940
14942
14944
14946
14948
14950
14952
14954
14956
14958
14960
14962
14964
14966
14968
14970
14972
14974
14976
14978
14980
14982
14984
14986
14988
14990
14992
14994
14996
14998
15000
15002
15004
15006
15008
15010
15012
15014
15016
15018
15020
15022
15024
15026
15028
15030
15032
15034
15036
15038
15040
15042
15044
15046
15048
15050
15052
15054
15056
15058
15060
15062
15064
15066
15068
15070
15072
15074
15076
15078
15080
15082
15084
15086
15088
15090
15092
15094
15096
15098
15100
15102
15104
15106
15108
15110
15112
15114
15116
15118
15120
15122
15124
15126
15128
15130
15132
15134
15136
15138
15140
15142
15144
15146
15148
15150
15152
15154
15156
15158
15160
15162
15164
15166
15168
15170
15172
15174
15176
15178
15180
15182
15184
15186
15188
15190
15192
15194
15196
15198
15200
15202
15204
15206
15208
15210
15212
15214
15216
15218
15220
15222
15224
15226
15228
15230
15232
15234
15236
15238
15240
15242
15244
15246
15248
15250
15252
15254
15256
15258
15260
15262
15264
15266
15268
15270
15272
15274
15276
15278
15280
15282
15284
15286
15288
15290
15292
15294
15296
15298
15300
15302
15304
15306
15308
15310
15312
15314
15316
15318
15320
15322
15324
15326
15328
15330
15332
15334
15336
15338
15340
15342
15344
15346
15348
15350
15352
15354
15356
15358
15360
15362
15364
15366
15368
15370
15372
15374
15376
15378
15380
15382
15384
15386
15388
15390
15392
15394
15396
15398
15400
15402
15404
15406
15408
15410
15412
15414
15416
15418
15420
15422
15424
15426
15428
15430
15432
15434
15436
15438
15440
15442
15444
15446
15448
15450
15452
15454
15456
15458
15460
15462
15464
15466
15468
15470
15472
15474
15476
15478
15480
15482
15484
15486
15488
15490
15492
15494
15496
15498
15500
15502
15504
15506
15508
15510
15512
15514
15516
15518
15520
15522
15524
15526
15528
15530
15532
15534
15536
15538
15540
15542
15544
15546
15548
15550
15552
15554
15556
15558
15560
15562
15564
15566
15568
15570
15572
15574
15576
15578
15580
15582
15584
15586
15588
15590
15592
15594
15596
15598
15600
15602
15604
15606
15608
15610
15612
15614
15616
15618
15620
15622
15624
15626
15628
15630
15632
15634
15636
15638
15640
15642
15644
15646
15648
15650
15652
15654
15656
15658
15660
15662
15664
15666
15668
15670
15672
15674
15676
15678
15680
15682
15684
15686
15688
15690
15692
15694
15696
15698
15700
15702
15704
15706
15708
15710
15712
15714
15716
15718
15720
15722
15724
15726
15728
15730
15732
15734
15736
15738
15740
15742
15744
15746
15748
15750
15752
15754
15756
15758
15760
15762
15764
15766
15768
15770
15772
15774
15776
15778
15780
15782
15784
15786
15788
15790
15792
15794
15796
15798
15800
15802
15804
15806
15808
15810
15812
15814
15816
15818
15820
15822
15824
15826
15828
15830
15832
15834
15836
15838
15840
15842
15844
15846
15848
15850
15852
15854
15856
15858
15860
15862
15864
15866
15868
15870
15872
15874
15876
15878
15880
15882
15884
15886
15888
15890
15892
15894
15896
15898
15900
15902
15904
15906
15908
15910
15912
15914
15916
15918
15920
15922
15924
15926
15928
15930
15932
15934
15936
15938
15940
15942
15944
15946
15948
15950
15952
15954
15956
15958
15960
15962
15964
15966
15968
15970
15972
15974
15976
15978
15980
15982
15984
15986
15988
15990
15992
15994
15996
15998
16000
16002
16004
16006
16008
16010
16012
16014
16016
16018
16020
16022
16024
16026
16028
16030
16032
16034
16036
16038
16040
16042
16044
16046
16048
16050
16052
16054
16056
16058
16060
16062
16064
16066
16068
16070
16072
16074
16076
16078
16080
16082
16084
16086
16088
16090
16092
16094
16096
16098
16100
16102
16104
16106
16108
16110
16112
16114
16116
16118
16120
16122
16124
16126
16128
16130
16132
16134
16136
16138
16140
16142
16144
16146
16148
16150
16152
16154
16156
16158
16160
16162
16164
16166
16168
16170
16172
16174
16176
16178
16180
16182
16184
16186
16188
16190
16192
16194
16196
16198
16200
16202
16204
16206
16208
16210
16212
16214
16216
16218
16220
16222
16224
16226
16228
16230
16232
16234
16236
16238
16240
16242
16244
16246
16248
16250
16252
16254
16256
16258
16260
16262
16264
16266
16268
16270
16272
16274
16276
16278
16280
16282
16284
16286
16288
16290
16292
16294
16296
16298
16300
16302
16304
16306
16308
16310
16312
16314
16316
16318
16320
16322
16324
16326
16328
16330
16332
16334
16336
16338
16340
16342
16344
16346
16348
16350
16352
16354
16356
16358
16360
16362
16364
16366
16368
16370
16372
16374
16376
16378
16380
16382
16384
16386
16388
16390
16392
16394
16396
16398
16400
16402
16404
16406
16408
16410
16412
16414
16416
16418
16420
16422
16424
16426
16428
16430
16432
16434
16436
16438
16440
16442
16444
16446
16448
16450
16452
16454
16456
16458
16460
16462
16464
16466
16468
16470
16472
16474
16476
16478
16480
16482
16484
16486
16488
16490
16492
16494
16496
16498
16500
16502
16504
16506
16508
16510
16512
16514
16516
16518
16520
16522
16524
16526
16528
16530
16532
16534
16536
16538
16540
16542
16544
16546
16548
16550
16552
16554
16556
16558
16560
16562
16564
16566
16568
16570
16572
16574
16576
16578
16580
16582
16584
16586
16588
16590
16592
16594
16596
16598
16600
16602
16604
16606
16608
16610
16612
16614
16616
16618
16620
16622
16624
16626
16628
16630
16632
16634
16636
16638
16640
16642
16644
16646
16648
16650
16652
16654
16656
16658
16660
16662
16664
16666
16668
16670
16672
16674
16676
16678
16680
16682
16684
16686
16688
16690
16692
16694
16696
16698
16700
16702
16704
16706
16708
16710
16712
16714
16716
16718
16720
16722
16724
16726
16728
16730
16732
16734
16736
16738
16740
16742
16744
16746
16748
16750
16752
16754
16756
16758
16760
16762
16764
16766
16768
16770
16772
16774
16776
16778
16780
16782
16784
16786
16788
16790
16792
16794
16796
16798
16800
16802
16804
16806
16808
16810
16812
16814
16816
16818
16820
16822
16824
16826
16828
16830
16832
16834
16836
16838
16840
16842
16844
16846
16848
16850
16852
16854
16856
16858
16860
16862
16864
16866
16868
16870
16872
16874
16876
16878
16880
16882
16884
16886
16888
16890
16892
16894
16896
16898
16900
16902
16904
16906
16908
16910
16912
16914
16916
16918
16920
16922
16924
16926
16928
16930
16932
16934
16936
16938
16940
16942
16944
16946
16948
16950
16952
16954
16956
16958
16960
16962
16964
16966
16968
16970
16972
16974
16976
16978
16980
16982
16984
16986
16988
16990
16992
16994
16996
16998
17000
17002
17004
17006
17008
17010
17012
17014
17016
17018
17020
17022
17024
17026
17028
17030
17032
17034
17036
17038
17040
17042
17044
17046
17048
17050
17052
17054
17056
17058
17060
17062
17064
17066
17068
17070
17072
17074
17076
17078
17080
17082
17084
17086
17088
17090
17092
17094
17096
17098
17100
17102
17104
17106
17108
17110
17112
17114
17116
17118
17120
17122
17124
17126
17128
17130
17132
17134
17136
17138
17140
17142
17144
17146
17148
17150
17152
17154
17156
17158
17160
17162
17164
17166
17168
17170
17172
17174
17176
17178
17180
17182
17184
17186
17188
17190
17192
17194
17196
17198
17200
17202
17204
17206
17208
17210
17212
17214
17216
17218
17220
17222
17224
17226
17228
17230
17232
17234
17236
17238
17240
17242
17244
17246
17248
17250
17252
17254
17256
17258
17260
17262
17264
17266
17268
17270
17272
17274
17276
17278
17280
17282
17284
17286
17288
17290
17292
17294
17296
17298
17300
17302
17304
17306
17308
17310
17312
17314
17316
17318
17320
17322
17324
17326
17328
17330
17332
17334
17336
17338
17340
17342
17344
17346
17348
17350
17352
17354
17356
17358
17360
17362
17364
17366
17368
17370
17372
17374
17376
17378
17380
17382
17384
17386
17388
17390
17392
17394
17396
17398
17400
17402
17404
17406
17408
17410
17412
17414
17416
17418
17420
17422
17424
17426
17428
17430
17432
17434
17436
17438
17440
17442
17444
17446
17448
17450
17452
17454
17456
17458
17460
17462
17464
17466
17468
17470
17472
17474
17476
17478
17480
17482
17484
17486
17488
17490
17492
17494
17496
17498
17500
17502
17504
17506
17508
17510
17512
17514
17516
17518
17520
17522
17524
17526
17528
17530
17532
17534
17536
17538
17540
17542
17544
17546
17548
17550
17552
17554
17556
17558
17560
17562
17564
17566
17568
17570
17572
17574
17576
17578
17580
17582
17584
17586
17588
17590
17592
17594
17596
17598
17600
17602
17604
17606
17608
17610
17612
17614
17616
17618
17620
17622
17624
17626
17628
17630
17632
17634
17636
17638
17640
17642
17644
17646
17648
17650
17652
17654
17656
17658
17660
17662
17664
17666
17668
17670
17672
17674
17676
17678
17680
17682
17684
17686
17688
17690
17692
17694
17696
17698
17700
17702
17704
17706
17708
17710
17712
17714
17716
17718
17720
17722
17724
17726
17728
17730
17732
17734
17736
17738
17740
17742
17744
17746
17748
17750
17752
17754
17756
17758
17760
17762
17764
17766
17768
17770
17772
17774
17776
17778
17780
17782
17784
17786
17788
17790
17792
17794
17796
17798
17800
17802
17804
17806
17808
17810
17812
17814
17816
17818
17820
17822
17824
17826
17828
17830
17832
17834
17836
17838
17840
17842
17844
17846
17848
17850
17852
17854
17856
17858
17860
17862
17864
17866
17868
17870
17872
17874
17876
17878
17880
17882
17884
17886
17888
17890
17892
17894
17896
17898
17900
17902
17904
17906
17908
17910
17912
17914
17916
17918
17920
17922
17924
17926
17928
17930
17932
17934
17936
17938
17940
17942
17944
17946
17948
17950
17952
17954
17956
17958
17960
17962
17964
17966
17968
17970
17972
17974
17976
17978
17980
17982
17984
17986
17988
17990
17992
17994
17996
17998
18000
18002
18004
18006
18008
18010
18012
18014
18016
18018
18020
18022
18024
18026
18028
18030
18032
18034
18036
18038
18040
18042
18044
18046
18048
18050
18052
18054
18056
18058
18060
18062
18064
18066
18068
18070
18072
18074
18076
18078
18080
18082
18084
18086
18088
18090
18092
18094
18096
18098
18100
18102
18104
18106
18108
18110
18112
18114
18116
18118
18120
18122
18124
18126
18128
18130
18132
18134
18136
18138
18140
18142
18144
18146
18148
18150
18152
18154
18156
18158
18160
18162
18164
18166
18168
18170
18172
18174
18176
18178
18180
18182
18184
18186
18188
18190
18192
18194
18196
18198
18200
18202
18204
18206
18208
18210
18212
18214
18216
18218
18220
18222
18224
18226
18228
18230
18232
18234
18236
18238
18240
18242
18244
18246
18248
18250
18252
18254
18256
18258
18260
18262
18264
18266
18268
18270
18272
18274
18276
18278
18280
18282
18284
18286
18288
18290
18292
18294
18296
18298
18300
18302
18304
18306
18308
18310
18312
18314
18316
18318
18320
18322
18324
18326
18328
18330
18332
18334
18336
18338
18340
18342
18344
18346
18348
18350
18352
18354
18356
18358
18360
18362
18364
18366
18368
18370
18372
18374
18376
18378
18380
18382
18384
18386
18388
18390
18392
18394
18396
18398
18400
18402
18404
18406
18408
18410
18412
18414
18416
18418
18420
18422
18424
18426
18428
18430
18432
18434
18436
18438
18440
18442
18444
18446
18448
18450
18452
18454
18456
18458
18460
18462
18464
18466
18468
18470
18472
18474
18476
18478
18480
18482
18484
18486
18488
18490
18492
18494
18496
18498
18500
18502
18504
18506
18508
18510
18512
18514
18516
18518
18520
18522
18524
18526
18528
18530
18532
18534
18536
18538
18540
18542
18544
18546
18548
18550
18552
18554
18556
18558
18560
18562
18564
18566
18568
18570
18572
18574
18576
18578
18580
18582
18584
18586
18588
18590
18592
18594
18596
18598
18600
18602
18604
18606
18608
18610
18612
18614
18616
18618
18620
18622
18624
18626
18628
18630
18632
18634
18636
18638
18640
18642
18644
18646
18648
18650
18652
18654
18656
18658
18660
18662
18664
18666
18668
18670
18672
18674
18676
18678
18680
18682
18684
18686
18688
18690
18692
18694
18696
18698
18700
18702
18704
18706
18708
18710
18712
18714
18716
18718
18720
18722
18724
18726
18728
18730
18732
18734
18736
18738
18740
18742
18744
18746
18748
18750
18752
18754
18756
18758
18760
18762
18764
18766
18768
18770
18772
18774
18776
18778
18780
18782
18784
18786
18788
18790
18792
18794
18796
18798
18800
18802
18804
18806
18808
18810
18812
18814
18816
18818
18820
18822
18824
18826
18828
18830
18832
18834
18836
18838
18840
18842
18844
18846
18848
18850
18852
18854
18856
18858
18860
18862
18864
18866
18868
18870
18872
18874
18876
18878
18880
18882
18884
18886
18888
18890
18892
18894
18896
18898
18900
18902
18904
18906
18908
18910
18912
18914
18916
18918
18920
18922
18924
18926
18928
18930
18932
18934
18936
18938
18940
18942
18944
18946
18948
18950
18952
18954
18956
18958
18960
18962
18964
18966
18968
18970
18972
18974
18976
18978
18980
18982
18984
18986
18988
18990
18992
18994
18996
18998
19000
19002
19004
19006
19008
19010
19012
19014
19016
19018
19020
19022
19024
19026
19028
19030
19032
19034
19036
19038
19040
19042
19044
19046
19048
19050
19052
19054
19056
19058
19060
19062
19064
19066
19068
19070
19072
19074
19076
19078
19080
19082
19084
19086
19088
19090
19092
19094
19096
19098
19100
19102
19104
19106
19108
19110
19112
19114
19116
19118
19120
19122
19124
19126
19128
19130
19132
19134
19136
19138
19140
19142
19144
19146
19148
19150
19152
19154
19156
19158
19160
19162
19164
19166
19168
19170
19172
19174
19176
19178
19180
19182
19184
19186
19188
19190
19192
19194
19196
19198
19200
19202
19204
19206
19208
19210
19212
19214
19216
19218
19220
19222
19224
19226
19228
19230
19232
19234
19236
19238
19240
19242
19244
19246
19248
19250
19252
19254
19256
19258
19260
19262
19264
19266
19268
19270
19272
19274
19276
19278
19280
19282
19284
19286
19288
19290
19292
19294
19296
19298
19300
19302
19304
19306
19308
19310
19312
19314
19316
19318
19320
19322
19324
19326
19328
19330
19332
19334
19336
19338
19340
19342
19344
19346
19348
19350
19352
19354
19356
19358
19360
19362
19364
19366
19368
19370
19372
19374
19376
19378
19380
19382
19384
19386
19388
19390
19392
19394
19396
19398
19400
19402
19404
19406
19408
19410
19412
19414
19416
19418
19420
19422
19424
19426
19428
19430
19432
19434
19436
19438
19440
19442
19444
19446
19448
19450
19452
19454
19456
19458
19460
19462
19464
19466
19468
19470
19472
19474
19476
19478
19480
19482
19484
19486
19488
19490
19492
19494
19496
19498
19500
19502
19504
19506
19508
19510
19512
19514
19516
19518
19520
19522
19524
19526
19528
19530
19532
19534
19536
19538
19540
19542
19544
19546
19548
19550
19552
19554
19556
19558
19560
19562
19564
19566
19568
19570
19572
19574
19576
19578
19580
19582
19584
19586
19588
19590
19592
19594
19596
19598
19600
19602
19604
19606
19608
19610
19612
19614
19616
19618
19620
19622
19624
19626
19628
19630
19632
19634
19636
19638
19640
19642
19644
19646
19648
19650
19652
19654
19656
19658
19660
19662
19664
19666
19668
19670
19672
19674
19676
19678
19680
19682
19684
19686
19688
19690
19692
19694
19696
19698
19700
19702
19704
19706
19708
19710
19712
19714
19716
19718
19720
19722
19724
19726
19728
19730
19732
19734
19736
19738
19740
19742
19744
19746
19748
19750
19752
19754
19756
19758
19760
19762
19764
19766
19768
19770
19772
19774
19776
19778
19780
19782
19784
19786
19788
19790
19792
19794
19796
19798
19800
19802
19804
19806
19808
19810
19812
19814
19816
19818
19820
19822
19824
19826
19828
19830
19832
19834
19836
19838
19840
19842
19844
19846
19848
19850
19852
19854
19856
19858
19860
19862
19864
19866
19868
19870
19872
19874
19876
19878
19880
19882
19884
19886
19888
19890
19892
19894
19896
19898
19900
19902
19904
19906
19908
19910
19912
19914
19916
19918
19920
19922
19924
19926
19928
19930
19932
19934
19936
19938
19940
19942
19944
19946
19948
19950
19952
19954
19956
19958
19960
19962
19964
19966
19968
19970
19972
19974
19976
19978
19980
19982
19984
19986
19988
19990
19992
19994
19996
19998
[163]:
g = myrange(4, 20000, 2)
type(g)
[163]:
generator

JSON

[164]:
import json

Send away

[165]:
l_to_send = [1, 2, 3, 4]
json_to_send = json.dumps(l_to_send)
json_to_send
[165]:
'[1, 2, 3, 4]'
[166]:
type(json_to_send)
[166]:
str

Receive

[167]:
json_received = json_to_send
[168]:
l_received = json.loads(json_received)
l_received
[168]:
[1, 2, 3, 4]

More datatypes?

[169]:
d = {
    'one': 1,
    'two': 2,
}
json.dumps(d)
[169]:
'{"one": 1, "two": 2}'
[170]:
l = [
    ('hugo', 10, 1, 2, 3),
    ('sine', 11, 0, 0, 0),
]
serialized = json.dumps(l)
serialized
[170]:
'[["hugo", 10, 1, 2, 3], ["sine", 11, 0, 0, 0]]'
[171]:
json.loads(serialized)
[171]:
[['hugo', 10, 1, 2, 3], ['sine', 11, 0, 0, 0]]

Everything is an Object of a Type

[172]:
i = 666
[173]:
j = i
[174]:
id(i)
[174]:
140106668681968
[175]:
id(j)
[175]:
140106668681968
[176]:
class X:
    def __init__(self, blah):
        self.blah = blah
[177]:
x = X('hallo')
[178]:
x.blah
[178]:
'hallo'
[179]:
type(X)
[179]:
type
[180]:
print(X)
<class '__main__.X'>
[181]:
Y = X
[182]:
print(type(Y))
<class 'type'>
[183]:
Y is X
[183]:
True
[184]:
isinstance(x, X)
[184]:
True
[185]:
isinstance(x, Y)
[185]:
True
[186]:
def f():
    print('calling f')
[187]:
type(f)
[187]:
function
[188]:
type(type(f))
[188]:
type
[189]:
f()
calling f
[190]:
g = f
g()
calling f

Generators, used more creatively

Generating wall clock time, aka iterating over wall clock timestamps

[206]:
timeaxis = range(10)
for timestamp in timeaxis:
    print(timestamp)
0
1
2
3
4
5
6
7
8
9

Hm, and real timestamps, iterated likewise?

[207]:
import time
def wallclock_axis():
    while True:
        yield time.time()
[210]:
i = 0
for ts in wallclock_axis():
    if i < 10:
        print(ts)
        i += 1
        time.sleep(0.1)
    else:
        break
1638538131.1975703
1638538131.2978473
1638538131.3981225
1638538131.498449
1638538131.5987027
1638538131.698947
1638538131.7996597
1638538131.899947
1638538132.0001943
1638538132.1010473

Exception Handling and Exception Types

[216]:
issubclass(TypeError, Exception)
[216]:
True
[217]:
def f(name):
    pass
[220]:
try:
    f()
except Exception:
    print('bummer')
bummer
[222]:
try:
    f()
except TypeError:
    print('bummer, type error')
bummer, type error

Order of except clauses is relevant:

[226]:
try:
    f()
except Exception as e:
    print('bummer, but no further information', type(e))
except TypeError as e:
    print('bummer, maybe name parameter missing', type(e))
bummer, but no further information <class 'TypeError'>
[228]:
try:
    f()
except TypeError as e:
    print('bummer, maybe name parameter missing', type(e))
except Exception as e:
    print('bummer, but no further information', type(e))
bummer, maybe name parameter missing <class 'TypeError'>

2021-12-17

Shift Operators

[1]:
number = 0b10110
number
[1]:
22
[8]:
hex(number)
[8]:
'0x16'
[9]:
1*16**1 + 6*16**0
[9]:
22
[10]:
bin(number)
[10]:
'0b10110'
[11]:
1*2**4 + 0*2**3 + 1*2**2 + 1*2**1 + 0*2**0
[11]:
22
[12]:
number >> 1
[12]:
11
[13]:
bin(number>>1)
[13]:
'0b1011'
[15]:
bin(number)
[15]:
'0b10110'

Hardware Register: set bit #3 to high

[23]:
bit_3 = 0b00001
bin(bit_3)
[23]:
'0b1'
[24]:
bit_3 = 0b00001 << 3
[26]:
bin(bit_3)
[26]:
'0b1000'
[27]:
bin(number)
[27]:
'0b10110'
[28]:
new_number = number | bit_3
bin(new_number)
[28]:
'0b11110'

Bitwise Operators

[29]:
num1 = 0b110101101
num2 = 0b101110100
[31]:
bin(num1 & num2)
[31]:
'0b100100100'
[35]:
bin(num1 | num2)
[35]:
'0b111111101'
[36]:
num = 0b1010
num <<= 1
bin(num)
[36]:
'0b10100'

PCAP Sample Exam

Question 1

[37]:
2 ** 3 ** 2 ** 1
[37]:
512

Operator Precedence

[38]:
2 + 3 * 4
[38]:
14
[39]:
2 + (3 * 4)
[39]:
14
[40]:
(2 + 3) * 4
[40]:
20
[41]:
2 * 3 * 4
[41]:
24
[42]:
2 * (3 * 4)
[42]:
24
[43]:
2 ** 3 ** 2 ** 1
[43]:
512
[45]:
((2 ** 3) ** 2) ** 1
[45]:
64
[46]:
2 ** (3 ** (2 ** 1))
[46]:
512

Question 3

Floor division ``//``
[48]:
 3/2
[48]:
1.5
[49]:
3//2
[49]:
1

Question 4

[50]:
print(1, 2)
1 2
[51]:
print(1, 2, sep=',')
1,2
[52]:
print(1)
1
[53]:
print(1, end='***')
1***
[54]:
print(1, 2)
print(2, 3)
1 2
2 3
[55]:
print(1, 2, sep=',')
print(2, 3, sep=',')
1,2
2,3
[56]:
print(1, 2, sep='\n')
print(2, 3, sep='\n')
1
2
2
3
[59]:
print(1, 2, sep=',', end='***')
print(2, 3, sep=';', end='+++')
1,2***2;3+++
[63]:
n = 0
while n < 4:
    n += 1
    print(n, end=' ')
1 2 3 4
[64]:
print(1, 2, 3, 4, sep='fuzzi', end='********')
1fuzzi2fuzzi3fuzzi4********
[65]:
print(1, 2, 3, 4, sep='fuzzi', end='********', file=open('mei-super-file', 'w'))
[67]:
open('mei-super-file').read()
[67]:
'1fuzzi2fuzzi3fuzzi4********'

Question 5

[68]:
x = 0
y = 2
[69]:
z = len("Python")
z
[69]:
6
[71]:
x = y > z
[72]:
print(x)
False
[74]:
print(type(x))
<class 'bool'>

Question 6

Binary Operators: Exclusive OR

[29]:
num1 = 0b110101101
num2 = 0b101110100
[77]:
bin(num1 ^ num2)
[77]:
'0b11011001'

Question 11

Slicing

[94]:
l = [1, 2, 3, 'a', 'b', 'c', 6, 7, 8]
[95]:
l[2]
[95]:
3
[96]:
l[5]
[96]:
'c'
[97]:
l[2:5]
[97]:
[3, 'a', 'b']
[98]:
l[2:5:2]
[98]:
[3, 'b']
[99]:
s = 'abcdef'
s[2:5]
[99]:
'cde'

Immutable, Slice Assignment

[100]:
l
[100]:
[1, 2, 3, 'a', 'b', 'c', 6, 7, 8]
[102]:
l[3:6] = [4, 5]
[103]:
l
[103]:
[1, 2, 3, 4, 5, 6, 7, 8]
[104]:
s
[104]:
'abcdef'

Strings are immutable, which means that there is no slice assignment. Slicing is possible though!!

[106]:
try:
    s[2:4] = ['x', 'y']
except Exception as e:
    print(type(e), e)
<class 'TypeError'> 'str' object does not support item assignment

Question 12

[110]:
1 > 2     # numerical comparison
[110]:
False
[111]:
'a' > 'b'    # lexical comparison
[111]:
False
[113]:
'1' > '2'    # lexical comparison
[113]:
False
[115]:
'abc' > 'def'
[115]:
False
[117]:
x = '20'
y = '30'
x > y
[117]:
False
[119]:
x = '020'
x > y
[119]:
False
[121]:
x = '200'
y = '30'
x > y
[121]:
False
[122]:
'2' > '3'
[122]:
False
[123]:
int('200') > int('30')
[123]:
True

Question 13

[125]:
name = 'Faschingbauer'
name[12]
[125]:
'r'
[127]:
try:
    name[13]
except Exception as e:
    print(type(e), e)
<class 'IndexError'> string index out of range
[129]:
name[-1]
[129]:
'r'
[130]:
name[-4]
[130]:
'a'
[131]:
name[-4:13]
[131]:
'auer'
[132]:
name[-4:12]
[132]:
'aue'

Question 15

Dictionary iteration

[134]:
dict = { 'a': 1, 'b': 2, 'c': 3 }
[136]:
for elem in dict:
    print(elem)
a
b
c
[138]:
for elem in dict.keys():
    print(elem)
a
b
c
[140]:
for elem in dict.values():
    print(elem)
1
2
3
[142]:
for elem in dict.items():
    print(elem)
('a', 1)
('b', 2)
('c', 3)
[145]:
for k, v in dict.items():      # tuple unpacking
    print(k, v)
a 1
b 2
c 3

Tuple unpacking

[146]:
t = ('a', 1)
[147]:
t2 = t
t2
[147]:
('a', 1)
[148]:
k = t[0]
v = t[1]
print(k, v)
a 1
[149]:
k, v = t     # tuple unpacking
print(k, v)
a 1

Question 17

List comprehension

[150]:
l = [0, 1, 2, 3, 4]
squares = [elem**2 for elem in l]
squares
[150]:
[0, 1, 4, 9, 16]
[152]:
def sq(elems):
    ret = []
    for elem in elems:
        ret.append(elem**2)
    return ret
squares = sq(l)
squares
[152]:
[0, 1, 4, 9, 16]
[153]:
[elem**2 for elem in l]
[153]:
[0, 1, 4, 9, 16]

Dictionary comprehension

[156]:
{elem: elem**2 for elem in l}
[156]:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Set comprehension

[158]:
{elem**2 for elem in l}
[158]:
{0, 1, 4, 9, 16}
[161]:
try:
    lst = [i // i for i in range(0,4)]
    print(lst)
except Exception as e:
    print(type(e), e)
<class 'ZeroDivisionError'> integer division or modulo by zero
[163]:
for i in range(0,4):
    print(i)
0
1
2
3
[165]:
try:
    0/0
except Exception as e:
    print(type(e), e)
<class 'ZeroDivisionError'> division by zero
[167]:
try:
    0//0
except Exception as e:
    print(type(e), e)
<class 'ZeroDivisionError'> integer division or modulo by zero

Question 18

[168]:
lst = [[c for c in range(r)] for r in range(3)]
lst
[168]:
[[], [0], [0, 1]]

Question 20

[170]:
lst1 = "12,34"
lst1.split(',')
[170]:
['12', '34']
[173]:
lst2 = lst1.split(',')

Question 22

[174]:
l = [0, 1, 2, 3, 4]
[176]:
[elem**2 for elem in l]
[176]:
[0, 1, 4, 9, 16]
[178]:
for elem in l:
    print(elem**2)
0
1
4
9
16
[180]:
def f(n):
    return n**2
for elem in l:
    print(f(elem))
0
1
4
9
16
[183]:
f = lambda n: n**2
for elem in l:
    print(f(elem))
0
1
4
9
16
[184]:
for elem in l:
    print((lambda n: n**2)(elem))
0
1
4
9
16

Question 23

[185]:
import math
[186]:
print(math.pi)
3.141592653589793
[187]:
from math import pi
print(pi)
3.141592653589793
[188]:
from math import pi as joerg
print(joerg)
3.141592653589793

System Errors

[3]:
try:
    f = open('/xyz/abc')
except Exception as e:
    print(type(e), e)
    print(e.errno)
<class 'FileNotFoundError'> [Errno 2] No such file or directory: '/xyz/abc'
2
[4]:
from os import strerror
[6]:
strerror(2)
[6]:
'No such file or directory'
[8]:
try:
    open('/etc/passwd', 'w')
except Exception as e:
    print(type(e), e)
<class 'PermissionError'> [Errno 13] Permission denied: '/etc/passwd'
[9]:
strerror(13)
[9]:
'Permission denied'