DIRECTORY CubicSplines, GGButtons, GGCaret, GGError, GGEvent, GGGraphicsButton, GGInterfaceTypes, GGModelTypes, GGObjects, GGSelect, GGVector, GGViewerOps, GGWindow, Imager, ImagerColor, IO, Rope, TiogaButtons, ViewerClasses, ViewerTools; GGEventImplB: CEDAR PROGRAM IMPORTS GGButtons, GGCaret, GGError, GGGraphicsButton, GGObjects, GGSelect, GGVector, GGViewerOps, GGWindow, Imager, ImagerColor, IO, Rope, TiogaButtons, ViewerTools EXPORTS GGEvent = BEGIN Cluster: TYPE = GGModelTypes.Cluster; EntityGenerator: TYPE = GGModelTypes.EntityGenerator; GargoyleData: TYPE = GGInterfaceTypes.GargoyleData; Outline: TYPE = GGModelTypes.Outline; Point: TYPE = GGModelTypes.Point; ScalarButtonClient: TYPE = GGInterfaceTypes.ScalarButtonClient; Segment: TYPE = GGModelTypes.Segment; Sequence: TYPE = GGModelTypes.Sequence; Traj: TYPE = GGModelTypes.Traj; TrajGenerator: TYPE = GGModelTypes.TrajGenerator; TwoState: TYPE = GGInterfaceTypes.TwoState; SegmentGenerator: TYPE = GGModelTypes.SegmentGenerator; SequenceGenerator: TYPE = GGModelTypes.SequenceGenerator; Vector: TYPE = GGModelTypes.Vector; Viewer: TYPE = ViewerClasses.Viewer; NotYetImplemented: PUBLIC SIGNAL = CODE; LineWidth: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { strokeWidth: REAL; msgRope: Rope.ROPE; sequenceGen: SequenceGenerator; widthRef: REF INT _ NARROW[event.rest.first]; width: NAT _ widthRef^; strokeWidth _ width; msgRope _ IO.PutFR["Selected objects will have line width %g.", [real[strokeWidth]]]; GGError.Append[msgRope, oneLiner]; sequenceGen _ GGSelect.SelectedSequences[gargoyleData, normal]; FOR sequence: Sequence _ GGObjects.NextSequence[sequenceGen], GGObjects.NextSequence[sequenceGen] UNTIL sequence = NIL DO GGObjects.SetStrokeWidth[sequence, strokeWidth]; ENDLOOP; GGWindow.Painter[$PaintEntireScene, gargoyleData]; }; AreaColorBlack: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { outline: Outline; entityGen: EntityGenerator; entityGen _ GGSelect.SelectedEntities[gargoyleData, normal]; FOR entity: REF ANY _ GGObjects.NextEntity[entityGen], GGObjects.NextEntity[entityGen] UNTIL entity = NIL DO WITH entity SELECT FROM seq: Sequence => outline _ GGObjects.OutlineOfTraj[seq.traj]; traj: Traj => outline _ GGObjects.OutlineOfTraj[traj]; o: Outline => outline _ o; cluster: Cluster => ERROR NotYetImplemented; ENDCASE => ERROR; GGObjects.SetFillColor[outline, Imager.black]; ENDLOOP; GGWindow.Painter[$PaintEntireScene, gargoyleData]; }; AreaColorWhite: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { outline: Outline; entityGen: EntityGenerator; entityGen _ GGSelect.SelectedEntities[gargoyleData, normal]; FOR entity: REF ANY _ GGObjects.NextEntity[entityGen], GGObjects.NextEntity[entityGen] UNTIL entity = NIL DO WITH entity SELECT FROM seq: Sequence => outline _ GGObjects.OutlineOfTraj[seq.traj]; traj: Traj => outline _ GGObjects.OutlineOfTraj[traj]; o: Outline => outline _ o; cluster: Cluster => ERROR NotYetImplemented; ENDCASE => ERROR; GGObjects.SetFillColor[outline, Imager.white]; ENDLOOP; GGWindow.Painter[$PaintEntireScene, gargoyleData]; }; AreaColorGray: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { outline: Outline; entityGen: EntityGenerator; entityGen _ GGSelect.SelectedEntities[gargoyleData, normal]; FOR entity: REF ANY _ GGObjects.NextEntity[entityGen], GGObjects.NextEntity[entityGen] UNTIL entity = NIL DO WITH entity SELECT FROM seq: Sequence => outline _ GGObjects.OutlineOfTraj[seq.traj]; traj: Traj => outline _ GGObjects.OutlineOfTraj[traj]; o: Outline => outline _ o; cluster: Cluster => ERROR NotYetImplemented; ENDCASE => ERROR; GGObjects.SetFillColor[outline, ImagerColor.ColorFromGray[0.5]]; ENDLOOP; GGWindow.Painter[$PaintEntireScene, gargoyleData]; }; MakeHot: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { entityGen: EntityGenerator; entityGen _ GGSelect.SelectedEntities[gargoyleData, normal]; FOR entity: REF ANY _ GGObjects.NextEntity[entityGen], GGObjects.NextEntity[entityGen] UNTIL entity = NIL DO GGSelect.SelectEntity[entity, gargoyleData, hot]; ENDLOOP; }; MakeCold: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { entityGen: EntityGenerator; entityGen _ GGSelect.SelectedEntities[gargoyleData, normal]; FOR entity: REF ANY _ GGObjects.NextEntity[entityGen], GGObjects.NextEntity[entityGen] UNTIL entity = NIL DO GGSelect.DeselectEntity[entity, gargoyleData, hot]; ENDLOOP; }; DropAnchor: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { GGCaret.Copy[gargoyleData.anchor, gargoyleData.caret]; GGWindow.Painter[$PaintEntireScene, gargoyleData]; }; KillAnchor: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { GGCaret.Kill[gargoyleData.anchor]; GGWindow.Painter[$PaintEntireScene, gargoyleData]; }; GravityChoiceChange: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { info: GGInterfaceTypes.EnumTypeRef _ gargoyleData.hitTest.gravityTypeMenu; name: Rope.ROPE; IF event.rest.first = $FlipForward THEN GGButtons.TimeToFlipThru[LIST[$FlipForward, info]] ELSE GGButtons.TimeToFlipThru[LIST[$FlipBackward, info]]; name _ info.flipLabel.name; SELECT TRUE FROM Rope.Equal[name, "StrictDistance", TRUE] => gargoyleData.hitTest.gravityType _ strictDistance; Rope.Equal[name, "PointsPreferred", TRUE] => gargoyleData.hitTest.gravityType _ innerCircle; Rope.Equal[name, "Sectors", TRUE] => gargoyleData.hitTest.gravityType _ sectors; Rope.Equal[name, "None", TRUE] => gargoyleData.hitTest.gravityType _ none; ENDCASE => ERROR; }; GravityExtentChange: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { value: REAL; msgRope: Rope.ROPE; graphicsState: GGGraphicsButton.GraphicsState _ gargoyleData.hitTest.gravityExtentButton; value _ GGGraphicsButton.GetValue[graphicsState]; SELECT event.rest.first FROM $ValueUp => { value _ value*2.0; msgRope _ IO.PutFR["Gravity extent is now %g screen dots.", [real[value]] ]; GGError.Append[msgRope, oneLiner]; GGGraphicsButton.SetButtonValueAndPaint[graphicsState, value]; }; $ValueDown => { value _ value/2.0; msgRope _ IO.PutFR["Gravity extent is now %g screen dots.", [real[value]] ]; GGError.Append[msgRope, oneLiner]; GGGraphicsButton.SetButtonValueAndPaint[graphicsState, value]; }; $InitialValue => {}; ENDCASE => ERROR; gargoyleData.hitTest.tolerance _ value; gargoyleData.hitTest.criticalR _ value; gargoyleData.hitTest.innerR _ value; }; ToggleAlwaysOn: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { stateInfo: TwoState _ gargoyleData.hitTest.linesAlwaysOn; GGButtons.SwitchState[stateInfo]; }; ToggleDoubleBuffer: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { stateInfo: TwoState _ gargoyleData.refresh.doubleBuffer; GGButtons.SwitchState[stateInfo]; }; SlopePrompt: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { viewer: Viewer _ gargoyleData.hitTest.slopeText; ViewerTools.SetSelection[viewer]; }; AddSlope: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { slope: REAL; thisButton: ScalarButtonClient; tiogaButton: TiogaButtons.TiogaButton; slope _ GGViewerOps.GetReal[gargoyleData.hitTest.slopeText, 90.0]; thisButton _ gargoyleData.hitTest.slopeButtons; UNTIL thisButton.next = NIL DO thisButton _ thisButton.next ENDLOOP; tiogaButton _ thisButton.button; [] _ GGButtons.AddScalarButton[tiogaButton, slope, LIST[$ToggleSlope, NEW[REAL _ slope]], FALSE, gargoyleData]; }; GetSlope: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { seqGen: SequenceGenerator; segGen: SegmentGenerator; seq, next: Sequence; direction: Vector; degrees: REAL; seqGen _ GGSelect.SelectedSequences[gargoyleData, normal]; seq _ GGObjects.NextSequence[seqGen]; next _ GGObjects.NextSequence[seqGen]; IF seq = NIL OR next # NIL THEN { GGError.Append["Select a single sequence for a GetSlope.", oneLiner]; GGError.Blink[]; RETURN; }; segGen _ GGObjects.SegmentsInSequence[seq]; FOR seg: Segment _ GGObjects.NextSegment[segGen], GGObjects.NextSegment[segGen] UNTIL seg = NIL DO direction _ GGVector.VectorFromPoints[seg.lo, seg.hi]; degrees _ GGVector.AngleFromVector[direction]; IF degrees < 0.0 THEN degrees _ degrees + 180.0; BEGIN thisButton: ScalarButtonClient; tiogaButton: TiogaButtons.TiogaButton; thisButton _ gargoyleData.hitTest.slopeButtons; UNTIL thisButton.next = NIL DO thisButton _ thisButton.next ENDLOOP; tiogaButton _ thisButton.button; [] _ GGButtons.AddScalarButton[tiogaButton, degrees, LIST[$ToggleSlope, NEW[REAL _ degrees]], FALSE, gargoyleData]; END ENDLOOP; }; ToggleSlope: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { slope: REAL; firstButton, pushedButton: ScalarButtonClient; tiogaButton: TiogaButtons.TiogaButton; WITH event.rest.first SELECT FROM int: REF INT => slope _ int^; real: REF REAL => slope _ real^; ENDCASE => ERROR; firstButton _ gargoyleData.hitTest.slopeButtons; FOR thisButton: ScalarButtonClient _ firstButton, thisButton.next UNTIL thisButton = NIL DO IF thisButton.value = slope THEN { pushedButton _ thisButton; EXIT; }; REPEAT FINISHED => ERROR; ENDLOOP; tiogaButton _ pushedButton.button; IF pushedButton.on THEN { pushedButton.on _ FALSE; TiogaButtons.ChangeButtonLooks[tiogaButton, "", "b"]; } ELSE { pushedButton.on _ TRUE; TiogaButtons.ChangeButtonLooks[tiogaButton, "b", ""]; }; }; DeleteSlope: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = {}; RadiusPrompt: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { viewer: Viewer _ gargoyleData.hitTest.radiusText; ViewerTools.SetSelection[viewer]; }; AddRadius: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { radius: REAL; thisButton: ScalarButtonClient; tiogaButton: TiogaButtons.TiogaButton; radius _ GGViewerOps.GetReal[gargoyleData.hitTest.radiusText, 72.0]; thisButton _ gargoyleData.hitTest.radiusButtons; UNTIL thisButton.next = NIL DO thisButton _ thisButton.next ENDLOOP; tiogaButton _ thisButton.button; [] _ GGButtons.AddScalarButton[tiogaButton, radius, LIST[$ToggleRadius, NEW[REAL _ radius]], FALSE, gargoyleData]; }; GetRadius: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { seqGen: SequenceGenerator; segGen: SegmentGenerator; seq, next: Sequence; radius: REAL; seqGen _ GGSelect.SelectedSequences[gargoyleData, normal]; seq _ GGObjects.NextSequence[seqGen]; next _ GGObjects.NextSequence[seqGen]; IF next # NIL THEN { GGError.Append["Select a single sequence for a GetRadius.", oneLiner]; GGError.Blink[]; }; segGen _ GGObjects.SegmentsInSequence[seq]; FOR seg: Segment _ GGObjects.NextSegment[segGen], GGObjects.NextSegment[segGen] UNTIL seg = NIL DO radius _ GGVector.Distance[seg.lo, seg.hi]; BEGIN thisButton: ScalarButtonClient; tiogaButton: TiogaButtons.TiogaButton; thisButton _ gargoyleData.hitTest.radiusButtons; UNTIL thisButton.next = NIL DO thisButton _ thisButton.next ENDLOOP; tiogaButton _ thisButton.button; [] _ GGButtons.AddScalarButton[tiogaButton, radius, LIST[$ToggleRadius, NEW[REAL _ radius]], FALSE, gargoyleData]; END ENDLOOP; }; ToggleRadius: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { radius: REAL; epsilon: REAL = 0.01; firstButton, pushedButton: ScalarButtonClient; tiogaButton: TiogaButtons.TiogaButton; WITH event.rest.first SELECT FROM int: REF INT => radius _ int^; real: REF REAL => radius _ real^; ENDCASE => ERROR; firstButton _ gargoyleData.hitTest.radiusButtons; FOR thisButton: ScalarButtonClient _ firstButton, thisButton.next UNTIL thisButton = NIL DO IF ABS[thisButton.value-radius] < epsilon THEN { pushedButton _ thisButton; EXIT; }; REPEAT FINISHED => ERROR; ENDLOOP; tiogaButton _ pushedButton.button; IF pushedButton.on THEN { pushedButton.on _ FALSE; TiogaButtons.ChangeButtonLooks[tiogaButton, "", "b"]; } ELSE { pushedButton.on _ TRUE; TiogaButtons.ChangeButtonLooks[tiogaButton, "b", ""]; }; }; DeleteRadius: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = {}; DistancePrompt: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { viewer: Viewer _ gargoyleData.hitTest.distanceText; ViewerTools.SetSelection[viewer]; }; AddDistance: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { dist: REAL; thisButton: ScalarButtonClient; tiogaButton: TiogaButtons.TiogaButton; dist _ GGViewerOps.GetReal[gargoyleData.hitTest.distanceText, 0.0]; thisButton _ gargoyleData.hitTest.distanceButtons; UNTIL thisButton.next = NIL DO thisButton _ thisButton.next ENDLOOP; tiogaButton _ thisButton.button; [] _ GGButtons.AddScalarButton[tiogaButton, dist, LIST[$ToggleDistance, NEW[REAL _ dist]], FALSE, gargoyleData]; }; GetDistance: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { seqGen: SequenceGenerator; segGen: SegmentGenerator; seq, next: Sequence; dist: REAL; seqGen _ GGSelect.SelectedSequences[gargoyleData, normal]; seq _ GGObjects.NextSequence[seqGen]; next _ GGObjects.NextSequence[seqGen]; IF next # NIL THEN { GGError.Append["Select a single sequence for a GetRadius.", oneLiner]; GGError.Blink[]; }; segGen _ GGObjects.SegmentsInSequence[seq]; FOR seg: Segment _ GGObjects.NextSegment[segGen], GGObjects.NextSegment[segGen] UNTIL seg = NIL DO dist _ GGVector.Distance[seg.lo, seg.hi]; BEGIN thisButton: ScalarButtonClient; tiogaButton: TiogaButtons.TiogaButton; thisButton _ gargoyleData.hitTest.distanceButtons; UNTIL thisButton.next = NIL DO thisButton _ thisButton.next ENDLOOP; tiogaButton _ thisButton.button; [] _ GGButtons.AddScalarButton[tiogaButton, dist, LIST[$ToggleDistance, NEW[REAL _ dist]], FALSE, gargoyleData]; END ENDLOOP; }; ToggleDistance: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { dist: REAL; epsilon: REAL = 0.01; firstButton, pushedButton: ScalarButtonClient; tiogaButton: TiogaButtons.TiogaButton; WITH event.rest.first SELECT FROM int: REF INT => dist _ int^; real: REF REAL => dist _ real^; ENDCASE => ERROR; firstButton _ gargoyleData.hitTest.distanceButtons; FOR thisButton: ScalarButtonClient _ firstButton, thisButton.next UNTIL thisButton = NIL DO IF ABS[thisButton.value-dist] < epsilon THEN { pushedButton _ thisButton; EXIT; }; REPEAT FINISHED => ERROR; ENDLOOP; tiogaButton _ pushedButton.button; IF pushedButton.on THEN { pushedButton.on _ FALSE; TiogaButtons.ChangeButtonLooks[tiogaButton, "", "b"]; } ELSE { pushedButton.on _ TRUE; TiogaButtons.ChangeButtonLooks[tiogaButton, "b", ""]; }; }; DeleteDistance: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = {}; Erase: PUBLIC PROC [event: LIST OF REF ANY, gargoyleData: GargoyleData] = { GGWindow.Painter[$EraseAll, gargoyleData]; }; END. &GGEventImplB.mesa Last edited by Bier on October 1, 1985 9:31:38 pm PDT Contents: Once an event reaches the front of the slack-process queue, it is dispatched to one of the procedures in this module. Stone, August 9, 1985 2:38:57 pm PDT Style Operations Alignment Operations Doesn't properly handle end conditions. Assumes that some buttons already exist. Doesn't properly handle end conditions. Assumes that some buttons already exist. Doesn't properly handle end conditions. Assumes that some buttons already exist. Miscellaneous Κ˜Ihead1™J™5™€Icode™$—J™šΟk ˜ Jšœε˜εJ˜—šœœ˜Jšœž˜₯Jšœ ˜—Jš˜J˜Jšœ œ˜%Jšœœ ˜5Jšœœ!˜3Jšœ œ˜%Jšœœ˜!Jšœœ'˜?Jšœ œ˜%Jšœ œ˜'Jšœœ˜Jšœœ˜1Jšœ œ˜+Jšœœ!˜7Jšœœ"˜9Jšœœ˜#J˜$J˜Jšœœœœ˜(J˜J™J™šΟn œœœ œœœœ!˜OIprocšœ œ˜Mšœœ˜M˜Mšœ œœœ˜-Mšœœ ˜Mšœ˜Mšœ œI˜UMšœ"˜"Mšœ?˜?šœ_œ œ˜yMšœ0˜0—Mšœ˜Jšœ2˜2J˜J˜—M™šžœœœ œœœœ!˜TM˜Mšœ˜Mšœ<˜<š œ œœDœ œ˜lMšœœ˜M˜=M˜6M˜Mšœœ˜,Mšœœ˜Mšœ.˜.—Mšœ˜Jšœ2˜2M˜J˜—š žœ œ œœœœ!˜TM˜Mšœ˜Mšœ<˜<š œ œœDœ œ˜lMšœœ˜M˜=M˜6M˜Mšœœ˜,Mšœœ˜Mšœ.˜.—Mšœ˜Jšœ2˜2M˜—š ž œ œ œœœœ!˜SM˜Mšœ˜Mšœ<˜<š œ œœDœ œ˜lMšœœ˜M˜=M˜6M˜Mšœœ˜,Mšœœ˜Mšœ@˜@—Mšœ˜Jšœ2˜2M˜—M™M™M™šžœœœ œœœœ!˜MMšœ˜Mšœ<˜<š œ œœDœ œ˜lMšœ1˜1—Mšœ˜M˜—š žœ œ œœœœ!˜NMšœ˜Mšœ<˜<š œ œœDœ œ˜lMšœ3˜3—Mšœ˜M˜M˜—š ž œ œ œœœœ!˜PJšœ6˜6Jšœ2˜2J˜J˜—š ž œ œ œœœœ!˜PJšœ"˜"Jšœ2˜2J˜—J™šžœœœ œœœœ!˜YMšœJ˜JMšœ œ˜šœ!˜'Mšœœ˜2—šœ˜Mšœœ˜4—Mšœ˜Mšœœ˜Mšœ#œ7˜^Mšœ$œ4˜\Mšœœ0˜PMšœœ-˜JMšœœ˜M˜M˜—šžœœœ œœœœ!˜YMšœœ˜ Mšœœ˜MšœY˜YMšœ1˜1Mšœ˜šœ œ˜ Mšœ˜Mšœ œ@˜LM˜"Mšœ>˜>M˜—šœ˜Mšœ˜Mšœ œ@˜LM˜"Mšœ>˜>M˜—M˜Mš œœ˜Mšœ'˜'Mšœ'˜'Mšœ$˜$M˜M˜—š žœ œ œœœœ!˜TMšœ9˜9Mšœ!˜!M˜—šžœœœ œœœœ!˜XMšœ8˜8Mšœ!˜!M˜—M˜š ž œ œ œœœœ!˜QMšœ0˜0Mšœ!˜!Mšœ˜M˜—š žœ œ œœœœ!˜NM™QMšœœ˜ Mšœ˜Mšœ&˜&MšœB˜BMšœ/˜/Mšœœœœ˜DMšœ ˜ Mš œ3œœœ œ˜oM˜M˜—šžœœœ œœœœ!˜NMšœ˜Mšœ˜Mšœ˜M˜Mšœ œ˜Mšœ:˜:Mšœ%˜%Mšœ&˜&š œœœœœ˜!M˜EM˜Mšœ˜M˜—Mšœ+˜+šœMœœ˜bM˜6Mšœ.˜.Mšœœ˜0š˜Mšœ˜Mšœ&˜&Mšœ/˜/Mšœœœœ˜DMšœ ˜ Mš œ5œœœœ˜s—Mš˜—Mšœ˜˜M˜—M˜—šž œœœ œœœœ!˜QMšœœ˜ Mšœ.˜.Mšœ&˜&Mšœœ˜!Mšœœœ˜Mšœœœ˜ Mšœœ˜Mšœ0˜0šœ?œœ˜[šœœ˜"Mšœ˜Mšœ˜M˜——š˜Mšœœ˜—Mšœ˜Mšœ"˜"šœœ˜Mšœœ˜Mšœ5˜5M˜—šœ˜Mšœœ˜Mšœ5˜5M˜—M˜M˜—Mš ž œ œ œœœœ#˜SM˜š ž œ œ œœœœ!˜RMšœ1˜1Mšœ!˜!M˜M˜—šž œœœ œœœœ!˜OM™QMšœœ˜ Mšœ˜Mšœ&˜&MšœD˜DMšœ0˜0Mšœœœœ˜DMšœ ˜ Mš œ4œœœ œ˜rM˜—š ž œ œ œœœœ!˜OMšœ˜Mšœ˜Mšœ˜Mšœœ˜ Mšœ:˜:Mšœ%˜%Mšœ&˜&šœœœ˜M˜FM˜M˜—Mšœ+˜+šœMœœ˜bMšœ+˜+š˜Mšœ˜Mšœ&˜&Mšœ0˜0Mšœœœœ˜DMšœ ˜ Mš œ4œœœ œ˜r—Mš˜—Mšœ˜Mšœ˜—šž œœœ œœœœ!˜RMšœœ˜ Mšœ œ˜Mšœ.˜.Mšœ&˜&Mšœœ˜!Mšœœœ˜Mšœœœ˜!Mšœœ˜Mšœ1˜1šœ?œœ˜[šœœ$œ˜0Mšœ˜Mšœ˜M˜——š˜Mšœœ˜—Mšœ˜Mšœ"˜"šœœ˜Mšœœ˜Mšœ5˜5M˜—šœ˜Mšœœ˜Mšœ5˜5M˜—M˜M˜M˜—Mšž œœœ œœœœ#˜T˜M˜—š žœ œ œœœœ!˜TMšœ3˜3Mšœ!˜!M˜M˜—šž œœœ œœœœ!˜QM™QMšœœ˜ Mšœ˜Mšœ&˜&MšœC˜CMšœ2˜2Mšœœœœ˜DMšœ ˜ Mš œ2œœœ œ˜pM˜—š ž œ œ œœœœ!˜QMšœ˜Mšœ˜Mšœ˜Mšœœ˜ Mšœ:˜:Mšœ%˜%Mšœ&˜&šœœœ˜M˜FM˜M˜—Mšœ+˜+šœMœœ˜bMšœ)˜)š˜Mšœ˜Mšœ&˜&Mšœ2˜2Mšœœœœ˜DMšœ ˜ Mš œ2œœœ œ˜p—Mš˜—Mšœ˜Mšœ˜—šžœœœ œœœœ!˜TMšœœ˜ Mšœ œ˜Mšœ.˜.Mšœ&˜&Mšœœ˜!Mšœœœ˜Mšœœœ˜Mšœœ˜Mšœ3˜3šœ?œœ˜[šœœ"œ˜.Mšœ˜Mšœ˜M˜——š˜Mšœœ˜—Mšœ˜Mšœ"˜"šœœ˜Mšœœ˜Mšœ5˜5M˜—šœ˜Mšœœ˜Mšœ5˜5M˜—M˜M˜—Mšžœœœ œœœœ#˜VM˜J™ J™šžœœœ œœœœ!˜KJšœ*˜*Jšœ˜M˜—J˜Jšœ˜—…—9<Kx