1 LISP LIBRARY PACKAGES MANUAL 1 LISP LIBRARY PACKAGES MANUAL FILE CACHE 1 FILE UTILITIES 1 FILE CACHE 6 2 Introduction 1 The File Cache package implements an automatic, transparent file-caching mechanism. Files from remote servers are automatically copied to a specified cache directory when they are first opened, and all future accessing of these files will use the cached version. This allows random access to files even if the files are stored on a server that does not implement random access. Creating a remote file is also done locally, and when the completed file is closed it is (eventually) written out to the remote host. The file cacher can also speed up many common interactions with Lisp, especially if you access files on heavily loaded file servers. Editing functions can be quicker (once the source file is cached, loading the source for a function does not need to go out to the server), and TEdit response is improved. The file cacher also attempts to deal intelligently with file servers that are not responding. If a server is down, you can still use cached files from that server. Before using the file cacher package, you should read this document carefully. It contains a number of important warnings that can save you much grief. Note: The file cacher changes the operation of all file operations from all packages in Lisp. In some cases, the file cachers' actions are not transparent, and inappropriate recovery methods may lead to loss of work. Before using the file cacher package, please read this document carefully. Before attempting to use the scavenger or recover from a crash, please review the relevant sections. 2 How Does It Work? 1 The system uses the function \GETDEVICEFROMNAME to determine what device to use to perform I/O operations for a given file. The cacher provides a modified version of this function that returns a specialized cache device when appropriate. The import of this is that the cacher is transparent. Once you start it running, you shouldn't need to do anything special. 2 Where Are Files Cached? 1 The location of the file cache is determined by a cache prefix.'' When the file cacher is started up, it looks for the file {DSK}FCache.Pointer;1. If this file is found, a single expression is read from the file and is used to set the cache prefix. If there is no such file, the user is prompted for the cache prefix in a special prompt window. The response will be written out to the appropriate file so that later systems will find this pointer. The default value depends on the machine type: on an 1108 or 1185/86 workstation, the default is {DSK}Cache>, on 1132s the default is {DSK1}. Setting the cache prefix to NIL disables the cache. It is possible to use {CORE} as the cache prefix. This results in fast access time to files at the cost of expanding your virtual memory size and slowing down your system due to increased swapping. If you will be making repeated access to certain files, have gobs of relatively unused physical memory, and don't mind losing your cache across different sysouts, you may want to use {CORE} as your cache prefix. The cached copy of a remote file is given the same name and extension as the original file. For example, if the cache prefix is {DSK}Cache>, the file INIT.DCOM on {PHYLUM}Lisp> will be cached to the file {DSK}Cache>INIT.DCOM. Characters in the file name that are not legal in file names for the local disk are replaced by $'s. 2 Maintaining the File Cache Across Sysouts 1 The directory of the cache is maintained in a number of special files on the cache. The file FCache.Listing in the cache contains a complete description of those files in the cache that are copies of files from a remote host. This file is updated before each logout so that other sysouts can determine the cache contents. While a system is running, a log file (FCache.Log;1 on the cache prefix), is continually updated with the changes to the cache. In the event of a system failure, this file contains enough information to reconstruct the state of the cache, including descriptions of files that need to be dumped to a remote host. Starting the cacher in a new sysout will automatically load the FCache.Listing;1 and FCache.Log;1 files, thereby restoring the state of the cache. Dirty files, of course, will still need to be written out. Restoring the cache can take a while, especially if there is a large number of files. To let you know what it is doing, the cacher will print a .'' in the file cache message window for each entry that it has successfully restored. If a cache entry cannot be parsed the cacher will print a ?.'' This printing is controlled by the SILENT cache property described below. 2 Starting and Stopping the File Cacher 1 When the file cacher is loaded, it notes the latest cache prefix (from the file {DSK}FCache.pointer;1) and restores the cache listing from that prefix. File caching then needs to be enabled for each file server. This can be accomplished in either of two ways. Some file devices are created when you first reference them. These devices are created by a generic'' device that knows how to create the appropriate device. For example, the LEAF device is responsible for creating the file devices for Phylum and other Xerox interim file servers,'' and the NSFILING device creates devices for Phylex:PARC:Xerox and other NS hosts. The file cacher provides a way to create a cache device for these file devices. (FCACHE.GENERIC.START deviceType) [Function] Enables caching for any device of type deviceType. When a new file device of type deviceType is first referenced, caching will be enabled for that device by a call to FCACHE.START (but see the cache property BADDEVICES described below). FCACHE.GENERIC.START is UNDOable. The supported device types are LEAF and NSFILING. (FCACHE.GENERIC.STOP deviceType) [Function] Undoes the effect of a call to (FCACHE.GENERIC.START deviceType). FCACHE.GENERIC.STOP does not turn off caching for devices that were automatically FCACHE.STARTed. FCACHE.GENERIC.DEVICE.TYPES [Global Variable] When the cacher is first loaded, the function FCACHE.GENERIC.START is mapped over the value of FCACHE.GENERIC.DEVICE.TYPES. FCACHE.GENERIC.DEVICE.TYPES is defined by an INITVARS expression in the file, so you can override the default value before loading the file cacher. The default value is (LEAF NSFILING). This effectively turns on caching for all LEAF and NS hosts. Some devices are part of the system, so FCACHE.GENERIC.START cannot be used to start caching on them. Instead, the following function can be used to enable caching on a device-by-device basis. (FCACHE.START hostName) [Function] Turns on caching for the specified host device. The host does not have to be up'' to turn on caching. FCACHE.START is UNDOable. As a side effect, FCACHE.START will remove hostName from the cache property BADDEVICES defined below. FCACHE.START returns NIL if caching could not be turned on for the device, otherwise it returns something non-NIL. NOTE: The file cacher does not support caching from UNIX hosts, so FCACHE.START of a UNIX host will do nothing. (FCACHE.STOP hostName) [Function] Turns off caching for the specified host device. FCACHE.STOP is UNDOable. As a side effect, FCACHE.STOP will add hostName to the cache property BADDEVICES defined below. (FCACHE.VANQUISH) [Function] Removes the cacher from the system, destroying all evidence that it ever existed (well, most of the evidence, anyway). 2 Cacher Tuning 1 The functioning of the cache is influenced by a number of properties. These property values can be accessed by the following two functions. (FCACHE.GETPROP name) [Function] Returns the current value of the cache property name. FCACHE.GETPROP has the appropriate SETFN property, so CHANGETRAN expressions like (push (FCACHE.GETPROP 'BADDEVICES) 'ERIS) will work. (FCACHE.PUTPROP name value) [Function] Sets the value of the cache property name to value. PREFIX [Cache Property] The PREFIX property determines where files are cached. Changing this property will dump all dirty files, update the FCache.Listing and FCache.Log files, update the FCache.Pointer file, set up the new prefix as the cache, and load its FCache.Listing and FCache.Log files. Setting the prefix to NIL will completely disable the file cacher. It is initially set when the package is loaded, and is updated automatically (using the file {DSK}FCache.Pointer) after each logout. ENTRIES [Cache Property] The number of files currently cached. This property is read-only. SIZE [Cache Property] The SIZE property is the current number of disk pages used by the cache. This property is read-only. TIMETOVERIFY [Cache Property] There is no point in verifying a cache entry if it was certified a short time ago. The TIMETOVERIFY property specifies what "a show time ago" means. If a cache entry has been verified withing the past TIMETOVERIFY seconds, in the currently running system, the cacher will assume that the entry is still valid. Setting TIMETOVERIFY to zero will force the cacher to reverify an entry each time it is used, no matter when it was last verified. The default value is five seconds. FASTDIR [Cache Property] Directory enumeration is complicated by the cache: files that are present in the cache but are not yet dumped to the server should be included in the directory. This is accomplished by merging the list of matching cached files with the directory list from the remote server. Generating this list of matching local files can be rather slow, especially if you have many files in the cache. The FASTDIR cache property lets you get around this problem. If FASTDIR is NIL then the directory merging is done, otherwise the merging is disabled. Disabling the merging of cache file listings and remote directory listings can result in a significant speedup (depending on the number of files in your cache), but can produce directory listings that miss some files (those files that have not yet been written to the server). Initial value is NIL. Note that FASTDIR has no effect on INFILEP or OUTFILEP. SILENT [Cache Property] Normally, the cache writes informative messages to (the value of) *FILE-CACHE-MESSAGE-STREAM* whenever files are being loaded into the cache or dumped from the cache to a remote host (and a few other situations). If the SILENT property is non-NIL, this reporting is not done. The default value is NIL, i.e., print out the messages. *FILE-CACHE-MESSAGE-STREAM* [Global Variable] If the SILENT property above is non$NIL, the file cacher will print various status messages to *FILE-CACHE-MESSAGE-STREAM*. *FILE-CACHE-MESSAGE-STREAM* can be either a window or a STREAM. If it is a window, messages will be printed only if the window is open. If it is a stream, message will be printed only if the stream is open for output. *FILE-CACHE-MESSAGE-STREAM* can be NIL, in which case no messages are printed. The default value of *FILE-CACHE-MESSAGE-STREAM* is the prompt window. This value is set via an INITVARS expression in the file, so you can override it before loading the file cacher. 2 Dealing With Unresponsive Hosts 1 The file cacher tries to deal in an intelligent way with hosts that are not responding. UNSAFE [Cache Property] If the File Cacher believes a remote host is not available (according to a heuristic algorithim), it uses the UNSAFE property to determine how to proceed. If the value is NIL, the cacher just keeps going (probably generating some sort of error if the host is really down). If the value is ASK, you will be asked if you want to trust the cache. If the value is NOTIFY, the cacher will automatically trust the cache, but will notify you of its action in the file cache message window. If the value is T, the cacher will also trust the cache, but will give no indication of this. The default value of the UNSAFE property is ASK. Trust'' is dependent on what you are trying to do with the host. If you are generating a directory listing or performing an INFILEP or OUTFILEP, trust'' means to use only those matching files that have been cached. If you are attempting to verify that a given cache entry is a valid copy of a remote file, it means to believe that it is. When the UNSAFE property is ASK and a host appears unresponsive, the cacher will ask you how it should proceed. A window will appear, containing an informative message and a menu of options, for example: UU3ggxpHG2Gs'I̎303''O2s''rs''Nrcs'$>LrC2ga|ɜBp"?LFq2"?Àp8@  GxÀlq xŀ XpËpDK<8Á $@"T " &@dLLD >T $@HHDH D T $@H HDH$2$@"T "$$@$H D̀DÇÀTpa @pÈp#K8 DA" @  D" @ "d& @8 @Xb @@@?   " " !hGg3Þ Ϗ69 <7ٟ<  3 ??9?G@380x0`#9 x"9ϙ3#3GO!3# &g?93> I9>2g'9!̟c'3d9&9?9>rO'9!I'399$99?1>r'9 ?&399!99ϟϜ!8r3g9 ?O|$29?) #?39ɟ2pg~L 8'''`a8g9g>8p???<`<`<`<"|`<2B@`<2B@`"@"Dq@8B <*C`"@ 2d!" @AD `<*B`@ 2d!! @!D <&B@`@P *T!R@@E  <&B@`@Pd*T!R@"@H <"`@P&L!2! @!>DO <`@P&L!2" @A"DH 0 <`|q"Dq|ώ"8H><`<` <|pAO`<"@$H`<"@$H`"@"Dq |pAO>8>Ï<x`"@ 2d!" @$H " !!"<@H`@ 2d!! @$H " !! <"@$H`@P *T!R x<<!!<<"@$H`@Pd*T!R @H H !!"<|qO`@P&L!2! @$H 'ȑ !!"<`@P&L!2" @$H $H !! "<`|q"Dq>|qO 8G>!Â<`<`<>Dp"@`< D!@"@`< D!@@@`"@"Dq |pAO>8>@<<(!@P@`"@ 2d!" @$H " & < (!@P@`@ 2d!! @$H " &(< (!@@P@`@P *T!R x<<%B< !@@P@`@Pd*T!R @H H %@<>p|q`@P&L!2! @$H 'ȑ %@<`@P&L!2" @$H $H %F<`|q"Dq>|qO 8G>B><`<`<<| " `<"@B $0 `<"@A@(P `"@"Dq |pAO>8>@<|qO 8G>B<`<`<|>|`< `< `"@"Dq |pAO>8>C<  <`"@ 2d!" @$H " < "`@ 2d!! @$H " !B<  `@P *T!R x<< C<@" `@Pd*T!R @H H B <| `@P&L!2! @$H 'ȑ @ <`@P&L!2" @$H $H `B <`|q"Dq>|qO 8G>!<` <`@<Dp8`<D@$"D`<(@D &L`"@"Dq |pAO>8>@<`@ *T`"@ 2d!" @$H " @<"@ *T`@ 2d!! @$H " !A@<>(A 2d`@P *T!R x<< B@<"DB"D`@Pd*T!R @H H B@<"Dp8`@P&L!2! @$H 'ȑ C<`@P&L!2" @$H $H `@@<`|q"Dq>|qO 8G>!@<` <`@<D|p`<DB"@`<(B"@`"@"Dq@A>A|q <B x``"@ 2d!" @@! ؠ@ B"`<"B.@`@ 2d!! @ ! ؠ@ B"<>(B"@̙`@P *T!R@ <x C  <"DB"@`@Pd*T!R@ "@ B <"D|p`@P&L!2! @!! >@ B" <`@P&L!2" @A! "@ B"0 <`|q"Dq|>"@pC<`<` <"8!`<2DQ`<2DQ`"@"Dq@A>A<*0Q`"@ 2d!" @@! ؠ <*A`@ 2d!! @ ! ؠ<&DȒ`@P *T!R@ <<&DH`@Pd*T!R@ <"8G`@P&L!2! @!! <`@P&L!2" @A! <`|q"Dq|><`<`<"8!"|q`<2DQ6@`<2DQ6@`"@"Dq@8B C㏟|p<*0Q*x`"@ 2d!" @AD <**@@`@ 2d!! @!D <&D*@@`@P *T!R@@E <&D*@@`@Pd*T!R@"@H |><"8"|p`@P&L!2! @!>DO <`@P&L!2" @A"DH <`|q"Dq|ώ"8H>p<`<`<"8!>`<2DQ (`<2DQ (`"@xqÈ|qDpÇ8<*0Q<(`"@"D$H"@H"l$HD<* D`@"DB$H"@BH"l$HD<&D |`@P"D`!H x`"HT`$D<&D D`@Pd"x DH @"HT$<<"8 Dq`@P"@B$H"@BH"T$H<`@P"@$H"@H"TB$HD<`|q@qÇ|qDpCÇ8<`<`<@G`<@B`<@B`"@xqÈ|qDpÇ8< @PB`"@"D$H"@H"l$HD<@PB`@"DB$H"@BH"l$HD<@0`@P"D`!H x`"HT`$8<@0`@Pd"x DH @"HT$D<|G`@P"@B$H"@BH"T$HD<`@P"@$H"@H"TB$HD<`|q@qÇ|qDpCÇ8<`<`<"DϞ`<"l`<"l `"@xqÈ|qDp<"T `"@"D$H"@H"l@<"T" `@"DB$H"@BH"l@<"T `@P"D`!H x`"HT`@<"T`@Pd"x DH @"HT<Dϐ`@P"@B$H"@BH"T@<`@P"@$H"@H"TA@<`|q@qÇ|qDp@<`<`<"D`<"lB$H`<"lB$I`"@xqÈ|qDp<"TB$`"@"D$H"@H"l@<"TB$ `@"DB$H"@BH"l@<"TB$ `@P"D`!H x`"HT`<"TB$`@Pd"x DH @"HT@<Dπ`@P"@B$H"@BH"T@<`@P"@$H"@H"TA@<`|q@qÇ|qDp@<`<`<8ǀG`<D!@B`<D!@B`"@xqÈ|q8xp <0!B`"@"D$H"@H"$D`<"!B`@"DB$H"@BH"$Da<>D!`@P"D`!H x`"H'D<"D!@`<"8!@G`<``` ` >|Dp`  @H"d@`  @H"d@` |CGDp` ` ` ` ` DO|` lB$H@` lB$H@P` TB"xP` TB"@ ` TB"@ ` TB!@ ` DA@ ` ` ` ` ` x#G` D!"B` D!"B` DAB` "DAB` >DA"` "D"` "xG` ` ` ` ` ` The menu items at the top of the cache browser provide the following functions: f Delte %marks the selected cache entries for deletion from the cache. f Prune%prompts for a number and then marks for deletion any cache entries that have been untouched for at least that many days. f Undelete%unmarks the selected entries for deletion. f Inspect%opens an inspect window on the first selected cache entry. f Filter%lets you specify a file pattern. The cache browser will then only show files that match that file pattern. f Recompute%recomputes the contents of the cache browser. f Expunge%deletes those cache entries that are marked for deletion. You can COPYSELECT from the browser window to untype" the file name. The window to the right of the browser window is an INSPECT window. You can use this window to change cache properties. 2 Dealing With File Cache Errors 1 f If the cacher detects a situationthat is "dangerous" and cannot be resolved, it will print a notice is a special window. For example, if the cached local file of a dirty file should disappear before the file can be written out to the appropriate host, you would get a warning message like this: UUN99?xsD"D>@ G? >HBd@DH D"D @ D? "DBdBD$H"LB$"D"@ D@? "D# Dp4AD@ C?????????????????|` > ? f` 30`000? ff`|3}|g ͞{3|}<? f<`0m6Am13Ͳ 10 ? |`݆0ݞa7a11ٸ3 010a ?``݃ݶa10a61`g;600p0a ? ``݆ ݶa40a61c16٘ٳ130 ? `~|Ɇɟ`0a1 ? ? ???????????????p@ ?@@@ ?84ÍDJD>H@' @@" ?" DJDH H@$ @@"@ ? "D2 "LJD$H"HH$@ H$@ " "$ ? 84 Dp0À 0a@a ????????????????? pC 8? ?,8,8pÇp,8?2D@2$H2D!?"|@"<`'ϑ |Q?"@@"D$! @Q?"D@"D$H  D!?"8@"@y"|@"D"$H @C ? @D"@@"D"$H @@?"D2$@ "D@"D"$I DD?8xÀ"8@"8!F qC????????????????????????????????????????????????????????????????????????????? f If you should try to log out and the cacher fails in an attempt to write out a dirty file, it will generate a break. This is most commonly caused by the (cached) file already being open. You have two options: you can continue from the break, or you can exit the break with an ^. If you continue, the logout will proceed, but the file will not be written out. This is safe in that the cacher in the next system will notice that the file needs to be written out. It is potentially confusing in that you may think that you dumped a file out, but it never really got to the server. It is recommend that you close the file (if that is what kept it from being written out), ^ out of the break, and try to log out again. f When a file is being created in the cache, the file cacher does not check to make sure that you can really write the remote file. For example, the cacher does not check to see if there is room on the server for the file, or if the file name contains any illegal characters, or if you have write access to the host/directory. If there is a problem, a window is opened containing an informative message and a menu of choices of ways to continue: UU?yȁpLG0~s3<&gG$$Bc3G#r|dNpd3 s2s'3s9r|Nps srs'3s?yb|?Npsasrc&3sBpgp̆NsaRJrC$2~rfd$ qpap?1 όDx >H"@"DQ@ D  ȑ" 2DH"D!@"L "BG,8y"< 4x   8@ @@ @Z!Zx "! " #pzpÃ8 $H# &$AD '"r'| $"$@!$H" $$AD>#pp#8 The menu option "Try to write it out again" is useful if you think the filename is OK, and suspect that the file cacher has made a mistake. "Write it out somewhere else" will prompt you for a new (remote) filename. The file will then be dumped out to that location. "Delete the cache file" will delete the cache entry, and is best used only when you are sure that you do not want the file saved. If the problem was lack of space on the server, you can delete some (remote) files and continue with the "Try to write it out again" item. f When the cacher is going to dump a file back to a server, it checks to make sure that no new file has appeared if there was no original file on the server. Similarly, if there was an original version of the file, the cacher checks to make sure that the file has not changed since the cached version was created. If the cacher detects a problem it will open a window containing an informative message and a menu of choices of ways to continue: UU?yȁpLG0~s3<&gG$$Bc3G#r|dNpd3 s2s'3s9r|Nps srs'3s?yb|?Npsasrc&3sBpgp̆NsaRJrC$2~rfd$ qpap?1 όf 0 =6  cff 0 f7ϘϘߘc||f   8  Ň8G 8qaÀDÏx,8hÁ@D$ȓD$@"D$D @2DG@$O0"DRD "|H@$H "DRD "@HD$ȓD$@ "LD$H"DG8#G 8À4"8h@b@ @b@ @bZx "! " #pzpÃ8 $H# &$AD '"r'| $"$@!$H" $$AD>#pp#8 The option "Write it out anyway" tells the cacher that there is no problem, and that it should just dump the file. The other two options are described above. f Sometimes when a file is being written out, it will break with a message that the file is open in conflicting ways.'' You can safely ^ out of this error. If you find that it is happening a lot, try increasing the value of the DUMPIDLE cache property. The cacher attempts to detect this error, and should automatically try again after a short delay. f There is an occasional situation where a BSP stream operation breaks, calling (SHOULDNT). Maybe it shouldn't, but it does. Anyway, I have found that if you revert to a suitable place up on the stack and try again, things will work. There seems to be a missing monitor lock or something. I dunno. f When a file is dumped, you can sometimes get an error "CLOSEF: Remote file not sucessfully stored ." Not to worry. Just ^ out of the break and the cacher will try again. 2 General Warnings & Known Deficiencies 1 f The local disk may not understand certain file properties (like CREATEDBY) that the remote host does. Attempts to perform a SETFILEINFO on these properties on a dirty file in the cache may not produce the results you would expect. Similarly, GETFILEINFO on a file that has not yet been dumped may return NIL even though the host supports the given file property. f With the file cache, it is possible to create a file whose file name is not legal for that server (e.g., (OPENFILE '{PHYLUM}Foo% bar 'OUTPUT) works). When the cacher attempts to dump the file, however, an error occurs. See the section on cacher errors above. f It is also possible to create files on directories where you do not have write access. Only when the cacher attempts to dump the file will an error occur. f The private file mechanism described above is not foolproof. If you don't go through the standard log out procedure, the private files will not be deleted from the local disk. f As was mentioned above, file locking is not implemented. This can be rather confusing if you switch rapidly between machines. f The file cacher will not work with TCP servers. This is because TCP does not support any file attributes, so the cacher has no way to verify a cache file. f The file cacher will not work with UNIX hosts. This is because of vast amounts of confusion caused by mixed-case file names and UNIX's lack of file version numbers. f The cacher cannot dump files that are open. The implications of this are sometimes profound. For example, when you do a Put in TEdit, a new file is opened for output, written, closed, and then opened for input. This prevents the file from being dumped. Further, shrinking the TEdit window to its icon does not close the file. The moral of this is that files that you think are safe'' (written out to the server) are sometimes not. If you often switch between different machines, this can be a real problem. You are warned. f When you log out, the cacher leaves a file, FCache.Listing, on the local cache device that describes the current cache entries. This file is automatically updated each time you do a LOGOUT. Do not be tempted to alter this file. Similarly, do not alter the file FCache.Log. f Finally, a general warning. The file cacher can make your life much easier, but it adds a level of complexity to the file system, and, as it is a new package, it still has a few bugs. As any work you do is likely to depend on the integrity of the file system, failures in the cacher can have disastrous consequences. It is important to carefully follow recovery procedures and proceed cautiously (after reviewing this documentation) if it fails. (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 154) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 618) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (270 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL)))))./T/T1 1(( ./2T/T.. /T/TB PAGEHEADING VERSOHEADB PAGEHEADING RECTOHEADA PAGEHEADINGFOOTINGVA PAGEHEADINGFOOTINGR TIMESROMAN MODERN MODERNMODERNMODERN  HELVETICA  HRULE.GETFNMODERN  HRULE.GETFNMODERN   HRULE.GETFNMODERN  HRULE.GETFNMODERN    HRULE.GETFNMODERN  HRULE.GETFNMODERN   HRULE.GETFNMODERN  2     HRULE.GETFNMODERN   HRULE.GETFNMODERN  }  HRULE.GETFNMODERN   HRULE.GETFNMODERN   l  HRULE.GETFNMODERN +  HRULE.GETFNMODERN M v  HRULE.GETFNMODERN '  HRULE.GETFNMODERN  ' "   6 f/}   s1w  HRULE.GETFNMODERN   HRULE.GETFNMODERN  0 %CfP.#A  HRULE.GETFNMODERN   HRULE.GETFNMODERN XwX" BMOBJ.GETFN3MODERN b = n$   HRULE.GETFNMODERN   HRULE.GETFNMODERN ;j&N   HRULE.GETFNMODERN &  HRULE.GETFNMODERN :"Me 5$S  HRULE.GETFNMODERN   HRULE.GETFNMODERN     HRULE.GETFNMODERN   HRULE.GETFNMODERN Q747)_fLK  HRULE.GETFNMODERN   HRULE.GETFNMODERN z  8 D 7  = " ,3      O  HRULE.GETFNMODERN   HRULE.GETFNMODERN d HcW)  HRULE.GETFNMODERN   HRULE.GETFNMODERN vFJ BMOBJ.GETFN3MODERN  P  } { K   q  G y  HRULE.GETFNMODERN   HRULE.GETFNMODERN+3 BMOBJ.GETFN3MODERN " BMOBJ.GETFN3MODERN   " BMOBJ.GETFN3MODERN  f/  HRULE.GETFNMODERN '  HRULE.GETFNMODERN o      A%/nz