diff --git a/.github/workflows/buildLoadup.yml b/.github/workflows/buildLoadup.yml index 991c9d2c..af777f5e 100644 --- a/.github/workflows/buildLoadup.yml +++ b/.github/workflows/buildLoadup.yml @@ -1,4 +1,4 @@ -#******************************************************************************* +#re******************************************************************************* # buidLoadup.yml # # Interlisp workflow to build Medley release and push it to github. This workflow @@ -200,20 +200,38 @@ jobs: env: release_tag: ${{ steps.tag.outputs.release_tag }} - - name: Release notes - run: | - sed s/'$tag'/${{ steps.tag.outputs.release_tag }}/g < release-notes.md > tmp/release-notes.md - - - name: Push the release - uses: ncipollo/release-action@v1.8.10 - with: - artifacts: tmp/${{ env.release_tag }}-loadups.tgz,tmp/${{ env.release_tag }}-runtime.tgz - tag: ${{ env.release_tag }} - bodyfile: tmp/release-notes.md - token: ${{ secrets.GITHUB_TOKEN }} + + - name: "Create release" + uses: "actions/github-script@v5" + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + script: | + try { + await github.rest.repos.createRelease({ + draft: false, + generate_release_notes: true, + name: process.env.release_tag, + owner: context.repo.owner, + prerelease: false, + repo: context.repo.repo, + tag_name: process.env.release_tag, + }); + } catch (error) { + core.setFailed(error.message); + } env: release_tag: ${{ steps.tag.outputs.release_tag }} + - name: "Upload release assets" + uses: AButler/upload-release-assets@v2.0 + with: + files: 'tmp/${{ env.release_tag }}-loadups.tgz;tmp/${{ env.release_tag }}-runtime.tgz' + repo-token: ${{ secrets.GITHUB_TOKEN }} + release-tag: ${{ env.release_tag }} + env: + release_tag: ${{ steps.tag.outputs.release_tag }} + + ###################################################################################### # Use set-sentry-action to determine set the sentry that says this release has diff --git a/internal/MEDLEY-UTILS b/internal/MEDLEY-UTILS index 33afdd27..0e8988d7 100644 --- a/internal/MEDLEY-UTILS +++ b/internal/MEDLEY-UTILS @@ -1,10 +1,10 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) -(FILECREATED "25-Jun-2022 17:17:53" |{DSK}larry>medley>internal>MEDLEY-UTILS.;4| 15853 +(FILECREATED "17-Jul-2022 12:44:56" |{DSK}larry>medley>internal>MEDLEY-UTILS.;9| 15959 - :CHANGES-TO (FNS PICK) + :CHANGES-TO (FNS HCFILES) - :PREVIOUS-DATE "25-Jun-2022 10:57:30" |{DSK}larry>medley>internal>MEDLEY-UTILS.;3|) + :PREVIOUS-DATE "16-Jul-2022 22:08:34" |{DSK}larry>medley>internal>MEDLEY-UTILS.;8|) (PRETTYCOMPRINT MEDLEY-UTILSCOMS) @@ -107,11 +107,13 @@ (HELP)))) (MAKE-FULLER-DB - (LAMBDA NIL (* \; "Edited 20-Jun-2022 17:23 by larry") + (LAMBDA NIL (* \; "Edited 16-Jul-2022 22:07 by larry") + (* \; "Edited 20-Jun-2022 17:23 by larry") (FILESLOAD (SOURCE) FILESETS) (DRIBBLE (MEDLEYDIR "tmp" "fuller.dribble" T T)) - (DOFILESLOAD (APPEND OKSOURCES OKLIBRARY OKLISPUSERS OKINTERNAL)) + (DOFILESLOAD (SUBSET (APPEND OKSOURCES OKLIBRARY OKLISPUSERS OKINTERNAL) + 'FINDFILE)) (GATHER-INFO 'ALL) (MASTERSCOPE '(WHO CALLS XYZZY)) (DUMPDATABASE NIL (MKATOM (MEDLEYDIR "tmp" "fuller.database" T T))) @@ -153,13 +155,10 @@ (RPAQQ OKSOURCES (RENAMEFNS VMEM READSYS CASH-FILE HASH-FILE MEDLEYDIR MAKEINIT)) (RPAQQ OKLIBRARY - (POSTSCRIPTSTREAM CHATTERMINAL DMCHAT CHAT PRESS TEDITDCL PCTREE TEXTOFD TEDITCOMMAND - TEDITSCREEN TEDITABBREV TEDITLOOKS TEDITFIND TEDITHISTORY TEDITFILE TEDITWINDOW - TEDITSELECTION READNUMBER EDITBITMAP IMAGEOBJ TFBRAVO TEDITHCPY TEDITPAGE TEDITMENU - TEDITFNKEYS TEDIT HRULE TEDITCHAT TABLEBROWSER FILEBROWSER GRAPHER SPY WHERE-IS - COPYFILES MSANALYZE MSPARSE MSCOMMON MASTERSCOPE UNIXCOMM UNIXPRINT UNICODE HASH - CLIPBOARD UNIXCHAT VT100KP VTCHAT SKETCH SKETCHBMELT SCALEBITMAP SKETCHOBJ SKETCHEDIT - SKETCHELEMENTS SKETCHOPS MATMULT SAMEDIR)) + (POSTSCRIPTSTREAM CHATTERMINAL DMCHAT CHAT PRESS READNUMBER EDITBITMAP IMAGEOBJ TEDIT HRULE + TABLEBROWSER FILEBROWSER GRAPHER SPY WHERE-IS COPYFILES MSANALYZE MSPARSE MSCOMMON + MASTERSCOPE UNIXCOMM UNIXPRINT UNICODE HASH CLIPBOARD UNIXCHAT VT100KP VTCHAT SKETCH + SKETCHBMELT SCALEBITMAP SKETCHOBJ SKETCHEDIT SKETCHELEMENTS SKETCHOPS MATMULT SAMEDIR)) (RPAQQ OKLISPUSERS (THINFILES ISO8859IO DINFO HELPSYS MODERNIZE WHEELSCROLL PRETTYFILEINDEX WHO-LINE BACKGROUND-YIELD OBJECTWINDOW REGIONMANAGER COMPARETEXT EXAMINEDEFS @@ -204,7 +203,8 @@ (DEFINEQ (HCFILES - (LAMBDA (TFILE DEST REDOFLG TOPDIRLEN) (* \; "Edited 21-Jun-2022 22:59 by larry") + (LAMBDA (TFILE DEST REDOFLG TOPDIRLEN) (* \; "Edited 17-Jul-2022 12:44 by larry") + (* \; "Edited 21-Jun-2022 22:59 by larry") (* \; "Edited 31-May-2022 09:31 by larry") (* \; "Edited 20-Feb-2022 12:16 by larry") (* \; "Edited 21-Aug-2021 20:56 by larry") @@ -225,7 +225,9 @@ (* |;;| "first deal with files in this directory") - (|for| X |in| (DIRECTORY (CONCAT TFILE "*.TED*;")) |do| (HCFILES X DEST REDOFLG TOPDIRLEN)) + (FOR EXT IN '("TED*" "SKETCH" "T*XT") + DO (|for| X |in| (DIRECTORY (CONCAT TFILE "*." EXT ";*")) + |do| (HCFILES X DEST REDOFLG TOPDIRLEN))) (* |;;| " then deal with subdirs ") @@ -288,10 +290,9 @@ (RPAQ? BADFILES ) -(DEFCOMMAND "pick" (FIRST . REST) - (PICK FIRST REST)) +(DEFCOMMAND "pick" (FIRST . REST) (PICK FIRST REST)) (DECLARE\: DONTCOPY - (FILEMAP (NIL (724 8547 (GATHER-INFO 734 . 6144) (MAKE-FULLER-DB 6146 . 6684) (MEDLEY-FIX-LINKS 6686 - . 7083) (MEDLEY-FIX-DATES 7085 . 7327) (PICK 7329 . 8545)) (9823 11616 (MAKE-EXPORTS-ALL 9833 . 10792 -) (MAKE-WHEREIS-HASH 10794 . 11614)) (11651 15716 (HCFILES 11661 . 15401) (BADFILE 15403 . 15714))))) + (FILEMAP (NIL (727 8702 (GATHER-INFO 737 . 6147) (MAKE-FULLER-DB 6149 . 6839) (MEDLEY-FIX-LINKS 6841 + . 7238) (MEDLEY-FIX-DATES 7240 . 7482) (PICK 7484 . 8700)) (9741 11534 (MAKE-EXPORTS-ALL 9751 . 10710 +) (MAKE-WHEREIS-HASH 10712 . 11532)) (11569 15829 (HCFILES 11579 . 15514) (BADFILE 15516 . 15827))))) STOP diff --git a/internal/MEDLEY-UTILS.LCOM b/internal/MEDLEY-UTILS.LCOM index d57fcdf9..f1fdba30 100644 Binary files a/internal/MEDLEY-UTILS.LCOM and b/internal/MEDLEY-UTILS.LCOM differ diff --git a/internal/test/filepos/BIG.XCCS b/internal/test/filepos/BIG.XCCS new file mode 100644 index 00000000..6c8dcb27 --- /dev/null +++ b/internal/test/filepos/BIG.XCCS @@ -0,0 +1 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa012345X1245 \ No newline at end of file diff --git a/internal/test/filepos/BIGGREEK.UTF8 b/internal/test/filepos/BIGGREEK.UTF8 new file mode 100644 index 00000000..b1365330 --- /dev/null +++ b/internal/test/filepos/BIGGREEK.UTF8 @@ -0,0 +1 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaδσγδφβcδδb \ No newline at end of file diff --git a/internal/test/filepos/BIGGREEK.XCCS b/internal/test/filepos/BIGGREEK.XCCS new file mode 100644 index 00000000..316de294 --- /dev/null +++ b/internal/test/filepos/BIGGREEK.XCCS @@ -0,0 +1 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaÿ&evdezbÿcÿ&eeÿb \ No newline at end of file diff --git a/internal/test/filepos/FIVE b/internal/test/filepos/FIVE new file mode 100644 index 00000000..bd41cba7 --- /dev/null +++ b/internal/test/filepos/FIVE @@ -0,0 +1 @@ +12345 \ No newline at end of file diff --git a/internal/test/filepos/FPTESTS b/internal/test/filepos/FPTESTS new file mode 100644 index 00000000..d1ce3afd Binary files /dev/null and b/internal/test/filepos/FPTESTS differ diff --git a/internal/test/filepos/GREEK.UTF8 b/internal/test/filepos/GREEK.UTF8 new file mode 100644 index 00000000..dbd8f910 --- /dev/null +++ b/internal/test/filepos/GREEK.UTF8 @@ -0,0 +1 @@ +aδσγδφβc \ No newline at end of file diff --git a/internal/test/filepos/GREEK.XCCS b/internal/test/filepos/GREEK.XCCS new file mode 100644 index 00000000..9ff71d29 Binary files /dev/null and b/internal/test/filepos/GREEK.XCCS differ diff --git a/internal/test/filepos/README b/internal/test/filepos/README new file mode 100644 index 00000000..cd9bd182 Binary files /dev/null and b/internal/test/filepos/README differ diff --git a/internal/test/filepos/SHORT.XCCS b/internal/test/filepos/SHORT.XCCS new file mode 100644 index 00000000..488e6300 --- /dev/null +++ b/internal/test/filepos/SHORT.XCCS @@ -0,0 +1 @@ +012345X1245 \ No newline at end of file diff --git a/internal/test/filepos/TFP b/internal/test/filepos/TFP new file mode 100644 index 00000000..5a8ea6f9 --- /dev/null +++ b/internal/test/filepos/TFP @@ -0,0 +1,495 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) + +(FILECREATED " 3-Jul-2022 14:07:11"  +{DSK}kaplan>local>medley3.5>working-medley>internal>test>filepos>TFP.;31 27425 + + :CHANGES-TO (FNS TFP TFP1) + + :PREVIOUS-DATE " 3-Jul-2022 13:32:16" +{DSK}kaplan>local>medley3.5>working-medley>internal>test>filepos>TFP.;27) + + +(PRETTYCOMPRINT TFPCOMS) + +(RPAQQ TFPCOMS + ((FNS TFP TFP1 FPC FPCS) + (FNS OLDFILEPOS OLDFFILEPOS) + (FILES FPTESTS) + (ADDVARS (DIRECTORIES {WMEDLEY}test>filepos>)) + + (* ;; "Compiling also requires EXPORTS.ALL") + + (DECLARE%: DOEVAL@COMPILE DONTCOPY (FILES (LOADCOMP) + IOCHAR)))) +(DEFINEQ + +(TFP + [LAMBDA (TESTNAMES TAGS FN) (* ; "Edited 3-Jul-2022 14:06 by rmk") + (CL:UNLESS TESTNAMES (SETQ TESTNAMES ALLTESTS)) + (LET [(TESTS (FOR TN INSIDE TESTNAMES FIRST (PRINTOUT T "Testing") + JOIN (PRINTOUT T " " TN) + (CONS (MKSTRING TN) + (COPY (EVALV TN))) FINALLY (TERPRI T] + (CL:WHEN TAGS + (SETQ TESTS (FOR TEST IN TESTS WHEN (THEREIS TAG INSIDE TAGS + SUCHTHAT (MEMB TAG TEST)) COLLECT TEST))) + (PRINTOUT T (LENGTH TESTS) + " tests" T) + (FOR TEST VAL COMMENT PRINTED IN TESTS EACHTIME (CL:WHEN (STRINGP TEST) + (SETQ COMMENT TEST) + (SETQ PRINTED NIL)) + WHEN [AND (LISTP TEST) + (NOT (AND FN (CADDR TEST] UNLESS (EQUAL (CAR TEST) + (SETQ VAL (TFP1 (CADR TEST) + FN))) + COLLECT (CL:WHEN COMMENT + (CL:UNLESS PRINTED (PRINTOUT T COMMENT T))) + (PRINTOUT T 5 VAL " <- " .P2 TEST T) + (CONS VAL TEST]) + +(TFP1 + [LAMBDA (FPARGS FN) (* ; "Edited 3-Jul-2022 14:04 by rmk") + + (* ;; "FN is the search function to apply: NIL = FILEPOS, OLDFILEPOS, FFILEPOS. OLDFFILEPOS") + + (* ;; "For convenience: NIL -> FILEPOS, OF -> OLDFILEPOS, FF -> FFILEPOS, OFF -> OLDFFILEPOS.") + + (* ;; "OLDFILEPOS and OLDFFILEPOS do only a byte searches.") + + (* ;; + "FPARGS is a list of FILEPOS args. CASEARRAY=T means Transparent case array, pushes to FFILEPOS. ") + + (* ;; "The file extension gives the format, defaulting to *DEFAULT-EXTERNALFORMAT* = :XCCS") + + (SETQ FN (SELECTQ FN + ((NIL FILEPOS) + 'FILEPOS) + ((FF FFILEPOS) + 'FFILEPOS) + ((OF OLDFILEPOS) + 'OLDFILEPOS) + ((OFF OLDFFILEPOS) + 'OLDFFILEPOS) + (HELP "BAD FN" FN))) + (CL:WHEN (OR (FIXP (CAR FPARGS)) + (NULL (CAR FPARGS)) + (AND (LISTP (CAR FPARGS)) + (FIXP (CAAR FPARGS)) + (FIXP (CDAR FPARGS))) + (LISTP (CADR FPARGS))) + (SETQ FPARGS (CADR FPARGS))) + (LET (STREAM VAL PATTERN FILE START END SKIP TAIL CASEARRAY EXT (FORMAT *DEFAULT-EXTERNALFORMAT*) + ) + (SETQ PATTERN (EVAL (POP FPARGS))) (* ; + "So we can do substrings, CHARACTER etc.") + (SETQ FILE (POP FPARGS)) + (SETQ START (POP FPARGS)) + (SETQ END (POP FPARGS)) + (SETQ SKIP (POP FPARGS)) + (SETQ TAIL (POP FPARGS)) + (SETQ CASEARRAY (POP FPARGS)) + (SETQ EXT (FILENAMEFIELD.STRING FILE 'EXTENSION)) + (CL:WHEN EXT + (CL:WHEN (STRPOS "UTF8" EXT) + (SETQ EXT "UTF-8")) + [SETQ FORMAT (FIND-FORMAT (CL:INTERN EXT 'KEYWORD]) + [SETQ STREAM (OPENSTREAM (OR (FINDFILE FILE T) + FILE) + 'INPUT NIL `((FORMAT ,FORMAT] + (SETQ CASEARRAY (IF (EQ CASEARRAY T) + THEN (CASEARRAY) + ELSE (EVAL CASEARRAY))) + (SETQ VAL (APPLY* FN PATTERN STREAM START END SKIP TAIL CASEARRAY)) + (CLOSEF? STREAM) + VAL]) + +(FPC + [LAMBDA (STR FILE START END SKIP TAIL CASEARRAY) (* ; "Edited 29-Jun-2022 21:22 by rmk") + + (* ;; "Compare old and new filepos") + + (LET (OLD NEW EXT FORMAT) + (CL:UNLESS (STREAMP FILE) + (SETQ EXT (FILENAMEFIELD.STRING FILE 'EXTENSION)) + (SETQ FORMAT (CL:INTERN EXT 'KEYWORD)) + (CL:UNLESS (FIND-FORMAT FORMAT T) + (SETQ FORMAT :XCCS)) + (STREAMPROP FILE 'FORMAT FORMAT)) + (SETQ OLD (OLDFILEPOS STR FILE START END SKIP TAIL CASEARRAY)) + (SETQ NEW (FILEPOS STR FILE START END SKIP TAIL CASEARRAY)) + (CLOSEF FILE) + (CL:UNLESS (EQUAL OLD (IF (EQ TAIL 'BOTH) + THEN (CDR NEW) + ELSE NEW)) + (HELP (CONCAT "OLD=" (OR OLD "NIL") + " NEW=" + (OR NEW "NIL")))) + (LIST OLD NEW]) + +(FPCS + [LAMBDA (STR FILE START END SKIP TAIL) (* ; "Edited 29-Jun-2022 23:56 by rmk") + (* ; "Edited 28-Jun-2022 22:21 by rmk") + + (* ;; "Compare old and new slow filepos") + + (LET (FAST SLOW EXT FORMAT) + (CL:UNLESS (STREAMP FILE) + (SETQ EXT (FILENAMEFIELD.STRING FILE 'EXTENSION)) + (SETQ FORMAT (CL:INTERN EXT 'KEYWORD)) + (CL:UNLESS (FIND-FORMAT FORMAT T) + (SETQ FORMAT :XCCS)) + (STREAMPROP FILE 'FORMAT FORMAT)) + (SETQ FAST (FILEPOS STR FILE START END SKIP TAIL)) + (SETQ SLOW (FILEPOS STR FILE START END SKIP TAIL (CASEARRAY))) + (CLOSEF FILE) + (CL:UNLESS (EQUAL FAST SLOW) + (HELP (CONCAT "FAST=" (OR FAST "NIL") + " SLOW=" + (OR SLOW "NIL")))) + (LIST FAST SLOW]) +) +(DEFINEQ + +(OLDFILEPOS + [LAMBDA (STR FILE START END SKIP TAIL CASEARRAY) (* ; "Edited 27-Jun-2022 23:35 by rmk") + (* ; "Edited 10-Aug-2020 21:44 by rmk:") + (* Pavel "12-Oct-86 15:13") + + (* ;; "RMK: Added coercion from internal XCCS string to UTF8 if searching a UTF8 file") + + (* ;; "NB: this function now works on non-PAGEMAPPED files. It must use only IO functions that respect that.") + + (PROG ((SKIPCHAR (AND SKIP (CHCON1 SKIP))) + [CA (fetch (ARRAYP BASE) of (COND + [CASEARRAY (COND + ((AND (ARRAYP CASEARRAY) + (EQ (fetch (ARRAYP TYP) of CASEARRAY) + \ST.BYTE)) + CASEARRAY) + (T (CASEARRAY CASEARRAY] + (T \TRANSPARENT] + (STREAM (\GETSTREAM FILE 'INPUT)) + CHAR FIRSTCHAR STRBASE STRINDEX PATLEN PATINDEX ORGFILEPTR LASTINDEX STARTBYTE ENDBYTE + BIGENDBYTE STARTSEG ENDSEG) + (CL:WHEN (EQ :UTF-8 (\EXTERNALFORMAT STREAM)) + (SETQ STR (XTOUSTRING STR))) + [COND + ((LITATOM STR) + (SETQ STRBASE (fetch (LITATOM PNAMEBASE) of STR)) + (SETQ STRINDEX 1) + (SETQ PATLEN (fetch (LITATOM PNAMELENGTH) of STR))) + (T (OR (STRINGP STR) + (SETQ STR (MKSTRING STR))) + (SETQ STRBASE (fetch (STRINGP BASE) of STR)) + (SETQ STRINDEX (fetch (STRINGP OFFST) of STR)) + (SETQ PATLEN (fetch (STRINGP LENGTH) of STR] (* ; + "calculate start addr and set file ptr.") + [SETQ STARTBYTE (COND + (START (COND + ((NOT (AND (FIXP START) + (IGEQ START 0))) + (LISPERROR "ILLEGAL ARG" START))) + (SETQ ORGFILEPTR (\GETFILEPTR STREAM)) + (\SETFILEPTR STREAM START) + START) + (T (SETQ ORGFILEPTR (\GETFILEPTR STREAM] + (* ; + "calculate the character address of the character after the last possible match.") + [SETQ ENDBYTE (ADD1 (COND + ((NULL END) (* ; "Default is end of file") + (IDIFFERENCE (\GETEOFPTR STREAM) + PATLEN)) + ((IGEQ END 0) (* ; "Absolute byte pointer given") + (IMIN END (IDIFFERENCE (\GETEOFPTR STREAM) + PATLEN))) + ((IGREATERP PATLEN (IMINUS END)) + (* ; + "END is too far, use eof less length") + (IDIFFERENCE (\GETEOFPTR STREAM) + PATLEN)) + (T (IDIFFERENCE (IPLUS (\GETEOFPTR STREAM) + END 1) + PATLEN] + + (* ;; "use STARTBYTE and ENDBYTE instead of START and END because vm functions shouldn't change their arguments.") + + (COND + ((IGEQ STARTBYTE ENDBYTE) (* ; "nothing to search") + (GO FAILED))) + (SETQ LASTINDEX PATLEN) + SKIPLP + (* ; + "set the first character to FIRSTCHAR, handling leading skips.") + (COND + ((EQ LASTINDEX 0) (* ; "null case") + (GO FOUNDIT)) + ((EQ (SETQ FIRSTCHAR (\GETBASEBYTE CA (\GETBASEBYTE STRBASE STRINDEX))) + SKIPCHAR) (* ; + "first character in pattern is skip.") + (SETQ LASTINDEX (SUB1 LASTINDEX)) + (\BIN STREAM) (* ; "Move forward a character.") + (add STRINDEX 1) + (add STARTBYTE 1) + (GO SKIPLP))) + (SETQ LASTINDEX (IPLUS LASTINDEX STRINDEX)) (* ; + "Used for end of pattern check, comparing against current INDEX") + [COND + ((SMALLP ENDBYTE) + (SETQ STARTSEG (SETQ ENDSEG 0))) + (T + (* ;; "The search will be in the large integers at least part of the time, so split the start and end fileptrs into hi and lo parts. The `segment' size we choose is smaller than 2^16 so that we are still smallp near the boundary (can get around that here by decrementing everyone, but can't in FFILEPOS). Note that STARTBYTE and ENDBYTE are never actually used as file ptrs, just for counting.") + + (SETQ ENDSEG (FOLDLO ENDBYTE FILEPOS.SEGMENT.SIZE)) + (SETQ BIGENDBYTE (IMOD ENDBYTE FILEPOS.SEGMENT.SIZE)) + (SETQ STARTSEG (FOLDLO STARTBYTE FILEPOS.SEGMENT.SIZE)) + (SETQ STARTBYTE (IMOD STARTBYTE FILEPOS.SEGMENT.SIZE)) + (SETQ ENDBYTE (COND + ((EQ STARTSEG ENDSEG) + BIGENDBYTE) + (T + + (* ;; "In different segments, so we'll have to search all the way to the end of this seg; hence, `end' is currently as big as it gets") + + FILEPOS.SEGMENT.SIZE] + FIRSTCHARLP + + + (* ;; "STARTBYTE is the possible beginning of a match. the file ptr of the file is always at STARTBYTE position when the FIRSTCHAR loop is passed.") + + (COND + ((EQ STARTBYTE ENDBYTE) (* ; "end of this part of search") + (COND + ((EQ STARTSEG ENDSEG) (* ; "failed") + (GO FAILED))) (* ; + "Finished this segment, roll over into new one") + (SETQ STARTBYTE 0) (* ; "= STARTBYTE-FILEPOS.SEGMENT.SIZE") + [COND + ((EQ (add STARTSEG 1) + ENDSEG) (* ; + "Entering final segment, so set ENDBYTE to actual end instead of segment end") + (COND + ((EQ (SETQ ENDBYTE BIGENDBYTE) + 0) + (GO FAILED] + (GO FIRSTCHARLP)) + ((NEQ FIRSTCHAR (\GETBASEBYTE CA (\BIN STREAM))) + (add STARTBYTE 1) + (GO FIRSTCHARLP))) + (SETQ PATINDEX STRINDEX) + MATCHLP + (* ; + "At this point, STR is matched thru offset PATINDEX") + (COND + ((EQ (SETQ PATINDEX (ADD1 PATINDEX)) + LASTINDEX) (* ; "matched for entire length") + (GO FOUNDIT)) + ((OR (EQ (SETQ CHAR (\GETBASEBYTE CA (\GETBASEBYTE STRBASE PATINDEX))) + (\GETBASEBYTE CA (\BIN STREAM))) + (EQ CHAR SKIPCHAR)) (* ; + "Char from file matches char from STR") + (GO MATCHLP)) + (T (* ; + "Match failed, so we have to start again with first char") + (\SETFILEPTR STREAM (IDIFFERENCE (\GETFILEPTR STREAM) + (IDIFFERENCE PATINDEX STRINDEX))) + + (* ;; "Back up over the chars we have just read in trying to match, less one. I.e. go back to one past the previous starting point") + + (add STARTBYTE 1) + (GO FIRSTCHARLP))) + FOUNDIT + (* ; + "set fileptr, adjust for beginning skips and return proper value.") + [COND + ((NOT TAIL) (* ; + "Fileptr wants to be at start of string") + (\SETFILEPTR STREAM (IDIFFERENCE (\GETFILEPTR STREAM) + PATLEN] + (RETURN (\GETFILEPTR STREAM)) + FAILED + (* ; + "return the fileptr to its initial position.") + (\SETFILEPTR STREAM ORGFILEPTR) + (RETURN NIL]) + +(OLDFFILEPOS + [LAMBDA (PATTERN FILE START END SKIP TAIL CASEARRAY) (* ; "Edited 10-Aug-2020 21:44 by rmk:") + + (* ;; "RMK: Added coercion from internal XCCS string to UTF8 if searching a UTF8 file") + (* Pavel "12-Oct-86 15:20") + (PROG ([STREAM (\GETSTREAM (OR FILE (INPUT] + PATBASE PATOFFSET PATLEN ORGFILEPTR STARTOFFSET ENDOFFSET BIGENDOFFSET STARTSEG ENDSEG EOF + ) + (COND + (SKIP (* ; "Slow case--use FILEPOS") + (GO TRYFILEPOS)) + ((NOT (fetch PAGEMAPPED of (fetch (STREAM DEVICE) of STREAM))) + (* ; + "This is a non-page-oriented file. Use FILEPOS instead.") + (GO TRYFILEPOS))) (* ; + "calculate start addr and set file ptr.") + (CL:WHEN (EQ :UTF8 (\EXTERNALFORMAT STREAM)) + (SETQ PATTERN (XTOUSTRING PATTERN))) + [COND + ((LITATOM PATTERN) + (SETQ PATBASE (fetch (LITATOM PNAMEBASE) of PATTERN)) + (SETQ PATOFFSET 1) + (SETQ PATLEN (fetch (LITATOM PNAMELENGTH) of PATTERN))) + (T (OR (STRINGP PATTERN) + (SETQ PATTERN (MKSTRING PATTERN))) + (SETQ PATBASE (fetch (STRINGP BASE) of PATTERN)) + (SETQ PATOFFSET (fetch (STRINGP OFFST) of PATTERN)) + (SETQ PATLEN (fetch (STRINGP LENGTH) of PATTERN] + (COND + ((OR (IGREATERP PATLEN \MAX.PATTERN.SIZE) + (ILESSP PATLEN \MIN.PATTERN.SIZE)) + (GO TRYFILEPOS))) + (SETQ ORGFILEPTR (\GETFILEPTR STREAM)) + (SETQ STARTOFFSET (IPLUS (COND + (START (COND + ((NOT (AND (FIXP START) + (IGEQ START 0))) + (LISPERROR "ILLEGAL ARG" START))) + START) + (T ORGFILEPTR)) + (SUB1 PATLEN))) (* ; + "STARTOFFSET is the address of the character corresponding to the last character of PATTERN.") + (SETQ EOF (\GETEOFPTR STREAM)) (* ; + "calculate the character address of the character after the last possible match.") + [SETQ ENDOFFSET (COND + ((NULL END) (* ; "Default is end of file") + EOF) + (T (IMIN (IPLUS (COND + ((ILESSP END 0) + (IPLUS EOF END 1)) + (T END)) + PATLEN) + EOF] + + (* ;; "use STARTOFFSET and ENDOFFSET instead of START and END because vm functions shouldn't change their arguments.") + + (COND + ((IGEQ STARTOFFSET ENDOFFSET) (* ; "nothing to search") + (RETURN)) + ((ILESSP (IDIFFERENCE ENDOFFSET STARTOFFSET) + \MIN.SEARCH.LENGTH) (* ; + "too small to make FFILEPOS worthwhile") + (GO TRYFILEPOS))) + (\SETFILEPTR STREAM STARTOFFSET) + [RETURN (GLOBALRESOURCE + (\FFDELTA1 \FFDELTA2 \FFPATCHAR) + (PROG ((CASE (fetch (ARRAYP BASE) + of (COND + [CASEARRAY (COND + ((AND (ARRAYP CASEARRAY) + (EQ (fetch (ARRAYP TYP) of CASEARRAY) + \ST.BYTE)) + CASEARRAY) + (T (CASEARRAY CASEARRAY] + (T \TRANSPARENT)))) + (DELTA1 (fetch (ARRAYP BASE) of \FFDELTA1)) + (DELTA2 (fetch (ARRAYP BASE) of \FFDELTA2)) + (PATCHAR (fetch (ARRAYP BASE) of \FFPATCHAR)) + (MAXPATINDEX (SUB1 PATLEN)) + CHAR CURPATINDEX LASTCHAR INC) + + (* ;; "Use Boyer-Moore string search algorithm. Use two auxiliary tables, DELTA1 and DELTA2, to tell how far ahead to move in the file when a partial match fails. DELTA1 contains, for each character code, the distance of that character from the right end of the pattern, or PATLEN if the character does not occur in the pattern. DELTA2 contains, for each character position in the pattern, how far ahead to move such that the partial substring discovered to the right of the position now matches some other substring (to the left) in the pattern. PATCHAR is just PATTERN translated thru CASEARRAY") + + (\SETUP.FFILEPOS PATBASE PATOFFSET PATLEN PATCHAR DELTA1 DELTA2 CASE) + [COND + ((SMALLP ENDOFFSET) + (SETQ STARTSEG (SETQ ENDSEG 0))) + (T + (* ;; "The search will be in the large integers at least part of the time, so split the start and end fileptrs into hi and lo parts. The `segment' size we choose is smaller than 2^16 so that we are still smallp near the boundary. Note that STARTOFFSET and ENDOFFSET are never actually used as file ptrs, just for counting.") + + (SETQ ENDSEG (FOLDLO ENDOFFSET FILEPOS.SEGMENT.SIZE)) + (SETQ BIGENDOFFSET (MOD ENDOFFSET FILEPOS.SEGMENT.SIZE)) + (SETQ STARTSEG (FOLDLO STARTOFFSET FILEPOS.SEGMENT.SIZE)) + (SETQ STARTOFFSET (MOD STARTOFFSET FILEPOS.SEGMENT.SIZE)) + (SETQ ENDOFFSET (COND + ((EQ STARTSEG ENDSEG) + BIGENDOFFSET) + (T + + (* ;; "In different segments, so we'll have to search all the way to the end of this seg; hence, `end' is currently as big as it gets") + + FILEPOS.SEGMENT.SIZE] + (SETQ LASTCHAR (GETBASEBYTE PATCHAR MAXPATINDEX)) + FIRSTCHARLP + (COND + [(IGEQ STARTOFFSET ENDOFFSET) (* ; "End of this chunk") + (COND + ((EQ STARTSEG ENDSEG) (* ; "failed") + (GO FAILED)) + (T (* ; + "Finished this segment, roll over into new one") + (add STARTSEG 1) + (SETQ STARTOFFSET (IDIFFERENCE STARTOFFSET FILEPOS.SEGMENT.SIZE)) + (COND + ((EQ STARTSEG ENDSEG) + (SETQ ENDOFFSET BIGENDOFFSET))) + (GO FIRSTCHARLP] + ((NEQ (SETQ CHAR (GETBASEBYTE CASE (\BIN STREAM))) + LASTCHAR) + (add STARTOFFSET (SETQ INC (GETBASEBYTE DELTA1 CHAR))) + (OR (EQ INC 1) + (\INCFILEPTR STREAM (SUB1 INC))) + (* ; + "advance file pointer accordingly (\BIN already advanced it one)") + (GO FIRSTCHARLP))) + (SETQ CURPATINDEX (SUB1 MAXPATINDEX)) + MATCHLP + (COND + ((ILESSP CURPATINDEX 0) + (GO FOUNDIT))) + (\DECFILEPTR STREAM 2) (* ; "back up to read previous char") + (COND + ((NEQ (SETQ CHAR (GETBASEBYTE CASE (\BIN STREAM))) + (GETBASEBYTE PATCHAR CURPATINDEX)) + (* ; + "Mismatch, advance by greater of delta1 and delta2") + (add STARTOFFSET (IDIFFERENCE (SETQ INC (IMAX (GETBASEBYTE DELTA1 CHAR) + (GETBASEBYTE DELTA2 + CURPATINDEX))) + (IDIFFERENCE MAXPATINDEX CURPATINDEX))) + (OR (EQ INC 1) + (\INCFILEPTR STREAM (SUB1 INC))) + (GO FIRSTCHARLP))) + (SETQ CURPATINDEX (SUB1 CURPATINDEX)) + (GO MATCHLP) + FOUNDIT + (* ; + "set fileptr, adjust for beginning skips and return proper value.") + (\INCFILEPTR STREAM (COND + (TAIL (* ; "Put fileptr at end of string") + (SUB1 PATLEN)) + (T (* ; + "back up over the last char we looked at, i.e. the first char of string") + -1))) + (RETURN (\GETFILEPTR STREAM)) + FAILED + (* ; + "return the fileptr to its initial position.") + (\SETFILEPTR STREAM ORGFILEPTR) + (RETURN NIL] + TRYFILEPOS + (RETURN (FILEPOS PATTERN STREAM START END SKIP TAIL CASEARRAY]) +) + +(FILESLOAD FPTESTS) + +(ADDTOVAR DIRECTORIES {WMEDLEY}test>filepos>) + + + +(* ;; "Compiling also requires EXPORTS.ALL") + +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(FILESLOAD (LOADCOMP) + IOCHAR) +) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (759 6571 (TFP 769 . 2219) (TFP1 2221 . 4656) (FPC 4658 . 5619) (FPCS 5621 . 6569)) ( +6572 27191 (OLDFILEPOS 6582 . 16284) (OLDFFILEPOS 16286 . 27189))))) +STOP diff --git a/internal/test/filepos/TFP.LCOM b/internal/test/filepos/TFP.LCOM new file mode 100644 index 00000000..aabd3f1d Binary files /dev/null and b/internal/test/filepos/TFP.LCOM differ diff --git a/internal/test/filepos/ZEROONETWO.XCCS b/internal/test/filepos/ZEROONETWO.XCCS new file mode 100644 index 00000000..108d4a6e --- /dev/null +++ b/internal/test/filepos/ZEROONETWO.XCCS @@ -0,0 +1 @@ +012 \ No newline at end of file diff --git a/internal/TESTUPF b/internal/test/unpackfilename/TESTUPF similarity index 100% rename from internal/TESTUPF rename to internal/test/unpackfilename/TESTUPF diff --git a/internal/TESTUPF.LCOM b/internal/test/unpackfilename/TESTUPF.LCOM similarity index 100% rename from internal/TESTUPF.LCOM rename to internal/test/unpackfilename/TESTUPF.LCOM diff --git a/internal/TESTUPF.TXT b/internal/test/unpackfilename/TESTUPF.TXT similarity index 100% rename from internal/TESTUPF.TXT rename to internal/test/unpackfilename/TESTUPF.TXT diff --git a/library/CLIPBOARD b/library/CLIPBOARD index ebbfaafa..6923c049 100644 --- a/library/CLIPBOARD +++ b/library/CLIPBOARD @@ -1,22 +1,23 @@ -(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10 FORMAT XCCS) -(FILECREATED " 3-Jul-2021 13:16:26"  -{DSK}kaplan>Local>medley3.5>git-medley>library>CLIPBOARD.;6 9185 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (VARS CLIPBOARDCOMS) +(FILECREATED " 7-Jul-2022 23:53:01"  +{DSK}kaplan>Local>medley3.5>working-medley>library>CLIPBOARD.;7 9243 - previous date%: "24-Jun-2021 21:14:38" -{DSK}kaplan>Local>medley3.5>git-medley>library>CLIPBOARD.;5) + :CHANGES-TO (VARS CLIPBOARDCOMS) + (FNS CLIPBOARD-COPY-STREAM CLIPBOARD-PASTE-STREAM) + + :PREVIOUS-DATE " 3-Jul-2021 13:16:26" +{DSK}kaplan>Local>medley3.5>working-medley>library>CLIPBOARD.;6) (PRETTYCOMPRINT CLIPBOARDCOMS) (RPAQQ CLIPBOARDCOMS - [ (* ; "Enable copy and paste") + [ (* ; "Enable copy and paste") (FNS INSTALL-CLIPBOARD GETCLIPBOARD PUTCLIPBOARD PASTEFROMCLIPBOARD LISPINTERRUPTS.PASTE CLIPBOARD-COPY-STREAM CLIPBOARD-PASTE-STREAM) (FNS TEDIT.COPYTOCLIPBOARD TEDIT.EXTRACTTOCLIPBOARD) (FNS SEDIT.COPYTOCLIPBOARD) - (INITVARS (CLIPBOARD-FORMAT :UTF-8)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DOCOPY (FILES (SYSLOAD) UNIXCOMM UNICODE) (P (INSTALL-CLIPBOARD))) @@ -116,24 +117,21 @@ (LISPINTERRUPTS.ORIG]) (CLIPBOARD-COPY-STREAM - [LAMBDA NIL (* ; "Edited 23-Feb-2021 22:11 by rmk:") - - (* ;; "Clipboard is UNICODE and UTF8") - + [LAMBDA NIL (* ; "Edited 7-Jul-2022 23:51 by rmk") + (* ; "Edited 23-Feb-2021 22:11 by rmk:") (LET (STRM (OST (UNIX-GETENV "OSTYPE"))) (SETQ STRM (CREATE-PROCESS-STREAM (CL:IF (STRPOS "darwin" OST) "pbcopy" "xclip -i -selection clipboard"))) - (\EXTERNALFORMAT STRM CLIPBOARD-FORMAT) STRM]) (CLIPBOARD-PASTE-STREAM - [LAMBDA NIL (* ; "Edited 23-Feb-2021 17:29 by rmk:") + [LAMBDA NIL (* ; "Edited 7-Jul-2022 23:51 by rmk") + (* ; "Edited 23-Feb-2021 17:29 by rmk:") (LET (STRM (OST (UNIX-GETENV "OSTYPE"))) (SETQ STRM (CREATE-PROCESS-STREAM (CL:IF (STRPOS "darwin" OST) "pbpaste" "xclip -o -selection clipboard"))) - (\EXTERNALFORMAT STRM CLIPBOARD-FORMAT) [SETFILEINFO STRM 'ENDOFSTREAMOP #'(CL:LAMBDA (s) (RETFROM (FUNCTION READCCODE) NIL] @@ -183,8 +181,6 @@ NIL STREAM])] T]) ) - -(RPAQ? CLIPBOARD-FORMAT :UTF-8) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DOCOPY (FILESLOAD (SYSLOAD) @@ -203,8 +199,8 @@ ) (PUTPROPS CLIPBOARD COPYRIGHT (NONE)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1301 6531 (INSTALL-CLIPBOARD 1311 . 3243) (GETCLIPBOARD 3245 . 3619) (PUTCLIPBOARD 3621 - . 4026) (PASTEFROMCLIPBOARD 4028 . 4946) (LISPINTERRUPTS.PASTE 4948 . 5369) (CLIPBOARD-COPY-STREAM -5371 . 5871) (CLIPBOARD-PASTE-STREAM 5873 . 6529)) (6532 7291 (TEDIT.COPYTOCLIPBOARD 6542 . 6823) ( -TEDIT.EXTRACTTOCLIPBOARD 6825 . 7289)) (7292 8831 (SEDIT.COPYTOCLIPBOARD 7302 . 8829))))) + (FILEMAP (NIL (1317 6626 (INSTALL-CLIPBOARD 1327 . 3259) (GETCLIPBOARD 3261 . 3635) (PUTCLIPBOARD 3637 + . 4042) (PASTEFROMCLIPBOARD 4044 . 4962) (LISPINTERRUPTS.PASTE 4964 . 5385) (CLIPBOARD-COPY-STREAM +5387 . 5902) (CLIPBOARD-PASTE-STREAM 5904 . 6624)) (6627 7386 (TEDIT.COPYTOCLIPBOARD 6637 . 6918) ( +TEDIT.EXTRACTTOCLIPBOARD 6920 . 7384)) (7387 8926 (SEDIT.COPYTOCLIPBOARD 7397 . 8924))))) STOP diff --git a/library/CLIPBOARD.LCOM b/library/CLIPBOARD.LCOM index 5ed5a0e8..483b9dd8 100644 Binary files a/library/CLIPBOARD.LCOM and b/library/CLIPBOARD.LCOM differ diff --git a/library/SKETCHOBJ b/library/SKETCHOBJ index be3507c6..777a12d4 100644 --- a/library/SKETCHOBJ +++ b/library/SKETCHOBJ @@ -1,13 +1,14 @@ -(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") -(FILECREATED "20-Jan-93 14:48:59" {DSK}lde>lispcore>library>SKETCHOBJ.;2 55463 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (RECORDS SKETCHIMAGEOBJ SKETCHDOCUMENTINFO LOCALSKIMAGEOBJ SKIMAGEOBJ ANNO) +(FILECREATED "15-Jul-2022 14:33:25" {DSK}larry>winhome>DROPBOX>TEDIT-VERSIONS>SKETCHOBJ.;1 55347 - previous date%: "12-Jun-90 15:07:54" {DSK}lde>lispcore>library>SKETCHOBJ.;1) + :CHANGES-TO (FNS SKETCH.DISPLAYFN) + + :PREVIOUS-DATE "20-Jan-93 14:48:59" {DSK}larry>medley>library>SKETCHOBJ.;1) (* ; " -Copyright (c) 1984, 1985, 1986, 1987, 1988, 1990, 1993 by Venue & Xerox Corporation. All rights reserved. +Copyright (c) 1984-1988, 1990, 1993 by Venue & Xerox Corporation. ") (PRETTYCOMPRINT SKETCHOBJCOMS) @@ -105,9 +106,10 @@ Copyright (c) 1984, 1985, 1986, 1987, 1988, 1990, 1993 by Venue & Xerox Corporat SKETCHIMAGEFNS]) (SKETCH.DISPLAYFN - [LAMBDA (SKETCHIMAGEOBJ STREAM) (* ; "Edited 27-Feb-87 18:15 by rrb") - - (* * display function for a sketch image object) + [LAMBDA (SKETCHIMAGEOBJ STREAM) (* ; "Edited 15-Jul-2022 14:30 by larry") + (* ; "Edited 27-Feb-87 18:15 by rrb") + + (* * display function for a sketch image object) (PROG ((SKIO (IMAGEOBJPROP SKETCHIMAGEOBJ 'OBJECTDATUM)) REGION TYPE) @@ -119,9 +121,9 @@ Copyright (c) 1984, 1985, 1986, 1987, 1988, 1990, 1993 by Venue & Xerox Corporat (BITBLT [COND ((fetch (SKETCHIMAGEOBJ SKIO.LOCALSPECS) of SKIO)) (T - - (* SKIO.LOCALSPECS is used to cache the local bitmap of the sketch as it is - being display now.) + + (* SKIO.LOCALSPECS is used to cache the local bitmap of the sketch as it is being + display now.) (replace (SKETCHIMAGEOBJ SKIO.LOCALSPECS) of SKIO with (SKETCH.BITMAP.IMAGE (fetch (SKETCHIMAGEOBJ SKIO.SKETCH) @@ -133,9 +135,9 @@ Copyright (c) 1984, 1985, 1986, 1987, 1988, 1990, 1993 by Venue & Xerox Corporat (T (PROG ((SKSCALE (fetch (SKETCHIMAGEOBJ SKIO.SCALE) of SKIO)) (STRMSCALE (DSPSCALE NIL STREAM)) SKTOSTRMSCALE SKXOFFSET SKYOFFSET) - - (* the TRANSLATE.SKETCH is to move the sketch to the right place on the page. - When all streams support tranlation, this should be taken out.) + + (* the TRANSLATE.SKETCH is to move the sketch to the right place on the page. + When all streams support tranlation, this should be taken out.) (SETQ SKTOSTRMSCALE (QUOTIENT SKSCALE STRMSCALE)) (SETQ SKXOFFSET (DIFFERENCE (TIMES (DSPXPOSITION NIL STREAM) @@ -144,23 +146,22 @@ Copyright (c) 1984, 1985, 1986, 1987, 1988, 1990, 1993 by Venue & Xerox Corporat (SETQ SKYOFFSET (DIFFERENCE (TIMES (DSPYPOSITION NIL STREAM) SKTOSTRMSCALE) (fetch (REGION BOTTOM) of REGION))) - - (* save and restore the font as Tedit assumes that it is preserved over the - call.) + + (* save and restore the font as Tedit assumes that it is preserved over the call.) (RETURN (DSPFONT (PROG1 (DSPFONT NIL STREAM) - (DRAW.LOCAL.SKETCH - (MAKE.LOCAL.SKETCH (TRANSLATE.SKETCH - (COPY (fetch (SKETCHIMAGEOBJ - SKIO.SKETCH) - of SKIO)) - (IMINUS SKXOFFSET) - (IMINUS SKYOFFSET)) - (SETQ REGION (TRANSLATE.REGION REGION SKXOFFSET - SKYOFFSET)) - SKTOSTRMSCALE STREAM) - STREAM - (SK.SCALE.REGION REGION SKTOSTRMSCALE))) + (DRAW.LOCAL.SKETCH + (MAKE.LOCAL.SKETCH (TRANSLATE.SKETCH + (COPY (fetch (SKETCHIMAGEOBJ + SKIO.SKETCH) + of SKIO)) + (IMINUS SKXOFFSET) + (IMINUS SKYOFFSET)) + (SETQ REGION (TRANSLATE.REGION REGION SKXOFFSET + SKYOFFSET)) + SKTOSTRMSCALE STREAM T) + STREAM + (SK.SCALE.REGION REGION SKTOSTRMSCALE))) STREAM]) (SKETCH.BITMAP.IMAGE @@ -935,14 +936,12 @@ Copyright (c) 1984, 1985, 1986, 1987, 1988, 1990, 1993 by Venue & Xerox Corporat (DECLARE%: EVAL@COMPILE (RECORD LOCALSKIMAGEOBJ ((SKIMOBJLOCALPOS) - LOCALHOTREGION SKIMOBJLOCALSCALE SKIMOBJLOCALREGION - SKIMOBJLOCALOFFSETPOS)) + LOCALHOTREGION SKIMOBJLOCALSCALE SKIMOBJLOCALREGION SKIMOBJLOCALOFFSETPOS)) (TYPERECORD SKIMAGEOBJ (SKIMAGEOBJ SKIMOBJ.GLOBALREGION SKIMOBJ.ORIGSCALE SKIMOBJ.OFFSETPOS)) -(DATATYPE ANNO (ANNO\SUBSTANCE ANNO\ID ANNO\WINDOW ANNO\DATE ANNO\PARENTS ANNO\NEXTSUBID - ANNO\TYPE ANNO\SUMMARIZED\IN ANNO\UPDATE\DATE ANNO\CREATE\BY ANNO\UPDATE\BY - ANNO\FONT)) +(DATATYPE ANNO (ANNO\SUBSTANCE ANNO\ID ANNO\WINDOW ANNO\DATE ANNO\PARENTS ANNO\NEXTSUBID ANNO\TYPE + ANNO\SUMMARIZED\IN ANNO\UPDATE\DATE ANNO\CREATE\BY ANNO\UPDATE\BY ANNO\FONT)) ) (/DECLAREDATATYPE 'ANNO '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER @@ -964,21 +963,21 @@ Copyright (c) 1984, 1985, 1986, 1987, 1988, 1990, 1993 by Venue & Xerox Corporat (CREATE.SKIMAGEOBJ.TYPE) (PUTPROPS SKETCHOBJ COPYRIGHT ("Venue & Xerox Corporation" 1984 1985 1986 1987 1988 1990 1993)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (2157 31523 (MAKE.IMAGE.OBJECT.OF.SKETCH 2167 . 3331) (SK.ELEMENT.FROM.IMAGEOBJ 3333 . -3632) (SKETCHIMAGEOBJ.FROM.VIEWER 3634 . 4046) (SKETCH.IMAGEOBJ 4048 . 4884) (SKETCH.DISPLAYFN 4886 . -8497) (SKETCH.BITMAP.IMAGE 8499 . 10170) (SKIO.IMAGEBOXFN 10172 . 12177) (SKIO.GETFN.2 12179 . 13648) -(SKIO.UPDATE.FROM.OLD.FORM 13650 . 14334) (SKIO.GETFN 14336 . 14854) (SKIO.PUTFN 14856 . 15853) ( -SKIO.COPYFN 15855 . 16557) (SKIO.BUTTONEVENTINFN 16559 . 21616) (TRANSLATE.REGION 21618 . 22147) ( -UPDATE.IMAGE.IN.DOCUMENT 22149 . 24668) (SK.COPY.IMAGEOBJ 24670 . 26341) (COPY.IMAGE.OBJECT 26343 . -26880) (\CREATE.SKETCH.IMAGEFNS 26882 . 28019) (\SKIO.IN.TOO.SMALL.TEDITP 28021 . 28713) ( -SKETCH.VIEWER.GRID 28715 . 30012) (SKETCH.VIEWER.SCALE 30014 . 31521)) (31886 39876 ( -SKETCH.IMAGE.OBJECT.ELEMENT 31896 . 32309) (SKETCH.IMAGEOBJ.OF.ELEMENT 32311 . 32637) ( -SKETCH.SCALE.OF.ELEMENT 32639 . 33067) (SKETCH.POSITION.OF.ELEMENT 33069 . 33716) ( -CREATE.SKIMAGEOBJ.TYPE 33718 . 34643) (IMAGEBOXSIZE 34645 . 34996) (SK.UPDATE.IMAGEOBJECT.AFTER.CHANGE - 34998 . 37125) (SKETCH.CREATE.IMAGE.OBJECT 37127 . 37849) (SKETCH.CREATE.IMAGE.OBJECT1 37851 . 39874) -) (39877 54282 (SK.IMAGEOBJ.DRAWFN 39887 . 41559) (SK.IMAGEOBJ.REGIONFN 41561 . 41986) ( -SK.IMAGEOBJ.GLOBALREGIONFN 41988 . 42389) (SK.IMAGEOBJ.TRANSLATEFN 42391 . 44674) ( -SK.IMAGEOBJ.EXPANDFN 44676 . 46862) (SK.IMAGEOBJ.INSIDEFN 46864 . 47398) (SK.IMAGEOBJ.MOVEFN 47400 . -49631) (SK.IMAGEOBJ.CHANGEFN 49633 . 52708) (SK.IMAGEOBJ.READCHANGEFN 52710 . 52939) ( -SK.IMAGEOBJ.TRANSFORMFN 52941 . 54280))))) + (FILEMAP (NIL (2084 31471 (MAKE.IMAGE.OBJECT.OF.SKETCH 2094 . 3258) (SK.ELEMENT.FROM.IMAGEOBJ 3260 . +3559) (SKETCHIMAGEOBJ.FROM.VIEWER 3561 . 3973) (SKETCH.IMAGEOBJ 3975 . 4811) (SKETCH.DISPLAYFN 4813 . +8445) (SKETCH.BITMAP.IMAGE 8447 . 10118) (SKIO.IMAGEBOXFN 10120 . 12125) (SKIO.GETFN.2 12127 . 13596) +(SKIO.UPDATE.FROM.OLD.FORM 13598 . 14282) (SKIO.GETFN 14284 . 14802) (SKIO.PUTFN 14804 . 15801) ( +SKIO.COPYFN 15803 . 16505) (SKIO.BUTTONEVENTINFN 16507 . 21564) (TRANSLATE.REGION 21566 . 22095) ( +UPDATE.IMAGE.IN.DOCUMENT 22097 . 24616) (SK.COPY.IMAGEOBJ 24618 . 26289) (COPY.IMAGE.OBJECT 26291 . +26828) (\CREATE.SKETCH.IMAGEFNS 26830 . 27967) (\SKIO.IN.TOO.SMALL.TEDITP 27969 . 28661) ( +SKETCH.VIEWER.GRID 28663 . 29960) (SKETCH.VIEWER.SCALE 29962 . 31469)) (31834 39824 ( +SKETCH.IMAGE.OBJECT.ELEMENT 31844 . 32257) (SKETCH.IMAGEOBJ.OF.ELEMENT 32259 . 32585) ( +SKETCH.SCALE.OF.ELEMENT 32587 . 33015) (SKETCH.POSITION.OF.ELEMENT 33017 . 33664) ( +CREATE.SKIMAGEOBJ.TYPE 33666 . 34591) (IMAGEBOXSIZE 34593 . 34944) (SK.UPDATE.IMAGEOBJECT.AFTER.CHANGE + 34946 . 37073) (SKETCH.CREATE.IMAGE.OBJECT 37075 . 37797) (SKETCH.CREATE.IMAGE.OBJECT1 37799 . 39822) +) (39825 54230 (SK.IMAGEOBJ.DRAWFN 39835 . 41507) (SK.IMAGEOBJ.REGIONFN 41509 . 41934) ( +SK.IMAGEOBJ.GLOBALREGIONFN 41936 . 42337) (SK.IMAGEOBJ.TRANSLATEFN 42339 . 44622) ( +SK.IMAGEOBJ.EXPANDFN 44624 . 46810) (SK.IMAGEOBJ.INSIDEFN 46812 . 47346) (SK.IMAGEOBJ.MOVEFN 47348 . +49579) (SK.IMAGEOBJ.CHANGEFN 49581 . 52656) (SK.IMAGEOBJ.READCHANGEFN 52658 . 52887) ( +SK.IMAGEOBJ.TRANSFORMFN 52889 . 54228))))) STOP diff --git a/library/SKETCHOBJ.LCOM b/library/SKETCHOBJ.LCOM index 8ca8b622..6ffeb736 100644 Binary files a/library/SKETCHOBJ.LCOM and b/library/SKETCHOBJ.LCOM differ diff --git a/library/TEXEC b/library/TEXEC index d5340b5f..93958a4c 100644 --- a/library/TEXEC +++ b/library/TEXEC @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) -(FILECREATED " 1-Feb-2022 09:24:13" |{DSK}kaplan>Local>medley3.5>my-medley>library>TEXEC.;2| 195948 +(FILECREATED "16-Jul-2022 23:42:20"  +|{DSK}kaplan>Local>medley3.5>working-medley>library>TEXEC.;3| 196212 :CHANGES-TO (VARS TEXECCOMS TEXEC.ICON TEXEC.ICON.MASK TEXEC.TITLED.ICON.TEMPLATE) - (FNS TEXEC.OPENTEXTSTREAM TEXEC.INCLUDE) - :PREVIOUS-DATE "30-May-91 19:21:21" -|{DSK}kaplan>Local>medley3.5>my-medley>library>TEXEC.;1|) + :PREVIOUS-DATE " 1-Feb-2022 09:24:13" +|{DSK}kaplan>Local>medley3.5>working-medley>library>TEXEC.;2|) ; Copyright (c) 1985, 1900, 1986-1991 by Venue & Xerox Corporation. @@ -17,7 +17,7 @@ ((COMS (* \;  "To support development and compilation") (DECLARE\: DONTCOPY EVAL@COMPILE (FILES (LOADCOMP) - ATERM TEDITDCL))) + ATERM TEDIT-DCL))) (COMS (* |;;| "THE FILLBUFFER REPLACEMENT CODE") @@ -57,7 +57,7 @@ (DECLARE\: DONTCOPY EVAL@COMPILE (FILESLOAD (LOADCOMP) - ATERM TEDITDCL) + ATERM TEDIT-DCL) ) @@ -2833,314 +2833,314 @@ "Starts TEXEC in a new window.")) (READVARS-FROM-STRINGS '(TEXEC.ICON TEXEC.ICON.MASK TEXEC.TITLED.ICON.TEMPLATE) - " ( {(READBITMAP)(64 77 -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@OH@@@@@@@@@\" -\"@@@@COL@@@@@@@@@\" -\"@@@@CON@@@@@@@@@\" -\"@@@@GHC@@@@@@@@@\" -\"@@@@O@AH@@@@@@@@\" -\"@@@AKBEL@@@@@@@@\" -\"@@@AC@BD@@@@@@@@\" -\"@@@AAHBD@@@@@@@@\" -\"@@@A@LBD@@@@@@@@\" -\"@@@A@NDD@@@@@@@@\" -\"@@@AGOOL@@@@@@@@\" -\"@@@AHFDF@@@@@@@@\" -\"@@@AHBDB@@@@@@@@\" -\"@@@A@BDC@@@@@@@@\" -\"@@@A@AHA@@@@@@@@\" -\"@@@A@AIAH@@@@@@@\" -\"@@@AA@I@H@@@@@@@\" -\"@@@CA@HHH@@@@@@@\" -\"@@@BA@HHHC@@@@@@\" -\"@@@CA@I@DB@@@@@@\" -\"@@@AAH@HBF@@@@@@\" -\"@@@AHF@HNL@@@@@@\" -\"@@@ALC@GIL@@@@@@\" -\"@@@ADNLC@H@@@@@@\" -\"OOOOOHGOMOOOH@@@\" -\"O@@@@HDDGH@@O@@@\" -\"ON@@@GHC@F@@AN@@\" -\"LOL@@@@AOOH@@CL@\" -\"LAOH@@@@@@@@@@GH\" -\"L@COOOOOOOOOOOOO\" -\"L@@GOOOOOOOOOOOO\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"O@@CH@@@@@@@@@@C\" -\"ON@CH@@@@@@@@@@C\" -\"LOLCH@@@@@@@@@@C\" -\"LAOKH@@@@@@@@@@C\" -\"@@COOOOOOOOOOOOO\" -\"@@@GH@@@@@@@@@@C\" -\"@@@CH@@@@@@@@@@C\" -\"@@@CH@@@@@@@@@@C\" -\"@@@AH@@@@@@@@@@C\")} {(READBITMAP)(64 77 -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@OH@@@@@@@@@\" -\"@@@@COL@@@@@@@@@\" -\"@@@@CON@@@@@@@@@\" -\"@@@@GOO@@@@@@@@@\" -\"@@@@OOOH@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOON@@@@@@@@\" -\"@@@AOOON@@@@@@@@\" -\"@@@AOOOO@@@@@@@@\" -\"@@@AOOOO@@@@@@@@\" -\"@@@AOOOOH@@@@@@@\" -\"@@@AOOOOH@@@@@@@\" -\"@@@COOOOH@@@@@@@\" -\"@@@COOOOHC@@@@@@\" -\"@@@COOOOLB@@@@@@\" -\"@@@AOOOONF@@@@@@\" -\"@@@AOOOONL@@@@@@\" -\"@@@AOOOOOL@@@@@@\" -\"@@@AOOOOOH@@@@@@\" -\"OOOOOOOOOOOOH@@@\" -\"OOOOOOOOOOOOO@@@\" -\"OOOOOOOOOOOOON@@\" -\"OOOOOOOOOOOOOOL@\" -\"OOOOOOOOOOOOOOOH\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"LOOOOOOOOOOOOOOO\" -\"LAOOOOOOOOOOOOOO\" -\"@@COOOOOOOOOOOOO\" -\"@@@GH@@@@@@@@@@C\" -\"@@@CH@@@@@@@@@@C\" -\"@@@CH@@@@@@@@@@C\" -\"@@@AH@@@@@@@@@@C\")} ( {(READBITMAP)(64 77 -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@OH@@@@@@@@@\" -\"@@@@COL@@@@@@@@@\" -\"@@@@CON@@@@@@@@@\" -\"@@@@GHC@@@@@@@@@\" -\"@@@@O@AH@@@@@@@@\" -\"@@@AKBEL@@@@@@@@\" -\"@@@AC@BD@@@@@@@@\" -\"@@@AAHBD@@@@@@@@\" -\"@@@A@LBD@@@@@@@@\" -\"@@@A@NDD@@@@@@@@\" -\"@@@AGOOL@@@@@@@@\" -\"@@@AHFDF@@@@@@@@\" -\"@@@AHBDB@@@@@@@@\" -\"@@@A@BDC@@@@@@@@\" -\"@@@A@AHA@@@@@@@@\" -\"@@@A@AIAH@@@@@@@\" -\"@@@AA@I@H@@@@@@@\" -\"@@@CA@HHH@@@@@@@\" -\"@@@BA@HHHC@@@@@@\" -\"@@@CA@I@DB@@@@@@\" -\"@@@AAH@HBF@@@@@@\" -\"@@@AHF@HNL@@@@@@\" -\"@@@ALC@GIL@@@@@@\" -\"@@@ADNLC@H@@@@@@\" -\"OOOOOHGOMOOOH@@@\" -\"O@@@@HDDGH@@O@@@\" -\"ON@@@GHC@F@@AN@@\" -\"LOL@@@@AOOH@@CL@\" -\"LAOH@@@@@@@@@@GH\" -\"L@COOOOOOOOOOOOO\" -\"L@@GOOOOOOOOOOOO\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"L@@CH@@@@@@@@@@C\" -\"O@@CH@@@@@@@@@@C\" -\"ON@CH@@@@@@@@@@C\" -\"LOLCH@@@@@@@@@@C\" -\"LAOKH@@@@@@@@@@C\" -\"@@COOOOOOOOOOOOO\" -\"@@@GH@@@@@@@@@@C\" -\"@@@CH@@@@@@@@@@C\" -\"@@@CH@@@@@@@@@@C\" -\"@@@AH@@@@@@@@@@C\")} {(READBITMAP)(64 77 -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"@@@@@@@@@@@@@@@@\" -\"@@@@@OH@@@@@@@@@\" -\"@@@@COL@@@@@@@@@\" -\"@@@@CON@@@@@@@@@\" -\"@@@@GOO@@@@@@@@@\" -\"@@@@OOOH@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOOL@@@@@@@@\" -\"@@@AOOON@@@@@@@@\" -\"@@@AOOON@@@@@@@@\" -\"@@@AOOOO@@@@@@@@\" -\"@@@AOOOO@@@@@@@@\" -\"@@@AOOOOH@@@@@@@\" -\"@@@AOOOOH@@@@@@@\" -\"@@@COOOOH@@@@@@@\" -\"@@@COOOOHC@@@@@@\" -\"@@@COOOOLB@@@@@@\" -\"@@@AOOOONF@@@@@@\" -\"@@@AOOOONL@@@@@@\" -\"@@@AOOOOOL@@@@@@\" -\"@@@AOOOOOH@@@@@@\" -\"OOOOOOOOOOOOH@@@\" -\"OOOOOOOOOOOOO@@@\" -\"OOOOOOOOOOOOON@@\" -\"OOOOOOOOOOOOOOL@\" -\"OOOOOOOOOOOOOOOH\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"OOOOOOOOOOOOOOOO\" -\"LOOOOOOOOOOOOOOO\" -\"LAOOOOOOOOOOOOOO\" -\"@@COOOOOOOOOOOOO\" -\"@@@GH@@@@@@@@@@C\" -\"@@@CH@@@@@@@@@@C\" -\"@@@CH@@@@@@@@@@C\" + " ( {(READBITMAP)(64 77\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@OH@@@@@@@@@\"\ +\"@@@@COL@@@@@@@@@\"\ +\"@@@@CON@@@@@@@@@\"\ +\"@@@@GHC@@@@@@@@@\"\ +\"@@@@O@AH@@@@@@@@\"\ +\"@@@AKBEL@@@@@@@@\"\ +\"@@@AC@BD@@@@@@@@\"\ +\"@@@AAHBD@@@@@@@@\"\ +\"@@@A@LBD@@@@@@@@\"\ +\"@@@A@NDD@@@@@@@@\"\ +\"@@@AGOOL@@@@@@@@\"\ +\"@@@AHFDF@@@@@@@@\"\ +\"@@@AHBDB@@@@@@@@\"\ +\"@@@A@BDC@@@@@@@@\"\ +\"@@@A@AHA@@@@@@@@\"\ +\"@@@A@AIAH@@@@@@@\"\ +\"@@@AA@I@H@@@@@@@\"\ +\"@@@CA@HHH@@@@@@@\"\ +\"@@@BA@HHHC@@@@@@\"\ +\"@@@CA@I@DB@@@@@@\"\ +\"@@@AAH@HBF@@@@@@\"\ +\"@@@AHF@HNL@@@@@@\"\ +\"@@@ALC@GIL@@@@@@\"\ +\"@@@ADNLC@H@@@@@@\"\ +\"OOOOOHGOMOOOH@@@\"\ +\"O@@@@HDDGH@@O@@@\"\ +\"ON@@@GHC@F@@AN@@\"\ +\"LOL@@@@AOOH@@CL@\"\ +\"LAOH@@@@@@@@@@GH\"\ +\"L@COOOOOOOOOOOOO\"\ +\"L@@GOOOOOOOOOOOO\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"O@@CH@@@@@@@@@@C\"\ +\"ON@CH@@@@@@@@@@C\"\ +\"LOLCH@@@@@@@@@@C\"\ +\"LAOKH@@@@@@@@@@C\"\ +\"@@COOOOOOOOOOOOO\"\ +\"@@@GH@@@@@@@@@@C\"\ +\"@@@CH@@@@@@@@@@C\"\ +\"@@@CH@@@@@@@@@@C\"\ +\"@@@AH@@@@@@@@@@C\")} {(READBITMAP)(64 77\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@OH@@@@@@@@@\"\ +\"@@@@COL@@@@@@@@@\"\ +\"@@@@CON@@@@@@@@@\"\ +\"@@@@GOO@@@@@@@@@\"\ +\"@@@@OOOH@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOON@@@@@@@@\"\ +\"@@@AOOON@@@@@@@@\"\ +\"@@@AOOOO@@@@@@@@\"\ +\"@@@AOOOO@@@@@@@@\"\ +\"@@@AOOOOH@@@@@@@\"\ +\"@@@AOOOOH@@@@@@@\"\ +\"@@@COOOOH@@@@@@@\"\ +\"@@@COOOOHC@@@@@@\"\ +\"@@@COOOOLB@@@@@@\"\ +\"@@@AOOOONF@@@@@@\"\ +\"@@@AOOOONL@@@@@@\"\ +\"@@@AOOOOOL@@@@@@\"\ +\"@@@AOOOOOH@@@@@@\"\ +\"OOOOOOOOOOOOH@@@\"\ +\"OOOOOOOOOOOOO@@@\"\ +\"OOOOOOOOOOOOON@@\"\ +\"OOOOOOOOOOOOOOL@\"\ +\"OOOOOOOOOOOOOOOH\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"LOOOOOOOOOOOOOOO\"\ +\"LAOOOOOOOOOOOOOO\"\ +\"@@COOOOOOOOOOOOO\"\ +\"@@@GH@@@@@@@@@@C\"\ +\"@@@CH@@@@@@@@@@C\"\ +\"@@@CH@@@@@@@@@@C\"\ +\"@@@AH@@@@@@@@@@C\")} ( {(READBITMAP)(64 77\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@OH@@@@@@@@@\"\ +\"@@@@COL@@@@@@@@@\"\ +\"@@@@CON@@@@@@@@@\"\ +\"@@@@GHC@@@@@@@@@\"\ +\"@@@@O@AH@@@@@@@@\"\ +\"@@@AKBEL@@@@@@@@\"\ +\"@@@AC@BD@@@@@@@@\"\ +\"@@@AAHBD@@@@@@@@\"\ +\"@@@A@LBD@@@@@@@@\"\ +\"@@@A@NDD@@@@@@@@\"\ +\"@@@AGOOL@@@@@@@@\"\ +\"@@@AHFDF@@@@@@@@\"\ +\"@@@AHBDB@@@@@@@@\"\ +\"@@@A@BDC@@@@@@@@\"\ +\"@@@A@AHA@@@@@@@@\"\ +\"@@@A@AIAH@@@@@@@\"\ +\"@@@AA@I@H@@@@@@@\"\ +\"@@@CA@HHH@@@@@@@\"\ +\"@@@BA@HHHC@@@@@@\"\ +\"@@@CA@I@DB@@@@@@\"\ +\"@@@AAH@HBF@@@@@@\"\ +\"@@@AHF@HNL@@@@@@\"\ +\"@@@ALC@GIL@@@@@@\"\ +\"@@@ADNLC@H@@@@@@\"\ +\"OOOOOHGOMOOOH@@@\"\ +\"O@@@@HDDGH@@O@@@\"\ +\"ON@@@GHC@F@@AN@@\"\ +\"LOL@@@@AOOH@@CL@\"\ +\"LAOH@@@@@@@@@@GH\"\ +\"L@COOOOOOOOOOOOO\"\ +\"L@@GOOOOOOOOOOOO\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"L@@CH@@@@@@@@@@C\"\ +\"O@@CH@@@@@@@@@@C\"\ +\"ON@CH@@@@@@@@@@C\"\ +\"LOLCH@@@@@@@@@@C\"\ +\"LAOKH@@@@@@@@@@C\"\ +\"@@COOOOOOOOOOOOO\"\ +\"@@@GH@@@@@@@@@@C\"\ +\"@@@CH@@@@@@@@@@C\"\ +\"@@@CH@@@@@@@@@@C\"\ +\"@@@AH@@@@@@@@@@C\")} {(READBITMAP)(64 77\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"@@@@@@@@@@@@@@@@\"\ +\"@@@@@OH@@@@@@@@@\"\ +\"@@@@COL@@@@@@@@@\"\ +\"@@@@CON@@@@@@@@@\"\ +\"@@@@GOO@@@@@@@@@\"\ +\"@@@@OOOH@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOOL@@@@@@@@\"\ +\"@@@AOOON@@@@@@@@\"\ +\"@@@AOOON@@@@@@@@\"\ +\"@@@AOOOO@@@@@@@@\"\ +\"@@@AOOOO@@@@@@@@\"\ +\"@@@AOOOOH@@@@@@@\"\ +\"@@@AOOOOH@@@@@@@\"\ +\"@@@COOOOH@@@@@@@\"\ +\"@@@COOOOHC@@@@@@\"\ +\"@@@COOOOLB@@@@@@\"\ +\"@@@AOOOONF@@@@@@\"\ +\"@@@AOOOONL@@@@@@\"\ +\"@@@AOOOOOL@@@@@@\"\ +\"@@@AOOOOOH@@@@@@\"\ +\"OOOOOOOOOOOOH@@@\"\ +\"OOOOOOOOOOOOO@@@\"\ +\"OOOOOOOOOOOOON@@\"\ +\"OOOOOOOOOOOOOOL@\"\ +\"OOOOOOOOOOOOOOOH\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"OOOOOOOOOOOOOOOO\"\ +\"LOOOOOOOOOOOOOOO\"\ +\"LAOOOOOOOOOOOOOO\"\ +\"@@COOOOOOOOOOOOO\"\ +\"@@@GH@@@@@@@@@@C\"\ +\"@@@CH@@@@@@@@@@C\"\ +\"@@@CH@@@@@@@@@@C\"\ \"@@@AH@@@@@@@@@@C\")} (8 30 60 60))) ") @@ -3160,21 +3160,21 @@ (RPAQ? TEXEC.BUFFERLIMIT 10000) (PUTPROPS TEXEC COPYRIGHT ("Venue & Xerox Corporation" 1985 1900 1986 1987 1988 1989 1990 1991)) (DECLARE\: DONTCOPY - (FILEMAP (NIL (3269 182029 (TEXEC.BACKSKREAD 3279 . 7903) (TEXEC.OPENTEXTSTREAM 7905 . 9963) ( -TEXEC.DEFAULT.MENUFN 9965 . 14519) (TEXEC.DO?CMD 14521 . 19839) (TEXEC.CREATEMENU 19841 . 20299) ( -TEXEC.GET 20301 . 29136) (TEXEC.INCLUDE 29138 . 42523) (TEXEC.FIND.FORWARD 42525 . 55413) ( -TEXEC.FIND.BACKWARD 55415 . 68917) (TEDIT.FIND.BACKWARD 68919 . 74396) (TEDIT.BASICFIND.BACKWARD 74398 - . 79052) (TEXEC.MENU.WHENHELDFN 79054 . 79713) (TEXEC.SHRINK.ICONCREATE 79715 . 82518) ( -TEXEC.FILLBUFFER 82520 . 98954) (TEXEC.FILLBUFFER.TCLASS 98956 . 105296) (TEXEC.CHSELPENDING 105298 . -113788) (TEXEC.FILLBUFFER.CHARDELETE 113790 . 115845) (TEXEC.FILLBUFFER.WORDDELETE 115847 . 120975) ( -TEXEC.FILLBUFFER.LINEDELETE 120977 . 123859) (TEXEC.PARENCOUNT 123861 . 125250) (TEXEC.PARENMATCH -125252 . 126792) (TEXEC.FLASHCARET 126794 . 129453) (TEXEC.TEXTSTREAM.TO.LINEBUF 129455 . 132142) ( -TEXEC.FIX 132144 . 135313) (TEXEC.NTHBUFCHARBACK 135315 . 136378) (TEXEC.NTHBACKCHNUM 136380 . 137665) - (TEXEC.EOTP 137667 . 138400) (TEXEC.GETKEY 138402 . 141318) (TEXEC.INSERTCHAR 141320 . 143621) ( -TEXEC.DELETE 143623 . 144398) (TEXEC.\\CHDEL1 144400 . 147525) (TEXEC.?EQUAL 147527 . 148576) ( -TEDIT.SCROLL? 148578 . 153541) (TEXEC.DISPLAYTEXT 153543 . 160318) (\\TEXEC.TEXTBOUT 160320 . 163328) -(\\TEXEC.TEXTBOUT1 163330 . 168964) (\\TEXEC.TEXTBOUT2 168966 . 171297) (\\TEXEC.TEXTBOUT3 171299 . -172689) (\\TEXEC.TEXTBOUT4 172691 . 174734) (\\TEXEC.SELFN 174736 . 176111) (TEXEC.PRINTARGS 176113 . -181076) (TEXEC.PROCENTRYFN 181078 . 181619) (TEXEC.PROCEXITFN 181621 . 182027)) (182089 188464 (TEXEC -182099 . 186521) (TTEXEC 186523 . 188462))))) + (FILEMAP (NIL (3225 181985 (TEXEC.BACKSKREAD 3235 . 7859) (TEXEC.OPENTEXTSTREAM 7861 . 9919) ( +TEXEC.DEFAULT.MENUFN 9921 . 14475) (TEXEC.DO?CMD 14477 . 19795) (TEXEC.CREATEMENU 19797 . 20255) ( +TEXEC.GET 20257 . 29092) (TEXEC.INCLUDE 29094 . 42479) (TEXEC.FIND.FORWARD 42481 . 55369) ( +TEXEC.FIND.BACKWARD 55371 . 68873) (TEDIT.FIND.BACKWARD 68875 . 74352) (TEDIT.BASICFIND.BACKWARD 74354 + . 79008) (TEXEC.MENU.WHENHELDFN 79010 . 79669) (TEXEC.SHRINK.ICONCREATE 79671 . 82474) ( +TEXEC.FILLBUFFER 82476 . 98910) (TEXEC.FILLBUFFER.TCLASS 98912 . 105252) (TEXEC.CHSELPENDING 105254 . +113744) (TEXEC.FILLBUFFER.CHARDELETE 113746 . 115801) (TEXEC.FILLBUFFER.WORDDELETE 115803 . 120931) ( +TEXEC.FILLBUFFER.LINEDELETE 120933 . 123815) (TEXEC.PARENCOUNT 123817 . 125206) (TEXEC.PARENMATCH +125208 . 126748) (TEXEC.FLASHCARET 126750 . 129409) (TEXEC.TEXTSTREAM.TO.LINEBUF 129411 . 132098) ( +TEXEC.FIX 132100 . 135269) (TEXEC.NTHBUFCHARBACK 135271 . 136334) (TEXEC.NTHBACKCHNUM 136336 . 137621) + (TEXEC.EOTP 137623 . 138356) (TEXEC.GETKEY 138358 . 141274) (TEXEC.INSERTCHAR 141276 . 143577) ( +TEXEC.DELETE 143579 . 144354) (TEXEC.\\CHDEL1 144356 . 147481) (TEXEC.?EQUAL 147483 . 148532) ( +TEDIT.SCROLL? 148534 . 153497) (TEXEC.DISPLAYTEXT 153499 . 160274) (\\TEXEC.TEXTBOUT 160276 . 163284) +(\\TEXEC.TEXTBOUT1 163286 . 168920) (\\TEXEC.TEXTBOUT2 168922 . 171253) (\\TEXEC.TEXTBOUT3 171255 . +172645) (\\TEXEC.TEXTBOUT4 172647 . 174690) (\\TEXEC.SELFN 174692 . 176067) (TEXEC.PRINTARGS 176069 . +181032) (TEXEC.PROCENTRYFN 181034 . 181575) (TEXEC.PROCEXITFN 181577 . 181983)) (182045 188420 (TEXEC +182055 . 186477) (TTEXEC 186479 . 188418))))) STOP diff --git a/library/TEXEC.LCOM b/library/TEXEC.LCOM index 15c3ed65..27c71006 100644 Binary files a/library/TEXEC.LCOM and b/library/TEXEC.LCOM differ diff --git a/library/lafite/LAFITETEDIT b/library/lafite/LAFITETEDIT index a20584d4..91ae9ffb 100644 --- a/library/lafite/LAFITETEDIT +++ b/library/lafite/LAFITETEDIT @@ -1,14 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "30-Sep-2021 23:07:55"  -{DSK}kaplan>Local>medley3.5>git-medley>library>lafite>LAFITETEDIT.;3 12516 - changes to%: (VARS LAFITETEDITCOMS) - (FNS LA.ADJUST.FORMATTING LA.SKIP.LOOKS.LIST LA.DETACH.TEDIT LA.TEDIT.INCLUDE - LA.WINDOW.FROM.TEXTSTREAM TEDIT.ASSURE.NO.BACKING.FILE) - (FILES LAFITEDECLS) +(FILECREATED "16-Jul-2022 23:37:24"  +{DSK}kaplan>local>medley3.5>working-medley>library>lafite>LAFITETEDIT.;5 12306 - previous date%: "30-Sep-2021 22:59:28" -{DSK}kaplan>Local>medley3.5>git-medley>library>lafite>LAFITETEDIT.;2) + :CHANGES-TO (VARS LAFITETEDITCOMS) + + :PREVIOUS-DATE "30-Sep-2021 23:07:55" +{DSK}kaplan>local>medley3.5>working-medley>library>lafite>LAFITETEDIT.;4) (* ; " @@ -27,8 +25,8 @@ Copyright (c) 1988, 1990, 1992, 2021 by Xerox Corporation. (* ;; "Need TEDIT internal declarations for LA.ADJUST.FORMATTING. Can't just do (FILES (SOURCE) TEDITDCL), because there is a compiled version that is already loaded that isn't enough.") - (P (CL:UNLESS (GET 'TEDITDCL 'FILE) - (FILESLOAD TEDITDCL))) + (P (CL:UNLESS (GET 'TEDIT-DCL 'FILE) + (FILESLOAD TEDIT-DCL))) (FILES (SOURCE) LAFITEDECLS) (GLOBALVARS *TEDIT-FILE-READTABLE*) @@ -185,8 +183,8 @@ Copyright (c) 1988, 1990, 1992, 2021 by Xerox Corporation. ) (DECLARE%: EVAL@COMPILE DONTCOPY -(CL:UNLESS (GET 'TEDITDCL 'FILE) - (FILESLOAD TEDITDCL)) +(CL:UNLESS (GET 'TEDIT-DCL 'FILE) + (FILESLOAD TEDIT-DCL)) (FILESLOAD (SOURCE) @@ -204,7 +202,7 @@ Copyright (c) 1988, 1990, 1992, 2021 by Xerox Corporation. ) (PUTPROPS LAFITETEDIT COPYRIGHT ("Xerox Corporation" 1988 1990 1992 2021)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1549 12147 (LA.ADJUST.FORMATTING 1559 . 7695) (LA.SKIP.LOOKS.LIST 7697 . 8271) ( -LA.DETACH.TEDIT 8273 . 8638) (LA.TEDIT.INCLUDE 8640 . 9129) (LA.WINDOW.FROM.TEXTSTREAM 9131 . 9577) ( -TEDIT.ASSURE.NO.BACKING.FILE 9579 . 12145))))) + (FILEMAP (NIL (1337 11935 (LA.ADJUST.FORMATTING 1347 . 7483) (LA.SKIP.LOOKS.LIST 7485 . 8059) ( +LA.DETACH.TEDIT 8061 . 8426) (LA.TEDIT.INCLUDE 8428 . 8917) (LA.WINDOW.FROM.TEXTSTREAM 8919 . 9365) ( +TEDIT.ASSURE.NO.BACKING.FILE 9367 . 11933))))) STOP diff --git a/library/lafite/LAFITETEDIT.LCOM b/library/lafite/LAFITETEDIT.LCOM index 040f78b3..ef5ac6d3 100644 Binary files a/library/lafite/LAFITETEDIT.LCOM and b/library/lafite/LAFITETEDIT.LCOM differ diff --git a/lispusers/EXAMINEDEFS b/lispusers/EXAMINEDEFS index 7aa1ac86..7274fa5b 100644 --- a/lispusers/EXAMINEDEFS +++ b/lispusers/EXAMINEDEFS @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "24-Jun-2022 18:52:03"  -{DSK}kaplan>Local>medley3.5>working-medley>lispusers>EXAMINEDEFS.;39 12695 +(FILECREATED " 9-Jul-2022 11:05:08"  +{DSK}kaplan>Local>medley3.5>working-medley>lispusers>EXAMINEDEFS.;40 12957 :CHANGES-TO (FNS EXAMINEDEFS) - :PREVIOUS-DATE "23-Jun-2022 17:58:57" -{DSK}kaplan>Local>medley3.5>working-medley>lispusers>EXAMINEDEFS.;38) + :PREVIOUS-DATE "24-Jun-2022 18:52:03" +{DSK}kaplan>Local>medley3.5>working-medley>lispusers>EXAMINEDEFS.;39) (PRETTYCOMPRINT EXAMINEDEFSCOMS) @@ -19,7 +19,8 @@ (DEFINEQ (EXAMINEDEFS - [LAMBDA (NAME TYPE SOURCE1 SOURCE2 TITLE1 TITLE2 REGION) (* ; "Edited 24-Jun-2022 18:51 by rmk") + [LAMBDA (NAME TYPE SOURCE1 SOURCE2 TITLE1 TITLE2 REGION) (* ; "Edited 9-Jul-2022 11:04 by rmk") + (* ; "Edited 24-Jun-2022 18:51 by rmk") (* ; "Edited 23-Jun-2022 17:58 by rmk") (* ; "Edited 25-Feb-2022 15:01 by rmk") @@ -132,7 +133,9 @@ TEXTWIDTH) (TEDITDEF NAME DEF2 TYPE NIL TEXTWIDTH) - 'LINE REGION (LIST TITLE1 TITLE2) + 'LINE + (OR REGION (GETPOSITION)) + (LIST TITLE1 TITLE2) (CONCAT "Compare sources of " NAME " as " TYPE) TEXTWIDTH TEXTHEIGHT)) @@ -213,6 +216,6 @@ (FILESLOAD (SYSLOAD) COMPARETEXT) (DECLARE%: DONTCOPY - (FILEMAP (NIL (671 12553 (EXAMINEDEFS 681 . 9275) (EXAMINEFILES 9277 . 10672) (TEDITDEF 10674 . 12551) + (FILEMAP (NIL (671 12815 (EXAMINEDEFS 681 . 9537) (EXAMINEFILES 9539 . 10934) (TEDITDEF 10936 . 12813) )))) STOP diff --git a/lispusers/EXAMINEDEFS.LCOM b/lispusers/EXAMINEDEFS.LCOM index 48c6f385..e901ca68 100644 Binary files a/lispusers/EXAMINEDEFS.LCOM and b/lispusers/EXAMINEDEFS.LCOM differ diff --git a/lispusers/GITFNS b/lispusers/GITFNS index c8843189..acb7fcf3 100644 --- a/lispusers/GITFNS +++ b/lispusers/GITFNS @@ -1,13 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "26-Jun-2022 13:33:07"  -{DSK}kaplan>Local>medley3.5>working-medley>lispusers>GITFNS.;318 101193 +(FILECREATED " 9-Jul-2022 19:01:45"  +{DSK}kaplan>Local>medley3.5>working-medley>lispusers>GITFNS.;397 109555 - :CHANGES-TO (COMMANDS prc) - (FNS GIT-COMMIT-DIFFS) + :CHANGES-TO (FNS GIT-PRC-MENU GIT-COMMAND-TO-FILE) + (COMMANDS prc) - :PREVIOUS-DATE "25-Jun-2022 21:38:07" -{DSK}kaplan>Local>medley3.5>working-medley>lispusers>GITFNS.;317) + :PREVIOUS-DATE " 8-Jul-2022 10:37:36" +{DSK}kaplan>local>medley3.5>working-medley>lispusers>GITFNS.;390) (PRETTYCOMPRINT GITFNSCOMS) @@ -26,7 +26,7 @@ (COMS (FNS GIT-CLONEP GIT-MAKE-PROJECT GIT-GET-PROJECT GIT-PROJECT-PATH FIND-ANCESTOR-DIRECTORY GIT-FIND-CLONE GIT-MAINBRANCH GIT-MAINBRANCH?) - (RECORDS GIT-PROJECT) + (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS GIT-PROJECT)) (INITVARS (GIT-DEFAULT-PROJECT 'MEDLEY) (GIT-PROJECTS NIL))) (P (GIT-MAKE-PROJECT 'MEDLEY T T '(EXPORTS.ALL RDSYS RDSYS.LCOM loadups/ patches/ tmp/ @@ -60,7 +60,8 @@ (* ;; "Git commands") (FNS GIT-COMMIT GIT-PUSH GIT-PULL GIT-APPROVAL GIT-GET-FILE GIT-FILE-EXISTS? - GIT-REMOTE-UPDATE GIT-REMOTE-ADD GIT-FILE-DATE) + GIT-REMOTE-UPDATE GIT-REMOTE-ADD GIT-FILE-DATE GIT-FILE-HISTORY GIT-PRINT-FILE-HISTORY + GIT-FETCH) (* ;; "Differences") @@ -101,7 +102,7 @@ (* ;; "Utilities") - (FNS CDGITDIR GIT-COMMAND GITORIGIN GIT-INITIALS) + (FNS CDGITDIR GIT-COMMAND GITORIGIN GIT-INITIALS GIT-COMMAND-TO-FILE) (PROPS (GITFNS FILETYPE)))) @@ -146,6 +147,7 @@ (GIT-MAKE-PROJECT [LAMBDA (PROJECTNAME PROJECTPATH WORKINGPATH EXCLUSIONS DEFAULTSUBDIRS) + (* ; "Edited 6-Jul-2022 19:34 by rmk") (* ; "Edited 17-May-2022 17:08 by rmk") (* ; "Edited 13-May-2022 10:40 by rmk") (* ; "Edited 12-May-2022 00:26 by rmk") @@ -264,16 +266,14 @@ EXCLUSIONS _ EXCLUSIONS DEFAULTSUBDIRS _ (MKLIST DEFAULTSUBDIRS) CLONEPATH _ CLONEPATH)) - (REPLACE MAINBRANCH OF PROJECT WITH (OR (GIT-BRANCH-EXISTS? 'origin/main T PROJECT) - (GIT-BRANCH-EXISTS? 'origin/master NIL PROJECT)) - ) (/RPLACD [OR (ASSOC PROJECTNAME GIT-PROJECTS) (CAR (PUSH GIT-PROJECTS (CONS PROJECTNAME] PROJECT) PROJECTNAME))]) (GIT-GET-PROJECT - [LAMBDA (PROJECT NOERROR FIELD) (* ; "Edited 13-May-2022 10:40 by rmk") + [LAMBDA (PROJECT FIELD NOERROR) (* ; "Edited 7-Jul-2022 11:25 by rmk") + (* ; "Edited 13-May-2022 10:40 by rmk") (* ; "Edited 9-May-2022 20:02 by rmk") (* ; "Edited 8-May-2022 11:38 by rmk") (CL:WHEN (SETQ PROJECT (IF (TYPE? GIT-PROJECT PROJECT) @@ -292,7 +292,12 @@ (DEFAULTSUBDIRS (FETCH DEFAULTSUBDIRS OF PROJECT)) (CLONEPATH (FETCH CLONEPATH OF PROJECT)) - (MAINBRANCH (FETCH MAINBRANCH OF PROJECT)) + (MAINBRANCH [OR (FETCH MAINBRANCH OF PROJECT) + (REPLACE MAINBRANCH OF PROJECT WITH (OR (GIT-BRANCH-EXISTS? 'origin/main + T PROJECT) + (GIT-BRANCH-EXISTS? + 'origin/master NIL PROJECT + ]) PROJECT))]) (GIT-PROJECT-PATH @@ -336,8 +341,9 @@ (ERROR "NOT A GIT CLONE" PROJECTPATH]) (GIT-MAINBRANCH - [LAMBDA (PROJECT LOCAL NOERROR) (* ; "Edited 9-May-2022 16:34 by rmk") - (LET [(MB (GIT-GET-PROJECT PROJECT NOERROR 'MAINBRANCH] + [LAMBDA (PROJECT LOCAL NOERROR) (* ; "Edited 7-Jul-2022 11:16 by rmk") + (* ; "Edited 9-May-2022 16:34 by rmk") + (LET ((MB (GIT-GET-PROJECT PROJECT 'MAINBRANCH NOERROR))) (CL:IF LOCAL (CONCAT "local/" (STRIPWHERE MB)) MB)]) @@ -350,10 +356,12 @@ THEN NIL ELSE (ERROR "Can't modify main branch" BRANCH]) ) +(DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (TYPERECORD GIT-PROJECT (PROJECTNAME GITHOST WHOST EXCLUSIONS DEFAULTSUBDIRS CLONEPATH MAINBRANCH)) ) +) (RPAQ? GIT-DEFAULT-PROJECT 'MEDLEY) @@ -388,7 +396,7 @@ (LET ((SUBDIRS (AND SUBDIR (CONS SUBDIR OTHERS))) PROJECT) (SETQ SUBDIRS (FOR STAIL ON SUBDIRS COLLECT (IF (GIT-GET-PROJECT (CAR STAIL) - T) + NIL T) THEN (SETQ PROJECT (CAR STAIL)) (GO $$OUT)) (CAR STAIL))) @@ -399,6 +407,7 @@ (* ;; "Compares 2 git branches. Defaults to local/ if LOCAL, otherwise defaults to origin/. BRANCH2 defaults to the main branch (origin/ or local/ depending on LOCAL)") (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) + (GIT-FETCH PROJECT) (SETQ BRANCH1 (SELECTQ (U-CASE BRANCH1) ((NIL T) (GIT-MY-CURRENT-BRANCH PROJECT)) @@ -421,24 +430,28 @@ (* ;; "Compares REMOTEBRANCH against the main orign branch, for pull-request assessment") (LET ((RB REMOTEBRANCH) - (DR DRAFTS)) + (DR DRAFTS) + (PRS)) (IF PROJECT THEN (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) - ELSEIF (GIT-GET-PROJECT RB T) + ELSEIF (GIT-GET-PROJECT RB NIL T) THEN (SETQ PROJECT RB) (SETQ RB NIL) - ELSEIF (GIT-GET-PROJECT DRAFTS T) + ELSEIF (GIT-GET-PROJECT DRAFTS NIL T) THEN (SETQ PROJECT DRAFTS) (SETQ DRFTS NIL)) (CL:WHEN (MEMB (U-CASE RB) '(DRAFT DRAFTS)) (SETQ RB NIL) (SETQ DR T)) - (GIT-COMMAND "git fetch") - (CL:WHEN (OR RB (SETQ RB (GIT-PICK-BRANCH (GIT-PRC-MENU DR PROJECT) - "Pull requests"))) - (GIT-BRANCHES-COMPARE-DIRECTORIES RB (GIT-MAINBRANCH PROJECT) - NIL PROJECT)))) + (GIT-FETCH PROJECT) + (SETQ PRS (GIT-PULL-REQUESTS T DR PROJECT)) + (IF PRS + THEN (CL:WHEN (OR RB (SETQ RB (GIT-PICK-BRANCH (GIT-PRC-MENU DR PROJECT PRS) + "Pull requests"))) + (GIT-BRANCHES-COMPARE-DIRECTORIES RB (GIT-MAINBRANCH PROJECT) + NIL PROJECT)) + ELSE "No open pull requests"))) (DEFCOMMAND cob (BRANCH NEXTTITLESTRING PROJECT) @@ -447,10 +460,11 @@ (CL:UNLESS (STRINGP NEXTTITLESTRING) (SETQ PROJECT NEXTTITLESTRING)) (CL:UNLESS PROJECT - (CL:WHEN (GIT-GET-PROJECT BRANCH T) + (CL:WHEN (GIT-GET-PROJECT BRANCH NIL T) (SETQ PROJECT BRANCH) (SETQ BRANCH NIL))) (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) + (GIT-FETCH PROJECT) (SELECTQ (U-CASE BRANCH) (T (GIT-CHECKOUT (GIT-MY-CURRENT-BRANCH PROJECT) PROJECT)) @@ -459,34 +473,35 @@ (CL:WHEN [SETQ BRANCH (IF BRANCH THEN (GIT-LONG-NAME BRANCH NIL PROJECT) ELSE (GIT-PICK-BRANCH (GIT-BRANCHES 'LOCAL PROJECT T) - (CONCAT (L-CASE (FETCH PROJECTNAME OF PROJECT) + (CONCAT (L-CASE (GIT-GET-PROJECT PROJECT 'PROJECTNAME) T) " branches"] (GIT-CHECKOUT BRANCH PROJECT)))) (DEFCOMMAND b? (PROJECT) (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) - (CONCAT (L-CASE (FETCH PROJECTNAME OF PROJECT) + (GIT-FETCH PROJECT) + (CONCAT (L-CASE (GIT-GET-PROJECT PROJECT 'PROJECTNAME) T) " " (GIT-WHICH-BRANCH PROJECT))) -(DEFCOMMAND cdg (PROJECT SUBDIR) (CL:UNLESS (GIT-GET-PROJECT PROJECT T 'GHOST) +(DEFCOMMAND cdg (PROJECT SUBDIR) (CL:UNLESS (GIT-GET-PROJECT PROJECT NIL T) (SETQ SUBDIR PROJECT) (SETQ PROJECT GIT-DEFAULT-PROJECT)) (CL:WHEN [AND SUBDIR (NOT (MEMB (CHCON1 SUBDIR)) (CHARCODE (> /] (SETQ SUBDIR (CONCAT SUBDIR "/"))) - (SLASHIT (/CNDIR (CONCAT (TRUEFILENAME (GIT-GET-PROJECT PROJECT NIL 'GITHOST)) + (SLASHIT (/CNDIR (CONCAT (TRUEFILENAME (GIT-GET-PROJECT PROJECT 'GITHOST)) (OR SUBDIR ""))) T)) -(DEFCOMMAND cdw (PROJECT SUBDIR) (CL:UNLESS (GIT-GET-PROJECT PROJECT T) +(DEFCOMMAND cdw (PROJECT SUBDIR) (CL:UNLESS (GIT-GET-PROJECT PROJECT NIL T) (SETQ SUBDIR PROJECT) (SETQ PROJECT GIT-DEFAULT-PROJECT)) (CL:WHEN [AND SUBDIR (NOT (MEMB (CHCON1 SUBDIR)) (CHARCODE (> /] (SETQ SUBDIR (CONCAT SUBDIR "/"))) - (SLASHIT (/CNDIR (CONCAT (TRUEFILENAME (GIT-GET-PROJECT PROJECT NIL 'WHOST)) + (SLASHIT (/CNDIR (CONCAT (TRUEFILENAME (GIT-GET-PROJECT PROJECT 'WHOST)) (OR SUBDIR ""))) T)) @@ -787,6 +802,12 @@ (GIT-GET-FILE [LAMBDA (BRANCH GITFILE LOCALFILE NOERROR PROJECT) + (* ;; "Edited 8-Jul-2022 10:36 by rmk") + + (* ;; "Edited 5-Jul-2022 00:09 by rmk: Redirect show command to tmp/ rename to localfile") + + (* ;; "Edited 30-Jun-2022 22:09 by rmk") + (* ;; "Edited 22-May-2022 17:34 by rmk") (* ;; "Edited 8-May-2022 16:54 by rmk: the stream, not the name because of the NODIRCORE case.") @@ -799,51 +820,32 @@ (CL:WHEN (AND BRANCH (STRPOS "local/" BRANCH 1 NIL T)) (SETQ BRANCH (SUBSTRING BRANCH 7))) - (CL:WITH-OPEN-STREAM (s (CREATE-PROCESS-STREAM (CONCAT (CDGITDIR PROJECT) - "git show " BRANCH ":" GITFILE))) - (SETFILEINFO s 'ENDOFSTREAMOP (FUNCTION NILL)) - (LET (BYTES) - (IF (FOR I B C FROM 1 WHILE (SETQ C (NTHCHARCODE "fatal: " I)) - DO - (* ;; - "Returns NIL if we run off the fatal string with a match, otherwise T") - - (CL:UNLESS (SETQ B (\BIN s)) - (RETURN T)) - (PUSH BYTES B) - (CL:UNLESS (EQ B C) - (RETURN T))) - THEN - (* ;; "Don't open STREAM until we know the file is real") - - (CL:WITH-OPEN-FILE (STREAM (OR LOCALFILE '{NODIRCORE) - :IF-EXISTS :NEW-VERSION :DIRECTION :IO) - (FOR B IN (DREVERSE BYTES) DO (\BOUT STREAM B)) - [DO (\BOUT STREAM (OR (\BIN s) - (RETURN] - (SETFILEINFO STREAM 'CREATIONDATE (OR (FILEDATE STREAM T) - (FILEDATE STREAM) - (GIT-FILE-DATE GITFILE BRANCH - PROJECT))) - STREAM) - ELSEIF NOERROR - THEN NIL - ELSE (ERROR "GIT FILE NOT FOUND" GITFILE]) + (LET ((RESULTFILE (GIT-COMMAND-TO-FILE (CONCAT "git show " BRANCH ":" GITFILE) + PROJECT T)) + TYPE DATE) + (CL:WHEN (LISTP RESULTFILE) (* ; "CADR is Unix error stream") + (CL:WITH-OPEN-FILE (ESTREAM (CADR RESULTFILE) + :DIRECTION :INPUT :EXTERNAL-FORMAT (SYSTEM-EXTERNALFORMAT)) + (COPYCHARS ESTREAM T)) + (DELFILE (CADR RESULTFILE)) + (SETQ RESULTFILE (CAR RESULTFILE))) + (IF RESULTFILE + THEN (CL:MULTIPLE-VALUE-SETQ (TYPE DATE) + (LISPFILETYPE RESULTFILE)) + (SETFILEINFO RESULTFILE 'CREATIONDATE (OR DATE (GIT-FILE-DATE GITFILE BRANCH + PROJECT))) + (RENAMEFILE RESULTFILE LOCALFILE) + ELSEIF NOERROR + THEN NIL + ELSE (ERROR "GIT FILE NOT FOUND" GITFILE]) (GIT-FILE-EXISTS? - [LAMBDA (BRANCH GITFILE PROJECT) (* ; "Edited 8-May-2022 00:02 by rmk") - (* ; "Edited 6-Mar-2022 19:04 by rmk") - (* ; "Edited 10-Feb-2022 20:55 by rmk") - (* ; "Edited 10-Dec-2021 21:30 by rmk") + [LAMBDA (GFILE BRANCH PROJECT) (* ; "Edited 5-Jul-2022 10:27 by rmk") - (* ;; "T if GITFILE exists on BRANCH. If s is EOFP, the file exists but is empty") + (* ;; "If the noerror DATE is NIL, the file doesn't exist. ") - (CL:WITH-OPEN-STREAM (s (CREATE-PROCESS-STREAM (CONCAT (CDGITDIR PROJECT) - "git show " BRANCH ":" GITFILE))) - (SETFILEINFO s 'ENDOFSTREAMOP (FUNCTION NILL)) - (NOT (FOR I C FROM 1 WHILE (SETQ C (NTHCHARCODE "fatal: " I)) - ALWAYS (EQ (BIN s) - C]) + (CL:WHEN (GIT-FILE-DATE GFILE BRANCH PROJECT T) + T]) (GIT-REMOTE-UPDATE [LAMBDA (DOIT PROJECT) @@ -869,9 +871,8 @@ (CAR RESULT]) (GIT-FILE-DATE - [LAMBDA (GFILE BRANCH PROJECT) (* ; "Edited 8-May-2022 16:56 by rmk") - (* ; "Edited 6-Mar-2022 17:41 by rmk") - (* ; "Edited 3-Jan-2022 19:43 by rmk") + [LAMBDA (GFILE BRANCH PROJECT NOERROR) (* ; "Edited 6-Jul-2022 19:39 by rmk") + (* ; "Edited 5-Jul-2022 10:30 by rmk") (CL:WHEN (AND NIL BRANCH (STRPOS "local/" BRANCH 1 NIL T)) (SETQ BRANCH (SUBSTRING BRANCH 7))) (LET [(DATE (CAR (GIT-COMMAND (CONCAT "git log -1 --pretty=%"format:%%cD%" " @@ -880,7 +881,70 @@ "") (GIT-REPO-FILENAME GFILE PROJECT)) NIL T PROJECT] + (CL:UNLESS (OR DATE NOERROR) + + (* ;; "We suppressed the generic error in GIT-COMMAND, so we could do our own thing") + + (ERROR "GIT FILE NOT FOUND" GFILE)) DATE]) + +(GIT-FILE-HISTORY + [LAMBDA (FILE PROJECT PRINT) (* ; "Edited 4-Jul-2022 23:09 by rmk") + (* ; "Edited 1-Jul-2022 22:57 by rmk") + (LET ((LINES (GIT-COMMAND (CONCAT "git log --date=rfc -- " (GIT-REPO-FILENAME FILE PROJECT)) + T NIL (GIT-GET-PROJECT PROJECT))) + VAL) + [FOR L COMMIT COMMENTS POS IN (REVERSE LINES) UNLESS (ZEROP (NCHARS L)) + DO (IF (STRPOS "commit " L 1 NIL 1) + THEN (CL:WHEN COMMENTS + (SETQ COMMIT (NCONC1 COMMIT (CONS 'Comments COMMENTS))) + (SETQ COMMENTS NIL)) + (PUSH VAL (CONS (LIST 'commit (SUBSTRING L 8)) + COMMIT)) + (SETQ COMMIT NIL) + ELSEIF (EQ (CHARCODE SPACE) + (CHCON1 L)) + THEN (PUSH COMMENTS (OR (SUBSTRING L (FIND I FROM 2 + SUCHTHAT (NEQ (CHARCODE SPACE) + (NTHCHARCODE L I))) + -1) + T)) + ELSE (PUSH COMMIT (LIST [SUBATOM L 1 (OR (SETQ POS (SUB1 (STRPOS ": " L 1] + (SUBSTRING L (FIND I FROM (IPLUS 2 POS) + SUCHTHAT (NEQ (CHARCODE SPACE) + (NTHCHARCODE L I))) + -1] + (CL:WHEN PRINT (GIT-PRINT-FILE-HISTORY VAL)) + (CONS (GIT-REPO-FILENAME FILE PROJECT) + VAL]) + +(GIT-PRINT-FILE-HISTORY + [LAMBDA (COMMITS AUTHORS) (* ; "Edited 2-Jul-2022 00:21 by rmk") + (PRINTOUT T (CAR COMMITS) + T) + (FOR C AU IN (CDR COMMITS) EACHTIME (SETQ AU (CADR (ASSOC 'Author C))) + WHEN (OR (NULL AUTHORS) + (THEREIS A INSIDE AUTHORS SUCHTHAT (STRPOS A AU 1 NIL NIL NIL UPPERCASEARRAY))) + DO (PRINTOUT T 5 (CAAR C) + ": " + (CADAR C) + T) + (FOR X IN (CDR C) + DO (PRINTOUT T 10 (CAR X) + ": ") + (IF (EQ (CAR X) + 'Comments) + THEN (FOR CC (POS _ (POSITION T)) IN (CDR X) + DO (IF (EQ CC T) + THEN (TERPRI T) + ELSE (PRINTOUT T .TAB0 POS CC))) + ELSE (PRINTOUT T (CADR X))) + (TERPRI T)) + (TERPRI T]) + +(GIT-FETCH + [LAMBDA (PROJECT) (* ; "Edited 8-Jul-2022 10:32 by rmk") + (GIT-COMMAND "git fetch" T NIL PROJECT]) ) @@ -1047,12 +1111,21 @@ 0])]) (GIT-CHECKOUT - [LAMBDA (BRANCH PROJECT) (* ; "Edited 9-May-2022 15:12 by rmk") + [LAMBDA (BRANCH PROJECT) (* ; "Edited 7-Jul-2022 20:21 by rmk") + (* ; "Edited 9-May-2022 15:12 by rmk") (* ; "Edited 7-May-2022 23:51 by rmk") (* ; "Edited 2-Nov-2021 22:40 by rmk:") - (CAR (GIT-COMMAND (CONCAT "git checkout " (OR BRANCH (GIT-MAINBRANCH PROJECT)) - "; git pull") - NIL NIL PROJECT]) + (CL:UNLESS BRANCH + (SETQ BRANCH (GIT-MAINBRANCH PROJECT))) + (LET ((CURRENTBRANCH (GIT-WHICH-BRANCH PROJECT))) + [SETQ CURRENTBRANCH (SUBSTRING CURRENTBRANCH (ADD1 (STRPOS "/" CURRENTBRANCH] + (CL:UNLESS [STRING.EQUAL CURRENTBRANCH (SUBSTRING BRANCH (ADD1 (OR (STRPOS "/" BRANCH) + 0] + (GIT-COMMAND (CONCAT "git checkout " BRANCH) + NIL T PROJECT) + (CAR (GIT-COMMAND (CONCAT "git pull") + NIL T PROJECT))) + BRANCH]) (GIT-WHICH-BRANCH [LAMBDA (PROJECT) (* ; "Edited 7-May-2022 22:41 by rmk") @@ -1096,7 +1169,8 @@ ELSE (HELP "Unexpected git result" RESULT]) (GIT-BRANCHES - [LAMBDA (WHERE PROJECT EXCLUDEMERGED) (* ; "Edited 23-May-2022 14:25 by rmk") + [LAMBDA (WHERE PROJECT EXCLUDEMERGED) (* ; "Edited 8-Jul-2022 10:33 by rmk") + (* ; "Edited 23-May-2022 14:25 by rmk") (* ; "Edited 19-May-2022 10:06 by rmk") (* ; "Edited 9-May-2022 14:10 by rmk") (* ; "Edited 7-May-2022 23:29 by rmk") @@ -1116,7 +1190,7 @@ (SETQ BRANCHES (APPEND LOCAL REMOTE)) (CL:WHEN EXCLUDEMERGED (SETQ BRANCHES (FOR B (MAINBRANCH _ (GIT-MAINBRANCH PROJECT 'LOCAL)) IN BRANCHES - UNLESS (GIT-COMMIT-DIFFS MAINBRANCH B PROJECT) COLLECT B))) + WHEN (GIT-COMMIT-DIFFS B MAINBRANCH PROJECT) COLLECT B))) (SORT BRANCHES]) (GIT-BRANCH-EXISTS? @@ -1142,11 +1216,13 @@ MENUFONT _ DEFAULTFONT)))]) (GIT-PRC-MENU - [LAMBDA (DRAFT PROJECT) (* ; "Edited 16-May-2022 19:44 by rmk") - (LET ((PRS (GIT-PULL-REQUESTS T DRAFT PROJECT))) - (CL:WHEN PRS - (SETQ RELATIONS (GIT-BRANCH-RELATIONS (FOR PR IN PRS COLLECT (GITORIGIN (CADDR PR))) - NIL T PROJECT)) + [LAMBDA (DRAFT PROJECT PRS) (* ; "Edited 9-Jul-2022 19:01 by rmk") + (* ; "Edited 16-May-2022 19:44 by rmk") + (CL:UNLESS PRS + (SETQ PRS (GIT-PULL-REQUESTS T DRAFT PROJECT))) + (CL:WHEN PRS + (LET ((RELATIONS (GIT-BRANCH-RELATIONS (FOR PR IN PRS COLLECT (GITORIGIN (CADDR PR))) + NIL T PROJECT))) (SORT [FOR PR REL LABEL (SUPERSETS _ (CAR RELATIONS)) (EQUALS _ (CADR RELATIONS)) IN PRS COLLECT (SETQ LABEL (IF [SETQ REL (CAR (CDR (SASSOC (CADDR PR) @@ -1165,7 +1241,7 @@ (CONCAT " " (CADR PR) " #" (CAR PR] - T))]) + T)))]) (GIT-PULL-REQUESTS [LAMBDA (ALLINFO INCLUDEDRAFTS PROJECT) (* ; "Edited 9-May-2022 16:54 by rmk") @@ -1615,7 +1691,8 @@ 'differences)]) (GIT-COMPARE-WORKTREE - [LAMBDA (BRANCH DONTUPDATE PROJECT) (* ; "Edited 9-May-2022 16:17 by rmk") + [LAMBDA (BRANCH DONTUPDATE PROJECT) (* ; "Edited 7-Jul-2022 11:17 by rmk") + (* ; "Edited 9-May-2022 16:17 by rmk") (CL:UNLESS DONTUPDATE (GIT-ADD-WORKTREE BRANCH T PROJECT) (GIT-ADD-WORKTREE (GIT-MAINBRANCH PROJECT) @@ -1625,7 +1702,7 @@ (CL:UNLESS DONTUPDATE (GIT-ADD-WORKTREE BRANCH T PROJECT) (GIT-ADD-WORKTREE MAINBRANCH T PROJECT)) - (PRINTOUT T T "Comparing " (GIT-GET-PROJECT PROJECT NIL 'PROJECTNAME) + (PRINTOUT T T "Comparing " (GIT-GET-PROJECT PROJECT 'PROJECTNAME) (FETCH PROJECTNAME OF PROJECT) " origin/" BRANCH " and " MAINBRANCH T) (FOR FILE BFILE MFILE IN (GIT-BRANCH-DIFF BRANCH MAINBRANCH PROJECT) @@ -1813,11 +1890,12 @@ (SHOULDNT]) (GIT-WORKING-COMPARE-FILES - [LAMBDA (FILE PROJECT) (* ; "Edited 22-May-2022 14:45 by rmk") - (LET ((FILE1 (UNSLASHIT (PACKFILENAME 'HOST (GIT-GET-PROJECT PROJECT NIL 'WHOST) + [LAMBDA (FILE PROJECT) (* ; "Edited 7-Jul-2022 11:17 by rmk") + (* ; "Edited 22-May-2022 14:45 by rmk") + (LET ((FILE1 (UNSLASHIT (PACKFILENAME 'HOST (GIT-GET-PROJECT PROJECT 'WHOST) 'BODY FILE) T)) - (FILE2 (SLASHIT (PACKFILENAME 'HOST (GIT-GET-PROJECT PROJECT NIL 'GITHOST) + (FILE2 (SLASHIT (PACKFILENAME 'HOST (GIT-GET-PROJECT PROJECT 'GITHOST) 'BODY FILE) T))) (CD-COMPARE-FILES FILE1 FILE2 FILE1 FILE2]) @@ -1859,16 +1937,16 @@ (DEFINEQ (CDGITDIR - [LAMBDA (PROJECT) (* ; "Edited 7-May-2022 22:41 by rmk") + [LAMBDA (PROJECT) (* ; "Edited 8-Jul-2022 10:34 by rmk") + (* ; "Edited 7-Jul-2022 09:36 by rmk") + (* ; "Edited 7-May-2022 22:41 by rmk") (* ; "Edited 2-Nov-2021 21:12 by rmk:") - - (* ;; "Strips off {UNIX}") - (CONCAT "cd " [SLASHIT (STRIPHOST (TRUEFILENAME (FETCH GITHOST OF PROJECT] - " ; "]) + " && "]) (GIT-COMMAND - [LAMBDA (CMD ALL NOERROR PROJECT) (* ; "Edited 7-May-2022 22:40 by rmk") + [LAMBDA (CMD ALL NOERROR PROJECT) (* ; "Edited 8-Jul-2022 10:20 by rmk") + (* ; "Edited 7-May-2022 22:40 by rmk") (* ; "Edited 7-Oct-2021 11:15 by rmk:") (* ;; "Suppress .git lines unless ALL") @@ -1880,21 +1958,23 @@ [BIND LPOS WHILE (SETQ LPOS (STRPOS "local/" CMD)) DO (SETQ CMD (CONCAT (SUBSTRING CMD 1 (SUB1 LPOS)) (SUBSTRING CMD (IPLUS LPOS (NCHARS "local/"] - (CL:WITH-OPEN-FILE (STREAM "{NODIRCORE}shell-dribble.txt" :DIRECTION :IO) - (ShellCommand (CONCAT (CDGITDIR PROJECT) - CMD) - STREAM) - (SETFILEPTR STREAM 0) - (BIND LINE UNTIL (EOFP STREAM) - WHEN [PROGN (SETQ LINE (CL:READ-LINE STREAM :EOF-ERROR-P NIL :EOF-VALUE NIL)) - (OR ALL (NOT (STRPOS ".git" LINE 1 NIL T] COLLECT LINE - FINALLY (CL:UNLESS NOERROR - (CL:WHEN (OR (EQ 1 (STRPOS "fatal" (CAR $$VAL) - 1 NIL T)) - (EQ 1 (STRPOS "gh: Command not found" (CAR $$VAL) - 1 NIL T))) - (ERROR (CONCAT "Git command %"" CMD "%" failed") - (CAR $$VAL))))]) + (LET (LINES (RESULTFILE (GIT-COMMAND-TO-FILE CMD PROJECT NOERROR))) + (CL:WHEN (LISTP RESULTFILE) (* ; "CADR is Unix error stream") + (CL:WITH-OPEN-FILE (ESTREAM (CADR RESULTFILE) + :DIRECTION :INPUT :EXTERNAL-FORMAT (SYSTEM-EXTERNALFORMAT)) + (COPYCHARS ESTREAM T)) + (DELFILE (CADR RESULTFILE)) + (SETQ RESULTFILE (CAR RESULTFILE))) + (CL:WHEN RESULTFILE + (SETQ LINES (CL:WITH-OPEN-FILE (STREAM RESULTFILE :DIRECTION :INPUT :EXTERNAL-FORMAT + (SYSTEM-EXTERNALFORMAT)) + (BIND LINE UNTIL (EOFP STREAM) + WHEN [PROGN (SETQ LINE (CL:READ-LINE STREAM :EOF-ERROR-P NIL + :EOF-VALUE NIL)) + (OR ALL (NOT (STRPOS ".git" LINE 1 NIL T] COLLECT + LINE))) + (DELFILE RESULTFILE) (* ; "On tmp/, OK if we miss") + LINES)]) (GITORIGIN [LAMBDA (BRANCH LOCAL) (* ; "Edited 9-May-2022 14:26 by rmk") @@ -1919,32 +1999,94 @@ (SUBSTRING INITIALS 1 -2) INITIALS) (ERROR "INITIALS is not set"]) + +(GIT-COMMAND-TO-FILE + [LAMBDA (CMD PROJECT NOERROR) (* ; "Edited 9-Jul-2022 18:55 by rmk") + (* ; "Edited 8-Jul-2022 08:51 by rmk") + + (* ;; "Try to make the temporary name unique. Maybe Unix mktemp, except that we need to know the name that was used. So we calculate it, provide it, and assume that it worked. Caller an decide to delete it after examination. (Or, left to be reaped from /tmp/)") + + (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) + + (* ;; + "Filename of the form /tmp/medley-gitresult-{IDATE}-{rand} -- Avoid creating new unix directory") + + (LET* ([PROJECTNAME (L-CASE (GIT-GET-PROJECT PROJECT 'PROJECTNAME] + (DATE (IDATE)) + (RAND (RAND)) + (RESULTFILE (CONCAT "{UNIX}/tmp/" PROJECTNAME "-" DATE "-" RAND "-result")) + (ERRORFILE (CONCAT "{UNIX}/tmp/" PROJECTNAME "-" DATE "-" RAND "-error")) + COMPLETED) + [CL:WITH-OPEN-STREAM (PS (CREATE-PROCESS-STREAM (CONCAT (CDGITDIR PROJECT) + CMD " > " (STRIPHOST RESULTFILE) + " 2> " + (STRIPHOST ERRORFILE) + " && echo COMPLETED "))) + (CLOSEF? ERRORFILE) + + (* ;; + "Avoid reading the process stream if there is another error signal. It ends to hang.") + + (SETQ COMPLETED (IF (AND (INFILEP ERRORFILE) + (IGREATERP (GETFILEINFO ERRORFILE 'LENGTH) + 0)) + THEN [CL:WITH-OPEN-FILE (ESTREAM ERRORFILE :DIRECTION :INPUT + :EXTERNAL-FORMAT ( + SYSTEM-EXTERNALFORMAT + )) + (OR (NEQ 0 (OR (FILEPOS "fatal: " ESTREAM 0 1) + (FILEPOS "gh: Command not found" + ESTREAM 0 1) + (FILEPOS "unknown command %"" ESTREAM + 0 1))) + (FILEPOS "' is not a git command." ESTREAM + (NCHARS CMD] + ELSE (SETFILEINFO PS 'ENDOFSTREAMOP (FUNCTION NILL)) + (STREQUAL "COMPLETED" (RSTRING PS] + (CLOSEF? RESULTFILE) + (IF COMPLETED + THEN (IF (IEQP 0 (GETFILEINFO ERRORFILE 'LENGTH)) + THEN (DELFILE ERRORFILE) + (SETQ ERRORFILE NIL) + ELSEIF (IEQP 0 (GETFILEINFO RESULTFILE 'LENGTH)) + THEN (SETQ RESULTFILE ERRORFILE) + (SETQ ERRORFILE NIL)) + (IF ERRORFILE + THEN (LIST RESULTFILE ERRORFILE) + ELSE RESULTFILE) + ELSE (DELFILE RESULTFILE) + (DELFILE ERRORFILE) + (IF NOERROR + THEN NIL + ELSE (ERROR (CONCAT "Command failed: " CMD]) ) (PUTPROPS GITFNS FILETYPE :TCOMPL) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3458 17305 (GIT-CLONEP 3468 . 4731) (GIT-MAKE-PROJECT 4733 . 12845) (GIT-GET-PROJECT -12847 . 14184) (GIT-PROJECT-PATH 14186 . 15230) (FIND-ANCESTOR-DIRECTORY 15232 . 15581) ( -GIT-FIND-CLONE 15583 . 16664) (GIT-MAINBRANCH 16666 . 16950) (GIT-MAINBRANCH? 16952 . 17303)) (23311 -26099 (ALLSUBDIRS 23321 . 24607) (MEDLEYSUBDIRS 24609 . 25302) (GITSUBDIRS 25304 . 26097)) (26100 -30890 (TOGIT 26110 . 27516) (FROMGIT 27518 . 28499) (GIT-DELETE-FILE 28501 . 29347) ( -MYMEDLEY-DELETE-FILES 29349 . 30888)) (30891 33423 (MYMEDLEYSUBDIR 30901 . 31357) (GITSUBDIR 31359 . -31802) (STRIPDIR 31804 . 32175) (STRIPHOST 32177 . 32417) (STRIPNAME 32419 . 33172) (STRIPWHERE 33174 - . 33421)) (33424 35326 (GFILE4MFILE 33434 . 33797) (MFILE4GFILE 33799 . 34368) (GIT-REPO-FILENAME -34370 . 35324)) (35375 43176 (GIT-COMMIT 35385 . 36211) (GIT-PUSH 36213 . 36857) (GIT-PULL 36859 . -37471) (GIT-APPROVAL 37473 . 37822) (GIT-GET-FILE 37824 . 40343) (GIT-FILE-EXISTS? 40345 . 41289) ( -GIT-REMOTE-UPDATE 41291 . 42015) (GIT-REMOTE-ADD 42017 . 42324) (GIT-FILE-DATE 42326 . 43174)) (43206 -51906 (GIT-BRANCH-DIFF 43216 . 47968) (GIT-COMMIT-DIFFS 47970 . 48523) (GIT-BRANCH-RELATIONS 48525 . -51904)) (51951 60886 (GIT-BRANCH-NUM 51961 . 52534) (GIT-CHECKOUT 52536 . 53048) (GIT-WHICH-BRANCH -53050 . 53348) (GIT-MAKE-BRANCH 53350 . 55094) (GIT-BRANCHES 55096 . 56587) (GIT-BRANCH-EXISTS? 56589 - . 57293) (GIT-PICK-BRANCH 57295 . 57623) (GIT-PRC-MENU 57625 . 59253) (GIT-PULL-REQUESTS 59255 . -60272) (GIT-SHORT-BRANCH-NAME 60274 . 60565) (GIT-LONG-NAME 60567 . 60884)) (60916 64251 ( -GIT-MY-CURRENT-BRANCH 60926 . 61296) (GIT-MY-BRANCHP 61298 . 61803) (GIT-MY-NEXT-BRANCH 61805 . 62299) - (GIT-MY-BRANCHES 62301 . 64249)) (64297 68249 (GIT-ADD-WORKTREE 64307 . 65791) (GIT-REMOVE-WORKTREE -65793 . 66723) (GIT-LIST-WORKTREES 66725 . 67529) (WORKTREEDIR 67531 . 68247)) (68297 98073 ( -GIT-GET-DIFFERENT-FILES 68307 . 74132) (GIT-BRANCHES-COMPARE-DIRECTORIES 74134 . 79976) ( -GIT-WORKING-COMPARE-DIRECTORIES 79978 . 84724) (GIT-COMPARE-WORKTREE 84726 . 88599) (GITCDOBJBUTTONFN -88601 . 93091) (GIT-CD-LABELFN 93093 . 94175) (GIT-CD-MENUFN 94177 . 96384) (GIT-WORKING-COMPARE-FILES - 96386 . 96905) (GIT-BRANCHES-COMPARE-FILES 96907 . 98071)) (98143 101126 (CDGITDIR 98153 . 98531) ( -GIT-COMMAND 98533 . 100119) (GITORIGIN 100121 . 100818) (GIT-INITIALS 100820 . 101124))))) + (FILEMAP (NIL (3592 18006 (GIT-CLONEP 3602 . 4865) (GIT-MAKE-PROJECT 4867 . 12847) (GIT-GET-PROJECT +12849 . 14774) (GIT-PROJECT-PATH 14776 . 15820) (FIND-ANCESTOR-DIRECTORY 15822 . 16171) ( +GIT-FIND-CLONE 16173 . 17254) (GIT-MAINBRANCH 17256 . 17651) (GIT-MAINBRANCH? 17653 . 18004)) (24323 +27111 (ALLSUBDIRS 24333 . 25619) (MEDLEYSUBDIRS 25621 . 26314) (GITSUBDIRS 26316 . 27109)) (27112 +31902 (TOGIT 27122 . 28528) (FROMGIT 28530 . 29511) (GIT-DELETE-FILE 29513 . 30359) ( +MYMEDLEY-DELETE-FILES 30361 . 31900)) (31903 34435 (MYMEDLEYSUBDIR 31913 . 32369) (GITSUBDIR 32371 . +32814) (STRIPDIR 32816 . 33187) (STRIPHOST 33189 . 33429) (STRIPNAME 33431 . 34184) (STRIPWHERE 34186 + . 34433)) (34436 36338 (GFILE4MFILE 34446 . 34809) (MFILE4GFILE 34811 . 35380) (GIT-REPO-FILENAME +35382 . 36336)) (36387 46175 (GIT-COMMIT 36397 . 37223) (GIT-PUSH 37225 . 37869) (GIT-PULL 37871 . +38483) (GIT-APPROVAL 38485 . 38834) (GIT-GET-FILE 38836 . 40767) (GIT-FILE-EXISTS? 40769 . 41043) ( +GIT-REMOTE-UPDATE 41045 . 41769) (GIT-REMOTE-ADD 41771 . 42078) (GIT-FILE-DATE 42080 . 43011) ( +GIT-FILE-HISTORY 43013 . 44947) (GIT-PRINT-FILE-HISTORY 44949 . 45999) (GIT-FETCH 46001 . 46173)) ( +46205 54905 (GIT-BRANCH-DIFF 46215 . 50967) (GIT-COMMIT-DIFFS 50969 . 51522) (GIT-BRANCH-RELATIONS +51524 . 54903)) (54950 64659 (GIT-BRANCH-NUM 54960 . 55533) (GIT-CHECKOUT 55535 . 56594) ( +GIT-WHICH-BRANCH 56596 . 56894) (GIT-MAKE-BRANCH 56896 . 58640) (GIT-BRANCHES 58642 . 60240) ( +GIT-BRANCH-EXISTS? 60242 . 60946) (GIT-PICK-BRANCH 60948 . 61276) (GIT-PRC-MENU 61278 . 63026) ( +GIT-PULL-REQUESTS 63028 . 64045) (GIT-SHORT-BRANCH-NAME 64047 . 64338) (GIT-LONG-NAME 64340 . 64657)) +(64689 68024 (GIT-MY-CURRENT-BRANCH 64699 . 65069) (GIT-MY-BRANCHP 65071 . 65576) (GIT-MY-NEXT-BRANCH +65578 . 66072) (GIT-MY-BRANCHES 66074 . 68022)) (68070 72022 (GIT-ADD-WORKTREE 68080 . 69564) ( +GIT-REMOVE-WORKTREE 69566 . 70496) (GIT-LIST-WORKTREES 70498 . 71302) (WORKTREEDIR 71304 . 72020)) ( +72070 102052 (GIT-GET-DIFFERENT-FILES 72080 . 77905) (GIT-BRANCHES-COMPARE-DIRECTORIES 77907 . 83749) +(GIT-WORKING-COMPARE-DIRECTORIES 83751 . 88497) (GIT-COMPARE-WORKTREE 88499 . 92477) (GITCDOBJBUTTONFN + 92479 . 96969) (GIT-CD-LABELFN 96971 . 98053) (GIT-CD-MENUFN 98055 . 100262) ( +GIT-WORKING-COMPARE-FILES 100264 . 100884) (GIT-BRANCHES-COMPARE-FILES 100886 . 102050)) (102122 +109488 (CDGITDIR 102132 . 102692) (GIT-COMMAND 102694 . 104702) (GITORIGIN 104704 . 105401) ( +GIT-INITIALS 105403 . 105707) (GIT-COMMAND-TO-FILE 105709 . 109486))))) STOP diff --git a/lispusers/GITFNS.LCOM b/lispusers/GITFNS.LCOM index e3688993..5be3dd42 100644 Binary files a/lispusers/GITFNS.LCOM and b/lispusers/GITFNS.LCOM differ diff --git a/lispusers/TEDITDORADOKEYS b/lispusers/TEDITDORADOKEYS index f4aa3122..4f459d0a 100644 --- a/lispusers/TEDITDORADOKEYS +++ b/lispusers/TEDITDORADOKEYS @@ -1,22 +1,23 @@ -(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "INTERLISP") -(FILECREATED "19-Apr-2018 12:27:21"  -|{DSK}kaplan>Local>medley3.5>lispcore>lispusers>TEDITDORADOKEYS.;2| 22264 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) - |changes| |to:| (VARS TEDITDORADOKEYSCOMS) +(FILECREATED "16-Jul-2022 23:40:36"  +|{DSK}kaplan>Local>medley3.5>working-medley>lispusers>TEDITDORADOKEYS.;2| 22214 - |previous| |date:| "28-Oct-87 19:53:12" -|{DSK}kaplan>Local>medley3.5>lispcore>lispusers>TEDITDORADOKEYS.;1|) + :CHANGES-TO (VARS TEDITDORADOKEYSCOMS) + + :PREVIOUS-DATE "19-Apr-2018 12:27:21" +|{DSK}kaplan>Local>medley3.5>working-medley>lispusers>TEDITDORADOKEYS.;1|) -; Copyright (c) 1987, 2018 by Xerox Corporation. All rights reserved. +; Copyright (c) 1987, 2018 by Xerox Corporation. (PRETTYCOMPRINT TEDITDORADOKEYSCOMS) (RPAQQ TEDITDORADOKEYSCOMS - ((FILES TEDITDCL TEDITFNKEYS) + ((FILES TEDIT-DCL TEDIT-FNKEYS) (COMS - (* |;;| - "These functions were fixed after Lyric went out so they'll ignore the meta key being down.") + (* |;;| + "These functions were fixed after Lyric went out so they'll ignore the meta key being down.") (FNS \\TEDIT.BOLD.SEL.OFF \\TEDIT.BOLD.SEL.ON \\TEDIT.CENTER.SEL \\TEDIT.CENTER.SEL.REV \\TEDIT.DEFAULTS.CARET \\TEDIT.DEFAULTSSEL \\TEDIT.SETDEFAULT.FROM.SEL @@ -25,7 +26,7 @@ \\TEDIT.SUPERSCRIPTSEL \\TEDIT.UCASE.SEL \\TEDIT.UNDERLINE.SEL.OFF \\TEDIT.UNDERLINE.SEL.ON \\TEDIT.STRIKEOUT.SEL.ON \\TEDIT.STRIKEOUT.SEL.OFF)) (COMS - (* |;;| "Specialized functions for this module") + (* |;;| "Specialized functions for this module") (FNS \\TEDIT.DK.ABORT \\TEDIT.DK.FIND \\TEDIT.DK.SUBSTITUTE \\TEDIT.DK.INSERT-PARENS \\TEDIT.DK.INSERT-NEUTRAL-DOUBLEQUOTES \\TEDIT.DK.INSERT-REAL-DOUBLEQUOTES)) @@ -65,12 +66,11 @@ (TEDIT.SETSYNTAX (CAR ENTRY) (CADR ENTRY))))))) -(FILESLOAD TEDITDCL TEDITFNKEYS) +(FILESLOAD TEDIT-DCL TEDIT-FNKEYS) -(* |;;| "These functions were fixed after Lyric went out so they'll ignore the meta key being down." -) +(* |;;| "These functions were fixed after Lyric went out so they'll ignore the meta key being down.") (DEFINEQ @@ -442,22 +442,22 @@ ("1,'" FN \\TEDIT.DK.INSERT-REAL-DOUBLEQUOTES))) (FOR ENTRY IN \\TEDIT.DORADO.KEYS DO (SELECTQ (CADR ENTRY) - (FN (TEDIT.SETFUNCTION (CAR ENTRY) - (CADDR ENTRY))) - (TEDIT.SETSYNTAX (CAR ENTRY) - (CADR ENTRY)))) + (FN (TEDIT.SETFUNCTION (CAR ENTRY) + (CADDR ENTRY))) + (TEDIT.SETSYNTAX (CAR ENTRY) + (CADR ENTRY)))) (PUTPROPS TEDITDORADOKEYS COPYRIGHT ("Xerox Corporation" 1987 2018)) (DECLARE\: DONTCOPY - (FILEMAP (NIL (4082 15770 (\\TEDIT.BOLD.SEL.OFF 4092 . 4330) (\\TEDIT.BOLD.SEL.ON 4332 . 4566) ( -\\TEDIT.CENTER.SEL 4568 . 5638) (\\TEDIT.CENTER.SEL.REV 5640 . 6735) (\\TEDIT.DEFAULTS.CARET 6737 . -7029) (\\TEDIT.DEFAULTSSEL 7031 . 7369) (\\TEDIT.SETDEFAULT.FROM.SEL 7371 . 7828) (\\TEDIT.FIND 7830 - . 10691) (\\TEDIT.ITALIC.SEL.OFF 10693 . 10935) (\\TEDIT.ITALIC.SEL.ON 10937 . 11123) ( -\\TEDIT.LARGERSEL 11125 . 11420) (\\TEDIT.LCASE.SEL 11422 . 12138) (\\TEDIT.SHOWCARETLOOKS 12140 . -13523) (\\TEDIT.SMALLERSEL 13525 . 13823) (\\TEDIT.SUBSCRIPTSEL 13825 . 14032) (\\TEDIT.SUPERSCRIPTSEL - 14034 . 14242) (\\TEDIT.UCASE.SEL 14244 . 15000) (\\TEDIT.UNDERLINE.SEL.OFF 15002 . 15193) ( -\\TEDIT.UNDERLINE.SEL.ON 15195 . 15384) (\\TEDIT.STRIKEOUT.SEL.ON 15386 . 15575) ( -\\TEDIT.STRIKEOUT.SEL.OFF 15577 . 15768)) (15828 20622 (\\TEDIT.DK.ABORT 15838 . 15905) ( -\\TEDIT.DK.FIND 15907 . 18936) (\\TEDIT.DK.SUBSTITUTE 18938 . 19195) (\\TEDIT.DK.INSERT-PARENS 19197 - . 19584) (\\TEDIT.DK.INSERT-NEUTRAL-DOUBLEQUOTES 19586 . 20078) (\\TEDIT.DK.INSERT-REAL-DOUBLEQUOTES -20080 . 20620))))) + (FILEMAP (NIL (4080 15768 (\\TEDIT.BOLD.SEL.OFF 4090 . 4328) (\\TEDIT.BOLD.SEL.ON 4330 . 4564) ( +\\TEDIT.CENTER.SEL 4566 . 5636) (\\TEDIT.CENTER.SEL.REV 5638 . 6733) (\\TEDIT.DEFAULTS.CARET 6735 . +7027) (\\TEDIT.DEFAULTSSEL 7029 . 7367) (\\TEDIT.SETDEFAULT.FROM.SEL 7369 . 7826) (\\TEDIT.FIND 7828 + . 10689) (\\TEDIT.ITALIC.SEL.OFF 10691 . 10933) (\\TEDIT.ITALIC.SEL.ON 10935 . 11121) ( +\\TEDIT.LARGERSEL 11123 . 11418) (\\TEDIT.LCASE.SEL 11420 . 12136) (\\TEDIT.SHOWCARETLOOKS 12138 . +13521) (\\TEDIT.SMALLERSEL 13523 . 13821) (\\TEDIT.SUBSCRIPTSEL 13823 . 14030) (\\TEDIT.SUPERSCRIPTSEL + 14032 . 14240) (\\TEDIT.UCASE.SEL 14242 . 14998) (\\TEDIT.UNDERLINE.SEL.OFF 15000 . 15191) ( +\\TEDIT.UNDERLINE.SEL.ON 15193 . 15382) (\\TEDIT.STRIKEOUT.SEL.ON 15384 . 15573) ( +\\TEDIT.STRIKEOUT.SEL.OFF 15575 . 15766)) (15826 20620 (\\TEDIT.DK.ABORT 15836 . 15903) ( +\\TEDIT.DK.FIND 15905 . 18934) (\\TEDIT.DK.SUBSTITUTE 18936 . 19193) (\\TEDIT.DK.INSERT-PARENS 19195 + . 19582) (\\TEDIT.DK.INSERT-NEUTRAL-DOUBLEQUOTES 19584 . 20076) (\\TEDIT.DK.INSERT-REAL-DOUBLEQUOTES +20078 . 20618))))) STOP diff --git a/lispusers/TEDITDORADOKEYS.LCOM b/lispusers/TEDITDORADOKEYS.LCOM index 79b623ac..a7697372 100644 Binary files a/lispusers/TEDITDORADOKEYS.LCOM and b/lispusers/TEDITDORADOKEYS.LCOM differ diff --git a/run-medley b/run-medley index ef5c74e8..440e67e5 100755 --- a/run-medley +++ b/run-medley @@ -59,6 +59,10 @@ export LDEKBDTYPE=x while [ "$#" -ne 0 ]; do case "$1" in "-loadup") + # Keep (GREET) from finding adifferent init file + mkdir -p $MEDLEYDIR/tmp/logindir + export LOGINDIR=$MEDLEYDIR/tmp/logindir + export MEDLEYLOADUP="$2" export LDEINIT="$2" shift @@ -120,7 +124,7 @@ while [ "$#" -ne 0 ]; do "-lisp") export LDESRCESYSOUT="$MEDLEYDIR/loadups/lisp.sysout" ;; - "-N" | "-new" | "-newfull" ) + "-n" | "-new" | "-newfull" ) export LDESRCESYSOUT="$MEDLEYDIR/tmp/full.sysout" ;; "-nl" | "-newlisp" ) diff --git a/scripts/loadup-all.sh b/scripts/loadup-all.sh index a40df57e..98c99db5 100755 --- a/scripts/loadup-all.sh +++ b/scripts/loadup-all.sh @@ -11,11 +11,14 @@ fi ./scripts/loadup-mid-from-init.sh && \ ./scripts/loadup-lisp-from-mid.sh && \ ./scripts/loadup-full-from-lisp.sh && \ - ./scripts/loadup-aux.sh && \ - ./scripts/copy-all.sh && \ - ls -l loadups/*.sysout loadups/whereis.hash library/exports.all && \ - echo "**** DONE ****" - + ./scripts/loadup-aux.sh + +echo "loadups are in $MEDLEYDIR/tmp" +echo use +echo " ./scripts/copy-all.sh " +echo "to copy to loadups library" +echo "**** DONE ****" + diff --git a/scripts/loadup-and-release.sh b/scripts/loadup-and-release.sh index ed2d030f..cee4e2ac 100755 --- a/scripts/loadup-and-release.sh +++ b/scripts/loadup-and-release.sh @@ -8,6 +8,5 @@ if [ ! -x run-medley ] ; then fi ./scripts/loadup-all.sh && \ - ./scripts/copy-all.sh && \ ./scripts/release-medley.sh diff --git a/scripts/loadup-aux.sh b/scripts/loadup-aux.sh index ef0ebbec..a71dfaae 100755 --- a/scripts/loadup-aux.sh +++ b/scripts/loadup-aux.sh @@ -9,11 +9,6 @@ fi touch tmp/loadup.timestamp -# Keep (GREET) from finding an init file -mkdir -p $MEDLEYDIR/tmp/logindir -export HOME=$MEDLEYDIR/tmp/logindir -export LOGINDIR=$MEDLEYDIR/tmp/logindir - scr="-sc 1024x768 -g 1042x790" echo '" (IL:MEDLEY-INIT-VARS)(IL:LOAD(QUOTE MEDLEY-UTILS))(IL:MAKE-EXPORTS-ALL)(IL:MAKE-WHEREIS-HASH)(IL:LOGOUT T)"' > tmp/loadup-aux.cm diff --git a/scripts/loadup-db.sh b/scripts/loadup-db.sh index e5c6de8d..8c764b41 100755 --- a/scripts/loadup-db.sh +++ b/scripts/loadup-db.sh @@ -9,11 +9,6 @@ fi touch tmp/loadup.timestamp -# Keep (GREET) from finding an init file -mkdir -p $MEDLEYDIR/tmp/logindir -export HOME=$MEDLEYDIR/tmp/logindir -export LOGINDIR=$MEDLEYDIR/tmp/logindir - scr="-sc 1024x768 -g 1042x790" echo '" (IL:MEDLEY-INIT-VARS)(IL:FILESLOAD MEDLEY-UTILS)(IL:MAKE-FULLER-DB)(IL:LOGOUT T)"' > tmp/loadup-db.cm diff --git a/scripts/loadup-full-from-lisp.sh b/scripts/loadup-full-from-lisp.sh index bf0b80a6..14277016 100755 --- a/scripts/loadup-full-from-lisp.sh +++ b/scripts/loadup-full-from-lisp.sh @@ -10,11 +10,6 @@ scr="-sc 1024x768 -g 1042x790" touch tmp/loadup.timestamp -# Keep (GREET) from finding an init file -mkdir -p $MEDLEYDIR/tmp/logindir -export HOME=$MEDLEYDIR/tmp/logindir -export LOGINDIR=$MEDLEYDIR/tmp/logindir - ./run-medley $scr -loadup "$MEDLEYDIR/sources/LOADUP-FULL.CM" "$MEDLEYDIR/tmp/lisp.sysout" if [ tmp/full.sysout -nt tmp/loadup.timestamp ]; then diff --git a/scripts/loadup-full.sh b/scripts/loadup-full.sh index 6e488d43..a3a06fe1 100755 --- a/scripts/loadup-full.sh +++ b/scripts/loadup-full.sh @@ -7,25 +7,9 @@ if [ ! -x run-medley ] ; then exit 1 ; fi -# Keep (GREET) from finding an init file -mkdir -p $MEDLEYDIR/tmp/logindir -export HOME=$MEDLEYDIR/tmp/logindir -export LOGINDIR=$MEDLEYDIR/tmp/logindir -scr="-sc 1024x768 -g 1042x790" + ./scripts/loadup-init.sh && \ + ./scripts/loadup-mid-from-init.sh && \ + ./scripts/loadup-lisp-from-mid.sh && \ + ./scripts/loadup-full-from-lisp.sh -touch tmp/loadup.timestamp - -./run-medley $scr -loadup "$MEDLEYDIR/sources/LOADUP-FULL.CM" "$MEDLEYDIR/loadups/lisp.sysout" - -if [ tmp/full.sysout -nt tmp/loadup.timestamp ]; then - - echo ---- made ---- - ls -l tmp/full.* - echo -------------- - -else - echo XXXXX FAILURE XXXXX - ls -l tmp/full.* - exit 1 -fi diff --git a/scripts/loadup-init.sh b/scripts/loadup-init.sh index 4a864050..85c387c0 100755 --- a/scripts/loadup-init.sh +++ b/scripts/loadup-init.sh @@ -9,11 +9,6 @@ fi scr="-sc 1024x768 -g 1042x790" -# Keep (GREET) from finding an init file -mkdir -p $MEDLEYDIR/tmp/logindir -export HOME=$MEDLEYDIR/tmp/logindir -export LOGINDIR=$MEDLEYDIR/tmp/logindir - touch tmp/loadup.timestamp ./run-medley $scr -loadup "$MEDLEYDIR"/sources/LOADUP-INIT.LISP loadups/starter.sysout diff --git a/sources/EXTERNALFORMAT b/sources/EXTERNALFORMAT index d9cb86fc..6e7edfb3 100644 --- a/sources/EXTERNALFORMAT +++ b/sources/EXTERNALFORMAT @@ -1,13 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 7-Jul-2022 10:42:34"  -{DSK}kaplan>local>medley3.5>working-medley>sources>EXTERNALFORMAT.;57 36715 +(FILECREATED "10-Jul-2022 16:44:11"  +{DSK}kaplan>local>medley3.5>working-medley>sources>EXTERNALFORMAT.;58 36624 - :CHANGES-TO (VARS EXTERNALFORMATCOMS) - (FNS SYSTEM-EXTERNALFORMAT) + :CHANGES-TO (FNS \FORMATBYTESTRING) - :PREVIOUS-DATE " 3-Jul-2022 08:55:41" -{DSK}kaplan>local>medley3.5>working-medley>sources>EXTERNALFORMAT.;56) + :PREVIOUS-DATE " 7-Jul-2022 10:42:34" +{DSK}kaplan>local>medley3.5>working-medley>sources>EXTERNALFORMAT.;57) (PRETTYCOMPRINT EXTERNALFORMATCOMS) @@ -491,18 +490,16 @@ BYTESTREAM]) (\FORMATBYTESTRING - [LAMBDA (STREAM STRING) (* ; "Edited 22-Jun-2022 11:07 by rmk") + [LAMBDA (STREAM STRING) (* ; "Edited 10-Jul-2022 16:39 by rmk") + (* ; "Edited 22-Jun-2022 11:07 by rmk") (* ; "Edited 18-Jun-2022 22:04 by rmk") - - (* ;; "Produces a string containing the bytes that would represent STRING on STREAM. Presumably this only makes sense for a stable format") - (WITH-RESOURCE \FORMATBYTESTRING.STREAM (\SETFILEPTR \FORMATBYTESTRING.STREAM 0) (LET [FSTRING NBYTES (BYTESTRINGFN (FETCH (EXTERNALFORMAT FORMATBYTESTRINGFN) OF (FETCH (STREAM EXTERNALFORMAT) OF STREAM] (IF BYTESTRINGFN THEN (APPLY* BYTESTRINGFN STREAM STRING \FORMATBYTESTRING.STREAM) ELSE (\FORMATBYTESTREAM STREAM \FORMATBYTESTRING.STREAM) - (FOR C INSTRING STRING DO (\OUTCHAR \FORMATBYTESTRING.STREAM C)) + (FOR C INPNAME STRING DO (\OUTCHAR \FORMATBYTESTRING.STREAM C)) (SETQ NBYTES (\GETFILEPTR \FORMATBYTESTRING.STREAM)) (\SETFILEPTR \FORMATBYTESTRING.STREAM 0) (SETQ FSTRING (ALLOCSTRING NBYTES)) @@ -704,13 +701,13 @@ (\CREATE.THROUGH.EXTERNALFORMAT) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (6623 13258 (\EXTERNALFORMAT 6633 . 10411) (MAKE-EXTERNALFORMAT 10413 . 12785) ( -\EXTERNALFORMAT.DEFPRINT 12787 . 13256)) (13259 16300 (\INSTALL.EXTERNALFORMAT 13269 . 14718) ( -\REMOVE.EXTERNALFORMAT 14720 . 15551) (FIND-FORMAT 15553 . 16298)) (16301 16514 (SYSTEM-EXTERNALFORMAT - 16311 . 16512)) (16863 30798 (\OUTCHAR 16873 . 18090) (\INCCODE 18092 . 19245) (\BACKCCODE 19247 . -20110) (\BACKCCODE.EOLC 20112 . 22699) (\PEEKCCODE 22701 . 23075) (\PEEKCCODE.NOEOLC 23077 . 23409) ( -\INCCODE.EOLC 23411 . 25091) (\FORMATBYTESTREAM 25093 . 26726) (\FORMATBYTESTRING 26728 . 28230) ( -\CHECKEOLC.CRLF 28232 . 30796)) (32400 34636 (\NULLDEVICE 32410 . 34312) (\NULL.OPENFILE 34314 . 34634 -)) (34776 36619 (\CREATE.THROUGH.EXTERNALFORMAT 34786 . 35588) (\THROUGHIN 35590 . 36010) ( -\THROUGHBACKCCODE 36012 . 36279) (\THROUGHOUTCHARFN 36281 . 36617))))) + (FILEMAP (NIL (6575 13210 (\EXTERNALFORMAT 6585 . 10363) (MAKE-EXTERNALFORMAT 10365 . 12737) ( +\EXTERNALFORMAT.DEFPRINT 12739 . 13208)) (13211 16252 (\INSTALL.EXTERNALFORMAT 13221 . 14670) ( +\REMOVE.EXTERNALFORMAT 14672 . 15503) (FIND-FORMAT 15505 . 16250)) (16253 16466 (SYSTEM-EXTERNALFORMAT + 16263 . 16464)) (16815 30707 (\OUTCHAR 16825 . 18042) (\INCCODE 18044 . 19197) (\BACKCCODE 19199 . +20062) (\BACKCCODE.EOLC 20064 . 22651) (\PEEKCCODE 22653 . 23027) (\PEEKCCODE.NOEOLC 23029 . 23361) ( +\INCCODE.EOLC 23363 . 25043) (\FORMATBYTESTREAM 25045 . 26678) (\FORMATBYTESTRING 26680 . 28139) ( +\CHECKEOLC.CRLF 28141 . 30705)) (32309 34545 (\NULLDEVICE 32319 . 34221) (\NULL.OPENFILE 34223 . 34543 +)) (34685 36528 (\CREATE.THROUGH.EXTERNALFORMAT 34695 . 35497) (\THROUGHIN 35499 . 35919) ( +\THROUGHBACKCCODE 35921 . 36188) (\THROUGHOUTCHARFN 36190 . 36526))))) STOP diff --git a/sources/EXTERNALFORMAT.LCOM b/sources/EXTERNALFORMAT.LCOM index 3584bd0e..bd25abc4 100644 Binary files a/sources/EXTERNALFORMAT.LCOM and b/sources/EXTERNALFORMAT.LCOM differ diff --git a/sources/FILEIO b/sources/FILEIO index 346ee7c0..6ab24bab 100644 --- a/sources/FILEIO +++ b/sources/FILEIO @@ -1,13 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 6-Jul-2022 00:01:09"  -{DSK}kaplan>local>medley3.5>working-medley>sources>FILEIO.;113 159763 +(FILECREATED " 8-Jul-2022 10:59:15"  +{DSK}kaplan>local>medley3.5>working-medley>sources>FILEIO.;114 160097 - :CHANGES-TO (FNS PUTSTREAMPROP GETSTREAMPROP \DO.PARAMS.AT.OPEN) - (RECORDS STREAM) + :CHANGES-TO (FNS COPYFILE \COPYOPENFILE) - :PREVIOUS-DATE " 3-Jul-2022 08:55:45" -{DSK}kaplan>Local>medley3.5>working-medley>sources>FILEIO.;111) + :PREVIOUS-DATE " 6-Jul-2022 00:01:09" +{DSK}kaplan>local>medley3.5>working-medley>sources>FILEIO.;113) (* ; " @@ -2222,25 +2221,39 @@ update the map") T]) (COPYFILE - [LAMBDA (FROMFILE TOFILE DESTPARAMETERS) (* ; "Edited 2-Jan-93 13:35 by jds") + [LAMBDA (FROMFILE TOFILE DESTPARAMETERS SOURCEPARAMETERS) -(* ;;; "DESTPARAMETERS is like PARAMETERS arg to OPENSTREAM -- overrides default parameters") + (* ;; + "Edited 8-Jul-2022 10:54 by rmk: Added SOURCEPARAMETERS, in particular to declare external format") + + (* ;; "Edited 8-Jul-2022 10:41 by rmk") + + (* ;; "Edited 2-Jan-93 13:35 by jds") + +(* ;;; "DESTPARAMETERS is like PARAMETERS arg to OPENSTREAM -- overrides default parameters") [AND (DIRECTORYNAMEP (PACKFILENAME 'HOST NIL 'BODY TOFILE) (UNPACKFILENAME TOFILE 'HOST)) (SETQ TOFILE (PACKFILENAME 'DIRECTORY TOFILE 'BODY (PACKFILENAME 'HOST NIL 'DIRECTORY NIL 'BODY FROMFILE] (RESETLST - [RESETSAVE [SETQ FROMFILE (OPENSTREAM FROMFILE 'INPUT 'OLD '((SEQUENTIAL T) - (DON'TCACHE T] + [RESETSAVE [SETQ FROMFILE (OPENSTREAM FROMFILE 'INPUT 'OLD `((SEQUENTIAL T) + (DON'TCACHE T) + ,@SOURCEPARAMETERS] '(PROGN (CLOSEF OLDVALUE] (\COPYOPENFILE FROMFILE TOFILE DESTPARAMETERS))]) (\COPYOPENFILE - [LAMBDA (INSTREAM NEWNAME DESTPARAMETERS) (* ; "Edited 3-May-2021 20:36 by rmk:") - (* ; "Edited 11-Dec-95 11:50 by ") - (* ; "Edited 17-Sep-90 11:41 by jds") - (* bvm%: "18-Oct-85 15:54") + [LAMBDA (INSTREAM NEWNAME DESTPARAMETERS) + + (* ;; "Edited 8-Jul-2022 10:58 by rmk: Use COPYCHARS if external formats are different") + + (* ;; "Edited 3-May-2021 20:36 by rmk:") + + (* ;; "Edited 11-Dec-95 11:50 by ") + + (* ;; "Edited 17-Sep-90 11:41 by jds") + (* bvm%: "18-Oct-85 15:54") (PROG ((PROPS DESTPARAMETERS) TYPE X OUTSTREAM) [COND @@ -2254,11 +2267,11 @@ update the map") (SETQ TYPE (\INFER.FILE.TYPE INSTREAM))) (push PROPS (LIST 'TYPE TYPE] - (* ;; "TAL removed : (COND ((AND (EQ TYPE 'TEXT) (SETQ X (GETFILEINFO INSTREAM 'EOL)) (NOT (ASSOC 'EOL DESTPARAMETERS))) (push PROPS (LIST 'EOL X)))) --- if the caller didn't specify, we ought to convert to the destination system's EOL convention for text files.") + (* ;; "TAL removed : (COND ((AND (EQ TYPE 'TEXT) (SETQ X (GETFILEINFO INSTREAM 'EOL)) (NOT (ASSOC 'EOL DESTPARAMETERS))) (push PROPS (LIST 'EOL X)))) --- if the caller didn't specify, we ought to convert to the destination system's EOL convention for text files.") (CL:UNLESS (EQ TYPE 'TEXT) - (* ;; "RMK: Setting the LENGTH seems wrong for TEXT files, since the byte-length could change if EOL or external-format differs. Let normal Length mechanisms prevail. Indeed, why bother with setting the length anyway--unless this is merely a hint for the opener? If so, the text guard can be removed.") + (* ;; "RMK: Setting the LENGTH seems wrong for TEXT files, since the byte-length could change if EOL or external-format differs. Let normal Length mechanisms prevail. Indeed, why bother with setting the length anyway--unless this is merely a hint for the opener? If so, the text guard can be removed.") [COND ((SETQ X (GETFILEINFO INSTREAM 'LENGTH)) @@ -2269,17 +2282,19 @@ update the map") '(AND RESETSTATE (SETQ OLDVALUE (CLOSEF OLDVALUE)) (DELFILE OLDVALUE] - (* ;; "Obsoleted by Lyric's multiple streams: (OR (EQ (\GETFILEPTR INSTREAM) 0) (SETFILEPTR INSTREAM 0)) ;; In case it was open by someone else! Really need multiple streams, but until then at least don't lose big this way") + (* ;; "Obsoleted by Lyric's multiple streams: (OR (EQ (\GETFILEPTR INSTREAM) 0) (SETFILEPTR INSTREAM 0)) ;; In case it was open by someone else! Really need multiple streams, but until then at least don't lose big this way") (COND - ((EQ TYPE 'TEXT) + ((OR (EQ TYPE 'TEXT) + (NEQ (ffetch (STREAM EXTERNALFORMAT) of INSTREAM) + (ffetch (STREAM EXTERNALFORMAT) of OUTSTREAM))) - (* ;; "RMK: COPYCHARS ensures that external format conversion happens if necessary ") + (* ;; "RMK: COPYCHARS ensures that external format conversion happens if necessary ") (COPYCHARS INSTREAM OUTSTREAM)) (T (COPYBYTES INSTREAM OUTSTREAM))) - (* ;; "On UNIX version, give FX the option of printing a warning when the file type is defaulted -- they want to discourage that behavior.") + (* ;; "On UNIX version, give FX the option of printing a warning when the file type is defaulted -- they want to discourage that behavior.") (AND (EQ \MACHINETYPE \MAIKO) FileTypeConfirmFlg @@ -2287,7 +2302,7 @@ update the map") (NULL (ASSOC 'TYPE DESTPARAMETERS)) (\UFStoOtherCopyMess INSTREAM OUTSTREAM)) - (* ;; "We return the closed stream.") + (* ;; "We return the closed stream.") (RETURN (CLOSEF OUTSTREAM]) @@ -3057,39 +3072,39 @@ update the map") (PUTPROPS FILEIO COPYRIGHT ("Venue & Xerox Corporation" 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1999 2020 2021 2022)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (27526 31332 (STREAMPROP 27536 . 27970) (GETSTREAMPROP 27972 . 28567) (PUTSTREAMPROP -28569 . 31180) (STREAMP 31182 . 31330)) (31375 33894 (\DEFPRINT.BY.NAME 31385 . 32537) ( -\STREAM.DEFPRINT 32539 . 33587) (\FDEV.DEFPRINT 33589 . 33892)) (34152 39193 (\GETACCESS 34162 . 34616 -) (\SETACCESS 34618 . 39191)) (59419 65388 (\DEFINEDEVICE 59429 . 61745) (\GETDEVICEFROMNAME 61747 . -62220) (\GETDEVICEFROMHOSTNAME 62222 . 63266) (\REMOVEDEVICE 63268 . 64391) (\REMOVEDEVICE.NAMES 64393 - . 65386)) (65428 90319 (\CLOSEFILE 65438 . 66263) (\DELETEFILE 66265 . 66559) (\DEVICEEVENT 66561 . -68331) (\GENERATEFILES 68333 . 69280) (\GENERATENEXTFILE 69282 . 69933) (\GENERATEFILEINFO 69935 . -70396) (\GETFILENAME 70398 . 70787) (\GENERIC.OUTFILEP 70789 . 71259) (\OPENFILE 71261 . 73839) ( -\DO.PARAMS.AT.OPEN 73841 . 76156) (\RENAMEFILE 76158 . 76582) (\REVALIDATEFILE 76584 . 79186) ( -\PAGED.REVALIDATEFILELST 79188 . 80746) (\PAGED.REVALIDATEFILES 80748 . 82467) (\PAGED.REVALIDATEFILE -82469 . 84752) (\BUFFERED.REVALIDATEFILE 84754 . 87040) (\BUFFERED.REVALIDATEFILELST 87042 . 88226) ( -\PRINT-REVALIDATION-RESULT 88228 . 88643) (\TRUNCATEFILE 88645 . 89036) (\FILE-CONFLICT 89038 . 90317) -) (90355 95018 (\GENERATENOFILES 90365 . 92461) (\NULLFILEGENERATOR 92463 . 92707) (\NOFILESNEXTFILEFN - 92709 . 94700) (\NOFILESINFOFN 94702 . 95016)) (95137 97045 (\FILE.NOT.OPEN 95147 . 95660) ( -\FILE.WONT.OPEN 95662 . 95990) (\ILLEGAL.DEVICEOP 95992 . 96274) (\IS.NOT.RANDACCESSP 96276 . 96722) ( -\STREAM.NOT.OPEN 96724 . 97043)) (97180 99478 (\FDEVINSTANCE 97190 . 99476)) (100680 108054 (CNDIR -100690 . 101995) (DIRECTORYNAME 101997 . 106180) (DIRECTORYNAMEP 106182 . 106798) (HOSTNAMEP 106800 . -107607) (\ADD.CONNECTED.DIR 107609 . 108052)) (108099 135979 (\BACKFILEPTR 108109 . 108297) ( -\BACKPEEKBIN 108299 . 108660) (\BACKBIN 108662 . 109013) (BIN 109015 . 109232) (\BIN 109234 . 109511) -(\BINS 109513 . 109799) (BOUT 109801 . 110163) (\BOUT 110165 . 110480) (\BOUTS 110482 . 110793) ( -COPYBYTES 110795 . 114127) (COPYCHARS 114129 . 117795) (COPYFILE 117797 . 118594) (\COPYOPENFILE -118596 . 121669) (\INFER.FILE.TYPE 121671 . 122625) (EOFP 122627 . 122924) (FORCEOUTPUT 122926 . -123173) (\FLUSH.OPEN.STREAMS 123175 . 123531) (CHARSET 123533 . 125197) (ACCESS-CHARSET 125199 . -125416) (GETEOFPTR 125418 . 125668) (GETFILEINFO 125670 . 128863) (\TYPE.FROM.FILETYPE 128865 . 129335 -) (\FILETYPE.FROM.TYPE 129337 . 129516) (GETFILEPTR 129518 . 129770) (SETFILEINFO 129772 . 133878) ( -SETFILEPTR 133880 . 135599) (BOUT16 135601 . 135786) (BIN16 135788 . 135977)) (136082 141287 ( -\GENERIC.BINS 136092 . 136372) (\GENERIC.BOUTS 136374 . 136639) (\GENERIC.RENAMEFILE 136641 . 138472) -(\GENERIC.OPENP 138474 . 139789) (\GENERIC.READP 139791 . 140832) (\GENERIC.CHARSET 140834 . 141285)) -(141288 141627 (\MAP-OPEN-STREAMS 141298 . 141625)) (143411 145491 (\EOF.ACTION 143421 . 143672) ( -\EOSERROR 143674 . 143867) (\GETEOFPTR 143869 . 144051) (\INCFILEPTR 144053 . 144403) (\PEEKBIN 144405 - . 144596) (\SETCLOSEDFILELENGTH 144598 . 144932) (\SETEOFPTR 144934 . 145122) (\SETFILEPTR 145124 . -145489)) (145492 146034 (\FIXPOUT 145502 . 145802) (\FIXPIN 145804 . 146032)) (146035 146601 (\BOUTEOL - 146045 . 146599)) (149497 159361 (\BUFFERED.BIN 149507 . 150359) (\BUFFERED.PEEKBIN 150361 . 151143) -(\BUFFERED.BOUT 151145 . 152005) (\BUFFERED.BINS 152007 . 155692) (\BUFFERED.BOUTS 155694 . 157495) ( -\BUFFERED.COPYBYTES 157497 . 159359))))) + (FILEMAP (NIL (27467 31273 (STREAMPROP 27477 . 27911) (GETSTREAMPROP 27913 . 28508) (PUTSTREAMPROP +28510 . 31121) (STREAMP 31123 . 31271)) (31316 33835 (\DEFPRINT.BY.NAME 31326 . 32478) ( +\STREAM.DEFPRINT 32480 . 33528) (\FDEV.DEFPRINT 33530 . 33833)) (34093 39134 (\GETACCESS 34103 . 34557 +) (\SETACCESS 34559 . 39132)) (59360 65329 (\DEFINEDEVICE 59370 . 61686) (\GETDEVICEFROMNAME 61688 . +62161) (\GETDEVICEFROMHOSTNAME 62163 . 63207) (\REMOVEDEVICE 63209 . 64332) (\REMOVEDEVICE.NAMES 64334 + . 65327)) (65369 90260 (\CLOSEFILE 65379 . 66204) (\DELETEFILE 66206 . 66500) (\DEVICEEVENT 66502 . +68272) (\GENERATEFILES 68274 . 69221) (\GENERATENEXTFILE 69223 . 69874) (\GENERATEFILEINFO 69876 . +70337) (\GETFILENAME 70339 . 70728) (\GENERIC.OUTFILEP 70730 . 71200) (\OPENFILE 71202 . 73780) ( +\DO.PARAMS.AT.OPEN 73782 . 76097) (\RENAMEFILE 76099 . 76523) (\REVALIDATEFILE 76525 . 79127) ( +\PAGED.REVALIDATEFILELST 79129 . 80687) (\PAGED.REVALIDATEFILES 80689 . 82408) (\PAGED.REVALIDATEFILE +82410 . 84693) (\BUFFERED.REVALIDATEFILE 84695 . 86981) (\BUFFERED.REVALIDATEFILELST 86983 . 88167) ( +\PRINT-REVALIDATION-RESULT 88169 . 88584) (\TRUNCATEFILE 88586 . 88977) (\FILE-CONFLICT 88979 . 90258) +) (90296 94959 (\GENERATENOFILES 90306 . 92402) (\NULLFILEGENERATOR 92404 . 92648) (\NOFILESNEXTFILEFN + 92650 . 94641) (\NOFILESINFOFN 94643 . 94957)) (95078 96986 (\FILE.NOT.OPEN 95088 . 95601) ( +\FILE.WONT.OPEN 95603 . 95931) (\ILLEGAL.DEVICEOP 95933 . 96215) (\IS.NOT.RANDACCESSP 96217 . 96663) ( +\STREAM.NOT.OPEN 96665 . 96984)) (97121 99419 (\FDEVINSTANCE 97131 . 99417)) (100621 107995 (CNDIR +100631 . 101936) (DIRECTORYNAME 101938 . 106121) (DIRECTORYNAMEP 106123 . 106739) (HOSTNAMEP 106741 . +107548) (\ADD.CONNECTED.DIR 107550 . 107993)) (108040 136313 (\BACKFILEPTR 108050 . 108238) ( +\BACKPEEKBIN 108240 . 108601) (\BACKBIN 108603 . 108954) (BIN 108956 . 109173) (\BIN 109175 . 109452) +(\BINS 109454 . 109740) (BOUT 109742 . 110104) (\BOUT 110106 . 110421) (\BOUTS 110423 . 110734) ( +COPYBYTES 110736 . 114068) (COPYCHARS 114070 . 117736) (COPYFILE 117738 . 118802) (\COPYOPENFILE +118804 . 122003) (\INFER.FILE.TYPE 122005 . 122959) (EOFP 122961 . 123258) (FORCEOUTPUT 123260 . +123507) (\FLUSH.OPEN.STREAMS 123509 . 123865) (CHARSET 123867 . 125531) (ACCESS-CHARSET 125533 . +125750) (GETEOFPTR 125752 . 126002) (GETFILEINFO 126004 . 129197) (\TYPE.FROM.FILETYPE 129199 . 129669 +) (\FILETYPE.FROM.TYPE 129671 . 129850) (GETFILEPTR 129852 . 130104) (SETFILEINFO 130106 . 134212) ( +SETFILEPTR 134214 . 135933) (BOUT16 135935 . 136120) (BIN16 136122 . 136311)) (136416 141621 ( +\GENERIC.BINS 136426 . 136706) (\GENERIC.BOUTS 136708 . 136973) (\GENERIC.RENAMEFILE 136975 . 138806) +(\GENERIC.OPENP 138808 . 140123) (\GENERIC.READP 140125 . 141166) (\GENERIC.CHARSET 141168 . 141619)) +(141622 141961 (\MAP-OPEN-STREAMS 141632 . 141959)) (143745 145825 (\EOF.ACTION 143755 . 144006) ( +\EOSERROR 144008 . 144201) (\GETEOFPTR 144203 . 144385) (\INCFILEPTR 144387 . 144737) (\PEEKBIN 144739 + . 144930) (\SETCLOSEDFILELENGTH 144932 . 145266) (\SETEOFPTR 145268 . 145456) (\SETFILEPTR 145458 . +145823)) (145826 146368 (\FIXPOUT 145836 . 146136) (\FIXPIN 146138 . 146366)) (146369 146935 (\BOUTEOL + 146379 . 146933)) (149831 159695 (\BUFFERED.BIN 149841 . 150693) (\BUFFERED.PEEKBIN 150695 . 151477) +(\BUFFERED.BOUT 151479 . 152339) (\BUFFERED.BINS 152341 . 156026) (\BUFFERED.BOUTS 156028 . 157829) ( +\BUFFERED.COPYBYTES 157831 . 159693))))) STOP diff --git a/sources/FILEIO.LCOM b/sources/FILEIO.LCOM index 89c41e62..9456fe49 100644 Binary files a/sources/FILEIO.LCOM and b/sources/FILEIO.LCOM differ diff --git a/sources/FILEPKG b/sources/FILEPKG index d6c2c200..25749772 100644 --- a/sources/FILEPKG +++ b/sources/FILEPKG @@ -1,11 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "28-Mar-2022 20:33:30" {DSK}kaplan>Local>medley3.5>my-medley>sources>FILEPKG.;31 279837 +(FILECREATED " 9-Jul-2022 22:10:13"  +{DSK}kaplan>local>medley3.5>working-medley>sources>FILEPKG.;36 280887 :CHANGES-TO (FNS EDITCALLERS) - :PREVIOUS-DATE "28-Mar-2022 14:08:07" -{DSK}kaplan>Local>medley3.5>my-medley>sources>FILEPKG.;29) + :PREVIOUS-DATE "30-Jun-2022 20:19:02" +{DSK}kaplan>local>medley3.5>working-medley>sources>FILEPKG.;35) (* ; " @@ -4407,6 +4408,10 @@ compiling " T) (EDITCALLERS [LAMBDA (ATOMS FILES COMS) + (* ;; "Edited 9-Jul-2022 22:09 by rmk") + + (* ;; "Edited 30-Jun-2022 20:18 by rmk: Make confirmation of separator boundaries as a posttest on successful matches rather than a case-array test. This means this can run at byte-level FFILEPOS speed for arbitrary external formats.") + (* ;; "Edited 28-Mar-2022 20:32 by rmk: FILDIR with depth 2, reopen stream after LOADFILEMAP") (* ;; "Edited 24-Mar-2022 16:38 by rmk: If FILES contains *, use FILDIR") @@ -4416,7 +4421,7 @@ compiling " T) (LET (FFILEPOSPATTERNS FNS OTHERSFILES EDITPATTERN) [SETQ EDITPATTERN (EDITFPAT (CONS '*ANY* (SETQ ATOMS (MKLIST ATOMS] - (for FILE FULL in (COND + [for FILE FULL in (COND ((NULL FILES) FILELST) ((EQ FILES T) @@ -4427,123 +4432,127 @@ compiling " T) (FILDIR FILES 2)) (T (LIST FILES))) unless (DIRECTORYNAMEP FILE) do - (CL:UNLESS - [NLSETQ - (RESETLST - [PROG (PATTERNS CA RDTBL MAP FILESTREAM PRINTFLG ENV TOP I) - (OR (SETQ FULL (FINDFILE FILE)) - (RETURN (LISPXPRINT (CONS FILE '(not found)) - T T))) - [RESETSAVE NIL (LIST (FUNCTION CLOSEF?) - (SETQ FILESTREAM (OPENSTREAM FULL 'INPUT] - (CL:FORMAT T "~A: " FULL) - (CL:MULTIPLE-VALUE-SETQ (ENV MAP TOP) - (OR (GET-ENVIRONMENT-AND-FILEMAP FILESTREAM) - (\PARSE-FILE-HEADER FILESTREAM))) + (RESETLST + [PROG (PATTERNS CA RDTBL MAP FILESTREAM PRINTFLG ENV TOP I) + (OR (SETQ FULL (FINDFILE FILE)) + (RETURN (LISPXPRINT (CONS FILE '(not found)) + T T))) + [RESETSAVE NIL (LIST (FUNCTION CLOSEF?) + (SETQ FILESTREAM (OPENSTREAM FULL 'INPUT] + (CL:FORMAT T "~A: " FULL) + (CL:MULTIPLE-VALUE-SETQ (ENV MAP TOP) + (OR (GET-ENVIRONMENT-AND-FILEMAP FILESTREAM) + (\PARSE-FILE-HEADER FILESTREAM))) - (* ;; "Get reader environment of file. The call to GET-ENVIRONMENT-AND-FILEMAP with the filename will get cached info if it exists. Otherwise, read the top of the file") + (* ;; "Get reader environment of file. The call to GET-ENVIRONMENT-AND-FILEMAP with the filename will get cached info if it exists. Otherwise, read the top of the file") - (CL:WHEN ENV - (SETQ RDTBL (fetch (READER-ENVIRONMENT REREADTABLE) of ENV)) - (\EXTERNALFORMAT FILESTREAM ENV)) - (SETQ CA (SEPRCASE DWIMIFYCOMPFLG RDTBL)) - [OR (SETQ PATTERNS (CDR (ASSOC RDTBL FFILEPOSPATTERNS))) - (push FFILEPOSPATTERNS - (CONS RDTBL - (SETQ PATTERNS - (for ATOM in ATOMS - collect (CONCAT (COND - ((EQ (CHCON1 ATOM) - (CHARCODE ESCAPE)) - (SETQ ATOM (SUBSTRING ATOM 2 -1)) - "") - (T " ")) - [COND - ((SETQ I (STRPOS ' ATOM)) - (SUBSTRING ATOM 1 (SUB1 I))) - ((STRINGP ATOM)) - (T (LET ((*PACKAGE* (CL:SYMBOL-PACKAGE - ATOM))) + (CL:WHEN ENV + (SETQ RDTBL (fetch (READER-ENVIRONMENT REREADTABLE) of ENV)) + (\EXTERNALFORMAT FILESTREAM ENV)) + (SETQ CA (SEPRCASE DWIMIFYCOMPFLG RDTBL)) + + (* ;; "Escape matches .*, match need not be bracketed by seprs. We test brackets after each hit, if needed. This avoids the slow case of a CASEARRAY in FFILEPOS. Also more accurate, we don't match any string-internal sepr character to any other string internal sepr character.") + + (CL:UNLESS (SETQ PATTERNS (CDR (ASSOC RDTBL FFILEPOSPATTERNS))) + [push FFILEPOSPATTERNS + (CONS RDTBL (SETQ PATTERNS + (for ATOM PREESCAPE POSTESCAPE in ATOMS + collect (CL:WHEN (SETQ PREESCAPE (EQ (CHCON1 ATOM) + (CHARCODE ESCAPE))) + (SETQ ATOM (SUBSTRING ATOM 2))) + (CL:WHEN (SETQ POSTESCAPE + (STRPOS (CONSTANT (CHARACTER (CHARCODE + ESCAPE))) + ATOM)) + (SETQ ATOM (SUBSTRING ATOM 1 (SUB1 POSTESCAPE)) + )) + (CL:WHEN (LITATOM ATOM) + (LET ((*PACKAGE* (CL:SYMBOL-PACKAGE ATOM))) (* ;  "Keep MKSTRING from putting a prefix on") - (MKSTRING ATOM T RDTBL] - (COND - (I "") - (T " "] - (for PATTERN in PATTERNS - do - (SETFILEPTR FILESTREAM (SETQ I (OR TOP 0))) - (while (SETQ I (FFILEPOS PATTERN FILESTREAM I NIL NIL T CA)) - do + (SETQ ATOM (MKSTRING ATOM T RDTBL)))) + (LIST ATOM PREESCAPE POSTESCAPE]) + (for PATTERN NEXTCODE HIT (CABASE _ (FETCH (ARRAYP BASE) OF CA)) + (CASIZE _ (FETCH (ARRAYP LENGTH) OF CA)) + (CAFAT _ (EQ \ST.POS16 (FETCH (ARRAYP TYP) OF CA))) in PATTERNS + do + (SETFILEPTR FILESTREAM (SETQ I (OR TOP 0))) - (* ;; "The next search begins after the last search, since I is the tail of a match, even if the fileptr is set to 0 to get the map") + (* ;; + "If the pattern character match, the pre and post characters must be seprs, unless escapes") - (CL:UNLESS PRINTFLG (* ; + (while [SETQ I (CDR (SETQ HIT (FFILEPOS (CAR PATTERN) + FILESTREAM I NIL NIL 'BOTH] + when [AND [OR (CADR PATTERN) + (PROGN (SETFILEPTR FILESTREAM (CAR HIT)) + (PROG1 [OR (NOT (\BACKCCODE FILESTREAM)) + (ZEROP (\CATRANSLATE CABASE CASIZE CAFAT + (\INCCODE FILESTREAM] + (\SETFILEPTR FILESTREAM I] + (OR (CADDR PATTERN) + (NOT (SETQ NEXTCODE (\PEEKCCODE.NOEOLC FILESTREAM T))) + (ZEROP (\CATRANSLATE CABASE CASIZE CAFAT NEXTCODE] + do + + (* ;; "The next search begins after the last search, since I is the tail of a match, even if the fileptr is set to 0 to get the map") + + (CL:UNLESS PRINTFLG (* ;  "cause the printing of the filename to be saved on history list") - (SETQ PRINTFLG T) - (LISPXPRIN2 FULL T T T) + (SETQ PRINTFLG T) + (LISPXPRIN2 FULL T T T) - (* ;; "print with NODOFLG=T means just to record the printing; the idea is that only those files in which something is found will be remembered on the history list") + (* ;; "print with NODOFLG=T means just to record the printing; the idea is that only those files in which something is found will be remembered on the history list") - (LISPXPRIN1 ": " T NIL T)) - (CL:UNLESS MAP + (LISPXPRIN1 ": " T NIL T)) + (CL:UNLESS MAP - (* ;; - "After the first hit, use LOADFNS to try harder, perhaps scanning to create a map") + (* ;; "After the first hit, use LOADFNS to try harder, perhaps scanning to create a map. Guard against a LOADFNS error") - (SETQ MAP (LOADFNS NIL FILESTREAM NIL 'FILEMAP)) + [NLSETQ (SETQ MAP (LOADFNS NIL FILESTREAM NIL 'FILEMAP] - (* ;; - "LOADFNS may implicitly close the file, so reopen for next hit") + (* ;; "LOADFNS may implicitly close the file, so reopen for next hit") - [OPENSTREAM FILESTREAM 'INPUT 'OLD `((EXTERNALFORMAT ,ENV] - (CL:UNLESS MAP (* ; + [OPENSTREAM FILESTREAM 'INPUT 'OLD `((EXTERNALFORMAT ,ENV] + (CL:UNLESS MAP (* ;  "Set to T so only try and print once") - (LISPXPRIN1 " no filemap!" T) - (SETQ MAP T))) - [OR - [for X in (CDR (LISTP MAP)) - thereis (AND (ILESSP (CAR X) - I) - (IGREATERP (CADR X) - I) - (for Z in (CDDR X) - thereis (COND - ((AND (ILESSP (CADR Z) - I) - (IGREATERP (CDDR Z) - I)) - [COND - ((NOT (FMEMB (CAR Z) - FNS)) - (SETQ FNS (CONS (LISPXPRIN2 - (CAR Z) - T T) - FNS] - (SETQ I (CDDR Z)) - T] - (PROGN (LISPXPRIN2 I T T) - (OR (FMEMB FILE OTHERSFILES) - (SETQ OTHERSFILES (CONS FILE OTHERSFILES] - (LISPXSPACES 1 T))) - (COND - (PRINTFLG (LISPXTERPRI T)) - (T (TERPRI T))) - (COND - ((NEQ COMS T) - (COND - ((OR FNS OTHERSFILES) - (EDITFROMFILE (OR (EQ MAP T) - (DREVERSE FNS)) - FULL EDITPATTERN COMS (NULL OTHERSFILES)) - (SETQ OTHERSFILES) - (SETQ FNS])] - (LISPXTERPRI T) - (LISPXTERPRI T) - (LISPXPRIN1 "Could not examine " T) - (LISPXPRIN1 FULL T) - (LISPXTERPRI T) - (LISPXTERPRI T))) + (LISPXPRIN1 " no filemap!" T) + (SETQ MAP T))) + [OR [for X in (CDR (LISTP MAP)) + thereis (AND (ILESSP (CAR X) + I) + (IGREATERP (CADR X) + I) + (for Z in (CDDR X) + thereis (COND + ((AND (ILESSP (CADR Z) + I) + (IGREATERP (CDDR Z) + I)) + [COND + ((NOT (FMEMB (CAR Z) + FNS)) + (SETQ FNS (CONS (LISPXPRIN2 + (CAR Z) + T T) + FNS] + (SETQ I (CDDR Z)) + T] + (PROGN (LISPXPRIN2 I T T) + (OR (FMEMB FILE OTHERSFILES) + (SETQ OTHERSFILES (CONS FILE OTHERSFILES] + (LISPXSPACES 1 T))) + (COND + (PRINTFLG (LISPXTERPRI T)) + (T (TERPRI T))) + (COND + ((NEQ COMS T) + (COND + ((OR FNS OTHERSFILES) + (EDITFROMFILE (OR (EQ MAP T) + (DREVERSE FNS)) + FULL EDITPATTERN COMS (NULL OTHERSFILES)) + (SETQ OTHERSFILES) + (SETQ FNS])] (COND ((EQ COMS T) (CONS OTHERSFILES FNS]) @@ -4937,46 +4946,46 @@ compiling " T) (PUTPROPS FILEPKG COPYRIGHT ("Venue & Xerox Corporation" T 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1995 2018 2020 2021 2022)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (19254 20959 (SEARCHPRETTYTYPELST 19264 . 20243) (PRETTYDEFMACROS 20245 . 20703) ( -FILEPKGCOMPROPS 20705 . 20957)) (21761 57008 (CLEANUP 21771 . 23159) (COMPILEFILES 23161 . 23437) ( -COMPILEFILES0 23439 . 24159) (CONTINUEDIT 24161 . 25581) (MAKEFILE 25583 . 37920) (FILECHANGES 37922 - . 40686) (FILEPKG.MERGECHANGES 40688 . 41511) (FILEPKG.CHANGEDFNS 41513 . 41825) (MAKEFILE1 41827 . -46054) (COMPILE-FILE? 46056 . 47613) (MAKEFILES 47615 . 49308) (ADDFILE 49310 . 51831) (ADDFILE0 51833 - . 55969) (LISTFILES 55971 . 57006)) (57680 92920 (FILEPKGCHANGES 57690 . 59040) (GETFILEPKGTYPE 59042 - . 62115) (MARKASCHANGED 62117 . 63754) (FILECOMS 63756 . 64140) (WHEREIS 64142 . 65562) ( -SMASHFILECOMS 65564 . 65799) (FILEFNSLST 65801 . 65963) (FILECOMSLST 65965 . 66449) (UPDATEFILES 66451 - . 71751) (INFILECOMS? 71753 . 73656) (INFILECOMTAIL 73658 . 74798) (INFILECOMS 74800 . 74961) ( -INFILECOM 74963 . 85172) (INFILECOMSVALS 85174 . 85501) (INFILECOMSVAL 85503 . 86505) (INFILECOMSPROP -86507 . 87336) (IFCPROPS 87338 . 88599) (IFCEXPRTYPE 88601 . 89112) (IFCPROPSCAN 89114 . 90167) ( -IFCDECLARE 90169 . 91480) (INFILEPAIRS 91482 . 91814) (INFILECOMSMACRO 91816 . 92918)) (92955 124375 ( -FILES? 92965 . 95158) (FILES?1 95160 . 95858) (FILES?PRINTLST 95860 . 96642) (ADDTOFILES? 96644 . -107690) (ADDTOFILE 107692 . 108608) (WHATIS 108610 . 110586) (ADDTOCOMS 110588 . 112232) (ADDTOCOM -112234 . 118781) (ADDTOCOM1 118783 . 119954) (ADDNEWCOM 119956 . 121006) (MAKENEWCOM 121008 . 122851) -(DEFAULTMAKENEWCOM 122853 . 124373)) (124445 127262 (MERGEINSERT 124455 . 126798) (MERGEINSERT1 126800 - . 127260)) (127416 128773 (ADDTOFILEKEYLST 127426 . 128771)) (128890 139802 (DELFROMFILES 128900 . -129750) (DELFROMCOMS 129752 . 131431) (DELFROMCOM 131433 . 137301) (DELFROMCOM1 137303 . 138100) ( -REMOVEITEM 138102 . 138976) (MOVETOFILE 138978 . 139800)) (140016 142385 (SAVEPUT 140026 . 142383)) ( -142510 150834 (UNMARKASCHANGED 142520 . 144228) (PREEDITFN 144230 . 146741) (POSTEDITPROPS 146743 . -149244) (POSTEDITALISTS 149246 . 150832)) (150979 171533 (ALISTS.GETDEF 150989 . 151368) ( -ALISTS.WHENCHANGED 151370 . 152014) (CLEARCLISPARRAY 152016 . 153190) (EXPRESSIONS.WHENCHANGED 153192 - . 153566) (MAKEALISTCOMS 153568 . 154641) (MAKEFILESCOMS 154643 . 156080) (MAKELISPXMACROSCOMS 156082 - . 158100) (MAKEPROPSCOMS 158102 . 158800) (MAKEUSERMACROSCOMS 158802 . 160602) (PROPS.WHENCHANGED -160604 . 161225) (FILEGETDEF.LISPXMACROS 161227 . 162669) (FILEGETDEF.ALISTS 162671 . 163290) ( -FILEGETDEF.RECORDS 163292 . 164223) (FILEGETDEF.PROPS 164225 . 165017) (FILEGETDEF.MACROS 165019 . -166079) (FILEGETDEF.VARS 166081 . 166497) (FILEGETDEF.FNS 166499 . 167863) (FILEPKGCOMS.PUTDEF 167865 - . 170305) (FILES.PUTDEF 170307 . 171264) (VARS.PUTDEF 171266 . 171409) (FILES.WHENCHANGED 171411 . -171531)) (173555 180988 (RENAME 173565 . 174966) (CHANGECALLERS 174968 . 180986)) (180989 229845 ( -SHOWDEF 180999 . 182192) (COPYDEF 182194 . 184668) (GETDEF 184670 . 186946) (GETDEFCOM 186948 . 187914 -) (GETDEFCOM0 187916 . 189262) (GETDEFCURRENT 189264 . 195684) (GETDEFERR 195686 . 196987) ( -GETDEFFROMFILE 196989 . 201269) (GETDEFSAVED 201271 . 202375) (PUTDEF 202377 . 203080) (EDITDEF 203082 - . 204059) (DEFAULT.EDITDEF 204061 . 206897) (EDITDEF.FILES 206899 . 207100) (LOADDEF 207102 . 207278) - (DWIMDEF 207280 . 208134) (DELDEF 208136 . 211150) (DELFROMLIST 211152 . 211656) (HASDEF 211658 . -217980) (GETFILEDEF 217982 . 218504) (SAVEDEF 218506 . 220165) (UNSAVEDEF 220167 . 221063) ( -COMPAREDEFS 221065 . 224875) (COMPARE 224877 . 225581) (TYPESOF 225583 . 229843)) (229995 238766 ( -FILEPKGCOM 230005 . 234938) (FILEPKGTYPE 234940 . 238764)) (250799 266227 (FINDCALLERS 250809 . 251324 -) (EDITCALLERS 251326 . 259732) (EDITFROMFILE 259734 . 265542) (FINDATS 265544 . 265816) (LOOKIN -265818 . 266225)) (266228 267955 (SEPRCASE 266238 . 267953)) (268472 274029 (IMPORTFILE 268482 . -269456) (IMPORTEVAL 269458 . 270338) (IMPORTFILESCAN 270340 . 270761) (CHECKIMPORTS 270763 . 272099) ( -GATHEREXPORTS 272101 . 273439) (\DUMPEXPORTS 273441 . 274027)) (274367 276575 (CLEARFILEPKG 274377 . -276573))))) + (FILEMAP (NIL (19265 20970 (SEARCHPRETTYTYPELST 19275 . 20254) (PRETTYDEFMACROS 20256 . 20714) ( +FILEPKGCOMPROPS 20716 . 20968)) (21772 57019 (CLEANUP 21782 . 23170) (COMPILEFILES 23172 . 23448) ( +COMPILEFILES0 23450 . 24170) (CONTINUEDIT 24172 . 25592) (MAKEFILE 25594 . 37931) (FILECHANGES 37933 + . 40697) (FILEPKG.MERGECHANGES 40699 . 41522) (FILEPKG.CHANGEDFNS 41524 . 41836) (MAKEFILE1 41838 . +46065) (COMPILE-FILE? 46067 . 47624) (MAKEFILES 47626 . 49319) (ADDFILE 49321 . 51842) (ADDFILE0 51844 + . 55980) (LISTFILES 55982 . 57017)) (57691 92931 (FILEPKGCHANGES 57701 . 59051) (GETFILEPKGTYPE 59053 + . 62126) (MARKASCHANGED 62128 . 63765) (FILECOMS 63767 . 64151) (WHEREIS 64153 . 65573) ( +SMASHFILECOMS 65575 . 65810) (FILEFNSLST 65812 . 65974) (FILECOMSLST 65976 . 66460) (UPDATEFILES 66462 + . 71762) (INFILECOMS? 71764 . 73667) (INFILECOMTAIL 73669 . 74809) (INFILECOMS 74811 . 74972) ( +INFILECOM 74974 . 85183) (INFILECOMSVALS 85185 . 85512) (INFILECOMSVAL 85514 . 86516) (INFILECOMSPROP +86518 . 87347) (IFCPROPS 87349 . 88610) (IFCEXPRTYPE 88612 . 89123) (IFCPROPSCAN 89125 . 90178) ( +IFCDECLARE 90180 . 91491) (INFILEPAIRS 91493 . 91825) (INFILECOMSMACRO 91827 . 92929)) (92966 124386 ( +FILES? 92976 . 95169) (FILES?1 95171 . 95869) (FILES?PRINTLST 95871 . 96653) (ADDTOFILES? 96655 . +107701) (ADDTOFILE 107703 . 108619) (WHATIS 108621 . 110597) (ADDTOCOMS 110599 . 112243) (ADDTOCOM +112245 . 118792) (ADDTOCOM1 118794 . 119965) (ADDNEWCOM 119967 . 121017) (MAKENEWCOM 121019 . 122862) +(DEFAULTMAKENEWCOM 122864 . 124384)) (124456 127273 (MERGEINSERT 124466 . 126809) (MERGEINSERT1 126811 + . 127271)) (127427 128784 (ADDTOFILEKEYLST 127437 . 128782)) (128901 139813 (DELFROMFILES 128911 . +129761) (DELFROMCOMS 129763 . 131442) (DELFROMCOM 131444 . 137312) (DELFROMCOM1 137314 . 138111) ( +REMOVEITEM 138113 . 138987) (MOVETOFILE 138989 . 139811)) (140027 142396 (SAVEPUT 140037 . 142394)) ( +142521 150845 (UNMARKASCHANGED 142531 . 144239) (PREEDITFN 144241 . 146752) (POSTEDITPROPS 146754 . +149255) (POSTEDITALISTS 149257 . 150843)) (150990 171544 (ALISTS.GETDEF 151000 . 151379) ( +ALISTS.WHENCHANGED 151381 . 152025) (CLEARCLISPARRAY 152027 . 153201) (EXPRESSIONS.WHENCHANGED 153203 + . 153577) (MAKEALISTCOMS 153579 . 154652) (MAKEFILESCOMS 154654 . 156091) (MAKELISPXMACROSCOMS 156093 + . 158111) (MAKEPROPSCOMS 158113 . 158811) (MAKEUSERMACROSCOMS 158813 . 160613) (PROPS.WHENCHANGED +160615 . 161236) (FILEGETDEF.LISPXMACROS 161238 . 162680) (FILEGETDEF.ALISTS 162682 . 163301) ( +FILEGETDEF.RECORDS 163303 . 164234) (FILEGETDEF.PROPS 164236 . 165028) (FILEGETDEF.MACROS 165030 . +166090) (FILEGETDEF.VARS 166092 . 166508) (FILEGETDEF.FNS 166510 . 167874) (FILEPKGCOMS.PUTDEF 167876 + . 170316) (FILES.PUTDEF 170318 . 171275) (VARS.PUTDEF 171277 . 171420) (FILES.WHENCHANGED 171422 . +171542)) (173566 180999 (RENAME 173576 . 174977) (CHANGECALLERS 174979 . 180997)) (181000 229856 ( +SHOWDEF 181010 . 182203) (COPYDEF 182205 . 184679) (GETDEF 184681 . 186957) (GETDEFCOM 186959 . 187925 +) (GETDEFCOM0 187927 . 189273) (GETDEFCURRENT 189275 . 195695) (GETDEFERR 195697 . 196998) ( +GETDEFFROMFILE 197000 . 201280) (GETDEFSAVED 201282 . 202386) (PUTDEF 202388 . 203091) (EDITDEF 203093 + . 204070) (DEFAULT.EDITDEF 204072 . 206908) (EDITDEF.FILES 206910 . 207111) (LOADDEF 207113 . 207289) + (DWIMDEF 207291 . 208145) (DELDEF 208147 . 211161) (DELFROMLIST 211163 . 211667) (HASDEF 211669 . +217991) (GETFILEDEF 217993 . 218515) (SAVEDEF 218517 . 220176) (UNSAVEDEF 220178 . 221074) ( +COMPAREDEFS 221076 . 224886) (COMPARE 224888 . 225592) (TYPESOF 225594 . 229854)) (230006 238777 ( +FILEPKGCOM 230016 . 234949) (FILEPKGTYPE 234951 . 238775)) (250810 267277 (FINDCALLERS 250820 . 251335 +) (EDITCALLERS 251337 . 260782) (EDITFROMFILE 260784 . 266592) (FINDATS 266594 . 266866) (LOOKIN +266868 . 267275)) (267278 269005 (SEPRCASE 267288 . 269003)) (269522 275079 (IMPORTFILE 269532 . +270506) (IMPORTEVAL 270508 . 271388) (IMPORTFILESCAN 271390 . 271811) (CHECKIMPORTS 271813 . 273149) ( +GATHEREXPORTS 273151 . 274489) (\DUMPEXPORTS 274491 . 275077)) (275417 277625 (CLEARFILEPKG 275427 . +277623))))) STOP diff --git a/sources/FILEPKG.LCOM b/sources/FILEPKG.LCOM index 7487b340..c8270423 100644 Binary files a/sources/FILEPKG.LCOM and b/sources/FILEPKG.LCOM differ diff --git a/sources/IOCHAR b/sources/IOCHAR index 8c2d0824..343be705 100644 --- a/sources/IOCHAR +++ b/sources/IOCHAR @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "26-Oct-2021 10:07:31"  -{DSK}kaplan>Local>medley3.5>git-medley>sources>IOCHAR.;5 90395 +(FILECREATED "10-Jul-2022 16:52:14"  +{DSK}kaplan>local>medley3.5>working-medley>sources>IOCHAR.;39 99224 - changes to%: (VARS IOCHARCOMS) + :CHANGES-TO (FNS FILEPOS \SLOWFILEPOS FFILEPOS) - previous date%: "24-Oct-2021 23:57:27" -{DSK}kaplan>Local>medley3.5>git-medley>sources>IOCHAR.;4) + :PREVIOUS-DATE " 1-Jul-2022 11:55:50" +{DSK}kaplan>local>medley3.5>working-medley>sources>IOCHAR.;36) (* ; " @@ -32,7 +32,7 @@ Copyright (c) 1981-1988, 1990-1991, 2018, 2020 by Venue & Xerox Corporation. (DECLARE%: EVAL@COMPILE (PROP GLOBALVAR UPPERCASEARRAY) DONTCOPY (GLOBALVARS \TRANSPARENT))) - (COMS (FNS FILEPOS FFILEPOS \SETUP.FFILEPOS) + (COMS (FNS FILEPOS FFILEPOS \SETUP.FFILEPOS \SLOWFILEPOS) (DECLARE%: EVAL@COMPILE DONTCOPY (RESOURCES \FFDELTA1 \FFDELTA2 \FFPATCHAR) (CONSTANTS (\MAX.PATTERN.SIZE 128) (\MIN.PATTERN.SIZE 3) @@ -50,7 +50,7 @@ Copyright (c) 1981-1988, 1990-1991, 2018, 2020 by Venue & Xerox Corporation. (* ;; - " Note: this might not be relevant to users with local time servers that do the right thing.") + " Note: this might not be relevant to users with local time servers that do the right thing.") (INITVARS (\TimeZoneComp 8) (\BeginDST 74) @@ -187,13 +187,12 @@ Copyright (c) 1981-1988, 1990-1991, 2018, 2020 by Venue & Xerox Corporation. (DECLARE%: EVAL@COMPILE (PUTPROPS \CATRANSLATE MACRO (OPENLAMBDA (CABASE CASIZE CAFAT CHAR) - (COND - ((ILEQ CHAR CASIZE)(* ; - "If it's in the table, use the table value") - (\GETBASEBYTE CABASE CHAR)) - (T (* ; - "Off the end -- assume it's itself") - CHAR)))) + (COND + ((ILEQ CHAR CASIZE) (* ; + "If it's in the table, use the table value") + (\GETBASECHAR CAFAT CABASE CHAR)) + (T (* ; "Off the end -- assume it's itself") + CHAR)))) ) ) (DEFINEQ @@ -256,339 +255,511 @@ DONTCOPY (DEFINEQ (FILEPOS - [LAMBDA (STR FILE START END SKIP TAIL CASEARRAY) (* ; "Edited 10-Aug-2020 21:44 by rmk:") - (* Pavel "12-Oct-86 15:13") + [LAMBDA (PATTERN FILE START END SKIP TAIL CASEARRAY) - (* ;; "RMK: Added coercion from internal XCCS string to UTF8 if searching a UTF8 file") + (* ;; "Edited 10-Jul-2022 16:51 by rmk") - (* ;; "NB: this function now works on non-PAGEMAPPED files. It must use only IO functions that respect that.") + (* ;; "Edited 1-Jul-2022 11:55 by rmk") - (PROG ((SKIPCHAR (AND SKIP (CHCON1 SKIP))) - [CA (fetch (ARRAYP BASE) of (COND - [CASEARRAY - (COND - ((AND (ARRAYP CASEARRAY) - (EQ (fetch (ARRAYP TYP) of - CASEARRAY - ) - \ST.BYTE)) - CASEARRAY) - (T (CASEARRAY CASEARRAY] - (T \TRANSPARENT] - (STREAM (\GETSTREAM FILE 'INPUT)) - CHAR FIRSTCHAR STRBASE STRINDEX PATLEN PATINDEX ORGFILEPTR LASTINDEX STARTBYTE ENDBYTE - BIGENDBYTE STARTSEG ENDSEG) - (CL:WHEN (EQ :UTF8 (\EXTERNALFORMAT STREAM)) - (SETQ STR (XTOUSTRING STR))) - [COND - ((LITATOM STR) - (SETQ STRBASE (fetch (LITATOM PNAMEBASE) of STR)) - (SETQ STRINDEX 1) - (SETQ PATLEN (fetch (LITATOM PNAMELENGTH) of STR))) - (T (OR (STRINGP STR) - (SETQ STR (MKSTRING STR))) - (SETQ STRBASE (fetch (STRINGP BASE) of STR)) - (SETQ STRINDEX (fetch (STRINGP OFFST) of STR)) - (SETQ PATLEN (fetch (STRINGP LENGTH) of STR] - (* ; - "calculate start addr and set file ptr.") - [SETQ STARTBYTE (COND - (START (COND - ((NOT (AND (FIXP START) - (IGEQ START 0))) - (LISPERROR "ILLEGAL ARG" START))) - (SETQ ORGFILEPTR (\GETFILEPTR STREAM)) - (\SETFILEPTR STREAM START) - START) - (T (SETQ ORGFILEPTR (\GETFILEPTR STREAM] - (* ; - "calculate the character address of the character after the last possible match.") - [SETQ ENDBYTE (ADD1 (COND - ((NULL END) (* ; "Default is end of file") - (IDIFFERENCE (\GETEOFPTR STREAM) - PATLEN)) - ((IGEQ END 0) (* ; "Absolute byte pointer given") - (IMIN END (IDIFFERENCE (\GETEOFPTR STREAM) - PATLEN))) - ((IGREATERP PATLEN (IMINUS END)) - (* ; - "END is too far, use eof less length") - (IDIFFERENCE (\GETEOFPTR STREAM) - PATLEN)) - (T (IDIFFERENCE (IPLUS (\GETEOFPTR STREAM) - END 1) - PATLEN] + (* ;; "Edited 25-Jun-2022 22:51 by rmk: The original version was a byte-level searcher, this upgrades to character searching as determined by the external format of the stream. (It is also a bit faster than the original).") - (* ;; "use STARTBYTE and ENDBYTE instead of START and END because vm functions shouldn't change their arguments.") + (* ;; "This provides accurate results if the stream's external format is stable, wherein each character code has a unique byte representation. If the stream's format is unstable (i.e. XCCS runcoding), then the result is accurate if the stream's initial charset (or other contextual information) is correct for the START byte position.") - (COND - ((IGEQ STARTBYTE ENDBYTE) (* ; "nothing to search") - (GO FAILED))) - (SETQ LASTINDEX PATLEN) - SKIPLP - (* ; - "set the first character to FIRSTCHAR, handling leading skips.") - (COND - ((EQ LASTINDEX 0) (* ; "null case") - (GO FOUNDIT)) - ((EQ (SETQ FIRSTCHAR (\GETBASEBYTE CA (\GETBASEBYTE STRBASE STRINDEX))) - SKIPCHAR) (* ; - "first character in pattern is skip.") - (SETQ LASTINDEX (SUB1 LASTINDEX)) - (\BIN STREAM) (* ; "Move forward a character.") - (add STRINDEX 1) - (add STARTBYTE 1) - (GO SKIPLP))) - (SETQ LASTINDEX (IPLUS LASTINDEX STRINDEX)) (* ; - "Used for end of pattern check, comparing against current INDEX") - [COND - ((SMALLP ENDBYTE) - (SETQ STARTSEG (SETQ ENDSEG 0))) - (T - (* ;; "The search will be in the large integers at least part of the time, so split the start and end fileptrs into hi and lo parts. The `segment' size we choose is smaller than 2^16 so that we are still smallp near the boundary (can get around that here by decrementing everyone, but can't in FFILEPOS). Note that STARTBYTE and ENDBYTE are never actually used as file ptrs, just for counting.") + (* ;; "Otherwise, there may be some bad matches and some missing matches. The slow case will be accurate in those cases (and a NIL return for the format's \FORMATBYTESTRING function will kick it into the slow case (about 10 times slower). This always defers to the slow case if SKIP or CASEARRAY are non-NIL.") - (SETQ ENDSEG (FOLDLO ENDBYTE FILEPOS.SEGMENT.SIZE)) - (SETQ BIGENDBYTE (IMOD ENDBYTE FILEPOS.SEGMENT.SIZE)) - (SETQ STARTSEG (FOLDLO STARTBYTE FILEPOS.SEGMENT.SIZE)) - (SETQ STARTBYTE (IMOD STARTBYTE FILEPOS.SEGMENT.SIZE)) - (SETQ ENDBYTE (COND - ((EQ STARTSEG ENDSEG) - BIGENDBYTE) - (T + (* ;; "(Original algorithm advanced the pattern (and the stream starting position) over leading skips, presumably to speed up the search. A foolish (and complex) optimization, since it would just mean that you would cover the intervening characters in a different way.)") - (* ;; "In different segments, so we'll have to search all the way to the end of this seg; hence, `end' is currently as big as it gets") + (* ;; + "New interface features: TAIL=BOTH means return a dotted pair of the (start . end) of the match") - FILEPOS.SEGMENT.SIZE] - FIRSTCHARLP + (* ;; "CASEARRAY=T forces the slow case, as if CASEARRAY=(CASEARRAU) - transparent.") + + (PROG ((STREAM (\GETSTREAM FILE 'INPUT)) + STREAMLEN ORGFILEPTR PATSTR PATLEN PATBASE PATLEN FIRSTINDEX LASTINDEX PATFIRSTBYTE + STARTBYTEPOS ENDBYTEPOS) + + (* ;; "") + + (* ;; "Decode the start and end parameters, set the starting filepointer.") + + (* ;; "Set STARTBYTEPOS and ENDBYTEPOS instead of resetting START and END because vm functions shouldn't change their arguments.") + + (SETQ ORGFILEPTR (\GETFILEPTR STREAM)) + (SETQ STARTBYTEPOS (COND + (START (CL:UNLESS (AND (FIXP START) + (IGEQ START 0)) + (LISPERROR "ILLEGAL ARG" START)) + (\SETFILEPTR STREAM START) + START) + (T ORGFILEPTR))) + (SETQ STREAMLEN (\GETEOFPTR STREAM)) + [SETQ ENDBYTEPOS (ADD1 (COND + ((NULL END) (* ; "Default is end of file ") + STREAMLEN) + ((IGEQ END 0) (* ; "Absolute byte pointer given") + (IMIN END STREAMLEN)) + (T (IPLUS STREAMLEN END 1] + + (* ;; "STARTBYTEPOS is the position of the first matchable byte = (SETFILEPTR SBP)(BIN)") + + (* ;; "ENDBYTEPOS here is the position one after the last possible start (not the position of the final byte of the last possible match). That is, the match itself can go further than ENDBYTEPOS") + + (CL:WHEN (IGREATERP STARTBYTEPOS ENDBYTEPOS) (* ; "nothing to search ") + (GO FAILED)) + (CL:WHEN (EQ (NCHARS PATTERN) + 0) + + (* ;; "Empty string: succed. Already positioned at STARTBYTEPOS") + + (RETURN STARTBYTEPOS)) + (CL:WHEN [OR CASEARRAY (AND SKIP (STRPOS SKIP PATTERN)) + (NOT (SETQ PATSTR (\FORMATBYTESTRING STREAM PATTERN] + (RETURN (OR (\SLOWFILEPOS PATTERN STREAM STARTBYTEPOS ENDBYTEPOS SKIP TAIL CASEARRAY) + (GO FAILED)))) + + (* ;; "") + + (* ;; "Now we're in the fast case: No SKIP and no CASEARRAY, and we were able to map the search string to a stable sequence of file bytes. ") + + (SETQ PATLEN (ffetch (STRINGP LENGTH) of PATSTR)) + (CL:WHEN (IGREATERP (SUB1 PATLEN) + (IDIFFERENCE STREAMLEN ENDBYTEPOS)) + + (* ;; "EOF guard; needed to wait for actual pattern length") + + (SETQ ENDBYTEPOS (IDIFFERENCE STREAMLEN (SUB1 PATLEN))) + (CL:WHEN (IGEQ STARTBYTEPOS ENDBYTEPOS) + (GO FAILED))) + (SETQ PATBASE (ffetch (STRINGP BASE) of PATSTR)) + (SETQ FIRSTINDEX (ffetch (STRINGP OFFST) of PATSTR)) + (SETQ LASTINDEX (IPLUS FIRSTINDEX (SUB1 PATLEN))) + (SETQ PATFIRSTBYTE (\GETBASEBYTE PATBASE FIRSTINDEX)) + (ADD FIRSTINDEX 1) (* ; + "Start at the second byte when the first one matched. ") + + (* ;; "") + + (* ;; "The stream keeps track of its byte position, but we must count down ourselves so that we don't go beyond ENDBYTEPOS (would be nice if we could construct a substream). Use hi/lo arithmetic to avoid large integers on big byte regions.") + + (* ;; "A loop of nomatch-match sequences") + + (BIND (NBYTES _ (IDIFFERENCE ENDBYTEPOS STARTBYTEPOS)) + NBYTESHI NBYTESLO FIRST (SETQ NBYTESHI (FOLDLO NBYTES FILEPOS.SEGMENT.SIZE)) + (SETQ NBYTESLO (IMOD NBYTES FILEPOS.SEGMENT.SIZE)) + DO (DO + (* ;; "Find next FIRSTBYTE") + + (CL:WHEN (ILEQ NBYTESLO 0) (* ; "Finished this segment ") + (CL:WHEN (EQ NBYTESHI 0) + (GO FAILED)) (* ; "Roll over to a new segment") + (add NBYTESLO FILEPOS.SEGMENT.SIZE) + (add NBYTESHI -1)) + (ADD NBYTESLO -1) (* ; "Decrement the byte count") + REPEATUNTIL (EQ PATFIRSTBYTE (\BIN STREAM))) + + (* ;; "") + + (* ;; "Found PATFIRSTBYTE, enter match loop.") + + (FOR I FROM FIRSTINDEX TO LASTINDEX + DO (CL:UNLESS (EQ (\GETBASEBYTE PATBASE I) + (\BIN STREAM)) + + (* ;; "Match failed: Go back to second position and try again") + + (\INCFILEPTR STREAM (SUB1 (IDIFFERENCE FIRSTINDEX I))) + (RETURN)) FINALLY + + (* ;; + "Ran off the end: complete match, get out of the outer loop") + + (GO FOUNDIT))) + FOUNDIT - (* ;; "STARTBYTE is the possible beginning of a match. the file ptr of the file is always at STARTBYTE position when the FIRSTCHAR loop is passed.") + (* ;; "The stream's charset should be set to the charset corresponding to the return byte-position. We haven't been tracking it, but if we are returning the tail pointer, then the stream's character set must be the same as the character set of the last character o fPATTERN.") - (COND - ((EQ STARTBYTE ENDBYTE) (* ; "end of this part of search") - (COND - ((EQ STARTSEG ENDSEG) (* ; "failed") - (GO FAILED))) (* ; - "Finished this segment, roll over into new one") - (SETQ STARTBYTE 0) (* ; - "= STARTBYTE-FILEPOS.SEGMENT.SIZE") - [COND - ((EQ (add STARTSEG 1) - ENDSEG) (* ; - "Entering final segment, so set ENDBYTE to actual end instead of segment end") - (COND - ((EQ (SETQ ENDBYTE BIGENDBYTE) - 0) - (GO FAILED] - (GO FIRSTCHARLP)) - ((NEQ FIRSTCHAR (\GETBASEBYTE CA (\BIN STREAM))) - (add STARTBYTE 1) - (GO FIRSTCHARLP))) - (SETQ PATINDEX STRINDEX) - MATCHLP - (* ; - "At this point, STR is matched thru offset PATINDEX") - (COND - ((EQ (SETQ PATINDEX (ADD1 PATINDEX)) - LASTINDEX) (* ; "matched for entire length") - (GO FOUNDIT)) - ((OR (EQ (SETQ CHAR (\GETBASEBYTE CA (\GETBASEBYTE STRBASE PATINDEX))) - (\GETBASEBYTE CA (\BIN STREAM))) - (EQ CHAR SKIPCHAR)) (* ; - "Char from file matches char from STR") - (GO MATCHLP)) - (T (* ; - "Match failed, so we have to start again with first char") - (\SETFILEPTR STREAM (IDIFFERENCE (\GETFILEPTR STREAM) - (IDIFFERENCE PATINDEX STRINDEX))) + (* ;; "Getting the character set for the start of the match is a little trickier. We know the character set at the byte that starts the beginning of the match (= character set of PATTERN's first character. If we set the stream to that charset, then back up one character, that should get it right. ") - (* ;; "Back up over the chars we have just read in trying to match, less one. I.e. go back to one past the previous starting point") + (* ;; "This should only be necessary for an unstable format, maybe don't bother if it isn't XCCS. There is another special case here for XCCS: if the charset is 255 at the start (=2 byte encoding), then we assume that it didn't change, and nothing to worry about.") - (add STARTBYTE 1) - (GO FIRSTCHARLP))) - FOUNDIT - (* ; - "set fileptr, adjust for beginning skips and return proper value.") - [COND - ((NOT TAIL) (* ; - "Fileptr wants to be at start of string") - (\SETFILEPTR STREAM (IDIFFERENCE (\GETFILEPTR STREAM) - PATLEN] - (RETURN (\GETFILEPTR STREAM)) + (RETURN (IF TAIL + THEN (CL:UNLESS (EQ NSCHARSETSHIFT (ffetch (STREAM CHARSET) of STREAM)) + (freplace (STREAM CHARSET) of STREAM with (\CHARSET (NTHCHARCODE + PATTERN -1)))) + (CL:IF (EQ TAIL 'BOTH) + (CONS (IDIFFERENCE (\GETFILEPTR STREAM) + PATLEN) + (\GETFILEPTR STREAM)) + (\GETFILEPTR STREAM)) + ELSE + (* ;; + "Fileptr wants to be where the match started, PATLEN back from where the match ended") + + (\INCFILEPTR STREAM (IMINUS PATLEN)) + (SETQ STARTBYTEPOS (\GETFILEPTR STREAM)) + (CL:UNLESS (EQ NSCHARSETSHIFT (ffetch (STREAM CHARSET) of STREAM)) + (freplace (STREAM CHARSET) of STREAM with (\CHARSET (CHCON1 PATTERN))) + (\BACKCCODE STREAM) (* ; "Should fix the charset") + (\SETFILEPTR STREAM STARTBYTEPOS)) + STARTBYTEPOS)) FAILED - (* ; - "return the fileptr to its initial position.") - (\SETFILEPTR STREAM ORGFILEPTR) + (\SETFILEPTR STREAM ORGFILEPTR) (* ; + "return the fileptr to its initial position. We didn't jigger the original charset") (RETURN NIL]) (FFILEPOS - [LAMBDA (PATTERN FILE START END SKIP TAIL CASEARRAY) (* ; "Edited 10-Aug-2020 21:44 by rmk:") + [LAMBDA (PATTERN FILE START END SKIP TAIL CASEARRAY) - (* ;; "RMK: Added coercion from internal XCCS string to UTF8 if searching a UTF8 file") - (* Pavel "12-Oct-86 15:20") - (PROG ([STREAM (\GETSTREAM (OR FILE (INPUT] - PATBASE PATOFFSET PATLEN ORGFILEPTR STARTOFFSET ENDOFFSET BIGENDOFFSET STARTSEG ENDSEG EOF - ) + (* ;; "Edited 10-Jul-2022 10:17 by rmk") + + (* ;; "Edited 1-Jul-2022 11:55 by rmk") + + (* ;; "Edited 23-Jun-2022 08:50 by rmk: CASEARRAY is now also a slow (FFILEPOS) case. Fast case now works for arbitrary external formats") + + (* ;; "Edited 10-Aug-2020 21:44 by rmk:") + + (* ;; "RMK: Added coercion from internal XCCS string to UTF8 if searching a UTF8 file") + (* Pavel "12-Oct-86 15:20") + (PROG ((STREAM (\GETSTREAM FILE 'INPUT)) + BYTEPATTERN BPATBASE BPATOFFSET BPATLEN ORGFILEPTR STARTBYTEPOS ENDBYTEPOS BIGENDOFFSET + STARTSEG ENDSEG EOF) + (CL:WHEN [OR SKIP CASEARRAY (NOT (fetch PAGEMAPPED of (fetch (STREAM DEVICE) of STREAM))) + (NULL (SETQ BYTEPATTERN (\FORMATBYTESTRING STREAM PATTERN] + (* ; "Slow case--use FILEPOS") + (GO TRYFILEPOS)) (* ; + "calculate start addr and set file ptr.") + (SETQ BPATBASE (fetch (STRINGP BASE) of BYTEPATTERN)) + (SETQ BPATOFFSET (fetch (STRINGP OFFST) of BYTEPATTERN)) + (SETQ BPATLEN (fetch (STRINGP LENGTH) of BYTEPATTERN)) (COND - (SKIP (* ; "Slow case--use FILEPOS") - (GO TRYFILEPOS)) - ((NOT (fetch PAGEMAPPED of (fetch (STREAM DEVICE) of STREAM))) - (* ; - "This is a non-page-oriented file. Use FILEPOS instead.") - (GO TRYFILEPOS))) (* ; - "calculate start addr and set file ptr.") - (CL:WHEN (EQ :UTF8 (\EXTERNALFORMAT STREAM)) - (SETQ PATTERN (XTOUSTRING PATTERN))) - [COND - ((LITATOM PATTERN) - (SETQ PATBASE (fetch (LITATOM PNAMEBASE) of PATTERN)) - (SETQ PATOFFSET 1) - (SETQ PATLEN (fetch (LITATOM PNAMELENGTH) of PATTERN))) - (T (OR (STRINGP PATTERN) - (SETQ PATTERN (MKSTRING PATTERN))) - (SETQ PATBASE (fetch (STRINGP BASE) of PATTERN)) - (SETQ PATOFFSET (fetch (STRINGP OFFST) of PATTERN)) - (SETQ PATLEN (fetch (STRINGP LENGTH) of PATTERN] - (COND - ((OR (IGREATERP PATLEN \MAX.PATTERN.SIZE) - (ILESSP PATLEN \MIN.PATTERN.SIZE)) + ((OR (IGREATERP BPATLEN \MAX.PATTERN.SIZE) + (ILESSP BPATLEN \MIN.PATTERN.SIZE)) (GO TRYFILEPOS))) (SETQ ORGFILEPTR (\GETFILEPTR STREAM)) - (SETQ STARTOFFSET (IPLUS (COND - (START (COND - ((NOT (AND (FIXP START) - (IGEQ START 0))) - (LISPERROR "ILLEGAL ARG" START))) - START) - (T ORGFILEPTR)) - (SUB1 PATLEN))) (* ; - "STARTOFFSET is the address of the character corresponding to the last character of PATTERN.") - (SETQ EOF (\GETEOFPTR STREAM)) (* ; - "calculate the character address of the character after the last possible match.") - [SETQ ENDOFFSET (COND - ((NULL END) (* ; "Default is end of file") - EOF) - (T (IMIN (IPLUS (COND - ((ILESSP END 0) - (IPLUS EOF END 1)) - (T END)) - PATLEN) - EOF] + (SETQ STARTBYTEPOS (IPLUS (COND + (START (COND + ((NOT (AND (FIXP START) + (IGEQ START 0))) + (LISPERROR "ILLEGAL ARG" START))) + START) + (T ORGFILEPTR)) + (SUB1 BPATLEN))) (* ; + "STARTBYTEPOS is the address of the character corresponding to the last character of PATTERN.") + (SETQ EOF (\GETEOFPTR STREAM)) (* ; + "calculate the character address of the character after the last possible match.") + [SETQ ENDBYTEPOS (COND + ((NULL END) (* ; "Default is end of file") + EOF) + (T (IMIN (IPLUS (COND + ((ILESSP END 0) + (IPLUS EOF END 1)) + (T END)) + BPATLEN) + EOF] - (* ;; "use STARTOFFSET and ENDOFFSET instead of START and END because vm functions shouldn't change their arguments.") + (* ;; "use STARTBYTEPOS and ENDBYTEPOS instead of START and END because vm functions shouldn't change their arguments.") (COND - ((IGEQ STARTOFFSET ENDOFFSET) (* ; "nothing to search") + ((IGEQ STARTBYTEPOS ENDBYTEPOS) (* ; "nothing to search") (RETURN)) - ((ILESSP (IDIFFERENCE ENDOFFSET STARTOFFSET) - \MIN.SEARCH.LENGTH) (* ; - "too small to make FFILEPOS worthwhile") + ((ILESSP (IDIFFERENCE ENDBYTEPOS STARTBYTEPOS) + \MIN.SEARCH.LENGTH) (* ; + "too small to make FFILEPOS worthwhile") (GO TRYFILEPOS))) - (\SETFILEPTR STREAM STARTOFFSET) - [RETURN (GLOBALRESOURCE - (\FFDELTA1 \FFDELTA2 \FFPATCHAR) - (PROG ((CASE (fetch (ARRAYP BASE) - of (COND - [CASEARRAY (COND - ((AND (ARRAYP CASEARRAY) - (EQ (fetch (ARRAYP TYP) - of CASEARRAY) - \ST.BYTE)) - CASEARRAY) - (T (CASEARRAY CASEARRAY] - (T \TRANSPARENT)))) - (DELTA1 (fetch (ARRAYP BASE) of \FFDELTA1)) - (DELTA2 (fetch (ARRAYP BASE) of \FFDELTA2)) - (PATCHAR (fetch (ARRAYP BASE) of \FFPATCHAR)) - (MAXPATINDEX (SUB1 PATLEN)) - CHAR CURPATINDEX LASTCHAR INC) + (\SETFILEPTR STREAM STARTBYTEPOS) + [RETURN (GLOBALRESOURCE (\FFDELTA1 \FFDELTA2 \FFPATCHAR) + (PROG ((DELTA1 (fetch (ARRAYP BASE) of \FFDELTA1)) + (DELTA2 (fetch (ARRAYP BASE) of \FFDELTA2)) + (PATCHAR (fetch (ARRAYP BASE) of \FFPATCHAR)) + (MAXPATINDEX (SUB1 BPATLEN)) + CHAR CURPATINDEX LASTCHAR INC) - (* ;; "Use Boyer-Moore string search algorithm. Use two auxiliary tables, DELTA1 and DELTA2, to tell how far ahead to move in the file when a partial match fails. DELTA1 contains, for each character code, the distance of that character from the right end of the pattern, or PATLEN if the character does not occur in the pattern. DELTA2 contains, for each character position in the pattern, how far ahead to move such that the partial substring discovered to the right of the position now matches some other substring (to the left) in the pattern. PATCHAR is just PATTERN translated thru CASEARRAY") + (* ;; "Use Boyer-Moore string search algorithm. Use two auxiliary tables, DELTA1 and DELTA2, to tell how far ahead to move in the file when a partial match fails. DELTA1 contains, for each character code, the distance of that character from the right end of the pattern, or PATLEN if the character does not occur in the pattern. DELTA2 contains, for each character position in the pattern, how far ahead to move such that the partial substring discovered to the right of the position now matches some other substring (to the left) in the pattern. PATCHAR is just PATTERN translated thru CASEARRAY") - (\SETUP.FFILEPOS PATBASE PATOFFSET PATLEN PATCHAR DELTA1 DELTA2 CASE) - [COND - ((SMALLP ENDOFFSET) - (SETQ STARTSEG (SETQ ENDSEG 0))) - (T - (* ;; "The search will be in the large integers at least part of the time, so split the start and end fileptrs into hi and lo parts. The `segment' size we choose is smaller than 2^16 so that we are still smallp near the boundary. Note that STARTOFFSET and ENDOFFSET are never actually used as file ptrs, just for counting.") + (\SETUP.FFILEPOS BPATBASE BPATOFFSET BPATLEN PATCHAR DELTA1 DELTA2) + [COND + ((SMALLP ENDBYTEPOS) + (SETQ STARTSEG (SETQ ENDSEG 0))) + (T - (SETQ ENDSEG (FOLDLO ENDOFFSET FILEPOS.SEGMENT.SIZE)) - (SETQ BIGENDOFFSET (MOD ENDOFFSET FILEPOS.SEGMENT.SIZE)) - (SETQ STARTSEG (FOLDLO STARTOFFSET FILEPOS.SEGMENT.SIZE)) - (SETQ STARTOFFSET (MOD STARTOFFSET FILEPOS.SEGMENT.SIZE)) - (SETQ ENDOFFSET (COND - ((EQ STARTSEG ENDSEG) - BIGENDOFFSET) - (T + (* ;; "The search will be in the large integers at least part of the time, so split the start and end fileptrs into hi and lo parts. The `segment' size we choose is smaller than 2^16 so that we are still smallp near the boundary. Note that STARTBYTEPOS and ENDBYTEPOS are never actually used as file ptrs, just for counting.") - (* ;; "In different segments, so we'll have to search all the way to the end of this seg; hence, `end' is currently as big as it gets") + (SETQ ENDSEG (FOLDLO ENDBYTEPOS FILEPOS.SEGMENT.SIZE)) + (SETQ BIGENDOFFSET (MOD ENDBYTEPOS FILEPOS.SEGMENT.SIZE)) + (SETQ STARTSEG (FOLDLO STARTBYTEPOS FILEPOS.SEGMENT.SIZE)) + (SETQ STARTBYTEPOS (MOD STARTBYTEPOS FILEPOS.SEGMENT.SIZE)) + (SETQ ENDBYTEPOS (COND + ((EQ STARTSEG ENDSEG) + BIGENDOFFSET) + (T - FILEPOS.SEGMENT.SIZE] - (SETQ LASTCHAR (GETBASEBYTE PATCHAR MAXPATINDEX)) - FIRSTCHARLP - (COND - [(IGEQ STARTOFFSET ENDOFFSET) (* ; "End of this chunk") - (COND - ((EQ STARTSEG ENDSEG) (* ; "failed") - (GO FAILED)) - (T (* ; - "Finished this segment, roll over into new one") - (add STARTSEG 1) - (SETQ STARTOFFSET (IDIFFERENCE STARTOFFSET FILEPOS.SEGMENT.SIZE)) + (* ;; "In different segments, so we'll have to search all the way to the end of this seg; hence, `end' is currently as big as it gets") + + FILEPOS.SEGMENT.SIZE] + (SETQ LASTCHAR (GETBASEBYTE PATCHAR MAXPATINDEX)) + FIRSTCHARLP + (COND + [(IGEQ STARTBYTEPOS ENDBYTEPOS) + (* ; "End of this chunk") (COND - ((EQ STARTSEG ENDSEG) - (SETQ ENDOFFSET BIGENDOFFSET))) - (GO FIRSTCHARLP] - ((NEQ (SETQ CHAR (GETBASEBYTE CASE (\BIN STREAM))) - LASTCHAR) - (add STARTOFFSET (SETQ INC (GETBASEBYTE DELTA1 CHAR))) - (OR (EQ INC 1) - (\INCFILEPTR STREAM (SUB1 INC))) - (* ; - "advance file pointer accordingly (\BIN already advanced it one)") - (GO FIRSTCHARLP))) - (SETQ CURPATINDEX (SUB1 MAXPATINDEX)) - MATCHLP - (COND - ((ILESSP CURPATINDEX 0) - (GO FOUNDIT))) - (\DECFILEPTR STREAM 2) (* ; "back up to read previous char") - (COND - ((NEQ (SETQ CHAR (GETBASEBYTE CASE (\BIN STREAM))) - (GETBASEBYTE PATCHAR CURPATINDEX)) - (* ; - "Mismatch, advance by greater of delta1 and delta2") - (add STARTOFFSET (IDIFFERENCE (SETQ INC (IMAX (GETBASEBYTE DELTA1 - CHAR) - (GETBASEBYTE DELTA2 - CURPATINDEX))) - (IDIFFERENCE MAXPATINDEX CURPATINDEX))) - (OR (EQ INC 1) - (\INCFILEPTR STREAM (SUB1 INC))) - (GO FIRSTCHARLP))) - (SETQ CURPATINDEX (SUB1 CURPATINDEX)) - (GO MATCHLP) - FOUNDIT - (* ; - "set fileptr, adjust for beginning skips and return proper value.") - (\INCFILEPTR STREAM (COND - (TAIL (* ; "Put fileptr at end of string") - (SUB1 PATLEN)) - (T (* ; - "back up over the last char we looked at, i.e. the first char of string") - -1))) - (RETURN (\GETFILEPTR STREAM)) - FAILED - (* ; - "return the fileptr to its initial position.") - (\SETFILEPTR STREAM ORGFILEPTR) - (RETURN NIL] + ((EQ STARTSEG ENDSEG) (* ; "failed") + (GO FAILED)) + (T (* ; + "Finished this segment, roll over into new one") + (add STARTSEG 1) + (SETQ STARTBYTEPOS (IDIFFERENCE STARTBYTEPOS + FILEPOS.SEGMENT.SIZE)) + (COND + ((EQ STARTSEG ENDSEG) + (SETQ ENDBYTEPOS BIGENDOFFSET))) + (GO FIRSTCHARLP] + ((NEQ (SETQ CHAR (\BIN STREAM)) + LASTCHAR) + (add STARTBYTEPOS (SETQ INC (GETBASEBYTE DELTA1 CHAR))) + (OR (EQ INC 1) + (\INCFILEPTR STREAM (SUB1 INC))) + (* ; + "advance file pointer accordingly (\BIN already advanced it one)") + (GO FIRSTCHARLP))) + (SETQ CURPATINDEX (SUB1 MAXPATINDEX)) + MATCHLP + (COND + ((ILESSP CURPATINDEX 0) + (GO FOUNDIT))) + (\DECFILEPTR STREAM 2) (* ; "back up to read previous char") + (COND + ((NEQ (SETQ CHAR (\BIN STREAM)) + (GETBASEBYTE PATCHAR CURPATINDEX)) + (* ; + "Mismatch, advance by greater of delta1 and delta2") + (add STARTBYTEPOS (IDIFFERENCE (SETQ INC (IMAX (GETBASEBYTE DELTA1 + CHAR) + (GETBASEBYTE DELTA2 + CURPATINDEX) + )) + (IDIFFERENCE MAXPATINDEX CURPATINDEX))) + (OR (EQ INC 1) + (\INCFILEPTR STREAM (SUB1 INC))) + (GO FIRSTCHARLP))) + (SETQ CURPATINDEX (SUB1 CURPATINDEX)) + (GO MATCHLP) + FOUNDIT + + + (* ;; "Unlike FILEPOS, it appears that the file is now positioned just after the first byte of the match. See note there about charsets.") + + (RETURN (IF TAIL + THEN (CL:UNLESS (EQ NSCHARSETSHIFT (ffetch (STREAM CHARSET + ) + of STREAM)) + (freplace (STREAM CHARSET) of STREAM + with (\CHARSET (NTHCHARCODE PATTERN -1)))) + (\INCFILEPTR STREAM (SUB1 BPATLEN)) + (SETQ ENDBYTEPOS (\GETFILEPTR STREAM)) + (CL:IF (EQ TAIL 'BOTH) + (CONS (IDIFFERENCE ENDBYTEPOS BPATLEN) + ENDBYTEPOS) + ENDBYTEPOS) + ELSE + (* ;; + "Fileptr wants to be where the match started, 1 back from where the match ended") + + (\INCFILEPTR STREAM -1) + (SETQ STARTBYTEPOS (\GETFILEPTR STREAM)) + (CL:UNLESS (EQ NSCHARSETSHIFT (ffetch (STREAM CHARSET) + of STREAM)) + (freplace (STREAM CHARSET) of STREAM + with (\CHARSET (CHCON1 PATTERN))) + (\BACKCCODE STREAM) + (* ; "Should fix the charset") + (\SETFILEPTR STREAM STARTBYTEPOS)) + STARTBYTEPOS)) + FAILED + (\SETFILEPTR STREAM ORGFILEPTR) + (* ; + "return the fileptr to its initial position.") + (RETURN NIL] TRYFILEPOS (RETURN (FILEPOS PATTERN STREAM START END SKIP TAIL CASEARRAY]) (\SETUP.FFILEPOS -(LAMBDA (PATBASE PATOFFSET PATLEN PATCHAR DELTA1 DELTA2 CASE) (* jop%: "25-Sep-86 11:44") (* ;;; "Set up PATCHAR, DELTA1 and DELTA2 arrays from string. This is a separate function currently so I can gather stats on it") (PROG ((PATLEN,PATLEN (IPLUS (LLSH PATLEN BITSPERBYTE) PATLEN)) (MAXPATINDEX (SUB1 PATLEN)) CHAR) (for I from 0 to (FOLDLO \MAXCHAR BYTESPERWORD) do (PUTBASE DELTA1 I PATLEN,PATLEN)) (* ;; "DELTA1 initially all PATLEN, the default for chars not in the pattern. I assume array is word-aligned") (for I from 0 to MAXPATINDEX do (PUTBASEBYTE PATCHAR I (SETQ CHAR (GETBASEBYTE CASE (GETBASEBYTE PATBASE (IPLUS PATOFFSET I))))) (* ; "Translate STR now so we don't have to do it repeatedly") (PUTBASEBYTE DELTA1 CHAR (IDIFFERENCE MAXPATINDEX I)) (* ; "DELTA1 = how far ahead to move when we mismatch with this char")) (* ;; "Now set up DELTA2. Scan pattern backwards. For each character, we want to find the rightmost reoccurrence of the substring consisting of the chars to the right of the current char. This is slightly different than Boyer-Moore, in that we do not insist that it be the rightmost reoccurrence that is not preceded by the current char. Small difference, noticeable only in patterns that contain multiple occurrences of tails of the pattern. The following loop calculates DELTA2 in almost the obvious way, using the observation that DELTA2 is strictly increasing (by our definition) as the pattern index decreases. This algorithm is potentially quadratic, as it amounts to searching a string (PATTERN, backwards) for a given substring in the 'dumb' way; fortunately, it is rarely so in practice for 'normal' patterns") (for P from (SUB1 MAXPATINDEX) to 0 by -1 bind (LASTD2 _ 1) (LASTMATCHPOS _ MAXPATINDEX) do (PUTBASEBYTE DELTA2 P (SETQ LASTD2 (COND ((OR (IGEQ LASTD2 PATLEN) (EQ (GETBASEBYTE PATCHAR (IDIFFERENCE MAXPATINDEX LASTD2)) (GETBASEBYTE PATCHAR (ADD1 P)))) (* ;; "The last time around we matched a terminal substring somehow, and now the next char matches the char before that substring, so DELTA2 is just one more, i.e. the match continues. Once we've overflowed the pattern, the 'match' continues trivially") (ADD1 LASTD2)) (T (do (SETQ LASTMATCHPOS (SUB1 LASTMATCHPOS)) repeatuntil (for I from MAXPATINDEX to (ADD1 P) by -1 as J from LASTMATCHPOS to 0 by -1 always (EQ (GETBASEBYTE PATCHAR I) (GETBASEBYTE PATCHAR J)))) (* ; "Substring from P+1 onward matches substring that ends at LASTMATCHPOS") (IPLUS (IDIFFERENCE MAXPATINDEX LASTMATCHPOS) (IDIFFERENCE MAXPATINDEX P))))))))) -) + [LAMBDA (PATBASE PATOFFSET PATLEN PATCHAR DELTA1 DELTA2) + + (* ;; "Edited 24-Jun-2022 16:32 by rmk: Removing CASE argument. That forces the \SLOWFILEPOS, because the the alternative stream matches can't be anticipated.") + (* jop%: "25-Sep-86 11:44") + +(* ;;; "Set up PATCHAR, DELTA1 and DELTA2 arrays from string. This is a separate function currently so I can gather stats on it") + + (PROG ((PATLEN,PATLEN (IPLUS (LLSH PATLEN BITSPERBYTE) + PATLEN)) + (MAXPATINDEX (SUB1 PATLEN)) + CHAR) + (for I from 0 to (FOLDLO \MAXCHAR BYTESPERWORD) do (PUTBASE DELTA1 I PATLEN,PATLEN)) + + (* ;; "DELTA1 initially all PATLEN, the default for chars not in the pattern. I assume array is word-aligned") + + (for I from 0 to MAXPATINDEX do (SETQ CHAR (GETBASEBYTE PATBASE (IPLUS PATOFFSET I))) + (PUTBASEBYTE PATCHAR I CHAR) + (PUTBASEBYTE DELTA1 CHAR (IDIFFERENCE MAXPATINDEX I)) + (* ; + "DELTA1 = how far ahead to move when we mismatch with this char") + ) + + (* ;; "Now set up DELTA2. Scan pattern backwards. For each character, we want to find the rightmost reoccurrence of the substring consisting of the chars to the right of the current char. This is slightly different than Boyer-Moore, in that we do not insist that it be the rightmost reoccurrence that is not preceded by the current char. Small difference, noticeable only in patterns that contain multiple occurrences of tails of the pattern. The following loop calculates DELTA2 in almost the obvious way, using the observation that DELTA2 is strictly increasing (by our definition) as the pattern index decreases. This algorithm is potentially quadratic, as it amounts to searching a string (PATTERN, backwards) for a given substring in the 'dumb' way; fortunately, it is rarely so in practice for 'normal' patterns") + + (for P from (SUB1 MAXPATINDEX) to 0 by -1 bind (LASTD2 _ 1) + (LASTMATCHPOS _ MAXPATINDEX) + do (PUTBASEBYTE DELTA2 P + (SETQ LASTD2 + (COND + ([OR (IGEQ LASTD2 PATLEN) + (EQ (GETBASEBYTE PATCHAR (IDIFFERENCE MAXPATINDEX LASTD2)) + (GETBASEBYTE PATCHAR (ADD1 P] + + (* ;; "The last time around we matched a terminal substring somehow, and now the next char matches the char before that substring, so DELTA2 is just one more, i.e. the match continues. Once we've overflowed the pattern, the 'match' continues trivially") + + (ADD1 LASTD2)) + (T [do (SETQ LASTMATCHPOS (SUB1 LASTMATCHPOS)) + repeatuntil (for I from MAXPATINDEX to (ADD1 P) by -1 as J + from LASTMATCHPOS to 0 by -1 + always (EQ (GETBASEBYTE PATCHAR I) + (GETBASEBYTE PATCHAR J] + (* ; + "Substring from P+1 onward matches substring that ends at LASTMATCHPOS") + (IPLUS (IDIFFERENCE MAXPATINDEX LASTMATCHPOS) + (IDIFFERENCE MAXPATINDEX P]) + +(\SLOWFILEPOS + [LAMBDA (PATTERN STREAM STARTBYTEPOS ENDBYTEPOS SKIP TAIL CASEARRAY) + + (* ;; "Edited 10-Jul-2022 16:50 by rmk") + + (* ;; "Edited 1-Jul-2022 10:51 by rmk") + + (* ;; "Edited 29-Jun-2022 13:43 by rmk: The slow case when either SKIP or TAIL is specified. Those operate only on character codes, not on individual bytes of the external format, so the file has to be decoded with generic character functions.") + + (* ;; "CASEARRAY is assumed only to map ASCII, but that is independent of the logic here.") + + (PROG ((SKIPCODE (CL:WHEN SKIP (CHCON1 SKIP))) + PATBASE PATLEN PATFATP FIRSTINDEX LASTINDEX SKIPCODE PATFIRSTCODE NFIRSTCODEBYTES NPBYTES + CABASE CASIZE CAFAT STARTCHARSET (ORGCHARSET (ffetch (STREAM CHARSET) of STREAM))) + (DECLARE (SPECVARS NFIRSTCODEBYTES NPBYTES)) + (CL:WHEN (AND CASEARRAY (NEQ T CASEARRAY)) + (CL:UNLESS [AND (ARRAYP CASEARRAY) + (OR (EQ \ST.BYTE (ffetch (ARRAYP TYP) of CASEARRAY)) + (SETQ CAFAT (EQ \ST.POS16 (ffetch (ARRAYP TYP) of CASEARRAY] + (LISPERROR "ILLEGAL ARG" CASEARRAY)) + (SETQ CABASE (FETCH (ARRAYP BASE) OF CASEARRAY)) + (SETQ CASIZE (FETCH (ARRAYP LENGTH) OF CASEARRAY)) + (SETQ PATTERN (CONCAT PATTERN)) (* ; + "Map all STR characters thru the case array") + (FOR C INSTRING PATTERN AS I FROM 1 DO (RPLCHARCODE PATTERN I + (\CATRANSLATE CABASE CASIZE CAFAT C)))) + + (* ;; "") + + (* ;; "PATSTR now has case-mapped characters") + + [COND + ((LITATOM PATTERN) + (SETQ PATBASE (ffetch (LITATOM PNAMEBASE) of PATTERN)) + (SETQ PATLEN (ffetch (LITATOM PNAMELENGTH) of PATTERN)) + (SETQ FIRSTINDEX 1) + (SETQ PATFATP (ffetch (LITATOM FATPNAMEP) of PATTERN))) + (T (CL:UNLESS (STRINGP PATTERN) + (SETQ PATTERN (MKSTRING PATTERN))) + (SETQ PATBASE (ffetch (STRINGP BASE) of PATTERN)) + (SETQ PATLEN (ffetch (STRINGP LENGTH) of PATTERN)) + (SETQ FIRSTINDEX (ffetch (STRINGP OFFST) of PATTERN)) + (SETQ PATFATP (ffetch (STRINGP FATSTRINGP) of PATTERN] + (SETQ LASTINDEX (IPLUS FIRSTINDEX (SUB1 PATLEN))) + (SETQ PATFIRSTCODE (\GETBASECHAR PATFATP PATBASE FIRSTINDEX)) + (ADD FIRSTINDEX 1) (* ; + "Start at the second character after the first one matched. ") + + (* ;; "") + + (* ;; "A loop of nomatch-match sequences") + + (* ;; + "EOFGUARD saves a little testing, assumes no character in any encoding takes more than 10 bytes.") + + (BIND STREAMCODE NBYTESHI NBYTESLO SECONDCHARSET (NBYTES _ (IDIFFERENCE ENDBYTEPOS + STARTBYTEPOS)) + FIRST (SETQ NBYTESHI (FOLDLO NBYTES FILEPOS.SEGMENT.SIZE)) + (SETQ NBYTESLO (IMOD NBYTES FILEPOS.SEGMENT.SIZE)) + DO (DO + (* ;; "Find next FIRSTCHAR") + + (CL:WHEN (ILEQ NBYTESLO 0) (* ; "Finished this segment ") + (CL:WHEN (EQ NBYTESHI 0) + (GO FAILED)) (* ; "Roll over to a new segment") + (add NBYTESLO FILEPOS.SEGMENT.SIZE) + (add NBYTESHI -1)) + + (* ;; "Guard \INCCODE against EOF, only when we are getting close") + + (CL:WHEN (AND (EQ NBYTESHI 0) + (ILEQ NBYTESLO 10) + (NULL (\PEEKCCODE STREAM T))) + (GO FAILED)) + (SETQ STARTCHARSET (ffetch (STREAM CHARSET) of STREAM)) + (SETQ STREAMCODE (\INCCODE.EOLC STREAM NIL 'NFIRSTCODEBYTES 0)) + (ADD NBYTESLO NFIRSTCODEBYTES) (* ; + "Decrement the character's byte count") + (CL:WHEN (EQ PATFIRSTCODE SKIPCODE) (* ; "Pattern starts with skip") + (RETURN)) + (CL:WHEN CABASE + (SETQ STREAMCODE (\CATRANSLATE CABASE CASIZE CAFAT STREAMCODE))) + REPEATUNTIL (EQ STREAMCODE PATFIRSTCODE)) + (SETQ SECONDCHARSET (ffetch (STREAM CHARSET) of STREAM)) + + (* ;; "") + + (* ;; "Found PATFIRSTCODE, match the rest") + + (* ;; + "The matching loop must fail at EOF, otherwise either match or return to firstchar loop.") + + (* ;; + "The EOF guard is \PEEKCCODE (no error), we only want to bother when we might be getting close.") + + (SETQ NPBYTES 0) + (FOR I PATCODE (EOFGUARD _ (AND (EQ NBYTESHI 0) + (ILEQ NBYTESLO 10))) FROM FIRSTINDEX TO LASTINDEX + DO (CL:WHEN (AND EOFGUARD (NULL (\PEEKCCODE STREAM T))) + (GO FAILED)) + (SETQ PATCODE (\GETBASECHAR PATFATP PATBASE I)) + (SETQ STREAMCODE (\INCCODE.EOLC STREAM NIL 'NPBYTES NPBYTES)) + (CL:UNLESS (EQ PATCODE SKIPCODE) + (CL:WHEN CABASE + (SETQ STREAMCODE (\CATRANSLATE CABASE CASIZE CAFAT STREAMCODE))) + (CL:UNLESS (EQ STREAMCODE PATCODE) + + (* ;; "Match failed: Go back to second position and try again") + + (\INCFILEPTR STREAM NPBYTES) + (freplace (STREAM CHARSET) of STREAM with SECONDCHARSET) + (RETURN))) FINALLY (GO FOUNDIT))) + FOUNDIT + + + (* ;; "The CHARSET should be accurate in the tail case. We have to adjust for the start case.") + + (RETURN (SELECTQ TAIL + (NIL (* ; + "Fileptr wants to be where the match started") + (freplace (STREAM CHARSET) of STREAM with STARTCHARSET) + (\INCFILEPTR STREAM (IPLUS NPBYTES NFIRSTCODEBYTES)) + (\GETFILEPTR STREAM)) + (BOTH (CONS (IPLUS (\GETFILEPTR STREAM) + NPBYTES NFIRSTCODEBYTES) + (\GETFILEPTR STREAM))) + (\GETFILEPTR STREAM))) + FAILED + (freplace (STREAM CHARSET) of STREAM with ORGCHARSET) + (RETURN NIL]) ) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE @@ -1321,7 +1492,7 @@ DONTCOPY ) (DEFOPTIMIZER DATEFORMAT (&REST X) - (KWOTE (CONS 'DATEFORMAT X))) + (KWOTE (CONS 'DATEFORMAT X))) @@ -1383,15 +1554,15 @@ DONTCOPY (PUTPROPS IOCHAR COPYRIGHT ("Venue & Xerox Corporation" 1981 1982 1983 1984 1985 1986 1987 1988 1990 1991 2018 2020)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3484 7278 (CHCON 3494 . 4344) (UNPACK 4346 . 5240) (DCHCON 5242 . 6509) (DUNPACK 6511 - . 7276)) (7279 18794 (UALPHORDER 7289 . 7385) (ALPHORDER 7387 . 9190) (CONCAT 9192 . 9837) ( -CONCATCODES 9839 . 10025) (PACKC 10027 . 12630) (PACK 12632 . 13211) (PACK* 13213 . 14935) (\PACK.ITEM - 14937 . 15392) (STRPOS 15394 . 18792)) (18796 19085 (XCL:PACK 18796 . 19085)) (19087 19337 (XCL:PACK* - 19087 . 19337)) (20055 22446 (STRPOSL 20065 . 21691) (MAKEBITTABLE 21693 . 22444)) (22608 23085 ( -CASEARRAY 22618 . 22808) (UPPERCASEARRAY 22810 . 23083)) (23407 47009 (FILEPOS 23417 . 33329) ( -FFILEPOS 33331 . 44444) (\SETUP.FFILEPOS 44446 . 47007)) (47797 89044 (DATE 47807 . 47893) (DATEFORMAT - 47895 . 47987) (GDATE 47989 . 48100) (IDATE 48102 . 59773) (\IDATESCANTOKEN 59775 . 61054) ( -\IDATE-PARSE-MONTH 61056 . 64752) (\OUTDATE 64754 . 77502) (\OUTDATE-STRING 77504 . 78119) (\RPLRIGHT -78121 . 78359) (\UNPACKDATE 78361 . 84152) (\PACKDATE 84154 . 87474) (\DTSCAN 87476 . 87618) (\ISDST? -87620 . 88127) (\CHECKDSTCHANGE 88129 . 89042))))) + (FILEMAP (NIL (3524 7318 (CHCON 3534 . 4384) (UNPACK 4386 . 5280) (DCHCON 5282 . 6549) (DUNPACK 6551 + . 7316)) (7319 18834 (UALPHORDER 7329 . 7425) (ALPHORDER 7427 . 9230) (CONCAT 9232 . 9877) ( +CONCATCODES 9879 . 10065) (PACKC 10067 . 12670) (PACK 12672 . 13251) (PACK* 13253 . 14975) (\PACK.ITEM + 14977 . 15432) (STRPOS 15434 . 18832)) (18836 19125 (XCL:PACK 18836 . 19125)) (19127 19377 (XCL:PACK* + 19127 . 19377)) (20015 22406 (STRPOSL 20025 . 21651) (MAKEBITTABLE 21653 . 22404)) (22568 23045 ( +CASEARRAY 22578 . 22768) (UPPERCASEARRAY 22770 . 23043)) (23367 55842 (FILEPOS 23377 . 32618) ( +FFILEPOS 32620 . 44841) (\SETUP.FFILEPOS 44843 . 48626) (\SLOWFILEPOS 48628 . 55840)) (56630 97877 ( +DATE 56640 . 56726) (DATEFORMAT 56728 . 56820) (GDATE 56822 . 56933) (IDATE 56935 . 68606) ( +\IDATESCANTOKEN 68608 . 69887) (\IDATE-PARSE-MONTH 69889 . 73585) (\OUTDATE 73587 . 86335) ( +\OUTDATE-STRING 86337 . 86952) (\RPLRIGHT 86954 . 87192) (\UNPACKDATE 87194 . 92985) (\PACKDATE 92987 + . 96307) (\DTSCAN 96309 . 96451) (\ISDST? 96453 . 96960) (\CHECKDSTCHANGE 96962 . 97875))))) STOP diff --git a/sources/IOCHAR.LCOM b/sources/IOCHAR.LCOM index 0d56c916..ff544997 100644 Binary files a/sources/IOCHAR.LCOM and b/sources/IOCHAR.LCOM differ diff --git a/sources/MAIKOLOADUPFNS b/sources/MAIKOLOADUPFNS index 5cd692de..0a36eb9d 100644 --- a/sources/MAIKOLOADUPFNS +++ b/sources/MAIKOLOADUPFNS @@ -1,14 +1,15 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "26-Oct-2021 09:55:14" {DSK}larry>medley>sources>MAIKOLOADUPFNS.;2 5969 +(FILECREATED "16-Jul-2022 22:45:28" {DSK}larry>medley>sources>MAIKOLOADUPFNS.;2 5827 - changes to%: (FNS \BITBLTSUB \BLTCHAR) + :CHANGES-TO (VARS MAIKOLOADUPFNSCOMS) + (FNS CL::%%COPY-TIME-STATS CHECKPAGEMAP CLOCK CLOCK0 DAYTIME SETTIME) - previous date%: " 2-Mar-2021 23:12:27" {DSK}larry>medley>sources>MAIKOLOADUPFNS.;1) + :PREVIOUS-DATE "26-Oct-2021 09:55:14" {DSK}larry>medley>sources>MAIKOLOADUPFNS.;1) (* ; " -Copyright (c) 1989, 2018, 2021 by ENVOS Corporation. +Copyright (c) 1989, 2018, 2021-2022 by ENVOS Corporation. ") (PRETTYCOMPRINT MAIKOLOADUPFNSCOMS) @@ -20,39 +21,36 @@ Copyright (c) 1989, 2018, 2021 by ENVOS Corporation. \CHECKSUM \CLOCK0 \COUNTREALPAGES \DAYTIME0 \DIRTYBACKGROUND \DOLOCKPAGES \DONEWPAGE \DORECLAIM \DOTEMPLOCKPAGES \LOADVMEMPAGE \LOCKEDPAGEP \LOCKPAGES \MOVEVMEMFILEPAGE \NEWPAGE \PAGEFAULT \SHOWPAGETABLE \TEMPUNLOCKPAGES \UNLOCKPAGES \WRITEDIRTYPAGE) - (GLOBALVARS \TimeZoneComp \RAWTRACING \MAXWATCHERGETS) - (DECLARE%: EVAL@COMPILE DONTCOPY (LOCALVARS . T) - (FILES (SOURCE) - TEDITDCL)))) + (GLOBALVARS \TimeZoneComp))) (PUTPROPS MAIKOLOADUPFNS FILETYPE CL:COMPILE-FILE) -(PUTPROPS MAIKOLOADUPFNS MAKEFILE-ENVIRONMENT (:PACKAGE "INTERLISP" :READTABLE "INTERLISP" - :BASE 10)) +(PUTPROPS MAIKOLOADUPFNS MAKEFILE-ENVIRONMENT (:PACKAGE "INTERLISP" :READTABLE "INTERLISP" :BASE 10)) (DEFINEQ (CL::%%COPY-TIME-STATS - [LAMBDA (REFERENCE-BLOCK DESTINIATION-BLOCK) (* ; "Edited 2-May-88 17:16 by MASINTER") + [LAMBDA (REFERENCE-BLOCK DESTINIATION-BLOCK) (* ; "Edited 2-May-88 17:16 by MASINTER") (SUBRCALL COPYTIMESTATS REFERENCE-BLOCK DESTINIATION-BLOCK]) (CHECKPAGEMAP - [LAMBDA NIL (* ; "Edited 25-Feb-2021 10:07 by larry") + [LAMBDA NIL (* ; "Edited 25-Feb-2021 10:07 by larry") NIL]) (CLOCK - [LAMBDA (N BOX) (* ; "Edited 2-May-88 16:11 by MASINTER") + [LAMBDA (N BOX) (* ; "Edited 2-May-88 16:11 by MASINTER") (SUBRCALL GETUNIXTIME N BOX]) (CLOCK0 - [LAMBDA (BOX) (* ; "Edited 2-May-88 16:19 by MASINTER") + [LAMBDA (BOX) (* ; "Edited 2-May-88 16:19 by MASINTER") (SUBRCALL GETUNIXTIME 0 BOX]) (DAYTIME - [LAMBDA (BOX) (* ; "Edited 2-May-88 16:20 by MASINTER") + [LAMBDA (BOX) (* ; "Edited 2-May-88 16:20 by MASINTER") (SUBRCALL GETUNIXTIME 5 BOX]) (SETTIME - [LAMBDA (RETFLG) (* ; "Edited 13-May-88 15:22 by MASINTER") + [LAMBDA (RETFLG) (* ; "Edited 16-Jul-2022 22:44 by larry") + (* ; "Edited 13-May-88 15:22 by lmm") (CL:UNLESS (AND RETFLG (NOT (STRINGP RETFLG))) (SETQ \TimeZoneComp (SUBRCALL GETUNIXTIME 8 NIL))) (\PROCESS.RESET.TIMERS) @@ -149,26 +147,16 @@ Copyright (c) 1989, 2018, 2021 by ENVOS Corporation. ) (DECLARE%: DOEVAL@COMPILE DONTCOPY -(GLOBALVARS \TimeZoneComp \RAWTRACING \MAXWATCHERGETS) +(GLOBALVARS \TimeZoneComp) ) -(DECLARE%: EVAL@COMPILE DONTCOPY -(DECLARE%: DOEVAL@COMPILE DONTCOPY - -(LOCALVARS . T) -) - - -(FILESLOAD (SOURCE) - TEDITDCL) -) -(PUTPROPS MAIKOLOADUPFNS COPYRIGHT ("ENVOS Corporation" 1989 2018 2021)) +(PUTPROPS MAIKOLOADUPFNS COPYRIGHT ("ENVOS Corporation" 1989 2018 2021 2022)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1335 5651 (CL::%%COPY-TIME-STATS 1345 . 1541) (CHECKPAGEMAP 1543 . 1675) (CLOCK 1677 . -1826) (CLOCK0 1828 . 1978) (DAYTIME 1980 . 2131) (SETTIME 2133 . 2407) (\BITBLTSUB 2409 . 2831) ( -\BLTCHAR 2833 . 3014) (\CHECKSUM 3016 . 3181) (\CLOCK0 3183 . 3334) (\COUNTREALPAGES 3336 . 3469) ( -\DAYTIME0 3471 . 3624) (\DIRTYBACKGROUND 3626 . 3762) (\DOLOCKPAGES 3764 . 3896) (\DONEWPAGE 3898 . -4047) (\DORECLAIM 4049 . 4195) (\DOTEMPLOCKPAGES 4197 . 4333) (\LOADVMEMPAGE 4335 . 4468) ( -\LOCKEDPAGEP 4470 . 4586) (\LOCKPAGES 4588 . 4718) (\MOVEVMEMFILEPAGE 4720 . 4841) (\NEWPAGE 4843 . -4990) (\PAGEFAULT 4992 . 5104) (\SHOWPAGETABLE 5106 . 5240) (\TEMPUNLOCKPAGES 5242 . 5378) ( -\UNLOCKPAGES 5380 . 5512) (\WRITEDIRTYPAGE 5514 . 5649))))) + (FILEMAP (NIL (1214 5661 (CL::%%COPY-TIME-STATS 1224 . 1424) (CHECKPAGEMAP 1426 . 1562) (CLOCK 1564 . +1717) (CLOCK0 1719 . 1873) (DAYTIME 1875 . 2030) (SETTIME 2032 . 2417) (\BITBLTSUB 2419 . 2841) ( +\BLTCHAR 2843 . 3024) (\CHECKSUM 3026 . 3191) (\CLOCK0 3193 . 3344) (\COUNTREALPAGES 3346 . 3479) ( +\DAYTIME0 3481 . 3634) (\DIRTYBACKGROUND 3636 . 3772) (\DOLOCKPAGES 3774 . 3906) (\DONEWPAGE 3908 . +4057) (\DORECLAIM 4059 . 4205) (\DOTEMPLOCKPAGES 4207 . 4343) (\LOADVMEMPAGE 4345 . 4478) ( +\LOCKEDPAGEP 4480 . 4596) (\LOCKPAGES 4598 . 4728) (\MOVEVMEMFILEPAGE 4730 . 4851) (\NEWPAGE 4853 . +5000) (\PAGEFAULT 5002 . 5114) (\SHOWPAGETABLE 5116 . 5250) (\TEMPUNLOCKPAGES 5252 . 5388) ( +\UNLOCKPAGES 5390 . 5522) (\WRITEDIRTYPAGE 5524 . 5659))))) STOP diff --git a/sources/MAIKOLOADUPFNS.LCOM b/sources/MAIKOLOADUPFNS.LCOM index f81b8f2f..bc2912be 100644 Binary files a/sources/MAIKOLOADUPFNS.LCOM and b/sources/MAIKOLOADUPFNS.LCOM differ