DIRECTORY Booting USING [RegisterProcs, RollbackProc], Buttons USING [ButtonProc], InputFocus USING [GetInputFocus, SetInputFocus], Menus USING [ClickProc, MouseButton], MessageWindow USING [Append, Blink, Clear], Process USING [Detach], Rope USING [Concat, ROPE], TEditDocument USING [Selection, SpinAndLock, TEditDocumentData, Unlock], TEditDocumentPrivate USING [AnonymousLoadFile, AnonymousLoadImplFile, CloseAndNewViewer, CloseAndOpenPreviousFile, DoCloseAndOpenFile, DoCloseAndOpenImplFile, DoLoadFile, DoLoadImplFile, DoOpenFile, DoOpenImplFile, DoStoreFile, EmptyViewer, FileIsMoreRecent, LoadPreviousFile, NewViewer, OpenPreviousFile, PositionHistory, PositionViewer, PreLoadPrevious], TEditInput USING [CheckSelection, CloseEvent, CommandProc, InterpretAtom, Register], TEditScrolling USING [AutoScroll], TEditSelection USING [MakeSelection], TextNode USING [Location, LocNumber, LocWithin], ViewerClasses USING [Viewer], ViewerForkers USING [CallBack, ForkCall], ViewerGroupLocks USING [CallRootAndLinksUnderWriteLock], ViewerOps USING [AddProp, EnumerateViewers, EnumProc, FetchProp, PaintViewer, RestoreViewer, SaveViewer], ViewerTools USING [GetSelectionContents]; TEditDocuments3Impl: CEDAR PROGRAM IMPORTS Booting, InputFocus, MessageWindow, Process, Rope, TEditDocument, TEditDocumentPrivate, TEditInput, TEditScrolling, TEditSelection, TextNode, ViewerForkers, ViewerGroupLocks, ViewerOps, ViewerTools EXPORTS TEditDocumentPrivate = BEGIN OPEN TEditDocumentPrivate; ROPE: TYPE ~ Rope.ROPE; Viewer: TYPE ~ ViewerClasses.Viewer; Do: PROC [viewer: REF ANY, atom: ATOM] = INLINE --gfi saver-- { TEditInput.InterpretAtom[NARROW[viewer], atom]; }; Register: PROC [atom: ATOM, op: TEditInput.CommandProc] = INLINE --gfi saver-- { TEditInput.Register[atom, op]; }; ForkViewerOp2: PROC [proc: PROC [parent: Viewer, fileName: ROPE _ NIL], parent: Viewer] RETURNS [BOOL] = { TEditInput.CloseEvent[]; ViewerForkers.ForkCall[parent, StackBase, NEW[Data2 _ [proc, parent, ViewerTools.GetSelectionContents[]]]]; RETURN [FALSE] }; ForkViewerOp: PROC [proc: PROC [parent: Viewer], parent: Viewer] RETURNS [BOOL _ FALSE] = { TEditInput.CloseEvent[]; ViewerForkers.ForkCall[parent, StackBase, NEW[Data1 _ [proc, parent]]]; }; Data1: TYPE = RECORD [ proc: PROC [parent: Viewer], viewer: Viewer ]; Data2: TYPE = RECORD [ proc: PROC [parent: Viewer, fileName: ROPE], viewer: Viewer, fileName: ROPE ]; StackBase: ViewerForkers.CallBack = { WITH data SELECT FROM data1: REF Data1 => { data1.proc[data1.viewer ! ABORTED => CONTINUE]; }; data2: REF Data2 => { data2.proc[data2.viewer, data2.fileName ! ABORTED => CONTINUE]; }; ENDCASE; }; CheckFilesAfterRollback: Booting.RollbackProc = { Check: ViewerOps.EnumProc = { WITH v.data SELECT FROM tdd: TEditDocument.TEditDocumentData => { IF FileIsMoreRecent[tdd.text, v.file] THEN { MessageWindow.Append[Rope.Concat["Loading newer version of ", v.file], TRUE]; ViewerOps.RestoreViewer[v]; -- reload the file }; }; ENDCASE; RETURN [TRUE] --continue enumeration-- }; ViewerOps.EnumerateViewers[Check]; -- Check each top level viewer }; SelectMouse: PROC [mouseButton: Menus.MouseButton, redOp, yellowOp, blueOp: ATOM] RETURNS [ATOM] = INLINE --gfi saver-- { RETURN [SELECT mouseButton FROM red => redOp, yellow => yellowOp, blue => blueOp, ENDCASE => ERROR]; }; PreReset: PUBLIC Menus.ClickProc = { WITH parent SELECT FROM viewer: Viewer => MessageWindow.Append[ IF viewer.file = NIL THEN "Confirm clearing viewer" ELSE Rope.Concat["Confirm reloading of ", viewer.file], TRUE]; ENDCASE; }; Reset: PUBLIC Menus.ClickProc = { MessageWindow.Clear[]; Do[parent, SelectMouse[mouseButton, $RedReset, $YellowReset, $BlueReset]]; }; ResetOp: TEditInput.CommandProc = { inner: PROC = { FOR v: Viewer _ viewer, v.link UNTIL v = NIL DO WITH v.data SELECT FROM tdd: TEditDocument.TEditDocumentData => { [] _ TEditDocument.SpinAndLock[tdd, "Reset"]; ViewerOps.AddProp[v, $ResetLoc, NEW[INT _ TextNode.LocNumber[tdd.lineTable.lines[0].pos]]]; v.newVersion _ TRUE; -- to force the init proc to reread the file TEditDocument.Unlock[tdd]; }; ENDCASE; IF v.link=viewer THEN EXIT; ENDLOOP; FOR v: Viewer _ viewer, v.link UNTIL v = NIL DO WITH v.data SELECT FROM tdd: TEditDocument.TEditDocumentData => { IF InputFocus.GetInputFocus[].owner=v THEN InputFocus.SetInputFocus[]; WITH ViewerOps.FetchProp[v, $ResetLoc] SELECT FROM locRef: REF INT => { v.class.init[v]; v.newVersion _ v.newFile _ FALSE; [] _ TEditDocument.SpinAndLock[tdd, "Reset"]; IF ~PositionViewer[v, TextNode.LocWithin[tdd.text, locRef^], all] THEN ViewerOps.PaintViewer[v, all]; TEditDocument.Unlock[tdd]; }; ENDCASE; }; ENDCASE; IF v.link=viewer THEN EXIT; ENDLOOP; }; ViewerGroupLocks.CallRootAndLinksUnderWriteLock[inner, viewer]; }; Save: PUBLIC Menus.ClickProc = { MessageWindow.Clear[]; Do[parent, SelectMouse[mouseButton, $RedSave, $YellowSave, $BlueSave]]; }; SaveOp: TEditInput.CommandProc = { TEditInput.CloseEvent[]; IF NOT viewer.saveInProgress AND (viewer.newFile OR viewer.newVersion) THEN TRUSTED { [] _ Process.Detach[FORK ViewerOps.SaveViewer[viewer]]; }; RETURN [FALSE]; }; PreClear: PUBLIC Menus.ClickProc = { MessageWindow.Append[clearFirst: TRUE, message: "Click LEFT to empty this viewer, MIDDLE to make new viewer, RIGHT for close & new"]; }; Clear: PUBLIC Menus.ClickProc = { Do[parent, SelectMouse[mouseButton, $Empty, $New, $CloseAndNew]]; }; EmptyOp: TEditInput.CommandProc = { EmptyViewer[viewer]; RETURN [FALSE] }; NewOp: TEditInput.CommandProc = { NewViewer[viewer]; RETURN [FALSE] }; NewButton: PUBLIC Buttons.ButtonProc = { NewViewer[NIL] }; CloseAndNewOp: TEditInput.CommandProc = { CloseAndNewViewer[viewer]; RETURN [FALSE] }; Store: PUBLIC Menus.ClickProc = { MessageWindow.Clear[]; Do[parent, SelectMouse[mouseButton, $RedStore, $YellowStore, $BlueStore]]; }; StoreOp: TEditInput.CommandProc = { RETURN [ForkViewerOp2[DoStoreFile, viewer]] }; PreviousFile: PUBLIC Menus.ClickProc = { PreLoadPrevious[parent]; Do[parent, SelectMouse[mouseButton, $LoadPrevious, $OpenPrevious, $CloseAndOpenPrevious]]; }; LoadPreviousOp: TEditInput.CommandProc = { RETURN [ForkViewerOp[LoadPreviousFile, viewer]]; }; OpenPreviousOp: TEditInput.CommandProc = { RETURN [ForkViewerOp[OpenPreviousFile, viewer]]; }; CloseAndOpenPreviousOp: TEditInput.CommandProc = { RETURN [ForkViewerOp[CloseAndOpenPreviousFile, viewer]]; }; AnonymousLoadImpl: PUBLIC Menus.ClickProc = { Do[parent, $AnonymousLoadImpl]; }; AnonymousLoadImplOp: TEditInput.CommandProc = { RETURN [ForkViewerOp[AnonymousLoadImplFile, viewer]]; }; AnonymousLoad: PUBLIC Menus.ClickProc = { Do[parent, $AnonymousLoad]; }; AnonymousLoadOp: TEditInput.CommandProc = { RETURN [ForkViewerOp[AnonymousLoadIt, viewer]]; }; AnonymousLoadIt: PROC [parent: Viewer] = { AnonymousLoadFile[parent]; }; PreGet, PreGetImpl: PUBLIC Menus.ClickProc = { viewer: Viewer = NARROW[parent]; MessageWindow.Append["Click LEFT to load in this viewer, MIDDLE for new viewer, RIGHT for close & new", TRUE]; }; Get: PUBLIC Menus.ClickProc = { Do[parent, SelectMouse[mouseButton, $Load, $Open, $CloseAndOpen]]; }; LoadOp: TEditInput.CommandProc = { RETURN [ForkViewerOp2[LoadIt, viewer]] }; LoadIt: PROC [parent: Viewer, fileName: ROPE _ NIL] = { [] _ DoLoadFile[parent, fileName, FALSE]; }; OpenOp: TEditInput.CommandProc = { RETURN [ForkViewerOp2[OpenIt, viewer]]; }; OpenIt: PROC [parent: Viewer, fileName: ROPE _ NIL] = { [] _ DoOpenFile[fileName: fileName, column: IF parent # NIL THEN parent.column ELSE left, parent: parent]; }; CloseAndOpenOp: TEditInput.CommandProc = { RETURN [ForkViewerOp2[CloseAndOpenIt, viewer]]; }; CloseAndOpenIt: PROC [parent: Viewer, fileName: ROPE _ NIL] = { [] _ DoCloseAndOpenFile[parent, fileName]; }; GetImpl: PUBLIC Menus.ClickProc = { Do[parent, SelectMouse[mouseButton, $LoadImpl, $OpenImpl, $CloseAndOpenImpl]]; }; LoadImplOp: TEditInput.CommandProc = { RETURN [ForkViewerOp2[LoadItImpl, viewer]]; }; LoadItImpl: PROC [parent: Viewer, fileName: ROPE _ NIL] = { [] _ DoLoadImplFile[parent, fileName, FALSE]; }; OpenImplOp: TEditInput.CommandProc = { RETURN [ForkViewerOp2[OpenItImpl, viewer]]; }; OpenItImpl: PROC [parent: Viewer, fileName: ROPE _ NIL] = { [] _ DoOpenImplFile[fileName: fileName, column: IF parent # NIL THEN parent.column ELSE left, parent: parent]; }; CloseAndOpenImplOp: TEditInput.CommandProc = { RETURN [ForkViewerOp2[CloseAndOpenItImpl, viewer]]; }; CloseAndOpenItImpl: PROC [parent: Viewer, fileName: ROPE _ NIL] = { [] _ DoCloseAndOpenImplFile[parent, fileName]; }; OpenButton: PUBLIC Buttons.ButtonProc = { [] _ ForkViewerOp2[OpenIt, NIL]; }; Normalize: PUBLIC Menus.ClickProc = { Do[parent, SelectMouse[mouseButton, $NormalizeToStart, $NormalizeToCaret, $NormalizeToEnd]]; }; Position: PUBLIC Menus.ClickProc = {Do[parent, IF shift THEN $PositionIncludingComments ELSE $Position]; }; JumpToPrevious: PUBLIC Menus.ClickProc = {Do[parent, $PrevPlace]}; PrevPlaceOp: TEditInput.CommandProc = { tdd: TEditDocument.TEditDocumentData _ NARROW[viewer.data]; prop: REF PositionHistory _ NARROW[ViewerOps.FetchProp[viewer, $PositionHistory]]; IF tdd # NIL AND prop # NIL THEN { loc: TextNode.Location _ prop.pos; IF loc = tdd.lineTable.lines[0].pos THEN loc _ prop.prev; IF PositionViewer[viewer, loc] THEN RETURN; IF loc # prop.prev AND PositionViewer[viewer, prop.prev] THEN RETURN }; MessageWindow.Append["No previous place saved.", TRUE]; MessageWindow.Blink[]; RETURN [FALSE]; }; Reselect: PUBLIC Menus.ClickProc = {Do[parent, $Reselect]}; ReselectOp: TEditInput.CommandProc = { tdd: TEditDocument.TEditDocumentData _ NARROW[viewer.data]; prop: TEditDocument.Selection _ NARROW[ViewerOps.FetchProp[viewer, $SelectionHistory]]; IF tdd # NIL AND prop # NIL AND TEditInput.CheckSelection[prop] THEN { TEditSelection.MakeSelection[selection: primary, new: prop]; TEditScrolling.AutoScroll[viewer, FALSE] } ELSE { MessageWindow.Append["No saved selection.", TRUE]; MessageWindow.Blink[] }; RETURN [FALSE]; }; Find: PUBLIC Menus.ClickProc = { Do[parent, SELECT mouseButton FROM red => IF shift THEN $FindNextCaseless ELSE $FindNext, yellow => IF shift THEN $FindAnyCaseless ELSE $FindAny, blue => IF shift THEN $FindPrevCaseless ELSE $FindPrev, ENDCASE => ERROR]; }; FindDef: PUBLIC Menus.ClickProc = { Do[parent, SELECT mouseButton FROM red => IF shift THEN $FindNextDefCaseless ELSE $FindNextDef, yellow => IF shift THEN $FindAnyDefCaseless ELSE $FindAnyDef, blue => IF shift THEN $FindPrevDefCaseless ELSE $FindPrevDef, ENDCASE => ERROR]; }; FindWord: PUBLIC Menus.ClickProc = { Do[parent, SELECT mouseButton FROM red => IF shift THEN $FindNextWordCaseless ELSE $FindNextWord, yellow => IF shift THEN $FindAnyWordCaseless ELSE $FindAnyWord, blue => IF shift THEN $FindPrevWordCaseless ELSE $FindPrevWord, ENDCASE => ERROR]; }; FewerLevels: PUBLIC Menus.ClickProc = {Do[parent, $FewerLevels]}; MoreLevels: PUBLIC Menus.ClickProc = {Do[parent, $MoreLevels]}; AllLevels: PUBLIC Menus.ClickProc = {Do[parent, $AllLevels]}; FirstLevelOnly: PUBLIC Menus.ClickProc = {Do[parent, $FirstLevelOnly]}; FewerLines: PUBLIC Menus.ClickProc = {Do[parent, $FewerLines]}; MoreLines: PUBLIC Menus.ClickProc = {Do[parent, $MoreLines]}; AllLines: PUBLIC Menus.ClickProc = {Do[parent, $AllLines]}; FirstLineOnly: PUBLIC Menus.ClickProc = {Do[parent, $FirstLineOnly]}; Time: PUBLIC Menus.ClickProc = {Do[parent, $Time]}; Split: PUBLIC Menus.ClickProc = {Do[parent, SelectMouse[mouseButton, $RedSplit, $YellowSplit, $BlueSplit]]; }; Booting.RegisterProcs[r: CheckFilesAfterRollback]; Register[$RedReset, ResetOp]; Register[$YellowReset, ResetOp]; Register[$BlueReset, ResetOp]; Register[$RedSave, SaveOp]; Register[$YellowSave, SaveOp]; Register[$BlueSave, SaveOp]; Register[$Empty, EmptyOp]; Register[$New, NewOp]; Register[$CloseAndNew, CloseAndNewOp]; Register[$RedStore, StoreOp]; Register[$YellowStore, StoreOp]; Register[$BlueStore, StoreOp]; Register[$LoadPrevious, LoadPreviousOp]; Register[$OpenPrevious, OpenPreviousOp]; Register[$CloseAndOpenPrevious, CloseAndOpenPreviousOp]; Register[$AnonymousLoadImpl, AnonymousLoadImplOp]; Register[$AnonymousLoad, AnonymousLoadOp]; Register[$Load, LoadOp]; Register[$Open, OpenOp]; Register[$CloseAndOpen, CloseAndOpenOp]; Register[$LoadImpl, LoadImplOp]; Register[$OpenImpl, OpenImplOp]; Register[$CloseAndOpenImpl, CloseAndOpenImplOp]; Register[$PrevPlace, PrevPlaceOp]; Register[$Reselect, ReselectOp]; END. ^TEditDocuments3Impl.mesa Copyright Σ 1985, 1987 by Xerox Corporation. All rights reserved. Russ Atkinson (RRA) August 19, 1985 4:05:04 pm PDT Doug Wyatt, January 20, 1987 2:21:52 am PST Michael Plass, October 16, 1987 4:26:29 pm PDT [data: REF ANY] This is called after Rollback to see if any viewers need to be Reset. [v: ViewerClasses.Viewer] RETURNS [BOOL _ TRUE] Reset [viewer: ViewerClasses.Viewer _ NIL] RETURNS [recordAtom: BOOL _ TRUE, quit: BOOL _ FALSE] Save Clear = Empty, New, or CloseAndNew called when Clear menu item becomes unguarded PreClear[parent]; Don't fork these operations since they change the selection; want to capture typein that follows calls on these. This is the button in the upper left corner. Store PreviousFile = LoadPrevious, OpenPrevious, or CloseAndOpenPrevious Anonymous Loads -- into NoName viewers Get = Load, Open, or CloseAndOpen PreGet[parent]; GetImpl = LoadImpl, OpenImpl, or CloseAndOpenImpl PreGetImpl[parent]; This is the Open button in the upper right corner of the screen. Places menu commands Levels menu commands Lines menu commands Time Split Κ˜codešœ™KšœB™BKšœΟkœ™2Kšœ(™+K™.K™—š ˜ Kšœœ ˜-Kšœœ˜Kšœ œ!˜1Kšœœ˜&Kšœœ˜,Kšœœ ˜Kšœœ œ˜Kšœœ6˜IKšœœΛ˜εKšœ œE˜UKšœœ˜#Kšœœ˜&Kšœ œ#˜1Kšœœ ˜Kšœœ˜*Kšœœ#˜9Kšœ œ[˜jKšœ œ˜)K˜—KšΡblnœœ˜"KšœΖ˜ΝKšœ˜šœœœ˜"K˜Kšœœœ˜Kšœœ˜$K˜šΟnœœ œœœœΟc œ˜?Kšœœ˜/Kšœ˜—K˜š Ÿœœœ œ  œ˜PKšœ˜Kšœ˜K˜—šŸ œœœœœœœ˜jK˜Kšœ*œ>˜kKšœœ˜Kšœ˜K˜—š Ÿ œœœ#œœœ˜[K˜Kšœ*œ˜GKšœ˜K˜—šœœœ˜Kšœœ˜Kšœ˜Kšœ˜K˜—šœœœ˜Kšœœœ˜-Kšœ˜Kšœ ˜Kšœ˜K˜—•StartOfExpansion -- [data: REF ANY]šŸ œ˜%Kšœœœ™šœœ˜šœœ ˜Kšœœœ˜/K˜—šœœ ˜Kšœ*œœ˜?K˜—Kšœ˜—K˜—˜K˜—šŸœ˜1K™E–3 -- [v: ViewerClasses.Viewer] RETURNS [BOOL _ TRUE]šŸœ˜Kšœœœœ™/šœœ˜šœ)˜)šœ$œ˜,KšœGœ˜MKšœ ˜.K˜—K˜—Kšœ˜—Kšœœ ˜&Kšœ˜—Kšœ# ˜AK˜K˜—™K™šŸ œœ;œœœœ  œ˜yšœœ ˜Kšœ2˜2Kšœœ˜—šœ˜K˜——šŸœœ˜$šœœ˜šœ˜šœ˜Kšœœœœ4˜lKšœ˜——Kšœ˜—Kšœ˜K˜—šŸœœ˜!Kšœ˜KšœJ˜JKšœ˜—K˜–^ -- [viewer: ViewerClasses.Viewer _ NIL] RETURNS [recordAtom: BOOL _ TRUE, quit: BOOL _ FALSE]šŸœ˜#Kš œ œœœœœœ™Zšœœ˜šœœœ˜/šœœ˜šœ)˜)Kšœ-˜-Kšœ œœ4˜[Kšœœ ,˜AKšœ˜K˜—Kšœ˜—Kšœœœ˜Kšœ˜—šœœœ˜/šœœ˜šœ)˜)Kšœ$œ˜Fšœ#œ˜2šœœœ˜Kšœ˜Kšœœ˜!Kšœ-˜-šœ@˜FKšœ˜—Kšœ˜K˜—Kšœ˜—K˜—Kšœ˜—Kšœœœ˜Kšœ˜—K˜—Kšœ?˜?Kšœ˜K˜——™K™šŸœœ˜ Kšœ˜KšœG˜GKšœ˜—K˜šŸœ˜"K˜š œœœœœœ˜UKšœœ˜7Kšœ˜—Kšœœ˜Kšœ˜K˜——™"K™šŸœœ˜$Kšœ-™-šœ!œ ˜/K˜U—K˜K˜—šŸœœ˜"Kšœ™KšœA˜AKšœ˜K˜—K™pK™šŸœ2œœ˜JK˜—šŸœ0œœ˜FK˜—šŸ œœ"œ˜:K™,K˜—šŸ œ˜)Kšœœœ˜,K˜——™K™šŸœœ˜"Kšœ˜KšœJ˜JKšœ˜—K˜šŸœœ(˜RK˜——™BK™šŸ œœ˜)K˜KšœZ˜ZKšœ˜K˜—šŸœ˜*Kšœ*˜0Kšœ˜K˜—šŸœ˜*Kšœ*˜0Kšœ˜K˜—šŸœ˜2Kšœ2˜8Kšœ˜—K˜—šœ ™&K™šŸœœ˜-Kšœ˜Kšœ˜K˜—šŸœ˜/Kšœ/˜5Kšœ˜K˜—šŸ œœ˜*Kšœ˜Kšœ˜K˜—šŸœ˜+Kšœ)˜/Kšœ˜—K˜šŸœœ˜*Kšœ˜Kšœ˜——K˜™!K™šœŸ œœ˜.Kšœœ ˜ Kšœhœ˜nKšœ˜K˜—šŸœœ˜ Kšœ™KšœB˜BKšœ˜K˜—šŸœœ#˜LK˜šŸœœœœ˜7Kšœ"œ˜)Kšœ˜——K˜šŸœ˜"Kšœ!˜'Kšœ˜K˜šŸœœœœ˜7Kš œ,œ œœœ˜jKšœ˜K˜——šŸœ˜*Kšœ)˜/Kšœ˜K˜šŸœœœœ˜?Kšœ*˜*Kšœ˜—K˜—K˜—™1K™šŸœœ˜$Kšœ™KšœN˜NKšœ˜K˜—šŸ œ˜&Kšœ%˜+Kšœ˜K˜šŸ œœœœ˜;Kšœ&œ˜-Kšœ˜K˜——šŸ œ˜&Kšœ%˜+Kšœ˜K˜—šŸ œœœœ˜;Kš œ0œ œœœ˜nKšœ˜K˜—šŸœ˜.Kšœ-˜3Kšœ˜K˜—šŸœœœœ˜CKšœ.˜.Kšœ˜K˜—šŸ œœ˜)K™@Kšœœ˜ Kšœ˜K˜——™K™šŸ œœ˜%Kšœ\˜\Kšœ˜—K˜šŸœœ˜/Kšœœœ ˜9Kšœ˜—K˜KšŸœœ,˜BšŸ œ˜'Kšœ'œ˜;Kšœœœ0˜Rš œœœœœ˜"K˜"Kšœ"œ˜9Kšœœœ˜,Kšœœ#œœ˜G—Kšœ1œ˜7K˜Kšœœ˜Kšœ˜—K˜KšŸœœ+˜;šŸ œ˜&Kšœ'œ˜;Kšœ œ1˜Wš œœœœœ!œ˜FK˜Kšœœœœ˜>Kšœœ˜Kšœ˜K˜—šŸœœ œ ˜GKšœœœœ˜?Kšœ œœœ˜@Kšœœœœ˜@Kšœœ˜Kšœ˜K˜—K˜—™K˜KšŸ œœ.˜AK˜KšŸ œœ-˜?K˜KšŸ œœ,˜=K˜KšŸœœ1˜GK˜K™—™K˜KšŸ œœ-˜?K˜KšŸ œœ,˜=K˜KšŸœœ+˜;K˜KšŸ œœ0˜EK˜—™K™KšŸœœ'˜3K˜—™K˜šŸœœ˜,Kšœ?˜?Kšœ˜—K™—K˜Kšœ2˜2K˜Kšœ]˜]KšœW˜WKšœ˜Kšœ˜Kšœ&˜&Kšœ]˜]Kšœ(˜(Kšœ(˜(Kšœ8˜8Kšœ2˜2Kšœ*˜*Kšœ˜Kšœ˜Kšœ(˜(Kšœ ˜ Kšœ ˜ Kšœ0˜0Kšœ"˜"Kšœ ˜ K˜—Kšœ˜K˜J˜—…—0€E