DIRECTORY Atom USING [MakeAtom], Basics USING [BITAND, BITSHIFT], CD, CDInstances, CDBasics, CDBusCells USING [CreateBusCell], CDCells, CDCommandOps, CDIO USING [MakeName], CDDirectory USING [Include], CDOps, CDProperties, CDRects USING [CreateRect], CDRepetitions, CDSequencer, CDTexts, CDViewer, Commander USING [CommandProc, Register], CommandTool, FS, IO, CMos, CMosCMContacts, CMosCMTransistors, Rope, TerminalIO, ViewerClasses USING [Viewer]; ChipmonkCmosRead: CEDAR MONITOR IMPORTS Atom, Basics, CDBasics, CDInstances, CDBusCells, CDCells, CDDirectory, CDIO, CDOps, CDCommandOps, CDProperties, CDRects, CDRepetitions, CDSequencer, CDTexts, CDViewer, Commander, FS, IO, CMos, CMosCMContacts, CMosCMTransistors, CommandTool, Rope, TerminalIO SHARES CDProperties = BEGIN TransformSelected: PROC [design: CD.Design, transform: CD.Orientation, base: CD.Rect_[0, 0, -1, -1]] = { ib, is, orientOff: CD.Position; r, oldbb: CD.Rect; oldPseudoCellT, newPseudoCellT: CD.Transformation; sel: CD.InstanceList = CDInstances.OnlySelected[CDOps.InstList[design]]; IF sel=NIL THEN RETURN; oldbb _ CDInstances.BoundingRectO[sel]; IF ~CDBasics.NonEmpty[base] THEN base _ CDInstances.BoundingRectI[sel]; ib _ CDBasics.BaseOfRect[base]; is _ CDBasics.SizeOfRect[base]; oldPseudoCellT _ [ib, original]; r _ CDBasics.MapRect[CDBasics.RectAt[[0,0], is], [[0,0], transform]]; orientOff _ CDBasics.BaseOfRect[r]; newPseudoCellT _ [CDBasics.SubPoints[ib, orientOff], transform]; FOR w: CD.InstanceList _ sel, w.rest WHILE w#NIL DO pseudoCellRel: CD.Transformation _ CDBasics.DecomposeTransform[w.first.trans, oldPseudoCellT]; w.first.trans _ CDBasics.ComposeTransform[pseudoCellRel, newPseudoCellT] ENDLOOP; CDOps.Redraw[design, oldbb]; CDOps.Redraw[design, CDBasics.MapRect[CDBasics.DeMapRect[oldbb, oldPseudoCellT], newPseudoCellT]] }; lambdaInChipmonk: INTEGER = 2; lambdaFactor: INT = CMos.lambda/lambdaInChipmonk; instance: INTEGER = 1; transistor: INTEGER = 2; contact: INTEGER = 3; wire: INTEGER = 4; rectangle: INTEGER = 5; text: INTEGER = 6; bus: INTEGER = 7; repeat: INTEGER = 8; contTypALen: INTEGER = 12; maxCellNum: INTEGER = 1500; codeWordForDataFile : CARDINAL = 123751B; debugging: BOOLEAN = FALSE; debug: BOOLEAN = FALSE; atomTableSize: INTEGER = 256; contTypA: ARRAY [1..contTypALen] OF contType = [ mDif, mPol, butt, burr, mm2, mDif, mDif, mm2, mm2, mm2, mm2, difShort]; contLayer: ARRAY [1..contTypALen] OF CD.Layer = [ CMos.ndif, CMos.pol, CMos.ndif, CMos.ndif, CMos.met2, CMos.pdif, CMos.nwellCont, CMos.ndif, CMos.pol, CMos.ndif, CMos.ndif, CMos.ndif ]; -- for versions < 6 cmToCDLayer: ARRAY [0..15] OF CD.Layer = [ CMos.cut, CMos.ndif, CMos.pol, CMos.met, CMos.imp, CMos.ovg, CMos.bur, CD.errorLayer --snerd-- , CMos.cut2, CMos.pdif, CMos.pwellCont, CMos.met2, CMos.pwell, CMos.nwell, CMos.nwellCont, CD.errorLayer --NOcOL-- ]; contType: TYPE = {burr, mDif, difShort, butt, mPol, mm2}; design: CD.Design; cellNameA: REF ARRAY [0..maxCellNum] OF CD.Object _ NEW[ARRAY [0..maxCellNum] OF CD.Object]; atomTable: REF ARRAY [1..atomTableSize] OF ATOM _ NEW[ARRAY [1..atomTableSize] OF ATOM]; standardFont: CDTexts.CDFont = CDTexts.MakeFont[name: "Xerox/TiogaFonts/Tioga10"]; chipfile: IO.STREAM; fileName: Rope.ROPE; errs: INT _0; NotYetImpl: PROC [] = { errs _ errs+1; TerminalIO.PutRope["?"]; }; BadObject: PROC [size: CD.Position _ [4, 4]] RETURNS [CD.Object] = { RETURN [CDRects.CreateRect[size, CD.errorLayer]] }; InWord: PROC RETURNS [INTEGER] = { highbyte: CARDINAL = LOOPHOLE[IO.GetChar[chipfile], CARDINAL]; lowbyte: CARDINAL = LOOPHOLE[IO.GetChar[chipfile], CARDINAL]; RETURN [ LOOPHOLE[(256*highbyte) + lowbyte, INTEGER] ]; }; FileFormat: ERROR = CODE; Lambda: PROCEDURE [i: INT] RETURNS [CD.Number] = INLINE { RETURN [lambdaFactor*i] }; InOrientation: PROC [] RETURNS [CD.Orientation] = INLINE { i: INTEGER = InWord[]; IF i>=0 AND i<=15 THEN RETURN [VAL[i/4*2 + i MOD 2]] --different representation ELSE ERROR FileFormat; }; ToLayer: PROC [i: INTEGER] RETURNS [CD.Layer] = INLINE { IF i>= 0 AND i<= 15 THEN RETURN [cmToCDLayer[i]] ELSE ERROR FileFormat; }; InLayer: PROC [] RETURNS [CD.Layer] = INLINE { RETURN [ToLayer[InWord[]]] }; NewCellName: PROC [index: INTEGER] RETURNS [cellName: Rope.ROPE] = { cellName _ IO.PutFR[ "cell#%d", IO.int[index]]; }; InObject: PROC[version: INTEGER] RETURNS [obj: CD.Object, instProp: REF_NIL, instVal: REF_NIL] = { j, k, w, l, we, le, dumsur: INTEGER; kk: CARDINAL; lev: CD.Layer; dumrope: Rope.ROPE; IF debugging OR debug THEN TerminalIO.PutRope[" (Include new object ... "]; j _ InWord[]; SELECT j FROM instance => { k _ InWord[]; -- cell ID num obj _ cellNameA[k]; }; transistor => { aExt: CD.Number _ 0; w _ InWord[]; l _ InWord[]; kk _ LOOPHOLE[InWord[]]; IF version > 4 AND LOOPHOLE[Basics.BITAND[kk, 10000B], CARDINAL] # 0 THEN dumsur _ InWord[]; IF LOOPHOLE[Basics.BITAND[LOOPHOLE[kk, CARDINAL], 20000B], CARDINAL] # 0 THEN aExt _ Lambda[InWord[]]; -- if angle get angle ext. IF LOOPHOLE[Basics.BITAND[kk, 100000B], CARDINAL]#0 THEN { IF version>7 THEN [] _ InWord[]; -- implant }; we _ Basics.BITAND[Basics.BITSHIFT[kk, -6], 77B]; le _ Basics.BITAND[kk, 77B]; lev _ IF Basics.BITAND[kk, 10000B]#0 THEN CMos.pdif ELSE CMos.ndif; SELECT TRUE FROM LOOPHOLE[Basics.BITAND[kk, 40000B], CARDINAL] #0 => {obj _ NIL; TerminalIO.PutRope[" error: pullup in cmos\n"]}; LOOPHOLE[Basics.BITAND[kk, 20000B], CARDINAL] #0 => obj _ CMosCMTransistors.CreateAngleTransistor[w: Lambda[w], l: Lambda[l], wExt: Lambda[we], lExt: Lambda[le], aExt: aExt, difLev: lev]; ENDCASE => obj _ CMosCMTransistors.CreateTransistor[w: Lambda[w], l: Lambda[l], wExt: Lambda[we], lExt: Lambda[le], difLev: lev]; }; contact => { j: CARDINAL _ LOOPHOLE[InWord[]]; -- get contact type k: CARDINAL _ Basics.BITAND[j, 37B]; -- get contact type l: CARDINAL _ Basics.BITSHIFT[j, -8]; lev _ IF version > 5 THEN InLayer[] ELSE contLayer[k]; IF version > 4 THEN dumsur _ LOOPHOLE[InWord[]]; SELECT contTypA[k] FROM mPol => obj _ CMosCMContacts.CreatePolyCon[Lambda[l]]; mDif => obj _ CMosCMContacts.CreateDifCon[Lambda[l], lev]; difShort => obj _ CMosCMContacts.CreateDifShortCon[lev]; butt => obj_ CMosCMContacts.CreateButCon[lev]; burr => BEGIN w _ LOOPHOLE[InWord[]]; k _ LOOPHOLE[InWord[]]; j _ Basics.BITSHIFT[k, -8]; obj _ CMosCMContacts.CreateBurCon[w: Lambda[w], l: Lambda[l], wex: Lambda[j], lex: Lambda[LOOPHOLE[Basics.BITAND[k, 37B], CARDINAL]], difLev: lev]; END; mm2 => obj _ CMosCMContacts.CreateMmCon[Lambda[l], 0, 0]; ENDCASE => {TerminalIO.PutRope[" Error in selecting contact type "]; ERROR}; }; wire => { i: INTEGER; w _ InWord[]; l _ InWord[]; i _ InWord[]; lev _ ToLayer[i]; IF lev=CMos.pdif THEN lev _ CMos.wpdif; SELECT i FROM 7 => {instVal _ $snerdRect; instProp _ $SignalName}; 15 => {instVal _ $NOcOLRect; instProp _ $SignalName}; ENDCASE => NULL; IF version > 4 AND lev = CMos.wpdif THEN dumsur _ InWord[]; obj _ CDRects.CreateRect[[Lambda[w],Lambda[l]], lev]; }; rectangle => { i: INTEGER; w _ InWord[]; l _ InWord[]; instVal _ $Rect; instProp _ $CDxChipmonkThinks; i _ InWord[]; lev _ ToLayer[i]; IF lev=CMos.pdif THEN lev _ CMos.wpdif; SELECT i FROM 7 => {instVal _ $snerdRect; instProp _ $SignalName}; 15 => {instVal _ $NOcOLRect; instProp _ $SignalName}; ENDCASE => NULL; obj _ CDRects.CreateRect[[Lambda[w], Lambda[l]], lev]; }; text => { dumrope _ InString[]; obj _ CDTexts.Create[dumrope, standardFont] }; bus => { w: CD.Number = Lambda[InWord[]]; l: CD.Number = Lambda[InWord[]]; lev: CD.Layer = InLayer[]; count: NAT = InWord[]; spacing: CD.Number = Lambda[InWord[]]; topInc: CD.Number = Lambda[InWord[]]; botInc: CD.Number = Lambda[InWord[]]; IF lev=CMos.pdif THEN {TerminalIO.PutRope["**bus implant is not drawn\n"]}; obj _ CDBusCells.CreateBusCell[ design: design, sizeOfFirst: [w, l], lev: lev, count: count, offset: [spacing, topInc], lengIncrement: botInc-topInc ]; -- compare: obj _ Chipmonk.makeBus[l, w, lev, count, spacing, topInc, botInc]; }; repeat => { rob: CD.Object = InObject[version].obj; ignoredw: INT = InWord[]; -- ignored ignoredl: INT = InWord[]; -- ignored dx: CD.Number = Lambda[InWord[]]; dy: CD.Number = Lambda[InWord[]]; count: NAT _ InWord[]; orient: CD.Orientation _ InOrientation[]; obj _ CDRepetitions.CreateRepetition[design: design, ob: rob, count: count, offset: [dx, dy], orientation: orient]; }; ENDCASE => { obj _ BadObject[]; TerminalIO.PutRope["** erronous object\n"]; }; }; -- InObject InList: PROC[ver: INTEGER] RETURNS [list: CD.InstanceList _ NIL, length: INT] = { instProp: REF _ NIL; instVal: REF _ NIL; instCount: INTEGER; inst: CD.Instance; ob: CD.Object; location: CD.Position; orientation: CD.Orientation; IF debugging OR debug THEN TerminalIO.PutRope["start list\n"]; instCount _ InWord[]; FOR iNum: INTEGER IN [0..instCount) DO location.x _ Lambda[InWord[]]; location.y _ Lambda[InWord[]]; orientation _ InOrientation[]; [ob, instProp, instVal] _ InObject[ver]; IF ob=NIL THEN { ob _ BadObject[]; TerminalIO.PutRope["nil object\n"] }; inst _ CDInstances.NewInst[ob: ob]; inst.trans _ CDOps.FitObjectI[ob, location, orientation]; list _ CONS[inst, list]; IF instProp#NIL THEN CDProperties.PutInstanceProp[onto: inst, prop: instProp, val: instVal]; IF ver > 3 THEN BEGIN propCount: INTEGER = InWord[]; FOR propNum: INTEGER IN [0..propCount) DO InProp[inst]; ENDLOOP; END; ENDLOOP; IF debugging OR debug THEN TerminalIO.PutRope["end list\n"]; RETURN[list, instCount]; }; oldSigName: ATOM = Atom.MakeAtom["SIGNAL NAME"]; InProp: PROC [inst: CD.Instance] = { kind: INTEGER _ InWord[]; name: REF _ NIL; value: REF; SELECT kind FROM 1 => { IF inst=NIL OR inst.ob=NIL OR ISTYPE[inst.ob.specific, CD.RectSpecific] THEN name _ $SignalName ELSE name _ $InstanceName; value _ InString[]; }; 2 => { name _ InAtom[]; value _ InAtom[]; IF name=oldSigName THEN name _ $SignalName; }; ENDCASE => { name _ NIL; TerminalIO.PutRope["** unknown property kind\n"]; }; IF name#NIL AND inst#NIL AND inst.ob#NIL THEN CDProperties.PutProp[onto: inst, prop: name, val: value] }; InAtom: PROC [] RETURNS[a: ATOM] = { i: INTEGER _ InWord[]; IF i<0 THEN { a _ atomTable[-i] } ELSE IF i>0 THEN { a _ Atom.MakeAtom[InString[]]; IF i <= atomTableSize THEN atomTable[i] _ a ELSE TerminalIO.PutRope["** atom table code wrong\n"]; } ELSE { TerminalIO.PutRope["** atom code wrong\n"]; a _ NIL } }; InString: PROC [] RETURNS[s: Rope.ROPE] = { j, len: CARDINAL; flg: BOOLEAN; j _ LOOPHOLE[InWord[]]; len _ Basics.BITSHIFT[j, -8]; IF len = 0 THEN BEGIN s _ ""; RETURN; END; flg _ TRUE; FOR i: CARDINAL IN [0..len) DO IF flg THEN s _ Rope.Cat[s, Rope.FromChar[LOOPHOLE[Basics.BITAND[j, 377B], CHAR]]] ELSE { j _ LOOPHOLE[InWord[]]; s _ Rope.Cat[s, Rope.FromChar[LOOPHOLE[Basics.BITSHIFT[j, -8], CHAR]]]; }; flg _ NOT flg; ENDLOOP; }; FileOpened: PROC [name: Rope.ROPE] RETURNS [fileWasOpened: BOOLEAN] = { IF Rope.IsEmpty[name] THEN name _ TerminalIO.RequestRope["Input file > "]; fileName _ CDIO.MakeName[name, "chip"]; chipfile _ FS.StreamOpen[fileName ! FS.Error => IF error.group#bug THEN { TerminalIO.PutRopes[fileName, " not opened: ", error.explanation]; TerminalIO.PutRope["\n"]; GOTO FileName }]; TerminalIO.PutRopes["File being read is ", fileName, "\n"]; fileWasOpened _ TRUE; EXITS FileName => {fileWasOpened _ FALSE}; }; signal: SIGNAL = CODE; ReadChip: PROC = { ENABLE { FileFormat => { TerminalIO.PutRope["\n**File-Format error [proceed does not clobber other designs]\n"]; SIGNAL signal; GOTO IOError; }; IO.EndOfStream => { TerminalIO.PutRope["\n**end of stream error [proceed does not clobber other designs]\n"]; SIGNAL signal; GOTO IOError; }; IO.Error => { TerminalIO.PutRope["\n**io error[proceed does not clobber other designs]\n"]; SIGNAL signal; GOTO IOError; }; }; i, j, k, ver, cCnt, depht: INTEGER; leng: INT; ss: Rope.ROPE; cob: CD.Object; cellSpecific: CD.CellSpecific; errs _ 0; i _ InWord[]; IF i # LOOPHOLE[codeWordForDataFile, INTEGER] AND NOT TerminalIO.Confirm["doesn't look like a .chip file -- should program continue?"] THEN RETURN; ver _ InWord[]; cCnt _ InWord[]; IF cCnt > maxCellNum THEN CDSequencer.Quit["Too many different kinds of cells in design...aborting read\n"]; IF ver < 3 THEN CDSequencer.Quit[" Version number too low...aborting read\n"]; IF ver>8 THEN CDSequencer.Quit[" new chipmonk version unknown to chipndale...aborting read\n"]; FOR j IN [0..cCnt] DO cellNameA[j] _ CDCells.CreateEmptyCell[]; ENDLOOP; TerminalIO.PutRope["Starting cell directory\n"]; FOR k IN [1..cCnt] DO j _ InWord[]; cob _ cellNameA[j]; ss _ InString[]; --cob.size.x--[] _ Lambda[InWord[]]; --cob.size.y--[] _ Lambda[InWord[]]; [] _ InWord[]; -- this is some count in chipmonk ?? cellSpecific _ NARROW[cob.specific, CD.CellSpecific]; [cellSpecific.contents, leng] _ InList[ver]; IF NOT Rope.IsEmpty[ss] THEN cellSpecific.name _ ss ELSE cellSpecific.name _ NewCellName[k]; [] _ CDDirectory.Include[design: design, object: cob, fiddle: TRUE]; IF CDCells.IsEmpty[cob] THEN { TerminalIO.PutRopes["** empty cell ", cellSpecific.name, "\n"]; cellSpecific.contents _ LIST[CDInstances.NewInst[BadObject[]]]; }; [] _ CDCells.ResizeCell[NIL, cob]; CDCells.SetSimplificationTreshhold[cob]; ENDLOOP; TerminalIO.PutRope["finished cell directory\n"]; depht _ IF ver<7 THEN 0 ELSE InWord[]; IF depht>0 THEN { TerminalIO.PutRope["***design was pushed in; not read in correctly\n"]; RETURN; }; IF ver>=7 THEN { fileChangeCode: INTEGER = InWord[]; }; design.actual.first.specific.contents _ InList[ver].list; design.name _ fileName; TerminalIO.PutRope["Finished reading chip\n"]; IF errs>0 THEN { TerminalIO.PutF1["%g unknown objects\n", IO.int[errs]]; errs _ 0; }; IO.Close[chipfile]; EXITS IOError => {TerminalIO.PutRope[" proceed; discard this design\n"];}; }; -- ReadChip CommandReadChip: ENTRY Commander.CommandProc = { ENABLE { TerminalIO.UserAbort => GOTO UserAbrt; UNWIND => NULL; }; list: LIST OF Rope.ROPE; length: NAT; name: Rope.ROPE; [list, length] _ CommandTool.ParseToList[cmd]; IF length=0 THEN name _ NIL ELSE IF length=1 THEN name _ list.first ELSE { result _ $Failure; msg _ "unknown arguments"; RETURN }; design_ CDOps.CreateDesign[CMos.cmos]; IF FileOpened[name] THEN { ReadChip[]; CDOps.DeselectAll[design: design, setSelection: TRUE]; TransformSelected[design, rotate180X]; CDOps.DeselectAll[design]; [] _ CDViewer.CreateViewer[design]; }; EXITS UserAbrt => {TerminalIO.PutRope["read aborted\n"]}; }; TestRead: ENTRY Commander.CommandProc = { ENABLE { IO.EndOfStream => GOTO IOEnd; UNWIND => NULL; }; w: CARDINAL; IF FileOpened[NIL] THEN { TerminalIO.PutRope["--startfile--\n"]; DO w _ LOOPHOLE[InWord[]]; TerminalIO.PutF1["%7b\n", IO.card[w]]; ENDLOOP; }; EXITS IOEnd => {TerminalIO.PutRope["--endfile--\n"]}; }; CDCommandOps.RegisterWithMenu[$IOMenu, "chipmonk-output", "converts to old Chipmonk format", $ChipmonkOutput]; Commander.Register["///Commands/CDTestRead", TestRead, "ChipNDale test feature: Reads file and display it on Terminal"]; Commander.Register["///Commands/CDReadCMCMos", CommandReadChip, "Converts old cmos Chipmonk file to ChipNDale CMosA"]; END. pChipmonkCmosRead.mesa Copyright c 1983, 1987 by Xerox Corporation. All rights reserved. Last Edited by: Kimr, October 26, 1983 9:39 am Last Edited by: Christian Jacobi, October 25, 1983 12:48 pm Last edited by: Christian Jacobi, January 29, 1987 4:49:35 pm PST -- global constants --In Chipndale we must make no assumptions about the --value of lambda. It can (and does) change from time to time; --but we know that chipndales lambda is >= 2 -- global vars obj _ CMosCMTransistors.CreatePullUp[w: Lambda[w], l: Lambda[l], wExt: Lambda[we], lExt: Lambda[le], difLev: lev]; --if you are debugging here: inspect "ec" Κl˜code•StartOfExpansionl[r1: ROPE _ NIL, r2: ROPE _ NIL, r3: ROPE _ NIL, r4: ROPE _ NIL, r5: ROPE _ NIL, r6: ROPE _ NIL]šœ™Kšœ Οmœ7™BKšœ.™.Kšœ;™;K™A—K˜šΟk ˜ Kšœžœ ˜Kšœžœžœžœ˜ Kšžœ˜Kšœ ˜ Kšœ ˜ Kšœ žœ˜!Kšœ˜Kšœ ˜ Kšžœžœ ˜Kšœ žœ ˜Kšœ˜Kšœ ˜ Kšœžœ˜K˜K˜ K˜Kšœ ˜ Kšœ žœ˜(K˜ Kšžœ˜Kšžœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœžœ ˜—K˜šΟnœžœž˜KšžœHžœhžœžœH˜‰Kšžœ˜—Kšž˜K˜š Ÿœžœ žœžœžœ˜hKšœžœžœ'žœ˜eKšœžœA˜HKšžœžœžœžœ˜Kšœ'˜'Kšžœžœ'˜GKšœ˜Kšœ˜Jšœ ˜ JšœE˜EKšœ#˜#Jšœ@˜@š žœžœžœžœž˜3KšœžœM˜^KšœH˜HKšžœ˜—Kšœ˜Kšœa˜aKšœ˜K˜—šœ™K˜—šœžœ˜ KšΟc5™5Kš ?™?Kš ,™,—Kšœžœ ˜1K˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœžœ˜Kšœ žœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜K˜Kšœ žœ˜Kšœ žœ˜Kšœžœ ˜)Kšœ žœžœ˜Kšœžœžœ˜Kšœžœ˜šœ žœžœ ˜1Kšœ˜Kšœ˜Kšœ˜—šœ žœžœžœ ˜1Kšœ+˜+Kšœ1˜1Kšœ)˜)Kšœ ˜—šœ žœ žœžœ ˜*Kšœ)˜)Kšœžœ   œ˜8Kšœ1˜1Kšœ(žœ   ˜?Kšœ˜K˜—Kšœ™Kšœ žœ+˜9K˜Kšœžœ˜š œ žœžœžœžœ˜2Kš œžœžœžœžœ ˜*—š œ žœžœžœžœ˜0Kš œžœžœžœžœ˜(—K˜KšœR˜RK˜Kšœ žœžœ˜K˜K˜Kšœžœ˜ K˜šŸ œžœ˜Kšœ˜Kšœ˜Kšœ˜—K˜š Ÿ œžœžœžœžœ ˜DKšžœžœ ˜0Kšœ˜—K˜šŸœžœžœžœ˜"Kš œ žœžœžœžœ˜>Kš œ žœžœžœžœ˜=Kšžœžœžœ˜7Kšœ˜K˜—Kšœ žœžœ˜K˜š Ÿœž œžœžœžœ žœ˜9Kšžœ˜Kšœ˜K˜—š Ÿ œžœžœžœžœ˜:Kšœžœ ˜Kš žœžœžœžœžœ žœ ˜OKšžœžœ ˜Kšœ˜K˜—š Ÿœžœžœžœžœ žœ˜8Kšžœžœžœžœ˜0Kšžœžœ ˜Kšœ˜—K˜š Ÿœžœžœžœ žœ˜.Kšžœ˜Kšœ˜K˜—š Ÿ œžœ žœžœžœ˜DKšœ žœžœ ˜/Kšœ˜—K˜šŸœžœ žœžœžœžœžœ žœžœ˜cKšœžœ˜$Kšœžœ˜ Kšœžœ˜Kšœžœ˜K˜šžœ žœž˜Kšœ0˜0—Kšœ ˜ šžœž˜ šœ ˜ Kšœ ˜Kšœ˜Kšœ˜—šœ˜Kšœžœ ˜Kšœ ˜ Kšœ ˜ Kšœžœ ˜š žœ žœžœžœžœžœ˜KKšœ˜—šžœžœžœžœžœ žœžœ˜NKšœ ˜3—š žœžœžœžœžœ˜:Kšžœ žœ  ˜+Kšœ˜—Kšœ žœžœ˜1Kšœ žœ ˜Kš œžœžœžœ žœ ˜Cšžœžœž˜šžœžœžœ˜4Kšœžœ2˜žœ˜L—Kšœ˜—šœ ˜ Kšœžœ˜ Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ˜Kšžœžœ˜'šžœž˜ Kšœ4˜4Kšœ5˜5Kšžœžœ˜—Kšžœ žœžœ˜;Kšœ6˜6Kšœ˜—šœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšžœžœ˜'šžœž˜ Kšœ4˜4Kšœ5˜5Kšžœžœ˜—Kšœ8˜8Kšœ˜—šœ ˜ Kšœ˜Kšœ,˜,Kšœ˜—šœ˜Kšœžœ˜ Kšœžœ˜ Kšœžœ˜Kšœžœ ˜Kšœ žœ˜&Kšœžœ˜%Kšœžœ˜%Kšžœžœ6˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜Kšœ N˜Q—Kšœ˜—šœ ˜ Kšœžœ ˜'Kšœ žœ   ˜$Kšœ žœ   ˜$Kšœžœ˜!Kšœžœ˜!Kšœžœ ˜Kšœžœ˜)Kšœs˜sKšœ˜—šžœ˜ Kšœ˜Kšœ+˜+Kšœ˜——Kšœ  ˜—K˜šŸœžœžœžœžœžœ žœ˜QKšœ žœžœ˜Kšœ žœžœ˜Kšœ žœ˜Kšœžœ ˜Kšœžœ˜Kšœ žœ ˜Kšœ žœ ˜Kšžœ žœžœ$˜?Kšœ˜šžœžœžœž˜&Kšœ˜Kšœ˜Kšœ˜Kšœ(˜(šžœžœžœ˜Kšœ˜Kšœ"˜"K˜—Kšœ#˜#Kšœ9˜9Kšœžœ ˜šžœ žœžœ˜KšœG˜G—šžœ ž˜Kšž˜Kšœ žœ ˜šžœ žœžœž˜)Kšœ ˜ Kšžœ˜—Kšžœ˜—Kšžœ˜—Kšžœ žœžœ"˜žœ˜Dšžœžœ˜Kšœ?˜?Kšœžœ#˜?Kšœ˜—Kšœžœ˜"Kšœ(˜(Kšžœ˜—Kšœ0˜0Kšœžœžœžœ ˜&šžœ žœ˜KšœG˜GKšžœ˜Kšœ˜—šžœžœ˜Kšœžœ ˜#K˜—Kšœ9˜9Kšœ˜Kšœ.˜.šžœžœ˜Kšœ)žœ ˜7Kšœ ˜ Kšœ˜—Kšžœ˜KšžœE˜JKšœ  ˜K˜—šΟbœžœ˜0šžœ˜ Kšœžœ ˜&Kšžœžœ˜K˜—Kšœžœžœžœ˜Kšœžœ˜ Kšœ žœ˜Kšœ.˜.Kšžœ žœž˜Kšžœžœ žœ˜'šžœ˜Kšœ˜Kšœ˜Kšž˜K˜—Kšœ&˜&šžœžœ˜Kšœ ˜ Kšœ0žœ˜6Kšœ&˜&Kšœ˜Kšœ#˜#Kšœ˜—šž˜Kšœ3˜3—Kšœ˜K˜—šΠbnœžœ˜)šžœ˜ Kšžœžœ˜Kšžœžœ˜Kšœ˜—Kšœžœ˜ šžœ žœžœ˜Kšœ&˜&šž˜Kšœžœ ˜Kšœžœ ˜&Kšžœ˜—Kšœ˜—Kšžœ0˜5Kšœ˜K˜—Kšœn˜nKšœx˜xKšœv˜vKšžœ˜K˜K˜K˜—…—:κRΖ