jack-3.1.1+cvs20050801/0000755000175000017500000000000010371410665012164 5ustar tbmtbmjack-3.1.1+cvs20050801/jack.man0000644000175000017500000004001110371403403013555 0ustar tbmtbm.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH JACK 1 "November 22, 2004" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME Jack \- rip and encode CDs with one command .SH SYNOPSIS .B jack .RI [ options ] .SH DESCRIPTION .B Jack transforms your audio-CDs to FLAC, MP3 or Ogg Vorbis files. It uses several helper programs in order to achieve things like ripping, encoding and ID3-tagging. Ripping is either done via .B cdparanoia (in which case the ripping status is displayed by Jack as well) or .B cdda2wav. Jack works with several encoders, namely .B oggenc, flac, lame, gogo, bladeenc, l3enc, mp3enc and .B xing. Any time during operation (and even when everything is finished and the original CD lost) you can let Jack look up the track names at .B freedb.org and rename the tracks accordingly. ID3-tagging of MP3s (or insertion of equivalent comment fields in Ogg Vorbis files) is performed as well. .PP If no freedb-lookup has been performed, Jack drops all files in a directory .BR ~/jack/jack-xxxxxxxx , with .B xxxxxxxx representing the CD's CDDB/FreeDB disc ID. This directory is renamed by Jack when the appropriate information is known. .PP Most options like ripper, encoder, preferred FreeDB-Server, directory and MP3-filename format, etc. can be user defined by changing the defaults in .B /etc/jackrc or by saving them to .BR ~/.jack3rc . .PP While Jack is running, these keyboard commands are available: .RS .TP .BR q " or " Q quit .TP .BR p " or " P disable ripping (for example, if you need the CD drive) .TP .BR p " or " P " (again) or " c " or " C resume ripping .TP .BR e " or " E pause/continue all encoders .TP .BR r " or " R pause/continue all rippers. .TP .BR ? toggle the copyright/help box .RE .SH OPTIONS Different options need different data-types as arguments: .TP .B bool can be "yes" or "no", like in .B \-\-vbr=yes .TP .B string can be anything, like in .B \-\-rename\-fmt "%n.%t" .TP .B int an integer number, like in .B \-\-bitrate 192 (or .B \-\-bitrate=192 ) .TP .B list multiple strings, delimited by the final ";". Example: .B \-\-guess\-toc file1.mp3 file2.mp3 ... fileN.mp3 \\; .PP Jack understands the following options: .TP .B \-\-append-year=bool if known, append the year to dir in the format " (%y)" .TP .B \-b, \-\-bitrate int target bitrate (in kbit/s, default is 160). .TP .B \-\-char-filter string convert file names using a python method .TP .B \-\-charset string charset of filenames (defaults to your locale). .TP .B \-c, \-\-check-toc compare toc-file and cd-toc, then exit. Jack caches the TOC of a CD in a file ("jack.toc"). If you want to know if the inserted CD matches the toc-file in the current directory, use this option. .TP .B \-C, \-\-claim-dir rename directories even if they were was not created by Jack. .TP .B \-\-cont-failed-query continue without FreeDB data if query fails. .TP .B \-D, \-\-create-dirs tells Jack to create sub-directories in which Jack puts all the files for the current CD. If no FreeDB data is available, i.e. when not using .B -Q , these directories will be named "jack-xxxxxxxx" where "xxxxxxxx" stands for the CD's FreeDB ID. Otherwise dir_template (see above) will be used. This option is turned on by default. .TP .B \-\-device string The device-name of your cdrom-drive. The default is .B /dev/cdrom .TP .B \-\-dir-template string if directories are renamed, this is the format used (default "%a/%l") .TP .B \-d, \-\-dont-work don't do DAE, encoding, tagging or renaming. This may be useful if you only want to do a FreeDB query, e.g. while another jack is running. .TP .B \-\-edit-freedb open an editor to change the CDDB information which has been obtained previously (only useful with -Q). .TP .B \-\-encoder-name, -E string use which encoder (default "oggenc") .TP .B \-e, \-\-encoders int encode how many files in parallel. If you have a SMP machine or simply want to stress your system, you can have Jack encode several files at once. .TP .B \-x, \-\-exec run predefined command when finished. .TP .B \-\-extt-is-artist the artist is contained in the EXTT fields. The EXTT fields are lines in the FreeDB file which contain additional data for each track. As it's the submitting user's choice what to use them for, Jack can't determine by itself what they were intended for. You have to provide this information. .TP .B \-\-extt-is-title the track title is contained in the EXTT fields. .TP .B \-\-extt-is-comment a track comment is contained in the EXTT fields. .TP .B \-\-force do not ask. Like when deleting incomplete files. .TP .B \-f, \-\-from-tocfile string rip from a cdrdao created CD image on hd. The specified toc-file contains the name of the image file. Use .B \-F if jack can't find the image file. .TP .B \-F, \-\-from-image string read audio data from image file. Like .BR \-\-from-tocfile , but the image itself is specified instead of the tocfile. If you do not have a toc-file (or don't specify a toc-file), the TOC is read from the CD itself. .TP .B \-g, \-\-guess-toc list make up a TOC from the MP3 file given in mp3_files. Format is .B track_01.mp3 ... track_nn.mp3 ; Note that the trailing " .B ; " is only necessary if you want to append more options to your command line. You can use it to do a FreeDB query based on MP3s alone - no need for the CD. Very useful if you have no idea which CD the MP3s are from. The MP3s must be given in the same order as they were on their CD. The generated TOC file is similar, but not identical to the TOC of the CD - do not submit these! .TP .B \-G, \-\-id3-genre string set ID3 genre. Use 'help' to get a list of all known genres. (You can also specify the ID3v1 genre as an int) .TP .B \-Y, \-\-id3-year int set ID3 year. .TP .B \-h, \-\-help Show summary of options. .TP .B \-k, \-\-keep-wavs do not delete WAVs after encoding them. .TP .B \-m, \-\-mail-submit submit FreeDB entry via e-mail. HTTP submission is preferred. You will have to enter the category of the CD. .TP .B \-l, \-\-max-load float only start new encoders if your system's load is below the specified value. /proc/loadavg must be readable by you for this to work. .TP .B \-\-multi-mode try to query FreeDB for all dirs in searchdirs which have no FreeDB data. .TP .B \-\-my-mail string your e-mail address, needed for FreeDB submissions. .TP .B \-n, \-\-nice int nice-level with which the encoders are started. Default is 12 which shouldn't hurt your system much. .TP .B \-o, \-\-overwrite overwrite existing files, i.e. do not check if already ripped WAVs or an already encoded file seem to be OK. Use this if you .B know something went wrong last time. This is off by default. .TP .B \-O, \-\-only-dae only produce WAVs, implies .B \-\-keep-wavs. This is off by default. .TP .B \-\-otf=bool On-the-fly operation. Only on some encoders/rippers. Do not create WAVs, pipe ripper output through the encoder. Default is no as it's a torture for the CDROM drive. .TP .B \-o, \-\-overwrite=bool overwrite existing files. .\" .TP .\" .B \-\-playorder .\" use the FreeDB PLAYORDER field to limit the tracks to .\" rip (non-functional, sorry) .TP .B \-\-quality int vbr encoding quality. -1 is lowest, 10 highest (default 6). You can also specify a float. .TP .B \-q, \-\-query do FreeDB query when all is done. This is useful if Jack was previously run without a FreeDB query. If all tracks are done you don't even have to have a CD inserted as the TOC is cached by Jack. After having finished ripping and encoding, Jack will rename the files and tag them. .TP .B \-\-query\-if\-needed=bool like \-\-query-now, but only if FreeDB data hasn't been successfully queried before. .TP .B \-Q, \-\-query-now do FreeDB query when starting. Use this if you are connected to the Internet when starting Jack. Know that the query may need user-interaction. After having finished ripping and encoding, Jack will rename the files and tag them. .TP .B \-a, \-\-read-ahead int read how many WAVs in advance. At most read_ahead + num_encoders WAVs are ripped before a track has completely been encoded. Default is 99 which will read the whole CD, provided there is enough disk space. .TP .B \-\-remove-files have Jack remove its temp jack*-files. Be careful - don't delete them too early! .TP .B \-R, \-\-rename rename and tag files according to FreeDB file. On startup, Jack creates a blank FreeDB entry file (except if .B \-\-query-now is used, then the file is queried from your FreeDB server). If you have changed its contents (e.g. because the CD was unknown to FreeDB) and want to rename and tag your MP3s accordingly, use this option. Give all other needed options too, like .B \-t , .B \-E , ... .TP .B \-\-rename-dir=bool rename directory as well (default). .TP .B \-\-rename-fmt string format of normal files (default "%n - %t") .TP .B \-\-rename-fmt-va string format of Various Artists files (default "%n - %a - %t") .TP .B \-\-rename-num string format of the track number (%n, printf() style) used to rename the files (default "%02d") .TP .B \-r, \-\-reorder=bool optimize track-order for disk space. This can save you some peak disk space during the encoding process; this may make it possible to do a CD which would otherwise fail to be encoded. .TP .B \-\-replacement-chars list unusable chars are replaced by the corresponding list item (default "%"). .TP .B \-\-ripper string which program to use for extracting the audio data (default "cdparanoia"). .TP .B \-\-save save options to \fI~/.jack3rc\fP file and exit. .TP .B \-\-scan-dirs int Scan this many levels from the current working directory for a matching toc-file (0 to disable, default 2). .TP .B \-\-search list add these directories to the list of directories searched when looking for the workdir (default "."). .TP .B \-\-server string which FreeDB server to use. Don't forget to set your HTTP proxy. Currently either "freedb" (default) or "freedb-de". .TP .B \-\-silent-mode=bool be quiet (no screen output). .TP .B \-s, \-\-space int forcibly set usable disk space, in bytes. This option lets you limit the disk space Jack uses, maybe you need it for something else? Be careful: if set too high or too low, ripping and encoding will probably fail. The default is to look how much is free and to use this value. .TP .B \-\-submit submit FreeDB entry via HTTP. You will have to enter the category of the CD. .TP .B \-S, \-\-swab=bool swap byte order from image file. As cdrdao momentarily only outputs "raw" .cdr files, you quite likely want to swap the byte order. Try this option if your WAVs and encoded files contain only noise. This is on by default as cdrdao currently generates .cdr files that are "wrong". .TP .B \-\-todo print what would be done and exit. .TP .B \-t, \-\-tracks string limit ripping and encoding to the specified tracks, use comma to separate tracks. Ranges are also possible; 5-9 is equivalent to 5,6,7,8,9; 12- is like specifying track 12,...,last_track. The default is to process the whole CD. .TP .B \-u, \-\-undo-rename undo file renaming and exit. If you don't like how Jack renamed your files, use this option to restore the previous state. Several levels of undo are possible. Note that ID3 tags are not restored. .TP .B \-\-unusable-chars list characters which can't be used in filenames (default "/"). .TP .B \-\-upd-progress have Jack re-create its temp files. Use this if you deleted them too early. .TP .B \-\-update-freedb, -U update the FreeDB info and exit. .TP .B \-\-usage\-win=bool show the help screen while running. .TP .B \-v, \-\-vbr=bool Generate variable bitrate files, only on encoders which support this. Default is no. .TP .B \-\-various=bool when parsing FreeDB data, Jack assumes that if the disc\'s artist is set to "Various" the track titles have the format "[artist] - [title]". If the disc title is set to something else and you still want the above behaviour, use .B \-\-various. .TP .B \-\-various-swap exchange artist and title, many FreeDB entries have them wrong. .TP .B \-\-wait=bool wait for key press before quitting. .TP .B \-w, \-\-workdir string where to create directories and put the files. .TP .B \-\-write\-id3v1=bool write a smart id3v1 tag to the encoded file. .TP .B \-\-write\-id3v2=bool write an id3v2 tag to the encoded file. .TP .B \-\-write-m3u create a playlist in .m3u format. This has bugs, don't rely on it. .SH EXAMPLES Insert a CD, fire up jack: .RS jack .RE .PP Now watch it work. It's fun for a while. After having finished, you have the following files on your HD: track_01.mp3, track_02.mp3, ..., track_nn.mp3 plus jack.toc, jack.freedb, jack.progress. The last three are used to store the state jack is in so it can resume work when interrupted. .PP Jack will create a directory called jack-xxxxxxxx for you, there it stores all the file for the CD whose id is xxxxxxxx. After a FreeDB query this directory is renamed to something human readable, like "Artist - Title". .PP When jack is interrupted, call it again using the same command line as before to resume work, in this case .RS jack .RE .PP Now let's try a FreeDB query: .RS jack -q .RE If the query is successful the files will be renamed to something more readable and will be tagged accordingly using ID3 or Vorbis tags. The file jack.freedb will contain the queried FreeDB entry, and the original file will be backed up as jack.freedb.bak. .PP You can use the .B \-\-rename\-fmt option in order to specify the format of the name which will be given to your audio tracks. A list of valid options can be found below. You may also want to specify a set of characters which are not usable and should be replaced. For example, on Unix systems the slash .B (/) should most certainly be replaced with something else. The VFAT filesystem also does not support double quotes .B ("). In order to replace such characters, you can specify the options .B unusable_chars together with .B replacement_chars. For example, .RS jack -Q --rename-fmt "%n-%t" --unusable-chars A I \; --replacement-chars a i \; .RE will query the FreeDB server, rip and encode all tracks of the CD and save the files in a format which will contain the track number and the title. All occurances of the letters .B A and .B I will be replaced with their lower-case versions. These options can also be put in one's configuration file using the following format: .RS unusable_chars:[\(aq \(aq, \(aq/\(aq] .RE .RS replacement_chars:[\(aq_\(aq, \(aq_\(aq] .RE This will replace whitespace and slashes with underscores. If you want to convert all characters to lower-case, you don't have to manually specify all of them but can use the following option instead: .RS char_filter:.lower() .RE .PP All in one: query, rip, encode, cleanup: .RS jack -Q --remove-files .RE .PP Editing / normalizing / stripping the WAV files before encoding: .RS jack -O --remove-files ; gnoise *wav ; jack -g *wav ; jack .RE Just replace gnoise by the operation you'd like to perform. .SH ENVIRONMENT VARIABLES There are several environment variables which can be used in jack's exec hooks: .IP JACK_BASE_DIR lists jack's base directory in which files are stored. .IP JACK_CUR_DIR lists the current directory of jack in which files of the current album are put. .IP JACK_JUST_ENCODED lists all track names which have just been encoded. .IP JACK_JUST_RIPPED lists all track names which have just been ripped. .SH FORMAT STRINGS .IP %n Track number .IP %a Artist .IP %t Track title .IP %l Album title .IP %y Album release year .IP %g Album genre .SH FILES .IP \fI/etc/jackrc\fP Site-wide configuration file. .IP \fI~/.jack3rc\fP User-specific configuration file. Use the .B \-\-save option to save your configuration to this file. .SH AUTHOR Arne Zellentin is the author of Jack. .SH SEE ALSO .BR cdparanoia (1), .BR cdda2wav (1), .BR flac (1), .BR oggenc (1) and .BR lame (1) jack-3.1.1+cvs20050801/README0000644000175000017500000000300610371403403013033 0ustar tbmtbm### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2003 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. Requirements: * python-2.2 or later * CDDB.py - see doc/INSTALL on how to get/install it * eyeD3 - see doc/INSTALL on how to get/install it * an encoder like lame (MP3) or oggenc for Ogg/Vorbis (default) * a DAE tool like cdparanioa ********************************************************************* *** Read doc/INSTALL for further installation details. *** *** It's very unlikely that it'll run out of the box, you need to *** *** install additional software. *** ********************************************************************* Install the software as described in doc/INSTALL. run jack -h for quick help or read the doc/(umentation). Use --save to save frequently uses options to your ~/.jack3rc -- Jack has his home at http://www.home.unix-ag.org/arne/jack/ His creators e-mail address is zarne@users.sf.net jack-3.1.1+cvs20050801/jack0000755000175000017500000002415610371403403013022 0ustar tbmtbm#!/usr/bin/env python ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ### If you want to comment on this program, contact me: zarne@users.sf.net ### ### Visit the homepage: http://www.home.unix-ag.org/arne/jack/ ### see CHANGELOG for recent changes in this program ### see TODO if you want to see what needs to be implemented import os import sys import time import wave import types import posix import string import select import signal import pprint import traceback from jack_globals import * import jack_version import jack_misc import jack_mp3 import jack_argv import jack_rc import jack_helpers import jack_targets import jack_freedb import jack_display import jack_term import jack_children import jack_tag import jack_workers import jack_utils import jack_ripstuff import jack_encstuff import jack_checkopts import jack_status import jack_functions import jack_main_loop import jack_progress import jack_prepare ############################################################################## ###################### M A I N ############################################### ############################################################################## # say hello... print "This is", jack_version.prog_name, jack_version.prog_version, jack_version.prog_copyright, jack_version.prog_devemail ### interpret options global_cf = jack_rc.load(cf, cf['global_rc']['val']) jack_checkopts.checkopts(cf, global_cf) cf.rupdate(global_cf, "global_rc") user_cf = jack_rc.load(cf, cf['user_rc']['val']) jack_checkopts.checkopts(cf, user_cf) cf.rupdate(user_cf, "user_rc") help, argv_cf = jack_argv.parse_argv(cf, sys.argv) jack_checkopts.checkopts(cf, argv_cf) cf.rupdate(argv_cf, "argv") if help: jack_argv.show_usage(cf, long=help-1) sys.exit(0) debug("global_cf: " + `global_cf`) debug("user_cf: " + `user_cf`) debug("argv_cf: " + `argv_cf`) jack_checkopts.consistency_check(cf) if cf['save_args']['val'] == 1: count = jack_rc.save(cf['user_rc']['val'], cf) info("%d options saved in %s" % (count, cf['user_rc']['val'])) sys.exit() ext = jack_targets.targets[jack_helpers.helpers[cf['_encoder']]['target']]['file_extension'] ### (1) search for a dir containing a toc-file or do the multi-mode toc_just_read = jack_prepare.find_workdir() os.environ["JACK_CUR_DIR"] = os.getcwd() os.environ["JACK_BASE_DIR"] = cf['_base_dir'] # now we are set to go as we know we are in the right dir ### (2) check toc (operation mode) if cf['_check_toc']: jack_prepare.check_toc() sys.exit(0) ### (3a) read and interpret toc_file is_submittable, track1_offset = jack_prepare.read_toc_file() ### (3b) make sure we have a freedb file if not os.path.exists(cf['_freedb_form_file']): jack_freedb.freedb_template(jack_ripstuff.all_tracks) ### (4a) filter out data tracks jack_prepare.filter_tracks(toc_just_read) ### (4b) Parse tracks from argv, generate todo todo = jack_prepare.gen_todo() if len(todo) == 0: error("nothing to do. bye.") ### init status jack_status.init(todo) #XXX## (5) read progress info into status jack_ripstuff.all_tracks_orig = [] for i in jack_ripstuff.all_tracks: jack_ripstuff.all_tracks_orig.append(i[:]) status = jack_prepare.init_status() ### (6) update progress file at user's request (operation mode) if cf['_upd_progress']: jack_prepare.update_progress(todo) sys.exit(0) ### (7) now read in the progress file status = jack_prepare.read_progress(status, todo) ### (8) submit freedb data on user's request if cf['_freedb_submit'] or cf['_freedb_mailsubmit']: jack_prepare.freedb_submit() sys.exit(0) ### (9) do query on start freedb_rename = 0 if cf['_query_if_needed']: if not os.path.exists(cf['_freedb_form_file'] + ".bak"): cf['_query_on_start'] = 1 if cf['_query_on_start']: freedb_rename = jack_prepare.query_on_start() ### (10) update freedb dbfile if cf['_update_freedb']: if not jack_tag.track_names: err, jack_tag.track_names, jack_tag.locale_names, freedb_rename, revision = jack_freedb.interpret_db_file(jack_ripstuff.all_tracks, cf['_freedb_form_file'], verb = 1, dirs = 0) jack_freedb.freedb_template(jack_ripstuff.all_tracks, jack_tag.track_names, revision + 1) jack_utils.ex_edit(cf['_freedb_form_file']) info("now submit your changes if you like, using the option --submit (via http POST). Don't forget to activate your changes locally with -R") sys.exit(0) ### (11) undo renaming (operation mode) if cf['_undo_rename']: jack_prepare.undo_rename(status, todo) sys.exit(0) #### Reorder if told so if cf['_reorder']: todo.sort(jack_utils.cmp_toc) todo.reverse() #### check how much bytes we can burn if cf['space_from_argv']['history'][-1][0] == "argv": space = jack_ripstuff.raw_space = cf['_space_from_argv'] else: space = jack_ripstuff.raw_space = jack_functions.df() #### check what is already there space, remove_q, wavs_todo, mp3s_todo, dae_queue, enc_queue = jack_prepare.what_todo(space, todo) if cf['_todo_exit']: # print what needs to be done, then exit jack_prepare.print_todo(todo, wavs_todo, mp3s_todo) sys.exit(0) # now mp3s_todo contains the tracks where the wavs only need to be coded and # wavs_todo lists those tracks which need to be dae'd end enc'd. The dae_queue # has been filled from wavs_todo (todo is superflous now). The main_loop # will handle the tracks in mp3s_todo. ### make sure we have enough space to rip the whole thing jack_prepare.check_space(space, wavs_todo, mp3s_todo) cf['_max_load'] = cf['_max_load'] + cf['_encoders'] #XXX if not cf['_dont_work'] and dae_queue: # check if inserted cd matches toc. jack_prepare.check_cd() # why? paranoia or needed? XXX if cf['_rip_from_device']: all_tracks_on_cd = jack_functions.gettoc(cf['_toc_prog']) if not cf['_force'] and not jack_utils.cmp_toc_cd(jack_ripstuff.all_tracks_orig, all_tracks_on_cd, what=(NUM, LEN)): error("you did not insert the right cd") ### if we have work to do, we may have to remove some files first if remove_q: jack_prepare.remove_files(remove_q) ### bail out now if told so if cf['_dont_work']: info("quitting now as requested.") sys.exit(0) ### install signal handlers signal.signal(signal.SIGTERM, jack_display.sig_handler) signal.signal(signal.SIGINT, jack_display.sig_handler) signal.signal(signal.SIGQUIT, jack_display.sig_handler) signal.signal(signal.SIGHUP, jack_display.sig_handler) #\ /# #########> real work starts here <############################################# #/ \# global_error = None if (wavs_todo or mp3s_todo): jack_ripstuff.gen_printable_names(jack_tag.track_names, todo) jack_term.init(cf['_terminal'], cf['_xtermset_enable']) jack_display.init() try: jack_term.enable() global_error = jack_main_loop.main_loop(mp3s_todo, wavs_todo, space, dae_queue, enc_queue, track1_offset) except SystemExit: jack_term.disable() print jack_display.options_string print "--- Last status: ---------------------------------------------------------------" jack_status.print_status(form = 'short') sys.exit(0) except: jack_term.disable() warning("abnormal exit") traceback.print_exc() sys.exit(1) # Set the files we have processed but this may still be overwritten by # jack_tag.tag() called below. os.environ["JACK_JUST_ENCODED"] = "\n".join([x[NAME] + ext for x in mp3s_todo]) os.environ["JACK_JUST_RIPPED"] = "\n".join([x[NAME] + ".wav" for x in wavs_todo]) jack_term.disable() if cf['_query_when_ready']: info("querying...") if jack_freedb.freedb_query(jack_freedb.freedb_id(jack_ripstuff.all_tracks), jack_ripstuff.all_tracks, cf['_freedb_form_file']): jack_display.exit() if cf['_query_when_ready'] or cf['_read_freedb_file'] or cf['_query_on_start']: err, jack_tag.track_names, jack_tag.locale_names, freedb_rename, revision = jack_freedb.interpret_db_file(jack_ripstuff.all_tracks, cf['_freedb_form_file'], verb = 1, dirs = 1) if err: error("could not read freedb file") if jack_term.term_type == "curses": if jack_display.options_string: print jack_display.options_string print "The final status was:" jack_status.print_status(form = 'short') if global_error: if cf['_exec_when_done']: os.system(cf['_exec_err']) error("aborting because of previous error(s) [%i]." % global_error) jack_tag.tag(freedb_rename) if jack_functions.progress_changed: jack_functions.progress("all", "done", time.strftime("%b %2d %H:%M:%S", time.localtime(time.time()))) if cf['_remove_files']: print "cleaning up in", os.getcwd() for i in [cf['_progress_file'], cf['_toc_file'], cf['_def_toc'], cf['_freedb_form_file'], cf['_freedb_form_file'] + ".bak"]: if os.path.exists(i): os.remove(i) if cf['_exec_when_done']: os.system(cf['_exec_no_err']) jack_display.exit() # call the cleanup function & exit ############################################################################### ################################## #################################### ################################## T H E #################################### ################################## E N D #################################### ################################## #################################### ############################################################################### jack-3.1.1+cvs20050801/doc/0000755000175000017500000000000010371403417012726 5ustar tbmtbmjack-3.1.1+cvs20050801/doc/CHANGELOG0000644000175000017500000001365110371403403014141 0ustar tbmtbm ############################################################################### ########################## pre-CVS changes follow: ############################ ############################################################################### ##### This is jack 2.2.2 ... ### changes from version 2.1.1 (internal) include: # added curses frontend # added support for variable bitrate MP3s (currently only for lame) # bugfix: cddb query disc length was 2 seconds too short (thanks to Martin Suess for the hint). I still don't understand where and why I need the MSF OFFSET of 150 blocks, can anyone explain? # bugfix: freedb files with more than one line of ids confused jack, thanks to "casret" for the patch ### changes from version 2.1.0 include: # moved the toc_proc variable a bit lower in the .jackrc 'coz it's confusing # change: in the jack.progress file, track numbers are now %02i # bugfix: sometimes the :-) was not updated in case of an error, now it is # bugfix: pause works now... # bugfix: update interval no longer effects speed on non-Linux (i hope!) ### changes from version 2.0.1 include: # bugfix: the NameError: cd_device bug is gone (I never saw this as I didn't change _my_ .jackrc... sorry) # bugfix: same for "... maybe ... is not installed" # added on-the-fly operation for cdparanoia, lame, mp3enc # added 40 second pause before displaying global ETA so it can stabilize # added option to execute user-defined commands - when done without errors - when done with errors - when ripping is finished # added version check for .jackrc # change: "Various" in freedb data is now treated like "Various Artists" # added check for bogous DAE run without reported error (by checking filesize) # bugfix: ZeroDivisionError when a lonely encoder was killed # added better source code formatting :) ### changes from version 2.0.0 include: # bugfix: jack tried to chdir into newly created dirs twice # bugfix: subdirs were created in the wrong sequence ### changes from version 1.3.5 include: # MANY changes and improvements, let's see if i can remember all: # removed all thread and Queue stuff, much less trouble now # removed resource control (ulimit), jack now quits gracefully # added run-time commands, run jack -h to see details # added directory creation and naming # added directory auto-search magic, if jack doesn't find a toc-file, it scans sub-directories (where and how deep is configurable) for a matching toc-file and continues work # added base_dir option, controls where new dirs are created. If you set your prefs the right way, you only have to change CDs and type "jack" from time to time. # added no-various option to prevent "Various Artists" auto-detection # added option to re-create progress file # added update_interval, status is now updated regularily and no longer in reaction to sub-process output # added total ETA (only for encoders) # changed jack so that it should (finally!) run on FreeBSD and most other unices # performance enhancements, jack only wastes < 0.1 % of _my_ CPU time ### changes from version 1.3.4 include: # added support for tosha(gettoc&DAE) PLEASE help me get jack to work on FreeBSD. Something's wrong with threading I fear. # bugfix: jack reported "WAV lost" when the wav was removed on purpose # bugfix: jack encoded WAVs when resuming even if only_dae was set ### changes from version 1.3.3 include: # bugfix: jack reported "wrong disc" in error # change: track 1 pregap is now stored in "SILENCE" in tocfile. Re-generate your jack.toc files! ### changes from version 1.3.2b include: # better version of cdrdao_gettoc # added resource module auto-detection # added cheesy pause function: touch or rm "jack.pause". # added disc recheck before each DAE is started # added --todo: print what is to be done and exit # bugfix: MP3s are now also checked for not being too large # bugfix: MP3s bitrate is now remembered, too # change: --force now disables check for correct CD inserted # change: --force now disables check for previous encoder run (like when manually encoding) # added support for MP3s not starting at file's start (like RIFFs) (guess_toc) # bugfix: freedb file: DISCID can now be comma-sep. list ### changes from version 1.3.2a include: # rewrote freedb_names # removed sanity_check_freedb_file, freedb_names does the job now # tried to make error messages uniform ### changes from version 1.3.2 include: # added rename_fmt option to .jackrc (use this to change renaming layout) # added rename_underscore option to .jackrc (use this to change " " to "_") ### changes from version 1.3.1 include: # added dae_prog option to .jackrc # added cd_device option to .jackrc (point it to your CD-ROM device) ### changes from version 1.3 include: # announced on freshmeat (famous last words...) # now using Ben Gertzfield's ID3 module for id3tag info setting # added guess mode # added sysload reaction # added (buggy) free space rechecking # added dont-work switch ### changes from version 1.2 include: # public release under GPL # added encoder support: lame, l3enc, mp3enc # rewrote todo detection # added only_dae flag # added dialog which asks before deleting anything # bugfixes ### changes from version 1.1 include: # added stupid function to "rip" from image # added cool function to "rip" from cdrdao toc-file # added toc-file writing # added freedb lookup + renaming + id3tag setting # handles multiple/nonexact freedb matches # added freedb submissions # added xtermset support ### changes from version 1.0 include: # stupid semaphore initialization bug fixed # free space check is no longer braindead # we don't try to remove() nonexistent files anymore jack-3.1.1+cvs20050801/doc/ChangeLog0000644000175000017500000007225010371403403014501 0ustar tbmtbm2004-12-12 22:52 zarne * jack_version.py, setup.py: - bump version for 3.1.1 release 2004-12-12 05:54 zarne * jack.man, jack_config.py, jack_functions.py, jack_helpers.py, jack_main_loop.py, jack_t_curses.py: - the usage/copyright box stays on top now by default, disable it by pressind '?' or with --usage-win=no - pprint_speed() (internal) - documentation updates 2004-12-12 03:27 zarne * jack_prepare.py: - fixed a warning regarding non-audio tracks 2004-12-12 03:03 zarne * jack_plugins.py: - new plugin architecture (I forgot to include this earlier today) 2004-12-12 03:02 zarne * jack, jack.man, jack_checkopts.py, jack_config.py, jack_misc.py, jack_t_curses.py, jack_utils.py: - fixed --remove-files - fixed --exec - help the user if dir_template is longer than scan_dirs - documentation updates - allow the dir_template to consist of more than two path elements - curses: fix dae status display 2004-12-12 01:04 zarne * jack.man, jack_config.py, jack_main_loop.py, jack_misc.py, jack_t_curses.py: - curses: fix display of the special line - --max-load now takes a float argument - simplify loadavg() 2004-12-11 23:52 zarne * jack_checkopts.py, jack_config.py, jack_main_loop.py, jack_prepare.py: - 31_wrong_char_in_status.patch - 18_less_verbose_gen_device_warning.patch - 28_avoid_empty_USER_LOGNAME.patch 2004-12-11 23:14 zarne * setup.py: - added the new modules to the setup script 2004-12-11 22:12 zarne * example.etc.jackrc: - added an example for the global config file /etc/jackrc 2004-12-11 21:57 zarne * jack_plugin_cddb.py, jack_plugin_lame.py: - added example plugin files 2004-12-11 21:55 zarne * jack_checkopts.py, jack_config.py, jack_freedb.py, jack_generic.py, jack_globals.py, jack_helpers.py, jack_prepare.py, jack_rc.py: - new plugin architecture for rippers, encoders and freedb-servers (so far) 2004-12-11 19:15 zarne * jack_config.py, jack_freedb.py, jack_generic.py, jack_t_curses.py, doc/ChangeLog: - fixed a curses bug preventing some from ripping CDs with more tracks than lines in the terminal - debug stuff - cosmetic stuff 2004-11-23 01:06 zarne * jack_helpers.py: - remove debug stuff 2004-11-23 00:45 zarne * jack.man, jack_argv.py, jack_checkopts.py, jack_config.py, jack_freedb.py, jack_workers.py: - manpage updates - removed --no-various because - --various=no now actually works - block more options from being written to jackrc - --otf works again (but isn't displayed right all the time) 2004-11-22 19:59 zarne * jack_helpers.py, jack_main_loop.py, jack_rc.py: - more fixes to cdparanoia status decoding - jack_rcversion is written to newly created rc-files 2004-11-22 00:34 zarne * jack.man, jack_helpers.py, jack_rc.py: - fix creation of ~/.jack3rc - take all debian updates for the manpage (thank you Michael!) 2004-11-22 00:07 zarne * jack_helpers.py, jack_version.py, setup.py, doc/INSTALL: - begin jack 3.1 release cycle - modest update to INSTALL doc 2004-11-21 23:42 zarne * jack_argv.py, jack_checkopts.py, jack_config.py, jack_helpers.py, jack_main_loop.py, jack_prepare.py, jack_rc.py, jack_version.py, jack_workers.py: - update copyright year(s) - remove "charset has no effect without a char_filter" warning, charset is used by the ogg tagger - disallow saving of the --dont-work option - add version-string (and checking) to the rc-files. 2004-11-21 22:44 zarne * jack_argv.py, jack_checkopts.py, jack_config.py, jack_helpers.py, jack_main_loop.py, jack_prepare.py, jack_rc.py, jack_workers.py: - allow the argument to --quality to be a float. oggenc is fine with that, lame seems to truncate the float but works. - fixed some typos - fixed --check-toc 2004-11-21 21:33 zarne * jack_argv.py, jack_config.py, jack_helpers.py, jack_main_loop.py, jack_rc.py: - allow for lists (like --unusable-chars) to be --save'd to .jack3rc - lame encoder now uses --vbr-new - lame encoder now uses --preset instead of --alt-preset - fixed the "error decoding status" issue, which I think is actually a bug in cdparanoia which outputs lots of invisible junk after ripping. The fix may break other helpers, I only tested lame, oggenc, cdparanoia and cdda2wav - added lame-user which uses -V and uses the quality specified with --quality - changed LAME default quality to 6, which will result in 4 being used when using --encoder-name lame-user (ignored otherwise) - cdda2wav now uses the --device, not the --raw-device. Seems to work fine. - cdda2wav now uses -v toc instead of -v 35 (the latter being obsolete soon) 2004-11-18 03:08 zarne * jack, jack_config.py, jack_helpers.py: - added the option "--query-if-needed" which only queries freedb if there is no file called "jack.freed.bak" (which is, among other things, the result of a successful freedb-query). 2004-11-17 22:55 zarne * jack_argv.py, jack_rc.py: - changed the UI a bit. Options can now be set with --option=value. Use "yes" or "no" for booleans. --option alone still toggles the current value. Toggeling sounded like a nice idea in the early days of jack but now, with 2 rc-files and the command-line things have gotten out of hand. - Booleans are now saved (--save) as option:value in the rc-files. Please use that syntax in /etc/jackrc, too. This will hopefully bring order to the chaos. 2004-11-17 21:26 zarne * jack_ripstuff.py, jack_t_curses.py: - fixed the infamous curses addstr bug. Why did it ever work? 2004-11-10 00:42 zarne * jack, jack_CDTime.py, jack_TOC.py, jack_TOCentry.py, jack_freedb.py, jack_functions.py, jack_mp3.py, jack_version.py: - re-added those files (I'm running out of brown paper bags) - cosmetic stuff - one little bug fixed 2004-08-25 04:36 zarne * jack_freedb.py: - fixed http_proxy for --submit 2004-08-25 00:53 zarne * jack_CDTime.py, jack_TOC.py, jack_TOCentry.py, jack_checkopts.py, jack_display.py, jack_freedb.py, jack_globals.py, jack_mp3.py, jack_prepare.py, jack_t_dumb.py, jack_term.py, jack_workers.py: - removed some unused files - --submit works again - --mail-submit works again (but use --submit if possible) - --silent mode works again 2004-03-25 03:55 zarne * jack_freedb.py: - "VA" is now recognized as various - fixed another forgotten cf[] (thanks to Stephan Helma for the patch) 2003-12-02 02:49 zarne * jack, jack_checkopts.py, jack_config.py, jack_generic.py, jack_globals.py, jack_helpers.py: - fixed cdparanoia status decode bug (I hope) - new option --debug, obsoletes DEBUG in jack_generic - make --my-mail actually work, better sanity check of the address 2003-12-02 01:51 zarne * jack, jack_prepare.py, jack_t_curses.py, jack_version.py: - fix a free diskspace-related bug - we're in 2003 now :] - expand ~ in base_dir so it can be relative to the user's homedir 2003-11-26 19:16 zarne * jack_prepare.py, jack_ripstuff.py: - raw_space was moved but I forgot that in jack_prepare. fixed. 2003-11-26 19:02 zarne * setup-cursesmodule.py, setup-jack.py, setup.py, doc/ChangeLog: - new setup.py for jack's modules and the cursesmodule. jack itself still has to be manually installed. 2003-10-12 03:54 zarne * README, jack, jack_config.py, jack_freedb.py, jack_functions.py, jack_globals.py, jack_helpers.py, jack_main_loop.py, jack_prepare.py, jack_tag.py, jack_workers.py, doc/INSTALL: - fixed --update-freedb - declare encoding (newer python wants this) - 17_authenticated_http-proxy_support_patch - fixed some deprecation warnings - 07_continue_various_if_blank_artist - various bug fixes - added --strictly-enforce-ISO to lame options - fix for new cdparanoia screen output format - print dots while tagging (which can be time consuming, e.g. with ID3v2) - 19_catch_rename_too_long_fix - slight documentation updates (lots of stuff still missing) 2003-04-30 04:35 zarne * jack_checkopts.py, jack_config.py, jack_display.py, jack_init.py, jack_tag.py: - ogg tags are now written as utf-8, as required by the standard - cosmetic stuff 2003-04-30 03:49 zarne * jack, jack_checkopts.py, jack_config.py, jack_init.py, jack_tag.py: - id3v2 support, rejoice! you need http://pyid3lib.sourceforge.net/ - small stuff 2003-04-19 01:45 zarne * jack_helpers.py: - changed default lame command lines: --r3mix -> --alt-preset standard; -h -b -> --alt-preset cbr 2003-04-19 00:55 zarne * jack_config.py, jack_freedb.py, jack_functions.py, jack_helpers.py, jack_init.py, jack_playorder.py, jack_prepare.py: - small bugfixes - nonfunctional (yet) support for the PLAYORDER field in freedb entries - toc reading more robust 2003-01-22 20:15 zarne * jack_helpers.py, jack_main_loop.py, jack_workers.py: - fixed missing import signal - fixed signals for child processes - CDDB.py toc-reader now closes rip device (sf.net Bugs item #664344) 2003-01-22 18:40 zarne * jack_config.py, jack_m3u.py, jack_tag.py: - added support for creating m3u playlist (as requested) 2003-01-22 18:11 zarne * jack, jack_argv.py, jack_checkopts.py, jack_config.py, jack_freedb.py, jack_functions.py, jack_generic.py, jack_main_loop.py, jack_prepare.py, jack_utils.py, jack_workers.py: - quite a number of fixes. Why did nobody complain? 2002-09-05 00:17 zarne * jack, jack_checkopts.py, jack_config.py, jack_display.py, jack_freedb.py, jack_functions.py, jack_generic.py, jack_globals.py, jack_helpers.py, jack_main_loop.py, jack_prepare.py, jack_t_curses.py, jack_tag.py, jack_term.py, jack_workers.py: - more cleanups and bugfixes - out of ignorance I failed to notice that I already use python-2.2 features. Who has problems with jack *requiring* python >= 2.2? 2002-09-04 00:34 zarne * jack, jack_checkopts.py, jack_config.py, jack_freedb.py, jack_functions.py, jack_t_curses.py, jack_term.py: - more cleanups - terminal resizing and xtermset both seem to be ok now 2002-09-03 22:45 zarne * jack_readprefs.py: - removed unused module jack_readprefs - jack_generic was not modified, what is CVS trying to tell me? 2002-09-03 21:33 zarne * jack, jack_argv.py, jack_freedb.py, jack_functions.py, jack_main_loop.py, jack_utils.py, jack_workers.py: - cleanups - use error(), info() and warning() more often 2002-09-03 19:56 zarne * jack, jack_argv.py, jack_checkopts.py, jack_config.py, jack_constants.py, jack_display.py, jack_encstuff.py, jack_freedb.py, jack_functions.py, jack_generic.py, jack_globals.py, jack_helpers.py, jack_init.py, jack_main_loop.py, jack_misc.py, jack_progress.py, jack_rc.py, jack_ripstuff.py, jack_status.py, jack_t_curses.py, jack_targets.py, jack_term.py, jack_utils.py, jack_workers.py: - things are taking form, ripping and renaming seems to work - configfile: new format, new filename. save options with --save - this is still unstable, beta, don't expect too much (except bugs) 2002-09-03 10:42 zarne * jack, jack_argv.py, jack_checkopts.py, jack_children.py, jack_config.py, jack_display.py, jack_freedb.py, jack_functions.py, jack_globals.py, jack_helpers.py, jack_init.py, jack_misc.py, jack_readprefs.py, jack_ripstuff.py, jack_status.py, jack_t_curses.py, jack_t_dumb.py, jack_tag.py, jack_targets.py, jack_term.py, jack_utils.py, jack_version.py, jack_workers.py, doc/ChangeLog: - work on version 3.0.0 starts now - don't use this, only the bare minimum functionality is there - e.g. no config file yet 2002-06-20 14:36 zarne * jack: - fixed a stupid variable initialisation bug - fixed another (hope it was the last one) append() with >1 args bug 2002-06-13 05:43 zarne * jack.man: - -F and -f clarified 2002-06-13 05:37 zarne * jack: - strange that nobody noticed it, but jack couldn't rip CDs with only one track on them. fixed. - some cleanups 2002-06-09 02:06 zarne * jack: - only import what we use from the curses module 2002-06-09 01:56 zarne * jack: - jack can use normal curses now (to the extent possible, i.e. without reacting to SIGWINCH (terminal window resizing)) (inspired by Oleg Broytmann's patch, thanks!) 2002-06-01 17:03 zarne * jack: * added sloppy ripping mode which is activated by a secret switch 2002-05-25 04:01 zarne * jack: * to my understanding FLAC produces VBR files. now jack thinks so, too. 2002-05-25 03:42 zarne * jack: * added support for MPEGplus (encoder: mppenc, extension: .mpc) 2002-05-25 01:46 zarne * jack.man: * typo 2002-05-25 01:44 zarne * jack.man: * (hopefully) clarify how the -R / --rename option works 2002-05-25 01:36 zarne * jack: * nobody complained, but I re-added --rename-only with a deprecation warning 2002-05-25 00:56 zarne * jack, jack.man: * renamed option --rename-only to --rename -- old name was confusing. I'll revert this if enough people complain. 2002-05-24 15:51 zarne * jack: * --quality switch for vbr, thanks to Michael Banck for the patch! 2002-05-24 14:17 zarne * jack: * small changes to the flac patch 2002-05-24 14:15 zarne * jack: * flac patch from Drew Hess - thanks, great work! 2002-05-24 12:12 zarne * jack: * hide --charset option from --help if char_filter is not used. having no effect, it would then only confuse people. 2002-05-24 12:10 zarne * jack: * some small cleanups, options reordered * new char_filter, e.g. for upper->lowercase conversion. should work with any character encoding * new option --charset, see above, default is latin-1 * needs python >= 2.2; can anybody tell me how to do this in python < 2.2? 2002-05-04 04:55 zarne * jack: * fixed Debian Bug#140903 (replacement_chars doesn't work on uppercase umlauts) by documenting it - there's no way to "fix" it but the workaround is simple: just add the umlauts explicitly to unusable_chars and replacement_chars 2002-05-03 00:03 zarne * jack: * fixed Debian Bug#141781: --upd-progress assumes that the tracks are encoded in mp3 format, even if the encoder is oggenc 2002-04-30 01:36 zarne * jack: * Debian Bug#144996 (jack uses ogg tag "YEAR" instead of "DATE") fixed. 2002-04-17 11:55 zarne * jack: * upped version to 2.99.9 * switch from FCNTL to fcntl module 2002-04-16 09:28 zarne * jack.man, doc/ChangeLog: * added one example to the manpage * ChangeLog isn't auto-updated currently, will fix soon 2002-04-15 04:49 zarne * jack: * update copyright notice, welcome to the year 2002 2002-04-15 04:40 zarne * jack: * elaborate on the missing permissions for the device problem many people have 2002-04-15 03:27 zarne * jack: * when guess-tocing WAVs you now have the option to truncate them if they are noch CDDA-block aligned * better defaults for genre and year when pre-tagging 2002-04-15 02:23 zarne * jack: * (re-)enabled correct processing of mixed mode CDs (which have a data track 1) * rewrote and improved toc-reader based on cdda2wav * corrected an assumption in CDDB.py's toc-reader which thought the first track is always numbered 01 2002-04-15 00:32 zarne * jack: * fixed bugs introduced in rev. 1.42 * made CD-EXTRA really work ;) 2002-04-14 19:36 zarne * jack, jack.man: * fixed bugs.debian.org/132985 by accepting patch from Martin Michlmayr 2002-04-14 18:23 zarne * jack: * fixed errors ripping CD-EXTRA by double checking the TOC CDDB.py reports against what the ripper thinks 2002-02-12 17:25 zarne * jack: * "various" is now a global variable * on VA CDs the artist is now shown while encoding (thanks to Martin Michlmayr) 2002-02-11 03:54 zarne * jack: * removed the quality switch for oggenc, people say the default (3) is good. In a quick listening test with a difficult CD I could not spot any obvious flaws. Ogg Vorbis is impressive. 2002-02-06 20:18 zarne * README, jack, jack_CDTime.py, jack_TOC.py, jack_TOCentry.py, jack_misc.py, jack_mp3.py, setup-cursesmodule.py, setup-jack.py, cursesmodule/README.precompiled, doc/download.html, doc/examples.html, doc/faq.html, doc/index.html, doc/install.html, doc/links.html, doc/requirements.html, doc/screen.html, doc/todo.html, doc/usage.html: * I prefer jack related email to zarne@users.sf.net now, thanks. 2002-02-06 20:06 zarne * jack.man: * corrections * missing options added (by Michael Banck, thanks.) 2002-02-06 18:48 zarne * jack: * use LC_ALL=C, I hope this helps solve the remaining problems with localization 2002-02-04 01:17 zarne * jack.man: * Michael Banck is too modest get have credits for the manpage. 2002-02-03 18:08 zarne * jack: * sendmail is now called as /usr/lib/sendmail. Does anyone still use mailsubmit? 2002-02-03 16:57 zarne * jack.man: * some edits/corrections/additions 2002-02-03 16:56 zarne * jack.man: * initial checkin of the manpage Michael Banck has written for jack 2002-02-03 15:47 zarne * jack: * added -QQ which is like -Q but allows you to continue on failed queries. 2002-02-03 15:19 zarne * jack: * fixed freedb submission by email (I hope, didn't test it) 2002-02-03 15:04 zarne * jack: * pretagging now allows setting of genre (%g) and year (%y) * changed mnemonic for generic_device from %g to %D -- check your .jackrc! 2002-02-03 14:31 zarne * jack: * workaround for bug in ID3.py which defaults the genre to Blues [0] 2002-02-03 14:09 zarne * jack: * jack now creates directories even when reading --from-tocfile 2002-02-03 13:31 zarne * jack: * Linux OSTYPE is now recognized if it's called linux-gnu (thank you dme!) 2002-02-03 13:14 zarne * jack: * fixed a bug in VA pretagging, thanks to Martin Michlmayr for the patch! 2002-02-03 03:48 zarne * jack: * implemented ogg post-tagging for pyvorbis >= 0.5, for real this time ;-) * fixes for local freedb_dir by Matthew Mueller 2002-02-03 03:20 zarne * jack: * increased status_blocksize from 56 to 64 for oggenc. * implemented ogg post-tagging for pyvorbis >= 0.5, thanks to Michael Banck! * oggenc is now called with -q 5 instead of a bitrate parameter. True VBR now. * [ Sorry, I was terribly busy in the recent past. ] * [ There's still a huge backlog.] 2001-11-12 06:36 zarne * jack: - small code cleanup (the category chooser is one function now instead of 3 instances) - freedb category is now remembered, useful for submitting updated entries - bug fixed: entering "0" as category used last category instead of aborting 2001-11-09 19:34 zarne * jack: - added option --wait (wait on quit) - added option --workdir (where to put files / dirs, == base_dir) - added option --search (where to search for workdir, appends to searchdirs) - create all dirs leading to workdir 2001-11-08 19:57 zarne * jack: This patch - provided by Martin Michlmayr - does this: - use float and int instead of atof and atoi. The latter are deprecated (see Python documentation). (The jack_*.py modules need to be overhauled likewise) - Check if an input string is really an integer and don't fail if it's not. - Check the range of tracks in the -t arguments and ignore invalid tracks. 2001-11-08 02:22 zarne * jack: now that 2.99.7 is out, bump version to 2.99.8 2001-11-08 02:20 zarne * jack, setup-cursesmodule.py, cursesmodule/jack_cursesmodule.c, doc/ChangeLog, doc/INSTALL: - get rid of compiler warnings with -Wno-strict-prototypes - put the two unused functions which gcc complains about to use 2001-11-07 18:52 zarne * doc/: ChangeLog, index.html: - index.html points to ChageLog instead of CHANGELOG now - ChangeLog will contain the more recent changes now, CHANGELOG the very old ones. ChangeLog will NOT be up-to date in cvs BUT in releases. 2001-11-07 18:43 zarne * doc/CHANGELOG: - prepared it for automatic actualization, released versions contain the CVS log from now on. CHANGELOG is now a template from which ChangeLog is generated when releasing, CVS will contain both in a undefined state. 2001-11-07 18:08 zarne * jack: - version is now 2.99.7 - use termios instead of TERMIOS to make python2 happy - works with python2 now, I tested/use 2.1.1 - tell people what to do if modules are missing - re-organized .jackrc, unfortunately everybody has to re-gen it now - with luck, this is the last time everybody has to re-gen it :) - tried xtermset again and found that it still works - try it! - updated gogo helper, thanks to José Antonio Pérez Sánchez - compile helpers, this works in python2. comment out if you have problems. - changed the execs to make python2 happy - encoders, rippers and freedb servers are listed if specified doesn't exist - we're close to 3.0 2001-11-07 18:08 zarne * README: removed version, I keep to forget to update it 2001-10-11 00:38 zarne * README, jack, doc/INSTALL: - fixed "tag" info for Ogg/Vorbis - fall back to CBR if selected encoder does not support VBR (thanks to Michael Banck for finding both issues) - removed version info from doc/INSTALL because I keep to forget to update it 2001-10-10 23:21 zarne * jack: - changed http Submit-Mode from test to submit (oops) 2001-10-10 21:57 zarne * jack: - Version is now (since 2 commits actually) 2.99.6 - cursesmodule was renamed to jack_cursesmodule to avoid conflicts - re-organized .jackrc - fixed freedb-sources - default encoder is now oggenc (which can only do vbr) - default naming scheme has been changed to "Artist - Album - 01 - Tracktitle.[ext]" - fixed resizing (more precisely I removed a hack which made it work for me on RedHat 6.2) - workaround for illegal freedb entries with empty album name 2001-10-10 18:43 zarne * doc/TODO: Todo: write get_toc for ogg/vorbis 2001-10-10 18:39 zarne * README: - state that oggenc is now the default 2001-10-10 18:34 zarne * cursesmodule/: cursesmodule.c, jack_cursesmodule.c: - renamed cursesmodule.c -> jack_cursesmodule.c - patched the module to reflect this change 2001-10-10 18:33 zarne * cursesmodule/precompiled/Debian-Woody/jack_cursesmodule.so: jack_cursesmodule, precompiled on Debian-Woody 2001-10-10 18:29 zarne * setup-cursesmodule.py, cursesmodule/README.precompiled, doc/CHANGELOG, doc/INSTALL, doc/TODO: - Version is now (since 2 commits actually) 2.99.6 - cursesmodule was renamed to jack_cursesmodule to avoid conflicts - the URL in CHANGELOG has been fixed (missing www.) - updated TODO - re-organized .jackrc - fixed freedb-sources - default encoder is now oggenc (which can only do vbr) - default naming scheme has been changed to "Artist - Album - 01 - Tracktitle.[ext]" - fixed resizing (more precisely I removed a hack which made it work for RedHat 6.2) 2001-10-06 07:14 zarne * jack: fixed the bug which prevented successful ogg tagging (Bender, you really should not program when you're sober!) 2001-10-06 00:14 zarne * README, jack: started Ogg Vorbis support which seems to work, there's still a bug concerning the ogg info data. I'll try to fix that one later. Jack can now be extended to use any target format. 2001-08-31 22:27 zarne * README, doc/INSTALL: clarified (I hope) the installation procedure 2001-08-31 06:29 zarne * ID3.py, cursesmodule-1.5b2.patch: ID3 is available separately, the patch was moved into the cursesmodule subdir. 2001-08-31 06:26 zarne * setup-cursesmodule.py, setup-jack.py: inital checkin. anyone else I forgot? 2001-08-31 06:20 zarne * cursesmodule/: Makefile, Makefile.pre, Makefile.pre.in, README.cursesmodule, README.precompiled, Setup, config.c, cursesmodule-1.5b2.patch, cursesmodule.c, lifedemo.py, sedscript, precompiled/RedHat-6.0/cursesmodule.so: initial checkin, the patched cursesmodule is now part of the standard dist. 2001-08-31 06:16 zarne * cursesmodule/precompiled/Debian-Potato/cursesmodule.so: initial checkin 2001-08-31 06:09 zarne * jack, jack_TOCentry.py, jack_mp3.py, doc/INSTALL: * bumped version to 2.9.5 * include my patched cursesmodule now, together with a distutils installer * removed ID3.py, this and CDDB.py must be downloaded and installed separately (instructions included) * runs on python2 again, don't know whether it works * lots of changes, fixes -- I lost track 2001-03-14 07:32 zarne * jack_mp3.py: Why hasn't this been in CVS before??? :] - huge performance gain - better (more accurate) frame syncing (two consecutive rames are searched for now) - more robust now - VBR bitrates are now returned as a float - preliminary ID3v2 support (corrently only the version number is extracted and the tag is skipped) - new info: bpf and framesize - better detection of Xing tags 2001-03-14 07:23 zarne * ID3.py: - small fixes - replaced tabs by spaces - this is not a official version now, I will sync this with official 1.0 soon. 2001-03-14 07:19 zarne * README, jack, doc/INSTALL: - support for freedb files which have track title or artist stored in the EXTT fields - toc reading for cdparanois disabled because it's incomplete for CD EXTRA - added support for CDDB.py, available at http://cddb-py.sourceforge.net/ (currently only toc reading) this is now the default - fixed a bug triggered by tocfiles containing quotes on the file name - added support for EXDD=YEAR: ID3G, who can tell me who set this "standard"? - CRs are now ignored in freedb files - added "Sampler" and "Diverse" to the list of various artists tokens - -G none now sets the ID3v1 genre to 255("unknown") - print year and genre when finished (if available) 2000-11-21 02:47 zarne * jack: *** .jackrc option to disable http_proxy *** replace x -> × for speed factors *** sys.stdin.flush() removed, impossible :-). What's the "correct" way to flush stdin? fcntl with O_NONBLOCK, then reading (and discarding) until nothing is read? Is there an easy way? *** jack.freedb now has as many spaces in front of the MSF offsets as your favorite CD player *** some reformatting 2000-11-02 20:27 zarne * jack: 1) reformatted helpers{} 2) show_time = 1 and show_names = 1 are now defaults 3) it's now called 2.99.4 (actually since the last commit) 2000-11-02 02:08 zarne * jack: 1) renamed id -> cd_id; id is a reserved word in python. 2) ignore data tracks, tested with cdparanoia only 3) quit if there are no audio tracks (to do) 4) --abort-on-skip is now the default for cdparanoia, change it if you don't like it 5) call it 2.99.4 cosmetic changes: 1) more straighforward displays 2) show_time now saves space by reducing track_names to their number. Thus the "normal" line for a track fits into 80 columns again. 3) Show freedb-id and total playing time in Options line 4) try to show Options line when exiting "do only one change per commit" is for sissies :-). 2000-08-13 20:16 zarne * jack: forgot this one in the previous commit 2000-08-13 20:13 zarne * README, doc/CHANGELOG, doc/examples.html: fixed some strings to indicate that freedb now supports entry submission with HTTP POST (option --submit) 2000-08-13 19:26 zarne * jack: added a check for an existing destination directory 2000-08-11 03:24 zarne * jack: added WAV to the file types --guess-toc recognizes internal: progress now also takes a tuple containing the args 2000-08-11 00:02 zarne * jack: changed the short option for --update-freedb from -u to -U because of conflicts. Thanks to C. Marquardt for finding what I do when I program late at night :-). 2000-08-09 04:52 zarne * ID3.py, jack: jack can now "update", i.e. re-generate freedb files (new option -u) updated ID3 module so that it supports ID3v1.1 track info jack now sets ID3v1.1 track info 2000-08-08 08:17 zarne * jack: added xing vbr tag decoding. Not used much yet, but -g now works on vbr mp3s 2000-08-08 01:32 zarne * jack: fixed for new versions of gogo; vbr display enhancements and cosmetics 2000-06-28 02:23 zarne * jack: fixed a misleading error message 2000-06-26 16:12 zarne * doc/faq.html: Added one FAQ entry, fixed one typo. 2000-06-21 01:23 zarne * jack: fixed (cosmetic) display bug when using image-file 2000-05-11 16:51 zarne * jack: update to my current development version 2000-05-11 16:32 zarne * ID3.py, README, jack, cursesmodule-1.5b2.patch, jack_CDTime.py, jack_TOC.py, jack_TOCentry.py, jack_misc.py, doc/faq.html, doc/gpl.txt, doc/index.html, doc/install.html, doc/screen.html, doc/jack-logo.jpg, doc/requirements.html, doc/usage.html, doc/download.html, doc/examples.html, doc/jack-screen.gif, doc/download.gif, doc/main.gif, doc/requirements.gif, doc/screen.gif, doc/usage.gif, doc/install.gif, doc/links.gif, doc/links.html, doc/CHANGELOG, doc/anim.written.in.vi.gif, doc/mine.css, doc/INSTALL, doc/jack-curses-screen.gif, doc/TODO, doc/todo.html: initial import of jack-2.99.0-pre 2000-05-11 16:32 zarne * ID3.py, README, jack, cursesmodule-1.5b2.patch, jack_CDTime.py, jack_TOC.py, jack_TOCentry.py, jack_misc.py, doc/faq.html, doc/gpl.txt, doc/index.html, doc/install.html, doc/screen.html, doc/jack-logo.jpg, doc/requirements.html, doc/usage.html, doc/download.html, doc/examples.html, doc/jack-screen.gif, doc/download.gif, doc/main.gif, doc/requirements.gif, doc/screen.gif, doc/usage.gif, doc/install.gif, doc/links.gif, doc/links.html, doc/CHANGELOG, doc/anim.written.in.vi.gif, doc/mine.css, doc/INSTALL, doc/jack-curses-screen.gif, doc/TODO, doc/todo.html: Initial revision jack-3.1.1+cvs20050801/doc/INSTALL0000644000175000017500000000636210371403403013761 0ustar tbmtbm### This is jack (c) 1999-2004 Arne Zellentin ### free to use, no warranties, no nothing ### see COPYING --- Step 1 - install 3rd party modules --------------------------------------- install the eyeD3 and CDDB.py modules: * grab them from http://cddb-py.sourceforge.net and http://eyed3.nicfit.net/ Too ease up the installations, install the Python Distutils from http://www.python.org/sigs/distutils-sig/ if you don't already have them. (If you don't have them you'll get errors like "ImportError: No module named distutils.core".) * if you have the python distutils installed, simply install them (as root) with # python setup.py install * if not, follow the instructions --- Step 2 - install the jack_* modules and my curses module ----------------- * see the end of this file for tips on installing it without distutils! * if you have the python distutils installed, run (as root if needed) # python setup.py install --- Step 3 - install jack ---------------------------------------------------- Copy it somewhere in your $PATH, e.g.: # cp jack $HOME/bin or (you may have to be root) # cp jack /usr/local/bin/ --- That's it -- you're done! Congratulations! ------------------------------------------------------------------------------ --- help on installing the cursesmodule manually ----------------------------- ------------------------------------------------------------------------------ (some of this is outdated, the module is now called jack_curses) If you want to use the curses mode (belive me, you want to), you have to install a special cursesmodule. The one which comes with python has no support for pads. The improved version from Oliver Andrich is missing the function resizeterm which I patched in. I mailed the patch to the author so it may be included in a future version. Get my version on the download page or download the original cursesmodule from http://andrich.net/python/selfmade.html#ncursesmodule (link broken, sorry) and use the patch in the cursesmodule directory (cursesmodule-1.5b2.patch). You can either compile the module yourself or use the precompiled version which is in my package. I compiled it on a RedHat 6.0 (late I added a binary which runs on Debian Potato) alike system on an i686. If you want to (or have to) compile it yourself, try the following if you can't get the Makefile to work: # gcc -g -O2 -I/usr/local/include/python1.5 -I/usr/local/lib/python1.5/config \ # -DHAVE_CONFIG_H -c ./cursesmodule.c # gcc -shared cursesmodule.o -lncurses -ltermcap -o cursesmodule.so Install the cursesmodule.so to your site-packages. If you can't get the precompiled cursesmodule to run, make sure that all needed libraries are installed on you system. Check this with # ldd cursesmodule.so which should produce output similar to libncurses.so.4 => /usr/lib/libncurses.so.4 (0x40018000) libtermcap.so.2 => /lib/libtermcap.so.2 (0x4005a000) libc.so.6 => /lib/libc.so.6 (0x4005e000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000). All links must be satisfied; if a library cannot be found, ldd will tell you. In this case install all missing libraries. Some Linux systems don't install termcap libraries, fix this; e.g. on RedHat systems, you need libtermcap-*.rpm. jack-3.1.1+cvs20050801/doc/TODO0000644000175000017500000000114010371403403013405 0ustar tbmtbm#/\# TODO: #\/# - replace df call by something more portable *DONE* # - check freedb submit line-length *DONE in -U* # - get alternate freedb sites, ... *HALF-DONE, static list* # - more DAE tools and encoders *DONE* --- anything else? # - gtk-frontend, anyone? # - make toc-file reading more robust 1/2 *DONE (uses CDDB.py now)* # - make image-reader otf capable # - create a man page # - a function to query all unqueried rips would be nice... *DONE* # - preallocate discspace # - write get_toc for ogg/vorbis jack-3.1.1+cvs20050801/doc/anim.written.in.vi.gif0000644000175000017500000001326710371403403017062 0ustar tbmtbmGIF89aX‡˙˙˙˙˙Ě˙˙™˙˙f˙˙3˙˙˙Ě˙˙ĚĚ˙̙˙Ěf˙Ě3˙Ě˙™˙˙™Ě˙™™˙™f˙™3˙™˙f˙˙fĚ˙f™˙ff˙f3˙f˙3˙˙3Ě˙3™˙3f˙33˙3˙˙˙Ě˙™˙f˙3˙Ě˙˙Ě˙ĚĚ˙™Ě˙fĚ˙3Ě˙ĚĚ˙ĚĚĚĚ̙ĚĚfĚĚ3ĚĚ̙˙̙Ě̙™Ě™f̙3̙Ěf˙ĚfĚĚf™ĚffĚf3ĚfĚ3˙Ě3ĚĚ3™Ě3fĚ33Ě3Ě˙ĚĚ̙ĚfĚ3̙˙˙™˙̙˙™™˙f™˙3™˙™Ě˙™Ě̙̙™Ěf™Ě3™Ě™™˙™™Ě™™™™™f™™3™™™f˙™f̙f™™ff™f3™f™3˙™3̙3™™3f™33™3™˙™Ě™™™f™3™f˙˙f˙Ěf˙™f˙ff˙3f˙fĚ˙fĚĚf̙fĚffĚ3fĚf™˙f™Ěf™™f™ff™3f™ff˙ffĚff™fffff3fff3˙f3Ěf3™f3ff33f3f˙fĚf™fff3f3˙˙3˙Ě3˙™3˙f3˙33˙3Ě˙3ĚĚ3̙3Ěf3Ě33Ě3™˙3™Ě3™™3™f3™33™3f˙3fĚ3f™3ff3f33f33˙33Ě33™33f333333˙3Ě3™3f333˙˙˙Ě˙™˙f˙3˙Ě˙ĚĚ̙ĚfĚ3̙˙™Ě™™™f™3™f˙fĚf™fff3f3˙3Ě3™3f333˙̙f3îÝťŞˆwUD"îÝťŞˆwUD"îÝťŞˆwUD"îîîÝÝÝťťťŞŞŞˆˆˆwwwUUUDDD"""!˙ NETSCAPE2.0č!ůF,XüH° Áƒ*\ȰĄĂ‡#J$řOŕŠ‹3jÜČąŁÇ CnüW€ČVđäˆĎĘI’0cƜ)sI‹+1˛ŇwŸË@úVęcő’&LpHÂ´YrcË÷\FÚ’ŞžúŹüă§ŇŠËU­ÜËřTŹWFży{Ė­7pF™ą̂ő^žv˙1ýw7PżýXýó§ŕřůëç/Ć@z Ôq&¸ľ¸iÖĚśܚ7Mn$ĚĎ_>~ülľHŤËđa]яäź_W@śšöę‘1żuËź­¸ńmÜuűşéĆ}Ľ ›f}śkÖZłÚˇűúĹÝű°W°ú­1řpnĹ׏ьžxňnłbĘ­ŃĘâ{ŤSĆţO,lٔeŐ]EFŮx•‘$qëi“̓ڰ‡œrŸEćÜhŚFkřőg˜>ú4ććށäeDŇe :řŕG@¸rÝxFŇ|9ĺ¨#G ˇ d!$6Řiäď1gá\!ĽČ~;ęHf2Ôce=öäp͕W’Ąœ77†v’Vú˛>ů\TŚJQ‚ô85r“•öŘSOŘ`Y'–ڈŁH˛‘؏}$ň“?mş ç#ĹQe=@y+AFŸpý)’^OŠg+˜heÂuƒŢ@ÔéŔ5ű×ä€eŇč sšräŐX6év ü•X)Ë&T9žéŠŰʇ–D:PçrScŚbz$ŘWűœÔ>bńłŽş…e=AůŇeçmŁ ݞ[OŮhSܗÔ^Čњ9Žť‰?…—Ó›łÄ™l6ËÚsOńÎč˜Kš”XPßŰF§í„QOŹ<żŸţ“ńEź˛âÓEőÚ?jĽ‹*—°ÎřŢŹa:GŇXZu­F-ćńEůӘ¸°AśÔU“äkL'ƒ3ËąÄmł–őĚا7ł|öç>ł}(ž¨Íźľw!şBc”éŤ/S.iĽ—Ú V§ŕŇéva§ îŮ}9‹’ “źS݌‘Vţ<9ŮŮfMYÍ:ő—Š0}÷y›uÖ ŐxçÝ7V˙ôö5]$7^™ţ^öĆ;_îUén7žôą5ś>9ĺÍÍuŐ_lú­ˇŘhŢsŐj“…;:š^ß33â]ËäřęŢ$Ÿü,UĎTkç‰˙ş‚aü`¨đ[fř łˇf˝_¤“—óK“_š|ŐŞÉJšíÊô=uţ•}[ ”ýP F bƒAüŠćŠŁ R¨ˍę€h) —’>:đĹČ'HÁ ZЂ¸ 7ČÁ !ů,=ü˙ HœA‚ üÖ*ŃŁ‡źSˆœ DˆqŰČíĄDŠ˙ä­ň‚¨L™m(QvěöMĄ+çŔőóžÍęÖ âCţŢÔ§Đ<ó€SŸ7ü%čM€ö%dĐ7ú-(á,ć4„úQHáyVtH!ů,=ü˙ HœA‚ ě'¨‹2ˆy§Ą?RŞT9$C&ŃŁG+ţ{ÖŹ™3gŞź”Yšícˇo Ť<™™2Űrr{ôĄź™4Uş‰S'O˜éÍ<6*ŁŞFŽVj[cÔŰŔg3ńüqzh G ˇíěů訌¤HSĺފöěľěfuPU(ÓBÔöm\ą ÁY:c#5dÜŢ#c´¸ŸÎžIĆJj•#5cîÝËą†*7şßOŽöl•*RŽĺӋ'ůô^+÷şPüš^éUŔů'HîÝbéÎřŒ”ž|úíăP>+]rňö†ÔwééTÓ=ˇ˘†›yžŢfQh-žę6đ™OD˛kg8žIůęäĂ÷lŸä@ýçýӞ őˇP@!ů,=ü˙ Hœ?p*ŘO>@ÇH]äoaÂ~öě!EŞYDŽĽ*ZˆŁłf(S˘$Őo!˘@ŞTĘlćŹfK‚ŹJŠŞyR%ϟ"˙+Uóبc?yEĆá?V5‘áÁƒ4ŠłcxFńźůs”VŤ5˝ţü7ŹYŤŕŹý|vÖ۟ik>›;×­\ˇtß:3(wnľź€éÂŤip•aş˙>ƒ÷ʚcŔŕŔÍe57že˕ç.hąŔgŤžAƒ&/žźÓОąâÇ/ž|ůAčeÓňŹéÖ-/őŞ}ísúŻŤ~óvœˇźgóúkŐ*9szôš[;­{Ą?uÖçaĎÎÜşĹŮłŤSGO`úöç˛˙O]üóÄ-!ů,=ü˙ Hœ?p*ŘOО+WôéŰ×oaÂoú F t%ŠfŞ*ZdĽ")RšŠTůl!IA÷í[Iәłj  ¤/PŠÎVľéĚÚ@p‚v’DЍSdŁFĽ'°UŇ@zňsJ'}‚*Zt¨ ŸŽX5#ĺ,ŢBD{8räĎž@,ľLŘ ËǏ'éŰGjŸłf:YŽ&–=|hŇTEŐ٨QHuL$U*H~I­âé”Ôĺ?~‚öĄuUXWĂţóçŒßłş4ÝžÝë œľg`śëLUŠ˝wu‚“'XđŞUwU­bőěnĺĘIçYÓy™ň*Aü _ŽvYçźy‚I?ƒU?V_. ŽŢěgńúőc íY5ݔK /4yČ+Żj-Żwehçů.OžľćŹXľbeW^ĺjEôZŤnݚľÖ­tżf…<ŢR‚ĐŽ›ˇ6Oˇ:pŕt_—ˇPłůÓ˙Đ# :ţügŃ?§ŃŁN€á)HĎ<á8€ (á…!ů,=ü˙ HÜ7p*čßž+XŽ\4kaÂo‚ź`‰(ąŁ˙y”1˘žŽőő[8 ˘’XźčŰČGAűX]LôҋO’‚ö< Şo)kÁuKÄó§ 5ů2ęĚŮŔYÝ\"ňrĺ)ĐŻ¤Ş:‹'ĐŰŁGúňœÜ#ˆ? üHkUiV@yą]ĺlISĎčV5Ř­›#YŤHíă'v•ŰŔ¤řţVř0bUŤži^•ŮYdĆUçóćM–iY¤4k†Ćę™_ÍbE—>}ůY5ŰŹˇb•›1ÂYłhËR]­š~ΜÉ]ĺĚ Ď 2Ҏi´j•޸Ÿą ŽdˇŸdŇęsËńŞg ?[ĺďâe kŹXÉçHÖgаY­ÚWzŹL dVóUşZlVŹŹzűs—|€Dˋ÷Ě÷hş$ms›N&ŸžRŤ É{ś˝9čZłl?’Šďú*kÖäɃĆü™Ő¤áťÉď†(9+čŐǃ–ŕˇđĂy3Ë,ß4O~ňřӀ ~S =ô g‚UF ƒŠCĎ<óĐ3RR•„~¨AďU!ů,=ü˙ HœA‚ üć­Űهź}Sˆœˇ‡Ü2rK”Q˘‰ż9̸­dÉDd jĽPä#n&טTƒ‘Ę~G–\łF›Ď5eȤT ňŸĹ—;}fËć3čP•஠¤ę‘l@źhőŇEĽ œ˙>’aŻlŮ@Vʏ‡/_U*Y˝ČŹY{h×ⳒĐŞ}‚žÔIĆ.lG‚°ľrhŐłgʜcŘ ć6mee9„íYą;6Řв6˛+6˸gő,YŐ ś¨s łiďuq-+žě¨łJďD˝ŸŢńb?[(Ö2™˛jťpCî[ž@pÁunSťV ˇnJŻĺ=ŤV0űKn]ÔryÔ͛,kÖäÍCř-ťCˆě%~ƒo­eđ†ÝŘŢ,ßČâ?5ËŢ4ř̓ôD•ŕu VHŕAd„!ţa10/20/96 Nick Purvis (rage@geeklab.com) Copy freely, but do not modify this comment. I like vi.!ţďThis GIF file was assembled with GIF Construction Set from: Alchemy Mindworks Inc. P.O. Box 500 Beeton, Ontario L0G 1A0 CANADA. This comment block will not appear in files created with a registered version of GIF Construction Set!˙ GIFCONnb1.0 ..C:\WINDOWS\Profiles\rnixon\Desktop\1\back.gif++C:\WINDOWS\Profiles\rnixon\Desktop\1\1.gif++C:\WINDOWS\Profiles\rnixon\Desktop\1\2.gif+ +C:\WINDOWS\Profiles\rnixon\Desktop\1\3.gif+ +C:\WINDOWS\Profiles\rnixon\Desktop\1\4.gif+ +C:\WINDOWS\Profiles\rnixon\Desktop\1\5.gif++C:\WINDOWS\Profiles\rnixon\Desktop\1\6.gif++C:\WINDOWS\Profiles\rnixon\Desktop\1\7.gif++C:\WINDOWS\Profiles\rnixon\Desktop\1\8.gif++C:\WINDOWS\Profiles\rnixon\Desktop\1\9.gif;jack-3.1.1+cvs20050801/doc/download.gif0000644000175000017500000001314110371403403015217 0ustar tbmtbmGIF89aƒ(ç4n‚œBl>b|şÂ̎˘´2RtVrŒ~’Ź6BdRb„FRt"L 2TڞÄÚâ䎖ŹĆŇÜvФ&Jl–Şź>ZtfrœJj„Rj„6JdBZ|&:d>Rl"LJb|bzœ:T^jŒ.BdžĘԂšŹFNtš˘´^r”ŽžŹ6JtNZ|ŽşÄ~Šœz‚œ†’¤ *LÖÚäNbŒ–˘´2VtîňôžŞźRn„ĆĘÔ&Bd2T.Jl:R|>Jt "Lęęěfz”FZ„*TJf|:d^v”–ž´śžĚ~ޤv‚¤Fb|Vv”NV|ŽšŹZn„.FdŽžźJ^|ŽžĚ2d.NtÂĆÔ’Śź2R|~–Ź>FlRf„FVtŽśÄŇÚázޤ>^NnŒVj”>JlÂÎŘ6Ntz††–ŹŢŢ잮Â&Fq2J|:V|n~œ.TFf‡In†¤žĆӒ˘ˇZr6Fk&PzŠŹšŽźNj”VjŒF^|6>dNb„Šš°šŚź’žłÖŢ䖦šţţüÎÖä.>d.TŞśĚęîô2dFl6Nl&>l>Vtb~” .TNfŒĆÎŰ>Nt &Nf~—F^„>jLŠž´2Tfvœv†¤>Nl:d^rœVn”^n”.FtN^Œ 2d>Z„&BtFbŒFV„.d.d6Rs‚’ŤVbŒ"TŢâězŠ˘šŞźNj‹FZ|ÂĘÔbrŒ˛şĚ‚ФВŹ6VvVnŒ2JsNf„bv–‚ŽŞZvŒ’š˛^nŒN^„˛žĐVf‹:Nt~†ĄŠ–­˘ŽÄ>V|r†œÚŢäžÂĚŞ˛ÄĘŇÜ>R|’žź6R|‚–ŹžŚźîîô:d2Ftn‚¤BtŽ˘źVr”6BlFR|Úâ쎖´&Jt>Z|RjŒ6Jl>Rt"TJb„^j”.Blš˘źŽž´6J|NZ„ŽşĚ~Ф *T–˘ź2V|žŞÄRnŒĆĘÜ&Bl.JtęęôfzœJf„:l^vœ~ŽŹFb„Žš´ZnŒ.Fl2lFV|ŽśĚ!ţMade with GIMP,ƒ(ţSˆSĽ†;ƒqĚĹ1ÇOwĐĘůńłPą8qz1qh‚Iš8ĺ ě‚>wĹ$–Ó×'˘BƒU\U‰Ă§ć“8OjÄGŸľžeˆńŃç‡Iݐ}üícÂbkĚ,xĐ]… FœXńbƍL=ŇS` 3ţő8˰œ@Ď {ä1ɈL˛ůLbŒS ˘Áä"N7$’A7żłĂŽŕt“OmźrÁ;őt“)x82I71\PĎ$yˆb ,“Ŕb,ĆŁ…;@É7ŕh N=⌸ǒ >á„^˜á†~∓”x˘”äŔŽ€L˘Ćj$!Ç+âä“â$â@2$;¨D@!Ž8:&’.yÔs xř™ő\K=b,T°¤?ţ舓ţy4:b7;P)ŠPjŠ#őŔ˘†1ŕ!ŽSŕ2Ɣh †ůŒé' ‚j舉.Ú裑NZ饔 ĄFô!jŠâx‘G7^xĄÁ ‰¨ąˆŕŕŇî$¨a̲żŠ˘A73LĄĂ€^pK0őt"Ç;×ĐŹ8Ţ<éĹ5őxĄF7¤ÔăÍś JJÄ6ÚͲ>1 k¸Č$Ó~źČÝt#舚‹Žşěş ŻźjĐk/žˆÂ& 0ńGwČፕ´lhŠC‚KS3Ĺ7c´h ĘőÔ3…-™ž’„€Šc ˛…LÁŒ˘¨QíŕË̸X(Î;ď( Ëţăw‹Ŕ˘ŕĆLÁr–jä1Ŕ=}´Iű8mÓOG=uŐ¨\Ą#‘„BIYqř‰JÎőIĘ鶜‡#Ţź’Ë™“´-JŰÎ`<1ޏvă 3“R5´v™ˆ0L^Đ)Ć "O;3Ă7LźC"ŕ ˛H7PNR8Oęúq7yä"d>݌ţ˝ˆjŒ>IéÇŁ6řŹťťě×Ţ@›œńą:bŎč„ßźńŽNhˆőÚŽ!9|ÁmÓ@@"‰hâpÄ+‘[ĎPł‚1€ akĚƒ<„1 'ŐIg3†Ú…‚q" Ěř4Đ Lx# ţŽĆ xIěŔ˝ËńF@jP Á)|âsȐޕłFé @¸—˝”ľ@ÂdœÂŹŕ…|ěŤ`ě†pQ˘$^ă¸ĆÄ1 }Ąźă Ž˛ä ćC çHáŞfĚ@ ΘÂ9ŔĄ,‰ÉˆÍ[Ä ĐłmqYFd›Ŕ(F4rɌŚ<âŘHŠ!lbqx@ꑢ}5đ("3œ! H€#KÉʃ'’tHČ€“˜˝¨ÔŹ<€CĆđ‘ÄfŔ2/´aěÄĺ2­–@¸ŔřŽ=`/âřĹ/bDoŕĄpňÇúÜDKHu㖹ţœÄ.{ůK4ęj˜ő …ŒI {P\UpcĘČ KŔR˜€ —ˆćÝkÇBTĄšĽämŽ-ô†ƒžY/X´ d¤h[=Žq<´c︇#Ś€ƒD`óVOÂ6pq3 ÎWŕ0Ŕůa(ąmDn¤•šˆ‡ÚH˘ľ¨Ś1yîaŁŁˆ>P’JëĂఙ=lqGżZ8v°˛DT­^žąř€MĄ]żşšĹđđ ÖC śh.ې5bĄân(—Ú! €ČÄ]§ F5˘˘Ÿ4”!ŠVrDő+YÍş˛` ~€ƒŕ0˝ˇĂ Cŕţ ˜0]Ŕ]xÄ n0‚XÄb€Ç ú_q`"Ř) ƒŃ‰| S¤8ÓÄ>T“†3@ŒĹ˛–Ž wxÇ+:щ\ˆ‚@ČZŠ ˆö‚ůČC–D”đCwĹ&”5ÚÖˇ”ň°şü"Ԁ{  Ü<Ă”(¨9ţŔ„T¨âČÜű‡gtĄ‚hŻ,Ái8ÁKt›.Ę8† ¨ {jÍÜÝHŒ[€AĘZ[ŐŔ¨-k‹ő Ő!Ďp Ŕ˝ÖxG  _5D,mȇ-|ä. uĂWGÄŽáTľ¸2Zę F1.t€ B4bАeţ†Äa%Xˆ˘ îmĹÔřń 2,xßĐ.p‘‚o|CcÇčśĘ2î`¸F.PŮ3H¤`ŕ…‚Ą+qä!ď8ˆ€‡$lїżâƒ{Ÿą$5Ź˘¸ŔęŢ/䃯ź",\$ĽE8ălcȝůÁk÷&C{ţ.žA‡u˘čE„Q‚čĽ(ƒ{Ëŕ…'Á+îÄŕQŔ'•‚šű”Đ)bŁ\ƒ0J¤p3c )C6˛´„ěšQĚŔ?҄%Á˝ľ€a"œ‘qAad3v (”" )€D pĄ‡”˘N@Qľ'ą˛š— °ŕv'ţžÔSôƒ 0 Ć4Ś!‚–o€p/>ŚŔći` Ÿě•Ľ…—"R´Ŕ„z˛Žî â…(€ ŒO@ťĽ(Ö7ć0‡A\mŕ.ŽÎĽ´Â˝|(ÓŻFdŒ<œ Kž8$€=–ťüSĐ)ÚĐ Ă5Jpypo,–•%c0ăRBţ mHČćpŻ%raĄ,\ƒî D‚‡$ Ţ˝óp@.ź0€>Œ€ žĽ‚+ ů†XŔ㠎ƒ ÄŕŰX˜břC &Á‰B"† FŐí÷ş`R{¨‡°íŢźaçgĘ;FůGÔĄ‚_ČEVpű@Đ@ď”OR•ţAˆS ŕ|`Ł8މŮ#ˇ÷DʇŕÔŔüöFǰ} Üą‡}ř ˝$đFˆPÐ íľ›%!ĆĎđÍyí@€rqś(jí%đ bĐ^#€=NV}éĐŘ^’P/ů` ˇg Ř^âpđ ń02Eőđ× J5˘v~w“y ŕ°aí „RíĹP€L’ŕ^°yw„erŐ 8ś Ř×p ‰ç‚°Ôŕ^4ŕ u"míŐ ÂŔ ˛…BpˇP}+@Kí÷×Ŕ Jŕ^ ŐW\‚Św„â+¨E ţ–đŕ';PmDĐpÖ^. hR&FP¨ŕ^…@_jŕ^XËŕ^˘ {y€Dŕŕ&$ŕ^] "Ľ€íÓóuí…”Ô~†đp‡Đ^ó°  ؈őŕ^p`v[ŕ^$ă'zXŕí˘ö9CŁThtj€‹ďđ Cd4ü÷ďsí• ™ć y@|Ń {đƒĐüЂí%yđßi“ ť@7Zč^0uň8 )ŐˇŒâ€šĐ{íőWF PF’đĹÇmÚp„ˇ x zx d"IP_€ Ž`ć, Ć0¤đîĽţĚ Ş’ ůp‰+°˙†mŕ EÔ~ŕ™ć^é pp”íő“gž ° h(đ”B¨;)yˆ˘w ZHŕ^Ođâ°k0 †`Jč‚ő` ʸ>‡ä^7ŕď’)€SŔ L€ 5P–†S"⠏­ ;˛#é^Š ĂpFĚ@Ř^% č@‹\𠁰 ťŕ^ţ@Ńŕ ű°ţŕGŕ2'0Šíżľŕ^d 1 Œţ`*é^úŔ r úP+zX&ʸV°€™G¨ţŔţ°)C@˛:fÇm5ô…ďĺ.{p D€ŽíŐ%™ţŕš“ű0 ü' ؐE“v4°@Ŕ,‡si¨ż üÇ(ŕ•Ä  ŒŒ“8‹Y‰ŔI٠÷ öD€GĘř%äÓ€ö°BĹŔ }P _Ě /Q‰Nŕd dîőˆrŠíU°úY}T ˘j°î… \0ü`„Čę ţ°ţĐĄ/’—˜ŽP›é8„í ď°pŕŕî•z„ňî%…¤`íE ' S# {   Ć0Š0€đ(Ŕ2Ę!ßŕť` 0ʁk5“V ď "đǰů AňÚ ţ›Ů^Ńđ ţ°Â…ť 8Ŕˆ˘ć­>ĺŕ^6 +s  Qä^†p j Ę)#ąŔ1OŘ^p0“;0¸ŕS`RP ŕ j ńÂV젌˘q0X"ZnÁP}|đ1đp„cPTgňŤíő3 œ(„ a`Œíĺď”7Ú^Dđ “`(°/ŕĐ~ąPQ‘8Y' ˘íepP}íeB€î—Ř̐¨:` x› {ć ä y†0E°¸ŕN°b´"FÄjć`8ő ,jp óŠcĎd„­p"*Ú°eđ‰ Řţ¨‘ˇYß  ˇÇVşˇ0=,Ă4`L:Żk ű¨0  ˆďÖ.9@ëŕ0`ú&¸ h•¤Vż¤ŕ°ɢ+O ‹ @xPůP–ŔŢđ"ˇp“0` ţP š‹ aä%̰V;  S7ÔsD~–ţ0%čđ “𠲸r°lf–$ŕşľXű+îň ÇQ;’ŕPd•§Ő‘CČ ÂPŞ•śV0ŁĐ~đ hp#âpÚMç ;ş5WQĎô S@ ŞÖ…wp‰ö uˇbPِ%°Y`x°a€rŔ űPę$)âţ0ťő@ďşԛCŚ¨^ Ů *)!@„ÔĂ0Ż °`oüŔşŽË‘–<<ş57=Ev)cŔťĐíŔ ŀ qŔE5W ~w/R3ÚŁ49h0`gňˇ–şŕ ežđ ŕ  < 䐓1€żĆ@yxłu›x Y€c<€ X 5ż€%)zßi/“pâ0s` ‰Ę˝É1˲#Ü<%4hĽć#9řrđŔer/;0Ó€ &żn0 Ÿƒvqő€7ŽfxĆđ%Z' ;şčuĆS2Xňˇ_’Â0)Yƒ CŔ‚y°2ţ'Ŕ  Yâ•Cs°1ŕĆ@02°@0c ž°$ƒ;PŔc-6 ű6hzĺ7ľä'Âđ ZçKĚ §0ßgr`@đ `ŕ ŻL)Y"B¤0)ÍҖĎÄ ZP'h‚–%`˘(őKă+  ‹‚@wő4¨0„EüL}Ć Ľ(SňžŔf\bˇ9Äzť#jœp#—NŻËbT/ľ\(T 8ťËŁ´‘@.q [2%e,úVbpoëăMƒƒ(PpĆvŁŁ{ @„   Áŕx°ě¸#0ĆÁŕ'X[xŔ šP>QtGŠZ'PrËŤĂĆ Pŕ ôĐţ–şť#h$ă%‹€ĎtŁśź6ń’‡6¤#€9ĐÂ0”0 L[c„(rŘc1' ĆŔŁ ˘ż F´gSp/âY ąJsĆ!/–Rd~ˇcmŐ_ԃ=)rŔ spXă ŁJţĐČîä°ŕ {Ő´{/vrÔIí œŔÔe$şőĄÉRՓ/=°R łĐ„@A Uń„”0đŘC€Ó Uڇ ‡ö ƒ0wpƒ܀]° ڔ%ËilÔh0ń´Ch€ń ‘ŕ•@öŕ-Š „0Ňţ}‡ Ý@m–}ÚAPٍP٧9 I›ýŮëŸ0 ńPÚCpځG Š t° ô ŚńPŚĽŔj€C`T…„ЕЧPّ°Ý@ýٍ`› ÝĆxŠ0 Žd:i•@՝´Ń 0á@°Ú5˜'„ ŤĐ‡R ¸ŕIť n0C` ”‘pVpˆ&ń0 %ţ ŕ>nŕ^ŮëŔŕöP ŔĽhf„áx’ń ŢRЕMl`ŮŽ ߣ`Ąx ĐáÝrŕJR° ‡đń,ŕ-ݛG83SáŚć9`î]ć„ĐĘéڇ ŤĐ}žC čt@Ś@çÝ˝âCĺĆޛâ–^٧ ßë}ć.›Đ;jack-3.1.1+cvs20050801/doc/download.html0000644000175000017500000000732610371403403015426 0ustar tbmtbm Download Jack

Download Jack

Jack
Description Version Location
upcoming version without up-to-date documentation, read INSTALL! 2.99.0-pre jack-2.99.0-pre.gz
upcoming version without up-to-date documentation 2.2.5-pre jack-2.2.5-pre.tar.gz
buggy version without up-to-date documentation 2.2.4-pre jack-2.2.4-pre.tar.gz
interim version without up-to-date documentation 2.2.3-pre jack-2.2.3-pre.tar.gz
old version without up-to-date documentation 2.2.2-pre jack-2.2.2-pre.tar.gz
current stable 2.2.0 jack-2.2.0.tar.gz
older version, small bugs 2.1.0 jack-2.1.0.tar.gz
old buggy version 2.0.1 jack-2.0.1.tar.gz
buggy version 2.0.0 jack-2.0.0.tar.gz
older version 1.3.5 jack-1.3.5.tar.gz
older version 1.3.4 jack-1.3.4.tar.gz
older version, known bugs. 1.3.3 jack-1.3.3.tar.gz
older version 1.3.2 jack-1.3.2.tar.gz
older version 1.3.1 jack-1.3.1.tar.gz
current BETA - -
current ALPHA (just the script) varies jack.gz
cursesmodule patched for Jack, includes precompiled shared binary 1.5b2 cursesmodule-with-resizeterm-1.5b2.tar.gz

Wanna go home or on to the installation information?


© Arne Zellentin, zarne@users.sf.net
(changed: 10-Jan-2000) jack-3.1.1+cvs20050801/doc/examples.html0000644000175000017500000000746510371403403015441 0ustar tbmtbm Jack application examples

Application examples

Jack
  • Insert a CD, fire up jack:
    $ jack
    
    Now watch it work. It's fun for a while. After having finished, you have the follwing files on your HD: track_01.mp3, track_02.mp3, ..., track_nn.mp3 plus jack.toc, jack.freedb, jack.progress. The last three are used to store the state jack is in so it can resume work when interrupted.
  • Jack will create a directory called jack-xxxxxxxx for you, there it stores all the file for the CD whose id is xxxxxxxx. After a freedb query this directory is renamed to something human readable, like "Artist - Title".
  • When jack is interrupted, call it again using the same commandline as before to resume work, in this case:
    $ jack
  • The WAV files have been deleted. If you want jack to keep them, try
    $ jack -k
  • Now let's try a freedb query:
    $ jack -q
    when succesful the files are now renamed to something more readable and have been ID3 tagged accordingly. jack.freedb contains the queried freedb entry, the original file has been backed up to jack.freedb.bak.
  • The query failed? Ok, contribute! edit the freedb template:
    $ vi jack.freedb
    Note: the DTITLE should be set to
    Artist / Name Of Album
    or
    Various Artist / Name Of Compilation
    when adding a compilation, use
    Artist - Title Of Track
    for the track titles. Do not delete any lines from the template. Do not change the numbers. Yes the TTITLEs start at 0 and end one track too early. Read the freedb documentation.
  • now activate the entries:
    $ jack -R
    now the files have been renamed and tagged. Check the names two or three times. Typo made? No problem, you can alway undo the file renaming with
     $ jack -u
    Note that the ID3 tags are not undone. Fix the freedb file and again, use
    $ jack -R
    to activate your changes. When you are sure the freedb file is suitable for submission, submit it (via e-mail (option -m) or via HTTP POST (option --submit). When using the former, sendmail must be installed and working on your machine! If you're on a dial-up, you can use the -m option to queue submits, provided sendmail is set up accordingly):
    $ jack -m
    or
    $jack --submit
Those were the basics. Now some more advanced examples:
  • All in one: query, rip, encode, cleanup:
    $ jack -Q --remove
  • query any time while working:
    $ jack
    and, from another shell:
    $ jack -d -Q
  • query for unknown MP3s:
    $ jack -q -g track_*.mp3
  • rip from image, first, create the image:
    $ cdrdao read-cd --datafile data.cdr data.toc
    then make MP3s from the image:
    $ jack -f data.toc
more to follow.

Wanna go home?


"All trademarks are owned by their owners" or whatever I have to state.
© Arne Zellentin, zarne@users.sf.net
(changed: 19-Aug-99) jack-3.1.1+cvs20050801/doc/faq.html0000644000175000017500000000623310371403403014362 0ustar tbmtbm FAQ for Jack

Frequently Asked Questions

Jack
  • Q: I'm compiling python 1.5.2 from source. What modules/options do I need to use?

    A: Use the '--with-threads' flag to configure, and make sure you include the termios module (which is disabled by default) by uncommenting the line:
    #termios termios.c # Steen Lumholt's termios module
    in Modules/Setup. Jack 2.x doesn't need the threads any more, but they are still good to have. Only leave them out if they cause trouble. In general, I recommend activating as many modules as possible so you don't have to recompile every time a newly installed programm needs another non-default module. (from Jason Lunz)

  • Q: I can't / don't want to install python-1.5.2. Isn't there a way to have jack work with an older version of python?

    A: There are bugs in the python-1.5.1 modules that prevent jack from working flawlessly. From memory, the urllib contained a bug which prevented freedb queries from working from behind a proxy. The wave module did something stupid, too (it is needed for ripping from an image.) If you need neither, try it out and tell me what works. Otherwise you may try to replace these modules by the ones from the python-1.5.2 version. Again, please tell me your experiences.

  • Q: Jack is encoding with a different bitrate than specified in .jackrc. Why?

    A: The bitrate is cached in jack.progress. So if you encode track n with bitrate x1, delete the MP3 and call jack without specifying a bitrate, bitrate x1 is used, regardless what the default in your .jackrc is. Specify the wanted bitrate with -b.

  • Q: I want to use a flat local cddb directory. Jack wants me to use subfolders like rock, blues, ... . Can you help?

    A: As long as nobody complains, use this workaround (sh style):
    cd [your_cddb_dir]
    for i in blues classical country data folk \
    jazz misc newage reggae rock soundtrack ; do
    ln -s . "$i"
    done

Wanna go home?
© Arne Zellentin, zarne@users.sf.net
(changed: 19-Jul-99) jack-3.1.1+cvs20050801/doc/gpl.txt0000644000175000017500000004313210371403403014247 0ustar tbmtbm GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. jack-3.1.1+cvs20050801/doc/index.html0000644000175000017500000002105610371403403014722 0ustar tbmtbm Homepage of Jack

Jack Logo

"Why would anyone need another CD ripper / MP3 encoder frontend?"

If you just need everything that is new, download it here. Be sure to read the system requirements. It's quite likely that you do not have the correct python version.

News:
10-Jan-2000 New Version (2.99.0-pre) "ain't it dead yet". I'm about to do some major restructuring on jack, i.e. breaking it up into modules, so the installation has changes slightly. Read INSTALL. Cdparanoia 9.7 is now supported, so is xingmp3enc (the latter being untested). You can now use a local freedb dir. Yes, all bugs fixed, especially those concerning the image-reader. TOC file reading has been completely rewritten, it is now 100% bug-free (as if). Please, everybody try this version and gimme some feedback.
05-Nov-1999 New Version (2.2.5-pre). Still no documentation updates. Fixes 2.2.4's renaming bug. Doh.
04-Nov-1999 New Version (2.2.4-pre). No documentation updates (again). Two bugs fixed, one newly introduced. "desperate" mode for those who can't get curses mode to work. Jack now has 3333 lines of code.
04-Nov-1999 New Version (2.2.3-pre). No documentation updates (again). Reintroduced free space checking by calling df for all those (RedHat?) users who had an error with statvfs. Whoever built those rpms should be punished. rename_underscore has been replaced by something more flexible, now you can replace characters by multiple characters (like "ä" to "ae"), kill characters from the filename to be used and, of course, replace those spaces by underlines. New DAE tools: cdda2wav (finally!) and dagrab (untested as it doesn't like my Plextor). All bug fixed, of course.
22-Oct-1999 New Version (2.2.2-pre). If you get an error like "AttributeError: TIOCWINSZ", try this version. It is shipped with 2.2.0 documentation as I didn't have time to update it yet. Changes: all bugs fixed :), new features. Wait for the final version for details.
19-Aug-1999 New Version (2.2.0). New curses mode, looks much better, scroll through the status screen if it doesn't fit in your terminal. I recommend not to use XTermset any longer as it is no longer needed. The usual bugfixes are there, too, check the changelog.
18-Aug-1999 I really want to add support for the Xing encoder. Does anyone want to pay the registration fee for me? It's only $19 I think.
09-Aug-1999 New Version (2.1.0), all bugs fixed (of course!), new features like on-the-fly operation.
19-Jul-1999 Big OOPS. Version 2.0.0 contained (at least) two "brown paper bag" bugs: first, jack tried to chdir into newly created dirs twice (one time too much), this gets you the "could not create or change to..." error. Second, the dirs were created in the wrong sequence, so instead of "artist/album" you get "album/artist". Upgrade to 2.0.1, get it from the download page.
16-Jul-1999 None of the beta testers complained, so I released version 2.0.0. Much has changed, most notably I restructured the beast a bit so that Jack no longer needs threads. It's now much easier to get it to work. Jack should (finally!) run on FreeBSD and most other unices. Jack can now create (and name according to freedb data) directories.
01-Jul-1999 Released version 1.3.5. Support for tosha(gettoc&DAE) has been added, a few non-critical bugs have been fixed.
29-Jun-1999 Released version 1.3.4. Version 1.3.3 contained a bug where it could wrongly claim that you inserted the wrong CD if track 01 doesn't start at block 0. The TOC file format changed, too, so better have them re-generated.
27-Jun-1999 Released version 1.3.3. see the changelog for details
rearranged the pages a bit. I know the layout still sux, if you have time to waste, let me know.

What's it all about?

Jack has been developed with one main goal: making MP3s without having to worry. There is nearly no way that an incomplete rip goes unnotices, e.g. jack compares WAV and MP3 filesizes when continuing from a previous run. Jack also checks your HD space before doing anything (even keeps some MB free).

You can take a look at jack working, there are even some explanations.

Jack is different from other such tools in a number of ways:

  • it is written in python
  • it is very configurable, maybe too much :)
  • it doesn't need X (but is better with it)
  • it can "rip" virtual CD images like the ones created by cdrdao
  • when using cdparanoia, cdparanoia's status information is displayed for all tracks, so you can see if something went wrong (I consider this very important - no one wants uncorrected errors or skips to go into one's MP3s. 'Tis the main reason why I don't use something beautiful like grip)
  • it allows for overlapping ripping / encoding: when the first track has been ripped, it's encoder is started as well as the second track's ripping process, this "read-ahead" is of course configurable, you can have it read the whole CD and start with the next one as the first one is beeing encoded
  • in on-the-fly mode, no WAVs have to be created, less space is wasted. I only recommend this if your encoder is nearly as fast as your ripper.
  • it uses sophisticated disk space management, i.e. it schedules it's ripping / encoding processes depending on available space. Jack tells you if the batch will not fit on your HD. If you want, you can have it choose the optimal sequence of tracks - great if you're low on HD space
  • freedb query, file renaming and id3 tagging - I know that this alone is not special, but jack tries hard to recognize artist and title when working on a "Various Artists"-CD, so that the ID3 tag can be set correctly.
  • it can resume work after it has been interrupted. If all tracks have been ripped, it doesn't even need the CD anymore, even if you want to do a freedb query. In practice, this means that you can change the CD and start another instance of jack.
  • it can do a freedb query based on MP3s alone, like if you don't remember from which CD those MP3s came from.
Of course, all other "obvious" features are included, too:
  • being GPL'ed
  • different rippers and encoders are supported
  • freedb submissions
  • proxy support via http_proxy environment variable (e.g. export http_proxy=http://cache.sld.tld:3128/)
You may want to read more on intallation and usage.
Because it is not just "point-and-click" I put up some examples.
Perhaps you want to know what Jack has todo.
For your amusement, read the FAQ!

Please send feedback to the address below. Yes I wanna hear about all the typos I've made.


"All trademarks are owned by their owners" or whatever I have to state.
© Arne Zellentin, zarne@users.sf.net
(changed: 10-Jan-2000) jack-3.1.1+cvs20050801/doc/install.gif0000644000175000017500000001036410371403403015062 0ustar tbmtbmGIF89aW(ç^|–Şź .TŠšŹ>dFNtRb|6>dn~œ2V|–ž´ęęě^n”ŇÖÜFf„†’¤ŽşĚŽ˘´&Fl:Ntz’¤J^|6FdTڞÄÂÎÜ.TŽšŹFVt^v”Rj„>FlVv”&LžŞź.>d:V|NV|~ŠœVnŒÖŢä2FtŽžŹ6NlF^|–Ś´.Fd:Rtfv”Nf„ZjŒ>ZtVrŒĆĘÔ:T&>lz†œJb„ĘÎÜ:dBZ|&TžŽźŢŢěŽ–ŹşÂĚ’Ś´‚’ŹŽžź6RlFb|Nj„zޤžĘÔ.TRf„–˘´frœ†–Ź2Jl"Lbz”Vj” &L:V„~ޤÚâä2Jt.Jl:R|zŠŹšŽźŠž´n†¤ţţü^r”˛ÂԒ˘´&Jl>N|~–ŹŽśÄĆŇÜ2T’šŹVj„.BdJZ|ZnŒ’žŹžŚźfz”ZrŒ&BdNbŒFZ„˘Žź2Tš˘´ *L6JtIzŠŁ2Rw "LśžĚ*T2BlęîôŇÚä"Ln‚œŞśÄĘŇÜ&:d>b|BlFRy>JrNrŒŢâě‚–Ź†šźVbŒ.dFV„6N|F^Œ.FtNf”>Z„:d6R|FbŒNj”.d2d&Bt2dÂĆÔšŞź6VvbnŒŠ’Ź>Ns~’ŠN^„ĆÎŮbv”˘Şź>VzÚŢ嚦ź>Rt^j~†¤Nb„FZ|Vf‹Š–­6Jl‚ŽŹNZ€˛şĚŞ˛ÄZv”žÂ̒žźÂĘÔ>V„>R|6BlîîôÖÚär‚œÎŇÜžĆÔ>^„Šš´>lFfŒŽ˘ź&Ft6FlŽš´FV|^vœRjŒžŞÄ.>l~ФVn”Žž´6NtF^„–Śź.FlfvœNfŒ>Z|Vr”ĆĘÜz†¤:lžŽÄ’Śź6RtFb„NjŒ–˘ź"Tbzœ &T~ŽŹÚâě2J|.Jt^rœ’˘ź&Jt’š´VjŒ.BlZn”’ž´fzœZr”&Bl˘ŽÄš˘ź *T!ţMade with GIMP,W(ţ‘X0cîD5ƒf˛™ńg&_Źjsüĺˡ.3fڀk†ţćŒeŚH´jý$ú‹+bśy”27o‚e/ł-[faž™$f˘9 :ײhů@Ô ŮN6cƈ´hąe XDśD‚el*VŽŒa˝*vŞWłPÓvm‹mYX°Şś…ŰŞśp‰\KwKÜ˝-ŐđbV‡RĽćĺC A˝lŮ@l M‘zmÚ(Œ%ۃXąÔČwdNâĹąd<ŁŽdŹ#ţbEńg.–0Ü̙‘ÁMőK‚fć…>Ť”j媕:ą'[‹žřkaĄÖˇş9'@–­čšţ}ł%Ď>vňjĹŘŚl[mľ4 Űö €sAj)ąá\š€łĘ+4xAƒ,ŕ 3ÁL¤3€ ›Ŕŕ‰=ßlÎé|ŁL›źbË6ś„4Ż łĂƒ¨C7ĘźC č쓎č Ó^-h“Š,ŻŕQÔâŔ@EߐA†=ۤ 601 Ř2ś ¨Œ *řM: K íăEĘź§L A0Á7ÍŘâáńđ0Š-ÄBM3óů°&8(c‹)0źňJ 4pQ¨2çš‚Ąślb 8ĐE¤ŕ 6`CĆáÜD>ÜЌ2ʄÓL)$ř 5ţ‹ŇĂ+Ý˝ŽĄ ÖD ÂřĎ3@€‹LěCMˆ€€“`ڐJ.šŠ6T Í9)lŢ708ŕ&čpë9€rí0ÝĄĄ śž‚C'¤E‰ÚôńŘ`SĄ-îƒ üëŢ+AOEAśŰLĐĚŒŘ(.814CM:6Ô˛Í6›¤° 8)t"€śŠę&€ ł'Öa& Ŕ 8>¤ÓŒ'őĹÅY8K­Ňđ¤śĆP@ 8Đ0{p2Ę`źc€˜Úźƒ2>h˘IžůRóď7Ax­ԄłĎ§pRcƒśö`3Ŕ7h[K3˘Ă‚Í5‚ ˆţ4Aƒ%öá…ń` L†Ęŕ עóÍ|Á>™€H6°¨cK œo3ŚŁr>ď㞜ƒ‡D^HčL ŽâŕœÓ¨:;ě„ó‰O°Űđ)Í0œó%:ŻpÁĹşĽËBƒ)!kÅ,&†„[Äň :l‚łĎ>á`“&4˜ŽÁ˜)؂&>˘“Bš€x‚ęĄ+ƒŽz˛XŰj¸)80 8ʘ€ýÚö‰ů(Ă~چńЁ‡t¤ŁlŘđ”1 h`„ ¨árnĂě" ´ń¨] Ň$6´ Í) ˝Ü30‡ěÁɆřŮD¤ůŔ3и@7Tş\` “} ‚ ‘i­h#„˛(6Âaƒ$# ‘JE†ěK3, X("˘Š ;¤é HŘHYŕÂ3Ôт6<"hŕ¸` ITTkƒc~ě1<ŕÁßȗ†,áahk9(5Zt .@cŃź‚€‰ # Ăčë%!¨Ŕ \č:Ły>aŇąV„aŔ Œ h@ă ¨]Äţ Mw “éűţČšH#ކ4ląŠ  c Œ¸é+ҔŽBD›Ŕ2ÁiX"ő˘Â\€‚l)c˛cŘ&„q i€Pče –€Xt0lRĆ*ěalH3 6řĄˆwŒA¨€q q÷HĂ ^¨‡!¤iŒDH¤0†4ƒá„Xh˘űƒŒÍ€Ą˛ŘĆ‚!Í \BŹf4nąŠ;é\ŕÇ Z€€N(ŁÄAT!MI°€O¤¸&+ŽÍčŁ>ŕđ00D3vZp4˙Đ:óŃ45ö!Í ¤ă1Ŕî0ź€÷FŇ &ƛ€{Ěóhţ¨DP‚)! Ćľ”ACa#f!`° *9ŚHÄźFGÓQb¤iP­AšYk†ĄÇ€ yPcŃŃ 0°#üă Ě, Đ$(Ł"˜@ž‡, žÓc°ń&€]ôš5šNŔDF0†}ř‚BĂ+–P‹Ô!ĘčE‡8¤ [[LÚžŔCˆÇ@ śŇ8€ńXDţäW ŚlŹ˘,P‡4‘śNş,ČŔ5‹QŽ8ÔÂʐE­e [ěP d@áiÚBŘőśá ijAČ ¤á4=”Ů U:4Fx" Ҽƙţ&řfă ľŔîÜě1ii!ˇŘFŽŁŠ bmP˜4IÍh­Áś6 €iębŤPĆöŃ z$ °8 K4ůłŃ\ÁDŠF ˛E°ű€iČ"<è…`SÂ}x„ÔMV4 ČĚFĐłWą \HÔŘQ-nq T”fŘF |đ ŹÂ^8W lĚCšŃ MlCîŘĆ ÔPp¤b؅Y-ŐM|Đ‚ˆč˜‚-X t7Ó}X…-0@â ýˆD, ° V!(°VĹR02°~ ´Đ˜&-C\@ ʞ FÁßţ3é< “މ‚ý(gK“DžŔúÂŕĹˉ^H ZđÉI3 Â´uAƒ\Čbˇ6Ş` Ă0sc ŘPt2ŕ5ˇPr…7Á†ŕ` ľŕë3 MęŚkŃĐ 0(śZ‘P Đ$˛@<ň|˝Đťëś !ŕ MúP 4ś~ÔM“Đ$Ü MŐ ‰@ ­pM vM?  Ԑƒc0Ż`ĺ Mąđ“BzŔô -`FS öŔvCś i×Tv@ýeX )Ęl ˛ Ó6‰p×IpÄ#śŔ.AĐo1` ^p:dŘ>č,pŕи b  ÔâŇ 50ö  ƒ– ×đp{¸ăp {¨ ĐҰ[Hˇ şg“ƒ<z° đDŕP 90 ĆRl8&ˇEÜÐ?тé°SI4ŽIŇ# w 0 ˇ ö0 ű 0˜pA>ŕěŇ žžŘ ŕ}ĐÜČiŠ€Ž@Ŕý€f‡‚(4` %2/9"ۀĘâ8łWw  ŰP0 Ô C7.% p÷pţ$ˇŔž˜ˇĐ6,ŕ{Ôp ˇ *}@ $€ {˘žü ´K0 ůÓ)Ő—  Ň @“K€&)€čR‚ð9` ä1"–P‹š@v(7%ě'^` w`1€(Đ5 ľp6”° ˇ% ö@ xŕĐ >ŠŕŁ˜ţŇ ńA IP’ŘR#ľ€w`Ň@ [ŰđVś‡€# ÷7˛@"Šé!ťÂi҂OE-JЕâůĂšŕYÐ#–Ř•OpO@Ć`#b(x— Ŕ¸R…)S™ě´cA)0X1ţp> řbnś€>Đ ˇvš‡śĐ)1hA`ö Í;)P ˇ3‰ŁY }Ŕ Ŕ^đĐP/ś>° hußGAT {˛ l‚|‡ ţ-†˘ AĐ P`mĐp.Đ ľä@$OÂ.{h(Ś $T$Z2d€4ŕçpš`P`C4đí ŃŔ đO zŔ üp"@Ŕ @pđ@ .ŔäŔ Ë ;`=TĘ@0 @đ sĎ@ü@°[  <Ođi p0p¤ŠČĎđ ÷°&Ŕđlđ )`'ƒÔĂBt ńŔ ĚŔ<°ŒäĐ"@¨™p Ďđp BÚB ˆ Ŕ¤@œŔ äđiŁ@šzŔĽüĐWlŕ{lŔ Ł ¤@gë0‹@‹ Ľ@ŔOŔ ĐÄĘ <˘@‡~   ¤O @ĐŽĘŐZŹz@œOđBZ IĘŞŚJ¤×ÚŚĘ 0ĽĚĐĚđŞWĘ&đŁ EZŚ@ŔŮ";ĐŤƒŽ„úŞĄđ ĄđĄ0¨Ą lЁЊ;jack-3.1.1+cvs20050801/doc/install.html0000644000175000017500000000347610371403403015267 0ustar tbmtbm Jack installation instructions

Installation instructions for Jack

Jack
  • download jack.
  • uncompress it:
    $ gunzip jack-*.tar.gz
  • untar it:
    $ tar xvf jack-*.tar
  • change directory:
    $ cd jack-*
  • follow instructions from file "INSTALL"
  • if this is your first installation of jack, run it once, it will create a new personal preferences file in your homedir
  • customize it using your favorite editor:
    $ vi $HOME/.jackrc
  • you may want to enable proxy support via the http_proxy environment variable
    $ http_proxy=http://cache.sld.tld:3128/
    $ export http_proxy
    This is a great addition to your .bashrc or whatever you are using!
Wanna go home or on to the usage information?
© Arne Zellentin, zarne@users.sf.net
(changed: 19-Aug-99) jack-3.1.1+cvs20050801/doc/jack-curses-screen.gif0000644000175000017500000003232110371403403017100 0ustar tbmtbmGIF87aŚX÷ˆ (((000888@@@@D@HHHPPPXXX```hhhpppxxx€€€   ŔŔŔŘÜŘŕäŕđôđřüřńď6˙˙żżdđ˙ż|˜`h €@˙řp˙/î˙˙˙ż|řX`/@d<đď7˙ ż@}řhť/@¨ř5/0f6ďč!ź @ď˙œ<ŹGđî ˙˙żż*61q@\,ń7_˙żźď,˙@ż‰ąŔ˜źđhî˙ ˙ż@żśř=ş/e@XřĐń/\\źńďô˙˙˙żżżźń,˙@ż,°8ô˙ż ô˙ż,ń€˙đdXń˙ż@`*ń9˙ż\€ńđ ńô˙˙żżQ€‚đ˙B\,@@Ś´˜Ąh @@X{˙`˙˙ ˙ ŔđŹ˙ ż@ ”ôeď˙˙d|0`ď,ŚXţ+H° Áƒ*\ȰĄĂ‡#JœHą˘Ĺ‹3jÜČąŁÇ CŠIr!€ RŞ\ɲĽË—0cƜIłŚÍ›8sęÜÉł§ĎŸ@ƒ J´¨ŃŁH“*] SÁÉ ˘JJľŞŐŤXłjÝĘľŤ×Ż`ÊKśŹŮłhÓŞ]Ëś­Űˇpăʝ{Ő)JşxóęÝˡŻßż€ L¸pWťPű(Ŕ¸ącÇ"KžLyňcȕ3/nL 3 C‹íš´éÓ¨M_^í8uçĐŽKłžÍ8śmŮ´owžLů€ďß‚ ţۡdژ5+Ÿ­źrkĎŁŁ‹ÖMÝ3ňËąaßžžşzläÔyţO.î{řpňÇš7_Îz˝áĂOýXŸ™üoöâ›c‡.˝ż÷ęÜqößi˛6 k2'yĂ%ŕŕƒžg}˝Ů7Ÿfí­ˇßkýIwŕv~ˆ[‚ω8"‰ÉŔ pś˜€„R¸ …ř=ÖÜ{\!&Ÿ…<öˆ^ÉĺVZ‡ţQÝwš¸Š*i]Đŕƒ Tiĺ• VŠĽůEVŽ čĘ@řćŤďžĄfŠíżÝZ˘ŕЊîÁé˘6[ĽíÎ*b†3–‡ŔŚžîkąžýŹqĄßR†œąÔ†,ňľĎR[Uł$G%­Z@•ÉTő;ç•Üj+đ}ŕ^'UgU…Â@?ŞšťďÂŰpEÇ{ëÄő.PqžD-őÔQcÜéĚX˙{ó„‡xZĐ`ł:t‰ ]ŰťJKĚ´˝úRíśV÷Š56ĂČľeŢĺ2ţU{c…ňTG[-ŁÜrĘäË+¨RŃđŔ]ç˝3Qńl.hä†-Ŕ㜠@fŃş™}vj˘É˜­™Žíô˝řNýŔë°Ç>u܋Ë|e‹vç)jaŮ9矃n›čHťVşş§GĚbӝB-uěĐ?0ťâľ:3îÂAŽ÷l [Őˇß0.ř]|+kţÉĘB0믏¸ĹR5żüR}:U„Qů6•SąVŐ¸â˘ÜĺĐ3tý;žđL×.ŇšjlPžęš×ş¨˝nd#ƒ]Ő.vąĹÝŽ[ÚăʞÓ;Đ đ„ \ ÂŽć@GA*y*’XŽ(؀ç=ƒ"Ó Ü8h1újTţ[şŰf¸—dmĺ{QAbɇ8ŠŹ,‰YAÜŚHEőąďŠˆ›^üć7|YĹ_RA€VVCӔą4TYŐ ×<Šy“âÝÁĆ&A9Ńđy"‹€÷JOj<ä ¨~˜=œ‰°`ŢAŮȨ7BpMrDĺ%ĂzÝтyäŁý8˝@ňËz٢°îöą"R ‰|k˘—ˆJ• p8YUp8Eőٲ*n“ЏČK tŞqScVČX93žRYÔ"—š97:ňD4XtšŮČĆP2Svd] pAhň›!űăŰéI™ĐBR’2™šHg>sI˛jU¨éNkĆ›–ţÔŚočÍoň1œăě$Í)Jíĺ†Y0+˘*[y˛eĺ‰hąĺČŞ"NŠár—QńâUŔ-aRŕRá_T°sĚÉMN€SQ”tŘÉĚF:RAŰ#DÓÎé<)‚1ÄŐęœÇĎ~ęQ@ý'@ú6A^-”…ŒŃeÚ&ßą´Śb{)ÄÂÄÔόŞ %uzɞň¨*ľ*JTröđ¨ţJjLŸÓ˝†veâ_bŚ•Đ„J…ŹV‰š.1šQ|yŞfRiTDJ™ţϤĹ<ŚJiúԖşS…Sœ€;vžÉR×Ô§xĘOŠőue čYĺ–ÖQŽutďšgc—éŇFö´ŇŹţŹc•ź[1łÔňěĂIÖК•z¤˘!—:ŮśŚ’+‹ëT zťžň˘SÓĺ^§˘×.6ŕ—QqP`C*˛Yn¤ÝEéw(OĆŽŤ—umźt‡ÚŤ>ŐŚ˜ÍéÚ(ˆÇÜz6‡ž%ę'ĺV'RVšĹŤÎJϋ^řŞ×Fˆ’fcá[[|ît›Ü ™nń›ßqî7”‚ň/Ů@fžc14‰vUŽ+ÉǗ\F…Ż=1_çǀĆ%`ťƒíîd‘YŘTĽO5nahĚÚ֖ ÁÄjďŽWË`œĘpłäfOc V¸¨VóUЊZ#˛ź&ä1#}ÜŚ=9ŔVÍň‚ikdl"ÂÝdrţ“Aűd(SOĘŚ=äŒAĆd„"NÄĚĽ‹YĽŤâꌘĹ.†1ëÝ%ŐŘĆ2fĚĄŤLY–ŕѐ.pV…çĺ/ĎTĚżƒôŁhS{–g†ÎSň’yËfłśy‡ŔEjœ‰ 曦ękîeŚŚ7˝ĺ¨ţ8E@ş´l8kNkÇÓRu’a‡CŮuňÔ.-:™*˜U"1Ďs d~“-\ŽÍ*žXŢő2gMkÚú‘˙…'éC6óvŽŰ‘ţ™ˇ:_}Ú0zd•śoŠak˙Űąu4ˇkmŕŽËĘ8ĽPš‡œitŕ€ë–o6C-ęčQMŢĄĽ÷”ĺŒZ?iÚrńd’-7UăŹ;OŹţ ží}ŻńŰFkX}B¸TƒńÚŕÝnăžÄnćiÂúŐ8ĂÝěףVűB wu4ĚNtó{Ň/<ÚʇŰňKżćGzƒ5űŕ‹VçVw›Äăt”ZÜ*ËuŸĆC­ÖăJm’ٲ­ďtŸźßân×҇EU§?ę ”z™ƒmóśq|ż7ż˜ŮˇŽáŻ=ßE×4zý­ňĘô(Śv/8Ěž÷™/)ł3źůŐďÉÁw\Ůigö×ëňĘћţô¨O˝ęWĎúÖť0a˝ěgOűÚŰţö¸Ď˝WeŢűţ÷Ŕžđ‡Oüâ˙řČOžň—Ďüć;˙ůЏžô§Oýę[˙úŘĎžöˇţĎýî{˙űżqbŔOţň›˙üčOżú×Ďţöť˙ýđńĹ•ŢOţţřĎżţ÷Ď˙ţű˙˙€8€X€x€˜€ ¸€ ؀ř€×{ôGö'˜¸؁ř ‚"8‚$¸Hźg%¸‚č{#¨‚!ƒć‚3x(ƒ“‡ƒý§ƒFƒŕƒ,ˆ@¸‚C(€E„Hř€'˜‚I؄J؃ČmsX‰š†wř{5hƒsHƒ€¨… ˜‰=胼xŁxŠ0艟ř‰ h†(ˆ¤X‹Źx…˘řƒśřа¨‹.8†Ž¸ˆú犫ȋžČŠxhˆˆŠŚx‹Ę؊ľ¨‡p¸‰Ô¸—8~“X”Œ|ȃXŒ€x†ŇȇĘXŽŞř‡äřŒ–ˆ†Ć¸ŒŒáŘ‰Ž˜ˆ­¨Žšĺx˘x„Ŕç‹ö׏ěH‹ď8‚Œäˆ‹÷hęř ‰…i¨i‰PÍ‘Őȍ†čâhi†ِé؋ć8ů‘!’é‰łč IŒż¨ yţ’ë8Œ‰¸Œű¨3™Ž8‹9ˆ8”5H‘Ů(”Mؓ'ɐ>I“&™Ž:H†j¨¨“<‰Ž ‰ˆHřř‘cH’ů8‰`Y“19–)“樐H锘‡F”×XEٖAؕąh )–vKYWٍyi•_‰–€‰•ɕxI˜UŠ•p˜‹}™–踕 I˜bř’ş¸“f—œ(—Úř–ˆ™šY‚ŒéŽĆšĐ¸‹RȌVX6IŠČ8™żč’e)•ÎȒŽ)™¨Yš¸˜Š˜­yŒíh“9hš3ůíؑGxˆů™oșɩœuč™;čœŇi‡É8ŘYţ‰‚rhŮ ‚ŢůâI…Ôžăyž§I”čšžěٞîůžđŠ‹ęŸôYŸöyŸř‰„Ě9ŠÂ œż)›˙ٛÇé›zšý  ęŸ Š Ššy jœş9*‰]؜€óˆĄ09€ iXĄڛ# Ł)Ąz˘z(˘ Ú ,Ę (J˘-Ł&J ű¨žY鑼šŁfŠ“>*“ăČŁ‚yšŁ%Y¤:z¤=j¤Bę™ 9–zI€ŞůŁIJ¤B¤ȤPJĽZ:¤Uş¤_ęĽJĘĽaŠĽVJŚcjŚa 8ZŚ>¤[ŞŚc §HšŚoš“qz§gJ§`j§]ʉQůá9Ľţaš–LyŚlé§nú§zşŚxZ§B*§Mú¨}Š:§”š‘ŰɄŒÚŠ‹úЊŞ–ꊢš§¤:Ş jŠ‹ř”8)§xĄڔž ŽЊ.ş’Iů˘Ö˜ŞŚĘŤÚŤĽúŤÂZŠŔŠŞÁJŹşŠÝyŠ“ş§™Ę§hjŹŇZŹÔ:ŹŃZ­ČÚŁk¨‘WI¨xi ОX’™‘ƟšyŽŠ)¨žš­×j­ĐŻĎ:ŻÎZŻŽjݘ*ŸÜ‰‰éŽňŠŻÍzݛݰ{°›°ťĘŞ}ٔę>I™y‹SŞŁ{¤ŽÇúŽţJŻťĽ˙úąbް# ˛ôşŸĚj˛Ť˛"+ţŠ,‹°/K˛.[˛4;ł€J–i˜ąj—HYŽʑŞłTj¨đęą0[ł)‹´§Š­Ű´!›Ż(ť´Eť˛JŰŽNk´2›´6Ťľ\ť–Šř¤@{ˆ{˜ćś9zą; •J´Kľ[+ľm۲\ ˇWëśzľşŞ˘*Ł0ş˘)jŁ4ş ęˇ|;¸{[ŁJĄ›¸ڍŞśŢ*‰ŒŤ’d[ Ë†ŢhŠNšˇ€K¸ˆËšŒ[˘‚ŤˇŠ[¸¤ëšŚŰš‡;şŞ[şźˆ˛ůť˛k”¸:ťś‹°{ťşťťËů°źűť¸Ÿň7źÄ[źĆ{źČ›źĘťźĚ{~DٟнŇ;˝Ô[˝Öţ{˝Ńűźčş˝ÁG›ţ蕯)|Ş|ß[}°Ř˝ĺ‹˝ň—žˇi|ŤžđŤ}ďŰžČÇžÍçŒÄ'šö›żéˇšƟ•yžĚ÷괈›ÝťŠá;|\|•™Ŕî{|ű+ž˙(ÁÜżí'ŔáÁlÁŒ}öŤÁ źÁäűšĚżÇČ| Ü}é{Â',ÂʇŁÄYÁŽŹ’4Ěż<Âź|œÂ}>\ÂýčÂüĂFl}ü|>ĚŔ/IÄ<ĂɡÄŮÇž, Ĺ2œ|0œĂ!Ă jĂNÜŔPüŞĐĆŹ9żşšĂ“{Ä(ŒÁ8üŔ-\ÄjÇJÜĆ „śô;ÁňxĹo\ŔTüŞţ5¨ŠŃČŔۋm\pě|YüĆp<’alČů ÉCČ7ŹĹűËÂfŒ“MlĹrĚÄ< Á›\Ý<ĘŕKÄ,Ę~œÁ ĚČMœĘâ[œ•<Ä\ŒÇ• ˆÜ™L™˘Ü|‹lʨŒĆ—<ĂޛĘ")ƇĚɲ,ĚZLĘ××ĂÉźËĚÍĎüĚß[ĹĘŹĚŹĂŽLÇËÜČ9ŒÉf<Éľ<ÍŘĚ˝R |˝ŒĚĺŹÎěÉ}üËŰüĹ$ŒĆßěÄҌžěĹĐ|ĎҜÄlÍË Đ+<Ćö\Íž<ËČψlĹÍĹ }ŒŽÁLĆď|Í[\Ńă ƸŒĚĎ–ŒŒÓüĐ˙Ň$­ĎŰ+Ň MţÎôÜÍłœČü|ĎţźÎălŃŒÁĺ[ÂďźŃT Ďż|Çâ<’Ů\Ďa}ڛ tl¸,•$şB]Œ´ÉAmŇď[ÓilšUÔ­›ŐWÍĆč Č5˝Ç|Î/˝áŒŐv̚#ýĘŻřżVÍŇgmĚNmŇ^,ăüż¸ĚŐȧ˝S<ÖÉĚĘ(}Ň%Ö‚ŇRŘsĚ׈ݟQ]żëűÉī׉Í}áٔ]Ůń;Ůj,ÖßٖÝٞýŮ ÚéÇ٢]ÚŚ}Ú¨ÚÁWÔl-ʙܪa˝ÇŞmĎ. ŹÔ„ŹŮłý~e×[<}řŤŔ°}żý‹ŰĚx׺­ŹüzĂQ-",Ň1ÜÜţěÁľíŘ:ĚŃÓí~žÍÎ*˝ŰŃÓřĚÝŔÜŇ!źŘż­~ =Óâm|˝Ô=×}}ĚßMÝÖ}Ĺç-Ů#ŹÁAěÝ× Ţő }íδÝÝäˇÓMŕy˝ŻŘč×5L×b,ŔŃ]šŢščŰڔKáK}Ç`ÍĆ} ˘Ť<ŤÄŠŃ’˝Ýrßę,Ýü}ÁÜŒŐ âyLŤÝÔą]Š‚ŒŮšŠ1žĐ%ţ —Œlŕ[9×dlß NĚŤœăĎ}ä'îÍ:änýČ4}ä(žŇ  ŐĄ\Ý)>źŤ ŢŽŃ”ěŢ4ÜÜz+Ă]ŽäöÝĘ 䂼ăXÜ㝉ŃL^ĐrŽÍ éá\áÍç_éÚţ.|Ę4­ËZÎŘÜ=ĺYŢżGß^ŢÓ?ýä”ŰÎżĐ!năaÎŇé­ăN|éĚ˝ĂúÝÎmËXŕĐ\ĹtČyîčËź-čD^čÓË刎ę˘>Éíƨç›.š<؞NŘĎŃC^Ţ.ÓůÜĺ&Ţŕϭ貜Óę˝ěŒnć‰>äŸnŘgîŇ]ęëíęÄ ëš.ë$<ż7-Ń˝ŽÇdÎӛîӍÔÉ~îَén.äeÍÖężđ­Ç”ÜōáŽ>Ů'ŠÜ„üâśęď2^ÇßÖ<Ü4Ţç$ŽíÚÍŐfăpý×g-ѧkŃžđöîçČ~Óďq ŃďŽß żę…]ţň—žÝ#?ňćMĺěˇÄ„Ž}¤ň2?ó4ďý\ź1_ó:żó<ßóŤň>ôB?ô2Ďڙ8Ýą˝Ř+›'ĎćDĎćôžďOŢ΄ÜjÔV_ÜŻ]ëu˝|Ŕę€=ęĹű\ĺç§é/Mâ)üňSŘgöş­Ó źô~•ŢÍɝÎK.ĚoĐ}Ýwß$oÁűÝéf˙öëç߂ŕĘ^Ävďôß§ćOÜô?ĎŠoâ~üĺ/Á€+ć6˝ů"žŠ]mĺë⊊Ö×<ďŹÂ /Ţp.ůŠŻÂ+~ş-NË_ăěĚě'îŐ¨ŸűţŐPćƒ?!/đŢËE>çŸü‹ţžîˇžĎ î÷ä~ĚłŽúnĎň]úä-űł/}[~čÝĺěý ˙ÖĺžëĐÎŘMNúđmÓD}üźžÎˆćź_Á`^ČkőП’íaAŕ@‚ˆPĄÁƒ6\XPâDŠ-^$ˆŁFƒ9bRäH’%MžDiňcÁ+9Fěř0á̗Â\)ŃĺLŠ5}҄ňfL˘2uŇ,jô$ T¸ŔTéÎŁ2!ćdÉłbMŤZ3zEŠł#×­`ł%ËkŐĄTÇŚ„;rí٤tăŢśWďŢťs[Ň;ŠŇŻŃ^tëwđŰŽrߒ%Ź5˘[“LB•ÚraťiÍţlôŃĄšW­{ŘóiX–fűël°”“Îí9:&LÔ|}˙<ŽbÉŞ‹łnh“4íŸFy37Ţíڜɣ™¤ĺ§Q)Đfˆ;çKŃÖŻ–MXţyzŃĐĂśn3>Kő†ÍKö[~:y‡ăëłđĄ˙Ä-Ł Â pł…c°A…›>ţ<đžČ¨‹ŻĽźN'óěăi>âd#p+kŻ$î0ű¸„1FmŁŃŽÔ“1Gwä18EzĆ ?ëт˝+2I%—d˛I'Ÿ„rÉŁäkČĚŒJ-ˇä˛K/ż3L1sIJĹ1ĎD3M5×dłM7—jŞť,ëţŻ7ĺJ”/E­|ÓËüʜ˛OA4đϒřô¨˝?íÓsŁĎË9D *s1í,˝1ÄĎVű­ľA٤ŽH;?%ŐQÁĂ1SSwSU:D'ÝËľĹţBŠŇ˝•Öô.uoĆRŸ|5T^GýľŘSG$ Vě:źóGx–1Űś‹“EÖnTkżĐ QĂ ńŒtŘąžU Wc3w9nUöÜ5ÇCÂúZóé[ś˛[Ö՞>ôtCtw1^ŘDÉÖlŁíźÉ}ŻWą~ŹW›‹­Ý_ů\4dÝuŢ܊Ł8­„/m‹Č őCXľ‘[í >‰şÎːŒ.eO›=íÔýú“°Ńlţ~Żd†8öQÜiQ%şXcžmÖă*Vśłńa ÎJj_#V$ƒŻölׂ‚8ćŸumś8i^šiˇ/ÄnyÓĄ™úéeCf9k¨‘ŽYgŻŤĽyí˛(ó¸ě|ĄvœU šŚÚĆłkłĎĄYüďUÓ Ýő¸FĹŮf\ĽŹł2öęE+‰ČźŞ0TŽMî`Ç5Ňď˛vŔž/f;ťG.ˆĄýŞa­ëËş’0‡KäZ|s›VţÁ,WŔd lLRĆö7ĉڥŰĐž294$[’Źäţđłt"Í‚ĂňINb1›R΢ËlVaAË|ó¤Ţ8ŹŤ7Äţđ–žĚJ k”3(^¨7ł9ؒNt™2žˆD{)ăsžpžeFá™U:ÍO7•älłEY Z2nľ „*ژĽ…g‹1ŹÎă—˙üU-şĎÓńs°^?MżPÚ„pĄ]ŕˇ6o(BnY󖶗ru:YÎޞ ›žî‚s˛‚]^uéúN [yÇö^°Eœld›ŮĎ~ŢbŁgMU7Q”Tv…Š-şČB[ĹĂ~l4ŸÝsWˇE#đ ëWjPţ‹şÝŚf7ŠÝ-ş‚ U÷ŁP›¤ŮÚŰß˙V“†Ű÷¤~ÜŕGx— žp†7Üá; nq‡Ťc&M‡ }x˘(Žag]ŕ3ň‰Â ݊Ă÷†ţěxÝPzGK7tÜCFčC/ëqJ;łÚeUeÎŕŢtQ]†ő›cěČÜYҘ”~§Éţc˜Pţ…:Í ˝Çł˛z82Ĺhí´žÚ’/UzŇŤ( ‰˜{1Äwl9nIŹ{Uę(špżŕÉŻˇxČŤ;ŠKtŹ÷üŇhľÖŤŰž;X[¸Ć’Žôͨ VÜogb;7œu×iS(ÔĺTžşmqRĘ>ˇŕ‡ń|Jţč^ÇhÂÌfČX†Ÿ5ävl砝ÚsŒ\sÚ6°öáM°~?没Ż>ß­úzW†OW'żÍc˛É—ľÍ>qpƲYcţč?Q–đž÷şĂońƒ÷Ruçă‘÷/łűP&Ó3é CěéůmľG ÖkťĽqŸÍÖźyQĄNsś\6ʞlS@L@܈`Sąő;lÓ¤h˘ťëŘťžÉ´.í)šëŔŞ. ˝N‰’Ěż4żwcAyżz“Ŕ2­“Úˇëz…ű””‹ÁäÁ&ÁÁ \ľÂ"4Bފ8Ă[šëáŻts:&œ= 9Âpąţ ąçB2,dŻŮë@ŽC›ěâľôŠ ËBŚ‹}[ľ§›š*4ÓŃż'lĂţťż/*Ă>šŤ4/słŘë•2B*ě˘-6LŁ'rCnKŠĄă9ô‹ž"Ň>9ÄŚó+şŔŁŠĂ[ŹMj–‰¤lŤkRťĂb1¤sťCĚİŤŽąC%ů“ŹAşÄP‹:3(=ü!>4.+H*ĹEëEƒżAŘĂBŤ"ĹIząŞź/;.UjD]ä4Y¤˛ţ‹°ý ˝Jłué°>t?ÄKCĹť7?;ž#ŹľßŰF•Ą3ł™Âú<×c*Ëâ=Z$)ńť$ٍ)#ާJ=ň2>Ť;ÄptŞĂkž9ţDÁéŰ4‹ążŔ’C‚h9-*$ÁłŹŘƒŞĽ2ź­sÁ,?Š$ż‹LÁ1Ă;őFS´šŒCŁz™ŃŤąň˘ą4¤¨ú*ÁľB9eƒ,N$Ŕ0Ŕ´É„ś›\ŔœÄÉhkśěHrs, \ąp[” ü5›Ü™´;92cJÎâżEÄí °œČŤŹHŹÄČÓęHĽ‘J0œC” ¨tĄěĘłDK뛓´dËśt "t˸”ËbIBťŤ,暧üĆŃÂ7CťlŽ ¤@Ŕ2Äžř@ţ*2ĺŁA ŤĹ¸HČgtš3j)4–ŠsĆôưÜÇĽŚÂź:żc<:$+:˝Ě3wÜłţüK nKĘ<Č!ÄéÓG7l)”)DËTFqK͏RÇ0T ÔÔFüP'+“–mË;ÄĽP ĚPÜ1Z´űŔ0ŮEś°R2#ϊč=yœI T*îă1)sOd˘>MĂ‘K&̌śŽë"×ü­&ІtČ˝ÁžšÚÍŐ3I…t¨łű&Ÿ›1J„GŃc>~Œä š›P›6lŹ˝†‰ÓT3ĹŹÍ*ô= Đ H‰s>ŞźLFƒP4:T#ĚÉaB˝“¤öK?ĆŇľyŚőŔż˛ü1ÖĆŇŠ\ÇWIÇO0Ô˝ sŃŔ›´ď+!ťţF֑É"u)Ź'W{?§˛ź­´ČŒ,;ĐŮOśĹδG­sťůšbÇ:Ş+57Łó5”ŁBÎóŤ˝ËťÂťŤ9%Ń -ĆŔäPÉŰ.dŔôÉńÓL‹ĹRęN=ÉîÁ@‰ŃśEBQÄěÄVŒM¸„AłĘŹ|ĐœË(23ö3°NmNŐUeŐ4QŐV…ŐXĺ’W•ŐZľŐ%ŠË3$şⲚt˛Ký8Ýd8ńČŹ ÝP~ÁË*ŇAS% ú bÚCěUUáĘaĽ5=”&ţĚ 9ť˝jě›~ä;ű”Ż H㠑$’.Ř䭑łźi•žS8nEDědłŽ‹źU“şěÍţÔ+Î.b“;î OçĚkĺŇd-U„S(]´Š2ŐQn;Ě:ĹW4Ń×á<*Ţƍ`üCƒŤcĘŔšCŐx5Eꌐ ЉMĐ_Wţ+×rÍ(ŽĚ%ŞJÔ+z×ڒť#Ů{UŘÂ>˜G•WAŠX%Jů¤=ż>hşLľ5xUWœ4ŞčŃ!FýË}“\Sv„ĽXJ?[–FóR­TÁ/ýTWdÚGSքU=œŞľFp˝YĎŹ[01˜ę3Ç dҊ2@ďŹRŻëIBĺIC%\4\ĄRƒ˛.+\L‡;J”XEôŁéÔ8Ą=ZŐÚ9BŰÎ5Ű´=[ćŞÖ[ţmý˛$ÝÔUÝÓmÉŐuÝׅ8ԅÝŮĽ]ŕČ՝ĚšÓYQ5‘7ÚÜÚŢrV@üVvIĂžÓ̽ԛ}ÍŻ ŢçĺrMľ8KYäÍÍäÝ/ľ[aUCčŢە×ńÁR9KĹÉ{ÔÔăBîtNJ•śńůÉe.Ëő^V߲ۭZF]ĹŇCśíX Fáß@`ú3"FżÍĆŢ9÷Ä­Zܸ]ϲ ŐŽŐź]2˙ĽŹóĂť‘_W)X–AÎyOő—ÄuţbćáˇÓ\ěu.ž ]Pbҝb’Íâ.ŽÝÖőâ0~Ý-ă2NK26ă4F4Vă6>B6vă8B8–ă:–@:śă<–bŮŐă>ŽB<öă@N8@äBţ7B6äD.3DVäFţ-FväHž-H–äJ†-JśäL–->ÖäNBNöäP&/LĺRŚ R6ĺTn TVĺV VvĺXX–ĺZćZśĺ\ţ\Öĺ^&ZPöĺ`~ ^ćbŚX`6ćdÎbVćfžUdvćhvf–ćjf]9ľćl&jÖćn&höćpvUp6ÂŤ0çsFçtVçufçvvçw†çx–çyŚçzśç{ţžgšäf§Ťf(śˇ}.3śc4€ö1‚–c„ö1ƒî/…vc‡er.BˆVcŠ~d‰B‹6cî-†ĆÇ~ÖgŒBŽŢ݁UB<;žžƒÉ’ţE¸Ńż i0ÎÎíĹ]•ÍGóŒF5•TŽ:îÝá62ŇăËĂ3i „Ö‡Dj+ţZĹ&m|D^lZ%’D ^ޤŽjĚ5BÎ°ˇń)TŹćG>aąóťń}GMŹ;“Ć1Ż°?EF=.‹CŘśÔęţź\Eu\ 6×ëWě¤#o)Ć­;†5ĆfL1\$<šÂk@mşŽŹkߊܸ6‚ÚÝhę0eÚ˛ţ҄« Uéô˝KţÖaD œlÉFĂŽ|ěŢ:ę]dmôč(Ÿęąfę¤í×ăľmćýZš˛IGô(’Ć­Ô^WšŽm†Š4•4ýSS~Ř×nîŃNąĺ]nŃ%î˜Ćć´$`ď+J’ŠTÎţ+ĘmH\ć[EĆDÜ%śěďáKëvR2]ďŘÄ^ŕž-ůś-áĆ-(–ß ŚďÚ˛ďůé¸ěoŰÚď(pŕ*ę,pšö•Ęoj"^–:/?pLpĺu‘áklţœjœúL ˙]ǞđŹpŹv^ÚŮĄ}ĽâFq*>ÄÇYűő—:}Ÿ´Îĺ=ßĆÔŽOk%ëd´Kč\zÓ.čToľĆDIÍ]öNţ÷śQ¨–=-ĺńł É,<”„Ćí/ŽrőŚLÄżŚ&ą#QřćA÷Ĺ;MLŕ;X?”<Î.=‚žzl[ţEňÎV[Ëžžzs$kaÔŤ5ΔLŤđƒQAˇńŁ[ŕ>'q!tŘ"ÍŇĐćĐtłö¤âŒ´z…ôŐ'7aěň.MďrR/lˇźtô2ă2KžiĽJâ°)Áq\‡sP'֓k@ĺ$ĆŽIď,âpů`żŰ Œu§őʨ†ş'%_K´”vjđ „\jß-k˙oXńźöů÷•jö*./řľp•$=Č+w€:wÄĘnSţ´ÁلŻÎŁę]÷€âö¸œ÷kl^$Ý÷|—u —éŽtÔőuŔąXŽFti#;%¤ńĚJď(?vaJod­ř“wŸŚxOłŹÚ_ýë}EÇůË#[ŞŃü[A}ӓEFŹ2řëövőnEńs…ąŘ—&ĐÓšáÎNö—ő|áD;OQęwˇ _€§WÜŢ4đ’HđÚQö,zş5ÚFëŕůöĆn‡úç!SzŹÇ”)Glćń"Î?}5bsŁ­_ňŽ´Éĺř™*ß\31/Ŕ[Ę[ë{˘Úu:‘Ož‡Ń÷řPů•Ęy?qŞ{p?ř ŹtŠŰđśâw¸Żö™–ćףţÄ'˛o§ëp—Ŕě>ÇÄęœokç|(ň|B{ď7A°„ö'Ş6ŐOúśüwŘ/ńýeřÓż}&ď^uiMĽu›:ŔčT˜™ÔŕšsTd6pŤ{čżpĚďvÍ žíÎ1űąňÝy܅'ćĎcÜtňŻ~ȧyěŸJFWњ—Ý#ď{jĎnŹç§Ą˛ŻźĘĆsňF7őˆ (P°`đ „ 2lčđ!Ĉ'RŹhń"€‹f|ŘŃŕǏCZ Iň`G‘ G&4‰re˗+]:ţĆöóóŻż?€Lí§TfÖ ¨ŸHś¨Ń :ˆĐJhQƒGĹ%Wob†•NUXއĄˆ%Ő\]îÖ`ˆâd"r0Ęȉ3ÚŘ"ƒţÚĄ&[NŹ˝“śU6äLeĹ&n›š–Z‡AšŁ‘Dö$ĺy6ZiPWšˆ#FŹŮ%ÚeÚńľ˜c­En˘–טĆ]¸¤™fî„&›ĐqŠeyYâ9áŇőĺ…qx’l´Ľ8gŠe’™Y`şU˜r"9ŮgŐőš'wzbęŕĽ1ţ‰a `"j /ś™¨M§şé֋_˛Zg“Ž.×éŚŐiZ+€´F*[Š‚e(_§Ájި¤*úÖŠv˝ ОŤý¨WœŸfˆŤˆˇR›ŸŽńÚiŞ6›’ݢĘăąRŹ‚Ý)n¤ż>z۸T—íľĘY[/}ôև݋*㍜žüúFÁţSŔ œkž{Şă{+ÜŘ˝›ç°ÄEąĹ‚Eœ1wsüąś ťˇąČÔy\2Ę §œÉ+Ďę2ĚšĹÜ]Ë3 w˛Í㜳E5óŒâĎA˙+´s>MŘÎGă›´Ň Ý4‡ŒJ=5ŐU[}5ÖYk˝5×]{ý5Řa‹=śŘPŰK0b䙽6Űm×ú´ŰqË=ˇzpÓ}7Ţy/gˇŢ}űýˇV|>8á…_$¸á‰+ž8–hĚ8ä‘Kžâ“[~šŮ•cž9ç9kŢ9衋üščĽ›~0é§Ťž:ŚŠłţ:ě&ş;íľ÷7ťíšë^ˇăÓíţ;đ˛÷ŽvđĹĎîÇ+żüńË??ýőŰ?ţů‹Bü[@ĐŘç;JQ­5äť XBŠ_ÝŻ5$ š˛f@F1Ё ¤ŕŐ&č¨Iq JRÓŕ ¨"0ƒ^!Յ?j……ęš ő'ĂzÍńH¸Xͅŕ3 §D'~ ˆ!ŰÍBD.°jÜ: Á˛p‚kŠ …XŠĐˆUœ"“ˆľ'FŃ~Zôš ™(A˛ąZłĄpHśĎ‡jŹ^…Á4 QzwlaĄXĆA-q‹B1ŠSźľóĄ/ĽĚeŒcLłËúNĆ6žńŢhLó¸Ç>ţ1ƒ,ä!šČF>2’“Źä%3šÉN~2”Ł,ĺ)SšĘVž2–łŹĺ-O9€Hf.—Ă,ć1“šĚf>3šÓŹć5łšÍn˛—LÇőŃšÎvž3žóŹç=óšĎ~ţ3 -čAşĐ†>4˘­čE3şŃŽ~4¤#-éI;:€Ďť4Ś1ýsşÓžţ4¨CM˝ : ;jack-3.1.1+cvs20050801/doc/jack-logo.jpg0000644000175000017500000002174110371403403015276 0ustar tbmtbm˙Ř˙ŕJFIF˙ŰC  #!!!$'$ & ! ˙ŰC  ˙ŔŹ["˙Ä ˙ÄM !1AQa"2q‘ą45BRrĄÁ#6b’ł3u‚˘ŃŇđCeٞ$EScds”á˙Ä˙Ä7 !12AQ"a3qr4BRb‘ĄąÁŃ#$áđ˙Ú ?ćôD_X\â""ˆˆ„""!ˆˆB""ˆˆ„""!ˆˆB""ˆˆ„""!ˆˆB""ˆˆ„"& ÷^""ˆˆ„""!ˆˆB""ˆˆ„""!ˆˆB""ˆŠŁ•á6Bđ3* „žŠę rîŠNywŐIIPÖnŽld¨^Ŕ÷/ $tY8ľťŠŁ-ľÍŠXW0›]Xa+txčž—žˇ<|‘î”ür‡*Ű+t^‘‚źL(""!ˆˆB""ˆˆ„""!ˆ˝hÉB7*Ťb'˘Š[Ä)Jz2ěpJK0fęƲę0S“ŃziĎrÉbľšĂŃUjpŠ@ײöşż€V$čHčŠ9˜YEn|Ő<¤đNĹP˛ŠĚ!X"ű{pWÂpŞQ¨DDB„DD!DDB…čćŽŕf\ŤyŠ*6ĺÁ/3ŹŘ5S6úMň8)k%îý1}ŠžŸÉy1ő q/ýî`x˙K4Îoˇ6n§ŞśŰÝ,m{KCH#˜É\]\ĺňßEV'Q-4Lŕs8ŮalЛA,Ëi-¤}ǝEÝôŚś Ľ|ÓÓۀhÎo˙2í×[mĆicăĎÁaťFłP7O9ĐSą…ÁŮ s೘ŕN—HŐI‰SDf2´†î,¸Żőu´Ď•ą:9#qŽXÝő9Œőć8řű\;¤đYœ4ísď$˝ăűŒXĺ|8qŕş:¤ťBˇ=¤MőŹuí⊍×ÂsÉ|vô]0Y,ZUŞ`ŤĎ&=ÉäÎîG/2•fŠěӑŃSt$tRŒĽPEöXBůÁSę+Ä^௠ÂQt/„ÂŽŘIčŞ rz(RĘUŽ Š8Ť‘Lîĺ^*cžJ§L,¤Uj87œ8)§2x5%$yŠŤqcáćłÉďćŠŰéIxŕ˛HiĂ5%€éHńřËb5&ůAÝ])0ÓžVîÖGiŮVŽŻĽŽXőź3ƒ?ĘŻęv?Ź"ˆšú’2t ˙"é˝ GÓąoD×ó#+"­Ľ€ŃMú–gpăÍË ÎÖXôŃ×ÍL'3HžÁ~~Ü­ˇ+-ěZ.˛Šł9we3ZZCrZ@cýt‚ݧÜqඦҩÚÍk`ß)˙”ĺ€]ĄĂÝÁlPL[&K§°ŮŸUFŮećÔ~K™¸%[‘…!QœUˇd{—^Nj)¸j­Ń\všxa=ĘĚáFʂ/˛Ě/’0Ś ×‹ÄD^ĄDDB„DD!}3š–˘pQL漨} “¨ĺ*Ř÷Y݉ –­ťú<} oö~kRŘGœŐśżGĄ­ţĎÍpS÷;ܕƹiţ0ˇőcČŹ÷ĎÁA득&ĎSž fˇçŁďŸ‚†×˛Lő;ŕ¨g0Jbţ4ţďér%{í˝řŒƒűŒPľÔ…Ď<Qc‹´ŠöâRѡ¸EMI ę*älQ4ŕšĘTľ\'¸zޚž<ÔąŸÂň{œ}U–§ާ"ŞŠwnŰ핵¤ňs"Ýo˝Ř?‚“§ľjşż›iř óJ\}Ŕ¨qžP“–ŞŽi 5‹śĐﲽ6w}•›EŁľÔŘ.0ř6~dŞß졿ËiÜ>ɀcüU^:~É3ŒaŁN'čľóí.ŃVS[\ÜůŤaOĽu˝(%ô”U-x1Ě>üăđP•&jg]íĐńÇhßÖGí d{•ĚÄdo0LE[EPm‚뚌ˇ˘łt$K9¨śÇ,Bh\Ů#pË\ӐG­BÍopqóVÝ={^7Wža$ňWŃ—tRŰÉpóTÝ-­­a’L1.qŔĹí`Ý €• ľÎǚŻă´8EMS—Ôż˛ł[e¸;—ičF?´yűľOŇč˝m\Ýíęj yâŢ>÷d,7â2<ů^ję*c–Yűn°áfwŮUgp>ŠÎŰłMkŒüś˙ţ´_ĺT¤Đz⑻í¸EQŽ“Sˇđá.jęD¸Ć°ëóň*†ŘZá抪~ĂR鬌fi> GÔę #ÁťŘ˘–1é)¤--NéÎ}ęBë--]ăHÖQJŮ`ši7\=Mŕ|V,ľ†5â×+B˘zzŒ:gŔđë4ŽąŃ_łŃ,†łćs}ĂđXţ‹ýŸ‰dŸ3›î‚eÜęœ?ę ř…ĆŰKÚEœwşoĺ9`ˇx˛÷pYöцöÓlĂ÷ŚţS–+pĽ/yŕ™ŠL• ŒˇĂÇźţë’”šÇ‚úeźťęŹ–ܝç Ēži鎾ł‘hľ˛zp8K#÷wü@îń[.Äl,ÔôĆ(yœ=V?ňcąčŞĐEfćÇŤ2ë8ýŠ˙ tĽ˝ŃÂçÔŃRGŽ˛ƒ1'ć A]DófH X”Ôű˝‹Ů…2ʈëbqhݑœŢ⣪‚WCK8• …cŰm•Š/]Íx´‚Ąz„DD!DDBŰ9ŠjH(–sRÔ>IÔr•l{ŹúĂé5mŻŃăčkłóZ–Ăé5mŻŃăčkłó\ žŮţäś5ËOń…žë~z>ůř(mqű$ĎSž fˇçŁďŸ‚†×˛Lő;ŕŠg0IâVŸÝý.^ŇĚ‚ůýi'ňăVNˇĆĐG1&ž–ÜÖgÍßsŽ]Žü`{ö•ví=óúŇOĺĆ ńśĄ\,nc¤ěKîí p'Śr=agAő—_eą\d˙ŃĺĄu6™ŮŐŞ;d<ć‡c˝ĽeËŚh[‰ |>Ó˛šÝűfœŔÚJ>ŢşFŃ+\đß^9(šő†˝š¸ů5ş*&ť“ާäţ JIŢgŮrôp=Ě ;žĽÝ×Můf”ƒ!Ź‹ŘhŽj|02!ën+ľŐYmGKO“Dz…ĎŔö‘•#GCŽéd2Sjjj˝Ţ-dĐ÷vAv.ŽĽnŽîś[E‹q-Ůu;ě–z¨ƒź–78ŹRőłű-ɏŠÖHGźdjĆöoŽŞ."{eĘ3 M4Œńç;Žď¸­‹QOPĘŚźš§—Šp8AĐĽÜĘj¸ÎxlŕlFÄ’ĺmkĄŞ´mlľôäÓ:Xȏ´ŢăńXÁˇĹU*)Ȓ)s\:…Ő[Gś2ˇM6Yš+Ai8ćšťFљ!ť[ËrĘ*×2?¸cŢ]ďUTN`gż4ţ ÷śĄř|†á˘í'{v*!śřibtóČŰ̟őÄŹŸKčýYY•tď ć:lpźţóřÓ‡kN&‰ĽÖęy;:`9HáŔÉůĐURŇi+’S05 HöŽ.wpVĆ\đ&ç`Ĺq+ß.Ë9œ7'°TěÉjŽ8çÜt€zŽgTÖ{d •$cذkE¸ůTăÉăĆöŐäŤ]Qľ ^Ÿ§s[#kxxťÔœMŽ—ŁŠĄ§ˆHcľöŇî?ĘŮžKH?ÜGü!R–ÝA0!ôŃťű!s%^ÜŞ*dĄ šVGöáîÚ§Üj`pu]ʑ§ëKÚ?Ąa÷“§qđŽËî[whVŘlîšvąÇ árŐş6Ňęj<žő3ŔĎ&ž8đ=í>őśŞśĹK{´şŐ˛v<ŢâľLU{J†Ś'ÇÔÄsÓ{uŮöňR‘ˇ šÔ†Éše¨t,-k˜nśŤľ´hņ?ZžŹůœßpüŽ9ąGëS՟3›î‚­ÜËŽ ú‹>Çúů›űUąˇ˝Ó%ęҢŢ_!óTް´Űžg{§ţC×ÍţY`žM¸o\ęǙžĹ™Áyđ;ϨŹÚš^*ÄL܁üŻ0Çf”Ů­.şÇéí2߯ËFŇaĂʤo_ý1ůűť×Hi} g´Ű elĚđ0ŃĂt(›čškŚ*ÉâŢ6ďń/wWőŸaŇĘ\]ŽŽqäŐháˇ(:őXš×ËâŞĺű-=sęU:Í9§ŕŁ|Ó@IĘćĽWŰešş†ÝNÂăÖsŔęçxîŤem;hl٧ŤkŒ˛8îFŔx˝ÝçŔ~h É d–˘^ÖŞc˝,ç¸xŠćf>NĽF8ŤęD‘066uhöcUPEKŽ>§yÎęçu%cő'Î*^žŁyNJ™ů%vT1eh  ”‚ îkĺzx•âŘ TDEę„DD!0W¸+ËĄ}3š–Ąô‚ŠcxŠjůÁ'P|Ľ[ë=°úM[kôxúßěüÖ§°9Ťl~C[ýŸšŕĽöĎ÷%ąŽZŒ-÷[óŃ÷ĎÁCkŮ&zđS5ż=|ü6ˇý“gŠßK9‚JżęÓűżĽËZo>O|ţł“ůqŻ›•ś‚ćř|žŽ:ŽĹĹĚßÁĆŹxrŕ;‚ťŇpiݤüRA˙.5qr’’ŮoY(`' hsĎsG2V7 œ:Ýv4`x8ËśĘ*XŰ mŠ›mäÖ7{“‰Ż8P´jŤÓƒm6ĆĐ@yMR7ä#ź4pÜŹ˘ßąŰ˝ßńq­­çńk?„aŠ $šdßH(ávF÷vhş–űeˇÚËĽ4OS´đŽ?‚ú§ÖĐLá’Ń]t”ú'ł0Çís¸á+eŮvmŁ "ß xęŕ Ď­ť>´ŰĂK÷pލP8dÚşécbRéMQÝÇřZëg:^çň…mîčő’ fÝÎä` “Ď€ cUęÚF^ ˇC(í>Ť3Ā9•3<6ÓL-ÔŇś3Đ4đϊŐÓhĘşM Cvs™—oψǚią­5˘Ŕh=?ˆĽťšěÎyťœ;öôYÖŻ”TéQ&0ObĺFVşßŚő„âڞäÚ(~óÚ>ĆďbęI™¤cc†'ŸŠrTGˇŐŰ\ăš5ňIËzČŘ˙˜}éj¨„ąąŸˆ~š§"¨t˛Îw~ŤŁ6IŚâśYِFc‡\,ś˛ČkëŮÚłx4ď`ňĎzžŃt­OłĹNT4łň-iM9Ç6ŠtT } |ÇçŞÓűJŐpéŤ4””§œo9_Đ-!$M …Ü6Şâ˙8—ů͇÷Z9pďć§vXë†Đm”čŁsę^;ËAÝţöyŤps¸ŞŢÓ,‚ˇTÖ×WČ.âHo •j›Ů>z ËŮ.ôÖUXíóĹ[ÇXíîkm˜K2lˇMQşŘ.§łÝţ}EŽwűĆůţ&ŕţ+ďäË}žíĽŠmě!žQ#œ÷œ˝ç ĆO‡úâJÇmun/oO)“QéŹôšOƒVôŚŰcĽŐîk¨f6×)]˘ţ€‹Ö§ęţi/Ü?čŻŮř˝k!Šů´ŸtüŸĚR¸v´1ü+“6+í{P˛],•"ĚDl\çDö4x ç+8Ůƅ¨ŠŹ–ű|ĕs‘$ÎĆîc{€ĺâ+\šÂXe ý^VלGLŰl“ŽďNţšRtLlœ{yˆˇÉrÔŞÇƒy˙[Mžń'Ż U;,†ĆÖ´ 5Ł ZŰhúڛOÚ䣌“zGy§s‹¤qäĐ=kd܌̶Lęoé1ÇźËz…âmRŰĄo{ÔlpóúÄ~đřgŮIĂa’ײŘލÓĎN\űŸAĐz•‰ŐIRe–ĺqvőlĂŃÎD-űó=ëşV9ÜVW{s˛ĺ€\wŠŘ¢óťrˇŸ)ăÄ,ĐŁ*f.'а{˛UYIʡ<×m@ 5Ćĺ^ ˆˆ„""!Ş5™^0dŤŘ!Ţ#‚ŠďʤŃuE°“ŃTÄôRđŇ44ĐN2N¤v’á菚+šĂşe°’ą†S;<”Ľ 9ßËlîϢ¤hí.jϟanęö@n¤ěPćđ[CôyiKq> t&ŘęëAŽ#ťŽqŕŃí$¸6)guśÍDŮťŮEžüô\Źrńd{†Ë+°}4]s_äÖŽpßŰ?­ö•ˆw‡|­eć7ß!ŻÉ{œěg˘şŐnŇÔäőV4X…‘SPÉŠęNĂú\ĎŚn4ś=~Ť¨i–GŢdŠ[éJóxhř“Đł˝łš˝A\ow×Jq’G™y†´w|VşĐ–Ăs×Ռ™ĺôÔÓÉź5žĺהvăGb§§§nëwCŽĽ) 3a{ć:šÇň ‡ÔIˆQ‹ˆăhÍmÜ{{•6œ˛PĆ -ˇ†ó‡äŚ++h-poĚöFހuQŽwÉtʍq  ĺźÁhYŞďş˘ůYmłŐÇM1 ¨Šx's9ĂZާ‡‚şGľ­2Hli˛2ŇŃÄ8ŽŘtš[Rűľ;eľŽÝ–(Ŕę÷Ťn›lšăPúk45WI‡ ĘfŹŽÚ°ďöZÔÉ{k‰šë>r_Výćçî7°TíفŠž&Ey1 Řt˜ko ?4ë0ŠƒzéĎšş-¤őŽ ŞÖ_$Ţ e,˝‹g1űŀž‘Ă<:ete-´ ř­—˛ýt.4†ż0T5ݔŃ?ŠAŔ‚=kXjŮ;=łi×çŃt˙ȑR˝M%’úÍS@cˆesŐŁ€“ŮŔ wŹ•f:Îů\ČÜţëށňa˘ž›Ú1θűÍęUšŽ9ăů…§v­ĄĹ}(šPf9X{H¤hăÂδ~ن˙eŒ‰CŚcF8úMSRö51IMPÍčd ôńNŰ)ąWJY]dŒŘîÓŘ˙í ăIŢęęy4}•\'rxţ˝ǁćrĽ-s¸-ç´ÝSdşşďAyhýcĘhű˝}BŐľôŃUSśŚ˝ĆAÂrŠ_ü˝ËZŠłÇBs‹HÝ={üÖş¨Œ‡fႲę]× XđWsĄÁAíąVč„aФDD!U˘*j†-ç ¤íźŕłŞ‰ 6WÄ5RTöW^5ŮNô aä]źAĎł dE˛{œtŒšŰQQG‘–†čĎö]ÁbV‰…6ݞTrkËâwˇü×hhšijôäm!žpň‘w9ÚŹjĎüDAš[…ĘRémqov %{]ӏ´~ ČaŐšłI1Żę÷TäxđÝü×eMcľĎĹôŹÉęˇn—´5űŸ­&ćDíÁO´c Ѳ´úšŻOč=I~Ź€ßB8=”3 Čä\NI÷álŰĺâߢ4ëéă~ô„aîo7Ÿ°Ő´dśĹ#㣍ą8–Ž%k›Ţ†űWż[ ęÓÁ¤áŞŘň4e`°XŐô•aÂY {Ηf…­ô5Ćé}Őőˇ§1ń1ĄŹ1<9€œĐGŽDŽĎ>kcmí˛ĂOx(K¸W”śŰŒŁ2L łd㟊ѺçQMŹo’[!˜śœť524ú ű#÷!ďR. nw’ §sÉŁˆYŇqžVŽçş„ŮuT”zšîʆáވ8c,/ nęěş˜ĺľÁ Ák˜^Ú5žďjŒ6{c{>Ę1ř~ČăŢőžśu­íכ,TłT´;Ćâxz’´ňâš#˘č_ÂńÓÉ =.:,×SDúŰ+„K3/ŃÔR雥ćŰ{´o¨Ť51M9Ýd-hĆńŕ1ťÔőőŽ´§„8o=Ç …ˆj}ŰoĽÎu4R}GŽ^Ľádńđžl™ˆŚ¨Đ71ľˆî=>U]ěŁ.uⅠs&ĄŸâ ęľÎˇ=‡ˇš¨çSÄç5€œȁφOKpżaöĆÉżŽž‡‚םAŃôV i˘7ől.-o!Ŕ•C0ĆÚĹ×Q—é4Ěp§-šľĘśÓňĹQľĂQO+&†J^Ér×4“‚PşîÓôM?Ü ‰ös V˝WAɰČGq{œóřšv•š˘'YéŽřâÁŐ3 rŔĐ:(ŔđqiË´$5Ckż íř.aŇˆÔjšiŘŮ"š°ľěwć–A])´*¸ŁÓŽ%ăŻ#ŕšBÉZ)gՙţčT×BeŚČ;Ť¨dyü 4Ůľöm)¨¤°ÔĘKiß˝N÷éa'Í>ž‡Ä-őv–Ii[[BíöÚLFZ.ÍÁo›$O Ię~ÓőÓMfcdÎ.}$ŁĚw‹OŐ?‡‚č{m=žŹŠŠ)Ů#üCÖ§'ˇRUSˆgˆ= `g˜S~R2¸h§î˘- ę6pőî¸†Ś˝Đ8˛ă§îňŽŒ`‘§Ôrŕ­Ůq†CŠk%Îg“€ŢÄ7ń%v%V„ľNňŕÜâ2¨GłëS“Œx4(Ř6qOź\yLl'˝×"U3Uş‘ŠÖŕHí¤ńş=Ą[Ű.őw;݂Šá*č*ĺ¤ËFŻ‚éýya´Zě9† ěĺÄ÷ĚaŐľ!ăó;qŽ[ąÄ?ÁxřŁicš5şÍńŐ˛Ššj’4a:lťSF~ĎƲ ϙÍ÷Ác"Ş)4űxç޲ ęˆŰC9ßož nuą‡Čßòš#]żłÚʼnýΟů/Ik˜âčŢ˜á‚×qw´*Śťh։šŕw_0á˙ÄďńPs×âCç%ę)8ó_ŃOčÜšpöűĘĚt6˘›IjHíŚc䒝úG8獍ń]) L7ëéˆ-xó€úŽî\tů_Kؙ7%iߊAÎ7ŽGýt[“eđIś]öĘhÉä{LJ_RiÖČíÇę˛ëaVű)ż…ÝýĹm›˛ íŠôS4v€ÍÇĄî\ľŤtôÚV÷3dŒśßP˙;‡dďőžő×ôôđoö‚Vš‡ˆ óX^Ň´ĹćÍ4ÁŒ{ƒH{~Đď^7”¨T2JR+âÝźĂď7ţ—]¨÷\î އuǂÎî4ďˇÔžŮPâđÜö2ŹŃőOˆř,J˝€8Ž— ˜‘bśř‘Ď–=ŠÇŢÜđŤĘ8Ş ¨i¸J”DE5â""ŞFpTľۤ(`pUĚ2ŃćV1ÖYƒsU.Šnʢ‰"q彎GŔĺl ;ľ͒⏜ÖÁĹŃ~°ý•ŠiŤK1ĹNS]‹qç.RډáĹĚ^TŃSÖŘ˸؍ č géi.Op|.Ű(ĆYIśëŔ•é‰ń๔]˘™›“5’7šŕřŞnů@wíty<ȅ űŔĘĘt2 ÚŠTŒöU.ů꺖§m8ŁŢůZ”zŽV|ŰŐ°5ÉÓ<đ „d•˘„v6ä‹]+łöăřŻż”ŠéÚ[M PƒŇ6†ü­†CłT]…K&“T¸MMwÖƒQ<寡Rť‰’_é<ĐúÔH݂ЛÍfIŜ÷;#˘ĎËţĐšž;°{7$ĂÚyľĂ Ż ŹďóŸkŁqď04ţISĘ­şÉAfNćŽŰށťmćĎNŢOî-EŞ5]nšŠu%/oŒIU,d5­áœéáů(WRSęzxa=ě`oÁ|Iy?ižg e(đx„‚YĺsČﲔşIYmžGzś5ő ě™ŕŒeÍ äGzʨöľyĽą›MĹŘ`…ŽáŮôŢö—ąĐÍrˇdÍfIY/K‡z,Ňűľ ˝ĘŠHM˛ŕ7†0XJĂčgž••52~şŽNŐÍS†0ŹćşšĂŇQ“W—uNŇ˝çÎŁIEMDKĄ˝Ďu’śęCý%yĺVä: ˜˙Łž3‡7ĂÄx,Ës•yOpsHó“a€‹„˙<ź\śŹ{Iżé×5•đISyTSeÜ<[Ě|ѲíâÍSCîчr"AĹse5ÝÍÇœŽŸSoŤ;ŐTtó¸ő’0ăď+*Ji[ĄY‰ŽÍK!Đmů.Ź˙śK&î~T¤ţ0ąËžŢl”Ńťvď#ŁÎ}…GAîU™WAJíęZ:xßmoŔ*D2tb‘Ăj¤•&ނË5ԛLşęfşeTÍw,ƒqƒÇ.áîXĽMŚj;U”unž˛’i*^)đ7ąęÝVR^‰úĘÜŢ]ö”ÝC4„Ń7K‡ŇŇąí9´$îVuhڅęÝJȍŚâp1Â0ŻjöżxšĂj¸3#žáZăĺ—}ĽJKťˆô“ ¤œVyŔ¨z_óŃVŤšW^/ŹşU2JhМâÖĘÜ9îswyt*Ö˘ť/„(1âFŠ C2 I˛¤É(S>d× Â¸ (T¨`ᆛ8s^°0fţlčşy 'ŽšsŮŇulŻŠ:vóŢˡŻżf\xQá†+#J›VК-˜$%'AÚˇo՚şíÝRĽ)ڛZŐęŐ$̘0pŔ†•ř°"WŒÁ.^:1ĽÉ’[ žTÉą]K—0gÖĐ!ƒ¨SŤŢPĂN hĺŽm ˇślpAńJÔ푁cřúúĹząE„†'¨x^ťąd'™…ĺaçĚëŘłkŸ íÜÜÜ(3~( pŤúî:Ő|zőY˝2ß8Ţwćűó鋯Źň2ţȒéǒßDŕ–LŁ™†Z 4ƒ†Đŕ –kËĺ´Ňş÷žľdb+ŸFŚZB+"3ňŞ!#ß+(ł˘:+‘†xh46ł|`#j4fPă5NP#˛ËóPłžŠšerO‹qL7]€—đmbá†CËu´œęÇń˜źQEŽ5zÄäX: s™“ŽQ:Xđ‚ Kç{™ 6*TęF:Шu6Ŕ™ .DŁ P€F?IОxÇß5¤FÁ+Œ˜h€ú°iĂó–wľçÁŠhŇŁ Ɣ§-ěáIl2ąÉiţt6€m Zŕ‚.vąä;Ÿ R°ŻĘPíüěƨFľĆ:°œ ţ…ąčĺ9;,Ţ}Dĺ08j ȸ@ËŮj?b Şš# ‰‘$}¤Ż}ŃČ˜4ÖÇ9Ú A ‘°hÄĆPËڍüź­t…E'ú!fIËY=ĹbŐÚdÄ#>+8^j\˝âw€fۛbD@‚€/‹[ô˘4żHžśÉm_üĘäK°>4ţK~ş†\ȰSŇŃY˜ÁĎ+Ă)Y֒–ˇô>ţAE˛<ä,Nö I.’’rł‘%m`ŻMv“„Ž“EŁ T€F ĂFxjÔ;\‡sÂc>bihą|hăPi\cW˜n:vcŸŞ gÉĂCÖZűëßgš¸ČKąšŞFÔłž1^…0ÉMzŐKÂ.ăA/l!ÜâO˘ĐŰLž-sţ{śiíýsH•ü4Ć*?Uő”ÁŚ ˘ cDÁÇz jřnśÁ“[*Ŕ=Uń^lË⠆­ćĄę‹ŃÜĤQ),iQšMĽł9ƒŹéMŤÓ—1¨ý,j‘:MЧŔ筊ӝ‘PôbóQ'mˇJ;ôŇşť3IR˛ŸLiŠĎŰî6WăËäS'ćjç- ¸X'˘ EŞżš,¨ˇ€†;|ÔÂ<€W âY›ât™ žb°ß–‚ÖâřÜč~´şůĹnŰBŰ҂‹7:Í;pĘŘťDŮ>˛ž˝Ý4pG§eü|…Ë҈śBĽ›ĆŒvvťOţî:ďśĂ^c¤‡ď|Ď|¤ŽŠżó㈁4}IŠž¨…y”H‹!¨¨‹—x“6ɗȹ‹#Њ…é™Đš‹ü¨šHœ¤”ąČœk‰$IŒËŽĆš—(”şh‰éŠš—–¸˜`Y”‰Ř›Ti¸ú™}óšŸÚˆ–ţ ŇWŸٟƒ) šţ  úŸ Ú ĘWŸ˝Š:ĄZĄzĄťĄ%yžÚĄúĄ şŸˆ†‰ž:ůÎɞƒČĄ!Ú˘'ş˘q8‡/j˘˜i…Úg Čɝ2Ę}ťéDy†}™œ@úŁř8„;ę˘z™RH¤šÉ‘h¸“żw¤éّ(y¤ŠƒMú“*˜ÍȐ Ф`ę_:¤Ă—•s ™6J~e¸‘~É|=ę‚ُâŽk’Ń)ŚZ˜uŚ|zó(œÇY•€š‹´)›\:‘@ɌŘI‡nˆ—Ɇ6(|W*¤Čˆú—~z§:¨¤}Ú˘óФYé˜ď)šŠžmúšœ9‰Ľ¤wyž5ŮĽü÷ځţ‰¨H ‚˘JŚřŮŚcÚŠ| Şš)™Ł ˜8ŠŤ—Şڞ…ę”Iَ7ŠEŠ›¨j§k8¤‘ЧźÚ§žş–˘jŚЧxŞŤÚššRXŞĎJĽŐ鼸7Š”Ş?Š—ŕڔ„Ůž™z­Hš­ů”ŽŠ‘ú•g­ěşŞrŠŹqœÁʤÍ*Ť”ú}Áč­Eو*  ĹɕđɢôÚĄť$ůތš“Ţ9‰zéš ’ńš•äxąŇŠž’аƇŁóú˛łOČŹÖZ~ÓJ#*ł:ťłBHąIZ9ËłB;´DŰ A[´H›´J‹ł,[ŚF œgčŞĎľRş´ë‡˛([łQ‰ţYJł[:}.ťąwę{ÎĽA™Tę™8ůľVť œ ’蚍hڃťŠŸŰ§Ź|e YŠŻ&›ŒkŤ•mŰ o‹Ť$zŻD“|ŤŚ ۚ^K{ˆÉŽëI§+Ž>[¸…ú¸ƒŰß “ëš ¸Žîišh–Ž‹˘9*§žk¤şş‚k–Ő |e şdiŠ›]ťĄbɐUťšüšş]YŽ˙ڐěŻäĘť 9ˇ,)şˆËŞ^Iťć:–ąjłZ‹Š{ťj؜Ŕëşk°žŤŸöšŞŔJŞÍŚŰ¸ĆęşÎ Šx{˛+K˝¸ťźÉkžŮ‹¨Ű źuˇßËš| šˇ)žýȰYˆżí*ţŽĘ››ÇűŽíŘ˝š§Ž˜š|ŽŹ˝6BŔ¸ůşűëŸö ÁŇŞžŇëŽyzÁâË­Đ+°l›´iĽMKťÓ™¨Ľ{Š.Ź°Ü źb¨˜™;ś ž%|‰Ž¨žŮɘşaÉÂ|ş¨žHʞŚzÁ>,Ă$ťĂÓë|-[Äšë’÷ëš÷™ĂZü´Ţ łŘwłěw´{xĹIĹ[|ĆNÜŠ˝ű MŤÁWü›hÇr}bŒoœ‘f<ÇzźÇ˛ŰƇ›Ťy<Ł÷kĂP Ł|lM̨ÄYĹˆżŰŤšń+Ă% Ć ČšˇKŞśů˒4ŒÇl¤‡ź‡dZŞ]زÍ­&ť§l{Ś: ŤÇţ‡ÉizťçKżŤKČ]źĆl¨! ĘNZ˘Č§ŹvzÄœźœ™ąť|‘Ť¨>œÄŸÉĽ‰œ„\Á@<“¸źŸÄꩋۮH<ÍŕYłůZČŠŁĘŹż/ü–]ÜŔ, ĽľťšŰÄĐ‹d ˝¨\ÍOčČöüĚşkÇE\żŒ¸ÓLłű Źä9ĚrŰżňLÎş7ť’\Ťý¸9xż˙ëĹzÍ'JĆJÉśjŔ\hɂ Ă\,ŔJyËKœśŻœÎ) ­Č[Žž,É~Ťľ jŃڋŃÖ ˇLšţœÉ኿ŸLŁ ÎćěʁKś(mĐ˙:›=ŚŐşČ…K´Ű+Í@]Ĺě–í[šţ¨Ęţˇ›yŤęœ¸)M˛ Îđş'ťÍ"ÝŻň Ώź¨dÄ"KĎÝÉXěÉŐöë¸ ˛y‰Ákýżř,źPËÖÁ‹Ö›şçœŽ~l|}ÝҌĘđ,×íťp-Ľ”l¸ŮWǎ ńœĹ™ÍǘÝŮ=Čp Úzü٤­Ăwěѧ˝żŚÝŘ_ę‡j}ÂvŘEťŮt]ĎpýËš­Ó! Ë6=ŇÔ_MÎť}Ąś­ÚW‹Ľ˘x¤üĹ`ęۖԓ,ËAěÚBűÔÉŮ3ŤŘFh€Ď°'Źşi}•{Zź8ŹÔ}¨|­Ř­Ý۝śË\žŞ+ޜšÄ@mߟŤąÜlĄł{Ž|ŠËúţÎ kŠ ÝÔCĎȝÜćëĚiŢÉĚM°îˆÓáa ݜĘ‡]‡ˇşÉ<‹ŕĹ ‡#íŐŰÁÔŽVĚ˝*mՎܡ.ż"ěˆ NÜíĘI{ĹşŚ |ⷙâ2›Iá5ZĄěż <Ѐí§ň™žÚüYâ7.Ŕ:ŞĘCnŽ]á¨:âÔĄnMŤz˝Ň‰˘1ßg=şPţĹ÷ÝÖDÜŐÎą0ŮÜ<üźŸëÂÓš ­˝ƒ5~á\žća:Ô5ç‰íç„n~‘íçy^芾č—=čŒţ萎}‰Óc>Űçm5~č‘ŽŘ–ŽŚ}nÝ Ý\ŹÉ|Ż}ᛮÜŔţźĚ}ŘË÷éé'ꠎÓ|mę žŢŠžę°ůËލ¤ÉlásJŢčKߍ­ŞY˝ĘšžëđÖB\ŕÝü§’kČŔnćúíF^Ôd]ŠěŒžgžŤn˝ĚbžěBXš Ž•Ń_něx{îDţި~1n˝tKÝ~8ęÁ|ëâŽęŰąZŮ䎊â0 şCžžăŘţŔëLî$mďĽűîůţŰěĚŐ&}ĂłŒĘ,˝ŽíęúyäżÎJţá-ăŽďoś^ýŇ9ĚźťĽœÓVń¸ž~^.Á˛ÝíćůěśěĂ9ą°ţč‘ýfŽ;ĎҲůĺŇ.ÎôeÝóČěčeşçü\ňNóţRm´N/őXżâ›>éYßőŠÎő^öŒöˇîąŰî|öLżčšnčkă?Ö­ŽŔ÷Žđđ ńboňşžÜĘýöČÎߟÍĂ^ˇś)ôѝ÷ź­ďSŠ€ß żá=ŢC_ŢK_ěómó~Ďč’?§Íîîl’ű}ÄÖŽóúůÚßĎjťÜ>݌\ĐNňˆŸŠěëă”°`îîëţň¸oá—ßôrßď,nřƒŻĐÉŽ˙úޞĚę"ßż3Ď´Ţî/ęäňjš^ Ę}˝ŃĆż÷ÂZî;Mń,ŸĎOýsťűt\ԏűH}ă[*ń7íđŰĎăĺ;™˝ňÚ*âĂŤĺĎŻńaźţÂ4Żô@  …CŁąH$—É#­šT2ĽÇ"ó‰Źfš]ďÉeómz…ÔęZŤ˝"ŸNkýŘlz8j .0oĎ.-Qq(&Ć`ŚŚq‘-Š  “r“łÓó4T”ˆî̏OoôKSőłń1r˛u–śÖö7—r°ě5U7˜óR2F9Yy™š͡Řyš‹8ö˜:[{›ťű2Şď×Ň{Úژ“őnj+“Ëí;|ž™—Ú}}o/z|—žŇœ,(Šä DTp )6 †Ař˘°‡]œ$ČPŽž}~ĐEL[Ăg™Jadč!‘Ť<śt6Ń᧓MřÔä‡/ Lţ—Œ“5Ž ź) 5ĄlhďŕKÖŮůYŃRƒQĹRőä!Bŕn $캥uvŮôÓŤKKeëTŠľJĄÖ%í­[Ł•r+öčÖ}âŽÎ™ËÔ/´vϚTłFn:”:łŠ”ËŇnfZRŰśŹŚmथý”śt˜agż§5iüYbĹ ‰š‘ě.ÝÖťAq–˝tjŃÁ…›ĆřrbĺM3ż6œ[5âŹ+çž ş:oí›|G>P?ësKŸ˝Ü;ňŃ._] tń[Řa˙qw…5F+8ˇ÷ƒôź­Ćęk,˝t+ĐĄřđJ@Bôs˝žŽšK<’zńĂţ i“/˘˛Ę‘đ Eń)ItŚ˝U\‘ĹÓHŃĹeœ‘Esúoż‰Ll‹ż”<¤˘—éі=rî"’TBč/uš\H œ9ŰÄeJˆLDžĂžîą+-ŒRĘN˛$.™3éiĚ+ŹÂR :фSľäň"3CЈŞ*Ł8VŁMƒŞÄ0­*äĎć@¨"8“¸cŰ;Ϣ ϝđŇsĽďbKŤIÜČş˛0ôÔ35>¨ś|0??uKoŒĘ–ŹrŇLyëÎŇZÁsRÔ|”ÂW/ă0BXB¤ňÔ#ĺ•Ňú€ ­Y[[Ău2]Ť}˛"eĄLÖźĺÄ|jËK“­sţĄYżĹ„ŻđäSSZm¨…ś6áöä/[o×KOŘ|ˇ¨˝TűƒV“ÜüUŇO¤ˆČv;ěŃ;ű}“9NlÇÜCű´žläŽBĚ.Qä`žěÜEC eçLy“Y~ć˜ĎpYćšmž™š/Œ PŠv8œçY9*v“ĚpՑ””wĚ.™=PhrŚŹWםžQäMiz×W1šę¨ˇ1újb‹‘M€ĆřNS!ôxYˇ1{lŻßÊ Ĺ Tí™ ĽďЂUÔXF÷Óßu§˘ŠgWœî—ÄăÔNŞy”;ÇYý-î9Tźld’>2<<śłq–ލ6ňlpmţŮ]ąý”ŘT‚ý|ŘЗ=ÎËŞCnŐáݡő{âzÔą81ďU[žľŐ7ě’ ŠsŇˎéěŕ…UÜ苯çxXa[=ĄŽ“‡ôŢqŐ÷őŰyúu´A€ĎÍąçŒ žű`ÇżŸfdžuU~‚Z %/‹ýksDۆθd>¨Ľn­Ű?tw FƒÜP`sf2~„źš`IXÂz;8ň^Ć~Vżš0ÔEÂ6ƒ6š-x)šĂCB…;ÂPdG{O’*řąŹÝpjKËކĐĺCńd“ řŽ8˝š† ´Vć4aŠ5Lţ.†ĹÁ˝o ň[˘˛xąžiţftŽJœÓ–8ŚWŠua4Óäě6<ž¸G|™ăŠôć9CŽ ‡îC˘ľJw8ŽľĎ:ÄYő˜ÇÎ,ČSŰ{Ú|şwˆgŮ+_­‚ă"#öźÚ /‡‘DĽ*+يw1mˆÝj›,hĘCB˛%á !ˇ¨,íÁRNke-^ &sÉÉDTë$í ÷(ö%ň„VôéţŞ~4Ş(đÁ¤ŕ&Ăa>ƒaGó×M­˜-€÷ ÜÄčW,ŸœĚÇIĺ<ż™Š ҃’´a=ůi ‚pŸýč@żP‚ĄÍc$aŇżBü%DE–ĎbHkVj‡#ŘDÄĹJ˘S䒵ˆ˜&Jţš`Äđh7\,¤XKa<Ј4śÉP‹é%ZhHÇxÍ2ŚţŁUĘ(3†łgdá?5ŽĽŕZ|úQ;B)[ż *ĹŘA9ĺąjšOčŇŞ•Ž~îœĐůúRćŞ,]áVAš”:1ŽJ×2§őVŃ*q…˛‘­á3Őם5ë*ĽŤ+%>Ë-qv|EŹ-ÉJU‘ňŻgĺđ´JÂ>pąml×~ş:*ó”‡LÜ-aŞH”ŇYěD×i´ůłjŠj“Ţ mDwčĆŽ Ĺ@Ű"` ‘™Ój˛0—7”‰ŰÜݖéĽC“Ţ;Ÿť[ÝîOĄŐŐî÷˛ť]ťţsCÓua'N’—d1ş pŻiż ˇŻm-cH)ÓJŹ˛Ž+‹|…Ţ­ščwÜ"Đgďô̚Ҵ?=ěńęHŠęur§Ä4ů[7ŻÝ.]´ú"hGJOúJ§€Ói*ď‡ÜżŠž0…[Ä$őt58=\žemwڄUXqü(UŻťń ŠžMlr“ł­¨ ě&6=Š<ËtS Ž/Š?éŞÉv8(e쐉l1"ů‘ťsŐ6ě\‘jg°’ľ×xqâýŠËŚ2€á\łĽĚâ­1zqœc̊yľ;mňÜŹŘ sĹËŞčłëŽědËÍÎŔóí“?LݰzRśţoߔÎM;Tž\Š GFąhFŰV•#‘äęœ¤x;á媎z<é˘ůBžßu—‹d-3ÓĆÔş~YŻcöëŽű Ä.ö~Ad'[šBd"sű#ęc?{  Ţ2ÂĚ|Ť c› ÚŽkšŘL˘ň€;Ü7}ă€ä'dl˘ŢÓ]Ťeäřb;9ŢůNnTYĺł.Řú8@Ś\šŠÖ:ŕW8tipňœż —řŔqZsœœžřƃĄlM›ă!†ÇE^ryËä)?ÉUŢr×ZZ¨=N¸Ë9.î‹r۲4×y'lţD˙{ć;ĎwڞĘî;ŘźBWú"t|đÄTőRA_ţ:¸ÓÜVÓ=RęSwŐźLůWëSoxﮗĂdží^xŤ.Ža>ž7íqË3Gkšß}îŃĆűޙaŁsóđ­Hъ_řPźČ×Ţd˜Ź\ęŠWoôŇdt•ö^¨‰IřÎÇBmˇ8!ŻĂe@üFH˝x煾ÖsVíO[J.ʧ.ą˘=ôLyŚ_ŹśäCßKR*^ľ#1Îçž§Uíëá3;œŹxÖl4ӟůh˝\íląę=ýůŠfâB_ßÁ¨ŸÔTÝęšę0ăf“"6.ń/Y>BŽ^ăáᓥJeôcv`Ÿ|{ŚłXb¸LódŒú:ĹŻˆ‹Źňď¨öŚţĽ‹Ň˛€č˜Í&ĘŁţ nŤNňL–|lj܀™Â˙P]î•2)5NL`źĘŹ°Ďą$kú& ȐTđ¨{b|şÂĚ2RtŽ˘´VrŒ"L6BdFRt~’Ź 2TVb„ڞÄÚâ䞦ź>ZtŽ–Ź&JlÎŇÜ6JdBZ|&:dvФNj„"LRj„>Rl–ŞźfrœFNt:T6JtJb„NZ|.BdžĘԖ˘´ŽžŹZjŒ~Šœ*L2R|^r”ŠšŹ>Jtîňô.JlŇÚäFZ„:dv†¤ *L˛şĚVnŒ>R|fz”NbŒĆĘÔ–Ś´–ž´.T&BdFb|NV|†’¤2Tęę잮Ä6Nt.FdŽžź~ޤ^v”.NtÚŢä:dLÂĆÔ’Śź>FlFVtRf„ŽśÄ>^|ŽšŹ>JlB^|6>dzޤVj”J^|ZnŒ*\2V|2J|n~œ&FlFf„2Tr†œžĆĚ6Vt’˘´ "L6Fd~–Ź.>dNnŒVj„šŽźNf„š˘´’žŹ2Jl:V|f~”ĆÎÔ:Nt.Ft‚ޤ^vœ>dT’šŹr‚œ6RlVv”ţţü6dŞśÄÂÎ܊–Ź.dÖŢäśžĚŚŽźžŞźÎÖä6Nl&>l&T>Vt.TŠž´>NtF^„ .TNfŒęîôD &M:Tfvœ>Nl>Z„Nj”.d&BtFbŒ2dFV„2df~¤ŢâěFZ|zŠŚšŞ˝Nb„^j”z†žšŚźbvŢŢěVf‹N^„^n“6V|>V|žÂ̂’ŹÂĘÔ6R|ÖÚ䢮ĒžźF^|‚–Ź2Ftn‚¤Ž˘źVr”6BlFR|VbŒÚâě>Z|&Jt6Jl&:lNjŒ"TRjŒ>Rt6J|NZ„.Bl–˘źŽž´~Ф*T^rœŠš´.Jt:l *TVn”fzœĆĘÜ–Śź&BlFb„ęęô6N|.Fl~ŽŹÚŢě:lFV|ŽśĚ>^„Žš´zŽŹ2V„&FtFfŒžĆԒ˘ź6FlVjŒš˘ź’ž´2JtĆÎÜ:N|‚ŽŹ>l’š´6RtŞśĚžŞÄ>N|F^ŒNf”L!ţMade with GIMP,N(ţk@EŃ>ƒh˘Ą‰‡FŤ}âɓˇĐJ!4húX‘Ă*ކń d…Fş}š$ĆCÇ*b4wĄ ‚âŽZ‹j/ŁUŤfŔ$hĐý şŹ^4\¸\:ôŕ+&Ž”b‚k)TŞ‹pA}ŞuŠUŻHĂV=ĄlW&Lš–E[6,Y´ŽžŽ#;Ž€6 h˜8@…ʝźńE‹feŁ•}$ôYŹĐ„‰h=Xą‚†N}˙˛âŃC4’Ź Ä™ Ťo¸AAۉ/Ý­FĂʄ"nܔST•v gĄ€fڰxŤTɂ,´QKľ –I&ĽââmŇ,ăů,ţ¤*GD1 ŒŽƒE‡f̊y3&C˛cŠ1ĺŚŇ¤b:$ăťJ÷@ă 7XĐa@°ŒŢxƒE?"HbÄĚĐ!Ŕ˘ƒł0c#s`Q ,,3 Œ0ScěbÁŻXŔŒ,Xœ7ß|•$3ZW `ÁɅX2ƒÂJ2•X(Â9=bqŽ_0B%ÎĂČ,ýć—tXŔ‰|ą Ľâpœ†ÂÁ _|9‹­ód'B6ŮüiÁ}Ŕ€ł„GĄŃ Šc°SÉŢ`™é.} )Â$JΠŹ+¨Jh“X{ ý `„ÉĚŒÜQŒɰĘ,ů3tœqŒ1gă„îapĽ ˛‹‰tTJ%ţ´AlËdsC%Śŕ`ŚËĂ0mTÂÎ2cœZńĹÖy#‚ČţxÓF˝ÂZŔ,ĐÁσ8€aŤ5w`Ń ; ZŔ&”pÂ!îÔüe?;Ž)CÍł|Y33H2‹)tĐjÄ UxcJ1k~[@°ý(W ÚčL2Î'1şUţú%slÓ1Ď<ÇQmˆţ! ˜đ+UbW ‹Ŕd“ 8ʰ ‡`î‰E,đT뼠Xuš§Š€ř˛™p_ŕP @ƒRq'ÝaąŒe3çÍąÉ,óĹ ÝŔŻCőK0R#(ÂyLœĚĚb|/ˆ*JĄĘ̲‚ůœ‡EěÁąZI>ifúĽ|Ĺ|QÉÚX|ŃĎ JTbÄFœ3@1çˆqM…ŕŇi^Ç" €ޤbJ‰üš’ƒu•ĘCýHN?„‡gÄéDSXŔ Úa [,cąËĆ@7†ÂIkƒĽÁ &tŽ|ظD ägůd Z°Ăśa‹”Ŕ¨Đʃ5f!ţp@ĎŚM‰:hPŚdAľ|ˆhGŽŞřœ‡ZŃĄĹĆ $ĄJX膮CTcGS ĚEKđ"ĚX8P4?@1Fř×4Ž8‰ŽATŁĂ°*Ez艏bĆ#Ú#Še­őńF{Œ€HĚŕŹx7’‘ XĘœH19ˆáďC8Âх6ÎaÇŢqÖŞPťČ0ĆĹ'CÍ`† ”Ŕ‚)$IsŒ¸Á” x  fŒÄ:V&Hŕ wřŔ<˛0QŠľ8^„ŽÝŔřF!ˆĺQđ  hĂąŒcďţŰaň ÷‡f!… Üân8řUÄ ˆ€0„äw„^ŕ˘ ¸€ź]Íť(QÉ|5ŕ 2ŕÂź1€äŁCý¨öi;ŕał…ƒć1‡wô‚ ł˜Ä$îŽ՟H*+˜`‚ő“ đ€G4 ‰1$i ŔĐ)0 [Řˆ‘ó7žĐŽ@Źbe"^!ƒ§éŠś?*á€EÂÜčÓ)ŃĆÜ@Ś8ŔaJ4Ą'ŔE5 p )Xyq1Ż)- ;¸Ł)RáK@1?źă! S(҂‰Yx#@$ţD24áY!PȤXp0(0!Żm†Q‰1´`˛"œˆś‹˛ąfů`DëPŒeĊéˆ\*ŕš- c@1€¸€•m´ĐA6¨ą…IĚ`MhÁ픏sTB cđ.kÁ p/XxD˘čĹ#0âŘ'3ĘV (ş#ć"!DđÄ(Á]ƒ"Ś€ŕqTŔGÔQ T‰h0Áş3Óąčp (Ę#“aĽpůU Š€Bť€b |–_LÖD˝ĐńWq80ƒ¨ő,ÍĄ„cr "˜G?˛ƒ= á L‡C“Á: H€â)pđ5Vy#QË(ţą (Ă5S8[˘I@ń‰űĽC¸0 |óށ(Aváľl(W Ä ˜ 8IŠŞ†˜IŸ÷„hŚP3P¸ŠčĹ,œŃb F#GłčĽ’-,#"(Ç)” Ĺq(áŻ\Čő.@†ř9k+Ëŕ0U śŕKĂR‚6(Т'@ńÁčEŕz5SˆCĚ&eĆ>­Pk=1C ~H€⁋;jŁżüŕöćˆ\”‚XŘa{Öôç@$A tĂÇ$= Iˆ#¸ĂĘŃËtHŕT!H#ĐÚ$zD ŔĐC‹4§ť•Ł=đ‰‘‰B5€dčrmţˇ6Ĺ`ó°`\ . nSŕđ€Wŕ , ą0š А ôs_S#c 8ʐTš0îp9đĄS 5 ő°.=’)ŢŔmĐÔĐ Ż°-:ţ ː(( !0p° .@ϐ"ţ ĚĐHSÄňuQS0:`! QpFŔ‚ 3`;q0°€/F0˝pSë" *rÓŮA’0îw8 dÖo˘ŕPzř).p: 4rAÍAf:° ťĐţ&,2 #`<ł° K@†°hEŔĹ"°°pA"€&+ŕZ7Ś2pP"”TAł.áGĺĐrXX<%2 ` ˙#p˘1'*"%e"!p 8Ŕ8ŕ˜@B€ h`RĐ8!GŞôY§uXŕI4 OŁ(ěqÇD"Ă"l{"WQŘ']D‚Zu˘\t‹c° ĺS “UĚPX0đ G!Ry,`*˛ ÔŔíą1~ŇťĐV°Đ“Ŕ ˝°Č.•0řĎđxp ҇w&˘ťŐ!阄ŒĐ;ńĄXŔ2Ŕ i@ Ý`60†QŇ `ţ‚pM{Ř M˝Đ äpĐĄ0Ł€ Đ ˆ&M[Łë` ݰ30dДb0Ö` Ř`÷°‚°'× C ‚Đ ë°Ý ip ˙`|p tP9` #Đ3@{P "uŮ `€{c•^`I÷{”p ď5W9÷Đ Ÿ0Ąp ÝpO‚Ŕ@×…yÖ0{  †pä0”Y 0N^Ŕ őT†0M VVą9?Q”ŕE[9”‚0ą9“÷ ů ˜ ÷p;Ů đ(CP˜p›‰ć$3Đ ˆT ŔŽŕź ‚@“šِ™;jack-3.1.1+cvs20050801/doc/links.html0000644000175000017500000000516410371403403014735 0ustar tbmtbm Jack-related links

Jack-related links

Jack
Description Location
scripToys - my collection of shell scripts, python hacks and C progs which make my (MP3-) life easier. scripToys
Python homepage python
LAME is not MP3 encoder - IMHO the best free MP3 encoder out there, much better than all other ISO-based encoders lame
cdparanoia homepage cdparanoia
tosha - a DAE tool which works on FreeBSD, Toshiba drives only tosha
cdrdao - DAO (Disc At Once) mode CD writing software cdrdao
alternate cursesmodule, use the patched version on the download page! cursesmodule
xtermset - control (running!) xterm properties via command line xtermset
JeFCo - the Jesterware FreeDB Collector, created to be the solution of all your cddb problems. Jesterware

Wanna go home?


© Arne Zellentin, zarne@users.sf.net
(changed: 10-Jan-00) jack-3.1.1+cvs20050801/doc/main.gif0000644000175000017500000000726310371403403014344 0ustar tbmtbmGIF89aJ(ç 4n†œ&JlNj„žĆĚ>Zt’Śź *L:T~–Ź>Jlbz”NZ|.>d^j”Ž–Źęę쪜Ä2RtŇÖÜ>b|ŽžŹ>Rl~Ф˘ŽÄ2TBdVrŒ2JlNb|–ž´FZ|DVj„šŽź*T.FdNV|^r”ÖŢä>R|zޤĆÎÔšŚź&:dn~œ2R|2JtNbŒŽžĚŽ˘´"Lv†¤>lŠ–Źfrœ>^| *\Fb|~’¤&BdVnŒŢŢě"LFNtf‚¤6>dŽžźF^|6Fd^v”FR|šŞź:V|:NtVbŒşžĚFf„.JlNnŒĆĘÔ .L>Nlf~œN^|ŽšŹţţüFRtŞ˛Ä2T–˘´.TÚâäÎŇÜ6Nt &dvФ&FlNj”>Z„–Şź:d‚š´ęîô6VtŇÚ䒞Ź~ޤڞÄVv”6NlVf„.FtĘŇÜn‚œ2V|NfŒ "L:lŠšŹFbŒZnŒF^Œbv”žŞź’šŹš˘´LrФ˛şĚ.T6dÂĘÔŽşĚşÂĚBl†’¤<.Bd^nŒ>VtNf„>V|&>l6BiFV}.Nt &M>lśžĚfvœŢâěVfŒFVt>d:d2dVj”&Bt>N|2d.d.dRjŒBZ|–ڏ‚–­fz›6RsŚŽżZr”6JlžŽÄÚŢĺĘÎÜ6Jt’˘ˇz†ĄB^„Jb„‚’ŹJ^|.TR^„‚ŽŹr‚œRfŒÖÖÜžŚź6R|˛žĚ’žźzФîîôÖÚä2Ft6V|žÂĚn†¤&JtNjŒžĆÔ>Z| *T>JtNZ„ęęôŽž´>RtVr”Nb„FZ„LVjŒ.Fl^rœzŽŹĆÎÜ2J|Š–´>^„ *dFb„&BlVn”"TF^„6Fl^vœšŞÄ:V„FfŒ.JtĆĘÜ .T>Ntf~¤N^„Žš´–˘źÚâě6N|&Ft’ž´~ŽŹn‚¤Nf”Šš´Zn”bvœžŞÄ’š´š˘ź.Bl^n”>V„!ţMade with GIMP,J(ţiɀe€>ƒ°žÁňkŢ }źř͛ˇĐ X°úTQłÂO~°řń:¸Öwú0HäçnED… 1ëޝ{ ‡Ük,˛ž ćăÄ .\|´ňďR+aF—> lŠŇŞFŁfĘę‰V_ąśj…ěX°Cw}ëCiĽ=ć`ľbƒIĂ;jîôyöŹĘĆ*zěëÓ§,-ZžyXąâ]•yxٝwgE)jޕ\aŔOc~VQŠfŠÓ|ĸ˘)y~NȐF‡ˆk¤$xąđA–7:tHy™ŚjÁ5iDdÉGJœ´ZŢÄ9ҍŠ”4 f)#ĺf•˛vI ţĄ€M™ˇsM ëŃD™<ŐčˆS6 œš´ř(%+‰›$ޘ€Ě,ŢxŁÜ,ëxĄ4ŽL# )íH3‹#Đxá˛4a‚*وăŸé5Ҥ € )Đ#ËvŢ4Ń"Č4!‹I(§ ¤Č˛I”Čp ČĐaŕ,ÜŹ( 7Ěń_á˝ŕ†#âH„#L&AĘ(3‡$NŕEëaŇDŞô4¤BÇ(tÍ98$aޚOĘB ćL"HUȆ ‡H 2ĘPP ,88˛Ť(č^x!Ľ8żŃáĆ842€78(“„¨ ") ^@“ 4r&Q€ s$aŽ#ţ¤jC ł€N›e#P°ô‡Jâ4^8ŹX€,kĆ8‹8˛ŒáČžşpŠ#Ę[¤2˝  ‘B;žn(A2çŕá*Çź€‚9hŹ"@Ä@ㆠędŔĘ%HQaÉáA‡=OŘúD'ŕô@Ç(H9Ë(Ѩ˘Ętœ3J”ŽRp›”ÎِO[ §8BŠ9 &‚ş^ ,äÖ0H´ )I %ŞŰMC3•V†'Ž|^¤.ŕŕM–c¤ŠŒ/ä( tDłŔŃ S`‹٠ސ°2 œŐIźđJ‚ +ů 2Gβ@# N™Ś,ř°IÁţ§‚âąœ9L6ç rJbΜ3GyúfąŃÉ2Ę,ËçÇ#C+­ŒÜ¸á†˘sŕ„îz‚#Źă”łčÍ,4‹ŠĘv,š\tHI ĄLš§eÔpŁ!KFĐánÔ Á&6sÍKÁ,ȢĂě0"^Ď ŕ}¤’6ȜrIx†"NDúß-ťć(ČXÜDs4áö9tÜ/é,=@Ć#j Ž;HĎ ć֐ (@DÖ,jĄĄ%ن0 ]€Ł@ÎÁƒ4¤C¨xIV°J%U@Ş<ŰĄ„Ŕ‚ľGaÇ!žq‚{¤ˆfţИE,ΐšA<şéNŠh… Đ ŕ@Âźŕ%(Ł?rKÂ˜ŘƒÉŃ,CĐ`…Ü€Şžý*=ŢȀ r°x”ȀA Ž”&‚aXĹ8† 0Ťx… ˝TĄGyÁrƒ°QÄ3XIëx4ŚaUč"GłŔz°#ĄŮłĹá‡V<@J „đ‚H˜Â „(b#<ÄX!E4ƒ­äóuůć OhĂ(úW¤Â θ@<”0Y˜c]((ŚŽ F”čPŹź0ƒ/ ÂŇĆ8x °Ŕ°Â+S8 íĽ°ÂŠH)%á(ţˆ)jфRa|Źţ=Œaë€C+˙‘žp`ăh°dąŽ0źŔv°Ă&VĐ -Ějâ¨Ĺ(Fń +ô )†,tS\"H(â3â#‹DÂÉ`"!ä@ŠHࣄHG ĽĄ !¸4Ă,J!ŒÂĐDz>@ťnć ŇC7fqqŕ;°‚"PÄ|€ٰB śQDZPŐ` ˘؀ŠwQĘX@N‹xĄy8وÂř+… ]G0đ†(D1pŽOˆ†ÚЄ&ÜĂ @A",8ŇE´Đ$`ˆ”&Ę("!,6 \5=Čhţ$6zx‘ŔĄ)fáshă'0€Ż¸A#4ĄŽÎ9A )3°´(b HŕFŹ …Ľ ,TŤ r€#–)L‚(§Úyc‹)†•â# Y<âvxFG?ç;d$!tdÖ@EźCěźąH ł1P­Œ ąW+|€ř@ ` ´)źƒp8„Y4á3 +ZńŒÝ"Ł˙ †`:8EáŹ%  ÁĐPÂ*”PÄt h-(âPU‹ Yŕ #.ąYP0<ۉg˙Q„"^°I¸@h°Žu¨V ’T­ČÄáZ+¨Ď D(˘+fQM2[!Iřá  N˘'¨@y„ćp §BŃ~­@ F$!aM!- 1 y;TË&YÔyETE2…ÖĄě"âŹiJQƒ]“á×ઈ €zá)$•ţŽ›B-@Ă Ž¨Dƒ” řH‚rS¸€Ľ5…é˜(0 Ş`KŔœ„UĐ "p ˇ2AŁĐ #5!L"%łC  ˛:ňFś/ް ŚR*ŹĂ áƒtŁ St! 8@ ŽŔă!|z˛ ˆ 3Ă3Ó *˛ a` ă  qâ`íő ţ9˛vR‡I" śŇÓ 1HՀ!7Öŕ€ ˛ŕhđÉł4 ˛ # Ŕ:˝A„łĐLĐ C! Ă&í Óđí@}ĐŕPŻĂ^ &şĐ(0ý0Ť§íĺ`!"Gö†ňâ’@FWä 5€vPĐe# ° ß0qY  e “đ ĂŔvPŔDÇ ƒ  Đƒ° ëˆń0ňp ß`Ž›Ŕ 0aŕ’ e Ë ”P  îöäřň ßŔ ‰Ô0§€5‰VƒP^Đa@’Ă  ň u0u ‘ e“ŁTTś@ ›  ƒĐœPßŕ š° ůń€“œđœP65đPáŔXƒŔß@ ęđu  JP6#€epe€ ™fŠFeł¨˜œ@ đ vŔ ŕX’‡0` ađŽe`ŽDG” 'DYů8ßPc’€ j ƒ0Ţ;jack-3.1.1+cvs20050801/doc/mine.css0000644000175000017500000000343410371403403014367 0ustar tbmtbmBODY { background: #072387; background-repeat: repeat-y; margin-left: 0; margin-top: 0 } BODY, P, DL, UL { color: #d0d840 font-style: normal; font-weight: normal; font-variant: normal; font-size: normal; line-height: normal; font-family: Helvetica, Arial, Verdana, sans-serif } IMG { border: 0 } P.info { color: #666666; font-style: normal; font-weight: normal; font-variant: normal; font-size: normal; line-height: normal; font-family: Helvetica, Arial, Verdana, sans-serif } #header { font-style: normal; font-weight: normal; font-variant: normal; font-size: small; font-family: Helvetica, Arial, Verdana, sans-serif; text-align: right } #footer { font-style: normal; font-weight: normal; font-variant: normal; font-size: small; font-family: Helvetica, Arial, Verdana, sans-serif; text-align: right } #menu { color: #FFFFFF; font-style: normal; font-weight: bold; font-variant: normal; font-size: 12pt; font-family: Helvetica, Arial, Verdana, sans-serif; text-align: left } H1 { color: #d0d840 font-style: normal; font-weight: bold; font-variant: normal; font-size: large; font-family: Helvetica, Arial, Verdana, sans-serif } H2 { color: #d0d840 font-style: normal; font-weight: normal; font-variant: normal; font-size: large; font-family: Helvetica, Arial, Verdana, sans-serif } H3 { color: #d0d840 font-style: normal; font-weight: bold; font-variant: normal; font-size: medium; font-family: Helvetica, Arial, Verdana, sans-serif } H4 { color: #d0d840 font-style: normal; font-weight: normal; font-variant: normal; font-size: medium; font-family: Helvetica, Arial, Verdana, sans-serif } A:link { #text-decoration: none; color: #f0a840 } A:active { #text-decoration: none; color: #006699 } A:visited { #text-decoration: none; color: #a06820 } jack-3.1.1+cvs20050801/doc/requirements.gif0000644000175000017500000001233110371403403016133 0ustar tbmtbmGIF89av(ç^|–Şź .T>d‚šŹR^„n~œFNt6>dbz”’šŹFf„2V|ęęě^nŒŽşÄ†’¤&FlŇÚäJ^|’˘´~’ŹŚŽź.T:NtRf„6FdVv”FVt"L.>dZj„>Fl~ŠœVnŒÂÎԎ˘´^v”š˘´:V|JV|F^ŒžŞź:TŠšŹz†œ2Ft6Nl&>dNf„žÂĚ.FdÚâäJb|Rj„"L’Ś´:Z|Šž´F^|.Tr†œśÂÔŞśÄ:d>RlBZ|VrŒfv”zޤĆĘÔf‚¤’žŹţţüśžĚŽ–ŹÚŢä *L~ޤĘÎÜžŽź6RlNj‹2TNrŒn‚˘f~œîňôfrœ~–Ź2Jl^vœ2Ju&Bk.JmNbŒVj”DzŠŹžĘÔšŽźBlfzšęîô^r•˛žĚ†–Ź&JqN^Œ–˘šŚ˛Ä2T>N|Vf‹ "L.Be^j”Vn”ĆÎŰšŚź>V„NZ€ŽšŻNb„*T2RxVbˆÖŢä:e&:d>b|FRy6Bj>JpFbFb„I &OĘŇÜ>Z„ŽžźFZ„’žź.dFV„~ŠŹ6N|Nf”.Ft.d>R|6R|Nj”2d&Bt2dzŠ˘Rn„šŞź">dJf„6Vv˛şĚN^„>Ns^jŒZnˆbv“>Vz~†¤ŢâěVjŒ–Śş>Z|Žžłv†¤ŽśÄFZ|Zr”–ž´ŢŢě‚ŽŹ˘ŽÁRrr‚œ‚–Ź6Jl6JtŠ–­ÂĆÔÖÚ䂒ŹZv”NV|bvœÂĘÔîîôŞ˛ÄžŚź>^„>l‚š´n~¤bzœ’š´FfŒęęô^n”ŽşĚ&Ft’˘źŚŽÄRfŒ6FlFV|.>lZjŒ~ФÂÎ܎˘źš˘źžŞÄŠš´z†¤6Nt&>lNfŒžÂÔ.FlÚâěJb„RjŒ"T’ŚźF^„.\ŞśĚ:l>RtVr”fvœzŽŹĆĘܒž´śžÔŽ–´ÚŢě *T~ŽŹžŽÄ6Rt!ţMade with GIMP,v(ţ‰ĽČŕî…8ƒfe—qËÂááđO° üiÂgņá–ä“ĘqťÂMňČ'âŹk{Œrwm\Œq/g—âZ†Hţ€ťöçM°qđý‰’>ŚgA –ô…;‚*dč˘D|IĚ6,!B9r䊒+ÇŤ(Ăβ%{aŰľvĎĘŐKśo\BQç%‡şŔ„÷L8×Ú}Œ÷íËEÝÚŔ„칍Ť˜,!ÇfŃŞeëŽÜ\OV‘ĘeΨQ×đŐmÖŹ?˙Äxĺo…räĚÂҏœ¤=–ÁĆ7ŽO,\Määă.œńp=řHëjŹXrpţ˝źÖŁń|FxáOܨ5>P8J$z9M`Ěđ:öěľÝ–[ řaH á’ ç!@:Gü#Ŕ<śÁH)çŘRŽ$ˇ@Ó @ÁĚ;GźŒźÓŠ üs VذŽ,GĐđ‹,¨°0Ď&óĚăĂ"@pޔ⠋ŔrÎ;˛ŃI)ďŕC+śźc‹ GlÓĘ6:Ś’Ę/óąN)ëźĂ L2č „Rh!†ĘcŠ rä 3­ĐŔ#ˇ\ą#ŒŒ¸N¤2O+’ €ŹÓĘ<ĐđEç´Ń,ď°@Ă<Ľ\QJ)زƒGřČ Œ@j§60 ţ#ú°I‰>źĽ-`XĘ,ˆÉÎ:,đE9TÚrD+{މg9{öůg ď Z(<žČ“!|xšâ:Ě!KĚŘ ­ ;Oä2óOš,°@%$śř`ŠcŒĄç'dcƒmˆBĎ:GˆŠ$3Ěđj+>0‚ ;éţY ĺ*‹ť˛0ˆ-}´HĽŘŇĘ;€23ĺŁ>řˆśŃvűm¸ă˛„#ŽüEWÜÂΕ‚řPqČ´’ĘżZΔł.ČĽ`BCš^qˆ”,ü#ˆ Fo2ał ‚DĐ. ›”L…€čĄÇ9ĚAdzˆ"JŰi÷*‰-śl3Ą,\˛Pţ#=úPóÍSë h =wđ…ü2–xţĂ6HSĘ!Ą3Ľě\aš.řŔBÉ,˛´Öŕěƒ óźłˆ—! АŠ,'KłHœŒĆ&,DđĹŸĎłŠ­ČŇ­ČóŘđŽ$–Ό C2"Ëşžű b+V°đNä“W^2焇iä0ŠŤĚźČ9˜˜mvzœpÎ›Ň eĐsK`" ,6`#`żs€ËbÂ#DŃ iĘs‚ŘŻՊMĂjcH3<•śRíBŇŔ@)ře‡Müblz;˛q;”MW@ŸŢ˜ąžöšfËD41‹(ČÁţíúŘĄ|0^}WóD*zśr\B{;‚Î$áşŒÍV ă4 Á‹+ ŽĐĂ&\pFT‚w,8Ç9źŘŠ0ă=BÝ&"°"ą*Kś3zT.`‰ˆV â;†XÄvőAkžÂ2 >”śĹ-nÁ îń^zU+ŽŔ<=Ŕ˘ŒÝÔa&dő dëpUŃZ F<,›đ3 @v"P̀Ĺ:\ŔŒs€RmW`G%u`üĂh˛ţÄ? |J˝Âე˘‹@˜“(Ё‰rˆĄĚ8„,ř…DüÂOV:çńy”#˙ˆ’Öş%NÓœč´Ń:ÇŔx`!ÈÁŤJôźCŹă ;„Č;íHGĺ(‡E"‚ľâAx(§9ŰuŹwœ°ŚlЊ@ ’’;G+Ę!ˆuü Ü„)dQ<ŕ! AفP…Ú"šËbšB×LÍ€Ô Nđ…N‘x€nĆ`€,q…s(a÷X2‹ Ä.!ˇ@âđˆ/¤vĐ L´ˆ2!ĚsIŒd+ˆ–Ä/ ËG¨R'Dq…śŮ€ Npţ‚@Ɍu,âĚ #€ŕ. źVŔÁ"%1ܓ,amPŘƖž=\€€fa„řÐ Źýî ő+G9cŠ˘$˛`z€’DÁ@HV6x Œ €0uESŻ<Ú#Y¸Ŕ˜ ‡Đ´ˇž Şú\(ˇşÝcy4áÂ;G˜Ýa9p¤t [@B á …~‘Ž„78ĐĆ:Œ/„Á´Ăő¨°¸jÔA각ű/‡ŠmđŔ€  Đ@źPˆĚ´ôŕEU˛b˘dW€ţ4Z;€Vd`ńě^%\bhéřĹD ‚ýáŠ`0đ…Jř"źoČ-3vŢdˆBT<‡ŮJÁŒ3˛ŔŒ/@Ŕ<]" 3`Ö&.QI¸l`ťÄąm´`nÜœ !„Adä<ÖŃ Hb4Ř#ŽĐ [ŹĂŰ؄˛]€müЂn0ˆ^b˜‰Ň­BÄđ‡a@A30+ aÇśÚD+Ě)<ľKKˆŘÄ6l Pâ˙0Ź$QÁ>쒈ČDśqHüř3ö˜‘ ŁĚ8ő&: kn¸,°3n‰é}xG{ţnq˘áu†,&4Sáĺ| D,ŽPÜb  °˜Ex`Ű!ź\Xƒ>í°78wsČWMą7- #źÓ8Ĺ)œ tĄ÷؇žA†EÁ { „źńŽcđaąą˝„X<=؃†ńT@đ˘Ɉ-ŞáL4á˝ŔklšŢ  çďđ€ hˆÝüăL`Ň4^_‰Zo<ÖŐ6HŔ lĐBœŤAŕą%€ < x'ŕ kFxoŕ8ˆ=ś?°ƒŔŢMHbęo-ŚQíw´ś\(/œŤ…¨ `ąE=D!Œ:/âňG(‚'`ţ ‡(\ăš.>ƒĘ“áIp.:ZáŞwŢ Sř –Ű |.Á Ç!;ƁčN]!źČ€/ôýW dđtąŐě`% &{ 8Äç)pĽđąE€rh §ăW~ąĺ Œ€_vPEüđ„`7šĽcą5 Ŕ{{Đ|Ńt:[:Đ+Ô[hâ\{ĐĹ o^0O^h€+Œ!F%ě wąu[€›°hĐóƒNŔĹpčťâ\Ђ΀hĽŇNćĐ XĐCr I´IWŔććOđô[npF@sO^€°[Đ÷Đ€h­˛ ţuH Ąb áEF@!E[  !_Đzaŕzp ¨`˛ ˛0kąőIś F¸ árHyą5 fƒd ,EđQ€brŔ‡°‘^ý0+ą^Œ ˛€€ Ś`[ ŠČ vŔ =čä1ď^K€ ƉN  ě @P}ąĽŮ*á% ¨P[“„zǨ`ö€?‹‡†ż¸ ‘Ä  žđ„đŔRłR[ü[&€óŕI­`ŒŰ0ŠP ‰3Páĺ ~ v‘ąĽó Š@°0€`‘cç#€đá… &‰ ᾊ€€`ƒ`Œv°ţe‚ 6`󀍡0+.đN@ Š =0P•ż5&'@“9čoĐ.€ `ZŔGŔ{N ÚPĚŔÔPŰ  á‰Đ›@gą5?Ó( ó  `„‡‚÷^ –ó0{¨p†3č^ě¨ “2IuČ#„Ř(ĽĐ.řĺ.đťđ |P¨Ŕ[>rŘ8Ŕ6@’ąĽŠ؈ 0ož6aP—ЎIďŕN éP@’ë % ЎĆŘ Bř[٤[ŕQ›rDĐmy:" ٔ™Y ˇ° ™€17 •yT8đ ‰ţ8_0y8w˛Bą%ÍŚď@Ă@@ZˇŠT •GDë `°0@•0ś`Œ,0HßrŒPˆăéŚőpëŕ€ť^Á` ó&€ž€9 “Š#`Ň Áés1GŔÎՓĚý `„€°%zŔ™^Ă`^á5˜Ň ƒz %РȎçě=šx4IŻ? ˘ČđyŹ € `čŠ`ł@`aÂAŕRř˜@P€ ź0 é˜W *T)`˘%ęŔ ‘R4Sw1ČŐ)IŁ 'É Ąéč Ć؈šŇGPţk: k°)4ň%:ńpŒ"‚ €&ˆĂ0 4†Ý)Tň(3ő*tS!ś° ě Аo ˘@đyĹଠR’ÄP` ’° Iŕ kđˆóđ%Úđ›âQĎF­v~ď€#ş ˇ0a@´ ĽĐ Ą@°I˝‚,46´@`›Ú#wGڇÝ׿`_ ë€Ĺ`3€Ppx(! #=2Ź3&ŒĐ HFC˘ôĐ +wš&i áĽ] › ’ „ÔP đ°2ů*ĽP lkBŔĐ#uŕ%+I7G€ Ý Ą›; #3ĄčŞŽH6“ţJp¨oۀXťŕ}ěŇ#•PA,Đ v§RfŇ0p epq\&Ůp ě° Đ Ôđ ŁYŚŢPyٰÂs(€Cz@=Riq ‰P={—˝‚``ž­MY˛ ë 3Ŕ š •ŇiyÓ#ł Ół𳞠֐ű°Œ€B/ÚŕpBľ Nő6šőw*ň3yće› ňČŁŠ!Y˛ • 2`ˆĽŔě°+žÇys(ŕśű3#ˇĽJ?Ú0€° ĐŐ.ś`çĐ9"ó¨p¨p¸c¸a vŒ{o#j€=”lc€7×Leîţ˛"Éň'c’ŠOŁv=Â,ÎFŸ˘ ­Gşŕ3Š`Ťő)żđVđwîÂ#bó ŔVšŔdfgÔ#;’^Ú1•Ë‚ü’_€€ 8‡sÖ[.ľĹĽ0 p‡´I44Ś^Üٝ.€ zäU[ĂŰSFł‰_zŔŹ’°ßp{đÂ{@Ž&#d*’qĽ *p§Ă€@Đ@Ÿiƒ qća=ś  ĐP Ζş3…ł“%ĺÂbĺ€Áé ÁżŁmÖ0¸0ĹŃŇd`<6Pmp Pœw°<ôVŽ4Č"śP ـ ›  x  é`YďĘ˝ĂJŻţAdé)Ś(m –Úđ ˛B)ľKEP%AýĽŠ[ÂT&r 3ňEĐđ`ň°Ëň`ĄAŕ Ž  pÓć0Ö 0wĐĐËÖužp ŐĽÎ -"=ËX˛Đ/'p…f ĎÔRÍŤÍ.%ł3›ĽđđÎČLˤ°ŃšŕËjĐĚë Í`Ý ]˝} ŕw@-X0`ĚŰŚ=‚M    ŔMÖ Ô˘ / tÓđ  đp×   &ˆĎžŕ ň|Ó0Đ #-Ľ Öđ ĐÍ;jack-3.1.1+cvs20050801/doc/requirements.html0000644000175000017500000000524710371403403016342 0ustar tbmtbm Jack's system requirements

System requirements for Jack

Jack
Jack has been developed using Linux, but I think it should work with other unices, too, as long as it resembles posix (has ptys, ...). If it doesn't work, tell me!

In order to run Jack, you must have the following installed:

  • python 1.5.2: with earlier versions freedb query and ripping-from-image will not work. You also need the following modules (they are all part of the python source distribution but some may not be installed by default, since Version 2 Jack no longer needs threads; it's now a lot easier to get is to work.):
    • termios
    • sndhdr
    • urllib
    • pty
    • wav
    If it doesn't run, check these first!
  • Ben Gertzfield's ID3 module WARNING: version 0.5 is buggy, use at least 0.6. No need to download it, I packaged it with jack.
  • cdparanoia or tosha for audio extraction
  • df (comes with any unix)
You will also have to install at least one of these MP3 encoders: Optional: Wanna go home?
"All trademarks are owned by their owners" or whatever I have to state.
© Arne Zellentin, zarne@users.sf.net
(changed: 19-Aug-99) jack-3.1.1+cvs20050801/doc/screen.gif0000644000175000017500000001174610371403403014700 0ustar tbmtbmGIF89an(çDzޤ2V|NrŒ:TžĘÔFf„šŽź6>dŠž´FVt2Jln~œFtVf„>Jl *L’Ś´F^|ęę첞Ě^r”Š–Ź&:dÖÚä2TŞ˛Ä2RtRb„–ž´VnŒ>^|N^|NnŒv†¤fz”>Vt2Jt.Fd*T~–ŹÎÖäNf„ŚśÄ’žŹ>RlšŚźBd˘ŽźNV|"L^jŒ&Bd~ŠœNj„‚ŽŹVrŒĘŇÜFb|frœ’šŹÚâä:Nt:dĆĘÔ6FdFZtVj„^nŒvФ>Zt2Nt˘˛źŽ˘´&FlFNt .džÂ̊šŹ2dŽşÄNb|.Nt.TšŞź"LVv”:d~’¤:V|>Nl–Şźţţü^v”ŢŢě2R|–˘´Vn”f~”.Jl’˘ˇFRz.BeNj”Vj”&JoŽžź6Nlv‚œ .R–ŚťF^Œęîô.>gÖŢä6Jt.TNf”ŚŽż "LRj‹Zr‘FbŒĆÎÚ>FlFZ„Zj‰zŠŹ>Z„şĆÔ2TD‚’ŹžĆŇÂÎÔŞśÄÖÖÜ2d6Bin‚œ&>l6\>b|NZfv™>l>j &O†–Ź:Z|2FtFV„N^Œ>V„.Ft*d’žź>R|&Bt&F|NbŒ.d>N|f~¤.d~ާ6VvžŽÂŽžł6JlJ^|6RsVb‰Zn‹Rn„z†žŇÖÜRf„"BlJb„ŢâěJZ|zŠ˘BZ|6NtڞÂ.\ŽšŻ˛şĚžŞżbv”š˘źÚŢ䆒¤ÂĆÔRrŒÂĘԎ–Ź‚–ŹžŚźZv”6R|Zn”îîôŽśÄLFfŒFV|n~¤VfŒ>Jt *T’ŚźF^„ęęô^rœ>^„N^„fzœ>V|2J|.FlNfŒ’ž´>RtBl˘ŽÄ^j”&Bl~ФNjŒVr”Fb„’š´ÚâěĆĘÜ6FlFZ|VjŒ^n”>Z|Ž˘ź&FtŠš´2lŽşĚNb„šŞÄ"T:l~’Ź>Nt^vœ–˘źf~œ.Jt!ţMade with GIMP,n(ţ %!Ą—Á^dP‘ůE曋^Ç~}űśp—2dxěbáâ×.†żŽtAŚŘŽ^â$ztQĄAj÷¨‘™çdžB55’QCfWźž”,ĚŰőmWş.ž툪˜˘˝d<˜pĄśZ¨0`đ"GNu^€yéA †ŽbÍ 6,ŰŽháj{V0ťoűzWď]­ˆěęőśŻßŔŔęíʖëŮżZĺćęUą—@‹Ž–‹ 2,œ„ć ŐŽťœđ(–Ži2`Ŕ ęŕ¢Ԏ}ţ6υ›,ú‘tA헋~ż"¸ŘrŔL7Đ;đ$#“Ěń^.îméuŞ•^5ţžŚ";<0’ń Z´“]6ȝř%'‰=oŽtťľę¸v ăŒ7íŃGÚ\…ŐT#Á-ŐŘŁ :ŐlłÁŤÜĹ*ĚĎ-k¤O6Y€Ó 8ŕT‚ŽŘ`ŽTr„îxS < ˜ăŒƒ•lÓG5ílpË3Űű¤ކÎĚŇ`7ޗß~ŤŕBÇ’€á…ŐdKčäqĆ,čPĄ¸ěN}<¨Ę,łlÎk, 3T€G—k€Ó˘ <ˆ‡ˇ¤XM%ˇŹ¸˘3㍠Áš VŇ „•4ř xăL;YÜ2 łdqÄ_śÓÎ-Y€9ˎ^‚™‡9ţł„#‰$IČႎ΂•|€Í-ąMŞŕĚqDŐlĹ°ŠŢČ-F Ĺc|ůb4„‘‡çĚr‹§îěřĆ0Î|@<⹲dJ°YT’*şöܲÍ6ö„+˛e:lŠđ؃k5şJĎ‘4˛K}ćäGŔƒn™|… ,p„G¤‚ †ŰT# 7k˜r§ č|ĐăŤTšA'ţq Î6ňV’ŒŠnÓ .%Ü"Á,a„ąă-ć¸RA¸‚t5¨śÓ‡Š řW‰‘Űˆb% ?źÁ•ŔóB8ádF…ĘVc€38‚ÎŽ]Kŕ :Y ńö˜Ě8÷Š ţ6‡~ŃI5zË-đœ¸ĎĆđ̢ŁţSB'™°ŔńÎŮÂ$T"Áć•řYM›đÄkś9栏˛53h!˛*  v$§¨łĹُĐ ŢÔFAăôŚ(; çTGšâĄ‚Čžť‚ŸČŤ.î ŽčČťÁ3ˇd‚fĚó?>TŁ#Ӆą€¨b€2yDÓÉŇÜ?xÄâM,@‡aÎŁÇŢîĚ'Rř*€TĽŞkBÔˇRŐ,9m`YŕԜpń… Ł•P`%VQx4Ţ8‡6´1 X•Éźű›3ĐńŒN¤ĘŒBGJ`,mE A•ć°Ś!y ţk"†úĐ5ŚeČZÓ6ސ+Ą.đ…nQ‰< CoÇ´ ŚeݢMĘŔƒł°ľ čĄA™„Đ1 ţŤz°˜ el Ăwg0“;ä6 tÍx¸˘=*ĺ‡Y`âMuˆđŕĽ%=Ălę#Ó*‘‡ œăi •"ŕÇÎm` tşP¨59˙0‹Gx¤=ČÄFT]hđ„řđŕ ŠŔʢbčâe:ÔĄ„@5\ gŕ‚Gxƒ#* TcŠ(ÁěńšS•膸PÂD3uR‹ † ŽŃSUď*ÁZĐ)uę`łzÎytŮŔĽ01ˆQ€ž`ë`!˜f pÄĄ\Hę"b†~ÍBÔÜ<äŽU´ŰĐXU3柩&jE/2Ňb4ŠłQČčř‘7ĐęŽ,0HŤčFľÖđYl` kř˜Má¨€łB…Љ(9ÍâH*ä`Œ` ŠÖxĹ”ŔŽ&(ś˙X@đŽĘNx°žÂš˜Š{ôYXSZ 4K‡Űhţ:ää::ăap’ŃĽrajśFa# ;'•Nƒ8-˘č P‰ˆĽPŹ-p‘ %<6Šy0%rĄXL”sŐž EpH ĂPA. ŃŠJř ŕč2* Ÿľq FşŕĐÓkj‡3†qŽP(ƒ4r†ÄœFíCĐ‘ŚœťvĐí L €ą‹ř` %@@ .A Ĺ˃b÷ŕ[(C\Ć(lt ž!†ö$Ş9°CIŅ(úđîebgĆ*ƒžĄ€N”ŕqÜ+ćЇYdłŘ*nłN ƒtozD ;щ7¨âxŔţ>–0_˘h„$v °ƒĽÁ”PĹ śYP,Ŕąźmd" F"ó%ú >tčŔ7ĚÂn8$ő Ďň&JđŒKôx–°DU}(ĄŰxC‘Od˘90]‚ŘĹ4'˝y>˜ƒviŔë=!áh€€Ÿý(îp*›@Ȃֹ`paLłŹĄŘ,B}(Äuš°Ócԁ {HARőŕŒŔ`{ ˇ“‚Qb¨űł°´ ˘ Lˆ€ŠĹ5^Ę +ԃŰI%Ć $Ўj ;Ů*݀`çą lĚ™F¸…>L܊z@ąp˜Ĺ)ţ`œđ hO–†CŹŕç ”bÜśÁnQAƒ)†Xq5:QK'Ő ‚ŽĹ3€Ě…B܂I…ĘBňs ą…Ŕ†=0~‹d€ Ř < dXPN0ą=\ (6ŞĆeďš ’ăŰŕîľĂ€‡x'uę6°=žTWœăŽP,1œAM¤'u>‡ƒü ŘăşHpžBtŔÁ9ö:‹T@Žź ŔŘB—: g ĂP,!Ŕ řÜ ¨FŸÔ@ ‹PěŞń†Üs Čßš‚KŔî\ťŃŃív„ËŞ* Áv!Š(QrţÎutůĽČĐˆQ˘ŇwÁČŔČ1Ŕ~Ŕărˇ7Gl!h žX’Đ XC C Xâ4}5—TB@>ˇ0|˙!Š% “a—T„%âs…đ Ą3n*Ŕ ‚&Áp(ZďňňđT ¨ŕ)〠Yŕz gW „€y€2Ȃ•0 ‚głŔ}\A@łŕ8 Ő Š5Pŕ!ĂW ž„IĹb gx\0 $ ˇ hbČppŞŕsŠe ‹ 82Hƒhpňđť ˝*ţq o0 ó XŻ`(‚"ˇ  ˛ íŕ ţ Č–đ € Kŕ}ŕą0|ŕdĐ ĂGöđ spY?X@—T”  Ş tŮĐuŔ ˇPπŃ0 öÖ&†xp‡ă ě@’0Sdŕ łPސ °lI劂a€ #”îŔeŠŐěŔĂç 䊠>Đ ‰IâϰŠŐ–`fpY$ łp|ČjűЉI…ŠŔ đ‡nĹ0 "ŽŠużŒ€_*â°\ îRbIU &@`a śĐ…`úGŠł† Gň n ¨"¨r& ôgŕ  ˆĂ˘’ϸĎ0 Šľ Ł€-˜Č ľ4|‹í 8ČÇŚ…p*GgbŢŢŕ“—T…đeŕ p@ŕ`YŞAöPIľˇ D&°>WŔ0Đ[ ˆ%2$Đ—ĺÔCÂxI Yŕö°qhYpŕ ]Šd8ő`Gŕ{ľ‡hŘîP50 X˝`!퐈\97ŕ` ąp° dŘ ŠZt0 m°0`°9öHœ0†IĽ œ‚&Š`–%†Äţb h¸X­€D2|p(rr—TŕݙzcX*ľÝ  †Ě  €$WÜ&­  H˘ R WĐ€ “eJr,ô„"ŰP($>Ăe>€/É&EčpEł‹ŕI€ oĐ1Ž´ŕр >đ-ϰP ĺ€"ZA°Rs’ аπ= Ő@îđpN ˆŚĎ ˘YpX@Ò <Ä @t°, ݰ?ˆüŕ0mÔ9k˘%-P[âőeap%$VĂpđpđĽ ŮĐ=KРѰîĐ p ]đ*`fo2 ŕ@Śçţţá ŞĐ ŠŔC€$> “B…Ů@s‚eCĐ!§ŇVŠĽł Ľy Œ § d° $ 'ŕp :sh˘0P‡’A:Ŕ`gŠŻX ĎPTˇPž€—°ď ި } f@Š0ZłĐ }’ą°P '"îŔołĐs |Ŕ1ـ*ČĘP $đfCŇ łp–€h&‚'P]†i"űĐ í° ŢX Cr +š¨9u.í0)˙ů“˘"Žy €ŞĎl\f ఉt œŇ)°VÎp ­p#fFţŻö:ě  20 Ó0@p B3 Şph€Ľ•3Ť&lÄFÎđ Ź× ô-Ž7'ˆ62C$ŕ`$§˛ ű (<“10ˆÜS\šu‹šJňŁ łĐ:ó‡ďCY+Ő &{GÓ$;‹hŔ ŒđÁ€d0$$ íP%¤ŸÝŔŕ1QHxź÷-Sd)J0łđ ö4[ć)ÎŔo΀ď€ňŮ„$@BpP] `ĘbĂ  ŕ>ˇ€Ž_T" •ĘprĎŕ1'A4ŕˆň ĽÚ;4 “ Yń ÍB0y •ňy”Ďé ŮxČŁŕRuˇ0š˜ţĐ ě`–°”ů“R@ŁaĘ@-€Wtb(’…b Ť ÎŕuP/ô Îëx€= ‚ ÷b$-5 y0 • JŔ ťŔ  ĽşgäĽŔŔ“0 *h 䐒ŔWđO WPÁüW ܀7ňşx?đqvj%đW@Ç ů@źäĐtĐB)˛đ“Đ ƒpĂňŒĐSĐůđ‰p‚ W  'ďŞ tŔTL đŒĽƒ  Wŕ#đłÂŒŕ ’lɔJŔD–pŸ@w w@ R: '   mpÓ ?pÉW0 şě Œ˜ä঍0“’đR* cIř@Œ@‘đČt@wp‰pŔž0žQzÍđk‚ĐD ü<+‘@ä`Ćrň@˝˘@TźÄ/  ČĚQŞËS@ĹŕȌ0ÁO€Ĺ á  X˘ůĂ/pqv“0 şđÁl°~Č"€' S@‰‚€Á†LW@ Ä°Í¤@ÇÜŹÄ'p\J<Ět€˜˛ŇÇ5 ;jack-3.1.1+cvs20050801/doc/screen.html0000644000175000017500000000536010371403403015072 0ustar tbmtbm Jack's status screen

A screenshot of Jack working (with comments)

Jack


screenshot with comments


(This shows the old 1.3.x version of Jack, 2.x.x look a bit different but nothing major)

Note that the xterm is automatically resized to fit all the tracks of the CD if you have xtermset installed (and enabled).

Jack is a console tool, somewhat in the great tradition of command-line oriented software. When using XTerm and xtermset the xterm's size is automagically changed to match the number of tracks. This is the meaning of the marked elements:

  • 1: the options line: list general options like MP3 bitrate, the WAV read-ahead,...
  • 2: the DAE speed: how much faster than real-time the audio data has been extracted
  • 3: the DAE status: actually, this is the output of cdparanoia, check cdparanoia -h for details on the used characters, e.g. a "+" means "Unreported loss of streaming/other error in read".
  • 4: the encoder status: while encoding, the percentage along with the ETA is displayed, afterwards the speed-factor is given, how much faster (or, like in the exaple, slower) than real-time the encoding was
  • 5: DAE in progress: the greater-sign indicates how far the extraction of this track has come, again, this is cdparanoia output.
  • 6: the status line: how much disc-space is left, how many WAVs are waiting to be encoded, how many subprocesses are idle, and, finally, the error status.

Update

I made another screenshot of the more current version 2.2.0, using curses. You will be able to understand it if you read above descriptions.

screenshot using curses


Wanna go home?
© Arne Zellentin, zarne@users.sf.net
(changed: 19-Aug-99) jack-3.1.1+cvs20050801/doc/todo.html0000644000175000017500000000264510371403403014563 0ustar tbmtbm Jack's TODO

Future additions and other TODOs for Jack

Jack
  • curses-"frontend" (MED)
  • add more rippers and encoders (which?) (MED)
  • GTK+ frontend (LOW)
  • get alternate freedb sites, ... (LOW)
  • create a man page (LOW)
  • have Jack schedule encoders in reaction to system load (done but not perfect yet)
  • re-check free space repeatedly, react to changes (done but still buggy)
Wanna go home?
© Arne Zellentin, zarne@users.sf.net
(changed: 10-Jun-99) jack-3.1.1+cvs20050801/doc/usage.gif0000644000175000017500000001021110371403403014507 0ustar tbmtbmGIF89aT(çDzޤ2V|NrŒžĘÔ:TšŽźNZ|6>dŠžŹn~œNf„2Jl>b|š˘´>JlZjŒ *L&FlFVtŠ–Ź^r”ęęěśžĚNnŒ’Ś´2Rt*L&:dŇÚܒžŹr†œVf„fz”Ş˛Ä~–Ź>^|2JtF^|>Rlfr”:V|Nj„šŞź’šŹ2TÚâä"L‚ޤNb|Fb|.Nt&BdBl˘ŽÄbnŒ*L.FdJV|ŠšŹ’˘´z†œ:NtFf„VrŒ:d6FdŽ˘´v~œBZ|^v”žĆĚÚŢä2Nt>Zt"LĆĘÔFNtZnŒţţü:R|.dŽşĚVv”~’¤Žžźn‚œNf”šŚź>Nl .TîňôVnŒ2R|Vj„FRtNj”˘Şź "LVbŒFbŒ.BdڞźzŠœ>iN^„ŽžłRf‡6Nl*\&JpŽ–°ęîôžÂĎ–Şź.T.>hÖŢ䒞źf~˜ŞśČ6JtF^ŒfvŒ>V„Rj‰žŞż2T‚’Ź>Fl*\.JnvФĆÎÚ.dz‚œ6Bi.T&>l &N†–Ź.dNbŒ2FtFZ„zŠŹ:dFV„>R|2d&Bt>Z„>N|Vj”fvœ2d~ާ6VvžŽÂ6Jl^jbr”Rnˆ–Śź6RsÖÚ䖞´v†¤J^|>VzŢâě"TRb„Jb‚ŚŽżŽšŻ–˘šJf„Zr‘FZ|bv˜ÂĆÔŢŢě6Nt^n”Zvœr‚œžŚť~Šœ">lŽśĚ†’¤ĘÎÜÂĘÔşžĚ‚–ʞşĚ6R| *\îîôLNZ„Šž´n~¤NfŒš˘ź>Jt *T&FtFV|Š–´^rœęęô’Śź*TŇÚ䒞´VfŒfzœ>^„2J|F^„>RtfrœNjŒšŞÄ’š´Úâ삎ŹNb„Fb„&Blbn”.FlŠš´’˘źFfŒVr”:l6FlŽ˘ź^vœžĆÔÚŢě>Z|"TZn”~’Źn‚¤>NtVn”VjŒFR|.BlڞÄzФ!ţMade with GIMP,T(ţ áQ͏A?<ÔđhĆ?ťšaĂśđŸ0pK>ˇ0D|)lł],IPŚ ć D ¤tĄÁ-¤@q&ˇxŁj*Jt!€ž)P’DŮľ˘>ądx ,úˆ"Š>\lD A8ĹĂ6)hB7ą°K,š°k™}\YN7Ý\’Â%ôđQĚ-¨J'§ôE7d =˙˝čƒ€ŕ°Cľn”@I |2ČĂŢ$q‚żsš ­‘î¸„ŞŹ`‚7%vł Ě\ąîş™ĐË,PřŰĘ>íČ" ƒą€˛}Ä{—ć´Â̛\”ź"=ýFSܖ›‡śnř°Í•u4)Űý€ŠZށţ,ł¤0č62^ri~ű]„¤äsិÜŇ ćJ$kP†CÇҎ6Ú´“⊹` zÄbN4+§ŔĚ×ć¤RBÝz“-%ăv‘„‰Tƒ Ł0ÓŢĄRˇŁ €“’E>Pčyé6¸ěËÉDOĆy~_؍9ĺdy,¨ Ŕ2ôlĂÎĐYƒŃŢ6ű8Â03Ď8}_7X˘ˆ"lŽbNôxŁÁ ǂĹzƒyzG˘ą ­¨}#Ĺ-4€Ÿˇő$(],üĹ?˛ŠĘˆŇ8HЉmˆ"WH ’°„oSŸčŔ Q ;8A ÂDˆBă‡ţ… @0ʐ‚=ČCˆňH˘0Áôą"őŞ"Ű Hq¨Ë 0řđC°ôZȊ$Š(ŠĚ(G ĐP 5ÔAPPá´UB,r怂˙’ŕKAöŕůČG\ƀŚ%€”_*f–uľ+˘ČD9´¸$OG>P^żRp$s0ΚÜF’ÚŃ  ŞŔB,ŽAN^‚‹ţüÇ2%đ‰Gb‘‡ř„Jđ :°[I¸Ĺ'âÓ4o˜@íX€ÂÉżzŁ𐅓H° @0‚öŃÂĹ(ŹlG;`wHB°@ ŕƒ&”%˜# ˆnşç€ŕ)$f‹umj”ŕƒ˛0„)ěƒ_IŕĆ#nÁ(ÜEĐC*’ 4Řń#ŃPP‚äQ"ŕFÔ÷ŸV„AD^Q <â4( 8 b> I€‚‹TAî€_|H°Hj0Áćh@b!E ’x…. Ř#Ô¤\q W0r‹˛pEhŸp _ô@ŢČţƒ"Ö ZbĄŁČNzҰ}¨a‘ĘX™@Ў,ňzXĂ>Ô1ČhŹO D'H0ŒEâc–=F+ôĐ ć>a šˆtů(8áO€-¸`A†ÂKĺČF6Pa œĂ–;Đ@° ]Ţ㗢đÝ,Š€OAŞ–˛ě(bQúŕÝ'P`9$'Ź4„_Ňc§‚´ŚŕąH'˜`Y C>Ź‘ˆg$ rţԙ‹ŕ¸1“Q9 ű5paƒŤ¤ŹŕŸó@âE.œ˛H*4 É<@)ď‘€xaťX$!˛…Y Â†đ-×A™])řÇ"í T8Bř­ ą;Gy‘OŠÖ5 â ĽÇ"aP§ńJÁ' á°˘[ĂúŘTˆA N@ g,"w~°…0Ž4 d¨Â"9á%%Źş‚¤B+b 'FŒx‘×™  ‡€Î˙¸Ě-Č]`AÇF,ZQ‹EÎrłĐG6žÜ‰ Ěâ¨p‡%R1+?´-U“yQŘţbۗŠ/˘ńq y‘ @Ç"ţ›ąl\\ořB   \3ĄŔŘA4đ(čZşČ…(Z T¤! ˆ*2áƒ9œăyäA7L.¤a-ä ĽŽ\ŕĄË”Čž€‹G˘Ć~ č|ä˝Yźđ°!H\lł "H…EbuW͇?Đég”Ž8X„ l bDJψK‘ƒT̞˜‡ ;§rš>0xš ?AňC>ӑ„EşL¨E-` ‹őa‘pX˘‘‚`ÔÁk cc‚P‰ŰŞ!@}KBZw´Â¨(,ú@ oP˘‚ ¤ú‘ç` -PţŃp l÷ľŕ> LŢ lOB 31,lVE`#݀ LňˆP` Ľ°†é°­ĺäĄ˙‘0MÂT$@łPć€J*ő> ˘2>wVMk ĆV `¸ ¨€e+pŽ— p € Pđ ΀Nů€ ˜€ .°…ƒNŃŕ~ăˇŔł+ہ˘ `°qB{^˛´Đ|@€  i0 Î@ýđ ݐ ˘'HM˛ëbl@ĐňAyЁ LŽ‚R¨ ¸€-° C€`i°lĎôé; T:˘ :ђŠ,ĽŠ>đ|ż łţE | Ŕâ >Đ ­$ĆfÚPńpkpŔ ¨­$ct) } E@ ďŕ ­° ‚ĐłbđÂ`C×` M…ÓŠĐ5ĺĐ5Ě Ú2{Ý0T ĺ @ł”ǧLł— ŢŽł0 )iDíőŻ€ đez"LI@PPP$Ęd6ú`ŠŔ{żP <0 ‡×˛P •ĄD: Ć)CŐ <—äW*­ ęRjł ;™ W }`ű@ÂÄJÇ/p¸} B )P›ă >€¨Đ p8Q° ‹ŕŚ 'łĐ@˛ŕ‡Ý°™yrŠ›ĺ ĚP—ňsÝţ[Ÿ@UhÄJWPđý’Ÿ€ ĺ@Ń4l€Nré-)Đ ŢŔlp,'>,ROůĹĐ W ç‰đ ÄđQ†’p-`- 3Z mĐđçŕh°˜›ŕ!AĄZ  ܐ] 3 A *% (j ‰€hPh Ŕ †đŠ Đp• /€ ‰° ĐŠP † ‹wƒ Ł4p?h5 _) ťGzА@*š/–ťĄZ€’0Ľ‹ŕ îĐ ľĹĄŠĐƒĐ/ •Đ •€ hŔn€őŕpSФi-°‹° ‰P–Đ m`ô†šCĽůl-Đ’Đ :†€›Đę Š/5P‰âRh 2ŠłtŠ’đ༰‚/)4,PK s› 3 -HĘ{›°Ć;jack-3.1.1+cvs20050801/doc/usage.html0000644000175000017500000003062310371403403014717 0ustar tbmtbm Jack Usage

Usage information for Jack

Jack
Jack is mostly command line-driven, but there are some options which can only be set by editing the preferences file, typically named $HOME/.jackrc. This file is python code executed at startup so be careful. Invoke Jack with -h for a short description of the command line options.

If you get bored reading documentation, check out the application examples!

Important things to configure in this file:

rename_fmt with this variable you can determine how jack will rename your MP3s after a freedb query. Use "%02i" for track number, "%a" for artist, "%l" for album name and "%t" for track title. Example: "%02i.%a (%l) - %t" which would result in "01.Artist (Album) - Track title.mp3"
rename_fmt_va same as above for "various artists" CDs. For normal CDs I use "%02i.%t.mp3" while I use ""%02i.%a - %t" for VA CDs.
dir_template if rename_dir is set, use this format for naming directories. Again, %a is substituted by the artist, %l is the album's name. I use "%a - %l" but "%a/%l" is also common, every artist then has his own subdir.
my_mailbe sure to set your e-mail address if you are planning to submit freedb entries. Otherwise you won't get feedback.
xtermset_enable I no longer use this since there is now a curses mode. Only set this if you have xtermset installed. When enabled, Jack can - when running in an xterm - adjust the size so all track information is visible. In addition, the xterm is deiconified when all is done.

Everything else is controlled by the command line, try jack --help for a quick summary. You can still change the defaults by editing your .jackrc!

Command line options:

-t, --tracks <tracks> limit ripping and encoding to the specified tracks, use comma to seperate track. Ranges are also possible; 5-9 is equivalent to 5,6,7,8,9; 12- is like specifying track 12,...,last_track. The default is to process the whole CD, I do not know why you would want an incomplete rip, but be my guest.
-b, --bitrate <bitrate> bitrate of the resulting MP3 in kbit/s, default is 160.
-v, --vbr Generate variable bitrate MP3s, only on encoders which support this. Default is no.
-e, --encoders <num_encoders> encode how many MP3s in parallel. If you have a SMP machine or simply want to stress your system, you can have Jack encode several MP3s at once. Default is the number of CPUs I have, which is one.
--otf On-the-fly operation. Only on some encoders/rippers. Do not create WAVs, pipe ripper output through the encoder. Default is no as it's a torture for the CDROM drive (IMHO).
-E, --encoder-name <encoder_name> choose which MP3 encoder to use, valid choices are: blade, lame, l3enc, mp3enc. Note that you may have to install the encoder.
-n, --nice <nice_lvl> nice-level with which the encoders are started. Default is 12 which shouldn't hurt your system much.
-l, --max-load <max_load> only start new encoders if your system's load is below (max_load + num_encoders). If the load is too high, encoding operation is suspended until above criterium is satisfied.
-a, --read-ahead <read_ahead> read how many WAVs in advance. At most read_ahead + num_encoders WAVs are ripped before a track has completely been encoded. Default is 99 which will read the whole CD, provided there is enough disk space.
-r, --reorder optimize track-order for disk space. This can save you some peak disk space during the encoding process; this may make it possible to do a CD which would otherwise fail to be encoded.
-s, --space <free_space> forcably set usable diskspace, in bytes. This option lets you limit the disk space Jack uses, maybe you need it for something else? Be careful: if set too high, ripping and encoding will probably fail. The default is to look how much is free and to use this value.
-o, --overwrite overwrite existing WAVs and MP3s, i.e. do not check if already ripped WAVs or an already encoded MP3s seem to be ok. Use this if you know something went wrong last time. This is off by default.
-O, --only-dae only produce WAVs, implies --keep-wavs. This is off by default.
-k, --keep-wavs do not delete WAVs after encoding them. Maybe you still need them.
-f, --from-tocfile <toc_file> rip from CD image on hd. This option is a somewhat special option. There are two reasons for it's existance:
  • When I copy a CD for my car stereo, most of the time I also want to have it as MP3s. To copy a CD, I use the exellent tool cdrdao. This works best when having the whole CD in a single WAV file, which I call the image. It also needs a so-called toc-file containing the track, pregap, index, CD-TEXT, ... information. If I use this image as the source, I do not have to rip the CD a second time. My cdrom probably likes that.
  • same cdrdao has a great way of doing a bit-wise exact copy of the CD using special Plextor-commands. This is superiour to cdparanoia as "bad" samples can be detected and - hopefully - repaired.
The specified toc-file contains the name of the image file.
-F, --from-image <image_file> read audio data from image file. Like --from-tocfile, but the image itself is specified instead of the tocfile. Use this if you do not have a toc-file; the TOC is the read from the CD itself.
-S, --swab swap byteorder from image file. As cdrdao momentarily only outputs "raw" .cdr files, you quite likely want to swap the byteorder. Try this option if your WAVs and MP3s contain only noise (no, not the noise I call music, the pseudo-random one). This is on by default as cdrdao currently generates .cdr files that are "wrong".
-c, --check-toc compare toc-file and cd-toc, then exit. Jack caches the TOC of a CD in a file ("jack.toc"). If you want to know if the inserted CD matches the toc-file in the current directory, use this option.
-g, --guess-toc <mp3_files> make up a TOC from the MP3 file given in mp3_files. Format is:
track_01.mp3 ... track_nn.mp3 ;
Note that the trailing ";" is only necessary if you want to append more options to your command line. This option makes me especially proud. You can use it to do a freedb query based on MP3s alone - no need for the CD. Very useful if you have no idea which CD the MP3s are from. The MP3s must be given in the same order as they were on their CD. The generated TOC file is similar, but not identical to the TOC of the CD - do not submit these!
--various when parsing freedb data, jack assumes that if the disc's artist is set to "Various Artists" the track titles have the format "[artist] - [title]". If the disc title is set to something else and you still want above behaviour, use --various.
--no-various use this if freedb data says it't "Various Artists" but you want the normal renaming scheme, e.g. if Jack can't seperate artist and track title.
--remove have jack remove it's temp files. See below for details on these files. Be careful - don't delete them too early!
--upd-progress have jack re-create it's temp files. Use this if you deleted them too early.
-d, --dont-work don't do DAE or encoding. This may be useful if you only want to do a freedb query.
-D, --create-dirs tells Jack to create sub-directories in which Jack puts all the files for the current CD. If no freedb data is available, i.e. when not using -Q, these directorys will be named "jack-xxxxxxxx" where "xxxxxxxx" stands for the CD's freedb-id. Otherwise dir_template (see above) will be used.
--todo print what would be done and exit.

The following options are needed for freedb queries:

-q, --query do freedb query when all is done. This is useful if Jack was prior run without a freedb query. If all tracks are done you don't even have to have a CD inserted as the TOC is cached by Jack. After having finished ripping and encoding, Jack will rename the MP3s and tag them using Ben Gertzfield's ID3.py module
-Q, --query-now do freedb query when starting. Use this if you are connected to the internet when starting jack. Know that the query may need user-interaction. After having finished ripping and encoding, Jack will rename the MP3s and tag them using Ben Gertzfield's ID3.py module
-R, --rename-only rename and tag files according to freedb file. On startup, Jack creates a blank freedb entry file (except if --query-now is used, then the file is queried from your freedb server). If you have changed it's contents (e.g. because the CD was unknown to freedb) and want to rename and tag your MP3s accordingly, use this option.
-u, --undo-rename undo file renaming and exit. If you don't like how jack renamed your files, use this option to restore the previous state. Note that ID3 tags are not restored.
-m, --mail-submit submit freedb entry via e-mail. HTTP submission is preferred but while freedb only supports submission by e-mail you have to use this. You will have to enter the category of the CD.
-M, --mail-address <submit_addr> when submitting a database entry via e-mail, use this option to specify the address the entry is mailed to. Default is freedb-submit@freedb.org.
--my-email <your_mail> use this to specify which e-mail address submission results are mailed to. Please use your real e-mail address.
--submit submit freedb entry via HTTP. You will have to enter the category of the CD. At the moment, this does not work with freedb. Or with a buggy urllib.
--server <freedb_server> which freedb server to use. Don't forget to set your proxy. Default server is freedb.freedb.org.
--force do not ask. Like when deleting incomplete (?!) files.

Jack creates a couple of files when running:
  • jack.toc
  • The CD TOC (Table Of Contents) is cached here. Will be re-created if deleted but be careful to insert the matching CD!
  • jack.freedb
  • when you are not telling jack to do a freedb query, this file is created as a freedb template file which you can fill out yourself. When using --query or --query-now it is filled with the query-result. Existing files are backed up as jack.freedb.bak.
  • jack.progress
  • Status (main) screen output is cached here. When resuming work, previously finished processes' output is still displayed. Jack also uses this file to mark ripping/encoding steps as done, so if you delete this file, everything is done again!
    Do not delete these files too early, this may case frustration!

    Wanna go home or do you wanna know how to install Jack?


    "All trademarks are owned by their owners" or whatever I have to state.
    © Arne Zellentin, zarne@users.sf.net
    (changed: 19-Aug-99) jack-3.1.1+cvs20050801/example.etc.jackrc0000644000175000017500000000274310371403403015546 0ustar tbmtbm# jackrc-version:31 # Global jackrc file, documenting some of the most important # options. The default options are commented out. # If you want to changes some of these options, add --save to the command-line # which sets the respective options. They will be saved in your ~/.jack3rc. ########################################################################## # The directory where jack puts the files by default. # This defaults to the current directory if unset: #base_dir:~/jack # The default ripper. You can choose from 'cdparanoia'(default), 'cdda2wav', # 'tosha' or 'dagrab' (The last two ones are not avaiable in Debian). #ripper:cdparanoia # The default encoder. You can choose from 'oggenc'(default), 'xing', # 'mppenc', 'lame', 'l3enc', 'gogo', 'mp3enc' or 'flac' (only oggenc is # avaiable in Debian). #encoder:oggenc # The VBR-quality of the encoded OGGs. -1 is lowest, 10 is highest. #vbr_quality:4 # rename_fmt specifies how the resulting files are named: # %n: track number # %a: artist # %t: track title # %l: album title # %y: album release year - individual track years are unsupported # %g: album genre - individual track genres are unsupported #rename_fmt:%a - %l - %n - %t # "Artist - Album - 01 - Tracktitle.[ext]" # If this is set, query freedb when starting to rip a CD. # By default, jack does not query freedb #query_if_needed=yes # If this is set, continue work even if the freedb-query failed. # By default, jack stops with an error #cont_failed_query jack-3.1.1+cvs20050801/contrib/0000755000175000017500000000000010371403417013621 5ustar tbmtbmjack-3.1.1+cvs20050801/contrib/exec_vorbisgain0000644000175000017500000000174610371403403016716 0ustar tbmtbm#!/bin/sh # Example script for exec hooks # Copyright (C) 2005 Martin Michlmayr # This script may be distributed under the GPL v2 or higher. # Process tracks with vorbisgain to calculate their "ReplayGain" # so they can be played with a uniform sound level. # Usage: put the following in your ~/.jack3rc file (without any leading # hash symbols) # exec_when_done:yes # exec_no_err:"/usr/share/doc/jack/examples/exec_vorbisgain" # You have to set (and later restore) $IFS in since $JACK_JUST_ENCODED # contains a listing of tracks separated by newlines. OLDIFS="$IFS" IFS=" " # There are two alternatives: # 1. Process all files at once as an album: vorbisgain -a $JACK_JUST_ENCODED # 2. Process each file individually: #for i in $JACK_JUST_ENCODED; do # IFS="$OLDIFS"; # vorbisgain "$i" # IFS=" #" #done # In most real world cases, you will want option 1. However, option two # is included to show how you can process individual files. IFS="$OLDIFS" jack-3.1.1+cvs20050801/jack_CDTime.py0000644000175000017500000000657510371403403014640 0ustar tbmtbm### jack_CDTime - various converters between data representation - part of ### jack - extract audio from a CD and MP3ify it using 3rd party software ### Copyright (C) 1999,2000 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import string, types CDDA_BLOCKS_PER_SECOND = 75 def strtoblocks(str): "convert mm:ss:ff to blocks" str = string.split(str, ":") blocks = string.atoi(str[2]) blocks = blocks + string.atoi(str[1]) * CDDA_BLOCKS_PER_SECOND blocks = blocks + string.atoi(str[0]) * 60 * CDDA_BLOCKS_PER_SECOND return blocks def blockstomsf(blocks): "convert blocks to mm, ss, ff" mm = blocks / 60 / CDDA_BLOCKS_PER_SECOND blocks = blocks - mm * 60 * CDDA_BLOCKS_PER_SECOND ss = blocks / CDDA_BLOCKS_PER_SECOND ff = blocks % CDDA_BLOCKS_PER_SECOND return mm, ss, ff, blocks B_MM, B_SS, B_FF = 0, 1, 2 def msftostr(msf): "convert msf format to readable string" return "%02i" % msf[B_MM]+":"+"%02i" % msf[B_SS]+":"+"%02i" % msf[B_FF] class CDTime: def __init__(self, any = None): self.__dict__['blocks'] = 0 self.__dict__['mm'] = 0 self.__dict__['ss'] = 0 self.__dict__['ff'] = 0 self.__dict__['string'] = "00:00:00" if any: self.any = any def __str__(self): return self.string def __setattr__(self, name, value): self.__dict__[name] = value if name == 'string' or name == 'any': new_val = self.__dict__[name] if type(new_val) == types.StringType and len(new_val) >=2: if new_val[0] == new_val[-1]: if new_val[0] in ('"', "'"): new_val = new_val[1:-1] try: blocks = string.atoi(new_val) except: if type(new_val) == types.StringType: blocks = strtoblocks(new_val) elif type(new_val) == types.IntType: blocks = new_val else: raise ValueError self.ff = blocks elif name == 'blocks': self.__dict__['mm'] = 0 self.__dict__['ss'] = 0 self.ff == self.blocks elif name == 'ff': if self.ff >= CDDA_BLOCKS_PER_SECOND: self.ss = self.ss + self.ff / CDDA_BLOCKS_PER_SECOND self.__dict__['ff'] = self.ff % CDDA_BLOCKS_PER_SECOND elif name == 'ss': if self.ss >= 60: self.mm = self.mm + self.ss / 60 self.__dict__['ss'] = self.ss % 60 self.__dict__['string'] = msftostr((self.mm, self.ss, self.ff,)) self.__dict__['blocks'] = strtoblocks(self.string) self.__dict__['any'] = None jack-3.1.1+cvs20050801/jack_TOC.py0000644000175000017500000000535110371403403014147 0ustar tbmtbm### jack_toc - class for CDDA TOCs - part ("module") of ### jack - extract audio from a CD and MP3ify it using 3rd party software ### Copyright (C) 1999,2000 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA class TOC: def __init__(self): self.data = [] self.image_file = None self.end_pos = 0 self.in_need_of_image_name = [] def __len__(self): return len(self.data) def append(self, entry): ## if we don't have a image_name specified, we'll take the first one available if entry.image_name == "": self.in_need_of_image_name.append(entry.number) elif self.in_need_of_image_name: for i in self.in_need_of_image_name: # FIXME: maybe we can't reference a track by it's number? self.data[i].image_name = entry.image_name self.in_need_of_image_name = [] ## if the entry has a pregap this needs to be added to the previous track and ## substracted from the current one if entry.pregap: self.data[-1].length = self.data[-1].length + entry.pregap self.end_pos = self.end_pos + entry.pregap self.data.append(entry) self.end_pos = self.end_pos + entry.length ## update image_file self.same_image() def export(self): "compatibility" tracks = [] for i in self.data: track = i.export() tracks.append(track) return tracks def image_filenames(self): "return list of all used filenames" names = [] for i in self.data: names.append(i.image_name) return names def same_image(self): "check whether all image_files are set to the same file" names = self.image_filenames()[1:] if not names: return 0 first = names[0] same = 1 for i in names: if not i == first: same = 0 break if same: self.image_file = first else: self.image_file = None return same jack-3.1.1+cvs20050801/jack_TOCentry.py0000644000175000017500000000533710371403403015235 0ustar tbmtbm### jack_TOCentry - class for CDDA TOCs - part ("module") of ### jack - extract audio from a CD and MP3ify it using 3rd party software ### Copyright (C) 1999,2000 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA entry_fields = ['type', 'copy', 'preemphasis', 'channels', 'media', 'filename', 'start', 'length', 'pregap'] compat_fields = ['number', 'length', 'start', 'copy', 'preemphasis', 'channels', 'rip', 'bitrate', 'rip_name'] class TOCentry: def __init__(self, raw_dict={}): self.number = None self.type = None self.copy = None # means no self.preemphasis = None # means no self.channels = None self.media = None # "image" or "cd" self.image_name = None # only for image-reader: name of image self.readable_name = None # name the file is renamed to self.rip_name = None # name of file while ripping / encoding self.pregap = 0 self.start = None self.length = None self.bitrate = None # compat?#XXX self.rip = None # compat if raw_dict: # for compatibility: allow to read old-style track info num = 1 for i in compat_fields: self.__dict__[i] = raw_dict[num] num = num + 1 def export(self): "compatibility" track = [] for i in compat_fields: track.append(self.__dict__[i]) return track # intercept setting of attributes def __setattr__(self, name, value): if name == 'pregap' and value: self.__dict__['start'] = self.start + (value - self.pregap) self.__dict__['length'] = self.length - (value - self.pregap) self.__dict__['pregap'] = value else: self.__dict__[name] = value # for debugging purposes only. def initialized(self): ok = 1 for i in entry_fields: if not self.__dict__[i]: ok = 0 break return ok jack-3.1.1+cvs20050801/jack_argv.py0000644000175000017500000001546710371403403014472 0ustar tbmtbm### jack_argv - argv parser and help printing -- part of ### jack - extract audio from a CD and MP3ify it using 3rd party software ### Copyright (C) 2002-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import sys import types import jack_utils import jack_generic from jack_globals import * from jack_misc import safe_int def show_usage(cf, long=0): l = [] for i in cf.keys(): if not long and not cf[i].has_key('help'): continue s = "" if cf[i].has_key('usage'): if not long and cf[i].has_key('vbr_only') and cf[i]['vbr_only'] != cf['_vbr']: continue if cf[i].has_key('long'): s = " --%s" % cf[i]['long'] if cf[i].has_key('short'): s = s + ", -%s" % cf[i]['short'] else: error("internal error in show_usage") x_char = " " l.append([s, cf[i]['usage'] + jack_utils.yes(cf[i])]) max_len = 0 for i in l: max_len = max(max_len, len(i[0])) l.sort() print "usage: jack [option]..." for i in l: jack_generic.indent(i[0] + " " * (max_len - len(i[0])), i[1]) if long: print """ While Jack is running, press q or Q to quit, p or P to disable ripping (you need the CD drive) p or P (again) or c or C to resume, e or E to pause/continue all encoders and r or R to pause/continue all rippers. """ else: print "These are the most common options. For a complete list, run jack --longhelp" def get_next(argv, i, extra_arg = None): if extra_arg != None: return i, extra_arg elif argv[i].find("=") > 0: return i, argv[i].split("=", 1)[1] else: i = i + 1 if len(argv) > i: return i, argv[i] else: return i, None def istrue(x): return x.upper() in ["Y", "YES", "1", "TRUE"] def parse_option(cf, argv, i, option, alt_arg, origin="argv"): ty = cf[option]['type'] if ty == 'toggle': if alt_arg: return i, istrue(alt_arg) else: return i, not cf[option]['val'] if ty == types.FloatType: i, data = get_next(argv, i, alt_arg) if data != None: try: data = float(data) return i, data except: return None, "option `%s' needs a float argument" % option else: return None, "Option `%s' needs exactly one argument" % option if ty == types.IntType: i, data = get_next(argv, i, alt_arg) if data != None: try: data = int(data) return i, data except: return None, "option `%s' needs an integer argument" % option return i, safe_int(data, "option `%s' needs an integer argument" % option) else: return None, "Option `%s' needs exactly one argument" % option if ty == types.StringType: i, data = get_next(argv, i, alt_arg) if data != None: return i, data else: return None, "Option `%s' needs exactly one string argument" % option if ty == types.ListType: l = [] if origin == "argv": while 1: i, data = get_next(argv, i, alt_arg) if data != None: if data == ";": break l.append(data) if alt_arg: # only one option in --opt=val form break else: break elif origin == "rcfile": i, data = get_next(argv, i, alt_arg) l = eval(data) if l and type(l) == types.ListType: return i, l else: return None, "option `%s' takes a non-empty list (which may be terminated by \";\")" % `option` # default return None, "unknown argument type for option `%s'." % option def parse_argv(cf, argv): argv_cf = {} allargs = {} for i in cf.keys(): if cf[i].has_key('long'): if len(cf[i]['long']) < 2 or allargs.has_key(cf[i]['long']): print "Hey Arne, don't bullshit me!" print cf[i] sys.exit(1) else: allargs[cf[i]['long']] = i if cf[i].has_key('short'): if len(cf[i]['short']) != 1 or allargs.has_key(cf[i]['short']): print "Hey Arne, don't bullshit me!" print cf[i] sys.exit(1) else: allargs[cf[i]['short']] = i i = 1 help = 0 while i < len(argv): if argv[i] in ("-h", "--help"): help = 1 i = i + 1 continue if argv[i] in ("--longhelp", "--long-help"): help = 2 i = i + 1 continue option = "" tmp_option = tmp_arg = None if argv[i].find("=") >= 2: tmp_option, tmp_arg = argv[i].split("=", 1) else: tmp_option = argv[i] if len(tmp_option) == 2 and tmp_option[0] == "-": o = tmp_option[1] if allargs.has_key(o): option = allargs[o] elif tmp_option == "--override": i, option = get_next(argv, i, tmp_arg) if option.find("=") > 0: option, tmp_arg = option.split("=", 1) if option == None: print "--override takes two arguments: " sys.exit(1) elif len(tmp_option) > 2 and tmp_option[0:2] == "--": o = tmp_option[2:] if allargs.has_key(o): option = allargs[o] if option: i, value = parse_option(cf, argv, i, option, tmp_arg) if i == None: error(value) if not argv_cf.has_key(option): argv_cf[option] = {} argv_cf[option].update({'val': value}) else: print "unknown option `%s'" % argv[i] show_usage(cf) sys.exit(1) if not i: break i = i + 1 return help, argv_cf # end of parse_argv() jack-3.1.1+cvs20050801/jack_checkopts.py0000755000175000017500000002206210371403403015506 0ustar tbmtbm### jack_checkopts: check the options for consistency, a module for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import signal import types import sys import os import jack_utils import jack_version import jack_plugins import jack_functions from jack_globals import * import jack_freedb import jack_helpers # special option handling def checkopts(cf, cf2): if cf2.has_key('image_file'): cf.rupdate({'rip_from_device': {'val': 0}, 'read_ahead':{'val': 1}}, "check") if cf2.has_key('image_toc_file'): cf.rupdate({'rip_from_device': {'val': 0}, 'read_ahead':{'val': 1}}, "check") if cf2.has_key('space_from_argv'): cf.rupdate({'space_set_from_argv': {'val': 1}}, "check") if cf2.has_key('only_dae') and cf2['only_dae']['val']: cf.rupdate({'encoders': {'val': 0}}, "check") if cf2.has_key('query_when_ready') and cf2['query_when_ready']['val']: cf.rupdate({'read_freedb_file': {'val': 1}, 'set_id3tag':{'val': 1}}, "check") if cf2.has_key('query_on_start') and cf2['query_on_start']['val']: cf.rupdate({'set_id3tag': {'val': 1}}, "check") if cf2.has_key('cont_failed_query') and cf2['cont_failed_query']['val']: cf.rupdate({'query_on_start': {'val': 1}, 'set_id3tag':{'val': 1}}, "check") if cf2.has_key('create_dirs') and cf2['create_dirs']['val']: cf.rupdate({'rename_dir': {'val': 1}}, "check") if cf2.has_key('freedb_rename') and cf2['freedb_rename']['val']: cf.rupdate({'read_freedb_file': {'val': 1}, 'set_id3tag':{'val': 1}}, "check") if cf2.has_key('id3_genre_txt'): genre = jack_functions.check_genre_txt(cf2['id3_genre_txt']['val']) if genre != cf['_id3_genre']: cf.rupdate({'id3_genre': {'val': genre}}, "check") del genre for i in cf2.keys(): if not cf.has_key(i): error("unknown config item `%s'" % i) def consistency_check(cf): # set plugins path and import freedb_server plugin sys.path.extend(map(expand, cf['_plugin_path'])) jack_plugins.import_freedb_servers() # check freedb server if cf.has_key('freedb_server'): if not jack_freedb.freedb_servers.has_key(cf['freedb_server']['val']): error("unknown server, choose one: " + `jack_freedb.freedb_servers.keys()`) # check dir_template and scan_dirs if len(cf['_dir_template'].split(os.path.sep)) > cf['_scan_dirs']: cf.rupdate({'scan_dirs': {'val': len(cf['_dir_template'].split(os.path.sep))}}, "check") warning("dir-template consists of more sub-paths (%i) than scan-dirs (%i). Jack may not find the workdir next time he is run. (Auto-raised)" % (len(cf['_dir_template'].split(os.path.sep)), cf['_scan_dirs'])) # check for unsername if cf['username']['val'] == None: if os.environ.has_key('USER') and os.environ['USER'] != "": cf['username']['val'] = os.environ['USER'] elif os.environ.has_key('LOGNAME') and os.environ['LOGNAME'] != "": cf['username']['val'] = os.environ['LOGNAME'] else: error("can't determine your username, please set it manually.") debug("username is " + cf['_username']) # check for hostname if cf['hostname']['val'] == None: cf['hostname']['val'] = os.uname()[1] debug("hostname is " + cf['_hostname']) # check for e-mail address if len(jack_freedb.freedb_servers[cf['_freedb_server']]['my_mail']) <= 3 or jack_freedb.freedb_servers[cf['freedb_server']['val']]['my_mail'] == "default": tmp_mail = jack_freedb.freedb_servers[cf['freedb_server']['val']]['my_mail'] tmp_mail2 = cf['_my_mail'] if len(cf['_my_mail']) <= 3 or cf['_my_mail'] == "default" or cf['_my_mail'].find("@") < 1: env = os.getenv("EMAIL") if env: jack_freedb.freedb_servers[cf['freedb_server']['val']]['my_mail'] = env else: jack_freedb.freedb_servers[cf['freedb_server']['val']]['my_mail'] = cf['username']['val'] + "@" + cf['hostname']['val'] if len(cf['my_mail']['history']) > 1: warning("illegal mail address changed to " + jack_freedb.freedb_servers[cf['freedb_server']['val']]['my_mail']) else: jack_freedb.freedb_servers[cf['freedb_server']['val']]['my_mail'] = cf['_my_mail'] debug("mail is " + jack_freedb.freedb_servers[cf['freedb_server']['val']]['my_mail'] + ", was " + tmp_mail + " / " + tmp_mail2) del tmp_mail, tmp_mail2 #if cf.has_key('charset'): # if not cf['char_filter']['val']: # warning("charset has no effect without a char_filter") # this is not true, the ogg tag uses this. if len(cf['replacement_chars']['val']) == 0: cf.rupdate({'replacement_chars': {'val': ["",]}}, "check") # stretch replacement_chars if len(cf['_unusable_chars']) > len(cf['_replacement_chars']): u, r = cf['_unusable_chars'], cf['_replacement_chars'] while len(u) > len(r): if type(r) == types.ListType: r.append(r[-1]) elif type(r) == types.StringType: r = r + r[-1] else: error("unsupported type: " + `type(cf['replacement_chars']['val'][-1])`) cf.rupdate({'replacement_chars': {'val': r}}, "check") del u, r if cf['silent_mode']['val']: cf['terminal']['val'] = "dumb" cf['xtermset_enable']['val'] = 0 out_f = open(cf['_out_file'], "a") err_f = open(cf['_err_file'], "a") os.dup2(out_f.fileno(), STDOUT_FILENO) out_f.close() os.dup2(err_f.fileno(), STDERR_FILENO) err_f.close() signal.signal(signal.SIGTTOU, signal.SIG_IGN) # load plugins, compile stuff jack_helpers.init() if not jack_helpers.helpers.has_key(cf['_encoder']) or jack_helpers.helpers[cf['_encoder']]['type'] != "encoder": dummy = [] for i in jack_helpers.helpers.keys(): if jack_helpers.helpers[i]['type'] == "encoder": dummy.append(i) error("Invalid encoder, choose one of " + `dummy`) if not jack_helpers.helpers.has_key(cf['_ripper']) or jack_helpers.helpers[cf['_ripper']]['type'] != "ripper": dummy = [] for i in jack_helpers.helpers.keys(): if jack_helpers.helpers[i]['type'] == "ripper": dummy.append(i) error("Invalid ripper, choose one of " + `dummy`) if (cf['vbr_quality']['val'] > 10) or (cf['vbr_quality']['val'] < -1): error("invalid vbr quality, must be between -1 and 10") # check for option conflicts: if cf['_otf'] and cf['_only_dae']: warning("disabling on-the-fly operation because we're doing DAE only") cf.rupdate({'otf': {'val': 0}}, "check") if cf['_otf'] and cf['_keep_wavs']: warning("disabling on-the-fly operation because we want to keep the wavs") cf.rupdate({'otf': {'val': 0}}, "check") if cf['_otf'] and cf['_image_file']: warning("disabling on-the-fly operation as we're reading from image.") cf.rupdate({'otf': {'val': 0}}, "check") if cf['_otf']: for i in (cf['_ripper'], cf['_encoder']): if not jack_helpers.helpers[i].has_key(('vbr-' * cf['_vbr'] * (i == cf['_encoder'])) + 'otf-cmd'): error("can't do on-the-fly because " + jack_helpers.helpers[i]['type'] + " " + i + " doesn't support it.") if cf['_vbr'] and not jack_helpers.helpers[cf['_encoder']].has_key('vbr-cmd'): warning("disabling VBR because " + cf['_encoder'] + " doesn't support it.") cf.rupdate({'vbr': {'val': 0}}, "check") if not cf['_vbr'] and not jack_helpers.helpers[cf['_encoder']].has_key('cmd'): error("can't do CBR because " + cf['encoder']['val'] + " doesn't support it. Use -v") if cf['_ripper'] == "cdparanoia" and cf['_sloppy']: jack_helpers.helpers['cdparanoia']['cmd'] = replace(jack_helpers.helpers['cdparanoia']['cmd'], "--abort-on-skip", "") jack_helpers.helpers['cdparanoia']['otf-cmd'] = replace(jack_helpers.helpers['cdparanoia']['otf-cmd'], "--abort-on-skip", "") if cf['_query_on_start'] and cf['_query_when_ready']: error("it doesn't make sense to query now _and_ when finished.") if cf['_dont_work'] and cf['_query_when_ready']: warning("you want to use --query-now / -Q instead of --query / -q") jack-3.1.1+cvs20050801/jack_children.py0000755000175000017500000000164410371403403015316 0ustar tbmtbm### jack_children: subprocess info for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # subprocess info children = [] jack-3.1.1+cvs20050801/jack_config.py0000644000175000017500000005405310371403403014772 0ustar tbmtbm# -*- coding: iso-8859-15 -*- ### jack_config.py: default config settings for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 2002-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import types import os import string import jack_misc import locale import jack_version from jack_globals import * # this must be filled manually (done in main) # config space with attributes cf = jack_misc.dict2({ ### prefs ### 'debug': { 'type': 'toggle', 'val': 0, 'help': 1, 'usage': "show debug information", 'long': 'AUTO', }, 'debug_write': { 'type': 'toggle', 'val': 0, #'usage': "write debug information to a file", 'long': 'AUTO', }, 'plugin_path': { 'type': types.ListType, 'val': ["~/.jack_plugins",], 'usage': "directories in which jack plugins are searched for", 'long': 'AUTO', }, 'ripper': { 'type': types.StringType, 'val': "cdparanoia", 'doc': "use which program to rip: cdparanoia, tosha, cdda2wav, dagrab (untested)", 'usage': "which program to use for extracting the audio data", 'long': 'AUTO', }, 'cd_device': { 'type': types.StringType, 'val': "/dev/cdrom", 'usage': "use which device for ripping", 'long': 'device', }, 'gen_device': { 'type': types.StringType, 'val': None, 'doc': "cdda2wav may need the scsi generic device", 'long': 'AUTO', }, 'encoder': { 'type': types.StringType, 'val': "oggenc", 'doc': "this is a symbolic name (see helpers), NOT the executable's name", 'usage': "use which encoder", 'short': 'E', 'long': 'encoder-name', }, 'vbr': { 'type': 'toggle', 'val': 1, 'help': 1, 'doc': "use variable bitrate for encoders which support it", 'usage': "generate variable bitrate files", 'short': 'v', 'long': 'AUTO', }, 'vbr_quality': { 'type': types.FloatType, 'val': 6, 'help': 1, 'vbr_only': 1, # only show in --help if vbr is on 'usage': "vbr encoding quality. -1 is lowest, 10 highest.", 'long': 'quality', }, 'bitrate': { 'type': types.IntType, 'val': 160, 'help': 1, 'vbr_only': 0, 'doc': "default bitrate", 'usage': "target bitrate in kbit/s", 'short': 'b', 'long': 'AUTO', }, 'freedb_server': { 'type': types.StringType, 'val': "freedb", 'doc': "your freedb server, see freedb_servers", 'usage': "use which freedb server", 'long': 'server', }, 'disable_http_proxy': { 'type': 'toggle', 'val': 0, 'usage': "XXX todo!!! disable default proxy (environment variable \"http_proxy\") for freedb queries", 'long': 'AUTO', }, 'my_mail': { 'type': types.StringType, 'val': "@", 'usage': "your e-mail address, needed for freedb submissions", 'long': 'AUTO', }, 'rename_fmt': { 'type': types.StringType, 'val': "%a - %l - %n - %t", 'usage': "format of normal files", 'long': 'AUTO', 'doc': """specify how the resulting files are named: %n: track number %a: artist %t: track title %l: album title %y: album release year - individual track years are unsupported %g: album genre - individual track genres are unsupported""", }, 'rename_fmt_va': { 'type': types.StringType, 'val': "%l - %n - %a - %t", 'usage': "format of Various Artists files", 'long': 'AUTO', 'doc': """specify how the resulting files are named: %n: track number %a: artist %t: track title %l: album title %y: album release year - individual track years are unsupported %g: album genre - individual track genres are unsupported""", }, 'rename_num': { 'type': types.StringType, 'val': "%02d", 'long': 'AUTO', 'usage': "track number format for %n, printf() style", }, 'rename_dir': { 'type': 'toggle', 'val': 1, 'usage': "rename directory as well", 'long': 'AUTO', }, 'append_year': { 'type': types.StringType, 'val': " (%y)", 'usage': "if known, append the year to dir", 'long': 'AUTO', }, 'dir_template': { 'type': types.StringType, 'val': "%a/%l", 'usage': "if directories are renamed, this is the format used", 'doc': """specify how the resulting files are named: %a: artist %l: album title %g: album genre - individual track genres are unsupported""", 'long': 'AUTO', }, 'char_filter': { 'type': types.StringType, 'val': "", 'usage': "convert file names using a python method", 'doc': r"""an example which converts to lowercase, even with non-ascii charsets: ".lower()" """, 'long': 'AUTO', }, 'charset': { 'type': types.StringType, 'val': locale.getpreferredencoding(), 'usage': 'charset of filenames', 'doc': "examples: latin-1, utf-8, ...", 'long': 'AUTO', }, 'unusable_chars': { 'type': types.ListType, 'val': ["/", "\r"], 'usage': "characters which can't be used in filenames", 'doc': """ put chars which can't be used in filenames here and their replacements in replacement_chars. example 1: replace all " " by "_": unusable_chars = " " replacement_chars = "_" example 2: replace umlauts by an alternate representation and kill some special characters: unusable_chars = "äöüÄÖÜß?*^()[]{}" replacement_chars = ["ae", "oe", "ue", "Ae", "Oe", "Ue", "ss", ""]""", 'long': 'AUTO', }, 'replacement_chars': { 'type': types.ListType, 'val': ["%", ""], 'doc': "this is stretched to match unusable_chars' length using the last char as fill", 'usage': "unusable chars are replaced by the corresponding list item", 'long': 'AUTO', }, 'show_time': { 'type': 'toggle', 'val': 1, 'doc': "Display the track length in the status screen", }, 'show_names': { 'type': 'toggle', 'val': 1, 'doc': "XXX todo: auto id enough term width -- display freedb track names instead if \"track_01\", ... This will not fit in a 80x24 terminal.", }, 'scan_dirs': { 'type': types.IntType, 'val': 2, 'usage': "scan in cwd n dir levels deep, e.g. 0 to disable", 'long': 'AUTO', }, 'searchdirs': { 'type': types.ListType, 'val': [os.curdir], 'usage': "search which directories", 'long': 'search', }, 'base_dir': { 'type': types.StringType, 'val': os.curdir, 'usage': "where to create directories and put the files", 'long': 'workdir', 'short': 'w', }, 'update_interval': { 'type': types.FloatType, 'val': 1.0, 'doc': "update status screen every ... seconds", }, 'max_load': { 'type': types.FloatType, 'val': 10.0, 'usage': "only start new encoders if load < max_load", 'long': 'AUTO', }, 'xtermset_enable': { 'type': 'toggle', 'val': 0, 'doc': "leave disabled if you don't have xtermset installed", }, 'restore_xterm_width': { 'type': 'toggle', 'val': 0, 'doc': "XXX not implemented yet! reset xterm width when exiting", }, 'terminal': { 'type': types.StringType, 'val': "auto", 'doc': "use what kind of terminal", }, 'default_width': { 'type': types.IntType, 'val': 80, 'doc': "XXX unused! your xterm's width (autodetected with curses)", }, 'default_height': { 'type': types.IntType, 'val': 24, 'doc': "XXX unused! your xterm's height (autodetected with curses)", }, 'usage_win': { 'type': 'toggle', 'val': 1, 'usage': "show the help screen while running", 'long': "AUTO", }, 'keep_free': { 'type': types.IntType, 'val': 5*2**20, 'doc': "suspend if less than keep_free bytes are free. Don't set this to zero as encoded file size prediction is always a bit below actual sizes => we might need some extra space.", }, 'encoders': { 'type': types.IntType, 'val': 1, 'usage': "encode how many files in parallel", 'short': 'e', 'long': 'AUTO', }, 'otf': { 'type': 'toggle', 'val': 0, 'usage': "on-the-fly encoding *experimental*", 'long': 'AUTO', }, 'create_dirs': { 'type': 'toggle', 'val': 1, 'usage': "create subdir for files", 'short': 'D', 'long': 'AUTO', }, 'reorder': { 'type': 'toggle', 'val': 0, 'usage': "reorder tracks to save space while encoding", 'short': 'r', 'long': 'AUTO', }, 'keep_wavs': { 'type': 'toggle', 'val': 0, 'usage': "do not delete WAVs after encoding them", 'short': 'k', 'long': 'AUTO', }, 'only_dae': { 'type': 'toggle', 'val': 0, 'usage': "only produce WAVs, implies --keep_wavs", 'short': 'O', 'long': 'AUTO', }, 'read_ahead': { 'type': types.IntType, 'val': 99, 'usage': "read how many WAVs in advance", 'short': 'a', 'long': 'AUTO', }, 'nice_value': { 'type': types.IntType, 'val': 12, 'usage': "nice-level of encoders", 'short': 'n', 'long': 'nice', }, 'overwrite': { 'type': 'toggle', 'val': 0, 'usage': "overwrite existing files", 'short': 'o', 'long': 'AUTO', }, 'remove_files': { 'type': 'toggle', 'val': 0, 'usage': "remove jack.* file when done", 'long': 'AUTO', }, 'silent_mode': { 'type': 'toggle', 'val': 0, 'usage': "be quiet (no screen output)", 'long': 'AUTO', }, 'exec_when_done': { 'type': 'toggle', 'val': 0, 'usage': "run predefined command when finished", 'long': 'exec', 'short': 'x', }, 'exec_rip_done': { 'type': types.StringType, 'val': "eject /dev/cdrom", 'doc': "example: eject the CD when ripping is finished", }, 'exec_no_err': { 'type': types.StringType, 'val': "play /usr/local/audio/allok.wav", 'doc': "example: play sound when finished", }, 'exec_err': { 'type': types.StringType, 'val': "play /usr/local/audio/error.wav", 'doc': "example: this is played when an error occured", }, 'freedb_dir': { 'type': types.StringType, 'val': "", 'doc': "change this to something like \"/var/spool/freedb\" and all queries will be done in this (local) directory; failed local queries will be done via network", }, 'freedb_pedantic': { 'type': 'toggle', 'val': 0, 'doc': "don't be pedantic when parsing freedb data, e.g. the ambigous (various artists) TTITLE \"The Artist - Track a Title - Cool Remix\" is split at the first possible separator.", }, ### prefs0 ### 'force': { 'type': 'toggle', 'val': 0, 'usage': "don't ask.", 'long': 'AUTO', }, 'recheck_space': { 'type': 'toggle', 'val': 1, 'doc': "yes we want to react to disk space dropping.", }, 'swap_byteorder': { 'type': 'toggle', 'val': 1, 'usage': "swap byteorder when reading from image", 'long': 'swab', 'short': 'S', }, 'todo_exit': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "print what would be done and exit", 'long': 'todo', }, 'space_from_argv': { 'type': types.IntType, 'val': 0, 'usage': "force usable disk space, in bytes", 'long': 'space', 'short': 's', }, 'check_toc': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "compare toc-file and cd-toc, then exit", 'long': 'AUTO', }, 'undo_rename': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "undo the last file renaming and exit", 'long': 'AUTO', 'short': 'u', }, 'dont_work': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "don't do DAE, encoding, renaming or tagging", 'long': 'AUTO', 'short': 'd', }, 'update_freedb': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "update the freedb info and exit", 'long': 'AUTO', 'short': 'U', }, 'sloppy': { 'type': 'toggle', 'val': 0, 'doc': "XXX", 'long': 'I-swear-I\'ll-never-give-these-files-to-anyone,-including-hot-babes-TM', }, 'tracks': { 'type': types.StringType, 'val': "", 'save': 0, 'usage': "which tracks to process (e.g. 1, 3, 5-9, 12-)", 'long': 'tracks', 'short': 't', }, 'name': { 'type': types.StringType, 'val': "track_%02d", 'doc': "filename template (before renaming)", }, 'rippers': { 'type': types.IntType, 'val': 1, 'doc': "not implemented: rip in parallel", }, 'toc_prog': { 'type': types.StringType, 'val': "CDDB.py", 'doc': "use which helper program to read cd's toc", }, ### prefs0 -- FREEDB stuff ### 'query_on_start': { 'type': 'toggle', 'val': 0, 'save': 0, 'help': 1, 'usage': "do freedb query when starting", 'long': 'query-now', 'short': 'Q', }, 'query_if_needed': { 'type': 'toggle', 'val': 0, 'help': 1, 'usage': "query freedb when starting if not queried already", 'long': 'AUTO', }, 'query_when_ready': { 'type': 'toggle', 'val': 0, 'save': 0, 'help': 1, 'usage': "do freedb query when all is done", 'long': 'query', 'short': 'q', }, 'cont_failed_query': { 'type': 'toggle', 'val': 0, 'usage': "continue without freedb data if query fails", 'long': 'AUTO', }, 'edit_freedb': { 'type': 'toggle', 'val': 0, 'usage': "edit CDDB information before using it", 'long': 'AUTO', }, 'various': { 'type': 'toggle', 'val': None, 'save': 0, 'usage': "assume CD has various artists", 'long': 'AUTO', }, 'various_swap': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "exchange artist and title", 'long': 'AUTO', }, 'extt_is_artist': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "extt contains artist", 'long': 'AUTO', }, 'extt_is_title': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "extt contains track title", 'long': 'AUTO', }, 'extt_is_comment': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "extt contains track comment", 'long': 'AUTO', }, 'freedb_submit': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "http-submit freedb file to server and exit", 'long': 'submit', }, 'freedb_mailsubmit': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "submit by e-mail - needs sendmail", 'long': 'mail-submit', 'short': 'm', }, 'read_freedb_file': { 'type': 'toggle', 'val': 0, 'save': 0, 'doc': "read freedb file", }, 'freedb_rename': { 'type': 'toggle', 'val': 0, 'help': 1, 'save': 0, 'usage': "rename according to freedb file, eg. after editing it", 'long': 'rename', 'short': 'R', }, 'set_id3tag': { 'type': 'toggle', 'val': 0, 'save': 0, 'doc': "set id3 tag info", }, 'id3_genre': { 'type': types.IntType, 'val': -1, 'save': 0, 'doc': "set ID3 genre (empty=don't set, help=list)", }, 'id3_year': { 'type': types.IntType, 'val': -1, 'save': 0, 'usage': "set ID3 year (0=don't set)", 'long': 'AUTO', 'short': 'Y', }, 'username': { 'type': types.StringType, 'val': None, 'doc': "required for freedb query", }, 'hostname': { 'type': types.StringType, 'val': None, 'doc': "required for freedb query", }, 'image_toc_file': { 'type': types.StringType, 'val': None, 'save': 0, 'usage': "read another toc file which may point to an image-file", 'long': 'from-tocfile', 'short': 'f', }, 'image_file': { 'type': types.StringType, 'val': None, 'save': 0, 'usage': "read audio from an image file", 'long': 'from-image', 'short': 'F', }, 'rip_from_device': { 'type': 'toggle', 'val': 1, 'save': 0, 'doc': "rip from physical device, not from image_file", }, 'toc_file': { 'type': types.StringType, 'val': jack_version.prog_name + ".toc", 'save': 0, 'doc': "the toc file which is actually used", }, 'def_toc': { 'type': types.StringType, 'val': jack_version.prog_name + ".toc", 'doc': "the default name of the toc file", }, 'freedb_form_file': { 'type': types.StringType, 'val': jack_version.prog_name + ".freedb", 'doc': "name of submission template", }, 'out_file': { 'type': types.StringType, 'val': jack_version.prog_name + ".out", 'doc': "in silent-mode, stdout goes here", }, 'err_file': { 'type': types.StringType, 'val': jack_version.prog_name + ".err", 'doc': "in silent-mode, stderr here", }, 'progress_file': { 'type': types.StringType, 'val': jack_version.prog_name + ".progress", 'doc': "subprocess output is cached here", }, 'progr_sep': { 'type': types.StringType, 'val': "/|\\", 'doc': "field separator in progress_file", }, 'guess_mp3s': { 'type': types.ListType, 'val': [], 'save': 0, 'usage': "guess TOC from files (until terminating \";\")", 'long': 'guess-toc', 'short': 'g', }, 'upd_progress': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "re-generate progress file if \"lost\"", 'long': 'AUTO', }, 'multi_mode': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "try to query freedb for all dirs in searchdirs which have no freedb data", 'long': 'AUTO', }, 'claim_dir': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "rename the dir even if it was not created by jack", 'long': 'AUTO', 'short': 'C', }, 'wait_on_quit': { 'type': 'toggle', 'val': 0, 'usage': "wait for key press before quitting", 'long': 'wait', }, 'id3_genre_txt': { 'type': types.StringType, 'val': None, 'save': 0, 'usage': "set ID3 genre (empty=don't set, help=list)", 'long': 'id3-genre', 'short': 'G', }, 'save_args': { 'type': 'toggle', 'val': 0, 'save': 0, 'usage': "save options to rc file and exit", 'long': 'save', }, 'global_rc': { 'type': types.StringType, 'val': "/etc/jackrc", 'save': 0, 'doc': "system-wide config file", }, 'user_rc': { 'type': types.StringType, 'val': "~/.jack3rc", 'save': 0, 'doc': "user config file", }, 'write_m3u': { 'type': 'toggle', 'val': 0, 'usage': "create a playlist in .m3u format", 'long': 'AUTO', }, 'write_id3v1': { 'type': 'toggle', 'val': 1, 'usage': "write a smart id3v1 tag to the encoded file", 'long': 'AUTO', }, 'write_id3v2': { 'type': 'toggle', 'val': 1, 'usage': "write an id3v2 tag to the encoded file", 'long': 'AUTO', }, 'playorder': { 'type': 'toggle', 'val': 0, 'usage': "use the freedb PLAYORDER field to limit the tracks to rip (non-functional, sorry)", 'long': 'AUTO', }, }) for i in cf.keys(): # expand long options if cf[i].has_key('long') and cf[i]['long'] == "AUTO": cf[i]['long'] = string.replace(i, "_", "-") # init history cf[i]['history'] = [ ["config", cf[i]['val'],],] jack-3.1.1+cvs20050801/jack_constants.py0000644000175000017500000000262110371403403015533 0ustar tbmtbm### jack_constants ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # track representation format # LEN and START is in cdda-blocks: # [ track#, len, start, copy, pre, ch, unused, bitrate, filename ] fields = ["NUM", "LEN", "START", "COPY", "PRE", "CH", "RIP", "RATE", "NAME"] NUM, LEN, START, COPY, PRE, CH, RIP, RATE, NAME = 0,1,2,3,4,5,6,7,8 # jack_functions.tracksize() return list format ENC, WAV, BOTH, PEAK, AT, CDR, BLOCKS = 0,1,2,3,4,5,6 # more constants CDDA_BLOCKSIZE = 2352 CDDA_BLOCKS_PER_SECOND = 75 MSF_OFFSET = 150 CHILD = 0 CDDA_MAXTRACKS = 100 STDIN_FILENO = 0 STDOUT_FILENO = 1 STDERR_FILENO = 2 jack-3.1.1+cvs20050801/jack_display.py0000755000175000017500000000761710371403403015201 0ustar tbmtbm### jack_display: screen presentation module for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2003 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import termios import sys import os import signal import jack_ripstuff import jack_term import jack_children import jack_freedb import jack_functions import jack_globals import jack_tag from jack_globals import * global_total = None options_string = None special_line = None bottom_line = None discname = None # terminal attributes old_tc = None smile = " :-)" def init(): global global_total global options_string global discname global old_tc global_total = jack_functions.tracksize(jack_ripstuff.all_tracks_todo_sorted)[jack_functions.BLOCKS] options_string = "Options:" \ + (" bitrate=%i" % cf['_bitrate']) * (not cf['_vbr']) + " vbr" * cf['_vbr'] \ + " reorder" * cf['_reorder'] \ + " read-ahead=" + `cf['_read_ahead']` \ + " keep-wavs" * cf['_keep_wavs'] \ + " id=" + jack_freedb.freedb_id(jack_ripstuff.all_tracks) \ + (" len=%02i:%02i" % (global_total / jack_globals.CDDA_BLOCKS_PER_SECOND \ / 60, global_total / jack_globals.CDDA_BLOCKS_PER_SECOND % 60)) \ + " | press Q to quit" jack_term.tmod.extra_lines = 2 if jack_freedb.names_available: jack_term.tmod.extra_lines = jack_term.tmod.extra_lines + 1 if jack_term.term_type == "curses": discname = jack_tag.locale_names[0][0] + " - " + jack_tag.locale_names[0][1] else: options_string = center_line(jack_tag.locale_names[0][0] + " - " + jack_tag.locale_names[0][1], fill = "- ", fill_r = " -", width = jack_term.size_x) + "\n" + center_line(options_string, fill = " ", fill_r = " ", width = jack_term.size_x) def sig_handler(sig, frame): "signal handler and general cleanup procedure" if frame < 0: exit_code = frame else: exit_code = 0 jack_term.disable() if sig: exit_code = 2 info("signal %d caught, exiting." % sig) for i in jack_children.children: exit_code = 1 if not cf['_silent_mode']: info("killing %s (pid %d)" % (i['type'], i['pid'])) os.kill(i['pid'], signal.SIGTERM) i['file'].close() if exit_code and cf['_silent_mode']: progress("all", "err", "abnormal exit (code %i), check %s and %s" % (exit_code, cf['_err_file'], cf['_out_file'])) if cf['_wait_on_quit']: raw_input("press ENTER to exit") sys.exit(exit_code) #/ end of sig_handler /# def center_line(str, fill = " ", fill_sep = " ", fill_r = "", width = 80): "return str centered, filled with fill chars" width = jack_term.size_x free = width - len(str) if free >= 2: if not fill_r: fill_r = fill length = len(fill) left = free / 2 right = free / 2 + (free % 2) left_c = fill * (left / length) + fill_sep * (left % length) right_c = fill_sep * (right % length) + fill_r * (right / length) return left_c + str + right_c else: return str def exit(why = 0): "call my own cleanum fkt. and exit" if why: why = 0 - why sig_handler(0, why) jack-3.1.1+cvs20050801/jack_encstuff.py0000755000175000017500000000174410371403403015344 0ustar tbmtbm### jack_encstuff: container module for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # we need this to remove the tracks from wavs_todo and to prevent re-coding mp3s_ready = None jack-3.1.1+cvs20050801/jack_freedb.py0000644000175000017500000007631210371403403014756 0ustar tbmtbm### jack_freedb: freedb server for use in ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2003 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import urllib2, urllib import string import sys import os import locale import codecs import tempfile import shutil import re import jack_playorder import jack_functions import jack_progress import jack_utils from jack_version import prog_version, prog_name from jack_globals import * names_available = None # freedb info is available dir_created = None # dirs are only renamed if we have created them NUM, LEN, START, COPY, PRE, CH, RIP, RATE, NAME = range(9) freedb_servers = { 'freedb': { 'host': "freedb.freedb.org", 'id': prog_name + " " + prog_version, 'mail': "freedb-submit@freedb.org", 'my_mail': "default" }, 'freedb-de': { 'host': "de.freedb.org", 'id': prog_name + " " + prog_version, 'mail': "freedb-submit@freedb.org", 'my_mail': "default" }, } def interpret_db_file(all_tracks, freedb_form_file, verb, dirs = 0, warn = None): "read freedb file and rename dir(s)" global names_available, dir_created freedb_rename = 0 if warn == None: err, track_names, locale_names, cd_id, revision = freedb_names(freedb_id(all_tracks), all_tracks, freedb_form_file, verb = verb) else: err, track_names, locale_names, cd_id, revision = freedb_names(freedb_id(all_tracks), all_tracks, freedb_form_file, verb = verb, warn = warn) if (not err) and dirs: freedb_rename = 1 # The user wants us to use the current dir, unconditionally. if cf['_claim_dir']: dir_created = jack_utils.split_dirname(os.getcwd())[-1] jack_functions.progress("all", "mkdir", dir_created) cf['_claim_dir'] = 0 if cf['_rename_dir'] and dir_created: new_dirs, new_dir = jack_utils.mkdirname(track_names, cf['_dir_template']) old_dir = os.getcwd() old_dirs = jack_utils.split_dirname(old_dir) dirs_created = jack_utils.split_dirname(dir_created) # only do the following if we are where we think we are and the dir has to be # renamed. if jack_utils.check_path(dirs_created, old_dirs) and not jack_utils.check_path(dirs_created, new_dirs): jack_utils.rename_path(dirs_created, new_dirs) print "Info: cwd now", os.getcwd() jack_functions.progress("all", 'ren', dir_created + "-->" + unicode(new_dir, cf['_charset'])) if not err: names_available = 1 else: freedb_rename = 0 return err, track_names, locale_names, freedb_rename, revision #/ end of interpret_db_file /# def local_freedb(cd_id, freedb_dir, outfile = "/tmp/testfilefreedb"): "Use file from local freedb directory" # Moritz Moeller-Herrmann kindly provided this functionality. if not os.path.isdir(freedb_dir): error("freedb directory not found") if not os.access(freedb_dir, 5): error("freedb directory access not permitted") cat=[freedb_dir] # category listing for entry in os.listdir(freedb_dir): if os.path.isdir(os.path.join(freedb_dir, entry)): cat.append(os.path.join(freedb_dir, entry)) for musicdir in cat: for m in os.listdir(musicdir): if m == cd_id: idfile = os.path.join(musicdir, cd_id) inf = open (idfile, "r") outf = open (outfile, "w") buf = inf.readline() while buf: buf = string.replace(buf, "\n", "") # we need trailing spaces if buf != ".": outf.write(buf + "\n") buf = inf.readline() inf.close() outf.close() return 0 print "No local matching freedb entry found" return 1 def freedb_sum(n): "belongs to freedb_id" ret = 0 while n > 0: ret = ret + (n % 10) n = n / 10 return ret def freedb_id(tracks, warn=0): from jack_globals import START, MSF_OFFSET, CDDA_BLOCKS_PER_SECOND "calculate freedb (aka CDDB) disc-id" cdtoc = [] if not tracks: if warn: warning("no tracks! No disc inserted? No/wrong ripper?") return 0 for i in tracks: cdtoc.append(jack_functions.blockstomsf(i[START] + MSF_OFFSET)) cdtoc.append(jack_functions.blockstomsf(tracks[-1][START] + tracks[-1][LEN])) n = t = 0 for i in tracks: n = n + freedb_sum((i[START] + MSF_OFFSET) / CDDA_BLOCKS_PER_SECOND) t = (tracks[-1][START] + tracks[-1][LEN]) / CDDA_BLOCKS_PER_SECOND - tracks[0][START] / CDDA_BLOCKS_PER_SECOND return "%08x" % ((n % 0xff << long(24)) | (t << 8) | (len(tracks))) def freedb_split(field, s, max = 78): "split a field into multiple lines of 78 char max." x = "" s = field + "=" + s while len(s) > max: x = x + s[:max] + "\n" s = field + "=" + s[max:] return x + s + "\n" def freedb_template(tracks, names = "", revision = 0): "generate a freedb submission template" if os.path.exists(cf['_freedb_form_file']): os.rename(cf['_freedb_form_file'], cf['_freedb_form_file'] + ".bak") f = open(cf['_freedb_form_file'], "w") f.write("# xmcd CD database file\n#\n# Track frame offsets:\n") for i in tracks: f.write("# " + `i[START] + MSF_OFFSET` + "\n") f.write("#\n# Disc length: " + `(MSF_OFFSET + tracks[-1][START] + tracks[-1][LEN]) / CDDA_BLOCKS_PER_SECOND`) f.write(" seconds\n#\n# Revision: %i\n" % revision) f.write("# Submitted via: " + prog_name + " " + prog_version + "\n#\n") f.write("DISCID=" + freedb_id(tracks) + "\n") if names: if names[1][0]: # various if string.find(string.upper(names[0][0]), "VARIOUS") >= 0: f.write(freedb_split("DTITLE", "Various / " + names[0][1])) else: f.write(freedb_split("DTITLE", "Various / " + names[0][0] + " - " + names[0][1])) else: f.write(freedb_split("DTITLE", names[0][0] + " / " + names[0][1])) else: f.write("DTITLE=\n") for i in tracks: if names: if names[i[NUM]][0]: # various f.write( freedb_split("TTITLE" + `i[NUM]-1`, names[i[NUM]][0] + " - " + names[i[NUM]][1] ) ) else: f.write(freedb_split("TTITLE" + `i[NUM]-1`, names[i[NUM]][1])) else: f.write("TTITLE" + `i[NUM]-1` + "=\n") freedb_year, freedb_id3genre = -1, -1 if cf['_id3_genre'] >= 0 and cf['_id3_genre'] < len(id3genres) or cf['_id3_genre'] == 255: freedb_id3genre = cf['_id3_genre'] elif names and len(names[0]) == 4: freedb_id3genre = names[0][3] if cf['_id3_year'] >= 0: freedb_year = cf['_id3_year'] elif names and len(names[0]) == 4: freedb_year = names[0][2] if freedb_year >= 0 or freedb_id3genre >= 0: f.write("EXTD=\\nYEAR: %4s ID3G: %3s\n" % (freedb_year, freedb_id3genre)) else: f.write("EXTD=\n") for i in tracks: f.write("EXTT" + `i[NUM]-1` + "=\n") f.write("PLAYORDER=\n") def freedb_query(cd_id, tracks, file): if cf['_freedb_dir']: if local_freedb(cd_id, cf['_freedb_dir'], file)==0: # use local database (if any) return 0 qs = "cmd=cddb query " + cd_id + " " + `len(tracks)` + " " # query string for i in tracks: qs = qs + `i[START] + MSF_OFFSET` + " " qs = qs + `(MSF_OFFSET + tracks[-1][START] + tracks[-1][LEN]) / CDDA_BLOCKS_PER_SECOND` hello = "hello=" + cf['_username'] + " " + cf['_hostname'] + " " + freedb_servers[cf['_freedb_server']]['id'] qs = urllib.quote_plus(qs + "&" + hello + "&proto=6", "=&") url = "http://" + freedb_servers[cf['_freedb_server']]['host'] + "/~cddb/cddb.cgi?" + qs if cf['_cont_failed_query']: try: f = urllib2.urlopen(url) except IOError: traceback.print_exc() err = 1 return err else: f = urllib2.urlopen(url) buf = f.readline() if buf and buf[0:1] == "2": if buf[0:3] in ("210", "211"): # Found inexact or multiple exact matches, list follows print "Found the following matches. Choose one:" num = 1 matches = [] while 1: buf = f.readline() try: buf = unicode(buf, "utf-8") except UnicodeDecodeError: buf = unicode(buf, "latin-1") if not buf: break buf = string.rstrip(buf) if buf != ".": print "%2i" % num + ".) " + buf.encode(locale.getpreferredencoding(), "replace") matches.append(buf) num = num + 1 x = -1 while x < 0 or x > num - 1: input = raw_input(" 0.) none of the above: ") if not input: continue try: x = int(input) except ValueError: x = -1 # start the loop again if not x: print "ok, aborting." sys.exit() buf = matches[x-1] buf = string.split(buf, " ", 2) freedb_cat = buf[0] cd_id = buf[1] err = 0 elif buf[0:3] == "200": buf = string.split(buf) freedb_cat = buf[1] elif buf[0:3] == "202": if cf['_cont_failed_query']: warning(buf + f.read() + " How about trying another --server?") err = 1 return err else: error(buf + f.read() + " How about trying another --server?") else: if cf['_cont_failed_query']: warning(buf + f.read() + " --don't know what to do, aborting query.") err = 1 return err else: error(buf + f.read() + " --don't know what to do, aborting query.") cmd = "cmd=cddb read " + freedb_cat + " " + cd_id url = "http://" + freedb_servers[cf['_freedb_server']]['host'] + "/~cddb/cddb.cgi?" + urllib.quote_plus(cmd + "&" + hello + "&proto=6", "=&") f = urllib2.urlopen(url) buf = f.readline() if buf and buf[0:3] == "210": # entry follows if os.path.exists(file): os.rename(file, file + ".bak") of = open(file, "w") buf = f.readline() while buf: buf = string.rstrip(buf) if buf != ".": of.write(buf + "\n") buf = f.readline() of.close() jack_functions.progress("all", "freedb_cat", freedb_cat) jack_progress.status_all['freedb_cat'] = freedb_cat err = 0 else: print string.rstrip(buf) print f.read() warning("could not query freedb entry") err = 1 f.close() else: print string.rstrip(buf) print f.read() warning("could not check freedb category") err = 2 f.close() return err def freedb_names(cd_id, tracks, name, verb = 0, warn = 1): "returns err, [(artist, albumname), (track_01-artist, track_01-name), ...], cd_id, revision" err = 0 tracks_on_cd = tracks[-1][NUM] freedb = {} f = open(name, "r") # first the freedb info is read in... while 1: line = f.readline() if not line: break try: line = unicode(line, "utf-8") except UnicodeDecodeError: line = unicode(line, "latin-1") line = string.replace(line, "\n", "") # cannot use rstrip, we need trailing # spaces line = string.replace(line, "\r", "") # I consider "\r"s as bugs in db info if jack_functions.starts_with(line, "# Revision:"): revision = int(line[11:]) for i in ["DISCID", "DTITLE", "TTITLE", "EXTD", "EXTT", "PLAYORDER"]: if jack_functions.starts_with(line, i): buf = line if string.find(buf, "=") != -1: buf = string.split(buf, "=", 1) if buf[1]: if freedb.has_key(buf[0]): if buf[0] == "DISCID": freedb[buf[0]] = freedb[buf[0]] + ',' + buf[1] else: freedb[buf[0]] = freedb[buf[0]] + buf[1] else: freedb[buf[0]] = buf[1] continue for i in tracks: # check that info is there for all tracks if not freedb.has_key("TTITLE%i" % (i[NUM] - 1)): # -1 because freedb starts at 0 err = 1 if verb: warning("no freedb info for track %02i (\"TTITLE%i\")" % (i[NUM], i[NUM] - 1)) freedb["TTITLE%i" % (i[NUM] - 1)] = "[not set]" for i in freedb.keys():# check that there is no extra info if i[0:6] == "TTITLE": if int(i[6:]) > tracks_on_cd - 1: err = 2 if verb: warning("extra freedb info for track %02i (\"%s\"), cd has only %02i tracks." % (int(i[6:]) + 1, i, tracks_on_cd)) if not freedb.has_key("DTITLE"): err = 3 if verb: warning("freedb entry doesn't contain disc title info (\"DTITLE\").") freedb['DTITLE'] = "[not set]" if not freedb.has_key("DISCID"): err = 4 if verb: warning("freedb entry doesn't contain disc id info (\"DISCID\").") read_id = "00000000" else: read_id = freedb['DISCID'] read_ids = string.split(freedb['DISCID'], ",") id_matched = 0 for i in read_ids: if i == cd_id: id_matched = 1 if not id_matched and warn: print "Warning: calculated id (" + cd_id + ") and id from freedb file" print " :", read_ids print " : do not match, hopefully due to inexact match." for i in read_ids: for j in i: if j not in "0123456789abcdef": if verb: warning("the disc's id is not 8-digit hex (\"DISCID\").") err = 5 if len(i) != 8: if verb: warning("the disc's id is not 8-digit hex (\"DISCID\").") err = 5 if freedb.has_key('PLAYORDER'): jack_playorder.order = freedb('PLAYORDER') dtitle = freedb['DTITLE'] dtitle = string.replace(dtitle, " / ", "/") # kill superflous slashes dtitle = string.replace(dtitle, "/ ", "/") dtitle = string.replace(dtitle, " /", "/") dtitle = string.replace(dtitle, "(unknown disc title)", "(unknown artist)/(unknown disc title)") # yukk! if not dtitle: dtitle = "(unknown artist)/(unknown disc title)" if string.find(dtitle,"/") == -1: if cf['_various'] == 1: dtitle = "Various/" + dtitle warning("bad disc title, using %s. Please fix and submit." % dtitle) else: dtitle = "(unknown artist)/" + dtitle names = [string.split(dtitle,"/",1)] if freedb.has_key('EXTD'): extra_tag_pos = string.find(freedb['EXTD'], "\\nYEAR:") if extra_tag_pos >= 0: try: extd_info = freedb['EXTD'][extra_tag_pos + 7:] extd_year, extd_id3g = string.split(extd_info, "ID3G:", 1) extd_year, extd_id3g = int(extd_year), int(extd_id3g) except: print "can't handle '%s'." % freedb['EXTD'] else: names = [string.split(dtitle, "/", 1)] names[0].extend([extd_year, extd_id3g]) if names[0][0] == "(unknown artist)": if verb: warning("the disc's title must be set to \"artist / title\" (\"DTITLE\").") err = 6 if string.upper(names[0][0]) in ("VARIOUS", "VARIOUS ARTISTS", "SAMPLER", "COMPILATION", "DIVERSE", "V.A.", "VA"): if not cf['_various'] and not ['argv', False] in cf['various']['history']: cf['_various'] = 1 # user says additional info is in the EXTT fields if cf['_various'] and cf['_extt_is_artist']: for i in range(tracks_on_cd): if freedb['EXTT'+`i`]: names.append([freedb['EXTT'+`i`], freedb['TTITLE'+`i`]]) else: err = 8 if verb: warning("no EXTT info for track %02i." % i) elif cf['_various'] and cf['_extt_is_title']: for i in range(tracks_on_cd): if freedb['EXTT'+`i`]: names.append([freedb['TTITLE'+`i`], freedb['EXTT'+`i`]]) else: err = 8 if verb: warning("no EXTT info for track %02i." % i) # we'll try some magic to separate artist and title elif cf['_various']: found = [[], [], [], [], [], []] # lenght=3 2 1 , 3 2 1 (secondary) ignore = string.letters + string.digits titles = [] braces = [['"', '"'], ["'", "'"], ["(", ")"], ["[", "]"], ["{", "}"]] # first generate a list of track titles for i in range(tracks_on_cd): titles.append(freedb['TTITLE'+`i`]) # now try to find a string common to all titles with length 3...1 for i in (3,2,1): candidate_found = 0 for j in range(len(titles[0])-(i-1)): # choose a possible candidate candidate = titles[0][j:j+i] illegal_letter = 0 for k in candidate: if k in ignore: # candidate must not have characters from ignore illegal_letter = 1 break if illegal_letter: continue else: candidate_found = 1 # if we have a candidate, check that it occurs in all titles if candidate_found: all_matched = 1 append_as_secondary = 0 for l in titles: matches = 0 where = 0 brace = 0 for b in braces: if b[0] in candidate: brace = 1 where2 = string.find(l, candidate) + len(candidate) where = where2 while string.find(l, b[1], where) != -1: where = string.find(l, b[1], where) + len(candidate) matches = matches + 1 where = where2 if not b[1] in candidate: while string.find(l, candidate, where) != -1: where = string.find(l, candidate, where) + len(candidate) matches = matches + 1 break # only treat the first pair of braces if not brace: while string.find(l, candidate, where) != -1: matches = matches + 1 where = string.find(l, candidate, where) + len(candidate) if matches == 0: # not found all_matched = 0 break elif matches == 1: # found exactly once pass else: # found multiple times if cf['_freedb_pedantic']: all_matched = 0 break else: append_as_secondary = 1 pass if all_matched: if append_as_secondary: found[6-i].append(candidate) else: found[3-i].append(candidate) # if no candidate has been found, try one with less characters else: continue tmp = [] eliminate = [" "] for i in found: i.sort() # I'm not sure anymore why/if this is needed i.reverse() for j in i: if j not in eliminate: tmp.append(j) found = tmp del tmp if found: # FIXME: when I have time, all candidate should be associated with # a priority. At the moment, fav_seps prefers favorites # over secondary candidates (i.e. candidates occuring multiple # times. EVIL! fav_seps = [" - ", " / "] sep = "" for i in fav_seps: if i in found: sep = i break if not sep: sep = found[0] closing_brace = "" for j in braces: if j[0] in sep: closing_brace = j[1] break for i in titles: buf = string.split(i, sep, 1) if closing_brace: lenbefore = len(buf[0] + buf[1]) buf[0] = string.replace(buf[0], closing_brace, "") buf[1] = string.replace(buf[1], closing_brace, "") lenafter = len(buf[0] + buf[1]) if lenafter != lenbefore - len(closing_brace): if verb: warning("brace" + `j` + " does not close exactly once.") err = 9 if cf['_various_swap']: buf = [buf[1], buf[0]] names.append(buf) else: err = 7 if verb: warning("could not separate artist and title in all TTITLEs. Try setting freedb_pedantic = 0 or use --no-various Maybe additional information is contained in the EXTT fields. check %s and use either --extt-is-artist or --extt-is-title." % cf['_freedb_form_file']) else: for i in range(tracks_on_cd): buf = freedb['TTITLE'+`i`] names.append(["", buf]) # append the EXTT fields to the track names if cf['_extt_is_comment']: for i in range(len(names[1:])): if freedb.has_key('EXTT'+`i`) and freedb['EXTT'+`i`]: names[i+1][1] = names[i+1][1] + " (%s)" % freedb['EXTT'+`i`] else: print "Warning: track %i (starting at 0) has no EXTT entry." % i locale_names = [] # clean up a bit and create names for the appropriate locale: # FIXME: this for loop doesn't actually change the variable names at all! for i in names: t = [] for j in [0, 1]: if i[j]: i[j] = string.strip(i[j]) while string.find(i[j], " ") != -1: i[j] = string.replace(i[j], " ", " ") while i[j][0] == '"' and i[j][-1] == '"': i[j] = i[j][1:-1] while i[j][0] == '"' and string.find(i[j][1:], '"') != -1: i[j] = string.replace(i[j][1:], '"', '', 1) x = i[j].encode(locale.getpreferredencoding(), "replace") t.append(x) locale_names.append(t) return err, names, locale_names, read_id, revision def choose_cat(cat = ["blues", "classical", "country", "data", "folk", "jazz", "misc", "newage", "reggae", "rock", "soundtrack"]): print "choose a category:" cat.sort() for i in range(1, len(cat)): print "%2d" % i + ".) " + cat[i] x = -1 while x < 0 or x > len(cat) - 1: if jack_progress.status_all.has_key('freedb_cat') and jack_progress.status_all['freedb_cat'][-1] in cat: input = raw_input(" 0.) none of the above (default='%s'): " % jack_progress.status_all['freedb_cat'][-1]) if not input: x = cat.index(jack_progress.status_all['freedb_cat'][-1]) continue else: input = raw_input(" 0.) none of the above: ") try: x = int(input) except ValueError: x = -1 # start the loop again if not x: print "ok, aborting." sys.exit(0) return cat[x] def do_freedb_submit(file, cd_id): import httplib hello = "hello=" + cf['_username'] + " " + cf['_hostname'] + " " + prog_name + " " + prog_version print "Info: querying categories..." url = "http://" + freedb_servers[cf['_freedb_server']]['host'] + "/~cddb/cddb.cgi?" + urllib.quote_plus("cmd=cddb lscat" + "&" + hello + "&proto=6", "=&") f = urllib2.urlopen(url) buf = f.readline() if buf[0:3] == "500": print "Info: LSCAT failed, using builtin categories..." cat = choose_cat() elif buf[0:3] == "210": cat = ["null", ] while 1: buf = f.readline() if not buf: break buf = string.rstrip(buf) if buf != ".": cat.append(buf) f.close() cat = choose_cat(cat) else: error("LSCAT failed: " + string.rstrip(buf) + f.read()) print "OK, using `" + cat + "'." email = freedb_servers[cf['_freedb_server']]['my_mail'] print "Your e-mail address is needed to send error messages to you." x = raw_input("enter your e-mail-address [" + email + "]: ") if x: email = x info("Submitting...") selector = '/~cddb/submit.cgi' proxy = "" if os.environ.has_key('http_proxy'): proxy = os.environ['http_proxy'] def splittype(url): import re _typeprog = re.compile('^([^/:]+):') match = _typeprog.match(url) if match: scheme = match.group(1) return scheme, url[len(scheme) + 1:] return None, url def splithost(url): import re _hostprog = re.compile('^//([^/]+)(.*)$') match = _hostprog.match(url) if match: return match.group(1, 2) return None, url type, proxy = splittype(proxy) host, selector2 = splithost(proxy) h = httplib.HTTP(host) h.putrequest('POST', 'http://' + freedb_servers[cf['_freedb_server']]['host'] + selector) else: h = httplib.HTTP(freedb_servers[cf['_freedb_server']]['host']) h.putrequest('POST', '/~cddb/submit.cgi') h.putheader('Category', cat) h.putheader('Discid', cd_id) h.putheader('User-Email', email) if cf['_debug']: debug("will submit in test-mode, changes are not applied and you'll get an email which contains the data you submitted.") h.putheader('Submit-Mode', 'test') else: h.putheader('Submit-Mode', 'submit') h.putheader('Charset', 'UTF-8') if cf['_debug']: h.putheader('X-Cddbd-Note', 'Submission will not be applied to database if --debug is on.') else: h.putheader('X-Cddbd-Note', 'data submitted with ' + prog_name + ' (http://jack.sf.net)') h.putheader('Content-Length', str(jack_utils.filesize(file))) h.endheaders() # The user just wrote the file with a text editor so we assume that it # is in their locale. f = codecs.open(file, "r", locale.getpreferredencoding()) try: text = f.read() except UnicodeDecodeError: print "The freedb file does not match your current locale. Please convert it" print "to " + locale.getpreferredencoding() + " manually." sys.exit(1) h.send(text.encode("utf-8")) f.close() print err, msg, headers = h.getreply() f = h.getfile() if proxy: if err != 200: error("proxy: " + `err` + " " + msg + f.read()) else: buf = f.readline() err, msg = buf[0:3], buf[4:] # lets see if it worked: if err == 404: print "This server doesn't seem to support database submission via http." print "consider submitting via mail (" + progname + " -m). full error:\n" print err, msg def do_freedb_mailsubmit(file, cd_id): warning("Support for freedb submission via e-mail may be dropped in future versions. Please begin to use HTTP to submit your entries (--submit)") sendmail = '/usr/lib/sendmail -t' #sendmail = 'cat > /tmp/jack.test.mailsubmit' cat = choose_cat() print "OK, using `" + cat + "'." if string.find(freedb_servers[cf['_freedb_server']]['my_mail'], "@") >= 1 and len(freedb_servers[cf['_freedb_server']]['my_mail']) > 3: return os.system("( echo 'To: " + freedb_servers[cf['_freedb_server']]['mail'] + "'; echo From: '" + freedb_servers[cf['_freedb_server']]['my_mail'] + "'; echo 'Subject: cddb " + cat + " " + cd_id + "' ; cat '" + file + "' ) | " + sendmail) else: print "please set your e-mail address. aborting..." def update_revision(file): "Update the revision (and submitted-via) information in a FreeDB template" re_revision = re.compile(r"^#\s*Revision:\s*(\d+)") re_agent = re.compile(r"^#\s*Submitted via:") tmp, tmpname = tempfile.mkstemp() freedb_file = open(file, "r") revision = 0 comments = 1 for line in freedb_file.readlines(): rev = re_revision.match(line) agent = re_agent.match(line) if rev: revision = int(rev.group(1)) + 1 os.write(tmp, "# Revision: %d\n" % revision) elif agent: os.write(tmp, "# Submitted via: " + prog_name + " " + prog_version + "\n") else: if not line.startswith("#"): # The 'Revisions' field is option but should be set when you # submit a new version. Therefore, after the comments check # whether we've seen a revision and if not write one. if comments: if revision == 0: revision += 1 os.write(tmp, "# Revision: %d\n" % revision) comments = 0 os.write(tmp, line) os.close(tmp) freedb_file.close() try: shutil.copyfile(tmpname, file) except IOError: print "Cannot copy updated template over existing one." try: os.unlink(tmpname) except IOError: print "Cannot remove temporary file %s." % tmpname jack-3.1.1+cvs20050801/jack_functions.py0000755000175000017500000004076310371403403015543 0ustar tbmtbm# -*- coding: iso-8859-15 -*- ### jack_functions: functions for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2003 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import codecs import traceback import sndhdr import types import string import sys import os import jack_TOCentry import jack_CDTime import jack_utils import jack_TOC import jack_mp3 import jack_helpers from jack_globals import * progress_changed = None def df(fs = ".", blocksize = 1024): "returns free space on a filesystem (in bytes)" try: from os import statvfs statvfs_found = 1 except: statvfs_found = 0 if statvfs_found: (f_bsize, f_frsize, f_blocks, f_bfree, f_bavail, f_files, f_ffree, f_favail, f_flag, f_namemax) = statvfs(fs) return long(f_bavail) * long(f_bsize) else: # Not very portable p = os.popen("df " + fs) s = string.split(string.rstrip(p.readline())) for i in range(len(s)): if s[i] == "Available": p.close() s = string.split(string.rstrip(p.readline())) return int(s[i]) * long(blocksize) - long(keep_free) def get_sysload_linux_proc(): "extract sysload from /proc/loadavg, linux only (?)" f = open("/proc/loadavg", "r") loadavg = float(string.split(f.readline())[0]) return loadavg def pprint_i(num, fmt = "%i%s", scale = 2.0**10, max = 4): "return a string describing an int in a more human-readable way" c = "" change = 0 for i in ("K", "M", "G", "T"): if abs(num) >= scale: c = i num = num / scale change = 1 if change: #num = num + 0.5 if num > 999: return fmt % (num, c) elif num >= 100: return string.replace(fmt, "%i", "%s") % (`num`[:3], c) else: return string.replace(fmt, "%i", "%s") % (`num`[:4], c) else: return fmt % (num, c) def pprint_speed(s, len=4): if len >= 4: if s < 10: return "%4.2f" % s if s < 100: return "%4.1f" % s if s < 1000: return "%4.0f" % s if s < 10000: return "%4d" % (s + 0.5) else: return "9999" elif len == 3: if s < 10: return "%3.1f" % s if s < 100: return "%3.0f" % s if s < 1000: return "%3d" % s + 0.5 else: return "999" else: return "X" * len def gettoc(toc_prog): "Returns track list" if jack_helpers.helpers[toc_prog].has_key('toc_cmd'): cmd = string.replace(jack_helpers.helpers[toc_prog]['toc_cmd'], "%d", cf['_cd_device']) if cf['_gen_device']: cmd = string.replace(cmd, "%D", cf['_gen_device']) p = os.popen(cmd) start = 0 erg = [] l = p.readline() exec(jack_helpers.helpers[toc_prog]['toc_fkt']) if p.close(): if cf['_cd_device']: try: f = open(cf['_cd_device'], "r") except IOError: info("could not open " + cf['_cd_device'] + ". Check permissions and that a disc is inserted.") else: info("maybe " + toc_prog + " is not installed?") else: info("try setting cf['_cd_device'] to your CD device, e.g. /dev/cdrom") error("could not read CD's TOC.") else: return erg else: erg = [] try: exec(jack_helpers.helpers[toc_prog]['toc_fkt']) except SystemExit: sys.exit(1) except: traceback.print_exc() error("""%s could not read the disk's TOC. If you already ripped the CD, you'll have to cd into the directory which is either named after the CD's title or still called jack-xxxxxxxx (xxxxxxxx is a hex number).""" % toc_prog) return erg def guesstoc(names): "Return track list based on guessed lengths" num = 1 start = 0 erg = [] progr = [] for i in names: i_name = os.path.basename(i)[:-4] i_ext = string.upper(os.path.basename(i)[-4:]) if i_ext == ".MP3": x = jack_mp3.mp3format(i) if not x: error("could not get MP3 info for file \"%x\"" % i) blocks = int(x['length'] * CDDA_BLOCKS_PER_SECOND + 0.5) # NUM, LEN, START, COPY, PRE, CH, RIP, RATE, # NAME erg.append([num, blocks, start, 0, 0, 2, 1, x['bitrate'], i_name]) progr.append([num, "dae", " * [ simulated ]"]) progr.append([num, "enc", `x['bitrate']`, "[ s i m u l a t e d %3ikbit]" % (x['bitrate'] + 0.5)]) if cf['_name'] % num != i_name: progr.append([num, "ren", cf['_name'] % num + "-->" + i_name]) elif i_ext == ".WAV": x = sndhdr.whathdr(i) if not x: error("this is not WAV-format: " + i) if x != ('wav', 44100, 2, -1, 16): error("unsupportet format " + `x` + " in " + i) blocks = jack_utils.filesize(i) blocks = blocks - 44 # substract WAV header extra_bytes = blocks % CDDA_BLOCKSIZE if not extra_bytes == 0: warning("this is not CDDA block-aligned: " + `i`) yes = raw_input("May I strip %d bytes (= %.4fseconds) off the end? " % (extra_bytes, extra_bytes / 2352.0 / 75.0)) if not string.upper((yes + "x")[0]) == "Y": print "Sorry, I can't process non-aligned files (yet). Bye!" sys.exit() f = open(i, "r+") f.seek(-extra_bytes, 2) f.truncate() f.close() blocks = blocks - extra_bytes blocks = blocks / CDDA_BLOCKSIZE erg.append([num, blocks, start, 0, 0, 2, 1, cf['_bitrate'], i_name]) progr.append([num, "dae", " =p [ s i m u l a t e d ]"]) if cf['_name'] % num != i_name: progr.append([num, "ren", cf['_name'] % num + "-->" + i_name]) elif i_ext == ".OGG": error("you still have to wait for ogg support for this operation, sorry.") elif i_ext == ".FLAC": error("you still have to wait for FLAC support for this ooperation, sorry.") else: error("this is neither .mp3 nor .ogg nor .wav nor .flac: %s" % i) num = num + 1 start = start + blocks for i in progr: # this is deferred so that it is only written if no # files fail progress(i) return erg #XXX will be moved to jack_convert def timestrtoblocks(str): "convert mm:ss:ff to blocks" str = string.split(str, ":") blocks = int(str[2]) blocks = blocks + int(str[1]) * CDDA_BLOCKS_PER_SECOND blocks = blocks + int(str[0]) * 60 * CDDA_BLOCKS_PER_SECOND return blocks B_MM, B_SS, B_FF = 0, 1, 2 def blockstomsf(blocks): from jack_globals import CDDA_BLOCKS_PER_SECOND "convert blocks to mm, ss, ff" mm = blocks / 60 / CDDA_BLOCKS_PER_SECOND blocks = blocks - mm * 60 * CDDA_BLOCKS_PER_SECOND ss = blocks / CDDA_BLOCKS_PER_SECOND ff = blocks % CDDA_BLOCKS_PER_SECOND return mm, ss, ff, blocks def starts_with(str, with): "checks whether str starts with with" return str[0:len(with)] == with ## #XXX the following will be used if all references to it have been updated. ## meanwhile the wrapper below is used. def real_cdrdao_gettoc(tocfile): # get toc from cdrdao-style toc-file "returns TOC object, needs name of toc-file to read" toc = jack_TOC.TOC() f = open(tocfile, "r") tocpath, tocfiledummy = os.path.split(tocfile) # a virtual track 0 is introduced which gets all of track 1s pregap. # it is removed later if it is too small to contain anything interesting. actual_track = jack_TOCentry.TOCentry() actual_track.number = 0 actual_track.type = "audio" actual_track.channels = 2 actual_track.media = "image" actual_track.start = 0 actual_track.length = 0 actual_track.rip = 1 actual_track.bitrate = cf['_bitrate'] actual_track.image_name = "" actual_track.rip_name = cf['_name'] % 0 ## tocfile data is read in line by line. num = 0 while 1: line = f.readline() if not line: if actual_track.channels not in [1,2,4]: debug("track %02d: unknown number of channels, assuming 2" % num) actual_track.channels = 2 toc.append(actual_track) break line = string.strip(line) ## everytime we encounter "TRACK" we increment num and append the actual ## track to the toc. if starts_with(line, "TRACK "): num = num + 1 new_track = jack_TOCentry.TOCentry() new_track.number = num if actual_track: if actual_track.channels not in [1,2,4]: debug("track %02d: unknown number of channels, assuming 2" % num) actual_track.channels = 2 toc.append(actual_track) actual_track = new_track actual_track.rip = 1 actual_track.bitrate = cf['_bitrate'] actual_track.start = toc.end_pos if line == "TRACK AUDIO": actual_track.type = "audio" else: actual_track.type = "other" # we don't care actual_track.channels = 0 actual_track.rip = 0 actual_track.bitrate = 0 ## check the various track flags. ## FOUR_CHANNEL_AUDIO is not supported. ## we have to check for this before ripping. later. much later. elif line == "NO COPY": actual_track.copy = 0 elif line == "COPY": actual_track.copy = 1 elif line == "NO PRE_EMPHASIS": actual_track.preemphasis = 0 elif line == "PRE_EMPHASIS": actual_track.preemphasis = 1 elif line == "TWO_CHANNEL_AUDIO": actual_track.channels = 2 elif line == "FOUR_CHANNEL_AUDIO": actual_track.channels = 4 ## example: FILE "data.wav" 08:54:22 04:45:53 elif starts_with(line, "FILE "): filename = line[string.find(line, "\"") + 1:string.rfind(line, "\"")] offsets = string.strip(line[string.rfind(line, "\"") + 1:]) start, length = string.split(offsets)[:2] ## convert time string to blocks(int), update info. actual_track.length = jack_CDTime.CDTime(length).blocks actual_track.image_name = os.path.join(tocpath, filename) actual_track.rip_name = cf['_name'] % num ## example: START 00:01:53. This means the actual track starts 1:53s _after_ ## the start given by the FILE statement. This so-called pregap needs to be ## added to the length of the previous track, added to the start of the ## actual track and subtracted from its length. This is done automagically ## by setting the pregap attribute. elif starts_with(line, "START "): actual_track.pregap = jack_CDTime.CDTime(string.split(line)[1]).blocks f.close() return toc def cdrdao_gettoc(tocfile): # get toc from cdrdao-style toc-file "just a wrapper for real_cdrdao_gettoc." toc = real_cdrdao_gettoc(tocfile) tracks = toc.export() track1_pregap = tracks[0][1] use_filename = toc.image_file # note: toc.image_file is None if different files are specified return tracks[1:], use_filename, track1_pregap ##XXX this will be moved to jack_convert def msftostr(msf): "convert msf format to readable string" return "%02i" % msf[B_MM]+":"+"%02i" % msf[B_SS]+":"+"%02i" % msf[B_FF] def cdrdao_puttoc(tocfile, tracks, cd_id): # put toc to cdrdao toc-file "writes toc-file from tracks" f = open(tocfile, "w") f.write("CD_DA\n\n") f.write("// DB-ID=" + cd_id + "\n\n") for i in tracks: f.write("// Track " + `i[NUM]` + "\n") # comments are cool if i[CH] in (2, 4): f.write("TRACK AUDIO\n") if i[CH] == 0: f.write("TRACK MODE1\n") if i[COPY]: f.write("COPY\n") else: f.write("NO COPY\n") if i[PRE]: f.write("PRE_EMPHASIS\n") else: f.write("NO PRE_EMPHASIS\n") if i[CH] == 2: f.write("TWO_CHANNEL_AUDIO\n") elif i[CH] == 4: f.write("FOUR_CHANNEL_AUDIO\n") elif i[CH] == 0: f.write("// not supported by jack!\n") else: error("illegal TOC: channels=%i, aborting." % i[CH]) f.write('FILE "' + i[NAME] + '.wav" 0 ') x = i[LEN] if i[NUM] == 1: # add pregap to track, virtually x = x + i[START] x = blockstomsf(x) f.write("%02i" % x[B_MM] + ":" + "%02i" % x[B_SS] + ":" + "%02i" % x[B_FF] + "\n") if i[NUM]==1 and i[START] != 0: f.write("START "+msftostr(blockstomsf(i[START]))+"\n") f.write("\n") def tracksize(list, dont_dae = [], blocksize = 1024): "Calculates all kind of sizes for a track or a list of tracks." if list and type(list[0]) == types.IntType: list = ((list, )) peak, at, blocks = 0, 0, 0 encoded_size = wavsize = cdrsize = 0 for track in list: blocks = blocks + track[LEN] encoded_size = encoded_size + track[LEN] / CDDA_BLOCKS_PER_SECOND * track[RATE] * 1000 / 8 # files can be a bit shorter, if someone knows a better way of guessing # filesizes, please let me know. count_thiswav = 1 for i in dont_dae: if i[NUM] == track[NUM]: count_thiwav = 0 thiscdrsize = track[LEN] * CDDA_BLOCKSIZE * count_thiswav wavsize = wavsize + thiscdrsize + 44 cdrsize = cdrsize + thiscdrsize now = encoded_size + thiscdrsize + 44 if now>peak: at = track[NUM] peak = now return encoded_size, wavsize, encoded_size + wavsize, peak, at, cdrsize, blocks def progress(track, what="error", data="error", data2 = None): "append a line to the progress file" global progress_changed if type(track) in (types.TupleType, types.ListType): if len(track) == 3: track, what, data = track elif len(track) == 4: track, what, data, data2 = track else: error("illegal progress entry:" + `track` + " (" + `type(track)` + ")") if type(track) == types.IntType: first = "%02i" % track elif type(track) == types.StringType: first = track else: error("illegal progress entry:" + `track` + " (" + `type(track)` + ")") progress_changed = 1 f = codecs.open (cf['_progress_file'], "a", "utf-8") f.write(first + cf['_progr_sep'] + what + cf['_progr_sep'] + data) if data2: f.write(cf['_progr_sep'] + data2) f.write("\n") f.close() def check_genre_txt(genre): if isinstance(genre, int): if genre in range(0,256): return genre else: return None elif isinstance(genre, str): if string.upper(genre) == "HELP": info("available genres: " + string.join([x for x in eyeD3.genres if x != 'Unknown'], ", ")) sys.exit(0) elif string.upper(genre) == "NONE": return 255 # set genre to [unknown] else: try: genre = int(genre) genre = check_genre_txt(genre) if isinstance(genre, int): return genre except: for i in range(len(id3genres)): if genre.upper() == id3genres[i].upper(): return i import jack_version error("illegal genre. Try '" + jack_version.prog_name + " --id3-genre help' for a list.") jack-3.1.1+cvs20050801/jack_generic.py0000644000175000017500000000342710371403403015140 0ustar tbmtbm### jack_generic: generic functions used (here) for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import string import sys import os import jack_version from jack_config import cf def indent(pre, msg): print pre, msg = string.split(msg) p = len(pre) y = p for i in msg: if len(i) + y > 78: print print " " * p, y = p print i, y = y + len(i) + 1 print def ewprint(pre, msg): pre = " *" + pre + "*" indent(pre, msg) def error(msg): import jack_term import sys jack_term.disable() ewprint("error", msg) sys.exit(1) def warning(msg): ewprint("warning", msg) def info(msg): ewprint("info", msg) def debug(msg): if cf['_debug']: ewprint("debug", msg) if cf['_debug_write']: tmp = open(jack_version.prog_name + ".debug", "a") tmp.write(msg + "\n") del tmp def expand(filespec): return(os.path.expanduser(os.path.expandvars(filespec))) jack-3.1.1+cvs20050801/jack_globals.py0000644000175000017500000000270610371403403015146 0ustar tbmtbm# -*- coding: iso-8859-15 -*- ### jack_globals: Global storage space for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2003 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from jack_constants import * from jack_config import cf from jack_init import eyeD3 from jack_generic import info, warning, debug, error, expand #import jack_generic #error = jack_generic.error dummy=""" def error(x): jack_generic.error(x) def debug(x): jack_generic.debug(x) def info(x): jack_generic.info(x) def debug(x): jack_generic.warning(x) """ # globals revision = 0 # initial revision of freedb data is_submittable = 0 # well-formed freedb-file? id3genres = eyeD3.genres jack-3.1.1+cvs20050801/jack_helpers.py0000644000175000017500000004074210371403403015167 0ustar tbmtbm# -*- coding: iso-8859-15 -*- ### jack_helpers: helper applications for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import string import re import jack_plugins from jack_globals import * helpers = { 'builtin': { 'type': "dummy", 'status_blocksize': 160 }, 'oggenc': { # based on a patch kindly provided by Bryan Larsen. 'type': "encoder", 'target': "ogg", 'can_tag': 1, 'vbr-cmd': "oggenc -o %o -t %t -a %a -N %n -l %l -G %g -d %y -q %q %i", 'cmd': "oggenc -o %o -t %t -a %a -N %n -l %l -G %g -d %y -b %r %i", 'tags': { 'ogg': { 'track': "-t %s", 'artist': "-a %s", 'number': "-N %s", 'album': "-l %s", 'genre': "-G %s", 'date': "-d %s", }, }, 'status_blocksize': 64, 'bitrate_factor': 1, 'status_start': "%", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len(s) >= 2: s = s[-2] if len(s) == 1: s = s[0] y0 = string.find(s, "[") y1 = string.find(s, "%]") if y0 != -1 and y1 != -1: try: percent = float(s[y0 + 1:y1]) except ValueError: percent = 0 else: percent = 0 """, }, 'mp3enc': { 'type': "encoder", 'target': "mp3", 'cmd': "mp3enc -v -qual 9 -br %r -if %i -of %o", 'otf-cmd': "mp3enc -v -qual 9 -br %r -sti -be -of %o", 'status_blocksize': 99, 'bitrate_factor': 1000, 'status_start': "%", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len(s) >= 4: s = s[-2] if string.find(s, "%") >= 0: y = string.split(s, " ", 3) percent = float(y[0]) / (i['track'][LEN] * CDDA_BLOCKSIZE / 2) * 100.0 else: percent = 0 """, }, 'l3enc': { 'type': "encoder", 'target': "mp3", 'cmd': "l3enc -hq -br %r %i %o", 'status_blocksize': 99, 'bitrate_factor': 1000, 'status_start': "%", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len(s) >= 2: s = s[-2] if len(s) == 1: s = s[0] if string.find(s, "%") >= 0: y = string.split(s, " / ") y0 = string.split(y[0])[-1] y1 = string.split(y[1])[0] percent=float(y0) / float(y1) * 100.0 else: percent = 0 """, }, 'lame': { 'type': "encoder", 'target': "mp3", 'inverse-quality': 1, 'cmd': "lame --preset cbr %r --strictly-enforce-ISO %i %o", 'vbr-cmd': "lame --preset standard --vbr-new --nohist --strictly-enforce-ISO %i %o", 'otf-cmd': "lame --preset cbr %r --strictly-enforce-ISO - %o", 'vbr-otf-cmd': "lame --preset standard --vbr-new --nohist --strictly-enforce-ISO - %o", 'status_blocksize': 160, 'bitrate_factor': 1, 'status_start': "%", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len(s) >= 2: s=s[-2] if len(s) == 1: s=s[0] if string.find(s, "%") >= 0: # status reporting starts here y = string.split(s, "/") y1 = string.split(y[1], "(")[0] percent = float(y[0]) / float(y1) * 100.0 elif string.find(s, "Frame:") >= 0: # older versions, like 3.13 y = string.split(s, "/") y0 = string.split(y[0], "[")[-1] y1 = string.split(y[1], "]")[0] percent = float(y0) / float(y1) * 100.0 else: percent = 0 """, }, 'gogo': { # Thanks to José Antonio Pérez Sánchez for the vbr and otf presets 'type': "encoder", 'target': "mp3", 'inverse-quality': 1, 'cmd': "gogo %i %o -b %r", 'vbr-cmd': "gogo %i %o -v %q", 'otf-cmd': "gogo stdin %o -b %r", 'vbr-otf-cmd': "gogo stdin %o -v 4", 'status_blocksize': 160, 'bitrate_factor': 1, 'status_start': "%", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len(s) >= 2: s=s[-2] if len(s) == 1: s=s[0] if string.find(s, "%") >= 0: # status reporting starts here s = replace(s, "\000", " ") y = string.split(s, "/") y0 = string.split(y[0], "{")[-1] y1 = string.split(y[1], "}")[0] percent = float(y0) / float(y1) * 100.0 else: percent = 0 """, }, 'bladeenc': { 'type': "encoder", 'target': "mp3", 'cmd': "bladeenc %i %o -br %r", 'status_blocksize': 180, 'bitrate_factor': 1000, 'status_start': "%", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len(s) >= 2: s=s[-2] if string.find(s, "Status:") != -1: y = string.split(s[8:]) percent = float(string.split(y[0], '%')[0]) else: percent = 0 """, }, # xing definitions kindly provided by Sebastian Weber 'xing': { 'type': "encoder", 'target': "mp3", 'cmd': "xingmp3enc -B %r %i %o", 'vbr-cmd': "xingmp3enc -V 100 %i %o", 'otf-cmd': "xingmp3enc -b %r -- %o", 'vbr-otf-cmd': "xingmp3enc -V 100 -- %o", 'status_blocksize': 160, 'bitrate_factor': 1, 'status_start': "%", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len(s) >= 2: s = s[-2] if string.find(s, "ETA:") != -1: y = string.strip(string.split(s, '%')[0]) if len(y) == 0: percent = 0 else: percent = float(y) else: percent = 0 """, }, 'flac': { 'type': "encoder", 'target': "flac", 'vbr-cmd': "flac -o %o %i", 'vbr-otf-cmd': "flac -fr -fb -fc 2 -fp 16 -fs 44100 -o %o", 'status_blocksize': 160, 'status_start': "%", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len (s) >= 2: s = s[-2] if len (s) == 1: s = s[0] y0 = string.rfind(s, ": ") y1 = string.find (s, "%", y0) if y0 != -1 and y1 != -1: try: percent = float(s[y0 + 1:y1]) except ValueError: percent = 0 else: percent = 0 """, }, 'mppenc': { 'type': "encoder", 'target': "mpc", 'can_tag': 0, 'vbr-cmd': "mppenc --standard %i %o", #'vbr-otf-cmd': "mppenc --standard - %o", # doesn't work, needs WAVE 'status_blocksize': 160, 'status_start': "-.-", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len(s) >= 3: s = s[-3] s = string.split(string.strip(s)) if len(s) >= 3 and s[2] == "kbps" and s[0] != "-.-": percent = float(s[0]) else: percent = 0 """, }, 'cdparanoia': { 'filters': [[r'\n', r'\r'], [r'(\r)+', r'\r'], [r'(Done\.\r)+', r'Done.\r']], 'type': "ripper", 'cmd': "cdparanoia --abort-on-skip -d %d %n %o", 'otf-cmd': "cdparanoia --abort-on-skip -e -d %d %n -R -", 'status_blocksize': 500, 'status_start': "%", 'status_fkt': r""" # (== PROGRESS == [ | 013124 00 ] == :^D * ==) # (== PROGRESS == [ > .| 011923 00 ] == :-) . ==) tmp = string.split(i['buf'], "\r") if len(tmp) >= 2: tmp = tmp[-2] + " " new_status = tmp[17:48] + tmp[49:69] # 68->69 because of newer version else: new_status = "Cannot parse status" """, 'otf-status_fkt': r""" buf = i['buf'] tmp = string.split(buf, "\n") new_status = "" if len(tmp) >= 2: tmp = string.split(tmp[-2], " @ ") if tmp[0] == "##: -2 [wrote]": percent = (float(tmp[1]) - (i['track'][START] * CDDA_BLOCKSIZE / 2.0)) / (i['track'][LEN] * CDDA_BLOCKSIZE / 2.0) * 100.0 new_status = "[otf - reading, %2i%%]" % percent """, 'final_status_fkt': r""" last_status="0123456789012345 [ -- error decoding status -- ]" # fallback if 0 and cf['_debug']: # disabled for now import jack_version tmpf=open("%s.debug.%02d.txt" % (jack_version.prog_name, exited_proc['track'][NUM]), "w") tmpf.write(exited_proc['buf']) del tmpf tmps = string.split(exited_proc['buf'], '\r') tmps.reverse() for tmp in tmps: if string.find(tmp, "PROGRESS") != -1: last_status = tmp break final_status = ("%sx" % jack_functions.pprint_speed(speed)) + last_status[16:48] + "]" """, 'otf-final_status_fkt': r""" final_status = "[otf - done]" """, #'toc': 1, # we can't generate correct freedb IDs with cdparanoia. 'toc_cmd': "cdparanoia -d %d -Q 2>&1", 'toc_fkt': r""" while l: l = string.rstrip(l) if l and l[0:5] == "TOTAL": start = 0 if l and l == '=' * (len(l)): start = 1 elif l and start: l = string.split(l, '.', 1) num = int(l[0]) l = string.split(l[1]) erg.append([num, int(l[0]), int(l[2]), l[4] == 'OK', l[5] == 'yes', int(l[6]), 1, cf['_bitrate'], cf['_name'] % num]) l = p.readline() """, }, 'cdda2wav': { 'type': "ripper", 'cmd': "cdda2wav --no-infofile -H -v 1 -D %d -O wav -t %n %o", 'status_blocksize': 200, 'status_start': "percent_done:", 'status_fkt': r""" tmp = string.split(i['buf'], "\r") if len(tmp) >= 2: if string.find(tmp[-2], '%') != -1: new_status = "ripping: " + string.strip(tmp[-2]) else: new_status = "waiting..." else: new_status = "Cannot parse status" """, 'final_status_fkt': r""" final_status = ("%s" % jack_functions.pprint_speed(speed)) + "x [ DAE done with cdda2wav ]" """, 'toc': 1, 'toc_cmd': "cdda2wav --no-infofile -D %d -J -v toc --gui 2>&1", 'toc_fkt': r""" while 1: l = p.readline() if not l: break if l[0] == "T" and l[1] in string.digits and l[2] in string.digits and l[3] == ":": num, start, length, type, pre, copy, ch, dummy = string.split(l)[:8] if type == "audio": num = int(num[1:3]) start = int(start) length = string.replace(length,".", ":") length = timestrtoblocks(length) pre = pre == "pre-emphasized" copy = copy != "copydenied" ch = [ "none", "mono", "stereo", "three", "quad" ].index(ch) erg.append([num, length, start, copy, pre, ch, 1, cf['_bitrate'], cf['_name'] % (num + 1)]) """, 'toc_cmd_old': "cdda2wav --no-infofile -D %D -J -v 35 2>&1", 'toc_fkt_old': r""" new_c2w = 0 new_toc1 = 0 new_toc2 = 0 new_lengths = [] new_starts = [] while 1: l = p.readline() if not l: break l = string.strip(l) # new cdda2wav if starts_with(l, "Table of Contents: total tracks"): new_toc1 = 1 continue if starts_with(l, "Table of Contents: starting sectors"): new_toc2 = 1 new_toc1 = 0 new_c2w = 1 continue if new_toc2 and l and l[0] in string.digits: l = string.split(l, "(")[1:] for i in l: x = string.split(i, ")")[0] x = string.strip(x) try: new_starts.append(int(x)) except: pass continue if new_toc1 and l and l[0] in string.digits: l = string.split(l, "(")[1:] for i in l: if string.find(i, ":") >= 0: x = string.split(i, ")")[0] x = replace(x, ".", ":") new_lengths.append(timestrtoblocks(x)) continue # old cdda2wav if l and l[0:11] == "Album title": start = 1 elif l and start: l = string.split(l) if l[0] == "Leadout:": start = 0 else: num = int(l[0][1:3]) if l[6] == "stereo": channels = 2 elif l[6] == "mono": channels = 1 else: channels = 0 t_start = int(l[1]) msf = string.split(l[2], ":") sf = string.split(msf[1], ".") t_length = int(sf[1]) + int(sf[0]) * 75 + int(msf[0]) * 60 * 75 erg.append([num, t_length, t_start, l[5] == "copyallowed", l[4] != "linear", channels, 1, cf['_bitrate'], cf['_name'] % num]) if new_c2w and len(new_lengths) == len(new_starts) - 1: for i in range(min(len(new_lengths), len(new_starts))): # this provokes an error if the lists are of different length erg.append([i + 1, new_lengths[i], new_starts[i], 0, 0, 2, 1, cf['_bitrate'], cf['_name'] % (i + 1)]) """, }, 'dagrab': { 'type': "ripper", 'cmd': "dagrab -d %d -f %o %n", 'status_blocksize': 100, 'status_start': "total:", 'status_fkt': r""" tmp = string.split(i['buf'], "\r") if len(tmp) >= 2: if string.find(tmp[-2], 'total:') != -1: new_status = string.strip(tmp[-2]) else: new_status = "waiting..." else: new_status = "Cannot parse status" """, 'final_status_fkt': r""" final_status = ("%s" % jack_functions.pprint_speed(speed)) + "x [ DAE done with dagrab ]" """, 'toc': 1, 'toc_cmd': "dagrab -d %d -i 2>&1", 'toc_fkt': r""" while l: l = string.strip(l) if l and l[0:5] == "track": start = 1 elif l and start: l = string.split(l) if l[3] == "leadout": start = 0 else: num = int(l[0]) channels = 2 copy = 0 pre = 0 t_start = int(l[1]) - 150 t_length = int(l[2]) erg.append([num, t_length, t_start, copy, pre, channels, 1, cf['_bitrate'], cf['_name'] % num]) l = p.readline() """, }, 'tosha': { 'type': "ripper", 'cmd': "tosha -d %d -f wav -t %n -o %o", 'status_blocksize': 100, 'status_start': "total:", 'status_fkt': r""" x = string.split(i['buf'], '\r')[-2] if string.find(x, 'total:') != -1: new_status = string.strip(string.split(i['buf'], '\r')[-2]) else: new_status = "waiting..." """, 'final_status_fkt': r""" final_status = ("%s" % jack_functions.pprint_speed(speed)) + "x [ DAE done with tosha ]" """, 'toc': 1, 'toc_cmd': "tosha -d %d -iq 2>&1", 'toc_fkt': r""" while l: l = string.rstrip(l) if l: l = string.split(l) num = int(l[0]) erg.append([num, 1 + int(l[3]) - int(l[2]), int(l[2]), 0, 0, 2, 1, cf['_bitrate'], cf['_name'] % num]) l = p.readline() """, }, 'CDDB.py': { 'type': "toc-reader", 'toc': 1, 'toc_fkt': r""" import cdrom if not os.path.exists(cf['_cd_device']): error("Device %s does not exist!" % cf['_cd_device']) if not os.access(cf['_cd_device'], os.R_OK): error("You don't have permission to access device %s!" % cf['_cd_device']) try: device = cdrom.open(cf['_cd_device']) (first, last) = cdrom.toc_header(device) except cdrom.error, m: error("Access of CD device %s resulted in error: %s" % (cf['_cd_device'], m[1])) toc = [] for i in range(first, last + 1): (min, sec, frame) = cdrom.toc_entry(device, i) toc.append(min * 60 * 75 + sec * 75 + frame) (min, sec, frame) = cdrom.leadout(device) device.close() toc.append(min * 60 * 75 + sec * 75 + frame) for i in range(first, last + 1): erg.append([i, toc[i - first + 1] - toc[i - first], toc[i - first] - toc[0], 0, 0, 2, 1, cf['_bitrate'], cf['_name'] % i]) """, } } helpers['lame-user'] = helpers['lame'].copy() helpers['lame-user'].update({'cmd': "lame --preset cbr %r --strictly-enforce-ISO %i %o", 'vbr-cmd': "lame -V %q --vbr-new --nohist --strictly-enforce-ISO %i %o", 'otf-cmd': "lame --preset cbr %r --strictly-enforce-ISO - %o", 'vbr-otf-cmd': "lame -V %q --vbr-new --nohist --strictly-enforce-ISO - %o", }) def init(): # import plugin jack_plugins.import_helpers() # compile exec strings for h in helpers.keys(): for i in helpers[h].keys(): if i[-4:] == "_fkt": helpers[h][i] = compile(helpers[h][i], '', 'exec') # compile filters for h in helpers.keys(): if helpers[h].has_key('filters'): newf = [] for i in helpers[h]['filters']: newf.append([re.compile(i[0]), i[1]]) helpers[h]['filters'] = newf jack-3.1.1+cvs20050801/jack_init.py0000644000175000017500000000377010371403403014470 0ustar tbmtbm### jack_init sanity check and initialization of various modules for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 2002-2003 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import string import sys import os from jack_globals import * from jack_generic import * try: from fcntl import F_SETFL except: from FCNTL import F_SETFL try: from os import O_NONBLOCK except: from FCNTL import O_NONBLOCK try: from eyeD3 import eyeD3 except: print "Please install the eyeD3 module available from http://eyed3.nicfit.net/" sys.exit(1) try: import cdrom except: print "Please install the CDDB module available at http://cddb-py.sourceforge.net" print "Without it, you'll not be able to rip from CDs." # want to see my favorite ugly hack of the day? class dummy_cdrom: def __init__(self): pass def open(self, dummy=None): print "Cannot access cdrom device while the CDDB module is not installed. See above." sys.exit(1) cdrom = dummy_cdrom() try: import ogg.vorbis except: class dummy_ogg: def __init__(self): warning("ogg module not installed, ogg support disabled") ogg = dummy_ogg() try: import flac.metadata except ImportError: flac = None jack-3.1.1+cvs20050801/jack_m3u.py0000644000175000017500000000246310371403403014227 0ustar tbmtbm### jack_m3u: generate a m3u playlist - a module for ### jack - tag audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2003 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from jack_globals import * m3u = None wavm3u = None def init(): global m3u, wavm3u m3u = [] wavm3u = [] def add(file): m3u.append(file) def add_wav(file): wavm3u.append(file) # fixeme - not written to a file yet def write(file="jack.m3u"): if m3u and cf['_write_m3u']: f = open(file, "w") for i in m3u: f.write(i) f.write("\n") f.close() jack-3.1.1+cvs20050801/jack_main_loop.py0000755000175000017500000006074610371403403015513 0ustar tbmtbm# -*- coding: iso-8859-15 -*- ### jack_main_loop: the main encoding loop for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import string import signal import select import time import sys import os import jack_functions import jack_ripstuff import jack_encstuff import jack_children import jack_display import jack_helpers import jack_targets import jack_workers import jack_status import jack_utils import jack_misc import jack_term from jack_globals import * def main_loop(mp3s_todo, wavs_todo, space, dae_queue, enc_queue, track1_offset): global_error = 0 # remember if something went wrong actual_load = -2 # this is always smaller than max_load waiting_load = 0 # are we waiting for the load to drop? waiting_space = 0 # are we waiting for disk space to be freed? space_waiting = 0 # how much space _running_ subprocesses will consume space_adjust = 0 # by how much space has been modified blocked = 0 # we _try_ do detect deadlocks cycles = 0 # it's sort of a timer last_update = 0 # screen updates are done once per second pause = 0 # no new encoders are started if pause==1 flags = "[ ]" # runtime controllable flags enc_running = 0 # what is going on? dae_running = 0 # what is going on? rotate="/-\\|" rotate_ball=" .o0O0o." rot_cycle = len(rotate) rot_ball_cycle = len(rotate_ball) rot_count = 0 global_done = 0 first_encoder = 1 ext = jack_targets.targets[jack_helpers.helpers[cf['_encoder']]['target']]['file_extension'] global_blocks = jack_functions.tracksize(wavs_todo)[BLOCKS] + jack_functions.tracksize(mp3s_todo)[BLOCKS] ##################### ### MAIN LOOP ### ##################### global_start = time.time() while mp3s_todo or enc_queue or dae_queue or enc_running or dae_running: # feed in the WAVs which have been there from the start if mp3s_todo and jack_functions.tracksize(mp3s_todo[0])[ENC] < space: waiting_space = 0 enc_queue.append(mp3s_todo[0]) space = space - jack_functions.tracksize(mp3s_todo[0])[ENC] jack_status.enc_stat_upd(mp3s_todo[0][NUM], "waiting for encoder.") mp3s_todo = mp3s_todo[1:] # start new DAE subprocess elif (len(enc_queue) + enc_running) < (cf['_read_ahead'] + cf['_encoders']) and dae_queue and dae_running < cf['_rippers'] and ((jack_functions.tracksize(dae_queue[0])[BOTH] < space) or (cf['_only_dae'] and jack_functions.tracksize(dae_queue[0])[WAV] < space) or (cf['_otf'] and jack_functions.tracksize(dae_queue[0])[ENC] < space)): waiting_space = 0 this_is_ok = 1 if pause: this_is_ok = 0 jack_status.dae_stat_upd(dae_queue[0][NUM], "Paused. Press 'c' to continue.") elif cf['_rip_from_device']: all_tracks_on_cd = jack_functions.gettoc(cf['_toc_prog']) if not jack_utils.cmp_toc_cd(jack_ripstuff.all_tracks_orig, all_tracks_on_cd, what=(NUM, LEN)): while dae_queue: track = dae_queue[0] dae_queue = dae_queue[1:] jack_status.dae_stat_upd(track[NUM], "Wrong disc - aborting this track") global_error = global_error + 1 this_is_ok = 0 if this_is_ok: if cf['_only_dae']: space_waiting = space_waiting + jack_functions.tracksize(dae_queue[0])[WAV] space = space - jack_functions.tracksize(dae_queue[0])[WAV] elif cf['_otf']: space_waiting = space_waiting + jack_functions.tracksize(dae_queue[0])[ENC] space = space - jack_functions.tracksize(dae_queue[0])[ENC] else: space_waiting = space_waiting + jack_functions.tracksize(dae_queue[0])[BOTH] space = space - jack_functions.tracksize(dae_queue[0])[BOTH] dae_running = dae_running + 1 track = dae_queue[0] dae_queue = dae_queue[1:] if cf['_otf']: # note: image_reader can't do otf at the moment. jack_status.dae_stat_upd(track[NUM], ":DAE: waiting for status report...") if cf['_encoder'] in ("lame", "gogo", "flac", "mppenc"): jack_status.enc_stat_upd(track[NUM], "[no otf status for %s]" % cf['_encoder']) else: jack_status.enc_stat_upd(track[NUM], "waiting for encoder.") enc_running = enc_running + 1 if first_encoder: first_encoder = 0 global_start = time.time() data = jack_workers.start_new_otf(track, cf['_ripper'], cf['_encoder']) jack_children.children.append(data['rip']) jack_children.children.append(data['enc']) else: if jack_status.enc_status[track[NUM]]: jack_status.enc_cache[track[NUM]] = jack_status.enc_status[track[NUM]] jack_status.enc_stat_upd(track[NUM], "[...]") jack_status.dae_stat_upd(track[NUM], ":DAE: waiting for status report...") if cf['_rip_from_device']: jack_children.children.append(jack_workers.start_new_ripper(track, cf['_ripper'])) elif cf['_image_file']: jack_children.children.append(jack_workers.ripread(track, track1_offset)) else: jack_status.dae_stat_upd(track[NUM], ":?AE: don't know how to rip this!") # start new encoder subprocess if enc_queue and enc_running < cf['_encoders']: if jack_functions.tracksize(enc_queue[0])[ENC] <= space + space_waiting: waiting_space = 0 actual_load = jack_misc.loadavg() if actual_load < cf['_max_load']: waiting_load = 0 enc_running = enc_running + 1 track = enc_queue[0] enc_queue = enc_queue[1:] jack_status.enc_stat_upd(track[NUM], "waiting for encoder...") jack_children.children.append(jack_workers.start_new_encoder(track, cf['_encoder'])) if first_encoder: first_encoder = 0 global_start = time.time() else: waiting_load = 1 # check for subprocess output readfd=[sys.stdin.fileno()] for i in jack_children.children: readfd.append(i['fd']) try: rfd, wfd, xfd = select.select(readfd, [], [], cf['_update_interval']) except: rfd, wfd, xfd = [], [], [] jack_term.tmod.sig_winch_handler(None, None) # check for keyboard commands if sys.stdin.fileno() in rfd: last_update = last_update - cf['_update_interval'] cmd = jack_term.tmod.getkey() sys.stdin.flush() if string.upper(cmd) == "Q": jack_display.exit() elif not pause and string.upper(cmd) == "P": pause = 1 flags = flags[:1] + "P" + flags[2:] elif string.upper(cmd) == "C" or pause and string.upper(cmd) == "P": pause = 0 flags = flags[:1] + " " + flags[2:] elif not flags[3] == "e" and string.upper(cmd) == "E": for i in jack_children.children: if i['type'] == "encoder": os.kill(i['pid'], signal.SIGSTOP) flags = flags[:3] + "e" + flags[4:] elif flags[3] == "e" and string.upper(cmd) == "E": for i in jack_children.children: if i['type'] == "encoder": os.kill(i['pid'], signal.SIGCONT) flags = flags[:3] + " " + flags[4:] elif not flags[2] == "r" and string.upper(cmd) == "R": for i in jack_children.children: if i['type'] == "ripper": os.kill(i['pid'], signal.SIGSTOP) flags = flags[:2] + "r" + flags[3:] elif flags[2] == "r" and string.upper(cmd) == "R": for i in jack_children.children: if i['type'] == "ripper": os.kill(i['pid'], signal.SIGCONT) flags = flags[:2] + " " + flags[3:] elif string.upper(cmd) == "U": cycles = 29 # do periodic stuff _now_ else: jack_term.tmod.move_pad(cmd) if cmd == 'KEY_RESIZE': continue last_update = time.time() # read from file with activity for i in jack_children.children: if i['fd'] in rfd: if os.uname()[0] == "Linux" and i['type'] != "image_reader": try: x = i['file'].read() except IOError: pass else: read_chars = 0 x = "" while read_chars < jack_helpers.helpers[i['prog']]['status_blocksize']: try: xchar = i['file'].read(1) except IOError: break x = x + xchar read_chars = read_chars + 1 try: rfd2, wfd2, xfd2 = select.select([i['fd']], [], [], 0.0) except: rfd2, wfd2, xfd2 = [], [], [] jack_term.tmod.sig_winch_handler(None, None) if i['fd'] not in rfd2: break # put read data into child's buffer i['buf'] = i['buf'] + x if jack_helpers.helpers[i['prog']].has_key('filters'): for fil in jack_helpers.helpers[i['prog']]['filters']: i['buf'] = fil[0].sub(fil[1], i['buf']) i['buf'] = i['buf'][-jack_helpers.helpers[i['prog']]['status_blocksize']:] # check for exiting child processes if jack_children.children: respid, res = os.waitpid(-1, os.WNOHANG) if respid != 0: last_update = last_update - cf['_update_interval'] # ensure info is printed new_ch = [] exited_proc = [] for i in jack_children.children: if i['pid'] == respid: if exited_proc != []: error("pid " + `respid` + " found at multiple child processes") exited_proc = i else: new_ch.append(i) if not exited_proc: error("unknown process (" + `respid` + ") has exited") jack_children.children = new_ch x = "" try: x = exited_proc['file'].read() except IOError: pass except ValueError: pass exited_proc['buf'] = (exited_proc['buf'] + x)[-jack_helpers.helpers[exited_proc['prog']]['status_blocksize']:] exited_proc['file'].close() global_error = global_error + res track = exited_proc['track'] num = track[NUM] stop_time = time.time() speed = ( track[LEN] / float(CDDA_BLOCKS_PER_SECOND)) / ( stop_time - exited_proc['start_time'] ) if exited_proc['type'] in ("ripper", "image_reader"): dae_running = dae_running - 1 if cf['_exec_when_done'] and exited_proc['type'] == "ripper" and dae_running == 0 and len(dae_queue) == 0: os.system(cf['_exec_rip_done']) if not res: if not exited_proc['otf']: if os.path.exists(track[NAME] + ".wav"): if jack_functions.tracksize(track)[WAV] != jack_utils.filesize(track[NAME] + ".wav"): res = 242 jack_status.dae_stat_upd(num, jack_status.get_2_line(exited_proc['buf'])) else: jack_status.dae_stat_upd(num, jack_status.get_2_line(exited_proc['buf'])) res = 243 global_error = global_error + res if res and not cf['_sloppy']: if os.path.exists(track[NAME] + ".wav"): os.remove(track[NAME] + ".wav") space = space + jack_functions.tracksize(track)[WAV] if cf['_otf']: os.kill(exited_proc['otf-pid'], signal.SIGTERM) if os.path.exists(track[NAME] + ext): os.remove(track[NAME] + ext) space = space + jack_functions.tracksize(track)[ENC] if not cf['_otf'] and not cf['_only_dae'] and track not in jack_encstuff.mp3s_ready: space = space + jack_functions.tracksize(track)[ENC] jack_status.dae_stat_upd(num, 'DAE failed with status ' + `res` + ", wav removed.") else: if exited_proc['type'] == "image_reader": jack_status.dae_stat_upd(num, jack_status.get_2_line(exited_proc['buf'])) else: if exited_proc['otf'] and jack_helpers.helpers[exited_proc['prog']].has_key('otf-final_status_fkt'): exec(jack_helpers.helpers[exited_proc['prog']]['otf-final_status_fkt']) in globals(), locals() else: last_status = None # (only used in cdparanoia) exec(jack_helpers.helpers[exited_proc['prog']]['final_status_fkt']) in globals(), locals() jack_status.dae_stat_upd(num, final_status) if jack_status.enc_cache[num]: jack_status.enc_stat_upd(num, jack_status.enc_cache[num]) jack_status.enc_cache[num] = "" jack_functions.progress(num, "dae", jack_status.dae_status[num]) if not cf['_otf'] and not cf['_only_dae'] and track not in jack_encstuff.mp3s_ready: if waiting_space: mp3s_todo.append(track) space = space + jack_functions.tracksize(track)[ENC] else: jack_status.enc_stat_upd(num, 'waiting for encoder.') enc_queue.append(track) space_waiting = space_waiting - jack_functions.tracksize(track)[WAV] elif exited_proc['type'] == "encoder": enc_running = enc_running - 1 # completed vbr files shouldn't be to small, but this still # caused confusion so again, vbr is an exception: if not cf['_vbr'] and not res and jack_functions.tracksize(track)[ENC] * 0.99 > jack_utils.filesize(track[NAME] + ext): res = 242 global_error = global_error + res if res: global_blocks = global_blocks - exited_proc['track'][LEN] global_start = global_start + exited_proc['elapsed'] / (enc_running + 1) if global_start > time.time(): global_start = time.time() if os.path.exists(track[NAME] + ext): # mp3enc doesn't report errors when out of disk space... os.remove(track[NAME] + ext) space = space + jack_functions.tracksize(track)[ENC] jack_status.enc_stat_upd(num, 'coding failed, err#' + `res`) else: global_done = global_done + exited_proc['track'][LEN] if cf['_vbr']: jack_status.enc_stat_upd(num, "[coding @" + '%s' % jack_functions.pprint_speed(speed) + "x done, %03.0fkbit]" % ((jack_utils.filesize(track[NAME] + ext) * 0.008) / (track[LEN] / 75.0))) else: jack_status.enc_stat_upd(num, "[coding @" + '%s' % jack_functions.pprint_speed(speed) + "x done, mp3 OK]") if not cf['_otf'] and not cf['_keep_wavs']: os.remove(track[NAME] + ".wav") space = space + jack_functions.tracksize(track)[WAV] jack_functions.progress(num, "enc", `track[RATE]`, jack_status.enc_status[num]) else: error("child process of unknown type (" + exited_proc['type'] + ") exited") if global_error: jack_display.smile = " :-[" if last_update + cf['_update_interval'] <= time.time(): last_update = time.time() # interpret subprocess output for i in jack_children.children: if i['type'] == "ripper": if len(i['buf']) == jack_helpers.helpers[i['prog']]['status_blocksize']: if i['otf'] and jack_helpers.helpers[i['prog']].has_key('otf-status_fkt'): exec(jack_helpers.helpers[i['prog']]['otf-status_fkt']) in globals(), locals() else: exec(jack_helpers.helpers[i['prog']]['status_fkt']) in globals(), locals() if new_status: jack_status.dae_stat_upd(i['track'][NUM], ":DAE: " + new_status) elif i['type'] == "encoder": if len(i['buf']) == jack_helpers.helpers[i['prog']]['status_blocksize']: tmp_d = {'i': i.copy(), 'percent': 0} try: exec(jack_helpers.helpers[i['prog']]['percent_fkt']) in globals(), tmp_d except: tmp_d['percent'] = 0 debug("error in percent_fkt of %s." % `i`) i['percent'] = tmp_d['percent'] if i['percent'] > 0: i['elapsed'] = time.time() - i['start_time'] speed = ((i['track'][LEN] / float(CDDA_BLOCKS_PER_SECOND)) * ( i['percent'] / 100 )) / i['elapsed'] eta = (100 - i['percent']) * i['elapsed'] / i['percent'] eta_ms = "%02i:%02i" % (eta / 60, eta % 60) jack_status.enc_stat_upd(i['track'][NUM], '%2i%% done, ETA:%6s, %sx' % (i['percent'], eta_ms, jack_functions.pprint_speed(speed))) #jack_term.tmod.dae_stat_upd(i['track'][NUM], None, i['percent']) elif i['type'] == "image_reader": line = string.strip(jack_status.get_2_line(i['buf'])) jack_status.dae_stat_upd(i['track'][NUM], line) if line.startswith("Error"): global_error = global_error + 1 else: error("unknown subprocess type \"" + i['type'] + "\".") cycles = cycles + 1 if cycles % 30 == 0: if cf['_recheck_space'] and not cf['space_from_argv']['history'][-1][0] == "argv": actual_space = jack_functions.df() if space_adjust: diff = actual_space - space if diff > space_adjust: space = space + space_adjust space_adjust = 0 waiting_space = 0 else: space = space + diff space_adjust = space_adjust - diff else: if actual_space < space: space_adjust = space - actual_space space = actual_space if space_adjust and enc_running == 0 and dae_running == 0: waiting_space = waiting_space + 1 if not waiting_space >= 2 and not waiting_load and enc_running == 0 and dae_running == 0: blocked = blocked + 1 else: blocked = 0 total_done = global_done for i in jack_children.children: total_done = total_done + (i['percent'] / 100) * i['track'][LEN] elapsed = time.time() - global_start if global_blocks > 0: percent = total_done / global_blocks else: percent = 0 if percent > 0 and elapsed > 40: eta = ((1 - percent) * elapsed / percent) eta_hms = " ETA=%i:%02i:%02i" % (eta / 3600, (eta % 3600) / 60, eta % 60) else: eta_hms = "" if string.strip(flags[1:-1]): print_flags = " " + flags else: print_flags = "" if dae_running: rot = rotate_ball[rot_count % rot_ball_cycle] else: rot = rotate[rot_count % rot_cycle] rot_count = rot_count + 1 # print status if blocked > 2: jack_display.special_line = " ...I feel blocked - quit with 'q' if you get bored... " if blocked > 5: space = jack_functions.df() - cf['_keep_free'] elif waiting_load and waiting_space >= 2: jack_display.special_line = " ...waiting for load (%.2f)" % actual_load + ") < %.2f" % cf['_max_load'] + " and for " + jack_functions.pprint_i(space_adjust, "%i %sBytes") + " to be freed... " elif waiting_space >= 2: jack_display.special_line = " ...waiting for " + jack_functions.pprint_i(space_adjust, "%i %sBytes") + " to be freed.... " elif waiting_load: jack_display.special_line = " ...waiting for load (%.2f) to drop below %.2f..." % (actual_load, cf['_max_load']) else: jack_display.special_line = None jack_display.bottom_line = "(" + rot + ") " \ + "SPACE:" * (space_adjust != 0) \ + "space:" * (space_adjust == 0) \ + jack_functions.pprint_i(space, "%i%sB") \ + (" waiting_WAVs:%02i" % len(enc_queue)) \ + " DAE:" + `cf['_rippers'] - dae_running` + "+" + `dae_running` \ + " ENC:" + `cf['_encoders'] - enc_running` + "+" + `enc_running` \ + eta_hms \ + " errors: " + `global_error` \ + jack_display.smile + print_flags jack_term.tmod.update(jack_display.special_line, jack_display.bottom_line) return global_error # end of main loop ######################################################### jack-3.1.1+cvs20050801/jack_misc.py0000644000175000017500000000525310371403403014456 0ustar tbmtbm### jack_misc - misc stuff for ### jack - extract audio from a CD and MP3ify it using 3rd party software ### Copyright (C) 1999,2000 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import string, types import sys import os def id(x): return x def multi_replace(s, rules, filter = id): "like string.replace but take list (('from0', 'to0'), ('from1', 'to1'))..." # currently all from must be like %x (a percent sign follow by single char. res = "" maybe = 0 for i in s: if maybe: maybe = 0 found = 0 for j in rules: if ("%" + i) == j[0]: res = res[:-1] + filter(j[1]) found = 1 if found: continue maybe = 0 if i == "%": maybe = 1 res = res + i return res def safe_int(number, message): try: return int(number) except ValueError: print message sys.exit(1) class dict2(dict): def rupdate(self, d2, where): for i in d2.keys(): if self.__contains__(i): new = self.__getitem__(i) if new['val'] != d2[i]['val']: new.update(d2[i]) new['history'].append([where, new['val']]) dict.__setitem__(self, i, new) def __getitem__(self, y): if type(y) == types.StringType and y and y[0] == "_": return dict.__getitem__(self, y[1:])['val'] else: return dict.__getitem__(self, y) def __setitem__(self, y, x): if type(y) == types.StringType and y and y[0] == "_": self[y[1:]]['val'] = x #return dict.__setitem__(self, y[1:])['val'] else: return dict.__setitem__(self, y, x) def loadavg(): "extract sysload from /proc/loadavg, linux only (?)" try: f = open("/proc/loadavg", "r") load = float(string.split(f.readline())[0]) return load except: return -1 jack-3.1.1+cvs20050801/jack_mp3.py0000644000175000017500000003016210371403403014217 0ustar tbmtbm### jack_mp3 - mp3 layer stuff for ### jack - extract audio from a CD and MP3ify it using 3rd party software ### Copyright (C) 1999-2001 Arne Zellentin ### Transformed from mp3info (c) Thorvald Natvig ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA DEBUG = 0 import string, types from os import stat from stat import ST_SIZE from StringIO import StringIO global warnings global F, f, xing, id3v2, start_offset # constants mode_names = ["stereo", "j-stereo", "dual-ch", "single-ch", "multi-ch"] layer_names = ["I", "II", "III"] version_names = ["MPEG-1", "MPEG-2 LSF", "MPEG-2.5"] version_nums = ["1", "2", "2.5"] bitrates = \ [[[ 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448],\ [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384],\ [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320]],\ [[0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],\ [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],\ [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]],\ [[0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],\ [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],\ [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]]] s_freq = \ [[44100, 48000, 32000, 0],\ [22050, 24000, 16000, 0],\ [11025, 8000, 8000, 0]] bpf_fact = [0, 12000, 144000, 144000] # Xing stuff FRAMES_FLAG = 0x0001 BYTES_FLAG = 0x0002 TOC_FLAG = 0x0004 VBR_SCALE_FLAG= 0x0008 def get_l4 (s): return reduce(lambda a,b: ((a<<8) + b), map(long, map(ord, s))) def decode_xing(): global F, f, xing # defaults: frames = bytes = scale = toc = None where = f.tell() try: if 1: if DEBUG: print "Xing at", where # 32-bit fields; "Xing", flags, frames, bytes, 100 toc flags = get_l4(f.read(4)) if flags & FRAMES_FLAG: frames = get_l4(f.read(4)) if flags & BYTES_FLAG: bytes = get_l4(f.read(4)) if flags & TOC_FLAG: toc = map(lambda x: ord(x), f.read(100)) for j in range(len(toc)): toc[j] = int(toc[j] / 256.0 * bytes) if flags & VBR_SCALE_FLAG: scale = get_l4(f.read(4)) if DEBUG>2: print "Xing: frames=%i" % frames print "Xing: bytes=%i" % bytes print "Xing: toc=", toc print "Xing: scale=%i" % scale xing = {} if frames: xing['x_frames'] = frames if bytes: xing['x_bytes'] = bytes if toc: xing['x_toc'] = toc if scale: xing['x_scale'] = scale xing['x_header_at'] = where - 4 else: return None except: if DEBUG: import traceback traceback.print_exc() f.seek(where + 1) return None def find_xing(framelen): "read (and skip) the Xing header if present" where = f.tell() x = f.read(framelen) pos = string.find(x, "Xing") if pos >= 0: f.seek(where + pos + 4) decode_xing() f.seek(where + framelen) else: f.seek(where) def reread_f(size): global F, f pos = f.tell() f.seek(F.offset) if DEBUG: print "reread_f: now at", f.tell() F_offset = F.offset F_file = F.file F = StringIO(f.read(F.len + size + 10)) F.file = F_file F.offset = F_offset f.seek(pos) def handle_id3v2(version, flags, data): global id3v2 if DEBUG: print "ID3:", `version`, `flags`, len(data) id3v2 = {} id3v2['version'] = tuple(version) def read_id3v2(): #$49 44 33 yy yy xx zz zz zz zz ; yy < $FF; zz < $80 # I D 3 yy yy xx zz zz zz zz # 0 1 2 3 4 5 6 7 8 9 global F, f where = f.tell() header = f.read(10) if header[:3] != "ID3": if DEBUG: print "no header?", where, `header` f.seek(where) return None header = list(header) for i in range(3,10): header[i] = ord(header[i]) if not (header[3] < 0xff) or not (header[4] < 0xff): f.seek(where) return None if not (header[6] < 0x80) or not (header[7] < 0x80): f.seek(where) return None if not (header[8] < 0x80) or not (header[9] < 0x80): f.seek(where) return None size = header[6:] size = list(size) value = 0 for i in size: value = value << 7 value = value | i size = value reread_f(size) flags = header[5] version = header[3:5] return handle_id3v2(version, flags, f.read(size)) def decode_header(buffer): "get mp3 info. Transformed from mp3info (c) Thorvald Natvig" try: switch = (ord(buffer[1]) >> 3 & 0x3) if switch == 3: version = 0 elif switch == 2: version = 1 elif switch == 0: version = 2 else: return None bitrate_index = (ord(buffer[2]) >> 4) & 0x0F sampling_frequency = (ord(buffer[2]) >> 2) & 0x3 mode = (ord(buffer[3]) >> 6) & 0x3 x = {} x['error_protection'] = not (ord(buffer[1]) & 0x1) x['padding'] = (ord(buffer[2]) >> 1) & 0x01 x['extension'] = ord(buffer[2]) & 0x01 x['mode_ext'] = (ord(buffer[3]) >> 4) & 0x03 x['copyright'] = (ord(buffer[3]) >> 3) & 0x01 x['original'] = (ord(buffer[3]) >> 2) & 0x1 x['emphasis'] = (ord(buffer[3])) & 0x3 x['mode_name'] = mode_names[mode] x['lay'] = 4 - ((ord(buffer[1]) >> 1) & 0x3) x['layer_name'] = layer_names[x['lay'] - 1] x['version_name'] = version_names[version] x['version_num'] = version_nums[version] x['bitrate'] = bitrates[version][x['lay'] - 1][bitrate_index] if not x['bitrate']: raise IllegalError_may_be_free_format x['sfreq'] = s_freq[version][sampling_frequency] if not x['sfreq']: raise IllegalError_illegal_sfreq except: if DEBUG: import traceback traceback.print_exc() print "Illegal header, so far:", x x = None return x def extend_frameinfo(x): if x['version_num'] == "1": x['samples_per_frame'] = 1152 elif x['version_num'] == "2": x['samples_per_frame'] = 576 else: print "What is the spf for %s?" % x['version_name'], "(%s)" % x['version_num'] # calculate BPF x['bpf'] = (x['bitrate'] * bpf_fact[x['lay']]) / x['sfreq'] x['framesize'] = (x['bitrate'] * bpf_fact[x['lay']]) / x['sfreq'] + x['padding'] #stereo = (mode == MPG_MD_MONO) ? 1 : 2; return x def syncronize(what = 1): global F, f index = f.tell() x = {} #search intelligently (i.e. fast) for any header fields = ["\377", "I", "X", "R"][:what] if not warnings: fields.remove("R") #while index < len(f.buf) - 4: while index < F.len - 4 + start_offset: #print index if F.buf[index - start_offset] in fields: if F.buf[index - start_offset + 1] >= "\340": # a valid header must start with 11 set bits f.seek(index) x = decode_header(f.read(4)) if x: where = f.tell() - 4 x['header_at'] = where x = extend_frameinfo(x) next_header = where + x['framesize'] if DEBUG: print "MPEG header found at %i, expect next header at %i." % (x['header_at'], next_header) f.seek(next_header) buf = f.read(4) y = None if buf[:2] >= "\377\340": y = decode_header(buf) if y: # two headers, that's certain enough. f.seek(x['header_at']) break else: if DEBUG: print "but no valid header follows at %i." % next_header f.seek(where) index = where x = None elif F.buf[index - start_offset:index - start_offset + 3] == "ID3": if not id3v2: f.seek(index) read_id3v2() if id3v2: if DEBUG: print "ID3v2 found, now at %i" % f.tell(), id3v2 index = f.tell() fields.remove("I") continue else: f.seek(index) elif F.buf[index - start_offset:index - start_offset + 4] == "Xing": f.seek(index + 4) decode_xing() if xing: if DEBUG: print "Xing header found without frame sync." index = f.tell() fields.remove("X") continue else: f.seek(index + 4) elif F.buf[index - start_offset:index - start_offset + 4] == "RIFF": if warnings: print "skipping RIFF header at %i..." % F.tell() fields.remove("R") index = index + 1 return x def mp3format(file, warn = 1, max_skip = 100000, offset = 0): global F, f, xing, id3v2, warnings, start_offset warnings = warn start_offset = offset f = xing = id3v2 = None if DEBUG: print "examining", file, "warnings=%i" % warnings, "offset=%i" % start_offset, "max_skip=%i" % max_skip # XXX we're using StringIO because it's faster - transitionally. if type(file) == types.StringType: f = open(file, "r") elif hasattr(file, 'seek'): f = file else: print "unknown object:", file return None f.seek(start_offset) search_in = f.read(max_skip) F = StringIO(search_in) F.file = file f.seek(start_offset) F.offset = start_offset x = syncronize(what = 4) if not x: if warnings: print "Warning: no MP3 header found in the first", F.tell(), "bytes of file\n : \"" + file + "\"." return {} # we're quite sure we have a valid header now if warnings > 1: print "Warning: MP3 header found at offset", f.tell() - 4 # fill in convenience stuff x = extend_frameinfo(x) # the xing header is normally embedded in the first valid frame # but sometimes it appears earlier, I don't know why. Use the 1st. if not xing: find_xing(x['framesize']) if xing: x.update(xing) if x.has_key('x_frames'): x['length_in_samples'] = x['x_frames'] * x['samples_per_frame'] x['length'] = float(x['length_in_samples']) / x['sfreq'] # should use the real file size instead of x_bytes. if x.has_key("x_bytes"): x['bitrate'] = int((x['x_bytes'] * 8.0 / x['length']) / 100 + 0.5) x['bitrate'] = x['bitrate'] / 10.0 else: print "strange xing=" + `xing` else: x['length'] = stat(file)[ST_SIZE] * 8.0 / (x['bitrate'] * 1000) if id3v2: x['id3v2'] = id3v2 if DEBUG > 1: print x return x class MP3: def __init__(self, file, name=None): self.file = None self.name = name if type(file) == types.StringType: self.file = open(file, "rb") self.name = file elif hasattr(file, 'seek'): self.file = file else: print "unknown object:", file return None jack-3.1.1+cvs20050801/jack_playorder.py0000644000175000017500000000170110371403403015516 0ustar tbmtbm### jack_playorder: use the PLAYORDER field in freedb data for ### jack - tag audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2003 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from jack_globals import * order = None jack-3.1.1+cvs20050801/jack_plugin_cddb.py0000644000175000017500000000037310371403403015773 0ustar tbmtbm### jack_plugin_cddb: example freedb server plugin plugin_freedb_servers = { 'plugin_cddb': { 'host': "cddb.cddb.com", 'id': "xmcd 2.6", 'submit_mail': "freedb-submit@freedb.org", 'my_mail': "default" }, } jack-3.1.1+cvs20050801/jack_plugin_lame.py0000644000175000017500000000212510371403403016012 0ustar tbmtbm### jack_plugin_lame: user-editable lame plugin for jack plugin_helpers = { 'plugin_lame': { 'type': "encoder", 'target': "mp3", 'inverse-quality': 1, 'cmd': "lame --preset cbr %r --strictly-enforce-ISO %i %o", 'vbr-cmd': "lame -V %q --vbr-new --nohist --strictly-enforce-ISO %i %o", 'otf-cmd': "lame --preset cbr %r --strictly-enforce-ISO - %o", 'vbr-otf-cmd': "lame -V %q --vbr-new --nohist --strictly-enforce-ISO - %o", 'status_blocksize': 160, 'bitrate_factor': 1, 'status_start': "%", 'percent_fkt': r""" s = string.split(i['buf'], '\r') if len(s) >= 2: s=s[-2] if len(s) == 1: s=s[0] if string.find(s, "%") >= 0: # status reporting starts here y = string.split(s, "/") y1 = string.split(y[1], "(")[0] percent = float(y[0]) / float(y1) * 100.0 elif string.find(s, "Frame:") >= 0: # older versions, like 3.13 y = string.split(s, "/") y0 = string.split(y[0], "[")[-1] y1 = string.split(y[1], "]")[0] percent = float(y0) / float(y1) * 100.0 else: percent = 0 """, }, } jack-3.1.1+cvs20050801/jack_plugins.py0000644000175000017500000000341210371403403015177 0ustar tbmtbm# -*- coding: iso-8859-15 -*- ### jack_plugins: plugin architecture for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import sys from jack_globals import * import jack_helpers import jack_freedb def load_plugin(name, structure): import_statement = "from jack_%s import %s" % (name, structure) get_statement = "tmp = %s[name]" % structure exec(import_statement) in locals() exec(get_statement) in locals() return tmp def import_freedb_servers(): if cf['_freedb_server'].startswith("plugin_"): tmp = load_plugin(cf['_freedb_server'], "plugin_freedb_servers") jack_freedb.freedb_servers[cf['_freedb_server']] = tmp def import_helpers(): for i in (cf['_encoder'], cf['_ripper']): if i.startswith("plugin_"): tmp = load_plugin(i, "plugin_helpers") if jack_helpers.helpers.has_key(i): warning("plugin %s already loaded, skipping.", i) continue jack_helpers.helpers[i] = tmp jack-3.1.1+cvs20050801/jack_prepare.py0000644000175000017500000007615710371403403015174 0ustar tbmtbm### jack_prepare: prepare everything for the main_loop; a module for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import string import types import pprint import os, sys import difflib, shutil import jack_playorder import jack_functions import jack_progress import jack_version import jack_utils import jack_ripstuff import jack_targets import jack_helpers import jack_freedb import jack_status import jack_encstuff import jack_misc import jack_tag from jack_globals import * tracknum = None datatracks = [] def find_workdir(): "search for a dir containing a toc-file or do the multi-mode" tries = 0 toc_just_read = 0 debug("multi_mode:" + `cf['_multi_mode']`) while (not os.path.exists(cf['_toc_file'])) or cf['_multi_mode']: tries = tries + 1 if tries > 2: break if cf['_guess_mp3s']: jack_ripstuff.all_tracks = jack_functions.guesstoc(cf['_guess_mp3s']) else: if cf['_multi_mode']: debug("multimode all_tracks reset") jack_ripstuff.all_tracks = [] else: if cf['_image_toc_file']: jack_ripstuff.all_tracks, dummy, dummy = jack_functions.cdrdao_gettoc(cf['_image_toc_file']) else: jack_ripstuff.all_tracks = jack_functions.gettoc(cf['_toc_prog']) toc_just_read = 1 # check that the generic device is usable, too if cf['_gen_device'] and not os.access(cf['_gen_device'], os.R_OK | os.W_OK): warning(r"""could not open generic device %s for reading and writing.""" % cf['_gen_device']) if cf['_scan_dirs']: dirs = [os.getcwd()] else: dirs = cf['_searchdirs'] while cf['_scan_dirs'] > 0: cf['_scan_dirs'] = cf['_scan_dirs'] - 1 new_dirs = [] for i in dirs: if not i in new_dirs: new_dirs.append(i) try: subdir = os.listdir(i) except OSError, msg: print "skipped %s, %s" % (i, msg) continue for j in subdir: dir = os.path.join(i,j) if os.path.isdir(dir) and not dir in new_dirs: new_dirs.append(dir) dirs = new_dirs possible_dirs = [] # dirs matching inserted CD jack_dirs = [] # dirs containing toc_file for i in dirs: if os.path.exists(os.path.join(i, cf['_toc_file'])): jack_dirs.append(i) file_toc, dummy, dummy = jack_functions.cdrdao_gettoc(os.path.join(i, cf['_toc_file'])) if jack_freedb.freedb_id(jack_ripstuff.all_tracks) == jack_freedb.freedb_id(file_toc): possible_dirs.append(i) if cf['_multi_mode']: unique_dirs = [] for i in range(len(jack_dirs)): found = 0 for j in range(i + 1,len(jack_dirs)): if os.path.samefile(jack_dirs[i], jack_dirs[j]): found = 1 if not found: unique_dirs.append(jack_dirs[i]) for i in unique_dirs: jack_ripstuff.all_tracks, dummy, track1_offset = jack_functions.cdrdao_gettoc(os.path.join(i, cf['_toc_file'])) err, jack_tag.track_names, jack_tag.locale_names, cd_id, revision = freedb_names(jack_freedb.freedb_id(jack_ripstuff.all_tracks), jack_ripstuff.all_tracks, os.path.join(i, cf['_freedb_form_file']), verb = 0, warn = 0) if err or cf['_force']:# this means freedb data is not there yet info("matching dir found: %d" % i) pid = os.fork() if pid == CHILD: os.chdir(i) ch_args = sys.argv for killarg in ('--force', '--multi-mode'): if killarg in ch_args: ch_args.remove(killarg) info("running" + `ch_args`) os.execvp(ch_args[0], ch_args) else: respid, res = os.waitpid(pid, 0) sys.exit() unique_dirs = [] for i in range(len(possible_dirs)): found = 0 for j in range(i + 1,len(possible_dirs)): if os.path.samefile(possible_dirs[i], possible_dirs[j]): found = 1 if not found: unique_dirs.append(possible_dirs[i]) info("matching dir found: " + possible_dirs[i]) if len(unique_dirs) > 1: error("found more than one workdir, change to the correct one.") elif len(unique_dirs) == 1: os.chdir(unique_dirs[0]) else: if cf['_create_dirs']: cf['_base_dir'] = expand(cf['_base_dir']) if not os.path.exists(cf['_base_dir']): os.makedirs(cf['_base_dir']) os.chdir(cf['_base_dir']) dir_name = jack_version.prog_name + "-" + jack_freedb.freedb_id(jack_ripstuff.all_tracks, warn=0) if not os.path.exists(dir_name) and not os.path.isdir(dir_name): os.mkdir(dir_name) os.chdir(dir_name) jack_freedb.dir_created = dir_name jack_functions.progress("all", "mkdir", jack_freedb.dir_created) if not cf['_multi_mode']: if not os.path.exists(cf['_toc_file']): jack_functions.cdrdao_puttoc(cf['_toc_file'], jack_ripstuff.all_tracks, jack_freedb.freedb_id(jack_ripstuff.all_tracks)) jack_freedb.freedb_template(jack_ripstuff.all_tracks) # generate freedb form if tocfile is created if not os.path.exists(cf['_freedb_form_file']): jack_freedb.freedb_template(jack_ripstuff.all_tracks) else: break return toc_just_read def check_toc(): "compare CD toc to tocfile" if cf['_check_toc']: cd_toc = jack_functions.gettoc(cf['_toc_prog']) if os.path.exists(cf['_toc_file']): file_toc, dummy, dummy = jack_functions.cdrdao_gettoc(cf['_toc_file']) else: print "no toc-file named " + cf['_toc_file'] + " found, exiting." jack_display.exit() print "This is the inserted CD:" pprint.pprint(cd_toc) print print "And This is what we expect:" pprint.pprint(file_toc) print if cmp(cd_toc, file_toc) == 0: print 'Yes, toc-file ("' + cf['_toc_file'] + '") matches inserted CD.' else: print 'No, toc-file ("' + cf['_toc_file'] + '") *DOES NOT* match inserted CD.' def read_toc_file(): "read and interpret toc_file" global is_submittable is_submittable = 0 if os.path.exists(cf['_toc_file']): if cf['_image_toc_file']: cf['_toc_file'] = cf['_image_toc_file'] jack_ripstuff.all_tracks, new_image_file, track1_offset = jack_functions.cdrdao_gettoc(cf['_toc_file']) if not os.path.exists(cf['_def_toc']): jack_functions.cdrdao_puttoc(cf['_def_toc'], jack_ripstuff.all_tracks, jack_freedb.freedb_id(jack_ripstuff.all_tracks)) # if image_file is not set (-F), we can guess it from image_toc_file if not cf['_image_file'] and not cf['_rip_from_device']: cf['_image_file'] = new_image_file if cf['_rip_from_device']: cf['_image_file'] = "" is_submittable = 1 return is_submittable, track1_offset def filter_tracks(toc_just_read): "filter out data tracks" if toc_just_read and jack_helpers.helpers[cf['_ripper']].has_key("toc_cmd") and cf['_ripper'] != cf['_toc_prog']: ripper_tracks = jack_functions.gettoc(cf['_ripper']) if ripper_tracks != jack_ripstuff.all_tracks: for i in range(len(jack_ripstuff.all_tracks)): rtn = jack_utils.has_track(ripper_tracks, jack_ripstuff.all_tracks[i][NUM]) if rtn >= 0: for j in range(6): # "NUM LEN START COPY PRE CH" (not: "RIP RATE NAME") if ripper_tracks[rtn][j] != jack_ripstuff.all_tracks[i][j]: jack_functions.progress(i + 1, "patch", "%s %d -> %d" % (fields[j], jack_ripstuff.all_tracks[i][j], ripper_tracks[rtn][j])) debug("Track %02d %s" % (i + 1, fields[j]) + `jack_ripstuff.all_tracks[i][j]` + " != " + `ripper_tracks[rtn][j]` + " (trusting %s; to the right)" % cf['_ripper']) else: jack_functions.progress(i + 1, "off", "non-audio") datatracks.append(i + 1) info("Track %02d not found by %s. Treated as non-audio." % (i + 1, cf['_ripper'])) def gen_todo(): "parse tracks from argv, generate todo" global tracknum tracknum = {} for i in jack_ripstuff.all_tracks: tracknum[i[NUM]] = i if not cf['_tracks'] and not jack_playorder.order: todo = [] for i in jack_ripstuff.all_tracks: if i[CH] == 2: todo.append(i) else: info("can't handle non audio track %i" % i[NUM]) else: # example: "1,2,4-8,12-" -> [ 1,2,4,5,6,7,8,12,13,...,n ] tlist = [] if cf['_tracks']: tracks = string.split(cf['_tracks'], ",") else: tracks = string.split(jack_playorder.order, ",") for k in tracks: if string.find(k, '-') >= 0: k = string.split(k, '-') lower_limit = jack_misc.safe_int(k[0], "Track '%s' is not a number." % k[0]) if k[1]: upper_limit = jack_misc.safe_int(k[1], "Track '%s' is not a number." % k[1]) else: upper_limit = len(jack_ripstuff.all_tracks) for j in range(lower_limit, upper_limit + 1): tlist.append(j) else: track = jack_misc.safe_int(k, "Track '%s' is not a number." % k) tlist.append(track) # uniq the track list tlist.sort() k = 0 while k < len(tlist) - 1: if tlist[k] == tlist[k+1]: del tlist[k] else: k = k + 1 # generate todo todo = [] audiotracks = [] for i in jack_ripstuff.all_tracks: if i[NUM] in datatracks: continue audiotracks.append(i[NUM]) if audiotracks != range(1, audiotracks[-1] + 1): info("strange audio track layout " + `audiotracks`) continuous = 0 else: continuous = 1 for k in tlist: if continuous: if k < 1 or k > len(audiotracks): warning('This CD has audio tracks 1-%d. Ignoring request for track %d.' % (len(audiotracks), k)) continue else: if k < 1 or k > len(jack_ripstuff.all_tracks): warning('This CD has tracks 1-%d. Ignoring request for track %d.' % (len(jack_ripstuff.all_tracks), k)) continue if jack_ripstuff.all_tracks[k-1][CH] == 2: todo.append(jack_ripstuff.all_tracks[k-1]) else: warning("can't handle non audio track %i" % k[NUM]) for i in todo: jack_ripstuff.all_tracks_todo_sorted.append(i) return todo def init_status(): status = {} for i in jack_ripstuff.all_tracks: num = i[NUM] status[num] = {} status[num]['dae'] = [] status[num]['enc'] = [] status[num]['ren'] = [] status[num]['names'] = [i[NAME],] status[num]['patch'] = [] status[num]['off'] = [] status['all'] = {} status['all']['mkdir'] = status['all']['names'] = [[],] status['all']['dae'] = [] status['all']['enc'] = [] status['all']['ren'] = [] status['all']['patch'] = [] status['all']['off'] = [] status['all']['id3_genre'] = ["-1",] status['all']['id3_year'] = ["-1",] return status def update_progress(todo): ext = jack_targets.targets[jack_helpers.helpers[cf['_encoder']]['target']]['file_extension'] "update progress file at user's request (operation mode)" if cf['_upd_progress']: for i in todo: num = i[NUM] if not status[num]['dae']: if os.path.exists(i[NAME] + ".wav"): status[num]['dae'] = " * [ simulated ]" jack_functions.progress(num, "dae", status[num]['dae']) if not status[num]['enc']: if os.path.exists(i[NAME] + ext): if ext == ".mp3": x = jack_mp3.mp3format(i[NAME] + ext) temp_rate = x['bitrate'] elif ext == ".ogg": x = ogg.vorbis.VorbisFile(i[NAME] + ext) temp_rate = int(x.raw_total(0) * 8 / x.time_total(0) / 1000 + 0.5) else: error("don't know how to handle %s files." % ext) status[num]['enc'] = `temp_rate` + cf['_progr_sep'] + "[simulated]" jack_functions.progress(num, "enc", status[num]['enc']) def read_progress(status, todo): "now read in the progress file" if os.path.exists(cf['_progress_file']): f = open(cf['_progress_file'], "r") while 1: buf = f.readline() if not buf: break # strip doesn't work here as we may have trailing spaces buf = string.replace(buf, "\n", "") # ignore empty lines if not buf: continue buf = string.split(buf, cf['_progr_sep'], 3) try: num = int(buf[0]) except ValueError: num = buf[0] if buf[1] == 'undo': # this needs special treatment as # the correct sequence is important status[num]['ren'].append(('Undo',)) elif buf[1] == 'ren': status[num][buf[1]].append(buf[2:]) else: status[num][buf[1]] = buf[2:] f.close() # names for 'all' can't be initialized earlier... status['all']['names'] = [status['all']['mkdir'][-1],] # extract names from renaming for i in status.keys(): for j in status[i]['ren']: if j == ('Undo',): if len(status[i]['names']) > 1: del status[i]['names'][-1] else: error("more undos than renames, exit.") else: names = string.split(j[0], '-->', 1) if status[i]['names'][-1] == names[0]: status[i]['names'].append(names[1]) if type(i) == types.IntType: tracknum[i][NAME] = status[i]['names'][-1] del status[i]['ren'] # status info for the whole CD is treated separately jack_progress.status_all = status['all'] del status['all'] # now clean up a little for i in status.keys(): if len(status[i]['dae']) > 1 or len(status[i]['enc']) > 2: error("malformed progress file") sys.exit() if len(status[i]['enc']) == 2: tracknum[i][RATE] = int(float(status[i]['enc'][0]) + 0.5) status[i]['enc'] = status[i]['enc'][1] elif status[i]['enc'] and len(status[i]['enc']) == 1: tracknum[i][RATE] = cf['_bitrate'] if status[i]['dae'] and len(status[i]['dae']) == 1: status[i]['dae'] = status[i]['dae'][0] if status[i]['patch']: for j in status[i]['patch']: p_what, p_from, dummy, p_to = string.split(j) p_from = int(p_from) p_to = int(p_to) if tracknum[i][fields.index(p_what)] == p_from: tracknum[i][fields.index(p_what)] = p_to else: error("illegal patch %s. " % j, + "Track %02d: %s is %d" % (i, p_what, todo[jack_utils.has_track(todo, i)][fields.index(p_what)])) if status[i]['off']: if jack_utils.has_track(todo, i) >= 0: del todo[jack_utils.has_track(todo, i)] if jack_utils.has_track(jack_ripstuff.all_tracks_todo_sorted, i) >= 0: del jack_ripstuff.all_tracks_todo_sorted[jack_utils.has_track(jack_ripstuff.all_tracks_todo_sorted, i)] # extract status from read progress data jack_status.extract(status) jack_freedb.dir_created = jack_progress.status_all['names'][-1] jack_progress.status_all['id3_genre'] = int(jack_progress.status_all['id3_genre'][-1]) jack_progress.status_all['id3_year'] = int(jack_progress.status_all['id3_year'][-1]) if cf['_id3_genre'] == -1: cf['_id3_genre'] = jack_progress.status_all['id3_genre'] else: if cf['_id3_genre'] != jack_progress.status_all['id3_genre']: jack_functions.progress("all", "id3_genre", `cf['_id3_genre']`) jack_tag.genretxt = "" if cf['_id3_genre'] >= 0 and cf['_id3_genre'] < len(id3genres): jack_tag.genretxt = id3genres[cf['_id3_genre']] if cf['_id3_year'] == -1: cf['_id3_year'] = jack_progress.status_all['id3_year'] else: if cf['_id3_year'] != jack_progress.status_all['id3_year']: jack_functions.progress("all", "id3_year", `cf['_id3_year']`) return status def freedb_submit(): "submit freedb data on user's request" if not is_submittable: error("can't submit in current state, please fix jack.freedb") err, jack_tag.track_names, jack_tag.locale_names, cd_id, revision = jack_freedb.freedb_names(jack_freedb.freedb_id(jack_ripstuff.all_tracks), jack_ripstuff.all_tracks, cf['_freedb_form_file'], verb = 1) if err: error("invalid freedb file") else: if cf['_freedb_mailsubmit']: jack_freedb.do_freedb_mailsubmit(cf['_freedb_form_file'], cd_id) else: jack_freedb.do_freedb_submit(cf['_freedb_form_file'], cd_id) ### (9) do query on start def query_on_start(): info("querying...") if jack_freedb.freedb_query(jack_freedb.freedb_id(jack_ripstuff.all_tracks), jack_ripstuff.all_tracks, cf['_freedb_form_file']): if cf['_cont_failed_query']: x = raw_input("\nfreedb search failed, continue? ") + "x" if string.upper(x[0]) != "Y": sys.exit(0) cf['_query_on_start'] = 0 else: jack_display.exit() if cf['_edit_freedb']: file = cf['_freedb_form_file'] bakfile = file + ".bak" if os.path.exists(file): try: shutil.copyfile(file, bakfile) except IOError: pass jack_utils.ex_edit(cf['_freedb_form_file']) if os.path.exists(bakfile): try: f = open(file, "r") b = open(bakfile, "r") except IOError: print "Could not open jack.freedb or jack.freedb.bak for comparison" else: pdiff = "".join(difflib.unified_diff(b.readlines(), f.readlines(), bakfile, file)) f.close() b.close() if pdiff: print print "You made the following changes to the FreeDB file:" print print pdiff x = raw_input("Would you like to submit these changes to the FreeDB server? (y/N) ") if string.upper(x[0]) == "Y": jack_freedb.update_revision(file) freedb_submit() if cf['_query_on_start']: err, jack_tag.track_names, jack_tag.locale_names, freedb_rename, revision = jack_freedb.interpret_db_file(jack_ripstuff.all_tracks, cf['_freedb_form_file'], verb = cf['_query_on_start'], dirs = 1) if err: error("query on start failed to give a good freedb file, aborting.") else: err, jack_tag.track_names, jack_tag.locale_names, freedb_rename, revision = jack_freedb.interpret_db_file(jack_ripstuff.all_tracks, cf['_freedb_form_file'], verb = cf['_query_on_start'], warn = cf['_query_on_start']) return freedb_rename def undo_rename(status, todo): ext = jack_targets.targets[jack_helpers.helpers[cf['_encoder']]['target']]['file_extension'] "undo renaming (operation mode)" maxnames = max(map(lambda x: len(x['names']), status.values())) if len(jack_progress.status_all['names']) >= maxnames: dir_too = 1 else: dir_too = 0 maxnames = max(maxnames, len(jack_progress.status_all['names'])) if maxnames > 1: # undo dir renaming cwd = os.getcwd() if jack_freedb.dir_created and jack_utils.check_path(jack_freedb.dir_created, cwd) and dir_too: new_name, old_name = jack_progress.status_all['names'][-2:] jack_utils.rename_path(old_name, new_name) # this changes cwd! info("cwd now " + os.getcwd()) jack_functions.progress("all", "undo", "dir") else: maxnames = max(map(lambda x: len(x['names']), status.values())) # undo file renaming for i in todo: if maxnames < 2: break act_names = status[i[NUM]]['names'] if len(act_names) == maxnames: for j in (ext, '.wav'): new_name, old_name = act_names[-2:] new_name, old_name = new_name + j, old_name + j if not os.path.exists(old_name): if j == ext: print 'NOT renaming "' + old_name + '": it doesn\'t exist.' else: if os.path.exists(new_name): print 'NOT renaming "' + old_name + '" to "' + new_name + '" because dest. exists.' else: jack_functions.progress(i[NUM], "undo", "-") os.rename(old_name, new_name) else: info("nothing to do.") def what_todo(space, todo): #### check what is already there wavs_todo = [] mp3s_todo = [] remove_q = [] ext = jack_targets.targets[jack_helpers.helpers[cf['_encoder']]['target']]['file_extension'] for track in todo: wavs_todo.append(track) mp3s_todo.append(track) jack_encstuff.mp3s_ready = [] for track in todo: mp3 = track[NAME] + ext if os.path.exists(mp3): if cf['_overwrite']: space = space + jack_utils.filesize(mp3) remove_q.append(mp3) jack_status.enc_status[track[NUM]] = "will o/w file." elif not cf['_force'] and not jack_status.enc_status[track[NUM]]: space = space + jack_utils.filesize(mp3) remove_q.append(mp3) jack_status.enc_status[track[NUM]] = "no encoder run." # with vbr encoded files can't legally be too small # but to reduce confusion, the check is then removed: elif not cf['_vbr'] and jack_utils.filesize(mp3) <= jack_functions.tracksize(track)[ENC] * 0.99: # found by trial'n'err space = space + jack_utils.filesize(mp3) remove_q.append(mp3) jack_status.enc_status[track[NUM]] = "encoded file too small by " + jack_functions.pprint_i(jack_functions.tracksize(track)[ENC] - jack_utils.filesize(mp3)) + "." elif not cf['_vbr'] and jack_utils.filesize(mp3) >= jack_functions.tracksize(track)[ENC] * 1.05: # found by trial'n'err space = space + jack_utils.filesize(mp3) remove_q.append(mp3) jack_status.enc_status[track[NUM]] = "enc. file too large by " + jack_functions.pprint_i(jack_utils.filesize(mp3) - jack_functions.tracksize(track)[ENC]) + "." else: mp3s_todo.remove(track) jack_encstuff.mp3s_ready.append(track) else: if jack_status.enc_status[track[NUM]]: jack_status.enc_status[track[NUM]] = "[file lost-doing again]" jack_ripstuff.wavs_ready = [] for track in todo: wav = track[NAME] + ".wav" if os.path.exists(wav): if cf['_overwrite']: space = space + jack_utils.filesize(wav) remove_q.append(wav) jack_status.dae_status[track[NUM]] = "Existing WAV will be overwritten." elif jack_utils.filesize(wav) == jack_functions.tracksize(track)[WAV] and jack_status.dae_status[track[NUM]]: wavs_todo.remove(track) jack_ripstuff.wavs_ready.append(track) elif jack_utils.filesize(wav) == jack_functions.tracksize(track)[WAV]: space = space + jack_utils.filesize(wav) remove_q.append(wav) jack_status.dae_status[track[NUM]] = " ---- [Existing WAV not done by jack.]" if jack_status.enc_status[track[NUM]] == "[file lost-doing again]": jack_status.enc_status[track[NUM]] = "" else: space = space + jack_utils.filesize(wav) remove_q.append(wav) jack_status.dae_status[track[NUM]] = " ---- [Existing WAV was not complete.]" if jack_status.enc_status[track[NUM]] == "[file lost-doing again]": jack_status.enc_status[track[NUM]] = "" else: if jack_status.dae_status[track[NUM]]: if jack_status.enc_status[track[NUM]] == "[file lost-doing again]": jack_status.dae_status[track[NUM]] = " ---- [ both lost, doing again ]" jack_status.enc_status[track[NUM]] = "" elif cf['_keep_wavs'] or track not in jack_encstuff.mp3s_ready: jack_status.dae_status[track[NUM]] = " ---- [ WAV lost, doing again ]" if cf['_only_dae']: cf['_keep_wavs'] = 1 if not cf['_keep_wavs']: for track in todo: if track in jack_encstuff.mp3s_ready and track in wavs_todo: wavs_todo.remove(track) if cf['_reorder']: mp3s_todo.sort(jack_utils.cmp_toc) dae_queue = [] # This stores the tracks to rip enc_queue = [] # WAVs go here to get some codin' for track in wavs_todo: dae_queue.append(track) # copy track to dae + code in queue if track in mp3s_todo: mp3s_todo.remove(track) # remove mp3s which are not there yet if cf['_only_dae']: # if only_dae nothing is encoded _at_all_. mp3s_todo = [] # overwrite cached bitrates with those from argv if cf['bitrate']['history'][-1][0] == "argv": for i in wavs_todo: i[RATE] = cf['_bitrate'] for i in mp3s_todo: i[RATE] = cf['_bitrate'] return space, remove_q, wavs_todo, mp3s_todo, dae_queue, enc_queue # # # def print_todo(todo, wavs_todo, mp3s_todo): "print what needs to be done" for i in jack_ripstuff.all_tracks: print "%02i" % i[NUM], if jack_utils.has_track(todo, i[NUM]) >= 0: print "*", else: print "-", if i in wavs_todo: print ":DAE:", # FIXME! if jack_status.dae_status[i[NUM]] != "[simulated]": print jack_status.dae_status[i[NUM]], if not cf['_only_dae']: print ":ENC:", if jack_status.enc_status[i[NUM]] != "[simulated]": print jack_status.enc_status[i[NUM]], if i in mp3s_todo: print ":ENC:", if jack_status.enc_status[i[NUM]] != "[simulated]": print jack_status.enc_status[i[NUM]], print # overwrite cached bitrates from argv if cf['bitrate']['history'][-1][0] == "argv": for i in wavs_todo: i[RATE] = cf['_bitrate'] for i in mp3s_todo: i[RATE] = cf['_bitrate'] def check_space(space, wavs_todo, mp3s_todo): # check free space will_work = 1 freeable_space = 0 if cf['_keep_wavs']: space_needed = jack_functions.tracksize(wavs_todo)[BOTH] elif cf['_otf']: space_needed = jack_functions.tracksize(wavs_todo)[ENC] else: space_needed = jack_functions.tracksize(wavs_todo)[PEAK] if cf['_only_dae']: space_needed = jack_functions.tracksize(wavs_todo)[WAV] else: for i in mp3s_todo: if space + freeable_space>jack_functions.tracksize(i)[ENC]: if not cf['_keep_wavs']: freeable_space = freeable_space + jack_functions.tracksize(i)[WAV] - jack_functions.tracksize(i)[ENC] else: will_work = 0 # this is quite dirty space_needed = jack_functions.tracksize(i)[ENC] - space + freeable_space break if (space + freeable_space < space_needed or not will_work) and not cf['_dont_work']: error(("insufficient disk space (%sBytes needed), " + "try reorder or " * (not cf['_reorder']) + "free %sBytes.") % (jack_functions.pprint_i(space_needed - freeable_space, "%i %s"), jack_functions.pprint_i(space_needed - freeable_space - jack_ripstuff.raw_space, "%i %s"))) def check_cd(): if cf['_rip_from_device']: all_tracks_on_cd = jack_functions.gettoc(cf['_toc_prog']) if not cf['_force'] and not jack_utils.cmp_toc_cd(jack_ripstuff.all_tracks_orig, all_tracks_on_cd, what=(NUM, LEN)): error("you did not insert the right cd") def remove_files(remove_q): if cf['_silent_mode'] or cf['_dont_work']: print "remove these files before going on:" for i in remove_q: print i print "### . ###" if cf['_silent_mode']: sys.exit(3) else: print "/\\" * 40 for i in remove_q: print i x = raw_input("These files will be deleted, continue? ") + "x" if cf['_force']: info("(forced)") else: if string.upper(x[0]) != "Y": sys.exit(0) for i in remove_q: os.remove(i) jack-3.1.1+cvs20050801/jack_progress.py0000755000175000017500000000167110371403403015372 0ustar tbmtbm### jack_progress ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA status_all = {} # progress info common for all track jack-3.1.1+cvs20050801/jack_rc.py0000755000175000017500000001226110371403403014127 0ustar tbmtbm### jack_rc: read/write config file, a module for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import os import sys import string import types import jack_argv import jack_version from jack_globals import * # exported functions: # load # save def read(file): read_rc = [] try: f = open(file) except: return read_rc lineno = 0 while 1: x = f.readline() if not x: break opt = val = com = None lineno = lineno + 1 x = string.strip(x) x = string.split(x, "#", 1) if len(x) > 1: opt, com = x else: opt = x[0] if opt and com: opt = string.strip(opt) if opt: x = string.split(opt, ":", 1) if len(x) > 1: opt, val = x else: opt = x[0] else: opt = None read_rc.append([opt, val, com, lineno]) version = get_version(read_rc) if version != jack_version.prog_rcversion: warning("config file %s is of unknown version %s." % (file, `version`)) return read_rc def get_version(rc): if not rc: return None if len(rc[0]) != 4: return None opt, val, com, lineno = rc[0] if opt == None and val == None and lineno == 1: vers = com.strip().split(":", 1) if len(vers) != 2: return None if vers[0] != "jackrc-version": return None ver = int(vers[1]) return ver else: return None def load(cf, file): rc = read(expand(file)) rc_cf = {} for i in rc: if i[0] != None: if cf.has_key(i[0]): ret, val = jack_argv.parse_option(cf, i[0:2], 0, i[0], None, origin="rcfile") if ret != None: rc_cf[i[0]] = {'val': val} else: warning(file + ":%s: " % i[3] + val) else: warning(file + ":%s: unknown option `%s'" % (i[3], i[0])) return rc_cf def merge(old, new): old = old[:] new = new[:] append = [] remove = [] old.reverse() for i in range(len(new)): found = 0 for j in range(len(old)): if new[i][0] and new[i][0] == old[j][0]: old[j][:2] = new[i][:2] found = 1 break if not found: append.append(new[i][:2] + [None,]) else: if new[i][2] == 'toggle': remove.append(old[j]) for i in remove: if i[2] != None: x = old.index(i) old[x] = [None, None, old[x][2]] else: old.remove(i) old.reverse() return old + append def write(file, rc, rcfile_exists = True): f = open(file, "w") if not rcfile_exists: f.write("# jackrc-version:%d\n" % jack_version.prog_rcversion) for i in rc: if i[0]: f.write(i[0]) if i[1] != None: f.write(":" + i[1]) if i[2] != None: if i[0] or i[1]: f.write(" ") f.write("#" + i[2]) f.write("\n") def write_yes(x): if x: return "yes" else: return "no" def convert(cf): rc = [] for i in cf.keys(): if cf[i]['type'] == types.StringType: rc.append([i, cf[i]['val'], None]) elif cf[i]['type'] == types.FloatType: rc.append([i, `cf[i]['val']`, None]) elif cf[i]['type'] == types.IntType: rc.append([i, `cf[i]['val']`, None]) elif cf[i]['type'] == 'toggle': rc.append([i, write_yes(cf[i]['val']), 'toggle']) elif cf[i]['type'] == types.ListType: rc.append([i, `cf[i]['val']`, None]) else: error("don't know how to handle " + `cf[i]['type']`) return rc def save(file, cf): file = expand(file) rc_cf = {} for i in cf.keys(): if cf[i].has_key('save') and not cf[i]['save']: continue opt = cf[i] if opt['history'][-1][0] == "argv": rc_cf[i] = opt oldrc = read(file) argvrc = convert(rc_cf) newrc = merge(oldrc, argvrc) rcfile_exists = os.path.exists(file) try: write(file + ".tmp", newrc, rcfile_exists) except: error("can't write config file") if os.path.exists(file): os.rename(file, file + "~") os.rename(file + ".tmp", file) return len(rc_cf) jack-3.1.1+cvs20050801/jack_ripstuff.py0000755000175000017500000000562310371403403015371 0ustar tbmtbm### jack_ripstuff: container module for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import jack_freedb import locale from jack_globals import * all_tracks_orig = [] all_tracks_todo_sorted = [] all_tracks = [] wavs_ready = None printable_names = None # these are displayed for the track names max_name_len = None # max len of printable_names[] raw_space = None # free diskspace def gen_printable_names(track_names, todo): global printable_names global max_name_len printable_names=[] for i in range(CDDA_MAXTRACKS): printable_names.append("") if jack_freedb.names_available and cf['_show_names']: if cf['_various']: max_name_len = max(map(lambda x: len(track_names[x[NUM]][0] + " - " + track_names[x[NUM]][1]), todo)) else: max_name_len = max(map(lambda x: len(track_names[x[NUM]][1]), todo)) max_name_len = len("01 ") + max_name_len if cf['_show_time']: max_name_len = max_name_len + 6 else: max_name_len = len("01") if cf['_show_time']: max_name_len = max_name_len + len(" 01:23") for i in todo: if cf['_show_time']: len_tmp = i[LEN] / CDDA_BLOCKS_PER_SECOND len_tmp = ("%02i:%02i") % (len_tmp / 60, len_tmp % 60) if jack_freedb.names_available and cf['_show_names']: if cf['_show_time']: tmp = "%02i %5s " % (i[NUM], len_tmp) else: tmp = "%02i " % i[NUM] if cf['_various']: tmp = tmp + track_names[i[NUM]][0] + " - " + track_names[i[NUM]][1] else: tmp = tmp + track_names[i[NUM]][1] p_tmp = tmp.encode(locale.getpreferredencoding(), "replace") printable_names[i[NUM]] = p_tmp + "." * (max_name_len - len(tmp)) else: if cf['_show_time']: printable_names[i[NUM]] = ("%02i " % i[NUM]) + len_tmp + "." * (max_name_len - len(i[NAME]) - 6) else: printable_names[i[NUM]] = i[NAME] + "." * (max_name_len - len(i[NAME])) jack-3.1.1+cvs20050801/jack_status.py0000755000175000017500000000446210371403403015052 0ustar tbmtbm### jack_status: module which holds the ripping and encoding status for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import string from jack_globals import NUM, cf import jack_term import jack_ripstuff enc_status = {} # status messages are stored here enc_cache = {} # sometimes status messages are stored here dae_status = {} # status messages are stored here def init(todo): global enc_status, enc_cache, dae_status for i in todo: dae_status[i[NUM]] = "" enc_status[i[NUM]] = "" enc_cache[i[NUM]] = "" def extract(status): for i in status.keys(): if status[i]['dae']: dae_status[i] = status[i]['dae'] if status[i]['enc']: enc_status[i] = status[i]['enc'] def enc_stat_upd(num, string): global enc_status enc_status[num] = string jack_term.tmod.enc_stat_upd(num, string) def dae_stat_upd(num, string): global enc_status dae_status[num] = string jack_term.tmod.dae_stat_upd(num, string) def print_status(form = 'normal'): for i in jack_ripstuff.all_tracks_todo_sorted: if form != 'normal' or not jack_ripstuff.printable_names: print cf['_name'] % i[NUM] + ":", dae_status[i[NUM]], enc_status[i[NUM]] else: print jack_ripstuff.printable_names[i[NUM]] + ":", dae_status[i[NUM]], enc_status[i[NUM]] def get_2_line(buf, default="A failure occured"): tmp = string.split(buf, "\n") if len(tmp) >= 2: return string.strip(tmp[-2]) else: return default jack-3.1.1+cvs20050801/jack_t_curses.py0000755000175000017500000002541010371403403015352 0ustar tbmtbm### jack_t_curses: dumb terminal functions for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import termios import sys import signal import types import jack_status import jack_ripstuff import jack_display import jack_term import jack_globals import jack_version from jack_globals import * enabled = None try: from jack_curses import endwin, resizeterm, A_REVERSE, newwin, newpad, initscr, noecho, cbreak, echo, nocbreak except ImportError: warning("jack_curses module not found, trying normal curses...") try: from curses import endwin, A_REVERSE, newwin, newpad, initscr, noecho, cbreak, echo, nocbreak def resizeterm(y, x): pass except ImportError: print "curses module not found or too old, please install it (see README)" # screen objects stdscr = status_pad = usage_win = None # status pad geometry pad_x = pad_y = pad_start_y = pad_start_x = pad_end_y = pad_end_x = None pad_height = pad_width = None pad_disp_start_y = pad_disp_start_x = 0 # usage win geometry usage_win_y = usage_win_x = 0 usage_win_height, usage_win_width = 7, 49 # reserve lines for the copyright/help box splash_reserve = 0 if cf['_usage_win']: splash_reserve = usage_win_height curses_sighandler = None map_track_num = None # list track number -> line number extra_lines = None had_special = None def enable(): # Initialize curses global stdscr global status_pad global usage_win global curses_sighandler global map_track_num global enabled global pad_height, pad_width global had_special global extra_lines if enabled: return had_special = 0 extra_lines = 2 # top + bottom status lines if jack_display.discname: extra_lines = extra_lines + 1 stdscr = initscr() enabled = 1 jack_term.sig_winch_cache = signal.signal(signal.SIGWINCH, signal.SIG_IGN) # Turn off echoing of keys, and enter cbreak mode, # where no buffering is performed on keyboard input noecho() ; cbreak() # In keypad mode, escape sequences for special keys # (like the cursor keys) will be interpreted and # a special value like KEY_LEFT will be returned stdscr.keypad(1) stdscr.leaveok(0) # build the pad pad_height, pad_width = len(jack_ripstuff.all_tracks_todo_sorted), jack_ripstuff.max_name_len + 72 status_pad = newpad(pad_height, pad_width) usage_win = newwin(usage_win_height, usage_win_width, 0, 0) map_track_num = {} for i in range(len(jack_ripstuff.all_tracks_todo_sorted)): map_track_num[jack_ripstuff.all_tracks_todo_sorted[i][NUM]] = i sig_winch_handler(None, None) def disable(): global enabled if enabled: # Set everything back to normal stdscr.keypad(0) echo() ; nocbreak() # Terminate curses, back to normal screen endwin() # re-install previous sighandler #signal.signal(signal.SIGWINCH, jack_term.sig_winch_cache) signal.signal(signal.SIGWINCH, signal.SIG_IGN) enabled = 0 def sig_winch_handler(sig, frame): global staus_pad, stdscr, usage_win global pad_y, pad_x, pad_start_y, pad_start_x, pad_end_y, pad_end_x global usage_win_y, usage_win_x if not enabled: return signal.signal(signal.SIGWINCH, signal.SIG_IGN) if type(curses_sighandler) == types.FunctionType: curses_sighandler(sig, frame) jack_term.resize() old_y, old_x = stdscr.getmaxyx() resizeterm(jack_term.size_y, jack_term.size_x) pad_y, pad_x = pad_disp_start_y, pad_disp_start_x pad_start_y, pad_start_x = extra_lines - 1, 0 pad_end_y = min(extra_lines - 1 + pad_height, jack_term.size_y - 2 - splash_reserve) pad_end_x = min(jack_term.size_x, pad_width) - 1 pad_missing_y = max(pad_height - (jack_term.size_y - extra_lines - splash_reserve), 0) pad_missing_x = max(pad_width - jack_term.size_x, 0) if pad_missing_y >= pad_height: pad_start_y = 0 stdscr.clear() status_pad.clear() scroll_keys = "" if pad_disp_start_x: scroll_keys = scroll_keys + "h" else: scroll_keys = scroll_keys + " " if pad_missing_y and not pad_disp_start_y > pad_missing_y - 1: scroll_keys = scroll_keys + "j" else: scroll_keys = scroll_keys + " " if pad_disp_start_y: scroll_keys = scroll_keys + "k" else: scroll_keys = scroll_keys + " " if pad_missing_x and not pad_disp_start_x > pad_missing_x - 1: scroll_keys = scroll_keys + "l" else: scroll_keys = scroll_keys + " " if extra_lines < jack_term.size_y: if jack_display.discname: stdscr.addstr(0, 0, (jack_display.center_line(jack_display.options_string + " [" + scroll_keys + "]", fill = " ", width = jack_term.size_x))[:jack_term.size_x], A_REVERSE) stdscr.addstr(1, 0, jack_display.center_line(jack_display.discname, fill = "- ", fill_r = " -", width = jack_term.size_x)[:jack_term.size_x], A_REVERSE) else: stdscr.addstr(0, 0, (jack_display.options_string + " " * (jack_term.size_x - len(jack_display.options_string) - (0 + 4)) + scroll_keys)[:jack_term.size_x], A_REVERSE) if jack_display.special_line: spec_pos = 1 if jack_display.discname: spec_pos = 2 stdscr.addstr(spec_pos, 0, jack_display.center_line(jack_display.special_line, fill = " ", width = jack_term.size_x)[:jack_term.size_x], A_REVERSE) if jack_display.bottom_line: stdscr.addstr(jack_term.size_y - 1, 0, (jack_display.bottom_line + " " * (jack_term.size_x - len(jack_display.bottom_line) - 1 ))[:jack_term.size_x - 1], A_REVERSE) stdscr.refresh() usage_win_y, usage_win_x = jack_term.size_y - usage_win_height - 1, (jack_term.size_x - usage_win_width) / 2 if usage_win_y > extra_lines and usage_win_x > 0 and jack_term.size_y > extra_lines + 2 + usage_win_height and jack_term.size_x > usage_win_width: del usage_win usage_win = newwin(usage_win_height, usage_win_width, usage_win_y, usage_win_x) usage_win.box() usage_win.addstr(1, 2, "* * * " + jack_version.prog_name + " " + jack_version.prog_version + " " + jack_version.prog_copyright + " * * *") usage_win.addstr(2, 2, "use cursor keys or hjkl to scroll status info") usage_win.addstr(3, 2, "press P to disable/continue ripping,") usage_win.addstr(4, 2, " E to pause/continue all encoders or") usage_win.addstr(5, 2, " R to pause/continue all rippers.") usage_win.refresh() for i in jack_ripstuff.all_tracks_todo_sorted: dae_stat_upd(i[NUM], jack_status.dae_status[i[NUM]]) enc_stat_upd(i[NUM], jack_status.enc_status[i[NUM]]) if pad_start_y < pad_end_y: status_pad.refresh(pad_y, pad_x, pad_start_y, pad_start_x, pad_end_y, pad_end_x) signal.signal(signal.SIGWINCH, sig_winch_handler) #/ end of sig_winch_handler(sig, frame) /# def move_pad(cmd): global pad_disp_start_y, pad_disp_start_x, splash_reserve if cmd in ("j", 'KEY_DOWN') and pad_disp_start_y < pad_height - 1: pad_disp_start_y = pad_disp_start_y + 1 elif cmd in ("k", 'KEY_UP') and pad_disp_start_y > 0: pad_disp_start_y = pad_disp_start_y - 1 elif cmd in ("l", 'KEY_RIGHT') and pad_disp_start_x < pad_width - 1: pad_disp_start_x = pad_disp_start_x + 1 elif cmd in ("h", 'KEY_LEFT') and pad_disp_start_x > 0: pad_disp_start_x = pad_disp_start_x - 1 elif cmd in ("?"): if splash_reserve: splash_reserve = 0 else: splash_reserve = usage_win_height sig_winch_handler(None, None) def disp_bottom_line(bottom_line): stdscr.addstr(jack_term.size_y - 1, 0, (bottom_line + " " * (jack_term.size_x - len(bottom_line)))[:jack_term.size_x - 1], A_REVERSE) if pad_start_y < pad_end_y: status_pad.refresh(pad_y, pad_x, pad_start_y, pad_start_x, pad_end_y, pad_end_x) stdscr.refresh() def getkey(): return stdscr.getkey() def update(special_line, bottom_line): global had_special global extra_lines if special_line and not had_special: had_special = 1 extra_lines = extra_lines + 1 sig_winch_handler(None, None) elif had_special and not special_line: had_special = 0 extra_lines = extra_lines - 1 sig_winch_handler(None, None) if 1 < jack_term.size_y: disp_bottom_line(bottom_line) def enc_stat_upd(num, string): status_pad.addstr(map_track_num[num], jack_ripstuff.max_name_len + 40, " " + jack_status.enc_status[num]) status_pad.clrtoeol() def dae_stat_upd(num, string, reverse=-1): track = jack_ripstuff.all_tracks[num-1] if reverse >= 0: split_point = int(6.5 + reverse / 100.0 * 32) front = jack_ripstuff.printable_names[num] + ": " + jack_status.dae_status[num][:6] middle = jack_status.dae_status[num][6:split_point] end = jack_status.dae_status[num][split_point:] + " " + jack_status.enc_status[num] status_pad.addstr(map_track_num[num], 0, front) status_pad.addstr(map_track_num[num], len(front), middle, A_REVERSE) status_pad.addstr(map_track_num[num], len(front + middle), end) else: status_pad.addstr(map_track_num[num], 0, (jack_ripstuff.printable_names[num] + ": " + jack_status.dae_status[num] + " " + jack_status.enc_status[num])) dummy = """ if ripper == "cdparanoia" and track in dae_tracks or (track in enc_queue and track not in mp3s_done): status_pad.addstr(map_track_num[num], 0, jack_ripstuff.printable_names[num] + ": " + jack_status.dae_status[num][:7]) pos = find(jack_status.dae_status[num], ">") if pos < 7: pos = 37 status_pad.addstr(jack_status.dae_status[num][7:pos], A_REVERSE) status_pad.addstr(jack_status.dae_status[num][pos:]) else: status_pad.addstr(map_track_num[num], 0, jack_ripstuff.printable_names[num] + ": " + jack_status.dae_status[num] + " " + jack_status.enc_status[num]) """ status_pad.clrtoeol() jack-3.1.1+cvs20050801/jack_t_dumb.py0000755000175000017500000000402510371403403014774 0ustar tbmtbm### jack_t_dumb: dumb terminal functions for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import termios import sys import jack_display import jack_status import jack_ripstuff from jack_globals import NUM old_tc = None def init(): pass def enable(): global old_tc # set terminal attributes new = termios.tcgetattr(sys.stdin.fileno()) if old_tc == None: old_tc = new[:] new[3] = new[3] & ~termios.ECHO new[3] = new[3] & ~termios.ICANON termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN, new) del new def disable(): if not old_tc: return termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN, old_tc) def move_pad(cmd): pass def getkey(): return sys.stdin.read(1) def sig_winch_handler(sig, frame): pass def update(special_line, bottom_line): print print if special_line: print jack_display.center_line(special_line, fill = "#") print jack_display.options_string for i in jack_ripstuff.all_tracks_todo_sorted: print jack_ripstuff.printable_names[i[NUM]] + ": " + jack_status.dae_status[i[NUM]], jack_status.enc_status[i[NUM]] print bottom_line def enc_stat_upd(num, string): pass def dae_stat_upd(num, string): pass jack-3.1.1+cvs20050801/jack_tag.py0000755000175000017500000003152510371403403014302 0ustar tbmtbm### jack_tag: name information (ID3 among others) stuff for ### jack - tag audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2003 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import string import os, sys import locale import jack_functions import jack_ripstuff import jack_targets import jack_helpers import jack_freedb import jack_utils import jack_misc import jack_m3u from jack_init import ogg from jack_init import eyeD3 from jack_init import flac from jack_globals import * track_names = None locale_names = None genretxt = None a_artist = None a_title = None def tag(freedb_rename): global a_artist, a_title ext = jack_targets.targets[jack_helpers.helpers[cf['_encoder']]['target']]['file_extension'] if cf['_vbr'] and not cf['_only_dae']: total_length = 0 total_size = 0 for i in jack_ripstuff.all_tracks_todo_sorted: total_length = total_length + i[LEN] total_size = total_size + jack_utils.filesize(i[NAME] + ext) if cf['_set_id3tag'] and not jack_targets.targets[jack_helpers.helpers[cf['_encoder']]['target']]['can_posttag']: cf['_set_id3tag'] = 0 # maybe export? if jack_freedb.names_available: a_artist = track_names[0][0] # unicode a_title = track_names[0][1] # unicode p_artist = locale_names[0][0] # string p_title = locale_names[0][1] # string if cf['_set_id3tag'] or freedb_rename: jack_m3u.init() if len(track_names[0]) == 4: # use freedb year and genre data if available if cf['_id3_genre'] == -1: cf['_id3_genre'] = track_names[0][3] if cf['_id3_year'] == -1: cf['_id3_year'] = track_names[0][2] print "Tagging", for i in jack_ripstuff.all_tracks_todo_sorted: sys.stdout.write(".") ; sys.stdout.flush() mp3name = i[NAME] + ext wavname = i[NAME] + ".wav" t_artist = track_names[i[NUM]][0] t_name = track_names[i[NUM]][1] t_comm = "" if not cf['_only_dae'] and cf['_set_id3tag']: if len(t_name) > 30: if string.find(t_name, "(") != -1 and string.find(t_name, ")") != -1: # we only use the last comment t_comm = string.split(t_name, "(")[-1] if t_comm[-1] == ")": t_comm = t_comm[:-1] if t_comm[-1] == " ": t_comm = t_comm[:-1] t_name2 = string.replace(t_name, " (" + t_comm + ") ", "") t_name2 = string.replace(t_name2, " (" + t_comm + ")", "") t_name2 = string.replace(t_name2, "(" + t_comm + ") ", "") t_name2 = string.replace(t_name2, "(" + t_comm + ")", "") else: t_comm = "" if jack_helpers.helpers[cf['_encoder']]['target'] == "mp3": if cf['_write_id3v2']: mp3file = file(mp3name, "rw") tag = eyeD3.Tag() tag.link(mp3file) tag.header.setVersion(eyeD3.ID3_V2_4) tag.setTextEncoding(eyeD3.UTF_8_ENCODING) tag.setAlbum(a_title) tag.setTitle(t_name) tag.setTrackNum((i[NUM],len(jack_ripstuff.all_tracks_orig))) tag.setTitle(t_name) if t_artist: tag.setArtist(t_artist) else: tag.setArtist(a_artist) if cf['_id3_genre'] != -1: tag.setGenre("(%d)" % (cf['_id3_genre'])) if cf['_id3_year'] != -1: tag.setDate(cf['_id3_year']) tag.setPlayCount(int(i[LEN] * 1000.0 / 75 + 0.5)) tag.update() mp3file.close() if cf['_write_id3v1']: mp3file = file(mp3name, "rw") tag = eyeD3.Tag() tag.link(mp3file) tag.header.setVersion(eyeD3.ID3_V1_1) tag.setTextEncoding(eyeD3.LATIN1_ENCODING) old_genre = tag.getGenre() tag.setAlbum(a_title) if t_comm: tag.addComment(t_comm) tag.setTitle(t_name2) else: tag.setTitle(t_name) tag.setTrackNum((i[NUM],len(jack_ripstuff.all_tracks_orig))) tag.setTitle(t_name) if t_artist: tag.setArtist(t_artist) else: tag.setArtist(a_artist) if cf['_id3_genre'] != -1: tag.setGenre("(%d)" % (cf['_id3_genre'])) elif old_genre == None: tag.setGenre("(255)") # unknown if cf['_id3_year'] != -1: tag.setDate(cf['_id3_year']) try: tag.update() except UnicodeEncodeError: if not cf['_write_id3v2']: print print "Track %02d contains data not supported by id3v1; please use --write-id3v2" % i[NUM] mp3file.close() elif jack_helpers.helpers[cf['_encoder']]['target'] == "flac": if flac: chain = flac.metadata.Chain() chain.read(mp3name) it = flac.metadata.Iterator() it.init(chain) while 1: if it.get_block_type() == flac.metadata.VORBIS_COMMENT: block = it.get_block() vc = flac.metadata.VorbisComment(block) break if not it.next(): break if vc: vc.comments['ALBUM'] = a_title.encode("utf-8") vc.comments['TRACKNUMBER'] = `i[NUM]` vc.comments['TITLE'] = t_name.encode("utf-8") if t_artist: vc.comments['ARTIST'] = t_artist.encode("utf-8") else: vc.comments['ARTIST'] = a_artist.encode("utf-8") if cf['_id3_genre'] != -1: vc.comments['GENRE'] = id3genres[cf['_id3_genre']] if cf['_id3_year'] != -1: vc.comments['DATE'] = `cf['_id3_year']` chain.write(True, True) else: print print "Please install the pyflac module available at" print "http://www.sacredchao.net/quodlibet/wiki/Download" print "Without it, you'll not be able to tag FLAC tracks." elif jack_helpers.helpers[cf['_encoder']]['target'] == "ogg": vf = ogg.vorbis.VorbisFile(mp3name) oggi = vf.comment() oggi.clear() oggi.add_tag('ALBUM', a_title.encode("utf-8")) oggi.add_tag('TRACKNUMBER', `i[NUM]`) oggi.add_tag('TITLE', t_name.encode("utf-8")) if t_artist: oggi.add_tag('ARTIST', t_artist.encode("utf-8")) else: oggi.add_tag('ARTIST', a_artist.encode("utf-8")) if cf['_id3_genre'] != -1: oggi.add_tag('GENRE', id3genres[cf['_id3_genre']]) if cf['_id3_year'] != -1: oggi.add_tag('DATE', `cf['_id3_year']`) oggi.write_to(mp3name) if freedb_rename: if t_artist: # 'Various Artists' replacelist = (("%n", cf['_rename_num'] % i[NUM]), ("%a", t_artist), ("%t", t_name), ("%l", a_title), ("%y", `cf['_id3_year']`), ("%g", genretxt)) newname = jack_misc.multi_replace(cf['_rename_fmt_va'], replacelist) else: replacelist = (("%n", cf['_rename_num'] % i[NUM]), ("%a", a_artist), ("%t", t_name), ("%l", a_title)) newname = jack_misc.multi_replace(cf['_rename_fmt'], replacelist) exec("newname = newname" + cf['_char_filter']) for char_i in range(len(cf['_unusable_chars'])): newname = string.replace(newname, cf['_unusable_chars'][char_i], cf['_replacement_chars'][char_i]) try: i[NAME] = unicode(i[NAME], "utf-8") except UnicodeDecodeError: i[NAME] = unicode(i[NAME], "latin-1") if i[NAME] != newname: p_newname = newname.encode(locale.getpreferredencoding(), "replace") u_newname = newname newname = newname.encode(cf['_charset'], "replace") p_mp3name = i[NAME].encode(locale.getpreferredencoding(), "replace") + ext p_wavname = i[NAME].encode(locale.getpreferredencoding(), "replace") + ".wav" ok = 1 if os.path.exists(newname + ext): ok = 0 print 'NOT renaming "' + p_mp3name + '" to "' + p_newname + ext + '" because dest. exists.' if cf['_keep_wavs']: print 'NOT renaming "' + p_wavname + '" to "' + p_newname + ".wav" + '" because dest. exists.' elif cf['_keep_wavs'] and os.path.exists(newname + ".wav"): ok = 0 print 'NOT renaming "' + p_wavname + '" to "' + p_newname + ".wav" + '" because dest. exists.' print 'NOT renaming "' + p_mp3name + '" to "' + p_newname + ext + '" because WAV dest. exists.' if ok: if not cf['_only_dae']: try: os.rename(mp3name, newname + ext) except OSError: error('Cannot rename "%s" to "%s" (Filename is too long or has unusable characters)' % (p_mp3name, p_newname + ext)) jack_m3u.add(newname + ext) if cf['_keep_wavs']: os.rename(wavname, newname + ".wav") jack_m3u.add_wav(newname + ".wav") jack_functions.progress(i[NUM], "ren", "%s-->%s" % (i[NAME], u_newname)) elif cf['_silent_mode']: jack_functions.progress(i[NUM], "err", "while renaming track") print if not cf['_silent_mode']: if jack_freedb.names_available: print "Done with \"" + p_artist + " - " + p_title + "\"." else: print "All done.", if cf['_set_id3tag'] and cf['_id3_year'] != -1: print "Year: %4i" % cf['_id3_year'], if cf['_id3_genre'] == -1: print if cf['_set_id3tag'] and cf['_id3_genre'] != -1: if cf['_id3_genre'] <0 or cf['_id3_genre'] > len(id3genres): print "Genre: [unknown]" else: print "Genre: %s" % id3genres[cf['_id3_genre']] if cf['_vbr'] and not cf['_only_dae']: print "Avg. bitrate: %03.0fkbit" % ((total_size * 0.008) / (total_length / 75)) else: print if jack_m3u.m3u: os.environ["JACK_JUST_ENCODED"] = "\n".join(jack_m3u.m3u) if jack_m3u.wavm3u: os.environ["JACK_JUST_RIPPED"] = "\n".join(jack_m3u.wavm3u) jack_m3u.write() jack-3.1.1+cvs20050801/jack_targets.py0000644000175000017500000000424510371403403015174 0ustar tbmtbm### jack_targets.py: supportet target formats for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from jack_globals import * try: import ogg.vorbis has_ogg_vorbis = 1 if ogg.vorbis.__version__ < "0.5": has_ogg_vorbis = 0 debug("ogg.vorbis tagging disabled, version is too low.") except: has_ogg_vorbis = 0 debug("ogg.vorbis tagging disabled.") # supported target file fomats targets = { 'mp3': { 'can_cbr': 1, # can do CBR = constant bitrate 'can_vbr': 1, # can do VBR = variable bitrate 'can_id3': 1, # can set a ID3 tag 'can_pretag': 0, # can set tag info before encoding 'can_posttag': 1, # can set tag info after encoding 'file_extension': ".mp3" # the extension for this target format }, 'ogg': { 'can_cbr': 0, 'can_vbr': 1, 'can_id3': 1, 'can_pretag': 1, 'can_posttag': (1 & has_ogg_vorbis), 'file_extension': ".ogg" }, 'flac': { 'can_cbr': 0, 'can_vbr': 1, 'can_id3': 1, 'can_pretag': 0, 'can_posttag': 1, 'file_extension': ".flac" }, 'mpc': { 'can_cbr': 0, 'can_vbr': 1, 'can_id3': 0, 'can_pretag': 0, 'can_posttag': 0, 'file_extension': ".mpc" } } jack-3.1.1+cvs20050801/jack_term.py0000755000175000017500000001237710371403403014502 0ustar tbmtbm### jack_term: terminal specific stuff for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # terminal is one of dumb, curses import array import traceback import fcntl import sys import jack_ripstuff import jack_freedb from jack_globals import * # exported functions: #init #enable #disable # expected functions in tmod: #update #getkey #sig_winch_handler # exported variables: enabled = None initialized = None size_x, size_y = None, None orig_size_x, orig_size_y = None, None term_type = None sig_winch_cache = None # variables xtermset = None can_getsize = None geom_changed = None def init(arg_type="auto", arg_xtermset = 0): global initialized global geom_changed global tmod global xtermset global term_type global size_x, size_y global orig_size_x, orig_size_y size_x, size_y = None, None if initialized: return # import the terminal specific module if arg_type == "auto": try: import jack_t_curses as tmod term_type = "curses" except: import jack_t_dumb as tmod term_type = "dump" elif arg_type == "dumb": import jack_t_dumb as tmod term_type = "dump" elif arg_type == "curses": import jack_t_curses as tmod term_type = "curses" if not tmod: error("invalid terminal type `%s'" % term_type) xtermset = arg_xtermset initialized = 1 geom_changed = 0 size_x, size_y = 80, 24 # fallback value oldsize = getsize() if oldsize != (None, None): orig_size_x, orig_size_y = oldsize size_x, size_y = oldsize del oldsize def xtermset_enable(): global xtermset global geom_changed if xtermset: import os want_x = 80 - len("track_00") + jack_ripstuff.max_name_len want_y = len(jack_ripstuff.all_tracks_todo_sorted) + 3 if term_type == "curses": want_y = want_y - 1 if jack_freedb.names_available: want_y = want_y + 1 want_y = max(want_y, 7) if (size_x, size_y) != (want_x, want_y): try: os.system("xtermset -geom %dx%d" % (want_x, want_y)) geom_changed = 1 resize() except: warning("failed to call xtermset, is it really installed?") xtermset = 0 del want_x, want_y def xtermset_disable(): import os global geom_changed if xtermset and geom_changed: try: os.system("xtermset -restore -geom %dx%d" % (orig_size_x, orig_size_y)) geom_changed = 0 except: pass def getsize(): global can_getsize if can_getsize == 0: return None, None if can_getsize == None: try: from IOCTLS import TIOCGWINSZ except ImportError: try: from termios import TIOCGWINSZ except ImportError: # TIOCGWINSZ = 0x5413 # linux, ix86. Anyone else? can_getsize = 0 warning("""could not find a module which exports TIOCGWINSZ. This means I can't determine your terminal's geometry, so please don't resize it. Use Tools/scripts/h2py.py from the Python source distribution to convert /usr/include/asm/ioctls.h to IOCTLS.py and install it.""") return None, None try: # to get the size, we will have to do an ioctl which will return a # struct winsize { # unsigned short ws_row; # unsigned short ws_col; # unsigned short ws_xpixel; # unsigned short ws_ypixel; # }; # (according to _I386_TERMIOS_H, /usr/include/asm/termios.h) winsize = array.array("H") data = " " * (winsize.itemsize * 4) data = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, data) # unpack the data, I hope this is portable: winsize.fromstring(data) new_y, new_x, xpixel, ypixel = winsize.tolist() except: can_getsize = 0 return None, None return new_x, new_y def resize(): global size_x, size_y x, y = getsize() if (x, y) != (None, None): size_x, size_y = x, y def enable(): global enabled if not initialized: return if enabled: return xtermset_enable() tmod.enable() enabled = 1 def disable(): global enabled import os if not enabled or not initialized: return tmod.disable() xtermset_disable() enabled = 0 jack-3.1.1+cvs20050801/jack_utils.py0000755000175000017500000001452110371403403014664 0ustar tbmtbm### jack_utils: utility functions for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import sys import signal import types import os import stat import string import jack_functions import jack_globals import jack_misc import jack_term from jack_globals import * def all_paths(p): "return all path leading to and including p" if type(p) == types.StringType: p = split_dirname(p) all = [] x = "" for i in p: x = os.path.join(x, i) all.append(x) return all def check_path(p1, p2): "check if p1 and p2 are equal or sub/supersets" if type(p1) == types.StringType: p1 = split_dirname(p1) if type(p2) == types.StringType: p2 = split_dirname(p2) for i in p1, p2: if type(i) != types.ListType: error("invalid type for check_path" + `i`) if len(p1) > len(p2): # make sure p1 is shorter or as long as p2 p1, p2 = p2, p1 ok = 1 for i in range(1, len(p1) + 1): if p1[-i] != p2[-i]: ok = 0 return ok def rename_path(old, new): "this is complicated." cwd = os.getcwd() print cwd cwds = split_dirname(cwd) if type(old) == types.StringType: old = split_dirname(old) if type(new) == types.StringType: new = split_dirname(new) for i in old, new, cwds: if type(i) != types.ListType: error("invalid type for rename_path: " + `i`) # weed out empty dirs (which are technically illegal on freedb but exist) tmp = [] for i in new: if i: tmp.append(i) new = tmp del tmp for i in old: os.chdir(os.pardir) for i in new[:-1]: if not os.path.exists(i): try: os.mkdir(i) except OSError: error('Cannot create directory "%s" (Filename is too long or has unusable characters)' % i) if os.path.isdir(i): os.chdir(i) else: error("could not create or change to " + i + " from " + os.getcwd()) last_of_new = new[-1] if os.path.exists(last_of_new): error("destination directory already exists: " + last_of_new) try: os.rename(cwd, last_of_new) except OSError: error('Cannot rename "%s" to "%s" (Filename is too long or has unusable characters)' % (cwd, last_of_new)) os.chdir(last_of_new) # now remove empty "orphan" dirs old_dirs = all_paths(cwds) old_dirs.reverse() for i in old_dirs[:len(old)][1:]: try: os.rmdir(i) except OSError: pass def cmp_toc(x, y): "compare two track's length" x, y = x[LEN], y[LEN] if x > y: return 1 elif x == y: return 0 elif x < y: return -1 NUM, LEN, START, COPY, PRE, CH, RIP, RATE, NAME = range(9) def cmp_toc_cd(x, y, what=(NUM, LEN, START)): "compare the relevant parts of two TOCs" if len(x) == len(y): for i in range(len(x)): for j in what: if x[i][j] != y[i][j]: return 0 else: return 0 return 1 def filesize(name): return os.stat(name)[stat.ST_SIZE] def yes(what): if what.has_key('save') and what['save'] == 0: return "" if what['type'] == 'toggle': if what['val']: s = "yes" else: s = "no" elif what['type'] == types.StringType: s = "'%s'" % what['val'] else: s = str(what['val']) s = " [%s]" % s if what['history'][-1][0] == "global_rc": s = s + "*" if what.has_key('doc'): s = s + " +" return s def safe_float(number, message): try: return float(number) except ValueError: print message sys.exit(1) def unusable_charmap(x): for i in range(len(cf['_unusable_chars'])): x = string.replace(x, cf['_unusable_chars'][i], cf['_replacement_chars'][i]) return x def mkdirname(names, template): "generate mkdir-able directory name(s)" dirs = template.split(os.path.sep) dirs2 = [] for i in dirs: replace_list = (("%a", names[0][0].encode(cf['_charset'], "replace")), ("%l", names[0][1].encode(cf['_charset'], "replace")), ("%y", `cf['_id3_year']`), ("%g", cf['_id3_genre_txt'])) x = jack_misc.multi_replace(i, replace_list, unusable_charmap) exec("x = x" + cf['_char_filter']) dirs2.append(x) if cf['_append_year'] and len(`cf['_id3_year']`) == 4: # Y10K bug! dirs2[-1] = dirs2[-1] + jack_misc.multi_replace(cf['_append_year'], replace_list) name = "" for i in dirs2: name = os.path.join(name, i) return dirs2, name def split_dirname(name): "split path in components" names = [] while 1: base, sub = os.path.split(name) if not base or base == os.sep: names.append(os.path.join(base, sub)) break names.append(sub) name = base names.reverse() return names def split_path(path, num): "split given path in num parts" new_path = [] for i in range(1, num): base, end = os.path.split(path) path = base new_path.append(end) new_path.append(base) new_path.reverse() def ex_edit(file): editor = "/usr/bin/sensible-editor" if os.environ.has_key("EDITOR"): editor = os.environ['EDITOR'] print "invoking your editor,", editor, "..." os.system(string.split(editor)[0] + " " + file) def has_track(l, num): for i in range(len(l)): if l[i][NUM] == num: return i return -1.5 jack-3.1.1+cvs20050801/jack_version.py0000644000175000017500000000216010371403403015202 0ustar tbmtbm### jack_version: define program version and name for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 2002 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from string import split from sys import version prog_version = "3.1.1" prog_name = "jack" prog_rcversion = 31 prog_copyright = "(C)2004 Arne Zellentin" prog_devemail = "" py_version = split(version)[0] jack-3.1.1+cvs20050801/jack_workers.py0000755000175000017500000003204010371403403015214 0ustar tbmtbm### jack_workers: worker functions for ### jack - extract audio from a CD and encode it using 3rd party software ### Copyright (C) 1999-2004 Arne Zellentin ### This program is free software; you can redistribute it and/or modify ### it under the terms of the GNU General Public License as published by ### the Free Software Foundation; either version 2 of the License, or ### (at your option) any later version. ### This program is distributed in the hope that it will be useful, ### but WITHOUT ANY WARRANTY; without even the implied warranty of ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ### GNU General Public License for more details. ### You should have received a copy of the GNU General Public License ### along with this program; if not, write to the Free Software ### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import sndhdr import signal import string import posix import array import fcntl import wave import time import pty import sys import os import jack_functions import jack_ripstuff import jack_helpers import jack_targets import jack_utils import jack_tag from jack_globals import * from jack_helpers import helpers from jack_init import F_SETFL, O_NONBLOCK def default_signals(): signal.signal(signal.SIGTERM, signal.SIG_DFL) signal.signal(signal.SIGINT, signal.SIG_DFL) signal.signal(signal.SIGQUIT, signal.SIG_DFL) signal.signal(signal.SIGHUP, signal.SIG_DFL) signal.signal(signal.SIGWINCH, signal.SIG_DFL) def start_new_process(args, nice_value = 0): "start a new process in a pty and renice it" data = {} data['start_time'] = time.time() pid, master_fd = pty.fork() if pid == CHILD: default_signals() if nice_value: os.nice(nice_value) os.execvp(args[0], [a.encode(cf['_charset'], "replace") for a in args]) else: data['pid'] = pid if os.uname()[0] == "Linux": fcntl.fcntl(master_fd, F_SETFL, O_NONBLOCK) data['fd'] = master_fd data['file'] = os.fdopen(master_fd) data['cmd'] = args data['buf'] = "" data['otf'] = 0 data['percent'] = 0 data['elapsed'] = 0 return data def start_new_ripper(track, ripper): "start a new DAE process" helper = helpers[cf['_ripper']] cmd = string.split(helper['cmd']) args = [] for i in cmd: if i == "%n": args.append(`track[NUM]`) elif i == "%o": args.append(track[NAME].decode(cf['_charset'], "replace") + ".wav") elif i == "%d": args.append(cf['_cd_device']) elif i == "%D": args.append(cf['_gen_device']) else: args.append(i) data = start_new_process(args) data['type'] = "ripper" data['prog'] = cf['_ripper'] data['track'] = track return data def start_new_encoder(track, encoder): "start a new encoder process" helper = helpers[cf['_encoder']] if cf['_vbr']: cmd = string.split(helper['vbr-cmd']) else: cmd = string.split(helper['cmd']) args = [] for i in cmd: if i == "%r": args.append(`track[RATE] * helper['bitrate_factor']`) elif i == "%q": if helper.has_key('inverse-quality') and helper['inverse-quality']: quality = min(9, 10 - cf['_vbr_quality']) else: quality = cf['_vbr_quality'] args.append("%.3f" % quality) elif i == "%i": args.append(track[NAME].decode(cf['_charset'], "replace") + ".wav") elif i == "%o": args.append(track[NAME].decode(cf['_charset'], "replace") + jack_targets.targets[jack_helpers.helpers[cf['_encoder']]['target']]['file_extension']) else: if jack_targets.targets[helper['target']]['can_pretag']: if i == "%t": if jack_tag.track_names: args.append(jack_tag.track_names[track[NUM]][1]) else: args.append("") elif i == "%a": if jack_tag.track_names: if jack_tag.track_names[track[NUM]][0]: args.append(jack_tag.track_names[track[NUM]][0]) else: args.append(jack_tag.track_names[0][0]) else: args.append("") elif i == "%n": args.append(`track[NUM]`) elif i == "%l": if jack_tag.track_names: args.append(jack_tag.track_names[0][1]) else: args.append("") elif i == "%G": if cf['_id3_genre'] >= 0: args.append(cf['_id3_genre']) else: args.append('255') elif i == "%g": if cf['_id3_genre'] >= 0: args.append(jack_tag.genretxt) else: args.append('Unknown') elif i == "%y": if cf['_id3_year'] > 0: args.append(`cf['_id3_year']`) else: args.append('0') else: args.append(i) else: args.append(i) data = start_new_process(args, cf['_nice_value']) data['type'] = "encoder" data['prog'] = cf['_encoder'] data['track'] = track return data def start_new_otf(track, ripper, encoder): "start a new ripper/encoder pair for on-the-fly encoding" data = {} data['rip'] = {} data['enc'] = {} data['rip']['otf'] = 1 data['enc']['otf'] = 1 enc_in, rip_out = os.pipe() data['rip']['fd'], rip_err = os.pipe() data['enc']['fd'], enc_err = os.pipe() args = [] for i in string.split(helpers[ripper]['otf-cmd']): if i == "%n": args.append(`track[NUM]`) elif i == "%d": args.append(cf['_cd_device']) elif i == "%D": args.append(cf['_gen_device']) else: args.append(i) data['rip']['start_time'] = time.time() pid = os.fork() if pid == CHILD: default_signals() os.dup2(rip_out, STDOUT_FILENO) os.dup2(rip_err, STDERR_FILENO) os.close(rip_out) os.close(rip_err) os.execvp(args[0], args) # child won't see anything below... os.close(rip_out) os.close(rip_err) data['rip']['pid'] = pid data['rip']['cmd'] = helpers[cf['_ripper']]['otf-cmd'] data['rip']['buf'] = "" data['rip']['percent'] = 0 data['rip']['elapsed'] = 0 data['rip']['type'] = "ripper" data['rip']['prog'] = cf['_ripper'] data['rip']['track'] = track if cf['_vbr']: cmd = string.split(helpers[cf['_encoder']]['vbr-otf-cmd']) else: cmd = string.split(helpers[cf['_encoder']]['otf-cmd']) args = [] for i in cmd: if i == "%r": args.append(`track[RATE] * helpers[cf['_encoder']]['bitrate_factor']`) elif i == "%q": if helper.has_key('inverse-quality') and helper['inverse-quality']: quality = min(9, 10 - cf['_vbr_quality']) else: quality = cf['_vbr_quality'] args.append("%.3f" % quality) elif i == "%o": args.append(track[NAME].decode(cf['_charset'], "replace") + jack_targets.targets[jack_helpers.helpers[cf['_encoder']]['target']]['file_extension']) elif i == "%d": args.append(cf['_cd_device']) elif i == "%D": args.append(cf['_gen_device']) else: args.append(i) data['enc']['start_time'] = time.time() pid = os.fork() if pid == CHILD: default_signals() if cf['_nice_value']: os.nice(cf['_nice_value']) os.dup2(enc_in, STDIN_FILENO) os.dup2(enc_err, STDERR_FILENO) os.close(enc_in) os.close(enc_err) os.execvp(args[0], args) # child won't see anything below... os.close(enc_in) os.close(enc_err) data['enc']['pid'] = pid data['enc']['otf-pid'] = data['rip']['pid'] data['enc']['cmd'] = cmd data['enc']['buf'] = "" data['enc']['percent'] = 0 data['enc']['elapsed'] = 0 data['enc']['type'] = "encoder" data['enc']['prog'] = cf['_encoder'] data['enc']['track'] = track data['rip']['otf-pid'] = data['enc']['pid'] if os.uname()[0] == "Linux": fcntl.fcntl(data['rip']['fd'], F_SETFL, O_NONBLOCK) fcntl.fcntl(data['enc']['fd'], F_SETFL, O_NONBLOCK) data['rip']['file'] = os.fdopen(data['rip']['fd']) data['enc']['file'] = os.fdopen(data['enc']['fd']) return data def ripread(track, offset = 0): "rip one track from an image file." data = {} start_time = time.time() pid, master_fd = pty.fork() # this could also be done with a pipe, anyone? if pid == CHILD: #debug: #so=open("/tmp/stdout", "w") #sys.stdout = so #se=open("/tmp/stderr", "w+") #sys.stderr = se default_signals() # FIXME: all this offset stuff has to go, track 0 support has to come. print ":fAE: waiting for status report..." sys.stdout.flush() hdr = sndhdr.whathdr(cf['_image_file']) my_swap_byteorder = cf['_swap_byteorder'] my_offset = offset if hdr: ## I guess most people use cdparanoia 1- (instead of 0- if applicable) ## for image creation, so for a wav file use: image_offset = -offset else: if string.upper(cf['_image_file'])[-4:] == ".CDR": hdr = ('cdr', 44100, 2, -1, 16) # Unknown header, assuming cdr # ## assume old cdrdao which started at track 1, not at block 0 image_offset = -offset elif string.upper(cf['_image_file'])[-4:] == ".BIN": hdr = ('bin', 44100, 2, -1, 16) # Unknown header, assuming bin # ## assume new cdrdao which starts at block 0, byteorder is reversed. my_swap_byteorder = not my_swap_byteorder image_offset = 0 elif string.upper(cf['_image_file'])[-4:] == ".RAW": hdr = ('bin', 44100, 2, -1, 16) # Unknown header, assuming raw image_offset = 0 else: debug("unsupported image file " + cf['_image_file']) posix._exit(4) expected_filesize = jack_functions.tracksize(jack_ripstuff.all_tracks)[CDR] + CDDA_BLOCKSIZE * offset # ## WAVE header is 44 Bytes for normal PCM files... # if hdr[0] == 'wav': expected_filesize = expected_filesize + 44 if abs(jack_utils.filesize(cf['_image_file']) - expected_filesize) > CDDA_BLOCKSIZE: # we *do* allow a difference of one frame debug("image file size mismatch, aborted. %d != %d" % (jack_utils.filesize(cf['_image_file']), expected_filesize)) posix._exit(1) elif hdr[0] == 'wav' and (hdr[1], hdr[2], hdr[4]) != (44100, 2, 16): debug("unsupported WAV, need CDDA_fmt, aborted.") posix._exit(2) elif hdr[0] not in ('wav', 'cdr', 'bin'): debug("unsupported: " + hdr[0] + ", aborted.") posix._exit(3) else: f = open(cf['_image_file'], 'r') # ## set up output wav file: # wav = wave.open(track[NAME].decode(cf['_charset'], "replace") + ".wav", 'w') wav.setnchannels(2) wav.setsampwidth(2) wav.setframerate(44100) wav.setnframes(0) wav.setcomptype('NONE', 'not compressed') # ## calculate (and seek to) position in image file # track_start = (track[START] + image_offset) * CDDA_BLOCKSIZE if hdr[0] == 'wav': track_start = track_start + 44 f.seek(track_start) # ## copy / convert the stuff # for i in range(0, track[LEN]): buf = array.array("h") buf.fromfile(f, 1176) # CDDA_BLOCKSIZE / 2 if not my_swap_byteorder: # this is inverted as WAVE swabs them anyway. buf.byteswap() wav.writeframesraw(buf.tostring()) if i % 1000 == 0: print ":fAE: Block " + `i` + "/" + `track[LEN]` + (" (%2i%%)" % (i * 100 / track[LEN])) sys.stdout.flush() wav.close() f.close() stop_time = time.time() read_speed = track[LEN] / CDDA_BLOCKS_PER_SECOND / ( stop_time - start_time ) if read_speed < 100: print "[%2.0fx]" % read_speed, else: print "[99x]", if hdr[0] in ('bin', 'wav'): print "[ - read from image - ]" else: print "[cdr-WARNING, check byteorder !]" sys.stdout.flush() posix._exit(0) else: # we are not the child data['start_time'] = start_time data['pid'] = pid data['fd'] = master_fd data['file'] = os.fdopen(master_fd) data['cmd'] = "" data['buf'] = "" data['type'] = "image_reader" data['prog'] = "builtin" data['track'] = track data['percent'] = 0 data['otf'] = 0 data['elapsed'] = 0 return data jack-3.1.1+cvs20050801/setup.py0000644000175000017500000000246010371403403013670 0ustar tbmtbm#!/usr/bin/env python """Setup script for the jack module distribution.""" from distutils.core import setup, Extension setup( # Distribution meta-data name = "jack", version = "3.1.1", description = "A frontend for several cd-rippers and mp3 encoders", author = "Arne Zellentin", author_email = "zarne@users.sf.net", url = "http://www.home.unix-ag.org/arne/jack/", # Description of the modules and packages in the distribution ext_modules = [ Extension('jack_cursesmodule', ['cursesmodule/jack_cursesmodule.c'], libraries=["ncurses"], extra_compile_args=["-Wno-strict-prototypes"]) ], py_modules = [ 'jack_CDTime', 'jack_TOC', 'jack_TOCentry', 'jack_argv', 'jack_checkopts', 'jack_children', 'jack_config', 'jack_constants', 'jack_display', 'jack_encstuff', 'jack_freedb', 'jack_functions', 'jack_generic', 'jack_globals', 'jack_helpers', 'jack_init', 'jack_m3u', 'jack_main_loop', 'jack_misc', 'jack_mp3', 'jack_playorder', 'jack_plugins', 'jack_prepare', 'jack_progress', 'jack_rc', 'jack_ripstuff', 'jack_status', 'jack_t_curses', 'jack_t_dumb', 'jack_tag', 'jack_targets', 'jack_term', 'jack_utils', 'jack_version', 'jack_workers'] ) print "If you have installed the modules, copy jack to some place in your $PATH," print "like /usr/local/bin/." jack-3.1.1+cvs20050801/cursesmodule/0000755000175000017500000000000010371403417014673 5ustar tbmtbmjack-3.1.1+cvs20050801/cursesmodule/precompiled/0000755000175000017500000000000010371403417017176 5ustar tbmtbmjack-3.1.1+cvs20050801/cursesmodule/precompiled/Debian-Potato/0000755000175000017500000000000010371403417021624 5ustar tbmtbmjack-3.1.1+cvs20050801/cursesmodule/precompiled/Debian-Potato/cursesmodule.so0000755000175000017500000034246610371403403024716 0ustar tbmtbmELFđ_44—4 (ŸÍŸÍ Í Ý Ýl Œ dŘdčd訨ƒÁV›ZžcWŔ–i“ľykˇĽ”¸n~…ŹLŠ˝‘JŸz\dQĄI!ź+Ťż†TŞ‚Œ2As—°‹F™Xał„´-•Łp {˘heP]§¨¤ś.rDšŠ‰^œlşq‡­wƒťŚžąŻ#(%&B$:"KN/?O;58HUY*>m0=36_vEx'uob}gM)[Žt`R€Gˆ’,|Sj@<7fš94˜ 1C˛Ž”ŹźfčPL€T¨T PX „X đ_ ࡠ¸ Ý\ć`ćhćpćdč é éĽeŘz8/l­€CxŻ'.řÇ‚E57dčń˙×0iôy˝3üˇń˙GŸĺS}"Ź>ÚRRřP˝§śŸˆď`Č:`ľ.îŸÄł$86łŸBí.Â{§8ŕXsVŚB*h'c' ƒ/PX [âdŠ FiŔÝÍ'™E„ĎĐj”*Ë;Š"0œż‹b\Z]A'Š—'ˆÓÖ<$]Ś4af $`âl 1†ÇŞóI'ö'alMs÷EQó‹#Żƒ™ éń˙DÄ˙§ü“ŇéŸ!%Ykná˜HŸ+Ÿ/{°dfp3M˜ž* /Ş5ࡠÝďÔç‘g¸ŇTúżÎdö¤0×FmížĘˆ éń˙ pćń˙Tą›,éń˙”=ͧaĆS’0gž'oNĺ,v+ #™S‹LÁ~Ď‚V˘‹L’wŇHÎuˇL ˜ _DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__deregister_frame_info__register_frame_infoPyCursesVersion_Py_NoneStructPyErr_SetStringstrcpystrcatPyCurses_ConvertToChtypePyInt_TypePyInt_AsLongPyString_SizePyString_TypePyString_AsStringPyArg_Parsewtouchlnwredrawlnwinsdellnweraseis_wintouched_Py_TrueStruct_Py_ZeroStructwsyncupwsyncdownwcursyncupwclrtoeolwclrtobotwclearidcokimmedokPy_BuildValuewattr_onwattr_offclearokidlokkeypadleaveoknodelaynotimeoutscrolloksyncokmvwinmvderwinwmovewresizePyCursesWindow_Type_PyObject_NewstdscrdelwinfreePyTuple_TypePyTuple_SizePyExc_TypeErrorwaddchwaddnstrwbkgdwbkgdsetwborderPyErr_ClearwdelchderwinwechocharpechocharPyInt_FromLongwgetchkeynamePyString_FromStringwgetnstrwhlinewinschwinchwinnstrwinsnstris_linetouchedpnoutrefreshwnoutrefreshPyFile_TypePyFile_AsFileputwinprefreshwrefreshwsetscrregsubpadsubwinwscrlPy_FindMethodPyType_Typebeepdef_prog_modedef_shell_modedoupdateendwinflashnocbreaknoechononlnorawreset_prog_modereset_shell_moderesettysavettyresizetermcbreakechonlrawbaudratetermattrstermnamelongnamecan_change_colorhas_colorshas_ichas_ilisendwinfilterflushinpnoqiflushcolor_contentcurs_setdelay_outputerasecharnewscrgetwinhalfdelayhas_keyinit_colorinit_pairinitscrLINESPyDict_SetItemStringCOLSintrflushkillcharmetanewpadnewwinpair_contentputpqiflushstart_colorCOLORSCOLOR_PAIRSunctrlungetchuse_envinitcursesPy_InitModule4PyModule_GetDictacs_mapstrncmpmallocPyErr_OccurredPy_FatalErrorlibncurses.so.5libc.so.6___brk_addr__curbrk__environatexit_etext_edata__bss_start_endGLIBC_2.0Qii  Ń`)×`)é`ď`ô`7 aŔaa…$a)a7Ea˜PaĄ[aœga-…akŚaŽa˘Äaęa bb˘$bJb fbnb˘}b”b4˛bşb˘ÉbŮbdöbţb˘ ccC>cFc˘Ucecd‚cŠc˘Şc%łc šc Ác1Çc1Úcâc˘÷cŠüc)d)dd˘3d(8d)>d)RdZd˘pd)vd)Žd–d˘Źd)˛d)ĆdÎd˘ădGčd)îd)e e˘eś$e)*e)>eFe˘[eb`e)fe)~e†e˘›eŤ e)Śe)ÂeĘe˘äeTée)ďe) ff˘,f~1f)7f)NfVf˘Šff5˘fŞf˘ćfëf5ţfg˘CgHg5Zgbg˘•gšg5Žgśg˘ĹgŘg;úgh˘h$hŽFhNh˘]hŠh’h˘Ąh´h9ÖhŢh˘íhiV"i*i˘9iLicrizi˘‰iœi‘ÂiĘi˘Ůiěi°jj˘)juƒQu6dujuqou7{uŤu€śuˆŢuäu˘v v˘v"vq>v*Yv_vdv7ˆv€“vˆ˝vĚvŇv˘čvűve wwqw70w@w=JwZw˝vw~w˘–wšw€Äwˆëwńw˘ xƒ x“4x:xq?x7Lxmx€xxˆœx˘x˘žxƒŃx“äxęxqďx7y< ymyy5@y€Kyˆ›yĄy˘ÄyĘy˘ěyƒzz˘=zƒ]zgtzzzqz7˜zmĂz€Îzˆ{{˘0{6{˘d{j{˘‚{ƒ¨{Ž{˘Ć{ƒŃ{ç{eö{ü{q|7|)|–7|j|€u|ˆŤ|ş|Ŕ|˘â|ü|}˘}+}e:}@}qE}7b}ƒ|}‡}ą}€ź}ˆä}ę}˘ ~ƒ ~4~:~q?~7L~p~€{~ˆË~Ń~˘ô~ú~˘ƒIO˘mƒS¤ŞqŻ7Čmý€€ˆH€N€˘m€s€˘•€›€˘ź€€˘ä€ę€qď€7/ƒJŽdŽ‚š€Äˆ ‚‚˘5‚;‚˘d‚j‚˘‚•‚˘´‚ş‚qż‚7˙‚ƒƒŽ6ƒŽTƒvƒ~ƒ˘ƒ?˛ƒ¸ƒq˝ƒ7ʃ Ѓ ׃1݃1„€„ˆG„M„˘\„y„,†„Œ„‘„7›„Ą„˘°„ť„—ę„ň„˘…o ……ž(…D;…A…qF…7_…g…˘v…Š…4ƅ€Ń…ˆ† †˘†9†¸F†L†Q†7[†a†˘p†{†\Ť†ł†˘Â†ֆ§‡‡˘6‡AQ‡Hl‡r‡w‡7•‡€ ‡ˆČ‡ۇᇢđ‡ţ‡ˆˆqˆ7Aˆ€Lˆˆyˆˆ˘Žˆڈʈ˘ťˆ̈ äˆęˆqďˆ7‰€"‰ˆl‰r‰˘‰–‰˘Ä‰ʉ˘â‰ƒŠŠ˘&Šƒ1ŠGŠeVŠ\ŠqaŠ7tЉЖ—ŠźŠÁŠ@Њۊ㊢ňŠ÷Ѝ‹ ‹‹7$‹/‹7‹˘F‹K‹ź[‹a‹f‹7x‹ƒ‹‹‹˘š‹Ÿ‹F´‹ş‹ż‹7Ћۋ㋢ň‹÷‹8Œ ŒŒ7$Œ/Œ7Œ˘FŒKŒ3[ŒaŒfŒ7xŒƒŒ‹Œ˘šŒŸŒz´ŒşŒżŒ7ЌیăŒ˘ňŒ÷ŒP 7$/7˘FKn[af7xƒ‹˘šŸa´şż7Ѝۍ㍢ň÷ŞŽ ŽŽ7$Ž/Ž7Ž˘FŽKŽL[ŽaŽfŽ7xŽƒŽ‹Ž˘šŽŸŽZ´ŽşŽżŽ7Ўێ㎢ňŽ÷Ž_ 7$/7˘FKl[af7xˆ˘)ĽłtƏ̏я7ďú€"ˆHM][a˘v{]…АP𐠐qĽ7ÐΐԐ琀ňˆ‘‘K+‘1‘˘F‘K‘KU‘Z‘nj‘p‘qu‘7“‘ž‘¤‘ˇ‘€Â‘ˆč‘í‘Jű‘’˘’’J%’*’a:’@’qE’7c’n’t’‡’€’’ˆ¸’˝’Ë’ђ˘ć’뒁ő’ú’Ş ““q“7(“3“;“˘J“ŻP“Z“`“e“7x“ƒ“‹“˘š“! “Ş“°“ľ“7ȓӓۓ˘ę“$đ“mú“””7”#”+”˘:”´@”mJ”P”U”7h”s”y”~”7Š”’”˘˘”WŤ” ą” ¸”1ž”1̔הݔâ”7ô”ü”˘•• • '•1-•1<•G•M•R•7d•l•˘•‡Š• • —•1•1Ź•ˇ•˝••7ԕܕ˘ń•žú• – –1 –1–'–-–2–7D–L–˘a–Œj– p– w–1}–1Œ–—–Ÿ–˘Ť–i°–)ś–)Ėʖϖ7ŕ–ë–ó–˘˙–™—) —)———70—;—C—˘O—'T—)Z—)d—j—o—7„——š—Ľ—ˇ—€Â—ˆŇ—ؗqč—î—˘˜‚"˜(˜-˜7E˜J˜5`˜k˜q˜v˜7‚˜˜š˜€Ľ˜ˆľ˜ť˜qŔ˜7ΘԘ˘ę˜™™™'™€2™ˆB™H™qM™7]™c™˘y™’Š™”™°™ť™Á™ƙ7י€â™ˆň™ř™qý™7 šš˘ š+š#Pš[šcš˘ošI~šmˆšŽš“š7¤šݚľšşš7ÚΚ˘řš­›$›54›?›M›U›˘f›op›v›qˆ›žŽ›^Лݛ´›7țӛٛ盀ň›ˆœœ˘4œ:œq?œ7KœXœstœœ…œŠœ7šœ˘œ˘¸œ"Áœ ǜ ќ1ל1ěœ÷œýœ'€2ˆbh˘{q†7”­̝םݝâ7ňý ž€žˆ%ž+žq0ž7FžLž˘[žrž:”žœž˘˛žžžĂž\̞Öžyĺžëžđž7ŸŸşŸŸ%Ÿ*Ÿ2LŸŹQŸ\ŸbŸgŸ2 ŸŤŸąŸžŸ€ÉŸˆďŸőŸ˘  q 7$ 3 pP [ a f 7x € ˘— <Ś Ź mž Ć ˘Ň ąá mř Ą ĄĄ€"ĄˆFĄLĄ˘dĄjĄqoĄ7{Ą‰ĄŽĄ†¨ĄłĄÉĄŃĄ˘ćĄU˘ ˘˘7$˘/˘?˘€J˘ˆy˘˘˘˜˘Uľ˘ť˘˘Ó˘uä˘ę˘qŁ ŁŁ7(Ł3ŁBŁMŁ]Ł€hŁˆ‡ŁŁ˘¤ŁŞŁqÁŁťÚŁߣ5éŁďŁôŁ7 ¤¤¤%¤0¤6¤G¤€R¤ˆv¤|¤˘”¤š¤qŸ¤7°¤ʤҤ˘á¤ě¤„Ľ"Ľ(Ľ8Ľ€CĽˆjĽpĽ˘‚Ľ›‰Ľ'ŽĽ)”Ľ)¤ĽŞĽqŻĽ7ȼӼټ缀ňĽˆŚŚq Ś7Ś$Ś˘4Ś­QŚ­dŚ­iŚƒnŚ)tŚ)‰Ś”Ś¤ŚŹŚ˘źŚ/ËŚŘŚ•ÝŚčŚîŚóŚ2§[§%§+§0§2K§)Q§)[§a§f§7|§‡§§›§٧˘ş§˜Ĺ§ĄŇ§-ܧâ§qç§7ő§k¨X ¨m¨'¨-¨;¨C¨˘Z¨˜e¨Ąr¨-|¨‚¨q‡¨7•¨kٍʍ}ȨÓ¨٨稀ň¨ˆŠŠ˘4Š:Šq?Š7PŠ0UŠ)[Š)zŠŠ„ŠBŠ{˜Š ŠĽŠmŞŠśŠżŠ2ČŠQÍŠmŰŠäŠ2íŠöŠ2ލ Ş&Ş,Ş1Ş2@ލEŞKŞQŞVŞ2eލjŞpŞvŞ{Ş2ŠŞŞ•ޛޠŞ2ŻŞ´ŞşŞŔŞĹŞ2ÔŞŮŞߪĺŞęŞ2ůލţŞŤ ŤŤ2Ť#Ť)Ť/Ť4Ť2CŤHŤNŤTŤYŤ2hŤmŤsŤyŤ~Ť2Ť’Ť˜ŤžŤŁŤ2˛ŤˇŤ˝ŤĂŤČŤ2׍ÜŤâŤčŤíŤ2üŤŹŹ ŹŹ2!Ź&Ź,Ź2Ź7Ź2FŹKŹQŹWŹ\Ź2kŹpŹvŹ|ʁŹ2Ź•Ź›ŹĄŹŚŹ2ľŹşŹŔŹĆŹËŹ2ÚŹßŹĺŹëŹđŹ2˙Ź­ ­­­2$­)­/­5­:­2I­N­T­Z­_­2n­s­y­­„­2“­˜­ž­¤­Š­2¸­˝­Ă­É­έ2Ý­â­č­î­ó­2ŽŽ ŽŽŽ2'Ž,Ž2Ž8Ž=Ž2LŽQŽWŽ]ŽbŽ2qŽvŽ|ނއŽ2–Ž›ŽĄŽ§ŽŹŽ2ťŽŔŽĆŽĚŽŃŽ2஍ĺŽëŽńŽöŽ2Ż ŻŻŻŻ2*Ż/Ż5Ż;Ż@Ż2OŻTŻZŻ`ŻeŻ2tŻyŻŻ…ŻŠŻ2™ŻžŻ¤ŻŞŻŻŻ2žŻĂŻÉŻĎŻÔŻ2㯍čŻîŻôŻůŻ2° °°°°21°7°=°B°2R°X°^°c°2v°|°‚°‡°2š° °ڰŤ°2ž°İʰϰ2â°č°î°ó°2ą ąąą2*ą0ą6ą;ą2NąTąZą_ą2rąxą~ąƒą2–ąœą˘ą§ą2şąŔąĆąËą2Ţąäąęąďą2˛˛˛˛2&˛,˛2˛7˛2J˛P˛V˛[˛2n˛t˛z˛˛2’˛˜˛ž˛ٞ2ś˛ź˛²Dz2Ú˛ŕ˛ć˛ë˛2ű˛łł ł2ł%ł+ł0ł2CłIłOłTł2głmłsłxł2‹ł‘ł—łœł2ŻłľłťłŔł2ӳٳ߳äł2÷łýł´´2´!´'´,´2?´E´K´P´2c´i´o´t´2‡´´“´˜´2Ť´ą´ˇ´ź´2Ď´Ő´Ű´ŕ´2ó´ů´˙´ľ2ľľ#ľ(ľ28ľ>ľDľIľ2Yľ_ľeľjľ2zľ€ľ†ľ‹ľ2›ľĄľ§ľŹľ2źľÂľČľÍľ2Ýľăľéľîľ2ţľś śś2ś%ś+ś0ś2Hś<cś}śƒśvĄśRÝśčś2řśĽˇ"ˇ(ˇ-ˇ2@ˇFˇLˇQˇ2Yˇ>eˇjˇŠ ÝŔÝÄÝČÝÔÝŘÝäÝčÝôÝřÝŢŢŢŢ$Ţ(Ţ4Ţ8ŢDŢHŢTŢXŢdŢhŢtŢxŢ„ŢˆŢ”Ţ˜Ţ¤Ţ¨Ţ´Ţ¸ŢÄŢČŢÔŢŘŢäŢčŢôŢřŢßßßß$ß(ß4ß8ßDßHßTßXßdßhßtßx߄߈ߔߘߤߨߴ߸ßÄßČßÔßŘßäßčßôßřßŕŕŕŕ$ŕ(ŕ4ŕ8ŕDŕHŕTŕXŕdŕhŕtŕxŕ„ŕˆŕ”ŕ˜ŕ¤ŕ¨ŕ´ŕ¸ŕÄŕČŕÔŕŘŕäŕčŕôŕřŕáááá$á(á4á8áDáHáTáXádáhátáxá„áˆá”á˜á¤á¨á´á¸áÄáČáÔáŘáäáčáôářáââââ$â(â4â8âdâľlâxâ€âĚâĐâÜâŕâěâđâüâă ăăă ă,ă0ă<ă@ăLăPă\ă`ălăpă|ă€ăŒăăœă ăŹă°ăźăŔăĚăĐăÜăŕăěăđăüăä äää ä,ä0ä<ä@äLäPä\ä`äläpä|ä€äŒääœä äŹä°äźäŔäĚäĐäÜäŕäěäđäüäĺ ĺĺĺ ĺ,ĺ0ĺ<ĺ@ĺLĺPĺ\ĺ`ĺlĺpĺ|ĺ€ĺŒĺĺœĺ ĺŹĺ°ĺźĺŔĺĚĺĐĺÜĺŕĺěĺđĺüĺć ććć ć,ć0ć<ć@ćXč.\čNTčY`č‰Pčż|ć€ć„ćˆćŒć!ć"”ć#˜ć$œć% ć'¤ć(¨ć*Źć,°ć.´ć/¸ć0źć3Ŕć4Äć6Čć8Ěć9Đć:Ôć;Řć<Üć=ŕć?äćAčćCěćDđćFôćGřćHüćIçJçKçL çPçRçSçTçU çV$çW(çX,çY0çZ4ç\8ç]<ç^@ç_Dç`HçaLçbPçcTçdXçg\çh`çidçlhçnlçppçrtçsxçt|çu€çv„çwˆçyŒçzç|”ç}˜ç~œç ç¤ç‚¨çƒŹç„°ç…´ç†¸ç‡źç‹ŔçŒÄçŽČçĚç‘Đç’Ôç“Řç–Üç—ŕç™äçščç›ěçŸđç ôçĽřç§üç¨čŠčŞčŤ čŽčŻč°čąč˛ čł$č´(čś,čˇ0č¸4čš8čť<čź@č˝DčžHčżLčŔU‰ĺƒěSč[ĂŽƒťŕtčSvč÷č_[ÉĂ˙ł˙Ł˙Ł héŕ˙˙˙˙ŁhéĐ˙˙˙˙ŁhéŔ˙˙˙˙Łhé°˙˙˙˙Łh é ˙˙˙˙Ł h(é˙˙˙˙Ł$h0é€˙˙˙˙Ł(h8ép˙˙˙˙Ł,h@é`˙˙˙˙Ł0hHéP˙˙˙˙Ł4hPé@˙˙˙˙Ł8hXé0˙˙˙˙Ł<h`é ˙˙˙˙Ł@hhé˙˙˙˙ŁDhpé˙˙˙˙ŁHhxéđţ˙˙˙ŁLh€éŕţ˙˙˙ŁPhˆéĐţ˙˙˙ŁThéŔţ˙˙˙ŁXh˜é°ţ˙˙˙Ł\h é ţ˙˙˙Ł`h¨éţ˙˙˙Łdh°é€ţ˙˙˙Łhh¸épţ˙˙˙ŁlhŔé`ţ˙˙˙ŁphČéPţ˙˙˙ŁthĐé@ţ˙˙˙ŁxhŘé0ţ˙˙˙Ł|hŕé ţ˙˙˙Ł€hčéţ˙˙˙Ł„hđéţ˙˙˙وhřéđý˙˙˙ٌhéŕý˙˙˙ِhéĐý˙˙˙Ł”héŔý˙˙˙٘hé°ý˙˙˙ٜh é ý˙˙˙Ł h(éý˙˙˙٤h0é€ý˙˙˙ٍh8épý˙˙˙ŁŹh@é`ý˙˙˙ٰhHéPý˙˙˙Ł´hPé@ý˙˙˙ُhXé0ý˙˙˙Łźh`é ý˙˙˙ŁŔhhéý˙˙˙ŁÄhpéý˙˙˙ŁČhxéđü˙˙˙ŁĚh€éŕü˙˙˙ŁĐhˆéĐü˙˙˙ŁÔhéŔü˙˙˙ŁŘh˜é°ü˙˙˙ŁÜh é ü˙˙˙Łŕh¨éü˙˙˙Łäh°é€ü˙˙˙Łčh¸épü˙˙˙ŁěhŔé`ü˙˙˙ŁđhČéPü˙˙˙ŁôhĐé@ü˙˙˙ŁřhŘé0ü˙˙˙Łühŕé ü˙˙˙Łhčéü˙˙˙Łhđéü˙˙˙Łhřéđű˙˙˙Ł héŕű˙˙˙ŁhéĐű˙˙˙ŁhéŔű˙˙˙Łhé°ű˙˙˙Łh é ű˙˙˙Ł h(éű˙˙˙Ł$h0é€ű˙˙˙Ł(h8épű˙˙˙Ł,h@é`ű˙˙˙Ł0hHéPű˙˙˙Ł4hPé@ű˙˙˙Ł8hXé0ű˙˙˙Ł<h`é ű˙˙˙Ł@hhéű˙˙˙ŁDhpéű˙˙˙ŁHhxéđú˙˙˙ŁLh€éŕú˙˙˙ŁPhˆéĐú˙˙˙ŁThéŔú˙˙˙ŁXh˜é°ú˙˙˙Ł\h é ú˙˙˙Ł`h¨éú˙˙˙Łdh°é€ú˙˙˙Łhh¸épú˙˙˙ŁlhŔé`ú˙˙˙ŁphČéPú˙˙˙ŁthĐé@ú˙˙˙ŁxhŘé0ú˙˙˙Ł|hŕé ú˙˙˙Ł€hčéú˙˙˙Ł„hđéú˙˙˙وhřéđů˙˙˙ٌhéŕů˙˙˙ِhéĐů˙˙˙Ł”héŔů˙˙˙٘hé°ů˙˙˙ٜh é ů˙˙˙Ł h(éů˙˙˙٤h0é€ů˙˙˙ٍh8épů˙˙˙ŁŹh@é`ů˙˙˙ٰhHéPů˙˙˙Ł´hPé@ů˙˙˙ُhXé0ů˙˙˙Łźh`é ů˙˙˙ŁŔhhéů˙˙˙ŁÄhpéů˙˙˙ŁČhxéđř˙˙˙ŁĚh€éŕř˙˙˙ŁĐhˆéĐř˙˙˙ŁÔhéŔř˙˙˙ŁŘh˜é°ř˙˙˙ŁÜh é ř˙˙U‰ĺƒěSč[Ăt†ƒť4÷˙˙uDë‰ö‹ƒ0÷˙˙P‰“0÷˙˙‹˙Ћƒ0÷˙˙ƒ8u⃝ätƒÄôƒě˙˙˙Pčű˙˙ǃ4÷˙˙‹]čÉÍvU‰ĺƒěSč[Ă †[ÉÉöU‰ĺƒěSč[Ăô…ƒťčtƒÄřƒœPƒě˙˙˙PčÂř˙˙‹]čÉÐU‰ĺƒěSč[Ăź…[ÉАU‰ĺƒětS‹E ƒ}˙t¸˙ëRv…ŔuƒÄř˙5ÄÝ˙5$éčü˙˙˙ë3śƒÄřP]œSčü˙˙˙ƒÄƒÄřhA¸Sčü˙˙˙ƒÄřS˙5$éčü˙˙˙1Ŕ‹]ˆÉĂU‰ĺƒěVS‹]‹u {u ƒÄôSčü˙˙˙ë6ƒÄôSčü˙˙˙‰ÂƒÄ{”Ŕƒú”Â!Шu1Ŕë‰öƒÄôSčü˙˙˙ž‰¸eč[^ÉÉöU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu1Ŕë:vƒÄřhR¸j‹E‹P…Ňt żB@ë t&¸˙˙˙˙PjRčü˙˙˙ƒÄPčÉţ˙˙ÉÍvU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu1Ŕë:vƒÄřh]¸j‹E‹P…Ňt żB@ë t&¸˙˙˙˙PjRčü˙˙˙ƒÄPčiţ˙˙ÉÍvU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt*ƒÄřhf¸ƒÄü‹E‹PżB@PjRčü˙˙˙ƒÄPčţ˙˙ë1ŔÉÐU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt#ƒÄřhp¸ƒÄřj‹E˙pčü˙˙˙ƒÄPčÚý˙˙ë1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt'ƒÄřhz¸ƒÄô‹E˙pčü˙˙˙ƒÄPč˜ý˙˙덶1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt#ƒÄřh¸ƒÄřj˙‹E˙pčü˙˙˙ƒÄPčNý˙˙ë1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu 1Ŕë2´&ƒÄô‹E˙pčü˙˙˙„Ŕt¸˙ë ¸˙ÉÍvU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…ŔtƒÄô‹E˙pčü˙˙˙¸˙ë1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…ŔtƒÄô‹E˙pčü˙˙˙¸˙ë1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙…Ŕt‹E‹@Ç@¸˙ët&1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙…Ŕt‹E‹@Ç@¸˙ë1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…ŔtƒÄô‹E˙pčü˙˙˙¸˙ë1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…ŔtƒÄô‹E˙pčü˙˙˙¸˙ë1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…ŔtƒÄô‹E˙pčü˙˙˙¸˙ët&1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…ŔtƒÄô‹E˙pčü˙˙˙¸˙ët&1ŔÉĂU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt ƒÄřśEüP‹E˙pčü˙˙˙¸˙ë1ŔÉÍvU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt#ƒÄřśEüP‹E˙pčü˙˙˙¸˙ëv1ŔÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu1Ŕë.‹E‹@š˙˙˙˙…Ŕtżş˙˙˙˙…ŔtżPƒÄüRQhĄ¸čü˙˙˙ÉÍvU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu 1Ŕë6´&‹E‹@š˙˙˙˙…ŔtżHş˙˙˙˙…ŔtżP ƒÄüRQhĄ¸čü˙˙˙ÉÍvU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu1Ŕë7‹E‹P…Ňt żBHëš˙˙˙˙…ŇtżB@ë¸˙˙˙˙ƒÄüPQhĄ¸čü˙˙˙ÉÉöU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu1Ŕë-‹E‹@š˙˙˙˙…Ŕt‹H4ş˙˙˙˙…Ŕt‹P0ƒÄüRQhĄ¸čü˙˙˙ÉĂU‰ĺƒěƒÄüEüPhڏ˙u čü˙˙˙ƒÄ…Ŕt&ƒÄřh­¸ƒÄüj˙uü‹E˙pčü˙˙˙ƒÄPčŰř˙˙ë1ŔÉÐU‰ĺƒěƒÄüEüPhڏ˙u čü˙˙˙ƒÄ…Ŕt&ƒÄřhľ¸ƒÄüj˙uü‹E˙pčü˙˙˙ƒÄPčř˙˙ë1ŔÉÐU‰ĺƒěƒÄüEüPhڏ˙u čü˙˙˙ƒÄ…ŔtƒÄřhž¸‹E‹P‹Eü‰BPčMř˙˙ë1ŔÉÍvU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt&ƒÄřhǸƒÄřśEüP‹E˙pčü˙˙˙ƒÄPč˙÷˙˙ë1ŔÉÐU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt'ƒÄřhϸƒÄřśEüP‹E˙pčü˙˙˙ƒÄPčł÷˙˙ë1ŔÉĂU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt+ƒÄřhŐ¸ƒÄřśEüP‹E˙pčü˙˙˙ƒÄPčg÷˙˙됍t&1ŔÉĂU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt+ƒÄřhܸƒÄřśEüP‹E˙pčü˙˙˙ƒÄPč÷˙˙됍t&1ŔÉĂU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt+ƒÄřh七ÄřśEüP‹E˙pčü˙˙˙ƒÄPčÇö˙˙됍t&1ŔÉĂU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt+ƒÄřh츃ÄřśEüP‹E˙pčü˙˙˙ƒÄPčwö˙˙됍t&1ŔÉĂU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt+ƒÄřhö¸ƒÄřśEüP‹E˙pčü˙˙˙ƒÄPč'ö˙˙됍t&1ŔÉĂU‰ĺƒěƒÄüEüPh˙¸˙u čü˙˙˙ƒÄ…Ŕt+ƒÄřhšƒÄř˙uü‹E˙pčü˙˙˙ƒÄPčŮő˙˙ë ´&1ŔÉĂU‰ĺƒěƒÄüEüPh‹¸˙u čü˙˙˙ƒÄ…Ŕt+ƒÄřhšƒÄřśEüP‹E˙pčü˙˙˙ƒÄPč‡ő˙˙됍t&1ŔÉĂU‰ĺƒěEüPEřPhš˙u čü˙˙˙ƒÄ…Ŕt*ƒÄřhšƒÄü˙uü˙uř‹E˙pčü˙˙˙ƒÄPč5ő˙˙ëv1ŔÉĂU‰ĺƒěEüPEřPhš˙u čü˙˙˙ƒÄ…Ŕt*ƒÄřh%šƒÄü˙uü˙uř‹E˙pčü˙˙˙ƒÄPčĺô˙˙ëv1ŔÉĂU‰ĺƒěEüPEřPhš˙u čü˙˙˙ƒÄ…Ŕt*ƒÄřh.šƒÄü˙uü˙uř‹E˙pčü˙˙˙ƒÄPč•ô˙˙ëv1ŔÉĂU‰ĺƒěEüPEřPh4š˙u čü˙˙˙ƒÄ…Ŕt*ƒÄřhGšƒÄü˙uü˙uř‹E˙pčü˙˙˙ƒÄPčEô˙˙ëv1ŔÉĂU‰ĺƒěƒÄôhčü˙˙˙‰Â…Ňt ‹E‰B‰Đë1ŔÉÐU‰ĺƒěS‹]‹C;t ƒÄôPčü˙˙˙ƒÄƒÄôSčü˙˙˙‹]čÉÐU‰ĺƒěWVS‹}‹] 1ö‰uě‰uř…Űt {uƒÄôSčü˙˙˙ƒÄë ‰ö¸ë1Ŕƒřt#ƒřtë}ƒřt6ƒřtGëqƒÄüEüPhOšë EřPEüPh[šSčü˙˙˙ƒÄ…ŔuU1Ŕ鿃ÄôEüPEôPEđPhošëƒÄřEřPEüPEôPEđPhƒšSčü˙˙˙ƒÄ …Ŕtžžë ƒÄřh šë ‰öƒÄřEěP˙uüčü˙˙˙ƒÄ…ŔuƒÄřhŔš˙5čü˙˙˙뀐t&ƒţuƒÄü˙uô˙uđ˙wčü˙˙˙ƒÄƒř˙tƒÄř‹Eě EřP˙wčü˙˙˙ƒÄƒÄřhçšPčŸň˙˙eŘ[^_ÉÍvU‰ĺƒěWVS‹] ÇEřÇEě1ö1˙…Űt"{uƒÄôSčü˙˙˙ƒÄë ¸ët&1Ŕƒřt? ƒřt鎃řtOƒřts韃ÄüEüPhíšSčü˙˙˙ƒÄ…Ŕ…Ą1Ŕé1EřPEüPhóšSčü˙˙˙ƒÄ…ŔtßżëyƒÄôEüPEôPEđPhşSčü˙˙˙ƒÄ …Ŕtˇë0śƒÄřEřPEüPEôPEđPhşSčü˙˙˙ƒÄ …ŔtŠżžëƒÄřh@ş˙5čü˙˙˙éf˙˙˙´&ƒ˙u‹E‹PÇEě…Ňt‹J‰Mě‹Eř‰Bƒţu9ƒÄü˙uô˙uđ‹E˙pčü˙˙˙ƒÄƒř˙tƒÄüj˙˙uü‹M˙qčü˙˙˙ƒÄ‰ÂëvƒÄüj˙˙uü‹E˙pčü˙˙˙‰ÂƒÄƒ˙u ‹M‹A‹Mě‰HƒÄřhaşRčŮđ˙˙eŘ[^_ÉÐU‰ĺƒě,WVS‹] ÇEôÇEč1ö1˙…Űt%{uƒÄôSčü˙˙˙ƒÄ덴&¸ë1ŔƒřtGƒřtéƍśƒřt[ƒřt}鹐EüPEřPhhşSčü˙˙˙ƒÄ…Ŕ…Ş1Ŕé9ƒÄôEôPEüPEřPhsşSčü˙˙˙ƒÄ …ŔtŘżë{vƒÄřEüPEřPEđPEěPh„şSčü˙˙˙ƒÄ …ŔtŠë2ƒÄüEôPEüPEřPEđPEěPh•şSčü˙˙˙ƒÄ …Ŕ„z˙˙˙żžëƒÄřhŔş˙5čü˙˙˙éV˙˙˙ƒ˙u‹E‹PÇEč…Ňt‹J‰Mč‹Eô‰Bƒţu7ƒÄü˙uđ˙uě‹E˙pčü˙˙˙ƒÄƒř˙tƒÄü˙uü˙uř‹M˙qčü˙˙˙ƒÄ‰ÂëƒÄü˙uü˙uř‹E˙pčü˙˙˙‰ÂƒÄƒ˙u ‹M‹A‹Mč‰HƒÄřhâşRčď˙˙eČ[^_ÉÉöU‰ĺƒěS‹] ÇEř…Űt#{uƒÄôSčü˙˙˙ƒÄë¸ët&1Ŕƒřt ƒřt$ëB‰öƒÄüEüPhOšSčü˙˙˙ƒÄ…Ŕu7酉öEřPEüPh[šSčü˙˙˙ƒÄ…Ŕuëgt&ƒÄřhťëNśƒÄřEôP˙uüčü˙˙˙ƒÄ…Ŕt*ƒÄřhťƒÄř˙uô‹E˙pčü˙˙˙ƒÄPč(î˙˙덶ƒÄřhŔš˙5čü˙˙˙1Ŕ‹]čÉÉöU‰ĺƒěS‹] ÇEř…Űt{uƒÄôSčü˙˙˙ƒÄë ¸ë1Ŕƒřt ƒřt$ëB‰öƒÄüEüPhOšSčü˙˙˙ƒÄ…Ŕu7酉öEřPEüPh[šSčü˙˙˙ƒÄ…Ŕuëgt&ƒÄřh@ťëNśƒÄřEôP˙uüčü˙˙˙ƒÄ…Ŕt*ƒÄř‹Eô EřP‹E˙pčü˙˙˙ƒÄřhbťjč6í˙˙ët&ƒÄřhŔš˙5čü˙˙˙1Ŕ‹]čÉÉöU‰ĺƒě(ÇEüÇEřÇEôÇEđÇEěÇEčÇEäÇEŕƒÄřEüPEřPEôPEđPEěPEčPEäPEŕPh€ť˙u čü˙˙˙ƒÄ0…Ŕt3ƒÄô˙uü˙uř˙uô˙uđ˙uě˙uč˙uä˙uŕ‹E˙pčü˙˙˙¸˙ë1ŔÉĂU‰ĺƒěS‹] ÇEřÇEüƒÄřhQ¸Sčü˙˙˙ƒÄ…Ŕu#čü˙˙˙EüPEřPh˘ťSčü˙˙˙ƒÄ…Ŕu1Ŕë+ƒÄôjjjj‹EüPP‹EřPP‹E˙pčü˙˙˙¸˙‹]čÉĂU‰ĺƒěVS‹u‹] …Űt{uƒÄôSčü˙˙˙ƒÄë ¸ë1Ŕ…Ŕt<ƒřuMEüPEřPhšSčü˙˙˙ƒÄ…Ŕu1ŔëTƒÄü˙uü˙uř˙včü˙˙˙ƒÄƒř˙t-ƒÄô˙včü˙˙˙ƒÄ덶ƒÄřhŔť˙5čü˙˙˙1ŔëƒÄřhŕťPč;ë˙˙eč[^ÉĂU‰ĺƒě$S‹] ÇEđÇEô…Űt{uƒÄôSčü˙˙˙ƒÄë ¸ë1ŔƒřtƒřtëCEüPEřPhëťSčü˙˙˙ƒÄ…Ŕu9ëwƒÄřEüPEřPEôPEđPhźSčü˙˙˙ƒÄ …ŔuëPƒÄřh@ź˙5ë;ƒÄô˙uü˙uř˙uô˙uđ‹E˙pčü˙˙˙ƒÄ …Ŕt ƒÄôPč2ö˙˙ëƒÄř˙5ČÝ˙5$éčü˙˙˙1Ŕ‹]ŘÉÐU‰ĺƒěS‹] ÇEř…Űt"{uƒÄôSčü˙˙˙ƒÄë t&¸ë1Ŕƒřtƒřtë/ƒÄüEüPhOšë EřPEüPh[šSčü˙˙˙ƒÄ…Ŕu1Ŕ郃Äřh€źë ‰öƒÄřEôP˙uüčü˙˙˙ƒÄ…ŔuƒÄřhŔź˙5čü˙˙˙1ŔëJv‹E‹PöB uƒÄřh⟃Äř‹Eô EřPRčü˙˙˙ëƒÄřh⟃Äř‹Eô EřPRčü˙˙˙ƒÄPčYé˙˙‹]čÉĂU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…ŔtƒÄô‹E‹@˙pčü˙˙˙ët&1ŔÉĂU‰ĺƒěVS‹u‹] …Űt!{uƒÄôSčü˙˙˙ƒÄë v¸ë1Ŕ…Ŕt<ƒřuNEüPEřPhšSčü˙˙˙ƒÄ…Ŕu1ŔëPƒÄü˙uü˙uř˙včü˙˙˙ƒÄƒř˙t.ƒÄô˙včü˙˙˙ƒÄ덴&ƒÄřh˝˙5čü˙˙˙1Ŕë ƒÄôPčü˙˙˙eč[^ÉÐU‰ĺƒěVS‹u‹] …Űt{uƒÄôSčü˙˙˙ƒÄë ¸ë1Ŕ…Ŕt<ƒřuMEüPEřPhšSčü˙˙˙ƒÄ…Ŕu1ŔëoƒÄü˙uü˙uř˙včü˙˙˙ƒÄƒř˙t-ƒÄô˙včü˙˙˙ƒÄ덶ƒÄřh˝˙5čü˙˙˙1Ŕë)=˙vƒÄôƒÄôPčü˙˙˙Pčü˙˙˙ëƒÄřPh ˝čü˙˙˙eč[^ÉÐU‰ĺě VS‹u‹] …Űt#{uƒÄôSčü˙˙˙ƒÄë¸ët&1Ŕƒřt) …Ŕtéţƒřt>ƒř„€éëƒÄüj˙éЃÄü…üű˙˙Ph"˝Sčü˙˙˙ƒÄ…Ŕ„Ó锍…řű˙˙P…ôű˙˙PhšSčü˙˙˙ƒÄ…Ŕ„ރÄü˙ľřű˙˙˙ľôű˙˙˙včü˙˙˙ƒÄƒř˙tpƒÄüj˙ëSƒÄô…üű˙˙P…řű˙˙P…ôű˙˙Ph&˝Sčü˙˙˙ƒÄ …ŔtYƒÄü˙ľřű˙˙˙ľôű˙˙˙včü˙˙˙ƒÄƒř˙tƒÄü˙ľüű˙˙ü˙˙S˙včü˙˙˙ƒÄ‰Ú덕ü˙˙ëƒÄřh@˝˙5čü˙˙˙1Ŕëƒř˙uƅü˙˙ƒÄôRčü˙˙˙ĽŘű˙˙[^ÉÉöU‰ĺƒě,WVS‹}‹] 1ö‰uô…Űt {uƒÄôSčü˙˙˙ƒÄë ¸ë‰ö1Ŕƒřt9 ƒřtéڃřtXƒř„éǍEüPEřPha˝Sčü˙˙˙ƒÄë‰öƒÄôEôPEüPEřPhr˝Sčü˙˙˙ƒÄ …Ŕ…’1Ŕéőt&ƒÄřEüPEřPEđPEěPh‰˝Sčü˙˙˙ƒÄ …ŔtЃÄü˙uđ˙uě˙wčü˙˙˙‰ĆƒÄëJvƒÄüEôPEüPEřPEđPEěPhŸ˝Sčü˙˙˙ƒÄ …ŔtŒƒÄü˙uđ˙uě˙wčü˙˙˙ƒÄƒÄřhŔ˝ë#ƒţ˙tWƒÄřEčP˙uřčü˙˙˙ƒÄ…ŔuƒÄřhŔš˙5čü˙˙˙é;˙˙˙śƒÄřhགྷÄü˙uü‹Eč EôP˙wčü˙˙˙ƒÄPë ƒÄřh.šVčä˙˙eČ[^_ÉÍvU‰ĺƒěWVS‹}‹] 1ö‰uě‰uř…Űt {uƒÄôSčü˙˙˙ƒÄë ‰ö¸ë1Ŕƒřt#ƒřtë}ƒřt6ƒřtGëqƒÄüEüPhOšë EřPEüPh[šSčü˙˙˙ƒÄ…ŔuU1Ŕ鿃ÄôEüPEôPEđPhošëƒÄřEřPEüPEôPEđPhƒšSčü˙˙˙ƒÄ …Ŕtžžë ƒÄřhžë ‰öƒÄřEěP˙uüčü˙˙˙ƒÄ…ŔuƒÄřhŔš˙5čü˙˙˙뀐t&ƒţuƒÄü˙uô˙uđ˙wčü˙˙˙ƒÄƒř˙tƒÄř‹Eě EřP˙wčü˙˙˙ƒÄƒÄřh žPč/ă˙˙eŘ[^_ÉÍvU‰ĺƒěVS‹u‹] …Űt"{uƒÄôSčü˙˙˙ƒÄë ¸ë t&1Ŕ…ŔtCƒřuUEüPEřPhšSčü˙˙˙ƒÄ…Ŕu 1ŔëW´&ƒÄü˙uü˙uř˙včü˙˙˙ƒÄƒř˙t.ƒÄô˙včü˙˙˙ƒÄ덴&ƒÄřh@ž˙5čü˙˙˙1Ŕë ƒÄôPčü˙˙˙eč[^ÉÐU‰ĺě VS‹u‹] …Űt#{uƒÄôSčü˙˙˙ƒÄë¸ët&1Ŕƒřt) …Ŕtéţƒřt>ƒř„€éëƒÄüj˙éЃÄü…üű˙˙Ph"˝Sčü˙˙˙ƒÄ…Ŕ„Ó锍…řű˙˙P…ôű˙˙PhšSčü˙˙˙ƒÄ…Ŕ„ރÄü˙ľřű˙˙˙ľôű˙˙˙včü˙˙˙ƒÄƒř˙tpƒÄüj˙ëSƒÄô…üű˙˙P…řű˙˙P…ôű˙˙Ph&˝Sčü˙˙˙ƒÄ …ŔtYƒÄü˙ľřű˙˙˙ľôű˙˙˙včü˙˙˙ƒÄƒř˙tƒÄü˙ľüű˙˙ü˙˙S˙včü˙˙˙ƒÄ‰Ú덕ü˙˙ëƒÄřh`ž˙5čü˙˙˙1Ŕëƒř˙uƅü˙˙ƒÄôRčü˙˙˙ĽŘű˙˙[^ÉÉöU‰ĺƒěWVS‹] ÇEřÇEě1ö1˙…Űt{uƒÄôSčü˙˙˙ƒÄë ¸ë1ŔƒřtEƒřt龐t&ƒřtPƒřtn饐ƒÄüEüPhíšSčü˙˙˙ƒÄ…Ŕ…›1Ŕé(EřPEüPhóšSčü˙˙˙ƒÄ…ŔtßżësƒÄôEüPEôPEđPh€žSčü˙˙˙ƒÄ …Ŕtˇë*ƒÄřEřPEüPEôPEđPhŽžSčü˙˙˙ƒÄ …Ŕtżžë´&ƒÄřhŔž˙5čü˙˙˙ée˙˙˙ƒ˙u‹E‹PÇEě…Ňt‹J‰Mě‹Eř‰Bƒţu6ƒÄü˙uô˙uđ‹E˙pčü˙˙˙ƒÄƒř˙tƒÄüj˙˙uü‹M˙qčü˙˙˙ƒÄ‰ÂëƒÄüj˙˙uü‹E˙pčü˙˙˙‰ÂƒÄƒ˙u ‹M‹A‹Mě‰HƒÄřhážRč4ß˙˙eŘ[^_ÉĂU‰ĺƒě,WVS‹] ÇEôÇEč1ö1˙…Űt!{uƒÄôSčü˙˙˙ƒÄë v¸ë1ŔƒřtGƒřtéƍśƒřt[ƒřt}鹐EüPEřPhhşSčü˙˙˙ƒÄ…Ŕ…Ş1Ŕé9ƒÄôEôPEüPEřPhsşSčü˙˙˙ƒÄ …ŔtŘżë{vƒÄřEüPEřPEđPEěPh„şSčü˙˙˙ƒÄ …ŔtŠë2ƒÄüEôPEüPEřPEđPEěPh•şSčü˙˙˙ƒÄ …Ŕ„z˙˙˙żžëƒÄřhż˙5čü˙˙˙éV˙˙˙ƒ˙u‹E‹PÇEč…Ňt‹J‰Mč‹Eô‰Bƒţu7ƒÄü˙uđ˙uě‹E˙pčü˙˙˙ƒÄƒř˙tƒÄü˙uü˙uř‹M˙qčü˙˙˙ƒÄ‰ÂëƒÄü˙uü˙uř‹E˙pčü˙˙˙‰ÂƒÄƒ˙u ‹M‹A‹Mč‰HƒÄřh"żRčbÝ˙˙eČ[^_ÉÉöU‰ĺƒěƒÄüEüPh*ż˙u čü˙˙˙ƒÄ…Ŕu1ŔëTvƒÄř˙uü‹E˙pčü˙˙˙%˙ƒÄƒř˙uƒÄřh@ż˙5čü˙˙˙1Ŕë…Ŕt ¸˙ë ¸˙ÉÐU‰ĺƒě VS‹u‹] ‹Fö@ „˜…Űt${uƒÄôSčü˙˙˙ƒÄ덶¸ë1ŔƒřuTEüPEřPEôPEđPEěPEčPh€żSčü˙˙˙ƒÄ …ŔtxƒÄřhšżƒÄü˙uü˙uř˙uô˙uđ˙uě˙uč˙včü˙˙˙ƒÄ ë@ƒÄřhŕż˙5$éčü˙˙˙ë9ƒÄřhQ¸Sčü˙˙˙ƒÄ…Ŕt$ƒÄřhŔƒÄô˙včü˙˙˙ƒÄPčřŰ˙˙덶1ŔeŘ[^ÉÍvU‰ĺƒěƒÄüEüPh#Ŕ˙u čü˙˙˙ƒÄ…ŔtM‹Eüxu.ƒÄřh_ŔƒÄřƒÄôPčü˙˙˙ƒÄP‹E˙pčü˙˙˙ƒÄPč‹Ű˙˙ëƒÄřh@Ŕ˙5čü˙˙˙1ŔÉÉöU‰ĺƒěEüPEřPhfŔ˙u čü˙˙˙ƒÄ…Ŕt.ƒÄřhsŔƒÄü˙uü˙uř‹E˙pčü˙˙˙ƒÄPč)Ű˙˙ë ´&1ŔÉĂU‰ĺƒě VS‹u‹] ‹Fö@ „˜…Űt${uƒÄôSčü˙˙˙ƒÄ덶¸ë1ŔƒřuTEüPEřPEôPEđPEěPEčPh€żSčü˙˙˙ƒÄ …ŔtxƒÄřh|ŔƒÄü˙uü˙uř˙uô˙uđ˙uě˙uč˙včü˙˙˙ƒÄ ë@ƒÄřh Ŕ˙5$éčü˙˙˙ë9ƒÄřhQ¸Sčü˙˙˙ƒÄ…Ŕt$ƒÄřhÓŔƒÄô˙včü˙˙˙ƒÄPč8Ú˙˙덶1ŔeŘ[^ÉÍvU‰ĺƒěEüPEřPhÜŔ˙u čü˙˙˙ƒÄ…Ŕt'ƒÄřhíŔƒÄü˙uü˙uř‹E˙pčü˙˙˙ƒÄPčÝŮ˙˙ë1ŔÉÍvU‰ĺƒěƒÄřEüPEřPEôPEđPhź˙u čü˙˙˙ƒÄ …Ŕtb‹E‹@ö@ tƒÄô˙uü˙uř˙uô˙uđPčü˙˙˙ët&ƒÄô˙uü˙uř˙uô˙uđPčü˙˙˙ƒÄ …Ŕt ƒÄôPčĺ˙˙ëƒÄř˙5ČÝ˙5$éčü˙˙˙1ŔÉÐU‰ĺƒěVS‹u‹] …Űt%{uƒÄôSčü˙˙˙ƒÄ덴&¸ë1Ŕ…ŔtƒřtëLƒÄřhřŔƒÄřjë'ƒÄüEüPh˙ŔSčü˙˙˙ƒÄ…Ŕt7ƒÄřhřŔƒÄř˙uü˙včü˙˙˙ƒÄPčľŘ˙˙ëvƒÄřh Á˙5čü˙˙˙1Ŕeč[^ÉĂU‰ĺƒě VS‹u‹] …Űt"{uƒÄôSčü˙˙˙ƒÄë ¸ët&1Ŕƒřt ƒřt*ër‰öEüPEřPhAÁSčü˙˙˙ƒÄ…ŔtiƒÄřhRÁjë,ƒÄôEôPEüPEřPh\ÁSčü˙˙˙ƒÄ …Ŕt<ƒÄřhRÁ˙uô˙uü˙uř˙včü˙˙˙ƒÄPčç×˙˙됍t&ƒÄřh€Á˙5čü˙˙˙1ŔeŘ[^ÉĂU‰ĺƒě,WVS‹}‹] 1ö‰uô…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1ŔƒřtBƒřté㍶ƒřt[ƒř„’éʍEüPEřPha˝Sčü˙˙˙ƒÄë"t&ƒÄôEôPEüPEřPhr˝Sčü˙˙˙ƒÄ …Ŕ…’1Ŕéőt&ƒÄřEüPEřPEđPEěPh‰˝Sčü˙˙˙ƒÄ …ŔtЃÄü˙uđ˙uě˙wčü˙˙˙‰ĆƒÄëJvƒÄüEôPEüPEřPEđPEěPhŸ˝Sčü˙˙˙ƒÄ …ŔtŒƒÄü˙uđ˙uě˙wčü˙˙˙ƒÄƒÄřhŔÁë#ƒţ˙tWƒÄřEčP˙uřčü˙˙˙ƒÄ…ŔuƒÄřhŔš˙5čü˙˙˙é;˙˙˙śƒÄřhŕÁƒÄü˙uü‹Eč EôP˙wčü˙˙˙ƒÄPë ƒÄřh.šVčÖ˙˙eČ[^_ÉÍvU‰ĺƒěƒÄü˙u ˙uhÔÝčü˙˙˙ÉÐU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřhgĂčü˙˙˙PčżŐ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřhlĂčü˙˙˙PčkŐ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝu1ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt-ƒÄřhzĂčü˙˙˙PčŐ˙˙됍t&ƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÐU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřh‰Ăčü˙˙˙PčżÔ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřh’Ăčü˙˙˙PčkÔ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝu1ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt-ƒÄřh™Ăčü˙˙˙PčÔ˙˙됍t&ƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÐU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřhŸĂčü˙˙˙PčżÓ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřh¨Ăčü˙˙˙PčkÓ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝu1ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt-ƒÄřhŻĂčü˙˙˙PčÓ˙˙됍t&ƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÐU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřh´Ăčü˙˙˙PčżŇ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřhşĂčü˙˙˙PčkŇ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝu1ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt-ƒÄřhĘĂčü˙˙˙PčŇ˙˙됍t&ƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÐU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřhŰĂčü˙˙˙PčżŃ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝu,ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt(ƒÄřhăĂčü˙˙˙PčkŃ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ĚÝuCEüPEřPhš˙u čü˙˙˙ƒÄ…Ŕt:˙ƒÄřhëÃÄř˙uü˙uřčü˙˙˙ƒÄPčŃ˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÍvU‰ĺƒěS‹] ÇEüƒ=ĚÝtƒÄřhMĂ˙5$é雍´&…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1Ŕ…ŔtƒřtëRƒÄřhöĂčü˙˙˙ë;ƒÄüEüPh‹¸Sčü˙˙˙ƒÄ…Ŕt=ƒ}ütƒÄřhöĂčü˙˙˙ë ƒÄřhöĂčü˙˙˙Pč,Đ˙˙ëƒÄřhÄ˙5čü˙˙˙1Ŕ‹]čÉĂU‰ĺƒěS‹] ÇEüƒ=ĚÝtƒÄřhMĂ˙5$é闍v…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1Ŕ…ŔtƒřtëRƒÄřh Äčü˙˙˙ë;ƒÄüEüPh‹¸Sčü˙˙˙ƒÄ…Ŕt=ƒ}ütƒÄřh Äčü˙˙˙ë ƒÄřh Äčü˙˙˙Pč\Ď˙˙ëƒÄřh%Ä˙5čü˙˙˙1Ŕ‹]čÉĂU‰ĺƒěS‹] ÇEüƒ=ĚÝtƒÄřhMĂ˙5$é闍v…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1Ŕ…ŔtƒřtëRƒÄřhCÄčü˙˙˙ë;ƒÄüEüPh‹¸Sčü˙˙˙ƒÄ…Ŕt=ƒ}ütƒÄřhCÄčü˙˙˙ë ƒÄřhCÄčü˙˙˙PčŒÎ˙˙ëƒÄřhFÄ˙5čü˙˙˙1Ŕ‹]čÉĂU‰ĺƒěS‹] ÇEüƒ=ĚÝtƒÄřhMĂ˙5$é闍v…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1Ŕ…ŔtƒřtëRƒÄřhbÄčü˙˙˙ë;ƒÄüEüPh‹¸Sčü˙˙˙ƒÄ…Ŕt=ƒ}ütƒÄřhbÄčü˙˙˙ë ƒÄřhbÄčü˙˙˙PčźÍ˙˙ëƒÄřhfÄ˙5čü˙˙˙1Ŕ‹]čÉĂU‰ĺƒěƒ=ĚÝu'ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt#ƒÄôčü˙˙˙Pčü˙˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÍvU‰ĺƒěƒ=ĚÝu'ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt#ƒÄôčü˙˙˙Pčü˙˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÍvU‰ĺƒěƒ=ĚÝu'ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt#ƒÄôčü˙˙˙Pčü˙˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÍvU‰ĺƒěƒ=ĚÝu'ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt#ƒÄôčü˙˙˙Pčü˙˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÍvU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙1Ŕë<ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu1Ŕë!čü˙˙˙„Ŕt ¸˙ë ¸˙ÉĂU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙1ŔëGśƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu 1Ŕë&t&čü˙˙˙„Ŕt ¸˙ë ¸˙ÉÐU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙1ŔëGśƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu 1Ŕë&t&čü˙˙˙„Ŕt ¸˙ë ¸˙ÉÐU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙1ŔëGśƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu 1Ŕë&t&čü˙˙˙„Ŕt ¸˙ë ¸˙ÉÐU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙1ŔëGśƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu 1Ŕë&t&čü˙˙˙„Ŕt ¸˙ë ¸˙ÉÐU‰ĺƒěƒ=ĚÝu-ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt)čü˙˙˙¸˙ët&ƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÐU‰ĺƒěƒ=ĚÝu)ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt%čü˙˙˙¸˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÐU‰ĺƒěƒ=ĚÝu)ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt%čü˙˙˙¸˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÐU‰ĺƒěS‹] ƒ=ĚÝt ƒÄřhMĂ鎃=ĐÝtƒÄřhƒÄë{t&…Űt{u#ƒÄôSčü˙˙˙ƒÄƒřtƒÄřhŔÄ˙5ëN‰öƒÄüEţPhâÄSčü˙˙˙ƒÄ…Ŕu1ŔëQvEüPEúPEřPżEţPčü˙˙˙ƒÄƒř˙uƒÄřhĹ˙5$éčü˙˙˙1ŔëżEüPżEúPżEřPhęÄčü˙˙˙‹]čÉÐU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙ëtt&ƒ=ĐÝt ƒÄřhƒÄë܅Űt{u&ƒÄôSčü˙˙˙ƒÄƒřtƒÄřh@Ĺ˙5čü˙˙˙ë*ƒÄüEüPh_ĹSčü˙˙˙ƒÄ…ŔtƒÄô‹EüÁŕPčü˙˙˙ë1Ŕ‹]čÉÐU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éë1t&…Űt1{uƒÄôSčü˙˙˙ƒÄƒřuƒÄřhhĹ˙5čü˙˙˙1ŔëIƒÄüEüPh…ĹSčü˙˙˙ƒÄ…Ŕu1Ŕë,ƒÄô˙uüčü˙˙˙ƒÄƒř˙t ƒÄôPčü˙˙˙ëƒÄřh‹ĹPč"Ç˙˙‹]čÉÐU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙ëtt&…Űt/{uƒÄôSčü˙˙˙ƒÄƒřuƒÄřh Ĺ˙5čü˙˙˙ë=ƒÄüEüPhÁĹSčü˙˙˙ƒÄ…Ŕt$ƒÄřhĆŃÄô˙uüčü˙˙˙ƒÄPčˆĆ˙˙덶1Ŕ‹]čÉÐU‰ĺƒěƒ=ĚÝu-ƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕt)čü˙˙˙ˆE˙ƒÄôE˙Pčü˙˙˙ëƒÄřhMĂ˙5$éčü˙˙˙1ŔÉÐU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙1ŔëfƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu1ŔëKvš˙˙˙˙‰Čë0´&żBë#‹‰Đ€zuÜš˙˙˙˙…Ŕtż…Ŕuܸ˙˙˙˙ƒÄüPQhĄ¸čü˙˙˙ÉÉöU‰ĺƒěƒ=ĚÝt ƒÄřhMĂëhƒÄüEüPh#Ŕ˙u čü˙˙˙ƒÄ…ŔtX‹EüxtƒÄřh@Ŕ˙5ë7t&ƒÄôƒÄôPčü˙˙˙Pčü˙˙˙ƒÄ …Ŕt ƒÄôPčâĐ˙˙ëƒÄř˙5ČÝ˙5$éčü˙˙˙1ŔÉĂU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éë_…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1Ŕƒřu"ƒÄüE˙PhÓĹSčü˙˙˙ƒÄ…Ŕu 1Ŕë:t&ƒÄřhÜĹ˙5čü˙˙˙1ŔëƒÄřhúŃÄôśE˙Pčü˙˙˙ƒÄPč[Ä˙˙‹]čÉÉöU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙1ŔëIƒÄüEüPhĆ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë*ƒÄô˙uüčü˙˙˙…Ŕt¸˙ëv¸˙ÉÍvU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$ééƒ=ĐÝtƒÄřhƒÄ˙5$éëf…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1Ŕƒřu)ƒÄřEţPEüPEúPEřPhĆSčü˙˙˙ƒÄ …Ŕu1ŔëCƒÄřh Ć˙5čü˙˙˙1Ŕë,‰öƒÄřh@ĆżEţPżEüPżEúPżEřPčü˙˙˙ƒÄPčĂ˙˙‹]čÉÐU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙閐t&ƒ=ĐÝt ƒÄřhƒÄë؅Űt{uƒÄôSčü˙˙˙ƒÄƒřtƒÄřh`Ć˙5čü˙˙˙ëKƒÄôEţPEüPEúPhĆSčü˙˙˙ƒÄ …Ŕt*ƒÄřhĆƒÄüżEţPżEüPżEúPčü˙˙˙ƒÄPčAÂ˙˙ë1Ŕ‹]čÉĂU‰ĺƒěVSƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕu 1Ŕé߉öƒ=ĚÝuƒÄô˙5čü˙˙˙ƒÄô˙5éłčü˙˙˙‰Ć…öu ƒÄř˙5ČÝ˙5$éčü˙˙˙1Ŕ钐t&ÇĚ݃Äô˙5čü˙˙˙‰ĂƒÄüShšĆ˙5(éčü˙˙˙˙ ƒÄ ƒ;uƒÄô‹CS‹@˙ЃÄƒÄô˙5čü˙˙˙‰ĂƒÄüSh Ć˙5(éčü˙˙˙˙ ƒÄ ƒ;uƒÄô‹CS‹@˙ЃÄƒÄôVč÷Ě˙˙eč[^ÉĂU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éë[…Űt%{uƒÄôSčü˙˙˙ƒÄë¸ë ´&1ŔƒřuƒÄüEüPhĽĆSčü˙˙˙ƒÄ…Ŕu 1Ŕë<ƒÄřhšĆ˙5čü˙˙˙1Ŕë%t&ƒÄřh×ƃÄřśEüPjčü˙˙˙ƒÄPč€Ŕ˙˙‹]čÉÍvU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éčü˙˙˙1ŔëB‰öƒÄüEüPhĆ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë!ƒÄô˙uüčü˙˙˙ƒÄôƒÄ…Ŕu¸Q¸Pčü˙˙˙ÉÉöU‰ĺƒěƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕtčü˙˙˙ˆE˙ƒÄôE˙Pčü˙˙˙ë1ŔÉÐU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éë_…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1Ŕƒřu"ƒÄüEüPhĽĆSčü˙˙˙ƒÄ…Ŕu 1Ŕë@t&ƒÄřháĆ˙5čü˙˙˙1Ŕë$ƒÄřhúƃÄřśEüP˙5čü˙˙˙ƒÄPč%ż˙˙‹]čÉĂU‰ĺƒěƒ=ĚÝtƒÄřhMĂëP´&EüPEřPh˙Ć˙u čü˙˙˙ƒÄ…Ŕt8ƒÄř˙uü˙uřčü˙˙˙ƒÄ…ŔtƒÄôPčŠĘ˙˙ët&ƒÄř˙5ČÝ˙5$éčü˙˙˙1ŔÉĂU‰ĺƒě$S‹] ƒ=ĚÝt ƒÄřhMĂéхŰt${uƒÄôSčü˙˙˙ƒÄë¸ëś1Ŕƒřt ƒřt5ër‰öEüPEřPh˙ĆSčü˙˙˙ƒÄ…Ŕ„†ƒÄř˙uü˙uřčü˙˙˙ƒÄëOƒÄřEôPEđPEüPEřPhźSčü˙˙˙ƒÄ …ŔtN˙uô˙uđ˙uü˙uřčü˙˙˙ƒÄët&ƒÄřh Ç˙5ë…Ŕt ƒÄôPč‡É˙˙됃Äř˙5ČÝ˙5$éčü˙˙˙1Ŕ‹]ŘÉÐU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ鱍t&ƒ=ĐÝt ƒÄřhƒÄ闅Űt{uƒÄôSčü˙˙˙ƒÄë ¸ë1Ŕƒřu!ƒÄüEţPhAÇSčü˙˙˙ƒÄ…Ŕuë^śƒÄřh`Ç˙5ëCƒÄüEüPEúPżEţPčü˙˙˙ƒÄ…ŔtƒÄüżEüPżEúPhĄ¸čü˙˙˙ëƒÄřh Ç˙5$éčü˙˙˙1Ŕ‹]čÉÐU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éë{ƒ=ĐÝtƒÄřhƒÄ˙5$éëbt&…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1Ŕƒřu"ƒÄüEüPhĐÇSčü˙˙˙ƒÄ…Ŕu 1Ŕë)t&ƒÄřhŕÇ˙5čü˙˙˙1Ŕë ƒÄôśEýPčü˙˙˙‹]čÉÍvU‰ĺƒěƒÄüEüPhíš˙u čü˙˙˙ƒÄ…Ŕt#ƒÄřhȃÄô˙uüčü˙˙˙ƒÄPčÇť˙˙됍t&1ŔÉĂU‰ĺƒěS‹] ÇEüƒ=ĚÝtƒÄřhMĂ˙5$éé}…Űt"{uƒÄôSčü˙˙˙ƒÄë t&¸ë1Ŕ…Ŕt$ƒřu>ƒÄüEüPh‹¸Sčü˙˙˙ƒÄ…Ŕt8ƒ}ütčü˙˙˙ëčü˙˙˙¸˙덶ƒÄřhFÄ˙5čü˙˙˙1Ŕ‹]čÉÉöU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éë-…Űt{uƒÄôSčü˙˙˙ƒÄƒřtƒÄřhČ˙5čü˙˙˙1ŔëcEüPEřPh"ČSčü˙˙˙ƒÄ…Ŕu1ŔëEĄĆ@ë/‰öƒ}ř˙u ƒ}ü˙tçt&ĄĆ@ƒÄü˙uü˙uř˙5čü˙˙˙¸˙‹]čÉÍvU‰ĺƒěSƒ=ĚÝtƒÄřhMĂévƒÄřhQ¸˙u čü˙˙˙ƒÄ…Ŕ„Żčü˙˙˙ƒř˙„ŽÇĐ݃Äô˙5čü˙˙˙‰ĂƒÄüSh,Č˙5(éčü˙˙˙˙ ƒÄ ƒ;uƒÄô‹CS‹@˙ЃÄƒÄô˙5čü˙˙˙‰ĂƒÄüSh3Č˙5(éčü˙˙˙˙ ƒÄ ƒ;u ƒÄô‹CS‹@˙и˙ëƒÄřh?Č˙5$éčü˙˙˙1Ŕ‹]čÉÍvU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éëSƒÄüEüPhOš˙u čü˙˙˙ƒÄ…Ŕu1Ŕë_‹Eü‹PúuƒÄôPčü˙˙˙ë1t&útƒÄřh`Č˙5čü˙˙˙1Ŕë"ƒÄôPčü˙˙˙žƒÄƒÄôƒÄôPčü˙˙˙Pčü˙˙˙ÉÐU‰ĺƒěƒ=ĚÝtƒÄřhMĂ˙5$éëSƒÄüEüPhOš˙u čü˙˙˙ƒÄ…Ŕu1Ŕëg‹Eü‹PúuƒÄôPčü˙˙˙ë1t&útƒÄřh`Č˙5čü˙˙˙1Ŕë*ƒÄôPčü˙˙˙žƒÄƒÄřh€ČƒÄôPčü˙˙˙ƒÄPč¸˙˙ÉÐU‰ĺƒěS‹] ƒ=ĚÝtƒÄřhMĂ˙5$éë_…Űt#{uƒÄôSčü˙˙˙ƒÄ됍t&¸ë1Ŕƒřu"ƒÄüEüPhĽĆSčü˙˙˙ƒÄ…Ŕu 1Ŕë4t&ƒÄřhˆČ˙5čü˙˙˙1ŔëƒÄôśEüPčü˙˙˙¸˙‹]čÉĂU‰ĺƒěWVSƒÄôhďjjhĚâhšÉčü˙˙˙ƒÄ ƒÄôPčü˙˙˙‰EüŁ(éƒÄôhŔÉčü˙˙˙Ł$éƒÄ ƒÄüPhÍɋEüPčü˙˙˙ƒÄô˙5čü˙˙˙‰ĂƒÄ ƒÄüShÓɋEüPčü˙˙˙ƒÄüShŰɋEüPčü˙˙˙˙ ƒÄ ƒ;uƒÄô‹CS‹@˙ЃÄƒÄüƒÄô˙5°čü˙˙˙PhçÉ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5´čü˙˙˙PhôÉ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Źčü˙˙˙PhĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5¨čü˙˙˙PhĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Đčü˙˙˙PhĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Ôčü˙˙˙Ph$Ę˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Řčü˙˙˙Ph-Ę˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Üčü˙˙˙Ph6Ę˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Äčü˙˙˙Ph?Ę˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5ŕčü˙˙˙PhIĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5¸čü˙˙˙PhSĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5źčü˙˙˙Ph\Ę˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Ěčü˙˙˙PhcĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5€čü˙˙˙PhjĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5„čü˙˙˙PhvĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5˜čü˙˙˙Ph‚Ę˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5œčü˙˙˙PhĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5řčü˙˙˙Ph™Ę˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5°čü˙˙˙Ph¤Ę˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Źčü˙˙˙PhŻĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5¸čü˙˙˙PhşĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5´čü˙˙˙PhĹĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5 čü˙˙˙PhĐĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5¤čü˙˙˙PhÚĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Ŕčü˙˙˙PhćĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Ŕčü˙˙˙PhđĘ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5äčü˙˙˙Ph÷Ę˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5ččü˙˙˙PhË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5ěčü˙˙˙Ph Ë˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5đčü˙˙˙PhË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5ôčü˙˙˙PhË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5°čü˙˙˙Ph,Ë˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5´čü˙˙˙Ph5Ë˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Źčü˙˙˙Ph>Ë˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5¨čü˙˙˙PhGË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Ôčü˙˙˙PhPË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Đčü˙˙˙PhYË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Řčü˙˙˙PhbË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Üčü˙˙˙PhkË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5Äčü˙˙˙PhtË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5ŕčü˙˙˙Ph}Ë˙5(éčü˙˙˙ƒÄ ƒÄüƒÄô˙5¸čü˙˙˙Ph†Ë˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh˙˙˙čü˙˙˙PhË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙PhœË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhĽË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙Ph°Ë˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhźË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhĆË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhÎË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh čü˙˙˙PhÔË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh@čü˙˙˙PhŰË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh€čü˙˙˙PhčË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhđË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhúË˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh čü˙˙˙PhĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh@čü˙˙˙Ph"Ě˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh˙čü˙˙˙Ph-Ě˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh˙čü˙˙˙Ph8Ě˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh˙˙˙čü˙˙˙Ph@Ě˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙PhNĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhXĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhdĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhqĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙Ph|Ě˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙Ph…Ě˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh čü˙˙˙PhŒĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh@čü˙˙˙Ph”Ě˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh€čü˙˙˙Ph˘Ě˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhŤĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhśĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhÄĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhĚĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôhčü˙˙˙PhÓĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh čü˙˙˙PhÜĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh@čü˙˙˙PhăĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙PhďĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙PhűĚ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙PhÍ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙PhÍ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙PhÍ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙Ph)Í˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙Ph7Í˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôjčü˙˙˙PhBÍ˙5(éčü˙˙˙ÇEřƒÄ ‰öƒÄô‹EřPčü˙˙˙‰ĂƒÄ‹Eř@‰Eô…Ű„Ÿ‰ŢżNÍš ü¨óŚ„ˆƒÄüjhZÍSčü˙˙˙ƒÄ…ŔuBƒÄô‰ß°üš˙˙˙˙ňŽ÷ŃQčü˙˙˙‰Ç‰Ů‰ţƒÄ€;tŠBŘ<vˆFA€9uîĆ덶‰ßƒÄüƒÄô‹EřPčü˙˙˙PW‹EüPčü˙˙˙ƒÄ 9ßt ƒÄôWčü˙˙˙ƒÄ‹Eô‰Eř=ţŽ0˙˙˙ƒÄüƒÄôhčü˙˙˙PhaÍ˙5(éčü˙˙˙ƒÄ ƒÄüƒÄôh˙čü˙˙˙PhiÍ˙5(éčü˙˙˙ƒÄ čü˙˙˙…Ŕt ƒÄôh€Íčü˙˙˙eŘ[^_ÉАU‰ĺƒěVSč[Ăă.łđ˙˙˙ƒťđ˙˙˙˙t ‹˙ЃĆüƒ>˙uô[^ÉÐU‰ĺƒěSč[Ă°.‹ƒě‹“đ‹‰čČ ˙˙[ÉÐU‰ĺƒěSč[Ă„.č÷§˙˙[ÉĂ1.5b1curses function returned ERRcurses function returned NULL() returned ERRuntouchwintouchwinredrawwinwinsertlnwerasewdeletelni;True(1) or False(0)(ii)l;attrwattronwattroffwattrsetclearokidlokkeypadleaveoknodelaynotimeoutscrolloki;cntwinsdellnsyncok(ii);y,xmvwinmvderwinwmove(ii);lines,columnswresizeO;ch or int(Ol);ch or int,attr(iiO);y,x,ch or int(iiOl);y,x,ch or int, attraddch requires 1 or 4 argumentsargument 1 or 3 must be a ch or an intaddchs;str(sl);str,attr(iis);int,int,str(iisl);int,int,str,attraddstr requires 1 to 4 argumentsaddstr(si);str,n(sil);str,n,attr(iisi);y,x,str,n(iisil);y,x,str,n,attraddnstr requires 2 to 5 argumentsaddnstrbkgd requires 1 or 2 argumentsbkgdbkgdset requires 1 or 2 argumentsbkgdset|llllllll;ls,rs,ts,bs,tl,tr,bl,br(ll);vertint,horintdelch requires 0 or 2 arguments[mv]wdelch(ii);begin_y,begin_x(iiii);nlines,ncols,begin_y,begin_xderwin requires 2 or 4 argumentsechochar requires 1 or 2 argumentsargument 1 must be a ch or an intechochargetch requires 0 or 2 argumentsci;n(iii);y,x,ngetstr requires 0 to 2 arguments(Oi);ch or int,n(Oil);ch or int,n,attr(iiOi);y,x,ch o int,n(iiOil); y,x,ch or int,n,attrhline requires 2 or 5 argumentshlineinsch requires 1 or 4 argumentsinschinch requires 0 or 2 argumentsinstr requires 0 or 3 arguments(iis);y,x,str(iisl);y,x,str,attrinsstr requires 1 to 4 argumentsinsstrinsnstr requires 2 to 5 argumentsinsnstri;lineis_linetouched: line number outside of boundaries(iiiiii);pminrow,pmincol,sminrow,smincol,smaxrow,smaxcolpnoutrefreshnoutrefresh was called for a pad;requires 6 argumentswnoutrefreshO;fileobjargument must be a file objectputwin(ii);beg,numredrawlnprefreshrefresh was called for a pad; requires 6 argumentswrefresh(ii);top, bottomwsetscrregscrolli;linesscroll requires 0 or 1 arguments(ii);start,counttouchline(iii);start,count,valtouchline requires 2 or 3 argumentsvline requires 2 or 5 argumentsvlinesyncupsyncdownsubwinsubpadstandoutstandendsetscrregresizerefreshnoutrefreshmoveis_wintouchedis_linetouchedinstrinsertlninsdellninchimmedokidcokgetyxgetstrgetparyxgetmaxyxgetkeygetchgetbkgdgetbegyxerasederwindeletelndelchcursyncupclrtoeolclrtobotclearboxborderattr_setattrsetattr_offattroffattr_onattroncurses windowmust call initscr() firstbeepdef_prog_modedef_shell_modedoupdateendwinflashnocbreaknoechononlnorawreset_prog_modereset_shell_moderesettysavettyresizetermcbreakcbreak requires 0 or 1 argumentechoecho requires 0 or 1 argumentnlnl requires 0 or 1 argumentrawraw requires 0 or 1 argumentmust call start_color() firstcolor_content requires 1 argumenth;color(iii)Argument 1 was out of range. Check value of COLORS.COLOR_PAIR requires 1 argumenti;numbercurs_set requires 1 argumenti;intcurs_setdelay_output requires 1 argumenti;msdelay_outputb;tenthshalfdelay requires 1 argumenthalfdelayi(hhhh);color,r,g,binit_color requires 4 argumentsinit_colorinit_pair requires 3 arguments(hhh);pair, f, binit_pairLINESCOLSi;True(1), False(0)intrflush requires 1 argumentintrflushmeta requires 1 argumentmeta(ii);nlines,ncolsnewwin requires 2 or 4 argumentsh;pairpair_content requires 1 argumentArgument 1 was out of range. (1..COLOR_PAIRS-1)i;pairvaluePAIR_NUMBER requires 1 argumentputpcurs_set requires 3 argument(ii);y, xCOLORSCOLOR_PAIRSstart_color() returned ERRargument must be a ch or an intungetchuse_env requires 1 argumentuse_envunctrltermnametermattrsstart_colorsetsyxqiflushPAIR_NUMBERpair_contentnoqiflushnewwinnewpadlongnamekillcharkeynameisendwininitscrhas_keyhas_ilhas_ichas_colorsgetwingetsyxflushinpfiltererasecharCOLOR_PAIRcolor_contentcan_change_colorbaudratecursescurses.errorerrorversion__version__ACS_ULCORNERACS_LLCORNERACS_URCORNERACS_LRCORNERACS_LTEEACS_RTEEACS_BTEEACS_TTEEACS_HLINEACS_VLINEACS_PLUSACS_S1ACS_S9ACS_DIAMONDACS_CKBOARDACS_DEGREEACS_PLMINUSACS_BULLETACS_LARROWACS_RARROWACS_DARROWACS_UARROWACS_BOARDACS_LANTERNACS_BLOCKACS_S3ACS_LEQUALACS_GEQUALACS_PIACS_NEQUALACS_STERLINGACS_BSSBACS_SSBBACS_BBSSACS_SBBSACS_SBSSACS_SSSBACS_SSBSACS_BSSSACS_BSBSACS_SBSBACS_SSSSA_ATTRIBUTESA_NORMALA_STANDOUTA_UNDERLINEA_REVERSEA_BLINKA_DIMA_BOLDA_ALTCHARSETA_INVISA_PROTECTA_HORIZONTALA_LEFTA_LOWA_RIGHTA_TOPA_VERTICALA_CHARTEXTA_COLORWA_ATTRIBUTESWA_NORMALWA_STANDOUTWA_UNDERLINEWA_REVERSEWA_BLINKWA_DIMWA_BOLDWA_ALTCHARSETWA_INVISWA_PROTECTWA_HORIZONTALWA_LEFTWA_LOWWA_RIGHTWA_TOPWA_VERTICALCOLOR_BLACKCOLOR_REDCOLOR_GREENCOLOR_YELLOWCOLOR_BLUECOLOR_MAGENTACOLOR_CYANCOLOR_WHITEUNKNOWN KEYKEY_F(KEY_MINKEY_MAXcan't initialize module cursesl游#¸çšÜlâşđoaş,n8Ă g0Ă g(ĂěgĂěgĂ8hĂ8hťČqbťźrĂŹsĂXtýÂteǸ|hôÂ4eëÂřdáÂźdŰÂŘtŇÂ4cËŒuâźpvĹÂěbźÂ˜f´ÂlwŽÂ¤w§ÂXxžÂôf•ÂPgŽÂ(yˆÂDfཨzϸČh‚´ezÂüeuœ} žL|l¤jc¨b"ż”ážŘ]ÂX~NÂhƒ@ÂxcŐ¸iܸdi;ÂäkšDk%š”k临i/Âäƒě¸j_Ŕ܄f¸\bsŔP…'¤… Â4lřŔ€‡ö¸Tjœ† ÂHd„dýÁě†öÁě†íÁ dšôjćÁĐcRÁ,ˆ]¸üaR¸œaŕÁüˆ?Ă Źlʊ°É “gĂȊŸÉ`”öĂ܏‘Éx—†ÉT˜‹Ĺř˜lĂ‹zĂp‹ĆŤ™‰Ăȋ ݐ’ĂŒ|ÉHšuɄ–™ĂpŒlÉؖeɜš^É,›SÉĔLÉ4•Eɤ•=ÉlœúĹź›@ĆŕœĆŔ5Ɉž×ƔŸ,É–$ÉH É´ É”úĆě  É ĄÉ˘CĀ‘ŸĂȌ¨ĂŻĂpúČ(—´ĂȍíČŁáȤȟ¤ŮČĽbÄP’şĂŽĘĂpŽëĂpŇČźĽĆČ€ŚźČp“łČŔ“ŹČt§€Č¨¤Čź¨˙˙˙˙˙˙˙˙dčšXŞXşXĘXÚXęXúX YY*Y:YJYZYjYzYŠYšYŞYşYĘYÚYęYúY ZZ*Z:ZJZZZjZzZŠZšZŞZşZĘZÚZęZúZ [[*[:[J[Z[j[z[Š[š[Ş[ş[Ę[Ú[ę[ú[ \\*\:\J\Z\j\z\Š\š\Ş\ş\Ę\Ú\ę\ú\ ]]*]:]J]Z]j]z]Š]š]Ş]ş]Ę]Ú]ę]ú] ^^*^:^J^Z^j^z^Š^š^Ş^ş^Ę^Ú^ę^ú^ __*_:_J_Z_j_z_Š_š_Ş_ş_Ę_Ú_AQ PX ŕˇ”źŹ   p樨T :ţ˙˙oč˙˙˙ođ˙˙ofW ĐKdŔ`8dŔ`I<X€‡€Ą€Ő€ €J€–€â€€2€X€}€—€˛€Ó€ €/€S€}€‘ &°‚Ä‚˘Ü‚˘č‚Ôý‚‚˘.‚˘˘G‚Ř{€Ş˘‚R Ă€I˘ç‚Č@G‚˘€ €!1€"G€#^€%w€&Ž€1Ś€2ż€3×€4ń€5 €6$€8=€9W€;z€=’€>Ş€?€@Ú€Aó€B €C$€D=€ET€Fm€G†€HĄ€I¸€Nű€Q€R.€SF€T_€Vx€Y‘€oŕ€r÷€u €{, €|I €f €€… €ƒ˘ €„Á €‡Ű €Šö € €Ž/ €‘˘I €0g ‚éë| ‚BG‚ • €˙Ť €˘Ŕ €#Ů €$ň €% €&˘‚˘& €¤@ € €!€đ8€^€†€Ť€˘Ń€=炢€Ý‚˘˘4‚GÂJ‚˘e‚‚—‚˘˘˛‚G¢˘˘Č‚Ý‚÷‚‚˘˘˘˘˛‚kGÂ+€-d€5ž‚ꡡ€!Í€"ä€#ů€$€%%€&=€'T€*k€.€:˜€?Ż€DÇ€Iŕ€N÷€`€e$€i=€nV€oo€s†‚š€G˘GÂą€Ć€‚Ü€ƒđ€Š€Ş€Ť5€ŹL€Że€°~€ą—€˛°€´Ę‚N 䂢˙‚€7€˘†‚ˆ~€˘š€0Ń€3˘č‚˘€Ë€Ě;€Í˘W€€„‚G¢š€[˘Č‚˘Ý‚ńń€F€t^€xź€‹î€Œ€K€Žt€ž€Ě€‘ý€’,€“^€”€•Ŕ€–䀗€˜H€˛“€źg€Â߀É}€ĚŞ€ÍՀ΀Ď"€ĐO€Ńm€Ň–€ÓŻ€ÔŮ€ "€˘˝"‚˘Ň"‚˘ç"‚ţ"€:˘\#‚ŕ t#€(Ÿ#‚Ó#‚Ÿ# $‚ $‚?$‚]$‚˘˘˘y$‚˘˘˘˘˘˜$‚ą$€/˘%‚{(-%€ o%€)˘Đ%‚˘é%‚Ň+&€N˘Ş&‚˘Ä&‚Đ!Ý&€9˘f'‚ú~'€9˘ű'‚˘(‚ýl-(€,I(€.q(€Ü(€C÷(€G)€Rd)€[˘Ü)‚˘ö)‚Ů6*€/˘Ţ*‚^~÷*€3Ő+€9X,€@˘é,‚˘-‚˘-‚˘--‚ó F-€˘Í-‚˘ă-‚˘ů-‚-Š.€ż.€9á.€~0€Y˘›0‚‚9ł0€ź˘˘É0‚˘Ü0‚˘ó0‚˘ 1‚˘!1‚c$51€1€˘Ň1‚˘č1‚˘˘ű1‚N 2€D&2‚ű1‚˘˘<2€ZP2€ßp2€ŕ‘2€â§2€3€¤3€ě5€6€ ˘n6&7Ä݃6&8Čݙ6&;ĚÝŹ6&>ĐÝĹ6$YŔ`ß6 Yë6 Z D[D^ D_D`Db Dc$Dd8e„ú`D“:D”:DÁ:8„ú`De:DfPDg^DimDktů6@Z7€\œ˙˙˙ŔŔ:Ŕ:ŕ:ŕ:ŕt$t%7$o4aE7 oR7 p DqDrDsDt DxFDvLDzZ]7@oj7@p$fu7€†Ú7$Мaý7 Đ8 Đ DĐ8@Đ$],8$ŃüaM8 Ń8 Ń DŃ8@Ń$]Z8$Ň\bM8 Ň8 Ň DŇ8@Ň$K|8$Ó¨bM8 Ó8 Ó DÓ8@Ó$Dž8$ÔěbM8 Ô8 Ô DÔ8@Ô$H˝8$Ő4cM8 Ő8 Ő DŐ8@Ő$Dß8$×xcM8 ×8 × D×8@×$U9$ŮĐcM8 Ů8 Ů DŮ8@Ů$<%9$Ú dM8 Ú8 Ú DÚ8@Ú$<G9$ŰHdM8 Ű8 Ű DŰ8@Ű$<i9$܄dM8 Ü8 Ü DÜ8@Ü$8‹9$ÝźdM8 Ý8 Ý DÝ8@Ý$<Ž9$ŢřdM8 Ţ8 Ţ DŢ8@Ţ$<Đ9$ß4eM8 ß8 ß Dß8@ß$@ň9$ŕteM8 ŕ8 ŕ Dŕ8@ŕ$@:$â´eM8 â8 â Dâ8@â/:€âü˙˙˙ŔŕE$E::$ăüeM8 ă8 ă Dă8@ă/:€ăü˙˙˙ŔŕH$HZ:$ĺDfM8 ĺ8 ĺ Dĺ8@ĺx:@ĺ„:@ĺŔŕQ$Q:$ć˜fM8 ć8 ć Dć8@ćx:@ć„:@ćŔŕY$Yą:$çôfM8 ç8 ç Dç8@çx:@ç„:@çŔŕZ$ZŇ:$čPgM8 č8 č Dč8@čx:@č„:@čŔŕP$Pó:$ę gM8 ę8 ę Dę8@ę;€ęü˙˙˙ŔŕK$K;$ëěgM8 ë8 ë Dë8@ë;€ëü˙˙˙ŔŕK$K@;$ě8hM8 ě8 ě Dě8@ě;€ěü˙˙˙ŔŕA$Aa;$í|hM8 í8 í Dí8@í/:€íü˙˙˙ŔŕK$K;$îČhM8 î8 î Dî8@î/:€îü˙˙˙ŔŕL$LŸ;$ďiM8 ď8 ď Dď8@ď/:€ďü˙˙˙ŔŕP$Pž;$đdiM8 đ8 đ Dđ8@đ/:€đü˙˙˙ŔŕP$PŢ;$ń´iM8 ń8 ń Dń8@ń/:€ńü˙˙˙ŔŕP$Pţ;$ňjM8 ň8 ň Dň8@ň/:€ňü˙˙˙ŔŕP$P <$óTjM8 ó8 ó Dó8@ó/:€óü˙˙˙ŔŕP$PA<$ô¤jM8 ô8 ô Dô8@ô/:€ôü˙˙˙ŔŕP$Pc<$őôjM8 ő8 ő Dő8@ő/:€őü˙˙˙ŔŕP$P‚<$÷DkM8 ÷8 ÷ D÷8@÷/:€÷ř˙˙˙ <€÷ü˙˙˙ŔŕP$PŤ<$ř”kM8 ř8 ř Dř8@ř/:€řř˙˙˙ <€řü˙˙˙ŔŕP$PĚ<$ůäkM8 ů8 ů Dů8@ů/:€ůř˙˙˙ <€ůü˙˙˙ŔŕP$Pę<$ű4lM8 ű8 ű Dű8@ű/:€űř˙˙˙ <€űü˙˙˙ŔŕP$P =$„l&= DDDDDD D '3=@@=@Ŕŕ'$'K=$Źlj= DD D!@=@$/u=$ÜlM8 8  DDDDD D"WD#cD&eD'D*†D-šD/œD2ÁD3ĆD5ČD6ĐD9ÔD:ęD;ýD>D? DA"DB4DC7DDM8@“=@ =@Ť=€ô˙˙˙ł=€đ˙˙˙ť=@É=€ü˙˙˙Ö=€ě˙˙˙ŕ=€ř˙˙˙ŔŕM$Mě=$H,nM8 H8 I DJDN DODQDSfDTƒDWŠDY¤DZŠD\ŤD_ĚDaÔDcůDdDfDgDj$Dk)Dl@DnFDoKDq„DrœDsĄDt­DuĂ“=@I =@KŤ=€Lô˙˙˙ł=€Lđ˙˙˙ >€Mü˙˙˙ŕ=€Nř˙˙˙>€Ně˙˙˙ť=@O&>@OŔŕĂ$Ă6>$yđoM8 y8 z D{D~ DDDƒpD„ŽD‡•D‰śDŠťDŒŔDĺD‘çD“D”D– D—3Dš8D›=DœTDžZDŸ_DĄ–D˘ŻDŁ´D¤ŔDĽÖ“=@z =@|Ť=€|đ˙˙˙ł=€|ě˙˙˙V>€|ü˙˙˙ >€}ř˙˙˙ŕ=€~ô˙˙˙>€~č˙˙˙ť=@&>@ŔŕÖ$Ö^>$ŠČqM8 Š8 Ş DŤDŽ D°D˛HDłaDśhDˇ‚DşˆDťDž˜DĂŽDżŘDŔëDÄň8@Š“=@ŞÉ=€Źü˙˙˙{>€­ô˙˙˙ŕ=€Žř˙˙˙Ŕŕň$ň‡>$ČźrM8 Č8 É DĘDÍ DĎDŃDDŇ]DŐdDÖ~DŮ„DÚŒDÝ”DâŞDăżDŢÔDßçDäî8@Č“=@ÉÉ=€Ëü˙˙˙{>€Ěô˙˙˙ŕ=€Íř˙˙˙Ŕŕî$î§>$čŹsM8 čĆ> é DęDëDěDí>DđuDń›DňŚDď¨DóŹ8@čÔ>€ëŕ˙˙˙Ţ>€ëä˙˙˙č>€ëč˙˙˙ň>€ëě˙˙˙ü>€ëđ˙˙˙?€ëô˙˙˙?€ëř˙˙˙?€ëü˙˙˙ŔŕŹ$Ź$?$÷XtM8 ÷8 ř DůDú DűDü-Dý2DţLDPDpD{D€8@÷“=@ř@?€úř˙˙˙K?€úü˙˙˙Ŕŕ€$€V?$ŘtM8 8  D D D;DUDYDˆD›DŸD´8@“=@ =@ Ť=€ ü˙˙˙ł=€ ř˙˙˙Ŕŕ´$´t?$ŒuM8 8   D!D% D&D'D)ID*cD-eD/ŠD2ŒD3šD6œD8śD=˝D9ČD:ÜD>ă8@“=@ 3=@"“?€#đ˙˙˙ ?€#ô˙˙˙Ź?€#ř˙˙˙ş?€#ü˙˙˙Ŕŕă$ăČ?$BpvM8 B8 C DDDG DIDKEDLQDOSDPmDStDV|DY€DZ–D[ŠD^°DbźD_ÖDdü8@B“=@CÉ=€Eü˙˙˙Ö=€Fô˙˙˙ŕ=€Gř˙˙˙Ŕŕü$üé?$hlwM8 h8 i DjDkDmDl48@h$8 @$r¤wM8 r8 s DtDxD}>D~XD\D‚ŒDƒŸD…ŁD†ł8@r“=@sŤ=€uü˙˙˙ł=€uř˙˙˙'@@vŔŕł$ł3@$ŠXxM8 Š8 ‹ DŒDD•;D–UD—YDšˆD››DŸD ŚDžşDĄĎ8@Š“=@‹Ť=€ü˙˙˙ł=€ř˙˙˙'@@ŽŔŕĎ$ĎR@$Ľ(yM8 Ľ8 Ś D§DŹDŽ]DŻbDąhD´ˆDśD¸ąDťŘDÂDÄ@DĆHDÇ[DÉ_DĘdDËkDĚ~8@Ľ“=@ŚŤ=€¨řű˙˙ł=€¨ôű˙˙V>€¨üű˙˙q@€Šü˙˙‘@@ŞŔŕ~$~@$ШzM8 ĐĆ> Ń DŇDŐDÖDŘDÚ^DŰtDŢxDߝDâ¨DäÍDĺŕDçčDęDě%Dí-Dđ/Dń4DňJDô]DöhDř‹DůĄ8@Đť@@ŃÉ=€Óř˙˙˙Ö=€Ôč˙˙˙V>€Őü˙˙˙Ť=€Őđ˙˙˙ł=€Őě˙˙˙É@@Őŕ=€Öô˙˙˙ŔŕĄ$ĄŐ@$ýL|M8 ý8 ţ D˙DDDDDWDcD eD D†DšDœDÁDĆDČDĐDÔDęD ýD#D$ D&"D'4D(7D)M8@ý“=@ţ =@Ť=€ô˙˙˙ł=€đ˙˙˙ť=@É=€ü˙˙˙Ö=€ě˙˙˙ŕ=€ř˙˙˙ŔŕM$Mó@$-œ}M8 -8 . D/D2D7?D8YD9dD<”D=§D?ŤD@ť8@-“=@.Ť=€0ü˙˙˙ł=€0ř˙˙˙ =@0Ŕŕť$ťA$DX~M8 D8 E DFDKDM]DNbDPhDSˆDUDWąDZŘD\D]@D_HD`[Db_DcdDdkDe~8@D“=@EŤ=€Gřű˙˙ł=€Gôű˙˙V>€Güű˙˙.A€Hü˙˙‘@@IŔŕ~$~NA$iŘM8 i8 j DkDo DpDrDthDu…DxŒDzŚD{ŤD}­D€ÎD‚ĐD„őD…˙D‡DˆD‹ DŒ%D<DBDGD’}D“•D”šD•ŚD–ź“=@j =@lŤ=€mô˙˙˙ł=€mđ˙˙˙ >€nü˙˙˙ŕ=€oř˙˙˙>€oě˙˙˙ť=@p&>@pŔŕź$źmA$š”M8 š8 › DœDŸ D D˘D¤lDĽŠD¨‘DŞ˛DŤˇD­źD°áD˛ăD´DľDˇD¸/Dť4Dź9D˝PDżVDŔ[DÂ’DĂŤDİDĹźDĆŇ“=@› =@Ť=€đ˙˙˙ł=€ě˙˙˙V>€ü˙˙˙ >€žř˙˙˙ŕ=€Ÿô˙˙˙>€Ÿč˙˙˙ť=@ &>@ ŔŕŇ$ҍA$ĘhƒM8 Ę8 Ë DĚDÍDÎDĎ!DĐ(DŃ>DŇFDÔYDÖ]DÚaDŰlD×nDŘyDÝ{8@Ę´A€Íü˙˙˙żA@ÍŔŕ{${ĘA$áäƒM8 á8 â DăDćDçDéJDďtDôžD÷ąDúłDüČDűěDţő8@á“=@âďA€äč˙˙˙ýA€äě˙˙˙ B€äđ˙˙˙B€äô˙˙˙'B€äř˙˙˙5B€äü˙˙˙Ŕŕő$őCB$܄M8 8  DDDD !D -D [D nDr8@É=€ü˙˙˙Ŕŕr$rbB$P…M8 8  DDDD"DPDT8@…B€ř˙˙˙B€ü˙˙˙ŔŕT$T™B$¤…M8 8  D D#D$D&JD,tD1žD3ąD6łD8ČD7ěD:ő8@“=@ďA€!č˙˙˙ýA€!ě˙˙˙ B€!đ˙˙˙B€!ô˙˙˙'B€!ř˙˙˙5B€!ü˙˙˙Ŕŕő$őšB$>œ†M8 >8 ? D@DADBDD"DCIDEM8@>Ť=€Aü˙˙˙ł=€Ař˙˙˙ŔŕM$MáB$Iě†M8 I8 J DKDLDODS-DT9DVTDXlD]pDY{DZD^“8@I3=@L“?€Mđ˙˙˙ ?€Mô˙˙˙Ź?€Mř˙˙˙ş?€Mü˙˙˙Ŕŕ“$“C$b€‡M8 b8 c DdDfDhDDkSDmlDoDpŁDrŹ8@b“=@cC€eü˙˙˙ŔŕŹ$Ź+C$v,ˆM8 v8 w DxDzD|DD~^DjDƒ‹D…´D†ÇDˆĐ8@v“=@wMC€yř˙˙˙VC€yü˙˙˙`C€yô˙˙˙ŔŕĐ$ĐjC$ŒüˆM8 ŒĆ>  DŽD‘D’D”D–gD—}Dš„D›ŠDž´D ŮDĄěDŁôDŚD¨1DŠ9DŹ;D­@DŽVD°iD˛tD´—Dľ­8@Œť@@É=€ř˙˙˙Ö=€č˙˙˙V>€‘ü˙˙˙Ť=€‘đ˙˙˙ł=€‘ě˙˙˙É@@‘ŕ=€’ô˙˙˙Ŕŕ­$­ˆC&ˇÔÝťC$ʊM8 ŰC  DD $čC D$ȊD 8  D$R*D$‚‹D ‚8 ‚ D‚$RJD$ƒp‹D ƒ8 ƒ Dƒ$WkD$„ȋD „8 „ D„$R†D$…ŒD …8 … D…$RŸD$†pŒD †8 † D†$WˇD$‡ȌD ‡8 ‡ D‡$RŇD$ˆD ˆ8 ˆ Dˆ$RëD$‰pD ‰8 ‰ D‰$WE$ŠȍD Š8 Š DŠ$RE$‹ŽD ‹8 ‹ D‹$R€Çü˙˙˙ŔŕŁ$ŁÁG$Öř˜D Ö8 × DŘDŰ DÝ(DŢFDßYDâ]DäzDĺ…DçD荓=@×ÜG€Ůü˙˙˙żA@ŮŔŕŤ$ŤćG$줙D ě8 í DîDń Dó,DôJDő]D÷_DůxDúŁ“=@íH€ďü˙˙˙ŔŕŁ$ŁH$ţHšD ţ8 ˙ DDDDD&D .D S*H€˙˙˙˙ŔŕS$S3H$œšD 8  DDDD&DZD}DŽLH@UH@ŔŕŽ$Ž^H$,›M8 8  D D!D$D&D(4D)@D*ND-TD/fD4mD0xD1ŒD53=@!É=€"ü˙˙˙Ŕŕ$wH$9ź›D 98 : D;D> D@$DBRDEtDF‡DI‹DJŽ“=@:“H€<˙˙˙˙ŔŕŽ$ŽĄH$OlœD O8 P DQDRDTDV&DXED\TD]_DYdDZoD^qťH€Rü˙˙˙Ŕŕq$qÄH$cŕœD c8 d DeDh Di&Dk@DmnDp—DqŞDt°Duߓ=@d€G€fř˙˙˙ŒG€fú˙˙˙”G€fü˙˙˙œG€fţ˙˙˙Ŕŕß$ßáH$yŔD y8 z D{D~ D0DCD‚aDƒtD†vDˆ—D‰ȓ=@zýH€|ú˙˙˙I€|ü˙˙˙œG€|ţ˙˙˙ŔŕČ$ČI$ˆžD Ć> Ž DDD“D•(D–1D—?DšMDœTDXDžlDĄxDŁ‚D¤’DĽŚDŚżD§ĎD¨ăDŞüDŤ 3=@*I@‘9I@‘Ŕŕ $ GI$°”ŸD °8 ą D˛Dľ Dˇ#DšSDźpD˝ƒDŔŒDÁą“=@ąťH€łü˙˙˙Ŕŕą$ącI$ĹH D Ĺ8 Ć DÇDČDËDÍ(DĎHDŃSDŇj}I@ČťH€Éü˙˙˙Ŕŕj$jI$Ö´ D Ö8 × DŘDŮDŰDÝDß%Dŕ7*H€Ů˙˙˙˙Ŕŕ7$7ŤI$äě D ä8 ĺ DćDé Dë$DíRDđtDń‡Dô‹Dő´“=@ĺťH€çü˙˙˙Ŕŕ´$´ÂI$ů ĄD ů8 ú DűDüD˙D D<DJD QD`DtD x3=@ü“?€ýř˙˙˙ ?€ýü˙˙˙Ŕŕx$xŰI$˘D 8  DD D DXDvD„D‰D!ŽD"żD$ČD%ÖD(ŘD-ÜD)čD*üD.“=@3=@“?€ř˙˙˙ ?€ü˙˙˙Ź?€đ˙˙˙ş?€ô˙˙˙Ŕŕ$÷I$2ŁD 28 3 D4D7 D8$D::D<cD?„D@’DC”DI°DDÉDFÜDJă“=@3ýH€5ţ˙˙˙I€5ú˙˙˙œG€5ü˙˙˙Ŕŕă$ăJ$N¤D N8 O DPDS DT#DV@DXnD[D]ŁD`§Daš“=@OV>€Qü˙˙˙Ŕŕš$š4J$eź¤D e8 f DgDhDjDk!DlH >€hü˙˙˙ŔŕH$HKJ$pĽD p8 q DrDs DuDw-D}^D~wD„D€‰D”DƒœD„ŻD†ś“=@qÉE€sü˙˙˙Ŕŕś$śeJ$ŠźĽD Š8 ‹ DŒD D‘$D’BD“UD–YD˜„DšąD›źDœÁ“=@‹ł=€ř˙˙˙Ť=€ü˙˙˙ŔŕÁ$Á~J$ €ŚD  8 Ą D˘DŁDŚD¨ DŞ;DŤ@DŹID­SDŽcDŻwD°Dą D˛´DłĘD´ŐDś×DˇęDšńÉ@@ŁœJ@¤§J@¤Ŕŕń$ńłJ$˝t§D ˝8 ž DżDŔDĂDĹDÇ>DČLDÉ\DĚdDÍwDĘ|DĐ‹DŃŸÉ=€Ŕü˙˙˙ĚJ@ÁŔŕŸ$Ÿ×J$Ő¨D Ő8 Ö D×DŘDŰDÝDß>DŕLDá\DädDĺwDâ|Dč‹Dé§É=€Řü˙˙˙ĚJ@ŮŔŕ§$§ńJ$ퟨD í8 î DďDň Dô$DöRD÷kDútDű‡Dý‹Dţ˜D˙ŁD¨“=@îÉE€đü˙˙˙Ŕŕ¨$¨ K&Ěâ8K$FdŠDFDGDJDM$DN3DQ8DRJDU_DVoDW„DX–DaŻDbŃDcöDdDe@DfeDgŠDhŻDiÔDjůDkDlCDmhDnDo˛Dp×DqüDr!DsFDtkDuDvľDwÚDx˙Dy$D|ID}nD~“D¸D€ÝDDƒ'D„LD…qD†–D‡ťDˆŕD‰DŠ*D‹ODŒtD™DžD‘âD’D“'D”KD•oD–“D—ˇD˜ŰD™˙Dš#DœGDkDžDŸłD ×DĄűDŁ D¤C DŚg D§‹ D¨Ź DŠĐ DŞô DŤ DŹ< D­` DŽ„ Dݍ D°Ě Dąđ D˛ Dł8 D´\ Dľ€ Dś¤ D¸Č Dšé Dş Dť+ DźL D˝m DžŽ DżŻ DĆĐ DÇÜ DČü DĘ DË* DĚ* DÍC DÎE DĎG DĐO DŃX DŇZ DÔ[ DŐ\ DÖa D×d DŘl DŮn DÚˆ Dۏ DĆ› DÝŹ DŢÍ Dâń Dăý DäKK@GVK€Gü˙˙˙`K@GŔkK€Ăř˙˙˙uK@ăK@ĹŔŻŔü Ŕü ŕü Ŕü ŕü Ŕü ŕü Ŕü ŕü ŕü Ŕ Ŕ ŕ Ŕ ŕ Ŕ ŕ Ŕ ŕ ŕ ’K@˝K@ËŔ* ŕa ଠŕ$¨K(4$éżK(%(édvˇcursesmodule.c/home/silvan/saug/Python-1.5.2/Modules/./cursesmodule.cgcc2_compiled.int:t(0,1)=r(0,1);0020000000000;0017777777777;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,1);0020000000000;0017777777777;unsigned int:t(0,4)=r(0,1);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,1);0000000000000;0037777777777;long long int:t(0,6)=r(0,1);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=r(0,1);0000000000000;01777777777777777777777;short int:t(0,8)=r(0,8);-32768;32767;short unsigned int:t(0,9)=r(0,9);0;65535;signed char:t(0,10)=r(0,10);-128;127;unsigned char:t(0,11)=r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);4;0;complex double:t(0,17)=r(0,17);8;0;complex long double:t(0,18)=r(0,18);12;0;void:t(0,19)=(0,19)PyCursesVersion:G(0,20)=*(0,2)../Include/Python.h../Include/patchlevel.h../config.h/usr/include/stdio.h/usr/include/features.h/usr/include/sys/cdefs.h/usr/include/gnu/stubs.h/usr/lib/gcc-lib/i386-linux/2.95.2/include/stddef.hsize_t:t(8,1)=(0,4)/usr/lib/gcc-lib/i386-linux/2.95.2/include/stdarg.h__gnuc_va_list:t(9,1)=(9,2)=*(0,19)/usr/include/bits/types.h__u_char:t(10,1)=(0,11)__u_short:t(10,2)=(0,9)__u_int:t(10,3)=(0,4)__u_long:t(10,4)=(0,5)__u_quad_t:t(10,5)=(0,7)__quad_t:t(10,6)=(0,6)__int8_t:t(10,7)=(0,10)__uint8_t:t(10,8)=(0,11)__int16_t:t(10,9)=(0,8)__uint16_t:t(10,10)=(0,9)__int32_t:t(10,11)=(0,1)__uint32_t:t(10,12)=(0,4)__int64_t:t(10,13)=(0,6)__uint64_t:t(10,14)=(0,7)__qaddr_t:t(10,15)=(10,16)=*(10,6)__dev_t:t(10,17)=(10,5)__uid_t:t(10,18)=(10,3)__gid_t:t(10,19)=(10,3)__ino_t:t(10,20)=(10,4)__mode_t:t(10,21)=(10,3)__nlink_t:t(10,22)=(10,3)__off_t:t(10,23)=(0,3)__loff_t:t(10,24)=(10,6)__pid_t:t(10,25)=(0,1)__ssize_t:t(10,26)=(0,1)__rlim_t:t(10,27)=(10,4)__rlim64_t:t(10,28)=(10,5)__id_t:t(10,29)=(10,3)__fsid_t:t(10,30)=(10,31)=s8__val:(10,32)=ar(0,1);0;1;(0,1),0,64;;__daddr_t:t(10,33)=(0,1)__caddr_t:t(10,34)=(0,20)__time_t:t(10,35)=(0,3)__swblk_t:t(10,36)=(0,3)__clock_t:t(10,37)=(0,3)__fd_mask:t(10,38)=(0,5)__fd_set:t(10,39)=(10,40)=s128__fds_bits:(10,41)=ar(0,1);0;31;(10,38),0,1024;;__key_t:t(10,42)=(0,1)__ipc_pid_t:t(10,43)=(0,9)__blkcnt_t:t(10,44)=(0,3)__blkcnt64_t:t(10,45)=(10,6)__fsblkcnt_t:t(10,46)=(10,4)__fsblkcnt64_t:t(10,47)=(10,5)__fsfilcnt_t:t(10,48)=(10,4)__fsfilcnt64_t:t(10,49)=(10,5)__ino64_t:t(10,50)=(10,4)__off64_t:t(10,51)=(10,24)__t_scalar_t:t(10,52)=(0,3)__t_uscalar_t:t(10,53)=(0,5)__intptr_t:t(10,54)=(0,1)FILE:t(4,1)=(4,2)=xs_IO_FILE:/usr/include/libio.h/usr/include/_G_config.hwchar_t:t(14,1)=(0,3)wint_t:t(14,2)=(0,4)_G_int16_t:t(13,1)=(0,8)_G_int32_t:t(13,2)=(0,1)_G_uint16_t:t(13,3)=(0,9)_G_uint32_t:t(13,4)=(0,4)_IO_lock_t:t(12,1)=(0,19)_IO_marker:T(12,2)=s12_next:(12,3)=*(12,2),0,32;_sbuf:(12,4)=*(4,2),32,32;_pos:(0,1),64,32;;_IO_FILE:T(4,2)=s148_flags:(0,1),0,32;_IO_read_ptr:(0,20),32,32;_IO_read_end:(0,20),64,32;_IO_read_base:(0,20),96,32;_IO_write_base:(0,20),128,32;_IO_write_ptr:(0,20),160,32;_IO_write_end:(0,20),192,32;_IO_buf_base:(0,20),224,32;_IO_buf_end:(0,20),256,32;_IO_save_base:(0,20),288,32;_IO_backup_base:(0,20),320,32;_IO_save_end:(0,20),352,32;_markers:(12,3),384,32;_chain:(12,4),416,32;_fileno:(0,1),448,32;_blksize:(0,1),480,32;_old_offset:(10,23),512,32;_cur_column:(0,9),544,16;_vtable_offset:(0,10),560,8;_shortbuf:(12,5)=ar(0,1);0;0;(0,2),568,8;_lock:(12,6)=*(12,1),576,32;_offset:(10,51),608,64;_unused2:(12,7)=ar(0,1);0;15;(0,1),672,512;;_IO_FILE:t(12,8)=(4,2)__io_read_fn:t(12,9)=(12,10)=f(10,26)__io_write_fn:t(12,11)=(12,12)=f(10,26)__io_seek_fn:t(12,13)=(12,14)=f(0,1)__io_close_fn:t(12,15)=(12,16)=f(0,1)fpos_t:t(4,3)=(10,23)/usr/include/bits/stdio_lim.hoff_t:t(4,4)=(10,23)/usr/include/bits/stdio.h/usr/include/string.h/usr/include/bits/string.h/usr/include/bits/string2.h/usr/include/endian.h/usr/include/bits/endian.h/usr/include/stdlib.h/usr/include/errno.h/usr/include/bits/errno.h/usr/include/linux/errno.h/usr/include/asm/errno.hdiv_t:t(30,1)=(30,2)=s8quot:(0,1),0,32;rem:(0,1),32,32;;ldiv_t:t(30,3)=(30,4)=s8quot:(0,3),0,32;rem:(0,3),32,32;;/usr/include/sys/types.hu_char:t(32,1)=(10,1)u_short:t(32,2)=(10,2)u_int:t(32,3)=(10,3)u_long:t(32,4)=(10,4)quad_t:t(32,5)=(10,6)u_quad_t:t(32,6)=(10,5)fsid_t:t(32,7)=(10,30)loff_t:t(32,8)=(10,24)ino_t:t(32,9)=(10,20)dev_t:t(32,10)=(10,17)gid_t:t(32,11)=(10,19)mode_t:t(32,12)=(10,21)nlink_t:t(32,13)=(10,22)uid_t:t(32,14)=(10,18)pid_t:t(32,15)=(10,25)id_t:t(32,16)=(10,29)ssize_t:t(32,17)=(10,26)daddr_t:t(32,18)=(10,33)caddr_t:t(32,19)=(10,34)key_t:t(32,20)=(10,42)/usr/include/time.htime_t:t(33,1)=(10,35)ulong:t(32,21)=(0,5)ushort:t(32,22)=(0,9)uint:t(32,23)=(0,4)int8_t:t(32,24)=(0,10)int16_t:t(32,25)=(0,8)int32_t:t(32,26)=(0,1)int64_t:t(32,27)=(0,6)u_int8_t:t(32,28)=(0,11)u_int16_t:t(32,29)=(0,9)u_int32_t:t(32,30)=(0,4)u_int64_t:t(32,31)=(0,7)register_t:t(32,32)=(0,1)/usr/include/sys/select.h/usr/include/bits/select.h/usr/include/bits/sigset.h__sig_atomic_t:t(37,1)=(0,1)__sigset_t:t(37,2)=(37,3)=s128__val:(37,4)=ar(0,1);0;31;(0,5),0,1024;;timespec:T(38,1)=s8tv_sec:(0,3),0,32;tv_nsec:(0,3),32,32;;fd_mask:t(35,1)=(10,38)fd_set:t(35,2)=(10,39)/usr/include/sys/sysmacros.hblkcnt_t:t(32,33)=(10,44)fsblkcnt_t:t(32,34)=(10,46)fsfilcnt_t:t(32,35)=(10,48)random_data:T(30,5)=s28fptr:(30,6)=*(32,26),0,32;rptr:(30,6),32,32;state:(30,6),64,32;rand_type:(0,1),96,32;rand_deg:(0,1),128,32;rand_sep:(0,1),160,32;end_ptr:(30,6),192,32;;drand48_data:T(30,7)=s24x:(30,8)=ar(0,1);0;2;(0,9),0,48;a:(30,8),48,48;c:(0,9),96,16;old_x:(30,8),112,48;init:(0,1),160,32;;/usr/include/alloca.h__compar_fn_t:t(30,9)=(30,10)=*(30,11)=f(0,1)../Include/myproto.h../Include/object.h_object:T(43,1)=s8ob_refcnt:(0,1),0,32;ob_type:(43,2)=*(43,3)=xs_typeobject:,32,32;;PyObject:t(43,4)=(43,1)PyVarObject:t(43,5)=(43,6)=s12ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;ob_size:(0,1),64,32;;unaryfunc:t(43,7)=(43,8)=*(43,9)=f(43,10)=*(43,4)binaryfunc:t(43,11)=(43,12)=*(43,13)=f(43,10)ternaryfunc:t(43,14)=(43,15)=*(43,16)=f(43,10)inquiry:t(43,17)=(43,18)=*(43,19)=f(0,1)coercion:t(43,20)=(43,21)=*(43,22)=f(0,1)intargfunc:t(43,23)=(43,24)=*(43,25)=f(43,10)intintargfunc:t(43,26)=(43,27)=*(43,28)=f(43,10)intobjargproc:t(43,29)=(43,30)=*(43,31)=f(0,1)intintobjargproc:t(43,32)=(43,33)=*(43,34)=f(0,1)objobjargproc:t(43,35)=(43,36)=*(43,37)=f(0,1)getreadbufferproc:t(43,38)=(43,39)=*(43,40)=f(0,1)getwritebufferproc:t(43,41)=(43,39)getsegcountproc:t(43,42)=(43,43)=*(43,44)=f(0,1)getcharbufferproc:t(43,45)=(43,46)=*(43,47)=f(0,1)PyNumberMethods:t(43,48)=(43,49)=s92nb_add:(43,11),0,32;nb_subtract:(43,11),32,32;nb_multiply:(43,11),64,32;nb_divide:(43,11),96,32;nb_remainder:(43,11),128,32;nb_divmod:(43,11),160,32;nb_power:(43,14),192,32;nb_negative:(43,7),224,32;nb_positive:(43,7),256,32;nb_absolute:(43,7),288,32;nb_nonzero:(43,17),320,32;nb_invert:(43,7),352,32;nb_lshift:(43,11),384,32;nb_rshift:(43,11),416,32;nb_and:(43,11),448,32;nb_xor:(43,11),480,32;nb_or:(43,11),512,32;nb_coerce:(43,20),544,32;nb_int:(43,7),576,32;nb_long:(43,7),608,32;nb_float:(43,7),640,32;nb_oct:(43,7),672,32;nb_hex:(43,7),704,32;;PySequenceMethods:t(43,50)=(43,51)=s28sq_length:(43,17),0,32;sq_concat:(43,11),32,32;sq_repeat:(43,23),64,32;sq_item:(43,23),96,32;sq_slice:(43,26),128,32;sq_ass_item:(43,29),160,32;sq_ass_slice:(43,32),192,32;;PyMappingMethods:t(43,52)=(43,53)=s12mp_length:(43,17),0,32;mp_subscript:(43,11),32,32;mp_ass_subscript:(43,35),64,32;;PyBufferProcs:t(43,54)=(43,55)=s16bf_getreadbuffer:(43,38),0,32;bf_getwritebuffer:(43,41),32,32;bf_getsegcount:(43,42),64,32;bf_getcharbuffer:(43,45),96,32;;destructor:t(43,56)=(43,57)=*(43,58)=f(0,19)printfunc:t(43,59)=(43,60)=*(43,61)=f(0,1)getattrfunc:t(43,62)=(43,63)=*(43,64)=f(43,10)getattrofunc:t(43,65)=(43,12)setattrfunc:t(43,66)=(43,67)=*(43,68)=f(0,1)setattrofunc:t(43,69)=(43,36)cmpfunc:t(43,70)=(43,71)=*(43,72)=f(0,1)reprfunc:t(43,73)=(43,8)hashfunc:t(43,74)=(43,75)=*(43,76)=f(0,3)_typeobject:T(43,3)=s108ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;ob_size:(0,1),64,32;tp_name:(0,20),96,32;tp_basicsize:(0,1),128,32;tp_itemsize:(0,1),160,32;tp_dealloc:(43,56),192,32;tp_print:(43,59),224,32;tp_getattr:(43,62),256,32;tp_setattr:(43,66),288,32;tp_compare:(43,70),320,32;tp_repr:(43,73),352,32;tp_as_number:(43,77)=*(43,48),384,32;tp_as_sequence:(43,78)=*(43,50),416,32;tp_as_mapping:(43,79)=*(43,52),448,32;tp_hash:(43,74),480,32;tp_call:(43,14),512,32;tp_str:(43,73),544,32;tp_getattro:(43,65),576,32;tp_setattro:(43,69),608,32;tp_as_buffer:(43,80)=*(43,54),640,32;tp_flags:(0,3),672,32;tp_doc:(0,20),704,32;tp_xxx5:(0,3),736,32;tp_xxx6:(0,3),768,32;tp_xxx7:(0,3),800,32;tp_xxx8:(0,3),832,32;;PyTypeObject:t(43,81)=(43,3)../Include/objimpl.h../Include/pydebug.h../Include/intobject.hPyIntObject:t(46,1)=(46,2)=s12ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;ob_ival:(0,3),64,32;;../Include/longobject.hPyLongObject:t(47,1)=(47,2)=xs_longobject:/usr/lib/gcc-lib/i386-linux/2.95.2/include/limits.h/usr/lib/gcc-lib/i386-linux/2.95.2/include/syslimits.h/usr/include/limits.h/usr/include/bits/posix1_lim.h/usr/include/bits/local_lim.h/usr/include/linux/limits.h/usr/include/bits/posix2_lim.h../Include/floatobject.hPyFloatObject:t(56,1)=(56,2)=s16ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;ob_fval:(0,13),64,64;;../Include/complexobject.hPy_complex:t(57,1)=(57,2)=s16real:(0,13),0,64;imag:(0,13),64,64;;PyComplexObject:t(57,3)=(57,4)=s24ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;cval:(57,1),64,128;;../Include/rangeobject.h../Include/stringobject.hPyStringObject:t(59,1)=(59,2)=s24ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;ob_size:(0,1),64,32;ob_shash:(0,3),96,32;ob_sinterned:(43,10),128,32;ob_sval:(12,5),160,8;;../Include/bufferobject.h../Include/tupleobject.hPyTupleObject:t(61,1)=(61,2)=s16ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;ob_size:(0,1),64,32;ob_item:(61,3)=ar(0,1);0;0;(43,10),96,32;;../Include/listobject.hPyListObject:t(62,1)=(62,2)=s16ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;ob_size:(0,1),64,32;ob_item:(62,3)=*(43,10),96,32;;../Include/dictobject.h../Include/methodobject.hPyCFunction:t(64,1)=(43,12)PyCFunctionWithKeywords:t(64,2)=(43,15)PyMethodDef:T(64,3)=s16ml_name:(0,20),0,32;ml_meth:(64,1),32,32;ml_flags:(0,1),64,32;ml_doc:(0,20),96,32;;PyMethodDef:t(64,4)=(64,3)PyMethodChain:T(64,5)=s8methods:(64,6)=*(64,4),0,32;link:(64,7)=*(64,5),32,32;;PyMethodChain:t(64,8)=(64,5)PyCFunctionObject:t(64,9)=(64,10)=s16ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;m_ml:(64,6),64,32;m_self:(43,10),96,32;;../Include/moduleobject.h../Include/funcobject.hPyFunctionObject:t(66,1)=(66,2)=s28ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;func_code:(43,10),64,32;func_globals:(43,10),96,32;func_defaults:(43,10),128,32;func_doc:(43,10),160,32;func_name:(43,10),192,32;;../Include/classobject.hPyClassObject:t(67,1)=(67,2)=s32ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;cl_bases:(43,10),64,32;cl_dict:(43,10),96,32;cl_name:(43,10),128,32;cl_getattr:(43,10),160,32;cl_setattr:(43,10),192,32;cl_delattr:(43,10),224,32;;PyInstanceObject:t(67,3)=(67,4)=s16ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;in_class:(67,5)=*(67,1),64,32;in_dict:(43,10),96,32;;PyMethodObject:t(67,6)=(67,7)=s20ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;im_func:(43,10),64,32;im_self:(43,10),96,32;im_class:(43,10),128,32;;../Include/fileobject.h../Include/cobject.h../Include/traceback.h../Include/sliceobject.hPySliceObject:t(71,1)=(71,2)=s20ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;start:(43,10),64,32;stop:(43,10),96,32;step:(43,10),128,32;;../Include/pyerrors.h../Include/mymalloc.h../Include/pystate.h_is:T(74,1)=s24next:(74,2)=*(74,1),0,32;tstate_head:(74,3)=*(74,4)=xs_ts:,32,32;modules:(43,10),64,32;sysdict:(43,10),96,32;builtins:(43,10),128,32;checkinterval:(0,1),160,32;;PyInterpreterState:t(74,5)=(74,1)_ts:T(74,4)=s60next:(74,3),0,32;interp:(74,6)=*(74,5),32,32;frame:(74,7)=*(74,8)=xs_frame:,64,32;recursion_depth:(0,1),96,32;ticker:(0,1),128,32;tracing:(0,1),160,32;sys_profilefunc:(43,10),192,32;sys_tracefunc:(43,10),224,32;curexc_type:(43,10),256,32;curexc_value:(43,10),288,32;curexc_traceback:(43,10),320,32;exc_type:(43,10),352,32;exc_value:(43,10),384,32;exc_traceback:(43,10),416,32;dict:(43,10),448,32;;PyThreadState:t(74,9)=(74,4)../Include/modsupport.hva_list:t(76,1)=(9,1)../Include/ceval.h../Include/pythonrun.h../Include/sysmodule.h../Include/intrcheck.h../Include/import.h_inittab:T(81,1)=s8name:(0,20),0,32;initfunc:(81,2)=*(81,3)=f(0,19),32,32;;_frozen:T(81,4)=s12name:(0,20),0,32;code:(81,5)=*(0,11),32,32;size:(0,1),64,32;;../Include/abstract.h../Include/pyfpe.h/usr/include/curses.hchtype:t(84,1)=(0,5)/usr/include/unctrl.hbool:t(84,2)=(0,11)SCREEN:t(84,3)=(84,4)=xsscreen:WINDOW:t(84,5)=(84,6)=xs_win_st:attr_t:t(84,7)=(84,1)ldat:T(84,8)=s12text:(84,9)=*(84,1),0,32;firstchar:(0,8),32,16;lastchar:(0,8),48,16;oldindex:(0,8),64,16;;pdat:T(84,10)=s12_pad_y:(0,8),0,16;_pad_x:(0,8),16,16;_pad_top:(0,8),32,16;_pad_left:(0,8),48,16;_pad_bottom:(0,8),64,16;_pad_right:(0,8),80,16;;_win_st:T(84,6)=s76_cury:(0,8),0,16;_curx:(0,8),16,16;_maxy:(0,8),32,16;_maxx:(0,8),48,16;_begy:(0,8),64,16;_begx:(0,8),80,16;_flags:(0,8),96,16;_attrs:(84,7),128,32;_bkgd:(84,1),160,32;_notimeout:(84,2),192,8;_clear:(84,2),200,8;_leaveok:(84,2),208,8;_scroll:(84,2),216,8;_idlok:(84,2),224,8;_idcok:(84,2),232,8;_immed:(84,2),240,8;_sync:(84,2),248,8;_use_keypad:(84,2),256,8;_delay:(0,1),288,32;_line:(84,11)=*(84,8),320,32;_regtop:(0,8),352,16;_regbottom:(0,8),368,16;_parx:(0,1),384,32;_pary:(0,1),416,32;_parent:(84,12)=*(84,5),448,32;_pad:(84,10),480,96;_yoffset:(0,8),576,16;;mmask_t:t(84,13)=(0,5)MEVENT:t(84,14)=(84,15)=s20id:(0,8),0,16;x:(0,1),32,32;y:(0,1),64,32;z:(0,1),96,32;bstate:(84,13),128,32;;catchall_ERR:S(0,20)catchall_NULL:S(0,20)initialised:S(0,1)initialisedcolors:S(0,1)PyCursesCheckERR:f(43,10)code:p(0,1)fname:p(0,20)fname:r(0,20)buf:(0,21)=ar(0,1);0;99;(0,2)PyCurses_ConvertToChtype:F(0,1)obj:p(43,10)ch:p(84,9)obj:r(43,10)ch:r(84,9)PyCursesWindowObject:t(0,22)=(0,23)=s12ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;win:(84,12),64,32;;PyCursesWindow_untouchwin:f(43,10)self:p(0,24)=*(0,22)arg:p(43,10)self:r(0,24)PyCursesWindow_touchwin:f(43,10)self:p(0,24)PyCursesWindow_redrawwin:f(43,10)PyCursesWindow_winsertln:f(43,10)PyCursesWindow_werase:f(43,10)PyCursesWindow_wdeleteln:f(43,10)PyCursesWindow_is_wintouched:f(43,10)PyCursesWindow_wsyncup:f(43,10)PyCursesWindow_wsyncdown:f(43,10)PyCursesWindow_wstandend:f(43,10)PyCursesWindow_wstandout:f(43,10)PyCursesWindow_wcursyncup:f(43,10)PyCursesWindow_wclrtoeol:f(43,10)PyCursesWindow_wclrtobot:f(43,10)PyCursesWindow_wclear:f(43,10)PyCursesWindow_idcok:f(43,10)arg1:(0,1)PyCursesWindow_immedok:f(43,10)PyCursesWindow_getyx:f(43,10)arg1:r(0,1)arg2:r(0,1)PyCursesWindow_getbegyx:f(43,10)PyCursesWindow_getmaxyx:f(43,10)PyCursesWindow_getparyx:f(43,10)PyCursesWindow_wattron:f(43,10)arg1:(84,7)PyCursesWindow_wattroff:f(43,10)PyCursesWindow_wattrset:f(43,10)PyCursesWindow_clearok:f(43,10)PyCursesWindow_idlok:f(43,10)PyCursesWindow_keypad:f(43,10)PyCursesWindow_leaveok:f(43,10)PyCursesWindow_nodelay:f(43,10)PyCursesWindow_notimeout:f(43,10)PyCursesWindow_scrollok:f(43,10)PyCursesWindow_winsdelln:f(43,10)PyCursesWindow_syncok:f(43,10)PyCursesWindow_mvwin:f(43,10)arg2:(0,1)PyCursesWindow_mvderwin:f(43,10)PyCursesWindow_wmove:f(43,10)PyCursesWindow_wresize:f(43,10)PyCursesWindow_New:f(43,10)win:p(84,12)win:r(84,12)wo:r(0,24)PyCursesWindow_Dealloc:f(0,19)wo:p(0,24)PyCursesWindow_AddCh:f(43,10)arg:r(43,10)rtn:r(0,1)x:(0,1)y:(0,1)use_xy:r(0,1)temp:(43,10)ch:(84,1)attr:(84,7)PyCursesWindow_AddStr:f(43,10)str:(0,20)attr_old:(84,7)use_attr:r(0,1)PyCursesWindow_AddNStr:f(43,10)n:(0,1)PyCursesWindow_Bkgd:f(43,10)bkgd:(84,1)PyCursesWindow_BkgdSet:f(43,10)PyCursesWindow_Border:f(43,10)args:p(43,10)ls:(84,1)rs:(84,1)ts:(84,1)bs:(84,1)tl:(84,1)tr:(84,1)bl:(84,1)br:(84,1)PyCursesWindow_Box:f(43,10)ch1:(84,1)ch2:(84,1)PyCursesWindow_DelCh:f(43,10)PyCursesWindow_DerWin:f(43,10)nlines:(0,1)ncols:(0,1)begin_y:(0,1)begin_x:(0,1)PyCursesWindow_EchoChar:f(43,10)PyCursesWindow_GetBkgd:f(43,10)PyCursesWindow_GetCh:f(43,10)rtn:r(84,1)PyCursesWindow_GetKey:f(43,10)PyCursesWindow_GetStr:f(43,10)rtn:(0,25)=ar(0,1);0;1023;(0,2)rtn2:r(0,1)PyCursesWindow_Hline:f(43,10)args:r(43,10)code:r(0,1)PyCursesWindow_InsCh:f(43,10)PyCursesWindow_InCh:f(43,10)PyCursesWindow_InStr:f(43,10)rtn:(0,26)=ar(0,1);0;1023;(0,2)PyCursesWindow_InsStr:f(43,10)PyCursesWindow_InsNStr:f(43,10)PyCursesWindow_Is_LineTouched:f(43,10)line:(0,1)erg:r(0,1)PyCursesWindow_NoOutRefresh:f(43,10)pminrow:(0,1)pmincol:(0,1)sminrow:(0,1)smincol:(0,1)smaxrow:(0,1)smaxcol:(0,1)PyCursesWindow_PutWin:f(43,10)PyCursesWindow_RedrawLine:f(43,10)beg:(0,1)num:(0,1)PyCursesWindow_Refresh:f(43,10)PyCursesWindow_SetScrollRegion:f(43,10)PyCursesWindow_SubWin:f(43,10)PyCursesWindow_Scroll:f(43,10)lines:(0,1)PyCursesWindow_TouchLine:f(43,10)st:(0,1)cnt:(0,1)val:(0,1)PyCursesWindow_Vline:f(43,10)PyCursesWindow_Methods:S(0,27)=ar(0,1);0;-1;(64,4)PyCursesWindow_GetAttr:f(43,10)name:p(0,20)PyCursesWindow_Type:G(43,81)PyCurses_beep:f(43,10)self:p(43,10)PyCurses_def_prog_mode:f(43,10)PyCurses_def_shell_mode:f(43,10)PyCurses_doupdate:f(43,10)PyCurses_endwin:f(43,10)PyCurses_flash:f(43,10)PyCurses_nocbreak:f(43,10)PyCurses_noecho:f(43,10)PyCurses_nonl:f(43,10)PyCurses_noraw:f(43,10)PyCurses_reset_prog_mode:f(43,10)PyCurses_reset_shell_mode:f(43,10)PyCurses_resetty:f(43,10)PyCurses_savetty:f(43,10)PyCurses_resizeterm:f(43,10)PyCurses_cbreak:f(43,10)flag:(0,1)PyCurses_echo:f(43,10)PyCurses_nl:f(43,10)PyCurses_raw:f(43,10)PyCurses_baudrate:f(43,10)PyCurses_termattrs:f(43,10)PyCurses_termname:f(43,10)PyCurses_longname:f(43,10)PyCurses_can_change_color:f(43,10)PyCurses_has_colors:f(43,10)PyCurses_has_ic:f(43,10)PyCurses_has_il:f(43,10)PyCurses_isendwin:f(43,10)PyCurses_filter:f(43,10)PyCurses_flushinp:f(43,10)PyCurses_noqiflush:f(43,10)PyCurses_Color_Content:f(43,10)color:(0,8)r:(0,8)g:(0,8)b:(0,8)PyCurses_COLOR_PAIR:f(43,10)PyCurses_Curs_Set:f(43,10)vis:(0,1)PyCurses_Delay_Output:f(43,10)ms:(0,1)PyCurses_EraseChar:f(43,10)ch:(0,2)PyCurses_getsyx:f(43,10)x:r(0,1)y:r(0,1)PyCurses_GetWin:f(43,10)PyCurses_HalfDelay:f(43,10)tenths:(0,11)PyCurses_has_key:f(43,10)ch:(0,1)PyCurses_Init_Color:f(43,10)PyCurses_Init_Pair:f(43,10)pair:(0,8)f:(0,8)PyCurses_InitScr:f(43,10)lines:r(43,10)cols:r(43,10)PyCurses_IntrFlush:f(43,10)PyCurses_KeyName:f(43,10)knp:r(0,28)=*(0,2)PyCurses_KillChar:f(43,10)PyCurses_Meta:f(43,10)PyCurses_NewPad:f(43,10)PyCurses_NewWindow:f(43,10)PyCurses_Pair_Content:f(43,10)PyCurses_PAIR_NUMBER:f(43,10)PyCurses_Putp:f(43,10)PyCurses_QiFlush:f(43,10)PyCurses_setsyx:f(43,10)PyCurses_Start_Color:f(43,10)c:r(43,10)cp:r(43,10)PyCurses_UnCtrl:f(43,10)ch:r(84,1)PyCurses_UngetCh:f(43,10)PyCurses_Use_Env:f(43,10)PyCurses_methods:S(0,29)=ar(0,1);0;-1;(64,4)initcurses:F(0,19)m:r(43,10)d:(43,10)v:r(43,10)key:(0,1)key_n:r(0,20)key_n2:r(0,20)p1:r(0,20)p2:r(0,20)PyCursesError:S(43,10)ModDict:S(43,10)GCC: (GNU) 2.95.2 20000220 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000220 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000220 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000220 (Debian GNU/Linux)GCC: (GNU) 2.95.2 20000220 (Debian GNU/Linux)01.0101.0101.0101.0101.01.symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.text.rel.data.rel.got.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.sbss.bss.stab.stabstr.comment.note””! ŹŹ )źźŞ1˙˙˙off‚>ţ˙˙očč M H2 W PLPL0a €T€T(j ¨T¨T¨ sPXPX1y„X„X`~đ_đ_đW„ŕˇŕˇŠ¸¸Ÿ ’ Ý Íź ˜\ć\Ö˘`ć`ÖŠhćhÖ°pćpÖôľdčdبž é ŮÄ é Ů É Ů p Ď,IĐKŘü”ëáç•dK–çä›`Ŕ D˛ň”ŹźfčPL€T¨T PX „X đ_ ࡠ¸ Ý\ć`ćhćpćdč é éđ_ ń˙đ_  Ýhć-¤Ý9đ_ O\ćbX` m éwp` ƒ¨` ލÝœ`ćń˙€ˇ Ş€ˇ Ŕdćƒ´ˇ Ž\ćÍlćÚ\ćࡠčń˙÷ÄÝČÝĚÝĐÝ0Ŕ`t A$éOœa] iüa] \bK š¨bD łěbH É4cD âxcU ˙Đc<  d< /Hd< H„d8 aźd< {řd< ”4e@ ­te@ Ă´eE ŘüeH ďDfQ ˜fY ôfZ 4PgP L gK cěgK {8hA “|hK ŞČhL żiP ŐdiP ě´iP jP TjP 4¤jP MôjP cDkP x”kP äkP Ľ4lP ź„l' ĎŹl/ ćÜlM ű,nĂ đoÖ (Čqň <źrî SŹsŹ iXt€ |Řt´ ‘Œuă §pvü żlw8 Ö¤wł ëXxĎ (y~ ¨zĄ ,L|M Aœ}ť UX~~ jŘź €”Ň —hƒ{ ľäƒő Ń܄r çP…T ¤…ő œ†M 7솓 M€‡Ź c,ˆĐ |üˆ­ ‘Ô݀¨ʊ żȊR Í‹R äp‹W üȋR ŒR pŒW -ȌR ?R OpW ]ȍR lŽR …pŽW ŸȎR °R Ápi Ő܏Ô ĺ°Đ ó€‘Đ ˙P’Đ “M  p“M 1 Ŕ“M C ”M U `”d o Ĕo ƒ 4•o “ ¤•o Ł –o ľ „–S ŠؖO × (—O ę x—Ű  T˜Ł  ř˜Ť ' ¤™Ł = HšS P œšŽ ` ,› p ź›Ž ƒ lœq ” ŕœß ¨ ŔČ ť ˆž  Ě (éÔ ”Ÿą ç H j ř ´ 7 ě ´   Ąx ( ˘ ; Łă Q ¤š f ź¤H t Ľś … źĽÁ • €Śń Ş t§Ÿ ş ¨§ Ë ź¨¨ Ü Ěâí vˇ ô e˙  8 l+ €1 @ ŻJ .R Ç_ Eh 7v dčń˙ 0‰ ô“ ˘ 3Š üˇń˙° Ÿ˝ Ë }"ě >ř   $ P+ ˝5 C ŸJ Z `c k `u .~ Ÿ† ł Ÿ 6Ž ź BĂ Ň ÂŮ §ŕ î Xý VB*''!ƒ1PX 7NdŠ YFbŔÝrÍ„ŒE’Ď™jŸ*°ˇŠ"Úœë÷bZ]'—'$Ó.<5]?4af X`âll1u†{‚Ž '¨ź'ĂĎMŮéňEüó#Ż!™( éń˙4Ä<§BSYéai%o|n€˜ŽH”+™/Ť{°dˇÄŮç˜î*÷˙Şŕˇ Ô&‘-AHŇOú\gdpöx0€Ž•Ł­žśĂĎ éń˙Öpćń˙ěąü,éń˙= §ĆS0&+2'<NE,M+V#_ShLq}χŽV—‹ŸĽw˛HŔuĘLŃ ŕ gcc2_compiled.crtstuff.cp.3__DTOR_LIST__completed.4__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.11frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__cursesmodule.ccatchall_ERRcatchall_NULLinitialisedinitialisedcolorsPyCursesCheckERRPyCursesErrorPyCursesWindow_untouchwinPyCursesWindow_touchwinPyCursesWindow_redrawwinPyCursesWindow_winsertlnPyCursesWindow_werasePyCursesWindow_wdeletelnPyCursesWindow_is_wintouchedPyCursesWindow_wsyncupPyCursesWindow_wsyncdownPyCursesWindow_wstandendPyCursesWindow_wstandoutPyCursesWindow_wcursyncupPyCursesWindow_wclrtoeolPyCursesWindow_wclrtobotPyCursesWindow_wclearPyCursesWindow_idcokPyCursesWindow_immedokPyCursesWindow_getyxPyCursesWindow_getbegyxPyCursesWindow_getmaxyxPyCursesWindow_getparyxPyCursesWindow_wattronPyCursesWindow_wattroffPyCursesWindow_wattrsetPyCursesWindow_clearokPyCursesWindow_idlokPyCursesWindow_keypadPyCursesWindow_leaveokPyCursesWindow_nodelayPyCursesWindow_notimeoutPyCursesWindow_scrollokPyCursesWindow_winsdellnPyCursesWindow_syncokPyCursesWindow_mvwinPyCursesWindow_mvderwinPyCursesWindow_wmovePyCursesWindow_wresizePyCursesWindow_NewPyCursesWindow_DeallocPyCursesWindow_AddChPyCursesWindow_AddStrPyCursesWindow_AddNStrPyCursesWindow_BkgdPyCursesWindow_BkgdSetPyCursesWindow_BorderPyCursesWindow_BoxPyCursesWindow_DelChPyCursesWindow_DerWinPyCursesWindow_EchoCharPyCursesWindow_GetBkgdPyCursesWindow_GetChPyCursesWindow_GetKeyPyCursesWindow_GetStrPyCursesWindow_HlinePyCursesWindow_InsChPyCursesWindow_InChPyCursesWindow_InStrPyCursesWindow_InsStrPyCursesWindow_InsNStrPyCursesWindow_Is_LineTouchedPyCursesWindow_NoOutRefreshPyCursesWindow_PutWinPyCursesWindow_RedrawLinePyCursesWindow_RefreshPyCursesWindow_SetScrollRegionPyCursesWindow_SubWinPyCursesWindow_ScrollPyCursesWindow_TouchLinePyCursesWindow_VlinePyCursesWindow_MethodsPyCursesWindow_GetAttrPyCurses_beepPyCurses_def_prog_modePyCurses_def_shell_modePyCurses_doupdatePyCurses_endwinPyCurses_flashPyCurses_nocbreakPyCurses_noechoPyCurses_nonlPyCurses_norawPyCurses_reset_prog_modePyCurses_reset_shell_modePyCurses_resettyPyCurses_savettyPyCurses_resizetermPyCurses_cbreakPyCurses_echoPyCurses_nlPyCurses_rawPyCurses_baudratePyCurses_termattrsPyCurses_termnamePyCurses_longnamePyCurses_can_change_colorPyCurses_has_colorsPyCurses_has_icPyCurses_has_ilPyCurses_isendwinPyCurses_filterPyCurses_flushinpPyCurses_noqiflushPyCurses_Color_ContentPyCurses_COLOR_PAIRPyCurses_Curs_SetPyCurses_Delay_OutputPyCurses_EraseCharPyCurses_getsyxPyCurses_GetWinPyCurses_HalfDelayPyCurses_has_keyPyCurses_Init_ColorPyCurses_Init_PairPyCurses_InitScrModDictPyCurses_IntrFlushPyCurses_KeyNamePyCurses_KillCharPyCurses_MetaPyCurses_NewPadPyCurses_NewWindowPyCurses_Pair_ContentPyCurses_PAIR_NUMBERPyCurses_PutpPyCurses_QiFlushPyCurses_setsyxPyCurses_Start_ColorPyCurses_UnCtrlPyCurses_UngetChPyCurses_Use_EnvPyCurses_methodsLetexthas_colorsPyInt_FromLongatexit@@GLIBC_2.0init_colorwscrl_Py_TrueStructtermattrshas_keydelay_outputtermnameis_wintouched_DYNAMICnoqiflushwsyncdown_Py_NoneStructderwin_etextpnoutrefreshPyString_Type__register_frame_info@@GLIBC_2.0start_coloruse_env_Py_ZeroStructPyDict_SetItemStringendwinwredrawlnPy_BuildValuewdelchPyErr_SetStringdoupdateclearokinit_pairwattr_onkeynamewechocharPyErr_Occurredis_linetouchedPy_FindMethodsubpadPy_InitModule4weraseputwin_PyObject_Newdef_shell_modewcursyncupsubwinerasecharnlechoreset_prog_mode_init___brk_addr@@GLIBC_2.0initcursesnocbreakPyCursesVersionmalloc@@GLIBC_2.0winnstridcoknewpadidlokcan_change_colorunctrl__deregister_frame_info@@GLIBC_2.0reset_shell_modeCOLOR_PAIRSwrefreshcbreakgetwinresettywaddnstrnonlwclrtobotkeypadwinsdellnPyCurses_ConvertToChtypePyCursesWindow_TypewgetnstrmvwinfilterPyErr_ClearPyString_AsStringsavettyPyString_FromStringnoechoPyFile_TypeintrflushPyExc_TypeErrorscrollokhalfdelayresizetermnewwinstrncmp@@GLIBC_2.0waddch__bss_startinitscrflashPyModule_GetDictwbkgdungetchimmedokwinchPyTuple_Typerawcolor_contentwmoveputpstrcat@@GLIBC_2.0metahas_icPyTuple_Size__environ@@GLIBC_2.0Py_FatalErrordelwinisendwinacs_mapwinsnstrwinsch_finileaveokcurs_setwgetch__curbrk@@GLIBC_2.0COLORSwhlinewnoutrefreshPyInt_TypeflushinpwresizeqiflushPyString_SizestdscrPyFile_AsFilenotimeoutwtouchlnPyInt_AsLongPyArg_Parse_edata_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endwsetscrregbeepwsyncupnorawwclearCOLSnewscrwattr_offbaudratenodelaykillcharmvderwinwbkgdsetlongnamePyType_TypewclrtoeolsyncokprefreshwborderLINESpair_contentdef_prog_modepechocharhas_il__gmon_start__strcpy@@GLIBC_2.0jack-3.1.1+cvs20050801/cursesmodule/precompiled/Debian-Woody/0000755000175000017500000000000010371403417021457 5ustar tbmtbmjack-3.1.1+cvs20050801/cursesmodule/precompiled/Debian-Woody/jack_cursesmodule.so0000755000175000017500000033112610371403403025530 0ustar tbmtbmELF0/4؄4 (ŞŞŞşş 4 IJÄÂÄÂČČƒťS–W™`Tş‘ˆfŽŻvhą N˛k{§J¤ˇŒHšwYaMœGś)Śš‚PĽ~‡0?p’ކD}”U^­€Ž+žmxebL˘ŁŸ°-oBł…d[—i´nƒ•t˜ľĄ¸ŤŠ!&#$@8 I",=936FRV(<j.;14\sCu%rl_zK'X‰q]Š|ZE„*‹yOg>:5c72“›/AŹQ¨””DÜT„ź!d"”& ź& 0/ 0” `” şŔÂÄÂŒĂ”ĂœĂĆƸqń;cŔ|\‹¸3. ţ•EN7ÄÂń˙ę5‚ů’Ö'bL”ń˙ZFţ¸Ub'"ćk^ L3ŔĎśĄ˘áFNÎ.ŸÝł5K6ƲBţGÂŽ§Qó]ŒZšB-{'v'3j/”& N‚ ş.5:˛Eîŕ„˙ őég§'×J#"CaËžbok"]T'Ł—('Ą˙ď:=]żĚ0 =Ŕžl#1 †ÚĂ \'!'txVŒ)Edz—#&Żœ™pĆń˙PâO ŹŢé¸r~|ô˜/HŤ+¸/‹uĂ\Df˜Ń)B3 50” öKš‘Ä;{",űg~Řáj5î°5đ_€*žăiĆń˙ œĂń˙mÖ|4Ćń˙§=ŕOzű-[Ť0s×'‚˘ţ,‚-&#˛SžLÔ—ę•Pť‹XžwĺLç}ĘH ą _DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__cxa_finalize__deregister_frame_info__register_frame_infolibc.so.6PyCursesVersion_Py_NoneStructPyErr_SetStringstrcpystrcatPyCurses_ConvertToChtypePyInt_TypePyInt_AsLongPyString_SizePyString_TypePyString_AsStringPyArg_Parsewtouchlnwredrawlnwinsdellnweraseis_wintouched_Py_TrueStruct_Py_ZeroStructwsyncupwsyncdownwcursyncupwclrtoeolwclrtobotwclearidcokimmedokPy_BuildValuewattr_onwattr_offclearokidlokkeypadleaveoknodelaynotimeoutscrolloksyncokmvwinmvderwinwmovewresizePyCursesWindow_Type_PyObject_NewstdscrdelwinfreePyTuple_TypePyTuple_SizePyExc_TypeErrorwaddchwaddnstrwbkgdwbkgdsetwborderPyErr_ClearwdelchderwinwechocharpechocharPyInt_FromLongwgetchkeynamePyString_FromStringwgetnstrwhlinewinschwinnstrwinsnstris_linetouchedpnoutrefreshwnoutrefreshPyFile_TypePyFile_AsFileputwinprefreshwrefreshwsetscrregsubpadsubwinwscrlPy_FindMethodPyType_Typebeepdef_prog_modedef_shell_modedoupdateendwinflashnocbreaknoechononlnorawreset_prog_modereset_shell_moderesettysavettyresizetermcbreakechonlrawbaudratetermattrstermnamelongnamecan_change_colorhas_colorshas_ichas_ilisendwinfilterflushinpnoqiflushcolor_contentcurs_setdelay_outputerasechargetwinhalfdelayhas_keyinit_colorinit_pairinitscrLINESPyDict_SetItemStringCOLSintrflushkillcharmetanewpadnewwinpair_contentputpqiflushstart_colorCOLORSCOLOR_PAIRSunctrlungetchuse_envinitjack_cursesPy_InitModule4PyModule_GetDictacs_mapstrncmpmallocPyErr_OccurredPy_FatalErrorlibncurses.so.4_etext_edata__bss_start_endGLIBC_2.1.3GLIBC_2.0xsi ii şş ş$ş(ş4ş8şDşHşTşXşdşhştşxş„şˆş”ş˜ş¤ş¨ş´ş¸şÄşČşÔşŘşäşčşôşřşťťťť$ť(ť4ť8ťDťHťTťXťdťhťtťxť„ťˆť”ť˜ť¤ť¨ť´ť¸ťÄťČťÔťŘťäťčťôťřťźźźź$ź(ź4ź8źDźHźTźXźdźhźtźxź„źˆź”ź˜ź¤ź¨ź´ź¸źÄźČźÔźŘźäźčźôźřź˝˝˝˝$˝(˝4˝8˝D˝H˝T˝X˝d˝h˝t˝x˝„˝ˆ˝”˝˜˝¤˝¨˝´˝¸˝Ä˝Č˝Ô˝Ř˝ä˝č˝ô˝ř˝žžžž$ž(ž4ž8žDžHžTžXždžhžtžxž„žˆž”ž˜žÄžŻĚžŘžŕž,ż0ż<ż@żLżPż\ż`żlżpż|ż€żŒżżœż żŹż°żźżŔżĚżĐżÜżŕżěżđżüżŔ ŔŔŔ Ŕ,Ŕ0Ŕ<Ŕ@ŔLŔPŔ\Ŕ`ŔlŔpŔ|Ŕ€ŔŒŔŔœŔ ŔŹŔ°ŔźŔŔŔĚŔĐŔÜŔŕŔěŔđŔüŔÁ ÁÁÁ Á,Á0Á<Á@ÁLÁPÁ\Á`ÁlÁpÁ|Á€ÁŒÁÁœÁ ÁŹÁ°ÁźÁŔÁĚÁĐÁÜÁŕÁěÁđÁüÁ Â Â,Â0Â<Â@ÂLÂPÂ\Â`ÂlÂpÂ|€Œœ ÂÔĹŔĹÄĹ'ČĹ+ĚĹ-ĐĹ/ŘĹMÜĹVŕĹXäĹcčĹlěĹnđĹ|ôĹˆřŏüĹĆ“Ć˜Ć§ Ć´Ćš¨ĂŹĂ°Ă´Ă¸ĂźĂ ŔĂ!ÄĂ"ČĂ#ĚĂ%ĐĂ&ÔĂ(ŘĂ*ÜĂ,ŕĂ-äĂ.čĂ0ěĂ1đĂ2ôĂ3řĂ4üĂ5Ä6Ä7Ä8 Ä9Ä:Ä;Ä<Ä= Ä>$Ä?(Ä@,ÄA0ÄB4ÄC8ÄD<ÄE@ÄFDÄGHÄHLÄIPÄJTÄLXÄN\ÄO`ÄPdÄRhÄSlÄTpÄUtÄVxÄW|ÄY€ÄZ„Ä[ˆÄ\ŒÄ]Ä^”Ä_˜Ä`œÄa Äb¤Äd¨ÄeŹÄf°Äg´Äh¸ÄiźÄjŔÄkÄÄmČÄoĚÄpĐÄqÔÄrŘÄsÜÄtŕÄväÄwčÄxěÄyđÄzôÄ{řÄ}üÄ~ĹŀŁ Ĺ‚ĹƒĹ„Ĺ…Ĺ† Ň$ʼn(ĹŠ,ĹŒ0ō4ĹŽ8Ő<Ĺ‘@Ĺ’DĹ”HĹ•LĹ–PĹ—TĹ™XĹš\Ĺ›`ĹœdŝhĹ lŢpĹŁtŤxĹĽ|ĹŚ€Ĺ¨„ĹЈĹŞŒĹŤĹŹ”Ĺ­˜ĹޜŰ Ĺą¤Ĺ˛¨ĹłŹĹľ°Ĺś´Ĺˇ¸Ĺ¸źĹşU‰ĺƒěSč[Ăüœč„čO č*m[ÉĂ˙ł˙Ł˙Ł héŕ˙˙˙˙ŁhéĐ˙˙˙˙ŁhéŔ˙˙˙˙Łhé°˙˙˙˙Łh é ˙˙˙˙Ł h(é˙˙˙˙Ł$h0é€˙˙˙˙Ł(h8ép˙˙˙˙Ł,h@é`˙˙˙˙Ł0hHéP˙˙˙˙Ł4hPé@˙˙˙˙Ł8hXé0˙˙˙˙Ł<h`é ˙˙˙˙Ł@hhé˙˙˙˙ŁDhpé˙˙˙˙ŁHhxéđţ˙˙˙ŁLh€éŕţ˙˙˙ŁPhˆéĐţ˙˙˙ŁThéŔţ˙˙˙ŁXh˜é°ţ˙˙˙Ł\h é ţ˙˙˙Ł`h¨éţ˙˙˙Łdh°é€ţ˙˙˙Łhh¸épţ˙˙˙ŁlhŔé`ţ˙˙˙ŁphČéPţ˙˙˙ŁthĐé@ţ˙˙˙ŁxhŘé0ţ˙˙˙Ł|hŕé ţ˙˙˙Ł€hčéţ˙˙˙Ł„hđéţ˙˙˙وhřéđý˙˙˙ٌhéŕý˙˙˙ِhéĐý˙˙˙Ł”héŔý˙˙˙٘hé°ý˙˙˙ٜh é ý˙˙˙Ł h(éý˙˙˙٤h0é€ý˙˙˙ٍh8épý˙˙˙ŁŹh@é`ý˙˙˙ٰhHéPý˙˙˙Ł´hPé@ý˙˙˙ُhXé0ý˙˙˙Łźh`é ý˙˙˙ŁŔhhéý˙˙˙ŁÄhpéý˙˙˙ŁČhxéđü˙˙˙ŁĚh€éŕü˙˙˙ŁĐhˆéĐü˙˙˙ŁÔhéŔü˙˙˙ŁŘh˜é°ü˙˙˙ŁÜh é ü˙˙˙Łŕh¨éü˙˙˙Łäh°é€ü˙˙˙Łčh¸épü˙˙˙ŁěhŔé`ü˙˙˙ŁđhČéPü˙˙˙ŁôhĐé@ü˙˙˙ŁřhŘé0ü˙˙˙Łühŕé ü˙˙˙Łhčéü˙˙˙Łhđéü˙˙˙Łhřéđű˙˙˙Ł héŕű˙˙˙ŁhéĐű˙˙˙ŁhéŔű˙˙˙Łhé°ű˙˙˙Łh é ű˙˙˙Ł h(éű˙˙˙Ł$h0é€ű˙˙˙Ł(h8épű˙˙˙Ł,h@é`ű˙˙˙Ł0hHéPű˙˙˙Ł4hPé@ű˙˙˙Ł8hXé0ű˙˙˙Ł<h`é ű˙˙˙Ł@hhéű˙˙˙ŁDhpéű˙˙˙ŁHhxéđú˙˙˙ŁLh€éŕú˙˙˙ŁPhˆéĐú˙˙˙ŁThéŔú˙˙˙ŁXh˜é°ú˙˙˙Ł\h é ú˙˙˙Ł`h¨éú˙˙˙Łdh°é€ú˙˙˙Łhh¸épú˙˙˙ŁlhŔé`ú˙˙˙ŁphČéPú˙˙˙ŁthĐé@ú˙˙˙ŁxhŘé0ú˙˙˙Ł|hŕé ú˙˙˙Ł€hčéú˙˙˙Ł„hđéú˙˙˙وhřéđů˙˙˙ٌhéŕů˙˙˙ِhéĐů˙˙˙Ł”héŔů˙˙˙٘hé°ů˙˙˙ٜh é ů˙˙˙Ł h(éů˙˙˙٤h0é€ů˙˙˙ٍh8épů˙˙˙ŁŹh@é`ů˙˙˙ٰhHéPů˙˙˙Ł´hPé@ů˙˙˙ُhXé0ů˙˙˙Łźh`é ů˙˙˙ŁŔhhéů˙˙˙ŁÄhpéů˙˙˙ŁČhxéđř˙˙˙ŁĚh€éŕř˙˙˙ŁĐhˆéĐř˙˙˙ŁÔhéŔř˙˙˙ŁŘh˜é°ř˙˙˙ŁÜh é ř˙˙˙Łŕh¨éř˙˙˙Łäh°é€ř˙˙˙Łčh¸épř˙˙˙ŁěhŔé`ř˙˙˙ŁđhČéPř˙˙˙ŁôhĐé@ř˙˙˙ŁřhŘé0ř˙˙˙Łühŕé ř˙˙˙Łhčéř˙˙˙Łhđéř˙˙˙Łhřéđ÷˙˙˙Ł héŕ÷˙˙˙ŁhéĐ÷˙˙˙ŁhéŔ÷˙˙˙Łhé°÷˙˙˙Łh é ÷˙˙˙Ł h(é÷˙˙U‰ĺƒěSč[Ă`”‹ƒt…Ŕt˙Đ[ÉÉöU‰ĺƒěSč[Ă0”ƒťlö˙˙udƒť`t.ƒÄô‹ƒ8˙0čwý˙˙ƒÄ덶‹ƒhö˙˙P‰“hö˙˙‹˙Ћƒhö˙˙ƒ8u⃝@tƒÄôƒ$˙˙˙Pč&ú˙˙ǃlö˙˙‹]čÉÍvU‰ĺƒěSč[Ă¨“[ÉÉöU‰ĺƒěSč[Ă“ƒť0tƒÄřƒxPƒ$˙˙˙Pčz÷˙˙‹]čÉÐU‰ĺƒěSč[ĂX“[ÉÉöU‰ĺƒěpVSč[Ă?“‹E ƒ}˙t ‹ƒ(˙ëK…ŔuƒÄř˙łˆö˙˙˙łč÷˙˙ë/ƒÄřPuœVč~ţ˙˙ƒÄƒÄřƒŃ˙˙PVč›ű˙˙ƒÄřV˙łč\÷˙˙1Ŕeˆ[^ÉÍvU‰ĺƒě WVSč[Ă’‹u‹} ‹ƒd9FuƒÄôVčąü˙˙ë?vƒÄôVčcü˙˙‰ÁƒÄ‹ƒ,9F”ƒů”Ŕ!Шu 1Ŕ덶ƒÄôVčĂů˙˙ž‰¸eč[^_ÉÐU‰ĺƒěSč[ĂD’ƒÄřƒŃ˙˙P˙u čKü˙˙ƒÄ…Ŕu1Ŕë;t&ƒÄřƒŃ˙˙Pj‹E‹P…Ňt żB@ëv¸˙˙˙˙PjRčîű˙˙ƒÄPč™ţ˙˙‹]čÉĂU‰ĺƒěSč[ĂԑƒÄřƒŃ˙˙P˙u čŰű˙˙ƒÄ…Ŕu1Ŕë;t&ƒÄřƒ!Ń˙˙Pj‹E‹P…Ňt żB@ëv¸˙˙˙˙PjRč~ű˙˙ƒÄPč)ţ˙˙‹]čÉĂU‰ĺƒěSč[Ăd‘ƒÄřƒŃ˙˙P˙u čkű˙˙ƒÄ…Ŕt,ƒÄřƒ*Ń˙˙PƒÄü‹E‹PżB@PjRčső˙˙ƒÄPčÎý˙˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[Ă‘ƒÄřƒŃ˙˙P˙u č ű˙˙ƒÄ…Ŕt(ƒÄřƒ4Ń˙˙PƒÄřj‹E˙pčĘ÷˙˙ƒÄPčuý˙˙ëv1Ŕ‹]čÉÐU‰ĺƒěSč[Ă¨ƒÄřƒŃ˙˙P˙u čŻú˙˙ƒÄ…Ŕt#ƒÄřƒ>Ń˙˙PƒÄô‹E˙pč°ő˙˙ƒÄPčý˙˙ë1Ŕ‹]čÉÉöU‰ĺƒěSč[ĂPƒÄřƒŃ˙˙P˙u čWú˙˙ƒÄ…Ŕt%ƒÄřƒEŃ˙˙PƒÄřj˙‹E˙pč÷˙˙ƒÄPčÁü˙˙ë1Ŕ‹]čÉĂU‰ĺƒěSč[ĂřƒÄřƒŃ˙˙P˙u č˙ů˙˙ƒÄ…Ŕu1Ŕë"ƒÄô‹E˙pčvó˙˙…Ŕt‹ƒ$닃4˙‹]čÉÐU‰ĺƒěSč[Ă ƒÄřƒŃ˙˙P˙u č§ů˙˙ƒÄ…ŔtƒÄô‹E˙pčŇů˙˙‹ƒ(˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[ĂTƒÄřƒŃ˙˙P˙u č[ů˙˙ƒÄ…ŔtƒÄô‹E˙pčöň˙˙‹ƒ(˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[ĂƒÄřƒŃ˙˙P˙u čů˙˙…Ŕu1Ŕë‹E‹@…ŔtÇ@‹ƒ(˙‹]čÉÐU‰ĺƒěSč[ĂźŽƒÄřƒŃ˙˙P˙u čĂř˙˙…Ŕu1Ŕë‹E‹@…ŔtÇ@‹ƒ(˙‹]čÉÐU‰ĺƒěSč[ĂpŽƒÄřƒŃ˙˙P˙u čwř˙˙ƒÄ…ŔtƒÄô‹E˙pčÂó˙˙‹ƒ(˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[Ă$ŽƒÄřƒŃ˙˙P˙u č+ř˙˙ƒÄ…ŔtƒÄô‹E˙pčöř˙˙‹ƒ(˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[Ă؍ƒÄřƒŃ˙˙P˙u čß÷˙˙ƒÄ…ŔtƒÄô‹E˙pčŠô˙˙‹ƒ(˙ët&1Ŕ‹]čÉÐU‰ĺƒěSč[ĂˆƒÄřƒŃ˙˙P˙u č÷˙˙ƒÄ…ŔtƒÄô‹E˙pčÚ÷˙˙‹ƒ(˙ët&1Ŕ‹]čÉÐU‰ĺƒěSč[Ă8ƒÄüEüPƒOŃ˙˙P˙u č;÷˙˙ƒÄ…ŔtƒÄřžEüP‹E˙pčó˙˙‹ƒ(˙ë1Ŕ‹]čÉĂU‰ĺƒěSč[Ă䌃ÄüEüPƒOŃ˙˙P˙u čçö˙˙ƒÄ…Ŕt$ƒÄřžEüP‹E˙pč ő˙˙‹ƒ(˙ë ´&1Ŕ‹]čÉÐU‰ĺƒěSč[ĂˆŒƒÄřƒŃ˙˙P˙u čö˙˙ƒÄ…Ŕu1Ŕë0‹E‹@š˙˙˙˙…Ŕtżş˙˙˙˙…ŔtżPƒÄüRQƒeŃ˙˙Pč”đ˙˙‹]čÉÍvU‰ĺƒěSč[Ă ŒƒÄřƒŃ˙˙P˙u č'ö˙˙ƒÄ…Ŕu1Ŕë1‹E‹@š˙˙˙˙…ŔtżHş˙˙˙˙…ŔtżP ƒÄüRQƒeŃ˙˙Pč+đ˙˙‹]čÉÉöU‰ĺƒěSč[Ă¸‹ƒÄřƒŃ˙˙P˙u čżő˙˙ƒÄ…Ŕu1Ŕë>‹E‹P…ŇtżBHë t&š˙˙˙˙…ŇtżB@ë¸˙˙˙˙ƒÄüPQƒeŃ˙˙Pčśď˙˙‹]čÉÐU‰ĺƒěSč[ĂD‹ƒÄřƒŃ˙˙P˙u čKő˙˙ƒÄ…Ŕu1Ŕë3t&‹E‹@š˙˙˙˙…Ŕt‹H4ş˙˙˙˙…Ŕt‹P0ƒÄüRQƒeŃ˙˙PčMď˙˙‹]čÉĂU‰ĺƒěSč[Ă܊ƒÄüEüPƒjŃ˙˙P˙u čßô˙˙ƒÄ…Ŕt,ƒÄřƒqŃ˙˙PƒÄř˙uü‹E˙pč]ď˙˙ƒÄPčH÷˙˙덶1Ŕ‹]čÉÐU‰ĺƒěSč[ĂxŠƒÄüEüPƒjŃ˙˙P˙u č{ô˙˙ƒÄ…Ŕt(ƒÄřƒyŃ˙˙PƒÄř˙uü‹E˙pčÉô˙˙ƒÄPčäö˙˙ë‰ö1Ŕ‹]čÉÐU‰ĺƒěSč[ĂŠƒÄüEüPƒjŃ˙˙P˙u čô˙˙ƒÄ…Ŕu1Ŕë,t&ƒÄřƒ‚Ń˙˙P‹E‹P…Ňt ‹Eü‰Bët&1ŔPčxö˙˙‹]čÉÍvU‰ĺƒěSč[Ă°‰ƒÄüEüPƒOŃ˙˙P˙u čłó˙˙ƒÄ…Ŕt(ƒÄřƒ‹Ń˙˙PƒÄřžEüP‹E˙pčî˙˙ƒÄPčö˙˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[ĂP‰ƒÄüEüPƒOŃ˙˙P˙u čSó˙˙ƒÄ…Ŕt(ƒÄřƒ“Ń˙˙PƒÄřžEüP‹E˙pč?ď˙˙ƒÄPčşő˙˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[ĂđˆƒÄüEüPƒOŃ˙˙P˙u čóň˙˙ƒÄ…Ŕt(ƒÄřƒ™Ń˙˙PƒÄřžEüP‹E˙pčŸď˙˙ƒÄPčZő˙˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[ĂˆƒÄüEüPƒOŃ˙˙P˙u č“ň˙˙ƒÄ…Ŕt(ƒÄřƒ Ń˙˙PƒÄřžEüP‹E˙pčń˙˙ƒÄPčúô˙˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[Ă0ˆƒÄüEüPƒOŃ˙˙P˙u č3ň˙˙ƒÄ…Ŕt(ƒÄřƒ¨Ń˙˙PƒÄřžEüP‹E˙pčŸň˙˙ƒÄPčšô˙˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[ĂЇƒÄüEüPƒOŃ˙˙P˙u čÓń˙˙ƒÄ…Ŕt(ƒÄřƒ°Ń˙˙PƒÄřžEüP‹E˙pčń˙˙ƒÄPč:ô˙˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[Ăp‡ƒÄüEüPƒOŃ˙˙P˙u čsń˙˙ƒÄ…Ŕt(ƒÄřƒşŃ˙˙PƒÄřžEüP‹E˙pčßî˙˙ƒÄPčÚó˙˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[Ă‡ƒÄüEüPƒĂŃ˙˙P˙u čń˙˙ƒÄ…Ŕt&ƒÄřƒÉŃ˙˙PƒÄř˙uü‹E˙pčŃí˙˙ƒÄPč|ó˙˙ë1Ŕ‹]čÉÍvU‰ĺƒěSč[Ă°†ƒÄüEüPƒOŃ˙˙P˙u čłđ˙˙ƒÄ…Ŕt(ƒÄřƒÓŃ˙˙PƒÄřžEüP‹E˙pčń˙˙ƒÄPčó˙˙ë1Ŕ‹]čÉÐU‰ĺƒěSč[ĂP†EüPEřPƒÚŃ˙˙P˙u čRđ˙˙ƒÄ…Ŕt/ƒÄřƒăŃ˙˙PƒÄü˙uü˙uř‹E˙pč=í˙˙ƒÄPč¸ň˙˙덶1Ŕ‹]čÉÐU‰ĺƒěSč[Ă腍EüPEřPƒÚŃ˙˙P˙u čęď˙˙ƒÄ…Ŕt)ƒÄřƒéŃ˙˙PƒÄü˙uü˙uř‹E˙pčuđ˙˙ƒÄPčPň˙˙ë1Ŕ‹]čÉÍvU‰ĺƒěSč[Ă„…EüPEřPƒÚŃ˙˙P˙u č†ď˙˙ƒÄ…Ŕt)ƒÄřƒňŃ˙˙PƒÄü˙uü˙uř‹E˙pčŃí˙˙ƒÄPčěń˙˙ë1Ŕ‹]čÉÍvU‰ĺƒěSč[Ă …EüPEřPƒřŃ˙˙P˙u č"ď˙˙ƒÄ…Ŕt/ƒÄřƒ Ň˙˙PƒÄü˙uü˙uř‹E˙pčî˙˙ƒÄPčˆń˙˙덶1Ŕ‹]čÉÐU‰ĺƒěSč[Ă¸„ƒÄô˙łHčę˙˙‰Â…Ňt‹E‰B‰Đë ´&1Ŕ‹]čÉÐU‰ĺƒěVSč[Ăw„‹u‹ƒh‹V;t ƒÄôRčWí˙˙ƒÄƒÄôVč{î˙˙eč[^ÉĂU‰ĺƒěWVSč[Ă6„‹u 1˙ÇEěÇEř…öt#‹ƒT9FuƒÄôVčäě˙˙ƒÄë v¸ë1Ŕƒčƒř‡›‰Ú+”ƒ$|˙˙˙âĚƒźƒ™ƒ|ƒƒÄüEüPƒŇ˙˙됍EřPEüPƒŇ˙˙PVčÇí˙˙ƒÄ…Ŕud1Ŕé÷ƒÄôEüPEôPEđPƒ3Ň˙˙덶ƒÄřEřPEüPEôPEđPƒGŇ˙˙PVč|í˙˙ƒÄ …Ŕtľżë‰öƒÄřƒdŇ˙˙ë$t&ƒÄřEěP˙uüč=ę˙˙ƒÄ…ŔuƒÄřƒ„Ň˙˙P‹ƒP˙0čç˙˙éj˙˙˙ƒ˙u9ƒÄü˙uô˙uđ‹E˙pčë˙˙ƒÄƒř˙tƒÄř‹Eě EřP‹U˙rčÔę˙˙ƒÄ‰Â됃Äř‹Eě EřP‹E˙pčˇę˙˙‰ÂƒÄƒÄřƒŤŇ˙˙PRčVď˙˙eŘ[^_ÉÉöU‰ĺƒě,WVSč[ĂŠ‚‹u ÇEřÇEě1˙ÇEč…öt ‹ƒT9FuƒÄôVč1ë˙˙ƒÄë ¸ë1Ŕƒčƒř‡Ë‰Ú+”ƒÔ}˙˙˙â‚öĚ§ƒÄüEüPƒąŇ˙˙PVč(ě˙˙ƒÄ…Ŕ…ą1ŔéJEřPEüPƒˇŇ˙˙PVčě˙˙ƒÄ…ŔtÝÇEč邉öƒÄôEüPEôPEđPƒĹŇ˙˙PVčĐë˙˙ƒÄ …ŔtŹë.ƒÄřEřPEüPEôPEđPƒ×Ň˙˙PVč§ë˙˙ƒÄ …ŔtƒÇEčżë&śƒÄřƒÓ˙˙P‹ƒP˙0čŐĺ˙˙éS˙˙˙t&ƒ}ču!‹M‹QÇEě…Ňt‹B‰Eě…Ňt‹Eř‰Bƒ˙u6ƒÄü˙uô˙uđ‹U˙rčœé˙˙ƒÄƒř˙tƒÄüj˙˙uü‹M˙qčąç˙˙ƒÄ‰ÂëƒÄüj˙˙uü‹E˙pč—ç˙˙‰ÂƒÄƒ}ču‹M‹A…Ŕt‹Mě‰HƒÄřƒ%Ó˙˙PRč`í˙˙eČ[^_ÉĂU‰ĺƒě,WVSč[Ă–€‹u ÇEôÇEč1˙ÇEä…öt%‹ƒT9FuƒÄôVč=é˙˙ƒÄë¸ët&1Ŕƒčƒř‡â‰Ú+”ƒÔ˙˙˙⍴&€őĆœEüPEřPƒ,Ó˙˙PVč'ę˙˙ƒÄ…Ŕ…Ŕ1Ŕé[ƒÄôEôPEüPEřPƒ7Ó˙˙PVčůé˙˙ƒÄ …ŔtÖÇEä銃ÄřEüPEřPEđPEěPƒHÓ˙˙PVčĆé˙˙ƒÄ …ŔtŁë7ƒÄüEôPEüPEřPEđPEěPƒYÓ˙˙PVč˜é˙˙ƒÄ …Ŕ„q˙˙˙ÇEäżë#vƒÄřƒ„Ó˙˙P‹ƒP˙0čĹă˙˙éD˙˙˙t&ƒ}äu!‹M‹QÇEč…Ňt‹B‰Eč…Ňt‹Eô‰Bƒ˙u7ƒÄü˙uđ˙uě‹U˙rčŒç˙˙ƒÄƒř˙tƒÄü˙uü˙uř‹M˙qč ĺ˙˙ƒÄ‰ÂëƒÄü˙uü˙uř‹E˙pč…ĺ˙˙‰ÂƒÄƒ}äu‹M‹A…Ŕt‹Mč‰HƒÄřƒŚÓ˙˙PRčNë˙˙eČ[^_ÉÉöU‰ĺƒě VSč[Ăƒ~‹u ÇEř…öt"‹ƒT9FuƒÄôVč:ç˙˙ƒÄë ¸ë‰ö1Ŕƒřt ƒřt$ëB‰öƒÄüEüPƒŇ˙˙PVčHč˙˙ƒÄ…Ŕu5重EřPEüPƒŇ˙˙PVč'č˙˙ƒÄ…Ŕuëi‰öƒÄřƒÄÓ˙˙ëNt&ƒÄřEôP˙uüčíä˙˙ƒÄ…Ŕt*ƒÄřƒăÓ˙˙PƒÄř˙uô‹E˙pčűĺ˙˙ƒÄPčfę˙˙ët&ƒÄřƒ„Ň˙˙P‹ƒP˙0čâ˙˙1ŔeŘ[^ÉĂU‰ĺƒě VSč[Ă}‹u ÇEř…öt%‹ƒT9FuƒÄôVč6ć˙˙ƒÄ됍t&¸ë1Ŕƒřtƒřt"ë>ƒÄüEüPƒŇ˙˙PVčCç˙˙ƒÄ…Ŕu0邍EřPEüPƒŇ˙˙PVč"ç˙˙ƒÄ…ŔuëdƒÄřƒÔ˙˙ëK‰öƒÄřEôP˙uüčíă˙˙ƒÄ…Ŕt*ƒÄř‹Eô EřP‹E˙pčĄç˙˙ƒÄřƒ&Ô˙˙Pjčdé˙˙ë‰öƒÄřƒ„Ň˙˙P‹ƒP˙0čá˙˙1ŔeŘ[^ÉĂU‰ĺƒě4Sč[Ă€|‹U ÇEüÇEřÇEôÇEđÇEěÇEčÇEäÇEŕƒÄřEüPEřPEôPEđPEěPEčPEäPEŕPƒDÔ˙˙PRč.ć˙˙ƒÄ0…Ŕt0ƒÄô˙uü˙uř˙uô˙uđ˙uě˙uč˙uä˙uŕ‹E˙pčç˙˙‹ƒ(˙ë1Ŕ‹]ČÉĂU‰ĺƒěVSč[ĂĂ{‹u ÇEřÇEüƒÄřƒŃ˙˙PVčťĺ˙˙ƒÄ…Ŕu(čßâ˙˙EüPEřPƒfÔ˙˙PVčšĺ˙˙ƒÄ…Ŕu1Ŕë+vƒÄôjjjj‹EüPP‹EřPP‹E˙pč|ć˙˙‹ƒ(˙eč[^ÉÐU‰ĺƒěWVSč[Ă.{‹}‹u …öt!‹ƒT9FuƒÄôVčéă˙˙ƒÄë ¸ë1Ŕ…Ŕt ƒřtëcvƒÄô˙wčQß˙˙‰ÂƒÄënEüPEřPƒÚŃ˙˙PVčĺä˙˙ƒÄ…Ŕu1Ŕë^ƒÄü˙uü˙uř˙wč9ă˙˙ƒÄƒř˙tƒÄô˙wčß˙˙ƒÄ‰Âë#vƒÄřƒ„Ô˙˙P‹ƒP˙0čőŢ˙˙1Ŕ됍t&ƒÄřƒ¤Ô˙˙PRčç˙˙eŘ[^_ÉĂU‰ĺƒě VSč[ĂGz‹u ÇEđÇEô…öt&‹ƒT9FuƒÄôVč÷â˙˙ƒÄ덶¸ë1Ŕƒřtƒřt#ëKEüPEřPƒŻÔ˙˙PVčä˙˙ƒÄ…ŔuCé~ƒÄřEüPEřPEôPEđPƒÄÔ˙˙PVčÖă˙˙ƒÄ …ŔuëUƒÄřƒŐ˙˙P‹ƒP˙0ë;ƒÄô˙uü˙uř˙uô˙uđ‹E˙pč^Ý˙˙ƒÄ …Ŕt ƒÄôPčŞô˙˙ëƒÄř˙łŒö˙˙˙łčŘÝ˙˙1ŔeŘ[^ÉÍvU‰ĺƒě VSč[Ă?y‹u ÇEř…öt%‹ƒT9FuƒÄôVčöá˙˙ƒÄ됍t&¸ë1Ŕƒřtƒřtë2ƒÄüEüPƒŇ˙˙ëEřPEüPƒŇ˙˙PVčóâ˙˙ƒÄ…Ŕu1Ŕ錃ÄřƒDŐ˙˙ëƒÄřEôP˙uüčťß˙˙ƒÄ…ŔuƒÄřƒ„Ő˙˙P‹ƒP˙0č Ý˙˙1ŔëP‹E‹PöB u!ƒÄřƒŚŐ˙˙PƒÄř‹Eô EřPRčCÝ˙˙됍t&ƒÄřƒŚŐ˙˙PƒÄř‹Eô EřPRč˘ă˙˙ƒÄPčíä˙˙eŘ[^ÉÉöU‰ĺƒěSč[Ă$xƒÄřƒŃ˙˙P˙u č+â˙˙ƒÄ…ŔtƒÄô‹E‹@˙pč3Ű˙˙됍t&1Ŕ‹]čÉÐU‰ĺƒěWVSč[ĂÖw‹}‹u …öt ‹ƒT9FuƒÄôVč‘ŕ˙˙ƒÄë ¸ë1Ŕ…Ŕt>ƒřuNEüPEřPƒÚŃ˙˙PVčĽá˙˙ƒÄ…Ŕu1ŔëWƒÄü˙uü˙uř˙wčůß˙˙ƒÄƒř˙t5ƒÄô˙wčśŕ˙˙ƒÄë%t&ƒÄřƒÄŐ˙˙P‹ƒP˙0čľŰ˙˙1Ŕ됍t&ƒÄôPčcÚ˙˙eŘ[^_ÉÍvU‰ĺƒěWVSč[Ă w‹}‹u …öt$‹ƒT9FuƒÄôVčĹß˙˙ƒÄë t&¸ë1Ŕ…Ŕt>ƒřuNEüPEřPƒÚŃ˙˙PVčŐŕ˙˙ƒÄ…Ŕu1Ŕë~ƒÄü˙uü˙uř˙wč)ß˙˙ƒÄƒř˙t5ƒÄô˙wčćß˙˙ƒÄë%t&ƒÄřƒÄŐ˙˙P‹ƒP˙0čĺÚ˙˙1Ŕë5t&=˙vƒÄôƒÄôPčŰ˙˙PčĂÝ˙˙됍t&ƒÄřPƒäŐ˙˙PčŒÚ˙˙eŘ[^_ÉĂU‰ĺěWVSč[Ăv‹}‹u …öt&‹ƒT9FuƒÄôVčÎŢ˙˙ƒÄë¸ëś1Ŕƒř‡‰Ú+”ƒDŠ˙˙˙âvź'Źuœuuu)uƒÄüj˙é͍śƒÄü…üű˙˙PƒćŐ˙˙PVčĽß˙˙ƒÄ…Ŕ„Ý闍…řű˙˙P…ôű˙˙PƒÚŃ˙˙PVčzß˙˙ƒÄ…Ŕ„˛ƒÄü˙ľřű˙˙˙ľôű˙˙˙wčČÝ˙˙ƒÄƒř˙ttƒÄüj˙ëTƒÄô…üű˙˙P…řű˙˙P…ôű˙˙PƒęŐ˙˙PVč$ß˙˙ƒÄ …Ŕt`ƒÄü˙ľřű˙˙˙ľôű˙˙˙wčvÝ˙˙ƒÄƒř˙t"ƒÄü˙ľüű˙˙ľü˙˙V˙wčćŰ˙˙ƒÄ‰ňë&v•ü˙˙ëƒÄřƒÖ˙˙P‹ƒP˙0čŮ˙˙1Ŕëƒř˙uƅü˙˙ƒÄôRčÜ˙˙ĽŘű˙˙[^_ÉÐU‰ĺƒě,WVSč[Ăjt‹u 1˙ÇEô…öt'‹ƒT9FuƒÄôVčÝ˙˙ƒÄë¸ë ´&1Ŕƒčƒř‡ö‰Ú+”ƒô‹˙˙˙⍴&üsÜsŹsjsEüPEřPƒ%Ö˙˙PVčŢ˙˙ƒÄë%śƒÄôEôPEüPEřPƒ6Ö˙˙PVčŕÝ˙˙ƒÄ …Ŕ…™1Ŕé‰öƒÄřEüPEřPEđPEěPƒMÖ˙˙PVčŹÝ˙˙ƒÄ …ŔtЃÄü˙uđ˙uě‹E˙pčÜ˙˙‰ÇƒÄëNƒÄüEôPEüPEřPEđPEěPƒcÖ˙˙PVčfÝ˙˙ƒÄ …ŔtŠƒÄü˙uđ˙uě‹U˙rčťŰ˙˙ƒÄƒÄřƒ„Ö˙˙ë%ƒ˙˙t[ƒÄřEčP˙uřčÚ˙˙ƒÄ…ŔuƒÄřƒ„Ň˙˙P‹ƒP˙0čj×˙˙é0˙˙˙ƒÄřƒ¤Ö˙˙PƒÄü˙uü‹Eč EôP‹E˙pčCÜ˙˙ƒÄPë ƒÄřƒňŃ˙˙PWč`ß˙˙eČ[^_ÉĂU‰ĺƒěWVSč[Ă–r‹u 1˙ÇEěÇEř…öt#‹ƒT9FuƒÄôVčDŰ˙˙ƒÄë v¸ë1Ŕƒčƒř‡›‰Ú+”ƒÄ˙˙˙â,rrůqÜqƒÄüEüPƒŇ˙˙됍EřPEüPƒŇ˙˙PVč'Ü˙˙ƒÄ…Ŕud1Ŕé÷ƒÄôEüPEôPEđPƒ3Ň˙˙덶ƒÄřEřPEüPEôPEđPƒGŇ˙˙PVčÜŰ˙˙ƒÄ …Ŕtľżë‰öƒÄřƒÄÖ˙˙ë$t&ƒÄřEěP˙uüčŘ˙˙ƒÄ…ŔuƒÄřƒ„Ň˙˙P‹ƒP˙0čďŐ˙˙éj˙˙˙ƒ˙u9ƒÄü˙uô˙uđ‹E˙pčáŮ˙˙ƒÄƒř˙tƒÄř‹Eě EřP‹U˙rčdÚ˙˙ƒÄ‰Â됃Äř‹Eě EřP‹E˙pčGÚ˙˙‰ÂƒÄƒÄřƒäÖ˙˙PRčśÝ˙˙eŘ[^_ÉÉöU‰ĺƒěWVSč[Ăęp‹}‹u …öt$‹ƒT9FuƒÄôVčĽŮ˙˙ƒÄë t&¸ë1Ŕ…Ŕtƒřtël‹W…ŇuEëXvEüPEřPƒÚŃ˙˙PVč§Ú˙˙ƒÄ…Ŕu1ŔëiƒÄü˙uü˙uř˙wčűŘ˙˙ƒÄƒř˙tG‹W…Ňtż‹J(@żR‹‹ë+1Ŕë'´&ƒÄřƒ×˙˙P‹ƒP˙0čĽÔ˙˙1Ŕ됍t&ƒÄôPčSÓ˙˙eŘ[^_ÉÍvU‰ĺěWVSč[Ă÷o‹}‹u …öt!‹ƒT9FuƒÄôVč˛Ř˙˙ƒÄë ¸ë1Ŕƒř‡‰Ú+”ƒT˙˙˙âvœoŒoeooƒÄüj˙é͍śƒÄü…üű˙˙PƒćŐ˙˙PVč•Ů˙˙ƒÄ…Ŕ„Ý闍…řű˙˙P…ôű˙˙PƒÚŃ˙˙PVčjŮ˙˙ƒÄ…Ŕ„˛ƒÄü˙ľřű˙˙˙ľôű˙˙˙wč¸×˙˙ƒÄƒř˙ttƒÄüj˙ëTƒÄô…üű˙˙P…řű˙˙P…ôű˙˙PƒęŐ˙˙PVčŮ˙˙ƒÄ …Ŕt`ƒÄü˙ľřű˙˙˙ľôű˙˙˙wčf×˙˙ƒÄƒř˙t"ƒÄü˙ľüű˙˙ľü˙˙V˙wčśÔ˙˙ƒÄ‰ňë&v•ü˙˙ëƒÄřƒ$×˙˙P‹ƒP˙0č Ó˙˙1Ŕëƒř˙uƅü˙˙ƒÄôRčôŐ˙˙ĽŘű˙˙[^_ÉÐU‰ĺƒě,WVSč[ĂZn‹u ÇEřÇEě1˙ÇEč…öt ‹ƒT9FuƒÄôVč×˙˙ƒÄë ¸ë1Ŕƒčƒř‡Ë‰Ú+”ƒ’˙˙˙âěmĆmœmwmƒÄüEüPƒąŇ˙˙PVčř×˙˙ƒÄ…Ŕ…ą1ŔéJEřPEüPƒˇŇ˙˙PVčŃ×˙˙ƒÄ…ŔtÝÇEč邉öƒÄôEüPEôPEđPƒD×˙˙PVč ×˙˙ƒÄ …ŔtŹë.ƒÄřEřPEüPEôPEđPƒR×˙˙PVčw×˙˙ƒÄ …ŔtƒÇEčżë&śƒÄřƒ„×˙˙P‹ƒP˙0čĽŃ˙˙éS˙˙˙t&ƒ}ču!‹M‹QÇEě…Ňt‹B‰Eě…Ňt‹Eř‰Bƒ˙u6ƒÄü˙uô˙uđ‹U˙rčlŐ˙˙ƒÄƒř˙tƒÄüj˙˙uü‹M˙qčáŐ˙˙ƒÄ‰ÂëƒÄüj˙˙uü‹E˙pčÇŐ˙˙‰ÂƒÄƒ}ču‹M‹A…Ŕt‹Mě‰HƒÄřƒĽ×˙˙PRč0Ů˙˙eČ[^_ÉĂU‰ĺƒě,WVSč[Ăfl‹u ÇEôÇEč1˙ÇEä…öt%‹ƒT9FuƒÄôVč Ő˙˙ƒÄë¸ët&1Ŕƒčƒř‡â‰Ú+”ƒ”˙˙˙⍴&ěkĹk–klkEüPEřPƒ,Ó˙˙PVč÷Ő˙˙ƒÄ…Ŕ…Ŕ1Ŕé[ƒÄôEôPEüPEřPƒ7Ó˙˙PVčÉŐ˙˙ƒÄ …ŔtÖÇEä銃ÄřEüPEřPEđPEěPƒHÓ˙˙PVč–Ő˙˙ƒÄ …ŔtŁë7ƒÄüEôPEüPEřPEđPEěPƒYÓ˙˙PVčhŐ˙˙ƒÄ …Ŕ„q˙˙˙ÇEäżë#vƒÄřƒÄ×˙˙P‹ƒP˙0č•Ď˙˙éD˙˙˙t&ƒ}äu!‹M‹QÇEč…Ňt‹B‰Eč…Ňt‹Eô‰Bƒ˙u7ƒÄü˙uđ˙uě‹U˙rč\Ó˙˙ƒÄƒř˙tƒÄü˙uü˙uř‹M˙qčĐÓ˙˙ƒÄ‰ÂëƒÄü˙uü˙uř‹E˙pčľÓ˙˙‰ÂƒÄƒ}äu‹M‹A…Ŕt‹Mč‰HƒÄřƒć×˙˙PRč×˙˙eČ[^_ÉÉöU‰ĺƒěSč[ĂTjƒÄüEüPƒî×˙˙P˙u čWÔ˙˙ƒÄ…Ŕu1ŔëHƒÄř˙uü‹E˙pčĎ˙˙ƒÄƒř˙uƒÄřƒŘ˙˙P‹ƒP˙0č|Î˙˙1Ŕë…Ŕt‹ƒ$닃4˙‹]čÉÍvU‰ĺƒě,WVSč[ĂÎi‹}‹u ‹Gö@ „Ÿ…öt$‹ƒT9FuƒÄôVč|Ň˙˙ƒÄë ¸ët&1ŔƒřuYEüPEřPEôPEđPEěPEčPƒDŘ˙˙PVč€Ó˙˙ƒÄ …Ŕt}ƒÄřƒ}Ř˙˙PƒÄü˙uü˙uř˙uô˙uđ˙uě˙uč˙wč"Í˙˙ƒÄ ëGƒÄřƒ¤Ř˙˙P˙łč—Í˙˙ë9ƒÄřƒŃ˙˙PVč%Ó˙˙ƒÄ…Ŕt"ƒÄřƒÚŘ˙˙PƒÄô˙wčyŇ˙˙ƒÄPč”Ő˙˙ë‰ö1ŔeČ[^_ÉÉöU‰ĺƒěSč[ĂÄhƒÄüEüPƒçŘ˙˙P˙u čÇŇ˙˙ƒÄ…Ŕt[‹Uü‹ƒL9Bu6ƒÄřƒ#Ů˙˙PƒÄřƒÄôRč\Ň˙˙ƒÄP‹E˙pč˝Í˙˙ƒÄPčŐ˙˙덶ƒÄřƒŮ˙˙P‹ƒP˙0čĹĚ˙˙1Ŕ‹]čÉÉöU‰ĺƒěSč[Ă0hEüPEřPƒ*Ů˙˙P˙u č2Ň˙˙ƒÄ…Ŕt/ƒÄřƒ7Ů˙˙PƒÄü˙uü˙uř‹E˙pč=Ě˙˙ƒÄPč˜Ô˙˙덶1Ŕ‹]čÉÐU‰ĺƒě,WVSč[ĂĆg‹}‹u ‹Gö@ „ …öt#‹ƒT9FuƒÄôVčtĐ˙˙ƒÄë v¸ë1ŔƒřuXEüPEřPEôPEđPEěPEčPƒDŘ˙˙PVčyŃ˙˙ƒÄ …Ŕt}ƒÄřƒ@Ů˙˙PƒÄü˙uü˙uř˙uô˙uđ˙uě˙uč˙wčKŇ˙˙ƒÄ ëIƒÄřƒdŮ˙˙P˙łč‘Ë˙˙ë:vƒÄřƒŃ˙˙PVčŃ˙˙ƒÄ…Ŕt ƒÄřƒ—Ů˙˙PƒÄô˙wč`Í˙˙ƒÄPč‹Ó˙˙ë1ŔeČ[^_ÉÍvU‰ĺƒěSč[ĂźfEüPEřPƒ Ů˙˙P˙u čžĐ˙˙ƒÄ…Ŕt+ƒÄřƒąŮ˙˙PƒÄü˙uü˙uř‹E˙pčšĐ˙˙ƒÄPč$Ó˙˙ë‰ö1Ŕ‹]čÉÐU‰ĺƒě$Sč[ĂXfƒÄřEüPEřPEôPEđPƒÄÔ˙˙P˙u čOĐ˙˙ƒÄ …Ŕt`‹E‹@ö@ tƒÄô˙uü˙uř˙uô˙uđPč'Ë˙˙ëƒÄô˙uü˙uř˙uô˙uđPč€Ë˙˙ƒÄ …Ŕt ƒÄôPčá˙˙ë‰öƒÄř˙łŒö˙˙˙łčHĘ˙˙1Ŕ‹]ŘÉÐU‰ĺƒě WVSč[Ă˛e‹}‹u …öt%‹ƒT9FuƒÄôVčmÎ˙˙ƒÄë¸ë t&1Ŕ…Ŕt ƒřtëSvƒÄřƒźŮ˙˙PƒÄřjë+ƒÄüEüPƒĂŮ˙˙PVčgĎ˙˙ƒÄ…Ŕt;ƒÄřƒźŮ˙˙PƒÄř˙uü˙wčˆČ˙˙ƒÄPčÓŃ˙˙됃ÄřƒäŮ˙˙P‹ƒP˙0č…É˙˙1Ŕeč[^_ÉÍvU‰ĺƒěWVSč[Ăęd‹}‹u …öt$‹ƒT9FuƒÄôVčĽÍ˙˙ƒÄë t&¸ë1Ŕƒřtƒřt-ë{EüPEřPƒÚ˙˙PVč˛Î˙˙ƒÄ…ŔtvƒÄřƒÚ˙˙Pjë1ƒÄôEôPEüPEřPƒ Ú˙˙PVč€Î˙˙ƒÄ …ŔtDƒÄřƒÚ˙˙P˙uô˙uü˙uř˙wč>Î˙˙ƒÄPčéĐ˙˙ë ´&ƒÄřƒDÚ˙˙P‹ƒP˙0č•Č˙˙1ŔeŘ[^_ÉÍvU‰ĺƒě,WVSč[Ăúc‹u 1˙ÇEô…öt'‹ƒT9FuƒÄôVčŻĚ˙˙ƒÄë¸ë ´&1Ŕƒčƒř‡ö‰Ú+”ƒdœ˙˙˙⍴&ŒclcÜ˙˙Pč\Ć˙˙PčšÍ˙˙ëƒÄřƒÜ˙˙P˙łčOĹ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[Ăź`ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čşĘ˙˙ƒÄ…Ŕt,ƒÄřƒMÜ˙˙PčĹ˙˙Pč2Í˙˙ëƒÄřƒÜ˙˙P˙łčçÄ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[ĂT`ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čRĘ˙˙ƒÄ…Ŕt,ƒÄřƒVÜ˙˙Pč\Ä˙˙PčĘĚ˙˙ëƒÄřƒÜ˙˙P˙łčÄ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[Ăě_ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čęÉ˙˙ƒÄ…Ŕt,ƒÄřƒ]Ü˙˙PčÔÇ˙˙PčbĚ˙˙ëƒÄřƒÜ˙˙P˙łčÄ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[Ă„_ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u č‚É˙˙ƒÄ…Ŕt,ƒÄřƒcÜ˙˙Pč,Ĺ˙˙PčúË˙˙ëƒÄřƒÜ˙˙P˙łčŻĂ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[Ă_ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čÉ˙˙ƒÄ…Ŕt,ƒÄřƒlÜ˙˙PčtĆ˙˙Pč’Ë˙˙ëƒÄřƒÜ˙˙P˙łčGĂ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[Ă´^ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u č˛Č˙˙ƒÄ…Ŕt,ƒÄřƒsÜ˙˙PčLĹ˙˙Pč*Ë˙˙ëƒÄřƒÜ˙˙P˙łčßÂ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[ĂL^ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čJČ˙˙ƒÄ…Ŕt,ƒÄřƒxÜ˙˙Pč„Č˙˙PčÂĘ˙˙ëƒÄřƒÜ˙˙P˙łčwÂ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[Ăä]ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čâÇ˙˙ƒÄ…Ŕt,ƒÄřƒ~Ü˙˙Pč|Ă˙˙PčZĘ˙˙ëƒÄřƒÜ˙˙P˙łčÂ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[Ă|]ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čzÇ˙˙ƒÄ…Ŕt,ƒÄřƒŽÜ˙˙Pč´Ă˙˙PčňÉ˙˙ëƒÄřƒÜ˙˙P˙łč§Á˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[Ă]ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čÇ˙˙ƒÄ…Ŕt,ƒÄřƒŸÜ˙˙PčŒĂ˙˙PčŠÉ˙˙ëƒÄřƒÜ˙˙P˙łč?Á˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[ĂŹ\ƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čŞĆ˙˙ƒÄ…Ŕt,ƒÄřƒ§Ü˙˙PčäĂ˙˙Pč"É˙˙ëƒÄřƒÜ˙˙P˙łč×Ŕ˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[ĂD\ƒťö˙˙uIEüPEřPƒÚŃ˙˙P˙u č=Ć˙˙ƒÄ…Ŕt@‹ƒ(˙ƒÄřƒŻÜ˙˙PƒÄř˙uü˙uřčĆĂ˙˙ƒÄPčĄČ˙˙ëƒÄřƒÜ˙˙P˙łčVŔ˙˙1Ŕ‹]čÉÍvU‰ĺƒěVSč[Ăż[‹u ÇEüƒťö˙˙tƒÄřƒÜ˙˙P˙ł馍t&…öt#‹ƒT9FuƒÄôVčTÄ˙˙ƒÄë v¸ë1Ŕ…Ŕtƒřtë\ƒÄřƒşÜ˙˙PčŮÁ˙˙ëAƒÄüEüPƒOŃ˙˙PVčSĹ˙˙ƒÄ…ŔtGƒ}ütƒÄřƒşÜ˙˙Pč§Á˙˙ëƒÄřƒşÜ˙˙PčćŔ˙˙Pč´Ç˙˙ë‰öƒÄřƒÄÜ˙˙P‹ƒP˙0čeż˙˙1Ŕeč[^ÉĂU‰ĺƒěVSč[ĂĎZ‹u ÇEüƒťö˙˙tƒÄřƒÜ˙˙P˙ł馍t&…öt#‹ƒT9FuƒÄôVčdĂ˙˙ƒÄë v¸ë1Ŕ…Ŕtƒřtë\ƒÄřƒäÜ˙˙PčŔ˙˙ëAƒÄüEüPƒOŃ˙˙PVčcÄ˙˙ƒÄ…ŔtGƒ}ütƒÄřƒäÜ˙˙Pčçż˙˙ëƒÄřƒäÜ˙˙PčŚÁ˙˙PčÄĆ˙˙ë‰öƒÄřƒéÜ˙˙P‹ƒP˙0čuž˙˙1Ŕeč[^ÉĂU‰ĺƒěVSč[ĂßY‹u ÇEüƒťö˙˙tƒÄřƒÜ˙˙P˙ł馍t&…öt#‹ƒT9FuƒÄôVčtÂ˙˙ƒÄë v¸ë1Ŕ…Ŕtƒřtë\ƒÄřƒÝ˙˙Pčż˙˙ëAƒÄüEüPƒOŃ˙˙PVčsĂ˙˙ƒÄ…ŔtGƒ}ütƒÄřƒÝ˙˙Pčçž˙˙ëƒÄřƒÝ˙˙Pčöż˙˙PčÔĹ˙˙ë‰öƒÄřƒ Ý˙˙P‹ƒP˙0腽˙˙1Ŕeč[^ÉĂU‰ĺƒěVSč[ĂďX‹u ÇEüƒťö˙˙tƒÄřƒÜ˙˙P˙ł馍t&…öt#‹ƒT9FuƒÄôVč„Á˙˙ƒÄë v¸ë1Ŕ…Ŕtƒřtë\ƒÄřƒ&Ý˙˙PčéŔ˙˙ëAƒÄüEüPƒOŃ˙˙PVčƒÂ˙˙ƒÄ…ŔtGƒ}ütƒÄřƒ&Ý˙˙PčˇŔ˙˙ëƒÄřƒ&Ý˙˙PčŚÂ˙˙PčäÄ˙˙ë‰öƒÄřƒ*Ý˙˙P‹ƒP˙0蕼˙˙1Ŕeč[^ÉĂU‰ĺƒěSč[ĂXƒťö˙˙u)ƒÄřƒŃ˙˙P˙u čţÁ˙˙ƒÄ…Ŕt%ƒÄôčoÂ˙˙Pč ť˙˙ëƒÄřƒÜ˙˙P˙łč2ź˙˙1Ŕ‹]čÉÍvU‰ĺƒěSč[ĂœWƒťö˙˙u0ƒÄřƒŃ˙˙P˙u čšÁ˙˙ƒÄ…Ŕt,ƒÄôčŰş˙˙P輺˙˙덴&ƒÄřƒÜ˙˙P˙łčÇť˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[Ă4Wƒťö˙˙u)ƒÄřƒŃ˙˙P˙u č2Á˙˙ƒÄ…Ŕt%ƒÄô裺˙˙Pč}ž˙˙ëƒÄřƒÜ˙˙P˙łčfť˙˙1Ŕ‹]čÉÍvU‰ĺƒěSč[ĂĐVƒťö˙˙u)ƒÄřƒŃ˙˙P˙u čÎŔ˙˙ƒÄ…Ŕt%ƒÄôčÁ˙˙Pčž˙˙ëƒÄřƒÜ˙˙P˙łčť˙˙1Ŕ‹]čÉÍvU‰ĺƒěSč[ĂlVƒťö˙˙t ƒÄřƒÜ˙˙P˙łčÇş˙˙1Ŕë@´&ƒÄřƒŃ˙˙P˙u čJŔ˙˙ƒÄ…Ŕu1ŔëvčWź˙˙„Ŕt‹ƒ$닃4˙‹]čÉÉöU‰ĺƒěSč[ĂđUƒťö˙˙tƒÄřƒÜ˙˙P˙łčKş˙˙1Ŕë6ƒÄřƒŃ˙˙P˙u čŐż˙˙ƒÄ…Ŕu1ŔëčŐ¸˙˙„Ŕt‹ƒ$닃4˙‹]čÉĂU‰ĺƒěSč[Ă€Uƒťö˙˙tƒÄřƒÜ˙˙P˙łčŰš˙˙1Ŕë6ƒÄřƒŃ˙˙P˙u čeż˙˙ƒÄ…Ŕu1Ŕëčž˙˙…Ŕt‹ƒ$닃4˙‹]čÉĂU‰ĺƒěSč[ĂUƒťö˙˙tƒÄřƒÜ˙˙P˙łčkš˙˙1Ŕë6ƒÄřƒŃ˙˙P˙u čőž˙˙ƒÄ…Ŕu1Ŕëč5Ŕ˙˙…Ŕt‹ƒ$닃4˙‹]čÉĂU‰ĺƒěSč[Ă Tƒťö˙˙tƒÄřƒÜ˙˙P˙łčű¸˙˙1Ŕë6ƒÄřƒŃ˙˙P˙u 腾˙˙ƒÄ…Ŕu1Ŕëče˝˙˙…Ŕt‹ƒ$닃4˙‹]čÉĂU‰ĺƒěSč[Ă0Tƒťö˙˙u(ƒÄřƒŃ˙˙P˙u č.ž˙˙ƒÄ…Ŕt$čBť˙˙‹ƒ(˙ëƒÄřƒÜ˙˙P˙łčc¸˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[ĂĐSƒťö˙˙u(ƒÄřƒŃ˙˙P˙u čν˙˙ƒÄ…Ŕt$čB˝˙˙‹ƒ(˙ëƒÄřƒÜ˙˙P˙łč¸˙˙1Ŕ‹]čÉĂU‰ĺƒěSč[ĂpSƒťö˙˙u(ƒÄřƒŃ˙˙P˙u čn˝˙˙ƒÄ…Ŕt$čˇ˙˙‹ƒ(˙ëƒÄřƒÜ˙˙P˙ł裡˙˙1Ŕ‹]čÉĂU‰ĺƒěVSč[ĂS‹u ƒťö˙˙tƒÄřƒÜ˙˙鐉öƒť”ö˙˙t ƒÄřƒGÝ˙˙ëz…öt‹ƒT9Fu%ƒÄôVč ť˙˙ƒÄƒřtƒÄřƒ„Ý˙˙P‹ƒP˙0ëMƒÄüEţPƒŚÝ˙˙PVč°ź˙˙ƒÄ…Ŕu1ŔëTEüPEúPEřPżEţPčďş˙˙ƒÄƒř˙uƒÄřƒÄÝ˙˙P˙łčŇś˙˙1Ŕë‰öżEüPżEúPżEřPƒŽÝ˙˙P葶˙˙eč[^ÉÉöU‰ĺƒěVSč[ĂR‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łčsś˙˙邉öƒť”ö˙˙t ƒÄřƒGÝ˙˙ëمöt‹ƒT9Fu-ƒÄôVč ş˙˙ƒÄƒřtƒÄřƒŢ˙˙P‹ƒP˙0č!ś˙˙ë3vƒÄüEüPƒ#Ţ˙˙PV訝˙˙ƒÄ…ŔtƒÄô‹EüÁŕP貴˙˙ët&1Ŕeč[^ÉÍvU‰ĺƒěVSč[ĂSQ‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łë4‰ö…öt<‹ƒT9FuƒÄôVčôš˙˙ƒÄƒřu ƒÄřƒ,Ţ˙˙P‹ƒP˙0čuľ˙˙1ŔëUt&ƒÄüEüPƒIŢ˙˙PVčřş˙˙ƒÄ…Ŕu1Ŕë1ƒÄô˙uüčş˙˙‰ÂƒÄƒú˙t ƒÄôRčîł˙˙ëƒÄřƒOŢ˙˙PRčP˝˙˙eč[^ÉÐU‰ĺƒěVSč[Ă‡P‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łčß´˙˙é~…öt:‹ƒT9FuƒÄôVč"š˙˙ƒÄƒřuƒÄřƒdŢ˙˙P‹ƒP˙0裴˙˙ëEt&ƒÄüEüPƒ…Ţ˙˙PVč(ş˙˙ƒÄ…Ŕt%ƒÄřƒŠŢ˙˙PƒÄô˙uüč|ł˙˙ƒÄP藼˙˙됍t&1Ŕeč[^ÉÍvU‰ĺƒěSč[ĂÄOƒťö˙˙u/ƒÄřƒŃ˙˙P˙u čš˙˙ƒÄ…Ŕt+č6ľ˙˙ˆE˙ƒÄôE˙Pčˇ˙˙ëƒÄřƒÜ˙˙P˙łčđł˙˙1Ŕ‹]čÉÐU‰ĺƒěSč[Ă\Oƒťö˙˙t ƒÄřƒÜ˙˙P˙ł衳˙˙1ŔëY´&ƒÄřƒŃ˙˙P˙u č:š˙˙ƒÄ…Ŕu1Ŕë5v‹ƒh‹š˙˙˙˙…Ŕtżş˙˙˙˙…ŔtżPƒÄüRQƒeŃ˙˙Pč:ł˙˙‹]čÉÐU‰ĺƒěSč[ĂČNƒťö˙˙t ƒÄřƒÜ˙˙PëmƒÄüEüPƒçŘ˙˙P˙u 蜸˙˙ƒÄ…Ŕt[‹Uü‹ƒL9BtƒÄřƒŮ˙˙P‹ƒP˙0ë4ƒÄôƒÄôRč@¸˙˙Pčú´˙˙ƒÄ …Ŕt ƒÄôPč†É˙˙ëƒÄř˙łŒö˙˙˙łč´˛˙˙1Ŕ‹]čÉÐU‰ĺƒěVSč[ĂN‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łë`…öt!‹ƒT9FuƒÄôVčÂś˙˙ƒÄë ¸ë1Ŕƒřu"ƒÄüE˙Pƒ—Ţ˙˙PVčÚˇ˙˙ƒÄ…Ŕu'1ŔëCvƒÄřƒ Ţ˙˙P‹ƒP˙0č˛˙˙1Ŕë%t&ƒÄřƒžŢ˙˙PƒÄôśE˙Pč5ľ˙˙ƒÄPč ş˙˙eč[^ÉÐU‰ĺƒěSč[ĂXMƒťö˙˙tƒÄřƒÜ˙˙P˙łčłą˙˙1ŔëCvƒÄüEüPƒČŢ˙˙P˙u č6ˇ˙˙ƒÄ…Ŕu1ŔëƒÄô˙uü耰˙˙…Ŕt‹ƒ$닃4˙‹]čÉÍvU‰ĺƒěVSč[Ă×L‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙ł镍vƒť”ö˙˙tƒÄřƒGÝ˙˙P˙łëwt&…öt#‹ƒT9FuƒÄôVčTľ˙˙ƒÄë v¸ë1Ŕƒřu2ƒÄřEţPEüPEúPEřPƒĘŢ˙˙PVč^ś˙˙ƒÄ …Ŕu+1ŔëS´&ƒÄřƒäŢ˙˙P‹ƒP˙0蕰˙˙1Ŕë1t&ƒÄřƒß˙˙PżEţPżEüPżEúPżEřPč9Ż˙˙ƒÄP蔸˙˙eč[^ÉÐU‰ĺƒěVSč[ĂËK‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łč#°˙˙颉öƒť”ö˙˙t ƒÄřƒGÝ˙˙ëمöt‹ƒT9FuƒÄôVčP´˙˙ƒÄƒřtƒÄřƒ$ß˙˙P‹ƒP˙0čŃŻ˙˙ëSvƒÄôEţPEüPEúPƒCß˙˙PVčPľ˙˙ƒÄ …Ŕt-ƒÄřƒTß˙˙PƒÄüżEţPżEüPżEúP踯˙˙ƒÄP賡˙˙ë1Ŕeč[^ÉÍvU‰ĺƒě WVSč[ĂâJƒÄřƒŃ˙˙P˙u čé´˙˙ƒÄ…Ŕu1Ŕé䃝ö˙˙uƒÄô‹łh˙6č"ą˙˙ƒÄô˙6éźčٞ˙˙‰Ç…˙u!ƒÄř˙łŒö˙˙˙łčůŽ˙˙1Ŕ雍śÇƒö˙˙ƒÄô‹ƒp˙0蒭˙˙‰ĆƒÄüVƒ^ß˙˙P˙ł”čjŽ˙˙˙ƒÄ ƒ>uƒÄô‹FV‹@˙ЃÄƒÄô‹ƒl˙0čQ­˙˙‰ĆƒÄüVƒdß˙˙P˙ł”č)Ž˙˙˙ƒÄ ƒ>uƒÄô‹FV‹@˙ЃÄƒÄôWčĹ˙˙eč[^_ÉÍvU‰ĺƒěVSč[ĂżI‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łë`…öt!‹ƒT9FuƒÄôVčb˛˙˙ƒÄë ¸ë1Ŕƒřu"ƒÄüEüPƒiß˙˙PVčzł˙˙ƒÄ…Ŕu'1ŔëEvƒÄřƒ}ß˙˙P‹ƒP˙0čľ­˙˙1Ŕë't&ƒÄřƒ›ß˙˙PƒÄřžEüPjčł°˙˙ƒÄPčžľ˙˙eč[^ÉÍvU‰ĺƒěSč[ĂôHƒťö˙˙tƒÄřƒÜ˙˙P˙łčO­˙˙1ŔëBƒÄüEüPƒČŢ˙˙P˙u čŐ˛˙˙ƒÄ…Ŕu1Ŕë!ƒÄô˙uüčo­˙˙ƒÄôƒÄ…ŔuƒŃ˙˙Pč °˙˙‹]čÉĂU‰ĺƒěSč[ĂxHƒÄřƒŃ˙˙P˙u č˛˙˙ƒÄ…Ŕtčł˙˙ˆE˙ƒÄôE˙PčÄŻ˙˙덶1Ŕ‹]čÉÐU‰ĺƒěVSč[Ă'H‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łëhś…öt#‹ƒT9FuƒÄôVčİ˙˙ƒÄë v¸ë1Ŕƒřu"ƒÄüEüPƒiß˙˙PVčÚą˙˙ƒÄ…Ŕu'1ŔëKvƒÄřƒĽß˙˙P‹ƒP˙0čŹ˙˙1Ŕë-t&ƒÄřƒžß˙˙PƒÄřžEüP‹ƒh˙0č-°˙˙ƒÄPč´˙˙eč[^ÉÐU‰ĺƒěSč[ĂPGƒťö˙˙t ƒÄřƒÜ˙˙PëGEüPEřPƒĂß˙˙P˙u č=ą˙˙ƒÄ…Ŕt4ƒÄř˙uü˙uřč(­˙˙ƒÄ…Ŕt ƒÄôPč4Â˙˙ëƒÄř˙łŒö˙˙˙łčbŤ˙˙1Ŕ‹]čÉÍvU‰ĺƒě VSč[ĂËF‹u ƒťö˙˙tƒÄřƒÜ˙˙Péօöt ‹ƒT9FuƒÄôVčqŻ˙˙ƒÄë ¸ë1Ŕƒřtƒřt5ëpEüPEřPƒĂß˙˙PV肰˙˙ƒÄ…Ŕ„ƒÄř˙uü˙uřčiŹ˙˙ƒÄëXƒÄřEôPEđPEüPEřPƒÄÔ˙˙PVčD°˙˙ƒÄ …ŔtU˙uô˙uđ˙uü˙uřčě­˙˙ƒÄëƒÄřƒäß˙˙P‹ƒP˙0ë&´&…Ŕt ƒÄôPčÁ˙˙됃Äř˙łŒö˙˙˙łčHŞ˙˙1ŔeŘ[^ÉÍvU‰ĺƒěVSč[ĂŻE‹u ƒťö˙˙tƒÄřƒÜ˙˙黉öƒť”ö˙˙tƒÄřƒGÝ˙˙颅öt%‹ƒT9FuƒÄôVč=Ž˙˙ƒÄë¸ët&1ŔƒřuƒÄüEţPƒŕ˙˙PVčQŻ˙˙ƒÄ…ŔuëaƒÄřƒ$ŕ˙˙P‹ƒP˙0ëHƒÄüEüPEúPżEţPč?°˙˙ƒÄ…ŔtƒÄüżEüPżEúPƒeŃ˙˙Pč?Š˙˙됃Äřƒdŕ˙˙P˙łčGŠ˙˙1Ŕeč[^ÉÉöU‰ĺƒěVSč[ĂŻD‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łé}ƒť”ö˙˙tƒÄřƒGÝ˙˙P˙łëb…öt#‹ƒT9FuƒÄôVč4­˙˙ƒÄë v¸ë1Ŕƒřu"ƒÄüEüPƒ”ŕ˙˙PVčJŽ˙˙ƒÄ…Ŕu'1Ŕë0vƒÄřƒ¤ŕ˙˙P‹ƒP˙0腨˙˙1Ŕ됍t&ƒÄôśEýPč/§˙˙eč[^ÉĂU‰ĺƒěSč[ĂÜCƒÄüEüPƒąŇ˙˙P˙u čß­˙˙ƒÄ…Ŕt ƒÄřƒÄŕ˙˙PƒÄô˙uüčCŹ˙˙ƒÄPčN°˙˙ë1Ŕ‹]čÉÐU‰ĺƒěVSč[ĂƒC‹u ÇEüƒťö˙˙tƒÄřƒÜ˙˙P˙łë…öt'‹ƒT9FuƒÄôVčŹ˙˙ƒÄë¸ë ´&1Ŕ…Ŕt&ƒřu7ƒÄüEüPƒOŃ˙˙PVč-­˙˙ƒÄ…Ŕt3ƒ}üt蝏˙˙ëč´Ś˙˙‹ƒ(˙ëƒÄřƒ Ý˙˙P‹ƒP˙0čS§˙˙1Ŕeč[^ÉÉöU‰ĺƒěVSč[ĂťB‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łč§˙˙ë}t&…öt‹ƒT9FuƒÄôVčTŤ˙˙ƒÄƒřt ƒÄřƒÉŕ˙˙P‹ƒP˙0čŐŚ˙˙ë?´&EüPEřPƒćŕ˙˙PVčWŹ˙˙…Ŕt‹ƒh‹‹Eřf‰‹Eüf‰B‹ƒ(˙ë1Ŕeč[^ÉÍvU‰ĺƒěVSč[ĂűAƒťö˙˙tƒÄřƒÜ˙˙éʐƒÄřƒŃ˙˙P˙u čęŤ˙˙ƒÄ…Ŕ„¸čşĽ˙˙ƒř˙„•ǃ”ö˙˙ƒÄô‹ƒ\˙0čפ˙˙‰ĆƒÄüVƒđŕ˙˙P˙ł”诼˙˙˙ƒÄ ƒ>uƒÄô‹FV‹@˙ЃÄƒÄô‹ƒD˙0薤˙˙‰ĆƒÄüVƒ÷ŕ˙˙P˙ł”čnĽ˙˙˙ƒÄ ƒ>u ƒÄô‹FV‹@˙Ћƒ(˙ë‰öƒÄřƒá˙˙P˙ł臥˙˙1Ŕeč[^ÉÉöU‰ĺƒěSč[Ăđ@ƒťö˙˙tƒÄřƒÜ˙˙P˙łë\‰öƒÄüEüPƒŇ˙˙P˙u čÖŞ˙˙ƒÄ…Ŕu1Ŕëc‹Eü‹P;“duƒÄôP褪˙˙ë5ś;“,tƒÄřƒ$á˙˙P‹ƒP˙0čí¤˙˙1Ŕë!ƒÄôPčŔ§˙˙žƒÄƒÄôƒÄôP螦˙˙Pčȧ˙˙‹]čÉÍvU‰ĺƒěSč[Ă4@ƒťö˙˙tƒÄřƒÜ˙˙P˙łë`śƒÄüEüPƒŇ˙˙P˙u čŞ˙˙ƒÄ…Ŕu1Ŕëm‹Eü‹P;“duƒÄôPčäŠ˙˙‰Âë3t&;“,tƒÄřƒ$á˙˙P‹ƒP˙0č-¤˙˙1Ŕë+ƒÄôPč§˙˙žƒÄƒÄřƒDá˙˙PƒÄôRč×§˙˙ƒÄPč2Ź˙˙‹]čÉÐU‰ĺƒěVSč[Ăk?‹u ƒťö˙˙tƒÄřƒÜ˙˙P˙łëb…öt&‹ƒT9FuƒÄôVč¨˙˙ƒÄë¸ëś1ŔƒřuƒÄüEüPƒiß˙˙PVč!Š˙˙ƒÄ…Ŕu1Ŕë0ƒÄřƒLá˙˙P‹ƒP˙0č_Ł˙˙1ŔëƒÄôžEüPčî˘˙˙‹ƒ(˙eč[^ÉÍvU‰ĺƒě,WVSč[ĂŽ>ƒÄôhďjjƒű˙˙Pƒ}â˙˙P踣˙˙ƒÄ ƒÄôP菌˙˙‰Eü‰ƒ”ƒÄôƒ‰â˙˙PčäĽ˙˙‰ƒƒÄ ƒÄüPƒ–â˙˙P‹EüPčw˘˙˙ƒÄô‹ƒ<˙0衼˙˙‰ĆƒÄ ƒÄüVƒœâ˙˙P‹EüPčN˘˙˙ƒÄüVƒ¤â˙˙P‹EüPč:˘˙˙˙ƒÄ ƒ>uƒÄô‹FV‹@˙ЃÄƒÄüƒÄô‹łX˙ś°čĄ˙˙Pƒ°â˙˙P˙ł”č÷Ą˙˙ƒÄ ƒÄüƒÄô˙ś´čó ˙˙Pƒ˝â˙˙P˙ł”čĐĄ˙˙ƒÄ ƒÄüƒÄô˙śŹčĚ ˙˙PƒĘâ˙˙P˙ł”芥˙˙ƒÄ ƒÄüƒÄô˙ś¨輠˙˙Pƒ×â˙˙P˙ł”股˙˙ƒÄ ƒÄüƒÄô˙śĐč~ ˙˙Pƒäâ˙˙P˙ł”č[Ą˙˙ƒÄ ƒÄüƒÄô˙śÔčW ˙˙Pƒíâ˙˙P˙ł”č4Ą˙˙ƒÄ ƒÄüƒÄô˙śŘč0 ˙˙Pƒöâ˙˙P˙ł”č Ą˙˙ƒÄ ƒÄüƒÄô˙śÜč  ˙˙Pƒ˙â˙˙P˙ł”čć ˙˙ƒÄ ƒÄüƒÄô˙śÄčâŸ˙˙Pƒă˙˙P˙ł”čż ˙˙ƒÄ ƒÄüƒÄô˙śŕ軟˙˙Pƒă˙˙P˙ł”蘠˙˙ƒÄ ƒÄüƒÄô˙ś¸蔟˙˙Pƒă˙˙P˙ł”čq ˙˙ƒÄ ƒÄüƒÄô˙śźčmŸ˙˙Pƒ%ă˙˙P˙ł”čJ ˙˙ƒÄ ƒÄüƒÄô˙śĚčFŸ˙˙Pƒ,ă˙˙P˙ł”č# ˙˙ƒÄ ƒÄüƒÄô˙ś€čŸ˙˙Pƒ3ă˙˙P˙ł”čüŸ˙˙ƒÄ ƒÄüƒÄô˙ś„čřž˙˙Pƒ?ă˙˙P˙ł”č՟˙˙ƒÄ ƒÄüƒÄô˙ś˜čў˙˙PƒKă˙˙P˙ł”讟˙˙ƒÄ ƒÄüƒÄô˙śœ語˙˙PƒVă˙˙P˙ł”臟˙˙ƒÄ ƒÄüƒÄô˙śř胞˙˙Pƒbă˙˙P˙ł”č`Ÿ˙˙ƒÄ ƒÄüƒÄô˙ś°č\ž˙˙Pƒmă˙˙P˙ł”č9Ÿ˙˙ƒÄ ƒÄüƒÄô˙śŹč5ž˙˙Pƒxă˙˙P˙ł”čŸ˙˙ƒÄ ƒÄüƒÄô˙ś¸čž˙˙Pƒƒă˙˙P˙ł”čëž˙˙ƒÄ ƒÄüƒÄô˙ś´čç˙˙PƒŽă˙˙P˙ł”čĞ˙˙ƒÄ ƒÄüƒÄô˙ś čŔ˙˙Pƒ™ă˙˙P˙ł”蝞˙˙ƒÄ ƒÄüƒÄô˙ś¤虝˙˙PƒŁă˙˙P˙ł”čvž˙˙ƒÄ ƒÄüƒÄô˙śŔčr˙˙PƒŻă˙˙P˙ł”čOž˙˙ƒÄ ƒÄüƒÄô˙śŔčK˙˙Pƒšă˙˙P˙ł”č(ž˙˙ƒÄ ƒÄüƒÄô˙śäč$˙˙PƒŔă˙˙P˙ł”čž˙˙ƒÄ ƒÄüƒÄô˙śččýœ˙˙PƒËă˙˙P˙ł”čڝ˙˙ƒÄ ƒÄüƒÄô˙śěč֜˙˙PƒÖă˙˙P˙ł”賝˙˙ƒÄ ƒÄüƒÄô˙śđ诜˙˙PƒÝă˙˙P˙ł”茝˙˙ƒÄ ƒÄüƒÄô˙śô舜˙˙Pƒčă˙˙P˙ł”če˙˙ƒÄ ƒÄüƒÄô˙ś°čaœ˙˙Pƒőă˙˙P˙ł”č>˙˙ƒÄ ƒÄüƒÄô˙ś´č:œ˙˙Pƒţă˙˙P˙ł”č˙˙ƒÄ ƒÄüƒÄô˙śŹčœ˙˙Pƒä˙˙P˙ł”čđœ˙˙ƒÄ ƒÄüƒÄô˙ś¨čě›˙˙Pƒä˙˙P˙ł”čɜ˙˙ƒÄ ƒÄüƒÄô˙śÔčś˙˙Pƒä˙˙P˙ł”袜˙˙ƒÄ ƒÄüƒÄô˙śĐ螛˙˙Pƒ"ä˙˙P˙ł”č{œ˙˙ƒÄ ƒÄüƒÄô˙śŘčw›˙˙Pƒ+ä˙˙P˙ł”čTœ˙˙ƒÄ ƒÄüƒÄô˙śÜčP›˙˙Pƒ4ä˙˙P˙ł”č-œ˙˙ƒÄ ƒÄüƒÄô˙śÄč)›˙˙Pƒ=ä˙˙P˙ł”čœ˙˙ƒÄ ƒÄüƒÄô˙śŕč›˙˙PƒFä˙˙P˙ł”čߛ˙˙ƒÄ ƒÄüƒÄô˙ś¸čۚ˙˙PƒOä˙˙P˙ł”踛˙˙ƒÄ ƒÄüƒÄôh˙˙˙赚˙˙PƒXä˙˙P˙ł”蒛˙˙ƒÄ ƒÄüƒÄôj蒚˙˙Pƒeä˙˙P˙ł”čo›˙˙ƒÄ ƒÄüƒÄôhčlš˙˙Pƒnä˙˙P˙ł”čI›˙˙ƒÄ ƒÄüƒÄôhčFš˙˙Pƒyä˙˙P˙ł”č#›˙˙ƒÄ ƒÄüƒÄôhč š˙˙Pƒ…ä˙˙P˙ł”čýš˙˙ƒÄ ƒÄüƒÄôhčú™˙˙Pƒä˙˙P˙ł”čך˙˙ƒÄ ƒÄüƒÄôhčԙ˙˙Pƒ—ä˙˙P˙ł”豚˙˙ƒÄ ƒÄüƒÄôh 讙˙˙Pƒä˙˙P˙ł”苚˙˙ƒÄ ƒÄüƒÄôh@舙˙˙Pƒ¤ä˙˙P˙ł”češ˙˙ƒÄ ƒÄüƒÄôh€čb™˙˙Pƒąä˙˙P˙ł”č?š˙˙ƒÄ ƒÄüƒÄôhč<™˙˙Pƒšä˙˙P˙ł”čš˙˙ƒÄ ƒÄüƒÄôhč™˙˙PƒĂä˙˙P˙ł”čó™˙˙ƒÄ ƒÄüƒÄôhčđ˜˙˙PƒĐä˙˙P˙ł”č͙˙˙ƒÄ ƒÄüƒÄôhčʘ˙˙Pƒ×ä˙˙P˙ł”觙˙˙ƒÄ ƒÄüƒÄôh褘˙˙PƒÝä˙˙P˙ł”聙˙˙ƒÄ ƒÄüƒÄôh č~˜˙˙Pƒĺä˙˙P˙ł”č[™˙˙ƒÄ ƒÄüƒÄôh@čX˜˙˙Pƒëä˙˙P˙ł”č5™˙˙ƒÄ ƒÄüƒÄôh˙č2˜˙˙Pƒöä˙˙P˙ł”č™˙˙ƒÄ ƒÄüƒÄôh˙č ˜˙˙Pƒĺ˙˙P˙ł”čé˜˙˙ƒÄ ƒÄüƒÄôh˙˙˙čć—˙˙Pƒ ĺ˙˙P˙ł”čØ˙˙ƒÄ ƒÄüƒÄôjč×˙˙Pƒĺ˙˙P˙ł”蠘˙˙ƒÄ ƒÄüƒÄôh蝗˙˙Pƒ!ĺ˙˙P˙ł”čz˜˙˙ƒÄ ƒÄüƒÄôhčw—˙˙Pƒ-ĺ˙˙P˙ł”čT˜˙˙ƒÄ ƒÄüƒÄôhčQ—˙˙Pƒ:ĺ˙˙P˙ł”č.˜˙˙ƒÄ ƒÄüƒÄôhč+—˙˙PƒEĺ˙˙P˙ł”č˜˙˙ƒÄ ƒÄüƒÄôhč—˙˙PƒNĺ˙˙P˙ł”čâ—˙˙ƒÄ ƒÄüƒÄôh čߖ˙˙PƒUĺ˙˙P˙ł”輗˙˙ƒÄ ƒÄüƒÄôh@蹖˙˙Pƒ]ĺ˙˙P˙ł”薗˙˙ƒÄ ƒÄüƒÄôh€č“–˙˙Pƒkĺ˙˙P˙ł”čp—˙˙ƒÄ ƒÄüƒÄôhčm–˙˙Pƒtĺ˙˙P˙ł”čJ—˙˙ƒÄ ƒÄüƒÄôhčG–˙˙Pƒĺ˙˙P˙ł”č$—˙˙ƒÄ ƒÄüƒÄôhč!–˙˙Pƒĺ˙˙P˙ł”čţ–˙˙ƒÄ ƒÄüƒÄôhčű•˙˙Pƒ•ĺ˙˙P˙ł”čؖ˙˙ƒÄ ƒÄüƒÄôhčՕ˙˙Pƒœĺ˙˙P˙ł”貖˙˙ƒÄ ƒÄüƒÄôh 试˙˙PƒĽĺ˙˙P˙ł”茖˙˙ƒÄ ƒÄüƒÄôh@艕˙˙PƒŹĺ˙˙P˙ł”čf–˙˙ƒÄ ƒÄüƒÄôjčf•˙˙Pƒ¸ĺ˙˙P˙ł”čC–˙˙ƒÄ ƒÄüƒÄôjčC•˙˙PƒÄĺ˙˙P˙ł”č –˙˙ƒÄ ƒÄüƒÄôjč •˙˙PƒÎĺ˙˙P˙ł”čý•˙˙ƒÄ ƒÄüƒÄôjčý”˙˙PƒÚĺ˙˙P˙ł”čڕ˙˙ƒÄ ƒÄüƒÄôjčڔ˙˙Pƒçĺ˙˙P˙ł”跕˙˙ƒÄ ƒÄüƒÄôj跔˙˙Pƒňĺ˙˙P˙ł”蔕˙˙ƒÄ ƒÄüƒÄôj蔔˙˙Pƒć˙˙P˙ł”čq•˙˙ƒÄ ƒÄüƒÄôjčq”˙˙Pƒ ć˙˙P˙ł”čN•˙˙ÇEřƒÄ ƒ*ć˙˙‰Eđƒ2ć˙˙‰E썶ƒÄô‹EřPčŔ•˙˙‰EôƒÄ‹Eř@‰Ečƒ}ô„Ľ‹uôťć˙˙š ü¨óŚ„ŒƒÄüjƒ#ć˙˙P‹EôP蛘˙˙ƒÄ…Ŕu?ƒÄô‹}ô°üš˙˙˙˙ňŽ÷ŃQč|–˙˙‰Ç‹Mô‰ţƒÄ€9tŠBŘ<vˆFA€9uîĆë‹}ôƒÄüƒÄô‹EřP蓓˙˙PW‹EüPčx”˙˙ƒÄ ;}ôt ƒÄôWčgš˙˙ƒÄ‹Eč‰Eř=ţŽ'˙˙˙ƒÄüƒÄôhčS“˙˙P‹EđP˙ł”č3”˙˙ƒÄ ƒÄüƒÄôh˙č0“˙˙P‹EěP˙ł”č”˙˙ƒÄ čȔ˙˙…ŔtƒÄôƒDć˙˙P辘˙˙eČ[^_ÉÐU‰ĺƒěVSč[ĂŻ/łđ˙˙˙ƒťđ˙˙˙˙t ‹˙ЃĆüƒ>˙uô[^ÉÐU‰ĺƒěSč[Ă|/[ÉÍśU‰ĺƒěSč[Ă`/č›˙˙[ÉĂ1.5b1curses function returned ERRcurses function returned NULL() returned ERRuntouchwintouchwinredrawwinwinsertlnwerasewdeletelni;True(1) or False(0)(ii)l;attrwattronwattroffwattrsetclearokidlokkeypadleaveoknodelaynotimeoutscrolloki;cntwinsdellnsyncok(ii);y,xmvwinmvderwinwmove(ii);lines,columnswresizeO;ch or int(Ol);ch or int,attr(iiO);y,x,ch or int(iiOl);y,x,ch or int, attraddch requires 1 or 4 argumentsargument 1 or 3 must be a ch or an intaddchs;str(sl);str,attr(iis);int,int,str(iisl);int,int,str,attraddstr requires 1 to 4 argumentsaddstr(si);str,n(sil);str,n,attr(iisi);y,x,str,n(iisil);y,x,str,n,attraddnstr requires 2 to 5 argumentsaddnstrbkgd requires 1 or 2 argumentsbkgdbkgdset requires 1 or 2 argumentsbkgdset|llllllll;ls,rs,ts,bs,tl,tr,bl,br(ll);vertint,horintdelch requires 0 or 2 arguments[mv]wdelch(ii);begin_y,begin_x(iiii);nlines,ncols,begin_y,begin_xderwin requires 2 or 4 argumentsechochar requires 1 or 2 argumentsargument 1 must be a ch or an intechochargetch requires 0 or 2 argumentsci;n(iii);y,x,ngetstr requires 0 to 2 arguments(Oi);ch or int,n(Oil);ch or int,n,attr(iiOi);y,x,ch o int,n(iiOil); y,x,ch or int,n,attrhline requires 2 or 5 argumentshlineinsch requires 1 or 4 argumentsinschinch requires 0 or 2 argumentsinstr requires 0 or 3 arguments(iis);y,x,str(iisl);y,x,str,attrinsstr requires 1 to 4 argumentsinsstrinsnstr requires 2 to 5 argumentsinsnstri;lineis_linetouched: line number outside of boundaries(iiiiii);pminrow,pmincol,sminrow,smincol,smaxrow,smaxcolpnoutrefreshnoutrefresh was called for a pad;requires 6 argumentswnoutrefreshO;fileobjargument must be a file objectputwin(ii);beg,numredrawlnprefreshrefresh was called for a pad; requires 6 argumentswrefresh(ii);top, bottomwsetscrregscrolli;linesscroll requires 0 or 1 arguments(ii);start,counttouchline(iii);start,count,valtouchline requires 2 or 3 argumentsvline requires 2 or 5 argumentsvlinesyncupsyncdownsubwinsubpadstandoutstandendsetscrregresizerefreshnoutrefreshmoveis_wintouchedis_linetouchedinstrinsertlninsdellninchimmedokidcokgetyxgetstrgetparyxgetmaxyxgetkeygetchgetbkgdgetbegyxerasederwindeletelndelchcursyncupclrtoeolclrtobotclearboxborderattr_setattrsetattr_offattroffattr_onattroncurses windowmust call initscr() firstbeepdef_prog_modedef_shell_modedoupdateendwinflashnocbreaknoechononlnorawreset_prog_modereset_shell_moderesettysavettyresizetermcbreakcbreak requires 0 or 1 argumentechoecho requires 0 or 1 argumentnlnl requires 0 or 1 argumentrawraw requires 0 or 1 argumentmust call start_color() firstcolor_content requires 1 argumenth;color(iii)Argument 1 was out of range. Check value of COLORS.COLOR_PAIR requires 1 argumenti;numbercurs_set requires 1 argumenti;intcurs_setdelay_output requires 1 argumenti;msdelay_outputb;tenthshalfdelay requires 1 argumenthalfdelayi(hhhh);color,r,g,binit_color requires 4 argumentsinit_colorinit_pair requires 3 arguments(hhh);pair, f, binit_pairLINESCOLSi;True(1), False(0)intrflush requires 1 argumentintrflushmeta requires 1 argumentmeta(ii);nlines,ncolsnewwin requires 2 or 4 argumentsh;pairpair_content requires 1 argumentArgument 1 was out of range. (1..COLOR_PAIRS-1)i;pairvaluePAIR_NUMBER requires 1 argumentputpcurs_set requires 3 argument(ii);y, xCOLORSCOLOR_PAIRSstart_color() returned ERRargument must be a ch or an intungetchuse_env requires 1 argumentuse_envunctrltermnametermattrsstart_colorsetsyxqiflushPAIR_NUMBERpair_contentnoqiflushnewwinnewpadlongnamekillcharkeynameisendwininitscrhas_keyhas_ilhas_ichas_colorsgetwingetsyxflushinpfiltererasecharCOLOR_PAIRcolor_contentcan_change_colorbaudratejack_cursescurses.errorerrorversion__version__ACS_ULCORNERACS_LLCORNERACS_URCORNERACS_LRCORNERACS_LTEEACS_RTEEACS_BTEEACS_TTEEACS_HLINEACS_VLINEACS_PLUSACS_S1ACS_S9ACS_DIAMONDACS_CKBOARDACS_DEGREEACS_PLMINUSACS_BULLETACS_LARROWACS_RARROWACS_DARROWACS_UARROWACS_BOARDACS_LANTERNACS_BLOCKACS_S3ACS_LEQUALACS_GEQUALACS_PIACS_NEQUALACS_STERLINGACS_BSSBACS_SSBBACS_BBSSACS_SBBSACS_SBSSACS_SSSBACS_SSBSACS_BSSSACS_BSBSACS_SBSBACS_SSSSA_ATTRIBUTESA_NORMALA_STANDOUTA_UNDERLINEA_REVERSEA_BLINKA_DIMA_BOLDA_ALTCHARSETA_INVISA_PROTECTA_HORIZONTALA_LEFTA_LOWA_RIGHTA_TOPA_VERTICALA_CHARTEXTA_COLORWA_ATTRIBUTESWA_NORMALWA_STANDOUTWA_UNDERLINEWA_REVERSEWA_BLINKWA_DIMWA_BOLDWA_ALTCHARSETWA_INVISWA_PROTECTWA_HORIZONTALWA_LEFTWA_LOWWA_RIGHTWA_TOPWA_VERTICALCOLOR_BLACKCOLOR_REDCOLOR_GREENCOLOR_YELLOWCOLOR_BLUECOLOR_MAGENTACOLOR_CYANCOLOR_WHITEUNKNOWN KEYKEY_F(KEY_MINKEY_MAXcan't initialize module cursesş˜Ă`”f”ƒ”G–X?B—řBÁ–A˜Ÿ´8Ÿ´8ˆŸ9Ÿ9wŸx9nŸx9— E—FgŸGcŸĚG]Ÿ6'•ŕ9TŸ¸5KŸl5AŸ 5;Ÿ`H2Ÿ@3+ŸHIB™PJ%Ÿč2Ÿp7ŸlKŸ¸KŸ„LţžŘ7őžL8îžxMčž7@š$O/•@:âžX6ڞŹ6՞¤R€šřP̞€<ތ2‚›(WA›4U˝ž”SŽž•@=…•¨=D•`;žŔYL•Ŕ;żœĚZƔ,2Ӝ`[‡žČ[€žp>XÜ]V• <vžÔ\mžˆ4džÔ4]ž8]Vž8]Mž<4o•ŕ<Fžđ3˛¤^˝”ź1˛”L1@ž”_ŸŸ ?haڐkǟ˜a˙Ľ$mV ĐgńĽ€pćĽtq륀d€‰€Ł€ž€ß€€;€_€‰€ &ź‚Ü‚˘‚˘ ‚=5‚M‚˘f‚˘˘‚Řł€Ş˘Ç‚'S‚˘á€ ř€!€"$€#:€%R€&h€1€2—€3Ž€4Ç€5߀6ř€8€9)€;I€=_€>u€?‹€@Ą€A¸€BĐ€Cć€Dý€E€F+€GB€H[€Ip€N°€QČ€Rá€Sř€T€U/€VG€X_€[y€^‘€e§€hÁ€lŰ€qô€r €u* €vG €yb €z €}— €€° €ƒË €„ç €‡ €Š ‚ĺň; ‚FU €˘‹ €Ô €# € €4= €<Ž €CÉ €Fć €S} €Z˝ €^Ű €Œ˘˘ô €-€7&‚Ż;‚aV‚ T€˙j€˘‚-”‚˘Ž€K˘0€u€#ź‚šŔ‚¢ÂŃ€°€ç€H€K@€Lq€U¤€Z߀^€aP€bˆ€5€Ţ€Ô€J€­˘n€5ä€7ý€8€91€:˘L‚€€I˘ž€Ş¸€€y€8€AO€Xu€aœ€iÁ€l˘ç€Pü‚˘‚˘˘4‚ÂJ‚˘e‚‚—‚˘˘˛‚¢˘˘Č‚Ý‚÷‚‚˘˘˘˘˛‚RoÂ+€bd€jž‚Žźˇ€"Ě€#â€$ö€% €& €'7€(M€-c€1x€=Ž€B¤€Gť€LÓ€Qé€W˙€c€h*€mB€sZ€tr€zˆ‚˜œ€F˛€RË€^˘Â‖÷€— €˜! €ž8 €żO €Ŕf €Á} €Ä– €ĹŻ €ĆČ €Çá €Éű ‚V(!‚˘0!‚K!€h!€˘Ż!€&ˆ‚˝Ç!€˘"‚“"€˘X"€1s"€7‹"€JÔ"€Q˘ë"‚˘#€ć!#€ę<#€î˘W#€$€$‚¢Ł$€¨˘Ń$‚˘ň$‚ń%€g%€t%€xÝ%€‹&€Œ=&€l&€Ž•&€ż&€í&€‘'€’M'€“'€”Ž'€•á'€–(€—6(€˜i(€˛´*€źˆ+€Â,€Éž,€ĚË,€Íö,€Î%-€ĎC-€Đp-€ŃŽ-€Ňˇ-€ÓĐ-€Ôú-€Á0€˘Ţ0‚˘˙0‚˘ 1‚C1€:˘Ą1‚ŕ Ĺ1€(đ1‚$2‚đ1Â[2‚q2‚2‚Ž2‚˘˘˘Ę2‚˘˘˘˘˘é2‚3€/˘o3‚{(–3€ Ř3€)˘94‚˘^4‚Ó+„4€N˘+5‚˘Q5‚Đ!v5€9˘˙5‚ú#6€9˘ 6‚˘Ä6‚ýlę6€,7€..7€™7€C´7€8€R!8€[˘™8‚˘ż8‚Ů6ă8€/˘ł9‚^~Ř9€3ś:€99;€@˘Ę;‚˘î;‚˘<‚˘2<‚ó W<€˘Ţ<‚˘=‚˘"=‚-ŠC=€ô=€9>€ł?€Y˘Đ?‚L‚9ô?€ź˘˘ @‚˘*@‚§ M@€s˘~@‚˘Ą@‚˘Ä@‚O#ä@€0A€˘zA‚˘œA‚˘˘ťA‚ ŃA€EćA‚ťA‚˘˘üA€`B€ç/B€čPB€ęfB€ŃB€cC€ŤE€ôÂE€ü˘-F&7$şBF&8(şXF&;,şkF&>0ş„F$YP0žF YŞF Z D[D^D_D`%Db'Dc+Dd?e„‘0DœADADĘA4„‘0DeADfQDgaDipDky¸F@ZĆF€\œ˙˙˙ŔŔAŔAŕAŕAŕy$yäF$oĚ0G oG p DqDrDs&Dt/DxZDvdDzrG@o)G@p$4G€†™G$ĐL1źG ĐŃG Đ DĐŢG@Đ$pëG$Ńź1 H ŃŃG Ń DŃŢG@Ń$pH$Ň,2 H ŇŃG Ň DŇŢG@Ň$_;H$ӌ2 H ÓŃG Ó DÓŢG@Ó$[]H$Ôč2 H ÔŃG Ô DÔŢG@Ô$V|H$Ő@3 H ŐŃG Ő DŐŢG@Ő$XžH$ט3 H ×ŃG × D×ŢG@×$WÄH$Ůđ3 H ŮŃG Ů DŮŢG@Ů$KäH$Ú<4 H ÚŃG Ú DÚŢG@Ú$KI$ۈ4 H ŰŃG Ű DŰŢG@Ű$K(I$ÜÔ4 H ÜŃG Ü DÜŢG@Ü$KJI$Ý 5 H ÝŃG Ý DÝŢG@Ý$KmI$Ţl5 H ŢŃG Ţ DŢŢG@Ţ$KI$߸5 H ßŃG ß DßŢG@ß$OąI$ŕ6 H ŕŃG ŕ DŕŢG@ŕ$OĐI$âX6 H âŃG â DâŢG@âîI€âü˙˙˙ŔŕT$TůI$ăŹ6 H ăŃG ă DăŢG@ăîI€ăü˙˙˙Ŕŕ[$[J$ĺ7 H ĺŃG ĺ DĺŢG@ĺ7J@ĺCJ@ĺŔŕe$eOJ$ćp7 H ćŃG ć DćŢG@ć7J@ćCJ@ćŔŕf$fpJ$çŘ7 H çŃG ç DçŢG@ç7J@çCJ@çŔŕs$s‘J$čL8 H čŃG č DčŢG@č7J@čCJ@čŔŕh$h˛J$ę´8 H ęŃG ę DęŢG@ęŇJ€ęü˙˙˙Ŕŕc$cŢJ$ë9 H ëŃG ë DëŢG@ëŇJ€ëü˙˙˙Ŕŕ_$_˙J$ěx9 H ěŃG ě DěŢG@ěŇJ€ěü˙˙˙Ŕŕe$e K$íŕ9 H íŃG í DíŢG@íîI€íü˙˙˙Ŕŕ_$_@K$î@: H îŃG î DîŢG@îîI€îü˙˙˙Ŕŕ_$_^K$ď : H ďŃG ď DďŢG@ďîI€ďü˙˙˙Ŕŕ_$_}K$đ; H đŃG đ DđŢG@đîI€đü˙˙˙Ŕŕ_$_K$ń`; H ńŃG ń DńŢG@ńîI€ńü˙˙˙Ŕŕ_$_˝K$ňŔ; H ňŃG ň DňŢG@ňîI€ňü˙˙˙Ŕŕ_$_ßK$ó < H óŃG ó DóŢG@óîI€óü˙˙˙Ŕŕ_$_L$ô€< H ôŃG ô DôŢG@ôîI€ôü˙˙˙Ŕŕ]$]"L$őŕ< H őŃG ő DőŢG@őîI€őü˙˙˙Ŕŕ_$_AL$÷@= H ÷ŃG ÷ D÷ŢG@÷îI€÷ř˙˙˙_L€÷ü˙˙˙Ŕŕg$gjL$ř¨= H řŃG ř DřŢG@řîI€řř˙˙˙_L€řü˙˙˙Ŕŕa$a‹L$ů > H ůŃG ů DůŢG@ůîI€ůř˙˙˙_L€ůü˙˙˙Ŕŕa$aŠL$űp> H űŃG ű DűŢG@űîI€űř˙˙˙_L€űü˙˙˙Ŕŕg$gÉL$Ř>ĺL DD#D'D -D ?ňL@˙L@Ŕŕ?$? M$?)M DDD0˙L@$@4M$X? H ŃG  DDDD!D (D"xD#…D&ˆD'¤D*ŤD-ŔD/ČD2ďD3ôD5řD6D9D:D;5D>:D??DAxDBDC’DDŞRM@_M@jM€ô˙˙˙rM€đ˙˙˙zM@ˆM€ü˙˙˙•M€ě˙˙˙ŸM€ř˙˙˙ŔŕŞ$ŞŤM$HA H HŃG I DJDNDO&DQ/DS|DT›DW˘DYžDZĹD\ĚD_ďDańDcDd$Df,DgCDjLDkRDliDnsDoxDqŽDrĆDsĚDtÜDuôRM@I_M@KjM€Lô˙˙˙rM€Lđ˙˙˙ĘM€Mü˙˙˙ŸM€Nř˙˙˙ŐM€Ně˙˙˙zM@OĺM€Oč˙˙˙Ŕŕô$ôôM$yřB H yŃG z D{D~D&D/DƒˆD„¨D‡ŻD‰ŇDŠŮDŒŢDD‘D“7D”CD–HD—_DšhD›nDœ…DžDŸ”DĄËD˘äDŁęD¤úDĽRM@z_M@|jM€|đ˙˙˙rM€|ě˙˙˙N€|ü˙˙˙ĘM€}ř˙˙˙ŸM€~ô˙˙˙ŐM€~č˙˙˙zM@ĺM€ä˙˙˙Ŕŕ$N$Š E H ŠŃG Ş DŤDŽD°D˛TDłoDśtDˇDş”DťDž¤DĂşDżäDŔűDÄŢG@ŠRM@ވM€Źü˙˙˙9N€­ô˙˙˙ŸM€Žř˙˙˙Ŕŕ$EN$ČF H ČŃG É DĘDÍDĎDŃUDŇpDŐuDÖ‘DŮ“DÚœDÝ DâśDăËDŢŕDß÷DäŢG@ČRM@ɈM€Ëü˙˙˙9N€Ěô˙˙˙ŸM€Íř˙˙˙Ŕŕ$eN$čG H č„N é DęDěDíNDđ…DńŤDňłDďľDóźŢG@č’N@é N€ëŕ˙˙˙ŞN€ëä˙˙˙´N€ëč˙˙˙žN€ëě˙˙˙ČN€ëđ˙˙˙ŇN€ëô˙˙˙ÜN€ëř˙˙˙ćN€ëü˙˙˙Ŕŕź$źđN$÷ĚG H ÷ŃG ř DůDúDű%Dü<DýADţ]DdD„DŒD“ŢG@÷RM@ř O€úř˙˙˙O€úü˙˙˙Ŕŕ“$“"O$`H H ŃG  D D DPD]DbD~D‚D°DÇDĐDčŢG@RM@_M@ jM€ ü˙˙˙rM€ ř˙˙˙Ŕŕč$č@O$HI H ŃG   D!D%D&D'%D)]D*yD-~D/ĽD2¨D3şD6źD8ÖD=ÝD9čD:üD>ŢG@RM@ ňL@"_O€#đ˙˙˙lO€#ô˙˙˙xO€#ř˙˙˙†O€#ü˙˙˙Ŕŕ$”O$BPJ H BŃG C DDDGDIDKUDLbDOdDP€DS‡DVDY’DZ¨D[żD^ĂDbĎD_đDdŢG@BRM@CˆM€Eü˙˙˙•M€Fô˙˙˙ŸM€Gř˙˙˙Ŕŕ$ľO$hlK H hŃG i DkDm,DlDŢG@h$KŐO$r¸K H rŃG s DtDxD}JD~fDjD‚˜DƒŻD…¸D†ÉŢG@rRM@sjM€uü˙˙˙rM€uř˙˙˙óO@vŔŕÉ$É˙O$Š„L H ŠŃG ‹ DŒDD•ND–jD—nDšœD›łDźD ĂDžÜDĄôŢG@ŠRM@‹jM€ü˙˙˙rM€ř˙˙˙óO@ŽŔŕô$ôP$ĽxM H ĽŃG Ś D§DŹDŽxDŻ}DąˆD´ŞDśŻD¸ŐDťűDÂ'DÄhDĆpDLJDÉ‹DʐDË—DĚŤŢG@ĽRM@ŚjM€¨řű˙˙rM€¨ôű˙˙N€¨üű˙˙=P€Šü˙˙]P@ŞŔŕŤ$ŤiP$Đ$O H Đ„N Ń DŇDŐDÖDŘ!DÚ|DŰ”DŢœDßĂDâĚDäóDĺ DçDę9DěPDíYDđ\DńaDňwDôŽDö“DřźDůÔ’N@ŃˆM€Óř˙˙˙•M€Ôč˙˙˙N€Őü˙˙˙jM€Őđ˙˙˙rM€Őě˙˙˙‡P@ŐŸM€Öô˙˙˙ŔŕÔ$Ô“P$ýřP H ýŃG ţ D˙DDD!D(DxD…D ˆD ¤DŤDŔDČDďDôDřDDDD 5D#:D$?D&xD'D(’D)ŞRM@ţ_M@jM€ô˙˙˙rM€đ˙˙˙zM@ˆM€ü˙˙˙•M€ě˙˙˙ŸM€ř˙˙˙ŔŕŞ$ŞąP$-¤R H -ŃG . D/D2D4PD5WD7\D8xD9|D<źD=ÓD?ÜD@íŢG@-RM@.jM€0ü˙˙˙rM€0ř˙˙˙_M@0Ŕŕí$íÎP$D”S H DŃG E DFDKDMlDNqDP|DSžDUŁDWÉDZďD\D]\D_dD`{DbDc„Dd‹DeŸŢG@DRM@EjM€Gřű˙˙rM€Gôű˙˙N€Güű˙˙ěP€Hü˙˙]P@IŔŕŸ$Ÿ Q$i4U H iŃG j DkDoDp&Dr/Dt|Du›Dx˘DzžD{ĹD}ĚD€ďD‚ńD„D…$D‡,DˆCD‹LDŒRDiDsDxD’ŽD“ĆD”ĚD•ÜD–ôRM@j_M@ljM€mô˙˙˙rM€mđ˙˙˙ĘM€nü˙˙˙ŸM€oř˙˙˙ŐM€oě˙˙˙zM@pĺM€pč˙˙˙Ŕŕô$ô+Q$š(W H šŃG › DœDŸD &D˘/D¤ˆDĽ¨D¨ŻDŞŇDŤŮD­ŢD°D˛D´7DľCDˇHD¸_DťhDźnD˝…DżDŔ”DÂËDĂäDÄęDĹúDĆRM@›_M@jM€đ˙˙˙rM€ě˙˙˙N€ü˙˙˙ĘM€žř˙˙˙ŸM€Ÿô˙˙˙ŐM€Ÿč˙˙˙zM@ ĺM€ ä˙˙˙Ŕŕ$KQ$ĘD tD ‹D’ŢG@ˆM€ü˙˙˙Ŕŕ’$’ R$`[ H ŃG  DD1D`DgŢG@CR€ř˙˙˙MR€ü˙˙˙Ŕŕg$gWR$Č[ H ŃG  D D#D$(D&VD,‚D1ŽD3ĂD6ČD8ßD7˙D: ŢG@RM@­Q€!č˙˙˙ťQ€!ě˙˙˙ÉQ€!đ˙˙˙×Q€!ô˙˙˙ĺQ€!ř˙˙˙óQ€!ü˙˙˙Ŕŕ $ wR$>Ô\ H >ŃG ? DBDD1DC\DEcŢG@>jM€Aü˙˙˙rM€Ař˙˙˙Ŕŕc$cŸR$I8] H IŃG J DODS<DTHDV_DXwD]{DYˆDZœD^ŁŢG@IňL@L_O€Mđ˙˙˙lO€Mô˙˙˙xO€Mř˙˙˙†O€Mü˙˙˙ŔŕŁ$ŁžR$bÜ] H bŃG c DdDfDhTDkeDm€Do¤DpťDrĹŢG@bRM@cÝR€eü˙˙˙ŔŕĹ$ĹéR$v¤^ H vŃG w DxDzD|QD~mD|DƒŸD…ĚD†ăDˆíŢG@vRM@w S€yř˙˙˙S€yü˙˙˙S€yô˙˙˙Ŕŕí$í(S$Œ”_ H Œ„N  DŽD‘D’D”!D–|D—”DšœD›ĂDžĚD óDĄ DŁDŚ9D¨PDŠYDŹ\D­aDŽwD°ŽD˛“D´źDľÔ’N@ˆM€ř˙˙˙•M€č˙˙˙N€‘ü˙˙˙jM€‘đ˙˙˙rM€‘ě˙˙˙‡P@‘ŸM€’ô˙˙˙ŔŕÔ$ÔFS&ˇ4şyS$ha H ™S  D $-ŚS ĂS$˜aÚS ŃG  D$hčS$‚bÚS ‚ŃG ‚ D‚$lT$ƒlbÚS ƒŃG ƒ Dƒ$h)T$„ÔbÚS „ŃG „ D„$hDT$…W€Źţ˙˙˙JW€Źř˙˙˙RW€Źú˙˙˙ZW€Źü˙˙˙Ŕŕň$ňbW$ÄtqÚS ÄŃG Ĺ DĆDÉDĘ<DĚPDÍpD·DĐŒDѧDŇĹRM@ĹN€Çü˙˙˙ŔŕĹ$ĹW$ÖD@2DB^DE€DF—DI DJÇRM@:QX€<˙˙˙˙ŔŕÇ$Ç_X$O8vÚS OŃG P DTDV8DXYD\hD]nDYpDZxD^}yX€Rü˙˙˙Ŕŕ}$}‚X$c¸vÚS cŃG d DeDhDi8DkXDm†Dp¸DqĎDtŘDu RM@d>W€fř˙˙˙JW€fú˙˙˙RW€fü˙˙˙ZW€fţ˙˙˙Ŕŕ $ ŸX$yÄwÚS yŃG z D{D~D<DPD‚pDƒ‡D†ŒDˆŻD‰ĺRM@zťX€|ú˙˙˙ĆX€|ü˙˙˙ZW€|ţ˙˙˙Ŕŕĺ$ĺÎX$ŹxÚS „N Ž D“D•5D–>D—NDšXDœ_DcDžwDĄ„DŁŽD¤ DĽśDŚĎD§áD¨÷DŞDŤ!ňL@čX@‘÷X@‘Ŕŕ!$!Y$°ĐyÚS °ŃG ą D˛DľDˇ2Dš^Dź€D˝—DŔ DÁÉRM@ąyX€łü˙˙˙ŔŕÉ$É!Y$ĹœzÚS ĹŃG Ć DËDÍ5DĎVDŃaDŇ|;Y@ČyX€Éü˙˙˙Ŕŕ|$|HY$Ö{ÚS ÖŃG × DŰDÝ,Dß4DŕOčW€Ů˙˙˙˙ŔŕO$OcY$äh{ÚS äŃG ĺ DćDéDë8DífDđˆDńŸDô¨Dő×RM@ĺyX€çü˙˙˙Ŕŕ×$×zY$ů@|ÚS ůŃG ú D˙D(DFDTD [DfDzD ňL@ü_O€ýř˙˙˙lO€ýü˙˙˙Ŕŕ$“Y$Ä|ÚS ŃG  DDD/DaDDD”D!ťD"ĚD$ŃD%ăD(ěD-đD)üD*D.RM@ňL@_O€ř˙˙˙lO€ü˙˙˙xO€đ˙˙˙†O€ô˙˙˙Ŕŕ$ŻY$2ŕ}ÚS 2ŃG 3 D4D7D80D:GD<wD?”D@ŚDC¨DIÄDDŕDFőDJţRM@3ťX€5ţ˙˙˙ĆX€5ú˙˙˙ZW€5ü˙˙˙Ŕŕţ$ţÎY$Nŕ~ÚS NŃG O DPDSDT5DVPDX~D[ D]ˇD`ŔDaÔRM@ON€Qü˙˙˙ŔŕÔ$ÔěY$e´ÚS eŃG f DjDk0DlWĘM€hü˙˙˙ŔŕW$WZ$p €ÚS pŃG q DrDsDuDw9D}oD~ŠD—D€œD¤DƒŚD„˝D†ĆRM@q‡U€sü˙˙˙ŔŕĆ$ĆZ$ŠԀÚS ŠŃG ‹ DŒDD‘<D’\D“sD–|D˜•DšŞD›˛Dœ˝RM@‹rM€ř˙˙˙jM€ü˙˙˙Ŕŕ˝$˝6Z$ ”ÚS  ŃG Ą DŚD¨,DŞIDŤNDŹWD­aDŽsD݉D°˘Dą´D˛ĘDłŕD´čDśěDˇDš ‡P@ŁTZ@¤_Z@¤Ŕŕ $ kZ$˝ ‚ÚS ˝ŃG ž DĂDĹ0DÇQDČ_DÉpDĚxD͏DĘ“DТDŃšˆM€Ŕü˙˙˙„Z@ÁŔŕš$šZ$Ő\ƒÚS ŐŃG Ö DŰDÝ4DßUDŕcDátDä|Dĺ“Dâ—DčŚDéLjM€Řü˙˙˙„Z@ŮŔŕÇ$ÇŠZ$í$„ÚS íŃG î DďDňDô2DöcD÷~Dú‚Dű™DýDţŞD˙˛DšRM@î‡U€đü˙˙˙Ŕŕš$šĂZ&,żđZ$Fŕ„DJDM4DNCDQIDR^DUuDV‡DWžDX˛DaËDbőDcDdCDejDf‘Dg¸DhßDiDj-DkTDl{Dm˘DnÉDođDpDq>DreDsŒDtłDuÚDvDw(DxODyvD|D}ÄD~ëDD€9D`Dƒ‡D„ŽD…ŐD†üD‡#DˆJD‰qDŠ˜D‹żDŒćD D4D‘ZD’}D“ŁD”ÉD•ďD–D—;D˜aD™‡Dš­DœÓDůDž DŸE D k DĄ‘ Dَ D¤Ý DŚ D§) D¨L DŠr Dޘ DŤž DŹä D­ DŽ0 DŻV D°| Dą˘ D˛Č Dłî D´ Dľ: Dś` D¸† DšŠ DşĚ Dťď Dź D˝5 DžX Dż{ DĆž DÇŔ DČă DĘü DËDĚDÍ2DÎ5DĎ7DĐ@DŃIDŇKDÔLDŐMDÖRD×UDŘWDŮZDÚtDŰ|DĆˆDÝ™DŢšDâÜDăčDä˙[@G[€Gü˙˙˙[@GŔ([€Ăř˙˙˙2[€Äô˙˙˙?[@ĹŔËŔă Ŕă ŕă Ŕă ŕă Ŕă ŕă Ŕă ŕă ŕă Ŕü Ŕü ŕü Ŕü ŕü Ŕü ŕü Ŕü ŕü ŕü N[@ËY[@ËŔŕRŕ™ŕ˙$˙d[(4,Ć{[(%0Ćdߓjack_cursesmodule.c/home/arne/work/jack/cvs/jack/cursesmodule/jack_cursesmodule.cgcc2_compiled.int:t(0,1)=r(0,1);0020000000000;0017777777777;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,1);0020000000000;0017777777777;unsigned int:t(0,4)=r(0,1);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,1);0000000000000;0037777777777;long long int:t(0,6)=r(0,1);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=r(0,1);0000000000000;01777777777777777777777;short int:t(0,8)=r(0,8);-32768;32767;short unsigned int:t(0,9)=r(0,9);0;65535;signed char:t(0,10)=r(0,10);-128;127;unsigned char:t(0,11)=r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);4;0;complex double:t(0,17)=r(0,17);8;0;complex long double:t(0,18)=r(0,18);12;0;void:t(0,19)=(0,19)PyCursesVersion:G(0,20)=*(0,2)/usr/include/python1.5/Python.h/usr/include/python1.5/patchlevel.h/usr/include/python1.5/config.h/usr/include/stdio.h/usr/include/features.h/usr/include/sys/cdefs.h/usr/include/gnu/stubs.h/usr/lib/gcc-lib/i386-linux/2.95.4/include/stddef.hsize_t:t(8,1)=(0,4)/usr/include/bits/types.h__u_char:t(9,1)=(0,11)__u_short:t(9,2)=(0,9)__u_int:t(9,3)=(0,4)__u_long:t(9,4)=(0,5)__u_quad_t:t(9,5)=(0,7)__quad_t:t(9,6)=(0,6)__int8_t:t(9,7)=(0,10)__uint8_t:t(9,8)=(0,11)__int16_t:t(9,9)=(0,8)__uint16_t:t(9,10)=(0,9)__int32_t:t(9,11)=(0,1)__uint32_t:t(9,12)=(0,4)__int64_t:t(9,13)=(0,6)__uint64_t:t(9,14)=(0,7)__qaddr_t:t(9,15)=(9,16)=*(9,6)__dev_t:t(9,17)=(9,5)__uid_t:t(9,18)=(9,3)__gid_t:t(9,19)=(9,3)__ino_t:t(9,20)=(9,4)__mode_t:t(9,21)=(9,3)__nlink_t:t(9,22)=(9,3)__off_t:t(9,23)=(0,3)__loff_t:t(9,24)=(9,6)__pid_t:t(9,25)=(0,1)__ssize_t:t(9,26)=(0,1)__rlim_t:t(9,27)=(9,4)__rlim64_t:t(9,28)=(9,5)__id_t:t(9,29)=(9,3)__fsid_t:t(9,30)=(9,31)=s8__val:(9,32)=ar(0,1);0;1;(0,1),0,64;;__daddr_t:t(9,33)=(0,1)__caddr_t:t(9,34)=(0,20)__time_t:t(9,35)=(0,3)__useconds_t:t(9,36)=(0,4)__suseconds_t:t(9,37)=(0,3)__swblk_t:t(9,38)=(0,3)__clock_t:t(9,39)=(0,3)__clockid_t:t(9,40)=(0,1)__timer_t:t(9,41)=(0,1)__key_t:t(9,42)=(0,1)__ipc_pid_t:t(9,43)=(0,9)__blksize_t:t(9,44)=(0,3)__blkcnt_t:t(9,45)=(0,3)__blkcnt64_t:t(9,46)=(9,6)__fsblkcnt_t:t(9,47)=(9,4)__fsblkcnt64_t:t(9,48)=(9,5)__fsfilcnt_t:t(9,49)=(9,4)__fsfilcnt64_t:t(9,50)=(9,5)__ino64_t:t(9,51)=(9,5)__off64_t:t(9,52)=(9,24)__t_scalar_t:t(9,53)=(0,3)__t_uscalar_t:t(9,54)=(0,5)__intptr_t:t(9,55)=(0,1)__socklen_t:t(9,56)=(0,4)/usr/include/bits/pthreadtypes.h/usr/include/bits/sched.h__sched_param:T(12,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(11,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(11,2)=(11,3)=*(11,4)=xs_pthread_descr_struct:__pthread_attr_s:T(11,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(12,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(11,6)=*(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(11,7)=(11,5)pthread_cond_t:t(11,8)=(11,9)=s12__c_lock:(11,1),0,64;__c_waiting:(11,2),64,32;;pthread_condattr_t:t(11,10)=(11,11)=s4__dummy:(0,1),0,32;;pthread_key_t:t(11,12)=(0,4)pthread_mutex_t:t(11,13)=(11,14)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(11,2),64,32;__m_kind:(0,1),96,32;__m_lock:(11,1),128,64;;pthread_mutexattr_t:t(11,15)=(11,16)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(11,17)=(0,1)pthread_t:t(11,18)=(0,5)FILE:t(4,1)=(4,2)=xs_IO_FILE:__FILE:t(4,3)=(4,2)/usr/include/libio.h/usr/include/_G_config.hwchar_t:t(15,1)=(0,3)wint_t:t(15,2)=(0,4)/usr/include/wchar.h/usr/include/bits/wchar.h__mbstate_t:t(16,1)=(16,2)=s8__count:(0,1),0,32;__value:(16,3)=u4__wch:(15,2),0,32;__wchb:(16,4)=ar(0,1);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(14,1)=(14,2)=s12__pos:(9,23),0,32;__state:(16,1),32,64;;_G_fpos64_t:t(14,3)=(14,4)=s16__pos:(9,52),0,64;__state:(16,1),64,64;;/usr/include/gconv.h :T(19,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(19,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(19,3)=(19,4)=*(19,5)=f(0,1)__gconv_init_fct:t(19,6)=(19,7)=*(19,8)=f(0,1)__gconv_end_fct:t(19,9)=(19,10)=*(19,11)=f(0,19)__gconv_trans_fct:t(19,12)=(19,13)=*(19,14)=f(0,1)__gconv_trans_context_fct:t(19,15)=(19,16)=*(19,17)=f(0,1)__gconv_trans_query_fct:t(19,18)=(19,19)=*(19,20)=f(0,1)__gconv_trans_init_fct:t(19,21)=(19,22)=*(19,23)=f(0,1)__gconv_trans_end_fct:t(19,24)=(19,25)=*(19,26)=f(0,19)__gconv_trans_data:T(19,27)=s20__trans_fct:(19,12),0,32;__trans_context_fct:(19,15),32,32;__trans_end_fct:(19,24),64,32;__data:(11,6),96,32;__next:(19,28)=*(19,27),128,32;;__gconv_step:T(19,29)=s56__shlib_handle:(19,30)=*(19,31)=xs__gconv_loaded_object:,0,32;__modname:(19,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(0,20),96,32;__to_name:(0,20),128,32;__fct:(19,3),160,32;__init_fct:(19,6),192,32;__end_fct:(19,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(11,6),416,32;;__gconv_step_data:T(19,33)=s36__outbuf:(19,34)=*(0,11),0,32;__outbufend:(19,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(19,35)=*(16,1),160,32;__state:(16,1),192,64;__trans:(19,28),256,32;;__gconv_info:T(19,36)=s8__nsteps:(8,1),0,32;__steps:(19,37)=*(19,29),32,32;__data:(19,38)=ar(0,1);0;-1;(19,33),64,0;;__gconv_t:t(19,39)=(19,40)=*(19,36)_G_iconv_t:t(14,5)=(14,6)=u44__cd:(19,36),0,64;__combined:(14,7)=s44__cd:(19,36),0,64;__data:(19,33),64,288;;,0,352;;_G_int16_t:t(14,8)=(0,8)_G_int32_t:t(14,9)=(0,1)_G_uint16_t:t(14,10)=(0,9)_G_uint32_t:t(14,11)=(0,4)/usr/lib/gcc-lib/i386-linux/2.95.4/include/stdarg.h__gnuc_va_list:t(23,1)=(11,6)_IO_lock_t:t(13,1)=(0,19)_IO_marker:T(13,2)=s12_next:(13,3)=*(13,2),0,32;_sbuf:(13,4)=*(4,2),32,32;_pos:(0,1),64,32;;__codecvt_result:T(13,5)=e__codecvt_ok:0,__codecvt_partial:1,__codecvt_error:2,__codecvt_noconv:3,;_IO_FILE:T(4,2)=s148_flags:(0,1),0,32;_IO_read_ptr:(0,20),32,32;_IO_read_end:(0,20),64,32;_IO_read_base:(0,20),96,32;_IO_write_base:(0,20),128,32;_IO_write_ptr:(0,20),160,32;_IO_write_end:(0,20),192,32;_IO_buf_base:(0,20),224,32;_IO_buf_end:(0,20),256,32;_IO_save_base:(0,20),288,32;_IO_backup_base:(0,20),320,32;_IO_save_end:(0,20),352,32;_markers:(13,3),384,32;_chain:(13,4),416,32;_fileno:(0,1),448,32;_blksize:(0,1),480,32;_old_offset:(9,23),512,32;_cur_column:(0,9),544,16;_vtable_offset:(0,10),560,8;_shortbuf:(13,6)=ar(0,1);0;0;(0,2),568,8;_lock:(13,7)=*(13,1),576,32;_offset:(9,52),608,64;__pad1:(11,6),672,32;__pad2:(11,6),704,32;_mode:(0,1),736,32;_unused2:(13,8)=ar(0,1);0;51;(0,2),768,416;;_IO_FILE:t(13,9)=(4,2)__io_read_fn:t(13,10)=(13,11)=f(9,26)__io_write_fn:t(13,12)=(13,13)=f(9,26)__io_seek_fn:t(13,14)=(13,15)=f(0,1)__io_close_fn:t(13,16)=(13,17)=f(0,1)fpos_t:t(4,4)=(14,1)/usr/include/bits/stdio_lim.h/usr/include/bits/stdio.h/usr/include/string.h/usr/include/bits/string.h/usr/include/bits/string2.h/usr/include/endian.h/usr/include/bits/endian.h/usr/include/stdlib.h/usr/include/errno.h/usr/include/bits/errno.h/usr/include/linux/errno.h/usr/include/asm/errno.hdiv_t:t(38,1)=(38,2)=s8quot:(0,1),0,32;rem:(0,1),32,32;;ldiv_t:t(38,3)=(38,4)=s8quot:(0,3),0,32;rem:(0,3),32,32;;/usr/include/sys/types.hu_char:t(40,1)=(9,1)u_short:t(40,2)=(9,2)u_int:t(40,3)=(9,3)u_long:t(40,4)=(9,4)quad_t:t(40,5)=(9,6)u_quad_t:t(40,6)=(9,5)fsid_t:t(40,7)=(9,30)loff_t:t(40,8)=(9,24)ino_t:t(40,9)=(9,20)dev_t:t(40,10)=(9,17)gid_t:t(40,11)=(9,19)mode_t:t(40,12)=(9,21)nlink_t:t(40,13)=(9,22)uid_t:t(40,14)=(9,18)off_t:t(40,15)=(9,23)pid_t:t(40,16)=(9,25)id_t:t(40,17)=(9,29)ssize_t:t(40,18)=(9,26)daddr_t:t(40,19)=(9,33)caddr_t:t(40,20)=(9,34)key_t:t(40,21)=(9,42)/usr/include/time.htime_t:t(41,1)=(9,35)clockid_t:t(41,2)=(9,40)timer_t:t(41,3)=(9,41)ulong:t(40,22)=(0,5)ushort:t(40,23)=(0,9)uint:t(40,24)=(0,4)int8_t:t(40,25)=(0,10)int16_t:t(40,26)=(0,8)int32_t:t(40,27)=(0,1)int64_t:t(40,28)=(0,6)u_int8_t:t(40,29)=(0,11)u_int16_t:t(40,30)=(0,9)u_int32_t:t(40,31)=(0,4)u_int64_t:t(40,32)=(0,7)register_t:t(40,33)=(0,1)/usr/include/sys/select.h/usr/include/bits/select.h/usr/include/bits/sigset.h__sig_atomic_t:t(45,1)=(0,1)__sigset_t:t(45,2)=(45,3)=s128__val:(45,4)=ar(0,1);0;31;(0,5),0,1024;;sigset_t:t(43,1)=(45,2)timespec:T(46,1)=s8tv_sec:(9,35),0,32;tv_nsec:(0,3),32,32;;/usr/include/bits/time.htimeval:T(47,1)=s8tv_sec:(9,35),0,32;tv_usec:(9,37),32,32;;suseconds_t:t(43,2)=(9,37)__fd_mask:t(43,3)=(0,3)fd_set:t(43,4)=(43,5)=s128__fds_bits:(43,6)=ar(0,1);0;31;(43,3),0,1024;;fd_mask:t(43,7)=(43,3)/usr/include/sys/sysmacros.hblkcnt_t:t(40,34)=(9,45)fsblkcnt_t:t(40,35)=(9,47)fsfilcnt_t:t(40,36)=(9,49)random_data:T(38,5)=s28fptr:(38,6)=*(40,27),0,32;rptr:(38,6),32,32;state:(38,6),64,32;rand_type:(0,1),96,32;rand_deg:(0,1),128,32;rand_sep:(0,1),160,32;end_ptr:(38,6),192,32;;drand48_data:T(38,7)=s24__x:(38,8)=ar(0,1);0;2;(0,9),0,48;__old_x:(38,8),48,48;__c:(0,9),96,16;__init:(0,9),112,16;__a:(0,7),128,64;;/usr/include/alloca.h__compar_fn_t:t(38,9)=(38,10)=*(38,11)=f(0,1)/usr/include/python1.5/myproto.h/usr/include/python1.5/object.h_object:T(52,1)=s8ob_refcnt:(0,1),0,32;ob_type:(52,2)=*(52,3)=xs_typeobject:,32,32;;PyObject:t(52,4)=(52,1)PyVarObject:t(52,5)=(52,6)=s12ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;ob_size:(0,1),64,32;;unaryfunc:t(52,7)=(52,8)=*(52,9)=f(52,10)=*(52,4)binaryfunc:t(52,11)=(52,12)=*(52,13)=f(52,10)ternaryfunc:t(52,14)=(52,15)=*(52,16)=f(52,10)inquiry:t(52,17)=(52,18)=*(52,19)=f(0,1)coercion:t(52,20)=(52,21)=*(52,22)=f(0,1)intargfunc:t(52,23)=(52,24)=*(52,25)=f(52,10)intintargfunc:t(52,26)=(52,27)=*(52,28)=f(52,10)intobjargproc:t(52,29)=(52,30)=*(52,31)=f(0,1)intintobjargproc:t(52,32)=(52,33)=*(52,34)=f(0,1)objobjargproc:t(52,35)=(52,36)=*(52,37)=f(0,1)getreadbufferproc:t(52,38)=(52,39)=*(52,40)=f(0,1)getwritebufferproc:t(52,41)=(52,39)getsegcountproc:t(52,42)=(52,43)=*(52,44)=f(0,1)getcharbufferproc:t(52,45)=(52,46)=*(52,47)=f(0,1)PyNumberMethods:t(52,48)=(52,49)=s92nb_add:(52,11),0,32;nb_subtract:(52,11),32,32;nb_multiply:(52,11),64,32;nb_divide:(52,11),96,32;nb_remainder:(52,11),128,32;nb_divmod:(52,11),160,32;nb_power:(52,14),192,32;nb_negative:(52,7),224,32;nb_positive:(52,7),256,32;nb_absolute:(52,7),288,32;nb_nonzero:(52,17),320,32;nb_invert:(52,7),352,32;nb_lshift:(52,11),384,32;nb_rshift:(52,11),416,32;nb_and:(52,11),448,32;nb_xor:(52,11),480,32;nb_or:(52,11),512,32;nb_coerce:(52,20),544,32;nb_int:(52,7),576,32;nb_long:(52,7),608,32;nb_float:(52,7),640,32;nb_oct:(52,7),672,32;nb_hex:(52,7),704,32;;PySequenceMethods:t(52,50)=(52,51)=s28sq_length:(52,17),0,32;sq_concat:(52,11),32,32;sq_repeat:(52,23),64,32;sq_item:(52,23),96,32;sq_slice:(52,26),128,32;sq_ass_item:(52,29),160,32;sq_ass_slice:(52,32),192,32;;PyMappingMethods:t(52,52)=(52,53)=s12mp_length:(52,17),0,32;mp_subscript:(52,11),32,32;mp_ass_subscript:(52,35),64,32;;PyBufferProcs:t(52,54)=(52,55)=s16bf_getreadbuffer:(52,38),0,32;bf_getwritebuffer:(52,41),32,32;bf_getsegcount:(52,42),64,32;bf_getcharbuffer:(52,45),96,32;;destructor:t(52,56)=(52,57)=*(52,58)=f(0,19)printfunc:t(52,59)=(52,60)=*(52,61)=f(0,1)getattrfunc:t(52,62)=(52,63)=*(52,64)=f(52,10)getattrofunc:t(52,65)=(52,12)setattrfunc:t(52,66)=(52,67)=*(52,68)=f(0,1)setattrofunc:t(52,69)=(52,36)cmpfunc:t(52,70)=(52,71)=*(52,72)=f(0,1)reprfunc:t(52,73)=(52,8)hashfunc:t(52,74)=(52,75)=*(52,76)=f(0,3)_typeobject:T(52,3)=s108ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;ob_size:(0,1),64,32;tp_name:(0,20),96,32;tp_basicsize:(0,1),128,32;tp_itemsize:(0,1),160,32;tp_dealloc:(52,56),192,32;tp_print:(52,59),224,32;tp_getattr:(52,62),256,32;tp_setattr:(52,66),288,32;tp_compare:(52,70),320,32;tp_repr:(52,73),352,32;tp_as_number:(52,77)=*(52,48),384,32;tp_as_sequence:(52,78)=*(52,50),416,32;tp_as_mapping:(52,79)=*(52,52),448,32;tp_hash:(52,74),480,32;tp_call:(52,14),512,32;tp_str:(52,73),544,32;tp_getattro:(52,65),576,32;tp_setattro:(52,69),608,32;tp_as_buffer:(52,80)=*(52,54),640,32;tp_flags:(0,3),672,32;tp_doc:(0,20),704,32;tp_xxx5:(0,3),736,32;tp_xxx6:(0,3),768,32;tp_xxx7:(0,3),800,32;tp_xxx8:(0,3),832,32;;PyTypeObject:t(52,81)=(52,3)/usr/include/python1.5/objimpl.h/usr/include/python1.5/pydebug.h/usr/include/python1.5/intobject.hPyIntObject:t(55,1)=(55,2)=s12ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;ob_ival:(0,3),64,32;;/usr/include/python1.5/longobject.hPyLongObject:t(56,1)=(56,2)=xs_longobject:/usr/lib/gcc-lib/i386-linux/2.95.4/include/limits.h/usr/lib/gcc-lib/i386-linux/2.95.4/include/syslimits.h/usr/include/limits.h/usr/include/bits/posix1_lim.h/usr/include/bits/local_lim.h/usr/include/linux/limits.h/usr/include/bits/posix2_lim.h/usr/include/python1.5/floatobject.hPyFloatObject:t(65,1)=(65,2)=s16ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;ob_fval:(0,13),64,64;;/usr/include/python1.5/complexobject.hPy_complex:t(66,1)=(66,2)=s16real:(0,13),0,64;imag:(0,13),64,64;;PyComplexObject:t(66,3)=(66,4)=s24ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;cval:(66,1),64,128;;/usr/include/python1.5/rangeobject.h/usr/include/python1.5/stringobject.hPyStringObject:t(68,1)=(68,2)=s24ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;ob_size:(0,1),64,32;ob_shash:(0,3),96,32;ob_sinterned:(52,10),128,32;ob_sval:(13,6),160,8;;/usr/include/python1.5/bufferobject.h/usr/include/python1.5/tupleobject.hPyTupleObject:t(70,1)=(70,2)=s16ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;ob_size:(0,1),64,32;ob_item:(70,3)=ar(0,1);0;0;(52,10),96,32;;/usr/include/python1.5/listobject.hPyListObject:t(71,1)=(71,2)=s16ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;ob_size:(0,1),64,32;ob_item:(71,3)=*(52,10),96,32;;/usr/include/python1.5/dictobject.h/usr/include/python1.5/methodobject.hPyCFunction:t(73,1)=(52,12)PyCFunctionWithKeywords:t(73,2)=(52,15)PyMethodDef:T(73,3)=s16ml_name:(0,20),0,32;ml_meth:(73,1),32,32;ml_flags:(0,1),64,32;ml_doc:(0,20),96,32;;PyMethodDef:t(73,4)=(73,3)PyMethodChain:T(73,5)=s8methods:(73,6)=*(73,4),0,32;link:(73,7)=*(73,5),32,32;;PyMethodChain:t(73,8)=(73,5)PyCFunctionObject:t(73,9)=(73,10)=s16ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;m_ml:(73,6),64,32;m_self:(52,10),96,32;;/usr/include/python1.5/moduleobject.h/usr/include/python1.5/funcobject.hPyFunctionObject:t(75,1)=(75,2)=s28ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;func_code:(52,10),64,32;func_globals:(52,10),96,32;func_defaults:(52,10),128,32;func_doc:(52,10),160,32;func_name:(52,10),192,32;;/usr/include/python1.5/classobject.hPyClassObject:t(76,1)=(76,2)=s32ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;cl_bases:(52,10),64,32;cl_dict:(52,10),96,32;cl_name:(52,10),128,32;cl_getattr:(52,10),160,32;cl_setattr:(52,10),192,32;cl_delattr:(52,10),224,32;;PyInstanceObject:t(76,3)=(76,4)=s16ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;in_class:(76,5)=*(76,1),64,32;in_dict:(52,10),96,32;;PyMethodObject:t(76,6)=(76,7)=s20ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;im_func:(52,10),64,32;im_self:(52,10),96,32;im_class:(52,10),128,32;;/usr/include/python1.5/fileobject.h/usr/include/python1.5/cobject.h/usr/include/python1.5/traceback.h/usr/include/python1.5/sliceobject.hPySliceObject:t(80,1)=(80,2)=s20ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;start:(52,10),64,32;stop:(52,10),96,32;step:(52,10),128,32;;/usr/include/python1.5/pyerrors.h/usr/include/python1.5/mymalloc.h/usr/include/python1.5/pystate.h_is:T(83,1)=s24next:(83,2)=*(83,1),0,32;tstate_head:(83,3)=*(83,4)=xs_ts:,32,32;modules:(52,10),64,32;sysdict:(52,10),96,32;builtins:(52,10),128,32;checkinterval:(0,1),160,32;;PyInterpreterState:t(83,5)=(83,1)_ts:T(83,4)=s60next:(83,3),0,32;interp:(83,6)=*(83,5),32,32;frame:(83,7)=*(83,8)=xs_frame:,64,32;recursion_depth:(0,1),96,32;ticker:(0,1),128,32;tracing:(0,1),160,32;sys_profilefunc:(52,10),192,32;sys_tracefunc:(52,10),224,32;curexc_type:(52,10),256,32;curexc_value:(52,10),288,32;curexc_traceback:(52,10),320,32;exc_type:(52,10),352,32;exc_value:(52,10),384,32;exc_traceback:(52,10),416,32;dict:(52,10),448,32;;PyThreadState:t(83,9)=(83,4)/usr/include/python1.5/modsupport.hva_list:t(85,1)=(23,1)/usr/include/python1.5/ceval.h/usr/include/python1.5/pythonrun.hPyOS_sighandler_t:t(87,1)=(87,2)=*(87,3)=f(0,19)/usr/include/python1.5/sysmodule.h/usr/include/python1.5/intrcheck.h/usr/include/python1.5/import.h_inittab:T(90,1)=s8name:(0,20),0,32;initfunc:(90,2)=*(90,3)=f(0,19),32,32;;_frozen:T(90,4)=s12name:(0,20),0,32;code:(19,34),32,32;size:(0,1),64,32;;/usr/include/python1.5/abstract.h/usr/include/python1.5/pyfpe.h/usr/include/curses.hchtype:t(93,1)=(0,5)/usr/include/unctrl.hbool:t(93,2)=(0,2)SCREEN:t(93,3)=(93,4)=xsscreen:WINDOW:t(93,5)=(93,6)=xs_win_st:attr_t:t(93,7)=(93,1)ldat:T(93,8)=s12text:(93,9)=*(93,1),0,32;firstchar:(0,8),32,16;lastchar:(0,8),48,16;oldindex:(0,8),64,16;;pdat:T(93,10)=s12_pad_y:(0,8),0,16;_pad_x:(0,8),16,16;_pad_top:(0,8),32,16;_pad_left:(0,8),48,16;_pad_bottom:(0,8),64,16;_pad_right:(0,8),80,16;;_win_st:T(93,6)=s76_cury:(0,8),0,16;_curx:(0,8),16,16;_maxy:(0,8),32,16;_maxx:(0,8),48,16;_begy:(0,8),64,16;_begx:(0,8),80,16;_flags:(0,8),96,16;_attrs:(93,7),128,32;_bkgd:(93,1),160,32;_notimeout:(93,2),192,8;_clear:(93,2),200,8;_leaveok:(93,2),208,8;_scroll:(93,2),216,8;_idlok:(93,2),224,8;_idcok:(93,2),232,8;_immed:(93,2),240,8;_sync:(93,2),248,8;_use_keypad:(93,2),256,8;_delay:(0,1),288,32;_line:(93,11)=*(93,8),320,32;_regtop:(0,8),352,16;_regbottom:(0,8),368,16;_parx:(0,1),384,32;_pary:(0,1),416,32;_parent:(93,12)=*(93,5),448,32;_pad:(93,10),480,96;_yoffset:(0,8),576,16;;mmask_t:t(93,13)=(0,5)MEVENT:t(93,14)=(93,15)=s20id:(0,8),0,16;x:(0,1),32,32;y:(0,1),64,32;z:(0,1),96,32;bstate:(93,13),128,32;;catchall_ERR:S(0,20)catchall_NULL:S(0,20)initialised:S(0,1)initialisedcolors:S(0,1)PyCursesCheckERR:f(52,10)code:p(0,1)fname:p(0,20)fname:r(0,20)buf:(0,21)=ar(0,1);0;99;(0,2)PyCurses_ConvertToChtype:F(0,1)obj:p(52,10)ch:p(93,9)obj:r(52,10)ch:r(93,9)PyCursesWindowObject:t(0,22)=(0,23)=s12ob_refcnt:(0,1),0,32;ob_type:(52,2),32,32;win:(93,12),64,32;;PyCursesWindow_untouchwin:f(52,10)self:p(0,24)=*(0,22)arg:p(52,10)self:r(0,24)PyCursesWindow_touchwin:f(52,10)self:p(0,24)PyCursesWindow_redrawwin:f(52,10)PyCursesWindow_winsertln:f(52,10)PyCursesWindow_werase:f(52,10)PyCursesWindow_wdeleteln:f(52,10)PyCursesWindow_is_wintouched:f(52,10)PyCursesWindow_wsyncup:f(52,10)PyCursesWindow_wsyncdown:f(52,10)PyCursesWindow_wstandend:f(52,10)PyCursesWindow_wstandout:f(52,10)PyCursesWindow_wcursyncup:f(52,10)PyCursesWindow_wclrtoeol:f(52,10)PyCursesWindow_wclrtobot:f(52,10)PyCursesWindow_wclear:f(52,10)PyCursesWindow_idcok:f(52,10)arg1:(0,1)PyCursesWindow_immedok:f(52,10)PyCursesWindow_getyx:f(52,10)arg1:r(0,1)arg2:r(0,1)PyCursesWindow_getbegyx:f(52,10)PyCursesWindow_getmaxyx:f(52,10)PyCursesWindow_getparyx:f(52,10)PyCursesWindow_wattron:f(52,10)arg1:(93,7)PyCursesWindow_wattroff:f(52,10)PyCursesWindow_wattrset:f(52,10)PyCursesWindow_clearok:f(52,10)PyCursesWindow_idlok:f(52,10)PyCursesWindow_keypad:f(52,10)PyCursesWindow_leaveok:f(52,10)PyCursesWindow_nodelay:f(52,10)PyCursesWindow_notimeout:f(52,10)PyCursesWindow_scrollok:f(52,10)PyCursesWindow_winsdelln:f(52,10)PyCursesWindow_syncok:f(52,10)PyCursesWindow_mvwin:f(52,10)arg2:(0,1)PyCursesWindow_mvderwin:f(52,10)PyCursesWindow_wmove:f(52,10)PyCursesWindow_wresize:f(52,10)PyCursesWindow_New:f(52,10)win:p(93,12)win:r(93,12)wo:r(0,24)PyCursesWindow_Dealloc:f(0,19)wo:p(0,24)PyCursesWindow_AddCh:f(52,10)arg:r(52,10)rtn:r(0,1)x:(0,1)y:(0,1)use_xy:r(0,1)temp:(52,10)ch:(93,1)attr:(93,7)PyCursesWindow_AddStr:f(52,10)str:(0,20)attr_old:(93,7)use_attr:(0,1)PyCursesWindow_AddNStr:f(52,10)n:(0,1)PyCursesWindow_Bkgd:f(52,10)bkgd:(93,1)PyCursesWindow_BkgdSet:f(52,10)PyCursesWindow_Border:f(52,10)args:p(52,10)args:r(52,10)ls:(93,1)rs:(93,1)ts:(93,1)bs:(93,1)tl:(93,1)tr:(93,1)bl:(93,1)br:(93,1)PyCursesWindow_Box:f(52,10)ch1:(93,1)ch2:(93,1)PyCursesWindow_DelCh:f(52,10)PyCursesWindow_DerWin:f(52,10)nlines:(0,1)ncols:(0,1)begin_y:(0,1)begin_x:(0,1)PyCursesWindow_EchoChar:f(52,10)PyCursesWindow_GetBkgd:f(52,10)PyCursesWindow_GetCh:f(52,10)rtn:r(93,1)PyCursesWindow_GetKey:f(52,10)PyCursesWindow_GetStr:f(52,10)rtn:(0,25)=ar(0,1);0;1023;(0,2)rtn2:r(0,1)PyCursesWindow_Hline:f(52,10)code:r(0,1)PyCursesWindow_InsCh:f(52,10)PyCursesWindow_InCh:f(52,10)PyCursesWindow_InStr:f(52,10)rtn:(0,26)=ar(0,1);0;1023;(0,2)PyCursesWindow_InsStr:f(52,10)PyCursesWindow_InsNStr:f(52,10)PyCursesWindow_Is_LineTouched:f(52,10)line:(0,1)erg:r(0,1)PyCursesWindow_NoOutRefresh:f(52,10)pminrow:(0,1)pmincol:(0,1)sminrow:(0,1)smincol:(0,1)smaxrow:(0,1)smaxcol:(0,1)PyCursesWindow_PutWin:f(52,10)PyCursesWindow_RedrawLine:f(52,10)beg:(0,1)num:(0,1)PyCursesWindow_Refresh:f(52,10)PyCursesWindow_SetScrollRegion:f(52,10)PyCursesWindow_SubWin:f(52,10)PyCursesWindow_Scroll:f(52,10)lines:(0,1)PyCursesWindow_TouchLine:f(52,10)st:(0,1)cnt:(0,1)val:(0,1)PyCursesWindow_Vline:f(52,10)PyCursesWindow_Methods:S(0,27)=ar(0,1);0;-1;(73,4)PyCursesWindow_GetAttr:f(52,10)name:p(0,20)PyCursesWindow_Type:G(52,81)PyCurses_beep:f(52,10)self:p(52,10)PyCurses_def_prog_mode:f(52,10)PyCurses_def_shell_mode:f(52,10)PyCurses_doupdate:f(52,10)PyCurses_endwin:f(52,10)PyCurses_flash:f(52,10)PyCurses_nocbreak:f(52,10)PyCurses_noecho:f(52,10)PyCurses_nonl:f(52,10)PyCurses_noraw:f(52,10)PyCurses_reset_prog_mode:f(52,10)PyCurses_reset_shell_mode:f(52,10)PyCurses_resetty:f(52,10)PyCurses_savetty:f(52,10)PyCurses_resizeterm:f(52,10)PyCurses_cbreak:f(52,10)flag:(0,1)PyCurses_echo:f(52,10)PyCurses_nl:f(52,10)PyCurses_raw:f(52,10)PyCurses_baudrate:f(52,10)PyCurses_termattrs:f(52,10)PyCurses_termname:f(52,10)PyCurses_longname:f(52,10)PyCurses_can_change_color:f(52,10)PyCurses_has_colors:f(52,10)PyCurses_has_ic:f(52,10)PyCurses_has_il:f(52,10)PyCurses_isendwin:f(52,10)PyCurses_filter:f(52,10)PyCurses_flushinp:f(52,10)PyCurses_noqiflush:f(52,10)PyCurses_Color_Content:f(52,10)color:(0,8)r:(0,8)g:(0,8)b:(0,8)PyCurses_COLOR_PAIR:f(52,10)PyCurses_Curs_Set:f(52,10)vis:(0,1)PyCurses_Delay_Output:f(52,10)ms:(0,1)PyCurses_EraseChar:f(52,10)ch:(0,2)PyCurses_getsyx:f(52,10)x:r(0,1)y:r(0,1)PyCurses_GetWin:f(52,10)PyCurses_HalfDelay:f(52,10)tenths:(0,11)PyCurses_has_key:f(52,10)ch:(0,1)PyCurses_Init_Color:f(52,10)PyCurses_Init_Pair:f(52,10)pair:(0,8)f:(0,8)PyCurses_InitScr:f(52,10)lines:r(52,10)cols:r(52,10)PyCurses_IntrFlush:f(52,10)PyCurses_KeyName:f(52,10)knp:r(19,32)PyCurses_KillChar:f(52,10)PyCurses_Meta:f(52,10)PyCurses_NewPad:f(52,10)PyCurses_NewWindow:f(52,10)PyCurses_Pair_Content:f(52,10)PyCurses_PAIR_NUMBER:f(52,10)PyCurses_Putp:f(52,10)PyCurses_QiFlush:f(52,10)PyCurses_setsyx:f(52,10)PyCurses_Start_Color:f(52,10)c:r(52,10)cp:r(52,10)PyCurses_UnCtrl:f(52,10)ch:r(93,1)PyCurses_UngetCh:f(52,10)PyCurses_Use_Env:f(52,10)PyCurses_methods:S(0,28)=ar(0,1);0;-1;(73,4)initjack_curses:F(0,19)m:r(52,10)d:(52,10)v:r(52,10)key:(0,1)key_n:(0,20)key_n2:r(0,20)p1:r(0,20)p2:r(0,20)PyCursesError:S(52,10)ModDict:S(52,10)GCC: (GNU) 2.95.4 20010810 (Debian prerelease)GCC: (GNU) 2.95.4 20011006 (Debian prerelease)GCC: (GNU) 2.95.4 20011006 (Debian prerelease)GCC: (GNU) 2.95.4 20011006 (Debian prerelease)GCC: (GNU) 2.95.4 20010810 (Debian prerelease)01.0101.0101.0101.0101.01.symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.data.rel.got.rel.plt.init.plt.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.got.sbss.bss.stab.stabstr.comment.note””! ””° )DD—1˙˙˙oÜÜv>ţ˙˙oTT0M „„8W ź!ź!¨` d"d"0 i”&”&%oź&ź&pt0/0/ez0”0”€`”`”  ˆşŞŔ ŽŔÂŔ˛˜ÄÂIJČĄŒĂŒł¨”Ă”łŻœĂœłx´ĆśşĆś żśq Ĺ'Œ[Τ‚đ×”ƒdřƒÝ`‰ Á €ŸÖ””DÜT„ź!d"”& ź& 0/ 0” `” şŔÂÄÂŒĂ”ĂœĂĆĆ0/ 0/ ń˙`/ +ş/”Ă=şI`/ _ŔÂrč/ }Ƈ0 “80 ž şʌĂ ń˙ŕ“ şŕ“ АĂ“” žŔÂݘĂęŔÂ0” řń˙ $ş(ş',ş30şEP0y V,ĆdL1p ~ź1p –,2_ ŻŒ2[ Čč2V Ţ@3X ÷˜3W đ3K +<4K Dˆ4K ]Ô4K v 5K l5K Џ5O Â6O ŘX6T íŹ6[ 7e p7f 1Ř7s IL8h a´8c x9_ x9e ¨ŕ9_ ż@:_ Ô :_ ę;_ `;_ Ŕ;_ 1 <_ I€<] bŕ<_ x@=g ¨=a Ľ >a şp>g ŃŘ>? ä?@ űX?Ş Aô &řB = E QF hGź ~ĚG“ ‘`Hč ŚHI źPJ ÔlKK ë¸KÉ „Lô xMŤ ,$OÔ AřPŞ V¤Rí j”SŸ 4Uô •(W ŹžĄ€i†9u:§4ŽŚvŠo}%_K<8A˘‚3lj&OŒQX|?Ľ–#›YJMƒG˜NFD h‘$`zŸ• ;1—B/27t“„qœHL@Z0$Üń˙ 0Úń˙ /pV 5 Ť;˘"St"i€Ńyˆ"1–Ś_[ żĘ×ĺóĽľ$N.¨59CRaâiđsE~ÜˆŮ’-™IŸ§ľ.ž'ČĐdÖ/Ýĺ3í"÷| FJţ$ Öl8FM€TĘ"YfsƒÖŠ““ů™V˘sŞśĽ˝SÄîÎjŘçî—ö ĆŒ!%'•/ű86GžTam{Ą‚J‹e”?Ÿ<Ś<­płÁÍ[ŇFŕZďŞřN˙[X))m ~0~A!I!Q\…c)h)kĄoNxş‚<‹N”)Ľa°`ˇNž+ÇÎp×7á˘ďšřˇ/YB'(/g:D˛LRglSv/T„Ú‹B’sŸ%¤7Ź^¸żË ŇúÚâřŸD  íü ”2"$3k!w!€Š5‘ Ťń˙˜äÜń˙ŸäÜń˙ŤÝń˙Ŕń˙_DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__deregister_frame_info__register_frame_infoPyCursesVersion_Py_NoneStructstrcpystrcatPyErr_SetStringPyCurses_ConvertToChtypePyInt_TypePyInt_AsLongPyString_SizePyString_TypePyString_AsStringPyArg_Parsewtouchlnwredrawlnwinsdellnweraseis_wintouched_Py_TrueStruct_Py_ZeroStructwsyncupwsyncdownwcursyncupwclrtoeolwclrtobotwclearidcokimmedokPy_BuildValuewattr_onwattr_offclearokidlokkeypadleaveoknodelaynotimeoutscrolloksyncokmvwinmvderwinwmovewresizePyCursesWindow_Type_PyObject_NewstdscrdelwinfreePyTuple_TypePyTuple_SizePyExc_TypeErrorwaddchwaddnstrwbkgdwbkgdsetwborderPyErr_ClearwdelchderwinwechocharpechocharPyInt_FromLongwgetchkeynamePyString_FromStringwgetnstrwhlinewinschwinchwinnstrwinsnstris_linetouchedpnoutrefreshwnoutrefreshPyFile_TypePyFile_AsFileputwinprefreshwrefreshwsetscrregsubpadsubwinwscrlPy_FindMethodPyType_Typebeepdef_prog_modedef_shell_modedoupdateendwinflashnocbreaknoechononlnorawreset_prog_modereset_shell_moderesettysavettyresizetermcbreakechonlrawbaudratetermattrstermnamelongnamecan_change_colorhas_colorshas_ichas_ilisendwinfilterflushinpnoqiflushcolor_contentcurs_setdelay_outputerasecharnewscrgetwinhalfdelayhas_keyinit_colorinit_pairinitscrLINESPyDict_SetItemStringCOLSintrflushkillcharmetanewpadnewwinpair_contentputpqiflushstart_colorCOLORSCOLOR_PAIRSunctrlungetchuse_envinitcursesPy_InitModule4PyModule_GetDictacs_mapstrncmpmallocPyErr_OccurredPy_FatalErrorlibncurses.so.4libtermcap.so.2libc.so.6___brk_addr__curbrk__environatexit_etext_edata__bss_start_endcursesmodule.soGCC.INTERNALGLIBC_2.0?°ź=Ŕaii ÍŃ^ ×^ ć^ö^ ţ^_ __ *_2_:_F_b_|_„_”_ş_Đ_Ř_č_ ` `(`4`H```h`t``˜` `Ź`ˇ`Đ`Ř`ä`ń`aa'a0a6aAaGaTa\anasa ya ˆaa˘a§a ­a źaÄaÚa ŕa đařab b (b0bBbGb Mb \bdbvb{b b b˜bŞbŻb ľb ČbĐbâb çb íb c c c!%c +c CcKc`c"ec kc |c„cťcŔc#ĚcÔc dd#d%dhdmd#|d„dşdżd#ÓdŰdçd÷d$ee+e;e%_egeseŸe§ełeÁe&ßeçeóef'f'f3fAf(_fgfsff)Ÿf§fłfÁf*ßfçfófg+g'g3gAg,_gggsggŸg§głgÁg-ăgëg÷gh.+h3h?hPh/sh{h‡h˜h0ťhĂhĎhŕh1řh2ýh3$i4,i55i6fi7ni8§i­iżiĹiäięij j!j;jAj9Fj _j0vj:~jľj7˝j8÷jýjk"kAkGkekkkƒk‰k9Žk Ďk0çk;ţk;lQl7Yl8›lĄlÄlĘlńl÷lmm7m=m9Bm †m0Ÿm;˝m;Řmn7 n85n;nQnWnen„n’n<˘n¨n9­n Đn7Řn8űnooo1oXo=]oqowo9|o çoďop>p $p MpSp_p?lprpšp>Ÿp Ľp Ĺp7Íp8ôpúpq0*q@4q:q9?q Hq{q7ƒq8Žq´qŇqŘqćqěq9rAr r%r Hr7Pr8zr€r™rŸrąrËrŃr9Ör írúrBssC$s,sAsDas7is8”sšsşs0ĘsEÔsÚs9ßs ésD t7t8;tAtZt0jtEttzt9t tF–tG˘t§t#Ět7Ôt8u%uOuUutu0šu uťu0ŘuHńu÷u9üu vG?v7Gv8‰vvĽvŤvŇvŘvív0 ww(w00wOwUw9Zw dwvwIwşw7Âw8x xx#xBxHxbxhxx›xĄx9Śx żx0ÖxJŢxy7 y84y:yZy0jyKtyzy9y ‰yDŹy7´y8˙yz/z5zTz0zz€z›z0¸zLŃz×z9Üz ňzG%{7-{8g{m{Œ{’{ą{ˇ{Ő{Ű{ó{ů{9ţ{ ?|0W|Mn|M‰|Á|7É|8 }}4}:}a}g}‰}}§}­}9˛} ö}0~M-~MH~g~o~Š~N—~~9˘~ ľ~ť~Â~Č~ň~7ú~806B\Oflq x~Š’PˇżĐQ×ÝRěS€€9 € #€+€7€H€~€7†€8ˇ€˝€ɀă€Tń€÷€ü€  UKS_pV›فȁWށXóůţ ‚7%‚8E‚U‚[‚g‚r‚Y‚‚ˆ‚9‚ ą‚7š‚8é‚ď‚ű‚ƒƒ"ƒ3ƒCƒIƒ9Nƒ {ƒ7ƒƒ8Ƀσĺƒëƒ„„-„0M„S„h„0p„„•„9š„ ¤„ś„IÁ„ބă„Zń„ů„… ……\!…'…,… 9…A…I…U…Z…]g…m…r… …‰…‘……˘…^ą…ˇ…ź… Ʌхمĺ…ę…_÷…ý…† ††!†-†2†`A†G†L† Y†a†i†u†z†a‡††’† Ą†Іą†˝††bц׆܆ é†ń†ů†‡ ‡c‡‡"‡ 1‡9‡A‡M‡R‡da‡g‡l‡ y‡‡‰‡•‡š‡e§‡­‡˛‡ Á‡ɇч݇â‡fń‡÷‡ü‡ ˆˆˆ%ˆ*ˆg7ˆ=ˆBˆ QˆYˆaˆmˆrˆhˆ‡ˆŒˆ ™ˆĄˆЈľˆşˆiLj͈҈ äˆôˆüˆ ‰ ‰‰j)‰/‰4‰ O‰W‰]‰m‰7u‰8•‰š‰kĽ‰Ť‰˝‰‰kɉΉbá‰ç‰9ě‰ ŠŠŠ)Š71Š8UŠZŠleŠkŠ}Š‚Šl‰ŠŽŠcĄŠ§Š9ʊ ˊӊيéŠ7ńŠ8‹‹m%‹+‹=‹B‹mI‹N‹da‹g‹9l‹ ‹‹“‹™‹Š‹7ą‹8Ջڋnĺ‹ë‹ý‹Œn ŒŒe!Œ'Œ9,Œ =ŒEŒMŒYŒo_ŒDfŒlŒqŒ Œ‰Œ‘ŒŒpٌDąŒˇŒźŒ ɌьٌĺŒqëŒGňŒřŒýŒ )r/G6<A QY_d qy‰s’˜Ą§ľ˝Íȍ эٍétňřŽŽŽŽ#Ž(Ž 1Ž9ŽIŽuRŽXŽaŽgŽuŽ}ŽƒŽˆŽ ‘Ž™ŽŠŽv˛Ž¸ŽÁŽǎՎݎăŽčŽ ńŽůŽ w!'5=EQxV \ cin }…™yž ¤ ąˇź ɏяُĺzę đ ÷ý  (0=7E8RX9ek’{ŸĽސ ǐ#ܐäęď ÷˙ ‘7‘8!‘'‘9,‘ 7‘=‘P‘Dl‘t‘z‘‡‘7‘8œ‘˘‘9§‘ ľ‘ť‘ԑ|â‘Dé‘’ ’’’ '’7/’8<’B’9G’ U’[’g’o’}’˜’ ’Ź’~¸’GÁ’ǒ̒ ْá’ç’ě’ ő’ý’!“G“L“#\“d“u“}“Ž“Q•“›“9Ł“RŠ“€Â“ȓ͓ ä“ě“ň“˙“7”8#”)”9”?”9D” Q”[”x”€”†”‹” ˜” ”´”‚˝”Ôєהě”ô”ú”• •••7%•8O•U•e•k•9p• y•’•ƒ°•¸•ž•Õ ҕڕç•7ď•8ü•–9– –#–/–C–„b–j–‚–‹–4–U––4Ą–…­–ł–¸– –̖†Ń–Dٖߖä–‡—ˆ—D ———‡L—T—Z—g—7o—8Œ—’—˘—¨—9­— ś—Ŕ—‰Ü—ä—ę—ď— ü—˜˜F#˜)˜G7˜?˜K˜ŠW˜Gp˜x˜~˜‹˜7“˜8ł˜š˜ɘϘ9Ԙ á˜ę˜4ď˜‹ ™™)™1™C™ŒX™^™c™ x™€™—™7Ÿ™8əϙá™Œššš)š/š9CšIšNš hšpš‚šŠššš7˘š8Úɚךݚ9ńšŽ› ›#››› 8›@›F›R›Z›`›m›7u›8“›™›Š›Ż›9´› ƛDۛă›ď›÷›œ'œ-œ:œ7Bœ8gœmœœ†œz‹œ ‘œ ˜œžœ9ٜ źœĜƜל7ߜ8ěœňœ9÷œ !ATY0^ d v~ˆ ‘Ťľ’şDȝ͝‡é“îDöüž‡ž ž &ž,ž1ž DžLžRž]žež|ž„ž’ž™žŸž9¤ž ˛žžž”ÄžGԞܞâžížőž ŸŸ"Ÿ)Ÿ/Ÿ94Ÿ BŸMŸSŸ•pŸxŸ~Ÿ‹Ÿ7“Ÿ8łŸšŸɟϟ9ԟ äŸ–éŸ ďŸ    ˜ ™% * / G7 = F ‡O T G\ e ‡k t ‡ š• D› Ą Ś ‡Ź šą Dˇ ˝  ‡Ë šĐ D֠ܠ᠇砚ě Dň ř ý ‡Ąš ĄDĄĄĄ‡"Ąš'ĄD-Ą3Ą8Ą‡AĄšFĄDLĄRĄWĄ‡]ĄšbĄDhĄnĄsĄ‡|ĄšĄD‡ĄĄ’Ą‡˜ĄšĄDŁĄŠĄŽĄ‡ˇĄšźĄDÂĄČĄÍĄ‡ÓĄšŘĄDŢĄäĄéĄ‡ňĄš÷ĄDýĄ˘˘‡˘š˘D˘˘$˘‡-˘š2˘D8˘>˘C˘‡I˘šN˘DT˘Z˘_˘‡h˘šm˘Ds˘y˘~˘‡„˘š‰˘D˘•˘š˘‡Ł˘š¨˘DŽ˘´˘š˘‡ż˘šÄ˘DʢТŐ˘‡Ţ˘šă˘Dé˘ď˘ô˘‡ú˘š˙˘DŁ ŁŁ‡ŁšŁD$Ł*Ł/ه5Łš:ŁD@ŁFŁKهTŁšYŁD_ŁeŁjهpŁšuŁD{فنهŁš”ŁDšŁ ŁĽŁ‡ŤŁš°ŁDśŁźŁÁŁ‡ĘŁšĎŁDգۣࣇ棚ëŁDńŁ÷Łüه¤š ¤D¤¤¤‡!¤š&¤D,¤2¤7¤‡@¤šE¤DK¤Q¤V¤‡\¤ša¤Dg¤m¤r¤‡{¤š€¤D†¤Œ¤‘¤‡—¤šœ¤D˘¤¨¤­¤‡ś¤šť¤DÁ¤Ǥ̤‡Ň¤š×¤Dݤă¤č¤‡ń¤šö¤Dü¤ĽĽ‡ ĽšĽDĽĽ#Ľ‡,Ľš1ĽD7Ľ=ĽBĽ‡HĽšMĽDSĽYĽ^Ľ‡kĽDqĽwĽ|Ľ‡ƒĽD‰ĽĽ”Ľ‡ĄĽD§Ľ­Ľ˛Ľ‡źĽDÂĽČĽÍĽ‡ÚĽDŕĽćĽëĽ‡őĽDűĽŚŚ‡ŚDŚŚ$ڇ.ŚD4Ś:Ś?ڇLŚDRŚXŚ]ڇgŚDmŚsŚxڇ…ŚD‹Ś‘ږڇ ŚDŚŚŹŚąŚ‡žŚDÄŚĘŚĎŚ‡ŮŚDߌĺŚęڇ÷ŚDýڧ§‡§D§§#§‡0§D6§<§A§‡K§DQ§W§\§‡i§Do§u§z§‡„§DЧ§•§‡Ÿ§DĽ§Ť§°§‡ş§DŔ§Ƨ˧‡Ř§Dާä§é§‡ó§Dů§˙§¨‡¨D¨¨"¨‡,¨D2¨8¨=¨‡J¨DP¨V¨[¨‡e¨Dk¨q¨v¨‡ƒ¨D‰¨¨”¨‡ž¨D¤¨ިݍ‡ź¨D¨Ȩͨ‡×¨Dݨă¨č¨‡ő¨Dű¨ŠŠ‡ŠDŠŠ!Ї.ŠD4Š:Š?ЇIŠDOŠUŠZЇdŠDjŠpŠuЇ|ŠD‚ŠˆŠŠ‡—ŠDŠŁŠ¨Š‡ŻŠDľŠťŠŔŠ‡ĘŠDĐŠÖŠŰŠ‡âŠDčŠîŠóЇýŠDŞ ŞŞ‡ŞDŞ!Ş&އ9ŞFMŞ`ŞfŞ›ŞœˇŞDÄŞ‡ŃŞ6îŞDôŞúŞ˙އ ŤDŤŤŤ‡"Ť+Ť0Ťž`Ń€Ń„ŃˆŃ”Ń˜Ń¤Ń¨Ń´Ń¸ŃÄŃČŃÔŃŘŃäŃčŃôŃřŃŇŇŇŇ$Ň(Ň4Ň8ŇDŇHŇTŇXŇdŇhŇtŇxŇ„ŇˆŇ”Ň˜Ň¤Ň¨Ň´Ň¸ŇÄŇČŇÔŇŘŇäŇčŇôŇřŇÓÓÓÓ$Ó(Ó4Ó8ÓDÓHÓTÓXÓdÓhÓtÓxÓ„ÓˆÓ”Ó˜Ó¤Ó¨Ó´Ó¸ÓÄÓČÓÔÓŘÓäÓčÓôÓřÓÔÔÔÔ$Ô(Ô4Ô8ÔDÔHÔTÔXÔdÔhÔtÔxÔ„ÔˆÔ”Ô˜Ô¤Ô¨Ô´Ô¸ÔÄÔČÔÔÔŘÔäÔčÔôÔřÔŐŐŐŐ$Ő(Ő4Ő8ŐDŐHŐTŐXŐdŐhŐtŐxŐ„ŐˆŐ”Ő˜Ő¤Ő¨Ő´Ő¸ŐÄŐČŐÔŐŘŐäŐčŐôŐřŐ$Ö[,Ö8Ö@ÖŒÖÖœÖ ÖŹÖ°ÖźÖŔÖĚÖĐÖÜÖŕÖěÖđÖüÖ× ××× ×,×0×<×@×L×P×\×`×l×p×|×€×Œ××œ× ×Ź×°×ź×Ŕ×Ě×Đ×Ü×ŕ×ě×đ×ü×Ř ŘŘŘ Ř,Ř0Ř<Ř@ŘLŘPŘ\Ř`ŘlŘpŘ|Ř€ŘŒŘŘœŘ ŘŹŘ°ŘźŘŔŘĚŘĐŘÜŘŕŘěŘđŘüŘŮ ŮŮŮ Ů,Ů0Ů<Ů@ŮLŮPŮ\Ů`ŮlŮpŮ|Ů€ŮŒŮŮœŮ ŮŹŮ°ŮźŮŔŮĚŮĐŮÜŮŕŮěŮđŮüŮÚÜÜŸÜ ÜĄÜ<Út@Ú˘DÚƒHÚYLÚpPÚ‚TÚ}XÚq\Ú`ÚzdÚhÚAlÚOpÚtÚ‘xÚ–|Ú`€Ú„Ú@ˆÚ_ŒÚ&Ú„”Ú$˜ÚFœÚB ÚN¤ÚW¨ÚŹÚS°Ú^´Ú¸ÚXźÚ~ŔÚmÄÚlČÚfĚÚbĐÚœÔÚLŘÚ!ÜÚŒŕÚ'äÚsčÚ”ěÚđÚgôÚUřÚküÚ€ŰhŰ;Űd ŰŰ(ŰŰHŰ. Űx$Űi(Űc,ۉ0Ű,4ہ8Űj<ۍ@Ű›DŰ:HŰ…LŰaPŰ<TŰ•XŰ"\ŰK`ŰndŰ{hŰ0lۏpŰ tŰ‹xŰu|Ű5€Űw„ŰMˆŰJŒŰ)Ű|”ŰE˜ŰIœŰP Űy¤Ű1¨ŰŹŰ+°Ű´Ű6¸ŰVźŰ\ŔŰÄŰeČŰ ĚŰ%ĐŰoÔŰ*ŘŰŠÜŰ/ŕŰ=äŰrčŰěŰ-đŰTôŰ>řŰŽüŰ]ÜCÜvÜ Ü U‰ĺSč[ĂˇƒƒťŕtčR‰öčßčŚT‹]üÉĂ˙ł˙Ł˙Ł héŕ˙˙˙˙ŁhéĐ˙˙˙˙ŁhéŔ˙˙˙˙Łhé°˙˙˙˙Łh é ˙˙˙˙Ł h(é˙˙˙˙Ł$h0é€˙˙˙˙Ł(h8ép˙˙˙˙Ł,h@é`˙˙˙˙Ł0hHéP˙˙˙˙Ł4hPé@˙˙˙˙Ł8hXé0˙˙˙˙Ł<h`é ˙˙˙˙Ł@hhé˙˙˙˙ŁDhpé˙˙˙˙ŁHhxéđţ˙˙˙ŁLh€éŕţ˙˙˙ŁPhˆéĐţ˙˙˙ŁThéŔţ˙˙˙ŁXh˜é°ţ˙˙˙Ł\h é ţ˙˙˙Ł`h¨éţ˙˙˙Łdh°é€ţ˙˙˙Łhh¸épţ˙˙˙ŁlhŔé`ţ˙˙˙ŁphČéPţ˙˙˙ŁthĐé@ţ˙˙˙ŁxhŘé0ţ˙˙˙Ł|hŕé ţ˙˙˙Ł€hčéţ˙˙˙Ł„hđéţ˙˙˙وhřéđý˙˙˙ٌhéŕý˙˙˙ِhéĐý˙˙˙Ł”héŔý˙˙˙٘hé°ý˙˙˙ٜh é ý˙˙˙Ł h(éý˙˙˙٤h0é€ý˙˙˙ٍh8épý˙˙˙ŁŹh@é`ý˙˙˙ٰhHéPý˙˙˙Ł´hPé@ý˙˙˙ُhXé0ý˙˙˙Łźh`é ý˙˙˙ŁŔhhéý˙˙˙ŁÄhpéý˙˙˙ŁČhxéđü˙˙˙ŁĚh€éŕü˙˙˙ŁĐhˆéĐü˙˙˙ŁÔhéŔü˙˙˙ŁŘh˜é°ü˙˙˙ŁÜh é ü˙˙˙Łŕh¨éü˙˙˙Łäh°é€ü˙˙˙Łčh¸épü˙˙˙ŁěhŔé`ü˙˙˙ŁđhČéPü˙˙˙ŁôhĐé@ü˙˙˙ŁřhŘé0ü˙˙˙Łühŕé ü˙˙˙Łhčéü˙˙˙Łhđéü˙˙˙Łhřéđű˙˙˙Ł héŕű˙˙˙ŁhéĐű˙˙˙ŁhéŔű˙˙˙Łhé°ű˙˙˙Łh é ű˙˙˙Ł h(éű˙˙˙Ł$h0é€ű˙˙˙Ł(h8épű˙˙˙Ł,h@é`ű˙˙˙Ł0hHéPű˙˙˙Ł4hPé@ű˙˙˙Ł8hXé0ű˙˙˙Ł<h`é ű˙˙˙Ł@hhéű˙˙˙ŁDhpéű˙˙˙ŁHhxéđú˙˙˙ŁLh€éŕú˙˙˙ŁPhˆéĐú˙˙˙ŁThéŔú˙˙˙ŁXh˜é°ú˙˙˙Ł\h é ú˙˙˙Ł`h¨éú˙˙˙Łdh°é€ú˙˙˙Łhh¸épú˙˙˙ŁlhŔé`ú˙˙˙ŁphČéPú˙˙˙ŁthĐé@ú˙˙˙ŁxhŘé0ú˙˙˙Ł|hŕé ú˙˙˙Ł€hčéú˙˙˙Ł„hđéú˙˙˙وhřéđů˙˙˙ٌhéŕů˙˙˙ِhéĐů˙˙˙Ł”héŔů˙˙˙٘hé°ů˙˙˙ٜh é ů˙˙˙Ł h(éů˙˙˙٤h0é€ů˙˙˙ٍh8épů˙˙˙ŁŹh@é`ů˙˙˙ٰhHéPů˙˙˙Ł´hPé@ů˙˙˙ُhXé0ů˙˙˙Łźh`é ů˙˙˙ŁŔhhéů˙˙˙ŁÄhpéů˙˙˙ŁČhxéđř˙˙˙ŁĚh€éŕř˙˙˙ŁĐhˆéĐř˙˙˙ŁÔhéŔř˙˙˙ŁŘh˜é°ř˙˙˙ŁÜh é ř˙˙U‰ĺSč[Ă'|ƒť4÷˙˙u>됍t&P‰“0÷˙˙‹˙Ћƒ0÷˙˙ƒ8u胝ät ƒě˙˙˙Pč#ű˙˙ǃ4÷˙˙‹]üÉĂU‰ĺSč[ĂË{‹]üÉÍvU‰ĺSč[Ăł{ƒťčtƒ´Pƒě˙˙˙Pčŕř˙˙‹]üÉÍvU‰ĺSč[Ă{‹]üÉАU‰ĺƒědS‹E ƒ}˙t¸˙ë9v…Ŕu ˙5„Ńët&P]œSčü˙˙˙ƒÄhŹSčü˙˙˙S˙5üÜčü˙˙˙1Ŕ‹]˜ÉÐU‰ĺVS‹]‹u {uSčü˙˙˙ë1Sčü˙˙˙‰ÂƒÄ{”Ŕƒú”Â!Шu1ŔëvSčü˙˙˙ž‰¸eř[^ÉÐU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë4hŹj‹E‹P…Ňt żB@ë t&¸˙˙˙˙PjRčü˙˙˙ƒÄPčůţ˙˙ÉÍvU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë0hŹj‹E‹P…ŇtżB@됸˙˙˙˙PjRčü˙˙˙ƒÄPčŠţ˙˙ÉÍvU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕt$h&Ź‹E‹PżB@PjRčü˙˙˙ƒÄ Pčkţ˙˙ë1ŔÉÐU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕth0Źj‹E˙pčü˙˙˙ƒÄPč2ţ˙˙ë1ŔÉĂU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕth:Ź‹E˙pčü˙˙˙ƒÄPčüý˙˙ë1ŔÉÉöU‰ĺhŹ˙u čü˙˙˙ƒÄ…ŔthAŹj˙‹E˙pčü˙˙˙ƒÄPčÂý˙˙ë1ŔÉĂU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë,‹E˙pčü˙˙˙…Ŕt¸˙ët&¸˙ÉÍvU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕt‹E˙pčü˙˙˙¸˙ë1ŔÉĂU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕt‹E˙pčü˙˙˙¸˙ë1ŔÉÐU‰ĺhŹ˙u čü˙˙˙…Ŕt‹E‹@Ç@¸˙ë1ŔÉÉöU‰ĺhŹ˙u čü˙˙˙…Ŕt ‹E‹@Ç@¸˙덶1ŔÉĂU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕt‹E˙pčü˙˙˙¸˙ë1ŔÉÐU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕt‹E˙pčü˙˙˙¸˙ë1ŔÉÐU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕt‹E˙pčü˙˙˙¸˙됍t&1ŔÉĂU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕt‹E˙pčü˙˙˙¸˙ë1ŔÉÐU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …Ŕt˙uü‹E˙pčü˙˙˙¸˙ë1ŔÉÍvU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …Ŕt˙uü‹E˙pčü˙˙˙¸˙ë1ŔÉÍvU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë1‹E‹@‰Á…Ŕtżëş˙˙˙˙…Étż@ë¸˙˙˙˙PRhaŹčü˙˙˙ÉÉöU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë2‹E‹@‰Á…ŔtżPëş˙˙˙˙…Étż@ ë¸˙˙˙˙PRhaŹčü˙˙˙ÉÐU‰ĺShŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë=‹E‹P‰Ó…ŇtżBHë ´&š˙˙˙˙…ŰtżB@ë¸˙˙˙˙PQhaŹčü˙˙˙‹]üÉÉöU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë0‹E‹@‰Á…Ŕt‹PLëş˙˙˙˙…Ét‹@Hë¸˙˙˙˙PRhaŹčü˙˙˙ÉÍvU‰ĺƒěEüPhfŹ˙u čü˙˙˙ƒÄ …Ŕt hmŹj˙uü‹E˙pčü˙˙˙ƒÄ Pčźů˙˙ë1ŔÉÉöU‰ĺƒěEüPhfŹ˙u čü˙˙˙ƒÄ …Ŕt&huŹj˙uü‹E˙pčü˙˙˙ƒÄ Pčxů˙˙덶1ŔÉĂU‰ĺƒěEüPhfŹ˙u čü˙˙˙ƒÄ …Ŕth~Ź‹E‹P‹Eü‰BPč7ů˙˙됍t&1ŔÉĂU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …Ŕth‡Ź˙uü‹E˙pčü˙˙˙ƒÄPčňř˙˙ë1ŔÉĂU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …ŔthŹ˙uü‹E˙pčü˙˙˙ƒÄPč˛ř˙˙ë1ŔÉĂU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …Ŕth•Ź˙uü‹E˙pčü˙˙˙ƒÄPčrř˙˙ë1ŔÉĂU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …ŔthœŹ˙uü‹E˙pčü˙˙˙ƒÄPč2ř˙˙ë1ŔÉĂU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …Ŕth¤Ź˙uü‹E˙pčü˙˙˙ƒÄPčň÷˙˙ë1ŔÉĂU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …ŔthŹŹ˙uü‹E˙pčü˙˙˙ƒÄPč˛÷˙˙ë1ŔÉĂU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …ŔthśŹ˙uü‹E˙pčü˙˙˙ƒÄPčr÷˙˙ë1ŔÉĂU‰ĺƒěEüPhżŹ˙u čü˙˙˙ƒÄ …ŔthĹŹ˙uü‹E˙pčü˙˙˙ƒÄPč2÷˙˙ë1ŔÉĂU‰ĺƒěEüPhKŹ˙u čü˙˙˙ƒÄ …ŔthĎŹ˙uü‹E˙pčü˙˙˙ƒÄPčňö˙˙ë1ŔÉĂU‰ĺƒěEüPEřPhÖŹ˙u čü˙˙˙ƒÄ…Ŕt!hߏ˙uü˙uř‹E˙pčü˙˙˙ƒÄ PčŤö˙˙ë1ŔÉÐU‰ĺƒěEüPEřPhÖŹ˙u čü˙˙˙ƒÄ…Ŕt"hĺŹ˙uü˙uř‹E˙pčü˙˙˙ƒÄ Pčcö˙˙ë1ŔÉĂU‰ĺƒěEüPEřPhÖŹ˙u čü˙˙˙ƒÄ…Ŕt!hîŹ˙uü˙uř‹E˙pčü˙˙˙ƒÄ Pčö˙˙ë1ŔÉÐU‰ĺƒěEüPEřPhôŹ˙u čü˙˙˙ƒÄ…Ŕt"h­˙uü˙uř‹E˙pčü˙˙˙ƒÄ PčÓő˙˙ë1ŔÉĂU‰ĺhčü˙˙˙‰Â…Ňt ‹E‰B‰Đë1ŔÉÍvU‰ĺS‹]‹C;t Pčü˙˙˙ƒÄSčü˙˙˙‹]üÉÉöU‰ĺƒěWVS‹}‹] 1öÇEěÇEř…Űt{u Sčü˙˙˙ƒÄë ¸ë‰ö1Ŕƒřt/ ƒřt鍃řt?ƒřtVé~EüPh­Sčü˙˙˙ƒÄ ëEřPEüPh­Sčü˙˙˙ƒÄ…ŔuW1Ŕ鱍EüPEôPEđPh/­Sčü˙˙˙ƒÄëEřPEüPEôPEđPhC­Sčü˙˙˙ƒÄ…Ŕtťžë t&h`­ëEěP˙uüčéô˙˙ƒÄ…Ŕuh€­˙5čü˙˙˙넍t&ƒţu˙uô˙uđ˙wčü˙˙˙ƒÄ ƒř˙t‹Eě EřP˙wčü˙˙˙ƒÄh§­Pč8ô˙˙eŕ[^_ÉĂU‰ĺƒěWVS‹] ÇEřÇEě1ö1˙…Űt{u Sčü˙˙˙ƒÄë ¸ëv1Ŕƒřt< ƒřt韃řtLƒřtg鐍EüPh­­Sčü˙˙˙ƒÄ …Ŕ…‹1ŔéEřPEüPhł­Sčü˙˙˙ƒÄ…ŔtßżëcEüPEôPEđPhÁ­Sčü˙˙˙ƒÄ…Ŕtşë'EřPEüPEôPEđPhÓ­Sčü˙˙˙ƒÄ…Ŕt–żžëhŽ˙5čü˙˙˙éu˙˙˙ƒ˙u!‹M‹Q…Ňt ‹J‰Měë ‰öÇEě‹Eř‰Bƒţu0˙uô˙uđ‹M˙qčü˙˙˙ƒÄ ƒř˙tj˙˙uü‹M˙qčü˙˙˙ƒÄ ‰Âëj˙˙uü‹M˙qčü˙˙˙‰ÂƒÄ ƒ˙u ‹M‹A‹Mě‰Hh!ŽRčň˙˙eŕ[^_ÉÐU‰ĺƒěWVS‹] ÇEôÇEč1ö1˙…Űt"{u Sčü˙˙˙ƒÄë¸ë ´&1Ŕƒřt@ ƒřt鳃řtXƒřtw餍EüPEřPh(ŽSčü˙˙˙ƒÄ…Ŕ… 1Ŕé+EôPEüPEřPh3ŽSčü˙˙˙ƒÄ…ŔtŰżëtt&EüPEřPEđPEěPhDŽSčü˙˙˙ƒÄ…ŔtŽë+EôPEüPEřPEđPEěPhUŽSčü˙˙˙ƒÄ…Ŕt†żžëh€Ž˙5čü˙˙˙ée˙˙˙t&ƒ˙u‹M‹Q…Ňt‹J‰MčëÇEč‹Eô‰Bƒţu7˙uđ˙uě‹M˙qčü˙˙˙ƒÄ ƒř˙t˙uü˙uř‹M˙qčü˙˙˙ƒÄ ‰Â덶˙uü˙uř‹M˙qčü˙˙˙‰ÂƒÄ ƒ˙u ‹M‹A‹Mč‰Hh˘ŽRčŢđ˙˙eÜ[^_ÉÉöU‰ĺƒě S‹] ÇEř…Űt{u Sčü˙˙˙ƒÄë ¸ët&1Ŕƒřt ƒřtë6‰öEüPh­Sčü˙˙˙ƒÄ …Ŕu*ëiEřPEüPh­Sčü˙˙˙ƒÄ…ŔuëMhŔŽë;t&EôP˙uüč đ˙˙ƒÄ…Ŕthߎ˙uô‹E˙pčü˙˙˙ƒÄPč!đ˙˙ëh€­˙5čü˙˙˙1Ŕ‹]đÉĂU‰ĺƒě S‹] ÇEř…Űt{u Sčü˙˙˙ƒÄë ¸ë1Ŕƒřtƒřtë:EüPh­Sčü˙˙˙ƒÄ …Ŕu+ër‰öEřPEüPh­Sčü˙˙˙ƒÄ…Ŕu ëTt&hŻë>EôP˙uüčŮď˙˙ƒÄ…Ŕt&‹Eô EřP‹E˙pčü˙˙˙h"ŻjčXď˙˙덶h€­˙5čü˙˙˙1Ŕ‹]đÉÐU‰ĺƒě ÇEüÇEřÇEôÇEđÇEěÇEčÇEäÇEŕEüPEřPEôPEđPEěPEčPEäPEŕPh@Ż˙u čü˙˙˙ƒÄ(…Ŕt6˙uü˙uř˙uô˙uđ˙uě˙uč˙uä˙uŕ‹E˙pčü˙˙˙¸˙덶1ŔÉĂU‰ĺƒěS‹] ÇEřÇEühŹSčü˙˙˙ƒÄ…Ŕu#čü˙˙˙EüPEřPhbŻSčü˙˙˙ƒÄ…Ŕu1Ŕë(jjjj‹EüPP‹EřPP‹E˙pčü˙˙˙¸˙‹]ôÉÉöU‰ĺƒěVS‹u‹] …Űt{u Sčü˙˙˙ƒÄë ¸ë v1Ŕ…Ŕt@ƒřuHEüPEřPhÖŹSčü˙˙˙ƒÄ…Ŕu 1ŔëI´&˙uü˙uř˙včü˙˙˙ƒÄ ƒř˙t!˙včü˙˙˙ƒÄëh€Ż˙5čü˙˙˙1Ŕë h ŻPční˙˙eđ[^ÉÍvU‰ĺƒěS‹] ÇEđÇEô…Űt{uSčü˙˙˙ƒÄë t&¸ë1Ŕƒřtƒřtë@EüPEřPhŤŻSčü˙˙˙ƒÄ…Ŕu3ëhEüPEřPEôPEđPhŔŻSčü˙˙˙ƒÄ…ŔuëDh°˙5ë2˙uü˙uř˙uô˙uđ‹E˙pčü˙˙˙ƒÄ…ŔtPčŢö˙˙ë˙5ˆŃ˙5üÜčü˙˙˙1Ŕ‹]ěÉĂU‰ĺƒě S‹] ÇEř…Űt"{uSčü˙˙˙ƒÄ덴&¸ë1Ŕƒřtƒřtë;EüPh­Sčü˙˙˙ƒÄ 덴&EřPEüPh­Sčü˙˙˙ƒÄ…Ŕu 1Ŕëm‰öh@°ëEôP˙uüčYě˙˙ƒÄ…Ŕuh€°˙5čü˙˙˙1Ŕë=‰ö‹E‹PöB uh˘°‹Eô EřPRčü˙˙˙ëh˘°‹Eô EřPRčü˙˙˙ƒÄPčĽë˙˙‹]đÉĂU‰ĺhŹ˙u čü˙˙˙ƒÄ…Ŕt‹E‹@˙pčü˙˙˙ë1ŔÉÐU‰ĺƒěVS‹u‹] …Űt"{u Sčü˙˙˙ƒÄë¸ë ´&1Ŕ…Ŕt@ƒřuHEüPEřPhÖŹSčü˙˙˙ƒÄ…Ŕu 1ŔëD´&˙uü˙uř˙včü˙˙˙ƒÄ ƒř˙t!˙včü˙˙˙ƒÄëhŔ°˙5čü˙˙˙1ŔëPčü˙˙˙eđ[^ÉĂU‰ĺƒěVS‹u‹] …Űt!{uSčü˙˙˙ƒÄ덶¸ë1Ŕ…Ŕt9ƒřuAEüPEřPhÖŹSčü˙˙˙ƒÄ…Ŕu1Ŕë[˙uü˙uř˙včü˙˙˙ƒÄ ƒř˙t!˙včü˙˙˙ƒÄëhŔ°˙5čü˙˙˙1Ŕë$=˙vPčü˙˙˙Pčü˙˙˙ët&Phŕ°čü˙˙˙eđ[^ÉÉöU‰ĺě VS‹u‹] …Űt{uSčü˙˙˙ƒÄë v¸ë1Ŕƒřt)…Ŕté÷´&ƒřt;ƒřtzéáj˙鶍…üű˙˙Phâ°Sčü˙˙˙ƒÄ …Ŕ„Ě鎍´&…řű˙˙P…ôű˙˙PhÖŹSčü˙˙˙ƒÄ…Ŕ„œ˙ľřű˙˙˙ľôű˙˙˙včü˙˙˙ƒÄ ƒř˙taj˙ëI…üű˙˙P…řű˙˙P…ôű˙˙Phć°Sčü˙˙˙ƒÄ…ŔtU˙ľřű˙˙˙ľôű˙˙˙včü˙˙˙ƒÄ ƒř˙t˙ľüű˙˙ü˙˙S˙včü˙˙˙ƒÄ ë#ü˙˙덴&hą˙5čü˙˙˙1Ŕëƒř˙uƅü˙˙Sčü˙˙˙Ľěű˙˙[^ÉĂU‰ĺƒěWVS‹}‹] 1öÇEô…Űt{u Sčü˙˙˙ƒÄë ¸ë1Ŕƒřt:ƒřtéōśƒřtLƒřt~鰐EüPEřPh!ąSčü˙˙˙ƒÄëEôPEüPEřPh2ąSčü˙˙˙ƒÄ…Ŕ…|1ŔéʍEüPEřPEđPEěPhIąSčü˙˙˙ƒÄ…Ŕt×˙uđ˙uě˙wčü˙˙˙‰ĆƒÄ ë>EôPEüPEřPEđPEěPh_ąSčü˙˙˙ƒÄ…Ŕtœ˙uđ˙uě˙wčü˙˙˙ƒÄ h€ąëƒţ˙tEEčP˙uřčŐç˙˙ƒÄ…Ŕuh€­˙5čü˙˙˙éW˙˙˙h ą˙uü‹Eč EôP˙wčü˙˙˙ƒÄ PëhîŹVč5ç˙˙eÜ[^_ÉÐU‰ĺƒěWVS‹}‹] 1öÇEěÇEř…Űt {uSčü˙˙˙ƒÄ됍t&¸ë1Ŕƒřt6ƒřt閍śƒřt@ƒřtW遐EüPh­Sčü˙˙˙ƒÄ ëEřPEüPh­Sčü˙˙˙ƒÄ…ŔuY1Ŕ鳍EüPEôPEđPh/­Sčü˙˙˙ƒÄëEřPEüPEôPEđPhC­Sčü˙˙˙ƒÄ…Ŕtťžë śhŔąëEěP˙uüč‰ć˙˙ƒÄ…Ŕuh€­˙5čü˙˙˙낍t&ƒţu˙uô˙uđ˙wčü˙˙˙ƒÄ ƒř˙t‹Eě EřP˙wčü˙˙˙ƒÄhŕąPčŘĺ˙˙eŕ[^_ÉĂU‰ĺƒěVS‹u‹] …Űt{u Sčü˙˙˙ƒÄë ¸ë v1Ŕ…Ŕt@ƒřuHEüPEřPhÖŹSčü˙˙˙ƒÄ…Ŕu 1ŔëD´&˙uü˙uř˙včü˙˙˙ƒÄ ƒř˙t!˙včü˙˙˙ƒÄëh˛˙5čü˙˙˙1ŔëPčü˙˙˙eđ[^ÉĂU‰ĺě VS‹u‹] …Űt{uSčü˙˙˙ƒÄë v¸ë1Ŕƒřt)…Ŕté÷´&ƒřt;ƒřtzéáj˙鶍…üű˙˙Phâ°Sčü˙˙˙ƒÄ …Ŕ„Ě鎍´&…řű˙˙P…ôű˙˙PhÖŹSčü˙˙˙ƒÄ…Ŕ„œ˙ľřű˙˙˙ľôű˙˙˙včü˙˙˙ƒÄ ƒř˙taj˙ëI…üű˙˙P…řű˙˙P…ôű˙˙Phć°Sčü˙˙˙ƒÄ…ŔtU˙ľřű˙˙˙ľôű˙˙˙včü˙˙˙ƒÄ ƒř˙t˙ľüű˙˙ü˙˙S˙včü˙˙˙ƒÄ ë#ü˙˙덴&h ˛˙5čü˙˙˙1Ŕëƒř˙uƅü˙˙Sčü˙˙˙Ľěű˙˙[^ÉĂU‰ĺƒěWVS‹] ÇEřÇEě1ö1˙…Űt{u Sčü˙˙˙ƒÄë ¸ëv1Ŕƒřt< ƒřt韃řtLƒřtg鐍EüPh­­Sčü˙˙˙ƒÄ …Ŕ…‹1ŔéEřPEüPhł­Sčü˙˙˙ƒÄ…ŔtßżëcEüPEôPEđPh@˛Sčü˙˙˙ƒÄ…Ŕtşë'EřPEüPEôPEđPhN˛Sčü˙˙˙ƒÄ…Ŕt–żžëh€˛˙5čü˙˙˙éu˙˙˙ƒ˙u!‹M‹Q…Ňt ‹J‰Měë ‰öÇEě‹Eř‰Bƒţu0˙uô˙uđ‹M˙qčü˙˙˙ƒÄ ƒř˙tj˙˙uü‹M˙qčü˙˙˙ƒÄ ‰Âëj˙˙uü‹M˙qčü˙˙˙‰ÂƒÄ ƒ˙u ‹M‹A‹Mě‰HhĄ˛Rč-â˙˙eŕ[^_ÉÐU‰ĺƒěWVS‹] ÇEôÇEč1ö1˙…Űt"{u Sčü˙˙˙ƒÄë¸ë ´&1Ŕƒřt@ ƒřt鳃řtXƒřtw餍EüPEřPh(ŽSčü˙˙˙ƒÄ…Ŕ… 1Ŕé+EôPEüPEřPh3ŽSčü˙˙˙ƒÄ…ŔtŰżëtt&EüPEřPEđPEěPhDŽSčü˙˙˙ƒÄ…ŔtŽë+EôPEüPEřPEđPEěPhUŽSčü˙˙˙ƒÄ…Ŕt†żžëhŔ˛˙5čü˙˙˙ée˙˙˙t&ƒ˙u‹M‹Q…Ňt‹J‰MčëÇEč‹Eô‰Bƒţu7˙uđ˙uě‹M˙qčü˙˙˙ƒÄ ƒř˙t˙uü˙uř‹M˙qčü˙˙˙ƒÄ ‰Â덶˙uü˙uř‹M˙qčü˙˙˙‰ÂƒÄ ƒ˙u ‹M‹A‹Mč‰Hhâ˛Rčnŕ˙˙eÜ[^_ÉÉöU‰ĺƒěEüPhę˛˙u čü˙˙˙ƒÄ …Ŕu1ŔëN‰ö˙uü‹E˙pčü˙˙˙ƒÄƒř˙uhł˙5čü˙˙˙1Ŕë"ś…Ŕt ¸˙ë ¸˙ÉÉöU‰ĺƒěVS‹u‹] ‹Fö@ „Œ…Űt!{u Sčü˙˙˙ƒÄë¸ëś1ŔƒřuNEüPEřPEôPEđPEěPEčPh@łSčü˙˙˙ƒÄ …Ŕt`hył˙uü˙uř˙uô˙uđ˙uě˙uč˙včü˙˙˙ƒÄë4h ł˙5üÜčü˙˙˙ë*hŹSčü˙˙˙ƒÄ…ŔthÖł˙včü˙˙˙ƒÄPč!ß˙˙ë1Ŕeŕ[^ÉÉöU‰ĺƒěEüPhăł˙u čü˙˙˙ƒÄ …ŔtF‹Eüxu*h´Pčü˙˙˙ƒÄP‹E˙pčü˙˙˙ƒÄPčÇŢ˙˙됍t&h´˙5čü˙˙˙1ŔÉĂU‰ĺƒěEüPEřPh&´˙u čü˙˙˙ƒÄ…Ŕt!h3´˙uü˙uř‹E˙pčü˙˙˙ƒÄ PčkŢ˙˙ë1ŔÉÐU‰ĺƒěVS‹u‹] ‹Fö@ „‹…Űt{u Sčü˙˙˙ƒÄë ¸ë1ŔƒřuREüPEřPEôPEđPEěPEčPh@łSčü˙˙˙ƒÄ …Ŕthh<´˙uü˙uř˙uô˙uđ˙uě˙uč˙včü˙˙˙ƒÄë8t&h`´˙5üÜčü˙˙˙ë.hŹSčü˙˙˙ƒÄ…Ŕth“´˙včü˙˙˙ƒÄPč–Ý˙˙ët&1Ŕeŕ[^ÉÍvU‰ĺƒěEüPEřPhœ´˙u čü˙˙˙ƒÄ…Ŕt"h­´˙uü˙uř‹E˙pčü˙˙˙ƒÄ PčCÝ˙˙ë1ŔÉĂU‰ĺƒěEüPEřPEôPEđPhŔŻ˙u čü˙˙˙ƒÄ…ŔtT‹E‹@ö@ t˙uü˙uř˙uô˙uđPčü˙˙˙ë‰ö˙uü˙uř˙uô˙uđPčü˙˙˙ƒÄ…ŔtPčç˙˙ë˙5ˆŃ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒěVS‹u‹] …Űt{u Sčü˙˙˙ƒÄë ‰ö¸ë1Ŕ…Ŕtƒřtë=h¸´jë!vEüPhż´Sčü˙˙˙ƒÄ …Ŕt+h¸´˙uü˙včü˙˙˙ƒÄPčAÜ˙˙ëhŕ´˙5čü˙˙˙1Ŕeô[^ÉÉöU‰ĺƒě VS‹u‹] …Űt"{u Sčü˙˙˙ƒÄë¸ë ´&1Ŕƒřt ƒřt'ëd‰öEüPEřPhľSčü˙˙˙ƒÄ…ŔtXhľjë&EôPEüPEřPhľSčü˙˙˙ƒÄ…Ŕt1hľ˙uô˙uü˙uř˙včü˙˙˙ƒÄPč€Ű˙˙ëh@ľ˙5čü˙˙˙1Ŕeě[^ÉÐU‰ĺƒěWVS‹}‹] 1öÇEô…Űt{uSčü˙˙˙ƒÄë t&¸ë1Ŕƒřt:ƒřtéōśƒřtLƒřt~鰐EüPEřPh!ąSčü˙˙˙ƒÄëEôPEüPEřPh2ąSčü˙˙˙ƒÄ…Ŕ…|1ŔéʍEüPEřPEđPEěPhIąSčü˙˙˙ƒÄ…Ŕt×˙uđ˙uě˙wčü˙˙˙‰ĆƒÄ ë>EôPEüPEřPEđPEěPh_ąSčü˙˙˙ƒÄ…Ŕtœ˙uđ˙uě˙wčü˙˙˙ƒÄ h€ľëƒţ˙tEEčP˙uřč•Ú˙˙ƒÄ…Ŕuh€­˙5čü˙˙˙éW˙˙˙h ľ˙uü‹Eč EôP˙wčü˙˙˙ƒÄ PëhîŹVčőŮ˙˙eÜ[^_ÉÐU‰ĺ˙u ˙uh”Ńčü˙˙˙ÉÍvU‰ĺƒ=ŒŃu(hŹ˙u čü˙˙˙ƒÄ…Ŕt$h'ˇčü˙˙˙Pč¤Ů˙˙ë‰öh ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃu&hŹ˙u čü˙˙˙ƒÄ…Ŕt"h,ˇčü˙˙˙Pč\Ů˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒ=ŒŃu(hŹ˙u čü˙˙˙ƒÄ…Ŕt$h:ˇčü˙˙˙PčŮ˙˙ë‰öh ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃu&hŹ˙u čü˙˙˙ƒÄ…Ŕt"hIˇčü˙˙˙PčĚŘ˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒ=ŒŃu(hŹ˙u čü˙˙˙ƒÄ…Ŕt$hRˇčü˙˙˙Pč„Ř˙˙ë‰öh ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃu&hŹ˙u čü˙˙˙ƒÄ…Ŕt"hYˇčü˙˙˙Pč<Ř˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒ=ŒŃu(hŹ˙u čü˙˙˙ƒÄ…Ŕt$h_ˇčü˙˙˙Pčô×˙˙ë‰öh ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃu&hŹ˙u čü˙˙˙ƒÄ…Ŕt"hhˇčü˙˙˙PčŹ×˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒ=ŒŃu(hŹ˙u čü˙˙˙ƒÄ…Ŕt$hoˇčü˙˙˙Pčd×˙˙ë‰öh ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃu&hŹ˙u čü˙˙˙ƒÄ…Ŕt"htˇčü˙˙˙Pč×˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒ=ŒŃu(hŹ˙u čü˙˙˙ƒÄ…Ŕt$hzˇčü˙˙˙PčÔÖ˙˙ë‰öh ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃu&hŹ˙u čü˙˙˙ƒÄ…Ŕt"hЎčü˙˙˙PčŒÖ˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒ=ŒŃu(hŹ˙u čü˙˙˙ƒÄ…Ŕt$h›ˇčü˙˙˙PčDÖ˙˙ë‰öh ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃu&hŹ˙u čü˙˙˙ƒÄ…Ŕt"hَčü˙˙˙PčüŐ˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒěƒ=ŒŃu=EüPEřPhÖŹ˙u čü˙˙˙ƒÄ…Ŕt1˙hŤˇ˙uü˙uřčü˙˙˙ƒÄPčšŐ˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒěS‹] ÇEüƒ=ŒŃth ˇ˙5üÜ酅Űt{u Sčü˙˙˙ƒÄë ‰ö¸ë1Ŕ…ŔtƒřtëLhśˇčü˙˙˙ë2EüPhKŹSčü˙˙˙ƒÄ …Ŕt:ƒ}üt hśˇčü˙˙˙ë hśˇčü˙˙˙PččÔ˙˙덶hŔˇ˙5čü˙˙˙1Ŕ‹]řÉÐU‰ĺƒěS‹] ÇEüƒ=ŒŃth ˇ˙5üÜ鉅Űt!{uSčü˙˙˙ƒÄ덶¸ë1Ŕ…ŔtƒřtëLhŕˇčü˙˙˙ë2EüPhKŹSčü˙˙˙ƒÄ …Ŕt:ƒ}üt hŕˇčü˙˙˙ë hŕˇčü˙˙˙Pč(Ô˙˙덶hĺˇ˙5čü˙˙˙1Ŕ‹]řÉÐU‰ĺƒěS‹] ÇEüƒ=ŒŃth ˇ˙5üÜ鉅Űt!{uSčü˙˙˙ƒÄ덶¸ë1Ŕ…ŔtƒřtëLh¸čü˙˙˙ë2EüPhKŹSčü˙˙˙ƒÄ …Ŕt:ƒ}üt h¸čü˙˙˙ë h¸čü˙˙˙PčhÓ˙˙덶h¸˙5čü˙˙˙1Ŕ‹]řÉÐU‰ĺƒěS‹] ÇEüƒ=ŒŃth ˇ˙5üÜ鉅Űt!{uSčü˙˙˙ƒÄ덶¸ë1Ŕ…ŔtƒřtëLh"¸čü˙˙˙ë2EüPhKŹSčü˙˙˙ƒÄ …Ŕt:ƒ}üt h"¸čü˙˙˙ë h"¸čü˙˙˙Pč¨Ň˙˙덶h&¸˙5čü˙˙˙1Ŕ‹]řÉÐU‰ĺƒ=ŒŃu!hŹ˙u čü˙˙˙ƒÄ…Ŕtčü˙˙˙Pčü˙˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÍvU‰ĺƒ=ŒŃu(hŹ˙u čü˙˙˙ƒÄ…Ŕt$čü˙˙˙Pčü˙˙˙덴&h ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃu!hŹ˙u čü˙˙˙ƒÄ…Ŕtčü˙˙˙Pčü˙˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÍvU‰ĺƒ=ŒŃu!hŹ˙u čü˙˙˙ƒÄ…Ŕtčü˙˙˙Pčü˙˙˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÍvU‰ĺƒ=ŒŃth ˇ˙5üÜčü˙˙˙1Ŕë?t&hŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë#čü˙˙˙…Ŕt¸˙ë ‰ö¸˙ÉÍvU‰ĺƒ=ŒŃth ˇ˙5üÜčü˙˙˙1Ŕë;hŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë#čü˙˙˙…Ŕt¸˙ë ‰ö¸˙ÉÍvU‰ĺƒ=ŒŃth ˇ˙5üÜčü˙˙˙1Ŕë;hŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë#čü˙˙˙…Ŕt¸˙ë ‰ö¸˙ÉÍvU‰ĺƒ=ŒŃth ˇ˙5üÜčü˙˙˙1Ŕë;hŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë#čü˙˙˙…Ŕt¸˙ë ‰ö¸˙ÉÍvU‰ĺƒ=ŒŃth ˇ˙5üÜčü˙˙˙1Ŕë;hŹ˙u čü˙˙˙ƒÄ…Ŕu1Ŕë#čü˙˙˙…Ŕt¸˙ë ‰ö¸˙ÉÍvU‰ĺƒ=ŒŃu&hŹ˙u čü˙˙˙ƒÄ…Ŕt"čü˙˙˙¸˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒ=ŒŃu,hŹ˙u čü˙˙˙ƒÄ…Ŕt(čü˙˙˙¸˙덶h ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃu&hŹ˙u čü˙˙˙ƒÄ…Ŕt"čü˙˙˙¸˙ëh ˇ˙5üÜčü˙˙˙1ŔÉÉöU‰ĺƒěS‹] ƒ=ŒŃth ˇë}ƒ=ŃthC¸ëm…Űt{uSčü˙˙˙ƒÄƒřth€¸˙5ëK‰öEţPh˘¸Sčü˙˙˙ƒÄ …Ŕu 1ŔëQśEüPEúPEřPżEţPčü˙˙˙ƒÄƒř˙uhŔ¸˙5üÜčü˙˙˙1ŔëżEüPżEúPżEřPh޸čü˙˙˙‹]ôÉĂU‰ĺƒěS‹] ƒ=ŒŃth ˇ˙5üÜčü˙˙˙ëaƒ=ŃthC¸ëă…Űt{u Sčü˙˙˙ƒÄƒřthš˙5čü˙˙˙ë$EüPhšSčü˙˙˙ƒÄ …Ŕt‹EüÁŕPčü˙˙˙ë1Ŕ‹]řÉÍvU‰ĺƒěS‹] ƒ=ŒŃt h ˇ˙5üÜë&…Űt,{uSčü˙˙˙ƒÄƒřuh(š˙5čü˙˙˙1ŔëDEüPhEšSčü˙˙˙ƒÄ …Ŕu 1Ŕë)ś˙uüčü˙˙˙ƒÄƒř˙tPčü˙˙˙ë hKšPčÍĚ˙˙‹]řÉĂU‰ĺƒěS‹] ƒ=ŒŃth ˇ˙5üÜčü˙˙˙ëcv…Űt,{uSčü˙˙˙ƒÄƒřuh`š˙5čü˙˙˙ë3vEüPhšSčü˙˙˙ƒÄ …Ŕth†š˙uüčü˙˙˙ƒÄPčDĚ˙˙ë‰ö1Ŕ‹]řÉÐU‰ĺƒěƒ=ŒŃu)hŹ˙u čü˙˙˙ƒÄ…Ŕt%čü˙˙˙ˆE˙E˙Pčü˙˙˙ë‰öh ˇ˙5üÜčü˙˙˙1ŔÉĂU‰ĺƒ=ŒŃth ˇ˙5üÜčü˙˙˙1Ŕë\hŹ˙u čü˙˙˙ƒÄ…Ŕu1ŔëDt&ş˙˙˙˙ë(żAë'vĄ‰Áƒx uă…Ŕtżëş˙˙˙˙…Ŕuظ˙˙˙˙PRhaŹčü˙˙˙ÉÉöU‰ĺƒěƒ=ŒŃt h ˇë\śEüPhăł˙u čü˙˙˙ƒÄ …ŔtI‹Eüxt h´˙5ë+Pčü˙˙˙Pčü˙˙˙ƒÄ…Ŕt Pč:Ő˙˙ët&˙5ˆŃ˙5üÜčü˙˙˙1ŔÉÍvU‰ĺƒěS‹] ƒ=ŒŃt h ˇ˙5üÜëK…Űt{u Sčü˙˙˙ƒÄë ¸ë1ŔƒřuE˙Ph“šSčü˙˙˙ƒÄ …Ŕu1Ŕë0hœš˙5čü˙˙˙1Ŕët&hşšśE˙Pčü˙˙˙ƒÄPčXĘ˙˙‹]řÉÍvU‰ĺƒěƒ=ŒŃth ˇ˙5üÜčü˙˙˙1ŔëHEüPhÄš˙u čü˙˙˙ƒÄ …Ŕu1Ŕë,˙uüčü˙˙˙…Ŕt¸˙덴&¸˙ÉÍvU‰ĺƒěS‹] ƒ=ŒŃt h ˇ˙5üÜëoƒ=Ńt hC¸˙5üÜëY…Űt{u Sčü˙˙˙ƒÄë ‰ö¸ë1Ŕƒřu&EţPEüPEúPEřPhĆšSčü˙˙˙ƒÄ…Ŕu1Ŕë;hŕš˙5čü˙˙˙1Ŕë'hşżEţPżEüPżEúPżEřPčü˙˙˙ƒÄPč!É˙˙‹]ôÉĂU‰ĺƒěS‹] ƒ=ŒŃth ˇ˙5üÜčü˙˙˙醍t&ƒ=ŃthC¸ë܅Űt{uSčü˙˙˙ƒÄƒřth ş˙5čü˙˙˙ëEvEţPEüPEúPh?şSčü˙˙˙ƒÄ…Ŕt$hPşżEţPżEüPżEúPčü˙˙˙ƒÄ PčpČ˙˙ë1Ŕ‹]ôÉÍvU‰ĺVShŹ˙u čü˙˙˙ƒÄ…Ŕu 1Ŕ鼍t&ƒ=ŒŃu˙5čü˙˙˙˙5锐čü˙˙˙‰Ć…öu˙5ˆŃ˙5üÜčü˙˙˙1ŔëxÇŒŃ˙5čü˙˙˙‰ĂShZş˙5Ýčü˙˙˙˙ ƒÄƒ;u ‹CS‹@˙ЃÄ˙5čü˙˙˙‰ĂSh`ş˙5Ýčü˙˙˙˙ ƒÄƒ;u ‹CS‹@˙ЃÄVčźŃ˙˙eř[^ÉÐU‰ĺƒěS‹] ƒ=ŒŃt h ˇ˙5üÜëL…Űt{u Sčü˙˙˙ƒÄë ¸ë1ŔƒřuEüPheşSčü˙˙˙ƒÄ …Ŕu1Ŕë,hyş˙5čü˙˙˙1Ŕëh—ş˙uüjčü˙˙˙ƒÄPčóĆ˙˙‹]řÉÉöU‰ĺƒěƒ=ŒŃth ˇ˙5üÜčü˙˙˙1Ŕë6EüPhÄš˙u čü˙˙˙ƒÄ …Ŕu1Ŕë˙uüčü˙˙˙ƒÄ…Ŕu¸ŹPčü˙˙˙ÉÐU‰ĺƒěhŹ˙u čü˙˙˙ƒÄ…Ŕtčü˙˙˙ˆE˙E˙Pčü˙˙˙ëv1ŔÉĂU‰ĺƒěS‹] ƒ=ŒŃt h ˇ˙5üÜëO…Űt{uSčü˙˙˙ƒÄë t&¸ë1ŔƒřuEüPheşSčü˙˙˙ƒÄ …Ŕu1Ŕë4hĄş˙5čü˙˙˙1Ŕë t&hşş˙uü˙5čü˙˙˙ƒÄPčÄĹ˙˙‹]řÉÍvU‰ĺƒěƒ=ŒŃt h ˇëBśEüPEřPhżş˙u čü˙˙˙ƒÄ…Ŕt+˙uü˙uřčü˙˙˙ƒÄ…ŔtPč Ď˙˙ë˙5ˆŃ˙5üÜčü˙˙˙1ŔÉÐU‰ĺƒěS‹] ƒ=ŒŃth ˇéž´&…Űt{u Sčü˙˙˙ƒÄë ¸ë1Ŕƒřt ƒřt4ëj‰öEüPEřPhżşSčü˙˙˙ƒÄ…Ŕtx˙uü˙uřčü˙˙˙ƒÄëKśEôPEđPEüPEřPhŔŻSčü˙˙˙ƒÄ…Ŕt@˙uô˙uđ˙uü˙uřčü˙˙˙ƒÄë hŕş˙5ë…ŔtPčľÎ˙˙ë˙5ˆŃ˙5üÜčü˙˙˙1Ŕ‹]ěÉÍvU‰ĺƒěS‹] ƒ=ŒŃth ˇéž´&ƒ=Ńt hC¸é„…Űt {uSčü˙˙˙ƒÄ됍t&¸ë1ŔƒřuEţPhťSčü˙˙˙ƒÄ …ŔuëLh ť˙5ë:EüPEúPżEţPčü˙˙˙ƒÄ …ŔtżEüPżEúPhaŹčü˙˙˙ëh`ť˙5üÜčü˙˙˙1Ŕ‹]ôÉÍvU‰ĺƒěS‹] ƒ=ŒŃth ˇ˙5üÜëgt&ƒ=Ńt hC¸˙5üÜëM…Űt{u Sčü˙˙˙ƒÄë ‰ö¸ë1ŔƒřuEüPhťSčü˙˙˙ƒÄ …Ŕu1Ŕë"h ť˙5čü˙˙˙1Ŕët&śEýPčü˙˙˙‹]řÉÐU‰ĺƒěEüPh­­˙u čü˙˙˙ƒÄ …ŔthŔť˙uüčü˙˙˙ƒÄPčźÂ˙˙ë1ŔÉÉöU‰ĺƒěS‹] ÇEüƒ=ŒŃt h ˇ˙5üÜëo…Űt {uSčü˙˙˙ƒÄ됍t&¸ë1Ŕ…Ŕt!ƒřu5EüPhKŹSčü˙˙˙ƒÄ …Ŕt/ƒ}ütčü˙˙˙ëčü˙˙˙¸˙ëh¸˙5čü˙˙˙1Ŕ‹]řÉÉöU‰ĺƒěS‹] ƒ=ŒŃt h ˇ˙5üÜë&…Űt{uSčü˙˙˙ƒÄƒřthĹť˙5čü˙˙˙1ŔëiEüPEřPhâťSčü˙˙˙ƒÄ…Ŕu1ŔëJ‰öĄÇ@ ë/‰öƒ}ř˙u ƒ}ü˙tät&ĄÇ@ ˙uü˙uř˙5čü˙˙˙¸˙‹]ôÉÍvU‰ĺSƒ=ŒŃt h ˇéŁhŹ˙u čü˙˙˙ƒÄ…Ŕ„–čü˙˙˙ƒř˙t|ǐŃ˙5čü˙˙˙‰ĂShěť˙5Ýčü˙˙˙˙ ƒÄƒ;u ‹CS‹@˙ЃÄ˙5čü˙˙˙‰ĂShóť˙5Ýčü˙˙˙˙ ƒÄƒ;u ‹CS‹@˙и˙ëh˙ť˙5üÜčü˙˙˙1Ŕ‹]üÉĂU‰ĺƒěƒ=ŒŃt h ˇ˙5üÜëKEüPh­˙u čü˙˙˙ƒÄ …Ŕu1ŔëT‹Eü‹PúuPčü˙˙˙ë/śúth ź˙5čü˙˙˙1Ŕët&Pčü˙˙˙žƒÄPčü˙˙˙Pčü˙˙˙ÉÉöU‰ĺƒěƒ=ŒŃt h ˇ˙5üÜëKEüPh­˙u čü˙˙˙ƒÄ …Ŕu1Ŕë\‹Eü‹PúuPčü˙˙˙ë/śúth ź˙5čü˙˙˙1Ŕë$t&Pčü˙˙˙žƒÄh@źPčü˙˙˙ƒÄPč`ż˙˙ÉÉöU‰ĺƒěS‹] ƒ=ŒŃt h ˇ˙5üÜëO…Űt{uSčü˙˙˙ƒÄë t&¸ë1ŔƒřuEüPheşSčü˙˙˙ƒÄ …Ŕu1Ŕë+hHź˙5čü˙˙˙1Ŕët&˙uüčü˙˙˙¸˙‹]řÉĂU‰ĺƒěWVShďjjhŒÖhy˝čü˙˙˙‰ÂRčü˙˙˙‰EüŁÝh€˝čü˙˙˙‰Â‰üÜRh˝‹EüPčü˙˙˙ƒÄ(˙5čü˙˙˙‰ĆVh“˝‹EüPčü˙˙˙Vh›˝‹EüPčü˙˙˙˙ƒÄƒ>u ‹FV‹@˙ЃÄ˙5°čü˙˙˙Ph§˝˙5Ýčü˙˙˙˙5´čü˙˙˙Ph´˝˙5Ýčü˙˙˙ƒÄ ˙5Źčü˙˙˙PhÁ˝˙5Ýčü˙˙˙˙5¨čü˙˙˙Phν˙5Ýčü˙˙˙ƒÄ ˙5Đčü˙˙˙PhŰ˝˙5Ýčü˙˙˙˙5Ôčü˙˙˙Phä˝˙5Ýčü˙˙˙ƒÄ ˙5Řčü˙˙˙Phí˝˙5Ýčü˙˙˙˙5Üčü˙˙˙Phö˝˙5Ýčü˙˙˙ƒÄ ˙5Äčü˙˙˙Ph˙˝˙5Ýčü˙˙˙˙5ŕčü˙˙˙Ph ž˙5Ýčü˙˙˙ƒÄ ˙5¸čü˙˙˙Phž˙5Ýčü˙˙˙˙5źčü˙˙˙Phž˙5Ýčü˙˙˙ƒÄ ˙5Ěčü˙˙˙Ph#ž˙5Ýčü˙˙˙˙5€čü˙˙˙Ph*ž˙5Ýčü˙˙˙ƒÄ ˙5„čü˙˙˙Ph6ž˙5Ýčü˙˙˙˙5˜čü˙˙˙PhBž˙5Ýčü˙˙˙ƒÄ ˙5œčü˙˙˙PhMž˙5Ýčü˙˙˙˙5řčü˙˙˙PhYž˙5Ýčü˙˙˙ƒÄ ˙5°čü˙˙˙Phdž˙5Ýčü˙˙˙˙5Źčü˙˙˙Phož˙5Ýčü˙˙˙ƒÄ ˙5¸čü˙˙˙Phzž˙5Ýčü˙˙˙˙5´čü˙˙˙Ph…ž˙5Ýčü˙˙˙ƒÄ ˙5 čü˙˙˙Phž˙5Ýčü˙˙˙˙5¤čü˙˙˙Phšž˙5Ýčü˙˙˙ƒÄ ˙5Ŕčü˙˙˙PhŚž˙5Ýčü˙˙˙˙5Ŕčü˙˙˙Ph°ž˙5Ýčü˙˙˙ƒÄ ˙5äčü˙˙˙Phˇž˙5Ýčü˙˙˙˙5ččü˙˙˙Phž˙5Ýčü˙˙˙ƒÄ ˙5ěčü˙˙˙PhÍž˙5Ýčü˙˙˙˙5đčü˙˙˙PhÔž˙5Ýčü˙˙˙ƒÄ ˙5ôčü˙˙˙Phßž˙5Ýčü˙˙˙˙5°čü˙˙˙Phěž˙5Ýčü˙˙˙ƒÄ ˙5´čü˙˙˙Phőž˙5Ýčü˙˙˙˙5Źčü˙˙˙Phţž˙5Ýčü˙˙˙ƒÄ ˙5¨čü˙˙˙Phż˙5Ýčü˙˙˙˙5Ôčü˙˙˙Phż˙5Ýčü˙˙˙ƒÄ ˙5Đčü˙˙˙Phż˙5Ýčü˙˙˙˙5Řčü˙˙˙Ph"ż˙5Ýčü˙˙˙ƒÄ ˙5Üčü˙˙˙Ph+ż˙5Ýčü˙˙˙˙5Äčü˙˙˙Ph4ż˙5Ýčü˙˙˙ƒÄ ˙5ŕčü˙˙˙Ph=ż˙5Ýčü˙˙˙˙5¸čü˙˙˙PhFż˙5Ýčü˙˙˙ƒÄ h˙˙˙čü˙˙˙PhOż˙5Ýčü˙˙˙jčü˙˙˙Ph\ż˙5Ýčü˙˙˙ƒÄ hčü˙˙˙Pheż˙5Ýčü˙˙˙hčü˙˙˙Phpż˙5Ýčü˙˙˙ƒÄ hčü˙˙˙Ph|ż˙5Ýčü˙˙˙hčü˙˙˙Ph†ż˙5Ýčü˙˙˙ƒÄ hčü˙˙˙PhŽż˙5Ýčü˙˙˙h čü˙˙˙Ph”ż˙5Ýčü˙˙˙ƒÄ h@čü˙˙˙Ph›ż˙5Ýčü˙˙˙h€čü˙˙˙Ph¨ż˙5Ýčü˙˙˙ƒÄ hčü˙˙˙Ph°ż˙5Ýčü˙˙˙hčü˙˙˙Phşż˙5Ýčü˙˙˙ƒÄ hčü˙˙˙PhÇż˙5Ýčü˙˙˙hčü˙˙˙PhÎż˙5Ýčü˙˙˙ƒÄ hčü˙˙˙PhÔż˙5Ýčü˙˙˙h čü˙˙˙PhÜż˙5Ýčü˙˙˙ƒÄ h@čü˙˙˙Phâż˙5Ýčü˙˙˙h˙čü˙˙˙Phíż˙5Ýčü˙˙˙ƒÄ h˙čü˙˙˙Phřż˙5Ýčü˙˙˙h˙˙˙čü˙˙˙PhŔ˙5Ýčü˙˙˙ƒÄ jčü˙˙˙PhŔ˙5Ýčü˙˙˙hčü˙˙˙PhŔ˙5Ýčü˙˙˙ƒÄ hčü˙˙˙Ph$Ŕ˙5Ýčü˙˙˙hčü˙˙˙Ph1Ŕ˙5Ýčü˙˙˙ƒÄ hčü˙˙˙Ph<Ŕ˙5Ýčü˙˙˙hčü˙˙˙PhEŔ˙5Ýčü˙˙˙ƒÄ h čü˙˙˙PhLŔ˙5Ýčü˙˙˙h@čü˙˙˙PhTŔ˙5Ýčü˙˙˙ƒÄ h€čü˙˙˙PhbŔ˙5Ýčü˙˙˙hčü˙˙˙PhkŔ˙5Ýčü˙˙˙ƒÄ hčü˙˙˙PhvŔ˙5Ýčü˙˙˙hčü˙˙˙Ph„Ŕ˙5Ýčü˙˙˙ƒÄ hčü˙˙˙PhŒŔ˙5Ýčü˙˙˙hčü˙˙˙Ph“Ŕ˙5Ýčü˙˙˙ƒÄ h čü˙˙˙PhœŔ˙5Ýčü˙˙˙h@čü˙˙˙PhŁŔ˙5Ýčü˙˙˙ƒÄ jčü˙˙˙PhŻŔ˙5Ýčü˙˙˙jčü˙˙˙PhťŔ˙5Ýčü˙˙˙ƒÄ jčü˙˙˙PhĹŔ˙5Ýčü˙˙˙jčü˙˙˙PhŃŔ˙5Ýčü˙˙˙ƒÄ jčü˙˙˙PhŢŔ˙5Ýčü˙˙˙jčü˙˙˙PhéŔ˙5Ýčü˙˙˙ƒÄ jčü˙˙˙Ph÷Ŕ˙5Ýčü˙˙˙jčü˙˙˙PhÁ˙5Ýčü˙˙˙ÇEřƒÄ ‹EřPčü˙˙˙‰ĂƒÄ…Ű„Ž‰ŢżÁš ü¨óŚt{jhÁSčü˙˙˙ƒÄ …Ŕu?‰ß1Ŕüš˙˙˙˙ňŽ÷ŃQčü˙˙˙‰Ç‰Ů‰ţƒÄ€;tŠˆĐŘ<vˆFA€9uíĆ됍t&‰ß‹EřPčü˙˙˙‰ÂRW‹EüPčü˙˙˙ƒÄ9ßt Wčü˙˙˙ƒÄ˙Eř}řţŽL˙˙˙hčü˙˙˙Ph!Á˙5Ýčü˙˙˙h˙čü˙˙˙Ph)Á˙5Ýčü˙˙˙ƒÄ čü˙˙˙…Ŕt h@Áčü˙˙˙eě[^_ÉАU‰ĺVSč[Ăć.ƒô˙˙˙püƒxü˙t ‹˙ЃĆüƒ>˙uôeř[^ÉÐU‰ĺSč[Ăł.‹ƒě‹“đ‹‰č'Ť˙˙‹]üÉАU‰ĺSč[Ă‡.čK˛˙˙‹]üÉĂ1.5b1curses function returned ERRcurses function returned NULL() returned ERRuntouchwintouchwinredrawwinwinsertlnwerasewdeletelni;True(1) or False(0)(ii)l;attrwattronwattroffwattrsetclearokidlokkeypadleaveoknodelaynotimeoutscrolloki;cntwinsdellnsyncok(ii);y,xmvwinmvderwinwmove(ii);lines,columnswresizeO;ch or int(Ol);ch or int,attr(iiO);y,x,ch or int(iiOl);y,x,ch or int, attraddch requires 1 or 4 argumentsargument 1 or 3 must be a ch or an intaddchs;str(sl);str,attr(iis);int,int,str(iisl);int,int,str,attraddstr requires 1 to 4 argumentsaddstr(si);str,n(sil);str,n,attr(iisi);y,x,str,n(iisil);y,x,str,n,attraddnstr requires 2 to 5 argumentsaddnstrbkgd requires 1 or 2 argumentsbkgdbkgdset requires 1 or 2 argumentsbkgdset|llllllll;ls,rs,ts,bs,tl,tr,bl,br(ll);vertint,horintdelch requires 0 or 2 arguments[mv]wdelch(ii);begin_y,begin_x(iiii);nlines,ncols,begin_y,begin_xderwin requires 2 or 4 argumentsechochar requires 1 or 2 argumentsargument 1 must be a ch or an intechochargetch requires 0 or 2 argumentsci;n(iii);y,x,ngetstr requires 0 to 2 arguments(Oi);ch or int,n(Oil);ch or int,n,attr(iiOi);y,x,ch o int,n(iiOil); y,x,ch or int,n,attrhline requires 2 or 5 argumentshlineinsch requires 1 or 4 argumentsinschinch requires 0 or 2 argumentsinstr requires 0 or 3 arguments(iis);y,x,str(iisl);y,x,str,attrinsstr requires 1 to 4 argumentsinsstrinsnstr requires 2 to 5 argumentsinsnstri;lineis_linetouched: line number outside of boundaries(iiiiii);pminrow,pmincol,sminrow,smincol,smaxrow,smaxcolpnoutrefreshnoutrefresh was called for a pad;requires 6 argumentswnoutrefreshO;fileobjargument must be a file objectputwin(ii);beg,numredrawlnprefreshrefresh was called for a pad; requires 6 argumentswrefresh(ii);top, bottomwsetscrregscrolli;linesscroll requires 0 or 1 arguments(ii);start,counttouchline(iii);start,count,valtouchline requires 2 or 3 argumentsvline requires 2 or 5 argumentsvlinesyncupsyncdownsubwinsubpadstandoutstandendsetscrregresizerefreshnoutrefreshmoveis_wintouchedis_linetouchedinstrinsertlninsdellninchimmedokidcokgetyxgetstrgetparyxgetmaxyxgetkeygetchgetbkgdgetbegyxerasederwindeletelndelchcursyncupclrtoeolclrtobotclearboxborderattr_setattrsetattr_offattroffattr_onattroncurses windowmust call initscr() firstbeepdef_prog_modedef_shell_modedoupdateendwinflashnocbreaknoechononlnorawreset_prog_modereset_shell_moderesettysavettyresizetermcbreakcbreak requires 0 or 1 argumentechoecho requires 0 or 1 argumentnlnl requires 0 or 1 argumentrawraw requires 0 or 1 argumentmust call start_color() firstcolor_content requires 1 argumenth;color(iii)Argument 1 was out of range. Check value of COLORS.COLOR_PAIR requires 1 argumenti;numbercurs_set requires 1 argumenti;intcurs_setdelay_output requires 1 argumenti;msdelay_outputb;tenthshalfdelay requires 1 argumenthalfdelayi(hhhh);color,r,g,binit_color requires 4 argumentsinit_colorinit_pair requires 3 arguments(hhh);pair, f, binit_pairLINESCOLSi;True(1), False(0)intrflush requires 1 argumentintrflushmeta requires 1 argumentmeta(ii);nlines,ncolsnewwin requires 2 or 4 argumentsh;pairpair_content requires 1 argumentArgument 1 was out of range. (1..COLOR_PAIRS-1)i;pairvaluePAIR_NUMBER requires 1 argumentputpcurs_set requires 3 argument(ii);y, xCOLORSCOLOR_PAIRSstart_color() returned ERRargument must be a ch or an intungetchuse_env requires 1 argumentuse_envunctrltermnametermattrsstart_colorsetsyxqiflushPAIR_NUMBERpair_contentnoqiflushnewwinnewpadlongnamekillcharkeynameisendwininitscrhas_keyhas_ilhas_ichas_colorsgetwingetsyxflushinpfiltererasecharCOLOR_PAIRcolor_contentcan_change_colorbaudratecursescurses.errorerrorversion__version__ACS_ULCORNERACS_LLCORNERACS_URCORNERACS_LRCORNERACS_LTEEACS_RTEEACS_BTEEACS_TTEEACS_HLINEACS_VLINEACS_PLUSACS_S1ACS_S9ACS_DIAMONDACS_CKBOARDACS_DEGREEACS_PLMINUSACS_BULLETACS_LARROWACS_RARROWACS_DARROWACS_UARROWACS_BOARDACS_LANTERNACS_BLOCKACS_S3ACS_LEQUALACS_GEQUALACS_PIACS_NEQUALACS_STERLINGACS_BSSBACS_SSBBACS_BBSSACS_SBBSACS_SBSSACS_SSSBACS_SSBSACS_BSSSACS_BSBSACS_SBSBACS_SSSSA_ATTRIBUTESA_NORMALA_STANDOUTA_UNDERLINEA_REVERSEA_BLINKA_DIMA_BOLDA_ALTCHARSETA_INVISA_PROTECTA_HORIZONTALA_LEFTA_LOWA_RIGHTA_TOPA_VERTICALA_CHARTEXTA_COLORWA_ATTRIBUTESWA_NORMALWA_STANDOUTWA_UNDERLINEWA_REVERSEWA_BLINKWA_DIMWA_BOLDWA_ALTCHARSETWA_INVISWA_PROTECTWA_HORIZONTALWA_LEFTWA_LOWWA_RIGHTWA_TOPWA_VERTICALCOLOR_BLACKCOLOR_REDCOLOR_GREENCOLOR_YELLOWCOLOR_BLUECOLOR_MAGENTACOLOR_CYANCOLOR_WHITEUNKNOWN KEYKEY_F(KEY_MINKEY_MAXcan't initialize module curses,ÚŔŤĆŤăŤ§­@i˘Ž,l!ސjřśČdđśČdčś eßś eלTeÎśTeߎěm"ݏnÇśˆoĂś4p˝śÄb‡Ź”e´śŒbŤśXbĄś$b›ś°p’śĚ`‹ś\q˘°0r…ś”`|śČctś snśLsgśôs^śdUśxdNś´tHśxc ą vŹÔeBśřb:ś8c5śđx౔w,śTg#ś\`Ⲝ|Ą˛{ś”yś\~śa•ŹfœŹTfűľdhߏÔgĺŹh¤Ź”fďľĐ~ŹŹÔf´Ź&Ź`3´€çľ\€ŕľŹh¸´‚śŹgÖľ<Íľ¸aÄľěa˝ľ„śľ„­ľ„aĎŹ”gŚľPaľœ‚ŹĚ_Źx_ ľ\ƒ˙ś iԄp˝8Œ'ˇě„_˝Lśˇ<‰Q˝ F˝ĐKš`‘,ˇ4…:ˇ|…†šř‘IˇÄ…ŕˇř‰Rˇ †<˝ˆ’5˝0YˇT†,˝x%˝Ô’˝T“˝° ˝Ž˝pŽýźp”şšŘ“şŕ”Pş¤•őź\–—ş@—ěźĐŽäźÔ—Űź0˜Ňźşşd˜Ëź™Äźl™¸¸Š_ˇœ†hˇä†oˇ,‡şźÄtˇt‡­ź\šĄź,›ŔťĐ›™ź œ"¸x‹zˇź‡ŠˇˆŤˇÜˆ’ź°œ†źp|ź|ŒsźÄŒlź<ž@źĚždźdŸ˙˙˙˙˙˙˙˙$ÜśVĆVÖVćVöVWW&W6WFWVWfWvW†W–WŚWśWĆWÖWćWöWXX&X6XFXVXfXvX†X–XŚXśXĆXÖXćXöXYY&Y6YFYVYfYvY†Y–YŚYśYĆYÖYćYöYZZ&Z6ZFZVZfZvZ†Z–ZŚZśZĆZÖZćZöZ[[&[6[F[V[f[v[†[–[Ś[ś[Ć[Ö[ć[ö[\\&\6\F\V\f\v\†\–\Ś\ś\Ć\Ö\ć\ö\]]&]6]F]V]f]v]†]–]Ś]ś]Ć]Ö]ć]ö]AQa pV  Ť”ČH ° 0Ú¨ČRH€:ü˙˙ođý˙˙oţ˙˙o(˙˙˙ođ˙˙o – ĘNdŔ^&dŔ^7<F€u€€Ă€ű€8€„€Đ€ö€ €F€k€…€ €Á€ú€€A€k€ &ž‚Ä‚î˘ď‚Ô*‚B‚î˘[‚î˘î˘t‚Řľ€Şî˘É‚R €Fî˘.‚Ĺ@t‚î˘H€ `€!x€"Ž€#Ľ€%ž€&Ő€1í€2€3€48€5Q€6k€8„€9ž€;Á€=Ů€>ń€? €@!€A:€BT€Ck€D„€E›€F´€GĚ€Hç€Iţ€NA€QZ€Rt€SŒ€TĽ€Vž€Y×€o& €r= €uX €{s €| €Ź €€Ë €ƒč €„ €‡! €Š< €X €Žu €‘ €0­ ‚}Ë ‚Bt‚ Ű €˙ń €î˘ €# €$8 €%R €&î˘É‚î˘l €¤† €Ň €ĺ €' €^ €™ €Ň € €E €ˆ €ť €ň €9€}€đ€=Ş‚î˘Č€ŮÝ‚î˘î˘÷‚t ‚î˘(‚D‚Z‚î˘î˘u‚tÂî˘î˘î˘‹‚ ‚ş‚Ő‚î˘î˘î˘î˘u‚mtÂî€-'€5a‚ęˇz€!€"§€#ź€$Ň€%č€&€'€*.€.D€9[€>r€CŠ€HŁ€Mş€_Ń€dç€h€m€n2€rI‚]€Gî˘tÂt€€‰€Ÿ€‚ł€¨Ę€Šá€Şř€Ť€Ž(€ŻA€°Z€ąs€ł‚N §‚î˘Â‚Ý€ú€î˘I‚ˆA€î˘|€0”€3‚î˘Č€Ęâ€Ëţ€Ě_€ €Î€€;€O‚tÂî˘e€[‚‚űŕ€5€tM€‚€x­€‹ß€Œ €<€Že€€˝€‘€“O€”~€•ą€–Ő€—€˜9€s€Š€ß€€H€~€ą€ř€=€€˛˜€×€ €T€źr€°€Âě€.€m€ÉŽ€Ěť€Íć€Î€Ď3€Đ`€Ń~€Ň§€ÓŔ€Ôę€. €s €¨ €Ü €!€P!€Ÿ!€ĺ!€"€Z"€›"€Ç"€î˘ä"‚î˘ #‚î˘2#‚_[#€#€:#‚ŕ ĺ#€($‚Q$‚$•$‚Ť$‚Ę$‚č$‚î˘î˘î˘%‚î˘î˘î˘î˘î˘#%‚aN%€…%€/%‚×(Ţ%€ &€Y&€)î˘ƒ&‚&‚Š,Ú&€'€R'€N'‚'‚,"Ü'€(€9î˘g(‚V‘(€Ç(€9î˘)‚î˘:)‚nf)€,‚)€.Ş)€ě)€*€C2*€h*€„*€RĄ*€Ý*€[î˘+‚î˘G+‚í7q+€Ť+€ő+€,,€/î˘G,‚â€r,€Š,€í,€ -€3V-€-€Ĺ-€9Ý-€.€X.€@î˘r.‚î˘œ.‚î˘Ă.‚î˘ě.‚Ť!/€N/€Œ/€î˘˘/‚î˘Ę/‚î˘ň/‚ Ź0€k0€ą0€Î0€9đ0€.1€q1€ť1€ő1€32€f2€™2€Y2‚É‚9ŕ2€ľî˘î˘ö2‚î˘3‚î˘D3‚î˘m3‚3‚ż$ź3€4€H4€î˘[4‚î˘ƒ4‚î˘î˘¨4‚ůž4€DÓ4‚ń4‚î˘î˘5€]"5€äB5€ĺc5€çy5€ş5€ć5€6€K6€|6€ľ6€í6€)7€m7€ą7€ń7€!8€U8€•8€Ę8€â8€řů8€29€î˘f9&7„Ń{9&8ˆŃ‘9&;ŒŃ¤9&>Ń˝9$YŔ^×9 Yă9 Z îD[îD^ îD_îD`îDb îDc$îDd*(„ě^îD ,îDC,&„ě^îDe,îDf=îDgHîDiTîDkVń9@Z˙9€\œ˙˙˙îŔîŔ,îŕ,îŕVî$[:$o_=: oJ: p îDqîDr îDsîDtîDx=îDvDîDzOîD{TU:@ob:@pî$[m:€Ť:€†Ô:$Đx_÷: Đ ; Đ îDĐ;@Đî$Q&;$ŃĚ_G; Ń ; Ń îDŃ;@Ńî$MT;$Ň`G; Ň ; Ň îDŇ;@Ňî$?v;$Ó\`G; Ó ; Ó îDÓ;@Óî$8˜;$Ԕ`G; Ô ; Ô îDÔ;@Ôî$6ˇ;$ŐĚ`G; Ő ; Ő îDŐ;@Őî$8Ů;$×aG; × ; × îD×;@×î$I˙;$ŮPaG; Ů ; Ů îDŮ;@Ůî$4<$ڄaG; Ú ; Ú îDÚ;@Úî$3A<$۸aG; Ű ; Ű îDŰ;@Űî$2c<$ÜěaG; Ü ; Ü îDÜ;@Üî$8…<$Ý$bG; Ý ; Ý îDÝ;@Ýî$3¨<$ŢXbG; Ţ ; Ţ îDŢ;@Ţî$3Ę<$ߌbG; ß ; ß îDß;@ßî$8ě<$ŕÄbG; ŕ ; ŕ îDŕ;@ŕî$3 =$âřbG; â ; â îDâ;@â)=€âü˙˙˙îŔîŕ;î$=4=$ă8cG; ă ; ă îDă;@ă)=€ăü˙˙˙îŔîŕ;î$=T=$ĺxcG; ĺ ; ĺ îDĺ;@ĺr=@ĺ~=@ĺîŔîŕLî$NŠ=$ćČcG; ć ; ć îDć;@ćr=@ć~=@ćîŔîŕMî$OŤ=$çdG; ç ; ç îDç;@çr=@ç~=@çîŔîŕYî$^Ě=$čxdG; č ; č îDč;@čr=@č~=@čîŔîŕKî$Mí=$ęČdG; ę ; ę îDę;@ę >€ęü˙˙˙îŔîŕ@î$B>$ë eG; ë ; ë îDë;@ë >€ëü˙˙˙îŔîŕFî$H:>$ěTeG; ě ; ě îDě;@ě >€ěü˙˙˙îŔîŕ>î$@[>$í”eG; í ; í îDí;@í)=€íü˙˙˙îŔîŕ>î$@{>$îÔeG; î ; î îDî;@î)=€îü˙˙˙îŔîŕ>î$@™>$ďfG; ď ; ď îDď;@ď)=€ďü˙˙˙îŔîŕ>î$@¸>$đTfG; đ ; đ îDđ;@đ)=€đü˙˙˙îŔîŕ>î$@Ř>$ń”fG; ń ; ń îDń;@ń)=€ńü˙˙˙îŔîŕ>î$@ř>$ňÔfG; ň ; ň îDň;@ň)=€ňü˙˙˙îŔîŕ>î$@?$ógG; ó ; ó îDó;@ó)=€óü˙˙˙îŔîŕ>î$@;?$ôTgG; ô ; ô îDô;@ô)=€ôü˙˙˙îŔîŕ>î$@]?$ő”gG; ő ; ő îDő;@ő)=€őü˙˙˙îŔîŕ>î$@|?$÷ÔgG; ÷ ; ÷ îD÷;@÷)=€÷ř˙˙˙š?€÷ü˙˙˙îŔîŕEî$GĽ?$řhG; ř ; ř îDř;@ř)=€řř˙˙˙š?€řü˙˙˙îŔîŕFî$HĆ?$ůdhG; ů ; ů îDů;@ů)=€ůř˙˙˙š?€ůü˙˙˙îŔîŕEî$Gä?$űŹhG; ű ; ű îDű;@ű)=€űř˙˙˙š?€űü˙˙˙îŔîŕFî$H@$ôh @ îDîDîDîDîD îD -@@:@@îŔîŕî$!E@$id@ îDîDîDîD!:@@î$&o@$@iG;  ;  îDîDîDîDîD îD"bîD#tîD&vîD'îD*—îD-ąîD/łîD2ŐîD3ÚîD5ŕîD6ĺîD9çîD:úîD; îD>îD?îDA+îDB:îDC=îDDH;@@@š@@Ľ@€ô˙˙˙­@€đ˙˙˙ľ@@Ă@€ü˙˙˙Đ@€ě˙˙˙Ú@€ř˙˙˙îŔîŕHî$Pć@$HjG; H ; I îDJîDN îDOîDQîDSbîDT|îDWƒîDYîDZ˘îD\¤îD_ÂîDaÄîDcćîDdđîDfňîDgîDjîDk îDl'îDn-îDo2îDqbîDrwîDs|îDtˆîDu“@@Iš@@KĽ@€Lô˙˙˙­@€Lđ˙˙˙A€Mü˙˙˙Ú@€Nř˙˙˙A€Ně˙˙˙ľ@@O A@OîŔîŕ“î$›0A$y,lG; y ; z îD{îD~ îDîDîDƒfîD„„îD‡‹îD‰ŠîDŠŽîDŒ´îDÖîD‘ŘîD“ţîD”îD– îD—îDš$îD›)îDœBîDžHîDŸMîDĄ„îD˘šîDŁŸîD¤ŤîDĽś@@zš@@|Ľ@€|đ˙˙˙­@€|ě˙˙˙PA€|ü˙˙˙A€}ř˙˙˙Ú@€~ô˙˙˙A€~č˙˙˙ľ@@ A@îŔîŕśî$žXA$ŠěmG; Š ; Ş îDŤîDŽ îD°îD˛DîDłZîDś\îDˇvîDşxîDť}îDž„îDĂ—îDżľîDŔĹîDÄÇ;@Š@@ŞĂ@€Źü˙˙˙uA€­ô˙˙˙Ú@€Žř˙˙˙îŔîŕÇî$́A$ȸnG; Č ; É îDĘîDÍ îDĎîDŃ>îDŇTîDŐXîDÖrîDŮxîDÚ}îDÝîDâ’îDă¤îD޸îDßČîDäĘ;@ȍ@@ÉĂ@€Ëü˙˙˙uA€Ěô˙˙˙Ú@€Íř˙˙˙îŔîŕĘî$ĎĄA$čˆoG; čŔA é îDęîDěîDí>îDđrîDń•îDň îDď¨îDóŞ;@čÎA€ëŕ˙˙˙ŘA€ëä˙˙˙âA€ëč˙˙˙ěA€ëě˙˙˙öA€ëđ˙˙˙B€ëô˙˙˙ B€ëř˙˙˙B€ëü˙˙˙îŔîŕŞî$ŹB$÷4pG; ÷ ; ř îDůîDú îDűîDü*îDý/îDţIîDMîDjîDu;@÷@@ř:B€úř˙˙˙EB€úü˙˙˙îŔîŕuî$zPB$°pG;  ;  îD îD îD;îDUîD`îDƒîD“îD—îD˘;@@@š@@ Ľ@€ ü˙˙˙­@€ ř˙˙˙îŔîŕ˘î$ŠnB$\qG;  ;   îD!îD% îD&îD'îD)IîD*cîD-eîD/‡îD2‰îD3”îD6–îD8­îD=´îD9źîD:ÍîD>Ď;@@@ -@@"B€#đ˙˙˙šB€#ô˙˙˙ŚB€#ř˙˙˙´B€#ü˙˙˙îŔîŕĎî$ÔÂB$B0rG; B ; C îDDîDG îDIîDKEîDLWîDO`îDPzîDS€îDV…îDY‡îDZšîD[ŞîD^°îDbźîD_ĐîDdë;@B@@CĂ@€Eü˙˙˙Đ@€Fô˙˙˙Ú@€Gř˙˙˙îŔîŕëî$đăB$h sG; h ; i îDjîDkîDmîDl'îDn);@hî$+C$rLsG; r ; s îDtîDxîD}?îD~YîDdîD‚‡îDƒ—îD…›îD†Ą;@r@@sĽ@€uü˙˙˙­@€uř˙˙˙!C@vîŔîŕĄî$¨-C$ŠôsG; Š ; ‹ îDŒîDîD•>îD–XîD—\îDšîD›îD“îD šîDžŹîDĄˇ;@Š@@‹Ľ@€ü˙˙˙­@€ř˙˙˙!C@ŽîŔîŕˇî$žLC$Ľ´tG; Ľ ; Ś îD§îDŹîDŽ\îDŻ^îDącîD´€îDśŒîD¸°îDťĐîDÂ÷îDÄ-îDĆ<îDÇLîDÉPîDĘUîDË\îDĚb;@Ľ@@ŚĽ@€¨řű˙˙­@€¨ôű˙˙PA€¨üű˙˙kC€Šü˙˙‹C@ŞîŔîŕbî$l—C$Đ vG; ĐŔA Ń îDŇîDŐîDÖîDŘîDÚ`îDŰvîDŢxîDßšîDâĄîDäĂîDĺÓîDçŘîDęţîDěîDíîDđîDńîDň.îDô>îDöCîDř`îDůk;@ĐľC@ŃĂ@€Óř˙˙˙Đ@€Ôč˙˙˙PA€Őü˙˙˙Ľ@€Őđ˙˙˙­@€Őě˙˙˙ĂC@ŐÚ@€Öô˙˙˙îŔîŕkî$sĎC$ý”wG; ý ; ţ îD˙îDîDîDîDîDlîD~îD €îD šîDĄîDťîD˝îDßîDäîDěîDńîDóîDîD îD#îD$!îD&7îD'FîD(IîD)T;@ý@@ţš@@Ľ@€ô˙˙˙­@€đ˙˙˙ľ@@Ă@€ü˙˙˙Đ@€ě˙˙˙Ú@€ř˙˙˙îŔîŕTî$\íC$-đxG; - ; . îD/îD2îD7;îD8UîD9`îD<ƒîD=“îD?—îD@;@-@@.Ľ@€0ü˙˙˙­@€0ř˙˙˙š@@0îŔîŕî$¤ D$D”yG; D ; E îDFîDKîDM\îDN^îDPcîDS€îDUŒîDW°îDZĐîD\÷îD]-îD_<îD`LîDbPîDcUîDd\îDeb;@D@@EĽ@€Gřű˙˙­@€Gôű˙˙PA€Güű˙˙(D€Hü˙˙‹C@IîŔîŕbî$lHD$i{G; i ; j îDkîDo îDpîDrîDtbîDu|îDxƒîDzîD{˘îD}¤îD€ÂîD‚ÄîD„ćîD…đîD‡ňîDˆîD‹îDŒ îD'îD-îD2îD’bîD“wîD”|îD•ˆîD–“@@jš@@lĽ@€mô˙˙˙­@€mđ˙˙˙A€nü˙˙˙Ú@€oř˙˙˙A€oě˙˙˙ľ@@p A@pîŔîŕ“î$›gD$šœ|G; š ; › îDœîDŸ îD îD˘îD¤fîDĽ„îD¨‹îDŞŠîDŤŽîD­´îD°ÖîD˛ŘîD´ţîDľîDˇ îD¸îDť$îDź)îD˝BîDżHîDŔMîD„îDĂšîDÄŸîDĹŤîDĆś@@›š@@Ľ@€đ˙˙˙­@€ě˙˙˙PA€ü˙˙˙A€žř˙˙˙Ú@€Ÿô˙˙˙A€Ÿč˙˙˙ľ@@  A@ îŔîŕśî$ž‡D$Ę\~G; Ę ; Ë îDĚîDÎîDĎîDĐ$îDŃ2îDŇ:îDÔJîDÖTîDÚXîDŰcîD×eîDŘpîDÝp;@ĘŽD€Íü˙˙˙šD@ÍîŔîŕpî$rÄD$áĐ~G; á ; â îDăîDćîDçîDéGîDďqîDô•îD÷ĽîDú§îDüšîDűŃîDţÓ;@á@@âéD€äč˙˙˙÷D€äě˙˙˙E€äđ˙˙˙E€äô˙˙˙!E€äř˙˙˙/E€äü˙˙˙îŔîŕÓî$Ú=E$ŹG;  ;  îDîDîD îD *îD TîD dîDf;@Ă@€ü˙˙˙îŔîŕfî$h\E$€G;  ;  îDîDîD"îDCîDE;@E€ř˙˙˙‰E€ü˙˙˙îŔîŕEî$G“E$\€G;  ;  îD îD#îD$îD&BîD,lîD1”îD3¤îD6ŚîD8¸îD7ÔîD:Ö;@@@éD€!č˙˙˙÷D€!ě˙˙˙E€!đ˙˙˙E€!ô˙˙˙!E€!ř˙˙˙/E€!ü˙˙˙îŔîŕÖî$ÝłE$><G; > ; ? îD@îDBîDD"îDCDîDEF;@>Ľ@€Aü˙˙˙­@€Ař˙˙˙îŔîŕFî$HŰE$I„G; I ; J îDKîDOîDS*îDT6îDVLîDXaîD]eîDYmîDZ~îD^€;@I-@@LB€Mđ˙˙˙šB€Mô˙˙˙ŚB€Mř˙˙˙´B€Mü˙˙˙îŔîŕ€î$‚úE$b‚G; b ; c îDdîDfîDh<îDkHîDm^îDoyîDp‰îDr‹;@b@@cF€eü˙˙˙îŔîŕ‹î$’%F$vœ‚G; v ; w îDxîDzîD|DîD~^îDgîDƒ…îD…ŚîD†śîDˆ¸;@v@@wGF€yř˙˙˙PF€yü˙˙˙ZF€yô˙˙˙îŔîŕ¸î$żdF$Œ\ƒG; ŒŔA  îDŽîD‘îD’îD”îD–dîD—zîDš|îD›žîDžĽîD ÇîDĄ×îDŁÜîDŚîD¨îDŠîDŹîD­îDŽ2îD°BîD˛GîD´dîDľo;@ŒľC@Ă@€ř˙˙˙Đ@€č˙˙˙PA€‘ü˙˙˙Ľ@€‘đ˙˙˙­@€‘ě˙˙˙ĂC@‘Ú@€’ô˙˙˙îŔîŕoî$w‚F&ˇ”ŃľF$ԄG; ŐF  îDîD îD î$âF ˙F$ě„G  ;  îDî$H$G$‚4…G ‚ ; ‚ îD‚î$FDG$ƒ|…G ƒ ; ƒ îDƒî$HeG$„ąG „ ; „ îD„î$F€G$… †G … ; … îD…î$H™G$†T†G † ; † îD†î$FąG$‡œ†G ‡ ; ‡ îD‡î$HĚG$ˆä†G ˆ ; ˆ îDˆî$FĺG$‰,‡G ‰ ; ‰ îD‰î$HüG$Št‡G Š ; Š îDŠî$FH$‹ź‡G ‹ ; ‹ îD‹î$H6H$ŒˆG Œ ; Œ îDŒî$FYH$LˆG  ;  îDî$HsH$Ž”ˆG Ž ; Ž îDŽî$FH$܈G  ;  îD)=€ř˙˙˙š?€ü˙˙˙îŔîŕ^î$`ŞH$’<‰G ’ ; ’ îD’@@’ĂH€’ü˙˙˙îŔîŕśî$ťÎH$“ř‰G “ ; “ îD“@@“ĂH€“ü˙˙˙îŔîŕşî$żĺH$”¸ŠG ” ; ” îD”@@”ĂH€”ü˙˙˙îŔîŕşî$żúH$•x‹G • ; • îD•@@•ĂH€•ü˙˙˙îŔîŕşî$żI$—8ŒG — ; — îD—î$A+I$˜|ŒG ˜ ; ˜ îD˜î$HGI$šČG š ; š îDšî$AbI$›G › ; › îD›î$A}I$LG  ;  îDî$a I$ž°G ž ; ž îDžî$]˝I$ŸŽG Ÿ ; Ÿ îDŸî$]ÖI$ pŽG   ;   îD î$]ďI$ĄЎG Ą ; Ą îDĄî$] J$Ł0G Ł ; Ł îDŁî$F#J$¤xG ¤ ; ¤ îD¤î$L>J$ĽďG Ľ ; Ľ îDĽî$FZJ$Š G Š ; Ş îDŤîDŽ îDŻîDą*îD˛EîD´PîDˇTîDštîDź’îDž˘îDşŚîDŔż@@ŞzJ€Źţ˙˙˙†J€Źř˙˙˙ŽJ€Źú˙˙˙–J€Źü˙˙˙îŔîŕżî$ĞJ$ÄАG Ä ; Ĺ îDĆîDÉ îDĘ%îDĚ5îDÍPîDÎ`îDĐbîDŃxîDŇˆ@@ĹPA€Çü˙˙˙îŔîŕˆî$ťJ$Ö`‘G Ö ; × îDŘîDŰ îDÝ îDŢ;îDßKîDâPîDäpîDĺxîDç€îDč“@@×ÖJ€Ůü˙˙˙šD@ŮîŔîŕ“î$˜ŕJ$ěř‘G ě ; í îDîîDń îDó(îDôCîDőSîD÷XîDůnîDúŠ@@í˙J€ďü˙˙˙îŔîŕŠî$K$ţˆ’G ţ ; ˙ îDîDîDîD#îD +îD J$K€˙˙˙˙îŔîŕJî$L-K$ԒG  ;  îDîDîD îDLîDpîD|FK@OK@îŔîŕ|î$~XK$T“G;  ;  îD îD$îD&îD(4îD)@îD*KîD-MîD/YîD4`îD0lîD1}îD5-@@!Ă@€"ü˙˙˙îŔîŕî$qK$9ؓG 9 ; : îD;îD> îD@ îDBFîDE`îDFpîDIxîDJ@@:K€<˙˙˙˙îŔîŕî$•›K$Op”G O ; P îDQîDTîDV#îDX@îD\LîD]WîDY`îDZkîD^kľK€Rü˙˙˙îŔîŕkî$mžK$cŕ”G c ; d îDeîDh îDi îDk6îDm^îDp„îDq”îDt˜îDuż@@dzJ€fř˙˙˙†J€fú˙˙˙ŽJ€fü˙˙˙–J€fţ˙˙˙îŔîŕżî$ÄŰK$y¤•G y ; z îD{îD~ îD,îD<îD‚WîDƒgîD†lîDˆŠîD‰°@@z÷K€|ú˙˙˙L€|ü˙˙˙–J€|ţ˙˙˙îŔîŕ°î$ľ L$\–G ŔA Ž îDîD“îD•$îD–-îD—8îDšDîDœKîDOîDž`îDĄdîDŁnîD¤{îDĽŒîDŚ˘îD§ŻîD¨ŔîDŞÖîDŤÜ-@@$L@‘3L@‘îŔîŕÜî$ăAL$°@—G ° ; ą îD˛îDľ îDˇ îDšGîDźaîD˝qîDŔuîDÁ@@ąľK€łü˙˙˙îŔîŕî$’]L$ĹԗG Ĺ ; Ć îDÇîDËîDÍ#îDĎ?îDŃGîDŇYwL@ČľK€Éü˙˙˙îŔîŕYî$[ŠL$Ö0˜G Ö ; × îDŘîDŰîDÝîDß"îDŕ2$K€Ů˙˙˙˙îŔîŕ2î$4ĽL$äd˜G ä ; ĺ îDćîDé îDë îDíJîDđdîDńtîDô|îDő˜@@ĺľK€çü˙˙˙îŔîŕ˜î$źL$ů™G ů ; ú îDűîD˙îDîD8îDCîD JîDRîDcîD e-@@üB€ýř˙˙˙šB€ýü˙˙˙îŔîŕeî$gŐL$l™G  ;  îDîD îD$îDTîDnîDyîD„îD!ŚîD"ˇîD$źîD%ÇîD(ÉîD-ÍîD)ŐîD*ćîD.č@@-@@B€ř˙˙˙šB€ü˙˙˙ŚB€đ˙˙˙´B€ô˙˙˙îŔîŕčî$íńL$2\šG 2 ; 3 îD4îD7 îD8$îD:7îD<bîD?zîD@…îDC‡îDI îDDśîDFĆîDJȍ@@3÷K€5ţ˙˙˙L€5ú˙˙˙–J€5ü˙˙˙îŔîŕČî$ÍM$N,›G N ; O îDPîDS îDT$îDV:îDXbîD[|îD]ŒîD`”îDaž@@OPA€Qü˙˙˙îŔîŕžî$Ł.M$eЛG e ; f îDgîDjîDkîDl8A€hü˙˙˙îŔîŕ8î$:EM$p œG p ; q îDrîDs îDuîDw'îD}VîD~lîDyîD€~îD‰îDƒ‹îD„›îD†@@qĂH€sü˙˙˙îŔîŕî$˘_M$аœG Š ; ‹ îDŒîD îD‘ îD’;îD“KîD–PîD˜€îDš­îDœ¸@@‹­@€ř˙˙˙Ľ@€ü˙˙˙îŔîŕ¸î$˝xM$ pG   ; Ą îD˘îDŚîD¨îDŞ/îDŤ4îDŹ9îD­CîDŽPîDŻaîD°wîDą„îD˛•îDł¨îD´łîDśľîDˇĹîDšÇĂC@Ł–M@¤ĄM@¤îŔîŕÇî$Ě­M$˝<žG ˝ ; ž îDżîDĂîDĹîDÇ8îDČFîDÉTîDĚ\îDÍlîDĘtîDĐ€îDŃŒĂ@€Ŕü˙˙˙ĆM@ÁîŔîŕŒî$ŽŃM$Ő̞G Ő ; Ö îD×îDŰîDÝîDß8îDŕFîDáTîDä\îDĺlîDâtîDč€îDé”Ă@€Řü˙˙˙ĆM@ŮîŔîŕ”î$–ëM$ídŸG í ; î îDďîDň îDô îDöJîD÷`îDúdîDűtîDý|îDţ„îD@@îĂH€đü˙˙˙îŔîŕî$”N&ŒÖ2N$FřŸîDFîDJ îDM#îDN,îDQ1îDRCîDURîDVbîDWqîDX€îDa–îDb˛îDcÎîDdíîDe îDf(îDgDîDhcîDiîDjžîDkşîDlŮîDmőîDnîDo0îDpOîDqkîDrŠîDsŚîDtĹîDuáîDvîDwîDx;îDyWîD|vîD}’îD~ąîDÍîD€ěîDîDƒ'îD„CîD…bîD†~îD‡îDˆšîD‰ŘîDŠôîD‹îDŒ/îDNîDjîD‘ˆîD’ îD“žîD”ŮîD•÷îD–îD—0îD˜KîD™iîDš„îDœ˘îD˝îDžŰîDŸöîD îDĄ/îDŁMîD¤hîDچîD§ĄîD¨źîDŠ×îDŞőîDŤîDŹ.îD­IîDŽgîDŻ‚îD° îDąťîD˛ŮîDłôîD´ îDľ- îDśK îD¸f îDš îDş™ îDť´ îDźĚ îD˝ç îDž˙ îDż îDĆ2 îDÇ< îDČR îDĘe îDËy îDĚy îD͏ îDΑ îDĎ“ îDĐ› îDŃĽ îDҧ îDÔ¨ îDŐŠ îDÖŽ îD׹ îDظ îDŮş îDÚĐ îDŰ× îDĆŕ îDÝđ îDŢ îDâ& îDă2 îDä< EN@GPN€Gü˙˙˙ZN@GîŔeN€Ăř˙˙˙oN@Ä}N@ĹîŔ–îŔR îŔR îŕR îŔR îŕR îŔR îŕR îŔR îŕR îŕR îŔe îŔe îŕe îŔe îŕe îŔe îŕe îŔe îŕe îŕe ŒN@Ë—N@ËîŔy î஠îŕđ îŕ< î$D ˘N(4üÜšN(%Ýîd<Ťcursesmodule.c/usr/src/cursesmodule/./cursesmodule.cgcc2_compiled.int:t(0,1)=r(0,1);0020000000000;0017777777777;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,1);0020000000000;0017777777777;unsigned int:t(0,4)=r(0,1);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,1);0000000000000;0037777777777;long long int:t(0,6)=r(0,1);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=r(0,1);0000000000000;01777777777777777777777;short int:t(0,8)=r(0,8);-32768;32767;short unsigned int:t(0,9)=r(0,9);0;65535;signed char:t(0,10)=r(0,10);-128;127;unsigned char:t(0,11)=r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);4;0;complex double:t(0,17)=r(0,17);8;0;complex long double:t(0,18)=r(0,18);12;0;void:t(0,19)=(0,19)PyCursesVersion:G(0,20)=*(0,2)/usr/local/include/python1.5/Python.h/usr/local/include/python1.5/patchlevel.h/usr/local/include/python1.5/config.h/usr/include/stdio.h/usr/include/features.h/usr/include/sys/cdefs.h/usr/include/gnu/stubs.h/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.hsize_t:t(8,1)=(0,4)/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h__gnuc_va_list:t(9,1)=(9,2)=*(0,19)/usr/include/bits/types.h__u_char:t(10,1)=(0,11)__u_short:t(10,2)=(0,9)__u_int:t(10,3)=(0,4)__u_long:t(10,4)=(0,5)__u_quad_t:t(10,5)=(0,7)__quad_t:t(10,6)=(0,6)__int8_t:t(10,7)=(0,10)__uint8_t:t(10,8)=(0,11)__int16_t:t(10,9)=(0,8)__uint16_t:t(10,10)=(0,9)__int32_t:t(10,11)=(0,1)__uint32_t:t(10,12)=(0,4)__int64_t:t(10,13)=(0,6)__uint64_t:t(10,14)=(0,7)__qaddr_t:t(10,15)=(10,16)=*(10,6)__dev_t:t(10,17)=(10,5)__uid_t:t(10,18)=(10,3)__gid_t:t(10,19)=(10,3)__ino_t:t(10,20)=(10,4)__mode_t:t(10,21)=(10,3)__nlink_t:t(10,22)=(10,3)__off_t:t(10,23)=(0,3)__loff_t:t(10,24)=(10,6)__pid_t:t(10,25)=(0,1)__ssize_t:t(10,26)=(0,1)__rlim_t:t(10,27)=(0,3)__rlim64_t:t(10,28)=(10,6)__id_t:t(10,29)=(10,3)__fsid_t:t(10,30)=(10,31)=s8__val:(10,32)=ar(0,1);0;1;(0,1),0,64;;__daddr_t:t(10,33)=(0,1)__caddr_t:t(10,34)=(0,20)__time_t:t(10,35)=(0,3)__swblk_t:t(10,36)=(0,3)__clock_t:t(10,37)=(0,3)__fd_mask:t(10,38)=(0,5)__fd_set:t(10,39)=(10,40)=s128__fds_bits:(10,41)=ar(0,1);0;31;(10,38),0,1024;;__key_t:t(10,42)=(0,1)__ipc_pid_t:t(10,43)=(0,9)__blkcnt_t:t(10,44)=(10,4)__blkcnt64_t:t(10,45)=(10,5)__fsblkcnt_t:t(10,46)=(0,3)__fsblkcnt64_t:t(10,47)=(10,6)__fsfilcnt_t:t(10,48)=(10,4)__fsfilcnt64_t:t(10,49)=(10,5)__ino64_t:t(10,50)=(10,4)__off64_t:t(10,51)=(10,24)__t_scalar_t:t(10,52)=(0,1)__t_uscalar_t:t(10,53)=(0,4)__intptr_t:t(10,54)=(0,1)FILE:t(4,1)=(4,2)=xs_IO_FILE:/usr/include/libio.h/usr/include/_G_config.hwchar_t:t(14,1)=(0,3)wint_t:t(14,2)=(0,4)_G_int16_t:t(13,1)=(0,8)_G_int32_t:t(13,2)=(0,1)_G_uint16_t:t(13,3)=(0,9)_G_uint32_t:t(13,4)=(0,4)_IO_lock_t:t(12,1)=(0,19)_IO_marker:T(12,2)=s12_next:(12,3)=*(12,2),0,32;_sbuf:(12,4)=*(4,2),32,32;\_pos:(0,1),64,32;;_IO_FILE:T(4,2)=s148_flags:(0,1),0,32;_IO_read_ptr:(0,20),32,32;\_IO_read_end:(0,20),64,32;_IO_read_base:(0,20),96,32;\_IO_write_base:(0,20),128,32;_IO_write_ptr:(0,20),160,32;\_IO_write_end:(0,20),192,32;_IO_buf_base:(0,20),224,32;\_IO_buf_end:(0,20),256,32;_IO_save_base:(0,20),288,32;\_IO_backup_base:(0,20),320,32;_IO_save_end:(0,20),352,32;\_markers:(12,3),384,32;_chain:(12,4),416,32;_fileno:(0,1),448,32;\_blksize:(0,1),480,32;_old_offset:(10,23),512,32;\_cur_column:(0,9),544,16;_vtable_offset:(0,10),560,8;\_shortbuf:(12,5)=ar(0,1);0;0;(0,2),568,8;_lock:(12,6)=*(12,1),576,32;\_offset:(10,51),608,64;_unused2:(12,7)=ar(0,1);0;15;(0,1),672,512;;_IO_FILE:t(12,8)=(4,2)fpos_t:t(4,3)=(10,23)/usr/include/bits/stdio_lim.hoff_t:t(4,4)=(10,23)/usr/include/bits/stdio.h/usr/include/string.h/usr/include/bits/string.h/usr/include/bits/string2.h/usr/include/endian.h/usr/include/bits/endian.h/usr/include/stdlib.h/usr/include/errno.h/usr/include/bits/errno.h/usr/include/linux/errno.h/usr/include/asm/errno.hdiv_t:t(30,1)=(30,2)=s8quot:(0,1),0,32;rem:(0,1),32,32;;ldiv_t:t(30,3)=(30,4)=s8quot:(0,3),0,32;rem:(0,3),32,32;;/usr/include/sys/types.hu_char:t(32,1)=(10,1)u_short:t(32,2)=(10,2)u_int:t(32,3)=(10,3)u_long:t(32,4)=(10,4)quad_t:t(32,5)=(10,6)u_quad_t:t(32,6)=(10,5)fsid_t:t(32,7)=(10,30)loff_t:t(32,8)=(10,24)ino_t:t(32,9)=(10,20)dev_t:t(32,10)=(10,17)gid_t:t(32,11)=(10,19)mode_t:t(32,12)=(10,21)nlink_t:t(32,13)=(10,22)uid_t:t(32,14)=(10,18)pid_t:t(32,15)=(10,25)id_t:t(32,16)=(10,29)ssize_t:t(32,17)=(10,26)daddr_t:t(32,18)=(10,33)caddr_t:t(32,19)=(10,34)key_t:t(32,20)=(10,42)/usr/include/time.htime_t:t(33,1)=(10,35)ulong:t(32,21)=(0,5)ushort:t(32,22)=(0,9)uint:t(32,23)=(0,4)int8_t:t(32,24)=(0,10)int16_t:t(32,25)=(0,8)int32_t:t(32,26)=(0,1)int64_t:t(32,27)=(0,6)u_int8_t:t(32,28)=(0,11)u_int16_t:t(32,29)=(0,9)u_int32_t:t(32,30)=(0,4)u_int64_t:t(32,31)=(0,7)register_t:t(32,32)=(0,1)/usr/include/sys/select.h/usr/include/bits/select.h/usr/include/bits/sigset.h__sig_atomic_t:t(37,1)=(0,1)__sigset_t:t(37,2)=(37,3)=s128__val:(37,4)=ar(0,1);0;31;(0,5),0,1024;;timespec:T(38,1)=s8tv_sec:(0,3),0,32;tv_nsec:(0,3),32,32;;fd_mask:t(35,1)=(10,38)fd_set:t(35,2)=(10,39)/usr/include/sys/sysmacros.hblkcnt_t:t(32,33)=(10,44)fsblkcnt_t:t(32,34)=(10,46)fsfilcnt_t:t(32,35)=(10,48)random_data:T(30,5)=s28fptr:(30,6)=*(32,26),0,32;rptr:(30,6),32,32;\state:(30,6),64,32;rand_type:(0,1),96,32;rand_deg:(0,1),128,32;\rand_sep:(0,1),160,32;end_ptr:(30,6),192,32;;drand48_data:T(30,7)=s24x:(30,8)=ar(0,1);0;2;(0,9),0,48;\a:(30,8),48,48;c:(0,9),96,16;old_x:(30,8),112,48;\init:(0,1),160,32;;/usr/include/alloca.h__compar_fn_t:t(30,9)=(30,10)=*(30,11)=f(0,1)/usr/local/include/python1.5/myproto.h/usr/local/include/python1.5/object.h_object:T(43,1)=s8ob_refcnt:(0,1),0,32;ob_type:(43,2)=*(43,3)=xs_typeobject:,32,32;;PyObject:t(43,4)=(43,1)PyVarObject:t(43,5)=(43,6)=s12ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;ob_size:(0,1),64,32;;unaryfunc:t(43,7)=(43,8)=*(43,9)=f(43,10)=*(43,4)binaryfunc:t(43,11)=(43,12)=*(43,13)=f(43,10)ternaryfunc:t(43,14)=(43,15)=*(43,16)=f(43,10)inquiry:t(43,17)=(43,18)=*(43,19)=f(0,1)coercion:t(43,20)=(43,21)=*(43,22)=f(0,1)intargfunc:t(43,23)=(43,24)=*(43,25)=f(43,10)intintargfunc:t(43,26)=(43,27)=*(43,28)=f(43,10)intobjargproc:t(43,29)=(43,30)=*(43,31)=f(0,1)intintobjargproc:t(43,32)=(43,33)=*(43,34)=f(0,1)objobjargproc:t(43,35)=(43,36)=*(43,37)=f(0,1)getreadbufferproc:t(43,38)=(43,39)=*(43,40)=f(0,1)getwritebufferproc:t(43,41)=(43,39)getsegcountproc:t(43,42)=(43,43)=*(43,44)=f(0,1)getcharbufferproc:t(43,45)=(43,46)=*(43,47)=f(0,1)PyNumberMethods:t(43,48)=(43,49)=s92nb_add:(43,11),0,32;\nb_subtract:(43,11),32,32;nb_multiply:(43,11),64,32;\nb_divide:(43,11),96,32;nb_remainder:(43,11),128,32;\nb_divmod:(43,11),160,32;nb_power:(43,14),192,32;\nb_negative:(43,7),224,32;nb_positive:(43,7),256,32;\nb_absolute:(43,7),288,32;nb_nonzero:(43,17),320,32;\nb_invert:(43,7),352,32;nb_lshift:(43,11),384,32;\nb_rshift:(43,11),416,32;nb_and:(43,11),448,32;nb_xor:(43,11),480,32;\nb_or:(43,11),512,32;nb_coerce:(43,20),544,32;nb_int:(43,7),576,32;\nb_long:(43,7),608,32;nb_float:(43,7),640,32;nb_oct:(43,7),672,32;\nb_hex:(43,7),704,32;;PySequenceMethods:t(43,50)=(43,51)=s28sq_length:(43,17),0,32;\sq_concat:(43,11),32,32;sq_repeat:(43,23),64,32;\sq_item:(43,23),96,32;sq_slice:(43,26),128,32;sq_ass_item:(43,29),160,32;\sq_ass_slice:(43,32),192,32;;PyMappingMethods:t(43,52)=(43,53)=s12mp_length:(43,17),0,32;\mp_subscript:(43,11),32,32;mp_ass_subscript:(43,35),64,32;;PyBufferProcs:t(43,54)=(43,55)=s16bf_getreadbuffer:(43,38),0,32;\bf_getwritebuffer:(43,41),32,32;bf_getsegcount:(43,42),64,32;\bf_getcharbuffer:(43,45),96,32;;destructor:t(43,56)=(43,57)=*(43,58)=f(0,19)printfunc:t(43,59)=(43,60)=*(43,61)=f(0,1)getattrfunc:t(43,62)=(43,63)=*(43,64)=f(43,10)getattrofunc:t(43,65)=(43,12)setattrfunc:t(43,66)=(43,67)=*(43,68)=f(0,1)setattrofunc:t(43,69)=(43,36)cmpfunc:t(43,70)=(43,71)=*(43,72)=f(0,1)reprfunc:t(43,73)=(43,8)hashfunc:t(43,74)=(43,75)=*(43,76)=f(0,3)_typeobject:T(43,3)=s108ob_refcnt:(0,1),0,32;ob_type:(43,2),32,32;\ob_size:(0,1),64,32;tp_name:(0,20),96,32;tp_basicsize:(0,1),128,32;\tp_itemsize:(0,1),160,32;tp_dealloc:(43,56),192,32;\tp_print:(43,59),224,32;tp_getattr:(43,62),256,32;\tp_setattr:(43,66),288,32;tp_compare:(43,70),320,32;\tp_repr:(43,73),352,32;tp_as_number:(43,77)=*(43,48),384,32;\tp_as_sequence:(43,78)=*(43,50),416,32;tp_as_mapping:(43,79)=*(43,52),448,32;\tp_hash:(43,74),480,32;tp_call:(43,14),512,32;tp_str:(43,73),544,32;\tp_getattro:(43,65),576,32;tp_setattro:(43,69),608,32;\tp_as_buffer:(43,80)=*(43,54),640,32;tp_flags:(0,3),672,32;\tp_doc:(0,20),704,32;tp_xxx5:(0,3),736,32;tp_xxx6:(0,3),768,32;\tp_xxx7:(0,3),800,32;tp_xxx8:(0,3),832,32;;PyTypeObject:t(43,81)=(43,3)/usr/local/include/python1.5/objimpl.h/usr/local/include/python1.5/pydebug.h/usr/local/include/python1.5/intobject.hPyIntObject:t(46,1)=(46,2)=s12ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;ob_ival:(0,3),64,32;;/usr/local/include/python1.5/longobject.hPyLongObject:t(47,1)=(47,2)=xs_longobject:/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/limits.h/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/syslimits.h/usr/include/limits.h/usr/include/bits/posix1_lim.h/usr/include/bits/local_lim.h/usr/include/linux/limits.h/usr/include/bits/posix2_lim.h/usr/local/include/python1.5/floatobject.hPyFloatObject:t(56,1)=(56,2)=s16ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;ob_fval:(0,13),64,64;;/usr/local/include/python1.5/complexobject.hPy_complex:t(57,1)=(57,2)=s16real:(0,13),0,64;imag:(0,13),64,64;;PyComplexObject:t(57,3)=(57,4)=s24ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;cval:(57,1),64,128;;/usr/local/include/python1.5/rangeobject.h/usr/local/include/python1.5/stringobject.hPyStringObject:t(59,1)=(59,2)=s24ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;ob_size:(0,1),64,32;ob_shash:(0,3),96,32;\ob_sinterned:(43,10),128,32;ob_sval:(12,5),160,8;;/usr/local/include/python1.5/bufferobject.h/usr/local/include/python1.5/tupleobject.hPyTupleObject:t(61,1)=(61,2)=s16ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;ob_size:(0,1),64,32;ob_item:(61,3)=ar(0,1);0;0;(43,10),96,32;;/usr/local/include/python1.5/listobject.hPyListObject:t(62,1)=(62,2)=s16ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;ob_size:(0,1),64,32;ob_item:(62,3)=*(43,10),96,32;;/usr/local/include/python1.5/dictobject.h/usr/local/include/python1.5/methodobject.hPyCFunction:t(64,1)=(43,12)PyCFunctionWithKeywords:t(64,2)=(43,15)PyMethodDef:T(64,3)=s16ml_name:(0,20),0,32;ml_meth:(64,1),32,32;\ml_flags:(0,1),64,32;ml_doc:(0,20),96,32;;PyMethodDef:t(64,4)=(64,3)PyMethodChain:T(64,5)=s8methods:(64,6)=*(64,4),0,32;\link:(64,7)=*(64,5),32,32;;PyMethodChain:t(64,8)=(64,5)PyCFunctionObject:t(64,9)=(64,10)=s16ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;m_ml:(64,6),64,32;m_self:(43,10),96,32;;/usr/local/include/python1.5/moduleobject.h/usr/local/include/python1.5/funcobject.hPyFunctionObject:t(66,1)=(66,2)=s28ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;func_code:(43,10),64,32;func_globals:(43,10),96,32;\func_defaults:(43,10),128,32;func_doc:(43,10),160,32;\func_name:(43,10),192,32;;/usr/local/include/python1.5/classobject.hPyClassObject:t(67,1)=(67,2)=s32ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;cl_bases:(43,10),64,32;cl_dict:(43,10),96,32;\cl_name:(43,10),128,32;cl_getattr:(43,10),160,32;\cl_setattr:(43,10),192,32;cl_delattr:(43,10),224,32;;PyInstanceObject:t(67,3)=(67,4)=s16ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;in_class:(67,5)=*(67,1),64,32;\in_dict:(43,10),96,32;;PyMethodObject:t(67,6)=(67,7)=s20ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;im_func:(43,10),64,32;im_self:(43,10),96,32;\im_class:(43,10),128,32;;/usr/local/include/python1.5/fileobject.h/usr/local/include/python1.5/cobject.h/usr/local/include/python1.5/traceback.h/usr/local/include/python1.5/sliceobject.hPySliceObject:t(71,1)=(71,2)=s20ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;start:(43,10),64,32;stop:(43,10),96,32;\step:(43,10),128,32;;/usr/local/include/python1.5/pyerrors.h/usr/local/include/python1.5/mymalloc.h/usr/local/include/python1.5/pystate.h_is:T(74,1)=s24next:(74,2)=*(74,1),0,32;tstate_head:(74,3)=*(74,4)=xs_ts:,32,32;\modules:(43,10),64,32;sysdict:(43,10),96,32;builtins:(43,10),128,32;\checkinterval:(0,1),160,32;;PyInterpreterState:t(74,5)=(74,1)_ts:T(74,4)=s60next:(74,3),0,32;interp:(74,6)=*(74,5),32,32;\frame:(74,7)=*(74,8)=xs_frame:,64,32;recursion_depth:(0,1),96,32;\ticker:(0,1),128,32;tracing:(0,1),160,32;sys_profilefunc:(43,10),192,32;\sys_tracefunc:(43,10),224,32;curexc_type:(43,10),256,32;\curexc_value:(43,10),288,32;curexc_traceback:(43,10),320,32;\exc_type:(43,10),352,32;exc_value:(43,10),384,32;\exc_traceback:(43,10),416,32;dict:(43,10),448,32;;PyThreadState:t(74,9)=(74,4)/usr/local/include/python1.5/modsupport.hva_list:t(76,1)=(9,1)/usr/local/include/python1.5/ceval.h/usr/local/include/python1.5/pythonrun.h/usr/local/include/python1.5/sysmodule.h/usr/local/include/python1.5/intrcheck.h/usr/local/include/python1.5/import.h_inittab:T(81,1)=s8name:(0,20),0,32;initfunc:(81,2)=*(81,3)=f(0,19),32,32;;_frozen:T(81,4)=s12name:(0,20),0,32;code:(81,5)=*(0,11),32,32;\size:(0,1),64,32;;/usr/local/include/python1.5/abstract.h/usr/local/include/python1.5/pyfpe.h/usr/include/curses.hchtype:t(84,1)=(0,5)/usr/include/ncurses/unctrl.h/usr/include/ncurses/curses.hbool:t(84,2)=(0,1)SCREEN:t(84,3)=(84,4)=xsscreen:WINDOW:t(84,5)=(84,6)=xs_win_st:attr_t:t(84,7)=(84,1)ldat:T(84,8)=s12text:(84,9)=*(84,1),0,32;firstchar:(0,8),32,16;\lastchar:(0,8),48,16;oldindex:(0,8),64,16;;pdat:T(84,10)=s12_pad_y:(0,8),0,16;_pad_x:(0,8),16,16;\_pad_top:(0,8),32,16;_pad_left:(0,8),48,16;\_pad_bottom:(0,8),64,16;_pad_right:(0,8),80,16;;_win_st:T(84,6)=s100_cury:(0,8),0,16;_curx:(0,8),16,16;\_maxy:(0,8),32,16;_maxx:(0,8),48,16;_begy:(0,8),64,16;\_begx:(0,8),80,16;_flags:(0,8),96,16;_attrs:(84,7),128,32;\_bkgd:(84,1),160,32;_notimeout:(84,2),192,32;_clear:(84,2),224,32;\_leaveok:(84,2),256,32;_scroll:(84,2),288,32;_idlok:(84,2),320,32;\_idcok:(84,2),352,32;_immed:(84,2),384,32;_sync:(84,2),416,32;\_use_keypad:(84,2),448,32;_delay:(0,1),480,32;\_line:(84,11)=*(84,8),512,32;_regtop:(0,8),544,16;\_regbottom:(0,8),560,16;_parx:(0,1),576,32;_pary:(0,1),608,32;\_parent:(84,12)=*(84,5),640,32;_pad:(84,10),672,96;\_yoffset:(0,8),768,16;;mmask_t:t(84,13)=(0,5)MEVENT:t(84,14)=(84,15)=s20id:(0,8),0,16;x:(0,1),32,32;\y:(0,1),64,32;z:(0,1),96,32;bstate:(84,13),128,32;;catchall_ERR:S(0,20)catchall_NULL:S(0,20)initialised:S(0,1)initialisedcolors:S(0,1)PyCursesCheckERR:f(43,10)code:p(0,1)fname:p(0,20)fname:r(0,20)buf:(0,21)=ar(0,1);0;99;(0,2)PyCurses_ConvertToChtype:F(0,1)obj:p(43,10)ch:p(84,9)obj:r(43,10)ch:r(84,9)PyCursesWindowObject:t(0,22)=(0,23)=s12ob_refcnt:(0,1),0,32;\ob_type:(43,2),32,32;win:(84,12),64,32;;PyCursesWindow_untouchwin:f(43,10)self:p(0,24)=*(0,22)arg:p(43,10)self:r(0,24)PyCursesWindow_touchwin:f(43,10)self:p(0,24)PyCursesWindow_redrawwin:f(43,10)PyCursesWindow_winsertln:f(43,10)PyCursesWindow_werase:f(43,10)PyCursesWindow_wdeleteln:f(43,10)PyCursesWindow_is_wintouched:f(43,10)PyCursesWindow_wsyncup:f(43,10)PyCursesWindow_wsyncdown:f(43,10)PyCursesWindow_wstandend:f(43,10)PyCursesWindow_wstandout:f(43,10)PyCursesWindow_wcursyncup:f(43,10)PyCursesWindow_wclrtoeol:f(43,10)PyCursesWindow_wclrtobot:f(43,10)PyCursesWindow_wclear:f(43,10)PyCursesWindow_idcok:f(43,10)arg1:(0,1)PyCursesWindow_immedok:f(43,10)PyCursesWindow_getyx:f(43,10)arg1:r(0,1)arg2:r(0,1)PyCursesWindow_getbegyx:f(43,10)PyCursesWindow_getmaxyx:f(43,10)PyCursesWindow_getparyx:f(43,10)PyCursesWindow_wattron:f(43,10)arg1:(84,7)PyCursesWindow_wattroff:f(43,10)PyCursesWindow_wattrset:f(43,10)PyCursesWindow_clearok:f(43,10)PyCursesWindow_idlok:f(43,10)PyCursesWindow_keypad:f(43,10)PyCursesWindow_leaveok:f(43,10)PyCursesWindow_nodelay:f(43,10)PyCursesWindow_notimeout:f(43,10)PyCursesWindow_scrollok:f(43,10)PyCursesWindow_winsdelln:f(43,10)PyCursesWindow_syncok:f(43,10)PyCursesWindow_mvwin:f(43,10)arg2:(0,1)PyCursesWindow_mvderwin:f(43,10)PyCursesWindow_wmove:f(43,10)PyCursesWindow_wresize:f(43,10)PyCursesWindow_New:f(43,10)win:p(84,12)win:r(84,12)wo:r(0,24)PyCursesWindow_Dealloc:f(0,19)wo:p(0,24)PyCursesWindow_AddCh:f(43,10)arg:r(43,10)rtn:r(0,1)x:(0,1)y:(0,1)use_xy:r(0,1)temp:(43,10)ch:(84,1)attr:(84,7)PyCursesWindow_AddStr:f(43,10)str:(0,20)attr_old:(84,7)use_attr:r(0,1)PyCursesWindow_AddNStr:f(43,10)n:(0,1)PyCursesWindow_Bkgd:f(43,10)bkgd:(84,1)PyCursesWindow_BkgdSet:f(43,10)PyCursesWindow_Border:f(43,10)args:p(43,10)ls:(84,1)rs:(84,1)ts:(84,1)bs:(84,1)tl:(84,1)tr:(84,1)bl:(84,1)br:(84,1)PyCursesWindow_Box:f(43,10)ch1:(84,1)ch2:(84,1)PyCursesWindow_DelCh:f(43,10)PyCursesWindow_DerWin:f(43,10)nlines:(0,1)ncols:(0,1)begin_y:(0,1)begin_x:(0,1)PyCursesWindow_EchoChar:f(43,10)PyCursesWindow_GetBkgd:f(43,10)PyCursesWindow_GetCh:f(43,10)rtn:r(84,1)PyCursesWindow_GetKey:f(43,10)PyCursesWindow_GetStr:f(43,10)rtn:(0,25)=ar(0,1);0;1023;(0,2)rtn2:r(0,1)PyCursesWindow_Hline:f(43,10)args:r(43,10)code:r(0,1)PyCursesWindow_InsCh:f(43,10)PyCursesWindow_InCh:f(43,10)PyCursesWindow_InStr:f(43,10)rtn:(0,26)=ar(0,1);0;1023;(0,2)PyCursesWindow_InsStr:f(43,10)PyCursesWindow_InsNStr:f(43,10)PyCursesWindow_Is_LineTouched:f(43,10)line:(0,1)erg:r(0,1)PyCursesWindow_NoOutRefresh:f(43,10)pminrow:(0,1)pmincol:(0,1)sminrow:(0,1)smincol:(0,1)smaxrow:(0,1)smaxcol:(0,1)PyCursesWindow_PutWin:f(43,10)PyCursesWindow_RedrawLine:f(43,10)beg:(0,1)num:(0,1)PyCursesWindow_Refresh:f(43,10)PyCursesWindow_SetScrollRegion:f(43,10)PyCursesWindow_SubWin:f(43,10)PyCursesWindow_Scroll:f(43,10)lines:(0,1)PyCursesWindow_TouchLine:f(43,10)st:(0,1)cnt:(0,1)val:(0,1)PyCursesWindow_Vline:f(43,10)PyCursesWindow_Methods:S(0,27)=ar(0,1);0;-1;(64,4)PyCursesWindow_GetAttr:f(43,10)name:p(0,20)PyCursesWindow_Type:G(43,81)PyCurses_beep:f(43,10)self:p(43,10)PyCurses_def_prog_mode:f(43,10)PyCurses_def_shell_mode:f(43,10)PyCurses_doupdate:f(43,10)PyCurses_endwin:f(43,10)PyCurses_flash:f(43,10)PyCurses_nocbreak:f(43,10)PyCurses_noecho:f(43,10)PyCurses_nonl:f(43,10)PyCurses_noraw:f(43,10)PyCurses_reset_prog_mode:f(43,10)PyCurses_reset_shell_mode:f(43,10)PyCurses_resetty:f(43,10)PyCurses_savetty:f(43,10)PyCurses_resizeterm:f(43,10)PyCurses_cbreak:f(43,10)flag:(0,1)PyCurses_echo:f(43,10)PyCurses_nl:f(43,10)PyCurses_raw:f(43,10)PyCurses_baudrate:f(43,10)PyCurses_termattrs:f(43,10)PyCurses_termname:f(43,10)PyCurses_longname:f(43,10)PyCurses_can_change_color:f(43,10)PyCurses_has_colors:f(43,10)PyCurses_has_ic:f(43,10)PyCurses_has_il:f(43,10)PyCurses_isendwin:f(43,10)PyCurses_filter:f(43,10)PyCurses_flushinp:f(43,10)PyCurses_noqiflush:f(43,10)PyCurses_Color_Content:f(43,10)color:(0,8)r:(0,8)g:(0,8)b:(0,8)PyCurses_COLOR_PAIR:f(43,10)PyCurses_Curs_Set:f(43,10)vis:(0,1)PyCurses_Delay_Output:f(43,10)ms:(0,1)PyCurses_EraseChar:f(43,10)ch:(0,2)PyCurses_getsyx:f(43,10)x:r(0,1)y:r(0,1)PyCurses_GetWin:f(43,10)PyCurses_HalfDelay:f(43,10)tenths:(0,11)PyCurses_has_key:f(43,10)ch:(0,1)PyCurses_Init_Color:f(43,10)PyCurses_Init_Pair:f(43,10)pair:(0,8)f:(0,8)PyCurses_InitScr:f(43,10)lines:r(43,10)cols:r(43,10)PyCurses_IntrFlush:f(43,10)PyCurses_KeyName:f(43,10)knp:r(0,28)=*(0,2)PyCurses_KillChar:f(43,10)PyCurses_Meta:f(43,10)PyCurses_NewPad:f(43,10)PyCurses_NewWindow:f(43,10)PyCurses_Pair_Content:f(43,10)PyCurses_PAIR_NUMBER:f(43,10)PyCurses_Putp:f(43,10)PyCurses_QiFlush:f(43,10)PyCurses_setsyx:f(43,10)PyCurses_Start_Color:f(43,10)c:r(43,10)cp:r(43,10)PyCurses_UnCtrl:f(43,10)ch:r(84,1)PyCurses_UngetCh:f(43,10)PyCurses_Use_Env:f(43,10)PyCurses_methods:S(0,29)=ar(0,1);0;-1;(64,4)initcurses:F(0,19)m:r(43,10)d:(43,10)v:r(43,10)key:(0,1)key_n:r(0,20)key_n2:r(0,20)p1:r(0,20)p2:r(0,20)PyCursesError:S(43,10)ModDict:S(43,10)GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)01.0101.0101.0101.0101.01.symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_d.gnu.version_r.rel.text.rel.data.rel.got.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.bss.stab.stabstr.comment.note.rel.stab””´! HH€ )ČČ×1˙˙˙o  P>ý˙˙ođđ8Mţ˙˙o(( \ HH(2 f pJpJ0p  R R(y ČRČR¨ ‚pVpV/ˆ V V`^^ M“ Ť Ť™ŔŤŔŤŸ Ą`Ń`Áź §ÚĘą Ú Ę¸(Ú(Ęż0Ú0ĘôÄ$Ü$ĚŔÍäÜäĚ ŇäĚs Řř?ĘNáŽ1ę1ódđ ˜,–€WúʚÂ <ą t€Œ˜¤@Ü œä,tźL”Ü$l´üDŒÔ@Ź$œŒřdĐ< ¨ !€!ě!X"Ä"0#œ#$Œ$%|%&x&X(D*<,h- .´/˜0ˆ1ä2(4 45˜68ź9œ;Œ<ô=ŕ?ŘAŕB DŔDhE”FxdM VČdB m eH …Te@ ”e@ ´Ôe@ Éf@ ßTf@ ö”f@ Ôf@ &g@ >Tg@ W”g@ mÔgG ‚hH šdhG ŻŹhH Ćôh! Ůi& đ@iP j› ,lž 2ěmĚ F¸nĎ ]ˆoŹ s4pz †°pŠ ›\qÔ ą0rđ É s+ ŕLs¨ őôsž ´tl ! vs 6”w\ Kđx¤ _”yl t{› Šœ|ž Ą\~r żĐ~Ú ŰŹh ń€G \€Ý "<H A„‚ W‚’ mœ‚ż †\ƒw ›”Ń€˛Ԅ Éě„H ×4…F î|…H ąF  †H (T†F 7œ†H Iä†F Y,‡H gt‡F vź‡H ˆF ŠLˆH ş”ˆF Ë܈` ß<‰ť ďř‰ż ý¸Šż x‹ż  8ŒA ( |ŒH ; ČA M A _ La y °]  Ž]  pŽ] ­ Ў] ż 0F Ď xL á ďF ô Ä А  `‘˜ 1 ř‘ G ˆ’L Z Ԓ~ j T“ z ؓ•  p”m ž ŕ”Ä ˛ ¤•ľ Ĺ \–ă Ö ÝŢ @—’ ń ԗ[  0˜4  d˜ " ™g 2 l™í E \šÍ [ ,›Ł p Л: ~ œ˘  °œ˝ Ÿ pĚ ´ <žŽ Ä Ěž– Ő dŸ” 㠌֐÷ a  5# g. p4 C şM (U ˇb <k 9y $Üń˙‚ 7Œ đ– Ľ SŹ  Ťń˙ł žŔ Î t"ď ^ű   ' N. ľ8 F ĽM ] Şf n x . —‰ î“ ˘ 6ą ż <Ć Ő ¨Ü Ąă ń ZE </))$~4pV :!QřŸD  \Xe€Ńu2"‡•I•Úœd˘)ł ş˘"Ý~îúe… Y!“")'Ů1/8NB_[ [ Ölox|~…‘Ł!Ťż)ĆŇSÜěőB˙ B”$Ö+äÜń˙7˛?[EVů\údl%rĄƒ˘‘J—%œ1ŽTł`şÇÜę€ń+úű Œ Ť š)0!DKĆR_jpsţ{7ƒ‘˜Ś"°ĽšĆń˙ÓßäÜń˙ć0Úń˙üĘ" Ýń˙?[!â)m/-6;B'LNU3]/fFoVxNÜ—žJ§sŻľsÂFĐjÚNá đ"initfini.cgcc2_compiled.crtstuff.cp.2__DTOR_LIST__completed.3__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.8frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__cursesmodule.ccatchall_ERRcatchall_NULLinitialisedinitialisedcolorsPyCursesCheckERRPyCursesErrorPyCursesWindow_untouchwinPyCursesWindow_touchwinPyCursesWindow_redrawwinPyCursesWindow_winsertlnPyCursesWindow_werasePyCursesWindow_wdeletelnPyCursesWindow_is_wintouchedPyCursesWindow_wsyncupPyCursesWindow_wsyncdownPyCursesWindow_wstandendPyCursesWindow_wstandoutPyCursesWindow_wcursyncupPyCursesWindow_wclrtoeolPyCursesWindow_wclrtobotPyCursesWindow_wclearPyCursesWindow_idcokPyCursesWindow_immedokPyCursesWindow_getyxPyCursesWindow_getbegyxPyCursesWindow_getmaxyxPyCursesWindow_getparyxPyCursesWindow_wattronPyCursesWindow_wattroffPyCursesWindow_wattrsetPyCursesWindow_clearokPyCursesWindow_idlokPyCursesWindow_keypadPyCursesWindow_leaveokPyCursesWindow_nodelayPyCursesWindow_notimeoutPyCursesWindow_scrollokPyCursesWindow_winsdellnPyCursesWindow_syncokPyCursesWindow_mvwinPyCursesWindow_mvderwinPyCursesWindow_wmovePyCursesWindow_wresizePyCursesWindow_NewPyCursesWindow_DeallocPyCursesWindow_AddChPyCursesWindow_AddStrPyCursesWindow_AddNStrPyCursesWindow_BkgdPyCursesWindow_BkgdSetPyCursesWindow_BorderPyCursesWindow_BoxPyCursesWindow_DelChPyCursesWindow_DerWinPyCursesWindow_EchoCharPyCursesWindow_GetBkgdPyCursesWindow_GetChPyCursesWindow_GetKeyPyCursesWindow_GetStrPyCursesWindow_HlinePyCursesWindow_InsChPyCursesWindow_InChPyCursesWindow_InStrPyCursesWindow_InsStrPyCursesWindow_InsNStrPyCursesWindow_Is_LineTouchedPyCursesWindow_NoOutRefreshPyCursesWindow_PutWinPyCursesWindow_RedrawLinePyCursesWindow_RefreshPyCursesWindow_SetScrollRegionPyCursesWindow_SubWinPyCursesWindow_ScrollPyCursesWindow_TouchLinePyCursesWindow_VlinePyCursesWindow_MethodsPyCursesWindow_GetAttrPyCurses_beepPyCurses_def_prog_modePyCurses_def_shell_modePyCurses_doupdatePyCurses_endwinPyCurses_flashPyCurses_nocbreakPyCurses_noechoPyCurses_nonlPyCurses_norawPyCurses_reset_prog_modePyCurses_reset_shell_modePyCurses_resettyPyCurses_savettyPyCurses_resizetermPyCurses_cbreakPyCurses_echoPyCurses_nlPyCurses_rawPyCurses_baudratePyCurses_termattrsPyCurses_termnamePyCurses_longnamePyCurses_can_change_colorPyCurses_has_colorsPyCurses_has_icPyCurses_has_ilPyCurses_isendwinPyCurses_filterPyCurses_flushinpPyCurses_noqiflushPyCurses_Color_ContentPyCurses_COLOR_PAIRPyCurses_Curs_SetPyCurses_Delay_OutputPyCurses_EraseCharPyCurses_getsyxPyCurses_GetWinPyCurses_HalfDelayPyCurses_has_keyPyCurses_Init_ColorPyCurses_Init_PairPyCurses_InitScrModDictPyCurses_IntrFlushPyCurses_KeyNamePyCurses_KillCharPyCurses_MetaPyCurses_NewPadPyCurses_NewWindowPyCurses_Pair_ContentPyCurses_PAIR_NUMBERPyCurses_PutpPyCurses_QiFlushPyCurses_setsyxPyCurses_Start_ColorPyCurses_UnCtrlPyCurses_UngetChPyCurses_Use_EnvPyCurses_methodshas_colorsPyInt_FromLongatexit@@GLIBC_2.0init_colorwscrl_Py_TrueStructtermattrshas_keydelay_outputtermnameis_wintouched_DYNAMICnoqiflushwsyncdown_Py_NoneStructderwin_etextpnoutrefreshPyString_Type__register_frame_info@@GLIBC_2.0start_coloruse_env_Py_ZeroStructPyDict_SetItemStringendwinwredrawlnPy_BuildValuewdelchPyErr_SetStringdoupdateclearokinit_pairwattr_onkeynamewechocharPyErr_Occurredis_linetouchedPy_FindMethodsubpadPy_InitModule4weraseputwin_PyObject_Newdef_shell_modewcursyncupsubwinerasecharnlechoreset_prog_mode_init___brk_addr@@GLIBC_2.0initcursesnocbreakPyCursesVersionmalloc@@GLIBC_2.0winnstridcoknewpadidlokcan_change_colorunctrl__deregister_frame_info@@GLIBC_2.0reset_shell_modeCOLOR_PAIRSwrefreshcbreakgetwinresettywaddnstrnonlwclrtobotkeypadwinsdellnPyCurses_ConvertToChtypePyCursesWindow_TypewgetnstrmvwinfilterPyErr_ClearPyString_AsStringsavettyPyString_FromStringnoechoPyFile_TypeintrflushPyExc_TypeErrorscrollokhalfdelayresizetermnewwinstrncmp@@GLIBC_2.0waddch__bss_startinitscrflashPyModule_GetDictwbkgdungetchimmedokwinchPyTuple_Typerawcolor_contentwmoveputpstrcat@@GLIBC_2.0metahas_icPyTuple_Size__environ@@GLIBC_2.0Py_FatalErrordelwinisendwinacs_mapwinsnstrwinsch_finileaveokcurs_setwgetch__curbrk@@GLIBC_2.0COLORSwhlinewnoutrefreshPyInt_TypeflushinpwresizeqiflushPyString_SizestdscrPyFile_AsFilenotimeoutwtouchlnPyInt_AsLongGCC.INTERNALPyArg_Parse_edata_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endwsetscrregbeepwsyncupnorawwclearCOLSnewscrwattr_offbaudratenodelaykillcharmvderwinwbkgdsetlongnamePyType_TypewclrtoeolsyncokprefreshwborderLINESpair_contentdef_prog_modepechocharhas_il__gmon_start__strcpy@@GLIBC_2.0jack-3.1.1+cvs20050801/cursesmodule/Makefile0000644000175000017500000003760610371403403016342 0ustar tbmtbm# Generated automatically from Makefile.pre by makesetup. # Generated automatically from Makefile.pre.in by sedscript. # Universal Unix Makefile for Python extensions # ============================================= # Short Instructions # ------------------ # 1. Build and install Python (1.4 or newer). # 2. "make -f Makefile.pre.in boot" # 3. "make" # You should now have a shared library. # Long Instructions # ----------------- # Build *and install* the basic Python 1.4 distribution. See the # Python README for instructions. # Create a file Setup.in for your extension. This file follows the # format of the Modules/Setup.in file; see the instructions there. # For a simple module called "spam" on file "spammodule.c", it can # contain a single line: # spam spammodule.c # You can build as many modules as you want in the same directory -- # just have a separate line for each of them in the Setup.in file. # If you want to build your extension as a shared library, insert a # line containing just the string # *shared* # at the top of your Setup.in file. # Note that the build process copies Setup.in to Setup, and then works # with Setup. It doesn't overwrite Setup when Setup.in is changed, so # while you're in the process of debugging your Setup.in file, you may # want to edit Setup instead, and copy it back to Setup.in later. # (All this is done so you can distribute your extension easily and # someone else can select the modules they actually want to build by # commenting out lines in the Setup file, without editing the # original. Editing Setup is also used to specify nonstandard # locations for include or library files.) # Copy this file (Misc/Makefile.pre.in) to the directory containing # your extension. # Run "make -f Makefile.pre.in boot". This creates Makefile # (producing Makefile.pre and sedscript as intermediate files) and # config.c, incorporating the values for sys.prefix, sys.exec_prefix # and sys.version from the installed Python binary. For this to work, # the python binary must be on your path. If this fails, try # make -f Makefile.pre.in Makefile VERSION=1.4 installdir= # where is the prefix used to install Python for installdir # (and possibly similar for exec_installdir=). # If you are building your extension as a shared library (your # Setup.in file starts with *shared*), run "make" or "make sharedmods" # to build the shared library files. If you are building a statically # linked Python binary (the only solution of your platform doesn't # support shared libraries, and sometimes handy if you want to # distribute or install the resulting Python binary), run "make # python". # Note: Each time you edit Makefile.pre.in or Setup, you must run # "make Makefile" before running "make". # Hint: if you want to use VPATH, you can start in an empty # subdirectory and say (e.g.): # make -f ../Makefile.pre.in boot srcdir=.. VPATH=.. # === Bootstrap variables (edited through "make boot") === # The prefix used by "make inclinstall libainstall" of core python installdir= /usr/local # The exec_prefix used by the same exec_installdir=/usr/local # Source directory and VPATH in case you want to use VPATH. # (You will have to edit these two lines yourself -- there is no # automatic support as the Makefile is not generated by # config.status.) srcdir= . VPATH= . # === Variables that you may want to customize (rarely) === # (Static) build target TARGET= python # Add more -I and -D options here CFLAGS= $(OPT) -I$(INCLUDEPY) -I$(LIBPL) $(DEFS) # These two variables can be set in Setup to merge extensions. # See example[23]. BASELIB= BASESETUP= # === Variables set by makesetup === MODOBJS= regexmodule.o regexpr.o pcremodule.o pypcre.o posixmodule.o signalmodule.o readline.o arraymodule.o cmathmodule.o mathmodule.o stropmodule.o structmodule.o timemodule.o operator.o _localemodule.o fcntlmodule.o pwdmodule.o grpmodule.o selectmodule.o socketmodule.o errnomodule.o termios.o resource.o md5module.o md5c.o shamodule.o _tkinter.o tkappinit.o rotormodule.o cursesmodule.o newmodule.o gdbmmodule.o binascii.o parsermodule.o cStringIO.o cPickle.o zlibmodule.o MODLIBS= $(LOCALMODLIBS) $(BASEMODLIBS) # === Definitions added by makesetup === LOCALMODLIBS= -lreadline -ltermcap -ltk8.0 -ltcl8.0 -L/usr/X11R6/lib -lX11 -lncurses -ltermcap -L/usr/local/lib -lgdbm -L$(exec_prefix)/lib -lz BASEMODLIBS= -lreadline -ltermcap -ltk8.0 -ltcl8.0 -L/usr/X11R6/lib -lX11 -L/usr/local/lib -lgdbm -L$(exec_prefix)/lib -lz TKPATH=:lib-tk GLHACK=-Dclear=__GLclear PYTHONPATH=$(COREPYTHONPATH) COREPYTHONPATH=$(DESTPATH)$(SITEPATH)$(TESTPATH)$(MACHDEPPATH)$(STDWINPATH)$(TKPATH) MACHDEPPATH=:plat-$(MACHDEP) TESTPATH= SITEPATH= DESTPATH= MACHDESTLIB=$(BINLIBDEST) DESTLIB=$(LIBDEST) TKPATH=:lib-tk GLHACK=-Dclear=__GLclear PYTHONPATH=$(COREPYTHONPATH) COREPYTHONPATH=$(DESTPATH)$(SITEPATH)$(TESTPATH)$(MACHDEPPATH)$(STDWINPATH)$(TKPATH) MACHDEPPATH=:plat-$(MACHDEP) TESTPATH= SITEPATH= DESTPATH= MACHDESTLIB=$(BINLIBDEST) DESTLIB=$(LIBDEST) # === Variables from configure (through sedscript) === VERSION= 1.5 CC= gcc OPT= -g -O2 LDFLAGS= DEFS= -DHAVE_CONFIG_H LIBS= -lieee -ldl -lpthread LIBM= -lm LIBC= RANLIB= ranlib MACHDEP= linux2 SO= .so LDSHARED= gcc -shared CCSHARED= -fpic LINKFORSHARED= -Xlinker -export-dynamic # Install prefix for architecture-independent files prefix= /usr/local # Install prefix for architecture-dependent files exec_prefix= ${prefix} # === Fixed definitions === # Shell used by make (some versions default to the login shell, which is bad) SHELL= /bin/sh # Expanded directories BINDIR= $(exec_installdir)/bin LIBDIR= $(exec_prefix)/lib MANDIR= $(installdir)/man INCLUDEDIR= $(installdir)/include SCRIPTDIR= $(prefix)/lib # Detailed destination directories BINLIBDEST= $(LIBDIR)/python$(VERSION) LIBDEST= $(SCRIPTDIR)/python$(VERSION) INCLUDEPY= $(INCLUDEDIR)/python$(VERSION) LIBP= $(exec_installdir)/lib/python$(VERSION) LIBPL= $(LIBP)/config PYTHONLIBS= $(LIBPL)/libModules.a \ $(LIBPL)/libPython.a \ $(LIBPL)/libObjects.a \ $(LIBPL)/libParser.a MAKESETUP= $(LIBPL)/makesetup MAKEFILE= $(LIBPL)/Makefile CONFIGC= $(LIBPL)/config.c CONFIGCIN= $(LIBPL)/config.c.in SETUP= $(LIBPL)/Setup SYSLIBS= $(LIBM) $(LIBC) ADDOBJS= $(LIBPL)/main.o getpath.o config.o # === Fixed rules === # Default target. This builds shared libraries only default: sharedmods # Build everything all: static sharedmods # Build shared libraries from our extension modules sharedmods: $(SHAREDMODS) # Build a static Python binary containing our extension modules static: $(TARGET) $(TARGET): $(ADDOBJS) lib.a $(PYTHONLIBS) Makefile $(BASELIB) $(CC) $(LDFLAGS) $(ADDOBJS) lib.a $(PYTHONLIBS) \ $(LINKPATH) $(BASELIB) $(MODLIBS) $(LIBS) $(SYSLIBS) \ -o $(TARGET) # Build the library containing our extension modules lib.a: $(MODOBJS) -rm -f lib.a ar cr lib.a $(MODOBJS) -$(RANLIB) lib.a || \ echo "don't worry if ranlib fails -- probably SYSV or equiv" # This runs makesetup *twice* to use the BASESETUP definition from Setup config.c Makefile: Makefile.pre Setup $(BASESETUP) $(MAKESETUP) $(MAKESETUP) \ -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) $(MAKE) -f Makefile do-it-again # Internal target to run makesetup for the second time do-it-again: $(MAKESETUP) \ -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) # Make config.o from the config.c created by makesetup config.o: config.c $(CC) $(CFLAGS) -c config.c # Make our own private getpath.o from the installed source and our PYTHONPATH getpath.o: $(LIBPL)/getpath.c Makefile $(CC) $(CFLAGS) -DPYTHONPATH=\"$(PYTHONPATH)\" -c $(LIBPL)/getpath.c # Setup is copied from Setup.in *only* if it doesn't yet exist Setup: cp $(srcdir)/Setup.in Setup # Make the intermediate Makefile.pre from Makefile.pre.in Makefile.pre: Makefile.pre.in sedscript sed -f sedscript $(srcdir)/Makefile.pre.in >Makefile.pre # Shortcuts to make the sed arguments on one line P=prefix E=exec_prefix H=Generated automatically from Makefile.pre.in by sedscript. L=LINKFORSHARED # Make the sed script used to create Makefile.pre from Makefile.pre.in sedscript: $(MAKEFILE) sed -n \ -e '1s/.*/1i\\/p' \ -e '2s%.*%# $H%p' \ -e '/^VERSION=/s/^VERSION=[ ]*\(.*\)/s%@VERSION[@]%\1%/p' \ -e '/^CC=/s/^CC=[ ]*\(.*\)/s%@CC[@]%\1%/p' \ -e '/^OPT=/s/^OPT=[ ]*\(.*\)/s%@OPT[@]%\1%/p' \ -e '/^LDFLAGS=/s/^LDFLAGS=[ ]*\(.*\)/s%@LDFLAGS[@]%\1%/p' \ -e '/^DEFS=/s/^DEFS=[ ]*\(.*\)/s%@DEFS[@]%\1%/p' \ -e '/^LIBS=/s/^LIBS=[ ]*\(.*\)/s%@LIBS[@]%\1%/p' \ -e '/^LIBM=/s/^LIBM=[ ]*\(.*\)/s%@LIBM[@]%\1%/p' \ -e '/^LIBC=/s/^LIBC=[ ]*\(.*\)/s%@LIBC[@]%\1%/p' \ -e '/^RANLIB=/s/^RANLIB=[ ]*\(.*\)/s%@RANLIB[@]%\1%/p' \ -e '/^MACHDEP=/s/^MACHDEP=[ ]*\(.*\)/s%@MACHDEP[@]%\1%/p' \ -e '/^SO=/s/^SO=[ ]*\(.*\)/s%@SO[@]%\1%/p' \ -e '/^LDSHARED=/s/^LDSHARED=[ ]*\(.*\)/s%@LDSHARED[@]%\1%/p' \ -e '/^CCSHARED=/s/^CCSHARED=[ ]*\(.*\)/s%@CCSHARED[@]%\1%/p' \ -e '/^$L=/s/^$L=[ ]*\(.*\)/s%@$L[@]%\1%/p' \ -e '/^$P=/s/^$P=\(.*\)/s%^$P=.*%$P=\1%/p' \ -e '/^$E=/s/^$E=\(.*\)/s%^$E=.*%$E=\1%/p' \ $(MAKEFILE) >sedscript echo "/^installdir=/s%=.*%= $(installdir)%" >>sedscript echo "/^exec_installdir=/s%=.*%=$(exec_installdir)%" >>sedscript echo "/^srcdir=/s%=.*%= $(srcdir)%" >>sedscript echo "/^VPATH=/s%=.*%= $(VPATH)%" >>sedscript echo "/^LINKPATH=/s%=.*%= $(LINKPATH)%" >>sedscript echo "/^BASELIB=/s%=.*%= $(BASELIB)%" >>sedscript echo "/^BASESETUP=/s%=.*%= $(BASESETUP)%" >>sedscript # Bootstrap target boot: clobber VERSION=`python -c "import sys; print sys.version[:3]"`; \ installdir=`python -c "import sys; print sys.prefix"`; \ exec_installdir=`python -c "import sys; print sys.exec_prefix"`; \ $(MAKE) -f $(srcdir)/Makefile.pre.in VPATH=$(VPATH) srcdir=$(srcdir) \ VERSION=$$VERSION \ installdir=$$installdir \ exec_installdir=$$exec_installdir \ Makefile # Handy target to remove intermediate files and backups clean: -rm -f *.o *~ # Handy target to remove everything that is easily regenerated clobber: clean -rm -f *.a tags TAGS config.c Makefile.pre python sedscript -rm -f *.so *.sl so_locations # Handy target to remove everything you don't want to distribute distclean: clobber -rm -f Makefile Setup # Rules appended by makedepend regexmodule.o: $(srcdir)/regexmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/regexmodule.c regexpr.o: $(srcdir)/regexpr.c; $(CC) $(CFLAGS) -c $(srcdir)/regexpr.c regexmodule$(SO): regexmodule.o regexpr.o; $(LDSHARED) regexmodule.o regexpr.o -o regexmodule$(SO) pcremodule.o: $(srcdir)/pcremodule.c; $(CC) $(CFLAGS) -c $(srcdir)/pcremodule.c pypcre.o: $(srcdir)/pypcre.c; $(CC) $(CFLAGS) -c $(srcdir)/pypcre.c pcre$(SO): pcremodule.o pypcre.o; $(LDSHARED) pcremodule.o pypcre.o -o pcre$(SO) posixmodule.o: $(srcdir)/posixmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/posixmodule.c posixmodule$(SO): posixmodule.o; $(LDSHARED) posixmodule.o -o posixmodule$(SO) signalmodule.o: $(srcdir)/signalmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/signalmodule.c signalmodule$(SO): signalmodule.o; $(LDSHARED) signalmodule.o -o signalmodule$(SO) readline.o: $(srcdir)/readline.c; $(CC) $(CFLAGS) -c $(srcdir)/readline.c readline$(SO): readline.o; $(LDSHARED) readline.o -lreadline -ltermcap -o readline$(SO) arraymodule.o: $(srcdir)/arraymodule.c; $(CC) $(CFLAGS) -c $(srcdir)/arraymodule.c arraymodule$(SO): arraymodule.o; $(LDSHARED) arraymodule.o -o arraymodule$(SO) cmathmodule.o: $(srcdir)/cmathmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/cmathmodule.c cmathmodule$(SO): cmathmodule.o; $(LDSHARED) cmathmodule.o -o cmathmodule$(SO) mathmodule.o: $(srcdir)/mathmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/mathmodule.c mathmodule$(SO): mathmodule.o; $(LDSHARED) mathmodule.o -o mathmodule$(SO) stropmodule.o: $(srcdir)/stropmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/stropmodule.c stropmodule$(SO): stropmodule.o; $(LDSHARED) stropmodule.o -o stropmodule$(SO) structmodule.o: $(srcdir)/structmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/structmodule.c structmodule$(SO): structmodule.o; $(LDSHARED) structmodule.o -o structmodule$(SO) timemodule.o: $(srcdir)/timemodule.c; $(CC) $(CFLAGS) -c $(srcdir)/timemodule.c timemodule$(SO): timemodule.o; $(LDSHARED) timemodule.o -o timemodule$(SO) operator.o: $(srcdir)/operator.c; $(CC) $(CFLAGS) -c $(srcdir)/operator.c operator$(SO): operator.o; $(LDSHARED) operator.o -o operator$(SO) _localemodule.o: $(srcdir)/_localemodule.c; $(CC) $(CFLAGS) -c $(srcdir)/_localemodule.c _localemodule$(SO): _localemodule.o; $(LDSHARED) _localemodule.o -o _localemodule$(SO) fcntlmodule.o: $(srcdir)/fcntlmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/fcntlmodule.c fcntlmodule$(SO): fcntlmodule.o; $(LDSHARED) fcntlmodule.o -o fcntlmodule$(SO) pwdmodule.o: $(srcdir)/pwdmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/pwdmodule.c pwdmodule$(SO): pwdmodule.o; $(LDSHARED) pwdmodule.o -o pwdmodule$(SO) grpmodule.o: $(srcdir)/grpmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/grpmodule.c grpmodule$(SO): grpmodule.o; $(LDSHARED) grpmodule.o -o grpmodule$(SO) selectmodule.o: $(srcdir)/selectmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/selectmodule.c selectmodule$(SO): selectmodule.o; $(LDSHARED) selectmodule.o -o selectmodule$(SO) socketmodule.o: $(srcdir)/socketmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/socketmodule.c socketmodule$(SO): socketmodule.o; $(LDSHARED) socketmodule.o -o socketmodule$(SO) errnomodule.o: $(srcdir)/errnomodule.c; $(CC) $(CFLAGS) -c $(srcdir)/errnomodule.c errnomodule$(SO): errnomodule.o; $(LDSHARED) errnomodule.o -o errnomodule$(SO) termios.o: $(srcdir)/termios.c; $(CC) $(CFLAGS) -c $(srcdir)/termios.c termios$(SO): termios.o; $(LDSHARED) termios.o -o termios$(SO) resource.o: $(srcdir)/resource.c; $(CC) $(CFLAGS) -c $(srcdir)/resource.c resource$(SO): resource.o; $(LDSHARED) resource.o -o resource$(SO) md5module.o: $(srcdir)/md5module.c; $(CC) $(CFLAGS) -c $(srcdir)/md5module.c md5c.o: $(srcdir)/md5c.c; $(CC) $(CFLAGS) -c $(srcdir)/md5c.c md5module$(SO): md5module.o md5c.o; $(LDSHARED) md5module.o md5c.o -o md5module$(SO) shamodule.o: $(srcdir)/shamodule.c; $(CC) $(CFLAGS) -c $(srcdir)/shamodule.c shamodule$(SO): shamodule.o; $(LDSHARED) shamodule.o -o shamodule$(SO) _tkinter.o: $(srcdir)/_tkinter.c; $(CC) -DWITH_APPINIT $(CFLAGS) -c $(srcdir)/_tkinter.c tkappinit.o: $(srcdir)/tkappinit.c; $(CC) -DWITH_APPINIT $(CFLAGS) -c $(srcdir)/tkappinit.c _tkinter$(SO): _tkinter.o tkappinit.o; $(LDSHARED) _tkinter.o tkappinit.o -ltk8.0 -ltcl8.0 -L/usr/X11R6/lib -lX11 -o _tkinter$(SO) rotormodule.o: $(srcdir)/rotormodule.c; $(CC) $(CFLAGS) -c $(srcdir)/rotormodule.c rotormodule$(SO): rotormodule.o; $(LDSHARED) rotormodule.o -o rotormodule$(SO) cursesmodule.o: $(srcdir)/cursesmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/cursesmodule.c cursesmodule$(SO): cursesmodule.o; $(LDSHARED) cursesmodule.o -lncurses -ltermcap -o cursesmodule$(SO) newmodule.o: $(srcdir)/newmodule.c; $(CC) $(CFLAGS) -c $(srcdir)/newmodule.c newmodule$(SO): newmodule.o; $(LDSHARED) newmodule.o -o newmodule$(SO) gdbmmodule.o: $(srcdir)/gdbmmodule.c; $(CC) -I/usr/local/include $(CFLAGS) -c $(srcdir)/gdbmmodule.c gdbmmodule$(SO): gdbmmodule.o; $(LDSHARED) gdbmmodule.o -L/usr/local/lib -lgdbm -o gdbmmodule$(SO) binascii.o: $(srcdir)/binascii.c; $(CC) $(CFLAGS) -c $(srcdir)/binascii.c binascii$(SO): binascii.o; $(LDSHARED) binascii.o -o binascii$(SO) parsermodule.o: $(srcdir)/parsermodule.c; $(CC) $(CFLAGS) -c $(srcdir)/parsermodule.c parsermodule$(SO): parsermodule.o; $(LDSHARED) parsermodule.o -o parsermodule$(SO) cStringIO.o: $(srcdir)/cStringIO.c; $(CC) $(CFLAGS) -c $(srcdir)/cStringIO.c cStringIO$(SO): cStringIO.o; $(LDSHARED) cStringIO.o -o cStringIO$(SO) cPickle.o: $(srcdir)/cPickle.c; $(CC) $(CFLAGS) -c $(srcdir)/cPickle.c cPickle$(SO): cPickle.o; $(LDSHARED) cPickle.o -o cPickle$(SO) zlibmodule.o: $(srcdir)/zlibmodule.c; $(CC) -I$(prefix)/include $(CFLAGS) -c $(srcdir)/zlibmodule.c zlibmodule$(SO): zlibmodule.o; $(LDSHARED) zlibmodule.o -L$(exec_prefix)/lib -lz -o zlibmodule$(SO) jack-3.1.1+cvs20050801/cursesmodule/Makefile.pre0000644000175000017500000002145710371403403017124 0ustar tbmtbm# Generated automatically from Makefile.pre.in by sedscript. # Universal Unix Makefile for Python extensions # ============================================= # Short Instructions # ------------------ # 1. Build and install Python (1.4 or newer). # 2. "make -f Makefile.pre.in boot" # 3. "make" # You should now have a shared library. # Long Instructions # ----------------- # Build *and install* the basic Python 1.4 distribution. See the # Python README for instructions. # Create a file Setup.in for your extension. This file follows the # format of the Modules/Setup.in file; see the instructions there. # For a simple module called "spam" on file "spammodule.c", it can # contain a single line: # spam spammodule.c # You can build as many modules as you want in the same directory -- # just have a separate line for each of them in the Setup.in file. # If you want to build your extension as a shared library, insert a # line containing just the string # *shared* # at the top of your Setup.in file. # Note that the build process copies Setup.in to Setup, and then works # with Setup. It doesn't overwrite Setup when Setup.in is changed, so # while you're in the process of debugging your Setup.in file, you may # want to edit Setup instead, and copy it back to Setup.in later. # (All this is done so you can distribute your extension easily and # someone else can select the modules they actually want to build by # commenting out lines in the Setup file, without editing the # original. Editing Setup is also used to specify nonstandard # locations for include or library files.) # Copy this file (Misc/Makefile.pre.in) to the directory containing # your extension. # Run "make -f Makefile.pre.in boot". This creates Makefile # (producing Makefile.pre and sedscript as intermediate files) and # config.c, incorporating the values for sys.prefix, sys.exec_prefix # and sys.version from the installed Python binary. For this to work, # the python binary must be on your path. If this fails, try # make -f Makefile.pre.in Makefile VERSION=1.4 installdir= # where is the prefix used to install Python for installdir # (and possibly similar for exec_installdir=). # If you are building your extension as a shared library (your # Setup.in file starts with *shared*), run "make" or "make sharedmods" # to build the shared library files. If you are building a statically # linked Python binary (the only solution of your platform doesn't # support shared libraries, and sometimes handy if you want to # distribute or install the resulting Python binary), run "make # python". # Note: Each time you edit Makefile.pre.in or Setup, you must run # "make Makefile" before running "make". # Hint: if you want to use VPATH, you can start in an empty # subdirectory and say (e.g.): # make -f ../Makefile.pre.in boot srcdir=.. VPATH=.. # === Bootstrap variables (edited through "make boot") === # The prefix used by "make inclinstall libainstall" of core python installdir= /usr/local # The exec_prefix used by the same exec_installdir=/usr/local # Source directory and VPATH in case you want to use VPATH. # (You will have to edit these two lines yourself -- there is no # automatic support as the Makefile is not generated by # config.status.) srcdir= . VPATH= . # === Variables that you may want to customize (rarely) === # (Static) build target TARGET= python # Add more -I and -D options here CFLAGS= $(OPT) -I$(INCLUDEPY) -I$(LIBPL) $(DEFS) # These two variables can be set in Setup to merge extensions. # See example[23]. BASELIB= BASESETUP= # === Variables set by makesetup === MODOBJS= _MODOBJS_ MODLIBS= _MODLIBS_ # === Definitions added by makesetup === # === Variables from configure (through sedscript) === VERSION= 1.5 CC= gcc OPT= -g -O2 LDFLAGS= DEFS= -DHAVE_CONFIG_H LIBS= -lieee -ldl -lpthread LIBM= -lm LIBC= RANLIB= ranlib MACHDEP= linux2 SO= .so LDSHARED= gcc -shared CCSHARED= -fpic LINKFORSHARED= -Xlinker -export-dynamic # Install prefix for architecture-independent files prefix= /usr/local # Install prefix for architecture-dependent files exec_prefix= ${prefix} # === Fixed definitions === # Shell used by make (some versions default to the login shell, which is bad) SHELL= /bin/sh # Expanded directories BINDIR= $(exec_installdir)/bin LIBDIR= $(exec_prefix)/lib MANDIR= $(installdir)/man INCLUDEDIR= $(installdir)/include SCRIPTDIR= $(prefix)/lib # Detailed destination directories BINLIBDEST= $(LIBDIR)/python$(VERSION) LIBDEST= $(SCRIPTDIR)/python$(VERSION) INCLUDEPY= $(INCLUDEDIR)/python$(VERSION) LIBP= $(exec_installdir)/lib/python$(VERSION) LIBPL= $(LIBP)/config PYTHONLIBS= $(LIBPL)/libModules.a \ $(LIBPL)/libPython.a \ $(LIBPL)/libObjects.a \ $(LIBPL)/libParser.a MAKESETUP= $(LIBPL)/makesetup MAKEFILE= $(LIBPL)/Makefile CONFIGC= $(LIBPL)/config.c CONFIGCIN= $(LIBPL)/config.c.in SETUP= $(LIBPL)/Setup SYSLIBS= $(LIBM) $(LIBC) ADDOBJS= $(LIBPL)/main.o getpath.o config.o # === Fixed rules === # Default target. This builds shared libraries only default: sharedmods # Build everything all: static sharedmods # Build shared libraries from our extension modules sharedmods: $(SHAREDMODS) # Build a static Python binary containing our extension modules static: $(TARGET) $(TARGET): $(ADDOBJS) lib.a $(PYTHONLIBS) Makefile $(BASELIB) $(CC) $(LDFLAGS) $(ADDOBJS) lib.a $(PYTHONLIBS) \ $(LINKPATH) $(BASELIB) $(MODLIBS) $(LIBS) $(SYSLIBS) \ -o $(TARGET) # Build the library containing our extension modules lib.a: $(MODOBJS) -rm -f lib.a ar cr lib.a $(MODOBJS) -$(RANLIB) lib.a || \ echo "don't worry if ranlib fails -- probably SYSV or equiv" # This runs makesetup *twice* to use the BASESETUP definition from Setup config.c Makefile: Makefile.pre Setup $(BASESETUP) $(MAKESETUP) $(MAKESETUP) \ -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) $(MAKE) -f Makefile do-it-again # Internal target to run makesetup for the second time do-it-again: $(MAKESETUP) \ -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) # Make config.o from the config.c created by makesetup config.o: config.c $(CC) $(CFLAGS) -c config.c # Make our own private getpath.o from the installed source and our PYTHONPATH getpath.o: $(LIBPL)/getpath.c Makefile $(CC) $(CFLAGS) -DPYTHONPATH=\"$(PYTHONPATH)\" -c $(LIBPL)/getpath.c # Setup is copied from Setup.in *only* if it doesn't yet exist Setup: cp $(srcdir)/Setup.in Setup # Make the intermediate Makefile.pre from Makefile.pre.in Makefile.pre: Makefile.pre.in sedscript sed -f sedscript $(srcdir)/Makefile.pre.in >Makefile.pre # Shortcuts to make the sed arguments on one line P=prefix E=exec_prefix H=Generated automatically from Makefile.pre.in by sedscript. L=LINKFORSHARED # Make the sed script used to create Makefile.pre from Makefile.pre.in sedscript: $(MAKEFILE) sed -n \ -e '1s/.*/1i\\/p' \ -e '2s%.*%# $H%p' \ -e '/^VERSION=/s/^VERSION=[ ]*\(.*\)/s%@VERSION[@]%\1%/p' \ -e '/^CC=/s/^CC=[ ]*\(.*\)/s%@CC[@]%\1%/p' \ -e '/^OPT=/s/^OPT=[ ]*\(.*\)/s%@OPT[@]%\1%/p' \ -e '/^LDFLAGS=/s/^LDFLAGS=[ ]*\(.*\)/s%@LDFLAGS[@]%\1%/p' \ -e '/^DEFS=/s/^DEFS=[ ]*\(.*\)/s%@DEFS[@]%\1%/p' \ -e '/^LIBS=/s/^LIBS=[ ]*\(.*\)/s%@LIBS[@]%\1%/p' \ -e '/^LIBM=/s/^LIBM=[ ]*\(.*\)/s%@LIBM[@]%\1%/p' \ -e '/^LIBC=/s/^LIBC=[ ]*\(.*\)/s%@LIBC[@]%\1%/p' \ -e '/^RANLIB=/s/^RANLIB=[ ]*\(.*\)/s%@RANLIB[@]%\1%/p' \ -e '/^MACHDEP=/s/^MACHDEP=[ ]*\(.*\)/s%@MACHDEP[@]%\1%/p' \ -e '/^SO=/s/^SO=[ ]*\(.*\)/s%@SO[@]%\1%/p' \ -e '/^LDSHARED=/s/^LDSHARED=[ ]*\(.*\)/s%@LDSHARED[@]%\1%/p' \ -e '/^CCSHARED=/s/^CCSHARED=[ ]*\(.*\)/s%@CCSHARED[@]%\1%/p' \ -e '/^$L=/s/^$L=[ ]*\(.*\)/s%@$L[@]%\1%/p' \ -e '/^$P=/s/^$P=\(.*\)/s%^$P=.*%$P=\1%/p' \ -e '/^$E=/s/^$E=\(.*\)/s%^$E=.*%$E=\1%/p' \ $(MAKEFILE) >sedscript echo "/^installdir=/s%=.*%= $(installdir)%" >>sedscript echo "/^exec_installdir=/s%=.*%=$(exec_installdir)%" >>sedscript echo "/^srcdir=/s%=.*%= $(srcdir)%" >>sedscript echo "/^VPATH=/s%=.*%= $(VPATH)%" >>sedscript echo "/^LINKPATH=/s%=.*%= $(LINKPATH)%" >>sedscript echo "/^BASELIB=/s%=.*%= $(BASELIB)%" >>sedscript echo "/^BASESETUP=/s%=.*%= $(BASESETUP)%" >>sedscript # Bootstrap target boot: clobber VERSION=`python -c "import sys; print sys.version[:3]"`; \ installdir=`python -c "import sys; print sys.prefix"`; \ exec_installdir=`python -c "import sys; print sys.exec_prefix"`; \ $(MAKE) -f $(srcdir)/Makefile.pre.in VPATH=$(VPATH) srcdir=$(srcdir) \ VERSION=$$VERSION \ installdir=$$installdir \ exec_installdir=$$exec_installdir \ Makefile # Handy target to remove intermediate files and backups clean: -rm -f *.o *~ # Handy target to remove everything that is easily regenerated clobber: clean -rm -f *.a tags TAGS config.c Makefile.pre python sedscript -rm -f *.so *.sl so_locations # Handy target to remove everything you don't want to distribute distclean: clobber -rm -f Makefile Setup jack-3.1.1+cvs20050801/cursesmodule/Makefile.pre.in0000644000175000017500000002136510371403403017527 0ustar tbmtbm# Universal Unix Makefile for Python extensions # ============================================= # Short Instructions # ------------------ # 1. Build and install Python (1.4 or newer). # 2. "make -f Makefile.pre.in boot" # 3. "make" # You should now have a shared library. # Long Instructions # ----------------- # Build *and install* the basic Python 1.4 distribution. See the # Python README for instructions. # Create a file Setup.in for your extension. This file follows the # format of the Modules/Setup.in file; see the instructions there. # For a simple module called "spam" on file "spammodule.c", it can # contain a single line: # spam spammodule.c # You can build as many modules as you want in the same directory -- # just have a separate line for each of them in the Setup.in file. # If you want to build your extension as a shared library, insert a # line containing just the string # *shared* # at the top of your Setup.in file. # Note that the build process copies Setup.in to Setup, and then works # with Setup. It doesn't overwrite Setup when Setup.in is changed, so # while you're in the process of debugging your Setup.in file, you may # want to edit Setup instead, and copy it back to Setup.in later. # (All this is done so you can distribute your extension easily and # someone else can select the modules they actually want to build by # commenting out lines in the Setup file, without editing the # original. Editing Setup is also used to specify nonstandard # locations for include or library files.) # Copy this file (Misc/Makefile.pre.in) to the directory containing # your extension. # Run "make -f Makefile.pre.in boot". This creates Makefile # (producing Makefile.pre and sedscript as intermediate files) and # config.c, incorporating the values for sys.prefix, sys.exec_prefix # and sys.version from the installed Python binary. For this to work, # the python binary must be on your path. If this fails, try # make -f Makefile.pre.in Makefile VERSION=1.4 installdir= # where is the prefix used to install Python for installdir # (and possibly similar for exec_installdir=). # If you are building your extension as a shared library (your # Setup.in file starts with *shared*), run "make" or "make sharedmods" # to build the shared library files. If you are building a statically # linked Python binary (the only solution of your platform doesn't # support shared libraries, and sometimes handy if you want to # distribute or install the resulting Python binary), run "make # python". # Note: Each time you edit Makefile.pre.in or Setup, you must run # "make Makefile" before running "make". # Hint: if you want to use VPATH, you can start in an empty # subdirectory and say (e.g.): # make -f ../Makefile.pre.in boot srcdir=.. VPATH=.. # === Bootstrap variables (edited through "make boot") === # The prefix used by "make inclinstall libainstall" of core python installdir= /usr/local # The exec_prefix used by the same exec_installdir=$(installdir) # Source directory and VPATH in case you want to use VPATH. # (You will have to edit these two lines yourself -- there is no # automatic support as the Makefile is not generated by # config.status.) srcdir= . VPATH= . # === Variables that you may want to customize (rarely) === # (Static) build target TARGET= python # Add more -I and -D options here CFLAGS= $(OPT) -I$(INCLUDEPY) -I$(LIBPL) $(DEFS) # These two variables can be set in Setup to merge extensions. # See example[23]. BASELIB= BASESETUP= # === Variables set by makesetup === MODOBJS= _MODOBJS_ MODLIBS= _MODLIBS_ # === Definitions added by makesetup === # === Variables from configure (through sedscript) === VERSION= @VERSION@ CC= @CC@ OPT= @OPT@ LDFLAGS= @LDFLAGS@ DEFS= @DEFS@ LIBS= @LIBS@ LIBM= @LIBM@ LIBC= @LIBC@ RANLIB= @RANLIB@ MACHDEP= @MACHDEP@ SO= @SO@ LDSHARED= @LDSHARED@ CCSHARED= @CCSHARED@ LINKFORSHARED= @LINKFORSHARED@ # Install prefix for architecture-independent files prefix= /usr/local # Install prefix for architecture-dependent files exec_prefix= $(prefix) # === Fixed definitions === # Shell used by make (some versions default to the login shell, which is bad) SHELL= /bin/sh # Expanded directories BINDIR= $(exec_installdir)/bin LIBDIR= $(exec_prefix)/lib MANDIR= $(installdir)/man INCLUDEDIR= $(installdir)/include SCRIPTDIR= $(prefix)/lib # Detailed destination directories BINLIBDEST= $(LIBDIR)/python$(VERSION) LIBDEST= $(SCRIPTDIR)/python$(VERSION) INCLUDEPY= $(INCLUDEDIR)/python$(VERSION) LIBP= $(exec_installdir)/lib/python$(VERSION) LIBPL= $(LIBP)/config PYTHONLIBS= $(LIBPL)/libModules.a \ $(LIBPL)/libPython.a \ $(LIBPL)/libObjects.a \ $(LIBPL)/libParser.a MAKESETUP= $(LIBPL)/makesetup MAKEFILE= $(LIBPL)/Makefile CONFIGC= $(LIBPL)/config.c CONFIGCIN= $(LIBPL)/config.c.in SETUP= $(LIBPL)/Setup SYSLIBS= $(LIBM) $(LIBC) ADDOBJS= $(LIBPL)/main.o getpath.o config.o # === Fixed rules === # Default target. This builds shared libraries only default: sharedmods # Build everything all: static sharedmods # Build shared libraries from our extension modules sharedmods: $(SHAREDMODS) # Build a static Python binary containing our extension modules static: $(TARGET) $(TARGET): $(ADDOBJS) lib.a $(PYTHONLIBS) Makefile $(BASELIB) $(CC) $(LDFLAGS) $(ADDOBJS) lib.a $(PYTHONLIBS) \ $(LINKPATH) $(BASELIB) $(MODLIBS) $(LIBS) $(SYSLIBS) \ -o $(TARGET) # Build the library containing our extension modules lib.a: $(MODOBJS) -rm -f lib.a ar cr lib.a $(MODOBJS) -$(RANLIB) lib.a || \ echo "don't worry if ranlib fails -- probably SYSV or equiv" # This runs makesetup *twice* to use the BASESETUP definition from Setup config.c Makefile: Makefile.pre Setup $(BASESETUP) $(MAKESETUP) $(MAKESETUP) \ -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) $(MAKE) -f Makefile do-it-again # Internal target to run makesetup for the second time do-it-again: $(MAKESETUP) \ -m Makefile.pre -c $(CONFIGCIN) Setup -n $(BASESETUP) $(SETUP) # Make config.o from the config.c created by makesetup config.o: config.c $(CC) $(CFLAGS) -c config.c # Make our own private getpath.o from the installed source and our PYTHONPATH getpath.o: $(LIBPL)/getpath.c Makefile $(CC) $(CFLAGS) -DPYTHONPATH=\"$(PYTHONPATH)\" -c $(LIBPL)/getpath.c # Setup is copied from Setup.in *only* if it doesn't yet exist Setup: cp $(srcdir)/Setup.in Setup # Make the intermediate Makefile.pre from Makefile.pre.in Makefile.pre: Makefile.pre.in sedscript sed -f sedscript $(srcdir)/Makefile.pre.in >Makefile.pre # Shortcuts to make the sed arguments on one line P=prefix E=exec_prefix H=Generated automatically from Makefile.pre.in by sedscript. L=LINKFORSHARED # Make the sed script used to create Makefile.pre from Makefile.pre.in sedscript: $(MAKEFILE) sed -n \ -e '1s/.*/1i\\/p' \ -e '2s%.*%# $H%p' \ -e '/^VERSION=/s/^VERSION=[ ]*\(.*\)/s%@VERSION[@]%\1%/p' \ -e '/^CC=/s/^CC=[ ]*\(.*\)/s%@CC[@]%\1%/p' \ -e '/^OPT=/s/^OPT=[ ]*\(.*\)/s%@OPT[@]%\1%/p' \ -e '/^LDFLAGS=/s/^LDFLAGS=[ ]*\(.*\)/s%@LDFLAGS[@]%\1%/p' \ -e '/^DEFS=/s/^DEFS=[ ]*\(.*\)/s%@DEFS[@]%\1%/p' \ -e '/^LIBS=/s/^LIBS=[ ]*\(.*\)/s%@LIBS[@]%\1%/p' \ -e '/^LIBM=/s/^LIBM=[ ]*\(.*\)/s%@LIBM[@]%\1%/p' \ -e '/^LIBC=/s/^LIBC=[ ]*\(.*\)/s%@LIBC[@]%\1%/p' \ -e '/^RANLIB=/s/^RANLIB=[ ]*\(.*\)/s%@RANLIB[@]%\1%/p' \ -e '/^MACHDEP=/s/^MACHDEP=[ ]*\(.*\)/s%@MACHDEP[@]%\1%/p' \ -e '/^SO=/s/^SO=[ ]*\(.*\)/s%@SO[@]%\1%/p' \ -e '/^LDSHARED=/s/^LDSHARED=[ ]*\(.*\)/s%@LDSHARED[@]%\1%/p' \ -e '/^CCSHARED=/s/^CCSHARED=[ ]*\(.*\)/s%@CCSHARED[@]%\1%/p' \ -e '/^$L=/s/^$L=[ ]*\(.*\)/s%@$L[@]%\1%/p' \ -e '/^$P=/s/^$P=\(.*\)/s%^$P=.*%$P=\1%/p' \ -e '/^$E=/s/^$E=\(.*\)/s%^$E=.*%$E=\1%/p' \ $(MAKEFILE) >sedscript echo "/^installdir=/s%=.*%= $(installdir)%" >>sedscript echo "/^exec_installdir=/s%=.*%=$(exec_installdir)%" >>sedscript echo "/^srcdir=/s%=.*%= $(srcdir)%" >>sedscript echo "/^VPATH=/s%=.*%= $(VPATH)%" >>sedscript echo "/^LINKPATH=/s%=.*%= $(LINKPATH)%" >>sedscript echo "/^BASELIB=/s%=.*%= $(BASELIB)%" >>sedscript echo "/^BASESETUP=/s%=.*%= $(BASESETUP)%" >>sedscript # Bootstrap target boot: clobber VERSION=`python -c "import sys; print sys.version[:3]"`; \ installdir=`python -c "import sys; print sys.prefix"`; \ exec_installdir=`python -c "import sys; print sys.exec_prefix"`; \ $(MAKE) -f $(srcdir)/Makefile.pre.in VPATH=$(VPATH) srcdir=$(srcdir) \ VERSION=$$VERSION \ installdir=$$installdir \ exec_installdir=$$exec_installdir \ Makefile # Handy target to remove intermediate files and backups clean: -rm -f *.o *~ # Handy target to remove everything that is easily regenerated clobber: clean -rm -f *.a tags TAGS config.c Makefile.pre python sedscript -rm -f *.so *.sl so_locations # Handy target to remove everything you don't want to distribute distclean: clobber -rm -f Makefile Setup jack-3.1.1+cvs20050801/cursesmodule/README.cursesmodule0000644000175000017500000004374010371403403020267 0ustar tbmtbm ********************** * Cursesmodule 1.4b1 * ********************** Please read the COPYRIGHT POLICY and the end of this document. 1. General remarks 1.1 New Features 1.2 TO DO Lists 2. List of Functions and Types 3. Installation 4. COPYRIGHT POLICY 5. Email addresses 1. General remarks ================== This is a heavily extended version of the cursesmodule 1.2 developed by Lance Ellinghaus. This is the first public beta release I release under my copyright. I like to thank Lance Ellinghaus and all the other people involved in the development of the previous module. I also like to thank Ulf Bartelt with whom I have been discussing the future development of this module during the last weeks and still do. (That was back in 1996. ;-) Now Andrew Kuchling has taken over his part. This modules was developed using ncurses 4.0, so I can more or less guarantee, that the module is fully functional with this implementations. Tested platforms at the moment: * Linux 2.0.28, ncurses 4.0, gcc 2.7.2.1, libc 5.3.12, python 1.4 (andrich@fga.de) * Linux 1.3.71, ncurses 1.9.8a, gcc 2.7.2, libc 5.2.18, python 1.3 (Oliver_Andrich@bammbamm.fido.de) * Linux 1.2.13, ncurses 1.9.8a, gcc 2.7.0, libc 5.0.9, python 1.3 (Oliver_Andrich@bammbamm.fido.de) I still think that this module is in beta stadium cause it has only been tested on Linux machines yet. The code is stable on these machines and there don't seem to exist severe memory leaks or so. (I can't make any statement about ncurses anyway. ;-) I would be very happy if anybody using it under an other platform successfully would drop me an email. And anybody, who had some problems with a different (n)curses version or something else, should send me an email with the description of the problem or with a patch, cause I like to provide a module that is widely usable. 1.1 New Features ================ 1.3b2 -> 1.4b1: ------------- * removed soft labels (no slk_functions anymore) 1.3b1 -> 1.3b2: --------------- * fixed a little bug in slk_init and slk_label * added argument bound checks => More sophisticated error messages and no wrong return values. No function simply returns "xyz() returns ERR" when simply an argument is instatiated with a wrong value. necessary: color_content, pair_content optional: (can be turned of via -DNO_BOUNDS_CHECK compile option) curs_set, halfdelay, init_color, init_pair, slk_init, slk_label, slk_set 1.2 -> 1.3b1: (Release Date 23.03.1996) ------------- * a lot more functions from the (n)curses are supported * full color support * soft labels * pads (There is only one WINDOW type left. No separate type for pads.) * flexible extension of all functions that add chars in one or another way. Now you can also use 1-element strings (= chars) as parameters without having to convert them with ord or so. * all necessary global variables of ncurses are exported * is fully functional with the panelmodule 1.1 * made the whole module type safe for future changes in the (n)curses lib * begining support for termcap and terminfo functions 1.2 TO DO Lists ============== Things that are not yet implemented include: * implement argument range checks for more sophisticated error messages when calling a method or function with an out of range parameter (high priority) * all addchstr functions, cause I haven't managed to develop a convenient way to represent attributed strings in Python yet. (high priority) * mouse support (high priority) * demo applications (the ncurses test programm especially) * the SCREEN stuff, cause it seems as I haven't understood yet, how to use it. (low priority) * curs_scr_dmp (very low priority) * support for curs_term{info|cap} functions (drop me an email if you need that) Things that will never be support are (never is a relative term :-): * menus and forms, cause I extended the module to have a stable basis for developing my own python/curses-based GUI. This thing will be done in conjunction with Ulf Bartelt who has heavily supported me during development of this module. * curs_printw and curs_scanw functions, cause I think that there is no need for them. May be curs_scanw functions will implemented, but that has a very low priority at the moment. 2. List of Functions and Types ============================== There is 1 basic type exported by this module: window - This is the basic type. This is equivalent to "WINDOW *". Most of the routines can be looked up using the curses man page. The relevant page from the ncurses package is mentioned after each function. But some of the return values may differ from the return values of the curses functions. But all the return values are listed below. Description of the various argument types bool: a standard Python Int with value 0 (False) or not 0 (True) ch: a standard Python 1-element string (for intuitive use of the methods) int: a attributed character (= a Python int) in order to get an "a" with a blink attribute you have to assign ord("a") | curses.A_BLINK to the parameter (more intuitive calls are also supported, look at addch("a", curses.A_BLINK). That means the same as addch(ord("a") | curses.A_BLINK). attr: a Python int representing attributes to get a blinking reversed attribute assign curses.A_BLINK | curses.A_REVERSE to the parameter y,x: Python ints representing coordinates str: a standard Python string Here is a list of the currently supported methods and attributes in the curses module: Return Value Func/Attr Description/Manpage -------------------------------------------------------------------------- IntObject baudrate() curs_termattrs None beep() curs_beep True/FalseObject can_change_colors() curs_color None cbreak() curs_inopts cbreak(bool) (r,g,b) color_content(int) curs_color returns the RGB values of the color int as a tuple of ints IntObject COLORS number of available colors (only available after start_color()) IntObject COLOR_PAIR(int) curs_color returns the value of the color pair int compiled from the values of for- and backgroundcolor IntObject COLOR_PAIRS number of available color pairs (only available aftert start_color()) IntObject curs_set(int) curs_kernel sets the cursor visibility to value int allowed values 0, 1 and 2 returns old value None def_prog_mode() curs_kernel None def_shell_mode() curs_kernel None doupdate() curs_refresh None echo() curs_inopts echo(bool) None endwin() curs_initscr StringObject erasechar() curs_termattrs None filter() curs_util None flash() curs_beep None flushinp() curs_util WindowObject getwin(fileobj) curs_util True/FalseObject has_colors() curs_color True/FalseObject has_ic() curs_termattrs True/FalseOBject has_il() curs_termattrs None halfdelay(int) curs_inopts None init_color(color, r, g, b) curs_color None init_pair(pair, fg, bg) curs_color WindowObject initscr() curs_initscr None intrflush(bool) curs_inopts True/FalseObject isendwin() curs_initscr StringObject keyname(int) curs_util return the text representation of a key_ value. None meta(bool) curs_inopts WindowObject newpad(lines, cols) curs_pad WindowObject newwin(lines,cols,y,x) curs_window newwin(lines,cols) curs_pad newwin/2 creates a pad, so that newwin behaves similar to newpad/2 None nl() curs_outopts nl(bool) None nocbreak() curs_inopts None noecho() curs_inopts None nonl() curs_outpots None noqiflush() curs_inopts None noraw() curs_inopts (fg, bg) pair_content(int) curs_color returns fore- and backgroundcolor of color pair int IntObject PAIR_NUMBER(int) curs_color returns the number of the colorpair with the value int None putp(str) curs_terminfo None qiflush() curs_inopts qiflush() None raw() curs_inopts raw(bool) None reset_prog_mode() curs_kernel None reset_shell_mode() curs_kernel None start_color() curs_color initializes color support IntObject termattrs() curs_termattrs StringObject termname() curs_termattrs StringObject unctrl(ch) curs_util unctrl(int) None ungetch(int) curs_getch Push the int back so next getch() will return it. ungetch(ch) Now also for chars. None use_env(bool) curs_util StringObject version A string representing the current version of this module. Here is a list of the currently supported methods and attributes in the WindowObject: Return Value Func/Attr Description/Manpage -------------------------------------------------------------------------- None addch(y,x,int,attr) curs_addch addch(y,x,ch,attr) addch(y,x,int) addch(y,x,ch) addch(int,attr) addch(ch,attr) addch(int) addch(ch) None addnstr(y,x,str,n,attr) curs_addstr addnstr(y,x,str,n) addnstr(str,n,attr) addnstr(str,n) None addstr(y,x,str,attr) curs_addstr addstr(y,x,str) addstr(str,attr) addstr(str) None attron(attr) curs_attr None attroff(attr) curs_attr None attrset(sttr) curs_attr None bkgd(int) curs_bkgd bkgd(ch) bkgd(int, attr) bkgd(ch, attr) None bkgdset(int) curs_bkgd bkgdset(ch) bkgdset(int, attr) bkgdset(ch, attr) None border(ls,rs,ts,bs,tl,tr,bl,br) curs_border (accepts 0-8 int args) None box(vertch,horch) curs_border vertch and horch are INTS box() None clear() curs_clear None clearok(bool) curs_outopts None clrtobot() curs_clear None clrtoeol() curs_clear None cursyncup() curs_window None delch(y,x) curs_delch delch() None deleteln() curs_deleteln WindowObject derwin(nlines,ncols,begin_y,begin_x) curs_window derwin(begin_y,begin_x) None echochar(ch,attr) curs_addch echochar(int,attr) echochar(ch) echochar(int) None erase() curs_clear (y,x) getbegyx() curs_ IntObject getbkgd() curs_bkgd IntObject getch(y,x) curs_getch getch() StringObject getkey(y,x) similar to getch, but returns a char getkey() or the keyname pressed (y,x) getmaxyx() curs_getyx (y,x) getparyx() curs_getyx StringObject getstr(y,x,n) curs_getstr getstr(y,x) getstr(n) n is an int, max chars read getstr() (y,x) getyx() curs_getyx None hline(y,x,ch,n,attr) curs_border hline(y,x,int,n,attr) hline(y,x,ch,n) hline(y,x,int,n) hline(ch,n,attr) hline(int,n,attr) hline(ch,n) hline(int,n) None idlok(bool) curs_outopts None idcok(bool) curs_outopts None immedok(bool) curs_outopts IntObject inch(y,x) curs_inch inch() None insch(y,x,ch,attr) curs_insch insch(y,x,int,attr) insch(y,x,ch) insch(y,x,int) insch(ch,attr) insch(int, attr) insch(ch) None insdelln(int) curs_deleteln None insertln() curs_deleteln None insnstr(y,x,str,n,attr) curs_insstr insnstr(y,x,str,n) insnstr(str,n,attr) insnstr(str,n) None insstr(y,x,str,attr) curs_insstr insstr(y,x,str) insstr(str,attr) insstr(str) StringObject instr(y,x,n) curs_instr instr(y,x) instr(n) instr() True/FalseObject is_linetouched(int) curs_touch int = line True/FalseObject is_winwouched() curs_touch None keypad(bool) curs_inopts None leaveok(bool) curs_outopts None move(new_y,new_x) curs_move Move Cursor None mvwin(new_y,new_x) curs_move Move Window None nodelay(bool) curs_inopts None noutrefresh() curs_refresh Mark for refresh but wait None notimeout(bool) curs_inopts None putwin(fileobject) curs_util None redrawln(beg, cnt) curs_refresh None redrawwin() curs_refresh None refresh() curs_refresh None scroll() curs_scroll scroll(lines) None scrollok(bool) curs_outopts None setscrreg(top,bottom) curs_outopts None standend() curs_attr None standout() curs_attr WindowObject subpad(nlines,ncols,begin_y,begin_x) curs_pad WindowObject subwin(nlines,ncols,begin_y,begin_x) curs_window None syncup() curs_window None syncdown() curs_window None syncok(bool) curs_window None touchline(start,count) curs_touch touchline(start, count, value) (= wtouchln) None touchwin() curs_touch None vline(y,x,ch,n,attr) curs_border vline(y,x,int,n,attr) vline(y,x,ch,n) vline(y,x,int,n) vline(ch,n,attr) vline(int,n,attr) vline(ch,n) vline(int,n) 3. Installation =============== - Specify -DNO_BOUNDS_CHECK on the compile command line, so that all unnecassary boundary checks are left out a) The easy way: If you have installed the Python source distribution, then replace the old cursesmodule.c with the new cursesmodule.c and recompile. b) If you haven't got a source distribution installed, at hand or don't like to recompile Python, then it depends how you link Python ... 1. static linking: get a source distribution and continue with step a). :-) 2. dynamic linking: use the Makefile coming along with that distribution, make the the relevant changes, type make and copy the result to a place where python can find the module. WARNING! The Makefile functions very well under Linux, I don't know if it functions under a another system. Please mail me the relevant changes. 4. COPYRIGHT POLICY =================== /* * This is a curses implementation for Python. * * Based on a prior work by Lance Ellinghaus * (version 1.2 of this module * Copyright 1994 by Lance Ellinghouse, * Cathedral City, California Republic, United States of America.) * Updated, fixed and heavily extended by Oliver Andrich * * Copyright 1996, 1997 by Oliver Andrich, * Koblenz, Germany * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this source file to use, copy, modify, merge, or publish it * subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or in any new file that contains a substantial portion of * this file. * * THE AUTHOR MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF * THE SOFTWARE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT * EXPRESS OR IMPLIED WARRANTY. THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NON-INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE * AUTHOR BE LIABLE TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE, STRICT LIABILITY OR * ANY OTHER ACTION ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ 5. Email addresses ================== andrich@fga.de (Oliver Andrich) jack-3.1.1+cvs20050801/cursesmodule/README.precompiled0000644000175000017500000000204310371403403020047 0ustar tbmtbmThis is Oliver Andrich's cursesmodule-1.5b2, slightly patched by Arne Zellentin so that it includes "termresize". Note: I renamed it to jack_cursesmodule so that it doesn't conflict with the original cursesmodule. I think it's a valid replacement but I've given up trying to get it into the python distribution. Note 2: The precompiled versions RedHat-6.0 and Debian-Potato do not reflect this change (yet) because I do not have access to such a system anymore. The module precompiled/RedHat-6.0/cursesmodule.so has been compiled on a RedHat 6.0 alike system on an i686 (glibc2); precompiled/Debian-Potato/cursemodule.so was done on a (you guessed it) Debian Potato System. precompiled/Debian-Woody/jack_cursemodule.so was done on Woody. If you run something else that is at least Linux/ix86, check if one of them works. Do that by running Python and entering from curses import * or from jack_curses import * in interactive mode. If it fails, you will be confronted with an error message which may be of help. Have fun! jack-3.1.1+cvs20050801/cursesmodule/Setup0000644000175000017500000003475110371403403015723 0ustar tbmtbm# -*- makefile -*- # The file Setup is used by the makesetup script to construct the files # Makefile and config.c, from Makefile.pre and config.c.in, # respectively. The file Setup itself is initially copied from # Setup.in; once it exists it will not be overwritten, so you can edit # Setup to your heart's content. Note that Makefile.pre is created # from Makefile.pre.in by the toplevel configure script. # (VPATH notes: Setup and Makefile.pre are in the build directory, as # are Makefile and config.c; the *.in files are in the source # directory.) # Each line in this file describes one or more optional modules. # Comment out lines to suppress modules. # Lines have the following structure: # # ... [ ...] [ ...] [ ...] # # is anything ending in .c (.C, .cc, .c++ are C++ files) # is anything starting with -I, -D, -U or -C # is anything ending in .a or beginning with -l or -L # is anything else but should be a valid Python # identifier (letters, digits, underscores, beginning with non-digit) # # (As the makesetup script changes, it may recognize some other # arguments as well, e.g. *.so and *.sl as libraries. See the big # case statement in the makesetup script.) # # Lines can also have the form # # = # # which defines a Make variable definition inserted into Makefile.in # # Finally, if a line contains just the word "*shared*" (without the # quotes but with the stars), then the following modules will not be # included in the config.c file, nor in the list of objects to be # added to the library archive, and their linker options won't be # added to the linker options, but rules to create their .o files and # their shared libraries will still be added to the Makefile, and # their names will be collected in the Make variable SHAREDMODS. This # is used to build modules as shared libraries. (They can be # installed using "make sharedinstall", which is implied by the # toplevel "make install" target.) (For compatibility, # *noconfig* has the same effect as *shared*.) # # In addition, *static* reverses this effect (negating a previous # *shared* line). # NOTE: As a standard policy, as many modules as can be supported by a # platform should be present. The distribution comes with all modules # enabled that are supported by most platforms and don't require you # to ftp sources from elsewhere. # Some special rules to define PYTHONPATH. # Edit the definitions below to indicate which options you are using. # Don't add any whitespace or comments! # Directories where library files get installed. # DESTLIB is for Python modules; MACHDESTLIB for shared libraries. DESTLIB=$(LIBDEST) MACHDESTLIB=$(BINLIBDEST) # NOTE: all the paths are now relative to the prefix that is computed # at run time! # Standard path -- don't edit. # No leading colon since this is the first entry. # Empty since this is now just the runtime prefix. DESTPATH= # Site specific path components -- should begin with : if non-empty SITEPATH= # Standard path components for test modules TESTPATH= # Path components for machine- or system-dependent modules and shared libraries MACHDEPPATH=:plat-$(MACHDEP) COREPYTHONPATH=$(DESTPATH)$(SITEPATH)$(TESTPATH)$(MACHDEPPATH)$(STDWINPATH)$(TKPATH) PYTHONPATH=$(COREPYTHONPATH) # The modules listed here can't be built as shared libraries for # various reasons; therefore they are listed here instead of in the # normal order. # Some modules that are normally always on: regex regexmodule.c regexpr.c # Regular expressions, GNU Emacs style pcre pcremodule.c pypcre.c # Regular expressions, Perl style (for re.py) posix posixmodule.c # posix (UNIX) system calls signal signalmodule.c # signal(2) # The SGI specific GL module: GLHACK=-Dclear=__GLclear #gl glmodule.c cgensupport.c -I$(srcdir) $(GLHACK) -lgl -lX11 # The thread module is now automatically enabled, see Setup.thread. # Pure module. Cannot be linked dynamically. # -DWITH_QUANTIFY, -DWITH_PURIFY, or -DWITH_ALL_PURE #WHICH_PURE_PRODUCTS=-DWITH_ALL_PURE #PURE_INCLS=-I/usr/local/include #PURE_STUBLIBS=-L/usr/local/lib -lpurify_stubs -lquantify_stubs #pure puremodule.c $(WHICH_PURE_PRODUCTS) $(PURE_INCLS) $(PURE_STUBLIBS) # Uncommenting the following line tells makesetup that all following # modules are to be built as shared libraries (see above for more # detail; also note that *static* reverses this effect): #*shared* # GNU readline. Unlike previous Python incarnations, GNU readline is # now incorporated in an optional module, configured in the Setup file # instead of by a configure script switch. You may have to insert a # -L option pointing to the directory where libreadline.* lives, # and you may have to change -ltermcap to -ltermlib or perhaps remove # it, depending on your system -- see the GNU readline instructions. # It's okay for this to be a shared library, too. readline readline.c -lreadline -ltermcap # Modules that should always be present (non UNIX dependent): array arraymodule.c # array objects cmath cmathmodule.c # -lm # complex math library functions math mathmodule.c # -lm # math library functions, e.g. sin() strop stropmodule.c # fast string operations implemented in C struct structmodule.c # binary structure packing/unpacking time timemodule.c # -lm # time operations and variables operator operator.c # operator.add() and similar goodies _locale _localemodule.c # access to ISO C locale support # Modules with some UNIX dependencies -- on by default: # (If you have a really backward UNIX, select and socket may not be # supported...) fcntl fcntlmodule.c # fcntl(2) and ioctl(2) pwd pwdmodule.c # pwd(3) grp grpmodule.c # grp(3) select selectmodule.c # select(2); not on ancient System V socket socketmodule.c # socket(2); not on ancient System V #_socket socketmodule.c # socket(2); use this one for BeOS sockets errno errnomodule.c # posix (UNIX) errno values # The crypt module is now disabled by default because it breaks builds # on many systems (where -lcrypt is needed), e.g. Linux (I believe). #crypt cryptmodule.c # -lcrypt # crypt(3); needs -lcrypt on some systems # Some more UNIX dependent modules -- off by default, since these # are not supported by all UNIX systems: #nis nismodule.c # Sun yellow pages -- not everywhere termios termios.c # Steen Lumholt's termios module resource resource.c # Jeremy Hylton's rlimit interface # Multimedia modules -- off by default. # These don't work for 64-bit platforms!!! # These represent audio samples or images as strings: #audioop audioop.c # Operations on audio samples #imageop imageop.c # Operations on images #rgbimg rgbimgmodule.c # Read SGI RGB image files (but coded portably) # The stdwin module provides a simple, portable (between X11 and Mac) # windowing interface. You need to ftp the STDWIN library, e.g. from # ftp://ftp.cwi.nl/pub/stdwin. (If you get it elsewhere, be sure to # get version 1.0 or higher!) The STDWIN variable must point to the # STDWIN toplevel directory. # Uncomment and edit as needed: #STDWIN=/ufs/guido/src/stdwin # Uncomment these lines: #STDWINPATH=:lib-stdwin #LIBTEXTEDIT=$(STDWIN)/$(MACHDEP)/Packs/textedit/libtextedit.a #LIBX11STDWIN=$(STDWIN)/$(MACHDEP)/Ports/x11/libstdwin.a #stdwin stdwinmodule.c -I$(STDWIN)/H $(LIBTEXTEDIT) $(LIBX11STDWIN) -lX11 # Use this instead of the last two lines above for alphanumeric stdwin: #LIBALFASTDWIN=$(STDWIN)/$(MACHDEP)/Ports/alfa/libstdwin.a #stdwin stdwinmodule.c -I$(STDWIN)/H $(LIBTEXTEDIT) $(LIBALFASTDWIN) -ltermcap # The md5 module implements the RSA Data Security, Inc. MD5 # Message-Digest Algorithm, described in RFC 1321. The necessary files # md5c.c and md5.h are included here. md5 md5module.c md5c.c # The sha module implements the SHA checksum algorithm. # (NIST's Secure Hash Algorithm.) sha shamodule.c # The mpz module interfaces to the GNU Multiple Precision library. # You need to ftp the GNU MP library. # The GMP variable must point to the GMP source directory. # This was originally written and tested against GMP 1.2 and 1.3.2. # It has been modified by Rob Hooft to work with 2.0.2 as well, but I # haven't tested it recently. # A compatible MP library unencombered by the GPL also exists. It was # posted to comp.sources.misc in volume 40 and is widely available from # FTP archive sites. One URL for it is: # ftp://gatekeeper.dec.com/.b/usenet/comp.sources.misc/volume40/fgmp/part01.Z #GMP=/ufs/guido/src/gmp #mpz mpzmodule.c -I$(GMP) $(GMP)/libgmp.a # SGI IRIX specific modules -- off by default. # These module work on any SGI machine: # *** gl must be enabled higher up in this file *** #fm fmmodule.c $(GLHACK) -lfm -lgl # Font Manager #sgi sgimodule.c # sgi.nap() and a few more # This module requires the header file # /usr/people/4Dgifts/iristools/include/izoom.h: #imgfile imgfile.c -limage -lgutil -lgl -lm # Image Processing Utilities # These modules require the Multimedia Development Option (I think): #al almodule.c -laudio # Audio Library #cd cdmodule.c -lcdaudio -lds -lmediad # CD Audio Library #cl clmodule.c -lcl -lawareaudio # Compression Library #sv svmodule.c yuvconvert.c -lsvideo -lXext -lX11 # Starter Video # The FORMS library, by Mark Overmars, implements user interface # components such as dialogs and buttons using SGI's GL and FM # libraries. You must ftp the FORMS library separately from # ftp://ftp.cs.ruu.nl/pub/SGI/FORMS. It was tested with FORMS 2.2a. # NOTE: if you want to be able to use FORMS and curses simultaneously # (or both link them statically into the same binary), you must # compile all of FORMS with the cc option "-Dclear=__GLclear". # The FORMS variable must point to the FORMS subdirectory of the forms # toplevel directory: #FORMS=/ufs/guido/src/forms/FORMS #fl flmodule.c -I$(FORMS) $(GLHACK) $(FORMS)/libforms.a -lfm -lgl # SunOS specific modules -- off by default: #sunaudiodev sunaudiodev.c # George Neville-Neil's timing module: #timing timingmodule.c # The _tkinter module. # # The TKPATH variable is always enabled, to save you the effort. TKPATH=:lib-tk # The command for _tkinter is long and site specific. Please # uncomment and/or edit those parts as indicated. If you don't have a # specific extension (e.g. Tix or BLT), leave the corresponding line # commented out. (Leave the trailing backslashes in! If you # experience strange errors, you may want to join all uncommented # lines and remove the backslashes -- the backslash interpretation is # done by the shell's "read" command and it may not be implemented on # every system. # *** Always uncomment this (leave the leading underscore in!): _tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \ # *** Uncomment and edit to reflect where your Tcl/Tk headers are: # -I/usr/local/include \ #-I/usr/include \ # *** Uncomment and edit to reflect where your X11 header files are: # -I/usr/X11R6/include \ # *** Or uncomment this for Solaris: # -I/usr/openwin/include \ # *** Uncomment and edit for Tix extension only: # -DWITH_TIX -ltix4.1.8.0 \ # *** Uncomment and edit for BLT extension only: # -DWITH_BLT -I/usr/local/blt/blt8.0-unoff/include -lBLT8.0 \ # *** Uncomment and edit for PIL (TkImaging) extension only: # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \ # *** Uncomment and edit for TOGL extension only: # -DWITH_TOGL togl.c \ # *** Uncomment and edit to reflect where your Tcl/Tk libraries are: # -L/usr/local/lib \ # *** Uncomment and edit to reflect your Tcl/Tk versions: -ltk8.0 -ltcl8.0 \ # *** Uncomment and edit to reflect where your X11 libraries are: -L/usr/X11R6/lib \ # *** Or uncomment this for Solaris: # -L/usr/openwin/lib \ # *** Uncomment these for TOGL extension only: # -lGL -lGLU -lXext -lXmu \ # *** Uncomment for AIX: # -lld \ # *** Always uncomment this; X11 libraries to link with: -lX11 # Lance Ellinghaus's modules: rotor rotormodule.c # enigma-inspired encryption #syslog syslogmodule.c # syslog daemon interface # Lance's curses module. This requires the System V version of # curses, sometimes known as ncurses (e.g. on Linux, link with # -lncurses instead of -lcurses; on SunOS 4.1.3, insert -I/usr/5include # -L/usr/5lib before -lcurses). curses cursesmodule.c -lncurses -ltermcap # Tommy Burnette's 'new' module (creates new empty objects of certain kinds): new newmodule.c # Generic (SunOS / SVR4) dynamic loading module. # This is not needed for dynamic loading of Python modules -- # it is a highly experimental and dangerous device for calling # *arbitrary* C functions in *arbitrary* shared libraries: #dl dlmodule.c # Modules that provide persistent dictionary-like semantics. You will # probably want to arrange for at least one of them to be available on # your machine, though none are defined by default because of library # dependencies. The Python module anydbm.py provides an # implementation independent wrapper for these; dumbdbm.py provides # similar functionality (but slower of course) implemented in Python. # The standard Unix dbm module: #dbm dbmmodule.c # dbm(3) may require -lndbm or similar # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm: gdbm gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm # Berkeley DB interface. # # This requires the Berkeley DB code, see # ftp://ftp.cs.berkeley.edu/pub/4bsd/db.1.85.tar.gz # # Edit the variables DB and DBPORT to point to the db top directory # and the subdirectory of PORT where you built it. # # (See http://www.jenkon-dev.com/~rd/python/ for an interface to # BSD DB 2.1.0.) #DB=/depot/sundry/src/berkeley-db/db.1.85 #DBPORT=$(DB)/PORT/irix.5.3 #bsddb bsddbmodule.c -I$(DBPORT)/include -I$(DBPORT) $(DBPORT)/libdb.a # David Wayne Williams' soundex module (obsolete -- this will disappear!) #soundex soundex.c # Helper module for various ascii-encoders binascii binascii.c # Fred Drake's interface to the Python parser parser parsermodule.c # Digital Creations' cStringIO and cPickle cStringIO cStringIO.c cPickle cPickle.c # Lee Busby's SIGFPE modules. # The library to link fpectl with is platform specific. # Choose *one* of the options below for fpectl: # For SGI IRIX (tested on 5.3): #fpectl fpectlmodule.c -lfpe # For Solaris with SunPro compiler (tested on Solaris 2.5 with SunPro C 4.2): # (Without the compiler you don't have -lsunmath.) #fpectl fpectlmodule.c -R/opt/SUNWspro/lib -lsunmath -lm # For other systems: see instructions in fpectlmodule.c. #fpectl fpectlmodule.c ... # Test module for fpectl. No extra libraries needed. #fpetest fpetestmodule.c # Andrew Kuchling's zlib module. # This require zlib 1.1.3 (or later). # See http://www.cdrom.com/pub/infozip/zlib/ zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz # Example -- included for reference only: # xx xxmodule.c jack-3.1.1+cvs20050801/cursesmodule/config.c0000644000175000017500000001252010371403403016277 0ustar tbmtbm/* Generated automatically from /usr/local/lib/python1.5/config/config.c.in by makesetup. */ /* -*- C -*- *********************************************** Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, The Netherlands. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the names of Stichting Mathematisch Centrum or CWI or Corporation for National Research Initiatives or CNRI not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. While CWI is the initial source for this software, a modified version is made available by the Corporation for National Research Initiatives (CNRI) at the Internet address ftp://ftp.python.org. STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ /* Module configuration */ /* !!! !!! !!! This file is edited by the makesetup script !!! !!! !!! */ /* This file contains the table of built-in modules. See init_builtin() in import.c. */ #include "Python.h" extern void initregex(); extern void initpcre(); extern void initposix(); extern void initsignal(); extern void initreadline(); extern void initarray(); extern void initcmath(); extern void initmath(); extern void initstrop(); extern void initstruct(); extern void inittime(); extern void initoperator(); extern void init_locale(); extern void initfcntl(); extern void initpwd(); extern void initgrp(); extern void initselect(); extern void initsocket(); extern void initerrno(); extern void inittermios(); extern void initresource(); extern void initmd5(); extern void initsha(); extern void init_tkinter(); extern void initrotor(); extern void initcurses(); extern void initnew(); extern void initgdbm(); extern void initbinascii(); extern void initparser(); extern void initcStringIO(); extern void initcPickle(); extern void initzlib(); extern void initregex(); extern void initpcre(); extern void initposix(); extern void initsignal(); extern void initreadline(); extern void initarray(); extern void initcmath(); extern void initmath(); extern void initstrop(); extern void initstruct(); extern void inittime(); extern void initoperator(); extern void init_locale(); extern void initfcntl(); extern void initpwd(); extern void initgrp(); extern void initselect(); extern void initsocket(); extern void initerrno(); extern void inittermios(); extern void initresource(); extern void initmd5(); extern void initsha(); extern void init_tkinter(); extern void initrotor(); extern void initnew(); extern void initgdbm(); extern void initbinascii(); extern void initparser(); extern void initcStringIO(); extern void initcPickle(); extern void initzlib(); /* -- ADDMODULE MARKER 1 -- */ extern void PyMarshal_Init(); extern void initimp(); struct _inittab _PyImport_Inittab[] = { {"regex", initregex}, {"pcre", initpcre}, {"posix", initposix}, {"signal", initsignal}, {"readline", initreadline}, {"array", initarray}, {"cmath", initcmath}, {"math", initmath}, {"strop", initstrop}, {"struct", initstruct}, {"time", inittime}, {"operator", initoperator}, {"_locale", init_locale}, {"fcntl", initfcntl}, {"pwd", initpwd}, {"grp", initgrp}, {"select", initselect}, {"socket", initsocket}, {"errno", initerrno}, {"termios", inittermios}, {"resource", initresource}, {"md5", initmd5}, {"sha", initsha}, {"_tkinter", init_tkinter}, {"rotor", initrotor}, {"curses", initcurses}, {"new", initnew}, {"gdbm", initgdbm}, {"binascii", initbinascii}, {"parser", initparser}, {"cStringIO", initcStringIO}, {"cPickle", initcPickle}, {"zlib", initzlib}, {"regex", initregex}, {"pcre", initpcre}, {"posix", initposix}, {"signal", initsignal}, {"readline", initreadline}, {"array", initarray}, {"cmath", initcmath}, {"math", initmath}, {"strop", initstrop}, {"struct", initstruct}, {"time", inittime}, {"operator", initoperator}, {"_locale", init_locale}, {"fcntl", initfcntl}, {"pwd", initpwd}, {"grp", initgrp}, {"select", initselect}, {"socket", initsocket}, {"errno", initerrno}, {"termios", inittermios}, {"resource", initresource}, {"md5", initmd5}, {"sha", initsha}, {"_tkinter", init_tkinter}, {"rotor", initrotor}, {"new", initnew}, {"gdbm", initgdbm}, {"binascii", initbinascii}, {"parser", initparser}, {"cStringIO", initcStringIO}, {"cPickle", initcPickle}, {"zlib", initzlib}, /* -- ADDMODULE MARKER 2 -- */ /* This module "lives in" with marshal.c */ {"marshal", PyMarshal_Init}, /* This lives it with import.c */ {"imp", initimp}, /* These entries are here for sys.builtin_module_names */ {"__main__", NULL}, {"__builtin__", NULL}, {"sys", NULL}, /* Sentinel */ {0, 0} }; jack-3.1.1+cvs20050801/cursesmodule/cursesmodule-1.5b2.patch0000644000175000017500000000265510371403403021156 0ustar tbmtbm*** x/cursesmodule/cursesmodule.c Wed Mar 24 21:39:59 1999 --- cursesmodule.c Thu Aug 19 01:22:27 1999 *************** *** 1395,1400 **** --- 1395,1411 ---- Py_INCREF(Py_None); \ return Py_None; } + #define TwoArgNoReturnFunction(X, TYPE, PARSESTR) \ + static PyObject * PyCurses_ ## X (self,arg) \ + PyObject * self; \ + PyObject * arg; \ + { \ + TYPE arg1, arg2; \ + PyCursesInitialised \ + if (!PyArg_Parse(arg,PARSESTR, &arg1, &arg2)) return NULL; \ + Py_INCREF(Py_None); \ + return PyCursesCheckERR(X(arg1, arg2), # X); } + NoArgNoReturnFunction(beep) NoArgNoReturnFunction(def_prog_mode) NoArgNoReturnFunction(def_shell_mode) *************** *** 1410,1415 **** --- 1421,1428 ---- NoArgNoReturnFunction(resetty) NoArgNoReturnFunction(savetty) + TwoArgNoReturnFunction(resizeterm, int, "(ii);y,x") + NoArgOrFlagNoReturnFunction(cbreak) NoArgOrFlagNoReturnFunction(echo) NoArgOrFlagNoReturnFunction(nl) *************** *** 2087,2092 **** --- 2100,2106 ---- {"raw", (PyCFunction)PyCurses_raw}, {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode}, {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode}, + {"resizeterm", (PyCFunction)PyCurses_resizeterm}, {"setsyx", (PyCFunction)PyCurses_setsyx}, {"start_color", (PyCFunction)PyCurses_Start_Color}, {"termattrs", (PyCFunction)PyCurses_termattrs}, jack-3.1.1+cvs20050801/cursesmodule/jack_cursesmodule.c0000644000175000017500000016600710371403403020546 0ustar tbmtbm/* * This is a curses implementation for Python. * * Based on a prior work by Lance Ellinghaus * (version 1.2 of this module * Copyright 1994 by Lance Ellinghouse, * Cathedral City, California Republic, United States of America.) * Updated, fixed and heavily extended by Oliver Andrich * * Copyright 1996,1997 by Oliver Andrich, * Koblenz, Germany * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this source file to use, copy, modify, merge, or publish it * subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or in any new file that contains a substantial portion of * this file. * * THE AUTHOR MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF * THE SOFTWARE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT * EXPRESS OR IMPLIED WARRANTY. THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NON-INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE * AUTHOR BE LIABLE TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE, STRICT LIABILITY OR * ANY OTHER ACTION ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /* CVS: $Id: jack_cursesmodule.c,v 1.2 2001/11/08 01:20:01 zarne Exp $ */ /* Release Number */ char *PyCursesVersion = "1.5b1"; /* Includes */ #include "Python.h" #include #ifdef __sgi__ /* No attr_t type is available */ typedef chtype attr_t; #endif /* Definition of exception curses.error */ static PyObject *PyCursesError; /* general error messages */ static char *catchall_ERR = "curses function returned ERR"; static char *catchall_NULL = "curses function returned NULL"; /* Tells whether initscr() has been called to initialise curses. */ static int initialised = FALSE; /* Tells whether start_color() has been called to initialise colorusage. */ static int initialisedcolors = FALSE; /* Utility Macros */ #define ARG_COUNT(X) \ (((X) == NULL) ? 0 : (PyTuple_Check(X) ? PyTuple_Size(X) : 1)) #define PyCursesInitialised \ if (initialised != TRUE) { \ PyErr_SetString(PyCursesError, \ "must call initscr() first"); \ return NULL; } #define PyCursesInitialisedColor \ if (initialisedcolors != TRUE) { \ PyErr_SetString(PyCursesError, \ "must call start_color() first"); \ return NULL; } /* Utility Functions */ /* * Check the return code from a curses function and return None * or raise an exception as appropriate. */ static PyObject * PyCursesCheckERR(code, fname) int code; char *fname; { char buf[100]; if (code != ERR) { Py_INCREF(Py_None); return Py_None; } else { if (fname == NULL) { PyErr_SetString(PyCursesError, catchall_ERR); } else { strcpy(buf, fname); strcat(buf, "() returned ERR"); PyErr_SetString(PyCursesError, buf); } return NULL; } } int PyCurses_ConvertToChtype(obj, ch) PyObject *obj; chtype *ch; { if (PyInt_Check(obj)) { *ch = (chtype) PyInt_AsLong(obj); } else if(PyString_Check(obj) & (PyString_Size(obj) == 1)) { *ch = (chtype) *PyString_AsString(obj); } else { return 0; } return 1; } /***************************************************************************** The Window Object ******************************************************************************/ /* Definition of the window object and window type */ typedef struct { PyObject_HEAD WINDOW *win; } PyCursesWindowObject; PyTypeObject PyCursesWindow_Type; #define PyCursesWindow_Check(v) ((v)->ob_type == &PyCursesWindow_Type) /* Function Prototype Macros - They are ugly but very, very useful. ;-) X - function name TYPE - parameter Type ERGSTR - format string for construction of the return value PARSESTR - format string for argument parsing */ #define Window_NoArgNoReturnFunction(X) \ static PyObject *PyCursesWindow_ ## X (self, arg) \ PyCursesWindowObject * self; PyObject * arg; \ { if (!PyArg_NoArgs(arg)) return NULL; \ return PyCursesCheckERR(X(self->win), # X); } #define Window_NoArgTrueFalseFunction(X) \ static PyObject * PyCursesWindow_ ## X (self,arg) \ PyCursesWindowObject * self; PyObject * arg; \ { \ if (!PyArg_NoArgs(arg)) return NULL; \ if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \ else { Py_INCREF(Py_True); return Py_True; } } #define Window_NoArgNoReturnVoidFunction(X) \ static PyObject * PyCursesWindow_ ## X (self,arg) \ PyCursesWindowObject * self; \ PyObject * arg; \ { \ if (!PyArg_NoArgs(arg)) return NULL; \ X(self->win); Py_INCREF(Py_None); return Py_None; } #define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \ static PyObject * PyCursesWindow_ ## X (self, arg) \ PyCursesWindowObject *self; \ PyObject * arg; \ { \ TYPE arg1, arg2; \ if (!PyArg_NoArgs(arg)) return NULL; \ X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); } #define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \ static PyObject * PyCursesWindow_ ## X (self, arg) \ PyCursesWindowObject *self; \ PyObject * arg; \ { \ TYPE arg1; \ if (!PyArg_Parse(arg, PARSESTR, &arg1)) return NULL; \ X(self->win,arg1); Py_INCREF(Py_None); return Py_None; } #define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \ static PyObject * PyCursesWindow_ ## X (self, arg) \ PyCursesWindowObject *self; \ PyObject * arg; \ { \ TYPE arg1; \ if (!PyArg_Parse(arg,PARSESTR, &arg1)) return NULL; \ return PyCursesCheckERR(X(self->win, arg1), # X); } #define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \ static PyObject * PyCursesWindow_ ## X (self, arg) \ PyCursesWindowObject *self; \ PyObject * arg; \ { \ TYPE arg1, arg2; \ if (!PyArg_Parse(arg,PARSESTR, &arg1, &arg2)) return NULL; \ return PyCursesCheckERR(X(self->win, arg1, arg2), # X); } /* ------------- WINDOW routines --------------- */ Window_NoArgNoReturnFunction(untouchwin) Window_NoArgNoReturnFunction(touchwin) Window_NoArgNoReturnFunction(redrawwin) Window_NoArgNoReturnFunction(winsertln) Window_NoArgNoReturnFunction(werase) Window_NoArgNoReturnFunction(wdeleteln) Window_NoArgTrueFalseFunction(is_wintouched) Window_NoArgNoReturnVoidFunction(wsyncup) Window_NoArgNoReturnVoidFunction(wsyncdown) Window_NoArgNoReturnVoidFunction(wstandend) Window_NoArgNoReturnVoidFunction(wstandout) Window_NoArgNoReturnVoidFunction(wcursyncup) Window_NoArgNoReturnVoidFunction(wclrtoeol) Window_NoArgNoReturnVoidFunction(wclrtobot) Window_NoArgNoReturnVoidFunction(wclear) Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)") Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)") Window_NoArg2TupleReturnFunction(getyx, int, "(ii)") Window_NoArg2TupleReturnFunction(getbegyx, int, "(ii)") Window_NoArg2TupleReturnFunction(getmaxyx, int, "(ii)") Window_NoArg2TupleReturnFunction(getparyx, int, "(ii)") Window_OneArgNoReturnFunction(wattron, attr_t, "l;attr") Window_OneArgNoReturnFunction(wattroff, attr_t, "l;attr") Window_OneArgNoReturnFunction(wattrset, attr_t, "l;attr") Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)") Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)") Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)") Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)") Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)") Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)") Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)") Window_OneArgNoReturnFunction(winsdelln, int, "i;cnt") Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)") Window_TwoArgNoReturnFunction(mvwin, int, "(ii);y,x") Window_TwoArgNoReturnFunction(mvderwin, int, "(ii);y,x") Window_TwoArgNoReturnFunction(wmove, int, "(ii);y,x") #ifndef __sgi__ Window_TwoArgNoReturnFunction(wresize, int, "(ii);lines,columns") #endif /* Allocation and Deallocation of Window Objects */ static PyObject * PyCursesWindow_New(win) WINDOW *win; { PyCursesWindowObject *wo; wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type); if (wo == NULL) return NULL; wo->win = win; return (PyObject *)wo; } static void PyCursesWindow_Dealloc(wo) PyCursesWindowObject *wo; { if (wo->win != stdscr) delwin(wo->win); PyMem_DEL(wo); } /* Addch, Addstr, Addnstr */ static PyObject * PyCursesWindow_AddCh(self,arg) PyCursesWindowObject *self; PyObject * arg; { int rtn, x, y, use_xy = FALSE; PyObject *temp; chtype ch = 0; attr_t attr = A_NORMAL; switch (ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg, "O;ch or int", &temp)) return NULL; break; case 2: if (!PyArg_Parse(arg, "(Ol);ch or int,attr", &temp, &attr)) return NULL; break; case 3: if (!PyArg_Parse(arg,"(iiO);y,x,ch or int", &y, &x, &temp)) return NULL; use_xy = TRUE; break; case 4: if (!PyArg_Parse(arg,"(iiOl);y,x,ch or int, attr", &y, &x, &temp, &attr)) return NULL; use_xy = TRUE; break; default: PyErr_SetString(PyExc_TypeError, "addch requires 1 or 4 arguments"); return NULL; } if (!PyCurses_ConvertToChtype(temp, &ch)) { PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int"); return NULL; } if (use_xy == TRUE) rtn = mvwaddch(self->win,y,x, ch | attr); else { rtn = waddch(self->win, ch | attr); } return PyCursesCheckERR(rtn, "addch"); } static PyObject * PyCursesWindow_AddStr(self,arg) PyCursesWindowObject *self; PyObject * arg; { int rtn; int x, y; char *str; attr_t attr = A_NORMAL , attr_old = A_NORMAL; int use_xy = FALSE, use_attr = FALSE; switch (ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg,"s;str", &str)) return NULL; break; case 2: if (!PyArg_Parse(arg,"(sl);str,attr", &str, &attr)) return NULL; use_attr = TRUE; break; case 3: if (!PyArg_Parse(arg,"(iis);int,int,str", &y, &x, &str)) return NULL; use_xy = TRUE; break; case 4: if (!PyArg_Parse(arg,"(iisl);int,int,str,attr", &y, &x, &str, &attr)) return NULL; use_xy = use_attr = TRUE; break; default: PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments"); return NULL; } if (use_attr == TRUE) { attr_old = getattrs(self->win); wattrset(self->win,attr); } if (use_xy == TRUE) rtn = mvwaddstr(self->win,y,x,str); else rtn = waddstr(self->win,str); if (use_attr == TRUE) wattrset(self->win,attr_old); return PyCursesCheckERR(rtn, "addstr"); } static PyObject * PyCursesWindow_AddNStr(self,arg) PyCursesWindowObject *self; PyObject * arg; { int rtn, x, y, n; char *str; attr_t attr = A_NORMAL , attr_old = A_NORMAL; int use_xy = FALSE, use_attr = FALSE; switch (ARG_COUNT(arg)) { case 2: if (!PyArg_Parse(arg,"(si);str,n", &str, &n)) return NULL; break; case 3: if (!PyArg_Parse(arg,"(sil);str,n,attr", &str, &n, &attr)) return NULL; use_attr = TRUE; break; case 4: if (!PyArg_Parse(arg,"(iisi);y,x,str,n", &y, &x, &str, &n)) return NULL; use_xy = TRUE; break; case 5: if (!PyArg_Parse(arg,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr)) return NULL; use_xy = use_attr = TRUE; break; default: PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments"); return NULL; } if (use_attr == TRUE) { attr_old = getattrs(self->win); wattrset(self->win,attr); } if (use_xy == TRUE) rtn = mvwaddnstr(self->win,y,x,str,n); else rtn = waddnstr(self->win,str,n); if (use_attr == TRUE) wattrset(self->win,attr_old); return PyCursesCheckERR(rtn, "addnstr"); } static PyObject * PyCursesWindow_Bkgd(self,arg) PyCursesWindowObject *self; PyObject * arg; { PyObject *temp; chtype bkgd; attr_t attr = A_NORMAL; switch (ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg, "O;ch or int", &temp)) return NULL; break; case 2: if (!PyArg_Parse(arg,"(Ol);ch or int,attr", &temp, &attr)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments"); return NULL; } if (!PyCurses_ConvertToChtype(temp, &bkgd)) { PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int"); return NULL; } return PyCursesCheckERR(wbkgd(self->win, bkgd | A_NORMAL), "bkgd"); } static PyObject * PyCursesWindow_BkgdSet(self,arg) PyCursesWindowObject *self; PyObject * arg; { PyObject *temp; chtype bkgd; attr_t attr = A_NORMAL; switch (ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg, "O;ch or int", &temp)) return NULL; break; case 2: if (!PyArg_Parse(arg,"(Ol);ch or int,attr", &temp, &attr)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments"); return NULL; } if (!PyCurses_ConvertToChtype(temp, &bkgd)) { PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int"); return NULL; } wbkgdset(self->win, bkgd | attr); return PyCursesCheckERR(0, "bkgdset"); } static PyObject * PyCursesWindow_Border(self, args) PyCursesWindowObject *self; PyObject *args; { chtype ls, rs, ts, bs, tl, tr, bl, br; ls = rs = ts = bs = tl = tr = bl = br = 0; if (!PyArg_Parse(args,"|llllllll;ls,rs,ts,bs,tl,tr,bl,br", &ls, &rs, &ts, &bs, &tl, &tr, &bl, &br)) return NULL; wborder(self->win, ls, rs, ts, bs, tl, tr, bl, br); Py_INCREF(Py_None); return Py_None; } static PyObject * PyCursesWindow_Box(self,arg) PyCursesWindowObject *self; PyObject * arg; { chtype ch1=0,ch2=0; if (!PyArg_NoArgs(arg)) { PyErr_Clear(); if (!PyArg_Parse(arg,"(ll);vertint,horint", &ch1, &ch2)) return NULL; } box(self->win,ch1,ch2); Py_INCREF(Py_None); return Py_None; } static PyObject * PyCursesWindow_DelCh(self,arg) PyCursesWindowObject *self; PyObject * arg; { int rtn; int x, y; switch (ARG_COUNT(arg)) { case 0: rtn = wdelch(self->win); break; case 2: if (!PyArg_Parse(arg,"(ii);y,x", &y, &x)) return NULL; rtn = mvwdelch(self->win,y,x); break; default: PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments"); return NULL; } return PyCursesCheckERR(rtn, "[mv]wdelch"); } static PyObject * PyCursesWindow_DerWin(self,arg) PyCursesWindowObject *self; PyObject * arg; { WINDOW *win; int nlines, ncols, begin_y, begin_x; nlines = 0; ncols = 0; switch (ARG_COUNT(arg)) { case 2: if (!PyArg_Parse(arg,"(ii);begin_y,begin_x",&begin_y,&begin_x)) return NULL; break; case 4: if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x", &nlines,&ncols,&begin_y,&begin_x)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments"); return NULL; } win = derwin(self->win,nlines,ncols,begin_y,begin_x); if (win == NULL) { PyErr_SetString(PyCursesError, catchall_NULL); return NULL; } return (PyObject *)PyCursesWindow_New(win); } static PyObject * PyCursesWindow_EchoChar(self,arg) PyCursesWindowObject *self; PyObject * arg; { PyObject *temp; chtype ch; attr_t attr = A_NORMAL; switch (ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg,"O;ch or int", &temp)) return NULL; break; case 2: if (!PyArg_Parse(arg,"(Ol);ch or int,attr", &temp, &attr)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments"); return NULL; } if (!PyCurses_ConvertToChtype(temp, &ch)) { PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int"); return NULL; } if (self->win->_flags & _ISPAD) return PyCursesCheckERR(pechochar(self->win, ch | attr), "echochar"); else return PyCursesCheckERR(wechochar(self->win, ch | attr), "echochar"); } static PyObject * PyCursesWindow_GetBkgd(self, arg) PyCursesWindowObject *self; PyObject *arg; { if (!PyArg_NoArgs(arg)) return NULL; return PyInt_FromLong((long) getbkgd(self->win)); } static PyObject * PyCursesWindow_GetCh(self,arg) PyCursesWindowObject *self; PyObject * arg; { int x, y; chtype rtn; switch (ARG_COUNT(arg)) { case 0: rtn = wgetch(self->win); break; case 2: if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) return NULL; rtn = mvwgetch(self->win,y,x); break; default: PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments"); return NULL; } return PyInt_FromLong(rtn); } static PyObject * PyCursesWindow_GetKey(self,arg) PyCursesWindowObject *self; PyObject * arg; { int x, y; chtype rtn; switch (ARG_COUNT(arg)) { case 0: rtn = wgetch(self->win); break; case 2: if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) return NULL; rtn = mvwgetch(self->win,y,x); break; default: PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments"); return NULL; } if (rtn<=255) return Py_BuildValue("c", rtn); else return PyString_FromString((char *)keyname(rtn)); } static PyObject * PyCursesWindow_GetStr(self,arg) PyCursesWindowObject *self; PyObject * arg; { int x, y, n; char rtn[1024]; /* This should be big enough.. I hope */ int rtn2; switch (ARG_COUNT(arg)) { case 0: rtn2 = wgetstr(self->win,rtn); break; case 1: if (!PyArg_Parse(arg,"i;n", &n)) return NULL; rtn2 = wgetnstr(self->win,rtn,n); break; case 2: if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) return NULL; rtn2 = mvwgetstr(self->win,y,x,rtn); break; case 3: if (!PyArg_Parse(arg,"(iii);y,x,n", &y, &x, &n)) return NULL; #ifdef __sgi__ /* Untested */ rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, n); #else rtn2 = mvwgetnstr(self->win, y, x, rtn, n); #endif break; default: PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 2 arguments"); return NULL; } if (rtn2 == ERR) rtn[0] = 0; return PyString_FromString(rtn); } static PyObject * PyCursesWindow_Hline(self, args) PyCursesWindowObject *self; PyObject *args; { PyObject *temp; chtype ch; int n, x, y, code = OK; attr_t attr = A_NORMAL; switch (ARG_COUNT(args)) { case 2: if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n)) return NULL; break; case 3: if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr)) return NULL; break; case 4: if (!PyArg_Parse(args, "(iiOi);y,x,ch o int,n", &y, &x, &temp, &n)) return NULL; code = wmove(self->win, y, x); break; case 5: if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr", &y, &x, &temp, &n, &attr)) return NULL; code = wmove(self->win, y, x); default: PyErr_SetString(PyExc_TypeError, "hline requires 2 or 5 arguments"); return NULL; } if (code != ERR) { if (!PyCurses_ConvertToChtype(temp, &ch)) { PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int"); return NULL; } return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline"); } else return PyCursesCheckERR(code, "wmove"); } static PyObject * PyCursesWindow_InsCh(self,arg) PyCursesWindowObject *self; PyObject * arg; { int rtn, x, y, use_xy = FALSE; PyObject *temp; chtype ch = 0; attr_t attr = A_NORMAL; switch (ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg, "O;ch or int", &temp)) return NULL; break; case 2: if (!PyArg_Parse(arg, "(Ol);ch or int,attr", &temp, &attr)) return NULL; break; case 3: if (!PyArg_Parse(arg,"(iiO);y,x,ch or int", &y, &x, &temp)) return NULL; use_xy = TRUE; break; case 4: if (!PyArg_Parse(arg,"(iiOl);y,x,ch or int, attr", &y, &x, &temp, &attr)) return NULL; use_xy = TRUE; break; default: PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments"); return NULL; } if (!PyCurses_ConvertToChtype(temp, &ch)) { PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int"); return NULL; } if (use_xy == TRUE) rtn = mvwinsch(self->win,y,x, ch | attr); else { rtn = winsch(self->win, ch | attr); } return PyCursesCheckERR(rtn, "insch"); } static PyObject * PyCursesWindow_InCh(self,arg) PyCursesWindowObject *self; PyObject * arg; { int x, y, rtn; switch (ARG_COUNT(arg)) { case 0: rtn = winch(self->win); break; case 2: if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) return NULL; rtn = mvwinch(self->win,y,x); break; default: PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments"); return NULL; } return PyInt_FromLong((long) rtn); } static PyObject * PyCursesWindow_InStr(self,arg) PyCursesWindowObject *self; PyObject * arg; { int x, y, n; char rtn[1024]; /* This should be big enough.. I hope */ int rtn2; switch (ARG_COUNT(arg)) { case 0: rtn2 = winstr(self->win,rtn); break; case 1: if (!PyArg_Parse(arg,"i;n", &n)) return NULL; rtn2 = winnstr(self->win,rtn,n); break; case 2: if (!PyArg_Parse(arg,"(ii);y,x",&y,&x)) return NULL; rtn2 = mvwinstr(self->win,y,x,rtn); break; case 3: if (!PyArg_Parse(arg, "(iii);y,x,n", &y, &x, &n)) return NULL; rtn2 = mvwinnstr(self->win, y, x, rtn, n); break; default: PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments"); return NULL; } if (rtn2 == ERR) rtn[0] = 0; return PyString_FromString(rtn); } static PyObject * PyCursesWindow_InsStr(self,arg) PyCursesWindowObject *self; PyObject * arg; { int rtn; int x, y; char *str; attr_t attr = A_NORMAL , attr_old = A_NORMAL; int use_xy = FALSE, use_attr = FALSE; switch (ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg,"s;str", &str)) return NULL; break; case 2: if (!PyArg_Parse(arg,"(sl);str,attr", &str, &attr)) return NULL; use_attr = TRUE; break; case 3: if (!PyArg_Parse(arg,"(iis);y,x,str", &y, &x, &str)) return NULL; use_xy = TRUE; break; case 4: if (!PyArg_Parse(arg,"(iisl);y,x,str,attr", &y, &x, &str, &attr)) return NULL; use_xy = use_attr = TRUE; break; default: PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments"); return NULL; } if (use_attr == TRUE) { attr_old = getattrs(self->win); wattrset(self->win,attr); } if (use_xy == TRUE) rtn = mvwinsstr(self->win,y,x,str); else rtn = winsstr(self->win,str); if (use_attr == TRUE) wattrset(self->win,attr_old); return PyCursesCheckERR(rtn, "insstr"); } static PyObject * PyCursesWindow_InsNStr(self,arg) PyCursesWindowObject *self; PyObject * arg; { int rtn, x, y, n; char *str; attr_t attr = A_NORMAL , attr_old = A_NORMAL; int use_xy = FALSE, use_attr = FALSE; switch (ARG_COUNT(arg)) { case 2: if (!PyArg_Parse(arg,"(si);str,n", &str, &n)) return NULL; break; case 3: if (!PyArg_Parse(arg,"(sil);str,n,attr", &str, &n, &attr)) return NULL; use_attr = TRUE; break; case 4: if (!PyArg_Parse(arg,"(iisi);y,x,str,n", &y, &x, &str, &n)) return NULL; use_xy = TRUE; break; case 5: if (!PyArg_Parse(arg,"(iisil);y,x,str,n,attr", &y, &x, &str, &n, &attr)) return NULL; use_xy = use_attr = TRUE; break; default: PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments"); return NULL; } if (use_attr == TRUE) { attr_old = getattrs(self->win); wattrset(self->win,attr); } if (use_xy == TRUE) rtn = mvwinsnstr(self->win,y,x,str,n); else rtn = winsnstr(self->win,str,n); if (use_attr == TRUE) wattrset(self->win,attr_old); return PyCursesCheckERR(rtn, "insnstr"); } static PyObject * PyCursesWindow_Is_LineTouched(self,arg) PyCursesWindowObject * self; PyObject * arg; { int line, erg; if (!PyArg_Parse(arg,"i;line", &line)) return NULL; erg = is_linetouched(self->win, line); if (erg == ERR) { PyErr_SetString(PyExc_TypeError, "is_linetouched: line number outside of boundaries"); return NULL; } else if (erg == FALSE) { Py_INCREF(Py_False); return Py_False; } else { Py_INCREF(Py_True); return Py_True; } } static PyObject * PyCursesWindow_NoOutRefresh(self,arg) PyCursesWindowObject *self; PyObject * arg; { int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol; if (self->win->_flags & _ISPAD) { switch(ARG_COUNT(arg)) { case 6: if (!PyArg_Parse(arg, "(iiiiii);" \ "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol", &pminrow, &pmincol, &sminrow, &smincol, &smaxrow, &smaxcol)) return NULL; return PyCursesCheckERR(pnoutrefresh(self->win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol), "pnoutrefresh"); default: PyErr_SetString(PyCursesError, "noutrefresh was called for a pad;" \ "requires 6 arguments"); return NULL; } } else { if (!PyArg_NoArgs(arg)) return NULL; return PyCursesCheckERR(wnoutrefresh(self->win), "wnoutrefresh"); } } static PyObject * PyCursesWindow_PutWin(self, arg) PyCursesWindowObject *self; PyObject *arg; { PyObject *temp; if (!PyArg_Parse(arg, "O;fileobj", &temp)) return NULL; if (!PyFile_Check(temp)) { PyErr_SetString(PyExc_TypeError, "argument must be a file object"); return NULL; } return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)), "putwin"); } static PyObject * PyCursesWindow_RedrawLine(self,arg) PyCursesWindowObject *self; PyObject * arg; { int beg, num; if (!PyArg_Parse(arg,"(ii);beg,num", &beg, &num)) return NULL; return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln"); } static PyObject * PyCursesWindow_Refresh(self,arg) PyCursesWindowObject *self; PyObject * arg; { int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol; if (self->win->_flags & _ISPAD) { switch(ARG_COUNT(arg)) { case 6: if (!PyArg_Parse(arg, "(iiiiii);" \ "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol", &pminrow, &pmincol, &sminrow, &smincol, &smaxrow, &smaxcol)) return NULL; return PyCursesCheckERR(prefresh(self->win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol), "prefresh"); default: PyErr_SetString(PyCursesError, "refresh was called for a pad; requires 6 arguments"); return NULL; } } else { if (!PyArg_NoArgs(arg)) return NULL; return PyCursesCheckERR(wrefresh(self->win), "wrefresh"); } } static PyObject * PyCursesWindow_SetScrollRegion(self,arg) PyCursesWindowObject *self; PyObject * arg; { int x, y; if (!PyArg_Parse(arg,"(ii);top, bottom",&y,&x)) return NULL; return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg"); } static PyObject * PyCursesWindow_SubWin(self,arg) PyCursesWindowObject *self; PyObject * arg; { WINDOW *win; int nlines, ncols, begin_y, begin_x; if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x", &nlines,&ncols,&begin_y,&begin_x)) return NULL; if (self->win->_flags & _ISPAD) win = subpad(self->win, nlines, ncols, begin_y, begin_x); else win = subwin(self->win,nlines,ncols,begin_y,begin_x); if (win == NULL) { PyErr_SetString(PyCursesError, catchall_NULL); return NULL; } return (PyObject *)PyCursesWindow_New(win); } static PyObject * PyCursesWindow_Scroll(self,arg) PyCursesWindowObject *self; PyObject * arg; { int lines; switch(ARG_COUNT(arg)) { case 0: return PyCursesCheckERR(scroll(self->win), "scroll"); break; case 1: if (!PyArg_Parse(arg, "i;lines", &lines)) return NULL; return PyCursesCheckERR(wscrl(self->win, lines), "scroll"); default: PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments"); return NULL; } } static PyObject * PyCursesWindow_TouchLine(self,arg) PyCursesWindowObject *self; PyObject * arg; { int st, cnt, val; switch (ARG_COUNT(arg)) { case 2: if (!PyArg_Parse(arg,"(ii);start,count",&st,&cnt)) return NULL; return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline"); break; case 3: if (!PyArg_Parse(arg, "(iii);start,count,val", &st, &cnt, &val)) return NULL; return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline"); default: PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments"); return NULL; } } static PyObject * PyCursesWindow_Vline(self, args) PyCursesWindowObject *self; PyObject *args; { PyObject *temp; chtype ch; int n, x, y, code = OK; attr_t attr = A_NORMAL; switch (ARG_COUNT(args)) { case 2: if (!PyArg_Parse(args, "(Oi);ch or int,n", &temp, &n)) return NULL; break; case 3: if (!PyArg_Parse(args, "(Oil);ch or int,n,attr", &temp, &n, &attr)) return NULL; break; case 4: if (!PyArg_Parse(args, "(iiOi);y,x,ch o int,n", &y, &x, &temp, &n)) return NULL; code = wmove(self->win, y, x); break; case 5: if (!PyArg_Parse(args, "(iiOil); y,x,ch or int,n,attr", &y, &x, &temp, &n, &attr)) return NULL; code = wmove(self->win, y, x); default: PyErr_SetString(PyExc_TypeError, "vline requires 2 or 5 arguments"); return NULL; } if (code != ERR) { if (!PyCurses_ConvertToChtype(temp, &ch)) { PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int"); return NULL; } return PyCursesCheckERR(whline(self->win, ch | attr, n), "vline"); } else return PyCursesCheckERR(code, "wmove"); } static PyMethodDef PyCursesWindow_Methods[] = { {"addch", (PyCFunction)PyCursesWindow_AddCh}, {"addnstr", (PyCFunction)PyCursesWindow_AddNStr}, {"addstr", (PyCFunction)PyCursesWindow_AddStr}, {"attron", (PyCFunction)PyCursesWindow_wattron}, {"attr_on", (PyCFunction)PyCursesWindow_wattron}, {"attroff", (PyCFunction)PyCursesWindow_wattroff}, {"attr_off", (PyCFunction)PyCursesWindow_wattroff}, {"attrset", (PyCFunction)PyCursesWindow_wattrset}, {"attr_set", (PyCFunction)PyCursesWindow_wattrset}, {"bkgd", (PyCFunction)PyCursesWindow_Bkgd}, {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet}, {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS}, {"box", (PyCFunction)PyCursesWindow_Box}, {"clear", (PyCFunction)PyCursesWindow_wclear}, {"clearok", (PyCFunction)PyCursesWindow_clearok}, {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot}, {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol}, {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup}, {"delch", (PyCFunction)PyCursesWindow_DelCh}, {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln}, {"derwin", (PyCFunction)PyCursesWindow_DerWin}, {"echochar", (PyCFunction)PyCursesWindow_EchoChar}, {"erase", (PyCFunction)PyCursesWindow_werase}, {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx}, {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd}, {"getch", (PyCFunction)PyCursesWindow_GetCh}, {"getkey", (PyCFunction)PyCursesWindow_GetKey}, {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx}, {"getparyx", (PyCFunction)PyCursesWindow_getparyx}, {"getstr", (PyCFunction)PyCursesWindow_GetStr}, {"getyx", (PyCFunction)PyCursesWindow_getyx}, {"hline", (PyCFunction)PyCursesWindow_Hline}, {"idlok", (PyCFunction)PyCursesWindow_idlok}, {"idcok", (PyCFunction)PyCursesWindow_idcok}, {"immedok", (PyCFunction)PyCursesWindow_immedok}, {"inch", (PyCFunction)PyCursesWindow_InCh}, {"insch", (PyCFunction)PyCursesWindow_InsCh}, {"insdelln", (PyCFunction)PyCursesWindow_winsdelln}, {"insertln", (PyCFunction)PyCursesWindow_winsertln}, {"insnstr", (PyCFunction)PyCursesWindow_InsNStr}, {"insstr", (PyCFunction)PyCursesWindow_InsStr}, {"instr", (PyCFunction)PyCursesWindow_InStr}, {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched}, {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched}, {"keypad", (PyCFunction)PyCursesWindow_keypad}, {"leaveok", (PyCFunction)PyCursesWindow_leaveok}, {"move", (PyCFunction)PyCursesWindow_wmove}, {"mvwin", (PyCFunction)PyCursesWindow_mvwin}, {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin}, {"nodelay", (PyCFunction)PyCursesWindow_nodelay}, {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh}, {"notimeout", (PyCFunction)PyCursesWindow_notimeout}, {"putwin", (PyCFunction)PyCursesWindow_PutWin}, {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin}, {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine}, {"refresh", (PyCFunction)PyCursesWindow_Refresh}, #ifndef __sgi__ {"resize", (PyCFunction)PyCursesWindow_wresize}, #endif {"scroll", (PyCFunction)PyCursesWindow_Scroll}, {"scrollok", (PyCFunction)PyCursesWindow_scrollok}, {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion}, {"standend", (PyCFunction)PyCursesWindow_wstandend}, {"standout", (PyCFunction)PyCursesWindow_wstandout}, {"subpad", (PyCFunction)PyCursesWindow_SubWin}, {"subwin", (PyCFunction)PyCursesWindow_SubWin}, {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown}, {"syncok", (PyCFunction)PyCursesWindow_syncok}, {"syncup", (PyCFunction)PyCursesWindow_wsyncup}, {"touchline", (PyCFunction)PyCursesWindow_TouchLine}, {"touchwin", (PyCFunction)PyCursesWindow_touchwin}, {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin}, {"vline", (PyCFunction)PyCursesWindow_Vline}, {NULL, NULL} /* sentinel */ }; static PyObject * PyCursesWindow_GetAttr(self, name) PyCursesWindowObject *self; char *name; { return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name); } /* -------------------------------------------------------*/ PyTypeObject PyCursesWindow_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "curses window", /*tp_name*/ sizeof(PyCursesWindowObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ }; /********************************************************************* Global Functions **********************************************************************/ static PyObject *ModDict; /* Function Prototype Macros - They are ugly but very, very useful. ;-) X - function name TYPE - parameter Type ERGSTR - format string for construction of the return value PARSESTR - format string for argument parsing */ #define NoArgNoReturnFunction(X) \ static PyObject *PyCurses_ ## X (self, arg) \ PyObject * self; \ PyObject * arg; \ { \ PyCursesInitialised \ if (!PyArg_NoArgs(arg)) return NULL; \ return PyCursesCheckERR(X(), # X); } #define NoArgOrFlagNoReturnFunction(X) \ static PyObject *PyCurses_ ## X (self, arg) \ PyObject * self; \ PyObject * arg; \ { \ int flag = 0; \ PyCursesInitialised \ switch(ARG_COUNT(arg)) { \ case 0: \ return PyCursesCheckERR(X(), # X); \ case 1: \ if (!PyArg_Parse(arg, "i;True(1) or False(0)", &flag)) return NULL; \ if (flag) return PyCursesCheckERR(X(), # X); \ else return PyCursesCheckERR(no ## X (), # X); \ default: \ PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 argument"); \ return NULL; } } #define NoArgReturnIntFunction(X) \ static PyObject *PyCurses_ ## X (self, arg) \ PyObject * self; \ PyObject * arg; \ { \ PyCursesInitialised \ if (!PyArg_NoArgs(arg)) return NULL; \ return PyInt_FromLong((long) X()); } #define NoArgReturnStringFunction(X) \ static PyObject *PyCurses_ ## X (self, arg) \ PyObject * self; \ PyObject * arg; \ { \ PyCursesInitialised \ if (!PyArg_NoArgs(arg)) return NULL; \ return PyString_FromString(X()); } #define NoArgTrueFalseFunction(X) \ static PyObject * PyCurses_ ## X (self,arg) \ PyObject * self; \ PyObject * arg; \ { \ PyCursesInitialised \ if (!PyArg_NoArgs(arg)) return NULL; \ if (X () == FALSE) { \ Py_INCREF(Py_False); \ return Py_False; \ } \ Py_INCREF(Py_True); \ return Py_True; } #define NoArgNoReturnVoidFunction(X) \ static PyObject * PyCurses_ ## X (self,arg) \ PyObject * self; \ PyObject * arg; \ { \ PyCursesInitialised \ if (!PyArg_NoArgs(arg)) return NULL; \ X(); \ Py_INCREF(Py_None); \ return Py_None; } #define TwoArgNoReturnFunction(X, TYPE, PARSESTR) \ static PyObject * PyCurses_ ## X (self,arg) \ PyObject * self; \ PyObject * arg; \ { \ TYPE arg1, arg2; \ PyCursesInitialised \ if (!PyArg_Parse(arg,PARSESTR, &arg1, &arg2)) return NULL; \ Py_INCREF(Py_None); \ return PyCursesCheckERR(X(arg1, arg2), # X); } NoArgNoReturnFunction(beep) NoArgNoReturnFunction(def_prog_mode) NoArgNoReturnFunction(def_shell_mode) NoArgNoReturnFunction(doupdate) NoArgNoReturnFunction(endwin) NoArgNoReturnFunction(flash) NoArgNoReturnFunction(nocbreak) NoArgNoReturnFunction(noecho) NoArgNoReturnFunction(nonl) NoArgNoReturnFunction(noraw) NoArgNoReturnFunction(reset_prog_mode) NoArgNoReturnFunction(reset_shell_mode) NoArgNoReturnFunction(resetty) NoArgNoReturnFunction(savetty) TwoArgNoReturnFunction(resizeterm, int, "(ii);y,x") NoArgOrFlagNoReturnFunction(cbreak) NoArgOrFlagNoReturnFunction(echo) NoArgOrFlagNoReturnFunction(nl) NoArgOrFlagNoReturnFunction(raw) NoArgReturnIntFunction(baudrate) NoArgReturnIntFunction(termattrs) NoArgReturnStringFunction(termname) NoArgReturnStringFunction(longname) NoArgTrueFalseFunction(can_change_color) NoArgTrueFalseFunction(has_colors) NoArgTrueFalseFunction(has_ic) NoArgTrueFalseFunction(has_il) NoArgTrueFalseFunction(isendwin) NoArgNoReturnVoidFunction(filter) NoArgNoReturnVoidFunction(flushinp) NoArgNoReturnVoidFunction(noqiflush) static PyObject * PyCurses_Color_Content(self, arg) PyObject * self; PyObject * arg; { short color,r,g,b; PyCursesInitialised PyCursesInitialisedColor if (ARG_COUNT(arg) != 1) { PyErr_SetString(PyExc_TypeError, "color_content requires 1 argument"); return NULL; } if (!PyArg_Parse(arg, "h;color", &color)) return NULL; if (color_content(color, &r, &g, &b) != ERR) return Py_BuildValue("(iii)", r, g, b); else { PyErr_SetString(PyCursesError, "Argument 1 was out of range. Check value of COLORS."); return NULL; } } static PyObject * PyCurses_COLOR_PAIR(self, arg) PyObject * self; PyObject * arg; { int n; PyCursesInitialised PyCursesInitialisedColor if (ARG_COUNT(arg)!=1) { PyErr_SetString(PyExc_TypeError, "COLOR_PAIR requires 1 argument"); return NULL; } if (!PyArg_Parse(arg, "i;number", &n)) return NULL; return PyInt_FromLong((long) (n << 8)); } static PyObject * PyCurses_Curs_Set(self, arg) PyObject * self; PyObject * arg; { int vis,erg; PyCursesInitialised if (ARG_COUNT(arg)==1) { PyErr_SetString(PyExc_TypeError, "curs_set requires 1 argument"); return NULL; } if (!PyArg_Parse(arg, "i;int", &vis)) return NULL; erg = curs_set(vis); if (erg == ERR) return PyCursesCheckERR(erg, "curs_set"); return PyInt_FromLong((long) erg); } static PyObject * PyCurses_Delay_Output(self,arg) PyObject * self; PyObject * arg; { int ms; PyCursesInitialised if (ARG_COUNT(arg)==1) { PyErr_SetString(PyExc_TypeError, "delay_output requires 1 argument"); return NULL; } if (!PyArg_Parse(arg, "i;ms", &ms)) return NULL; return PyCursesCheckERR(delay_output(ms), "delay_output"); } static PyObject * PyCurses_EraseChar(self,arg) PyObject * self; PyObject * arg; { char ch; PyCursesInitialised if (!PyArg_NoArgs(arg)) return NULL; ch = erasechar(); return PyString_FromString(&ch); } static PyObject * PyCurses_getsyx(self, arg) PyObject * self; PyObject * arg; { int x,y; PyCursesInitialised if (!PyArg_NoArgs(arg)) return NULL; getsyx(y, x); return Py_BuildValue("(ii)", y, x); } static PyObject * PyCurses_GetWin(self,arg) PyCursesWindowObject *self; PyObject * arg; { WINDOW *win; PyObject *temp; PyCursesInitialised if (!PyArg_Parse(arg, "O;fileobj", &temp)) return NULL; if (!PyFile_Check(temp)) { PyErr_SetString(PyExc_TypeError, "argument must be a file object"); return NULL; } win = getwin(PyFile_AsFile(temp)); if (win == NULL) { PyErr_SetString(PyCursesError, catchall_NULL); return NULL; } return PyCursesWindow_New(win); } static PyObject * PyCurses_HalfDelay(self,arg) PyObject * self; PyObject * arg; { unsigned char tenths; PyCursesInitialised switch(ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg, "b;tenths", &tenths)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "halfdelay requires 1 argument"); return NULL; } return PyCursesCheckERR(halfdelay(tenths), "halfdelay"); } #ifndef __sgi__ /* No has_key! */ static PyObject * PyCurses_has_key(self,arg) PyObject * self; PyObject * arg; { int ch; PyCursesInitialised if (!PyArg_Parse(arg,"i",&ch)) return NULL; if (has_key(ch) == FALSE) { Py_INCREF(Py_False); return Py_False; } Py_INCREF(Py_True); return Py_True; } #endif static PyObject * PyCurses_Init_Color(self, arg) PyObject * self; PyObject * arg; { short color, r, g, b; PyCursesInitialised PyCursesInitialisedColor switch(ARG_COUNT(arg)) { case 4: if (!PyArg_Parse(arg, "(hhhh);color,r,g,b", &color, &r, &g, &b)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments"); return NULL; } return PyCursesCheckERR(init_color(color, r, g, b), "init_color"); } static PyObject * PyCurses_Init_Pair(self, arg) PyObject * self; PyObject * arg; { short pair, f, b; PyCursesInitialised PyCursesInitialisedColor if (ARG_COUNT(arg) != 3) { PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments"); return NULL; } if (!PyArg_Parse(arg, "(hhh);pair, f, b", &pair, &f, &b)) return NULL; return PyCursesCheckERR(init_pair(pair, f, b), "init_pair"); } static PyObject * PyCurses_InitScr(self, args) PyObject * self; PyObject * args; { WINDOW *win; PyObject *lines, *cols; if (!PyArg_NoArgs(args)) return NULL; if (initialised == TRUE) { wrefresh(stdscr); return (PyObject *)PyCursesWindow_New(stdscr); } win = initscr(); if (win == NULL) { PyErr_SetString(PyCursesError, catchall_NULL); return NULL; } initialised = TRUE; lines = PyInt_FromLong((long) LINES); PyDict_SetItemString(ModDict, "LINES", lines); Py_DECREF(lines); cols = PyInt_FromLong((long) COLS); PyDict_SetItemString(ModDict, "COLS", cols); Py_DECREF(cols); return (PyObject *)PyCursesWindow_New(win); } static PyObject * PyCurses_IntrFlush(self,arg) PyObject * self; PyObject * arg; { int ch; PyCursesInitialised switch(ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument"); return NULL; } return PyCursesCheckERR(intrflush(NULL,ch), "intrflush"); } static PyObject * PyCurses_KeyName(self,arg) PyObject * self; PyObject * arg; { const char *knp; int ch; PyCursesInitialised if (!PyArg_Parse(arg,"i",&ch)) return NULL; knp = keyname(ch); return PyString_FromString((knp == NULL) ? "" : (char *)knp); } static PyObject * PyCurses_KillChar(self,arg) PyObject * self; PyObject * arg; { char ch; if (!PyArg_NoArgs(arg)) return NULL; ch = killchar(); return PyString_FromString(&ch); } static PyObject * PyCurses_Meta(self,arg) PyObject * self; PyObject * arg; { int ch; PyCursesInitialised switch(ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg,"i;True(1), False(0)",&ch)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "meta requires 1 argument"); return NULL; } return PyCursesCheckERR(meta(stdscr, ch), "meta"); } static PyObject * PyCurses_NewPad(self,arg) PyObject * self; PyObject * arg; { WINDOW *win; int nlines, ncols; PyCursesInitialised if (!PyArg_Parse(arg,"(ii);nlines,ncols",&nlines,&ncols)) return NULL; win = newpad(nlines, ncols); if (win == NULL) { PyErr_SetString(PyCursesError, catchall_NULL); return NULL; } return (PyObject *)PyCursesWindow_New(win); } static PyObject * PyCurses_NewWindow(self,arg) PyObject * self; PyObject * arg; { WINDOW *win; int nlines, ncols, begin_y, begin_x; PyCursesInitialised switch (ARG_COUNT(arg)) { case 2: if (!PyArg_Parse(arg,"(ii);nlines,ncols",&nlines,&ncols)) return NULL; win = newpad(nlines, ncols); break; case 4: if (!PyArg_Parse(arg, "(iiii);nlines,ncols,begin_y,begin_x", &nlines,&ncols,&begin_y,&begin_x)) return NULL; win = newwin(nlines,ncols,begin_y,begin_x); break; default: PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments"); return NULL; } if (win == NULL) { PyErr_SetString(PyCursesError, catchall_NULL); return NULL; } return (PyObject *)PyCursesWindow_New(win); } static PyObject * PyCurses_Pair_Content(self, arg) PyObject * self; PyObject * arg; { short pair,f,b; PyCursesInitialised PyCursesInitialisedColor switch(ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg, "h;pair", &pair)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument"); return NULL; } if (!pair_content(pair, &f, &b)) { PyErr_SetString(PyCursesError, "Argument 1 was out of range. (1..COLOR_PAIRS-1)"); return NULL; } return Py_BuildValue("(ii)", f, b); } static PyObject * PyCurses_PAIR_NUMBER(self, arg) PyObject * self; PyObject * arg; { int n; PyCursesInitialised PyCursesInitialisedColor switch(ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg, "i;pairvalue", &n)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "PAIR_NUMBER requires 1 argument"); return NULL; } return PyInt_FromLong((long) ((n & A_COLOR) >> 8)); } static PyObject * PyCurses_Putp(self,arg) PyObject *self; PyObject *arg; { char *str; if (!PyArg_Parse(arg,"s;str", &str)) return NULL; return PyCursesCheckERR(putp(str), "putp"); } static PyObject * PyCurses_QiFlush(self, arg) PyObject * self; PyObject * arg; { int flag = 0; PyCursesInitialised switch(ARG_COUNT(arg)) { case 0: qiflush(); Py_INCREF(Py_None); return Py_None; case 1: if (!PyArg_Parse(arg, "i;True(1) or False(0)", &flag)) return NULL; if (flag) qiflush(); else noqiflush(); Py_INCREF(Py_None); return Py_None; default: PyErr_SetString(PyExc_TypeError, "nl requires 0 or 1 argument"); return NULL; } } static PyObject * PyCurses_setsyx(self, arg) PyObject * self; PyObject * arg; { int y,x; PyCursesInitialised if (ARG_COUNT(arg)!=3) { PyErr_SetString(PyExc_TypeError, "curs_set requires 3 argument"); return NULL; } if (!PyArg_Parse(arg, "(ii);y, x", &y, &x)) return NULL; setsyx(y,x); Py_INCREF(Py_None); return Py_None; } static PyObject * PyCurses_Start_Color(self,arg) PyObject * self; PyObject * arg; { int code; PyObject *c, *cp; PyCursesInitialised if (!PyArg_NoArgs(arg)) return NULL; code = start_color(); if (code != ERR) { initialisedcolors = TRUE; c = PyInt_FromLong((long) COLORS); PyDict_SetItemString(ModDict, "COLORS", c); Py_DECREF(c); cp = PyInt_FromLong((long) COLOR_PAIRS); PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp); Py_DECREF(cp); Py_INCREF(Py_None); return Py_None; } else { PyErr_SetString(PyCursesError, "start_color() returned ERR"); return NULL; } } static PyObject * PyCurses_UnCtrl(self,arg) PyObject * self; PyObject * arg; { PyObject *temp; chtype ch; PyCursesInitialised if (!PyArg_Parse(arg,"O;ch or int",&temp)) return NULL; if (PyInt_Check(temp)) ch = (chtype) PyInt_AsLong(temp); else if (PyString_Check(temp)) ch = (chtype) *PyString_AsString(temp); else { PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int"); return NULL; } return PyString_FromString(unctrl(ch)); } static PyObject * PyCurses_UngetCh(self,arg) PyObject * self; PyObject * arg; { PyObject *temp; chtype ch; PyCursesInitialised if (!PyArg_Parse(arg,"O;ch or int",&temp)) return NULL; if (PyInt_Check(temp)) ch = (chtype) PyInt_AsLong(temp); else if (PyString_Check(temp)) ch = (chtype) *PyString_AsString(temp); else { PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int"); return NULL; } return PyCursesCheckERR(ungetch(ch), "ungetch"); } static PyObject * PyCurses_Use_Env(self,arg) PyObject * self; PyObject * arg; { int flag; PyCursesInitialised switch(ARG_COUNT(arg)) { case 1: if (!PyArg_Parse(arg,"i;True(1), False(0)",&flag)) return NULL; break; default: PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument"); return NULL; } use_env(flag); Py_INCREF(Py_None); return Py_None; } /* List of functions defined in the module */ static PyMethodDef PyCurses_methods[] = { {"baudrate", (PyCFunction)PyCurses_baudrate}, {"beep", (PyCFunction)PyCurses_beep}, {"can_change_color", (PyCFunction)PyCurses_can_change_color}, {"cbreak", (PyCFunction)PyCurses_cbreak}, {"color_content", (PyCFunction)PyCurses_Color_Content}, {"COLOR_PAIR", (PyCFunction)PyCurses_COLOR_PAIR}, {"curs_set", (PyCFunction)PyCurses_Curs_Set}, {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode}, {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode}, {"delay_output", (PyCFunction)PyCurses_Delay_Output}, {"doupdate", (PyCFunction)PyCurses_doupdate}, {"echo", (PyCFunction)PyCurses_echo}, {"endwin", (PyCFunction)PyCurses_endwin}, {"erasechar", (PyCFunction)PyCurses_EraseChar}, {"filter", (PyCFunction)PyCurses_filter}, {"flash", (PyCFunction)PyCurses_flash}, {"flushinp", (PyCFunction)PyCurses_flushinp}, {"getsyx", (PyCFunction)PyCurses_getsyx}, {"getwin", (PyCFunction)PyCurses_GetWin}, {"has_colors", (PyCFunction)PyCurses_has_colors}, {"has_ic", (PyCFunction)PyCurses_has_ic}, {"has_il", (PyCFunction)PyCurses_has_il}, #ifndef __sgi__ {"has_key", (PyCFunction)PyCurses_has_key}, #endif {"halfdelay", (PyCFunction)PyCurses_HalfDelay}, {"init_color", (PyCFunction)PyCurses_Init_Color}, {"init_pair", (PyCFunction)PyCurses_Init_Pair}, {"initscr", (PyCFunction)PyCurses_InitScr}, {"intrflush", (PyCFunction)PyCurses_IntrFlush}, {"isendwin", (PyCFunction)PyCurses_isendwin}, {"keyname", (PyCFunction)PyCurses_KeyName}, {"killchar", (PyCFunction)PyCurses_KillChar}, {"longname", (PyCFunction)PyCurses_longname}, {"meta", (PyCFunction)PyCurses_Meta}, {"newpad", (PyCFunction)PyCurses_NewPad}, {"newwin", (PyCFunction)PyCurses_NewWindow}, {"nl", (PyCFunction)PyCurses_nl}, {"nocbreak", (PyCFunction)PyCurses_nocbreak}, {"noecho", (PyCFunction)PyCurses_noecho}, {"nonl", (PyCFunction)PyCurses_nonl}, {"noqiflush", (PyCFunction)PyCurses_noqiflush}, {"noraw", (PyCFunction)PyCurses_noraw}, {"pair_content", (PyCFunction)PyCurses_Pair_Content}, {"PAIR_NUMBER", (PyCFunction)PyCurses_PAIR_NUMBER}, {"putp", (PyCFunction)PyCurses_Putp}, {"qiflush", (PyCFunction)PyCurses_QiFlush}, {"raw", (PyCFunction)PyCurses_raw}, {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode}, {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode}, {"resetty", (PyCFunction)PyCurses_resetty}, {"savetty", (PyCFunction)PyCurses_savetty}, {"resizeterm", (PyCFunction)PyCurses_resizeterm}, {"setsyx", (PyCFunction)PyCurses_setsyx}, {"start_color", (PyCFunction)PyCurses_Start_Color}, {"termattrs", (PyCFunction)PyCurses_termattrs}, {"termname", (PyCFunction)PyCurses_termname}, {"unctrl", (PyCFunction)PyCurses_UnCtrl}, {"ungetch", (PyCFunction)PyCurses_UngetCh}, {"use_env", (PyCFunction)PyCurses_Use_Env}, {NULL, NULL} /* sentinel */ }; /* Initialization function for the module */ void initjack_curses() { PyObject *m, *d, *v; /* Create the module and add the functions */ m = Py_InitModule("jack_curses", PyCurses_methods); /* Add some symbolic constants to the module */ d = PyModule_GetDict(m); ModDict = d; /* For PyCurses_InitScr */ /* For exception curses.error */ PyCursesError = PyString_FromString("curses.error"); PyDict_SetItemString(d, "error", PyCursesError); /* Make the version available */ v = PyString_FromString(PyCursesVersion); PyDict_SetItemString(d, "version", v); PyDict_SetItemString(d, "__version__", v); Py_DECREF(v); /* Here are some attributes you can add to chars to print */ #define SetDictInt(string,ch) \ PyDict_SetItemString(ModDict,string,PyInt_FromLong((long) (ch))); #ifndef __sgi__ /* On IRIX 5.3, the ACS characters aren't available until initscr() has been called. */ SetDictInt("ACS_ULCORNER", (ACS_ULCORNER)); SetDictInt("ACS_LLCORNER", (ACS_LLCORNER)); SetDictInt("ACS_URCORNER", (ACS_URCORNER)); SetDictInt("ACS_LRCORNER", (ACS_LRCORNER)); SetDictInt("ACS_LTEE", (ACS_LTEE)); SetDictInt("ACS_RTEE", (ACS_RTEE)); SetDictInt("ACS_BTEE", (ACS_BTEE)); SetDictInt("ACS_TTEE", (ACS_TTEE)); SetDictInt("ACS_HLINE", (ACS_HLINE)); SetDictInt("ACS_VLINE", (ACS_VLINE)); SetDictInt("ACS_PLUS", (ACS_PLUS)); SetDictInt("ACS_S1", (ACS_S1)); SetDictInt("ACS_S9", (ACS_S9)); SetDictInt("ACS_DIAMOND", (ACS_DIAMOND)); SetDictInt("ACS_CKBOARD", (ACS_CKBOARD)); SetDictInt("ACS_DEGREE", (ACS_DEGREE)); SetDictInt("ACS_PLMINUS", (ACS_PLMINUS)); SetDictInt("ACS_BULLET", (ACS_BULLET)); SetDictInt("ACS_LARROW", (ACS_LARROW)); SetDictInt("ACS_RARROW", (ACS_RARROW)); SetDictInt("ACS_DARROW", (ACS_DARROW)); SetDictInt("ACS_UARROW", (ACS_UARROW)); SetDictInt("ACS_BOARD", (ACS_BOARD)); SetDictInt("ACS_LANTERN", (ACS_LANTERN)); SetDictInt("ACS_BLOCK", (ACS_BLOCK)); #ifndef __sgi__ /* The following are never available on IRIX 5.3 */ SetDictInt("ACS_S3", (ACS_S3)); SetDictInt("ACS_LEQUAL", (ACS_LEQUAL)); SetDictInt("ACS_GEQUAL", (ACS_GEQUAL)); SetDictInt("ACS_PI", (ACS_PI)); SetDictInt("ACS_NEQUAL", (ACS_NEQUAL)); SetDictInt("ACS_STERLING", (ACS_STERLING)); #endif SetDictInt("ACS_BSSB", (ACS_ULCORNER)); SetDictInt("ACS_SSBB", (ACS_LLCORNER)); SetDictInt("ACS_BBSS", (ACS_URCORNER)); SetDictInt("ACS_SBBS", (ACS_LRCORNER)); SetDictInt("ACS_SBSS", (ACS_RTEE)); SetDictInt("ACS_SSSB", (ACS_LTEE)); SetDictInt("ACS_SSBS", (ACS_BTEE)); SetDictInt("ACS_BSSS", (ACS_TTEE)); SetDictInt("ACS_BSBS", (ACS_HLINE)); SetDictInt("ACS_SBSB", (ACS_VLINE)); SetDictInt("ACS_SSSS", (ACS_PLUS)); #endif SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES); SetDictInt("A_NORMAL", A_NORMAL); SetDictInt("A_STANDOUT", A_STANDOUT); SetDictInt("A_UNDERLINE", A_UNDERLINE); SetDictInt("A_REVERSE", A_REVERSE); SetDictInt("A_BLINK", A_BLINK); SetDictInt("A_DIM", A_DIM); SetDictInt("A_BOLD", A_BOLD); SetDictInt("A_ALTCHARSET", A_ALTCHARSET); SetDictInt("A_INVIS", A_INVIS); SetDictInt("A_PROTECT", A_PROTECT); #ifndef __sgi__ SetDictInt("A_HORIZONTAL", A_HORIZONTAL); SetDictInt("A_LEFT", A_LEFT); SetDictInt("A_LOW", A_LOW); SetDictInt("A_RIGHT", A_RIGHT); SetDictInt("A_TOP", A_TOP); SetDictInt("A_VERTICAL", A_VERTICAL); #endif SetDictInt("A_CHARTEXT", A_CHARTEXT); SetDictInt("A_COLOR", A_COLOR); #ifndef __sgi__ SetDictInt("WA_ATTRIBUTES", WA_ATTRIBUTES); SetDictInt("WA_NORMAL", WA_NORMAL); SetDictInt("WA_STANDOUT", WA_STANDOUT); SetDictInt("WA_UNDERLINE", WA_UNDERLINE); SetDictInt("WA_REVERSE", WA_REVERSE); SetDictInt("WA_BLINK", WA_BLINK); SetDictInt("WA_DIM", WA_DIM); SetDictInt("WA_BOLD", WA_BOLD); SetDictInt("WA_ALTCHARSET", WA_ALTCHARSET); SetDictInt("WA_INVIS", WA_INVIS); SetDictInt("WA_PROTECT", WA_PROTECT); SetDictInt("WA_HORIZONTAL", WA_HORIZONTAL); SetDictInt("WA_LEFT", WA_LEFT); SetDictInt("WA_LOW", WA_LOW); SetDictInt("WA_RIGHT", WA_RIGHT); SetDictInt("WA_TOP", WA_TOP); SetDictInt("WA_VERTICAL", WA_VERTICAL); #endif SetDictInt("COLOR_BLACK", COLOR_BLACK); SetDictInt("COLOR_RED", COLOR_RED); SetDictInt("COLOR_GREEN", COLOR_GREEN); SetDictInt("COLOR_YELLOW", COLOR_YELLOW); SetDictInt("COLOR_BLUE", COLOR_BLUE); SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA); SetDictInt("COLOR_CYAN", COLOR_CYAN); SetDictInt("COLOR_WHITE", COLOR_WHITE); /* Now set everything up for KEY_ variables */ { int key; char *key_n; char *key_n2; for (key=KEY_MIN;key < KEY_MAX; key++) { key_n = (char *)keyname(key); if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0) continue; if (strncmp(key_n,"KEY_F(",6)==0) { char *p1, *p2; key_n2 = malloc(strlen(key_n)+1); p1 = key_n; p2 = key_n2; while (*p1) { if (*p1 != '(' && *p1 != ')') { *p2 = *p1; p2++; } p1++; } *p2 = (char)0; } else key_n2 = key_n; PyDict_SetItemString(d,key_n2,PyInt_FromLong((long) key)); if (key_n2 != key_n) free(key_n2); } SetDictInt("KEY_MIN", KEY_MIN); SetDictInt("KEY_MAX", KEY_MAX); } /* Check for errors */ if (PyErr_Occurred()) Py_FatalError("can't initialize module curses"); } jack-3.1.1+cvs20050801/cursesmodule/lifedemo.py0000644000175000017500000001473410371403403017035 0ustar tbmtbm#!/usr/bin/env python # life.py -- A curses-based version of Conway's Game of Life. # Contributed by A.M. Kuchling # # An empty board will be displayed, and the following commands are available: # E : Erase the board # R : Fill the board randomly # S : Step for a single generation # C : Update continuously until a key is struck # Q : Quit # Cursor keys : Move the cursor around the board # Space or Enter : Toggle the contents of the cursor's position # # TODO : # Support the mouse # Use colour if available # Make board updates faster # class LifeBoard: """Encapsulates a Life board Attributes: M,N : horizontal and vertical size of the board Methods: display(update_board) -- If update_board is true, compute the next generation. Then display the state of the board and refresh the screen. erase() -- clear the entire board makeRandom() -- fill the board randomly set(y,x) -- set the given cell to Live; doesn't refresh the screen toggle(y,x) -- change the given cell from live to dead, or vice versa, and refresh the screen display """ def __init__(self, scr, char=ord('*')): """Return a LifeBoard instance. scr -- curses screen object to use for display char -- character used to render live cells (default: '*') """ self.state={} ; self.scr=scr N, M = self.scr.getmaxyx() self.M, self.N = M-2, N-2-1 self.char = char self.scr.clear() # Draw a border around the board border_line='+'+(self.M*'-')+'+' self.scr.addstr(0, 0, border_line) self.scr.addstr(self.N+1,0, border_line) for y in range(0, self.N): self.scr.addstr(1+y, 0, '|') self.scr.addstr(1+y, self.M+1, '|') self.scr.refresh() def set(self, y, x): """Set a cell to the live state""" if x<0 or self.M<=x or y<0 or self.N<=y: raise ValueError, "Coordinates out of range %i,%i"% (y,x) self.state[x,y] = 1 def toggle(self, y, x): """Toggle a cell's state between live and dead""" if x<0 or self.M<=x or y<0 or self.N<=y: raise ValueError, "Coordinates out of range %i,%i"% (y,x) if self.state.has_key(x,y): del self.state[x,y] self.scr.addch(y+1, x+1, ' ') else: self.state[x,y]=1 self.scr.addch(y+1, x+1, self.char) self.scr.refresh() def erase(self): """Clear the entire board and update the board display""" self.state={} self.display(update_board=0) def display(self, update_board=1): """Display the whole board, optionally computing one generation""" M,N = self.M, self.N if not update_board: for i in range(0, M): for j in range(0, N): if self.state.has_key( (i,j) ): self.scr.addch(j+1, i+1, self.char) else: self.scr.addch(j+1, i+1, ' ') self.scr.refresh() return d={} ; self.boring=1 for i in range(0, M): L=range( max(0, i-1), min(M, i+2) ) for j in range(0, N): s=0 live=self.state.has_key( (i,j) ) for k in range( max(0, j-1), min(N, j+2) ): for l in L: if self.state.has_key( (l,k) ): s=s+1 s=s-live if s==3: # Birth d[i,j]=1 self.scr.addch(j+1, i+1, self.char) if not live: self.boring=0 elif s==2 and live: d[i,j]=1 # Survival elif live: # Death self.scr.addch(j+1, i+1, ' ') self.boring=0 self.state=d self.scr.refresh() def makeRandom(self): """Fill the board with a random pattern""" import whrandom self.state={} for i in range(0, self.M): for j in range(0, self.N): if whrandom.random()*10>5.0: self.set(j,i) def erase_menu(stdscr, menu_y): "Clear the space where the menu resides" stdscr.move(menu_y, 0) ; stdscr.clrtoeol() stdscr.move(menu_y+1, 0) ; stdscr.clrtoeol() def display_menu(stdscr, menu_y): "Display the menu of possible keystroke commands" erase_menu(stdscr, menu_y) stdscr.addstr(menu_y, 4, 'Use the cursor keys to move, and space or Enter to toggle a cell.') stdscr.addstr(menu_y+1, 4, 'E)rase the board, R)andom fill, S)tep once or C)ontinuously, Q)uit') def main(stdscr): import string, curses # Clear the screen and dispaly the menu of keys stdscr.clear() stdscr_y, stdscr_x = stdscr.getmaxyx() menu_y=(stdscr_y-3)-1 display_menu(stdscr, menu_y) # Allocate a subwindow for the Life board and create the board object subwin=stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0) board=LifeBoard(subwin, char=ord('*')) board.display(update_board=0) # xpos, ypos are the cursor's position xpos, ypos = board.M/2, board.N/2 # Main loop: while (1): stdscr.move(1+ypos, 1+xpos) # Move the cursor c=stdscr.getch() # Get a keystroke if 00: ypos=ypos-1 elif c==curses.key_down and ypos0: xpos=xpos-1 elif c==curses.key_right and xpos