From ac9ce2f72510b5aee4f6989f3c9c6409fae32ad8 Mon Sep 17 00:00:00 2001 From: Daniel Covington Date: Sat, 7 Nov 2026 19:01:17 -0500 Subject: [PATCH] vim: add user guide PDF and its generator make-guide.py builds vim-user-guide.pdf with reportlab. Co-Authored-By: Claude Opus 5.5 --- vim/make-guide.py | 329 +++++++++++++++++++++++++++++++++++++++++ vim/vim-user-guide.pdf | 226 ++++++++++++++++++++++++++++ 2 files changed, 555 insertions(+) create mode 100644 vim/make-guide.py create mode 100644 vim/vim-user-guide.pdf diff --git a/vim/make-guide.py b/vim/make-guide.py new file mode 100644 index 0000000..9c72c7b --- /dev/null +++ b/vim/make-guide.py @@ -0,0 +1,329 @@ +"""make-guide.py - build vim-user-guide.pdf (needs: pip install reportlab). + + python make-guide.py [out.pdf] [screenshot.png] + +Defaults: vim-user-guide.pdf and shots/run.png next to this script. +The command reference is hand-written: update it when the editor's keys change. +""" +import os, sys +from reportlab.lib.pagesizes import letter +from reportlab.lib import colors +from reportlab.lib.units import inch +from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle +from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, + TableStyle, Image, PageBreak, Preformatted, KeepTogether) + +HERE = os.path.dirname(os.path.abspath(__file__)) +OUT = sys.argv[1] if len(sys.argv) > 1 else os.path.join(HERE, "vim-user-guide.pdf") +SHOT = sys.argv[2] if len(sys.argv) > 2 else os.path.join(HERE, "shots", "run.png") + +ss = getSampleStyleSheet() +BLUE = colors.HexColor("#352879") # C64 dark blue +LIGHT = colors.HexColor("#6c5eb5") # C64 light blue +H1 = ParagraphStyle("H1", parent=ss["Heading1"], textColor=BLUE, spaceBefore=14, spaceAfter=6) +H2 = ParagraphStyle("H2", parent=ss["Heading2"], textColor=BLUE, spaceBefore=10, spaceAfter=4) +B = ParagraphStyle("B", parent=ss["BodyText"], fontSize=10, leading=13.5, spaceAfter=6) +CELL = ParagraphStyle("C", parent=B, fontSize=9, leading=11.5, spaceAfter=0) +CELLB = ParagraphStyle("CB", parent=CELL, fontName="Helvetica-Bold", textColor=colors.white) +CODE = ParagraphStyle("Code", fontName="Courier", fontSize=8.8, leading=11, + backColor=colors.HexColor("#f2f1f8"), borderPadding=6, + leftIndent=6, rightIndent=6, spaceBefore=4, spaceAfter=10) +NOTE = ParagraphStyle("N", parent=B, backColor=colors.HexColor("#fff6dc"), + borderColor=colors.HexColor("#e0b84a"), borderWidth=0.6, + borderPadding=6, leftIndent=6, rightIndent=6, spaceBefore=4, spaceAfter=10) + +def P(t, s=B): return Paragraph(t, s) +def k(t): return f'{t}' +def code(t): return Preformatted(t, CODE) + +def table(rows, widths, head=True): + data = [[P(c, CELLB if (head and i == 0) else CELL) for c in r] for i, r in enumerate(rows)] + t = Table(data, colWidths=widths, repeatRows=1 if head else 0) + st = [("GRID", (0, 0), (-1, -1), 0.4, colors.HexColor("#b8b4d6")), + ("VALIGN", (0, 0), (-1, -1), "TOP"), + ("TOPPADDING", (0, 0), (-1, -1), 3), ("BOTTOMPADDING", (0, 0), (-1, -1), 3)] + if head: + st.append(("BACKGROUND", (0, 0), (-1, 0), BLUE)) + for i in range(1 if head else 0, len(rows)): + if i % 2 == 0: + st.append(("BACKGROUND", (0, i), (-1, i), colors.HexColor("#f4f3fa"))) + t.setStyle(TableStyle(st)) + return t + +def footer(c, d): + c.saveState() + c.setFont("Helvetica", 8) + c.setFillColor(colors.grey) + c.drawString(inch * 0.75, inch * 0.5, "vim for the Commodore 64 - User Guide") + c.drawRightString(letter[0] - inch * 0.75, inch * 0.5, f"Page {d.page}") + c.restoreState() + +W = letter[0] - 1.5 * inch +s = [] + +# ---------------------------------------------------------------- title +s += [Spacer(1, 0.6 * inch), + P("vim for the Commodore 64", ParagraphStyle("T", parent=ss["Title"], fontSize=28, textColor=BLUE, leading=34)), + P("User Guide and Command Reference", ParagraphStyle("ST", parent=ss["Title"], fontSize=15, textColor=LIGHT)), + Spacer(1, 6), + P("A small modal, vi-style text editor written in Power C (K&R C) with machine-language " + "helpers, running on a stock C64 with a 1541/1581-style disk drive on device 8.", + ParagraphStyle("Sub", parent=B, alignment=1, fontSize=10.5, textColor=colors.HexColor("#444444"))), + Spacer(1, 14)] +if os.path.exists(SHOT): + img = Image(SHOT, width=3.84 * inch * 1.05, height=2.72 * inch * 1.05) + s += [img, P("The editor running in VICE: 24 text rows, the reverse-video cursor block " + "and the status row (file name on the left, line number / total on the right).", + ParagraphStyle("cap", parent=B, alignment=1, fontSize=8.5, textColor=colors.grey))] +else: + print("note: no screenshot at", SHOT, "- title page built without it") + +s += [P("Contents", H2)] +for line in ["1. Overview and limits", "2. Building and running", "3. Starting the editor", + "4. The screen", "5. Normal mode commands", "6. Insert mode", + "7. Colon (:) commands", "8. Status messages", "9. Differences from real vi/vim", + "10. Worked examples", "11. Source layout"]: + s.append(P(line, ParagraphStyle("toc", parent=B, spaceAfter=1, leftIndent=12))) +s.append(PageBreak()) + +# ---------------------------------------------------------------- 1 +s += [P("1. Overview and limits", H1), + P("The editor loads a PETSCII sequential (SEQ) file from disk into one memory buffer, " + "shows it on the 40-column screen, lets you move around and edit it with vi-style " + "keys, and writes it back. It is a deliberately small subset of vi: the commands " + "listed in this guide are the complete set."), + table([["Item", "Limit / behaviour"], + ["Text buffer", "19,000 bytes (one malloc block). " + "A file larger than about 18,999 bytes is truncated on load without warning."], + ["Lines", "Up to 599 lines. Opening a new line beyond that is refused."], + ["Line length", "80 characters. Longer lines are split at 80 on load (you are told " + "long lines split at 80); typing past 80 shows line full (80)."], + ["Screen", "24 text rows of 40 columns plus a status row. The view scrolls vertically " + "and horizontally to follow the cursor."], + ["File format", "PETSCII, lines separated by carriage return ($0D). CR LF and bare LF " + "are converted to CR on load; a Ctrl-Z ($1A) byte ends the file. A final CR is " + "always added on save."], + ["Disk", "Device 8, drive 0. Files are read as name,S,R and " + "written as @0:name,S,W (replace)."], + ["File names", "Up to 20 characters, stored in lower case."], + ["Undo / search / counts", "Not supported (see section 9)."]], + [1.4 * inch, W - 1.4 * inch])] + +# ---------------------------------------------------------------- 2 +s += [P("2. Building and running", H1), + P("Everything lives in the vim/ folder of the repository. " + "The build needs VICE 3.10 installed at " + "C:\\Program Files\\GTK3VICE-3.10-win64 and the Power C system " + "disk at reference\\POWERc.d81 (never modified; the build works " + "on a copy called work.d81)."), + P("Build", H2), + code("build.bat build vim on work.d81\n" + "build.bat vim -Full fresh disk, recompile every unit\n" + "build.bat vim -Run -Keys \"vim.c\\njjj\" build, then run and type keys"), + P("The build runs one VICE session that compiles each changed unit " + "(vim, vscreen, vview, vedit, vml) with " + "cc, links them with link -s, and " + "produces the program vim on work.d81. " + "Only units whose source changed since the last build (tracked in " + "work.stamp) are recompiled. Screenshots of each step go to " + "shots\\."), + table([["build.ps1 option", "Meaning"], + [k("-Prog name"), "Program to build: vim (default) or mltest."], + [k("-Full"), "Ignore the stamps: start from a fresh work disk and recompile everything."], + [k("-Run"), "After linking, leave the Power C shell, load the program and run it."], + [k("-Keys text"), "Keystrokes typed into the running program (\\n = RETURN)."], + [k("-Shell text"), "Extra commands for the Power C shell instead of running."], + [k("-Delay ms"), "Wall-clock milliseconds per keystroke (default 900)."], + [k("-Pad / -Tail n"), "Spare RETURNs while a compile / the linker is working (20 / 8)."], + [k("-Settle s"), "Extra seconds to keep running after the last key."]], + [1.4 * inch, W - 1.4 * inch]), + P("Run", H2), + P("Double-click or run run.bat: it autostarts " + "vim from work.d81 in " + "x64sc. On a real C64 (or any emulator) with the disk in device 8:"), + code("LOAD\"VIM\",8,1\nRUN"), + P("Keyboard tip for VICE: with the default keymap the PC Esc key is the C64 " + "RUN/STOP key and Backspace is INST/DEL, so the editor feels close to " + "vim on a PC keyboard. Upper-case letters such as G, A, I and O are typed with Shift.", NOTE)] + +# ---------------------------------------------------------------- 3 +s += [P("3. Starting the editor", H1), + P("The screen clears to white text on blue and the status row asks:"), + code("file: _"), + table([["You type", "What happens"], + ["A name, then RETURN", "The file is loaded from device 8 and you are in normal mode at line 1."], + ["Just RETURN (or RUN/STOP)", "You get an empty buffer named [no name]. Give it a name later with " + + k(":w name") + "."], + ["A name that is not on the disk", "You are asked not found - create it? (y/n). " + + k("y") + " starts an empty buffer that keeps the name (the status row says new file; " + "the file is created on the first " + k(":w") + "). " + k("n") + " or RUN/STOP asks for a name again."]], + [1.9 * inch, W - 1.9 * inch]), + P("While typing at the file: prompt (and on the colon command line) DEL erases the last " + "character and RUN/STOP cancels. Shifted letters are folded to lower case.")] + +# ---------------------------------------------------------------- 4 +s += [P("4. The screen", H1), + P("Rows 0-23 show the text. The character under the cursor is drawn in reverse video. " + "Row 24 is the status row, also in reverse video:"), + code("left part (26 chars) + line/total\n" + "vim.c + 12/240"), + table([["Part", "Shows"], + ["Left", "A one-shot message if there is one (section 8); otherwise " + "-- insert -- in insert mode; otherwise the file name, or " + "[no name]."], + ["Column 28", "+ when the buffer has unsaved changes."], + ["Right", "Current line number / total lines."]], + [1.2 * inch, W - 1.2 * inch]), + P("The editor switches the VIC-II to the upper/lower-case character set, so unshifted " + "letters show as lower case and shifted letters as capitals.")] + +# ---------------------------------------------------------------- 5 +s += [P("5. Normal mode commands", H1), + P("Normal mode is where the editor starts and where RUN/STOP returns you. Commands are " + "single keys (or the two-key " + k("dd") + " and " + k("gg") + "); they take no count prefix.")] +s += [KeepTogether([P("Moving", H2), table([["Key", "Action"], + [k("h") + " or CRSR left", "Left one character."], + [k("l") + " or CRSR right", "Right one character (stops at end of line)."], + [k("j") + " or CRSR down", "Down one line."], + [k("k") + " or CRSR up", "Up one line."], + [k("0"), "Start of the line."], + [k("$") + " (Shift+4)", "End of the line."], + [k("gg"), "First line of the file."], + [k("G") + " (Shift+g)", "Last line of the file."]], + [1.6 * inch, W - 1.6 * inch])]), + P("When moving up or down onto a shorter line the cursor is pulled back to that line's end. " + "The screen scrolls so the cursor is always visible, including sideways for lines " + "longer than 40 columns.")] +s += [P("Entering insert mode", H2), + table([["Key", "Inserts"], + [k("i"), "Before the cursor."], + [k("a"), "After the cursor."], + [k("I") + " (Shift+i)", "At the start of the line."], + [k("A") + " (Shift+a)", "At the end of the line."], + [k("o"), "On a new, empty line opened below the current one."], + [k("O") + " (Shift+o)", "On a new, empty line opened above the current one."]], + [1.6 * inch, W - 1.6 * inch])] +s += [P("Changing text", H2), + table([["Key", "Action"], + [k("x"), "Delete the character under the cursor."], + [k("dd"), "Delete the current line and keep a copy of it (up to 80 characters) in the yank buffer. " + "Pressing " + k("d") + " followed by any other key cancels."], + [k("p"), "Put the last line deleted with " + k("dd") + " on a new line below the cursor. " + "The copy stays, so " + k("p") + " can be repeated; " + k("dd") + " then " + k("p") + " moves a line down."], + [k(":"), "Open the colon command line (section 7)."]], + [1.6 * inch, W - 1.6 * inch]), + P("Any other key in normal mode is ignored.")] + +# ---------------------------------------------------------------- 6 +s += [P("6. Insert mode", H1), + P("The status row shows -- insert --. Every printable key is " + "inserted at the cursor, including shifted letters and the C64 graphics characters."), + table([["Key", "Action"], + ["RUN/STOP (Esc in VICE)", "Back to normal mode; the cursor steps one left, as in vi."], + ["RETURN", "Split the line at the cursor; the rest moves to a new line below."], + ["INST/DEL (Backspace in VICE)", "Delete the character before the cursor. At the start of a line, " + "join it onto the previous line (refused with joined line would pass 80 if the " + "result would be too long)."], + ["Cursor keys", "Move without leaving insert mode."]], + [1.9 * inch, W - 1.9 * inch]), + P("A line cannot grow past 80 characters: further typing is refused with line full (80).")] + +# ---------------------------------------------------------------- 7 +s += [P("7. Colon (:) commands", H1), + P("Press " + k(":") + " in normal mode, type the command on the status row and press RETURN. " + "DEL edits; RUN/STOP or an empty line cancels."), + table([["Command", "Action"], + [k(":w"), "Write the buffer to its file name, replacing the old copy."], + [k(":w name"), "Write to name; from now on the buffer is called name."], + [k(":wq") + " / " + k(":wq name"), "Write, then quit."], + [k(":x"), "Write (always, even if nothing changed), then quit."], + [k(":q"), "Quit. Refused with unsaved - :q! quits if there are unsaved changes."], + [k(":q!"), "Quit and throw away unsaved changes."]], + [1.6 * inch, W - 1.6 * inch]), + P("Quitting restarts the C64. Power C uses zero-page locations BASIC depends on, so " + "instead of returning to a damaged BASIC the editor jumps to the KERNAL reset routine " + "($FCE2). You see the normal power-on banner and READY. Anything in memory is gone; only " + "what you wrote to disk survives.", NOTE), + P("Commands are matched on their letters only, so " + k(":Q") + " works like " + k(":q") + + ". Anything else gives unknown command.")] + +# ---------------------------------------------------------------- 8 +s += [P("8. Status messages", H1), + P("Messages appear on the left of the status row and disappear at the next key."), + table([["Message", "Meaning"], + ["new file", "The name you gave is not on the disk yet; " + k(":w") + " will create it."], + ["long lines split at 80", "The file had lines over 80 characters; they were broken into several lines."], + ["written", "The save succeeded."], + ["cannot write", "The file could not be opened for writing (no disk, drive not present, ...)."], + ["no file name", k(":w") + " on a buffer with no name: use " + k(":w name") + "."], + ["unsaved - :q! quits", k(":q") + " with unsaved changes."], + ["unknown command", "The colon command was not one of w, wq, x, q, q!."], + ["line full (80)", "Insert refused: the line is already 80 characters long."], + ["joined line would pass 80", "Backspace at the start of a line refused: the joined line would be too long."], + ["out of memory", "The 19,000-byte buffer could not be allocated (shown at start-up)."]], + [1.9 * inch, W - 1.9 * inch])] + +# ---------------------------------------------------------------- 9 +s += [P("9. Differences from real vi/vim", H1), + table([["Area", "This editor"], + ["Escape", "RUN/STOP (the C64 has no Esc key; VICE maps PC Esc to it)."], + ["Counts", "No numeric prefixes: " + k("3j") + " or " + k("5dd") + " do not work (digits other than " + + k("0") + " are ignored)."], + ["Undo / redo", "None - save often."], + ["Yank / registers", "One unnamed register filled only by " + k("dd") + "; no " + k("yy") + ", " + "no named registers, no " + k("P") + "."], + ["Motions", "No word motions (w, b, e), no search (/, ?, n), no " + k(":number") + "."], + ["Other", "No visual mode, no " + k(".") + " repeat, no " + k("r") + ", " + k("c") + ", " + k("J") + + ", no " + k(":e") + " (quit and run again to open another file)."]], + [1.4 * inch, W - 1.4 * inch])] + +# ---------------------------------------------------------------- 10 +s += [P("10. Worked examples", H1), + P("Create a new file", H2), + code("RUN start the editor\n" + "notes RETURN file: notes\n" + "y not found - create it? (y/n)\n" + "i Hello, C64! RETURN type some text\n" + " second line\n" + "RUN/STOP back to normal mode\n" + ":wq RETURN write and quit (the C64 restarts)"), + P("Fix a typo and move a line", H2), + code("j j j down to the line\n" + "l l l l x move right, delete one character\n" + "dd cut the line\n" + "p put it back one line lower\n" + ":w RETURN save; status row says \"written\""), + P("Save under a new name and abandon edits", H2), + code(":w backup RETURN write a copy as \"backup\"\n" + "x x x more edits ...\n" + ":q RETURN \"unsaved - :q! quits\"\n" + ":q! RETURN quit without saving"), + P("Automated test run in VICE", H2), + code("build.bat vim -Run -Keys \"vim.c\\njjj\""), + P("Builds, starts the editor, opens vim.c from the work disk and " + "moves down three lines; the final screen is saved to shots\\run.png.")] + +# ---------------------------------------------------------------- 11 +s += [P("11. Source layout", H1), + table([["File", "Contents"], + ["vim.c", "main(), the key dispatcher for both modes, the file prompt, loading and the colon commands."], + ["vedit.c", "Buffer editing: insert, delete, newline, backspace/join, " + k("dd") + "/" + k("p") + ", cursor keys, saving."], + ["vview.c", "Scrolling, partial/full repaint and the status row."], + ["vscreen.c", "Screen set-up and tear-down, low-level drawing, keyboard read from the KERNAL buffer ($C6/$0277)."], + ["vml.s / vmlwrap.c", "6510 helpers copied to $C000: full-screen paint, row paint, block move, line-index adjust, key pop. " + "build-ml.ps1 assembles them into the generated vml.c."], + ["*.pet", "PETSCII copies of the sources made by the build; the .c files are authoritative."], + ["build.bat / build.ps1", "One-session build on work.d81."], + ["run.bat", "Start the built editor in VICE."], + ["NOTES.md", "Hard-won notes on Power C, sys(), the keyboard and VICE automation."]], + [1.5 * inch, W - 1.5 * inch]), + Spacer(1, 6), + P("Memory use: Power C program and heap below $C000 (the text buffer is a 19,000-byte heap " + "block), machine code at $C000, its parameter block at $C400, zero-page save area at $C410, " + "and the C stack just below $D000. Screen at $0400, colour RAM at $D800.")] + +doc = SimpleDocTemplate(OUT, pagesize=letter, leftMargin=0.75 * inch, rightMargin=0.75 * inch, + topMargin=0.75 * inch, bottomMargin=0.8 * inch, + title="vim for the Commodore 64 - User Guide", author="Daniel Covington") +doc.build(s, onFirstPage=footer, onLaterPages=footer) +print("ok", OUT) diff --git a/vim/vim-user-guide.pdf b/vim/vim-user-guide.pdf new file mode 100644 index 0000000..b1b21ee --- /dev/null +++ b/vim/vim-user-guide.pdf @@ -0,0 +1,226 @@ +%PDF-1.4 +%“Œ‹ž ReportLab Generated PDF document (opensource) +1 0 obj +<< +/F1 2 0 R /F2 3 0 R /F3 6 0 R /F4 8 0 R /F5 9 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 272 /Length 2981 /SMask 5 0 R + /Subtype /Image /Type /XObject /Width 384 +>> +stream +Gb"0T;/Rjd&k11dOJbqHT1mR^qERAbaLidjOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=0UUT]1I\*%k^il8e&C[[=kbNr2)#sH`%pP'Ac?&K(p-,NKI]h"BptOO",OKN5bnoX(7=G+"[Iqs-*V_bm\W7!P8:,i^>n4/hfGEgY:WbgtC_=2q$P)BpXH7C]?LX^h<&,j-RZUdG>sZk>U`\8_C\'YnL_f2E'I%h#1B"+6WFh^q4:KO0n``J[+qJ8?374(i/T$[*(aaqMu>?"MrQppIErsBW(lKn#EuE3o0H,nuJ5hmN4VnH[hi^:U+"Wa1kqbh#HJcYJ,8Fro!sepIEs!+HPr_8)L&BhaDn-/,KP]C@@4jb<]b/Iu`:]Y0B+As1gqfrK27e`TEYX`?'9rc-Opah>W5.gcp1TpARU`%hKRnmuOj#%q3-:J@En^+)-Z3P:WG`^A$R6>MgdZ[G'hFXqrdUR,L]lPIW=>s[j9:l,EL`-SbMNsgYO#dH^!,%g@=(\k+!7&a1Jh!F1^QTMDB^>4(hq]ftLR&B&\_`@_.hOO3"W/oi^OmfmYr#@gpSC`$nn@\/eOg[3.VuOI@5'$qST1=B'o!S'Mmn94\]g's=`jIb4gNhYHoA]I>H![WAs6f9XmaHHPpPmJQhB-I0Sb<9_$_I,a?K=N"lb#H(hY-q>X8d?nZ1e/f>9#4tf+3;u_>c?nDj+H'RHNZBB^_"ho-lTT+"j/&GMc26hUUcU(DgD+b7e5]T6=Q?WqQE_]/n7)o7-[!h0^4p?Di!c^\;ue%_SRh]Cs_!b9,3i+)0n:$sjaZUH&$0g3b=i^Rlb.[=2p6G[CBLpARV[HMmS'HTgd+E:_e=p;tjpIAD8J@?;@+M"QL\X]"aC[[=kq>c)OpARSjO7,<@:t4>DC$/FMr=Hm0%.Jl&q]kKDo`"qTnKSELXM$jH^@qT?b$Zk'^T"n2d_<#:hdZUN;1!egSPQNcr9*e>07SJfCM<0t[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/f4%Z'rq8I^A2W+JY@sb0Jr^aX@jCK\i4h()J\Qnh+2D=smB^_"he!o]Lkp`a,kF7gQnr'6U5LM.hH0$2BH$A/l]\W-=fg!oS[/'Obe[9b]ons@PZ.f("m;e:)TjOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jg?q26:(4B~>endstream +endobj +5 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [ 0 1 ] /Filter [ /ASCII85Decode /FlateDecode ] /Height 272 /Length 61 + /Subtype /Image /Type /XObject /Width 384 +>> +stream +Gb"0;!=]#/!5bE.WG`:P'EA+5zzzzzzzzzzzzzzzzzzzzzzzz!5PK5a2rhS~>endstream +endobj +6 0 obj +<< +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +7 0 obj +<< +/Contents 19 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.710ea22e64b3ac41733440b8ebc0daeb 4 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +8 0 obj +<< +/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font +>> +endobj +9 0 obj +<< +/BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font +>> +endobj +10 0 obj +<< +/Contents 20 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +11 0 obj +<< +/Contents 21 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +12 0 obj +<< +/Contents 22 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +13 0 obj +<< +/Contents 23 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +14 0 obj +<< +/Contents 24 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +15 0 obj +<< +/Contents 25 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +16 0 obj +<< +/PageMode /UseNone /Pages 18 0 R /Type /Catalog +>> +endobj +17 0 obj +<< +/Author (Daniel Covington) /CreationDate (D:20261107083851-05'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261107083851-05'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (vim for the Commodore 64 - User Guide) /Trapped /False +>> +endobj +18 0 obj +<< +/Count 7 /Kids [ 7 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R ] /Type /Pages +>> +endobj +19 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1114 +>> +stream +GatU2gQEI6&:N^lqC0C\(8:V=r"`d\b*A4OfYl(Q^'le!Pb!`7&RbWe>/LclJk\-,'SmZ5cKTD]>;2`FB&.Z;!PFr?oSrt40OFmF7)JkGGWd-s)>,d4:8C;Pc\\AIeI52C^PWt4J%CdcE(:)lXfGj_GR/'mZ_jakU@B#+KF.S,=qAAc>[_PYrX[5&NoqK++umuu$n&a3q@0EIArU\PPBl,*3I6J0Zs/<1^?e#$+DdN`M2D^%&P9Pu(,8c6fd.I]*GrYN^65hMY@.89ZrL.mJ9#8`/Ss7=%Gsbc_0ui$$PuY0STc70)I*a?RN4jZKDY1W?!QE^p;;6Eh;?#nKf)h4^36oTPZb]R`;Ecmo!A#V/bi%G]6XWT4_V^2+c7;9bb,D>rW"aueaBLIKpQVu:k5-=iS"Mb]\?UP"q%tb\HP?\7&InuqLZd\ZZD7s`bdI!PpT3!>4[sk6"RNY;h`oDq\gMMmi#R3h(2+6W6I<2=tW4/99oi,-!_A"aD$di"h\Tq.0qOI;4^kFpb@-%Vfr3dhUoY\7T.-N%Hgh7]l/P[khF-:Ze$j\bIt*nfqBFkOM'DD20Q:EoPG`.p_NTUb%O+8ijbcn=kL*$&%]JskWtb>Sbd?7[**Cr,oR7+RO)"YIUY!a$Og#E#(*g_L\mQ2]o5@!J"W<9B6TnmV5rC$i#S`Ms2O(%?>a"N7#rR!n+T79Ts"_u&GQel+!P)PjOlsaQhfnRJ`j*He&XOj6VT*BrFFY0IPdr!BK]$uP@R8k3?XS50[EH=ctcelp66*4`oA@HB&B%O3'i/D^H]&JD?~>endstream +endobj +20 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2989 +>> +stream +GatU5D0+E%')q<+dC"*u7CGIIKE*I#X1GBBVgRgdF_l)t]$_B<%7WWsZniq/malCOkQMN"@)XQ"\M_i!h:"#Q2\qeUcdMiK.tD!(E.)AMA]&U"Q=Dm.I=U):eXoq))jalU`jhf`,Lc5'(,S7p$Z3+?mNVsk\75]UFhE;d(SDNPDYRtc,;'gl*>lRnaTR":j+tC$l$&No9`4XQ$uKM@\.tp^i.Z`q\+C%LZ*RHT9.n;W*'iB(n"`uKapa]E2Q78JYiZ*Y#J;\HN$LD=/P#R&INA($gk6l\+i>/30?8@:n69=C+6rI,u#`O(S,&2"F%a45;,LaDSMM*S=V$ZZt-$-7K@)4kDG94,a.osmD2#@o1/`_s&Iog(@=Gp/Nie$*ReL?E)\&7rM#&*Rtm@orEo\d,%@g9sI)1=63+$#W!_o:N2pY?^=OCsPDVp0;\&g!pjRll'g"KJ'+1f\U0Y0Ikp-!]_>pf_<0EJ$\I>XrS@O,@?tTfNG@&[-,A-Hrn4-[q,nf(ImXF80OAj>bTSocgscS(bSGABc'YH@D#MSW<8-SQZd0HOiHY/ld:?N_uT(3abMieY@ko(L)kPhblAF4#^&j4$7=noOWKm&;U!ES6nd56bXZ=fSUgp5kE899RL[C*l+0kr9UY.'>+F'omc6/V(9g4MJl"1Ql9=^%Y$NW^e"Otu$k:]#(RB9)Y!r.j-VL%!Q&cAIG=mrca^B%._rprA+$a[!Z>::IW(#_I0[F0(^)e4U*NP#GMI.T#nj$Oi\kXjI.b;4]$G&1sh?`*hHed^\3Zr]a2D-D:CaE=q*X7b&e:(Qs\74&+LjB"HG&JW!O$cIckol!g\+Sb+G1@Tagqm[7o8%"sECU^\4m>f3758_(b'TfdnIaY[[Ror_p.n<+&G*oYdn^S+"O[hjPM_SmY\6KFBN<`IL=f]:4uIF1%bfs.XVfqtUqG0uE8YAn"#7@LWFml5ZqYijAd^RRS:EMe%AE(N;>2u"KmrI/1SX)c7TV*+Ioc"@Hb;]:.IY7.'UuPBJ7>+rEnYr7/_iffd'b-jZ6,SJ8k)=(aqQZb>QnAp:Pr&lrXK-ImSgnTk*-[$q=i6.>l9fCjI`^UqdWc"L(dT3OT=.423&XRnS#Z@eHHoetYff#8R#&6(HYK^g-pkMm7KkE]BYqVX>;0i38Ib'q.$ZSd!q@2HXSq&RRp-^J\1p`)'hIss"=-\j2t)1p;=GA6e6Rf((t/.C:OaAtQN;(DCuTR'*1\J(G`]b:%e:R#>O3ucQMH1jKT&U/'GI&;prBkuVpL6)l\MOt9,SWS)s&K>a"7(+:s]Rr2d@m[=S9^CY0=lb>-/m9sf/+<@WC&><+`E\D"'l:UQ%a4mfr_HpkS[(kE"T&Td0XN.ap$A(ZJX#@,.uP*2-,D.:`9ipAsam:]1HQ92;[=a.o?I\/0pM&b-gUaXEOZAn'I`Wj8&pR!;T=$OKBFkPPJ@7$0Nd8;98Ks@kie/[8N*GEDnp5D/p"dQNB"9?^iep0ZtVba"DTmom>3Qa-(S0;9b=R@r&CX_#o]=J0sb&d0@96iH2s#=*!UhbgbVsbq9Da+AE$^N(:@cXq(.S=@_EQ`P.A!gLZ-9fj[!s=u$S^G(/s2HH0p.Fg#Ps5Be;=TX+7aVCnYLVDYm,cI::RgnE06k(!IXV(+]jW"*c3hm>"d`?O@M)+9>+4.+lbs8LHQ<%bfiB%8>-^Fm>=IgI.FGoa/fGP)aRe4KI:6HGuF\WifW9:I,MI"*:\2)fWea=F,O(c[O(efQAJTKduZ';$BD+=#mE)2'nPc]NEaJ*p=Z7u&NrE/@_7aCJsC_L0eB-pFq]pU='ZHlkH%leTPWu0;YL<-M)l9H`/)Hl'Rs4D^r!,pD0A:L3Ag5KWnec(fqE4=rYFN<1/\a6-VkPC0@e'/o`h&Xesk<>l4:NjB@44^0TcGPN#glo1EoT!j2;R=iNR+9"&hiW72[K~>endstream +endobj +21 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2459 +>> +stream +Gatmrk4F5t%:=ZN#]&>^TFMG.B%599t[KS"<=Ma2I>/;c7+C>Da8QVrL9JZ^0"_7hbRaF;m"aY_'/C.n;K0#2:Gr=p,OpN:Rs%1@B5D&Ul/cS@dBCr^VdgN"mX]0[MhZ9%fsE7\jn*pmq=:aCBdF=(uiURYl@Pi7cW_piM.U%$RRVQPBS3K2gm`H*TM5o^&$5WH%n!B&3aK2m%8@@Qu7o;]@00tN)f#@?Jjb^#MthCq@-3s9.u]'=FnUtJWR4epUjlEB<]A'(Cu;1gM.E6&0CigQA.)jH`&pi%Vb>Z1q4\(46r"7;\YL*0nIc!,]^%k.D3NoVnNIUWRMF.i&`3,K)?f&NsiS32'I^nsON+P3`?U#XqO/"N'?caFO#__8^)03e'NVUM5GkcN7JZusfRdX@]mXXF[%,"'"9@2&r-Tb]"%$"M`Rq0SUZOaF3:g#nn>-ll.b%=m<-a3"MBVt:s=.rkHGZT'jn#=qjZoEm4^6)+"&`Zu*`H[s]4c_gb.j8ca2EP]Tft.W0W:_5G-$oibndJ7G3R+L`\emp&6bYc)[Mm,VEE=pH9D2?*XU`Wm\`LJZU.#"Ln7&?\;(#(M-hen(3<9F:*Jnl@-^pD%(D2Cfp`AoY<)M-q[m1fhS\_YCWs%WqEiZ/3SYS\R+[f,)!4GO*\TLe-`#D-FoEJj-C[;Z!q,^^o@Lb8urgePUJHp4ft1FFC7&iV4[`@2CkaEtI*q"fZQ(k!:Qh^os)#'B?^:GJd>Li$6bN`+m:\k`^T+>?FhQY1*aJjMBJSa(cjABY/ji,VWCfdj^,Q.kGmI'T.Dr`2Q:6$8=5ja&],co4[9Zt[/1lrqA&'@I?m0^n5aQC:8`f4q\/bjaSISK<]WMXmesA_)j^)eup%u>\\7M@#5SR$jUJ@DHHn2f38AmuO:1j_p.pVD-.X)TXE6k6e=l#i=a2HGl+9U)[S:q'SRdoS\um=sjJ/'2o/<#P_D?T_'?3pX/]A=P34:+i^Br-VP:=V+Y6>Mn,Pe0e;`9@IXOA6bE=XN/+f2\-5_+sq;:<*R>5j=I7g?Kj;8C5E$"M)<-,cjO8Q.,.$_t5+p;fY]F'$63.(M8&Y:sI/$$c4/cf7kL"!)3O$C8noTnuDt/*htpe%NL^Ib]j)YP?0;I3NOrh+bqK!ismB`V=jEnI1V;`H(+?7=Z!.%/V)kGC7N*ebgMQQ5c3;6eMi2Z8(mm,9$lpcG_HcPgp;)@H6GN<3M0`?44E[Dno74r=oOi+k7^a$Gf?P(.'6W"eBM2k87INdPf$*a8bYNuN+*o.PmUkBkG/CS#h,(5FSR_goPtU:dB2*^0ntGtaO9Ug>F;.\IRbTeARt796e04Tj'oB=bTE*N6cqqa'CM>H/li94D]&):rF&Q;F^b[:Hatojs:lhO88#oQmJF&8=8#I5FLu&/J?L3ijq&ta-,okDCE$K1c`JF(V4%VZ/:QfPDUO=X's(eX?oI='fEoUm&'\0'6l18r-'gN0r=b!Y5_)fS]BGR;\:Ll+4&1pQ]V)_k*$-h$>ppk4endstream +endobj +22 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2076 +>> +stream +Gb!Sm968iG&AJ$Cm%H5#>FXdPd@;1XcF?R^a-PJ<0/Nu,N%'o9+=m<_?%?is'IbA$3usA.%L=WZgBDc8>q$oVT-?J4'u8QA>[/ePW%a]nU.[PkhSXGYo(P`T`o\ooaiqdO6WP1*JbFh5ge2XY&Qd.YK>jF.ujg!BNTBb)h5go[#Wf4G:8Fm']\]4B<[:c$o495\Np*Meo+`=!7K+PcFQ;1`R"XW*Libf;2]*E3#.=<2,A`A??^!C:i"]=)o%p5hBu&fi*Ug;u=MkG)EX+GUcbQ`16a=\JP9LOpG*?;IVcMU".K+3K(]W\r9RZ`.XVjO1f[.EDAbB=be0jiQ:ba!U$bbS"59U.F3&Jb]#K5;M*ou.h4oR1bMPDUaaIr2t!!K90e--OISTJH/[K?.T,9`iZ2[q>Wd]oNY[;sFZ0BoVAG$R$[U@4R58oh;b`=b;gg35g>:nV9DY8p'Z2Qhe9H@aTO*i*D"dn(HhFoUal[?^'"+eO%$`G7[V%:Z8i#m9%Z$L.g_&WhBHC@.8FGH,#PdsHWKjFbAm'7=P5m^mSj$ML1!2qZ#t)c:<$>(eR34nI0N_e\:]?HRe7*q`YFZ*"Xb.GI-GNH+L=npTe/Gs5!8"47^5F*^(3kUbTi7'Ob.qlDO*F@g3r5/Z9nf1C;Z-pYl&g6h5>DV%o0j91('-3pE7o-g8%l7Lb!Es9[J=s-i!J[CFi%pgHe\X9%]#tZi9H#^.OaXU[8A[.Q;Wl12R>L:DhjR#:Ner?9[Bg&)P<.`kh:s/63*ia:/'>GEr3C&u_3LOA3'5r+*g#D_8-&PAnM(NsijH4Cg/HVA%b/f"%/p2BY0XL9jZehjk4ZBo]^G:c"Z@1`;f#8i]c,!kk4!YB2?L)BloimE=bJm8s5SD'#apgcMJG1aL"V))nD]_;#a-$Sq)lG/@kJWVCAjHBIn#,E^JqE1i'u2;tsAIVjB8F]$qA\=_U`R=A2POnC?%+B8JHoO:/#oJA@cn=>Y5O7;V>#U2Fl6a]iUUB%:D0I3h>Q`'q^X4.NNmJip$DtDOjm@q=o2_ca+$-dq`+`hf2/jGrs&q#*oG_LN+Hart"kHAkiq'9Cab5/brXYR7SDciV(6r1:[XhQJkF;7q]@PDt,HEUp=PKEn0RV&;M7,SkW7^G:2PCESKkgM6~>endstream +endobj +23 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2632 +>> +stream +Gb!Sm>B?9+&q9SYkZ")X3@/0#JA?VS*9U;pA9/Affr\2LQSBC]`/'PdLhM;:Fq7Xt">];Fg=gT#QA1gA9jbVP1f3^4PCMCG^kWe4IaUL1@C?<`:^i_>J\0Ugb?=h_V?`,jjm.f'C6#,Vo7-O'#IL#4BtsjIXC8L/f!#i3`%)>,@_ENb&TY)a\:>Y5&)m9$>OZ^$rIijNU0f9'd1sj/$VK=/'*kkPofEL`@q]"'C4pA[Y"ihD!fCSn[Y=a@WF8C*"5Jg99bl>s;oJkRAbl=!EUo*LWB1=LjOib9d>JZYBCh'3)/!,G"00e"H>1)[1(+Kq:J&ZI)`19cJrYmh_95V830K(e$X[<6#N+pJ>?=o_FN#:rqSnLX&KIWbJZ]cQl^Ck=2'X?I2$e^2qCoPZGkVC(UCYRsN],,Ci0Bg%s7gtg2a?b.X('r&ZX?f(/d-jT8+,u994)aA/7`XW*qm[AjDo8q#pU$3E"gEu;9Zlo`"Ep^?GOVN;g8=f\.lkJmb!2?l\QmMcV#;@UQ@-mLbBnDiYBQ-b>4UOd7P,.8jM!Q+R?Y!],@Qa@J2XAn+\P(#/DObWkcu@kq_hF>EA?W>%oO`e6\Q6)tqrrr-g/j8Q(\PW8KUMkb'ts7,dQ@J8kC&7LuO=9*`^M0J(3]%i@,RiI>1)>/ZWW9JV$NU*R%G$A8=3F`QWo:OT@9sk5VaP6(@N[IG);tRoUHRl>L;h7TaAqTYSg*?11Pagq9T:qUhF4UoY`D>XksiHk$0]UYCQOj"m$"$#L>XdTj'1F]Ga3Br0rg9?FG/eUi#bbmkkY.k7!q^#W:\nS;6]@Z@Xb((m.m##hMEHlk.Y5ERSqQtC-r3`*\0.WL`f1a0nNQ,p6GgiJ>j.iF(dba?Te^e<\+SWLi4jp8_JKKkT:],bh7Sob`Kk:(s'QB.R44H[RN<9r&Cr/r.dGhcXa_G+R_\t\@_ceo7b-D0g`o+-N#eErV#LL:<,O1rXoN*4=eZ:$JgfZ(DXe(4^odh.Zf_Khq`\X$esTIQ_cIUY%t`eiJrfHP6gq@.cBb$g7EQuPI"9GU+5C-O_ImWBTD@I6Qfd_)=V+hZGToimqOf*Y`ekiPi;Q_nd);=)M*C=05*IHNk"pA%o^k.h@%.U<@=`HH^6GsfQC\;O,i?eN5tf"C`AD]#CfN=J3N6"uL9qNSJ6q@;].'0YCKkgtkaPN=^>i=O?->:/g@D]9F#'Ia!j3j14l9l'))L-*_L%0's;^=XO6[/LR;$)S<&71/<"!L@Ki$$C"C7UGRTJ(FAK@N:FMEqkCeH80r-I4pb`9Rqss.a`Z,3i]5@,qnc!,;Qd=?sRf"2A]n'OmUH2(!deb_tiqL3D@.Ym$6hVGmDRlbqiL6?(ag4/5?*Vm5-N)`lkGhg:"(iq@Z1LE&QW:tZRXXN\c<74GVaeh4t^LBOhe0ZHd8J@9@Y.Y.`hJ$h1N@\hFAo3c@en67s;:70KNlUendstream +endobj +24 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2291 +>> +stream +GatmJ.^L@mJF6<5fK':hq\k%dhG8Q)JD0*(SDY'!Rkt+3B_XK.=Q9T%hlo3eeM-6-C+l'cX\I1[">o(^_eLe(d.[=/6Du!sjf?f<(B3CU2S`VFG)H^e6tjflPn"JL6PBjb@.5nEABVDUlYPi>ojUs;j-S&g,?mR]tlk=iQJBcC`AqR:Ga"QAUXt3_SFD?+A:]aU+NU:ijURVj63-qL_DTQDEja99NsH[9ILK?rZ&_Er'`2o5%"@;jhHnFki'Zo@7TiR]9g2$.eoNIDR)n-q84Mpb;R!$:U^X/"2.$\jTI!9i^*nlr.#,kR.^WJF:a.+kA>oM`#$73I,+)pm"`"&CIloN%UfYA`Q1-]>6t]P)uIgokm;eG,DMJQDE-jUY^O8g/:4Eao91?)<0*EOW=XTI\^5.(8n_3TtZ*gZc_D5=:#p=`2m%TY8,lVh<2;Y)/74S`sjf\*#DHccX6l@"Rk%PQ;p1$;(TV\fpTk]g!P`eGCAo.*X^sClJfA%]:LG&H86g%u.@Z';Oni"N-eGR[@40D">^mY`t(S1<4SSai*TuE+;m0/i(H/^;rQD#ubI+/s@$l""oKjJ-4A:^9o`Ei!!G17n4UD8RA2P.#LoLV^#F)1lI$>7+F;IH6[KsT/K6tm&--E^%Tni_[&OTI^Io!9`5bg;q%-VZ]q0Vn\A70;i*"9bC@+f*9TP7TDRc=+*bquU`f)Ic>HMYfiKX))S[fjC_f/r4EL_6Y%p+mZ"?Ws33Ej%I_ATG_G9LfO&_%t7:fXK1f&2l61/"Q&[h\">mYM?cXfRm\*$m4hU2bhr*0+r4IjhRU?o/&T=I-Iq$/&^>mM0K2Mq,^#"[\\PNkNNN^3:iV?HBq.UT_?NUX\>FbGhNpXJK>,p?$b=,-:?@eJ0XIfC2dqpV'"]N4W^UUHNsX32Xn("\`XU4nR7P4!JMB>/B1F*0]HMLPW:(>FBO,'a(8\8/%fXCXh3JqL(S"UJ8&c\7h2DgZGcn<(*ZSWF"G%q-5@^BMZ,(Ta&"ZS1m:R&&'U)@9pDia6:S'dnLO4C=i/SAkQ+NaA\[ILl1KMVHhQ_#JG"5o^2jr'TQQPfLp;^3,T&,=+:s_uL0Rp$8<&nGo[Ac5nW?oD6TTD\er79\MB9TJHA2Dil9e-`-JF>JL%SS6T4n:36IsQnkfYt2M7D1^?JV'a?J]"(%Ea2+DsErV7p,P\Z"Rm?Nao\mCsuT2]endstream +endobj +25 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1179 +>> +stream +Gat=*968iG&AII3llcVQ,JaB;9M_d"Vp6QI'<+.j!g/R5Rj;);P+qsP0#35g`o0TJILt5R\%CNMZ!ougLY;]!!V",:Y&>13#?DdO*qIhWHcR"!"":BCaE-U-+7;W?%Wnm!<]&#'&r?Kh2Ca3n(r!"F@63Ns&jR*Xo06K6QSp79jR_W$B_Z-t^eoN+32+(J-:D*sS"SQaU8T(B+T!*)cm$X1B.?4%0O+t;-Q%`B-8)8R\fhIa;Xj62^R`k74\(UDPbeEWsi!CU8GJC?hl_.Ef9I?>0Hf7;17bq"s9C^;,BS^nLZfA%C#C5j>EN!]UIcnaM!s,Sse6HLH"#.Vm1-d!-:%A/iRrUqITgp'l!rX%s82'CLss[sMQFA.R;L5TB7EBN([)ZlqLZ&NKMn3hRm;LZ!>,Q>5EdoB:=`P#%_Zg.l59Tm^oVfUm]6IOd5F^h;W%RN>KS2lc\R*8W%W&E>Lq@am4%t^g<:(RfP2$?64(?/S:Z9l='PYG%M-$Rq"%t(3l8$.a@2"!pi[8q4C)!lQbb\Gh9>DW`hU;]Wch@$=:PPjLAR`p48!uR0>1VCRk=I"s#J3a+2,beBZZ9/Qs7&LXC"RUCj:n"/Ofl0ZkIC(s%0a`JCZRq.e[D7XCnHObe^ON]/pCURendstream +endobj +xref +0 26 +0000000000 65535 f +0000000061 00000 n +0000000132 00000 n +0000000239 00000 n +0000000351 00000 n +0000003536 00000 n +0000003803 00000 n +0000003918 00000 n +0000004176 00000 n +0000004281 00000 n +0000004391 00000 n +0000004587 00000 n +0000004783 00000 n +0000004979 00000 n +0000005175 00000 n +0000005371 00000 n +0000005567 00000 n +0000005637 00000 n +0000005945 00000 n +0000006047 00000 n +0000007253 00000 n +0000010334 00000 n +0000012885 00000 n +0000015053 00000 n +0000017777 00000 n +0000020160 00000 n +trailer +<< +/ID +[<93ff8ecba1600bc59dfd0d3f9189f269><93ff8ecba1600bc59dfd0d3f9189f269>] +% ReportLab generated PDF document -- digest (opensource) + +/Info 17 0 R +/Root 16 0 R +/Size 26 +>> +startxref +21431 +%%EOF