From lattner at cs.uiuc.edu Mon Apr 18 00:26:37 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 00:26:37 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/CondPropagate.cpp Message-ID: <200504180526.j3I5Qb6E026933@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: CondPropagate.cpp updated: 1.1 -> 1.2 --- Log message: silence a bogus warning --- Diffs of the changes: (+1 -1) CondPropagate.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Transforms/Scalar/CondPropagate.cpp diff -u llvm/lib/Transforms/Scalar/CondPropagate.cpp:1.1 llvm/lib/Transforms/Scalar/CondPropagate.cpp:1.2 --- llvm/lib/Transforms/Scalar/CondPropagate.cpp:1.1 Fri Apr 15 14:28:32 2005 +++ llvm/lib/Transforms/Scalar/CondPropagate.cpp Mon Apr 18 00:26:21 2005 @@ -83,7 +83,7 @@ // See if we can fold any PHI nodes in this block now. // FIXME: This would not be required if removePredecessor did this for us!! PHINode *PN; - for (BasicBlock::iterator I = BB->begin(); PN = dyn_cast(I++); ) + for (BasicBlock::iterator I = BB->begin(); (PN = dyn_cast(I++)); ) if (Value *PNV = hasConstantValue(PN)) if (!isa(PNV)) { PN->replaceAllUsesWith(PNV); From natebegeman at mac.com Mon Apr 18 02:48:21 2005 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 18 Apr 2005 02:48:21 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Message-ID: <200504180748.CAA04943@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelPattern.cpp updated: 1.74 -> 1.75 --- Log message: Next round of PPC CR optimizations. For the following code: int %bar(float %a, float %b, float %c, float %d) { entry: %tmp.1 = setlt float %a, %d %tmp.2 = setlt float %b, %d %or = or bool %tmp.1, %tmp.2 %tmp.3 = setgt float %c, %d %tmp.4 = or bool %or, %tmp.3 %tmp.5 = and bool %tmp.4, true %retval = cast bool %tmp.5 to int ret int %retval } We now emit: _bar: .LBB_bar_0: ; entry fcmpu cr0, f1, f4 fcmpu cr1, f2, f4 cror 0, 0, 4 fcmpu cr1, f3, f4 cror 28, 0, 5 mfcr r2 rlwinm r3, r2, 29, 31, 31 blr Instead of: _bar: .LBB_bar_0: ; entry fcmpu cr7, f1, f4 mfcr r2 rlwinm r2, r2, 29, 31, 31 fcmpu cr7, f2, f4 mfcr r3 rlwinm r3, r3, 29, 31, 31 or r2, r2, r3 fcmpu cr7, f3, f4 mfcr r3 rlwinm r3, r3, 30, 31, 31 or r3, r2, r3 blr --- Diffs of the changes: (+95 -62) PPC32ISelPattern.cpp | 157 ++++++++++++++++++++++++++++++--------------------- 1 files changed, 95 insertions(+), 62 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.74 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.75 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.74 Sun Apr 17 21:43:24 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Mon Apr 18 02:48:09 2005 @@ -524,9 +524,11 @@ unsigned getGlobalBaseReg(); unsigned getConstDouble(double floatVal, unsigned Result); + void MoveCRtoGPR(unsigned CCReg, bool Inv, unsigned Idx, unsigned Result); bool SelectBitfieldInsert(SDOperand OR, unsigned Result); unsigned FoldIfWideZeroExtend(SDOperand N); - unsigned SelectCC(SDOperand CC, unsigned &Opc); + unsigned SelectCC(SDOperand CC, unsigned &Opc, bool &Inv, unsigned &Idx); + unsigned SelectCCExpr(SDOperand N, unsigned& Opc, bool &Inv, unsigned &Idx); unsigned SelectExpr(SDOperand N, bool Recording=false); unsigned SelectExprFP(SDOperand N, unsigned Result); void Select(SDOperand N); @@ -727,22 +729,6 @@ return 0; } -/// getCRIdxForBCC - Return the index of the condition register field -/// associated with the PowerPC branch instruction, and whether or not the field -/// is treated as inverted. That is, lt = 0; ge = 0 inverted. -static unsigned getCRIdxForBCC(unsigned Condition, bool& Inv) { - switch (Condition) { - default: assert(0 && "Unknown condition!"); abort(); - case PPC::BLT: Inv = false; return 29; // 28 -> 31, rol 29 - case PPC::BGE: Inv = true; return 29; // 28 -> 31, rol 29 - case PPC::BGT: Inv = false; return 30; // 29 -> 31, rol 30 - case PPC::BLE: Inv = true; return 30; // 29 -> 31, rol 30 - case PPC::BEQ: Inv = false; return 31; // 30 -> 31, rol 31 - case PPC::BNE: Inv = true; return 31; // 30 -> 31, rol 31 - } - return 0; -} - /// IndexedOpForOp - Return the indexed variant for each of the PowerPC load /// and store immediate instructions. static unsigned IndexedOpForOp(unsigned Opcode) { @@ -934,6 +920,23 @@ return Result; } +/// MoveCRtoGPR - Move CCReg[Idx] to the least significant bit of Result. If +/// Inv is true, then invert the result. +void ISel::MoveCRtoGPR(unsigned CCReg, bool Inv, unsigned Idx, unsigned Result){ + unsigned IntCR = MakeReg(MVT::i32); + BuildMI(BB, PPC::MCRF, 1, PPC::CR7).addReg(CCReg); + BuildMI(BB, PPC::MFCR, 1, IntCR).addReg(PPC::CR7); + if (Inv) { + unsigned Tmp1 = MakeReg(MVT::i32); + BuildMI(BB, PPC::RLWINM, 4, Tmp1).addReg(IntCR).addImm(32-(3-Idx)) + .addImm(31).addImm(31); + BuildMI(BB, PPC::XORI, 2, Result).addReg(Tmp1).addImm(1); + } else { + BuildMI(BB, PPC::RLWINM, 4, Result).addReg(IntCR).addImm(32-(3-Idx)) + .addImm(31).addImm(31); + } +} + /// SelectBitfieldInsert - turn an or of two masked values into /// the rotate left word immediate then mask insert (rlwimi) instruction. /// Returns true on success, false if the caller still needs to select OR. @@ -1033,7 +1036,7 @@ return SelectExpr(N); } -unsigned ISel::SelectCC(SDOperand CC, unsigned &Opc) { +unsigned ISel::SelectCC(SDOperand CC, unsigned& Opc, bool &Inv, unsigned& Idx) { unsigned Result, Tmp1, Tmp2; bool AlreadySelected = false; static const unsigned CompareOpcodes[] = @@ -1047,6 +1050,7 @@ if (SetCCSDNode* SetCC = dyn_cast(CC.Val)) { bool U; Opc = getBCCForSetCC(SetCC->getCondition(), U); + Idx = getCRIdxForSetCC(SetCC->getCondition(), Inv); // Pass the optional argument U to getImmediateForOpcode for SETCC, // so that it knows whether the SETCC immediate range is signed or not. @@ -1083,38 +1087,58 @@ } } else { if (PPCCRopts) - if (CC.getOpcode() == ISD::AND || CC.getOpcode() == ISD::OR) - if (CC.getOperand(0).Val->hasOneUse() && - CC.getOperand(1).Val->hasOneUse()) { - SetCCSDNode* Op0CC = dyn_cast(CC.getOperand(0).Val); - SetCCSDNode* Op1CC = dyn_cast(CC.getOperand(1).Val); - if (Op0CC && Op1CC) { - ++MultiBranch; - bool Inv0, Inv1; - unsigned Opc1; - unsigned Idx0 = getCRIdxForSetCC(Op0CC->getCondition(), Inv0); - unsigned Idx1 = getCRIdxForSetCC(Op1CC->getCondition(), Inv1); - unsigned CROpc = getCROpForSetCC(CC.getOpcode(), Inv0, Inv1); - Tmp1 = SelectCC(CC.getOperand(0), Opc); - Tmp2 = SelectCC(CC.getOperand(1), Opc1); - if (Inv0 && !Inv1) { - std::swap(Tmp1, Tmp2); - std::swap(Idx0, Idx1); - Opc = Opc1; - } - if (Inv0 && Inv1) Opc = PPC32InstrInfo::invertPPCBranchOpcode(Opc); - BuildMI(BB, CROpc, 5, Result).addImm(Idx0).addReg(Tmp1).addImm(Idx0) - .addReg(Tmp2).addImm(Idx1); - return Result; - } - } + return SelectCCExpr(CC, Opc, Inv, Idx); + // If this isn't a SetCC, then select the value and compare it against zero, + // treating it as if it were a boolean. Opc = PPC::BNE; + Idx = getCRIdxForSetCC(ISD::SETNE, Inv); Tmp1 = SelectExpr(CC); BuildMI(BB, PPC::CMPLWI, 2, Result).addReg(Tmp1).addImm(0); } return Result; } +unsigned ISel::SelectCCExpr(SDOperand N, unsigned& Opc, bool &Inv, + unsigned &Idx) { + bool Inv0, Inv1; + unsigned Idx0, Idx1, CROpc, Opc1, Tmp1, Tmp2; + + // Allocate a condition register for this expression + unsigned Result = RegMap->createVirtualRegister(PPC32::CRRCRegisterClass); + + // Check for the operations we support: + switch(N.getOpcode()) { + default: + Opc = PPC::BNE; + Idx = getCRIdxForSetCC(ISD::SETNE, Inv); + Tmp1 = SelectExpr(N); + BuildMI(BB, PPC::CMPLWI, 2, Result).addReg(Tmp1).addImm(0); + break; + case ISD::OR: + case ISD::AND: + ++MultiBranch; + Tmp1 = SelectCCExpr(N.getOperand(0), Opc, Inv0, Idx0); + Tmp2 = SelectCCExpr(N.getOperand(1), Opc1, Inv1, Idx1); + CROpc = getCROpForSetCC(N.getOpcode(), Inv0, Inv1); + if (Inv0 && !Inv1) { + std::swap(Tmp1, Tmp2); + std::swap(Idx0, Idx1); + Opc = Opc1; + } + if (Inv0 && Inv1) Opc = PPC32InstrInfo::invertPPCBranchOpcode(Opc); + BuildMI(BB, CROpc, 5, Result).addImm(Idx0).addReg(Tmp1).addImm(Idx0) + .addReg(Tmp2).addImm(Idx1); + Inv = false; + Idx = Idx0; + break; + case ISD::SETCC: + Tmp1 = SelectCC(N, Opc, Inv, Idx); + Result = Tmp1; + break; + } + return Result; +} + /// Check to see if the load is a constant offset from a base register bool ISel::SelectAddr(SDOperand N, unsigned& Reg, int& offset) { @@ -1138,9 +1162,10 @@ MachineBasicBlock *Dest = cast(N.getOperand(2))->getBasicBlock(); - unsigned Opc, CCReg; + bool Inv; + unsigned Opc, CCReg, Idx; Select(N.getOperand(0)); //chain - CCReg = SelectCC(N.getOperand(1), Opc); + CCReg = SelectCC(N.getOperand(1), Opc, Inv, Idx); // Iterate to the next basic block, unless we're already at the end of the ilist::iterator It = BB, E = BB->getParent()->end(); @@ -1258,9 +1283,10 @@ return 0; } + bool Inv; unsigned TrueValue = SelectExpr(N.getOperand(1)); //Use if TRUE unsigned FalseValue = SelectExpr(N.getOperand(2)); //Use if FALSE - unsigned CCReg = SelectCC(N.getOperand(0), Opc); + unsigned CCReg = SelectCC(N.getOperand(0), Opc, Inv, Tmp3); // Create an iterator with which to insert the MBB for copying the false // value and the MBB to hold the PHI instruction for this SetCC. @@ -1796,6 +1822,15 @@ return Result; case ISD::AND: + if (PPCCRopts) { + if (N.getOperand(0).getOpcode() == ISD::SETCC || + N.getOperand(1).getOpcode() == ISD::SETCC) { + bool Inv; + Tmp1 = SelectCCExpr(N, Opc, Inv, Tmp2); + MoveCRtoGPR(Tmp1, Inv, Tmp2, Result); + return Result; + } + } Tmp1 = SelectExpr(N.getOperand(0)); // FIXME: should add check in getImmediateForOpcode to return a value // indicating the immediate is a run of set bits so we can emit a bitfield @@ -1827,6 +1862,15 @@ case ISD::OR: if (SelectBitfieldInsert(N, Result)) return Result; + if (PPCCRopts) { + if (N.getOperand(0).getOpcode() == ISD::SETCC || + N.getOperand(1).getOpcode() == ISD::SETCC) { + bool Inv; + Tmp1 = SelectCCExpr(N, Opc, Inv, Tmp2); + MoveCRtoGPR(Tmp1, Inv, Tmp2, Result); + return Result; + } + } Tmp1 = SelectExpr(N.getOperand(0)); switch(getImmediateForOpcode(N.getOperand(1), opcode, Tmp2)) { default: assert(0 && "unhandled result code"); @@ -2178,30 +2222,19 @@ } } - bool Inv = false; - unsigned CCReg = SelectCC(N, Opc); - unsigned IntCR = MakeReg(MVT::i32); - unsigned ShAmt = getCRIdxForBCC(Opc, Inv); - BuildMI(BB, PPC::MCRF, 1, PPC::CR7).addReg(CCReg); - BuildMI(BB, PPC::MFCR, 1, IntCR).addReg(PPC::CR7); - if (Inv) { - Tmp1 = MakeReg(MVT::i32); - BuildMI(BB, PPC::RLWINM, 4, Tmp1).addReg(IntCR).addImm(ShAmt) - .addImm(31).addImm(31); - BuildMI(BB, PPC::XORI, 2, Result).addReg(Tmp1).addImm(1); - } else { - BuildMI(BB, PPC::RLWINM, 4, Result).addReg(IntCR).addImm(ShAmt) - .addImm(31).addImm(31); - } + bool Inv; + unsigned CCReg = SelectCC(N, Opc, Inv, Tmp2); + MoveCRtoGPR(CCReg, Inv, Tmp2, Result); return Result; } assert(0 && "Is this legal?"); return 0; case ISD::SELECT: { + bool Inv; unsigned TrueValue = SelectExpr(N.getOperand(1)); //Use if TRUE unsigned FalseValue = SelectExpr(N.getOperand(2)); //Use if FALSE - unsigned CCReg = SelectCC(N.getOperand(0), Opc); + unsigned CCReg = SelectCC(N.getOperand(0), Opc, Inv, Tmp3); // Create an iterator with which to insert the MBB for copying the false // value and the MBB to hold the PHI instruction for this SetCC. From brukman at cs.uiuc.edu Mon Apr 18 13:33:52 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:33:52 -0500 Subject: [llvm-commits] CVS: llvm-tv/tools/llvm-tv/TVFrame.cpp Message-ID: <200504181833.NAA11018@zion.cs.uiuc.edu> Changes in directory llvm-tv/tools/llvm-tv: TVFrame.cpp updated: 1.46 -> 1.47 --- Log message: HTML viewer is based on out-dated (hackish) technology. Nuke. --- Diffs of the changes: (+1 -11) TVFrame.cpp | 12 +----------- 1 files changed, 1 insertion(+), 11 deletions(-) Index: llvm-tv/tools/llvm-tv/TVFrame.cpp diff -u llvm-tv/tools/llvm-tv/TVFrame.cpp:1.46 llvm-tv/tools/llvm-tv/TVFrame.cpp:1.47 --- llvm-tv/tools/llvm-tv/TVFrame.cpp:1.46 Wed May 12 22:40:27 2004 +++ llvm-tv/tools/llvm-tv/TVFrame.cpp Mon Apr 18 13:33:41 2005 @@ -11,12 +11,12 @@ #include "PictureFrame.h" #include "TVApplication.h" #include "TVFrame.h" -#include "TVHtmlWindow.h" #include "TVTextCtrl.h" #include "TVTreeItem.h" #include "llvm-tv/Config.h" #include #include +#include #include /// TreeCtrl constructor - creates the root and adds it to the tree @@ -86,15 +86,6 @@ myTextCtrl->SetInsertionPoint (0); } -void TVHtmlWindow::displayItem (TVTreeItemData *item) { - std::ostringstream Out; - item->printHTML (Out); - myHtmlWindow->Hide (); - myHtmlWindow->SetPage (wxString ("")); - myHtmlWindow->AppendToPage (wxString (Out.str ().c_str ())); - myHtmlWindow->Show (); -} - ///==---------------------------------------------------------------------==/// /// updateDisplayedItem - Updates right-hand pane with a view of the item that @@ -180,7 +171,6 @@ // Create right-hand pane's display widget and stick it in a notebook control. notebook = new TVNotebook (splitterWindow); notebook->AddItemDisplayer (new TVTextCtrl (notebook, Explanation)); - notebook->AddItemDisplayer (new TVHtmlWindow (notebook, Explanation)); notebook->AddItemDisplayer (new TDGraphDrawer (notebook)); notebook->AddItemDisplayer (new BUGraphDrawer (notebook)); notebook->AddItemDisplayer (new LocalGraphDrawer (notebook)); From brukman at cs.uiuc.edu Mon Apr 18 13:34:59 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:34:59 -0500 Subject: [llvm-commits] CVS: llvm-tv/tools/llvm-tv/HTMLMarkup.cpp HTMLMarkup.h HTMLPrinter.cpp HTMLPrinter.h HTMLPrinterUtils.cpp HTMLPrinterUtils.h Message-ID: <200504181834.NAA11055@zion.cs.uiuc.edu> Changes in directory llvm-tv/tools/llvm-tv: HTMLMarkup.cpp (r1.1) removed HTMLMarkup.h (r1.1) removed HTMLPrinter.cpp (r1.3) removed HTMLPrinter.h (r1.2) removed HTMLPrinterUtils.cpp (r1.4) removed HTMLPrinterUtils.h (r1.1) removed --- Log message: HTML writer no longer works because it depends on SlotCalculator, which is gone. --- Diffs of the changes: (+0 -0) 0 files changed From brukman at cs.uiuc.edu Mon Apr 18 13:35:18 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:35:18 -0500 Subject: [llvm-commits] CVS: llvm-tv/tools/llvm-tv/GraphDrawer.cpp Message-ID: <200504181835.NAA11070@zion.cs.uiuc.edu> Changes in directory llvm-tv/tools/llvm-tv: GraphDrawer.cpp updated: 1.6 -> 1.7 --- Log message: Use the sys::Path interface instead of the old Support routines --- Diffs of the changes: (+2 -1) GraphDrawer.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm-tv/tools/llvm-tv/GraphDrawer.cpp diff -u llvm-tv/tools/llvm-tv/GraphDrawer.cpp:1.6 llvm-tv/tools/llvm-tv/GraphDrawer.cpp:1.7 --- llvm-tv/tools/llvm-tv/GraphDrawer.cpp:1.6 Tue Oct 5 13:44:44 2004 +++ llvm-tv/tools/llvm-tv/GraphDrawer.cpp Mon Apr 18 13:35:07 2005 @@ -13,7 +13,8 @@ extern void FatalErrorBox (const std::string msg); wxImage *GraphDrawer::buildwxImageFromDotFile (const std::string filename) { - if (!FileOpenable (filename)) + sys::Path File (filename); + if (! File.readable ()) FatalErrorBox ("buildwxImageFromDotFile() got passed a bogus filename: '" + filename + "'"); From brukman at cs.uiuc.edu Mon Apr 18 13:38:29 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:38:29 -0500 Subject: [llvm-commits] CVS: llvm-tv/tools/llvm-tv/TVTreeItem.cpp TVTreeItem.h Message-ID: <200504181838.NAA11500@zion.cs.uiuc.edu> Changes in directory llvm-tv/tools/llvm-tv: TVTreeItem.cpp updated: 1.23 -> 1.24 TVTreeItem.h updated: 1.13 -> 1.14 --- Log message: HTML printer is no longer part of LLVM-TV --- Diffs of the changes: (+0 -25) TVTreeItem.cpp | 22 ---------------------- TVTreeItem.h | 3 --- 2 files changed, 25 deletions(-) Index: llvm-tv/tools/llvm-tv/TVTreeItem.cpp diff -u llvm-tv/tools/llvm-tv/TVTreeItem.cpp:1.23 llvm-tv/tools/llvm-tv/TVTreeItem.cpp:1.24 --- llvm-tv/tools/llvm-tv/TVTreeItem.cpp:1.23 Thu Jun 10 08:21:25 2004 +++ llvm-tv/tools/llvm-tv/TVTreeItem.cpp Mon Apr 18 13:38:18 2005 @@ -1,5 +1,3 @@ -#include "HTMLMarkup.h" -#include "HTMLPrinter.h" #include "TVTreeItem.h" #include "llvm/Module.h" using namespace llvm; @@ -17,30 +15,10 @@ myModule->print(os); } -void TVTreeModuleItem::printHTML(std::ostream &os) { - if (myModule) { - CachedWriter cw(myModule, os); - cw << CachedWriter::SymTypeOn; - HTMLMarkup *Simple = createSimpleHTMLMarkup(os); - HTMLPrinter HP(cw, os, *Simple); - HP.visit(*myModule); - } -} - void TVTreeFunctionItem::print(std::ostream &os) { myFunc->print(os); } -void TVTreeFunctionItem::printHTML(std::ostream &os) { - if (myFunc) { - CachedWriter cw(myFunc->getParent(), os); - cw << CachedWriter::SymTypeOn; - HTMLMarkup *Simple = createSimpleHTMLMarkup(os); - HTMLPrinter HP(cw, os, *Simple); - HP.visit(*myFunc); - } -} - std::string TVTreeFunctionItem::getTitle () { return myFunc->getName () + "()"; } Index: llvm-tv/tools/llvm-tv/TVTreeItem.h diff -u llvm-tv/tools/llvm-tv/TVTreeItem.h:1.13 llvm-tv/tools/llvm-tv/TVTreeItem.h:1.14 --- llvm-tv/tools/llvm-tv/TVTreeItem.h:1.13 Thu Jun 10 08:21:25 2004 +++ llvm-tv/tools/llvm-tv/TVTreeItem.h Mon Apr 18 13:38:18 2005 @@ -28,7 +28,6 @@ virtual void print(std::ostream&) { } virtual wxImage *graphOn(GraphDrawer *grapher) { return 0; } virtual void viewCodeOn(TVCodeViewer *viewer) { } - virtual void printHTML(std::ostream &os) { } virtual std::string getTitle () { return "an untitled object"; } virtual std::string dsGraphName () { return "graph of " + getTitle (); } @@ -59,7 +58,6 @@ : TVTreeItemData(desc), myModule(mod) {} void print(std::ostream &out); - void printHTML(std::ostream &os); wxImage *graphOn(GraphDrawer *grapher) { return grapher->drawModuleGraph (myModule); } @@ -80,7 +78,6 @@ : TVTreeItemData(desc), myFunc(func) {} void print(std::ostream &out); - void printHTML(std::ostream &os); wxImage *graphOn(GraphDrawer *grapher) { return grapher->drawFunctionGraph (myFunc); } From brukman at cs.uiuc.edu Mon Apr 18 13:38:53 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:38:53 -0500 Subject: [llvm-commits] CVS: llvm-tv/tools/llvm-tv/Makefile Message-ID: <200504181838.NAA11520@zion.cs.uiuc.edu> Changes in directory llvm-tv/tools/llvm-tv: Makefile updated: 1.18 -> 1.19 --- Log message: LLVM library and directory names have changed --- Diffs of the changes: (+13 -14) Makefile | 27 +++++++++++++-------------- 1 files changed, 13 insertions(+), 14 deletions(-) Index: llvm-tv/tools/llvm-tv/Makefile diff -u llvm-tv/tools/llvm-tv/Makefile:1.18 llvm-tv/tools/llvm-tv/Makefile:1.19 --- llvm-tv/tools/llvm-tv/Makefile:1.18 Tue Oct 5 16:37:20 2004 +++ llvm-tv/tools/llvm-tv/Makefile Mon Apr 18 13:38:42 2005 @@ -1,32 +1,31 @@ LEVEL = ../.. TOOLNAME = llvm-tv -LLVMLIBS = analysis.a bcreader bcwriter datastructure ipa.a support.a \ - target.a vmcore transformutils.a +LLVMLIBS = LLVMAnalysis.a LLVMBCReader LLVMBCWriter LLVMDataStructure \ + LLVMipa.a LLVMSupport.a LLVMTarget.a LLVMCore LLVMTransformUtils.a \ + LLVMSystem.a LLVMbzip2 # note: delete when FileUtils is assimilated into libsupport USEDLIBS = snapshot -CPPFLAGS = $(shell wx-config --cflags) +CPPFLAGS = $(shell wx-config --cflags) -DNDEBUG TOOLLINKOPTSB = $(shell wx-config --libs) WXDIR = $(shell wx-config --prefix) WXLIB = $(WXDIR)/lib -ifdef NOHTML -CPPFLAGS += -DNOHTML -endif - include $(LEVEL)/Makefile.common -all :: $(DESTTOOLCURRENT)/llvm-tv.exe \ - $(DESTTOOLCURRENT)/opt-snap +all :: $(LLVMToolDir)/llvm-tv.exe \ + $(LLVMToolDir)/opt-snap + +LLVMTV = $(PROJ_OBJ_ROOT)/Debug/bin/llvm-tv -$(DESTTOOLCURRENT)/llvm-tv.exe: Makefile - echo exec env LD_LIBRARY_PATH=$(WXLIB):\$$LD_LIBRARY_PATH llvm-tv > $@ +$(LLVMToolDir)/llvm-tv.exe: Makefile + echo exec env LD_LIBRARY_PATH=$(WXLIB):\$$LD_LIBRARY_PATH $(LLVMTV) > $@ chmod u+x $@ -$(DESTTOOLCURRENT)/opt-snap: Makefile +$(LLVMToolDir)/opt-snap: Makefile echo exec env LD_LIBRARY_PATH=$(WXLIB):\$$LD_LIBRARY_PATH \ - OPTPASSES=\"$$\*\" opt -load=$(DESTLIBCURRENT)/libsnapshot.so $$\* > $@ + OPTPASSES=\"$$\*\" opt -load=$(LLVMLibDir)/libsnapshot.so $$\* > $@ chmod u+x $@ ifeq ($(OS),Darwin) @@ -35,7 +34,7 @@ endif mac-app: - @./MakeMacOSBundle llvm-tv "$(WXDIR)" "$(DESTTOOLCURRENT)/llvm-tv" + @./MakeMacOSBundle llvm-tv "$(WXDIR)" "$(LLVMToolDir)/llvm-tv" clean-mac-app: rm -rf llvm-tv.app From brukman at cs.uiuc.edu Mon Apr 18 13:39:10 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:39:10 -0500 Subject: [llvm-commits] CVS: llvm-tv/autoconf/configure.ac Message-ID: <200504181839.NAA11544@zion.cs.uiuc.edu> Changes in directory llvm-tv/autoconf: configure.ac updated: 1.4 -> 1.5 --- Log message: Fix project name and version --- Diffs of the changes: (+1 -1) configure.ac | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-tv/autoconf/configure.ac diff -u llvm-tv/autoconf/configure.ac:1.4 llvm-tv/autoconf/configure.ac:1.5 --- llvm-tv/autoconf/configure.ac:1.4 Tue Oct 5 16:09:43 2004 +++ llvm-tv/autoconf/configure.ac Mon Apr 18 13:38:59 2005 @@ -1,7 +1,7 @@ dnl Process this file with autoconf 2.5x to create a configure script. dnl Initialize -AC_INIT([[[LLVM]]],[[[1.0]]],[llvmbugs at cs.uiuc.edu]) +AC_INIT([[[LLVM-TV]]],[[[pre-release]]],[llvmbugs at cs.uiuc.edu]) dnl Place all of the extra autoconf files into the config subdirectory AC_CONFIG_AUX_DIR([autoconf]) From brukman at cs.uiuc.edu Mon Apr 18 13:39:50 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:39:50 -0500 Subject: [llvm-commits] CVS: llvm-tv/Makefile.config.in Message-ID: <200504181839.NAA11568@zion.cs.uiuc.edu> Changes in directory llvm-tv: Makefile.config.in updated: 1.2 -> 1.3 --- Log message: The directory settings for projects have changed in the LLVM build system --- Diffs of the changes: (+17 -10) Makefile.config.in | 27 +++++++++++++++++---------- 1 files changed, 17 insertions(+), 10 deletions(-) Index: llvm-tv/Makefile.config.in diff -u llvm-tv/Makefile.config.in:1.2 llvm-tv/Makefile.config.in:1.3 --- llvm-tv/Makefile.config.in:1.2 Tue Oct 5 16:39:44 2004 +++ llvm-tv/Makefile.config.in Mon Apr 18 13:39:39 2005 @@ -1,3 +1,6 @@ +PROJECT_NAME = @PACKAGE_NAME@ +PROJ_VERSION = @PACKAGE_VERSION@ + # # Set this variable to the top of the LLVM source tree. # @@ -5,19 +8,23 @@ # # Set this variable to the top level directory where LLVM was built -# (i.e. where all of the object files are located). +# (this is *not* the same as OBJ_ROOT as defined in LLVM's Makefile.config). # LLVM_OBJ_ROOT = @LLVM_OBJ@ -# -# Include LLVM's Makefile Makefile. -# -include $(LLVM_OBJ_ROOT)/Makefile.config +# Set the directory root of this project's source files +PROJ_SRC_ROOT := $(subst //,/, at abs_top_srcdir@) -# -# Set the source root and source directory pathnames -# -BUILD_SRC_DIR := $(subst //,/, at abs_top_srcdir@/$(patsubst $(BUILD_OBJ_ROOT)%,%,$(BUILD_OBJ_DIR))) +# Set the root directory of this project's object files +PROJ_OBJ_ROOT := $(subst //,/, at abs_top_builddir@) -BUILD_SRC_ROOT := $(subst //,/, at abs_top_srcdir@) +# Set the root directory of this project's install prefix +PROJ_INSTALL_ROOT := @prefix@ + +# Include LLVM's Master Makefile. +include $(LLVM_OBJ_ROOT)/Makefile.config +#Set SourceDir for backwards compatbility. +ifndef SourceDir +SourceDir=$(PROJ_SRC_DIR) +endif From brukman at cs.uiuc.edu Mon Apr 18 13:40:28 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:40:28 -0500 Subject: [llvm-commits] CVS: llvm-tv/lib/Snapshot/WriteSnapshot.cpp Message-ID: <200504181840.NAA11597@zion.cs.uiuc.edu> Changes in directory llvm-tv/lib/Snapshot: WriteSnapshot.cpp updated: 1.10 -> 1.11 --- Log message: Use the sys::Path interface instead of the older Support file routines --- Diffs of the changes: (+4 -3) WriteSnapshot.cpp | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) Index: llvm-tv/lib/Snapshot/WriteSnapshot.cpp diff -u llvm-tv/lib/Snapshot/WriteSnapshot.cpp:1.10 llvm-tv/lib/Snapshot/WriteSnapshot.cpp:1.11 --- llvm-tv/lib/Snapshot/WriteSnapshot.cpp:1.10 Tue Oct 5 13:38:25 2004 +++ llvm-tv/lib/Snapshot/WriteSnapshot.cpp Mon Apr 18 13:40:17 2005 @@ -91,13 +91,14 @@ // Since we were not successful in sending a signal to an already-running // instance of llvm-tv, start a new instance and send a signal to it. - std::string llvmtvExe = FindExecutable("llvm-tv", ""); - if (llvmtvExe != "" && isExecutableFile(llvmtvExe)) { + sys::Path llvmtvExe = FindExecutable("llvm-tv", ""); + if (llvmtvExe.isValid() && !llvmtvExe.isEmpty() && llvmtvExe.isFile() && + llvmtvExe.executable()) { int pid = fork(); // Child process morphs into llvm-tv if (!pid) { char *argv[1]; argv[0] = 0; - if (execve(llvmtvExe.c_str(), argv, environ) == -1) { + if (execve(llvmtvExe.toString().c_str(), argv, environ) == -1) { perror("execve"); return false; } From brukman at cs.uiuc.edu Mon Apr 18 13:55:07 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:55:07 -0500 Subject: [llvm-commits] CVS: llvm-tv/autoconf/AutoRegen.sh Message-ID: <200504181855.NAA15035@zion.cs.uiuc.edu> Changes in directory llvm-tv/autoconf: AutoRegen.sh added (r1.1) --- Log message: Add script to re-generate the configure script after changes. It is more limited than the standard LLVM AutoRegen.sh, and hence some parts are deactivated. --- Diffs of the changes: (+43 -0) AutoRegen.sh | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+) Index: llvm-tv/autoconf/AutoRegen.sh diff -c /dev/null llvm-tv/autoconf/AutoRegen.sh:1.1 *** /dev/null Mon Apr 18 13:55:06 2005 --- llvm-tv/autoconf/AutoRegen.sh Mon Apr 18 13:54:56 2005 *************** *** 0 **** --- 1,43 ---- + #!/bin/sh + die () { + echo "$@" 1>&2 + exit 1 + } + outfile=configure + configfile=configure.ac + test -d autoconf && test -f autoconf/$configfile && cd autoconf + test -f $configfile || die "Can't find 'autoconf' dir; please cd into it first" + autoconf --version | egrep '2\.59' > /dev/null + if test $? -ne 0 ; then + die "Your autoconf was not detected as being 2.59" + fi + aclocal --version | egrep '1\.9\.2' > /dev/null + if test $? -ne 0 ; then + die "Your aclocal was not detected as being 1.9.2" + fi + autoheader --version | egrep '2\.59' > /dev/null + if test $? -ne 0 ; then + die "Your autoheader was not detected as being 2.59" + fi + libtool --version | grep '1\.5\.10' > /dev/null + if test $? -ne 0 ; then + die "Your libtool was not detected as being 1.5.10" + fi + echo "" + echo "### NOTE: ############################################################" + echo "### If you get *any* warnings from autoconf below you MUST fix the" + echo "### scripts in the m4 directory because there are future forward" + echo "### compatibility or platform support issues at risk. Please do NOT" + echo "### commit any configure script that was generated with warnings" + echo "### present. You should get just three 'Regenerating..' lines." + echo "######################################################################" + echo "" + #echo "Regenerating aclocal.m4 with aclocal 1.9.2" + #cwd=`pwd` + #aclocal --force -I $cwd/m4 || die "aclocal failed" + echo "Regenerating configure with autoconf 2.59" + autoconf --force --warnings=all -o ../$outfile $configfile || die "autoconf failed" + cd .. + echo "Regenerating config.h.in with autoheader 2.59" + #autoheader --warnings=all -I autoconf -I autoconf/m4 autoconf/$configfile || die "autoheader failed" + exit 0 From brukman at cs.uiuc.edu Mon Apr 18 13:55:24 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:55:24 -0500 Subject: [llvm-commits] CVS: llvm-tv/autoconf/configure.ac Message-ID: <200504181855.NAA15044@zion.cs.uiuc.edu> Changes in directory llvm-tv/autoconf: configure.ac updated: 1.5 -> 1.6 --- Log message: Fix autoconf to work with autoconf-2.59 --- Diffs of the changes: (+8 -4) configure.ac | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) Index: llvm-tv/autoconf/configure.ac diff -u llvm-tv/autoconf/configure.ac:1.5 llvm-tv/autoconf/configure.ac:1.6 --- llvm-tv/autoconf/configure.ac:1.5 Mon Apr 18 13:38:59 2005 +++ llvm-tv/autoconf/configure.ac Mon Apr 18 13:54:13 2005 @@ -1,13 +1,17 @@ dnl Process this file with autoconf 2.5x to create a configure script. dnl Initialize -AC_INIT([[[LLVM-TV]]],[[[pre-release]]],[llvmbugs at cs.uiuc.edu]) +AC_INIT([[llvm-tv]],[[pre-release]],[llvmbugs at cs.uiuc.edu]) dnl Place all of the extra autoconf files into the config subdirectory AC_CONFIG_AUX_DIR([autoconf]) +dnl Configure the makefile's configuration data +AC_CONFIG_FILES([Makefile.config]) + dnl Configure Makefiles AC_CONFIG_MAKEFILE(Makefile) +AC_CONFIG_MAKEFILE(Makefile.common) AC_CONFIG_MAKEFILE(lib/Makefile) AC_CONFIG_MAKEFILE(lib/Snapshot/Makefile) AC_CONFIG_MAKEFILE(tools/Makefile) @@ -20,8 +24,8 @@ dnl have been specified by the user. By default, assume we've unpacked this dnl project in projects/, as is customary, and look in ../.. dnl for the main LLVM source and object trees. -AC_ARG_WITH(llvmsrc,AC_HELP_STRING([--with-llvmsrc],[Location of LLVM Source Code]),AC_SUBST(LLVM_SRC,[$withval]),AC_SUBST(LLVM_SRC,[`cd ${srcdir}/../..; pwd`])) -AC_ARG_WITH(llvmobj,AC_HELP_STRING([--with-llvmobj],[Location of LLVM Object Code]),AC_SUBST(LLVM_OBJ,[$withval]),AC_SUBST(LLVM_OBJ,[`cd ../..; pwd`])) +AC_ARG_WITH(llvmsrc,AS_HELP_STRING([--with-llvmsrc],[Location of LLVM Source Code]),AC_SUBST(LLVM_SRC,[$withval]),AC_SUBST(LLVM_SRC,[`cd ${srcdir}/../..; pwd`])) +AC_ARG_WITH(llvmobj,AS_HELP_STRING([--with-llvmobj],[Location of LLVM Object Code]),AC_SUBST(LLVM_OBJ,[$withval]),AC_SUBST(LLVM_OBJ,[`cd ../..; pwd`])) dnl Create the output files -AC_OUTPUT([Makefile.common Makefile.config]) +AC_OUTPUT From brukman at cs.uiuc.edu Mon Apr 18 13:56:00 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:56:00 -0500 Subject: [llvm-commits] CVS: llvm-tv/Makefile.common.in Message-ID: <200504181856.NAA15075@zion.cs.uiuc.edu> Changes in directory llvm-tv: Makefile.common.in (r1.2) removed --- Log message: Makefile.common has no variables, so can be just copied over without value substitutions --- Diffs of the changes: (+0 -0) 0 files changed From brukman at cs.uiuc.edu Mon Apr 18 13:56:23 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:56:23 -0500 Subject: [llvm-commits] CVS: llvm-tv/Makefile.common Message-ID: <200504181856.NAA15104@zion.cs.uiuc.edu> Changes in directory llvm-tv: Makefile.common added (r1.1) --- Log message: This is now just a plain file, not an autoconf-processed input --- Diffs of the changes: (+19 -0) Makefile.common | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+) Index: llvm-tv/Makefile.common diff -c /dev/null llvm-tv/Makefile.common:1.1 *** /dev/null Mon Apr 18 13:56:22 2005 --- llvm-tv/Makefile.common Mon Apr 18 13:56:12 2005 *************** *** 0 **** --- 1,19 ---- + #===-- Makefile.common - Common make rules for LLVM-TV -----*- Makefile -*--===# + # + # The LLVM Compiler Infrastructure + # + # This file was developed by the LLVM research group and is distributed under + # the University of Illinois Open Source License. See LICENSE.TXT for details. + # + #===------------------------------------------------------------------------===# + + # + # Include the local config file + # + include $(LEVEL)/Makefile.config + + # + # Include LLVM's Master Makefile. + # + include $(LLVM_SRC_ROOT)/Makefile.rules + From brukman at cs.uiuc.edu Mon Apr 18 13:56:59 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Mon, 18 Apr 2005 13:56:59 -0500 Subject: [llvm-commits] CVS: llvm-tv/configure Message-ID: <200504181856.NAA15134@zion.cs.uiuc.edu> Changes in directory llvm-tv: configure updated: 1.3 -> 1.4 --- Log message: Regenerated configure with correct package name, version, bells, and whistles --- Diffs of the changes: (+254 -125) configure | 379 +++++++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 254 insertions(+), 125 deletions(-) Index: llvm-tv/configure diff -u llvm-tv/configure:1.3 llvm-tv/configure:1.4 --- llvm-tv/configure:1.3 Tue Apr 20 16:02:30 2004 +++ llvm-tv/configure Mon Apr 18 13:56:48 2005 @@ -1,11 +1,10 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.57 for [LLVM] [1.0]. +# Generated by GNU Autoconf 2.59 for llvm-tv pre-release. # # Report bugs to . # -# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. +# Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## @@ -22,9 +21,10 @@ elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false @@ -43,7 +43,7 @@ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do - if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var @@ -220,16 +220,17 @@ if mkdir -p . 2>/dev/null; then as_mkdir_p=: else + test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS @@ -266,10 +267,10 @@ : ${ac_max_here_lines=38} # Identity of this package. -PACKAGE_NAME='[LLVM]' -PACKAGE_TARNAME='--llvm--' -PACKAGE_VERSION='[1.0]' -PACKAGE_STRING='[LLVM] [1.0]' +PACKAGE_NAME='llvm-tv' +PACKAGE_TARNAME='-llvm-tv-' +PACKAGE_VERSION='pre-release' +PACKAGE_STRING='llvm-tv pre-release' PACKAGE_BUGREPORT='llvmbugs at cs.uiuc.edu' ac_unique_file=""Makefile.common.in"" @@ -632,7 +633,7 @@ # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir + localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in @@ -672,10 +673,10 @@ # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -722,7 +723,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures [LLVM] [1.0] to adapt to many kinds of systems. +\`configure' configures llvm-tv pre-release to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -747,9 +748,9 @@ cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -779,7 +780,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of [LLVM] [1.0]:";; + short | recursive ) echo "Configuration of llvm-tv pre-release:";; esac cat <<\_ACEOF @@ -823,12 +824,45 @@ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. @@ -839,7 +873,7 @@ echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then + test -f $ac_srcdir/configure.in; then echo $ac_configure --help else @@ -852,11 +886,10 @@ test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -[LLVM] configure [1.0] -generated by GNU Autoconf 2.57 +llvm-tv configure pre-release +generated by GNU Autoconf 2.59 -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -Free Software Foundation, Inc. +Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -867,8 +900,8 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by [LLVM] $as_me [1.0], which was -generated by GNU Autoconf 2.57. Invocation command line was +It was created by llvm-tv $as_me pre-release, which was +generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -945,19 +978,19 @@ 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. + ac_must_keep_next=false # Got value, back to normal. else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. @@ -991,12 +1024,12 @@ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } @@ -1025,7 +1058,7 @@ for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi @@ -1044,7 +1077,7 @@ echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 - rm -f core core.* *.core && + rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 @@ -1124,7 +1157,7 @@ # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" @@ -1141,13 +1174,13 @@ ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: + ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. @@ -1230,9 +1263,15 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + ac_config_files="$ac_config_files Makefile.config" + + ac_config_commands="$ac_config_commands Makefile" + ac_config_commands="$ac_config_commands Makefile.common" + + ac_config_commands="$ac_config_commands lib/Makefile" @@ -1269,7 +1308,6 @@ fi; - ac_config_files="$ac_config_files Makefile.common Makefile.config" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -1298,13 +1336,13 @@ # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | @@ -1334,13 +1372,13 @@ # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ + ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; +s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; -s/^[^=]*=[ ]*$//; +s/^[^=]*=[ ]*$//; }' fi @@ -1354,13 +1392,13 @@ cat >confdef2opt.sed <<\_ACEOF t clear : clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote -s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g @@ -1382,7 +1420,7 @@ for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' @@ -1426,9 +1464,10 @@ elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false @@ -1447,7 +1486,7 @@ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do - if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var @@ -1626,16 +1665,17 @@ if mkdir -p . 2>/dev/null; then as_mkdir_p=: else + test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS @@ -1661,8 +1701,8 @@ } >&5 cat >&5 <<_CSEOF -This file was extended by [LLVM] $as_me [1.0], which was -generated by GNU Autoconf 2.57. Invocation command line was +This file was extended by llvm-tv $as_me pre-release, which was +generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -1706,7 +1746,7 @@ -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] - instantiate the configuration file FILE + instantiate the configuration file FILE Configuration files: $config_files @@ -1719,12 +1759,11 @@ cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -[LLVM] config.status [1.0] -configured by $0, generated by GNU Autoconf 2.57, +llvm-tv config.status pre-release +configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. +Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir @@ -1819,6 +1858,7 @@ # ${srcdir}/autoconf/mkinstalldirs `dirname Makefile` +${srcdir}/autoconf/mkinstalldirs `dirname Makefile.common` ${srcdir}/autoconf/mkinstalldirs `dirname lib/Makefile` ${srcdir}/autoconf/mkinstalldirs `dirname lib/Snapshot/Makefile` ${srcdir}/autoconf/mkinstalldirs `dirname tools/Makefile` @@ -1833,9 +1873,9 @@ do case "$ac_config_target" in # Handling of arguments. - "Makefile.common" ) CONFIG_FILES="$CONFIG_FILES Makefile.common" ;; "Makefile.config" ) CONFIG_FILES="$CONFIG_FILES Makefile.config" ;; "Makefile" ) CONFIG_COMMANDS="$CONFIG_COMMANDS Makefile" ;; + "Makefile.common" ) CONFIG_COMMANDS="$CONFIG_COMMANDS Makefile.common" ;; "lib/Makefile" ) CONFIG_COMMANDS="$CONFIG_COMMANDS lib/Makefile" ;; "lib/Snapshot/Makefile" ) CONFIG_COMMANDS="$CONFIG_COMMANDS lib/Snapshot/Makefile" ;; "tools/Makefile" ) CONFIG_COMMANDS="$CONFIG_COMMANDS tools/Makefile" ;; @@ -1957,9 +1997,9 @@ (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end @@ -1977,21 +2017,21 @@ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -2007,10 +2047,10 @@ as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -2048,12 +2088,45 @@ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac @@ -2071,7 +2144,7 @@ configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." + sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. @@ -2080,24 +2153,24 @@ case $f in -) echo $tmp/stdin ;; [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - echo $f;; + echo "$f";; *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - fi;; + fi;; esac done` || { (exit 1); exit 1; } _ACEOF @@ -2138,16 +2211,41 @@ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. if test "$ac_dir" != .; then @@ -2173,18 +2271,52 @@ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/Makefile Makefile ;; + Makefile.common ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/Makefile.common Makefile.common ;; lib/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/lib/Makefile lib/Makefile ;; lib/Snapshot/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/lib/Snapshot/Makefile lib/Snapshot/Makefile ;; tools/Makefile ) ${SHELL} ${srcdir}/autoconf/install-sh -c ${srcdir}/tools/Makefile tools/Makefile ;; @@ -2222,6 +2354,3 @@ $ac_cs_success || { (exit 1); exit 1; } fi - -{ echo "$as_me:$LINENO: WARNING: Remember to configure wxWindows manually; see README.txt" >&5 -echo "$as_me: WARNING: Remember to configure wxWindows manually; see README.txt" >&2;} From lattner at cs.uiuc.edu Mon Apr 18 20:11:20 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 20:11:20 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/FileLexer.l FileParser.y Record.h Message-ID: <200504190111.j3J1BKWt007166@apoc.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: FileLexer.l updated: 1.23 -> 1.24 FileParser.y updated: 1.31 -> 1.32 Record.h updated: 1.44 -> 1.45 --- Log message: Add initial lexer and parser support for shifting values. Every use of this will lead to it being rejected though. --- Diffs of the changes: (+29 -0) FileLexer.l | 5 +++++ FileParser.y | 19 +++++++++++++++++++ Record.h | 5 +++++ 3 files changed, 29 insertions(+) Index: llvm/utils/TableGen/FileLexer.l diff -u llvm/utils/TableGen/FileLexer.l:1.23 llvm/utils/TableGen/FileLexer.l:1.24 --- llvm/utils/TableGen/FileLexer.l:1.23 Wed Oct 13 10:25:46 2004 +++ llvm/utils/TableGen/FileLexer.l Mon Apr 18 20:11:03 2005 @@ -195,6 +195,11 @@ let { return LET; } in { return IN; } +!sra { return SRATOK; } +!srl { return SRLTOK; } +!shl { return SHLTOK; } + + {Identifier} { Filelval.StrVal = new std::string(yytext, yytext+yyleng); return ID; } ${Identifier} { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng); Index: llvm/utils/TableGen/FileParser.y diff -u llvm/utils/TableGen/FileParser.y:1.31 llvm/utils/TableGen/FileParser.y:1.32 --- llvm/utils/TableGen/FileParser.y:1.31 Wed Sep 1 17:55:40 2004 +++ llvm/utils/TableGen/FileParser.y Mon Apr 18 20:11:03 2005 @@ -189,6 +189,7 @@ }; %token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD LET IN +%token SHLTOK SRATOK SRLTOK %token INTVAL %token ID VARNAME STRVAL CODEFRAGMENT @@ -308,6 +309,24 @@ exit(1); } delete $3; + } | SHLTOK '(' Value ',' Value ')' { + $$ = $3->getBinaryOp(Init::SHL, $5); + if ($$ == 0) { + err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n"; + exit(1); + } + } | SRATOK '(' Value ',' Value ')' { + $$ = $3->getBinaryOp(Init::SRA, $5); + if ($$ == 0) { + err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n"; + exit(1); + } + } | SRLTOK '(' Value ',' Value ')' { + $$ = $3->getBinaryOp(Init::SRL, $5); + if ($$ == 0) { + err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n"; + exit(1); + } }; OptVarName : /* empty */ { Index: llvm/utils/TableGen/Record.h diff -u llvm/utils/TableGen/Record.h:1.44 llvm/utils/TableGen/Record.h:1.45 --- llvm/utils/TableGen/Record.h:1.44 Mon Dec 6 17:42:37 2004 +++ llvm/utils/TableGen/Record.h Mon Apr 18 20:11:03 2005 @@ -463,6 +463,11 @@ virtual Init *getFieldInit(Record &R, const std::string &FieldName) const { return 0; } + + enum BinaryOp { SHL, SRA, SRL }; + virtual Init *getBinaryOp(BinaryOp Op, Init *RHS) { + return 0; + } /// resolveReferences - This method is used by classes that refer to other /// variables which may not be defined at the time they expression is formed. From lattner at cs.uiuc.edu Mon Apr 18 20:17:51 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 20:17:51 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/Record.cpp Record.h Message-ID: <200504190117.j3J1HpuP007418@apoc.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: Record.cpp updated: 1.38 -> 1.39 Record.h updated: 1.45 -> 1.46 --- Log message: implementing shifting of literal integers --- Diffs of the changes: (+16 -0) Record.cpp | 14 ++++++++++++++ Record.h | 2 ++ 2 files changed, 16 insertions(+) Index: llvm/utils/TableGen/Record.cpp diff -u llvm/utils/TableGen/Record.cpp:1.38 llvm/utils/TableGen/Record.cpp:1.39 --- llvm/utils/TableGen/Record.cpp:1.38 Thu Nov 4 22:48:38 2004 +++ llvm/utils/TableGen/Record.cpp Mon Apr 18 20:17:34 2005 @@ -297,6 +297,20 @@ return this; } +Init *IntInit::getBinaryOp(BinaryOp Op, Init *RHS) { + IntInit *RHSi = dynamic_cast(RHS); + if (RHSi == 0) return 0; + + int NewValue; + switch (Op) { + case SHL: NewValue = Value << RHSi->getValue(); break; + case SRA: NewValue = Value >> RHSi->getValue(); break; + case SRL: NewValue = (unsigned)Value >> (unsigned)RHSi->getValue(); break; + } + return new IntInit(NewValue); +} + + Init *IntInit::convertInitializerBitRange(const std::vector &Bits) { BitsInit *BI = new BitsInit(Bits.size()); Index: llvm/utils/TableGen/Record.h diff -u llvm/utils/TableGen/Record.h:1.45 llvm/utils/TableGen/Record.h:1.46 --- llvm/utils/TableGen/Record.h:1.45 Mon Apr 18 20:11:03 2005 +++ llvm/utils/TableGen/Record.h Mon Apr 18 20:17:35 2005 @@ -567,6 +567,8 @@ } virtual Init *convertInitializerBitRange(const std::vector &Bits); + virtual Init *getBinaryOp(BinaryOp Op, Init *RHS); + virtual void print(std::ostream &OS) const { OS << Value; } }; From lattner at cs.uiuc.edu Mon Apr 18 20:36:57 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 20:36:57 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/TableGen/dg.exp Message-ID: <200504190136.j3J1avTg008849@apoc.cs.uiuc.edu> Changes in directory llvm/test/Regression/TableGen: dg.exp updated: 1.2 -> 1.3 --- Log message: Tell dj to run the tests in this directory --- Diffs of the changes: (+1 -1) dg.exp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/test/Regression/TableGen/dg.exp diff -u llvm/test/Regression/TableGen/dg.exp:1.2 llvm/test/Regression/TableGen/dg.exp:1.3 --- llvm/test/Regression/TableGen/dg.exp:1.2 Fri Nov 19 16:43:54 2004 +++ llvm/test/Regression/TableGen/dg.exp Mon Apr 18 20:36:41 2005 @@ -1,3 +1,3 @@ load_lib llvm-dg.exp -llvm-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] $objdir $srcdir $subdir $target_triplet $llvmgcc $llvmgxx $prcontext +llvm-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{td}]] $objdir $srcdir $subdir $target_triplet $llvmgcc $llvmgxx $prcontext From lattner at cs.uiuc.edu Mon Apr 18 20:37:37 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 20:37:37 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/TableGen/Include.td Message-ID: <200504190137.j3J1bbgP008955@apoc.cs.uiuc.edu> Changes in directory llvm/test/Regression/TableGen: Include.td updated: 1.1 -> 1.2 --- Log message: add a run line --- Diffs of the changes: (+1 -1) Include.td | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/test/Regression/TableGen/Include.td diff -u llvm/test/Regression/TableGen/Include.td:1.1 llvm/test/Regression/TableGen/Include.td:1.2 --- llvm/test/Regression/TableGen/Include.td:1.1 Wed Jul 30 15:55:37 2003 +++ llvm/test/Regression/TableGen/Include.td Mon Apr 18 20:37:24 2005 @@ -1,4 +1,4 @@ - +// RUN: tblgen %s def BeforeInclude; include "Include.inc" From lattner at cs.uiuc.edu Mon Apr 18 21:26:39 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 21:26:39 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/TableGen/TemplateArgRename.td Message-ID: <200504190226.j3J2QdST010780@apoc.cs.uiuc.edu> Changes in directory llvm/test/Regression/TableGen: TemplateArgRename.td added (r1.1) --- Log message: new testcase --- Diffs of the changes: (+9 -0) TemplateArgRename.td | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm/test/Regression/TableGen/TemplateArgRename.td diff -c /dev/null llvm/test/Regression/TableGen/TemplateArgRename.td:1.1 *** /dev/null Mon Apr 18 21:26:33 2005 --- llvm/test/Regression/TableGen/TemplateArgRename.td Mon Apr 18 21:26:23 2005 *************** *** 0 **** --- 1,9 ---- + // tblgen %s + + // Make sure there is no collision between XX and XX. + + class Before; + class After : Before<4> { + dag XX = (S); + } + From lattner at cs.uiuc.edu Mon Apr 18 21:52:21 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 21:52:21 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/TableGen/TemplateArgRename.td Message-ID: <200504190252.j3J2qLa8012876@apoc.cs.uiuc.edu> Changes in directory llvm/test/Regression/TableGen: TemplateArgRename.td updated: 1.1 -> 1.2 --- Log message: fix this testcase --- Diffs of the changes: (+1 -0) TemplateArgRename.td | 1 + 1 files changed, 1 insertion(+) Index: llvm/test/Regression/TableGen/TemplateArgRename.td diff -u llvm/test/Regression/TableGen/TemplateArgRename.td:1.1 llvm/test/Regression/TableGen/TemplateArgRename.td:1.2 --- llvm/test/Regression/TableGen/TemplateArgRename.td:1.1 Mon Apr 18 21:26:23 2005 +++ llvm/test/Regression/TableGen/TemplateArgRename.td Mon Apr 18 21:52:04 2005 @@ -1,6 +1,7 @@ // tblgen %s // Make sure there is no collision between XX and XX. +def S; class Before; class After : Before<4> { From lattner at cs.uiuc.edu Mon Apr 18 21:53:39 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 21:53:39 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/TableGen/TemplateArgRename.td Message-ID: <200504190253.j3J2rd3C013074@apoc.cs.uiuc.edu> Changes in directory llvm/test/Regression/TableGen: TemplateArgRename.td updated: 1.2 -> 1.3 --- Log message: Add a real run line --- Diffs of the changes: (+1 -1) TemplateArgRename.td | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/test/Regression/TableGen/TemplateArgRename.td diff -u llvm/test/Regression/TableGen/TemplateArgRename.td:1.2 llvm/test/Regression/TableGen/TemplateArgRename.td:1.3 --- llvm/test/Regression/TableGen/TemplateArgRename.td:1.2 Mon Apr 18 21:52:04 2005 +++ llvm/test/Regression/TableGen/TemplateArgRename.td Mon Apr 18 21:53:26 2005 @@ -1,4 +1,4 @@ -// tblgen %s +// RUN: tblgen %s // Make sure there is no collision between XX and XX. def S; From lattner at cs.uiuc.edu Mon Apr 18 21:59:13 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 21:59:13 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/TableGen/TemplateArgRename.td Message-ID: <200504190259.j3J2xD8c013416@apoc.cs.uiuc.edu> Changes in directory llvm/test/Regression/TableGen: TemplateArgRename.td updated: 1.3 -> 1.4 --- Log message: Make this significantly harder --- Diffs of the changes: (+7 -0) TemplateArgRename.td | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/test/Regression/TableGen/TemplateArgRename.td diff -u llvm/test/Regression/TableGen/TemplateArgRename.td:1.3 llvm/test/Regression/TableGen/TemplateArgRename.td:1.4 --- llvm/test/Regression/TableGen/TemplateArgRename.td:1.3 Mon Apr 18 21:53:26 2005 +++ llvm/test/Regression/TableGen/TemplateArgRename.td Mon Apr 18 21:58:57 2005 @@ -8,3 +8,10 @@ dag XX = (S); } + + +class C1 { + int Y = X; +} +class C2 : C1; + From lattner at cs.uiuc.edu Mon Apr 18 22:35:14 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 22:35:14 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/TableGen/LazyChange.td Message-ID: <200504190335.j3J3ZEvH014330@apoc.cs.uiuc.edu> Changes in directory llvm/test/Regression/TableGen: LazyChange.td added (r1.1) --- Log message: New testcase for a changing values late and allowing them to propagate --- Diffs of the changes: (+11 -0) LazyChange.td | 11 +++++++++++ 1 files changed, 11 insertions(+) Index: llvm/test/Regression/TableGen/LazyChange.td diff -c /dev/null llvm/test/Regression/TableGen/LazyChange.td:1.1 *** /dev/null Mon Apr 18 22:35:08 2005 --- llvm/test/Regression/TableGen/LazyChange.td Mon Apr 18 22:34:58 2005 *************** *** 0 **** --- 1,11 ---- + // RUN: tblgen %s | grep 'int Y = 3' + + + class C { + int X = 4; + int Y = X; + } + + let X = 3 in + def D : C; // Y should be 3 too! + From lattner at cs.uiuc.edu Mon Apr 18 22:36:34 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 22:36:34 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/FileParser.y Record.cpp Record.h Message-ID: <200504190336.j3J3aYZb014346@apoc.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: FileParser.y updated: 1.32 -> 1.33 Record.cpp updated: 1.39 -> 1.40 Record.h updated: 1.46 -> 1.47 --- Log message: Major change to tblgen: instead of resolving values every time a class is finished up, only resolve fully when the def is defined. This allows things to be changed and all uses to be propagated through. This implements TableGen/LazyChange.td and fixes TemplateArgRename.td in the process. None of the .td files used in LLVM backends are changed at all by this patch. --- Diffs of the changes: (+119 -73) FileParser.y | 51 ++++++++++++++++++++++--------------- Record.cpp | 81 ++++++++++++++++++++++++++++++++++++----------------------- Record.h | 60 +++++++++++++++++++++++++++---------------- 3 files changed, 119 insertions(+), 73 deletions(-) Index: llvm/utils/TableGen/FileParser.y diff -u llvm/utils/TableGen/FileParser.y:1.32 llvm/utils/TableGen/FileParser.y:1.33 --- llvm/utils/TableGen/FileParser.y:1.32 Mon Apr 18 20:11:03 2005 +++ llvm/utils/TableGen/FileParser.y Mon Apr 18 22:36:21 2005 @@ -25,6 +25,7 @@ extern int Filelineno; static Record *CurRec = 0; +static bool ParsingTemplateArgs = false; typedef std::pair*> SubClassRefTy; @@ -133,6 +134,8 @@ } } +// addSubClass - Add SC as a subclass to CurRec, resolving TemplateArgs as SC's +// template arguments. static void addSubClass(Record *SC, const std::vector &TemplateArgs) { // Add all of the values in the subclass into the current class... const std::vector &Vals = SC->getValues(); @@ -147,11 +150,19 @@ exit(1); } else { // This class expects template arguments... // Loop over all of the template arguments, setting them to the specified - // value or leaving them as the default as necessary. + // value or leaving them as the default if necessary. for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { if (i < TemplateArgs.size()) { // A value is specified for this temp-arg? // Set it now. setValue(TArgs[i], 0, TemplateArgs[i]); + + // Resolve it next. + CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i])); + + + // Now remove it. + CurRec->removeValue(TArgs[i]); + } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) { err() << "ERROR: Value not specified for template argument #" << i << " (" << TArgs[i] << ") of subclass '" << SC->getName() @@ -268,6 +279,10 @@ } | ID { if (const RecordVal *RV = (CurRec ? CurRec->getValue(*$1) : 0)) { $$ = new VarInit(*$1, RV->getType()); + } else if (CurRec && CurRec->isTemplateArg(CurRec->getName()+":"+*$1)) { + const RecordVal *RV = CurRec->getValue(CurRec->getName()+":"+*$1); + assert(RV && "Template arg doesn't exist??"); + $$ = new VarInit(CurRec->getName()+":"+*$1, RV->getType()); } else if (Record *D = Records.getDef(*$1)) { $$ = new DefInit(D); } else { @@ -434,9 +449,13 @@ }; Declaration : OptPrefix Type ID OptValue { - addValue(RecordVal(*$3, $2, $1)); - setValue(*$3, 0, $4); - $$ = $3; + std::string DecName = *$3; + if (ParsingTemplateArgs) + DecName = CurRec->getName() + ":" + DecName; + + addValue(RecordVal(DecName, $2, $1)); + setValue(DecName, 0, $4); + $$ = new std::string(DecName); }; BodyItem : Declaration ';' { @@ -492,12 +511,15 @@ *$1 = "anonymous."+utostr(AnonCounter++); CurRec = new Record(*$1); delete $1; + ParsingTemplateArgs = true; } OptTemplateArgList ClassList { + ParsingTemplateArgs = false; for (unsigned i = 0, e = $4->size(); i != e; ++i) { addSubClass((*$4)[i].first, *(*$4)[i].second); // Delete the template arg values for the class delete (*$4)[i].second; } + delete $4; // Delete the class list... // Process any variables on the set stack... for (unsigned i = 0, e = LetStack.size(); i != e; ++i) @@ -506,22 +528,9 @@ LetStack[i][j].HasBits ? &LetStack[i][j].Bits : 0, LetStack[i][j].Value); } Body { - CurRec->resolveReferences(); - - // Now that all of the references have been resolved, we can delete template - // arguments for superclasses, so they don't pollute our record, and so that - // their names won't conflict with later uses of the name... - for (unsigned i = 0, e = $4->size(); i != e; ++i) { - Record *SuperClass = (*$4)[i].first; - for (unsigned i = 0, e = SuperClass->getTemplateArgs().size(); i != e; ++i) - if (!CurRec->isTemplateArg(SuperClass->getTemplateArgs()[i])) - CurRec->removeValue(SuperClass->getTemplateArgs()[i]); - } - delete $4; // Delete the class list... - - $$ = CurRec; - CurRec = 0; -}; + $$ = CurRec; + CurRec = 0; + }; ClassInst : CLASS ObjectBody { if (Records.getClass($2->getName())) { @@ -532,6 +541,8 @@ }; DefInst : DEF ObjectBody { + $2->resolveReferences(); + if (!$2->getTemplateArgs().empty()) { err() << "Def '" << $2->getName() << "' is not permitted to have template arguments!\n"; Index: llvm/utils/TableGen/Record.cpp diff -u llvm/utils/TableGen/Record.cpp:1.39 llvm/utils/TableGen/Record.cpp:1.40 --- llvm/utils/TableGen/Record.cpp:1.39 Mon Apr 18 20:17:34 2005 +++ llvm/utils/TableGen/Record.cpp Mon Apr 18 22:36:21 2005 @@ -275,7 +275,7 @@ // resolveReferences - If there are any field references that refer to fields // that have been filled in, we can propagate the values now. // -Init *BitsInit::resolveReferences(Record &R) { +Init *BitsInit::resolveReferences(Record &R, const RecordVal *RV) { bool Changed = false; BitsInit *New = new BitsInit(getNumBits()); @@ -285,7 +285,7 @@ do { B = CurBit; - CurBit = CurBit->resolveReferences(R); + CurBit = CurBit->resolveReferences(R, RV); Changed |= B != CurBit; } while (B != CurBit); New->setBit(i, CurBit); @@ -334,7 +334,7 @@ return new ListInit(Vals); } -Init *ListInit::resolveReferences(Record &R) { +Init *ListInit::resolveReferences(Record &R, const RecordVal *RV) { std::vector Resolved; Resolved.reserve(getSize()); bool Changed = false; @@ -345,7 +345,7 @@ do { E = CurElt; - CurElt = CurElt->resolveReferences(R); + CurElt = CurElt->resolveReferences(R, RV); Changed |= E != CurElt; } while (E != CurElt); Resolved.push_back(E); @@ -396,9 +396,10 @@ } -Init *VarInit::resolveBitReference(Record &R, unsigned Bit) { - if (R.isTemplateArg(getName())) - return 0; +Init *VarInit::resolveBitReference(Record &R, const RecordVal *IRV, + unsigned Bit) { + if (R.isTemplateArg(getName())) return 0; + if (IRV && IRV->getName() != getName()) return 0; RecordVal *RV = R.getValue(getName()); assert(RV && "Reference to a non-existant variable?"); @@ -413,9 +414,10 @@ return 0; } -Init *VarInit::resolveListElementReference(Record &R, unsigned Elt) { - if (R.isTemplateArg(getName())) - return 0; +Init *VarInit::resolveListElementReference(Record &R, const RecordVal *IRV, + unsigned Elt) { + if (R.isTemplateArg(getName())) return 0; + if (IRV && IRV->getName() != getName()) return 0; RecordVal *RV = R.getValue(getName()); assert(RV && "Reference to a non-existant variable?"); @@ -456,33 +458,36 @@ /// If a value is set for the variable later, this method will be called on /// users of the value to allow the value to propagate out. /// -Init *VarInit::resolveReferences(Record &R) { +Init *VarInit::resolveReferences(Record &R, const RecordVal *RV) { if (RecordVal *Val = R.getValue(VarName)) - if (!dynamic_cast(Val->getValue())) + if (RV == Val || (RV == 0 && !dynamic_cast(Val->getValue()))) return Val->getValue(); return this; } -Init *VarBitInit::resolveReferences(Record &R) { - if (Init *I = getVariable()->resolveBitReference(R, getBitNum())) +Init *VarBitInit::resolveReferences(Record &R, const RecordVal *RV) { + if (Init *I = getVariable()->resolveBitReference(R, RV, getBitNum())) return I; return this; } -Init *VarListElementInit::resolveReferences(Record &R) { - if (Init *I = getVariable()->resolveListElementReference(R, getElementNum())) +Init *VarListElementInit::resolveReferences(Record &R, const RecordVal *RV) { + if (Init *I = getVariable()->resolveListElementReference(R, RV, + getElementNum())) return I; return this; } -Init *VarListElementInit::resolveBitReference(Record &R, unsigned Bit) { +Init *VarListElementInit::resolveBitReference(Record &R, const RecordVal *RV, + unsigned Bit) { // FIXME: This should be implemented, to support references like: // bit B = AA[0]{1}; return 0; } -Init *VarListElementInit::resolveListElementReference(Record &R, unsigned Elt) { +Init *VarListElementInit:: +resolveListElementReference(Record &R, const RecordVal *RV, unsigned Elt) { // FIXME: This should be implemented, to support references like: // int B = AA[0][1]; return 0; @@ -503,7 +508,8 @@ OS << Def->getName(); } -Init *FieldInit::resolveBitReference(Record &R, unsigned Bit) { +Init *FieldInit::resolveBitReference(Record &R, const RecordVal *RV, + unsigned Bit) { if (Init *BitsVal = Rec->getFieldInit(R, FieldName)) if (BitsInit *BI = dynamic_cast(BitsVal)) { assert(Bit < BI->getNumBits() && "Bit reference out of range!"); @@ -515,7 +521,8 @@ return 0; } -Init *FieldInit::resolveListElementReference(Record &R, unsigned Elt) { +Init *FieldInit::resolveListElementReference(Record &R, const RecordVal *RV, + unsigned Elt) { if (Init *ListVal = Rec->getFieldInit(R, FieldName)) if (ListInit *LI = dynamic_cast(ListVal)) { if (Elt >= LI->getSize()) return 0; @@ -527,12 +534,20 @@ return 0; } -Init *FieldInit::resolveReferences(Record &R) { - Init *BitsVal = Rec->getFieldInit(R, FieldName); +Init *FieldInit::resolveReferences(Record &R, const RecordVal *RV) { + Init *NewRec = RV ? Rec->resolveReferences(R, RV) : Rec; + + Init *BitsVal = NewRec->getFieldInit(R, FieldName); if (BitsVal) { - Init *BVR = BitsVal->resolveReferences(R); + Init *BVR = BitsVal->resolveReferences(R, RV); return BVR->isComplete() ? BVR : this; } + + if (NewRec != Rec) { + dump(); + NewRec->dump(); std::cerr << "\n"; + return new FieldInit(NewRec, FieldName); + } return this; } @@ -566,20 +581,24 @@ void RecordVal::print(std::ostream &OS, bool PrintSem) const { if (getPrefix()) OS << "field "; OS << *getType() << " " << getName(); - if (getValue()) { + + if (getValue()) OS << " = " << *getValue(); - } + if (PrintSem) OS << ";\n"; } -// resolveReferences - If there are any field references that refer to fields -// that have been filled in, we can propagate the values now. -// -void Record::resolveReferences() { - for (unsigned i = 0, e = Values.size(); i != e; ++i) - Values[i].setValue(Values[i].getValue()->resolveReferences(*this)); +/// resolveReferencesTo - If anything in this record refers to RV, replace the +/// reference to RV with the RHS of RV. If RV is null, we resolve all possible +/// references. +void Record::resolveReferencesTo(const RecordVal *RV) { + for (unsigned i = 0, e = Values.size(); i != e; ++i) { + if (Init *V = Values[i].getValue()) + Values[i].setValue(V->resolveReferences(*this, RV)); + } } + void Record::dump() const { std::cerr << *this; } std::ostream &llvm::operator<<(std::ostream &OS, const Record &R) { Index: llvm/utils/TableGen/Record.h diff -u llvm/utils/TableGen/Record.h:1.46 llvm/utils/TableGen/Record.h:1.47 --- llvm/utils/TableGen/Record.h:1.46 Mon Apr 18 20:17:35 2005 +++ llvm/utils/TableGen/Record.h Mon Apr 18 22:36:21 2005 @@ -23,7 +23,7 @@ namespace llvm { -// RecTy subclasses... +// RecTy subclasses. class BitRecTy; class BitsRecTy; class IntRecTy; @@ -33,7 +33,7 @@ class DagRecTy; class RecordRecTy; -// Init subclasses... +// Init subclasses. struct Init; class UnsetInit; class BitInit; @@ -50,8 +50,9 @@ class VarBitInit; class VarListElementInit; -// Other classes... +// Other classes. class Record; +class RecordVal; //===----------------------------------------------------------------------===// // Type Classes @@ -474,7 +475,9 @@ /// If a value is set for the variable later, this method will be called on /// users of the value to allow the value to propagate out. /// - virtual Init *resolveReferences(Record &R) { return this; } + virtual Init *resolveReferences(Record &R, const RecordVal *RV) { + return this; + } }; inline std::ostream &operator<<(std::ostream &OS, const Init &I) { @@ -543,7 +546,7 @@ } virtual void print(std::ostream &OS) const; - virtual Init *resolveReferences(Record &R); + virtual Init *resolveReferences(Record &R, const RecordVal *RV); // printXX - Print this bitstream with the specified format, returning true if // it is not possible. @@ -631,7 +634,7 @@ /// If a value is set for the variable later, this method will be called on /// users of the value to allow the value to propagate out. /// - virtual Init *resolveReferences(Record &R); + virtual Init *resolveReferences(Record &R, const RecordVal *RV); virtual void print(std::ostream &OS) const; }; @@ -654,12 +657,14 @@ /// VarBitInit::resolveReferences. If the bit is able to be resolved, we /// simply return the resolved value, otherwise we return null. /// - virtual Init *resolveBitReference(Record &R, unsigned Bit) = 0; + virtual Init *resolveBitReference(Record &R, const RecordVal *RV, + unsigned Bit) = 0; /// resolveListElementReference - This method is used to implement /// VarListElementInit::resolveReferences. If the list element is resolvable /// now, we return the resolved value, otherwise we return null. - virtual Init *resolveListElementReference(Record &R, unsigned Elt) = 0; + virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, + unsigned Elt) = 0; }; /// VarInit - 'Opcode' - Represent a reference to an entire variable object. @@ -675,8 +680,10 @@ const std::string &getName() const { return VarName; } - virtual Init *resolveBitReference(Record &R, unsigned Bit); - virtual Init *resolveListElementReference(Record &R, unsigned Elt); + virtual Init *resolveBitReference(Record &R, const RecordVal *RV, + unsigned Bit); + virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, + unsigned Elt); virtual RecTy *getFieldType(const std::string &FieldName) const; virtual Init *getFieldInit(Record &R, const std::string &FieldName) const; @@ -686,7 +693,7 @@ /// If a value is set for the variable later, this method will be called on /// users of the value to allow the value to propagate out. /// - virtual Init *resolveReferences(Record &R); + virtual Init *resolveReferences(Record &R, const RecordVal *RV); virtual void print(std::ostream &OS) const { OS << VarName; } }; @@ -714,7 +721,7 @@ virtual void print(std::ostream &OS) const { TI->print(OS); OS << "{" << Bit << "}"; } - virtual Init *resolveReferences(Record &R); + virtual Init *resolveReferences(Record &R, const RecordVal *RV); }; /// VarListElementInit - List[4] - Represent access to one element of a var or @@ -737,17 +744,19 @@ TypedInit *getVariable() const { return TI; } unsigned getElementNum() const { return Element; } - virtual Init *resolveBitReference(Record &R, unsigned Bit); + virtual Init *resolveBitReference(Record &R, const RecordVal *RV, + unsigned Bit); /// resolveListElementReference - This method is used to implement /// VarListElementInit::resolveReferences. If the list element is resolvable /// now, we return the resolved value, otherwise we return null. - virtual Init *resolveListElementReference(Record &R, unsigned Elt); + virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, + unsigned Elt); virtual void print(std::ostream &OS) const { TI->print(OS); OS << "[" << Element << "]"; } - virtual Init *resolveReferences(Record &R); + virtual Init *resolveReferences(Record &R, const RecordVal *RV); }; /// DefInit - AL - Represent a reference to a 'def' in the description @@ -787,10 +796,12 @@ return Ty->convertValue(this); } - virtual Init *resolveBitReference(Record &R, unsigned Bit); - virtual Init *resolveListElementReference(Record &R, unsigned Elt); + virtual Init *resolveBitReference(Record &R, const RecordVal *RV, + unsigned Bit); + virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, + unsigned Elt); - virtual Init *resolveReferences(Record &R); + virtual Init *resolveReferences(Record &R, const RecordVal *RV); virtual void print(std::ostream &OS) const { Rec->print(OS); OS << "." << FieldName; @@ -949,10 +960,15 @@ SuperClasses.push_back(R); } - // resolveReferences - If there are any field references that refer to fields - // that have been filled in, we can propagate the values now. - // - void resolveReferences(); + /// resolveReferences - If there are any field references that refer to fields + /// that have been filled in, we can propagate the values now. + /// + void resolveReferences() { resolveReferencesTo(0); } + + /// resolveReferencesTo - If anything in this record refers to RV, replace the + /// reference to RV with the RHS of RV. If RV is null, we resolve all + /// possible references. + void resolveReferencesTo(const RecordVal *RV); void dump() const; From lattner at cs.uiuc.edu Mon Apr 18 23:33:10 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 23:33:10 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td PowerPCInstrInfo.td Message-ID: <200504190433.j3J4XAiP014981@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrFormats.td updated: 1.35 -> 1.36 PowerPCInstrInfo.td updated: 1.65 -> 1.66 --- Log message: Turn PPC64 and VMX into classes that can be added to instructions instead of bits that must be passed up the inheritance hierarchy. Convert MForm and AForm instructions over --- Diffs of the changes: (+40 -39) PowerPCInstrFormats.td | 26 +++++++++++------------- PowerPCInstrInfo.td | 53 +++++++++++++++++++++++++------------------------ 2 files changed, 40 insertions(+), 39 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.35 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.36 --- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.35 Sun Apr 17 21:43:24 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Mon Apr 18 23:32:54 2005 @@ -459,8 +459,8 @@ } // 1.7.12 A-Form -class AForm_1 opcode, bits<5> xo, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class AForm_1 opcode, bits<5> xo, bit rc, dag OL, string asmstr> + : I { bits<5> FRT; bits<5> FRA; bits<5> FRC; @@ -474,21 +474,20 @@ let Inst{31} = rc; } -class AForm_2 opcode, bits<5> xo, bit rc, bit ppc64, bit vmx, dag OL, - string asmstr> - : AForm_1 { +class AForm_2 opcode, bits<5> xo, bit rc, dag OL, string asmstr> + : AForm_1 { let FRC = 0; } -class AForm_3 opcode, bits<5> xo, bit rc, bit ppc64, bit vmx, dag OL, +class AForm_3 opcode, bits<5> xo, bit rc, dag OL, string asmstr> - : AForm_1 { + : AForm_1 { let FRB = 0; } // 1.7.13 M-Form -class MForm_1 opcode, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class MForm_1 opcode, bit rc, dag OL, string asmstr> + : I { bits<5> RA; bits<5> RS; bits<5> RB; @@ -503,14 +502,13 @@ let Inst{31} = rc; } -class MForm_2 opcode, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> - : MForm_1 { +class MForm_2 opcode, bit rc, dag OL, string asmstr> + : MForm_1 { } // 1.7.14 MD-Form -class MDForm_1 opcode, bits<3> xo, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class MDForm_1 opcode, bits<3> xo, bit rc, + dag OL, string asmstr> : I { bits<5> RS; bits<5> RA; bits<6> SH; Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.65 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.66 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.65 Sun Apr 17 21:43:24 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Mon Apr 18 23:32:54 2005 @@ -15,6 +15,9 @@ include "PowerPCInstrFormats.td" +class isPPC64 { bit PPC64 = 1; } +class isVMX { bit VMX = 1; } + let isTerminator = 1 in { let isReturn = 1 in def BLR : XLForm_2_ext<19, 16, 20, 0, 0, 0, 0, (ops), "blr">; @@ -426,84 +429,84 @@ // A-Form instructions. Most of the instructions executed in the FPU are of // this type. // -def FMADD : AForm_1<63, 29, 0, 0, 0, +def FMADD : AForm_1<63, 29, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fmadd $FRT, $FRA, $FRC, $FRB">; -def FMADDS : AForm_1<59, 29, 0, 0, 0, +def FMADDS : AForm_1<59, 29, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fmadds $FRT, $FRA, $FRC, $FRB">; -def FMSUB : AForm_1<63, 28, 0, 0, 0, +def FMSUB : AForm_1<63, 28, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fmsub $FRT, $FRA, $FRC, $FRB">; -def FMSUBS : AForm_1<59, 28, 0, 0, 0, +def FMSUBS : AForm_1<59, 28, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fmsubs $FRT, $FRA, $FRC, $FRB">; -def FNMADD : AForm_1<63, 31, 0, 0, 0, +def FNMADD : AForm_1<63, 31, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fnmadd $FRT, $FRA, $FRC, $FRB">; -def FNMADDS : AForm_1<59, 31, 0, 0, 0, +def FNMADDS : AForm_1<59, 31, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fnmadds $FRT, $FRA, $FRC, $FRB">; -def FNMSUB : AForm_1<63, 30, 0, 0, 0, +def FNMSUB : AForm_1<63, 30, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fnmsub $FRT, $FRA, $FRC, $FRB">; -def FNMSUBS : AForm_1<59, 30, 0, 0, 0, +def FNMSUBS : AForm_1<59, 30, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fnmsubs $FRT, $FRA, $FRC, $FRB">; -def FSEL : AForm_1<63, 23, 0, 0, 0, +def FSEL : AForm_1<63, 23, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fsel $FRT, $FRA, $FRC, $FRB">; -def FADD : AForm_2<63, 21, 0, 0, 0, +def FADD : AForm_2<63, 21, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fadd $FRT, $FRA, $FRB">; -def FADDS : AForm_2<59, 21, 0, 0, 0, +def FADDS : AForm_2<59, 21, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fadds $FRT, $FRA, $FRB">; -def FDIV : AForm_2<63, 18, 0, 0, 0, +def FDIV : AForm_2<63, 18, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fdiv $FRT, $FRA, $FRB">; -def FDIVS : AForm_2<59, 18, 0, 0, 0, +def FDIVS : AForm_2<59, 18, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fdivs $FRT, $FRA, $FRB">; -def FMUL : AForm_3<63, 25, 0, 0, 0, +def FMUL : AForm_3<63, 25, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fmul $FRT, $FRA, $FRB">; -def FMULS : AForm_3<59, 25, 0, 0, 0, +def FMULS : AForm_3<59, 25, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fmuls $FRT, $FRA, $FRB">; -def FSUB : AForm_2<63, 20, 0, 0, 0, +def FSUB : AForm_2<63, 20, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fsub $FRT, $FRA, $FRB">; -def FSUBS : AForm_2<59, 20, 0, 0, 0, +def FSUBS : AForm_2<59, 20, 0, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fsubs $FRT, $FRA, $FRB">; // M-Form instructions. rotate and mask instructions. // let isTwoAddress = 1 in { -def RLWIMI : MForm_2<20, 0, 0, 0, +def RLWIMI : MForm_2<20, 0, (ops GPRC:$rA, GPRC:$rSi, GPRC:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME), "rlwimi $rA, $rS, $SH, $MB, $ME">; } -def RLWINM : MForm_2<21, 0, 0, 0, +def RLWINM : MForm_2<21, 0, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME), "rlwinm $rA, $rS, $SH, $MB, $ME">; let Defs = [CR0] in -def RLWINMo : MForm_2<21, 1, 0, 0, +def RLWINMo : MForm_2<21, 1, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME), "rlwinm. $rA, $rS, $SH, $MB, $ME">; -def RLWNM : MForm_2<23, 0, 0, 0, +def RLWNM : MForm_2<23, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB, u5imm:$MB, u5imm:$ME), "rlwnm $rA, $rS, $rB, $MB, $ME">; // MD-Form instructions. 64 bit rotate instructions. // -def RLDICL : MDForm_1<30, 0, 0, 1, 0, +def RLDICL : MDForm_1<30, 0, 0, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH, u6imm:$MB), - "rldicl $rA, $rS, $SH, $MB">; -def RLDICR : MDForm_1<30, 1, 0, 1, 0, + "rldicl $rA, $rS, $SH, $MB">, isPPC64; +def RLDICR : MDForm_1<30, 1, 0, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH, u6imm:$ME), - "rldicr $rA, $rS, $SH, $ME">; + "rldicr $rA, $rS, $SH, $ME">, isPPC64; def PowerPCInstrInfo : InstrInfo { let PHIInst = PHI; From lattner at cs.uiuc.edu Mon Apr 18 23:40:23 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 23:40:23 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td PowerPCInstrInfo.td Message-ID: <200504190440.j3J4eNat015044@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrFormats.td updated: 1.36 -> 1.37 PowerPCInstrInfo.td updated: 1.66 -> 1.67 --- Log message: Convert XO XS and XFX forms to use isPPC64 --- Diffs of the changes: (+52 -53) PowerPCInstrFormats.td | 43 ++++++++++++++++----------------- PowerPCInstrInfo.td | 62 ++++++++++++++++++++++++------------------------- 2 files changed, 52 insertions(+), 53 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.36 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.37 --- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.36 Mon Apr 18 23:32:54 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Mon Apr 18 23:40:07 2005 @@ -365,8 +365,8 @@ } // 1.7.8 XFX-Form -class XFXForm_1 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XFXForm_1 opcode, bits<10> xo, dag OL, string asmstr> + : I { bits<5> RT; bits<10> SPR; @@ -376,14 +376,14 @@ let Inst{31} = 0; } -class XFXForm_1_ext opcode, bits<10> xo, bits<10> spr, bit ppc64, - bit vmx, dag OL, string asmstr> - : XFXForm_1 { +class XFXForm_1_ext opcode, bits<10> xo, bits<10> spr, + dag OL, string asmstr> + : XFXForm_1 { let SPR = spr; } -class XFXForm_3 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XFXForm_3 opcode, bits<10> xo, + dag OL, string asmstr> : I { bits<5> RT; let Inst{6-10} = RT; @@ -392,8 +392,8 @@ let Inst{31} = 0; } -class XFXForm_5 opcode, bit mfcrf, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XFXForm_5 opcode, bit mfcrf, bits<10> xo, + dag OL, string asmstr> : I { bits<8> FXM; bits<5> ST; @@ -405,19 +405,18 @@ let Inst{31} = 0; } -class XFXForm_7 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> - : XFXForm_1; +class XFXForm_7 opcode, bits<10> xo, dag OL, string asmstr> + : XFXForm_1; class XFXForm_7_ext opcode, bits<10> xo, bits<10> spr, - bit ppc64, bit vmx, dag OL, string asmstr> - : XFXForm_7 { + dag OL, string asmstr> + : XFXForm_7 { let SPR = spr; } // 1.7.10 XS-Form -class XSForm_1 opcode, bits<9> xo, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XSForm_1 opcode, bits<9> xo, bit rc, + dag OL, string asmstr> : I { bits<5> RS; bits<5> A; bits<6> SH; @@ -431,8 +430,8 @@ } // 1.7.11 XO-Form -class XOForm_1 opcode, bits<9> xo, bit oe, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XOForm_1 opcode, bits<9> xo, bit oe, bit rc, + dag OL, string asmstr> : I { bits<5> RT; bits<5> RA; bits<5> RB; @@ -445,16 +444,16 @@ let Inst{31} = rc; } -class XOForm_1r opcode, bits<9> xo, bit oe, bit rc, bit ppc64, bit vmx, +class XOForm_1r opcode, bits<9> xo, bit oe, bit rc, dag OL, string asmstr> - : XOForm_1 { + : XOForm_1 { let Inst{11-15} = RB; let Inst{16-20} = RA; } -class XOForm_3 opcode, bits<9> xo, bit oe, bit rc, bit ppc64, bit vmx, +class XOForm_3 opcode, bits<9> xo, bit oe, bit rc, dag OL, string asmstr> - : XOForm_1 { + : XOForm_1 { let RB = 0; } Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.66 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.67 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.66 Mon Apr 18 23:32:54 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Mon Apr 18 23:40:07 2005 @@ -370,60 +370,60 @@ // Note that although LR should be listed as `8' and CTR as `9' in the SPR // field, the manual lists the groups of bits as [5-9] = 0, [0-4] = 8 or 9 // which means the SPR value needs to be multiplied by a factor of 32. -def MFCTR : XFXForm_1_ext<31, 339, 288, 0, 0, (ops GPRC:$rT), "mfctr $rT">; -def MFLR : XFXForm_1_ext<31, 339, 256, 0, 0, (ops GPRC:$rT), "mflr $rT">; -def MFCR : XFXForm_3<31, 19, 0, 0, (ops GPRC:$rT), "mfcr $rT">; -def MTCRF : XFXForm_5<31, 0, 144, 0, 0, (ops CRRC:$FXM, GPRC:$rS), +def MFCTR : XFXForm_1_ext<31, 339, 288, (ops GPRC:$rT), "mfctr $rT">; +def MFLR : XFXForm_1_ext<31, 339, 256, (ops GPRC:$rT), "mflr $rT">; +def MFCR : XFXForm_3<31, 19, (ops GPRC:$rT), "mfcr $rT">; +def MTCRF : XFXForm_5<31, 0, 144, (ops CRRC:$FXM, GPRC:$rS), "mtcrf $FXM, $rS">; -def MFCRF : XFXForm_5<31, 1, 19, 0, 0, (ops GPRC:$rT, CRRC:$FXM), +def MFCRF : XFXForm_5<31, 1, 19, (ops GPRC:$rT, CRRC:$FXM), "mfcr $rT, $FXM">; -def MTCTR : XFXForm_7_ext<31, 467, 288, 0, 0, (ops GPRC:$rS), "mtctr $rS">; -def MTLR : XFXForm_7_ext<31, 467, 256, 0, 0, (ops GPRC:$rS), "mtlr $rS">; +def MTCTR : XFXForm_7_ext<31, 467, 288, (ops GPRC:$rS), "mtctr $rS">; +def MTLR : XFXForm_7_ext<31, 467, 256, (ops GPRC:$rS), "mtlr $rS">; // XS-Form instructions. Just 'sradi' // -def SRADI : XSForm_1<31, 413, 0, 1, 0, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH), - "sradi $rA, $rS, $SH">; +def SRADI : XSForm_1<31, 413, 0, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH), + "sradi $rA, $rS, $SH">, isPPC64; // XO-Form instructions. Arithmetic instructions that can set overflow bit // -def ADD : XOForm_1<31, 266, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def ADD : XOForm_1<31, 266, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "add $rT, $rA, $rB">; -def ADDC : XOForm_1<31, 10, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def ADDC : XOForm_1<31, 10, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "addc $rT, $rA, $rB">; -def ADDE : XOForm_1<31, 138, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def ADDE : XOForm_1<31, 138, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "adde $rT, $rA, $rB">; -def DIVD : XOForm_1<31, 489, 0, 0, 1, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), - "divd $rT, $rA, $rB">; -def DIVDU : XOForm_1<31, 457, 0, 0, 1, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), - "divdu $rT, $rA, $rB">; -def DIVW : XOForm_1<31, 491, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def DIVD : XOForm_1<31, 489, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), + "divd $rT, $rA, $rB">, isPPC64; +def DIVDU : XOForm_1<31, 457, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), + "divdu $rT, $rA, $rB">, isPPC64; +def DIVW : XOForm_1<31, 491, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "divw $rT, $rA, $rB">; -def DIVWU : XOForm_1<31, 459, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def DIVWU : XOForm_1<31, 459, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "divwu $rT, $rA, $rB">; -def MULHW : XOForm_1<31, 75, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def MULHW : XOForm_1<31, 75, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mulhw $rT, $rA, $rB">; -def MULHWU : XOForm_1<31, 11, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def MULHWU : XOForm_1<31, 11, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mulhwu $rT, $rA, $rB">; -def MULLD : XOForm_1<31, 233, 0, 0, 1, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), - "mulld $rT, $rA, $rB">; -def MULLW : XOForm_1<31, 235, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def MULLD : XOForm_1<31, 233, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), + "mulld $rT, $rA, $rB">, isPPC64; +def MULLW : XOForm_1<31, 235, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mullw $rT, $rA, $rB">; -def SUBF : XOForm_1<31, 40, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def SUBF : XOForm_1<31, 40, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "subf $rT, $rA, $rB">; -def SUBFC : XOForm_1<31, 8, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def SUBFC : XOForm_1<31, 8, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "subfc $rT, $rA, $rB">; -def SUBFE : XOForm_1<31, 136, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def SUBFE : XOForm_1<31, 136, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "subfe $rT, $rA, $rB">; -def SUB : XOForm_1r<31, 40, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def SUB : XOForm_1r<31, 40, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "sub $rT, $rA, $rB">; -def ADDME : XOForm_3<31, 234, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA), +def ADDME : XOForm_3<31, 234, 0, 0, (ops GPRC:$rT, GPRC:$rA), "addme $rT, $rA">; -def ADDZE : XOForm_3<31, 202, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA), +def ADDZE : XOForm_3<31, 202, 0, 0, (ops GPRC:$rT, GPRC:$rA), "addze $rT, $rA">; -def NEG : XOForm_3<31, 104, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA), +def NEG : XOForm_3<31, 104, 0, 0, (ops GPRC:$rT, GPRC:$rA), "neg $rT, $rA">; -def SUBFZE : XOForm_3<31, 200, 0, 0, 0, 0, (ops GPRC:$rT, GPRC:$rA), +def SUBFZE : XOForm_3<31, 200, 0, 0, (ops GPRC:$rT, GPRC:$rA), "subfze $rT, $rA">; // A-Form instructions. Most of the instructions executed in the FPU are of From lattner at cs.uiuc.edu Mon Apr 18 23:51:46 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 23:51:46 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td PowerPCInstrInfo.td Message-ID: <200504190451.j3J4pkdT015124@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrFormats.td updated: 1.37 -> 1.38 PowerPCInstrInfo.td updated: 1.67 -> 1.68 --- Log message: Convert XLForm and XForm instructions over to use PPC64 when appropriate. --- Diffs of the changes: (+117 -134) PowerPCInstrFormats.td | 91 ++++++++++++--------------- PowerPCInstrInfo.td | 160 +++++++++++++++++++++++-------------------------- 2 files changed, 117 insertions(+), 134 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.37 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.38 --- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.37 Mon Apr 18 23:40:07 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Mon Apr 18 23:51:30 2005 @@ -200,9 +200,9 @@ : DSForm_1; // 1.7.6 X-Form -class XForm_base_r3xo opcode, bits<10> xo, bit rc, bit ppc64, bit vmx, +class XForm_base_r3xo opcode, bits<10> xo, bit rc, dag OL, string asmstr> - : I { + : I { bits<5> RST; bits<5> A; bits<5> B; @@ -217,9 +217,8 @@ // This is the same as XForm_base_r3xo, but the first two operands are swapped // when code is emitted. class XForm_base_r3xo_swapped - opcode, bits<10> xo, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> - : I { + opcode, bits<10> xo, bit rc, dag OL, string asmstr> + : I { bits<5> A; bits<5> RST; bits<5> B; @@ -232,31 +231,26 @@ } -class XForm_1 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> - : XForm_base_r3xo; - -class XForm_6 opcode, bits<10> xo, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> - : XForm_base_r3xo_swapped; - -class XForm_8 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> - : XForm_base_r3xo; - -class XForm_10 opcode, bits<10> xo, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> - : XForm_base_r3xo_swapped { -} - -class XForm_11 opcode, bits<10> xo, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> - : XForm_base_r3xo_swapped { +class XForm_1 opcode, bits<10> xo, dag OL, string asmstr> + : XForm_base_r3xo; + +class XForm_6 opcode, bits<10> xo, bit rc, dag OL, string asmstr> + : XForm_base_r3xo_swapped; + +class XForm_8 opcode, bits<10> xo, dag OL, string asmstr> + : XForm_base_r3xo; + +class XForm_10 opcode, bits<10> xo, bit rc, dag OL, string asmstr> + : XForm_base_r3xo_swapped { +} + +class XForm_11 opcode, bits<10> xo, bit rc, dag OL, string asmstr> + : XForm_base_r3xo_swapped { let B = 0; } -class XForm_16 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XForm_16 opcode, bits<10> xo, dag OL, string asmstr> + : I { bits<3> BF; bits<1> L; bits<5> RA; @@ -271,14 +265,13 @@ let Inst{31} = 0; } -class XForm_16_ext opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> - : XForm_16 { - let L = ppc64; +class XForm_16_ext opcode, bits<10> xo, dag OL, string asmstr> + : XForm_16 { + let L = PPC64; } -class XForm_17 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XForm_17 opcode, bits<10> xo, dag OL, string asmstr> + : I { bits<3> BF; bits<5> FRA; bits<5> FRB; @@ -291,25 +284,22 @@ let Inst{31} = 0; } -class XForm_25 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> - : XForm_base_r3xo { +class XForm_25 opcode, bits<10> xo, dag OL, string asmstr> + : XForm_base_r3xo { } -class XForm_26 opcode, bits<10> xo, bit rc, bit ppc64, bit vmx, - dag OL, string asmstr> - : XForm_base_r3xo { +class XForm_26 opcode, bits<10> xo, bit rc, dag OL, string asmstr> + : XForm_base_r3xo { let A = 0; } -class XForm_28 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> - : XForm_base_r3xo { +class XForm_28 opcode, bits<10> xo, dag OL, string asmstr> + : XForm_base_r3xo { } // 1.7.7 XL-Form -class XLForm_1 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XLForm_1 opcode, bits<10> xo, dag OL, string asmstr> + : I { bits<3> CRD; bits<2> CRDb; bits<3> CRA; @@ -327,8 +317,8 @@ let Inst{31} = 0; } -class XLForm_2 opcode, bits<10> xo, bit lk, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XLForm_2 opcode, bits<10> xo, bit lk, + dag OL, string asmstr> : I { bits<5> BO; bits<5> BI; bits<2> BH; @@ -342,16 +332,15 @@ } class XLForm_2_ext opcode, bits<10> xo, bits<5> bo, - bits<5> bi, bit lk, bit ppc64, bit vmx, - dag OL, string asmstr> - : XLForm_2 { + bits<5> bi, bit lk, dag OL, string asmstr> + : XLForm_2 { let BO = bo; let BI = bi; let BH = 0; } -class XLForm_3 opcode, bits<10> xo, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class XLForm_3 opcode, bits<10> xo, dag OL, string asmstr> + : I { bits<3> BF; bits<3> BFA; Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.67 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.68 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.67 Mon Apr 18 23:40:07 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Mon Apr 18 23:51:30 2005 @@ -20,8 +20,8 @@ let isTerminator = 1 in { let isReturn = 1 in - def BLR : XLForm_2_ext<19, 16, 20, 0, 0, 0, 0, (ops), "blr">; - def BCTR : XLForm_2_ext<19, 528, 20, 0, 0, 0, 0, (ops), "bctr">; + def BLR : XLForm_2_ext<19, 16, 20, 0, 0, (ops), "blr">; + def BCTR : XLForm_2_ext<19, 528, 20, 0, 0, (ops), "bctr">; } def u5imm : Operand { @@ -94,7 +94,7 @@ CR0,CR1,CR5,CR6,CR7] in { // Convenient aliases for call instructions def CALLpcrel : IForm<18, 0, 1, 0, 0, (ops target:$func), "bl $func">; - def CALLindirect : XLForm_2_ext<19, 528, 20, 0, 1, 0, 0, (ops), "bctrl">; + def CALLindirect : XLForm_2_ext<19, 528, 20, 0, 1, (ops), "bctrl">; } // D-Form instructions. Most instructions that perform an operation on a @@ -214,155 +214,149 @@ // register and another register are of this type. // let isLoad = 1 in { -def LBZX : XForm_1<31, 87, 0, 0, (ops GPRC:$dst, GPRC:$base, GPRC:$index), +def LBZX : XForm_1<31, 87, (ops GPRC:$dst, GPRC:$base, GPRC:$index), "lbzx $dst, $base, $index">; -def LHAX : XForm_1<31, 343, 0, 0, (ops GPRC:$dst, GPRC:$base, GPRC:$index), +def LHAX : XForm_1<31, 343, (ops GPRC:$dst, GPRC:$base, GPRC:$index), "lhax $dst, $base, $index">; -def LHZX : XForm_1<31, 279, 0, 0, (ops GPRC:$dst, GPRC:$base, GPRC:$index), +def LHZX : XForm_1<31, 279, (ops GPRC:$dst, GPRC:$base, GPRC:$index), "lhzx $dst, $base, $index">; -def LWAX : XForm_1<31, 341, 1, 0, (ops GPRC:$dst, GPRC:$base, GPRC:$index), - "lwax $dst, $base, $index">; -def LWZX : XForm_1<31, 23, 0, 0, (ops GPRC:$dst, GPRC:$base, GPRC:$index), +def LWAX : XForm_1<31, 341, (ops GPRC:$dst, GPRC:$base, GPRC:$index), + "lwax $dst, $base, $index">, isPPC64; +def LWZX : XForm_1<31, 23, (ops GPRC:$dst, GPRC:$base, GPRC:$index), "lwzx $dst, $base, $index">; -def LDX : XForm_1<31, 21, 1, 0, (ops GPRC:$dst, GPRC:$base, GPRC:$index), - "ldx $dst, $base, $index">; +def LDX : XForm_1<31, 21, (ops GPRC:$dst, GPRC:$base, GPRC:$index), + "ldx $dst, $base, $index">, isPPC64; } -def AND : XForm_6<31, 28, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def AND : XForm_6<31, 28, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "and $rA, $rS, $rB">; let Defs = [CR0] in -def ANDo : XForm_6<31, 28, 1, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def ANDo : XForm_6<31, 28, 1, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "and. $rA, $rS, $rB">; -def ANDC : XForm_6<31, 60, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def ANDC : XForm_6<31, 60, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "andc $rA, $rS, $rB">; -def EQV : XForm_6<31, 284, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def EQV : XForm_6<31, 284, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "eqv $rA, $rS, $rB">; -def NAND : XForm_6<31, 476, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def NAND : XForm_6<31, 476, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "nand $rA, $rS, $rB">; -def NOR : XForm_6<31, 124, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def NOR : XForm_6<31, 124, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "nor $rA, $rS, $rB">; -def OR : XForm_6<31, 444, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def OR : XForm_6<31, 444, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "or $rA, $rS, $rB">; let Defs = [CR0] in -def ORo : XForm_6<31, 444, 1, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def ORo : XForm_6<31, 444, 1, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "or. $rA, $rS, $rB">; -def ORC : XForm_6<31, 412, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def ORC : XForm_6<31, 412, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "orc $rA, $rS, $rB">; -def SLD : XForm_6<31, 27, 0, 1, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), - "sld $rA, $rS, $rB">; -def SLW : XForm_6<31, 24, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def SLD : XForm_6<31, 27, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), + "sld $rA, $rS, $rB">, isPPC64; +def SLW : XForm_6<31, 24, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "slw $rA, $rS, $rB">; -def SRD : XForm_6<31, 539, 0, 1, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), - "srd $rA, $rS, $rB">; -def SRW : XForm_6<31, 536, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def SRD : XForm_6<31, 539, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), + "srd $rA, $rS, $rB">, isPPC64; +def SRW : XForm_6<31, 536, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "srw $rA, $rS, $rB">; -def SRAD : XForm_6<31, 794, 0, 1, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), - "srad $rA, $rS, $rB">; -def SRAW : XForm_6<31, 792, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def SRAD : XForm_6<31, 794, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), + "srad $rA, $rS, $rB">, isPPC64; +def SRAW : XForm_6<31, 792, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "sraw $rA, $rS, $rB">; -def XOR : XForm_6<31, 316, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def XOR : XForm_6<31, 316, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "xor $rA, $rS, $rB">; let isStore = 1 in { -def STBX : XForm_8<31, 215, 0, 0, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), +def STBX : XForm_8<31, 215, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), "stbx $rS, $rA, $rB">; -def STHX : XForm_8<31, 407, 0, 0, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), +def STHX : XForm_8<31, 407, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), "sthx $rS, $rA, $rB">; -def STWX : XForm_8<31, 151, 0, 0, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), +def STWX : XForm_8<31, 151, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), "stwx $rS, $rA, $rB">; -def STWUX : XForm_8<31, 183, 0, 0, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), +def STWUX : XForm_8<31, 183, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), "stwux $rS, $rA, $rB">; -def STDX : XForm_8<31, 149, 1, 0, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stdx $rS, $rA, $rB">; -def STDUX : XForm_8<31, 181, 1, 0, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stdux $rS, $rA, $rB">; +def STDX : XForm_8<31, 149, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), + "stdx $rS, $rA, $rB">, isPPC64; +def STDUX : XForm_8<31, 181, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), + "stdux $rS, $rA, $rB">, isPPC64; } -def SRAWI : XForm_10<31, 824, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH), +def SRAWI : XForm_10<31, 824, 0, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH), "srawi $rA, $rS, $SH">; -def CNTLZW : XForm_11<31, 26, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS), +def CNTLZW : XForm_11<31, 26, 0, (ops GPRC:$rA, GPRC:$rS), "cntlzw $rA, $rS">; -def EXTSB : XForm_11<31, 954, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS), +def EXTSB : XForm_11<31, 954, 0, (ops GPRC:$rA, GPRC:$rS), "extsb $rA, $rS">; -def EXTSH : XForm_11<31, 922, 0, 0, 0, (ops GPRC:$rA, GPRC:$rS), +def EXTSH : XForm_11<31, 922, 0, (ops GPRC:$rA, GPRC:$rS), "extsh $rA, $rS">; -def EXTSW : XForm_11<31, 986, 0, 1, 0, (ops GPRC:$rA, GPRC:$rS), - "extsw $rA, $rS">; -def CMP : XForm_16<31, 0, 0, 0, - (ops CRRC:$crD, i1imm:$long, GPRC:$rA, GPRC:$rB), +def EXTSW : XForm_11<31, 986, 0, (ops GPRC:$rA, GPRC:$rS), + "extsw $rA, $rS">, isPPC64; +def CMP : XForm_16<31, 0, (ops CRRC:$crD, i1imm:$long, GPRC:$rA, GPRC:$rB), "cmp $crD, $long, $rA, $rB">; -def CMPL : XForm_16<31, 32, 0, 0, - (ops CRRC:$crD, i1imm:$long, GPRC:$rA, GPRC:$rB), +def CMPL : XForm_16<31, 32, (ops CRRC:$crD, i1imm:$long, GPRC:$rA, GPRC:$rB), "cmpl $crD, $long, $rA, $rB">; -def CMPW : XForm_16_ext<31, 0, 0, 0, - (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), +def CMPW : XForm_16_ext<31, 0, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), "cmpw $crD, $rA, $rB">; -def CMPD : XForm_16_ext<31, 0, 1, 0, - (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), - "cmpd $crD, $rA, $rB">; -def CMPLW : XForm_16_ext<31, 32, 0, 0, - (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), +def CMPD : XForm_16_ext<31, 0, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), + "cmpd $crD, $rA, $rB">, isPPC64; +def CMPLW : XForm_16_ext<31, 32, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), "cmplw $crD, $rA, $rB">; -def CMPLD : XForm_16_ext<31, 32, 1, 0, - (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), - "cmpld $crD, $rA, $rB">; -def FCMPO : XForm_17<63, 32, 0, 0, (ops CRRC:$crD, FPRC:$fA, FPRC:$fB), +def CMPLD : XForm_16_ext<31, 32, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), + "cmpld $crD, $rA, $rB">, isPPC64; +def FCMPO : XForm_17<63, 32, (ops CRRC:$crD, FPRC:$fA, FPRC:$fB), "fcmpo $crD, $fA, $fB">; -def FCMPU : XForm_17<63, 0, 0, 0, (ops CRRC:$crD, FPRC:$fA, FPRC:$fB), +def FCMPU : XForm_17<63, 0, (ops CRRC:$crD, FPRC:$fA, FPRC:$fB), "fcmpu $crD, $fA, $fB">; let isLoad = 1 in { -def LFSX : XForm_25<31, 535, 0, 0, (ops FPRC:$dst, GPRC:$base, GPRC:$index), +def LFSX : XForm_25<31, 535, (ops FPRC:$dst, GPRC:$base, GPRC:$index), "lfsx $dst, $base, $index">; -def LFDX : XForm_25<31, 599, 0, 0, (ops FPRC:$dst, GPRC:$base, GPRC:$index), +def LFDX : XForm_25<31, 599, (ops FPRC:$dst, GPRC:$base, GPRC:$index), "lfdx $dst, $base, $index">; } -def FCFID : XForm_26<63, 846, 0, 1, 0, (ops FPRC:$frD, FPRC:$frB), - "fcfid $frD, $frB">; -def FCTIDZ : XForm_26<63, 815, 0, 1, 0, (ops FPRC:$frD, FPRC:$frB), - "fctidz $frD, $frB">; -def FCTIWZ : XForm_26<63, 15, 0, 0, 0, (ops FPRC:$frD, FPRC:$frB), +def FCFID : XForm_26<63, 846, 0, (ops FPRC:$frD, FPRC:$frB), + "fcfid $frD, $frB">, isPPC64; +def FCTIDZ : XForm_26<63, 815, 0, (ops FPRC:$frD, FPRC:$frB), + "fctidz $frD, $frB">, isPPC64; +def FCTIWZ : XForm_26<63, 15, 0, (ops FPRC:$frD, FPRC:$frB), "fctiwz $frD, $frB">; -def FABS : XForm_26<63, 264, 0, 0, 0, (ops FPRC:$frD, FPRC:$frB), +def FABS : XForm_26<63, 264, 0, (ops FPRC:$frD, FPRC:$frB), "fabs $frD, $frB">; -def FMR : XForm_26<63, 72, 0, 0, 0, (ops FPRC:$frD, FPRC:$frB), +def FMR : XForm_26<63, 72, 0, (ops FPRC:$frD, FPRC:$frB), "fmr $frD, $frB">; -def FNABS : XForm_26<63, 136, 0, 0, 0, (ops FPRC:$frD, FPRC:$frB), +def FNABS : XForm_26<63, 136, 0, (ops FPRC:$frD, FPRC:$frB), "fnabs $frD, $frB">; -def FNEG : XForm_26<63, 40, 0, 0, 0, (ops FPRC:$frD, FPRC:$frB), +def FNEG : XForm_26<63, 40, 0, (ops FPRC:$frD, FPRC:$frB), "fneg $frD, $frB">; -def FRSP : XForm_26<63, 12, 0, 0, 0, (ops FPRC:$frD, FPRC:$frB), +def FRSP : XForm_26<63, 12, 0, (ops FPRC:$frD, FPRC:$frB), "frsp $frD, $frB">; let isStore = 1 in { -def STFSX : XForm_28<31, 663, 0, 0, (ops FPRC:$frS, GPRC:$rA, GPRC:$rB), +def STFSX : XForm_28<31, 663, (ops FPRC:$frS, GPRC:$rA, GPRC:$rB), "stfsx $frS, $rA, $rB">; -def STFDX : XForm_28<31, 727, 0, 0, (ops FPRC:$frS, GPRC:$rA, GPRC:$rB), +def STFDX : XForm_28<31, 727, (ops FPRC:$frS, GPRC:$rA, GPRC:$rB), "stfdx $frS, $rA, $rB">; } // XL-Form instructions. condition register logical ops. // -def CRAND : XLForm_1<19, 257, 0, 0, (ops CRRC:$D, crbit:$Db, +def CRAND : XLForm_1<19, 257, (ops CRRC:$D, crbit:$Db, CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), "crand $Db, $Ab, $Bb">; -def CRANDC : XLForm_1<19, 129, 0, 0, (ops CRRC:$D, crbit:$Db, +def CRANDC : XLForm_1<19, 129, (ops CRRC:$D, crbit:$Db, CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), "crandc $Db, $Ab, $Bb">; -def CREQV : XLForm_1<19, 289, 0, 0, (ops CRRC:$D, crbit:$Db, +def CREQV : XLForm_1<19, 289, (ops CRRC:$D, crbit:$Db, CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), "creqv $Db, $Ab, $Bb">; -def CRNAND : XLForm_1<19, 225, 0, 0, (ops CRRC:$D, crbit:$Db, +def CRNAND : XLForm_1<19, 225, (ops CRRC:$D, crbit:$Db, CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), "crnand $Db, $Ab, $Bb">; -def CRNOR : XLForm_1<19, 33, 0, 0, (ops CRRC:$D, crbit:$Db, +def CRNOR : XLForm_1<19, 33, (ops CRRC:$D, crbit:$Db, CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), "crnor $Db, $Ab, $Bb">; -def CROR : XLForm_1<19, 449, 0, 0, (ops CRRC:$D, crbit:$Db, +def CROR : XLForm_1<19, 449, (ops CRRC:$D, crbit:$Db, CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), "cror $Db, $Ab, $Bb">; -def CRORC : XLForm_1<19, 417, 0, 0, (ops CRRC:$D, crbit:$Db, +def CRORC : XLForm_1<19, 417, (ops CRRC:$D, crbit:$Db, CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), "crorc $Db, $Ab, $Bb">; -def CRXOR : XLForm_1<19, 193, 0, 0, (ops CRRC:$D, crbit:$Db, +def CRXOR : XLForm_1<19, 193, (ops CRRC:$D, crbit:$Db, CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), "crxor $Db, $Ab, $Bb">; -def MCRF : XLForm_3<19, 0, 0, 0, (ops CRRC:$BF, CRRC:$BFA), +def MCRF : XLForm_3<19, 0, (ops CRRC:$BF, CRRC:$BFA), "mcrf $BF, $BFA">; // XFX-Form instructions. Instructions that deal with SPRs From lattner at cs.uiuc.edu Mon Apr 18 23:59:44 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 18 Apr 2005 23:59:44 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td PowerPCInstrInfo.td Message-ID: <200504190459.j3J4xi0f015167@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrFormats.td updated: 1.38 -> 1.39 PowerPCInstrInfo.td updated: 1.68 -> 1.69 --- Log message: Convert over DForm and DSForm instructions --- Diffs of the changes: (+80 -90) PowerPCInstrFormats.td | 65 ++++++++++++++---------------- PowerPCInstrInfo.td | 105 ++++++++++++++++++++++--------------------------- 2 files changed, 80 insertions(+), 90 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.38 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.39 --- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.38 Mon Apr 18 23:51:30 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Mon Apr 18 23:59:28 2005 @@ -90,8 +90,8 @@ } // 1.7.4 D-Form -class DForm_base opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : I { +class DForm_base opcode, dag OL, string asmstr> + : I { bits<5> A; bits<5> B; bits<16> C; @@ -101,8 +101,8 @@ let Inst{16-31} = C; } -class DForm_1 opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : I { +class DForm_1 opcode, dag OL, string asmstr> + : I { bits<5> A; bits<16> C; bits<5> B; @@ -112,11 +112,11 @@ let Inst{16-31} = C; } -class DForm_2 opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : DForm_base; +class DForm_2 opcode, dag OL, string asmstr> + : DForm_base; -class DForm_2_r0 opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : I { +class DForm_2_r0 opcode, dag OL, string asmstr> + : I { bits<5> A; bits<16> B; @@ -126,11 +126,11 @@ } // Currently we make the use/def reg distinction in ISel, not tablegen -class DForm_3 opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : DForm_1; +class DForm_3 opcode, dag OL, string asmstr> + : DForm_1; -class DForm_4 opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : I { +class DForm_4 opcode, dag OL, string asmstr> + : I { bits<5> B; bits<5> A; bits<16> C; @@ -140,15 +140,15 @@ let Inst{16-31} = C; } -class DForm_4_zero opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : DForm_1 { +class DForm_4_zero opcode, dag OL, string asmstr> + : DForm_1 { let A = 0; let B = 0; let C = 0; } -class DForm_5 opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : I { +class DForm_5 opcode, dag OL, string asmstr> + : I { bits<3> BF; bits<1> L; bits<5> RA; @@ -161,30 +161,30 @@ let Inst{16-31} = I; } -class DForm_5_ext opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : DForm_5 { - let L = ppc64; +class DForm_5_ext opcode, dag OL, string asmstr> + : DForm_5 { + let L = PPC64; } -class DForm_6 opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : DForm_5; +class DForm_6 opcode, dag OL, string asmstr> + : DForm_5; -class DForm_6_ext opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : DForm_6 { - let L = ppc64; +class DForm_6_ext opcode, dag OL, string asmstr> + : DForm_6 { + let L = PPC64; } -class DForm_8 opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : DForm_1 { +class DForm_8 opcode, dag OL, string asmstr> + : DForm_1 { } -class DForm_9 opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : DForm_1 { +class DForm_9 opcode, dag OL, string asmstr> + : DForm_1 { } // 1.7.5 DS-Form -class DSForm_1 opcode, bits<2> xo, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class DSForm_1 opcode, bits<2> xo, dag OL, string asmstr> + : I { bits<5> RST; bits<14> DS; bits<5> RA; @@ -195,9 +195,8 @@ let Inst{30-31} = xo; } -class DSForm_2 opcode, bits<2> xo, bit ppc64, bit vmx, - dag OL, string asmstr> - : DSForm_1; +class DSForm_2 opcode, bits<2> xo, dag OL, string asmstr> + : DSForm_1; // 1.7.6 X-Form class XForm_base_r3xo opcode, bits<10> xo, bit rc, Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.68 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.69 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.68 Mon Apr 18 23:51:30 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Mon Apr 18 23:59:28 2005 @@ -101,113 +101,104 @@ // register and an immediate are of this type. // let isLoad = 1 in { -def LBZ : DForm_1<34, 0, 0, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), +def LBZ : DForm_1<34, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), "lbz $rD, $disp($rA)">; -def LHA : DForm_1<42, 0, 0, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), +def LHA : DForm_1<42, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), "lha $rD, $disp($rA)">; -def LHZ : DForm_1<40, 0, 0, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), +def LHZ : DForm_1<40, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), "lhz $rD, $disp($rA)">; -def LMW : DForm_1<46, 0, 0, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), +def LMW : DForm_1<46, (ops GPRC:$rD, s16imm:$disp, GPRC:$rA), "lmw $rD, $disp($rA)">; -def LWZ : DForm_1<32, 0, 0, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), +def LWZ : DForm_1<32, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), "lwz $rD, $disp($rA)">; -def LWZU : DForm_1<35, 0, 0, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), +def LWZU : DForm_1<35, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), "lwzu $rD, $disp($rA)">; } -def ADDI : DForm_2<14, 0, 0, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), +def ADDI : DForm_2<14, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), "addi $rD, $rA, $imm">; -def ADDIC : DForm_2<12, 0, 0, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), +def ADDIC : DForm_2<12, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), "addic $rD, $rA, $imm">; -def ADDICo : DForm_2<13, 0, 0, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), +def ADDICo : DForm_2<13, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), "addic. $rD, $rA, $imm">; -def ADDIS : DForm_2<15, 0, 0, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), +def ADDIS : DForm_2<15, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), "addis $rD, $rA, $imm">; -def LA : DForm_2<14, 0, 0, (ops GPRC:$rD, GPRC:$rA, symbolLo:$sym), +def LA : DForm_2<14, (ops GPRC:$rD, GPRC:$rA, symbolLo:$sym), "la $rD, $sym($rA)">; -def LOADHiAddr : DForm_2<15, 0, 0, (ops GPRC:$rD, GPRC:$rA, symbolHi:$sym), +def LOADHiAddr : DForm_2<15, (ops GPRC:$rD, GPRC:$rA, symbolHi:$sym), "addis $rD, $rA, $sym">; -def MULLI : DForm_2< 7, 0, 0, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), +def MULLI : DForm_2< 7, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), "mulli $rD, $rA, $imm">; -def SUBFIC : DForm_2< 8, 0, 0, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), +def SUBFIC : DForm_2< 8, (ops GPRC:$rD, GPRC:$rA, s16imm:$imm), "subfic $rD, $rA, $imm">; -def LI : DForm_2_r0<14, 0, 0, (ops GPRC:$rD, s16imm:$imm), +def LI : DForm_2_r0<14, (ops GPRC:$rD, s16imm:$imm), "li $rD, $imm">; -def LIS : DForm_2_r0<15, 0, 0, (ops GPRC:$rD, s16imm:$imm), +def LIS : DForm_2_r0<15, (ops GPRC:$rD, s16imm:$imm), "lis $rD, $imm">; let isStore = 1 in { -def STMW : DForm_3<47, 0, 0, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), +def STMW : DForm_3<47, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "stmw $rS, $disp($rA)">; -def STB : DForm_3<38, 0, 0, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), +def STB : DForm_3<38, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "stb $rS, $disp($rA)">; -def STH : DForm_3<44, 0, 0, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), +def STH : DForm_3<44, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "sth $rS, $disp($rA)">; -def STW : DForm_3<36, 0, 0, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), +def STW : DForm_3<36, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "stw $rS, $disp($rA)">; -def STWU : DForm_3<37, 0, 0, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), +def STWU : DForm_3<37, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "stwu $rS, $disp($rA)">; } let Defs = [CR0] in { -def ANDIo : DForm_4<28, 0, 0, - (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), +def ANDIo : DForm_4<28, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), "andi. $dst, $src1, $src2">; -def ANDISo : DForm_4<29, 0, 0, - (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), +def ANDISo : DForm_4<29, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), "andis. $dst, $src1, $src2">; } -def ORI : DForm_4<24, 0, 0, - (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), +def ORI : DForm_4<24, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), "ori $dst, $src1, $src2">; -def ORIS : DForm_4<25, 0, 0, - (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), +def ORIS : DForm_4<25, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), "oris $dst, $src1, $src2">; -def XORI : DForm_4<26, 0, 0, - (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), +def XORI : DForm_4<26, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), "xori $dst, $src1, $src2">; -def XORIS : DForm_4<27, 0, 0, - (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), +def XORIS : DForm_4<27, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), "xoris $dst, $src1, $src2">; -def NOP : DForm_4_zero<24, 0, 0, (ops), "nop">; -def CMPI : DForm_5<11, 0, 0, (ops CRRC:$crD, i1imm:$L, GPRC:$rA, s16imm:$imm), +def NOP : DForm_4_zero<24, (ops), "nop">; +def CMPI : DForm_5<11, (ops CRRC:$crD, i1imm:$L, GPRC:$rA, s16imm:$imm), "cmpi $crD, $L, $rA, $imm">; -def CMPWI : DForm_5_ext<11, 0, 0, (ops CRRC:$crD, GPRC:$rA, s16imm:$imm), +def CMPWI : DForm_5_ext<11, (ops CRRC:$crD, GPRC:$rA, s16imm:$imm), "cmpwi $crD, $rA, $imm">; -def CMPDI : DForm_5_ext<11, 1, 0, (ops CRRC:$crD, GPRC:$rA, s16imm:$imm), - "cmpdi $crD, $rA, $imm">; -def CMPLI : DForm_6<10, 0, 0, - (ops CRRC:$dst, i1imm:$size, GPRC:$src1, u16imm:$src2), +def CMPDI : DForm_5_ext<11, (ops CRRC:$crD, GPRC:$rA, s16imm:$imm), + "cmpdi $crD, $rA, $imm">, isPPC64; +def CMPLI : DForm_6<10, (ops CRRC:$dst, i1imm:$size, GPRC:$src1, u16imm:$src2), "cmpli $dst, $size, $src1, $src2">; -def CMPLWI : DForm_6_ext<10, 0, 0, - (ops CRRC:$dst, GPRC:$src1, u16imm:$src2), +def CMPLWI : DForm_6_ext<10, (ops CRRC:$dst, GPRC:$src1, u16imm:$src2), "cmplwi $dst, $src1, $src2">; -def CMPLDI : DForm_6_ext<10, 1, 0, - (ops CRRC:$dst, GPRC:$src1, u16imm:$src2), - "cmpldi $dst, $src1, $src2">; +def CMPLDI : DForm_6_ext<10, (ops CRRC:$dst, GPRC:$src1, u16imm:$src2), + "cmpldi $dst, $src1, $src2">, isPPC64; let isLoad = 1 in { -def LFS : DForm_8<48, 0, 0, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), +def LFS : DForm_8<48, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), "lfs $rD, $disp($rA)">; -def LFD : DForm_8<50, 0, 0, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), +def LFD : DForm_8<50, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), "lfd $rD, $disp($rA)">; } let isStore = 1 in { -def STFS : DForm_9<52, 0, 0, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), +def STFS : DForm_9<52, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "stfs $rS, $disp($rA)">; -def STFD : DForm_9<54, 0, 0, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), +def STFD : DForm_9<54, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "stfd $rS, $disp($rA)">; } // DS-Form instructions. Load/Store instructions available in PPC-64 // let isLoad = 1 in { -def LWA : DSForm_1<58, 2, 1, 0, (ops GPRC:$rT, s16imm:$DS, GPRC:$rA), - "lwa $rT, $DS($rA)">; -def LD : DSForm_2<58, 0, 1, 0, (ops GPRC:$rT, s16imm:$DS, GPRC:$rA), - "ld $rT, $DS($rA)">; +def LWA : DSForm_1<58, 2, (ops GPRC:$rT, s16imm:$DS, GPRC:$rA), + "lwa $rT, $DS($rA)">, isPPC64; +def LD : DSForm_2<58, 0, (ops GPRC:$rT, s16imm:$DS, GPRC:$rA), + "ld $rT, $DS($rA)">, isPPC64; } let isStore = 1 in { -def STD : DSForm_2<62, 0, 1, 0, (ops GPRC:$rT, s16imm:$DS, GPRC:$rA), - "std $rT, $DS($rA)">; -def STDU : DSForm_2<62, 1, 1, 0, (ops GPRC:$rT, s16imm:$DS, GPRC:$rA), - "stdu $rT, $DS($rA)">; +def STD : DSForm_2<62, 0, (ops GPRC:$rT, s16imm:$DS, GPRC:$rA), + "std $rT, $DS($rA)">, isPPC64; +def STDU : DSForm_2<62, 1, (ops GPRC:$rT, s16imm:$DS, GPRC:$rA), + "stdu $rT, $DS($rA)">, isPPC64; } // X-Form instructions. Most instructions that perform an operation on a From lattner at cs.uiuc.edu Tue Apr 19 00:01:12 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 00:01:12 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td PowerPCInstrInfo.td Message-ID: <200504190501.j3J51CJ9015195@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrFormats.td updated: 1.39 -> 1.40 PowerPCInstrInfo.td updated: 1.69 -> 1.70 --- Log message: convert over bform and iform instructions --- Diffs of the changes: (+17 -17) PowerPCInstrFormats.td | 12 ++++++------ PowerPCInstrInfo.td | 22 +++++++++++----------- 2 files changed, 17 insertions(+), 17 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.39 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.40 --- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.39 Mon Apr 18 23:59:28 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Tue Apr 19 00:00:59 2005 @@ -57,8 +57,8 @@ } // 1.7.1 I-Form -class IForm opcode, bit aa, bit lk, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class IForm opcode, bit aa, bit lk, dag OL, string asmstr> + : I { bits<24> LI; let Inst{6-29} = LI; @@ -67,8 +67,8 @@ } // 1.7.2 B-Form -class BForm opcode, bit aa, bit lk, bit ppc64, bit vmx, - dag OL, string asmstr> : I { +class BForm opcode, bit aa, bit lk, + dag OL, string asmstr> : I { bits<5> BO; bits<3> CRNum; bits<2> BICode; @@ -83,8 +83,8 @@ } class BForm_ext opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, - bit ppc64, bit vmx, dag OL, string asmstr> - : BForm { + dag OL, string asmstr> + : BForm { let BO = bo; let BICode = bicode; } Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.69 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.70 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.69 Mon Apr 18 23:59:28 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Tue Apr 19 00:00:59 2005 @@ -65,24 +65,24 @@ let isBranch = 1, isTerminator = 1 in { def COND_BRANCH : Pseudo<(ops), "; COND_BRANCH">; - def B : IForm<18, 0, 0, 0, 0, (ops target:$func), "b $func">; -//def BA : IForm<18, 1, 0, 0, 0, (ops target:$func), "ba $func">; - def BL : IForm<18, 0, 1, 0, 0, (ops target:$func), "bl $func">; -//def BLA : IForm<18, 1, 1, 0, 0, (ops target:$func), "bla $func">; + def B : IForm<18, 0, 0, (ops target:$func), "b $func">; +//def BA : IForm<18, 1, 0, (ops target:$func), "ba $func">; + def BL : IForm<18, 0, 1, (ops target:$func), "bl $func">; +//def BLA : IForm<18, 1, 1, (ops target:$func), "bla $func">; // FIXME: 4*CR# needs to be added to the BI field! // This will only work for CR0 as it stands now - def BLT : BForm_ext<16, 0, 0, 12, 0, 0, 0, (ops CRRC:$crS, target:$block), + def BLT : BForm_ext<16, 0, 0, 12, 0, (ops CRRC:$crS, target:$block), "blt $block">; - def BLE : BForm_ext<16, 0, 0, 4, 1, 0, 0, (ops CRRC:$crS, target:$block), + def BLE : BForm_ext<16, 0, 0, 4, 1, (ops CRRC:$crS, target:$block), "ble $block">; - def BEQ : BForm_ext<16, 0, 0, 12, 2, 0, 0, (ops CRRC:$crS, target:$block), + def BEQ : BForm_ext<16, 0, 0, 12, 2, (ops CRRC:$crS, target:$block), "beq $block">; - def BGE : BForm_ext<16, 0, 0, 4, 0, 0, 0, (ops CRRC:$crS, target:$block), + def BGE : BForm_ext<16, 0, 0, 4, 0, (ops CRRC:$crS, target:$block), "bge $block">; - def BGT : BForm_ext<16, 0, 0, 12, 1, 0, 0, (ops CRRC:$crS, target:$block), + def BGT : BForm_ext<16, 0, 0, 12, 1, (ops CRRC:$crS, target:$block), "bgt $block">; - def BNE : BForm_ext<16, 0, 0, 4, 2, 0, 0, (ops CRRC:$crS, target:$block), + def BNE : BForm_ext<16, 0, 0, 4, 2, (ops CRRC:$crS, target:$block), "bne $block">; } @@ -93,7 +93,7 @@ LR,XER,CTR, CR0,CR1,CR5,CR6,CR7] in { // Convenient aliases for call instructions - def CALLpcrel : IForm<18, 0, 1, 0, 0, (ops target:$func), "bl $func">; + def CALLpcrel : IForm<18, 0, 1, (ops target:$func), "bl $func">; def CALLindirect : XLForm_2_ext<19, 528, 20, 0, 1, (ops), "bctrl">; } From lattner at cs.uiuc.edu Tue Apr 19 00:05:39 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 00:05:39 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Message-ID: <200504190505.j3J55dxp015215@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrFormats.td updated: 1.40 -> 1.41 --- Log message: Now that the ppc64 and vmx operands of I are always 0, forward substitute them away. --- Diffs of the changes: (+30 -36) PowerPCInstrFormats.td | 66 ++++++++++++++++++++++--------------------------- 1 files changed, 30 insertions(+), 36 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.40 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.41 --- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.40 Tue Apr 19 00:00:59 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Tue Apr 19 00:05:22 2005 @@ -42,12 +42,11 @@ // // PowerPC instruction formats -class I opcode, bit ppc64, bit vmx, dag OL, string asmstr> - : Instruction { +class I opcode, dag OL, string asmstr> : Instruction { field bits<32> Inst; - bit PPC64 = ppc64; - bit VMX = vmx; + bit PPC64 = 0; // Default value, override with isPPC64 + bit VMX = 0; // Default value, override with isVMX let Name = ""; let Namespace = "PPC"; @@ -58,7 +57,7 @@ // 1.7.1 I-Form class IForm opcode, bit aa, bit lk, dag OL, string asmstr> - : I { + : I { bits<24> LI; let Inst{6-29} = LI; @@ -67,8 +66,8 @@ } // 1.7.2 B-Form -class BForm opcode, bit aa, bit lk, - dag OL, string asmstr> : I { +class BForm opcode, bit aa, bit lk, dag OL, string asmstr> + : I { bits<5> BO; bits<3> CRNum; bits<2> BICode; @@ -90,8 +89,7 @@ } // 1.7.4 D-Form -class DForm_base opcode, dag OL, string asmstr> - : I { +class DForm_base opcode, dag OL, string asmstr> : I{ bits<5> A; bits<5> B; bits<16> C; @@ -101,8 +99,7 @@ let Inst{16-31} = C; } -class DForm_1 opcode, dag OL, string asmstr> - : I { +class DForm_1 opcode, dag OL, string asmstr> : I { bits<5> A; bits<16> C; bits<5> B; @@ -116,7 +113,7 @@ : DForm_base; class DForm_2_r0 opcode, dag OL, string asmstr> - : I { + : I { bits<5> A; bits<16> B; @@ -129,8 +126,7 @@ class DForm_3 opcode, dag OL, string asmstr> : DForm_1; -class DForm_4 opcode, dag OL, string asmstr> - : I { +class DForm_4 opcode, dag OL, string asmstr> : I { bits<5> B; bits<5> A; bits<16> C; @@ -147,8 +143,7 @@ let C = 0; } -class DForm_5 opcode, dag OL, string asmstr> - : I { +class DForm_5 opcode, dag OL, string asmstr> : I { bits<3> BF; bits<1> L; bits<5> RA; @@ -184,7 +179,7 @@ // 1.7.5 DS-Form class DSForm_1 opcode, bits<2> xo, dag OL, string asmstr> - : I { + : I { bits<5> RST; bits<14> DS; bits<5> RA; @@ -200,8 +195,7 @@ // 1.7.6 X-Form class XForm_base_r3xo opcode, bits<10> xo, bit rc, - dag OL, string asmstr> - : I { + dag OL, string asmstr> : I { bits<5> RST; bits<5> A; bits<5> B; @@ -217,7 +211,7 @@ // when code is emitted. class XForm_base_r3xo_swapped opcode, bits<10> xo, bit rc, dag OL, string asmstr> - : I { + : I { bits<5> A; bits<5> RST; bits<5> B; @@ -249,7 +243,7 @@ } class XForm_16 opcode, bits<10> xo, dag OL, string asmstr> - : I { + : I { bits<3> BF; bits<1> L; bits<5> RA; @@ -270,7 +264,7 @@ } class XForm_17 opcode, bits<10> xo, dag OL, string asmstr> - : I { + : I { bits<3> BF; bits<5> FRA; bits<5> FRB; @@ -298,7 +292,7 @@ // 1.7.7 XL-Form class XLForm_1 opcode, bits<10> xo, dag OL, string asmstr> - : I { + : I { bits<3> CRD; bits<2> CRDb; bits<3> CRA; @@ -317,7 +311,7 @@ } class XLForm_2 opcode, bits<10> xo, bit lk, - dag OL, string asmstr> : I { + dag OL, string asmstr> : I { bits<5> BO; bits<5> BI; bits<2> BH; @@ -339,7 +333,7 @@ } class XLForm_3 opcode, bits<10> xo, dag OL, string asmstr> - : I { + : I { bits<3> BF; bits<3> BFA; @@ -354,7 +348,7 @@ // 1.7.8 XFX-Form class XFXForm_1 opcode, bits<10> xo, dag OL, string asmstr> - : I { + : I { bits<5> RT; bits<10> SPR; @@ -370,8 +364,8 @@ let SPR = spr; } -class XFXForm_3 opcode, bits<10> xo, - dag OL, string asmstr> : I { +class XFXForm_3 opcode, bits<10> xo, dag OL, string asmstr> + : I { bits<5> RT; let Inst{6-10} = RT; @@ -381,7 +375,7 @@ } class XFXForm_5 opcode, bit mfcrf, bits<10> xo, - dag OL, string asmstr> : I { + dag OL, string asmstr> : I { bits<8> FXM; bits<5> ST; @@ -403,8 +397,8 @@ } // 1.7.10 XS-Form -class XSForm_1 opcode, bits<9> xo, bit rc, - dag OL, string asmstr> : I { +class XSForm_1 opcode, bits<9> xo, bit rc, dag OL, string asmstr> + : I { bits<5> RS; bits<5> A; bits<6> SH; @@ -419,7 +413,7 @@ // 1.7.11 XO-Form class XOForm_1 opcode, bits<9> xo, bit oe, bit rc, - dag OL, string asmstr> : I { + dag OL, string asmstr> : I { bits<5> RT; bits<5> RA; bits<5> RB; @@ -447,7 +441,7 @@ // 1.7.12 A-Form class AForm_1 opcode, bits<5> xo, bit rc, dag OL, string asmstr> - : I { + : I { bits<5> FRT; bits<5> FRA; bits<5> FRC; @@ -474,7 +468,7 @@ // 1.7.13 M-Form class MForm_1 opcode, bit rc, dag OL, string asmstr> - : I { + : I { bits<5> RA; bits<5> RS; bits<5> RB; @@ -495,7 +489,7 @@ // 1.7.14 MD-Form class MDForm_1 opcode, bits<3> xo, bit rc, - dag OL, string asmstr> : I { + dag OL, string asmstr> : I { bits<5> RS; bits<5> RA; bits<6> SH; @@ -512,7 +506,7 @@ //===----------------------------------------------------------------------===// -class Pseudo : I<0, 0, 0, OL, asmstr> { +class Pseudo : I<0, OL, asmstr> { let PPC64 = 0; let VMX = 0; From lattner at cs.uiuc.edu Tue Apr 19 00:15:34 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 00:15:34 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td PowerPCInstrInfo.td Message-ID: <200504190515.j3J5FYJB015361@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrFormats.td updated: 1.41 -> 1.42 PowerPCInstrInfo.td updated: 1.70 -> 1.71 --- Log message: Convert the XForm instrs and XSForm instruction over to use isDOT --- Diffs of the changes: (+60 -52) PowerPCInstrFormats.td | 42 ++++++++++++++++------------- PowerPCInstrInfo.td | 70 +++++++++++++++++++++++++------------------------ 2 files changed, 60 insertions(+), 52 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.41 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.42 --- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.41 Tue Apr 19 00:05:22 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Tue Apr 19 00:15:18 2005 @@ -194,51 +194,55 @@ : DSForm_1; // 1.7.6 X-Form -class XForm_base_r3xo opcode, bits<10> xo, bit rc, +class XForm_base_r3xo opcode, bits<10> xo, dag OL, string asmstr> : I { bits<5> RST; bits<5> A; bits<5> B; + bit RC = 0; // set by isDOT + let Inst{6-10} = RST; let Inst{11-15} = A; let Inst{16-20} = B; let Inst{21-30} = xo; - let Inst{31} = rc; + let Inst{31} = RC; } // This is the same as XForm_base_r3xo, but the first two operands are swapped // when code is emitted. class XForm_base_r3xo_swapped - opcode, bits<10> xo, bit rc, dag OL, string asmstr> + opcode, bits<10> xo, dag OL, string asmstr> : I { bits<5> A; bits<5> RST; bits<5> B; + bit RC = 0; // set by isDOT + let Inst{6-10} = RST; let Inst{11-15} = A; let Inst{16-20} = B; let Inst{21-30} = xo; - let Inst{31} = rc; + let Inst{31} = RC; } class XForm_1 opcode, bits<10> xo, dag OL, string asmstr> - : XForm_base_r3xo; + : XForm_base_r3xo; -class XForm_6 opcode, bits<10> xo, bit rc, dag OL, string asmstr> - : XForm_base_r3xo_swapped; +class XForm_6 opcode, bits<10> xo, dag OL, string asmstr> + : XForm_base_r3xo_swapped; class XForm_8 opcode, bits<10> xo, dag OL, string asmstr> - : XForm_base_r3xo; + : XForm_base_r3xo; -class XForm_10 opcode, bits<10> xo, bit rc, dag OL, string asmstr> - : XForm_base_r3xo_swapped { +class XForm_10 opcode, bits<10> xo, dag OL, string asmstr> + : XForm_base_r3xo_swapped { } -class XForm_11 opcode, bits<10> xo, bit rc, dag OL, string asmstr> - : XForm_base_r3xo_swapped { +class XForm_11 opcode, bits<10> xo, dag OL, string asmstr> + : XForm_base_r3xo_swapped { let B = 0; } @@ -278,16 +282,16 @@ } class XForm_25 opcode, bits<10> xo, dag OL, string asmstr> - : XForm_base_r3xo { + : XForm_base_r3xo { } -class XForm_26 opcode, bits<10> xo, bit rc, dag OL, string asmstr> - : XForm_base_r3xo { +class XForm_26 opcode, bits<10> xo, dag OL, string asmstr> + : XForm_base_r3xo { let A = 0; } class XForm_28 opcode, bits<10> xo, dag OL, string asmstr> - : XForm_base_r3xo { + : XForm_base_r3xo { } // 1.7.7 XL-Form @@ -397,18 +401,20 @@ } // 1.7.10 XS-Form -class XSForm_1 opcode, bits<9> xo, bit rc, dag OL, string asmstr> +class XSForm_1 opcode, bits<9> xo, dag OL, string asmstr> : I { bits<5> RS; bits<5> A; bits<6> SH; + bit RC = 0; // set by isDOT + let Inst{6-10} = RS; let Inst{11-15} = A; let Inst{16-20} = SH{1-5}; let Inst{21-29} = xo; let Inst{30} = SH{0}; - let Inst{31} = rc; + let Inst{31} = RC; } // 1.7.11 XO-Form Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.70 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.71 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.70 Tue Apr 19 00:00:59 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Tue Apr 19 00:15:18 2005 @@ -17,6 +17,10 @@ class isPPC64 { bit PPC64 = 1; } class isVMX { bit VMX = 1; } +class isDOT { + list Defs = [CR0]; + bit RC = 1; +} let isTerminator = 1 in { let isReturn = 1 in @@ -218,39 +222,37 @@ def LDX : XForm_1<31, 21, (ops GPRC:$dst, GPRC:$base, GPRC:$index), "ldx $dst, $base, $index">, isPPC64; } -def AND : XForm_6<31, 28, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def AND : XForm_6<31, 28, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "and $rA, $rS, $rB">; -let Defs = [CR0] in -def ANDo : XForm_6<31, 28, 1, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), - "and. $rA, $rS, $rB">; -def ANDC : XForm_6<31, 60, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def ANDo : XForm_6<31, 28, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), + "and. $rA, $rS, $rB">, isDOT; +def ANDC : XForm_6<31, 60, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "andc $rA, $rS, $rB">; -def EQV : XForm_6<31, 284, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def EQV : XForm_6<31, 284, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "eqv $rA, $rS, $rB">; -def NAND : XForm_6<31, 476, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def NAND : XForm_6<31, 476, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "nand $rA, $rS, $rB">; -def NOR : XForm_6<31, 124, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def NOR : XForm_6<31, 124, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "nor $rA, $rS, $rB">; -def OR : XForm_6<31, 444, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def OR : XForm_6<31, 444, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "or $rA, $rS, $rB">; -let Defs = [CR0] in -def ORo : XForm_6<31, 444, 1, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), - "or. $rA, $rS, $rB">; -def ORC : XForm_6<31, 412, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def ORo : XForm_6<31, 444, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), + "or. $rA, $rS, $rB">, isDOT; +def ORC : XForm_6<31, 412, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "orc $rA, $rS, $rB">; -def SLD : XForm_6<31, 27, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def SLD : XForm_6<31, 27, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "sld $rA, $rS, $rB">, isPPC64; -def SLW : XForm_6<31, 24, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def SLW : XForm_6<31, 24, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "slw $rA, $rS, $rB">; -def SRD : XForm_6<31, 539, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def SRD : XForm_6<31, 539, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "srd $rA, $rS, $rB">, isPPC64; -def SRW : XForm_6<31, 536, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def SRW : XForm_6<31, 536, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "srw $rA, $rS, $rB">; -def SRAD : XForm_6<31, 794, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def SRAD : XForm_6<31, 794, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "srad $rA, $rS, $rB">, isPPC64; -def SRAW : XForm_6<31, 792, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def SRAW : XForm_6<31, 792, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "sraw $rA, $rS, $rB">; -def XOR : XForm_6<31, 316, 0, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), +def XOR : XForm_6<31, 316, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "xor $rA, $rS, $rB">; let isStore = 1 in { def STBX : XForm_8<31, 215, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), @@ -266,15 +268,15 @@ def STDUX : XForm_8<31, 181, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), "stdux $rS, $rA, $rB">, isPPC64; } -def SRAWI : XForm_10<31, 824, 0, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH), +def SRAWI : XForm_10<31, 824, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH), "srawi $rA, $rS, $SH">; -def CNTLZW : XForm_11<31, 26, 0, (ops GPRC:$rA, GPRC:$rS), +def CNTLZW : XForm_11<31, 26, (ops GPRC:$rA, GPRC:$rS), "cntlzw $rA, $rS">; -def EXTSB : XForm_11<31, 954, 0, (ops GPRC:$rA, GPRC:$rS), +def EXTSB : XForm_11<31, 954, (ops GPRC:$rA, GPRC:$rS), "extsb $rA, $rS">; -def EXTSH : XForm_11<31, 922, 0, (ops GPRC:$rA, GPRC:$rS), +def EXTSH : XForm_11<31, 922, (ops GPRC:$rA, GPRC:$rS), "extsh $rA, $rS">; -def EXTSW : XForm_11<31, 986, 0, (ops GPRC:$rA, GPRC:$rS), +def EXTSW : XForm_11<31, 986, (ops GPRC:$rA, GPRC:$rS), "extsw $rA, $rS">, isPPC64; def CMP : XForm_16<31, 0, (ops CRRC:$crD, i1imm:$long, GPRC:$rA, GPRC:$rB), "cmp $crD, $long, $rA, $rB">; @@ -298,21 +300,21 @@ def LFDX : XForm_25<31, 599, (ops FPRC:$dst, GPRC:$base, GPRC:$index), "lfdx $dst, $base, $index">; } -def FCFID : XForm_26<63, 846, 0, (ops FPRC:$frD, FPRC:$frB), +def FCFID : XForm_26<63, 846, (ops FPRC:$frD, FPRC:$frB), "fcfid $frD, $frB">, isPPC64; -def FCTIDZ : XForm_26<63, 815, 0, (ops FPRC:$frD, FPRC:$frB), +def FCTIDZ : XForm_26<63, 815, (ops FPRC:$frD, FPRC:$frB), "fctidz $frD, $frB">, isPPC64; -def FCTIWZ : XForm_26<63, 15, 0, (ops FPRC:$frD, FPRC:$frB), +def FCTIWZ : XForm_26<63, 15, (ops FPRC:$frD, FPRC:$frB), "fctiwz $frD, $frB">; -def FABS : XForm_26<63, 264, 0, (ops FPRC:$frD, FPRC:$frB), +def FABS : XForm_26<63, 264, (ops FPRC:$frD, FPRC:$frB), "fabs $frD, $frB">; -def FMR : XForm_26<63, 72, 0, (ops FPRC:$frD, FPRC:$frB), +def FMR : XForm_26<63, 72, (ops FPRC:$frD, FPRC:$frB), "fmr $frD, $frB">; -def FNABS : XForm_26<63, 136, 0, (ops FPRC:$frD, FPRC:$frB), +def FNABS : XForm_26<63, 136, (ops FPRC:$frD, FPRC:$frB), "fnabs $frD, $frB">; -def FNEG : XForm_26<63, 40, 0, (ops FPRC:$frD, FPRC:$frB), +def FNEG : XForm_26<63, 40, (ops FPRC:$frD, FPRC:$frB), "fneg $frD, $frB">; -def FRSP : XForm_26<63, 12, 0, (ops FPRC:$frD, FPRC:$frB), +def FRSP : XForm_26<63, 12, (ops FPRC:$frD, FPRC:$frB), "frsp $frD, $frB">; let isStore = 1 in { def STFSX : XForm_28<31, 663, (ops FPRC:$frS, GPRC:$rA, GPRC:$rB), @@ -367,7 +369,7 @@ // XS-Form instructions. Just 'sradi' // -def SRADI : XSForm_1<31, 413, 0, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH), +def SRADI : XSForm_1<31, 413, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH), "sradi $rA, $rS, $SH">, isPPC64; // XO-Form instructions. Arithmetic instructions that can set overflow bit From lattner at cs.uiuc.edu Tue Apr 19 00:21:46 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 00:21:46 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td PowerPCInstrInfo.td Message-ID: <200504190521.j3J5LkdL015438@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrFormats.td updated: 1.42 -> 1.43 PowerPCInstrInfo.td updated: 1.71 -> 1.72 --- Log message: switch over the rest of the formats that use RC to use isDOT --- Diffs of the changes: (+73 -71) PowerPCInstrFormats.td | 51 ++++++++++++++------------ PowerPCInstrInfo.td | 93 +++++++++++++++++++++++-------------------------- 2 files changed, 73 insertions(+), 71 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.42 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.43 --- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.42 Tue Apr 19 00:15:18 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Tue Apr 19 00:21:30 2005 @@ -418,96 +418,101 @@ } // 1.7.11 XO-Form -class XOForm_1 opcode, bits<9> xo, bit oe, bit rc, - dag OL, string asmstr> : I { +class XOForm_1 opcode, bits<9> xo, bit oe, dag OL, string asmstr> + : I { bits<5> RT; bits<5> RA; bits<5> RB; + bit RC = 0; // set by isDOT + let Inst{6-10} = RT; let Inst{11-15} = RA; let Inst{16-20} = RB; let Inst{21} = oe; let Inst{22-30} = xo; - let Inst{31} = rc; + let Inst{31} = RC; } -class XOForm_1r opcode, bits<9> xo, bit oe, bit rc, - dag OL, string asmstr> - : XOForm_1 { +class XOForm_1r opcode, bits<9> xo, bit oe, dag OL, string asmstr> + : XOForm_1 { let Inst{11-15} = RB; let Inst{16-20} = RA; } -class XOForm_3 opcode, bits<9> xo, bit oe, bit rc, +class XOForm_3 opcode, bits<9> xo, bit oe, dag OL, string asmstr> - : XOForm_1 { + : XOForm_1 { let RB = 0; } // 1.7.12 A-Form -class AForm_1 opcode, bits<5> xo, bit rc, dag OL, string asmstr> +class AForm_1 opcode, bits<5> xo, dag OL, string asmstr> : I { bits<5> FRT; bits<5> FRA; bits<5> FRC; bits<5> FRB; + bit RC = 0; // set by isDOT + let Inst{6-10} = FRT; let Inst{11-15} = FRA; let Inst{16-20} = FRB; let Inst{21-25} = FRC; let Inst{26-30} = xo; - let Inst{31} = rc; + let Inst{31} = RC; } -class AForm_2 opcode, bits<5> xo, bit rc, dag OL, string asmstr> - : AForm_1 { +class AForm_2 opcode, bits<5> xo, dag OL, string asmstr> + : AForm_1 { let FRC = 0; } -class AForm_3 opcode, bits<5> xo, bit rc, dag OL, - string asmstr> - : AForm_1 { +class AForm_3 opcode, bits<5> xo, dag OL, string asmstr> + : AForm_1 { let FRB = 0; } // 1.7.13 M-Form -class MForm_1 opcode, bit rc, dag OL, string asmstr> - : I { +class MForm_1 opcode, dag OL, string asmstr> : I { bits<5> RA; bits<5> RS; bits<5> RB; bits<5> MB; bits<5> ME; + bit RC = 0; // set by isDOT + let Inst{6-10} = RS; let Inst{11-15} = RA; let Inst{16-20} = RB; let Inst{21-25} = MB; let Inst{26-30} = ME; - let Inst{31} = rc; + let Inst{31} = RC; } -class MForm_2 opcode, bit rc, dag OL, string asmstr> - : MForm_1 { +class MForm_2 opcode, dag OL, string asmstr> + : MForm_1 { } // 1.7.14 MD-Form -class MDForm_1 opcode, bits<3> xo, bit rc, - dag OL, string asmstr> : I { +class MDForm_1 opcode, bits<3> xo, dag OL, string asmstr> + : I { bits<5> RS; bits<5> RA; bits<6> SH; bits<6> MBE; + bit RC = 0; // set by isDOT + let Inst{6-10} = RS; let Inst{11-15} = RA; let Inst{16-20} = SH{1-5}; let Inst{21-26} = MBE; let Inst{27-29} = xo; let Inst{30} = SH{0}; - let Inst{31} = rc; + let Inst{31} = RC; } //===----------------------------------------------------------------------===// Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.71 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.72 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.71 Tue Apr 19 00:15:18 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Tue Apr 19 00:21:30 2005 @@ -150,12 +150,10 @@ def STWU : DForm_3<37, (ops GPRC:$rS, s16imm:$disp, GPRC:$rA), "stwu $rS, $disp($rA)">; } -let Defs = [CR0] in { def ANDIo : DForm_4<28, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), - "andi. $dst, $src1, $src2">; + "andi. $dst, $src1, $src2">, isDOT; def ANDISo : DForm_4<29, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), - "andis. $dst, $src1, $src2">; -} + "andis. $dst, $src1, $src2">, isDOT; def ORI : DForm_4<24, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), "ori $dst, $src1, $src2">; def ORIS : DForm_4<25, (ops GPRC:$dst, GPRC:$src1, u16imm:$src2), @@ -374,124 +372,123 @@ // XO-Form instructions. Arithmetic instructions that can set overflow bit // -def ADD : XOForm_1<31, 266, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def ADD : XOForm_1<31, 266, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "add $rT, $rA, $rB">; -def ADDC : XOForm_1<31, 10, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def ADDC : XOForm_1<31, 10, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "addc $rT, $rA, $rB">; -def ADDE : XOForm_1<31, 138, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def ADDE : XOForm_1<31, 138, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "adde $rT, $rA, $rB">; -def DIVD : XOForm_1<31, 489, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def DIVD : XOForm_1<31, 489, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "divd $rT, $rA, $rB">, isPPC64; -def DIVDU : XOForm_1<31, 457, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def DIVDU : XOForm_1<31, 457, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "divdu $rT, $rA, $rB">, isPPC64; -def DIVW : XOForm_1<31, 491, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def DIVW : XOForm_1<31, 491, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "divw $rT, $rA, $rB">; -def DIVWU : XOForm_1<31, 459, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def DIVWU : XOForm_1<31, 459, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "divwu $rT, $rA, $rB">; -def MULHW : XOForm_1<31, 75, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def MULHW : XOForm_1<31, 75, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mulhw $rT, $rA, $rB">; -def MULHWU : XOForm_1<31, 11, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def MULHWU : XOForm_1<31, 11, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mulhwu $rT, $rA, $rB">; -def MULLD : XOForm_1<31, 233, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def MULLD : XOForm_1<31, 233, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mulld $rT, $rA, $rB">, isPPC64; -def MULLW : XOForm_1<31, 235, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def MULLW : XOForm_1<31, 235, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mullw $rT, $rA, $rB">; -def SUBF : XOForm_1<31, 40, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def SUBF : XOForm_1<31, 40, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "subf $rT, $rA, $rB">; -def SUBFC : XOForm_1<31, 8, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def SUBFC : XOForm_1<31, 8, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "subfc $rT, $rA, $rB">; -def SUBFE : XOForm_1<31, 136, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def SUBFE : XOForm_1<31, 136, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "subfe $rT, $rA, $rB">; -def SUB : XOForm_1r<31, 40, 0, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), +def SUB : XOForm_1r<31, 40, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "sub $rT, $rA, $rB">; -def ADDME : XOForm_3<31, 234, 0, 0, (ops GPRC:$rT, GPRC:$rA), +def ADDME : XOForm_3<31, 234, 0, (ops GPRC:$rT, GPRC:$rA), "addme $rT, $rA">; -def ADDZE : XOForm_3<31, 202, 0, 0, (ops GPRC:$rT, GPRC:$rA), +def ADDZE : XOForm_3<31, 202, 0, (ops GPRC:$rT, GPRC:$rA), "addze $rT, $rA">; -def NEG : XOForm_3<31, 104, 0, 0, (ops GPRC:$rT, GPRC:$rA), +def NEG : XOForm_3<31, 104, 0, (ops GPRC:$rT, GPRC:$rA), "neg $rT, $rA">; -def SUBFZE : XOForm_3<31, 200, 0, 0, (ops GPRC:$rT, GPRC:$rA), +def SUBFZE : XOForm_3<31, 200, 0, (ops GPRC:$rT, GPRC:$rA), "subfze $rT, $rA">; // A-Form instructions. Most of the instructions executed in the FPU are of // this type. // -def FMADD : AForm_1<63, 29, 0, +def FMADD : AForm_1<63, 29, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fmadd $FRT, $FRA, $FRC, $FRB">; -def FMADDS : AForm_1<59, 29, 0, +def FMADDS : AForm_1<59, 29, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fmadds $FRT, $FRA, $FRC, $FRB">; -def FMSUB : AForm_1<63, 28, 0, +def FMSUB : AForm_1<63, 28, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fmsub $FRT, $FRA, $FRC, $FRB">; -def FMSUBS : AForm_1<59, 28, 0, +def FMSUBS : AForm_1<59, 28, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fmsubs $FRT, $FRA, $FRC, $FRB">; -def FNMADD : AForm_1<63, 31, 0, +def FNMADD : AForm_1<63, 31, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fnmadd $FRT, $FRA, $FRC, $FRB">; -def FNMADDS : AForm_1<59, 31, 0, +def FNMADDS : AForm_1<59, 31, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fnmadds $FRT, $FRA, $FRC, $FRB">; -def FNMSUB : AForm_1<63, 30, 0, +def FNMSUB : AForm_1<63, 30, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fnmsub $FRT, $FRA, $FRC, $FRB">; -def FNMSUBS : AForm_1<59, 30, 0, +def FNMSUBS : AForm_1<59, 30, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fnmsubs $FRT, $FRA, $FRC, $FRB">; -def FSEL : AForm_1<63, 23, 0, +def FSEL : AForm_1<63, 23, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRC, FPRC:$FRB), "fsel $FRT, $FRA, $FRC, $FRB">; -def FADD : AForm_2<63, 21, 0, +def FADD : AForm_2<63, 21, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fadd $FRT, $FRA, $FRB">; -def FADDS : AForm_2<59, 21, 0, +def FADDS : AForm_2<59, 21, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fadds $FRT, $FRA, $FRB">; -def FDIV : AForm_2<63, 18, 0, +def FDIV : AForm_2<63, 18, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fdiv $FRT, $FRA, $FRB">; -def FDIVS : AForm_2<59, 18, 0, +def FDIVS : AForm_2<59, 18, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fdivs $FRT, $FRA, $FRB">; -def FMUL : AForm_3<63, 25, 0, +def FMUL : AForm_3<63, 25, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fmul $FRT, $FRA, $FRB">; -def FMULS : AForm_3<59, 25, 0, +def FMULS : AForm_3<59, 25, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fmuls $FRT, $FRA, $FRB">; -def FSUB : AForm_2<63, 20, 0, +def FSUB : AForm_2<63, 20, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fsub $FRT, $FRA, $FRB">; -def FSUBS : AForm_2<59, 20, 0, +def FSUBS : AForm_2<59, 20, (ops FPRC:$FRT, FPRC:$FRA, FPRC:$FRB), "fsubs $FRT, $FRA, $FRB">; // M-Form instructions. rotate and mask instructions. // let isTwoAddress = 1 in { -def RLWIMI : MForm_2<20, 0, +def RLWIMI : MForm_2<20, (ops GPRC:$rA, GPRC:$rSi, GPRC:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME), "rlwimi $rA, $rS, $SH, $MB, $ME">; } -def RLWINM : MForm_2<21, 0, +def RLWINM : MForm_2<21, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME), "rlwinm $rA, $rS, $SH, $MB, $ME">; -let Defs = [CR0] in -def RLWINMo : MForm_2<21, 1, +def RLWINMo : MForm_2<21, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME), - "rlwinm. $rA, $rS, $SH, $MB, $ME">; -def RLWNM : MForm_2<23, 0, + "rlwinm. $rA, $rS, $SH, $MB, $ME">, isDOT; +def RLWNM : MForm_2<23, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB, u5imm:$MB, u5imm:$ME), "rlwnm $rA, $rS, $rB, $MB, $ME">; // MD-Form instructions. 64 bit rotate instructions. // -def RLDICL : MDForm_1<30, 0, 0, +def RLDICL : MDForm_1<30, 0, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH, u6imm:$MB), "rldicl $rA, $rS, $SH, $MB">, isPPC64; -def RLDICR : MDForm_1<30, 1, 0, +def RLDICR : MDForm_1<30, 1, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH, u6imm:$ME), "rldicr $rA, $rS, $SH, $ME">, isPPC64; From lattner at cs.uiuc.edu Tue Apr 19 00:42:08 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 00:42:08 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp Message-ID: <200504190542.j3J5g8tF015676@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32CodeEmitter.cpp updated: 1.28 -> 1.29 --- Log message: Add completely untested support for mtcrf/mfcrf encoding --- Diffs of the changes: (+7 -0) PPC32CodeEmitter.cpp | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp diff -u llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp:1.28 llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp:1.29 --- llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp:1.28 Sun Apr 17 19:46:10 2005 +++ llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp Tue Apr 19 00:41:52 2005 @@ -186,6 +186,13 @@ // or things that get fixed up later by the JIT. if (MO.isRegister()) { rv = enumRegToMachineReg(MO.getReg()); + + // Special encoding for MTCRF and MFCRF, which uses a bit mask for the + // register, not the register number directly. + if ((MI.getOpcode() == PPC::MTCRF || MI.getOpcode() == PPC::MFCRF) && + (MO.getReg() >= PPC::CR0 && MO.getReg() <= PPC::CR7)) { + rv = 0x80 >> rv; + } } else if (MO.isImmediate()) { rv = MO.getImmedValue(); } else if (MO.isGlobalAddress() || MO.isExternalSymbol()) { From lattner at cs.uiuc.edu Tue Apr 19 01:04:35 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 01:04:35 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp Message-ID: <200504190604.j3J64ZCo016089@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: InstructionCombining.cpp updated: 1.321 -> 1.322 --- Log message: Eliminate a broken transformation, fixing PR548: http://llvm.cs.uiuc.edu/PR548 --- Diffs of the changes: (+2 -4) InstructionCombining.cpp | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.321 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.322 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.321 Thu Apr 7 23:03:26 2005 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Tue Apr 19 01:04:18 2005 @@ -1935,10 +1935,8 @@ } break; // (X == 13 | X == 15) -> no change - case Instruction::SetGT: - if (LHSCst == SubOne(RHSCst)) // (X == 13 | X > 14) -> X > 13 - return new SetCondInst(Instruction::SetGT, LHSVal, LHSCst); - break; // (X == 13 | X > 15) -> no change + case Instruction::SetGT: // (X == 13 | X > 14) -> no change + break; case Instruction::SetNE: // (X == 13 | X != 15) -> X != 15 case Instruction::SetLT: // (X == 13 | X < 15) -> X < 15 return ReplaceInstUsesWith(I, RHS); From lattner at cs.uiuc.edu Tue Apr 19 01:08:20 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 01:08:20 -0500 Subject: [llvm-commits] CVS: llvm/docs/ReleaseNotes.html Message-ID: <200504190608.j3J68K0D016120@apoc.cs.uiuc.edu> Changes in directory llvm/docs: ReleaseNotes.html updated: 1.307 -> 1.308 --- Log message: Bug fixed --- Diffs of the changes: (+3 -1) ReleaseNotes.html | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/docs/ReleaseNotes.html diff -u llvm/docs/ReleaseNotes.html:1.307 llvm/docs/ReleaseNotes.html:1.308 --- llvm/docs/ReleaseNotes.html:1.307 Wed Mar 30 13:14:24 2005 +++ llvm/docs/ReleaseNotes.html Tue Apr 19 01:08:04 2005 @@ -144,6 +144,8 @@
  1. [dse] DSE deletes stores that are partially overwritten by smaller stores
  2. +
  3. [instcombine] miscompilation of + setcc or setcc in one case

Code Generator Bugs:

@@ -598,7 +600,7 @@ src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /> The LLVM Compiler Infrastructure
- Last modified: $Date: 2005/03/30 19:14:24 $ + Last modified: $Date: 2005/04/19 06:08:04 $ From alkis at cs.uiuc.edu Tue Apr 19 02:03:38 2005 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Tue, 19 Apr 2005 02:03:38 -0500 Subject: [llvm-commits] CVS: llvm-java/lib/Compiler/VMClass.h VMClass.cpp Compiler.cpp Message-ID: <200504190703.CAA18906@zion.cs.uiuc.edu> Changes in directory llvm-java/lib/Compiler: VMClass.h updated: 1.32 -> 1.33 VMClass.cpp updated: 1.42 -> 1.43 Compiler.cpp updated: 1.280 -> 1.281 --- Log message: Rename dynamicallyBoundMethod to dynamicMethod. --- Diffs of the changes: (+23 -25) Compiler.cpp | 5 ++--- VMClass.cpp | 32 +++++++++++++++----------------- VMClass.h | 11 ++++++----- 3 files changed, 23 insertions(+), 25 deletions(-) Index: llvm-java/lib/Compiler/VMClass.h diff -u llvm-java/lib/Compiler/VMClass.h:1.32 llvm-java/lib/Compiler/VMClass.h:1.33 --- llvm-java/lib/Compiler/VMClass.h:1.32 Sat Apr 2 20:49:44 2005 +++ llvm-java/lib/Compiler/VMClass.h Tue Apr 19 02:03:27 2005 @@ -49,7 +49,8 @@ std::vector interfaces_; std::vector memberFields_; std::vector staticFields_; - std::vector dynamicallyBoundMethods_; + std::vector dynamicMethods_; + std::vector staticMethods_; GlobalVariable* classRecord_; void init(); @@ -109,11 +110,11 @@ bool isPrimitive() const { return getType() == getLayoutType(); } bool isInterface() const { return classFile_ && classFile_->isInterface(); } int getInterfaceIndex() const { return interfaceIndex_; } - unsigned getNumDynamicallyBoundMethods() const { - return dynamicallyBoundMethods_.size(); + unsigned getNumDynamicMethods() const { + return dynamicMethods_.size(); } - const VMMethod* getDynamicallyBoundMethod(unsigned i) const { - return dynamicallyBoundMethods_[i]; + const VMMethod* getDynamicMethod(unsigned i) const { + return dynamicMethods_[i]; } llvm::Constant* getClassRecord() const { return classRecord_; } Index: llvm-java/lib/Compiler/VMClass.cpp diff -u llvm-java/lib/Compiler/VMClass.cpp:1.42 llvm-java/lib/Compiler/VMClass.cpp:1.43 --- llvm-java/lib/Compiler/VMClass.cpp:1.42 Sat Apr 2 20:49:44 2005 +++ llvm-java/lib/Compiler/VMClass.cpp Tue Apr 19 02:03:27 2005 @@ -215,17 +215,16 @@ assert(interface->isInterface() && "Must be passed an interface!"); std::vector init; - init.reserve(interface->dynamicallyBoundMethods_.size()+1); + init.reserve(interface->getNumDynamicMethods() + 1); // Insert a null type info for this interface. init.push_back(llvm::Constant::getNullValue(resolver_->getTypeInfoType())); // For each method this interface declares, find the corresponding // method in this class and put it in its slot. - for (unsigned i = 0, e = interface->dynamicallyBoundMethods_.size(); - i != e; ++i) { + for (unsigned i = 0, e = interface->getNumDynamicMethods(); i != e; ++i) { assert(init.size() == i+1 && "Interface method not found in class!"); - const VMMethod* interfaceMethod = interface->dynamicallyBoundMethods_[i]; - for (unsigned j = 0, f = dynamicallyBoundMethods_.size(); j != f; ++j) { - const VMMethod* method = dynamicallyBoundMethods_[j]; + const VMMethod* interfaceMethod = interface->getDynamicMethod(i); + for (unsigned j = 0, f = getNumDynamicMethods(); j != f; ++j) { + const VMMethod* method = getDynamicMethod(j); if (method->getName() == interfaceMethod->getName() && method->getDescriptor() == interfaceMethod->getDescriptor()) { init.push_back(method->getFunction()); @@ -435,7 +434,7 @@ // Find dynamically bound methods. if (!isPrimitive()) { if (const VMClass* superClass = getSuperClass()) - dynamicallyBoundMethods_ = superClass->dynamicallyBoundMethods_; + dynamicMethods_ = superClass->dynamicMethods_; if (getClassFile()) { const Methods& methods = classFile_->getMethods(); @@ -449,12 +448,11 @@ methodMap_.insert( std::make_pair(name + descriptor, VMMethod(this, method))); // Otherwise we need to assign an index for it and update the - // dynamicallyBoundMethods_ vector. + // dynamicMethods_ vector. else { const VMMethod* overridenMethod = NULL; - for (unsigned i = 0, e = getNumDynamicallyBoundMethods(); - i != e; ++i) { - const VMMethod* m = getDynamicallyBoundMethod(i); + for (unsigned i = 0, e = getNumDynamicMethods(); i != e; ++i) { + const VMMethod* m = getDynamicMethod(i); if (m->getName() == name && m->getDescriptor() == descriptor) overridenMethod = m; } @@ -466,15 +464,15 @@ MethodMap::iterator i = methodMap_.insert( std::make_pair(name + descriptor, VMMethod(this, method, index))).first; - dynamicallyBoundMethods_[index] = &i->second; + dynamicMethods_[index] = &i->second; } // Otherwise assign it a new index. else { - int index = dynamicallyBoundMethods_.size(); + int index = dynamicMethods_.size(); MethodMap::iterator i = methodMap_.insert( std::make_pair( name + descriptor, VMMethod(this, method, index))).first; - dynamicallyBoundMethods_.push_back(&i->second); + dynamicMethods_.push_back(&i->second); } } } @@ -482,10 +480,10 @@ } std::vector init; - init.reserve(1 + getNumDynamicallyBoundMethods()); + init.reserve(1 + getNumDynamicMethods()); init.push_back(buildClassTypeInfo()); - for (unsigned i = 0, e = getNumDynamicallyBoundMethods(); i != e; ++i) { - const VMMethod* method = getDynamicallyBoundMethod(i); + for (unsigned i = 0, e = getNumDynamicMethods(); i != e; ++i) { + const VMMethod* method = getDynamicMethod(i); init.push_back( method->isAbstract() ? llvm::Constant::getNullValue(method->getFunction()->getType()) : Index: llvm-java/lib/Compiler/Compiler.cpp diff -u llvm-java/lib/Compiler/Compiler.cpp:1.280 llvm-java/lib/Compiler/Compiler.cpp:1.281 --- llvm-java/lib/Compiler/Compiler.cpp:1.280 Sat Apr 2 20:43:09 2005 +++ llvm-java/lib/Compiler/Compiler.cpp Tue Apr 19 02:03:27 2005 @@ -451,9 +451,8 @@ // Schedule all its dynamically bound non abstract methods for // compilation. - for (unsigned i = 0, e = clazz->getNumDynamicallyBoundMethods(); - i != e; ++i) { - const VMMethod* method = clazz->getDynamicallyBoundMethod(i); + for (unsigned i = 0, e = clazz->getNumDynamicMethods(); i != e; ++i) { + const VMMethod* method = clazz->getDynamicMethod(i); if (!method->isAbstract()) scheduleMethod(method); } From alkis at cs.uiuc.edu Tue Apr 19 02:11:18 2005 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Tue, 19 Apr 2005 02:11:18 -0500 Subject: [llvm-commits] CVS: llvm-java/lib/Compiler/VMClass.h VMClass.cpp Message-ID: <200504190711.CAA19031@zion.cs.uiuc.edu> Changes in directory llvm-java/lib/Compiler: VMClass.h updated: 1.33 -> 1.34 VMClass.cpp updated: 1.43 -> 1.44 --- Log message: Populate the staticMethods_ vector. --- Diffs of the changes: (+12 -3) VMClass.cpp | 9 ++++++--- VMClass.h | 6 ++++++ 2 files changed, 12 insertions(+), 3 deletions(-) Index: llvm-java/lib/Compiler/VMClass.h diff -u llvm-java/lib/Compiler/VMClass.h:1.33 llvm-java/lib/Compiler/VMClass.h:1.34 --- llvm-java/lib/Compiler/VMClass.h:1.33 Tue Apr 19 02:03:27 2005 +++ llvm-java/lib/Compiler/VMClass.h Tue Apr 19 02:11:07 2005 @@ -116,6 +116,12 @@ const VMMethod* getDynamicMethod(unsigned i) const { return dynamicMethods_[i]; } + unsigned getNumStaticMethods() const { + return staticMethods_.size(); + } + const VMMethod* getStaticMethod(unsigned i) const { + return staticMethods_[i]; + } llvm::Constant* getClassRecord() const { return classRecord_; } llvm::Constant* getConstant(unsigned index) const; Index: llvm-java/lib/Compiler/VMClass.cpp diff -u llvm-java/lib/Compiler/VMClass.cpp:1.43 llvm-java/lib/Compiler/VMClass.cpp:1.44 --- llvm-java/lib/Compiler/VMClass.cpp:1.43 Tue Apr 19 02:03:27 2005 +++ llvm-java/lib/Compiler/VMClass.cpp Tue Apr 19 02:11:07 2005 @@ -444,9 +444,12 @@ const std::string& descriptor = method->getDescriptor()->str(); // If method is statically bound just create it. - if (method->isPrivate() || method->isStatic() || name[0] == '<') - methodMap_.insert( - std::make_pair(name + descriptor, VMMethod(this, method))); + if (method->isPrivate() || method->isStatic() || name[0] == '<') { + MethodMap::iterator i = + methodMap_.insert( + std::make_pair(name + descriptor, VMMethod(this, method))); + staticMethods_.push_back(&i->second); + } // Otherwise we need to assign an index for it and update the // dynamicMethods_ vector. else { From alkis at cs.uiuc.edu Tue Apr 19 02:17:51 2005 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Tue, 19 Apr 2005 02:17:51 -0500 Subject: [llvm-commits] CVS: llvm-java/lib/Compiler/VMClass.cpp Message-ID: <200504190717.CAA19171@zion.cs.uiuc.edu> Changes in directory llvm-java/lib/Compiler: VMClass.cpp updated: 1.44 -> 1.45 --- Log message: Make constants' names consistent. --- Diffs of the changes: (+9 -9) VMClass.cpp | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) Index: llvm-java/lib/Compiler/VMClass.cpp diff -u llvm-java/lib/Compiler/VMClass.cpp:1.44 llvm-java/lib/Compiler/VMClass.cpp:1.45 --- llvm-java/lib/Compiler/VMClass.cpp:1.44 Tue Apr 19 02:11:07 2005 +++ llvm-java/lib/Compiler/VMClass.cpp Tue Apr 19 02:17:40 2005 @@ -37,7 +37,7 @@ false, GlobalVariable::ExternalLinkage, NULL, - getName() + "", + getName() + "", resolver_->getModule()); } @@ -205,7 +205,7 @@ true, GlobalVariable::ExternalLinkage, ConstantArray::get(superClassRecordsType, init), - getName() + "", + getName() + "", resolver_->getModule())); } @@ -241,7 +241,7 @@ true, GlobalVariable::ExternalLinkage, classRecordInit, - getName() + '+' + interface->getName() + "", + getName() + '+' + interface->getName() + "", resolver_->getModule()), resolver_->getClassRecordPtrType()); } @@ -280,7 +280,7 @@ true, GlobalVariable::ExternalLinkage, ConstantArray::get(interfaceClassRecordsType, init), - getName() + "", + getName() + "", resolver_->getModule())); } @@ -319,7 +319,7 @@ true, GlobalVariable::ExternalLinkage, ConstantArray::get(arrayType, init), - getName() + "", + getName() + "", resolver_->getModule())); } @@ -341,7 +341,7 @@ true, GlobalVariable::ExternalLinkage, ConstantArray::get(arrayType, init), - getName() + "", + getName() + "", resolver_->getModule())); } @@ -366,7 +366,7 @@ true, GlobalVariable::ExternalLinkage, ConstantArray::get(arrayType, init), - getName() + "", + getName() + "", resolver_->getModule())); } @@ -389,7 +389,7 @@ true, GlobalVariable::ExternalLinkage, ConstantArray::get(arrayType, init), - getName() + "", + getName() + "", resolver_->getModule())); } @@ -447,7 +447,7 @@ if (method->isPrivate() || method->isStatic() || name[0] == '<') { MethodMap::iterator i = methodMap_.insert( - std::make_pair(name + descriptor, VMMethod(this, method))); + std::make_pair(name + descriptor, VMMethod(this, method))).first; staticMethods_.push_back(&i->second); } // Otherwise we need to assign an index for it and update the From alkis at cs.uiuc.edu Tue Apr 19 02:26:58 2005 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Tue, 19 Apr 2005 02:26:58 -0500 Subject: [llvm-commits] CVS: llvm-java/lib/Compiler/VMMethod.cpp Message-ID: <200504190726.CAA19243@zion.cs.uiuc.edu> Changes in directory llvm-java/lib/Compiler: VMMethod.cpp updated: 1.3 -> 1.4 --- Log message: Add a FIXME. --- Diffs of the changes: (+5 -0) VMMethod.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm-java/lib/Compiler/VMMethod.cpp diff -u llvm-java/lib/Compiler/VMMethod.cpp:1.3 llvm-java/lib/Compiler/VMMethod.cpp:1.4 --- llvm-java/lib/Compiler/VMMethod.cpp:1.3 Sat Apr 2 03:41:59 2005 +++ llvm-java/lib/Compiler/VMMethod.cpp Tue Apr 19 02:26:47 2005 @@ -29,6 +29,11 @@ parent_->getName() + '/' + methodName + methodDescriptor; Resolver* resolver = parent_->getResolver(); + // FIXME: This type should be taken from the owning class's constant + // pool (parsed only once per class). This means the + // Resolver::getType() should be moved in VMClass and its return + // value should be cached in the constant pool along with the + // others. const FunctionType* functionType = cast( resolver->getType(methodDescriptor, !method_->isStatic())); Module* module = resolver->getModule(); From lattner at cs.uiuc.edu Tue Apr 19 10:27:47 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 10:27:47 -0500 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/.cvsignore Message-ID: <200504191527.j3JFRlFW017304@apoc.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: .cvsignore updated: 1.1 -> 1.2 --- Log message: fix PR549: http://llvm.cs.uiuc.edu/PR549 --- Diffs of the changes: (+3 -1) .cvsignore | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/lib/AsmParser/.cvsignore diff -u llvm/lib/AsmParser/.cvsignore:1.1 llvm/lib/AsmParser/.cvsignore:1.2 --- llvm/lib/AsmParser/.cvsignore:1.1 Mon Dec 2 15:14:54 2002 +++ llvm/lib/AsmParser/.cvsignore Tue Apr 19 10:27:29 2005 @@ -1,2 +1,4 @@ Lexer.cpp -llvmAsmParser.* +llvmAsmParser.cpp +llvmAsmParser.h +llvmAsmParser.output From lattner at cs.uiuc.edu Tue Apr 19 10:32:47 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 10:32:47 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/Record.cpp Message-ID: <200504191532.j3JFWlss017364@apoc.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: Record.cpp updated: 1.40 -> 1.41 --- Log message: fix bogus warning --- Diffs of the changes: (+1 -0) Record.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/utils/TableGen/Record.cpp diff -u llvm/utils/TableGen/Record.cpp:1.40 llvm/utils/TableGen/Record.cpp:1.41 --- llvm/utils/TableGen/Record.cpp:1.40 Mon Apr 18 22:36:21 2005 +++ llvm/utils/TableGen/Record.cpp Tue Apr 19 10:32:30 2005 @@ -303,6 +303,7 @@ int NewValue; switch (Op) { + default: assert(0 && "Unknown binop"); case SHL: NewValue = Value << RHSi->getValue(); break; case SRA: NewValue = Value >> RHSi->getValue(); break; case SRL: NewValue = (unsigned)Value >> (unsigned)RHSi->getValue(); break; From lattner at cs.uiuc.edu Tue Apr 19 10:34:49 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 10:34:49 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/.cvsignore Message-ID: <200504191534.j3JFYn7P017388@apoc.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: .cvsignore added (r1.1) --- Log message: ignore generated files --- Diffs of the changes: (+4 -0) .cvsignore | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/utils/TableGen/.cvsignore diff -c /dev/null llvm/utils/TableGen/.cvsignore:1.1 *** /dev/null Tue Apr 19 10:34:46 2005 --- llvm/utils/TableGen/.cvsignore Tue Apr 19 10:34:36 2005 *************** *** 0 **** --- 1,4 ---- + FileLexer.cpp + FileParser.cpp + FileParser.h + FileParser.output From lattner at cs.uiuc.edu Tue Apr 19 14:16:35 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 14:16:35 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/SCCP.cpp Message-ID: <200504191916.j3JJGZBV003539@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: SCCP.cpp updated: 1.121 -> 1.122 --- Log message: Wrap some long lines. Make IPSCCP strip off dead constant exprs that are using functions, making them appear as though their address is taken. This allows us to propagate some more pool descriptors, lowering the overhead of pool alloc. --- Diffs of the changes: (+9 -3) SCCP.cpp | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/Scalar/SCCP.cpp diff -u llvm/lib/Transforms/Scalar/SCCP.cpp:1.121 llvm/lib/Transforms/Scalar/SCCP.cpp:1.122 --- llvm/lib/Transforms/Scalar/SCCP.cpp:1.121 Mon Mar 14 22:54:21 2005 +++ llvm/lib/Transforms/Scalar/SCCP.cpp Tue Apr 19 14:16:19 2005 @@ -1141,6 +1141,9 @@ static bool AddressIsTaken(GlobalValue *GV) { + // Delete any dead constantexpr klingons. + GV->removeDeadConstantUsers(); + for (Value::use_iterator UI = GV->use_begin(), E = GV->use_end(); UI != E; ++UI) if (StoreInst *SI = dyn_cast(*UI)) { @@ -1173,7 +1176,8 @@ if (!F->hasInternalLinkage() || AddressIsTaken(F)) { if (!F->isExternal()) Solver.MarkBlockExecutable(F->begin()); - for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end(); AI != E; ++AI) + for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end(); + AI != E; ++AI) Values[AI].markOverdefined(); } else { Solver.AddTrackedFunction(F); @@ -1182,7 +1186,8 @@ // Loop over global variables. We inform the solver about any internal global // variables that do not have their 'addresses taken'. If they don't have // their addresses taken, we can propagate constants through them. - for (Module::global_iterator G = M.global_begin(), E = M.global_end(); G != E; ++G) + for (Module::global_iterator G = M.global_begin(), E = M.global_end(); + G != E; ++G) if (!G->isConstant() && G->hasInternalLinkage() && !AddressIsTaken(G)) Solver.TrackValueOfGlobalVariable(G); @@ -1204,7 +1209,8 @@ // std::set &ExecutableBBs = Solver.getExecutableBlocks(); for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) { - for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end(); AI != E; ++AI) + for (Function::arg_iterator AI = F->arg_begin(), E = F->arg_end(); + AI != E; ++AI) if (!AI->use_empty()) { LatticeVal &IV = Values[AI]; if (IV.isConstant() || IV.isUndefined()) { From brukman at cs.uiuc.edu Tue Apr 19 15:14:35 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 15:14:35 -0500 Subject: [llvm-commits] CVS: llvm-tv/tools/llvm-tv/GraphPrinters.cpp Message-ID: <200504192014.PAA27769@zion.cs.uiuc.edu> Changes in directory llvm-tv/tools/llvm-tv: GraphPrinters.cpp updated: 1.7 -> 1.8 --- Log message: Pass API changed: derive from ModulePass instead of Pass --- Diffs of the changes: (+6 -6) GraphPrinters.cpp | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm-tv/tools/llvm-tv/GraphPrinters.cpp diff -u llvm-tv/tools/llvm-tv/GraphPrinters.cpp:1.7 llvm-tv/tools/llvm-tv/GraphPrinters.cpp:1.8 --- llvm-tv/tools/llvm-tv/GraphPrinters.cpp:1.7 Tue Oct 5 16:30:49 2004 +++ llvm-tv/tools/llvm-tv/GraphPrinters.cpp Tue Apr 19 15:14:24 2005 @@ -60,8 +60,8 @@ } namespace { - struct CallGraphPrinter : public Pass { - virtual bool runPass(Module &M) { + struct CallGraphPrinter : public ModulePass { + virtual bool runOnModule(Module &M) { WriteGraphToFile(std::cerr, "callgraph", &getAnalysis()); return false; } @@ -85,12 +85,12 @@ namespace { template - class DSModulePrinter : public Pass { + class DSModulePrinter : public ModulePass { protected: virtual std::string getFilename() = 0; public: - bool runPass(Module &M) { + bool runOnModule(Module &M) { DSType *DS = &getAnalysis(); std::string File = getFilename(); std::ofstream of(File.c_str()); @@ -111,7 +111,7 @@ }; template - class DSFunctionPrinter : public Pass { + class DSFunctionPrinter : public ModulePass { protected: Function *F; virtual std::string getFilename(Function &F) = 0; @@ -119,7 +119,7 @@ public: DSFunctionPrinter(Function *_F) : F(_F) {} - bool runPass(Module &M) { + bool runOnModule(Module &M) { DSType *DS = &getAnalysis(); std::string File = getFilename(*F); std::ofstream of(File.c_str()); From brukman at cs.uiuc.edu Tue Apr 19 15:15:18 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 15:15:18 -0500 Subject: [llvm-commits] CVS: llvm-tv/tools/llvm-tv/Makefile Message-ID: <200504192015.PAA27806@zion.cs.uiuc.edu> Changes in directory llvm-tv/tools/llvm-tv: Makefile updated: 1.19 -> 1.20 --- Log message: * No need to eschew debugging, remove -DNDEBUG switch * Send terminal output of llvm-tv to /dev/null because DSA spews out warnings --- Diffs of the changes: (+3 -2) Makefile | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm-tv/tools/llvm-tv/Makefile diff -u llvm-tv/tools/llvm-tv/Makefile:1.19 llvm-tv/tools/llvm-tv/Makefile:1.20 --- llvm-tv/tools/llvm-tv/Makefile:1.19 Mon Apr 18 13:38:42 2005 +++ llvm-tv/tools/llvm-tv/Makefile Tue Apr 19 15:15:07 2005 @@ -7,7 +7,7 @@ # note: delete when FileUtils is assimilated into libsupport USEDLIBS = snapshot -CPPFLAGS = $(shell wx-config --cflags) -DNDEBUG +CPPFLAGS = $(shell wx-config --cflags) TOOLLINKOPTSB = $(shell wx-config --libs) WXDIR = $(shell wx-config --prefix) WXLIB = $(WXDIR)/lib @@ -20,7 +20,8 @@ LLVMTV = $(PROJ_OBJ_ROOT)/Debug/bin/llvm-tv $(LLVMToolDir)/llvm-tv.exe: Makefile - echo exec env LD_LIBRARY_PATH=$(WXLIB):\$$LD_LIBRARY_PATH $(LLVMTV) > $@ + echo exec env LD_LIBRARY_PATH=$(WXLIB):\$$LD_LIBRARY_PATH $(LLVMTV) \ + "2&>1 > /dev/null" > $@ chmod u+x $@ $(LLVMToolDir)/opt-snap: Makefile From lattner at cs.uiuc.edu Tue Apr 19 16:43:39 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 19 Apr 2005 16:43:39 -0500 Subject: [llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp Message-ID: <200504192143.j3JLhdvc015492@apoc.cs.uiuc.edu> Changes in directory llvm-poolalloc/lib/PoolAllocate: PoolAllocate.cpp updated: 1.117 -> 1.118 --- Log message: add a stat --- Diffs of the changes: (+2 -0) PoolAllocate.cpp | 2 ++ 1 files changed, 2 insertions(+) Index: llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp diff -u llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp:1.117 llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp:1.118 --- llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp:1.117 Sat Apr 2 15:40:49 2005 +++ llvm-poolalloc/lib/PoolAllocate/PoolAllocate.cpp Tue Apr 19 16:43:22 2005 @@ -51,6 +51,7 @@ Y("poolalloc-passing-all-pools", "Pool allocate disjoint data structures"); Statistic<> NumArgsAdded("poolalloc", "Number of function arguments added"); + Statistic<> MaxArgsAdded("poolalloc", "Maximum function arguments added to one function"); Statistic<> NumCloned ("poolalloc", "Number of functions cloned"); Statistic<> NumPools ("poolalloc", "Number of pools allocated"); Statistic<> NumTSPools ("poolalloc", "Number of typesafe pools"); @@ -311,6 +312,7 @@ // Update statistics.. NumArgsAdded += FI.ArgNodes.size(); + if (MaxArgsAdded < FI.ArgNodes.size()) MaxArgsAdded = FI.ArgNodes.size(); ++NumCloned; From brukman at cs.uiuc.edu Tue Apr 19 22:22:29 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 22:22:29 -0500 Subject: [llvm-commits] CVS: llvm/tools/gccld/GenerateCode.cpp gccld.h gccld.cpp Message-ID: <200504200322.WAA08920@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: GenerateCode.cpp updated: 1.45 -> 1.46 gccld.h updated: 1.13 -> 1.14 gccld.cpp updated: 1.97 -> 1.98 --- Log message: * Print commands as we execute them with `-v' * Add option `-save-temps' Patch contributed by Markus Oberhumer. --- Diffs of the changes: (+44 -21) GenerateCode.cpp | 20 ++++++++++++++++---- gccld.cpp | 36 ++++++++++++++++++++++-------------- gccld.h | 9 ++++++--- 3 files changed, 44 insertions(+), 21 deletions(-) Index: llvm/tools/gccld/GenerateCode.cpp diff -u llvm/tools/gccld/GenerateCode.cpp:1.45 llvm/tools/gccld/GenerateCode.cpp:1.46 --- llvm/tools/gccld/GenerateCode.cpp:1.45 Sun Apr 10 15:58:21 2005 +++ llvm/tools/gccld/GenerateCode.cpp Tue Apr 19 22:22:18 2005 @@ -120,6 +120,13 @@ return; } +static void dumpArgs(const char **args) { + std::cout << *args++; + while (*args) + std::cout << ' ' << *args++; + std::cout << '\n'; +} + static inline void addPass(PassManager &PM, Pass *P) { // Add the pass to the pass manager... PM.add(P); @@ -297,7 +304,8 @@ /// int llvm::GenerateAssembly(const std::string &OutputFilename, const std::string &InputFilename, - const sys::Path &llc) { + const sys::Path &llc, + bool Verbose) { // Run LLC to convert the bytecode file into assembly code. std::vector args; args.push_back(llc.c_str()); @@ -306,7 +314,7 @@ args.push_back(OutputFilename.c_str()); args.push_back(InputFilename.c_str()); args.push_back(0); - + if (Verbose) dumpArgs(&args[0]); return sys::Program::ExecuteAndWait(llc, &args[0]); } @@ -314,7 +322,8 @@ /// specified bytecode file. int llvm::GenerateCFile(const std::string &OutputFile, const std::string &InputFile, - const sys::Path &llc) { + const sys::Path &llc, + bool Verbose) { // Run LLC to convert the bytecode file into C. std::vector args; args.push_back(llc.c_str()); @@ -324,6 +333,7 @@ args.push_back(OutputFile.c_str()); args.push_back(InputFile.c_str()); args.push_back(0); + if (Verbose) dumpArgs(&args[0]); return sys::Program::ExecuteAndWait(llc, &args[0]); } @@ -349,7 +359,8 @@ const sys::Path &gcc, char ** const envp, bool Shared, const std::string &RPath, - const std::string &SOName) { + const std::string &SOName, + bool Verbose) { // Remove these environment variables from the environment of the // programs that we will execute. It appears that GCC sets these // environment variables so that the programs it uses can configure @@ -417,6 +428,7 @@ args.push_back(0); // Run the compiler to assembly and link together the program. + if (Verbose) dumpArgs(&args[0]); return sys::Program::ExecuteAndWait(gcc, &args[0], (const char**)clean_env); } Index: llvm/tools/gccld/gccld.h diff -u llvm/tools/gccld/gccld.h:1.13 llvm/tools/gccld/gccld.h:1.14 --- llvm/tools/gccld/gccld.h:1.13 Mon Feb 28 02:45:35 2005 +++ llvm/tools/gccld/gccld.h Tue Apr 19 22:22:18 2005 @@ -29,12 +29,14 @@ int GenerateAssembly (const std::string & OutputFilename, const std::string & InputFilename, - const sys::Path & llc); + const sys::Path & llc, + bool Verbose=false); int GenerateCFile (const std::string &OutputFile, const std::string &InputFile, - const sys::Path &llc); + const sys::Path &llc, + bool Verbose=false); int GenerateNative (const std::string & OutputFilename, const std::string & InputFilename, @@ -44,6 +46,7 @@ char ** const envp, bool Shared, const std::string & RPath, - const std::string & SOName); + const std::string & SOName, + bool Verbose=false); } // End llvm namespace Index: llvm/tools/gccld/gccld.cpp diff -u llvm/tools/gccld/gccld.cpp:1.97 llvm/tools/gccld/gccld.cpp:1.98 --- llvm/tools/gccld/gccld.cpp:1.97 Mon Feb 28 02:45:35 2005 +++ llvm/tools/gccld/gccld.cpp Tue Apr 19 22:22:18 2005 @@ -83,6 +83,10 @@ cl::opt NativeCBE("native-cbe", cl::desc("Generate a native binary with the C backend and GCC")); + + cl::opt + SaveTemps("save-temps", + cl::desc("Do not delete temporary files")); cl::opt RPath("rpath", @@ -300,16 +304,19 @@ // Generate an assembly language file for the bytecode. if (Verbose) std::cout << "Generating Assembly Code\n"; - GenerateAssembly(AssemblyFile.toString(), RealBytecodeOutput, llc); + GenerateAssembly(AssemblyFile.toString(), RealBytecodeOutput, llc, + Verbose); if (Verbose) std::cout << "Generating Native Code\n"; GenerateNative(OutputFilename, AssemblyFile.toString(), LibPaths, Libraries, gcc, envp, LinkAsLibrary, RPath, - SOName ); + SOName, Verbose); - // Remove the assembly language file. - AssemblyFile.destroyFile(); - // Remove the bytecode language file. - sys::Path(RealBytecodeOutput).destroyFile(); + if (!SaveTemps) { + // Remove the assembly language file. + AssemblyFile.destroyFile(); + // Remove the bytecode language file. + sys::Path(RealBytecodeOutput).destroyFile(); + } } else if (NativeCBE) { sys::Path CFile (OutputFilename); @@ -329,18 +336,19 @@ return PrintAndReturn(argv[0], "Failed to find gcc"); // Generate an assembly language file for the bytecode. - if (Verbose) std::cout << "Generating Assembly Code\n"; - GenerateCFile(CFile.toString(), RealBytecodeOutput, llc); + if (Verbose) std::cout << "Generating C Source Code\n"; + GenerateCFile(CFile.toString(), RealBytecodeOutput, llc, Verbose); if (Verbose) std::cout << "Generating Native Code\n"; GenerateNative(OutputFilename, CFile.toString(), LibPaths, Libraries, gcc, envp, LinkAsLibrary, RPath, - SOName ); + SOName, Verbose); - // Remove the assembly language file. - CFile.destroyFile(); - - // Remove the bytecode language file. - sys::Path(RealBytecodeOutput).destroyFile(); + if (!SaveTemps) { + // Remove the assembly language file. + CFile.destroyFile(); + // Remove the bytecode language file. + sys::Path(RealBytecodeOutput).destroyFile(); + } } else if (!LinkAsLibrary) { EmitShellScript(argv); From brukman at cs.uiuc.edu Tue Apr 19 22:53:10 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 22:53:10 -0500 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Archive/ArchiveInternals.h Message-ID: <200504200353.WAA09499@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Archive: ArchiveInternals.h updated: 1.3 -> 1.4 --- Log message: Align comments together for consistency --- Diffs of the changes: (+1 -1) ArchiveInternals.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Bytecode/Archive/ArchiveInternals.h diff -u llvm/lib/Bytecode/Archive/ArchiveInternals.h:1.3 llvm/lib/Bytecode/Archive/ArchiveInternals.h:1.4 --- llvm/lib/Bytecode/Archive/ArchiveInternals.h:1.3 Sat Nov 20 01:29:40 2004 +++ llvm/lib/Bytecode/Archive/ArchiveInternals.h Tue Apr 19 22:52:59 2005 @@ -39,7 +39,7 @@ /// @name Data /// @{ public: - char name[16];///< Name of the file member. + char name[16]; ///< Name of the file member. char date[12]; ///< File date, decimal seconds since Epoch char uid[6]; ///< user id in ASCII decimal char gid[6]; ///< group id in ASCII decimal From brukman at cs.uiuc.edu Tue Apr 19 22:55:46 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 22:55:46 -0500 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Archive/ArchiveWriter.cpp Message-ID: <200504200355.WAA09542@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Archive: ArchiveWriter.cpp updated: 1.15 -> 1.16 --- Log message: Initialize fields mode, uid, and gid. Patch by Markus Oberhumer. Thanks! --- Diffs of the changes: (+6 -0) ArchiveWriter.cpp | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/lib/Bytecode/Archive/ArchiveWriter.cpp diff -u llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.15 llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.16 --- llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.15 Thu Jan 27 19:17:07 2005 +++ llvm/lib/Bytecode/Archive/ArchiveWriter.cpp Tue Apr 19 22:55:35 2005 @@ -318,6 +318,12 @@ memcpy(Hdr.name,ARFILE_LLVM_SYMTAB_NAME,16); uint64_t secondsSinceEpoch = sys::TimeValue::now().toEpochTime(); char buffer[32]; + sprintf(buffer, "%-8o", 0644); + memcpy(Hdr.mode,buffer,8); + sprintf(buffer, "%-6u", getuid()); + memcpy(Hdr.uid,buffer,6); + sprintf(buffer, "%-6u", getgid()); + memcpy(Hdr.gid,buffer,6); sprintf(buffer,"%-12u", unsigned(secondsSinceEpoch)); memcpy(Hdr.date,buffer,12); sprintf(buffer,"%-10u",symTabSize); From brukman at cs.uiuc.edu Tue Apr 19 23:04:18 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 23:04:18 -0500 Subject: [llvm-commits] CVS: llvm/lib/System/Unix/Path.inc Message-ID: <200504200404.XAA13616@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Unix: Path.inc updated: 1.30 -> 1.31 --- Log message: Ignore dangling symlinks in getDirectoryContents() Thanks to Markus Oberhumer for the patch! --- Diffs of the changes: (+8 -3) Path.inc | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) Index: llvm/lib/System/Unix/Path.inc diff -u llvm/lib/System/Unix/Path.inc:1.30 llvm/lib/System/Unix/Path.inc:1.31 --- llvm/lib/System/Unix/Path.inc:1.30 Tue Mar 1 23:45:56 2005 +++ llvm/lib/System/Unix/Path.inc Tue Apr 19 23:04:07 2005 @@ -398,17 +398,22 @@ result.clear(); struct dirent* de = ::readdir(direntries); - while (de != 0) { + for ( ; de != 0; de = ::readdir(direntries)) { if (de->d_name[0] != '.') { Path aPath(path + (const char*)de->d_name); struct stat buf; - if (0 != stat(aPath.path.c_str(), &buf)) + if (0 != stat(aPath.path.c_str(), &buf)) { + int saved_errno = errno; + struct stat st; + if (0 == lstat(aPath.path.c_str(), &st) && S_ISLNK(st.st_mode)) + continue; // dangling symlink -- ignore + errno = saved_errno; ThrowErrno(aPath.path + ": can't get status"); + } if (S_ISDIR(buf.st_mode)) aPath.path += "/"; result.insert(aPath); } - de = ::readdir(direntries); } closedir(direntries); From brukman at cs.uiuc.edu Tue Apr 19 23:07:57 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 23:07:57 -0500 Subject: [llvm-commits] CVS: llvm/tools/gccld/gccld.h Message-ID: <200504200407.XAA13889@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: gccld.h updated: 1.14 -> 1.15 --- Log message: Consistently eschew space between `*' or `&' and function argument name --- Diffs of the changes: (+12 -12) gccld.h | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) Index: llvm/tools/gccld/gccld.h diff -u llvm/tools/gccld/gccld.h:1.14 llvm/tools/gccld/gccld.h:1.15 --- llvm/tools/gccld/gccld.h:1.14 Tue Apr 19 22:22:18 2005 +++ llvm/tools/gccld/gccld.h Tue Apr 19 23:07:47 2005 @@ -21,15 +21,15 @@ namespace llvm { int -GenerateBytecode (Module * M, +GenerateBytecode (Module *M, int StripLevel, bool Internalize, - std::ostream * Out); + std::ostream *Out); int -GenerateAssembly (const std::string & OutputFilename, - const std::string & InputFilename, - const sys::Path & llc, +GenerateAssembly (const std::string &OutputFilename, + const std::string &InputFilename, + const sys::Path &llc, bool Verbose=false); int @@ -38,15 +38,15 @@ const sys::Path &llc, bool Verbose=false); int -GenerateNative (const std::string & OutputFilename, - const std::string & InputFilename, - const std::vector & LibPaths, - const std::vector & Libraries, - const sys::Path & gcc, +GenerateNative (const std::string &OutputFilename, + const std::string &InputFilename, + const std::vector &LibPaths, + const std::vector &Libraries, + const sys::Path &gcc, char ** const envp, bool Shared, - const std::string & RPath, - const std::string & SOName, + const std::string &RPath, + const std::string &SOName, bool Verbose=false); } // End llvm namespace From brukman at cs.uiuc.edu Tue Apr 19 23:08:46 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 23:08:46 -0500 Subject: [llvm-commits] CVS: llvm/tools/gccld/gccld.cpp GenerateCode.cpp Message-ID: <200504200408.XAA13918@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: gccld.cpp updated: 1.98 -> 1.99 GenerateCode.cpp updated: 1.46 -> 1.47 --- Log message: Eliminate trailing spaces at end-of-line --- Diffs of the changes: (+18 -18) GenerateCode.cpp | 14 +++++++------- gccld.cpp | 22 +++++++++++----------- 2 files changed, 18 insertions(+), 18 deletions(-) Index: llvm/tools/gccld/gccld.cpp diff -u llvm/tools/gccld/gccld.cpp:1.98 llvm/tools/gccld/gccld.cpp:1.99 --- llvm/tools/gccld/gccld.cpp:1.98 Tue Apr 19 22:22:18 2005 +++ llvm/tools/gccld/gccld.cpp Tue Apr 19 23:08:35 2005 @@ -46,9 +46,9 @@ OutputFilename("o", cl::desc("Override output filename"), cl::init("a.out"), cl::value_desc("filename")); - cl::opt + cl::opt Verbose("v", cl::desc("Print information about actions taken")); - + cl::list LibPaths("L", cl::desc("Specify a library search path"), cl::Prefix, cl::value_desc("directory")); @@ -77,29 +77,29 @@ Relink("r", cl::desc("Alias for -link-as-library"), cl::aliasopt(LinkAsLibrary)); - cl::opt + cl::opt Native("native", cl::desc("Generate a native binary instead of a shell script")); - cl::opt + cl::opt NativeCBE("native-cbe", cl::desc("Generate a native binary with the C backend and GCC")); - cl::opt + cl::opt SaveTemps("save-temps", cl::desc("Do not delete temporary files")); - + cl::opt RPath("rpath", cl::desc("Set runtime shared library search path (requires -native or" " -native-cbe)"), cl::Prefix, cl::value_desc("directory")); - + cl::opt SOName("soname", cl::desc("Set internal name of shared library (requires -native or" " -native-cbe)"), cl::Prefix, cl::value_desc("name")); - + // Compatibility options that are ignored but supported by LD cl::opt CO4("version-script", cl::Hidden, cl::desc("Compatibility option: ignored")); @@ -317,7 +317,7 @@ // Remove the bytecode language file. sys::Path(RealBytecodeOutput).destroyFile(); } - + } else if (NativeCBE) { sys::Path CFile (OutputFilename); CFile.appendSuffix("cbe.c"); @@ -352,7 +352,7 @@ } else if (!LinkAsLibrary) { EmitShellScript(argv); - + // Make the bytecode file readable and directly executable in LLEE sys::Path(RealBytecodeOutput).makeExecutable(); sys::Path(RealBytecodeOutput).makeReadable(); @@ -360,7 +360,7 @@ // Make the output, whether native or script, executable as well... sys::Path(OutputFilename).makeExecutable(); - + } catch (const char*msg) { std::cerr << argv[0] << ": " << msg << "\n"; exitCode = 1; Index: llvm/tools/gccld/GenerateCode.cpp diff -u llvm/tools/gccld/GenerateCode.cpp:1.46 llvm/tools/gccld/GenerateCode.cpp:1.47 --- llvm/tools/gccld/GenerateCode.cpp:1.46 Tue Apr 19 22:22:18 2005 +++ llvm/tools/gccld/GenerateCode.cpp Tue Apr 19 23:08:35 2005 @@ -130,7 +130,7 @@ static inline void addPass(PassManager &PM, Pass *P) { // Add the pass to the pass manager... PM.add(P); - + // If we are verifying all of the intermediate steps, add the verifier... if (Verify) PM.add(createVerifierPass()); } @@ -144,12 +144,12 @@ if (FullPath.isArchive() ) { std::string ErrorMessage; Archive* ar = Archive::OpenAndLoadSymbols( FullPath, &ErrorMessage ); - return ar->isBytecodeArchive(); + return ar->isBytecodeArchive(); } return false; } -static bool isBytecodeLPath(const std::string &LibPath) { +static bool isBytecodeLPath(const std::string &LibPath) { bool isBytecodeLPath = false; // Make sure the -L path has a '/' character @@ -174,7 +174,7 @@ if ( File->isDirectory() ) continue; - + std::string path = File->toString(); std::string dllsuffix = sys::Path::GetDLLSuffix(); @@ -183,7 +183,7 @@ if ( path.find(dllsuffix, path.size()-dllsuffix.size()) == std::string::npos && path.find(".a", path.size()-2) == std::string::npos ) continue; - + // Finally, check to see if the file is a true bytecode file if (isBytecodeLibrary(*File)) isBytecodeLPath = true; @@ -391,7 +391,7 @@ args.push_back("-o"); args.push_back(OutputFilename.c_str()); args.push_back(InputFilename.c_str()); - + if (Shared) args.push_back("-shared"); if (!RPath.empty()) { std::string rp = "-Wl,-rpath," + RPath; @@ -401,7 +401,7 @@ std::string so = "-Wl,-soname," + SOName; args.push_back(so.c_str()); } - + // Add in the libpaths to find the libraries. // // Note: From brukman at cs.uiuc.edu Tue Apr 19 23:47:05 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 23:47:05 -0500 Subject: [llvm-commits] CVS: llvm-test/Makefile.config.in Message-ID: <200504200447.XAA15542@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.config.in updated: 1.10 -> 1.11 --- Log message: Fix comment: Makefile.config is a configuration makefile, the "master Makefile" is Makefile.rules --- Diffs of the changes: (+1 -1) Makefile.config.in | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/Makefile.config.in diff -u llvm-test/Makefile.config.in:1.10 llvm-test/Makefile.config.in:1.11 --- llvm-test/Makefile.config.in:1.10 Sat Jan 15 21:16:09 2005 +++ llvm-test/Makefile.config.in Tue Apr 19 23:46:54 2005 @@ -20,7 +20,7 @@ # Set the root directory of this project's install prefix PROJ_INSTALL_ROOT := @prefix@ -# Include LLVM's Master Makefile. +# Include LLVM's configuration Makefile. include $(LLVM_OBJ_ROOT)/Makefile.config #Set SourceDir for backwards compatbility. From brukman at cs.uiuc.edu Tue Apr 19 23:51:40 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Tue, 19 Apr 2005 23:51:40 -0500 Subject: [llvm-commits] CVS: llvm/tools/llvmc/CompilerDriver.cpp Message-ID: <200504200451.XAA15625@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvmc: CompilerDriver.cpp updated: 1.27 -> 1.28 --- Log message: #include system headers after all LLVM headers --- Diffs of the changes: (+1 -2) CompilerDriver.cpp | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/tools/llvmc/CompilerDriver.cpp diff -u llvm/tools/llvmc/CompilerDriver.cpp:1.27 llvm/tools/llvmc/CompilerDriver.cpp:1.28 --- llvm/tools/llvmc/CompilerDriver.cpp:1.27 Mon Apr 11 00:48:04 2005 +++ llvm/tools/llvmc/CompilerDriver.cpp Tue Apr 19 23:51:29 2005 @@ -20,9 +20,8 @@ #include "llvm/System/Signals.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/StringExtras.h" -#include #include "llvm/Config/alloca.h" - +#include using namespace llvm; namespace { From lattner at cs.uiuc.edu Wed Apr 20 01:25:06 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 20 Apr 2005 01:25:06 -0500 Subject: [llvm-commits] CVS: llvm-test/External/FPGrowth/Makefile Message-ID: <200504200625.j3K6P6SJ029242@apoc.cs.uiuc.edu> Changes in directory llvm-test/External/FPGrowth: Makefile updated: 1.5 -> 1.6 --- Log message: add a LARGE_PROBLEM_SIZE input --- Diffs of the changes: (+4 -0) Makefile | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm-test/External/FPGrowth/Makefile diff -u llvm-test/External/FPGrowth/Makefile:1.5 llvm-test/External/FPGrowth/Makefile:1.6 --- llvm-test/External/FPGrowth/Makefile:1.5 Sat Jan 15 21:16:09 2005 +++ llvm-test/External/FPGrowth/Makefile Wed Apr 20 01:24:49 2005 @@ -6,5 +6,9 @@ SourceDir := $(FPGROWTH_ROOT) STDIN_FILENAME := $(PROJ_SRC_DIR)/input +ifdef LARGE_PROBLEM_SIZE +RUN_OPTIONS = $(FPGROWTH_ROOT)/pumsb_star.dat +else RUN_OPTIONS = $(FPGROWTH_ROOT)/mushroom.dat +endif include $(LEVEL)/MultiSource/Makefile.multisrc From lattner at cs.uiuc.edu Wed Apr 20 07:06:00 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 20 Apr 2005 07:06:00 -0500 Subject: [llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp Message-ID: <200504201206.j3KC60ch010133@apoc.cs.uiuc.edu> Changes in directory llvm-poolalloc/lib/PoolAllocate: Heuristic.cpp updated: 1.10 -> 1.11 --- Log message: add an option to force 8-byte alignment --- Diffs of the changes: (+6 -0) Heuristic.cpp | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp diff -u llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp:1.10 llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp:1.11 --- llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp:1.10 Mon Apr 11 16:34:22 2005 +++ llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp Wed Apr 20 07:05:43 2005 @@ -45,6 +45,10 @@ clEnumVal(NoNodes, " Do not pool allocate anything"), clEnumValEnd), cl::init(AllButUnreachableFromMemory)); + + cl::opt + DisableAlignOpt("poolalloc-disable-alignopt", + cl::desc("Force all pool alignment to 8 bytes")); } Heuristic::~Heuristic() {} @@ -61,6 +65,8 @@ /// Wants8ByteAlignment - FIXME: this is a complete hack for X86 right now. static bool Wants8ByteAlignment(const Type *Ty, unsigned Offs, const TargetData &TD) { + if (DisableAlignOpt) return true; + if ((Offs & 7) == 0) { // Doubles always want to be 8-byte aligned. if (Ty == Type::DoubleTy) return true; From brukman at cs.uiuc.edu Wed Apr 20 10:33:33 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Wed, 20 Apr 2005 10:33:33 -0500 Subject: [llvm-commits] CVS: llvm/lib/System/Unix/Path.inc Message-ID: <200504201533.KAA20096@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Unix: Path.inc updated: 1.31 -> 1.32 --- Log message: Do not mark directories as `executable', we only want program files Patch by Markus Oberhumer. --- Diffs of the changes: (+4 -0) Path.inc | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/lib/System/Unix/Path.inc diff -u llvm/lib/System/Unix/Path.inc:1.31 llvm/lib/System/Unix/Path.inc:1.32 --- llvm/lib/System/Unix/Path.inc:1.31 Tue Apr 19 23:04:07 2005 +++ llvm/lib/System/Unix/Path.inc Wed Apr 20 10:33:22 2005 @@ -311,6 +311,10 @@ bool Path::executable() const { + struct stat st; + int r = stat(path.c_str(), &st); + if (r != 0 || !S_ISREG(st.st_mode)) + return false; return 0 == access(path.c_str(), R_OK | X_OK ); } From brukman at cs.uiuc.edu Wed Apr 20 10:42:22 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Wed, 20 Apr 2005 10:42:22 -0500 Subject: [llvm-commits] CVS: llvm/lib/System/Unix/Program.inc Message-ID: <200504201542.KAA20207@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Unix: Program.inc updated: 1.11 -> 1.12 --- Log message: Add FIXME by Markus Oberhumer from bug 545: http://llvm.cs.uiuc.edu/PR545 : not checking for "." in $PATH may result in returning executable files that won't be runnable. --- Diffs of the changes: (+2 -0) Program.inc | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/System/Unix/Program.inc diff -u llvm/lib/System/Unix/Program.inc:1.11 llvm/lib/System/Unix/Program.inc:1.12 --- llvm/lib/System/Unix/Program.inc:1.11 Sat Jan 15 22:23:22 2005 +++ llvm/lib/System/Unix/Program.inc Wed Apr 20 10:42:11 2005 @@ -44,6 +44,8 @@ Path temp; if (!temp.setFile(progName)) // invalid name return Path(); + // FIXME: have to check for absolute filename - we cannot assume anything + // about "." being in $PATH if (temp.executable()) // already executable as is return temp; From brukman at cs.uiuc.edu Wed Apr 20 11:05:14 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Wed, 20 Apr 2005 11:05:14 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/CBackend/CTargetMachine.h Writer.cpp Message-ID: <200504201605.LAA25587@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/CBackend: CTargetMachine.h updated: 1.5 -> 1.6 Writer.cpp updated: 1.235 -> 1.236 --- Log message: Remove trailing whitespace, patch by Markus Oberhumer. --- Diffs of the changes: (+59 -59) CTargetMachine.h | 6 +- Writer.cpp | 112 +++++++++++++++++++++++++++---------------------------- 2 files changed, 59 insertions(+), 59 deletions(-) Index: llvm/lib/Target/CBackend/CTargetMachine.h diff -u llvm/lib/Target/CBackend/CTargetMachine.h:1.5 llvm/lib/Target/CBackend/CTargetMachine.h:1.6 --- llvm/lib/Target/CBackend/CTargetMachine.h:1.5 Sat Jul 10 21:48:49 2004 +++ llvm/lib/Target/CBackend/CTargetMachine.h Wed Apr 20 11:05:03 2005 @@ -1,12 +1,12 @@ //===-- CTargetMachine.h - TargetMachine for the C backend ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // This file declares the TargetMachine that is used by the C backend. // //===----------------------------------------------------------------------===// Index: llvm/lib/Target/CBackend/Writer.cpp diff -u llvm/lib/Target/CBackend/Writer.cpp:1.235 llvm/lib/Target/CBackend/Writer.cpp:1.236 --- llvm/lib/Target/CBackend/Writer.cpp:1.235 Sat Mar 19 11:35:11 2005 +++ llvm/lib/Target/CBackend/Writer.cpp Wed Apr 20 11:05:03 2005 @@ -1,10 +1,10 @@ //===-- Writer.cpp - Library for converting LLVM code to C ----------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This library converts LLVM code to C code, compilable by GCC and other C @@ -59,11 +59,11 @@ virtual bool runOnModule(Module &M); }; - + /// CWriter - This class is the main chunk of code that converts an LLVM /// module to a C translation unit. class CWriter : public FunctionPass, public InstVisitor { - std::ostream &Out; + std::ostream &Out; IntrinsicLowering &IL; Mangler *Mang; LoopInfo *LI; @@ -144,7 +144,7 @@ // Must be an expression, must be used exactly once. If it is dead, we // emit it inline where it would go. if (I.getType() == Type::VoidTy || !I.hasOneUse() || - isa(I) || isa(I) || isa(I) || + isa(I) || isa(I) || isa(I) || isa(I) || isa(I) || isa(I)) // Don't inline a load across a store or other bad things! return false; @@ -226,7 +226,7 @@ bool CBackendNameAllUsedStructs::runOnModule(Module &M) { // Get a set of types that are used by the program... std::set UT = getAnalysis().getTypes(); - + // Loop over the module symbol table, removing types from UT that are // already named, and removing names for types that are not used. // @@ -283,7 +283,7 @@ std::cerr << "Unknown primitive type: " << *Ty << "\n"; abort(); } - + // Check to see if the type is named. if (!IgnoreName || isa(Ty)) { std::map::iterator I = TypeNames.find(Ty); @@ -293,7 +293,7 @@ switch (Ty->getTypeID()) { case Type::FunctionTyID: { const FunctionType *MTy = cast(Ty); - std::stringstream FunctionInnards; + std::stringstream FunctionInnards; FunctionInnards << " (" << NameSoFar << ") ("; for (FunctionType::param_iterator I = MTy->param_begin(), E = MTy->param_end(); I != E; ++I) { @@ -302,7 +302,7 @@ printType(FunctionInnards, *I, ""); } if (MTy->isVarArg()) { - if (MTy->getNumParams()) + if (MTy->getNumParams()) FunctionInnards << ", ..."; } else if (!MTy->getNumParams()) { FunctionInnards << "void"; @@ -323,7 +323,7 @@ Out << ";\n"; } return Out << '}'; - } + } case Type::PointerTyID: { const PointerType *PTy = cast(Ty); @@ -362,7 +362,7 @@ // As a special case, print the array as a string if it is an array of // ubytes or an array of sbytes with positive values. - // + // const Type *ETy = CPA->getType()->getElementType(); bool isString = (ETy == Type::SByteTy || ETy == Type::UByteTy); @@ -370,7 +370,7 @@ if (isString && (CPA->getNumOperands() == 0 || !cast(*(CPA->op_end()-1))->isNullValue())) isString = false; - + if (isString) { Out << '\"'; // Keep track of whether the last number was a hexadecimal escape @@ -379,7 +379,7 @@ // Do not include the last character, which we know is null for (unsigned i = 0, e = CPA->getNumOperands()-1; i != e; ++i) { unsigned char C = cast(CPA->getOperand(i))->getRawValue(); - + // Print it out literally if it is a printable character. The only thing // to be careful about is when the last letter output was a hex escape // code, in which case we have to be careful not to print out hex digits @@ -401,7 +401,7 @@ case '\v': Out << "\\v"; break; case '\a': Out << "\\a"; break; case '\"': Out << "\\\""; break; - case '\'': Out << "\\\'"; break; + case '\'': Out << "\\\'"; break; default: Out << "\\x"; Out << (char)(( C/16 < 10) ? ( C/16 +'0') : ( C/16 -10+'A')); @@ -580,7 +580,7 @@ } else { if (IsNAN(FPC->getValue())) { // The value is NaN - + // The prefix for a quiet NaN is 0x7FF8. For a signalling NaN, // it's 0x7ff4. const unsigned long QuietNaN = 0x7ff8UL; @@ -698,10 +698,10 @@ Out << ')'; return; } - + Constant* CPV = dyn_cast(Operand); if (CPV && !isa(CPV)) { - printConstant(CPV); + printConstant(CPV); } else { Out << Mang->getValueName(Operand); } @@ -771,7 +771,7 @@ // Define NaN and Inf as GCC builtins if using GCC, as 0 otherwise // From the GCC documentation: - // + // // double __builtin_nan (const char *str) // // This is an implementation of the ISO C99 function nan. @@ -824,7 +824,7 @@ TheModule = &M; IL.AddPrototypes(M); - + // Ensure that all structure types have names... Mang = new Mangler(M); @@ -837,11 +837,11 @@ // Provide a definition for `bool' if not compiling with a C++ compiler. Out << "\n" << "#ifndef __cplusplus\ntypedef unsigned char bool;\n#endif\n" - + << "\n\n/* Support for floating point constants */\n" << "typedef unsigned long long ConstantDoubleTy;\n" << "typedef unsigned int ConstantFloatTy;\n" - + << "\n\n/* Global Declarations */\n"; // First output all the declarations for the program, because C requires @@ -868,7 +868,7 @@ Out << "\n/* Function Declarations */\n"; for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { // Don't print declarations for intrinsic functions. - if (!I->getIntrinsicID() && + if (!I->getIntrinsicID() && I->getName() != "setjmp" && I->getName() != "longjmp") { printFunctionSignature(I, true); if (I->hasWeakLinkage()) Out << " __ATTRIBUTE_WEAK__"; @@ -965,9 +965,9 @@ if (!isFPCSafeToPrint(FPC) && // Do not put in FPConstantMap if safe. !FPConstantMap.count(FPC)) { double Val = FPC->getValue(); - + FPConstantMap[FPC] = FPCounter; // Number the FP constants - + if (FPC->getType() == Type::DoubleTy) { DBLUnion.D = Val; Out << "static const ConstantDoubleTy FPConstant" << FPCounter++ @@ -981,7 +981,7 @@ } else assert(0 && "Unknown float type!"); } - + Out << '\n'; } @@ -996,7 +996,7 @@ // If there are no type names, exit early. if (I == End) return; - + // Print out forward declarations for structure types before anything else! Out << "/* Structure forward decls */\n"; for (; I != End; ++I) @@ -1017,7 +1017,7 @@ printType(Out, Ty, Name); Out << ";\n"; } - + Out << '\n'; // Keep track of which structures have been printed so far... @@ -1047,10 +1047,10 @@ if (isa(Ty1) || isa(Ty1)) printContainedStructs(*I, StructPrinted); } - + //Print structure type out.. StructPrinted.insert(STy); - std::string Name = TypeNames[STy]; + std::string Name = TypeNames[STy]; printType(Out, STy, Name, true); Out << ";\n\n"; } @@ -1066,15 +1066,15 @@ void CWriter::printFunctionSignature(const Function *F, bool Prototype) { if (F->hasInternalLinkage()) Out << "static "; - + // Loop over the arguments, printing them... const FunctionType *FT = cast(F->getFunctionType()); - - std::stringstream FunctionInnards; - + + std::stringstream FunctionInnards; + // Print out the name... FunctionInnards << Mang->getValueName(F) << '('; - + if (!F->isExternal()) { if (!F->arg_empty()) { std::string ArgName; @@ -1086,7 +1086,7 @@ FunctionInnards << ", "; if (I->hasName() || !Prototype) ArgName = Mang->getValueName(I); - else + else ArgName = ""; printType(FunctionInnards, I->getType(), ArgName); } @@ -1128,7 +1128,7 @@ Out << " "; printType(Out, I->getType(), Mang->getValueName(&*I)); Out << ";\n"; - + if (isa(*I)) { // Print out PHI node temporaries as well... Out << " "; printType(Out, I->getType(), @@ -1151,7 +1151,7 @@ printBasicBlock(BB); } } - + Out << "}\n\n"; } @@ -1173,7 +1173,7 @@ if (BBLoop == L) printBasicBlock(BB); else if (BB == BBLoop->getHeader() && BBLoop->getParentLoop() == L) - printLoop(BBLoop); + printLoop(BBLoop); } Out << " } while (1); /* end of syntactic loop '" << L->getHeader()->getName() << "' */\n"; @@ -1192,9 +1192,9 @@ NeedsLabel = true; break; } - + if (NeedsLabel) Out << Mang->getValueName(BB) << ":\n"; - + // Output all of the instructions in the basic block... for (BasicBlock::iterator II = BB->begin(), E = --BB->end(); II != E; ++II) { @@ -1207,7 +1207,7 @@ Out << ";\n"; } } - + // Don't emit prefix or suffix for the terminator... visit(*BB->getTerminator()); } @@ -1218,7 +1218,7 @@ // void CWriter::visitReturnInst(ReturnInst &I) { // Don't output a void return if this is the last basic block in the function - if (I.getNumOperands() == 0 && + if (I.getNumOperands() == 0 && &*--I.getParent()->getParent()->end() == I.getParent() && !I.getParent()->size() == 1) { return; @@ -1272,7 +1272,7 @@ } void CWriter::printPHICopiesForSuccessor (BasicBlock *CurBlock, - BasicBlock *Successor, + BasicBlock *Successor, unsigned Indent) { for (BasicBlock::iterator I = Successor->begin(); isa(I); ++I) { PHINode *PN = cast(I); @@ -1306,10 +1306,10 @@ Out << " if ("; writeOperand(I.getCondition()); Out << ") {\n"; - + printPHICopiesForSuccessor (I.getParent(), I.getSuccessor(0), 2); printBranchToBlock(I.getParent(), I.getSuccessor(0), 2); - + if (isGotoCodeNecessary(I.getParent(), I.getSuccessor(1))) { Out << " } else {\n"; printPHICopiesForSuccessor (I.getParent(), I.getSuccessor(1), 2); @@ -1407,9 +1407,9 @@ if (isa(I.getType())&&I.getOperand(0)->getType()->isIntegral() || isa(I.getOperand(0)->getType())&&I.getType()->isIntegral()) { // Avoid "cast to pointer from integer of different size" warnings - Out << "(long)"; + Out << "(long)"; } - + writeOperand(I.getOperand(0)); } @@ -1420,7 +1420,7 @@ writeOperand(I.getTrueValue()); Out << ") : ("; writeOperand(I.getFalseValue()); - Out << "))"; + Out << "))"; } @@ -1444,9 +1444,9 @@ default: // All other intrinsic calls we must lower. Instruction *Before = 0; - if (CI != &BB->front()) + if (CI != &BB->front()) Before = prior(BasicBlock::iterator(CI)); - + IL.LowerIntrinsicCall(CI); if (Before) { // Move iterator to instruction after call I = Before; ++I; @@ -1464,9 +1464,9 @@ if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID()) { switch (ID) { default: assert(0 && "Unknown LLVM intrinsic!"); - case Intrinsic::vastart: + case Intrinsic::vastart: Out << "0; "; - + Out << "va_start(*(va_list*)&" << Mang->getValueName(&I) << ", "; // Output the last argument to the enclosing function... if (I.getParent()->getParent()->arg_empty()) { @@ -1529,7 +1529,7 @@ } Value *Callee = I.getCalledValue(); - + // GCC is really a PITA. It does not permit codegening casts of functions to // function pointers if they are in a call (it generates a trap instruction // instead!). We work around this by inserting a cast to void* in between the @@ -1567,7 +1567,7 @@ const PointerType *PTy = cast(Callee->getType()); const FunctionType *FTy = cast(PTy->getElementType()); const Type *RetTy = FTy->getReturnType(); - + if (!WroteCallee) writeOperand(Callee); Out << '('; @@ -1596,7 +1596,7 @@ } } Out << ')'; -} +} void CWriter::visitMallocInst(MallocInst &I) { assert(0 && "lowerallocations pass didn't work!"); @@ -1711,7 +1711,7 @@ Out << Mang->getValueName(I.getOperand(0)); Out << "; va_arg(*(va_list*)&" << Mang->getValueName(&I) << ", "; printType(Out, I.getArgType()); - Out << ')'; + Out << ')'; } void CWriter::visitVAArgInst(VAArgInst &I) { From brukman at cs.uiuc.edu Wed Apr 20 11:42:43 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Wed, 20 Apr 2005 11:42:43 -0500 Subject: [llvm-commits] CVS: llvm/examples/BFtoLLVM/BFtoLLVM.cpp Message-ID: <200504201642.LAA29916@zion.cs.uiuc.edu> Changes in directory llvm/examples/BFtoLLVM: BFtoLLVM.cpp updated: 1.1 -> 1.2 --- Log message: Remove trailing whitespace at the end of lines --- Diffs of the changes: (+6 -6) BFtoLLVM.cpp | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/examples/BFtoLLVM/BFtoLLVM.cpp diff -u llvm/examples/BFtoLLVM/BFtoLLVM.cpp:1.1 llvm/examples/BFtoLLVM/BFtoLLVM.cpp:1.2 --- llvm/examples/BFtoLLVM/BFtoLLVM.cpp:1.1 Tue Oct 5 13:05:26 2004 +++ llvm/examples/BFtoLLVM/BFtoLLVM.cpp Wed Apr 20 11:42:31 2005 @@ -1,10 +1,10 @@ //===-- BFtoLLVM.cpp - BF language Front End for LLVM ---------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This is a simple front end for the BF language. It is compatible with the @@ -60,7 +60,7 @@ std::string ptr = gensym (op + "ptr"), val = gensym (op + "val"), result = gensym (op + "result"); - dest << ptr << " = load sbyte** %ptrbox\n" + dest << ptr << " = load sbyte** %ptrbox\n" << val << " = load sbyte* " << ptr << "\n" << result << " = add sbyte " << val << ", " << (int)delta << "\n" << "store sbyte " << result << ", sbyte* " << ptr << "\n"; @@ -172,7 +172,7 @@ char *sourceFileName = argv[1]; char *destFileName = argv[2]; - + std::ifstream src (sourceFileName); if (!src.good()) { std::cerr << sourceFileName << ": " << strerror(errno) << "\n"; @@ -184,7 +184,7 @@ std::cerr << destFileName << ": " << strerror(errno) << "\n"; return 1; } - + emitDeclarations(dest); emitMainFunctionProlog(dest); @@ -199,7 +199,7 @@ repeatCount = 0; } consume (lastCh, repeatCount, dest); - + emitMainFunctionEpilog(dest); src.close(); From brukman at cs.uiuc.edu Wed Apr 20 11:42:43 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Wed, 20 Apr 2005 11:42:43 -0500 Subject: [llvm-commits] CVS: llvm/examples/Fibonacci/fibonacci.cpp Message-ID: <200504201642.LAA29925@zion.cs.uiuc.edu> Changes in directory llvm/examples/Fibonacci: fibonacci.cpp updated: 1.6 -> 1.7 --- Log message: Remove trailing whitespace at the end of lines --- Diffs of the changes: (+9 -9) fibonacci.cpp | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) Index: llvm/examples/Fibonacci/fibonacci.cpp diff -u llvm/examples/Fibonacci/fibonacci.cpp:1.6 llvm/examples/Fibonacci/fibonacci.cpp:1.7 --- llvm/examples/Fibonacci/fibonacci.cpp:1.6 Tue Mar 15 01:12:30 2005 +++ llvm/examples/Fibonacci/fibonacci.cpp Wed Apr 20 11:42:32 2005 @@ -1,10 +1,10 @@ //===--- examples/Fibonacci/fibonacci.cpp - An example use of the JIT -----===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by Valery A. Khamenya and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This small program provides an example of how to build quickly a small module @@ -17,7 +17,7 @@ // if(x<=2) return 1; // return fib(x-1)+fib(x-2); // } -// +// // Once we have this, we compile the module via JIT, then execute the `fib' // function and return result to a driver, i.e. to a "host program". // @@ -38,10 +38,10 @@ // Create the fib function and insert it into module M. This function is said // to return an int and take an int parameter. Function *FibF = M->getOrInsertFunction("fib", Type::IntTy, Type::IntTy, 0); - + // Add a basic block to the function. BasicBlock *BB = new BasicBlock("EntryBlock", FibF); - + // Get pointers to the constants. Value *One = ConstantSInt::get(Type::IntTy, 1); Value *Two = ConstantSInt::get(Type::IntTy, 2); @@ -61,11 +61,11 @@ // Create: ret int 1 new ReturnInst(One, RetBB); - + // create fib(x-1) Value *Sub = BinaryOperator::createSub(ArgX, One, "arg", RecurseBB); Value *CallFibX1 = new CallInst(FibF, Sub, "fibx1", RecurseBB); - + // create fib(x-2) Sub = BinaryOperator::createSub(ArgX, Two, "arg", RecurseBB); Value *CallFibX2 = new CallInst(FibF, Sub, "fibx2", RecurseBB); @@ -73,7 +73,7 @@ // fib(x-1)+fib(x-2) Value *Sum = BinaryOperator::createAdd(CallFibX1, CallFibX2, "addresult", RecurseBB); - + // Create the return instruction and add it to the basic block new ReturnInst(Sum, RecurseBB); @@ -90,7 +90,7 @@ // We are about to create the "fib" function: Function *FibF = CreateFibFunction(M); - // Now we going to create JIT + // Now we going to create JIT ExistingModuleProvider *MP = new ExistingModuleProvider(M); ExecutionEngine *EE = ExecutionEngine::create(MP, false); From brukman at cs.uiuc.edu Wed Apr 20 11:42:45 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Wed, 20 Apr 2005 11:42:45 -0500 Subject: [llvm-commits] CVS: llvm/examples/HowToUseJIT/HowToUseJIT.cpp Message-ID: <200504201642.LAA29936@zion.cs.uiuc.edu> Changes in directory llvm/examples/HowToUseJIT: HowToUseJIT.cpp updated: 1.7 -> 1.8 --- Log message: Remove trailing whitespace at the end of lines --- Diffs of the changes: (+15 -15) HowToUseJIT.cpp | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) Index: llvm/examples/HowToUseJIT/HowToUseJIT.cpp diff -u llvm/examples/HowToUseJIT/HowToUseJIT.cpp:1.7 llvm/examples/HowToUseJIT/HowToUseJIT.cpp:1.8 --- llvm/examples/HowToUseJIT/HowToUseJIT.cpp:1.7 Tue Mar 15 01:20:55 2005 +++ llvm/examples/HowToUseJIT/HowToUseJIT.cpp Wed Apr 20 11:42:34 2005 @@ -1,37 +1,37 @@ //===-- examples/HowToUseJIT/HowToUseJIT.cpp - An example use of the JIT --===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by Valery A. Khamenya and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This small program provides an example of how to quickly build a small -// module with two functions and execute it with the JIT. -// -// Goal: +// module with two functions and execute it with the JIT. +// +// Goal: // The goal of this snippet is to create in the memory // the LLVM module consisting of two functions as follow: // // int add1(int x) { // return x+1; // } -// +// // int foo() { // return add1(10); // } -// -// then compile the module via JIT, then execute the `foo' +// +// then compile the module via JIT, then execute the `foo' // function and return result to a driver, i.e. to a "host program". -// +// // Some remarks and questions: -// +// // - could we invoke some code using noname functions too? -// e.g. evaluate "foo()+foo()" without fears to introduce +// e.g. evaluate "foo()+foo()" without fears to introduce // conflict of temporary function name with some real // existing function name? -// +// //===----------------------------------------------------------------------===// #include "llvm/Module.h" @@ -56,7 +56,7 @@ // Add a basic block to the function. As before, it automatically inserts // because of the last argument. BasicBlock *BB = new BasicBlock("EntryBlock", Add1F); - + // Get pointers to the constant `1'. Value *One = ConstantSInt::get(Type::IntTy, 1); @@ -67,7 +67,7 @@ // Create the add instruction, inserting it into the end of BB. Instruction *Add = BinaryOperator::createAdd(One, ArgX, "addresult", BB); - + // Create the return instruction and add it to the basic block new ReturnInst(Add, BB); @@ -88,7 +88,7 @@ std::vector Params; Params.push_back(Ten); CallInst * Add1CallRes = new CallInst(Add1F, Params, "add1", BB); - + // Create the return instruction and add it to the basic block. new ReturnInst(Add1CallRes, BB); From brukman at cs.uiuc.edu Wed Apr 20 11:42:46 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Wed, 20 Apr 2005 11:42:46 -0500 Subject: [llvm-commits] CVS: llvm/examples/ModuleMaker/ModuleMaker.cpp Message-ID: <200504201642.LAA29943@zion.cs.uiuc.edu> Changes in directory llvm/examples/ModuleMaker: ModuleMaker.cpp updated: 1.5 -> 1.6 --- Log message: Remove trailing whitespace at the end of lines --- Diffs of the changes: (+11 -11) ModuleMaker.cpp | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) Index: llvm/examples/ModuleMaker/ModuleMaker.cpp diff -u llvm/examples/ModuleMaker/ModuleMaker.cpp:1.5 llvm/examples/ModuleMaker/ModuleMaker.cpp:1.6 --- llvm/examples/ModuleMaker/ModuleMaker.cpp:1.5 Tue Mar 15 09:46:23 2005 +++ llvm/examples/ModuleMaker/ModuleMaker.cpp Wed Apr 20 11:42:35 2005 @@ -1,10 +1,10 @@ //===- examples/ModuleMaker/ModuleMaker.cpp - Example project ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This programs is a simple example that creates an LLVM module "from scratch", @@ -26,36 +26,36 @@ // Create the "module" or "program" or "translation unit" to hold the // function Module *M = new Module("test"); - + // Create the main function: first create the type 'int ()' FunctionType *FT = FunctionType::get(Type::IntTy, std::vector(), /*not vararg*/false); - + // By passing a module as the last parameter to the Function constructor, // it automatically gets appended to the Module. Function *F = new Function(FT, Function::ExternalLinkage, "main", M); - + // Add a basic block to the function... again, it automatically inserts // because of the last argument. BasicBlock *BB = new BasicBlock("EntryBlock", F); - + // Get pointers to the constant integers... Value *Two = ConstantSInt::get(Type::IntTy, 2); Value *Three = ConstantSInt::get(Type::IntTy, 3); - + // Create the add instruction... does not insert... Instruction *Add = BinaryOperator::create(Instruction::Add, Two, Three, "addresult"); - + // explicitly insert it into the basic block... BB->getInstList().push_back(Add); - + // Create the return instruction and add it to the basic block BB->getInstList().push_back(new ReturnInst(Add)); - + // Output the bytecode file to stdout WriteBytecodeToFile(M, std::cout); - + // Delete the module and all of its contents. delete M; return 0; From brukman at cs.uiuc.edu Wed Apr 20 14:01:39 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Wed, 20 Apr 2005 14:01:39 -0500 Subject: [llvm-commits] CVS: llvm-tv/tools/llvm-tv/CodeViewer.cpp Message-ID: <200504201901.OAA02782@zion.cs.uiuc.edu> Changes in directory llvm-tv/tools/llvm-tv: CodeViewer.cpp updated: 1.10 -> 1.11 --- Log message: Per Chris' request, highlight definitions of operands in green. --- Diffs of the changes: (+17 -2) CodeViewer.cpp | 19 +++++++++++++++++-- 1 files changed, 17 insertions(+), 2 deletions(-) Index: llvm-tv/tools/llvm-tv/CodeViewer.cpp diff -u llvm-tv/tools/llvm-tv/CodeViewer.cpp:1.10 llvm-tv/tools/llvm-tv/CodeViewer.cpp:1.11 --- llvm-tv/tools/llvm-tv/CodeViewer.cpp:1.10 Tue Oct 5 13:44:44 2004 +++ llvm-tv/tools/llvm-tv/CodeViewer.cpp Wed Apr 20 14:01:26 2005 @@ -69,7 +69,9 @@ // Populate it with BasicBlocks and Instructions from F. for (Function::iterator BB = F->begin(), BBe = F->end(); BB != BBe; ++BB) { - itemList.push_back(new TVCodeItem(BB)); + TVCodeItem *TCBB = new TVCodeItem(BB); + itemList.push_back(TCBB); + ValueToItem[BB] = TCBB; for (BasicBlock::iterator I = BB->begin(), Ie = BB->end(); I != Ie; ++I) { TVCodeItem *TCI = new TVCodeItem(I); itemList.push_back(TCI); @@ -107,9 +109,15 @@ Value *V = itemList[event.GetIndex ()]->getValue(); if (!V) return; - // Highlight uses + // Highlight uses in red for (User::use_iterator u = V->use_begin(), e = V->use_end(); u != e; ++u) changeItemTextAttrs (ValueToItem[*u], wxRED, wxBOLD); + + // Highlight definitions of operands in green + if (User *U = dyn_cast(V)) + for (User::op_iterator op = U->op_begin(), e = U->op_end(); op != e; ++op) + if (TVCodeItem *TCI = ValueToItem[*op]) + changeItemTextAttrs (TCI, wxGREEN, wxBOLD); } void TVCodeListCtrl::OnItemDeselected(wxListEvent &event) { @@ -119,6 +127,13 @@ // Set uses back to normal for (User::use_iterator u = V->use_begin(), e = V->use_end(); u != e; ++u) changeItemTextAttrs (ValueToItem[*u], wxBLACK, wxNORMAL); + + // Set definitions of operands back to normal + if (User *U = dyn_cast(V)) + for (User::op_iterator op = U->op_begin(), e = U->op_end(); op != e; ++op) + if (TVCodeItem *TCI = ValueToItem[*op]) + changeItemTextAttrs (ValueToItem[*op], wxBLACK, wxNORMAL); + } BEGIN_EVENT_TABLE (TVCodeListCtrl, wxListCtrl) From reid at x10sys.com Wed Apr 20 21:30:43 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 20 Apr 2005 21:30:43 -0500 Subject: [llvm-commits] CVS: llvm/lib/System/Unix/Unix.h Message-ID: <200504210230.VAA06628@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Unix: Unix.h updated: 1.12 -> 1.13 --- Log message: For Bug 543: http://llvm.cs.uiuc.edu/PR543 : Allow the ThrowErrno function to optionally accept an error number parameter so that callers can specify the error number to be used. --- Diffs of the changes: (+8 -6) Unix.h | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) Index: llvm/lib/System/Unix/Unix.h diff -u llvm/lib/System/Unix/Unix.h:1.12 llvm/lib/System/Unix/Unix.h:1.13 --- llvm/lib/System/Unix/Unix.h:1.12 Mon Feb 14 15:42:10 2005 +++ llvm/lib/System/Unix/Unix.h Wed Apr 20 21:30:32 2005 @@ -66,24 +66,26 @@ # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif -inline void ThrowErrno(const std::string& prefix) { +inline void ThrowErrno(const std::string& prefix, int errnum = -1) { char buffer[MAXPATHLEN]; buffer[0] = 0; + if (errnum == -1) + errnum = errno; #ifdef HAVE_STRERROR_R // strerror_r is thread-safe. - if (errno) - strerror_r(errno,buffer,MAXPATHLEN-1); + if (errnum) + strerror_r(errnum,buffer,MAXPATHLEN-1); #elif HAVE_STRERROR // Copy the thread un-safe result of strerror into // the buffer as fast as possible to minimize impact // of collision of strerror in multiple threads. - if (errno) - strncpy(buffer,strerror(errno),MAXPATHLEN-1); + if (errnum) + strncpy(buffer,strerror(errnum),MAXPATHLEN-1); buffer[MAXPATHLEN-1] = 0; #else // Strange that this system doesn't even have strerror // but, oh well, just use a generic message - sprintf(buffer, "Error #%d", errno); + sprintf(buffer, "Error #%d", errnum); #endif throw prefix + ": " + buffer; } From reid at x10sys.com Wed Apr 20 21:50:21 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 20 Apr 2005 21:50:21 -0500 Subject: [llvm-commits] CVS: llvm/lib/System/Unix/Path.inc Message-ID: <200504210250.VAA06864@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Unix: Path.inc updated: 1.32 -> 1.33 --- Log message: For Bug 543: http://llvm.cs.uiuc.edu/PR543 : Standardize the error messages to be in "path: what failed: why" format. Also attempt to use the correct errno to ThrowErrno in situations where the errno value is erased by subsequent system calls. --- Diffs of the changes: (+24 -24) Path.inc | 48 ++++++++++++++++++++++++------------------------ 1 files changed, 24 insertions(+), 24 deletions(-) Index: llvm/lib/System/Unix/Path.inc diff -u llvm/lib/System/Unix/Path.inc:1.32 llvm/lib/System/Unix/Path.inc:1.33 --- llvm/lib/System/Unix/Path.inc:1.32 Wed Apr 20 10:33:22 2005 +++ llvm/lib/System/Unix/Path.inc Wed Apr 20 21:50:10 2005 @@ -91,7 +91,7 @@ char pathname[MAXPATHLEN]; strcpy(pathname,"/tmp/llvm_XXXXXX"); if (0 == mkdtemp(pathname)) - ThrowErrno(std::string(pathname) + ": Can't create temporary directory"); + ThrowErrno(std::string(pathname) + ": can't create temporary directory"); Path result; result.setDirectory(pathname); assert(result.isValid() && "mkdtemp didn't create a valid pathname!"); @@ -106,11 +106,11 @@ strcpy(pathname, "/tmp/llvm_XXXXXX"); int fd = 0; if (-1 == (fd = mkstemp(pathname))) - ThrowErrno(std::string(pathname) + ": Can't create temporary directory"); + ThrowErrno(std::string(pathname) + ": can't create temporary directory"); ::close(fd); ::unlink(pathname); // start race condition, ignore errors if (-1 == ::mkdir(pathname, S_IRWXU)) // end race condition - ThrowErrno(std::string(pathname) + ": Can't create temporary directory"); + ThrowErrno(std::string(pathname) + ": can't create temporary directory"); Path result; result.setDirectory(pathname); assert(result.isValid() && "mkstemp didn't create a valid pathname!"); @@ -125,9 +125,9 @@ strcpy(pathname, "/tmp/llvm_XXXXXX"); char *TmpName = ::mktemp(pathname); if (TmpName == 0) - throw std::string(TmpName) + ": Can't create unique directory name"; + ThrowErrno(std::string(TmpName) + ": can't create unique directory name"); if (-1 == ::mkdir(TmpName, S_IRWXU)) - ThrowErrno(std::string(TmpName) + ": Can't create temporary directory"); + ThrowErrno(std::string(TmpName) + ": can't create temporary directory"); Path result; result.setDirectory(TmpName); assert(result.isValid() && "mktemp didn't create a valid pathname!"); @@ -148,7 +148,7 @@ sprintf(pathname, "/tmp/llvm_%010u", unsigned(num)); } while ( 0 == access(pathname, F_OK ) ); if (-1 == ::mkdir(pathname, S_IRWXU)) - ThrowErrno(std::string(pathname) + ": Can't create temporary directory"); + ThrowErrno(std::string(pathname) + ": can't create temporary directory"); Path result; result.setDirectory(pathname); assert(result.isValid() && "mkstemp didn't create a valid pathname!"); @@ -344,7 +344,7 @@ Path::getStatusInfo(StatusInfo& info) const { struct stat buf; if (0 != stat(path.c_str(), &buf)) { - ThrowErrno(std::string("Can't get status for path: ")+path); + ThrowErrno(path + ": can't determine type of path object: "); } info.fileSize = buf.st_size; info.modTime.fromEpochTime(buf.st_mtime); @@ -407,12 +407,12 @@ Path aPath(path + (const char*)de->d_name); struct stat buf; if (0 != stat(aPath.path.c_str(), &buf)) { - int saved_errno = errno; + int stat_errno = errno; struct stat st; if (0 == lstat(aPath.path.c_str(), &st) && S_ISLNK(st.st_mode)) continue; // dangling symlink -- ignore - errno = saved_errno; - ThrowErrno(aPath.path + ": can't get status"); + ThrowErrno(aPath.path + + ": can't determine file object type", stat_errno); } if (S_ISDIR(buf.st_mode)) aPath.path += "/"; @@ -566,7 +566,7 @@ *next = 0; if (0 != access(pathname, F_OK | R_OK | W_OK)) if (0 != mkdir(pathname, S_IRWXU | S_IRWXG)) - ThrowErrno(std::string(pathname) + ": Can't create directory"); + ThrowErrno(std::string(pathname) + ": can't create directory"); char* save = next; next = strchr(next+1,'/'); *save = '/'; @@ -575,7 +575,7 @@ if (0 != access(pathname, F_OK | R_OK)) if (0 != mkdir(pathname, S_IRWXU | S_IRWXG)) - ThrowErrno(std::string(pathname) + ": Can't create directory"); + ThrowErrno(std::string(pathname) + ": can't create directory"); return true; } @@ -587,7 +587,7 @@ // Create the file int fd = ::creat(path.c_str(), S_IRUSR | S_IWUSR); if (fd < 0) - ThrowErrno(path + ": Can't create file"); + ThrowErrno(path + ": can't create file"); ::close(fd); return true; @@ -634,7 +634,7 @@ else pathname[lastchar+1] = 0; if ( 0 != rmdir(pathname)) - ThrowErrno(std::string(pathname) + ": Can't destroy directory"); + ThrowErrno(std::string(pathname) + ": can't destroy directory"); } return true; } @@ -643,7 +643,7 @@ Path::destroyFile() const { if (!isFile()) return false; if (0 != unlink(path.c_str())) - ThrowErrno(path + ": Can't destroy file"); + ThrowErrno(path + ": can't destroy file"); return true; } @@ -651,8 +651,8 @@ Path::renameFile(const Path& newName) { if (!isFile()) return false; if (0 != rename(path.c_str(), newName.c_str())) - ThrowErrno(std::string("can't rename ") + path + " as " + - newName.toString()); + ThrowErrno(std::string("can't rename '") + path + "' as '" + + newName.toString() + "' "); return true; } @@ -676,24 +676,24 @@ try { inFile = ::open(Src.c_str(), O_RDONLY); if (inFile == -1) - ThrowErrno("Cannnot open source file to copy: " + Src.toString()); + ThrowErrno(Src.toString() + ": can't open source file to copy: "); outFile = ::open(Dest.c_str(), O_WRONLY|O_CREAT, 0666); if (outFile == -1) - ThrowErrno("Cannnot create destination file for copy: " +Dest.toString()); + ThrowErrno(Dest.toString() +": can't create destination file for copy: "); char Buffer[16*1024]; while (ssize_t Amt = ::read(inFile, Buffer, 16*1024)) { if (Amt == -1) { if (errno != EINTR && errno != EAGAIN) - ThrowErrno("Can't read source file: " + Src.toString()); + ThrowErrno(Src.toString()+": can't read source file: "); } else { char *BufPtr = Buffer; while (Amt) { ssize_t AmtWritten = ::write(outFile, BufPtr, Amt); if (AmtWritten == -1) { if (errno != EINTR && errno != EAGAIN) - ThrowErrno("Can't write destination file: " + Dest.toString()); + ThrowErrno(Dest.toString() + ": can't write destination file: "); } else { Amt -= AmtWritten; BufPtr += AmtWritten; @@ -726,7 +726,7 @@ #if defined(HAVE_MKSTEMP) int TempFD; if ((TempFD = mkstemp(FNBuffer)) == -1) { - ThrowErrno("Cannot make unique filename for '" + path + "'"); + ThrowErrno(path + ": can't make unique filename"); } // We don't need to hold the temp file descriptor... we will trust that no one @@ -738,7 +738,7 @@ #elif defined(HAVE_MKTEMP) // If we don't have mkstemp, use the old and obsolete mktemp function. if (mktemp(FNBuffer) == 0) { - ThrowErrno("Cannot make unique filename for '" + path + "'"); + ThrowErrno(path + ": can't make unique filename"); } // Save the name @@ -752,7 +752,7 @@ path = FNBuffer; } if (FCounter > 999999) - throw std::string("Cannot make unique filename for '" + path + "'"); + throw std::string(path + ": can't make unique filename: too many files"); #endif } From lattner at cs.uiuc.edu Wed Apr 20 23:46:28 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 20 Apr 2005 23:46:28 -0500 Subject: [llvm-commits] CVS: llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html 2005-05-21-PLDI-PoolAlloc.pdf 2005-05-21-PLDI-PoolAlloc.ps index.html Message-ID: <200504210446.j3L4kS0r024241@apoc.cs.uiuc.edu> Changes in directory llvm-www/pubs: 2005-05-21-PLDI-PoolAlloc.html added (r1.1) 2005-05-21-PLDI-PoolAlloc.pdf added (r1.1) 2005-05-21-PLDI-PoolAlloc.ps added (r1.1) index.html updated: 1.14 -> 1.15 --- Log message: Add the PLDI paper. --- Diffs of the changes: (+27764 -0) 2005-05-21-PLDI-PoolAlloc.html | 75 2005-05-21-PLDI-PoolAlloc.pdf | 0 2005-05-21-PLDI-PoolAlloc.ps |27682 +++++++++++++++++++++++++++++++++++++++++ index.html | 7 4 files changed, 27764 insertions(+) Index: llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html diff -c /dev/null llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html:1.1 *** /dev/null Wed Apr 20 23:46:21 2005 --- llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html Wed Apr 20 23:46:11 2005 *************** *** 0 **** --- 1,75 ---- + + + + + + Automatic Pool Allocation: Improving Performance by Controlling + Data Structure Layout in the Heap + + + +
+ Automatic Pool Allocation: Improving Performance by Controlling Data Structure Layout in the Heap +
+ + +

Abstract:

+
+ This paper describes Automatic Pool Allocation, a transformation + framework that segregates distinct instances of heap-based data structures + into seperate memory pools and allows heuristics to be used to + partially control the internal layout of those data structures. + The primary goal of this work is performance improvement, not automatic memory + management, and the paper makes several new contributions. The key + contribution is a new compiler algorithm for partitioning heap objects in + imperative programs based on a context-sensitive pointer analysis, including a + novel strategy for correct handling of indirect (and potentially unsafe) + function calls. The transformation does not require type safe programs and + works for the full generality of C and C++. Second, the paper describes + several optimizations that exploit data structure partitioning to further + improve program performance. Third, the paper evaluates how memory + hierarchy behavior and overall program performance are impacted by the new + transformations. Using a number of benchmarks and a few applications, we find + that compilation times are extremely low, and overall running times for heap + intensive programs speed up by 10-25% in many cases, about 2x in two + cases, and more than 10x in two small benchmarks. Overall, we believe this + work provides a new framework for optimizing pointer intensive programs by + segregating and controlling the layout of heap-based data structures. +
+ +

Published:

+
+ "Automatic Pool Allocation: Improving Performance by Controlling Data + Structure Layout in the Heap"
+ Chris Lattner and Vikram Adve. + Proc. of the 2005 ACM SIGPLAN Conference on Programming Language + Design and Implementation (PLDI'05), Chicago, Illinois, Jun, 2005. +
+ +

Download:

+ + +

BibTeX Entry:

+
+   @InProceedings{PoolAlloc:PLDI05,
+     author    = {Chris Lattner and Vikram Adve},
+     title     = "{Automatic Pool Allocation: Improving Performance by Controlling Data Structure Layout in the Heap}",
+     booktitle = "{Proceedings of the 2005 ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI'05)}",
+     address   = {Chigago, Illinois},
+     month     = {June},
+     year      = {2005}
+   }
+ 
+ + + Index: llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.pdf Index: llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.ps diff -c /dev/null llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.ps:1.1 *** /dev/null Wed Apr 20 23:46:28 2005 --- llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.ps Wed Apr 20 23:46:11 2005 *************** *** 0 **** --- 1,27682 ---- + %!PS-Adobe-2.0 + %%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software + %%Title: f098-lattner.dvi + %%Pages: 14 + %%PageOrder: Ascend + %%BoundingBox: 0 0 612 792 + %%DocumentFonts: Times-Bold Times-Roman CMSY10 CMTT10 Times-Italic + %%+ Times-BoldItalic CMSY7 CMTT9 CMSY8 CMMI7 CMMI9 CMR9 CMITT10 CMSY9 + %%+ CMMI6 CMTT8 CMMI8 CMR7 CMSY6 CMR6 + %%EndComments + %DVIPSWebPage: (www.radicaleye.com) + %DVIPSCommandLine: dvips -P cmz -t letter -o f098-lattner.ps + %+ f098-lattner.dvi + %DVIPSParameters: dpi=600, compressed + %DVIPSSource: TeX output 2005.04.20:1435 + %%BeginProcSet: texc.pro + %! + /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S + N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 + mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 + 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ + landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize + mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ + matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round + exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ + statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] + N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin + /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array + /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 + array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N + df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A + definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get + }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} + B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr + 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 + 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx + 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx + sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ + rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp + gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B + /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ + /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ + A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy + get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} + ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp + fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 + {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add + chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ + 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} + forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn + /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put + }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ + bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A + mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ + SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ + userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X + 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 + index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N + /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ + /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) + (LaserWriter 16/600)]{A length product length le{A length product exch 0 + exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse + end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask + grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} + imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round + exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto + fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p + delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} + B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ + p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S + rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + + %%EndProcSet + %%BeginProcSet: 8r.enc + % File 8r.enc as of 2002-03-12 for PSNFSS 9 + % + % This is the encoding vector for Type1 and TrueType fonts to be used + % with TeX. This file is part of the PSNFSS bundle, version 9 + % + % Authors: S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry, W. Schmidt + % + % Idea is to have all the characters normally included in Type 1 fonts + % available for typesetting. This is effectively the characters in Adobe + % Standard Encoding + ISO Latin 1 + extra characters from Lucida + Euro. + % + % Character code assignments were made as follows: + % + % (1) the Windows ANSI characters are almost all in their Windows ANSI + % positions, because some Windows users cannot easily reencode the + % fonts, and it makes no difference on other systems. The only Windows + % ANSI characters not available are those that make no sense for + % typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen + % (173). quotesingle and grave are moved just because it's such an + % irritation not having them in TeX positions. + % + % (2) Remaining characters are assigned arbitrarily to the lower part + % of the range, avoiding 0, 10 and 13 in case we meet dumb software. + % + % (3) Y&Y Lucida Bright includes some extra text characters; in the + % hopes that other PostScript fonts, perhaps created for public + % consumption, will include them, they are included starting at 0x12. + % + % (4) Remaining positions left undefined are for use in (hopefully) + % upward-compatible revisions, if someday more characters are generally + % available. + % + % (5) hyphen appears twice for compatibility with both ASCII and Windows. + % + % (6) /Euro is assigned to 128, as in Windows ANSI + % + /TeXBase1Encoding [ + % 0x00 (encoded characters from Adobe Standard not in Windows 3.1) + /.notdef /dotaccent /fi /fl + /fraction /hungarumlaut /Lslash /lslash + /ogonek /ring /.notdef + /breve /minus /.notdef + % These are the only two remaining unencoded characters, so may as + % well include them. + /Zcaron /zcaron + % 0x10 + /caron /dotlessi + % (unusual TeX characters available in, e.g., Lucida Bright) + /dotlessj /ff /ffi /ffl + /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef + % very contentious; it's so painful not having quoteleft and quoteright + % at 96 and 145 that we move the things normally found there down to here. + /grave /quotesingle + % 0x20 (ASCII begins) + /space /exclam /quotedbl /numbersign + /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash + % 0x30 + /zero /one /two /three /four /five /six /seven + /eight /nine /colon /semicolon /less /equal /greater /question + % 0x40 + /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O + % 0x50 + /P /Q /R /S /T /U /V /W + /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore + % 0x60 + /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o + % 0x70 + /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde + /.notdef % rubout; ASCII ends + % 0x80 + /Euro /.notdef /quotesinglbase /florin + /quotedblbase /ellipsis /dagger /daggerdbl + /circumflex /perthousand /Scaron /guilsinglleft + /OE /.notdef /.notdef /.notdef + % 0x90 + /.notdef /.notdef /.notdef /quotedblleft + /quotedblright /bullet /endash /emdash + /tilde /trademark /scaron /guilsinglright + /oe /.notdef /.notdef /Ydieresis + % 0xA0 + /.notdef % nobreakspace + /exclamdown /cent /sterling + /currency /yen /brokenbar /section + /dieresis /copyright /ordfeminine /guillemotleft + /logicalnot + /hyphen % Y&Y (also at 45); Windows' softhyphen + /registered + /macron + % 0xD0 + /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered + /cedilla /onesuperior /ordmasculine /guillemotright + /onequarter /onehalf /threequarters /questiondown + % 0xC0 + /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis + /Igrave /Iacute /Icircumflex /Idieresis + % 0xD0 + /Eth /Ntilde /Ograve /Oacute + /Ocircumflex /Otilde /Odieresis /multiply + /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls + % 0xE0 + /agrave /aacute /acircumflex /atilde + /adieresis /aring /ae /ccedilla + /egrave /eacute /ecircumflex /edieresis + /igrave /iacute /icircumflex /idieresis + % 0xF0 + /eth /ntilde /ograve /oacute + /ocircumflex /otilde /odieresis /divide + /oslash /ugrave /uacute /ucircumflex + /udieresis /yacute /thorn /ydieresis + ] def + + %%EndProcSet + %%BeginProcSet: texps.pro + %! + TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 + index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll + exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 + ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ + pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get + div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type + /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end + definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup + sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll + mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ + exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} + forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def + end + + %%EndProcSet + %%BeginProcSet: special.pro + %! + TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N + /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N + /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N + /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ + /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho + X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B + /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ + /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known + {userdict/md get type/dicttype eq{userdict begin md length 10 add md + maxlength ge{/md md dup length 20 add dict copy def}if end md begin + /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S + atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ + itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll + transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll + curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf + pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} + if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 + -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 + get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip + yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub + neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ + noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop + 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get + neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr + 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr + 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 + -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S + TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ + Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale + }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState + save N userdict maxlength dict begin/magscale true def normalscale + currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts + /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x + psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx + psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub + TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def + @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll + newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto + closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N + /@beginspecial{SDict begin/SpecialSave save N gsave normalscale + currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} + N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs + neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate + rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse + scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg + lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx + ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N + /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ + pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave + restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B + /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 + setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY + moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix + matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc + savematrix setmatrix}N end + + %%EndProcSet + %%BeginFont: CMR6 + %!PS-AdobeFont-1.1: CMR6 1.0 + %%CreationDate: 1991 Aug 20 16:39:02 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR6) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR6 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 49 /one put + dup 50 /two put + dup 51 /three put + readonly def + /FontBBox{-20 -250 1193 750}readonly def + /UniqueID 5000789 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C + 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 + 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA17D1AFFF95F4224CF7ECEE45C + BFB7C8C77C22A01C345078D28D3ECBF804CDC2FE5025FA0D05CCC5EFC0C4F87E + CBED13DDDF8F34E404F471C6DD2E43331D73E89BBC71E7BF889F6293793FEF5A + C9DD3792F032E37A364C70914843F7AA314413D022AE3238730B420A7E9D0CF5 + D0E24F501451F9CDECE10AF7E14FF15C4F12F3FCA47DD9CD3C7AEA8D1551017D + 23131C09ED104C052054520268A4FA3C6338BA6CF14C3DE3BAF2EA35296EE3D8 + D6496277E11DFF6076FE64C8A8C3419FA774473D63223FFA41CBAE609C3D976B + 93DFB4079ADC7C4EF07303F93808DDA9F651F61BCCF79555059A44CBAF84A711 + 6D98083CEF58230D54AD486C74C4A257FC703ACF918219D0A597A5F680B606E4 + EF94ADF8BF91A5096A806DB64EC96636A98397D22A74932EB7346A9C4B5EE953 + CB3C80AA634BFC28AA938C704BDA8DC4D13551CCFE2B2784BE8BF54502EBA9AF + D49B79237B9C56310550BC30E9108BB06EAC755D6AA4E688EFE2A0AAB17F20FE + 00CD0BFF1B9CB6BDA0FA3A29A3117388B6686657A150CE6421FD5D420F4F7FB5 + B0DAA1BA19D638676E9CF159AC7325EF17B9F74E082BEF75E10A31C7011C0FFA + 99B797CE549B5C45238DD0FADD6B99D233AC69282DF0D91EA2DBD08CE0083904 + A6D968D5AE3BD159D01BDFF42D16111BC0A517C66B43972080D9DD4F3B9AE7FB + 11B035CE715C1218B2D779761D8D7E9DEBE277531BD58F313EBD27E33BEF9DC5 + 50C7821A8BBC3B9FDF899D7EAA0B94493B97AFEAC503EB5ED7A7AB601E46A2CC + FC2A276E7502892F26B8E36F84B72BBB5CAB7A8B977EA71F0933ED4D23381C9B + 5A109609AC93B063442561EA01690617BDE9CB567BE082F1741798F7E70A03E0 + A42B0AFF0F002B1873299901B06CEB5E826D174D9256368F3CD6CE1BF7E990E5 + B2D2C02F150B9FB8351E964C38E19D59F3ADD001316A1D3CD06B8868A799A1B5 + 2C9F91F46AE11294585C3E8B848F41F08E215569D5038A934D77D94CD4693E24 + C364AF9C346E7498844C19F2188F02148E9DE193486DD925344373BC133E3D77 + ED74D8DA0F6D7D8F717125C4B1099CBA9AEFCBBE338A659E14E081A664B0442C + ACA0D1F31F64AE067D74A6B39AE50F149DF744B3AFF5F9ED11EA05208D60F0A3 + 4BDE426F89BFC5B91261814321CA18028A6800D718B4FF4B0BA55EE7131A5166 + 74C3EC11E6F8183E8EA2D7F1B0D6E550F3165B0B2647AAE1F425B0735BBCA591 + 01827B097A46CA12246A122D4CC1DDB7C2821CD5826E69879E876E3A2CFDF01F + 1743F4A2486FACF38ED4B9F796AA4ED52F03C7CAE44F4583B06EA9D978B25912 + CDF39253C6C1375DDEB40D09008E0780D326F7E557EA88067D852BE17521B398 + 511113D33AC17C26318A074336E11A7B84D390B89C8AD8C56BB00F17328CF77C + 7986A5E274BB8A496B1098D904D9AEBED2316B75F03C88572E35A0EBDA34B251 + BDF790317DD5AD00B46C362B2932DE0AB5292616EF9DB9F3292F40155ED0E2B5 + B8505913102EBEEA97288DFBBD23B400B153E15264EDFA6D42712D1703875F27 + C8492D74F1F8821811A109842FF74FFE4CBB994B16F4F736A743808F775C13B3 + 7623DCB63EEC224C8B930F2B1886F2BFDCD3FCE095C2BD94FE612B8B59456FCE + + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMSY6 + %!PS-AdobeFont-1.1: CMSY6 1.0 + %%CreationDate: 1991 Aug 15 07:21:34 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMSY6) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.035 def + /isFixedPitch false def + end readonly def + /FontName /CMSY6 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 48 /prime put + readonly def + /FontBBox{-4 -948 1329 786}readonly def + /UniqueID 5000816 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 + 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 + A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 + E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A + 221A37D9A807DD01161779DDE7D5FC1B2109839E5B52DFB7605D7BA557CC35D6 + 49F6EB651B83771034BA0C39DB8D426A24543EF4529E2D939125B5157482688E + 9045C2242F4AFA4C489D975C029177CD6497EACD181FF151A45F521A4C4043C2 + 1F3E76EF5B3291A941583E27DFC68B9211105827590393ABFB8AA4D1623D1761 + 6AC0DF1D3154B0277BE821712BE7B33385E7A4105E8F3370F981B8FE9E3CF3E0 + 007B8C9F2D934F24D591C330487DDF179CECEC5258C47E4B32538F948AB00673 + F9D549C971B0822056B339600FC1E3A5E51844CC8A75B857F15E7276260ED115 + C5FD550F53CE5583743B50B0F9B7C4F836DEF7499F439A6EBE9BF559D2EE0571 + CE54AEC4721DCF5D2D062695FD884DD6C5E69AD4D7EDE06019AA63DBD7A415FE + A62C4BA084B29A6D5F00A85E00A9B4087867ADAB0AC160B1DCC24BCED3BE7BAE + 8BF608F4D4C69D22B92A00B55CE87EC85E592FCC21B503F439CD2E8E215E38F9 + 33E27ADBDE5AC5F925D27C80188DCACA70C0E326DAB9EE31CAAFD5356518E25C + 7CCA1DBFA1350351C915C4748BB1655B2C47F39FFD7EC38F48D52DF76F3EC2CF + 139EBD840EEC65AA2A9B6B201D81D8A73B0E1CF21B1F3EE2A3820FABE3755443 + BF4CCDEA0BC576A84EA0DEDF34FA8B4A35F9784EFC9474AD102741 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMTT8 + %!PS-AdobeFont-1.1: CMTT8 1.0 + %%CreationDate: 1991 Aug 20 16:46:05 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTT8) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch true def + end readonly def + /FontName /CMTT8 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 58 /colon put + dup 65 /A put + dup 66 /B put + dup 68 /D put + dup 78 /N put + dup 80 /P put + dup 83 /S put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 121 /y put + dup 122 /z put + dup 126 /asciitilde put + readonly def + /FontBBox{-5 -232 545 699}readonly def + /UniqueID 5000830 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F0187316F83DDE3E2D27FCDF6C5CE4F95B6EE + 3317BD91B7921F3039DD35FEA387D5CFB6C6E9DC84C178F3432994FC7FAC6E5A + ED41A1E2EBA350178FBFEB45944511731BA827167DDAC238FC69A5486B995477 + C469E2E27493B0B711DF8E267D3D5613B450011921685147114106C9472580BD + F531022F6DF5432B2A4EBC51A8032C7F9689B6FA942D849B29709631613DA68D + 4DF7B6F059A19304F40A3C3580CE3B51D79D42984194D4F178801720892FB6E7 + 61FF43C63F9256B5E9F4227B1378222BAAD4D52C77462DF01892220E11129C16 + 6C9E45BB9F01ED7C1AD5D8B4D72BE0E12969AFEA90FEF170603CDB91CB243173 + B19A56084D10293B80A35275F41BF78A054DDC98F4A1FFF592463D944960FB31 + 6BE5F03960F9B1F213CBCC7FD448657FE388F10104D42B0715FC9571CC60CF23 + C72560CBB8835A0CA208FE06676B3B48B093CB7FB2C0C53AF17EC5B372A9771B + BFD52FFB7062B4FE0106A01A2A1A1DD4EF5C8C7623EC9324A2CB3B402FCC1FCE + 52BFC8662F8A39D5F1B41C97E7CE34E16AC28A1E94007AEA7D4C519399F1B7A9 + 48FA7DDB671067244F09C29F95DD60668223F45BBDA8B1C452E930A9F3F341C5 + 351D59EA87462FFB30277D3B24E2104D4AAB873BB2B16DA5B23BEE25BE2C8128 + C4CF2F4F438A4E520CD932BAC455BF8775C27AEA6C73EED3EB2F8DB5E356AE27 + 41B35C8AEFE73C4CD6A591AAE4F45762EBD6D3636C03F08C552BBFD0A13D11D5 + 491F8369B4BAB8ED9D6F1DE7DB7AFD383986C4338D3AA71C9AF2B8A0955CFD86 + 0345F16D9798B25156DDF826A7CB6A0CC4CB43078BEBD3E499DA95562A08EED9 + 7CA27B7A0CE3FA7EBDAA87A600F1F6861C5D2C9C4FF37AE7AA1F17FFB58F2A07 + FFFCA901687B2EEE65D1EC50E264B12E57696344C2D65023BF40E1C99AC6745D + A52AE739DBC3C775891F56D681AA56FC84B8819224B08647136E666A8A4CF522 + 85FF33F9D4390091E0FE4CD68B101F2D0BE544AA5A1F36D74D6AE810BA3C77DD + B68044ACB44182345B2C2204740B36C77B1DF645C3C10729F3C12F9B22D2450A + 2CD44F4A46E28286DD8E5DE3952E89EC39F3382D7B27D0C6E8638FD8A1DDBD35 + 060B62F203428ABF367428684B899267F9E7FC2D2B55A3D3358C12706A8A7EA0 + 20E93341650D2E875E808E55BAE18D4FF3248F06CD620F0544D6FB79FF1E3C2A + 5457B3238DFB04AC7450D32BDAAB93348F156F6F25A3A362FE428F08F65B201B + 23138A24431F15454B83543E7F37633CF19E4D43AE782B13EBD7664C3B6832B9 + AFDCB73E36068CDCB411C952B6C34D351C50646592005DED765E51D6F23028C1 + EA400092FF7CBC64AD4BE7A368C84BF43D92F4A806DC11ADC1C12A425C635FD9 + F0B6D30B95A16FF0CB15549AE563A5C9A30BBD30D01D73C6D1C76C2E0E26B583 + DB134AEA664FD930FD5D009D09079521CB2B496DD9A07972100169CC71BE6DB1 + E625C31F31ABB579FCB83B67FFC3C04C85BAB11C62947FDA9E0F46D24C82C141 + 8C02D7FEB0CE889EA8CB0EE1C2F4E99D8941E899AFD8B9080231B9CE197B0F57 + 39FBE22FE68790011E6891DD31F8CE7B6B8B8242610C0BF0D760E261AD6AA70D + AB862ED76B7783740C6F7F25DC7F9B0030DEF7F069B7F6DF761EDDD86423694C + 3A5C107B55DDDCADCED0D407178DAD3970BD08BE678C335EC7DFBFCA87788BEB + 417810769BECE38C2F5C11D89D9A839E934C632790E39AD48E6784F6F90AEC40 + 86177DC945BC4D21B36F8573073A4AD0C02C2F525E8AA3E0294502D97897C255 + 5DF99B915BB9DCAD94ECE7B8D147655E1CED46E4BC59E29847E9BCEFAE47DB7A + 63CAFFAF636B5AD692F514B16337A34968BF11CF919AF5DBB098564EE4CB1F73 + B248085BE02791F2C42A75F0CCD8F4D1BDD287DCA5B032D7E1693A669EA50681 + 9D74D5B20A489F8486EA457770D79B2E4AB86AA53439A9330BFD33D5D99942D5 + A2E33C662416B5973E074E913A42C68C056DEC3E7911A1237C1339670F55FC93 + E67B6CAB40473C461AB956CBBF4E3EE0AE0D7EEA932AC0F153F51FD237E116C5 + BA14DC0395A72929C50C24EA3616369CF6D027B6B82ECE03E872A89FBA80F081 + 21892CE0BA5E376014AAF7709F1EFABB1FE6953301723CCB845B8E295C126D4E + 26208709026808EBAEDE15578F3C1AE34927D0C2498D1FB1B82B2EF537218318 + C2472B60CD62DBCDE98FECB20D0EF987281BC3F0D7C8DCC069BAF82FA1EEC83E + F74D643CC5E0EAE417F73AAB651F874BB850D04D64DF77C65FC9B352D0E848EC + 3EACE3FF39BBD21ACC02F482CE63931061791377825C3EAFBC58565D373AB0E8 + 4B05867D65B90AA162A6A4C4A9267DAD884510DA05D0A84839894B65CD3E84EF + 2181E3F50219A651EDE799042C6D8B568D0BA97505E7518F224662E4C9EC4976 + 34737F066BE1E3E248CB7D115C07B239E0A3DAE9C2E8A5B2CD8AB1C60DAFA6E3 + B5AF97B5D3FD080E2EEFF54FFC53C4B9E1DE4744FDD691928C53DC95276B8DDD + 294D78C771E482E5162DA89AF8B91E83BD614683D8D40FECEDEBAFC09F693C06 + 71ADB6880D14ADC9C23D05B6711D1AA4D711D07B5E3F38B3A2E38EA9F4E33376 + 44547E96016F9923688077191E83C9B3EDE00A4A0325DA0E1F29242B40318D31 + 45F40819ACCDCFFD7D7AF6E4B5CE877722954509FC0CE8AAFBBE359BF52168AA + ED851F7390DD860427DBF88789F63620B3DF5230EE4E85368DF76C58C63C48EC + E6BFAF01748D0BF6D9B11B90C8CB8A0565C67590EAD65AD2002EFB0132FF55EC + EEC2179378D663C6332599BB06CAAF16846C011C4437EA40C3C0163C8EC72890 + B58103257BCDF92E91CAC3500E0E649A6E2251B1E555ABEE490FA187B79AEB35 + FB2ABC60AA2D1D83B92B0C7209ED152AFA5A6A4C008C528FB04E90EFD30A89DD + 0CA04888D5269AFA327642DB8ED6DB4F2F6366018539B7DEE55CA025363CB1BA + 20AFAEFE40C33518CEED188AE14C779200A2BBF283E8D6B0176FAE832272C82C + F982210A8BE58F341897D50DD542F679870F09E48E97CA2A2B4FC6D152EF8B21 + C6AAD39A559FE01C061EA45E661C8A9ECFB56C88675CB57D243BEFB9ED422CC2 + 75A8D3648F4164C5A85D0FDB9AE68EBADFC6BD2CB236054E7509C5622A4E550E + 7EC59C29970276F26FA4F5C01E57503F9068F6D4CCAF2A7F3266057A84AC64CB + FA39E80FC2893373519AC775104CA426D41675E18FD98E85D33E7FE7BC8C6A22 + FCD75FFB02159ED2153E1FEB10059337F945E6F58AE34A133D0FAE8EBA7F9662 + 030A74E0B262B0EEB464BD8210FEA8AD4AD44CA1D12992DE2BBA1E90A2543997 + AA4FEB99571024016737C6D45070746013300F39AC19234820122E669D95B40D + C0F5D4BF72C443F84D334547B94500601DED3AE73CED22E6D0674C363191905C + 3FD4B5802C6AA6974CD28C1DAF24616240C46BC1BFB18E73F0C62556569FC3D3 + A5E6DADC6FB715AF5B57E579767B3C3EA49805606FC331903884CCF74217F479 + 17775AD4875BEE8A549755B975F2C9992684A9ED7DA0515A4A87028F9A4ECAAD + 102A75FFB63FD0FD3D54ED92C76B29EFAAE99082543BD6AFAADEA7CB595D0838 + 0715E1FAF832815EE5CBDDCAE8758C6556BF98CD727AA067B82E96AA6EEF63B5 + C6270E9EAE680028A6CA54C71177471D5D8109A24E94C4FACA4FB841EB1A0FA4 + 0166C9F40A8B77EEC2EEE7001BFEB906DD43D61413C9175F28DC00BFAF3D28E4 + 0A354599AC21C746EE2AB02EB8AA23B8D57C4627C5226A98EA1E832B311AA43B + 919169878B25EEBA7FC7ECB2A9F78EC1710EDB6374ABF523813B2D4A0E76F1D8 + 609C39F7FBC470227F373B463DD0271ECC48BCFE5A97E2E8F024A022D0C95506 + 695FA848A4F2BB6341705EA9BB376A8141B33EFEA13DD959ABEDFCC79F463E4A + B0A1A6D28C79C9E18BCEA0C7A8E67B000BF764E34AE906CC60A9074099096A2B + 77EA1AC70A25E528E2566E0B8281E821A96541C0125E438AD63A1AB67A177A09 + DD28EF9050BBDDCDA28F84F171FE0B31A9C9FE352A3B2C4E5E4E94F8478307E0 + 983EDA73887D31740CB9B9F4E17E7AE846C7DDD44C22AF442BE307C8AF519BA1 + 578DE4C83ECCB7B38D49D61712D48FE0136C96B6805340E74217CFF25690A43E + 2FD67260D9268939005A92FE5202E21F4D2E42024AECE9E87F92DD5241514377 + 12B0D317077756A1DF97D71D42AFDB2E3125200E1F62FEF33337822FC1BF9650 + F2F6126D7B33B67D29ECF03BFF286A4371CE23BA4CA27C8F698DCE94B2D6D0C2 + 3B1E5AD22DA95EE20160979A31ABB411E247192DA05B380EA13E68580A343732 + 4EBDAE9C57575226E6EC6AC6731825A59567919E85E8754FE9C16157CF3785F4 + 929F9C84E717C4C9251EBB43A29818DB77513E370F2C354680162B56CDD23DDE + B5DBFEEB379A098C676090D96A4CE6493456703A0A8ADF7BDE1297DF65B1C4EC + C978075697391314D51A0CEB91B2F5BC5C9C76165EC1CA194C74A46B3DAC2C6E + E54A2DCE81FE9BA236AF4EE684520E061B63D8B1216AF3FCA38D76C6CE1A4732 + FF3172A517D536DFEC5CBFE749E2D1C41729E4F3DB0FAF01A838885ED75012F0 + C27268E9D3A2E649165606B181482F222175BA8CBFA90C5B332B5D8AEA1269CF + 7DFECD74CF9369706A1F5DF9AF7CF3363232DD10C4B06C7E874B1A3BF6FA7512 + E7ECF4EDDA08916EFE3718C835504E11D6E1BB7681956C761C56A97017954C04 + ABD76306A7F6E19BE1F5666EA3455574DF44AF9B0591747B5A713BA308E088FE + CF3CAB6BAC2731BBF7E87942F9C48F82108B14D8B5A6D77A105D10A76276FFDC + 10A1F1921D5748016E2A11E81AB286406931215CE0031E10B50698C61EDB7412 + F8D23C4CC5767A49EC67399690370DC4052C6A23B67128BEBDFEC6EA9D815606 + E3DEBAACEF34ADECD956903D1A988CD792582EE5FFDEC6BA86436F9317D01EE0 + 9EE40CD80D2725330F83CC52D24204B13F6510E77A69041B3D5DD49C7AD095A6 + D2539A0546D7157D1C5CA2234932BC3D08C38FC89DAD6C02C481F433DFD8EB1A + 2876046847371332356E4352F2669C480B6978FFD9035EA5AFAD71DFFAA955DE + CD9DB960CBC2A2F28B1C38926D3E8B05BC720102F87E9EFA7013262791B504B1 + BC4400FE9D4826785EA7B62D43061410E6D0AEAA960C3FF963C296F8F57D9E46 + E406B8A5275084656D3ECAA4A770140C1B96BA8B03917B3C8F4DE82EE79C16D6 + 6C52A8474B38C9F35F56FA15AF073B6FC7FE81EE6D41C28AEA018DC00C84A167 + 426A87E30785D2AF68C6D793240DD8A0CBDB2E3B5F26CF09499DCFC2A927CC88 + 8A79DD79C1FA8244C71B8DB4D0D818E9AD49D22E7A9A56FD4DD9B08AA0981963 + 2EAAA106A29DDE8B014AA69B33D4F8D75D186C06455406B0BC6E78D6D0C0E32A + 68BF4A53CAD73801C77DACAAC1F07380E3224B600CA344011D51C930FF3A52A9 + 41A4D65C0523679D7C18E096EDD3D07107137A2654D0FC5AC8FEA95E66D5D6A5 + B2A0CCC913453A21A721D70A72AA2D1868A74EFFB78F23AD81A414BC4747AE9D + 545C16205C888ABE8169DFB84D56130C8252815DFDA36F5CB0D6F0F1831AC4A4 + DAF94DB312C06CF1B533CDE371D142A026747402758A21B0585B4D6652F28F59 + 93EEAB7F66E948AC31A312C6BC270506BB1CD3C709109862A46F7D229DB9B3A8 + 934E4ACBE76C989C7E742F660B106C59A265105AC0CE16E6B3702666E947DBDD + 98054890CAA71E1D26C0F730E189B6010E6C7CAED4235972627ACB4DCF459CE5 + 4C75630252B395AB0191F33647BD0E91A7DA2C3ABF050198126774A9AF18177B + AECFAFACA39D147B77509F374E115E9AB312EAE141E530965156E9E6FB79E740 + BCF09F3D74EAB08F90171E8BE1DFA89429C7E3F8BBC6014D6C355786162C62B7 + 2055CCCD65994F52CF7215CB94DC54DE853BF63D4551E347AEA77BD65AFFD089 + 21FDEF21FC04B9B2C829449D954AE9E40FDAA64886E6675D9286698391DB5FBA + 3BE9B85010BB0F10383A0CE0D00042CFEA52546B467F1A2DB0D6534CDA4EA1F9 + 4DED8FF8E8C94DEEE2EEB2F81EDD6B3FD0676425D4213376FCFB6B43DB92546C + C66043D273E32AA187148F00F9E35BF0C06D3A13BAD5C6306CE1E3455E71885D + B02A40F080BA0737AAD4CE9472AC94A119EA936D621BA5DDACDCC2BCB24B8828 + 95D2F741220154DB1EF52BE1021A9A4F504A6CF8CE290A3889DD4F37E9A59819 + 1F098C7E7ABE307AEBF6AFF6E2974FFE34165CF2089D5F5A4912724359625668 + AF0213CA3FD2FEC70B8C985585CDCD754773B9A60FB03E6527EADEB0470A6A79 + 8B51B4B0A9DA3EFC8AA36CB7C422E7C3B2B9AD15B611B106CA49EE67288D4F04 + A6EB5C1DD407C13C1CDE6C65A5BAFCB4FBD11FB37FB0F60D7BA2D114308AF533 + BFA0E980DDF201DA613D1F76C04843EF98C9D99B640DC78AC43C2B059549AF7A + 8F0E3C1EBE8BA9C4F72F2F072854BCC37DA46D1B5BE976C4E5EFF241CB849052 + F66994D5DB10A697FB996185347257B97C59B9BE9DC288CDC72B27B59525CCF2 + 3EA8D8DAC4F0CB69495C5747DA9EB4EF52B0C480FA4CBD1983031B22B9F64916 + AA5875AC71DFBED7321F226C5580C4837F0C3BE76AC3641692606B777F65C88A + 1322DE1E78FDF7000E5DBAA9E8BC7B092186BDDF9BA1303BB1F7DAC199A68B3E + 90F94209D26A72004D23AD0CC6902C51F47C46086E773927A7118E38B94999E1 + 275D58C96A1DF54D98E6D95AF4F28F3F6FDBF7CB4B2EEB7AF1E2D9810D7ED6AE + 7738C0AA6A80F38E37BCB30FB0A3464B3FC39B9185F720F7D4F6B2E51E8B6E9A + AA5B0C147F2471168EE09C0D9BC61A62EEB017D318487E650E09688861DC9E07 + 53BA07DC640F62DE8155CAA80BD86C260F408F628765BBBFF130213B562B9DE0 + BF374ED7F5ADD8479AE7611763088252DA2BF0EC9B6684B16B68D67A2971F950 + BE42E534E70693D1531F7BE9AEA1BF23CE6A6402DE6475FC7DE3282071CE6701 + 4A48A118C9348546B281F105C5694557E5541F96B452C363D61027BA70B37B86 + 4FDC44E72852384897D7B9DA4CA9D587F5620A23AAB4AE83E43ED39D1808C1A6 + 9069731D4A304006356BB9C0EB9BEC6B65D263E24D14DEEC6A76840406921DE1 + 83ACF5E32B477ADB013BDC439C4B58A8EB943971A33FF725CF4E736E7449C7E5 + D23ADE5A829DAFBD83E48412C8EF6D90FBF1FBC322D58A2995831CCFBA91FA61 + 4A1F7E6F7CEDBC08DCD4320965B9FFC207A69712E39A63F60374170CA5ED4304 + 1B9945CC075362D70F2D5506D74BFB9B3586FAD3A80F9CCFB4CAAB9CE7FD23D1 + 1598E3D66B54D885C91B5D434B7D8E301254F5F1ACFAA886234A5C4551D5815D + 8AA61C55D22B8B81263DACE6C4FDD87D20561C7A486C3CACD75D844F545015D1 + 52194087401C3BFE757EDD52200D794BF11CF93475DEE2306313D56ED6BEA99D + 80A300F9FB0FD5A19957FB3540F8CC088A5DD46B96267E4C48447A74AAA45D8B + A3F56E0986897A08A3A9A2F11D9C76C6D0120F726968FD744ED688C10989DEAE + D123D8ADF9496878CEFB5A2203D59E5615BE1D6F1460D0495C8B279CF6F5B8BF + 0ABEF741CAB7182AD49A447A7D4764AA869BC4D8CEC75B17BDA54B136239DABB + 5584FC9E55E31E091F349D8025437D1A6154AE84C186803CA5B922A3B526D0EA + 3E46DDA6E85278182DB83DA02160851C40F47E94D2067A2BACBED99CD2A5EBAA + 5B48019893951990876CDB9E8063A83762477D5AB29BA8E100A567F614FEA74F + 81EADFC95DEA82F17502088525879115BE50B152419EAC649557DD8B23A94AD2 + 5EA3D4EAA3C440CDE78E573DBEA370E0B77D13ABEC4945EC0C815E377CF5CA7E + 749CB587E70B435F2927E498B43DEC1A34DD7463FCF8DCEE6F572F250F7C3E51 + ECB40C98167AF2AF9B909260478407CBC445C27E9D88DD4BF5ED3214058AD892 + DD4DC276AE4DF803672EC0CC52271D03DEB6C0DFF8C4666B878CB42C86989108 + E72FE7FD1FC7D8CDE90A3DDE09B610F83E702B431769D0052D26F4F0CF753C4A + 2668AA9535535A3521202C2FBCE5E6A49B9543193B6CF2B2E56B3330CD24E927 + 58CFFE772C35EC7AA53929E5A2A2ACDD5018C03577E4A873A50893C5FF87D37A + 0DF9A49C64DE0FA0819F2BC4B63E79A91B20D4DC1887AF6520D0968D42B7A151 + D6ABB74407874CB6804BDBACDC92A1AF20D486D1C965DF8AE27F8377CA0C89AF + 4A7D8BD8E5202AC36103C922DEF27603981C4AE68E34B2712B3011C361C7CA2B + F6F9FB01832F3A68A600DF5801EE388D3C5A3F148FE48AAAC57D2152D9D6E001 + 16B594A6A7F41A23984BD7A33281290F483A79AF1D4184988BCD32FF76DB2355 + 77B6EF132B9D67924702C8E5210283FD7E536599B7715F9BB9A2C0F4918919F0 + FBC7DB3AEE993542634CEC85840596ABB69D0CADA8CBC52D25CE98B2B334DC75 + BB206720A7AC777D7BC5A98F0817D2C76E5757EAFC2F0EC61D6A79D9696D291E + 264CC36C6B290B24CFC7120A5D4C8EC4EF7ECB8ECE6E64 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR7 + %!PS-AdobeFont-1.1: CMR7 1.0 + %%CreationDate: 1991 Aug 20 16:39:21 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR7) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR7 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 40 /parenleft put + dup 41 /parenright put + dup 61 /equal put + readonly def + /FontBBox{-27 -250 1122 750}readonly def + /UniqueID 5000790 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6CC3F1E9AE32F234EB60FE7D + E34995B1ACFF52428EA20C8ED4FD73E3935CEBD40E0EAD70C0887A451E1B1AC8 + 47AEDE4191CCDB8B61345FD070FD30C4F375D8418DDD454729A251B3F61DAE7C + 8882384282FDD6102AE8EEFEDE6447576AFA181F27A48216A9CAD730561469E4 + 78B286F22328F2AE84EF183DE4119C402771A249AAC1FA5435690A28D1B47486 + 1060C8000D3FE1BF45133CF847A24B4F8464A63CEA01EC84AA22FD005E74847E + 01426B6890951A7DD1F50A5F3285E1F958F11FC7F00EE26FEE7C63998EA1328B + C9841C57C80946D2C2FC81346249A664ECFB08A2CE075036CEA7359FCA1E90C0 + F686C3BB27EEFA45D548F7BD074CE60E626A4F83C69FE93A5324133A78362F30 + 8E8DCC80DD0C49E137CDC9AC08BAE39282E26A7A4D8C159B95F227BDA2A281AF + A9DAEBF31F504380B20812A211CF9FEB112EC29A3FB3BD3E81809FC6293487A7 + 455EB3B879D2B4BD46942BB1243896264722CB59146C3F65BD59B96A74B12BB2 + 9A1354AF174932210C6E19FE584B1B14C00E746089CBB17E68845D7B3EA05105 + EEE461E3697FCF835CBE6D46C75523478E766832751CF6D96EC338BDAD57D53B + 52F5340FAC9FE0456AD13101824234B262AC0CABA43B62EBDA39795BAE6CFE97 + 563A50AAE1F195888739F2676086A9811E5C9A4A7E0BF34F3E25568930ADF80F + 0BDDAC3B634AD4BA6A59720EA4749236CF0F79ABA4716C340F98517F6F06D9AB + 7ED8F46FC1868B5F3D3678DF71AA772CF1F7DD222C6BF19D8EF0CFB7A76FC6D1 + 0AD323C176134907AB375F20CFCD667AB094E2C7CB2179C4283329C9E435E7A4 + 1E042AD0BAA059B3F862236180B34D3FCED833472577BACD472A4B067A46F8EE + 2AFACDE591ADF7304939394F3D5A260002A1F10F0600B8C5512D50FAC711C0D8 + ECD4E595D2CC782B6924CB844A86BD2385AED3C4239B3C7CBB0AB4EE31DA161E + 19388D238790061A9714E6EE8A640FCDC960F91570A63AB6663DCDAAA397E609 + 855F1131442AC9B5B975F3CA012AA2137CDEACF3787FF63C31D74B6687AE8F68 + 3B4A82E1F302411A68134C593ED157CD08B549DCB4C0973CE148284D127B3B65 + 3C764F6DC0F1023C089AD3DA44FA5C8D157997ED69FD87B7E2681325EF2B94CD + 7FB924970CD55FA93A2A579873386C17D533738BC0FF9457C54153BC1B4D9E8F + B9E9FB4C9A97EBF968D198EE827709D21D48D7C8C663CA7A9E8CD286B9F3B108 + CB19F3CFD5D36C601782228D0313D1265ACD74CBA45980C90A81F3A31A207DDF + A051CB8AB7A31EA7F6DF3719A2822F07CA36C6065CF8BECA6A045BA1A94381F3 + 0B6BCD7B4EA502386FE2C0AAB76E24F712C96B1307DAE46A8F460F310EF6AA8B + EC9567EACB1D5248EBE2F06E4EEA7C397A2E3741E7104C602D7B5D6E28D64BFA + C1785513590F68181E44110EEDB4B159AA5C86E4EE986BC6D9C0AF8940269EDB + 423A2FCDB5745597A20CEA68EA1B376EAB87D52C1A89306C4FE351D98F17A50A + E3AB64464E39F6CC955618565258504C8FE274D5D53E801164B98BDAEA605D61 + 9DAC4D38652883D004C84C + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMMI8 + %!PS-AdobeFont-1.1: CMMI8 1.100 + %%CreationDate: 1996 Jul 23 07:53:54 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.100) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMMI8) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMMI8 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 21 /lambda put + dup 112 /p put + dup 114 /r put + dup 116 /t put + readonly def + /FontBBox{-24 -250 1110 750}readonly def + /UniqueID 5087383 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 + 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC + 4391C9DF440285B8FC159D0E98D4258FC57892DDF753642CD526A96ACEDA4120 + 788F22B1D09F149794E66DD1AC2C2B3BC6FEC59D626F427CD5AE9C54C7F78F62 + C36F49B3C2E5E62AFB56DCEE87445A12A942C14AE618D1FE1B11A9CF9FAA1F32 + 617B598CE5058715EF3051E228F72F651040AD99A741F247C68007E68C84E9D1 + D0BF99AA5D777D88A7D3CED2EA67F4AE61E8BC0495E7DA382E82DDB2B009DD63 + 532C74E3BE5EC555A014BCBB6AB31B8286D7712E0E926F8696830672B8214E9B + 5D0740C16ADF0AFD47C4938F373575C6CA91E46D88DE24E682DEC44B57EA8AF8 + 4E57D45646073250D82C4B50CBBB0B369932618301F3D4186277103B53B3C9E6 + DB42D6B30115F67B9D078220D5752644930643BDF9FACF684EBE13E39B65055E + B1BD054C324962025EC79E1D155936FE32D9F2224353F2A46C3558EF216F6BB2 + A304BAF752BEEC36C4440B556AEFECF454BA7CBBA7537BCB10EBC21047333A89 + 8936419D857CD9F59EBA20B0A3D9BA4A0D3395336B4CDA4BA6451B6E4D1370FA + D9BDABB7F271BC1C6C48D9DF1E5A6FAE788F5609DE3C48D47A67097C547D9817 + AD3A7CCE2B771843D69F860DA4059A71494281C0AD8D4BAB3F67BB6739723C04 + AE05F9E35B2B2CB9C7874C114F57A185C8563C0DCCA93F8096384D71A2994748 + A3C7C8B8AF54961A8838AD279441D9A5EB6C1FE26C98BD025F353124DA68A827 + AE2AF8D25CA48031C242AA433EEEBB8ABA4B96821786C38BACB5F58C3D5DA011 + 85B385124B1D786840F2AEBAB2DA265F4C6B4C172877435AF18F56C72158E2B6 + C4C48029909E992391F040E86D78AC0BFC1326BE938C72F17A0AD12E78B03B10 + EBC8C58766CC0129B194D22F5580DFE6203854574B72CCA5E4E5FF8482635126 + 6B194A737A4D98523DAA2161A5F0DBE29F87173EA69ACC5C02FCDE4904DC165E + 616EC33BC35ED456CBEE7E592CF6F14BBE4D36E144B0FE620CAE756C76CFD890 + DAE462689CF669AAB6CDFD00F170372FF9309C87F1E0A29537D03C5873B2B099 + BF3267AB6A989032FB71E6782A11E2C6339B631965F69A46F26EA31884519B94 + 4EE8E1F7E231678BB8BA0DAD9593BF3E9E818C385DA897B353278E3CEF35F4F4 + 38735DB8178A20A1D8606FE2B457D8E37A6F1D522C0BB3ECCFC92C4F46A323C7 + CCA52444D7620BA56AF4389CD74BB02F83F46083C4F2E17D0F27869112CFC27E + BFCB5C401BE82C1925E8FB0B5D38039DC768B16AC15273C1502127BCB6FA7D47 + 93C3B16667A644A65949DF9E7EF1C6820FEBC5D60C7DB754434C872C996359FB + 51084BF98DE26AEEDF918B3061AE33AD8C9F47EF868A909993E2A6928905281E + B61AFB3E23152276ADB1E0DD868E26283BAE25F469CAFD7A38CCD2085EB6B491 + 19F3431A330419C581F5C4115E6B326B57E94D359AD37DC063D18F7427CF3A81 + A13CA6FDDE022F8498C306ADA325A8FBF599B0EC21324241A3DF9E9EA03E562E + F50D0789EEDF105F0147143124A1C348BF648BC9320F3FF7DDECAC47FCE5EAD7 + 26666AAF59B7C436088A466613EAFC54D402A1915781BD83CC7D68D692C26614 + 6D32ADC1A1C397D894C61B7C4F4EA316D1E17D8F512045830CD0FDFA744723B7 + EA92E45B2D6006880C2AA5654EF37BC3C610F50FD78510CA3CEC6842EBBCC9EB + 4FF8398353EDD7442892E2DF8DBF7D65E272E197BA15E06AA2D2F106BC398C0A + 3ECE1B803796635E4CC58AFF96ECBEA6C7434FE6126A21BD39FC767A2F8C4827 + F4558A8BEC88B47902BFBB8918AE64FEBE37CBE994CA639BBE44AE52682F57D1 + E7842A21648408A10D17A5F4BCA4B862AD150FDF9773008960850BA5728CF4AD + 800723CADBCE19F49B34B01B0E89CC6F3EEF8783C4573CC9F971BA2CB5D3B009 + A19C9A08D5E3F976149569BCBF1107FB3239DB70DD60692D6BBFE36DFBC0DCC2 + 4D9860580F8E84B46E8DF5DDB782B3225589BBCE9EF41E9606252DC2875D69C6 + D3761DC6F751F499202561AE3AD4AE543AB55763 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMMI6 + %!PS-AdobeFont-1.1: CMMI6 1.100 + %%CreationDate: 1996 Jul 23 07:53:52 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.100) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMMI6) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMMI6 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 115 /s put + dup 116 /t put + readonly def + /FontBBox{11 -250 1241 750}readonly def + /UniqueID 5087381 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 + 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC + 4391C9DF440285B8FC159D0E98D4258FC57892DDF0342CA1080743A076089583 + 6AD6FB2DC4C13F077F17789476E48402796E685107AF60A63FB0DE0266D55CF1 + 8D0AD65B9342CB686E564758C96164FFA711B11C1CE8C726F3C7BB1044BBD283 + 9AA4675747DF61E130A55E297CA5F0182A3F12F9085AF2F503481071724077A9 + 387E27879A9649AD5F186F33500FAC8F7FA26634BDCE1221EC0ED0E359E5EA5E + 6166526FEB90C30D30099FBDC1BC2F9B62EFEEC48345160804AA98F8D0AA54B7 + A480E715426651865C8E444EDB798C7E11040AF6E5A7ED1888653C6DBF5E6169 + 70BCD9C063B63B561EF165BF3AF11F8E519F37C6FDA2827685739DE2C48B5ADE + EE84F067D704D4511DBFA49E166D543CFD9ECD7417055D8A827F51E087CD2927 + BAFC7E6CFBD70B0FE969F890A11149D3D44D422C3370495DA9951AEE7253A49F + 3A9444C8CD9158D84117299F7F2332FEB0F94E6ED8BC7AA789A3219BC2F227D3 + 3B5BC75FB53B55D72AF4A6A7BB613FA235B11BB37D059FD87127CEF73D5B3FBF + 9F91ABAD78BD9240BD9525EBA78095EA0BDB25D1A19E876F292882EAD5619D46 + D20317A345D931F4FF4EAE6216C27044CBA525E3B917CEA25A04C120466C4B93 + FC720E6BA832A06CCA0A3916CEF0968D49085AEBD243C41A448289A6F05CE3F5 + 79148DC112A3CC7E8FF810B8C1A09E05F496C0F1EBA334E42E05C376C98F5F69 + C06C71BFC0A2F3AC9951CFBB143C66FB84F9C4ED27DF70869352D61BD5E11508 + 0797B87C709E3C151EB44E478CA576D257DF226C00BEF75B3313EE0F744D2E8B + 64E33BFF4915505C049AF0AEB069FD77B46CB0AAB12979BFA4C23D53B3A34123 + AB240E170C803F42D270357292CF6CD2BA0B79943922029A4A2C0A536930EDE4 + 2E13731BD89207969043C54B3C25B173DB74619D214DD6EFC99546AD4D6B90B8 + C7B6C6DA603292CF7C63525ECFA668ED9CD28903DDC41C25A2CFE4EFF51CF02A + 1829B2A33685C4D238A3E8B2B3CE206FFB7BC5D1162FC2F6304689A380F9FAFB + 2C1B94F22FF2D5C1462B60053208B1E378A3B2F592AAC30129A04D647494BAD9 + F17012C3738CE57378050030C5B1173685420DA246637856ED77BE4F558D0E43 + 7218DE143D4CDE4D0A80E7410554CA866F2193FE2278CEF41DAD7075985CA39C + D6950401E51F8FCA7928C206B008FAEEA85B9ABCB232B190D6FDAF797B230029 + DE66E541853315B6129D8E918D57971279D2504D692619CB934D01BBDF9947D4 + 932AFC9808BF54EBFCE959273C1F4AE0FD953E6FA97EAAD3A14286879D5939FA + F6CE81F84C1BAE0375C60FF7CA9209D62C643F61BFBDE14D470BBE942E5A1DF3 + 70D53E61051415C1ADA13D48742457E7923036A0341FEC1B8904F3B81A5B9523 + E1DDB963B74CF72CA20838CA44D32E4CA841D4A5C6827C24D7210009C8B60DDB + 97C2E780F2D9337286EC95AAF8AB98A10DB51CDA4777FD93082423E0CB2E5F + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMSY9 + %!PS-AdobeFont-1.1: CMSY9 1.0 + %%CreationDate: 1991 Aug 15 07:22:27 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMSY9) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.035 def + /isFixedPitch false def + end readonly def + /FontName /CMSY9 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 50 /element put + dup 63 /perpendicular put + dup 102 /braceleft put + dup 103 /braceright put + readonly def + /FontBBox{-30 -958 1146 777}readonly def + /UniqueID 5000819 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 + 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 + A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 + E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A + 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A + 27D1663E0B62F461F6E40A5D6676D0037D33F24E2FAC2B0009AD3C8350CDF8CC + 65BCA87979C36D14CB552E9A985E48BE4E88ECA16DF418749AF04FDD2B0E1380 + D281BB2476BB45FF30946B247DFD7F57305FA87E50CA338121C71CDFDF927A9C + 77FF14CB4A1D6D80356FB1171ED38C37702350497B44E42CE31DB2F493807DAA + 15B887C671199A54C4C1294BC520F5538C15556BC43C9F62342B121C6DCD6C5F + 491DA47FF360201EE21C08A781ED0589A6DF91B99FE118B9B29E4F068672E52F + 1A06C514D91C4C937D4E642503392B1CD1B984B04B674C2977A634F63B35677E + 9196FFC248B739825D9D0A98933DBE055BAEB4CCFD91E8F5222E9F02F955682D + 6E1ADE96CCAB979B2F9EEB34A678A9654B5D1C642BDD6C754F16D5AE17BF7D19 + 75ECAD294A5139FC07BA0CC2C251B1B7C0E64BB73E0FFC470F9F273AA242EBA4 + B2BC095D8D2E1A455DF910250D8C99DA1F10C83E4B692DA94B1F89072DEE366D + C924EE65FFE13617B5610730B8E2F2E23798C9F18B5994C9B5742B921A7FB96C + 16CF19B8ACAA972C1E77BE3804A4A6EA65DD4B9092D98C18B1887EFA97FC99D7 + B6B3A1AA88AD7F20035B44B841695D570B821AA10BCCFBD6C8940E2E34F70EBA + 08A8A410295E99E59663306F693D294E6CF2D1DC6A0BE335867146863132C749 + 95C6543E1DCBBB7C61FE27A39921A5A22BF04420181E0FC38BBA886F694EE79C + 4CA648CB549D9B11FBCC43742D897A806491FBB3DC23C4D0554AAF134D7A2922 + 8B261AF5704F0E175C6EA2CA9E1B2E76880B385E3F42C0E3D9D08DBE1A1F1EC9 + DEE4631A721124FC628F1F1947E8D0FF7AEBDD3CB1941C37AA2FE7E99C796AA0 + 8AA24BD4C7EFD273CCF724D0CFA7518D0653C395BDE43EEE35CF2598F10DA02A + 0C35E5A84B420C460E726E6D7EA9536EC0AE41BFEFF828EDA3066644A7CDAD71 + 299A95AB72EC59A516838A0AFDCCED92574AE168E07FCCDECF423AC395F55DD2 + BDDB62690C4908CB4FBC309E784D5B16136FA80170875E612DA9FB26BE5A1773 + 21527E01E645595D5CE121640C10859C08CC5409729E14B25392FBCF39E4DE48 + 511FA331F678EC755E99F2A38F0B12AC367DA9D019059C2B1CC0DEF80394D28D + F37F4049912A3A19166A05AFCB339C05E931509C9A3C201C49BE007B2C0B4834 + 705341C5155C22A56255C983726837BAB77C3D2E5B0AF94966894B33E708DC22 + 7BCD16220ABE415B87669AF13A25E3009FE90661D4213A4F0D9966F49B884951 + BAF50DAC2B36628F453B779671F8C00C7E64A3EEF8D56A722EBB08717646CFE2 + 85BE551B897ABB709862CB5FE3A78D9CAD9D700709C1A0AAB990639D57179620 + ABCE5C3D4AE5F93EAC123D4886231AB6377D57B6F8D3D565ED841EF9 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMITT10 + %!PS-AdobeFont-1.1: CMITT10 1.0 + %%CreationDate: 1991 Aug 18 17:48:50 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMITT10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch true def + end readonly def + /FontName /CMITT10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 49 /one put + dup 50 /two put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 108 /l put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 121 /y put + readonly def + /FontBBox{11 -233 669 696}readonly def + /UniqueID 5000779 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D004D606918A40B8D7BFA821B73E118040992A4 + E1BF99740F8FAA47E4349853C8149C0F8BE2F23C6F332BC0373C867D0715E8FA + FF163A60AFD0FED665D5829739975C5DE12EB30895604D211F645D4E13330DB7 + 64B6E35463C93B752F691FDDC44595B0A0E9E57C6F649809C4DBC7DB58102A60 + 46349E9A5740893A1BD4536B99ECE72B147B713619037400669C07291022F84F + 4F3302F8244D2F0F1380466E81E0B5E00AF33E021A55620A7A93F3BD49C7040A + 67C096167F502EF2051B526405B9391B4340A3FFEC103E317E315A88D31661E1 + 7E4104A2B925D1DDA9586861904FF6FFCE6A8E808385E4C4014F5A494874E2FB + C3758D6989AB68C4CEF82F92B9439794FC404A29D086ED6B27997735BC3A24F0 + 473FFD74BAECF5282E2EBFCB92D69B81C568D394055E2E30A7E3F448796E4EB8 + 019AC2E075377F777183BD87FDD194E855ABFA35AFA73304DBB181C267431B16 + 70456FD8470B525011891C1E140B8FF24A474B89F1CEAAB509F91FCAF512E16D + 8413BAC0C664FDCD31245C5996F4883305D3EDF1C8D1E6F0B1E79A06028BBDDF + 6AA5B515DF33BA8FFF2394262F3FE1DF95AD661322BFA5179E325BD1B1EECE49 + 69F64789FF1BE8DE5CD7485571A07471BD6CAB4891BAB122BE4C4A1B7176F33E + A1A434F745811B71EA8AF73407F32E9F4EAAE1C1FAA979523C18A24F754C307C + CE056DCB71B20292D4FBCBF9AB9E9B81DADAB90E60BE926315049E5BF0F50315 + 66D82E4963CB556F19461F43EF80302912AC1168884A1692AC59BFBC431B14AC + A5FC06C4AB595F9DF66CE5EB69568038445A9EDDE20CF92BA308A23179E6722F + 42D149F61C9FD1D0395249CC7074D35BB7411F76597597803B70FC60F754399B + 56D3E6959289CF13751956EC28B119E55611E9B749017ED1B924141EC997010B + E6F2BCB53588FF6C069742284261191C908B610389BE5237D2FACE820A7DC291 + E97060B5A3EF2B704C352E8A7E020A8038CD07394D6233CF482FFFB1DA54A278 + 412F69AEA16EA7B60903429F8D4DFEF87FD6E8ACA2B297D9303BD547A5D46B42 + 2E1A23A616C3ABB6B063F3ED3E29FF92EE8AB86C1CE5129F11B48023DAAC033F + AC3CA276303C0D73E853AF675AFA1C9F4B3D23D93B6B31CE861C119FFEC14CED + 644E10FAFFAC080C6B81CE43DA41133A3F2E580EC16A01063B195FFF0A6A7DAB + 9EA3E84F3D07D7985587C0B54F31ED7CB9CA1902EB82C87566DB55B6748B78F9 + 2346ACC865CA5C7C1D47210EECEA618065C9CB5A6B0745481A0C4C042A9EF6B1 + 17A4E9BFFCE545C8AFE67D3AF798E7AFA0EC10248283DF7452FD67C731F9A000 + 28B07FD633CC54A20BC439FE4117B28AB47F130892FE69AB2274E1109F13E9A7 + 15B46D1E6DED1E0DEC68BD07B044603A882DFAFFD221B558D597C3CD816185B4 + 865B3B36F0E3C1071BB0667111CECE211F992CBC579ED3F28B6BCE15CF5F0F81 + 26D5719AE66A0C06FDA91CA4894111A5C6061E4E96402EF6A25A39868101A762 + 2B5C1E30824F2D6FD7993884C4035E22D94690EEB812A3B7B6DB644AB4CF39D2 + 463F006D6EF9F60374A2FDDEA2C513D4E45A92DD7AC3A538C60F537EA35782BA + 21394F1CF31DE6799E7456914778E29CFA72A54E133C94DE0038FB4FDA1DE9C5 + 9011896C23E07D9B5683B7C13180CFA97CFAE0759B1EC29BC6818E5C20A2C00D + DABBA91C7C09F20F6D5854412242F5E7D8FF4C1E6B2C9C977735531EE368744C + 58B1D7CA15E88ADE0DD8F572D884436EC408A25C75D63BC4A01FDF96E4180F44 + A3E066EB30E06D987177CBB70BCBEF3CEE372594AF682E80FE3F1AC4C0F48DEA + 669BFD962002C2D3A4BD5C0DD66D554D09FCA07ED1E814328CA5F5C4CFAEC1E6 + CD675F4C252AD72968772B6240BFBCA9204D1D90AB7293789F32AC9D86BC58E4 + 5A7827A11858F8086D08A51C09837EA287587A58DD2A6DFE834E03B1E315E2B4 + C9D85D716E92543AFE95030A2B294BE490593B72AA8D0B218F44B442478CF900 + A38D98356975F5FE61367A948735696F28E861A07295728C078D7117E54FCB81 + E0487FD51F4E00824CA4BE6B95D2E324802376F40165B792D37B898B9023E87B + E195FCC64FEB0B64C2E848E8DFFA45CC1A300969E6E9109A81F4068290711DCA + 2F06970C7EE4B612CA5E5B91C5E5A147B246F9A7A94C9D63C582ADDB9007F196 + 01BA530BBEB578E5404467F226C4CD7003C9B1977077FF1D4BC88E686F0699D4 + E72ADC8FDEAF7122BB5EB95B1541B8C142159FE5B659E0B70AF970006A3804A6 + 4575048652086F80E8B0DCA84BACCD6CA42BD97DF45E50588F08865E71CDC958 + 719EC952D401B648A0015945D49702A37EE7B8ED4D0B298452CE581A133F6736 + D2C751AE56A0399A8337CA784D2C1ADDAD663AD13EFAE887A4AB2274EC40D9A7 + 6FBA9C15E612343DE69F44E4CA2116587D80F63E6E6D242BC2F6B25B445EF595 + 9452057018C57D52B38B22CCC3B566FD4CE153E8B5AECEA9A1735B36EC50EED3 + 597B4A0F4A00B0004D26AC5E49F3C374D92FE776BBB0FC2F36FAB81CAD3C1B0F + 93FA7ECC8B34A20F1DE8EB1AA629FF2B453F1953A4020F2E3D0FB078EBCAC088 + 7A6A7AB33AF5A7875A3F0C0CBCC3E2587F4D1F14AAB292B95018C8BCC0FA0893 + F2B1B286A22574D83B1FDDDCB53992114E139B2E43926D4B96AEA1276DF2976D + 8D49CA0DE7038DF2FE910B78AEB2043882E5CD1995D82793B6F42160B0FD5355 + B7556B7F82A716F73C296A0C74B08FF5582C72212F845136B55E70ED99BC01EC + 689417D481228FDC3E42E138A9030EC8DA53E627E7058B540E2A06F62C994461 + 09BAE5B719C5073EB783E7C91AAA4B5A12AB61FF249873175FE41719B0FEAB2A + 4A38E09EFFB2FB7069B0E8192DBD240081E3DB7308F2B0095C8E128FC9BAC6C2 + B8A59EC4A60C75F8FE01930CAEF5470493B28D0829462E5D3F3971560882702B + CD34A07A2AC81825E105D401D101AF0F8E2911A16A1DF58ACB0EADBA2E87A833 + ACAE21ABE83CFA93A204881052FA4FE2B6A2019EAC4AD1AE53003EB34755ECC2 + D4D3ABE8A413AF06424961554A63DA305415ADD53761EC675D744BEC6DF999AA + 09F5607219A168F730D19A6437EEC24D67C40170E9BDF3B3839EB41E3199F177 + EA4B13AD12040CDF049744C8EF2E7C7A2728868E1C2BCD88D57EDD285D970FC0 + D35011ECA8861634A7C5CBD8C128813345EDAC47DC4F35C54E2AE72949E6ADCB + 99E447B4C551C4E2184E06368976BCC13BB62694A1AEC8DEC57D1FCF3326CE57 + ED1DD8225C34B3921289AAD571F34E9AB729C47DC29FB3B67266C1B358E0DF64 + DD5ADF9FD1443E3EF1127A629A2EBE17E97FB05403E5EE4478F55C39377BAD97 + 752B66639446ADCA094FA0F1171F6C757862E9CE77B13477999E5325FFE510BD + 0C344DF8C75134527920495791BE9F744DED9B33693F33C50869174D9379174C + 4B43C2841B9390A511B55951F3EC30846BFE72EC82A4FB579B195B8E99FB113D + 3046973A58DE4A3EAF928A3ABBD76A4971234D76A01D043669FEEFCB02BE74FF + 4F3E6920962A4E47BABEEBCCA3DD37D993E13E45F586BFE58A100A8DFEEC3DD7 + 452D3C4F2E3EFD0BD624173E25FA570C9265A74E06520052114181628A26716C + 6871AAB999F6AB022519FB2B6F25B324985DE99912B3BD5E2F25C23DE5487ED4 + 6686F03242769B3057B0EBFB1B27E54474FB80D70ECFA871B237474BEA9A5B20 + 1DFDC09ED4486C2C4290015F07493E2E1D9F6CABD9B6FED614C22134D2CD1226 + 4AF2910E3B0FDBD15FBEDEA02F131372D16CF32CD9B737880D56C385552E0AD8 + BF39B7A308F3C28AD060152E22D46CF03F63E46ECFF75F26B4696C7B2723EF8F + 4894D6C9B9FB3B9B8B6DFB265B0555DDC5458E4C9DA2638FEB249AD30BDF9FFE + 7DA0F641635D230840ACFC434BC7BB284F848DFBB7CEBAE149B0BB6518F2954D + 3ECB18299D01CC8475BA44B0B4897E3C0045FDBCEE24757F533F4B054B09DE50 + DF49D3539E21C5B3A763B93306A61B2470F58B0A8595409581E360849977924C + 02E489DBA82049927C53E30AE88522D4DE501AC563F463B494AA80338FC66F07 + 95DAD1F3F6CA5A5E313EB49A3C0A7417C301F29EE6DCC57584BB7497B505A809 + C684D99BFFF712F0062845782ED82E83087D34E8AFEFAE4D8BCE73315B53B026 + 5907B04412B3013C0FB249E9E84D1BAC45DD78A9E35B36359DCD3A581A0FA522 + 0979CE88AD572AFA0AACC04BA397443808933159F106FD2735F05AADCC10CC71 + 5D893E855D096BA4DB36642EC06CFFE737F409B7F78D5F66083E94C24C2352E7 + 60FB0C243ED450CBDF6D09E07D6F8D5CC41D600DF9606E2CF986744D1C089F41 + 9E3A48A7071819891C61A0637EC9CDCAB34039A1BEBF77CFF29A9BB75172B0D9 + 83617BE9B9CB7C0D86B8DC1AC4D8718B19DE1E389CB79B48A9BBA8D28539D55B + 9C652B568056EE8EB7437584A3321CE7631B473D87578150F82E2510DFBB9F5B + 39C1AAF0F921DD4704208303977545559985 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR9 + %!PS-AdobeFont-1.1: CMR9 1.0 + %%CreationDate: 1991 Aug 20 16:39:59 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR9) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR9 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 2 /Theta put + dup 40 /parenleft put + dup 41 /parenright put + dup 43 /plus put + dup 49 /one put + dup 50 /two put + dup 61 /equal put + readonly def + /FontBBox{-39 -250 1036 750}readonly def + /UniqueID 5000792 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 + 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F + D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 + 92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835 + 3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203 + 046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E + C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A + A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2 + A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D + 731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B + 09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1 + 49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B + 5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B + 54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C + C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F + 11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AD14F1CBE935942AEC + D4004E6BEF379066FD72209DC88D2E634E79BCC2B98C766CBD92C561F2703F8A + 109E6C6CEC7B866F2FC7ADF646BF492E520319F3B949AB5D84AE990B33344A40 + 3971F58DFDF8D8D67FA0B8F2A0D884F8C09A5A721319B911DBA0A35903877343 + C37BC36C5EB32353272D1E6ED5FCA611BE319A7E1E842CB7576E7604ED0409F1 + ADA7F448D7DD3FA92138714F33B9A4ED35CF7FC148AFBDC3C6D0528410DB380C + 7E654A3C7CB05CC57E1D8EC9E588CE907C041F62F59ED68B5573E8041F84C5CE + 8A2B98E45762C35470581B2F9BF441389A6D4C7B8C8E267FB94107FF50D5D2FF + 64CAA70DEBF9A8A8CCF6F2B0A0F3A6000918190B91159F932086FA79C07CF44C + 4F0EBC4A37A620F439A73824B2218DB3632D500F2F31EE4F45E865E4D4A6F423 + A1CF2057AE882B04EC07896717C27221EC27A8AC5516BDDA9372C67B4C3021A6 + 62C5151BF5EAF28C948B0149B23862DF4106546C84BFF81AB34EB382712F5648 + 0CA218CB7580E04DE8FC4F51B2F8E8F532F8A38D19A974806A5F7A2003B5AF56 + A7E7D3B55000CC40C5C14B33C0F1691FC0D822D842ADB1E59E4405AE89092EB5 + A936E48DCED8A4C5090B6F81E9FCA5A107A1FBAE8FF89165B1483F96D7B54925 + A45D609F4A43BD37E55072F608A98D9181B82AD2D946F1845A70E7BA0F2D3A69 + 55350386785A8198FB1377A6E16047B69EDDDAF32C9F30F48E7EFFC081EC5F77 + 2A571AB0B72547DC4EE10A08E6BE352B57E77AB45E4B9F8E758FD28B82D535C9 + 0914AD14A771ADAA44FDD9EEC93355FA2F236D8130D6415F03BA593F4F3CBE65 + 7E9C2A93E1E74FE7F787FAAB63257E19D13B3005C3506B86623A8F91CEC08544 + 34ED1BAAF873DA49089232DA3D1E3B77EB4B22E2EA0C99C9AEC3E9AEE85B0624 + E75E32A01387A41910C70EAB2AC6ACCEA2D6CA43ACDD4844C4F4B039C96DDBD2 + 9460A5F1415D6C93AC6FA89E7ED4FDE1CD1172CF2E285FD9FEE437C9AB521967 + 8CF59CDD7916EA1E437CFBEB657590BA5400D1C16DADDB50E3369E3860F9DA40 + 116EFE98AAC461DA3B4352FFB997E7E277DFC4082DFF67CB3AC622138B19C452 + 55DE912FFE4347AACEBB93230E74305A297A337C28DE41A4971183408F481F29 + 2CAE2F8B18AECBA4A58A145B95ACCC6BEB4E2A932679C7325212B7BF3D8878E7 + 89EBACB746A1CAFA0BC946F0AB8519A66A2EC528BC59F663338AC9DB9EA2C608 + 456F1D06FC99D5BC443E3CBD2BE6ACB55B1660646B159EA453D8BCAD3033BCEF + 11752E2937F8BDF42973C1F5BD2C0C2DC25DCD09E74BA8BDD0D637987D4ACB17 + 119B04C4455C83ACE7804A4372930051138F831E6C2BACD83FFC60D6DA1190A5 + CC380114B4BF63A2DA603A7BDBC4C7B60E0A2C7FB50DADAC17BC5D8EE89F4194 + B63312C221ED36C6C6A4C6264CD4F9A5BBF69D92295B45F5CE74113FBE0C9356 + A82334CE969B1C6673BF2E45DE0A4D7B6694A06D414BDF046A77AF540B5526A8 + C0580E449366F5ACC809B0ECEA3C65415720C2E738B0CFB5925B6722ECD42804 + A8406978DDE223647BC35D8623A6C999705D71981384D47FB26626338B6862B5 + BDACC9837758E872815DE3F569737B1372E4126866360A40E1966A284721A094 + 69EBFF8AB8C382D3BB19B581746168B54D843BB3E3C8D83610193DF757DA1832 + 0C + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMMI9 + %!PS-AdobeFont-1.1: CMMI9 1.100 + %%CreationDate: 1996 Jul 23 07:53:55 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.100) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMMI9) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMMI9 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 11 /alpha put + dup 28 /tau put + dup 59 /comma put + dup 62 /greater put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 70 /F put + dup 71 /G put + dup 73 /I put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 80 /P put + dup 82 /R put + dup 97 /a put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 107 /k put + dup 108 /l put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + readonly def + /FontBBox{-29 -250 1075 750}readonly def + /UniqueID 5087384 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 + 9E394A533A081C36D6F5CA5FED4F9AC9ADE41E04F9FC52E758C9F45A92BED935 + 86F9CFDB57732045913A6422AD4206418610C81D882EE493DE9523CC1BFE1505 + DD1390B19BC1947A01B93BC668BE9B2A0E69A968554239B88C00AF9FBDF09CCD + 67D3B2094C11A04762FE8CC1E91D020A28B3C122D24BEAACF82313F4604F2FEF + 6E176D730A879BE45DD0D4996EF0247AEB1CA0AB08FF374D99F06D47B36F9554 + FAD9A2D3CE451B7791C3709D8A1DDDEFBD840C1B42AB824D5A0DFF0E0F15B0B7 + 22AEEB877FF489581DA6FA8DA64944555101EB16F7AB0B717E148B7B98D8DBFD + 730C52937E226545CF8DC3E07C5BA30739BAFCD0F2B44275A6D503F582C0FB4F + 449963D0AD2FAFDE33BA3D77BCA9D1DF878DDAFCA2E22CC4BACD542B282164C7 + 97C2BDE318AF9D501CA21F6E662E7AAB75A5F24D2C182E598D175D44E88AB19A + E7CD59584F95B389183EE21B525BF52A3F23C0FE5383A5565A19361D716F508C + AAB78411CA5A4D27552CC1C435760D5A89D535B71C593E755C616661363308DA + A683F54ED0C23FB2C225A008392B0B719F66F11A946A090B7C00B662A3C69599 + B4ECB0CC70C85C4BBBF207E0026F6C7A19F2ACFB7A60804FC98A4BFFD7BFFF2B + 952B42CE273B1118F73E1809D2911924A418CC45E20D9A9C026201263F4A1527 + 48E376774D7C218132B4D3680590AB2AA2C2EA741D7E96C49F4BA3E705E2D68A + D288EC56011CD158D02216881B7E45314D94E45D7ECA73776BA42DACC41248A4 + D19B97FA93D40079BACFE26853F0DF9F75201C59C77FAD42905A1B39ABECBAB2 + C0925759BF0900E0E011E8ADFAD5859FC718F307C85933D6F9FA42D823683703 + 8BF34F6666AE5C90B42A4BC5F2F4B170B4DD23DF5C5B2A5D955D48570DA58601 + 91048AD249803432FFB71F40252FCF5F4C229C3EE9A2F877C590E2DE7B4C1991 + C6834B363B491FFD0B7CCE29BB249C6DC3185E7CF461694EB33E634B65F0560B + E0FBBADF000DFA76624E8ABA93FD28D7AB5F4EAA1F89CF9AB637E8C1A08431E5 + BCCEBAA8F32CD3912E4E64C880CD0845CAF00A6637C6F23E93AEE6B3261CCD54 + 38AFF16E312EBAD3966CA527A950AEFF379D285F233A1C322441C50598546CF4 + 6B1B23544D87B706C18910888E6A738F1AC095A03AA0FEB2EFDC1DB5D901BEEA + D9B3C51042157AAD1C4A6993DE16C6083A4C7E4ECDACAFA7B34606E2D16DC370 + B814B5AEADEE208F26B5D560400FEB281262CE813F432A7718B899C8DE904677 + 1192E769658B9031AFC8A99259F7E211C2FBAA00653A6756E16C4A82199136C2 + 1F37E717E57519158A2331AD06F2DA4C039D37978C7D4FF6C12B29AADCDF8A79 + 3BECEBEEA6785F9B24CC5556CCAFB08A4E11C1FD313DE70273C999FB2E86E83D + 2CF5D6B151B423E726F9A96C17AFF546B26DC6FE1E7DB5E3AF3FA48CCE4CDF5B + 0B3EEDCAF93A41A0DF40B091C0831EF8EEDDF612C487D5B060432696FD4FD42E + CE83EED93A981A36C6AF9ABAD7824AEBB6B468DCCFD33C707AAA3E1A8092C8E7 + 34472E4021D61A72FFF630F46D3448BD524D3D63AAE2385ABD8D1C2BB6400971 + 8E24379D68E0E97064FDC9B7A54912E607FB97BC0AE2605E3098D5CA8A7DFA9A + C1CBF8C0C23BE3852D213978623B0261DB98042A34A3D5A1A80F1E7771D15A8E + 8E4229A89A739CE429F8CCA8AB6D5EEC43047BD0599763F01CA630A85494D20F + 841D2D7D0E5B8E737500CCC9FFF95D28B0AF310C47866BC0C366824C8C412A2F + 2D7DE8568353782969A26621330A46CB363D2E246D26F1AF921A83BD97163F04 + 37859A65AA054A56C908DCA0D24EC7111581C93FE6F3D8A6481CD2E2CC04E8AA + 2D97CBC8F8CC60CB81710056AFB62054B274AFB7234D780750FC196C4F7F7D75 + E9813AB1FCA539575CF8BA1DA71411EDE17A86917B1481DAEEF7A94014031C96 + 855EDB37E911F173452E375EA4D101A35E8D0A7FA8FFFB14633E53F5FEF9EF1A + A23187B1BE5ED1FC25A67009E685C1C5984AE22F4F782E2D37C4DF2852CC07BB + DF6E990532A3C527E534628539C03F3F7B27C7D7BABDD9AF0ED23F2C35238B4D + 155537E75A4A6C5FAB96B5A7BD1F7EBF989BDDB11430A562CC1E198ED7E549D4 + A8F7FCFBAD63E992B663FA21BC54322548BFDF3B284F9AA1220CD07B7739F369 + 0BF31D27B2F490C920C72FFB843F299177509CB13AEFF9C68524040EA8675F9B + 5EBD4EFA2ED0DC2A0150DF1C78A93E4A789ECAD76AD637E58546CAB605F37BC5 + 3AB35047DC7B317BB5CE7BB3122D408C19ACCC1225FD14C41455E991C525C251 + 498E4806CB67ABAF19AF80571225B5CCF10D232AE4FBF0114C8A5B6922075375 + D2CDEBB9E8076F5CC1437B6EBEAF0DBEA480458C73B71AC60E881491677E2EBB + FF3ACD66F1C2DBB6CB0AE8932D8A75A38F11D034E8083B6C01945FD054A35419 + BD3B3035438F3E7B8F3DF335C8B2411F1456461D991269532E05526F588B86C2 + 7303D97DC311994564B190F9A03BB08F69DF2B62764590FCE0B8A29B67B8377A + 2BBFA26AFAFDD531FBC0B845C915EDFFC05B23D6878747F9EF7A02D6DD941A2A + C81F041ECD3E73E6F67D6723057E5F8529CF4D99FC69600C6CC9ABD852963701 + 3164890E13531D4FE06D2C747A290F37DB16CFF3FFD65A1221D580D833834CD4 + EAB9935F76A283F493A149084272C9F19825D8C163EC1AA73E8A1EA040FE227F + D0DF9F13EF254360C622405514FDCF56A966A65DBF6E23D3EFB6898AD9C3F3C5 + 427F099D79B1C5D9BB6D679C7939B6A2D6F87C5D7879069AA816F8A6FB2A7E40 + 7A8D337DA970548E3CD6B855908A90276A7D9FF3AA65A0CA4853A4075E7AA6F7 + 1C6F95423A3B069C6D0D9F589667E61B49CC4DD759854C2C97B50327C5AE2F59 + 6B33BAAB6874342386A56B9108221283614DE265394806217B5A5E2C3847518D + 55A86543A7B3BC5BDF7BF7A497995E8557ADF03DDB06D427D1374AFF1EC111E3 + 4B8188EE1DBD9F401F90F386302EB50663EBC8B82E744AD2A7FB38AAE4BAF26F + 44C3BDB57E54A7A263EB094532A346AA15B46973C75F17AA9D14C73C5C43EC6D + 0371ED16F19446A340EED29BF800BA53F896C29A94197CA2FA2C4B00E24DE443 + DA974B9B76C9DF1D5AA08ABF255000B4C1B1678C299BC137B632BC2288E2CA46 + 1E1A50D525851FA32ACC6C126CE075BDB634A04D0860014EF1D862EF7503EDE6 + 6E0035F30187D566A83D267E98A2E25BDD75EADE2C7E3E67AC3129135363A30C + 20F6B2671BB61E8617BA819A2C0567E280F44CDBE5668D6FC727D820176FDBD8 + DCE8CAC6F5E2AD0D70750A4CBCD236B0AEB2E58DC25894B44D0F2215A0644DF3 + B91CB3249D2FED051162A782BE12A08610C6F37B0B324B1AA80ADF084B66AC6B + A95D2ED57F5AC63DEB432FBC4CCE182D1AC66EE7D2D0B8512992CFE0ADF28F33 + DFD23CC0A3F234C8D6D7DDD808C68380F3D645C303A972F11D4A23D2CCECE839 + AD680FDB38E8FBF32D6BFF68604E9738DD318E94211EE8B8FC24F3F1F81F7058 + 2E373EB7DE8202AC181CF2CDEA101721B58A5179E56C3CFC0C6FB9F31D317A27 + EE2D2B9AB4E360EFAAF2942E7FB07C2FCA89247B02C57326D77E040E98AB7296 + 6B15205AD362DCC03ED35EC5329FBA68557C4114AB6BD9FAF9AA80D34B770E83 + F92B74CBA9018318C22DC92524A2D9F4FB7F8321CCE0030726BE7A3BDF0A8885 + 5A755330B7BDA5657E5F6FBE480719B5C69B3625C95AD6710E5323C84BC3C055 + 1ACFC5D0B6D856839A7DF1369ADD01AE6547C98E9808AB1329F232FDFC4DC57F + A62EB9045FBE65524899C48DC6B941A2B05FF20C170041AF5B22FD2C70432368 + 0AE086D569FDC5EFD9BC8DBF97214DA04BA972AE4FFC60491FF167D7E98C675E + 5B7A4302BCBEA0AE4C0487D131AF903A4A551F35AE619722C54F986962D9C657 + 4377C28C6BF3791D2F5D5199C5AF973F120FFDACBC58E28D32802CADEDB4F666 + 22B8718F66BBC68C0959594F6F5221692F12F1D297E2B12F54A7A92151326C05 + 4DDA6C6EB8B809FE56BB58CB701B9F60ECFA8220B6CDF541F3A60FC661F9694D + 1C2937D2D042F0C4827D882D6A92CEE4B3B4DE6554AE0A033580AC86DDBF8389 + A810E6B6E10303A366CC803C918141AF8C2A10616B5E03A6CE4B6D69CF9DC0B7 + 1A3EA9E990489C394DA153B1AC01EE5F63A175249E7D800E0C30138446491A72 + E6C94D6C2EA4845A64F9850060A28ADC6A4B9592FB8E4E7A5EEE0223ACA57AD3 + A19875DE85C7E7F9EC528C7F8A0702512FA5E8C824DB32ACE1DDEC8EFC19B4C3 + FEB7FC09AF427F29F08A755F52D78CD6D403ADE58F12CD12BFA33C269A830885 + 9162114CDFF7EBF94BB5EF485512B28FE865F725633616BC6D65D031C6D14788 + 92885ADCD0676750A41CD2C2A990036FD8AAFB4F0E8E2AB0A5CC313C63977D18 + 8B5C0D88AFE30A3AFAB5E07AE934298DD7785E18BEE4D37B6A300D63F872E901 + 9DC77891E15D5425CB3FCE398688A92C69B28BAACEA0BD088E3635030C2A4FC5 + 9E1E6C0EA8DA9075D30D6B0A38D0BD27F8190F1C791C70EA8A74D61075662AD9 + 84B4A8B2DF467699E71374737903DE088F1C01D7094D63258C327A74E663D4AA + E8A87132DBB1D3DB5E13B1ECF84AFA67AFA7B04D7AF8B1A2911C5F2DC49900FF + 6DBF91BE4B3D3B083A0B88C8472B6A585D2CA9A19A2F46F74E1C477FABE02396 + A8741D306178372E83BFCFF514FFBC4E5A46367EF470B1243C07E6B15C67023C + 7AA87D5DB1070EACCF8BCAD92936B8E8EDB72707F2E7866FE1F73DED29BF993C + B17D48DDD2BB1070CF0B22EC4C2FBB158857ED2DAFBC3C5D4E831316C9057A6C + 9D83BE6A480E4ABEE0483B35B38DA1CCA76AEE81FA7F467DBF3C29FE5292B105 + AFC70782088FD64932DE2A1836905FC92C76D0962F5696161A78E085205643D8 + 827CE5D584B2366D7C44DEF8CB3393CD9E0849FEC51846D652976543D2003682 + 9DFEF077505D6E145EBED26A08B810F8E5A208FE3458B7D4D4F33456CEF0B147 + 384BB391E9F93E59095AB19F4E1BA6F4F3CCC1D97B130B6C64494384D3315696 + 00E54A4C13B5E59F963CCA644C12499092F3894CAC262E23B09556E9DC897AA3 + 8CE412087A90D07BA51D74FEE564F6190434E44F128714E1F17E4BC6E3B017D2 + C40CD646AC2192E8FE37B257598A387563F89AD47B2D83857C3E0C6125D3A694 + D78FCC92697E2C95C36F21E3F848653BC23D01F1BD6589B20A736B957D1E0606 + E3202F33E07B0B4D549664D45C53ACD8E169CB11AC14EEE530A33A1355ED369C + 927A51338D94C851C0813A30121B071C342A33800186D5ED42CB2F93CEC6A2EF + 01A589F0AAF0FD8B9BD8A810BDB1135D14AB7CF64F906BFF0B05148486320689 + D9338FD7AE159991D8ABD15174C6C28ED85D287AA22E03138C6F6284551E678F + F8019483E4DAF7FA69A88D70CE2CF8C513F017E30A7F8973845368974ECD181D + 36778FC08FA046F95736434BD5B1A645B5AA418FC5B6179D6FEAA4BE1083AB80 + A8ADDB974256DDC04D4324EED7DE2587395A05BE0BE8A38ACF6C548BB96C70F5 + F777E277B45DAA653146C504098C2DED1068BE8DF4CF379D2947673D9584CF27 + 5DEB501EE07F3167BD18BF654A07941E356743974FCFDC0D81C77F8424AE9354 + 883B3B045AFFAF33440F71AB70C2307CE6A8F833FE5926EE6AFCECD140C5AD6D + FE2D0D5707624881ADD83B7A8E2BFB8139E9CC96D06A7F1E5B910E1E73ED2BAD + EB3EE15D134FEDE2451ADBDEA5E0B95AD4A106D2191FC39935FCA5E49B349713 + E25004F6499A8AF77D09286E78E1FA3EB5E09AFE633FF1BBE4C26C426DF73841 + A81C838C545925DCA211E2A99DECC84CCF1DBC63935EA70195031A04E26C4812 + 44D165C36ED8B61C5A0C35FF8727B5296649537B39A87EC27CF2F3BA0F99C291 + EC2CBD1138605478086AC997A543844CCAE8B4104CB823FF058BFE6DB0E6D694 + 045E2D397191BBD8B2E8D27A2BCBC67D21B5F599C2863C5E140AD1BBFFF0842F + ED18205559FD7213ADD60BF3E7EAB2805C7FA51CA71200F29A99A913251E096E + 31139FE0D811FA65B5724145365932BD09C3E85BFB59FDCF14454EAF4AD59AF7 + 899452CE53D0E57A709DBE0A04E9AC6BEB1580131059E7D6648DB3DDF8061F40 + 2EE011EEFDE29DACDA625269A43B3442CADE145D78A26EBC4A08103E92117056 + 77EC99BF3572AE3D8CE2DBAC4A9E28D92BC9A56D101DFC3E43DAB727F6209230 + 9BE6A4D13A4CC992DFA49561BE8EEFFBE01C08A999AEDF05DFBA6321D8E376D9 + 41BB925C46B08C2A6B2FBDDD532B9BD0D1A357CBF767E88937994C9BCB8C36E1 + E6E90E665A5AD3C18D5BB4BD2756D261D07D87B7F6216DDEB439553716E6248D + 1E84BC75735B4C3B4925477E1A8F3FF8D0080637357C27CA855050B0FC223F4A + BFCAA2E36C152A0AAD3E2945086A31DB0992F1671611D4A72F748AF4D24EE14F + FCABF9C15C087C91CE55F05BDDAC125574DD7CD5161B23918E8ACB06D51F3B41 + 67009D3D53F0D9D698C121323E5E9A8C13768AC6EE688934971A4A87069001A9 + 25C8FF0E1573BB6DEF5A9017E05473D93399FC0B0CD79419479B481D8AB4D7AE + F2D89BF711C361866517223F6F6722409A03F4AD87B9A85B6E3E64FA3FA42433 + D40565FE7FD88E4501A7EA6381736AFFEC2C8D82A58B90DCAB9BDB9E3DF1737F + C4788DB25DB67D936EA40B644C04B8B90EA81B64775B8A55691723DBDF511C01 + 53F195B0A842C35865A9358D31C333854C71DA67FCD4C19950C3F7FFE43F2A83 + A4009E80D8BADB5FC3C18644CB9E85D93621E7BE9F4DF11CF93FF411828F3B60 + 1AF9069B36E45A222F87EFF253A5AEB4D8FEEA84C6B64366D5DB49FD6817EF17 + 2F981792AE9BEB1BDA795FC34A07BD5C8E931E8F9413CC6CF2139AB054AFF880 + 53D8333BBB506C36D5A08246180AD6954D02DCA43C473151C2C99C28AE288E9F + 523BCA347B670126ACBD0266471900BA614C94A43E38B5E7E0383EFCB18D4A35 + C90F8339327CA443137C42AD5AB07F311040A5ED89CFA3AB31AED0C8BDD0C652 + 4FAFBA11C71825FAA9CD09CDA9BDE875FDCE5367FACF2C06F935396F85DDBED4 + 08DA543C49307A3C56F9C24B267B7909060E6F5546B074775920033003B91136 + A41A368796C13E9366CA8F07C1F4E771D64F354CC544C1C04A9C58B796C5356D + 288A4F01778525F83CB621A5AF1BE01C4D35AE10B040D16A070351DD6B3FEC19 + 04FAF05FB04AAC159896ECF553FE8474F9D4E2A123D5E74B08F1245298383B37 + 955625E0E7F9E7DBBA6A57007F19B64DD79B895F576F91BFF3A1246ABE49DBC8 + B23AAB0C05BE1F4BDD2A3D153B013243F41722EF9BBC7CFAE08E702E702C9245 + 92D6BCEEF0232D340CF781B899A33FB4DA453AE957D70ED2CD6AACB2E63A7247 + A7D0FCB66541B15EB0E97DBCEFEACFE3A6448FAB943FCC55DB2BF8B1AFC1C401 + B84324B7668541789887DBEE623DA2EE77DBA673606B7D18E163C26FB478B850 + DD2A08A31F5D606DDBE0BF0872E0D528837BD2713B1AE03717BC7DA38B62B9B6 + F5BE5C68E80AD97B1688CF7BED8D7AAD1D77E0CDEE373FC68928BFBF1F27BE53 + 251E7393C008EDD2ECAD77496E5F20026ADA066E768B19E68241E4E9204A85FC + E91B173F518BA79A35CB171FAB84BEAE87FEFC5835317747D358F78DB40A930E + E9265CAB86BD64AD8AD1236A6E17EF24C719693C5CD1339B869A96F40E2B74A4 + 0B48A3516517A5CD2824A487C204C022A1C8B6B87191F8536C81AD53EF8825EE + C7525747B44324ED34B04DFB3200FFBAB362E840071FAF75AE80701988DEAB83 + 4FD3E92A14276DE07396073E46EEE9CAD508F0E6859D7BDC85548D6D4B4A2CE8 + B4F93C15AE032FBC3F1D6D5C8E35F2E0A5309EE8D59F0589C52A9B0B6063B3FF + D74181A30B0DC1825D3B7E1936569CD527A1CF82DDA8967E03BAF429A35F2D00 + 5C63FC9CE0D6AF73A9C72B0A2B95F162E275BB24BEE9B17F3A3C38160517EAF2 + 5B2A28018CA15A1B19A97AC588C830C7DE7BBC04EED1B602A37E0072721A8174 + 6AF0D0148914E8AA6838072E9BFEB5E2C34EF14E1AA53C8CECFA5ADC85DE3FA6 + F723DACF67E7B0B361AF1AB919BB9E42119FEC42F54A40FE6404A6E48A1AF801 + 19A6109B46D2E1F8C69F7714A254FBF3EA3F34AEF4AE930CE55579A5BA375D2F + F034664E3FE6E0C1E01272AA784CEB95C9F22C5B9B63B73497F2EBDCFD7A44F9 + 4B6F4FF13C6C5CCF756E9B23E3AF3E56F0DB432E3B227A44EC16B34888DDFF6F + 7439459938805F8A59DAB7B3142AFD0BC4AEB91CADE2CE61649D926FD1AA7429 + 9015D18DF103A4AB57C07574F86145F216974A34C92968A443388FA035D0A919 + D75C3D507FCFD03534B12CB667109A11F06B01DED6D7F600E9031A120968D50C + 2796DEE80D22E79F586AFA8813570D1BA6EBCFD5EF396AC0DE09443A252E049B + 6522BFEED3FE2D6483A0CFE180BC1C6C381E4DC2B38C0C12C6BB7FD1FA1015FB + 81C8446ED64E27E2D162A4567DF98978B1812E511893870DFC139BBF563F9132 + 25DA6B613B299FEBC34957A5FFC52CC376F14DD799C48A73FB10F60EFF99F284 + B2738D0D6C4327C4663CB82A871D6F8B705B60FBE67C2F6F7EDDB0EA1874086F + 3DF58C152ED42683EE42D626F8468FFF8E153EF1B56840295E52299F1273EC7E + 2C0AE9F6CD07BB883F0BCC58F0F5095CEE08A451A4F3ABC6DCFF17A6834FD16E + C0611DF41871D2B1709477583D4B30BACEC86BBD3F08C55ED8AE21AAD69D757B + 43E4DAE16273E8115391D32CC65BB5E7EFEBD1A01BC8334A8EFB6F69256DEFAB + 00A43549FAA54325C37E8FA55A7CFFE5EFB209957F0D947CE4289F13E3670250 + 857C2415E6408573C55CD9EB25A377BCEC17E6E10036E970699AF4E637D7D7B2 + 896FCC0161CC3BB0589D2FA6B1D74C4158EE1EEE8FF5C724C2C4E1873C63EE05 + A55499DC15218FAC52C86991EB00806321AD44F36A466B153ABECBB8B14AC31F + 27F2AEF33B7EE6BA4826CD95C9F2DAB0138C8E394A5A959956C57AE7932AFD09 + E2A80C0B8DCDA430FF1542A20121F605E96812DBE1DAC1B57C7EA99C7DB688BB + C95BDEC6C129F6264C88BE7436EFFF443976C07D32AC01BA3B7F4177B76AA254 + F27EF6898A039C54B060EA402F4E976087DABA5A7E3CECE1B881504417769839 + F11DB6E544A7DB45D543DD2815081BCF028D63C56D45DE397CEF54C9A791B9DA + 2B042A6C6A183D86AF177E815630D4DF47C3E0619F98AA28163423618CEF074C + 2354029785E251DC6739A926003D45C796985C2A06DB7E08863ADF300DFF43D3 + 6295CB0712119C80727A1E899A5227B82E553A5E6E0C654DE1D25FA875133881 + 29EA14C9D20020CCE2327DBF74DE1B1B645E74C187C52C5183706C9CEB2A32C9 + 75943AEB19DF4E02680102D9BD7F8A4EFB65B368A078F0720D2550AC0087A382 + E7F148F4B78B42E2B2139B3FF8CC4E88BFABD526618A126B94DA6A6B5A25A2F8 + B5DA161CF14BB358E9155BE1DE5C6A8E8033E3B568EEEA00E4F147B04522C974 + 877854E9207EE1932B7AB02429E8D2191613A7CE0B2C786803160EEFCE281701 + 2B71544C2B9B714916F4B30C912E1B01083DA12B3F89CCF3D030265063918CF6 + 8ACCD4922D35C54F90135A64F122705CDFF2B7363E1AEC96CFAEEF24E763B25A + A6297CDEDBD813D7A3ED998F86B17A0FF12495EE0E340D77F0 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMMI7 + %!PS-AdobeFont-1.1: CMMI7 1.100 + %%CreationDate: 1996 Jul 23 07:53:53 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.100) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMMI7) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMMI7 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 58 /period put + dup 59 /comma put + dup 62 /greater put + dup 67 /C put + dup 70 /F put + dup 71 /G put + dup 73 /I put + dup 77 /M put + dup 80 /P put + dup 97 /a put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 103 /g put + dup 105 /i put + dup 108 /l put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 122 /z put + readonly def + /FontBBox{0 -250 1171 750}readonly def + /UniqueID 5087382 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D77639DF1232A4D6233A9CAF69B151DFD33F + C0962EAC6E3EBFB8AD256A3C654EAAF9A50C51BC6FA90B61B60401C235AFAB7B + B078D20B4B8A6D7F0300CF694E6956FF9C29C84FCC5C9E8890AA56B1BC60E868 + DA8488AC4435E6B5CE34EA88E904D5C978514D7E476BF8971D419363125D4811 + 4D886EDDDCDDA8A6B0FDA5CF0603EA9FA5D4393BEBB26E1AB11C2D74FFA6FEE3 + FAFBC6F05B801C1C3276B11080F5023902B56593F3F6B1F37997038F36B9E3AB + 76C2E97E1F492D27A8E99F3E947A47166D0D0D063E4E6A9B535DC9F1BED129C5 + 123775D5D68787A58C93009FD5DA55B19511B95168C83429BD2D878207C39770 + 012318EA7AA39900C97B9D3859E3D0B04750B8390BF1F1BC29DC22BCAD50ECC6 + A3C633D0937A59E859E5185AF9F56704708D5F1C50F78F43DFAC43C4E7DC9413 + 44CEFE43279AFD3C167C942889A352F2FF806C2FF8B3EB4908D50778AA58CFFC + 4D1B14597A06A994ED8414BBE8B26E74D49F6CF54176B7297CDA112A69518050 + 01337CBA5478EB984CDD22020DAED9CA8311C33FBCC84177F5CE870E709FC608 + D28B3A7208EFF72988C136142CE79B4E9C7B3FE588E9824ABC6F04D141E589B3 + 914A73A42801305439862414F893D5B6C327A7EE2730DEDE6A1597B09C258F05 + 261BC634F64C9F8477CD51634BA648FC70F659C90DC042C0D6B68CD1DF36D615 + 24F362B85A58D65A8E6DFD583EF9A79A428F2390A0B5398EEB78F4B5A89D9AD2 + A517E0361749554ABD6547072398FFDD863E40501C316F28FDDF8B550FF8D663 + 9843D0BEA42289F85BD844891DB42EC7C51229D33EE7E83B1290404C799B8E8C + 889787CDC18161E592D4669CA7E1A6BEF748707FE416EAD5183976C7EB3006E1 + 8BA8CE855AE1899A5EFA507E184C1565EE5BE977BBF29F8201F6097657FC3A7E + C338C77100C6F9829D7BB20E13AA3283938FFE14CC87C289FAEF1FC521491A08 + 92A0C997ECD1388CC7DB0F13CA52E5460A738F2EAD7C81866B92EF8265E68324 + 79F460511CA0B972983CC8D14ACE8D8F8AC5D7740D2428A80DAB2C207E3AE4BC + 9131186C72D017A77FE247CABFC5F38F931443CDFFF21CF6BE41794668A2F6F6 + 8BB3F68F4427B001179598A19829B6EB791EA01C15B418347217F8545C43053C + 9F46A214BAE2C966E2FB804C55BB535EA5E3D9C40FE4CF1493C11CA277A49DA8 + 698E2B56C2F69CC6302D0D46126AB5553EEACA969EEE1FB5A30878C902FB312F + E86E47F2D6640BCF678AE14F9DC698CC7A03D75CEA59C5AE42B7E4C2E1EE523F + DAC1DD9B17F8D07B3A2B8E7271D5ACA860A38A2A25AD69D1B26A16DB18444047 + DD8F2CBECF9F96EA902DA9BBD23EBDD0106F8329F0315EDF1B98D13FC340EE91 + ED35EA2108B5F5F39367303676912B5554620915F8EC88BEEE288CA3C2788D9B + 91CB8602F8FAE522873D97F28E3234F3701293385BF5CD7176D6DD081B286D51 + 926570257A73982FECA01D69818A778925E568806D438DB1713DFA93EC968DE3 + 8F71E95EC19476338FCD23448B6EA2E3A3BE5D414141FF69313EB35407DC82ED + 1AA620A8F50E5963BA9095CDF45F3812D723F9B1E9CB4687070C36E75AFCC38F + 8E635B02A2E4B2AA62034572A2E0946DCF71DCBA0A43E90D176E472C24228A89 + CFCF7A2A0CA0F836F983FA85181D6FDA238E9807172902D91AEA4662D8A41F6E + 5A675E6706EE8886DBAB0B3F0045F90640F5F231C9F2389B07956637AA58B87C + 4F11C4E321ACF98DE595A63F7F8FB5095A78A820F41F019FC3407CB86809B5A6 + D8CE22469BD6BF51071801141A5C0121C1CF086259E056774F3B7737F243B12D + D05717D91C88DB590A2D3DD2E59782CB677341411B3EAE52DEC78C33711D9913 + 82790BAD61DF9F26AF72E7B4147211BAA591FF5467FB03448B7B3C6545620E9B + D03D1BCDB463530E60D2AD567EA41B2B8355193BC49D626126FB85D722E9FFD9 + 726709015D9662061106D7CAAC641F37C9A739182E2089E07094C823E18E59FE + B95F908917E72858D272E015F728665B50E56E1C4480B6770123D26406CA5961 + 928210434452D6B70B44E69A45E756A5D13737F55F7BAD70AD95C2ECFF71F410 + 29D3A9C7182CFBD3FFC589FF5D83CA606F2E9B3E97FCB5A75A0D362B47886375 + 546EDB92F3204F188925B2CB469A05C23D7B61A3A904E8F93C4CBF9B9B8867AD + 0729B5347BD54A159490732619DED578B99B7A9E123C19D875AF96FC1733C5FD + 37FFCA721C05F21C4F0499B359E94A9F94C8455208D41E544640D88714D20447 + 0E34E33F8E217D41872E53724811D1D2D192B9F24629608A8AA70A78DEBE3498 + 0BE71509E1C857A51CFF8562988499865CD396DF9E6D102C5E57DCFE79DBD4AE + 1647321511AA4213C779ABD55B27425DB778B56FABD69C5B29AE62758B0A875B + 3DB69EC9CBEF7B2D2B1CA1C54C97B088832220E79704BD229B4EE6B29046BBAB + AC7E45AC627D860AAD3DDAE2A9690C5325A401901498C3D4C07086F7CE1D35EA + 38CBF57C92FB86AD6B42AEA1CD3C6889925A028886C4F5A4515B67EC5BD3C0CE + 1B4C68CDF46BC5B34CA31F29B5F590FE557F95101745E2C40667575F86BB2A41 + 90C4BFDBAB9147F2624E734A275DD833F6066BAC71443224649A32B2B3B25E24 + CFEBCF08D7F1ABCB39C6E7FB813AB43ACCF3C07929F34B27899CA79CDDA856F1 + 69D762858BE584FE437DE6EB30900D527291F6F7BAB8FF16E6106F79646CECA5 + 32C32DA913572D9E27587930C5DB4CC8D3FC66D34FC1FC590CC421B5D0206590 + AA2BB6ED9F94E58DAC1C84B91C2B6B58D21DF72F0EB3E98388DE9FAFEC75603D + A98B42E8D4CABE595512C102A96B6D92308D948F1755EC8C897520C2037130C4 + 19097347C80A64900DFA97382807C26B20753B5E1BC8D7F2E78BA3AAB9D95862 + F2AEAEA4F50B708DA2CE21ED62DC3B279BC80289663785A8E929047836D5E4EF + AB6D49617181F496E59353C372C2611B8A017F563224326024EEEFDD84E8BD4E + 8A78C24571FB435EC3F0BCD7AB29E718FCFEC9D9032A2C00D6A9F5B47EE135AC + DD832CE7A9FD31AAA1029C44B458BF534499AA7E311CAF218E977A52536A8129 + AF9D5DA27711B6C7D5397E8F26872F3AAB5F20535A198423728002DA67E787C6 + F3D66C697B36810B9E6FAC0D1BC3D8D9FDFBE2C190601FCDA9C2C2FC9A060848 + 136D0FBA66A47B0C9313FF25EE91D9D8307E221875C14ECB71CE38D77925740A + 5865249594CEAC70B2345D1AA754D5E547D3FA4CC25374851F646A534B1301EE + 0C4EBC10EED1FF083BB2BC6B2B4D3BC8E453C663496D738884595C4F31A9C6C7 + 538FFC3EE6B8E66A1EAF540F07385711DCA0B7D0D30C9A9A1427EF10B13B182C + BF20B09EDA27177AE54AA4E4D6A5B772BD900BD5EE95D6BACCF355A0CBA7EF8D + B9C8FA5214FF688069230CDCC7633DB0C26D5164FBF112CF4307939BD44D455F + C36D6772142CF825DE8ECCD3B4D728B84477B3E59462E132A203D5F18DBD593A + 329B6343DED4B3EDDB428978AE4226C192767312E0180DC6CAADD016F50641FF + D13AF9F592FABDB046507A1D3BC260BA7B1076EFF947ED60650E61FC5B71F949 + 1C68DD5BFA3A153EF66A59266A238C567091D4F2F980F25905966B264828C050 + EEE0D398A715728D05BA0FDDC6FAB2541160E32046477DBDC37D7BBDF1EEFD40 + A741E4593E6CCD69BB5C32D71B6E465CCFE32F75FDD5C9A0CF244F1C652D26CC + 2EAF322E20D42F9FE0CDDD55C80D6309CF1DF3F3095481F9256770C37D2DD762 + 56BBC038836B01422C75DEBEEB20538AFB782D5FDE478F9116A03BCE2BA8D3B6 + 200D9046D9FE11514E565A56B44CD22A311C992A0FE87D9FE14935A0126E23F9 + DBB986F3D1A0912AD491CE14EBA85016C78E0169924490AA481A44161821CE62 + 52956CAA3B06E23A8127A7F33A0BB4A1FC294D8C1B4D9D7AD585C2F9AE3D6DDA + 9EEADB587205D761BB01FFE4A584880FD8DC6D782E268C81CB4DB173FD7FAAE8 + AF838ABA020D752594B8E5AD68C401FBDE1F3E2967ECEB61CF585B687C9993FD + 4976570DB72F9F9644A6463199DDCCEB29B81B4F470CD042514DF0AA4855057A + B36673162133454DDA620F513F8F194A3F232E15CFF5785EC881325236CE432D + 6448EB99CD0CBCCE4C8086776731B69E43ED5CB7520DEAD7664E28D953BE3CDC + 022C07BC63302F348CC10A1BBB536314F4A2CA310909906119BCF3E26E51397D + 5AC63FAF1F4F144AEC634C8BD5C89A32A4D9005C24067AEE062F1D2303DA5A1B + 071B0A85FFD9CF6FBE6088F96B8A6623E34E0D1F3994DF42E5B346309A78A540 + D971B0BCE621F7B6711AAB393F9D00204677BA6B83273D1F40EA1365EBE8034C + 78EFA24B99ED8F54CA08F6B2A258E23F6CD9C3325ACDA05FC5ADA366658D2AF9 + AEB925A6461F043069FE8A909CFBB209E7E8265279A37EECD91267DB9F87EAE2 + 63BFA36F411FEAAF923B42B476EED4F9B62159A55599432E8AF60CC016B7EA7E + F938787140A35A09C809331D6249EABA2D0E2A49775ADBFA779AEB43CAD7F665 + 54553BE02F1D2B6362580C42164FDD6A18DBB65748EEFDB00DCE7A438325BE80 + 00D8D1FC02EB0AE23244CC14A0587D2F64A4BB9B40BB9EF46D0B12430C1CE479 + F25AA1B3CFDC85B71E323E4CFA0EE387DFA10A4EBDF0423D19C27B46117C06D9 + 2784064F07765C5D0978F2CA7EDB11FD931163A5F8C0FE94AA64959702AA0517 + BB696A814AB821033054FD326AB23CEE5553A4DAF23B32066E9B66E68F418AA2 + B3C52CF859C2017E9FA60F77B4940B4B0D02E1DC178CC0A1852C8FB208AB762D + 62160065165ED1BA42E1B9381BCD412A76C2F55F236E5CA1A404541E7AC148D8 + D3380596F8CFF500431E5E705D668D960DF65C047C1D90D4B14A70CB06288ADF + 9E766CDD62075201C772C5A9CE451A733C7640FCEA858E2F3865325BD94457F2 + E273EE8FD005EB0B112CE425F0008C4C08B1871153AF9806590FD8B26DF4D9CD + A550292B6071D0073B7834F1BEC73B2FC1C2786259E7E9449B33DFC7FF367149 + E4349C0A1813389E4A57B9CE7D1D29BEBEA3521B558171A771D9F92685BD48E1 + A944D26168B306A962B57E629AC432FD25E02EC36190C5430619A4EC87491237 + 546BFA720EC1C7EAD928BCE64EE442165E14826F674E7FA9439AE0355274A9B8 + F0FF4F7FF9FD6C8F0DA4D8107A9B8BE54A85127E3B485BD247204D52476CCA89 + 59C830EB6F2A7B723E90F8FFEB96228513624C79B51E6B830852C7F3F4C74A37 + 0E6FDE1DC56F9AA91497E3F2FBF87E47CC434C53A2230F85F94C07C6D0A801BE + 7524D0E5DD5EFA894041D298C03E528466246D04384ED871D98ABD5CE004C44A + 473D758F2C03D2355577AC7015996A96F2B6E5C680FDC97225E9B7C28379F66D + 7ECBDB1CD91769B46956CD2AEEDE5F489915196948459001B4F30351C4D17ADB + 986974EBA05650DF3F61D2ECA23FDF0455227F4C379AA0488D7AD9CBE6B753F2 + BC0E9F69D1A6573A947B4E107CAE9E8F993F0DB44B70F3BB4FD8F6116BF96D55 + 7E18E4B56FF041FC1876DEFFBBAF06A62CCB5C2A4478F37D1BA4B19E104392A6 + 9AF7F492FAA255146977966BFED8A450FA2C35E880D3C44E5FE017D974F6EF62 + 08F3B75478472E89BAD5B631BDBF6D424AC54331F9735BE3AC52A80B7BCBD8EB + 97ECA5FDE0ACA40AD9DE1C4CFE94ECB392152B6E0EBFD3E2692ADA5F77C3E37F + BB486B971B7B379AE1BE0CCFF9D67AE4AB017F31BFCC3C723CFD9EFE5242818F + ABA27C95AB32BE81D74410FD95FCA5141B91FEB6C1425C8ACC7F343A3A98C802 + EFD01E88D20CA14945C05021FDE26FA01DED3C9EB977A8DF3F5D4245B52F3F5D + EBD8D55FCCE7298138D41447F203B003B52FAAB973D69C31DB9C28F4C5A19F62 + EA279FAF0D541938A925A8682BCB20E849BDECCD298E8F9685FC45C0A9E6ACAD + 801A4000A3917B6F78A2014B6CCC8FA9F6E63DDD37DA696470DF865522370E1C + 05FA9F11E142B58CD8BA29E6F10AC42D5627ACAAA4538B96C8D4BA56FE0DDA21 + 8447F1C98E664B66507DEEA71B79A489691F893A1BF8B02C084C3ABE047D8B48 + E59BE45EC48030D2F48FEC378580F0DEF1F7740535FADCCA406C644B851007A4 + 36A78B5D8F4BDB1327D0D8FF3237D7E361C609EA5744EC1DD712D2A7FDBC93F8 + 2047B85449739B18118953B1C88DB5F4FF14DAC2942B0A976DC5C1A1838090C1 + 51CFB37843036AC7B261267D5880DEF95865D2964DFBE74ABCC0524EE4EF97E3 + 2D2FBFE0EC74168EDCA0A792E0B8D4A03A21027933D826B89BEA2B70094921AE + 522E8F7262C0AE3751E66EA40EDD32D15800B013B62A2A5088189E2443F8C240 + 220D72913AFF9E22946C020C9224AA64839A5F9765FBEAF262B140CCE05390A1 + 60C94600484AB57D44B08986503E5F16A4F9A21C52DDBB44A2B6B5132779BC64 + 62F17FFD1DA37D4A42F4B02D9E630EC2422B0B3DFCC89F8070FA58128ACCA6F9 + 82A706128A48520DBFF8699E2EE686894F64321C060B598DD8D279F981B0931E + 3B4D9AE5469D1F44159C03BA2C1E853F7FBA85072E9CC82C07C1778E6C8EB3BF + 36CA6F6043E8DF4A5FC62A94B980C51A9DCAD00574AEC7794BC5A2C1CEE4B42E + 416E512F772DD5ACA373D119515102E1670E0DC18966577F780B7C1E588D2445 + E151ACB893A407A9FEDCFE07EA15D566895E6702D07C7FED5C786C1D7A6E5076 + 6634D5BF97D2A1446B098485788F048321728D11CF66B6557E42636BCD3DE6C4 + 50BBFBA7C263454EEE77663446846CC7E00D2EA406E3FDA831141EB18FA6FE94 + B6A1E923D1EE7D9873A74B082C631F33EBB9693C7E8CA8E67962453BC5ADEA94 + 31AD61033F119F3EB2C5B726FD6B482E6D2073833EDE05B13451392107C42F7E + F2431DBD504DA7FA66AE11B419C64FD2CCF8E53DA2D4152751D7D41EB44FA5F9 + A8D314824D250928A8AC27306BC57DD2225A773D953EF279D74338FB27E23778 + EF3E242DDECDA85E0951366602202D7B18DF40130A8971F57A8CDD142F7B92AC + 5E3D9A27DF31B3145169DDBF2CA67C748098CE97DE653453C4955543D226F61E + 133F3D8EBBCD647654179543166614181D8EAFE516A11C0DEA768A1AB0A70D55 + 21CF78F7A4E2E2DA39B58E84129292F077FEFCF134E73D2378D9277219B5BCAB + 8C8D830B81AF5722D85B587AA935A251A350D62FA3DAC07A5E9FA1E781E03DB9 + 23AB0A44BD2CCE331032478064F01451623D8D6A8BF23C4DFC31E087038E0ABD + BBF973CBC5AE2E4D283144A821CB25C3EF84C33920172CF9AC5391AC4EFD9358 + E6699A6A1F0ECF1783C3E352D1AF537C2BFC3779957B7526B2F1A952C6565915 + 12A3EAF7F6FF333AE4459C55869420D7185AD41C1F24CBB056D87B1C315EF0AD + 9CD979A9D6E005D9963FE3F00AECE37D7D6DB39A1705F8E2164B103998610A61 + AAA137441F01F848BCE6EF4C18797FE85C36012616C9265158621D5F + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMSY8 + %!PS-AdobeFont-1.1: CMSY8 1.0 + %%CreationDate: 1991 Aug 15 07:22:10 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMSY8) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.035 def + /isFixedPitch false def + end readonly def + /FontName /CMSY8 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 15 /bullet put + readonly def + /FontBBox{-30 -955 1185 779}readonly def + /UniqueID 5000818 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 + 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 + A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 + E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A + 221A37D9A807DD01161779DDE7D5FC1B2109839E5B52DFBB2A7C1B5D8E7E8AA0 + 5B10EA43D6A8ED61AF5B23D49920D8F79DAB6A59062134D84AC0100187A6CD1F + 80F5DDD9D222ACB1C23326A7656A635C4A241CCD32CBFDF8363206B8AA36E107 + 1477F5496111E055C7491002AFF272E46ECC46422F0380D093284870022523FB + DA1716CC4F2E2CCAD5F173FCBE6EDDB874AD255CD5E5C0F86214393FCB5F5C20 + 9C3C2BB5886E36FC3CCC21483C3AC193485A46E9D22BD7201894E4D45ADD9BF1 + CC5CF6A5010B5654AC0BE0DA903DB563B13840BA3015F72E51E3BC80156388BA + F83C7D393392BCBC227771CDCB976E93302531886DDA73EBC9178917EFD0C20B + 133F1E59A96CCE77DD2377C743046EEF2A8D0CD09C6191F4752EDC959FBF4442 + D681C98FCC499BD1EC5B489A1EE151FDEC267D9919558FB025850740FC02D670 + E76A2765AC8E4D15749D085C2C088F2A1145FD41150B3201F8FDE3977923FC92 + E422DD1D4A2D8CF2D9B7EA537CC5D472842C36987968434EF5BE5C820EADA040 + 82CCD992468CB8DDD05AACF9DBF476F35E96F651DF9A01291E46E85F0E18F0CF + 89461FE8C45C00F78A7541F460E704E05351AD72C24613C5C5B8D08AAE153F79 + 6E8C44B4485EF8BBF1C258DB26 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMTT9 + %!PS-AdobeFont-1.1: CMTT9 1.0 + %%CreationDate: 1991 Aug 20 16:46:24 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTT9) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch true def + end readonly def + /FontName /CMTT9 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 38 /ampersand put + dup 40 /parenleft put + dup 41 /parenright put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 58 /colon put + dup 65 /A put + dup 66 /B put + dup 68 /D put + dup 76 /L put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 82 /R put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 121 /y put + readonly def + /FontBBox{-6 -233 542 698}readonly def + /UniqueID 5000831 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E + 2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279 + 650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35 + F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A + D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E + F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1 + 4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A + 438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD + BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B + A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641 + AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74 + D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB + CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A + 082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980 + 9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0 + 4BA1EBFAFDBEC531EA1210365091671CE3C86A6D4BC591C37DCC02570042575A + 9D24252D6E01A8603753934D7EA5CAC1BE4E5AD2BA047DE8F3983B23A8A1511F + B08D373B69E5076CE4300137B8805EBCC0AAB89BBB312A77835795E3C069322D + 42C893A30AD739E2BDD299679B158F7493764F2321E3965141B5ED1C6F4765ED + F46D391A646B30C90002B1C461AEE79E5F094CACCA656CEA3DB921CC5205F328 + A2C69F817061D6C60B121EEE844CA5008F23DF0B684AF2D86CDAD0B9B89B284C + 7F05E8724D6269D42611FFFB58B771A45764CAEAEC56A33E9583B03713D5ACC6 + 3BD9CAD21B28A2448088F4FF4BD5F09A28CE82AC76665389BD6BD5463132CED7 + B995ED8FA26D5E068461BC4EEF410D3D8B6CC408D288622094DC1F61F9E344BC + 86C07256FDF0430CD108656E822F9F3FA57465076CB009E8C810186A0B84FDED + 0D1B72215546B5578DB1C7CA5C38F679F6C8EF5E854C729795736FCF1865BA12 + 669FDD80E02BB6BD7491871823F365251E6ABB2AD7B99B8D233EB96856A73A0A + 866DF0781EF1F2B59D02BD229F5D97B766F8DF8358E2381BABF2F0CBB634FAC7 + 059A81189863C041369EAA066DD05499DC1DCA01FC6BFF4CB51D492F05D06C4D + 13832C07FFA9E03B6BD2B46F75CC321E74BF8864AD1A0F342B998D6FB7EA9A78 + EECBD311A374DA23B7EA2827811C09E5C79B875D30DA77F144BCFC936E758117 + D39475B69045CC77E67B9761FFACAA0215856B1E35434023D7F87752E0A213F1 + 0F90079D797F92DC4A7482A9AE6C1AEA960F96F0B331711EE34DC7FD54A9566E + 90B0A75057CDF87907726D78EE0EB2ED79F47566B1563061967480153BD8851D + A29CE7687741A6F92FF0947809EEF7E672D74FBF1AD547A213E70F4E91B1C8F3 + 2D99468E91F6CA4B367ADD5C27559D3B82D7BEE8A698F5A5F2EE78A0FD822BE0 + 0415EAEA328C5940102187AE813407411C8B12485EE125EF0844C8D35879734D + 68E1CECD38DA4BFE8EC55657A2F73EC33136CB1AB462F6A29BEF02A911BA036F + B3B09BF7CEC4842BD238D58F50944DC8576BCA6A07BF909B1180F1050C447DDF + 3CB46A6D4BFAA804EA5CA7A4CEF7112B20F3B3EBA6E50BABFC7F119A57F9CF8B + 4FD5EFCFBA74945F5FE90817BE0AA30091FF0C9FF4A26310B3D189398A0280D1 + 4698F2274E2A6BEB15778ECAF5F36A6A5C9F9FBC134DD73ECBB04C53D046D0C8 + CF2DE4D6EC51AECF424154D1D40906118DF3B630377D659458B0878D6F3EFBD9 + 4C6CCCC97552BCD6EA0CD5916F4E27866ED2803BCF3884FF327B9AF9BF491F41 + 25931E4E548C2949BFA3D655084472A42BCB5EAC7502DC1B6F7EDB279729E460 + 039317BC5960036A0711FD504679436F7C7CE36E5373C6752668B8040C3F5F99 + 6769D6462569822EE056E477E25E9C74021E085831E1A476EA0B879C08FECBC0 + 344131FAF26746FBF1F64259E767095684BA7C66652993339BE67713DC0993E7 + 6822DA050FE09A63D85E5A3FA559103A1148E4CEA84A2E14FDD09175D430DB5A + 0858A0CCC7884C2285802B619B5E7AB09BCF75F67A2F08E05FBBF8F479E2DF44 + AA50D84618C743D761DC36E82434D025FB1E873755589C2D1065485AC407D53B + E0DD64A53748FECD830C04C58D5091A9AE6B58739C225E6503900291A419829B + 1F8401CD76C36880EC0CE12DEC7400E080B9B477DF404A77C6466FAB69770F13 + 60E7F0B09D8F142E695F8F9807C1F789F1E3B9918319892CF4D6C98D738E522D + CD11A149FD5BD7E240C6805E97D8521283139D1637AA0526460D476E3C86FD61 + 14E8892DB97E6C25628F0252DEB70B3C78AC57489859D3D91AD24FEF65CEB630 + BEB5C8B829A31330BE252DC3D09BD98215CF026D817DB644D97589B8B95FE70F + 682425D6F9AED2FF782E80AABF08A078A0C6F78F4BF8362ACDDD31BDA4D6081F + 1C40C190F95AADBCE34EEC195CB7DD705A5A82B3C3273A409BE7F31534B6747E + D7D6F892AD190C70322D6775E4D5DA3B7455A6F6901D3097E18CC973CB962393 + F67B1D9B4FDD45B6844960A332E4295AF84F21969E35C48A501FD1CB5D30AACC + 701FB1A25DA14746ACD386F68CE198F31FD202968815F495C7A03DBE8785A277 + FFAA861210AC99D599E1148752451A820F6CDA837B6353950B02369B0FBC1DB1 + 95CE996C7A139EC8B414C21324EE73D6DCFB8BB8EC542EE9AC9EB165D4D900D1 + 356169577FB62EF39EC86BEB496A388C9661D2403D643B23E193B7D013797EBC + ADD9CD272B05C85D28FC1D98568F7CFF546A82B5CF25DD1BE134E59D30DE464F + 0A51AB16734A9DE3969CBF021EB9A64D828005E31F1F2D72BE70E407EC320AC7 + 16105A324F0533BB771B98B9B9D15A97A7A3852BE9E9277B38D333D7AD3D34E2 + B1C017B3EA51A2C9C4A8F3DB5B6E125B00C385EEFB8E9B3B2D2EA6FB907F5EE9 + B3BC773832E7D5EDA4622DF0BD6D77AAD5778CAC3910BFFC0D1B6576F620B490 + 15F9BBA659999E1B5C18FAD443DE590DFEFD0C9BDFB32CE7232F416C4FF92982 + 2706743B0820E3F1DE5F3C10FBF5F5D33A456BF27ED0B96B85A621CB3B30FCC9 + 0D0DF523C58530E41B7DE6E2C9D0A7C642EC5A47AB4F53B68AD6EB15D67768F5 + 5B6F1FDA5A2AA30A32C3492A00203E239F5E731FFA5EDE304E3A043144541250 + 598E4E32AE2B8EDDFA01789D580A550214324C522FC314A862BF066C97112336 + 4E10AA28AB10F9CCBF1E6B25123EE78A1137755A5AC862F104352248DB39B872 + 9EFCDDCD4CA7EB7D23F1EBFE6AF3693E5D70DD9601B305A1F32E84BA0BC1B254 + 296272DA0095D6C4B363046129C329FD74D4E871F6562DFC6B5EFCB38E2B0519 + 0435FF943832ED315239EB460D88C78636DBC08C01D992059EC78E73DDDC731A + B3CCC6A914CCD2585AB4EAC97D77DACF613BCFD9F40E47B32B2916BCF845E911 + D4121D0824FBABAB474A2920AE1B11DAB32C5C1A2223860DD162895AC4DC67F2 + 28D217FF22913338F48C8F49D9693701B50F4E7643141FD3A7959DE73A153174 + D83E743BAFBFA23258589CE21D9F66B43BC860F202EBBE3FBE9D216FB42A55DA + 222D2E35A01504EEB987CD51401528334EB9460E0DFB09C9C0A63DA3B17D966A + E2D3563E685844A23C954EA8A1803EAE96F464129F51700F0F329F95F8091FC8 + 316EBD7A3DAF94AC0672DACC4C75187F0268F82E9C432E834643F6C44A2607C7 + 504A7CF13108A6B58EC1029A6B37142887339486127F745865F1B23879499C6F + F2013F0B2A0CA444E321F55796D1C19EEAAC364EC0130B50E03D78E50E8A8C35 + F8791317C5BD73D456BEA4A2733679FA07E8CBF90CA05FCC5AA1336576BFAFBB + 6F8F148EAAEB9656FA3D729164813F78C15FA5682421DBC1093FE35AAF6372D4 + 5E1D82D3B89B1A4502EA42FDD284825EB9D311B31CD86C15CA0B0BE239CFEECE + 6F96F8C7886F26C867A3196FBACC0211773AEC4F45448AA2DCF58C824491C6C2 + A10128A0F089D05455C6869123C09A5542EF543FE2A4ECDAE28AF282D429BA66 + C31165635E75647C2F0B81F6551744C63268F5AD078B21780C62761318283A2C + 596EF8BEE550DB81EF2FB1DAF99179212146540979E345267B772F952D9827DA + 3E6B0D968382236659D5DB509CA8047C2A17892D57036B56EC6E1E2EBF12D244 + 39F32B92A3F9C92145C9B3DA7CEFDE71D511296EEEB575363E5351F46ECD49D6 + 31EB388D654C451394D3C021F189C97F903918E7DF273A7DB200B4F6AE4CBEFA + 9EBE029B6C68F0CB134080210190BAD6DF7FA19D116C0905DAE89AD3C5899F71 + 90302D6DA74B989428E3692CDB14B4D2878DF4D78836C10FA38611164305B02F + D29E435143F300C035DE5B2E350FE5AB40E1F097DE3F3948FF99694D5253BD78 + 75CAF6FCB5ADC1BC4BF3D1DE911259A0227D651A7C58EB2667BA4CA22EA43A0B + 90A8CE43A3042B0543E4D6385E58C122D538113CE10A684214B259B9184D842B + 44ABFA6B4B0C4E4F8888AC8296175A11CB51A638380C6205B32CB384D5187BA8 + 2C2C78DD5A9DE02638D4D497EE400C6BF624A7F963D4B9578526619B75CEF702 + 573D97C18F0ABCCC7C3E9C8689E6C425D5DF2EF9B57A5D76F60D4B517A437626 + B4AEDADBCD46993C0E79958DC3C6B7BB3F884BDB3E2EB8A6540B278FF209A5C6 + 2F19EEBAEF11958E865C96069D1EAA9EB25DD851A770AB4061CD5E5D7C5F12C0 + 7A9298605A2CEB8FCDA4D02342EBB5F4D5AAB8A36DCCF2EE7B5B439063451DEC + 4DBF38825B9B382DD71F96181D6210B4E0649BCDFB5768BEA18FB92022039603 + EE5D2F4EA3D06F65BF59E93EA07C887FFDCD3FF4389932DB2E79B2B02F52901C + 4549040DF84CBB4D944DC8C81568FF64B6EBD9ACEEA81B72FD66D741B32E7C5A + FABE41465667B76C723C59141675DB4DE514554C370E040E06B8080AAFC6CF0C + 778A4E4F461F88CC31057EF6D3A353D2AC008D33E7C8408F1F337FECD0D02BEA + C74BEDBDA224E665CA1B8E45552A470794DA659D22CD9AE39B2A2AE1CA17FBFE + AB5839F97872145CF36A6049DB2F62144AAB0247934D644B984B516CB145DF0B + 4CADC24E229AA2AA50BA843F4ED99A965124AFA56CB35E123F6794A4F8DE6907 + E4716E8BC0292FD18E4720D8E709AB28B37BA01C68976D00E7AAF293CD17E95D + B392FD972280F323ED620FEBDFA799F5AB94C297FB72493021111219CA5C5581 + 4588AE8F8E5CC374BF883DC90FE65751BFDD4B32E5D77E71E6B5FFF3D9DCF37D + AB51C816ECCEE15752F97D332DB429505E6ABA8E188A36A5769270A09593D480 + 9D83C4259E3F2F7E502DD9B62D6DDA4A4EF5BB4DE0C5E11C5BFA0B725FB29ED3 + BA4FAFFAE53EDA096A6CF3F583214CB7E9DDE0E72E41AECA9195BFB67AEED6BA + 0EEF9B3A824BEF27630B65CE78BE26B973AAE0CAC6394C7CB0F60FE6F2B0C454 + B8A6B1F0CAFDCF7A93BC2A1BDBB2684E8F6BDC7D7E3D4EAE552C0400CA43F40F + B74005DA599B78CA21AA9CEFE0BE1BA28927139B250BA3759C38E37F3DE6CC49 + 990BA50FE4581F7A0CB137C1F4B7ADC45CF3B13878F632B4079FF5E40EDB0EE1 + 46B1ED03B9CB509F3FB4BCEAC303B2EC40CB66D7AAD961736C449871822A2BF5 + DEC875325A86200821ADCF16EBABC19D1DB8B7E625E046127513B4F445E065CE + 782AAA741D67ABD094F605411E4D4312C987E1F52FFA7901E5716B547E99AEAE + 0B4CEE1573596C0C72235991AB2D33D6B9253DF982F7E27F6F82E772F4E5F76D + 6A8ADC65C236520806B592343E1F69BB32E1ED23BF709401B4983820E25B5839 + BD9622B67FE25E9C740F6228BD57FF42DD6C47593567EE3AB7EBA8EFEBA0DC3C + 357FE81E6A97E5B29BE6AE0DBE2EBB1D057640AC7CFEEC704C6A8B4E8173AE5B + 27C77A149EA2DFF107EACA17F44527ADEF2BCD5E9456E7BC60833CD78640E6C1 + C5EE5EE18DE8E92DE893644E11FD99266F8536A876CD88C9F992DC290DF07F9E + C829944CA7C6889AA6D905C701850CE612BA0372DF957027E661AF5067F57915 + 64C806045882C2E460E3CC893FF1927C5898B3FC0826D7B70A0BE4615462F5B0 + 9ADF396C81EAD1ABE3E2959941CF92D67B359C0275D3F48F495926B3BBF0D71A + E0FDEE7A563D8F481774CD9FA9437CAE7ED439A85A0FB9E7D364A098B0DEFFFC + 1A56DF2E53750FBECB9E6DE1E62898D5E432839591AF116150D8A7B436A82956 + A8103D3B4D65ED15833B486955B08EA35035EEDB7EEAB85B9C447B00B75720AF + 646C57ABE37F81F27B171C43514BC67C81B9189B5AEFC92966E2480F4743B6BE + 10F9031EE2A49BFE08B5C36AA4610A980DCC6893E442A797541978C3BCC63789 + B89A53B760024203647252A556C89FF87003FFD96646241B18638F8EF819D59C + 29C1F75FDC5A439B70EA237DB168EC2F7BDEFAB1E557CE1FBB6B18A01698D9E1 + 4F7A966580E87FA0263B0B789BC1B3F7D865EB6AA7B9F2B45C968CF221714B45 + 3C6E6DDD981F2FFF3FD15ED38DB0B700A815CC89BFB33B203723129ED6FFC9E3 + F16DF5A243601A8893CA78B68B8CA7210D022EFFC03E41FEDDDE1919B0B95D6C + C970BF1854BA3F574BC9C995484B1E91C1BF4C77953B36CC0FD6C25DF88645F4 + 3C76C8586448F79E2B486607CAF83CE5FAA36588E5ABC2C13935F55E3DBBC8AE + F643CACF5AF89AE589BCFF586750DC3C552DAA902AD163F92133B512020BF7B2 + 36121CAF86D4741E067B399314963686FD790F5EB6C7CA268578AF8941E1E546 + C475754E4EBC7C8AD0B3290A28C691A1B7625F9978963422460BC84A9FA0F62B + C8E3FEE764E2C8F1213C1D22C53F53DE39F891568A77A51E986CDD14EF997E20 + AE347B4E4522F1B06E6D25C67B4F137D9A83428BDD8F3FF14B36B19EEE16AE3D + 568E8ABC882C8F57021E7B5118835297E6A25CA5B2B56F92AE32F98FEECBA71F + FFFA5E4B3B930AC30580F1872B65801868B8EF8B8FE98071B38C83E2B8E9506D + C7A8A1D71E3CD691CFC8D8954908385AFB94690249B1F30F01A54DF9D033DE34 + 808D594FDDCB3D805A3D3B40A9CBED2CDBBD3D59A7B2D06C56F5DE08E09C43E6 + 1964C8521F9B9081EDA79A4B36D11646841EDCFC1F19EF3C4867AF977545094A + C71EA7D2418F516BBDCD014F5DC647DA3277BE775B1F949C9BA88EE67E6D76ED + 76D89B366EF83F38780EE68A1A64FD106B699BA07C1C2CBF4874A4AEAAB722BE + B95DF08B9EF9457665042A5942322310C715253C519F988B84EDEB65985B87DD + ED263CF5B82D9B1C1A3F0F4E1DF37B27A209BE6F3169EC31D34C010B2C59E1C1 + DE0B024BDAEC6D4E43FCCEA1A6EBA9058A0CDC20B02EB73F267BCFF3CA584E49 + 2639E33302CD08C7314350EECAC64D1645B70C637EED913684F24F3678366EEB + 410B09293740E4DAAB06B3A605BBCE4A7498AA0E129EC9869AEB87DD65B58969 + 46E5BCE8C2F0EE189F8F68D3FF4E8BFA6762DD9F42FF07C4DE2011654EC80772 + 47E4DD0AD5210959CEC3F474C2D6C7FBFA86077208E28470FA956C819F2E62D2 + E7AE908CF71A71F7C179F76055CE472503A02F14FDAFF521996773A4F60D83C7 + 249B33784F2775845599768A9E0151175696EC7187A3D4D1603BF0FB8CF45B27 + 570157E8BE66F2E95E784F28EEEC82E035DA1E1B4933436266806371D59F6CE9 + E4ADF08448DA760D1D1C76236EFC358BB7B3F7D35CC55ECAC832D0F6126C512C + 1C3E77C0C413B38DD15C06AFD726F8FCA4D7BB7B7C72616CE32551B2534902C4 + ACFB39E492E459736DA99C19B3B62F1A1C94714888DB8444299B81FDCACA448F + 55D87EB3212C990672E7B10F6EB00089646050858D387AD6D249B58D8D1F38A9 + 71A4AC58D0BDDE0A534B766E5641DD39D05DBC4954811C101ED4F68A3A3C85C5 + 0305288945D35F2B59262182B2F61D53DF5A0B2F13D7A8562694671D403694E6 + 3C0B0DA8FFFA0D3076ADFF5189B89379BCA4CF0C5F77A05A0BD35395BA03382D + D05F3A7A89FA261BC60D53D9B69EC579F06B28FE4A0A7FF5ED1AB10A57307D90 + 3BBB72DED07DA020AC9DC5FAFE9188706E0E4C3C06091729A9C94203B666E742 + B58CBECA98589F14FEDF40FE82F6D681416A1CA24535A18EBFFF2368DBE45BFB + 1D1EF5A7C91C801E8E0DF49A95DCB32A736C2509BD4457C0989AB6AA697841C4 + FB958A696D721BB543776AA214032299C79DAD2E9E4BDDE848AFAAFD3E1C0426 + 6036F0293CB520FFCBB5C5CC78C6E35B81EED74498C49F894A2E65F30750A2B1 + D6445C89551FDBAA240637C5AA852D04F06A152A58D8BD2493E8C2F08732512F + 55A557686880C6E726CEBED49CD522898938E05966A49F3F8923CCF0EFA43625 + C08561E6016FE15D333DDEF739B4852FA7FC379AA3FDBAD244D8A13B89EDDC04 + 62A1AA11CB82B46BC6A8473DEC97990A82E7180AF06C42C73C876E465785B218 + 6EAEBC2A991D186FB10C4947D7F58D0F5235515798CFCCB84DDC8309043D5FB8 + 1E8F7C419281FCD40E50658C7D6098DF30F36AB8E80B4DD40146108234A2E572 + E4057742DA1A05D726275481097EF0909AD72E869FDB5DC51389933D386CCF30 + 5B6478F69C25FFCBAC0B301AD5394F935B90471F9B6E13DE0EE09787BAAF76A6 + D8A0E6E34246229E36F1BECBF96CE84D6ADBD6D25277B77C58B5A2C0D777B53D + AF4DE496FE65AC94FBC6CECC099909FDDB5BB52CAA6A432D5FC7940DB5B001A8 + ACBD4DC33C71702A1B250A092BF539CC2784D337638EEC35E49115F173ACC8AF + 9B359D7367F24462969131F14FFE717D899CA653274C8325CAA3D9572B97988C + 0EA6E9B15E15457F89A3660150D635D65F48CFEB0999C09A539B050B88EC85A5 + AC3554561C38C3C3 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMSY7 + %!PS-AdobeFont-1.1: CMSY7 1.0 + %%CreationDate: 1991 Aug 15 07:21:52 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMSY7) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.035 def + /isFixedPitch false def + end readonly def + /FontName /CMSY7 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 0 /minus put + dup 3 /asteriskmath put + dup 13 /circlecopyrt put + dup 50 /element put + dup 56 /universal put + dup 91 /union put + dup 102 /braceleft put + dup 103 /braceright put + readonly def + /FontBBox{-15 -951 1252 782}readonly def + /UniqueID 5000817 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 + 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 + A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 + E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A + 221A37D9A807DD01161779DDE7D251491EBF65A98C9FE2B1CF8D725A70281949 + 8F4AFFE638BBA6B12386C7F32BA350D62EA218D5B24EE612C2C20F43CD3BFD0D + F02B185B692D7B27BEC7290EEFDCF92F95DDEB507068DE0B0B0351E3ECB8E443 + E611BE0A41A1F8C89C3BC16B352C3443AB6F665EAC5E0CC4229DECFC58E15765 + 424C919C273E7FA240BE7B2E951AB789D127625BBCB7033E005050EB2E12B1C8 + E5F3AD1F44A71957AD2CC53D917BFD09235601155886EE36D0C3DD6E7AA2EF9C + C402C77FF1549E609A711FC3C211E64E8F263D60A57E9F2B47E3480B978AAF63 + 868AEA25DA3D5413467B76D2F02F8097D2841598387C588CB084A0351E1B0134 + ACDAF9FF07D2ADCD8915FB8792BD7F250469A256B05DED7089E2D994E72C1877 + 5619AC07A1EF0EC47C91002DFEF22111173232C13CBDC15B370BEF2F39E24CAA + 8BDE80F48411B56D37603BBA5A934F8F24EE7B7D2310D38F128E141775ED4CD8 + D4E13F205D5F5E173E6755D013884306F3AE2D2A85A3A1F2161FAD28954AB8E9 + 2B830051DA7BEBAE46C04D2FEDF469B94B3AAD91F66D22A983FCFDEDF23EE52C + FDD3450DA0A26EEA38087A0B4EBCD3BD49D9E3001E7054184D063F80A3E86115 + A80FDAB9B533FBBA55E33B9DDF7846045765A0B0F448620D4E14A86338BE1721 + A6A730BE29A3619F62E42CCFD42944240C866F8A085D8C6716E1C0D5DC45BD1A + 5D9DC1AB368C9B65E1C6133EC3393388EB9EC8A5815F6C41A4383FFE3722902D + 14A88711DFBD33B06682B8073F144C89E4E7B373A449BD30619BCA6F6D9A51BD + C106071733ECFFF35AE7C133F14EB7B1C68D4C5A59EC5C9A81360D37BC5A0874 + 6A28D8869691F0864CC0F0412086F127FEE1ACEDDD3C35583485E8CE4B507469 + 04D7B50DD78606B8AE205F8F279722ED8FACDC8BF9A0BFD5389CCDE305A813CF + 90C6F14A4BD3D6D1D349C0017A8AD85BE922BAC4EF113E7152BA61CDE506DD1C + AC27A1CF9D6039A5F3501E5F97B33976981B07F61504A469D79DF7C06D8F7FC4 + 6181A0361FC15248BA6D753F9B3882372FDA63BD4676A2B2E08C0FFD5E87CF7C + D2A5896C81F5A0306399CE5BC68B86B15E259348C34ADE7257DFEC32FE7DB08B + 2A92E6C69C96707EDCC370A3B533319B0AE93FB61C3B0CC18AB0F29D71EF2425 + 90699F2708259C4FDC31756FEA57A6604B6959FD0DAEC9E60F422168DC3040AF + EF2AE6C2301DD679B65051BA2545AFFA6E9928929F00D5C67637BDDBA7D2F408 + CE606F058ED9A8F92436155D0A2BD88B73E8B0FCD8B4AF5B381A5A7E149E0B39 + DDACACB557631088A6A5963C30421255C0FF0CB2321B5BE8E69CC0828765D562 + D223EE8438E95413E42E54E00FA55D1227462598763CC36698E4812E7C0079FA + 7BF184B1AEABCF00E1D8D38C201781A02BFC7DF8E962E2C1F80433C1F05EFAD5 + 8752B2F44BB42BDCCB814EB9F389C98C056D71309B1C3366634D87BA4B93231B + 5B8F7D508DEA5B1A34C108DB1AFF405A63701A3C6EC11415DC4E19D3A8E0F021 + 0F83B70E70601017B0D7CA16534712A2C8E276BB1F702090A64252F457A40282 + 3E42D3092031699FBFA44F5658EE2DA3B4D2E27E6D5AB04E7F42A7EF101CD2AF + D281E0AC27824A63E820DFCBD87CBEE1EF71E5EA2A2046EA42ACAB2644F88DDE + BFA25805516B353997F41D032E8BFDB558174037DE963ED2F416A3A59EFBAEC1 + 4D9EBE0B18C19268ECFEE6FF63CB84AA89F2F3FABC1121217B47FD11749DE5F1 + 9B33EABE557FE30536C3B0ECE4A16431F918C6F7D106C8C6779A68B6CAC491F4 + 7405376F3B5F932890BF9F748E2EAC3C0DECBE31F7D7276E35433B8DFC844BF8 + C5D0007421420E88A4EF6CEB8C2AED74EFE145F4A3F92CF24C06693DCBC0E1D5 + 2B9D42A696BF9ECE83AD2A0D25CED369B983362CAB58A2248FBC18B4246086DF + BDDD0E6ABA0BCD503BEEF3CABEA2A98FF5877C5C6D36F60B7F90309AFF7E20CA + 267879C669FFF4D6A44C96C76C4C464C6959C7D79E5F3E0CDD5B4098E8EDB153 + C11AE571294D9C62351F284F07EB29A17FA78415F79ABB6B9EFF7FBBB04B0BF4 + D5CBA9C69C73C72C405BE24B5760FC9144D361581C54852E8A76ABE80883B0CF + 744018004BDF42D76BD6D49257A596C1639F0DCB9093E1C13F2521DB4CE65D2F + 61D5DA098ACBEEC94306EDAAE845686BC970D701FF2391 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMTT10 + %!PS-AdobeFont-1.1: CMTT10 1.00B + %%CreationDate: 1992 Apr 26 10:42:42 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.00B) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTT10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch true def + end readonly def + /FontName /CMTT10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 44 /comma put + dup 46 /period put + dup 64 /at put + dup 97 /a put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 105 /i put + dup 108 /l put + dup 110 /n put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + readonly def + /FontBBox{-4 -235 731 800}readonly def + /UniqueID 5000832 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 + 38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF + D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 + EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 + A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 + F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 + 4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA + 6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E + A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B + E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F + 1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 + 452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF + 8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 + 5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA + DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 + BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 + 741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 + E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 + E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 + D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE + C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DC + FF798F2ABFC4F3539392985C4CB324B0007229586D1E0321559F67C057FD7902 + 194490A4C133DA790FF3BF23A13C2B1B69EEB75950F9106F2BA1E3CA65C90FF5 + 931DADF03DA48AFB8561FC2E710087251BFC42B80B297A3DB0DA138A7622A931 + DA293B0C740987ACE9F2A8EC2DB98F85783C01623FD3612C7E4A84FD93446770 + C3DD7431F955A5F3734F6931BD790F0A45B8D17CB74BDAA4BFF6DAB5380CBF61 + 72F37CB67A909E2842E0AC5D9D07D01A4BABBDE2AC70FE5753460D7E1A708B7D + 0EFB2B5FF55F9E4571C466AF1F91E545585845B09D855C3A01F713C1BF081EB2 + 7E2A0E598708737D475BEDAF60BC100FD0A0628C6001A203348CF6A3AFEE6DEA + A2EB57E35599FAD0B8A52BE1B77757E92EA2F51BF07A285E26A452F417D2751B + 3D53F9D671EEB920B5F0325D4D4C2634C07508492279701623E5224F9DA08DA5 + E0A6923FF60DE967B391DD9F3CC8B68DD5F343C14C3C7AA45C67039F2911FA29 + BDC5810467A0E012C4F4B1611022B6232C53452C30EFE319B58E8220749D58D4 + 23E5B4D382439AF172F4D03ED7B859085AB38822032F5EDA5A08A8F7E9998208 + 4F1533B65ACE0E766EED2188CF2F912571426AF298074E92E5D9DCF5412AF0AA + 1937E10EDF9E6BF312CDF423D6EDA89FE51494A639DD781F1C8B62B732C93AD6 + D5252314087220EBF583461AD5881D6FD4BA9CC06FFCB9DC873A264885762549 + 30567A877DB3D29CA786377A8D2E73024FAA97BBDB1F4DB0D639EB8BCB2E757C + 220805051F5347489BF122B77C4854AEEC8B222A981BF48C9EAF3E4C702668CC + 99F204B32F2286671B7522B1CC65B19EEC44807E06E9531E02F37840F31A480F + 7680008F4836AB1E3E5D5C3D0249EDDC71B64B7877964CFC32F10B10E0F50A95 + 798A72B7CBBAC1BBD6268E9507242021F6DF8C3DEEC2908415038D115ECF6833 + 09FF7FD12D58E87DD3148FDBDC7DA1B3879981CD6A3EDE784159ED8B8C26B211 + B4DF1884B35E3CED68A9A5E41B1F8DEA106FA840B015F3EEE106CAA0950AB130 + 7F16B81FD14D6003FFD693AA83FF75B3A13C29C4AD904DDD9171626791C50270 + F4081B6629BB3A12846EE8B74A6FFC6E8ACDF448D84E3DD62604199C55468EDE + DB540BB1457A9125B793FECB80F53E341F4886B9C1A52A41DBAD22C6CE57ABD7 + 86DECE30F76FE0CAFC5272AE1D32376EDEE4C8178743F26DF73EB59CAEFAB6D9 + 9DFE52CDE9C047225821D52176C09D53FADEE327792392E15FB30B25E299EB0F + 63E56DC41E29E31B3FD8B1017EC012D52F7BD2FA2BB43CE3701895AA4039AE3B + DFB00D38D74EF3A68B561A7E11C390C0CA04B71B61227A3E720A3D3922DDA814 + 6132AEC8124DA37DFF9937CA256AEA278D9508229740535E23D110DA059AE54F + 1A6847FD673B837BD9A38B67E4D1D5788855DB1D73BE08249EBA1F66DD2375E8 + 9CB1E84B4A5D7AE0EC7176FD57FE0C3C495B34EAE9520D5082F48D47AB6656C8 + BAB971AE7E122BD0D74AC18858FB1E7FE1211DAA817D19E5E41CA687102705E0 + 3CC4759639568448EE163639E12AE1BC917FC7D4E0A942302BFE9213F95B8855 + DF21A55C4CA8D22BDAADA5011FA022A1514A492B3E5DCE21C419A4792CFA771F + A5D2A240EBB7D5AA90C822C330BA46B55959583B7E53035F98244AE07A12CF84 + 54E9F261AF5C4E399EF9975F85FFC726355FBCFA992875C6D5876ED2736BCD08 + D45C0729C5D74A5157CCF86763DEDAACB327B8BCC7365D7C2EB6F186FA095936 + 4B696384C90AE1316121CB17132442EB6A95A163CFB8CB4CBD8CB7CF62539500 + 6A88B7F9BF2F61D0F5DEB6E8ECA84A219954AAB85E5A1E6552404F3C0B1317E5 + FFA6A3FEE0D4A8A3B914AA5FB0DF28CA0CF265BE1351BC6217B5296759E12C1D + 70C3E99A36DA3DDAA95C0F8DBE256758091ACE5E9432C90121266A90F8BA6AA4 + 61DEB340E25E7452221DC8532D2CC447B56DCB539C8B0F9B423E98CE46BDED34 + 8D8C38247B048BC31B0E662B96444CE4462DC50E37330F7CC694D8D466C1EBC1 + 31D614ED14CD7DBE1CDB3702AAC7FA40E939F7D462D1696B8A21263F25CD22A0 + 57CCCFFF9F3FAEDF1214C5D6E8DC743CD3E7E945DC134AB231B178F9F0840983 + 077AC59047563AD417314F8FC6FCEE3B5436DF712AE1590DFDEA3DDCC1114BFE + 358B56F62F5527251657E586CCBC0DA8050E2CB6D3D62B70017175CB6BDDA6E1 + 541FE5734A883F1760BE7AAC6D52EA21F81A35F14606EA46E3415224322263BA + A7F593739B858D141EFE8CC4D8B6BC6C48B85E41325ABDE9910CEB390726A08D + D285E20CD0D840C0DBE64218220F8DCFEADEEFDA9935FF50BDDF4300500A5593 + D7902B9D6A8A4BCB3C46C1828894FA9E0BA7549CA3B17439DCDDA33CEE2DCF72 + 0DF59B7F77F050B11D34A6FF42D6ED74B2C8D6337BC8D5D8BAB5BCD2FBC52E85 + B11A278357D80477CDE19D6566124F023CDFEC5C6439EE3763E1AD467513F45A + 381886BF33F29E4F7DD4292F9532EF8E7839A5627ED19978B584C28AF7E38FB0 + 4E8721E477CFF187FF7D17F5194CCA1ED7B9D9C8D4C9F51B147B3056B6768699 + 7DCFA6936E2BA7300BB894635611DC3715BC40F5ECA26388DAA0D8D5F1A268C7 + 13AAC9DFADC2625891C90ED9947D4178FFD91D2E59B8420715EBCFE128401BF8 + A24B0AF9F53C5F79C263DB2DB0C5CA97D5E3E67D1835525D88B6032E711F0DB2 + 68FB7AF22E45D7179CCFAF7BB09D24D2A5DD0F1A3EB33358AB489D5BD3D9964E + B2A315BBCA9A91E6B5C95ABE85914931C2871241E02FC6C17C7F9FD9B72B81C7 + DEACC54F57D83D9270F8E8F24C73E11D488BA2AAB4C518391B8B4D5DAC895412 + 3EA970CA0E7FC5DDCAF85D4855A74ED16DB0542C70BD9DA30599AB0A54BF0106 + 12FED698E5BB4E25F49F97A86230DCF1A40315F11936D25415BC49ED6928C612 + 07D109D16ABD3238D3A9560381BB7D3DECC622140F10BC8CF3C8740DE3DA982B + EE7057D0D014037C02A8466FE7F51CCB0BF2EC476130CE549CB577AE8D572FDC + 43C42F39944A51B5B126985F0A378FFB55580BFDC2FEF29AC2AA88C436F9B636 + C3E4158519F867698E6F944F7BCDF0CB13AD8EE6DAC7556834F192EF62AAB073 + 7CD912293730E5866C8E694B5B31C76B19D870A81E513B00EA0DEA7891B09DFB + 32FBF96F8328AC36FC886263AA6B5B221A98529903F1681CA4BC333407D4DAB4 + CE12073B0AC9B149B57FAFD7354F5B04A18BA3DB39B2996CDD66C9E65E2CF870 + 969288E96013338F980DEE822D691649C08EAFED531D24877077E27435286C2D + 9E4FF88F11CAADC00CCB12FC919C9BF8D17289DFCD353F1826681495A525CA53 + C5B7CF7E1AE6D3B8AA0B35282EFD7E0A172EDC3C738EBA29D26D6523EE03CFEB + 528CBF5318E5ECB172961E98A880543C136E8988CAAF9FC61F428D7231D2AF54 + 13FF143914DDC9AC01993FA4A8354E58BF41590D8B9349E5DFD94A3CC8E68BA7 + A8A2B33DC5B0FA680C1230064AC8C66CFD9B9B3919EC891006292A8815CD87CC + EE7DFC0E84941B488771CF382BD2DED4367A092BC54FE338A9761AA468D21AED + DC5D46CEA62E8E73A6D1D917A3B0E4852F45E4199DFB6EE9501099C06DEB2067 + C20E5E6DD9FFBD1AA03B7CE2965F2BAEAE464331975FE4C9B59B90541D372129 + C91C675EDDC4169882B9513541AEB889CF72DB277BF599AC79E0ABC704285B83 + 991FBD6ABA91A11C40E5BFFAEBD3BEC6EA2E25C7653B25EF10D73C01CFCE0AAB + 65340CEBF0936071FFF479B05FFAA8467AAE646AB5A0B8BAD06AA186CDB1C791 + 19B577DCE6101EC4F9B706BFF7E5155E + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMSY10 + %!PS-AdobeFont-1.1: CMSY10 1.0 + %%CreationDate: 1991 Aug 15 07:20:57 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMSY10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.035 def + /isFixedPitch false def + end readonly def + /FontName /CMSY10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 102 /braceleft put + dup 103 /braceright put + readonly def + /FontBBox{-29 -960 1116 775}readonly def + /UniqueID 5000820 def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 + 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 + A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 + E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A + 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A + 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF + 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 + 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 + DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A + 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 + 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C + 515DB70A8D4F6146FE068DC1E5DE8BC57036431151EC603C8BCFE359BBD953AD + 5F3D998C69E42AA96AA212AD55B676FA2B4F6B519575404233C09AF99014AB95 + 767523D9E1F8806E766AC0DD6D81028C3AA9C7536D88D3C2DB6D9949F844935E + 420963F40430452DEAAC1F500BFB1C2473C54B9987BE449F042633C7038D5AEB + 7E1E11C50911EBCF0979F8192E056A2B2EE9785EB73B1AB874116AD5AA74F32C + BF57FC28FFED335DFD9261AC7A624EAA93BEBC2C0F8B3F898DDA1490D59C6C4B + A651746C8EAD41BDAA1AF4056AFE98D2D3AE3CCEB9C67FE3A63385470EA42968 + 34268684A674675AB9EDBB5BFCA81224B22D4ECF40D1F31A39481AC68A87F252 + F4E7C1C340A26E0D514BACCAA51898758A7E7B63D2E7F34E91554151433F0FD2 + 4901D3DE9A5FB9306552DC57EAB729AA07780927E1ECCB5D1F59A09A1E3FFF2D + 922B6C9B58CB20D687A72B9C22D4EC926771541EDA3B75559510DB21BA4461EA + 960B8E5AF4D31D08E8F235D677A9F6EFDB01926967743942C23955678E438F51 + E5E22E2FA2AA7894755053C32B39277B82C00B3D9BE9957CF3ED626852FFFC31 + 6E5F0F7489198136A3284B31CC94299EED05B8FA66B8D33F7C47367790D23CD5 + 303B0C8E58B0E51BEA9325282F19A3D361A3BEA6BB0CCD09BE735D810E7E0A79 + D1A9C580CFC8CF9FF685D63ECDCCC024C235448BA632F00C3C5BC0E86F44B90A + 293817CC93035E5E18548A7E157C2887309BF84C167D8DBED024BB + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + TeXDict begin 40258431 52099146 1000 600 600 (f098-lattner.dvi) + @start /Fa 133[26 29 1[44 1[33 18 26 26 1[33 33 33 48 + 18 29 1[18 33 33 18 29 33 29 33 33 8[41 55 41 48 37 33 + 41 1[41 48 44 55 37 2[22 48 48 41 41 48 44 1[41 7[33 + 4[33 1[33 1[33 18 17 22 5[22 52 38[{ TeXBase1Encoding ReEncodeFont }51 + 66.4176 /Times-Italic rf /Fb 204[30 30 30 49[{}3 49.8132 + /CMR6 rf /Fc 207[18 48[{}1 49.8132 /CMSY6 rf /Fd 136[31 + 1[31 31 31 31 1[31 31 31 1[31 6[31 31 31 1[31 97[{}13 + 58.1154 /CMTT8 rf /Fe 194[51 19[26 26 40[{}3 58.1154 + /CMR7 rf /Ff 139[25 1[32 1[36 90[41 21[{}4 66.4176 /CMMI8 + rf /Fg 129[35 3[35 35 1[35 35 35 35 35 35 1[35 35 35 + 35 35 2[35 35 35 35 35 35 35 35 35 13[35 2[35 1[35 9[35 + 1[35 35 6[35 10[35 35 35 35 1[35 35 35 40[{}37 66.4176 + /CMTT8 rf /Fh 139[24 29 115[{}2 49.8132 /CMMI6 rf /Fi + 152[38 38 38[60 12[51 50[{}4 74.7198 /CMSY9 rf /Fj 87[22 + 17[33 27[29 33 33 48 33 33 18 26 22 33 33 33 33 52 18 + 33 18 18 33 33 22 29 33 29 33 29 3[22 1[22 41 48 48 63 + 48 48 41 37 44 48 37 48 48 59 41 48 26 22 48 48 37 41 + 48 44 44 48 1[29 1[37 2[18 33 33 33 33 33 33 33 33 33 + 33 18 17 22 17 2[22 22 22 52 34[37 37 2[{ + TeXBase1Encoding ReEncodeFont }79 66.4176 /Times-Roman + rf /Fk 134[39 3[39 39 39 39 1[39 39 39 1[39 5[39 39 39 + 39 48[39 39 49[{}15 74.7198 /CMITT10 rf /Fl 194[60 10[38 + 38 5[60 1[30 30 37[60 2[{}7 74.7198 /CMR9 rf /Fm 138[44 + 28 36 35 1[39 37 46 1[23 40 4[37 36 40 33 1[41 14[58 + 1[49 1[61 74 52 2[34 1[60 49 1[63 55 58 58 2[60 2[21 + 30[34 16[49 11[{}30 74.7198 /CMMI9 rf /Fn 107[37 37 24[33 + 37 37 54 37 42 25 29 33 1[42 37 42 62 21 1[25 21 42 37 + 25 33 42 33 42 37 9[75 1[54 50 42 54 1[46 58 54 71 50 + 2[29 58 58 46 50 54 54 50 54 6[25 37 37 37 37 37 37 37 + 37 37 37 21 19 25 42[42 2[{ TeXBase1Encoding ReEncodeFont }60 + 74.7198 /Times-Bold rf /Fo 133[23 26 2[26 29 16 23 23 + 29 29 29 29 42 16 2[16 29 29 16 26 29 26 1[29 12[32 3[36 + 42 39 1[32 2[19 3[36 42 39 36 36 6[19 7[29 2[16 15 1[15 + 2[19 19 40[{ TeXBase1Encoding ReEncodeFont }39 58.1154 + /Times-Italic rf /Fp 133[32 4[39 25 31 31 1[34 33 41 + 1[21 2[23 1[32 1[31 35 30 1[36 16[42 2[63 3[29 1[52 42 + 2[48 4[52 2[20 20 58[{}24 58.1154 /CMMI7 rf /Fq 133[26 + 2[42 29 32 19 23 26 1[32 29 32 48 16 2[16 32 1[19 26 + 32 26 32 29 24[45 72[{ TeXBase1Encoding ReEncodeFont }21 + 58.1154 /Times-Bold rf /Fr 240[35 15[{}1 66.4176 /CMSY8 + rf /Fs 134[39 1[39 39 39 39 39 39 1[39 39 39 39 39 2[39 + 39 39 39 39 39 39 39 39 14[39 1[39 39 39 1[39 7[39 1[39 + 39 6[39 6[39 39 39 1[39 39 39 39 2[39 39 1[39 38[{}40 + 74.7198 /CMTT9 rf /Ft 204[25 25 25 49[{ TeXBase1Encoding ReEncodeFont } + 3 49.8132 /Times-Roman rf /Fu 152[34 34 10[45 34[38 5[45 + 36[66 9[34 2[52{}8 58.1154 /CMSY7 rf /Fv 175[32 3[36 + 2[19 4[42 14[29 4[29 3[15 4[19 39[{ + .167 SlantFont TeXBase1Encoding ReEncodeFont }8 58.1154 + /Times-Roman rf /Fw 105[29 1[26 26 24[26 29 29 42 29 + 29 16 23 19 29 29 29 29 45 16 29 16 16 29 29 19 26 29 + 26 29 26 19 7[42 2[42 36 32 39 1[32 42 42 52 36 42 23 + 19 42 42 32 36 42 39 39 42 1[26 1[33 1[16 16 29 29 29 + 29 29 29 29 29 29 29 16 15 19 15 1[29 19 19 19 45 48 + 29 33[32 2[{ TeXBase1Encoding ReEncodeFont }77 58.1154 + /Times-Roman rf /Fx 134[33 1[50 1[42 21 29 29 1[37 37 + 42 58 21 1[21 21 1[37 1[33 37 33 37 37 12[46 42 7[50 + 3[54 2[54 50 67[{ TeXBase1Encoding ReEncodeFont }25 74.7198 + /Times-BoldItalic rf /Fy 133[29 33 33 50 33 37 21 29 + 29 37 37 37 37 54 21 1[21 21 37 37 21 33 37 33 37 37 + 25 10[54 42 37 2[46 2[62 1[50 6[54 50 46 46 18[19 25 + 19 2[25 25 25 36[37 2[{ TeXBase1Encoding ReEncodeFont }43 + 74.7198 /Times-Italic rf /Fz 104[75 37 1[33 33 24[33 + 37 37 54 37 37 21 29 25 37 37 37 37 58 21 37 21 21 37 + 37 25 33 37 33 37 33 3[25 1[25 3[71 54 54 46 42 50 1[42 + 54 54 66 46 54 29 25 54 54 42 46 54 50 50 54 5[21 21 + 37 37 37 37 37 37 37 37 37 37 21 19 25 19 42 37 25 25 + 25 58 62 3[25 29[42 42 2[{ TeXBase1Encoding ReEncodeFont }80 + 74.7198 /Times-Roman rf /FA 133[41 1[46 66 1[51 30 36 + 41 1[51 46 51 76 25 51 1[25 51 46 30 41 51 41 51 46 9[91 + 2[61 1[66 1[56 71 66 4[36 71 71 56 61 1[66 61 66 6[30 + 46 46 46 46 46 46 46 46 46 46 1[23 30 6[76 35[51 2[{ + TeXBase1Encoding ReEncodeFont }51 91.3242 /Times-Bold + rf /FB 137[48 48 48 48 48 3[48 1[48 2[48 3[48 48 48 1[48 + 32[48 17[48 1[48 44[{}15 90.9091 /CMTT10 rf /FC 152[45 + 45 102[{}2 90.9091 /CMSY10 rf /FD 134[46 2[46 1[25 36 + 30 1[46 46 46 71 25 46 1[25 46 46 30 41 46 1[46 41 10[66 + 66 8[56 2[30 5[61 1[66 19[30 45[{ TeXBase1Encoding ReEncodeFont }26 + 91.3242 /Times-Roman rf /FE 134[75 2[75 83 50 1[66 1[83 + 75 83 124 42 2[42 83 75 50 66 1[66 83 75 13[83 2[91 3[100 + 2[58 116 3[108 108 1[108 6[50 58[{ TeXBase1Encoding ReEncodeFont }27 + 149.44 /Times-Bold rf end + %%EndProlog + %%BeginSetup + %%Feature: *Resolution 600dpi + TeXDict begin + %%BeginPaperSize: Letter + letter + %%EndPaperSize + end + %%EndSetup + %%Page: 1 1 + TeXDict begin 1 0 bop 195 161 a FE(A)-7 b(utomatic)36 + b(P)m(ool)h(Allocation:)e(Impr)m(o)o(ving)i(P)m(erf)l(ormance)i(by)444 + 327 y(Contr)m(olling)d(Data)g(Structur)m(e)j(Lay)l(out)d(in)h(the)h + (Heap)1281 626 y FD(Chris)22 b(Lattner)346 b(V)-5 b(ikram)22 + b(Adv)o(e)1145 734 y(Uni)n(v)o(ersity)g(of)h(Illinois)g(at)g + (Urbana-Champaign)1300 842 y FC(f)p FB(lattner,vadve)p + FC(g)p FB(@cs.uiuc.edu)-150 1448 y FA(Abstract)-150 1564 + y Fz(This)h(paper)i(describes)f Fy(A)o(utomatic)g(P)-6 + b(ool)24 b(Allocation)p Fz(,)h(a)g(transformation)-150 + 1647 y(frame)n(w)o(ork)34 b(that)f(se)o(gre)o(gates)g(distinct)g + (instances)h(of)f(heap-based)i(data)-150 1730 y(structures)24 + b(into)g(seperate)h(memory)g(pools)f(and)h(allo)n(ws)f(heuristics)g(to) + g(be)-150 1813 y(used)19 b(to)e(partially)h(control)g(the)g(internal)g + (layout)h(of)f(those)g(data)g(structures.)-150 1896 y(The)28 + b(primary)g(goal)h(of)f(this)g(w)o(ork)g(is)g(performance)h(impro)o(v)o + (ement,)g(not)-150 1979 y(automatic)21 b(memory)g(management,)h(and)f + (the)g(paper)g(mak)o(es)g(se)n(v)o(eral)g(ne)n(w)-150 + 2062 y(contrib)o(utions.)30 b(The)f(k)o(e)o(y)h(contrib)o(ution)g(is)f + (a)g(ne)n(w)h(compiler)g(algorithm)-150 2145 y(for)g(partitioning)h + (heap)g(objects)f(in)g(imperati)n(v)o(e)h(programs)g(based)g(on)f(a) + -150 2228 y(conte)o(xt-sensiti)n(v)o(e)i(pointer)g(analysis,)g + (including)g(a)f(no)o(v)o(el)h(strate)o(gy)f(for)-150 + 2311 y(correct)20 b(handling)h(of)f(indirect)f(\(and)i(potentially)f + (unsafe\))g(function)h(calls.)-150 2394 y(The)e(transformation)h(does)g + (not)g(require)f(type)h(safe)f(programs)i(and)f(w)o(orks)-150 + 2477 y(for)k(the)h(full)e(generality)i(of)g(C)f(and)g(C++.)g(Second,)h + (the)f(paper)i(describes)-150 2560 y(se)n(v)o(eral)20 + b(optimizations)g(that)g(e)o(xploit)g(data)g(structure)f(partitioning)h + (to)g(fur)o(-)-150 2643 y(ther)d(impro)o(v)o(e)h(program)h + (performance.)f(Third,)f(the)g(paper)h(e)n(v)n(aluates)h(ho)n(w)-150 + 2726 y(memory)25 b(hierarchy)f(beha)o(vior)h(and)g(o)o(v)o(erall)f + (program)h(performance)g(are)-150 2809 y(impacted)i(by)g(the)g(ne)n(w)g + (transformations.)g(Using)g(a)f(number)i(of)e(bench-)-150 + 2893 y(marks)g(and)g(a)g(fe)n(w)f(applications,)h(we)g(\002nd)f(that)h + (compilation)g(times)f(are)-150 2976 y(e)o(xtremely)j(lo)n(w)-5 + b(,)27 b(and)h(o)o(v)o(erall)f(running)i(times)e(for)g(heap)h(intensi)n + (v)o(e)g(pro-)-150 3059 y(grams)23 b(speed)g(up)g(by)g(10-25\045)h(in)f + (man)o(y)g(cases,)g(about)g(2x)g(in)g(tw)o(o)f(cases,)-150 + 3142 y(and)j(more)f(than)g(10x)h(in)f(tw)o(o)g(small)g(benchmarks.)h + (Ov)o(erall,)f(we)g(belie)n(v)o(e)-150 3225 y(this)e(w)o(ork)h(pro)o + (vides)g(a)f(ne)n(w)h(frame)n(w)o(ork)g(for)f(optimizing)h(pointer)f + (inten-)-150 3308 y(si)n(v)o(e)k(programs)i(by)e(se)o(gre)o(gating)h + (and)g(controlling)g(the)f(layout)h(of)g(heap-)-150 3391 + y(based)20 b(data)f(structures.)-150 3524 y Fx(Categories)e(and)f + (Subject)f(Descriptors)75 b Fz(D.3.4)16 b([)p Fy(Pr)m(ocessor)o(s)p + Fz(]:)g(Compil-)-150 3607 y(ers,)i(Optimization,)h(Memory)h(management) + -150 3740 y Fx(General)f(T)-7 b(erms)75 b Fz(Algorithms,)18 + b(Performance)-150 3873 y Fx(K)n(eyw)o(ords)76 b Fz(Recursi)n(v)o(e)41 + b(data)h(structure,)f(data)g(layout,)g(cache,)h(static)-150 + 3956 y(analysis,)19 b(pool)h(allocation)-150 4148 y FA(1.)91 + b(Intr)n(oduction)-150 4264 y Fz(One)29 b(of)g(the)g(most)g(important)g + (tasks)g(for)g(modern)h(compilers)f(and)h(run-)-150 4347 + y(time)f(systems)g(is)g(the)g(management)i(of)e(memory)h(usage)g(in)f + (programs,)-150 4430 y(including)22 b(safety)f(checking,)h + (optimization,)e(and)i(storage)f(management.)-150 4513 + y(Unfortunately)-5 b(,)25 b(compilers)h(ha)o(v)o(e)f(pro)o(v)o(ed)g + (much)h(more)f(ef)n(fecti)n(v)o(e)g(at)f(an-)-150 4944 + y Fw(Permission)19 b(to)h(mak)o(e)f(digital)h(or)f(hard)h(copies)e(of)i + (all)f(or)g(part)h(of)f(this)g(w)o(ork)h(for)g(personal)f(or)-150 + 5010 y(classroom)d(use)f(is)h(granted)h(without)f(fee)g(pro)o(vided)h + (that)g(copies)e(are)h(not)h(made)f(or)g(distrib)o(uted)-150 + 5077 y(for)e(pro\002t)g(or)g(commercial)g(adv)o(antage)e(and)h(that)h + (copies)f(bear)g(this)g(notice)h(and)f(the)g(full)h(citation)-150 + 5143 y(on)i(the)g(\002rst)g(page.)f(T)-5 b(o)16 b(cop)o(y)h(otherwise,) + e(to)h(republish,)g(to)g(post)g(on)g(serv)o(ers)g(or)g(to)g(redistrib)o + (ute)-150 5210 y(to)f(lists,)e(requires)i(prior)h(speci\002c)e + (permission)g(and/or)h(a)g(fee.)-150 5293 y Fv(PLDI'05,)59 + b Fw(June)14 b(12\22615,)h(2005,)f(Chicago,)g(Illinois,)g(USA.)-150 + 5359 y(Cop)o(yright)120 5357 y(c)100 5359 y Fu(\015)g + Fw(2005)h(A)n(CM)f(1-59593-080-9/05/0006.)9 b(.)g(.)g($5.00.)2042 + 1448 y Fz(alyzing)28 b(and)h(controlling)f(memory)h(access)f(patterns)g + (for)g(dense)h(arrays)2042 1531 y(than)g(for)g(pointer)o(-based)g(data) + g(structures.)g(A)f(k)o(e)o(y)i(dif)n(ference)f(between)2042 + 1614 y(the)e(tw)o(o)h(is)f(that)g(compilers)h(ha)o(v)o(e)f(precise)h + (kno)n(wledge)h(of)e(the)h(runtime)2042 1697 y(layout)20 + b(of)f(arrays)g(in)g(memory)-5 b(,)20 b(whereas)g(the)o(y)f(ha)o(v)o(e) + h(much)g(less)f(informa-)2042 1780 y(tion)24 b(about)i(comple)o(x)g + (data)e(structures)h(allocated)h(on)f(the)f(heap.)i(In)e(such)2042 + 1863 y(\(pointer)o(-based\))g(data)h(structures,)e(both)i(the)f(relati) + n(v)o(e)g(layout)g(of)g Fy(distinct)2042 1946 y(data)k(structur)m(es)g + Fz(in)f(memory)h(\(which)f(af)n(fects)g(w)o(orking)h(set)f(sizes\))g + (and)2042 2029 y(the)e(relati)n(v)o(e)g(layout)g(of)g(nodes)h + Fy(within)e(a)h(single)h(data)f(structur)m(e)h Fz(\(which)2042 + 2112 y(af)n(fects)e(memory)g(tra)o(v)o(ersal)g(patterns\))g(are)f(dif)n + (\002cult)h(to)f(predict.)h(One)g(di-)2042 2195 y(rect)f(consequence)j + (is)d(that)h(irre)o(gular)f(memory)i(tra)o(v)o(ersal)e(patterns)h + (often)2042 2278 y(ha)o(v)o(e)d(w)o(orse)g(performance,)h(both)f + (because)h(of)f(poor)g(spatial)g(locality)f(and)2042 + 2361 y(because)k(techniques)g(lik)o(e)g(hardw)o(are)g(stride)f + (prefetching)h(are)f(not)g(ef)n(fec-)2042 2444 y(ti)n(v)o(e.)28 + b(A)g(potentially)g(more)h(f)o(ar)o(-reaching)g(consequence)i(of)d(the) + g(lack)h(of)2042 2527 y(layout)17 b(information)h(is)e(that)h(man)o(y)g + (compiler)h(techniques)g(\(e.g.,)e(softw)o(are)2042 2610 + y(prefetching,)28 b(data)g(layout)g(transformations,)g(and)g(safety)g + (analysis\))g(are)2042 2693 y(either)19 b(less)f(ef)n(fecti)n(v)o(e)i + (or)e(not)i(applicable)f(to)g(comple)o(x)h(data)f(structures.)2141 + 2776 y(Despite)f(the)g(potential)g(importance)g(of)g(data)g(structure)g + (layouts,)g(com-)2042 2859 y(piler)h(transformations)g(for)g(pointer)o + (-intensi)n(v)o(e)h(programs)g(are)f(performed)2042 2942 + y(primarily)24 b(using)g(pointer)h(and)g(dependence)h(analysis,)e(and)h + Fy(not)f(by)h(con-)2042 3025 y(tr)m(olling)j(and)h(using)g(information) + g(about)g(the)g(layout)g(of)f(pointer)o(-based)2042 3108 + y(data)19 b(structur)m(es)p Fz(.)2141 3191 y(Se)n(v)o(eral)32 + b(compiler)f(techniques)i(attempt)e(to)g(modify)h(the)f(layout)h(of) + 2042 3274 y(pointer)o(-based)21 b(data)g(structures)g(by)g(gi)n(ving)g + (hints)g(or)f(memory)h(layout)g(di-)2042 3357 y(recti)n(v)o(es)d(to)h + (a)f(runtime)h(library)f([12)q(],)g(memory)h(allocator)g([9],)f(or)g + (garbage)2042 3440 y(collector)23 b([28)q(,)f(29)q(].)g(None)h(of)g + (these)h(techniques)g(attempt)f Fy(to)g(e)o(xtr)o(act)f(in-)2042 + 3523 y(formation)15 b(about)i(or)e(to)g(contr)m(ol)g + Fz(the)h(relati)n(v)o(e)f(layouts)g(of)h(objects)f(within)g(a)2042 + 3606 y(data)j(structure)h(or)f(of)g(distinct)h(data)f(structures,)g + (nor)h(can)g(the)o(y)f(be)h(directly)2042 3690 y(e)o(xtended)h(to)e(do) + h(so.)f(Reliable)g(data)h(layout)g(information)g(and)g(control)g(are) + 2042 3773 y(necessary)f(for)f(data)h(layout)g(properties)f(to)h(be)f + (used)h(as)f(a)g(basis)h(for)f(further)2042 3856 y(compiler)i + (transformations.)2141 3939 y(An)38 b(alternati)n(v)o(e)g(approach)i + (for)e(se)o(gre)o(gating)g(heap)h(objects)f(under)2042 + 4022 y(compiler)33 b(control)h(is)f(the)g(w)o(ork)h(on)g(automatic)f + (re)o(gion)h(inference)g(for)2042 4105 y(ML)24 b([45,)g(44)q(,)f(24)q + (])h(and)g(more)h(recently)f(for)g(Ja)o(v)n(a)g([14)q(,)g(10].)g(These) + g(tech-)2042 4188 y(niques)f(partition)f(objects)h(into)f(heap)h(re)o + (gions)g(based)g(on)g(lifetimes,)e(with)2042 4271 y(the)16 + b(primary)g(goal)h(of)f(pro)o(viding)h(automatic)f(memory)h(management) + g(with)2042 4354 y(little)j(or)i(no)g(garbage)g(collection)g(for)g + (type-safe)g(languages.)h(In)e(contrast,)2042 4437 y(our)i(primary)g + (goal)g(in)f(this)g(w)o(ork)i(is)e(to)g(impro)o(v)o(e)h(program)h + (performance)2042 4520 y(by)19 b(se)o(gre)o(gating)g(heap)g(data)g + (structures)g(and)g(by)g(enabling)h(further)f(layout-)2042 + 4603 y(based)i(optimizations)g(on)f(these)h(data)f(structures)g(\(in)g + (f)o(act,)g(we)g(do)h(not)f(try)2042 4686 y(to)c(reclaim)g(memory)h + (automatically)-5 b(,)16 b(e)o(xcept)h(in)f(limited)f(cases\).)h + (Because)2042 4769 y(of)k(their)f(dif)n(ferent)h(goals,)g(these)h + (techniques)g(do)f(not)g(e)o(xplore)h(ho)n(w)f(to)g(e)o(x-)2042 + 4852 y(ploit)f(data)g(structure)h(partitioning)f(to)g(optimize)h + (memory)g(hierarchy)g(per)o(-)2042 4935 y(formance)26 + b(and)h(do)f(not)g(support)h(non-type-safe)g(languages)g(lik)o(e)f(C)f + (and)2042 5018 y(C++,)17 b(which)h(are)g(important)g(for)f(man)o(y)h + (performance-sensiti)n(v)o(e)i(applica-)2042 5101 y(tions.)25 + b(These)h(pre)n(vious)h(approaches)h(are)d(compared)i(with)f(our)g(w)o + (ork)g(in)2042 5184 y(more)19 b(detail)g(in)g(Section)f(10.)2141 + 5267 y(This)24 b(paper)g(describes)g Fy(A)o(utomatic)f(P)-6 + b(ool)24 b(Allocation)p Fz(,)f(a)h(transforma-)2042 5350 + y(tion)i(frame)n(w)o(ork)i(for)f(arbitrary)f(imperati)n(v)o(e)h + (programs)h(that)e Fy(se)m(gr)m(e)m(gates)p eop end + %%Page: 2 2 + TeXDict begin 2 1 bop -150 66 a Fy(distinct)20 b(instances)i(of)e + (pointer)o(-based)i(data)f(structur)m(es)h(in)e(the)h(heap)g(into)-150 + 149 y(seper)o(ate)j(memory)h(pools)p Fz(,)f(and)g(allo)n(ws)f(dif)n + (ferent)h(heuristics)g(to)g(be)g(used)-150 232 y(to)d(partially)g + (control)h(the)g(internal)f(layout)h(of)f(those)h(data)g(structures.)f + (F)o(or)-150 315 y(e)o(xample,)d(each)h(distinct)f(instance)g(of)g(a)g + (list,)f(tree,)g(or)h(graph)h(identi\002ed)f(by)-150 + 399 y(the)i(compiler)h(w)o(ould)g(be)f(allocated)h(to)f(a)g(separate)h + (pool.)f(The)g(paper)h(also)-150 482 y(describes)g(se)n(v)o(eral)g + (simple)f(optimizations)h(that)g(e)o(xploit)f(the)h(partitioning)-150 + 565 y(of)j(data)h(structures)f(on)h(the)g(heap)g(to)f(further)g(impro)o + (v)o(e)h(program)h(perfor)o(-)-150 648 y(mance.)f(These)f + (optimizations)h(are)f(possible)h(because)h(Automatic)e(Pool)-150 + 731 y(Allocation)19 b(is)f(a)h(rigorous)g(transformation)h(performed)f + (by)h(the)e(compiler)l(.)-150 814 y(In)30 b(other)g(w)o(ork,)g(we)g(ha) + o(v)o(e)g(used)h(Automatic)f(Pool)f(Allocation)h(and)h(its)-150 + 897 y(underlying)e(pointer)f(analysis)h(to)e(de)n(v)o(elop)i(other)f + (ne)n(w)-5 b(,)28 b(compiler)g(tech-)-150 980 y(niques)k(operating)f + (at)g(the)g(\223macroscopic\224)h(le)n(v)o(el,)f(i.e.,)e(at)i(the)f(le) + n(v)o(el)h(of)-150 1063 y(entire)d(data)g(structures)g(\(rather)f(than) + i(indi)n(vidual)f(pointers)h(or)e(objects\).)-150 1146 + y(These)d(include)h(techniques)h(for)e(pointer)g(compression)i([35)q(]) + d(and)i(mem-)-150 1229 y(ory)j(safety)h(without)f(garbage)h(collection) + g([19].)f(These)g(techniques)h(are)-150 1312 y(v)o(ery)23 + b(brie\003y)g(summarized)h(in)f(Section)g(7.)g(The)g(goal)g(of)g(this)g + (paper)h(is)e(to)-150 1395 y(describe)h(and)f(e)n(v)n(aluate)h(the)g + (pool)f(allocation)h(transformation)f(itself)g(and)-150 + 1478 y(simple)d(optimizations)g(directly)g(based)h(on)g(it.)-50 + 1561 y(More)26 b(speci\002cally)-5 b(,)26 b(Automatic)g(Pool)g + (Allocation)g(tak)o(es)g(a)g(conte)o(xt-)-150 1644 y(sensiti)n(v)o(e,)j + (\002eld-sensiti)n(v)o(e)f(points-to)h(graph)h(representation)f(and)h + (parti-)-150 1727 y(tions)g(the)g(heap)g(so)g(that)g(objects)g + (represented)h(by)f(the)g(same)g(points-to)-150 1813 + y(graph)24 b(node)h(are)f(allocated)g(in)f(a)h(common)h(pool)1175 + 1781 y Ft(1)1204 1813 y Fz(.)e(By)h(using)g(a)g(conte)o(xt-)-150 + 1896 y(sensiti)n(v)o(e)29 b(analysis)g(with)f(\223heap)i(cloning,)-5 + b(\224)29 b(distinct)f(data)h(structure)g(in-)-150 1979 + y(stances)17 b(that)g(are)g(created)g(and)h(processed)g(by)g(the)f + (same)g(functions)h(can)f(be)-150 2062 y(se)o(gre)o(gated)23 + b(into)f(dif)n(ferent)h(pools.)f(The)g(lifetime)g(of)g(each)h(pool)g + (is)f(deter)o(-)-150 2145 y(mined)g(by)f(bounding)j(the)d(lifetime)f + (of)h(pointers)h(to)f(objects)h(in)f(that)g(pool.)-150 + 2228 y(The)27 b(end)h(result)f(of)g(pool)g(allocation)h(is)e(a)h + (partitioning)h(of)f(the)g(runtime)-150 2311 y(heap)32 + b(into)g(pools,)f(a)h(transformed)g(program)g(that)g(allocates)f(and)h + (frees)-150 2394 y(memory)20 b(from)g(pools,)g(and)h(a)e(mapping)i + (from)f(each)g(static)f(pointer)i(to)e(the)-150 2477 + y(pool)e(it)f(points)g(into.)h(Based)f(on)h(this)f(information,)h + (subsequent)h(optimiza-)-150 2560 y(tions)h(and)h(analyses)f(may)h(be)f + (applied)h(to)e(the)h(program.)-50 2643 y(The)34 b(Automatic)i(Pool)e + (Allocation)h(algorithm)g(supports)h(arbitrary)-150 2726 + y(C)e(and)h(C++)g(programs,)g(including)h(programs)f(with)g(function)g + (point-)-150 2809 y(ers)18 b(and/or)g(virtual)f(functions,)i + (recursion,)f(v)n(arar)o(gs)g(functions,)g(non-type-)-150 + 2892 y(safe)i(memory)g(accesses)h(\(e.g.,)e(via)g(pointer)h(casts)g + (and)g(unions\),)h(setjmp/-)-150 2975 y(longjmp,)e(and)g(e)o + (xceptions.)g(One)g(of)f(the)h(k)o(e)o(y)g(strengths)g(of)f(the)h + (algorithm)-150 3058 y(is)24 b(a)h(simple)g(strate)o(gy)f(for)h + (correctly)g(handling)h(indirect)f(calls,)f(which)h(is)-150 + 3141 y(dif)n(\002cult)j(because)h(dif)n(ferent)g(functions)g(called)f + (via)h(a)f(function)h(pointer)-150 3224 y(may)i(ha)o(v)o(e)f(dif)n + (ferent)g(allocation)h(and)f(deallocation)i(beha)o(vior)e(and)h(be-) + -150 3307 y(cause)d(\(in)f(C)f(or)h(C++\))g(may)h(e)n(v)o(en)g(ha)o(v)o + (e)f(dif)n(ferent)g(signatures.)h(The)f(al-)-150 3390 + y(gorithm)d(solv)o(es)g(these)f(comple)o(x)i(issues)f(via)f(a)g(relati) + n(v)o(ely)h(simple)f(graph)-150 3473 y(transformation)i(phase,)f(while) + g(k)o(eeping)h(the)f(code)h(transformation)f(pro-)-150 + 3556 y(cess)18 b(essentially)f(unchanged.)j(The)d(transformation)h(w)o + (orks)g(correctly)f(for)-150 3639 y(incomplete)29 b(programs,)h(by)f + (only)g(pool)g(allocating)g(memory)g(that)g(does)-150 + 3722 y(not)19 b(escape)h(the)f(scope)h(of)f(analysis.)-50 + 3805 y(Automatic)25 b(Pool)g(Allocation)g(can)h(directly)f(impro)o(v)o + (e)h(program)g(per)o(-)-150 3888 y(formance)e(in)g(se)n(v)o(eral)f(w)o + (ays.)h(First,)e(since)i(programs)g(typically)g(tra)o(v)o(erse)-150 + 3971 y(and)19 b(process)g(only)h(one)f(or)f(a)h(fe)n(w)f(data)h + (structures)f(at)h(a)f(time,)g(se)o(gre)o(gating)-150 + 4054 y(logical)29 b(data)g(structures)h(reduces)f(the)g(memory)h(w)o + (orking)g(sets)f(of)g(pro-)-150 4138 y(grams,)i(potentially)g(impro)o + (ving)h(both)f(cache)g(and)h(TLB)d(performance.)-150 + 4221 y(Second,)16 b(in)f(certain)g(cases,)g(the)h(allocation)f(order)h + (within)f(each)h(data)f(struc-)-150 4304 y(ture)24 b(pool)i(will)d + (match)i(the)f(subsequent)j(tra)o(v)o(ersal)d(order)h(\(e.g.,)e(if)h(a) + h(tree)-150 4387 y(is)18 b(created)h(and)h(then)f(processed)h(in)e + (preorder\),)h(impro)o(ving)h(spatial)e(local-)-150 4470 + y(ity)-5 b(.)21 b(Intuiti)n(v)o(ely)-5 b(,)22 b(both)g(bene\002ts)g + (arise)g(because)h(the)e(layout)i(of)e(indi)n(vidual)-150 + 4553 y(data)30 b(structures)g(is)f(unaf)n(fected)i(by)f(interv)o(ening) + h(allocations)f(for)g(other)-150 4636 y(data)24 b(structures,)g(and)g + (less)g(lik)o(ely)g(to)f(be)h(scattered)g(around)h(in)f(the)g(heap.) + -150 4719 y(Third,)16 b(in)h(some)g(cases,)g(the)f(tra)o(v)o(ersal)g + (order)h(may)g(e)n(v)o(en)h(become)g(a)e(simple)-150 + 4802 y(linear)g(stride,)f(allo)n(wing)i(more)f(ef)n(fecti)n(v)o(e)h + (hardw)o(are)g(prefetching)g(than)f(be-)-150 4885 y(fore.)i(Note)h + (that)f(Automatic)h(Pool)f(Allocation)h(can)g(also)f(potentially)h + (hurt)-150 4968 y(performance)30 b(in)e(tw)o(o)h(w)o(ays:)g(by)g + (separating)h(data)e(that)h(are)f(frequently)-150 5051 + y(accessed)h(together)f(and)h(by)f(allocating)g(nearly-empty)h(pages)g + (to)f(small)p -150 5289 997 3 v -150 5340 a Ft(1)-113 + 5363 y Fw(Less)d(aggressi)o(v)o(e)f(pointer)j(analyses)d(can)i(also)f + (be)h(used)f(b)o(ut)h(may)g(not)g(distinguish)g(data)-150 + 5430 y(structure)15 b(instances)e(or)i(may)g(gi)o(v)o(e)f(less)g + (precise)g(information)i(about)f(their)g(internal)g(structure.)2042 + 66 y Fz(pools)26 b(\(some)g(of)g(the)f(techniques)i(described)g(later)e + (are)h(intended)g(to)g(ad-)2042 149 y(dress)19 b(these)g(issues\).)2141 + 232 y(This)c(paper)h(describes)g(se)n(v)o(eral)g(optimizations)f(based) + i(on)e(pool)h(alloca-)2042 315 y(tion)h(that)g(further)h(impro)o(v)o(e) + g(program)g(performance.)g(First,)e(we)h(sho)n(w)h(that)2042 + 399 y(in)27 b(certain)h(cases,)g(indi)n(vidual)h Fs(free)f + Fz(operations)h(on)f(objects)g(in)g(a)f(pool)2042 482 + y(can)h(be)h(eliminated)f(and)h(the)f(entire)g(memory)h(for)f(the)g + (pool)h(reclaimed)2042 565 y(when)21 b(the)g(pool)g(is)f(destro)o(yed)i + (\(without)f(increasing)g(memory)h(consump-)2042 648 + y(tion\).)29 b(Second,)g(we)g(describe)h(se)n(v)o(eral)g(customized)g + (memory)g(manage-)2042 731 y(ment)25 b(choices)h(that)f(can)h(be)f + (used)h(at)f(run)h(time)e(for)h(pools)h(with)f(speci\002c)2042 + 814 y(characteristics.)c(The)h(k)o(e)o(y)h(to)f(some)g(of)g(these)g + (optimizations)g(is)g(that)f(dif-)2042 897 y(ferent)h(logical)h(data)g + (structures)f(tend)h(to)g(be)f(used)i(in)e(dif)n(ferent)h(b)o(ut)f + (well-)2042 980 y(de\002ned)e(w)o(ays)g(that)f(can)h(be)g(e)o + (xploited,)g(whereas)g(simply)g(se)o(gre)o(gating)g(by)2042 + 1063 y(type,)26 b(lifetime,)f(or)i(runtime)f(pro\002le)g(information)h + (w)o(ould)g(not)g(typically)2042 1146 y(be)19 b(suf)n(\002cient)g(to)g + (apply)g(all)g(these)g(optimizations.)2141 1229 y(W)-6 + b(e)17 b(e)n(v)n(aluate)i(the)f(performance)h(impact)e(of)h(Automatic)g + (Pool)f(Alloca-)2042 1312 y(tion)g(and)i(the)e(subsequent)j + (optimizations,)e(using)g(heap-intensi)n(v)o(e)h(bench-)2042 + 1395 y(marks)h(from)g(the)g(SPEC,)d(PtrDist)i([2],)g(Olden)h([39)q(])f + (and)i(FreeBench)f([40])2042 1478 y(benchmark)j(suites,)f(and)h(a)e(fe) + n(w)h(standalone)h(applications.)g(W)-6 b(e)21 b(\002nd)h(that)2042 + 1561 y(man)o(y)d(of)g(these)g(programs)g(speed)h(up)f(by)g(10-25\045,)g + (tw)o(o)g(by)g(about)g(2x)g(and)2042 1644 y(tw)o(o)e(small)g + (benchmarks)i(by)f(more)f(than)h(10x.)f(Other)g(programs)h(are)g(unaf-) + 2042 1727 y(fected,)h(and)h(importantly)-5 b(,)20 b(none)g(are)g(hurt)f + (signi\002cantly)h(by)g(the)g(transfor)o(-)2042 1810 + y(mation.)j(W)-6 b(e)22 b(also)h(sho)n(w)g(that)g(the)g(total)f + (compile)i(time)e(for)h(the)g(transfor)o(-)2042 1893 + y(mation)h(\(including)h(the)f(conte)o(xt-sensiti)n(v)o(e)h(pointer)f + (analysis)h(that)f(com-)2042 1976 y(putes)g(its)f(input)h(points-to)g + (graphs\))g(is)g(v)o(ery)g(small,)f(requiring)h(1.25)g(sec-)2042 + 2059 y(onds)c(or)f(less)g(for)f(programs)i(up)g(to)f(100K)h(lines)e(of) + h(source)h(code.)g(Finally)-5 b(,)2042 2142 y(the)25 + b(subsequent)h(optimizations)g(contrib)o(ute)f(impro)o(v)o(ements)g + (\(o)o(v)o(er)g(pool)2042 2225 y(allocation)19 b(alone\))g(by)f + (10-40\045)i(for)e(eight)h(cases)g(and)g(0-10\045)g(for)f(the)h(oth-) + 2042 2308 y(ers.)27 b(W)-6 b(e)27 b(also)g(sho)n(w)i(that)e(cache)h + (and/or)g(TLB)f(performance)h(impro)o(v)o(es)2042 2391 + y(signi\002cantly)33 b(in)g(all)f(case)h(with)g(signi\002cant)g + (speedups,)h(and)g(in)e(man)o(y)2042 2474 y(cases)27 + b(hit)f(rates)g(are)g(impro)o(v)o(ed)i(roughly)f(similarly)f(at)g(all)g + (le)n(v)o(els)h(of)f(the)2042 2557 y(memory)18 b(hierarchy)f(\(L1)g + (and)h(L2)f(caches)h(and)g(TLB\),)d(indicating)j(that)f(the)2042 + 2640 y(performance)26 b(impro)o(v)o(ements)f(are)g(primarily)f(due)h + (to)f(reduced)i(w)o(orking)2042 2723 y(sets.)2141 2806 + y(Ov)o(erall,)19 b(this)f(paper)i(mak)o(es)g(the)f(follo)n(wing)g + (contrib)o(utions:)2085 2924 y Fr(\017)2150 2931 y Fz(W)-6 + b(e)33 b(propose)j(a)e(no)o(v)o(el)h(approach)g(to)f(impro)o(ving)i + (performance)f(of)2150 3014 y(pointer)c(intensi)n(v)o(e)h(programs:)f + (se)o(gre)o(gating)h(and)g(controlling)f(heap)2150 3097 + y(layout)24 b(of)g(pointer)o(-based)h(data)g(structure)f(instances)g + (and)h(using)g(fur)o(-)2150 3180 y(ther)16 b(compiler)g(optimizations)h + (that)f(e)o(xploit)g(this)g(layout)h(information.)2085 + 3272 y Fr(\017)2150 3279 y Fz(W)-6 b(e)20 b(present)h(a)f(ne)n(w)h + (compiler)g(algorithm)g(for)f(partitioning)h(heap)h(ob-)2150 + 3362 y(jects)15 b(in)h(C)g(and)h(C++)e(programs)i(that)f(is)g(based)h + (on)f(a)g(conte)o(xt-sensiti)n(v)o(e)2150 3445 y(pointer)21 + b(analysis,)g(including)h(a)f(no)o(v)o(el)g(and)h(simple)f(strate)o(gy) + g(for)g(cor)o(-)2150 3528 y(rect)26 b(handling)i(of)f(indirect)g + (function)g(calls)g(in)f(arbitrary)h(\(including)2150 + 3611 y(non-type-safe\))20 b(programs.)2085 3704 y Fr(\017)2150 + 3711 y Fz(W)-6 b(e)30 b(present)i(se)n(v)o(eral)f(simple)g(b)o(ut)f(no) + o(v)o(el)i(optimizations)f(that)g(opti-)2150 3794 y(mize)24 + b(the)g(performance)h(of)f(indi)n(vidual)g(data)h(structure)f(pools)g + (based)2150 3877 y(on)c(their)f(speci\002c)g(patterns)h(of)f(memory)h + (deallocation)h(or)e(type)h(infor)o(-)2150 3960 y(mation)26 + b(for)g(pool)g(contents.)h(In)f(pre)n(vious)h(w)o(ork)f([19)q(,)f(35)q + (],)g(we)h(ha)o(v)o(e)2150 4043 y(demonstrated)20 b(other)f(uses)h(of)e + (Automatic)i(Pool)e(Allocation)h(as)g(well.)2085 4136 + y Fr(\017)2150 4143 y Fz(W)-6 b(e)30 b(present)i(a)e(detailed)i(e)o + (xperimental)f(e)n(v)n(aluation)h(of)f(the)g(perfor)o(-)2150 + 4226 y(mance)24 b(impact)f(of)g(Automatic)g(Pool)g(Allocation,)g(sho)n + (wing)h(that)f(the)2150 4309 y(transformation)39 b(can)h + (signi\002cantly)f(impro)o(v)o(e)h(memory)g(hierarchy)2150 + 4392 y(performance)27 b(and)g(o)o(v)o(erall)f(running)h(times)e(of)h + (heap-intensi)n(v)o(e)i(pro-)2150 4475 y(grams,)h(and)h(that)g(the)f + (transformation)h(has)g(v)o(ery)g(lo)n(w)f(compilation)2150 + 4558 y(time)18 b(in)h(practice.)2141 4682 y(Section)28 + b(2)g(de\002nes)g(the)f(assumptions)i(we)e(mak)o(e)i(about)f(the)g + (points-)2042 4765 y(to)22 b(graph)i(input)e(to)h(the)f + (transformation.)h(Section)f(3)h(describes)g(the)g(main)2042 + 4848 y(pool)c(allocation)g(transformation,)g(and)g(Section)g(4)f + (describes)i(se)n(v)o(eral)f(im-)2042 4932 y(portant)i(re\002nements.)g + (Sections)g(5)g(and)g(6)g(de\002ne)g(a)g(suite)g(of)g(simple)f(pool) + 2042 5015 y(optimizations)i(and)g(describe)h(heuristics)e(for)h(pool)g + (collocation)h(\(respec-)2042 5098 y(ti)n(v)o(ely\).)i(Section)h(7)h + (describes)f(the)h(k)o(e)o(y)f(properties)h(pro)o(vided)g(by)g(Auto-) + 2042 5181 y(matic)16 b(Pool)h(Allocation)g(and)h(tw)o(o)f(e)o(xample)g + (clients,)g(Section)f(8)h(describes)2042 5264 y(our)i(implementation,)h + (and)g(Section)f(9)h(contains)g(our)g(e)o(xperimental)g(e)n(v)n(al-) + 2042 5347 y(uation)c(of)h(the)f(transformation.)g(Finally)-5 + b(,)16 b(Section)g(10)g(contrasts)h(this)f(w)o(ork)2042 + 5430 y(with)i(prior)h(w)o(ork)h(in)f(the)g(\002eld)f(and)i(Section)e + (11)i(concludes)g(the)f(paper)l(.)p eop end + %%Page: 3 3 + TeXDict begin 3 2 bop -141 96 a Fq(s)9 b(t)g(r)g(u)g(c)g(t)59 + b Fw(l)14 b(i)f(s)h(t)49 b Fu(f)g Fw(l)14 b(i)g(s)f(t)42 + b Fu(\003)13 b Fw(N)5 b(e)g(x)g(t)19 b(;)50 b Fq(i)9 + b(n)g(t)39 b Fu(\003)13 b Fw(D)6 b(a)g(t)g(a)17 b(;)38 + b Fu(g)12 b Fw(;)-136 163 y(l)i(i)f(s)h(t)21 b Fu(\003)37 + b Fw(c)9 b(r)g(e)g(a)g(t)g(e)g(n)g(o)g(d)g(e)15 b(\()i + Fq(i)9 b(n)g(t)39 b Fu(\003)13 b Fw(D)6 b(a)g(t)g(a)15 + b(\))33 b Fu(f)-67 229 y Fw(l)14 b(i)g(s)f(t)43 b Fu(\003)6 + b Fw(N)o(e)o(w)33 b(=)43 b(m)7 b(a)g(l)g(l)g(o)g(c)17 + b(\()h Fq(s)10 b(i)g(z)g(e)g(o)g(f)18 b Fw(\()k(l)14 + b(i)g(s)f(t)26 b(\))13 b(\))g(;)-81 296 y(N)o(e)o(w)-11 + b Fu(\000)-17 b Fp(>)m Fw(D)6 b(a)g(t)g(a)41 b(=)h(D)6 + b(a)g(t)g(a)15 b(;)-73 362 y Fq(r)7 b(e)g(t)g(u)g(r)g(n)40 + b Fw(N)o(e)o(w)7 b(;)-150 428 y Fu(g)-143 495 y Fq(v)g(o)g(i)g(d)52 + b Fw(s)10 b(p)h(l)h(i)f(t)g(c)g(l)h(o)f(n)g(e)19 b(\()j(l)13 + b(i)h(s)g(t)42 b Fu(\003)7 b Fw(L)13 b(,)54 b(l)14 b(i)g(s)f(t)40 + b Fu(\003)6 b(\003)f Fw(R1)15 b(,)55 b(l)14 b(i)g(s)f(t)39 + b Fu(\003)6 b(\003)g Fw(R)q(2)j(\))34 b Fu(f)-69 628 + y Fq(i)12 b(f)50 b Fw(\()12 b(L)33 b(=)10 b(=)34 b(0)10 + b(\))35 b Fu(f)f(\003)10 b Fw(R)q(1)33 b(=)e Fu(\003)10 + b Fw(R)q(2)39 b(=)h(0)12 b(;)47 b Fq(r)7 b(e)g(t)g(u)g(r)g(n)16 + b Fw(;)35 b Fu(g)-69 694 y Fq(i)12 b(f)50 b Fw(\()21 + b(s)9 b(o)g(m)g(e)p 229 694 18 4 v 37 w(p)g(r)g(e)g(d)g(i)g(c)g(a)g(t)g + (e)15 b(\()8 b(L)-9 b Fu(\000)-17 b Fp(>)m Fw(D)6 b(a)g(t)g(a)16 + b(\))11 b(\))35 b Fu(f)-10 760 y(\003)q Fw(R)q(1)h(=)45 + b(c)9 b(r)g(e)g(a)g(t)g(e)g(n)g(o)g(d)g(e)14 b(\()8 b(L)-9 + b Fu(\000)-17 b Fp(>)m Fw(D)6 b(a)g(t)g(a)17 b(\))12 + b(;)1 827 y(s)e(p)i(l)f(i)g(t)h(c)e(l)i(o)f(n)g(e)19 + b(\()8 b(L)-10 b Fu(\000)-17 b Fp(>)l Fw(N)t(e)t(x)t(t)18 + b(,)30 b(&)8 b(\()g Fu(\003)g Fw(R)q(1)m(\))-6 b Fu(\000)g + Fp(>)q Fw(N)t(e)t(x)t(t)24 b(,)42 b(R)q(2)11 b(\))h(;)-73 + 893 y Fu(g)38 b Fq(e)10 b(l)g(s)f(e)39 b Fu(f)-10 960 + y(\003)q Fw(R)q(2)d(=)45 b(c)9 b(r)g(e)g(a)g(t)g(e)g(n)g(o)g(d)g(e)14 + b(\()8 b(L)-9 b Fu(\000)-17 b Fp(>)m Fw(D)6 b(a)g(t)g(a)17 + b(\))12 b(;)1 1026 y(s)e(p)i(l)f(i)g(t)h(c)e(l)i(o)f(n)g(e)19 + b(\()8 b(L)-10 b Fu(\000)-17 b Fp(>)l Fw(N)t(e)t(x)t(t)24 + b(,)41 b(R1)9 b(,)30 b(&)8 b(\()g Fu(\003)h Fw(R)q(2)m(\))-6 + b Fu(\000)g Fp(>)r Fw(N)5 b(e)g(x)g(t)17 b(\))12 b(;)-80 + 1093 y Fu(g)q(g)-141 1159 y Fq(i)d(n)g(t)57 b Fw(p)12 + b(r)f(o)h(c)f(e)h(s)f(s)g(l)h(i)f(s)g(t)20 b(\()i(l)13 + b(i)h(s)g(t)20 b Fu(\003)29 b Fw(L)8 b(\))33 b Fu(f)-67 + 1225 y Fw(l)14 b(i)g(s)f(t)43 b Fu(\003)5 b Fw(A)g(,)35 + b Fu(\003)9 b Fw(B)f(,)35 b Fu(\003)13 b Fw(t)t(m)t(p)g(;)-68 + 1358 y Fo(/)g(/)53 b(C)6 b(l)g(o)g(n)g(e)41 b(L)16 b(,)54 + b(s)11 b(p)i(l)f(i)h(t)f(t)h(i)f(n)h(g)53 b(n)6 b(o)g(d)g(e)g(s)51 + b(i)8 b(n)57 b(l)14 b(i)g(s)f(t)49 b(A)12 b(,)46 b(a)t(n)t(d)40 + b(B)9 b(.)-69 1425 y Fw(s)i(p)g(l)g(i)g(t)h(c)f(l)g(o)g(n)g(e)19 + b(\()8 b(L)f(,)29 b(&)5 b(A)s(,)29 b(&)6 b(B)k(\))h(;)-71 + 1491 y(p)f(r)g(o)g(c)g(e)g(s)g(s)g(P)g(o)g(r)g(t)g(i)g(o)g(n)i(\()t(A)e + (\))k(;)90 b Fo(/)12 b(/)55 b(P)8 b(r)g(o)g(c)g(e)g(s)g(s)51 + b(f)14 b(i)f(r)g(s)g(t)63 b(l)13 b(i)h(s)g(t)-71 1557 + y Fw(p)c(r)g(o)g(c)g(e)g(s)g(s)g(P)g(o)g(r)g(t)g(i)g(o)g(n)i(\()6 + b(B)11 b(\))j(;)90 b Fo(/)12 b(/)56 b(p)8 b(r)g(o)g(c)g(e)g(s)g(s)51 + b(s)7 b(e)g(c)g(o)g(n)g(d)53 b(l)14 b(i)g(s)f(t)-68 1690 + y(/)g(/)57 b(f)10 b(r)g(e)f(e)44 b(A)k(l)14 b(i)g(s)f(t)-73 + 1757 y Fq(w)7 b(h)g(i)g(l)g(e)46 b Fw(\()8 b(A)g(\))38 + b Fu(f)j Fw(t)t(m)t(p)e(=)33 b(A)-13 b Fu(\000)c Fp(>)l + Fw(N)5 b(e)g(x)g(t)19 b(;)51 b(f)10 b(r)g(e)g(e)17 b(\()5 + b(A)10 b(\))k(;)38 b(A)33 b(=)39 b(t)t(m)t(p)13 b(;)35 + b Fu(g)-68 1823 y Fo(/)13 b(/)57 b(f)10 b(r)g(e)f(e)44 + b(B)k(l)14 b(i)g(s)f(t)-73 1890 y Fq(w)7 b(h)g(i)g(l)g(e)46 + b Fw(\()10 b(B)f(\))38 b Fu(f)j Fw(t)t(m)t(p)e(=)34 b(B)-11 + b Fu(\000)-17 b Fp(>)l Fw(N)5 b(e)g(x)g(t)19 b(;)51 b(f)10 + b(r)g(e)g(e)17 b(\()7 b(B)k(\))j(;)40 b(B)34 b(=)39 b(t)t(m)t(p)13 + b(;)35 b Fu(g)-150 2022 y(g)297 2139 y Fw(\(a\))15 b(Input)h(C)e + (program)h(manipulating)h(link)o(ed)f(lists)1865 96 y + Fq(s)9 b(t)g(r)g(u)g(c)g(t)59 b Fw(l)14 b(i)f(s)h(t)49 + b Fu(f)g Fw(l)14 b(i)g(s)f(t)42 b Fu(\003)13 b Fw(N)5 + b(e)g(x)g(t)19 b(;)50 b Fq(i)9 b(n)g(t)39 b Fu(\003)13 + b Fw(D)6 b(a)g(t)g(a)17 b(;)38 b Fu(g)12 b Fw(;)1870 + 163 y(l)i(i)f(s)h(t)21 b Fu(\003)37 b Fw(c)9 b(r)g(e)g(a)g(t)g(e)g(n)g + (o)g(d)g(e)15 b(\()f(P)7 b(o)g(o)g(l)35 b Fu(\003)6 b + Fw(P)o(D)11 b(,)51 b Fq(i)9 b(n)g(t)39 b Fu(\003)13 b + Fw(D)6 b(a)g(t)g(a)15 b(\))33 b Fu(f)1939 229 y Fw(l)14 + b(i)g(s)f(t)43 b Fu(\003)6 b Fw(N)o(e)o(w)34 b(=)45 b(p)10 + b(o)g(o)f(l)h(a)g(l)g(l)g(o)f(c)18 b(\()7 b(P)o(D)k(,)51 + b Fq(s)10 b(i)g(z)g(e)g(o)g(f)18 b Fw(\()k(l)14 b(i)g(s)f(t)26 + b(\))13 b(\))g(;)1925 296 y(N)o(e)o(w)-11 b Fu(\000)-17 + b Fp(>)m Fw(D)6 b(a)g(t)g(a)42 b(=)f(D)6 b(a)g(t)g(a)15 + b(;)1933 362 y Fq(r)7 b(e)g(t)g(u)g(r)g(n)40 b Fw(N)o(e)o(w)7 + b(;)1856 428 y Fu(g)1863 495 y Fq(v)g(o)g(i)g(d)52 b + Fw(s)10 b(p)i(l)f(i)g(t)g(c)g(l)h(o)f(n)g(e)19 b(\()c(P)7 + b(o)g(o)g(l)34 b Fu(\003)7 b Fw(PD1)15 b(,)48 b(P)7 b(o)g(o)g(l)35 + b Fu(\003)7 b Fw(PD2)12 b(,)2428 561 y(l)h(i)h(s)g(t)42 + b Fu(\003)7 b Fw(L)13 b(,)54 b(l)14 b(i)g(s)f(t)40 b + Fu(\003)6 b(\003)f Fw(R1)15 b(,)55 b(l)14 b(i)g(s)f(t)39 + b Fu(\003)6 b(\003)g Fw(R)q(2)j(\))34 b Fu(f)1937 628 + y Fq(i)12 b(f)50 b Fw(\()12 b(L)33 b(=)10 b(=)34 b(0)10 + b(\))35 b Fu(f)f(\003)10 b Fw(R)q(1)33 b(=)e Fu(\003)10 + b Fw(R)q(2)39 b(=)h(0)12 b(;)47 b Fq(r)7 b(e)g(t)g(u)g(r)g(n)16 + b Fw(;)35 b Fu(g)1937 694 y Fq(i)12 b(f)50 b Fw(\()21 + b(s)9 b(o)g(m)g(e)p 2235 694 V 37 w(p)g(r)g(e)g(d)g(i)g(c)g(a)g(t)g(e) + 15 b(\()8 b(L)-9 b Fu(\000)-17 b Fp(>)m Fw(D)6 b(a)g(t)g(a)16 + b(\))11 b(\))35 b Fu(f)1996 760 y(\003)q Fw(R)q(1)h(=)45 + b(c)9 b(r)g(e)g(a)g(t)g(e)g(n)g(o)g(d)g(e)14 b(\()9 b(PD1)14 + b(,)41 b(L)-9 b Fu(\000)-17 b Fp(>)m Fw(D)6 b(a)g(t)g(a)17 + b(\))12 b(;)2007 827 y(s)e(p)i(l)f(i)g(t)h(c)f(l)g(o)g(n)g(e)19 + b(\()8 b(PD1)15 b(,)42 b(PD2)15 b(,)41 b(L)-10 b Fu(\000)-17 + b Fp(>)l Fw(N)t(e)t(x)t(t)18 b(,)29 b(&)8 b(\()g Fu(\003)h + Fw(R)q(1)m(\))-6 b Fu(\000)g Fp(>)q Fw(N)t(e)t(x)t(t)24 + b(,)41 b(R)q(2)12 b(\))g(;)1933 893 y Fu(g)38 b Fq(e)10 + b(l)g(s)f(e)39 b Fu(f)1996 960 y(\003)q Fw(R)q(2)d(=)45 + b(c)9 b(r)g(e)g(a)g(t)g(e)g(n)g(o)g(d)g(e)14 b(\()9 b(PD2)14 + b(,)41 b(L)-9 b Fu(\000)-17 b Fp(>)m Fw(D)6 b(a)g(t)g(a)17 + b(\))12 b(;)2007 1026 y(s)e(p)i(l)f(i)g(t)h(c)f(l)g(o)g(n)g(e)19 + b(\()8 b(PD1)15 b(,)42 b(PD2)15 b(,)41 b(L)-10 b Fu(\000)-17 + b Fp(>)l Fw(N)t(e)t(x)t(t)23 b(,)42 b(R1)9 b(,)30 b(&)8 + b(\()g Fu(\003)g Fw(R)q(2)m(\))-6 b Fu(\000)g Fp(>)r + Fw(N)5 b(e)g(x)g(t)18 b(\))12 b(;)1926 1093 y Fu(g)q(g)1865 + 1159 y Fq(i)d(n)g(t)57 b Fw(p)12 b(r)f(o)h(c)f(e)h(s)f(s)g(l)h(i)f(s)g + (t)20 b(\()i(l)13 b(i)h(s)g(t)20 b Fu(\003)29 b Fw(L)8 + b(\))33 b Fu(f)1939 1225 y Fw(l)14 b(i)g(s)f(t)43 b Fu(\003)5 + b Fw(A)g(,)35 b Fu(\003)9 b Fw(B)f(,)35 b Fu(\003)13 + b Fw(t)t(m)t(p)k(;)82 b(P)7 b(o)g(o)g(l)41 b(PD1)15 b(,)41 + b(PD2)11 b(;)1935 1292 y(p)f(o)g(o)g(l)g(c)f(r)h(e)g(a)f(t)h(e)h(\()r + (&)r(PD1)k(,)52 b Fq(s)9 b(i)i(z)e(e)h(o)g(f)19 b Fw(\()i(l)14 + b(i)g(s)f(t)26 b(\))f(,)38 b(8)12 b(\))g(;)1935 1358 + y(p)e(o)g(o)g(l)g(c)f(r)h(e)g(a)f(t)h(e)h(\()r(&)r(PD2)k(,)52 + b Fq(s)9 b(i)i(z)e(e)h(o)g(f)19 b Fw(\()i(l)14 b(i)g(s)f(t)26 + b(\))f(,)38 b(8)12 b(\))g(;)1937 1425 y(s)f(p)g(l)g(i)h(t)f(c)g(l)g(o)g + (n)h(e)g(\()r(&)r(PD1)d(,)30 b(&)8 b(PD2)15 b(,)41 b(L)6 + b(,)29 b(&)6 b(A)s(,)29 b(&)6 b(B)j(\))j(;)1935 1491 + y(p)e(r)g(o)g(c)g(e)g(s)g(s)g(P)g(o)g(r)g(t)g(i)g(o)g(n)i(\()t(A)e(\))k + (;)90 b Fo(/)12 b(/)55 b(P)8 b(r)g(o)g(c)g(e)g(s)g(s)51 + b(f)14 b(i)f(r)g(s)g(t)63 b(l)13 b(i)h(s)g(t)1935 1557 + y Fw(p)c(r)g(o)g(c)g(e)g(s)g(s)g(P)g(o)g(r)g(t)g(i)g(o)g(n)i(\()6 + b(B)11 b(\))j(;)90 b Fo(/)12 b(/)56 b(p)8 b(r)g(o)g(c)g(e)g(s)g(s)51 + b(s)7 b(e)g(c)g(o)g(n)g(d)54 b(l)13 b(i)h(s)f(t)1938 + 1690 y(/)g(/)57 b(f)10 b(r)g(e)f(e)44 b(A)k(l)14 b(i)g(s)f(t)26 + b(:)50 b(t)11 b(h)g(i)g(s)53 b(l)7 b(o)g(o)g(p)54 b(i)10 + b(s)55 b(e)10 b(v)g(e)f(n)h(t)h(u)f(a)g(l)g(l)g(y)54 + b(e)9 b(l)g(i)g(m)g(i)g(n)g(a)g(t)g(e)g(d)1933 1757 y + Fq(w)e(h)g(i)g(l)g(e)46 b Fw(\()8 b(A)g(\))38 b Fu(f)j + Fw(t)t(m)t(p)e(=)33 b(A)-13 b Fu(\000)c Fp(>)l Fw(N)5 + b(e)g(x)g(t)20 b(;)50 b(p)9 b(o)g(o)g(l)g(f)g(r)g(e)g(e)15 + b(\()r(&)r(PD1)g(,)38 b(A)10 b(\))k(;)38 b(A)33 b(=)39 + b(t)t(m)t(p)13 b(;)34 b Fu(g)1938 1823 y Fo(/)13 b(/)57 + b(f)10 b(r)g(e)f(e)44 b(B)k(l)14 b(i)g(s)f(t)60 b(t)11 + b(h)g(i)h(s)52 b(l)7 b(o)g(o)g(p)54 b(i)10 b(s)55 b(e)10 + b(v)g(e)f(n)i(t)f(u)g(a)g(l)g(l)g(y)54 b(e)9 b(l)g(i)g(m)g(i)g(n)g(a)g + (t)g(e)g(d)1933 1890 y Fq(w)e(h)g(i)g(l)g(e)46 b Fw(\()10 + b(B)f(\))38 b Fu(f)j Fw(t)t(m)t(p)e(=)34 b(B)-11 b Fu(\000)-17 + b Fp(>)l Fw(N)5 b(e)g(x)g(t)20 b(;)50 b(p)9 b(o)g(o)g(l)g(f)g(r)g(e)g + (e)15 b(\()r(&)r(PD2)g(,)39 b(B)12 b(\))i(;)40 b(B)34 + b(=)39 b(t)t(m)t(p)13 b(;)34 b Fu(g)1935 1956 y Fw(p)9 + b(o)g(o)g(l)g(d)g(e)g(s)g(t)g(r)g(o)g(y)j(\()r(&)r(PD1)j(\))f(;)51 + b(p)9 b(o)g(o)g(l)g(d)g(e)g(s)g(t)g(r)g(o)g(y)k(\()r(&)r(PD2)i(\))f(;) + 89 b Fo(/)13 b(/)56 b(d)9 b(e)g(s)g(t)g(r)g(o)g(y)52 + b(p)8 b(o)g(o)g(l)g(s)1856 2022 y Fu(g)2254 2139 y Fw(\(b\))15 + b(C)g(code)f(after)h(the)f(basic)g(pool)h(allocation)g(transformation)p + -150 2229 4185 3 v 891 2313 a Fn(Figur)o(e)j(1.)h(Example)g + (illustrating)e(the)h(P)o(ool)h(Allocation)f(T)-6 b(ransf)n(ormation) + -114 2392 y Fy(`pr)m(ocesslist')19 b(copies)g(a)g(list)f(into)h(two)g + (disjoint)g(lists)f(\(based)i(on)f(some)g(pr)m(edicate\),)h(pr)m + (ocesses)g(eac)o(h,)f(then)h(fr)m(ees)f(them.)f(After)g(basic)i(pool)f + (allocation,)h(the)-63 2475 y(ne)o(w)f(lists)g(ar)m(e)g(put)g(in)g + (separ)o(ate)h(pools)f(\()p Fm(P)11 b(D)r Fl(1)20 b Fy(and)f + Fm(P)11 b(D)r Fl(2)p Fy(\))19 b(whic)o(h)h(ar)m(e)f(eac)o(h)h + (contiguous)g(in)f(memory)l(.)g(After)f(subsequent)j(optimization,)e + (the)g(calls)g(to)433 2558 y Fk(poolfree)h Fy(and)g(the)f(loops)g + (containing)i(them)e(ar)m(e)g(r)m(emo)o(ved)i(because)f + Fk(pooldestroy)h Fy(fr)m(ees)e(all)g(pool)g(memory)l(.)225 + 3419 y @beginspecial 35 @llx 35 @lly 214 @urx 237 @ury + 864 @rhi @setspecial + %%BeginDocument: figs/bu.createnode.ps + %!PS-Adobe-2.0 + %%Creator: dot version 1.9 (Thu Feb 13 13:41:01 CST 2003) + %%For: (lattner) Chris Lattner + %%Title: DataStructures + %%Pages: (atend) + %%BoundingBox: 35 35 214 237 + %%EndComments + save + %%BeginProlog + /DotDict 200 dict def + DotDict begin + + /setupLatin1 { + mark + /EncodingVector 256 array def + EncodingVector 0 + + ISOLatin1Encoding 0 255 getinterval putinterval + + EncodingVector + dup 306 /AE + dup 301 /Aacute + dup 302 /Acircumflex + dup 304 /Adieresis + dup 300 /Agrave + dup 305 /Aring + dup 303 /Atilde + dup 307 /Ccedilla + dup 311 /Eacute + dup 312 /Ecircumflex + dup 313 /Edieresis + dup 310 /Egrave + dup 315 /Iacute + dup 316 /Icircumflex + dup 317 /Idieresis + dup 314 /Igrave + dup 334 /Udieresis + dup 335 /Yacute + dup 376 /thorn + dup 337 /germandbls + dup 341 /aacute + dup 342 /acircumflex + dup 344 /adieresis + dup 346 /ae + dup 340 /agrave + dup 345 /aring + dup 347 /ccedilla + dup 351 /eacute + dup 352 /ecircumflex + dup 353 /edieresis + dup 350 /egrave + dup 355 /iacute + dup 356 /icircumflex + dup 357 /idieresis + dup 354 /igrave + dup 360 /dcroat + dup 361 /ntilde + dup 363 /oacute + dup 364 /ocircumflex + dup 366 /odieresis + dup 362 /ograve + dup 365 /otilde + dup 370 /oslash + dup 372 /uacute + dup 373 /ucircumflex + dup 374 /udieresis + dup 371 /ugrave + dup 375 /yacute + dup 377 /ydieresis + + % Set up ISO Latin 1 character encoding + /starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont + } def + /Times-Roman starnetISO def + /Times-Italic starnetISO def + /Times-Bold starnetISO def + /Times-BoldItalic starnetISO def + /Helvetica starnetISO def + /Helvetica-Oblique starnetISO def + /Helvetica-Bold starnetISO def + /Helvetica-BoldOblique starnetISO def + /Courier starnetISO def + /Courier-Oblique starnetISO def + /Courier-Bold starnetISO def + /Courier-BoldOblique starnetISO def + cleartomark + } bind def + + %%BeginResource: procset + /coord-font-family /Times-Roman def + /default-font-family /Times-Roman def + /coordfont coord-font-family findfont 8 scalefont def + + /InvScaleFactor 1.0 def + /set_scale { + dup 1 exch div /InvScaleFactor exch def + dup scale + } bind def + + % styles + /solid { [] 0 setdash } bind def + /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def + /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def + /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def + /bold { 2 setlinewidth } bind def + /filled { } bind def + /unfilled { } bind def + /rounded { } bind def + /diagonals { } bind def + + % hooks for setting color + /nodecolor { sethsbcolor } bind def + /edgecolor { sethsbcolor } bind def + /graphcolor { sethsbcolor } bind def + /nopcolor {pop pop pop} bind def + + /beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if + } bind def + + /set_font { + findfont exch + scalefont setfont + } def + + % draw aligned label in bounding box aligned to current point + /alignedtext { % width adj text + /text exch def + /adj exch def + /width exch def + gsave + width 0 gt { + text stringwidth pop adj mul 0 rmoveto + } if + [] 0 setdash + text show + grestore + } def + + /boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath + } bind def + + /ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix + } bind def + + /endpage { showpage } bind def + /showpage { } def + + /layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] + def + + /layerlen layercolorseq length def + + /setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def + } bind def + + /onlayer { curlayer ne {invis} if } def + + /onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if + } def + + /curlayer 0 def + + %%EndResource + %%EndProlog + %%BeginSetup + 14 default-font-family set_font + 1 setmiterlimit + % /arrowlength 10 def + % /arrowwidth 5 def + + % make sure pdfmark is harmless for PS-interpreters other than Distiller + /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse + % make '<<' and '>>' safe on PS Level 1 devices + /languagelevel where {pop languagelevel}{1} ifelse + 2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put + } if + + %%EndSetup + %%Page: 1 1 + %%PageBoundingBox: 36 36 214 237 + %%PageOrientation: Portrait + gsave + 35 35 179 202 boxprim clip newpath + 36 36 translate + 0 0 1 beginpage + 0 0 translate 0 rotate + 0.000 0.000 0.000 graphcolor + 14.00 /Times-Roman set_font + + % Node0x885f148 + gsave 10 dict begin + newpath 103 8 moveto + 134 8 lineto + stroke + newpath 134 8 moveto + 139 8 146 13 146 19 curveto + stroke + newpath 146 19 moveto + 146 32 lineto + stroke + newpath 146 32 moveto + 146 38 140 44 134 44 curveto + stroke + newpath 134 44 moveto + 103 44 lineto + stroke + newpath 103 44 moveto + 98 44 92 38 92 32 curveto + stroke + newpath 92 32 moveto + 92 19 lineto + stroke + newpath 92 19 moveto + 92 13 97 8 103 8 curveto + stroke + gsave 10 dict begin + 119 21 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x885f180 + gsave 10 dict begin + newpath 49 80 moveto + 92 80 lineto + stroke + newpath 92 80 moveto + 98 80 105 85 105 91 curveto + stroke + newpath 105 91 moveto + 105 107 lineto + stroke + newpath 105 107 moveto + 105 113 98 120 92 120 curveto + stroke + newpath 92 120 moveto + 49 120 lineto + stroke + newpath 49 120 moveto + 43 120 37 114 37 108 curveto + stroke + newpath 37 108 moveto + 37 92 lineto + stroke + newpath 37 92 moveto + 37 86 43 80 49 80 curveto + stroke + gsave 10 dict begin + 71 105 moveto 54 -0.5 (list: HM) alignedtext + end grestore + newpath 37 100 moveto + 105 100 lineto + stroke + gsave 10 dict begin + 54 85 moveto 4 -0.5 ( ) alignedtext + end grestore + newpath 71 80 moveto + 71 100 lineto + stroke + gsave 10 dict begin + 88 85 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x885f180 -> Node0x885f148 + newpath 88 90 moveto + 88 90 98 70 106 53 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 108 54 moveto + 110 44 lineto + 104 52 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x88501d0 + gsave 10 dict begin + 150 100 27 18 ellipse_path + stroke + gsave 10 dict begin + 150 95 moveto 32 -0.5 (Data) alignedtext + end grestore + end grestore + + % Node0x88501d0 -> Node0x885f148 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 141 78 moveto + 138 71 134 62 130 53 curveto + stroke + gsave 10 dict begin + solid + newpath 143 76 moveto + 139 79 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 132 52 moveto + 126 44 lineto + 128 54 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % NodeNew + gsave 10 dict begin + 27 174 27 18 ellipse_path + stroke + gsave 10 dict begin + 27 169 moveto 33 -0.5 (New) alignedtext + end grestore + end grestore + + % NodeNew -> Node0x885f180 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 39 153 moveto + 43 146 49 137 54 129 curveto + stroke + gsave 10 dict begin + solid + newpath 41 154 moveto + 37 151 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 56 130 moveto + 59 120 lineto + 52 128 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % Node0x8850048 + gsave 10 dict begin + 115 174 43 18 ellipse_path + stroke + gsave 10 dict begin + 115 169 moveto 65 -0.5 (returning) alignedtext + end grestore + end grestore + + % Node0x8850048 -> Node0x885f180 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 102 152 moveto + 97 145 92 137 87 128 curveto + stroke + gsave 10 dict begin + solid + newpath 104 150 moveto + 100 153 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 90 128 moveto + 83 120 lineto + 85 130 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + endpage + grestore + %%PageTrailer + %%EndPage: 1 + %%Trailer + %%Pages: 1 + end + restore + %%EOF + + %%EndDocument + @endspecial 160 3502 a Fj(\(a\))28 b(DS)17 b(Graph)g(for)g(createnode) + 1403 3419 y @beginspecial 35 @llx 35 @lly 345 @urx 241 + @ury 864 @rhi @setspecial + %%BeginDocument: figs/bu.splitclone.ps + %!PS-Adobe-2.0 + %%Creator: dot version 1.9 (Thu Feb 13 13:41:01 CST 2003) + %%For: (lattner) Chris Lattner + %%Title: DataStructures + %%Pages: (atend) + %%BoundingBox: 35 35 345 241 + %%EndComments + save + %%BeginProlog + /DotDict 200 dict def + DotDict begin + + /setupLatin1 { + mark + /EncodingVector 256 array def + EncodingVector 0 + + ISOLatin1Encoding 0 255 getinterval putinterval + + EncodingVector + dup 306 /AE + dup 301 /Aacute + dup 302 /Acircumflex + dup 304 /Adieresis + dup 300 /Agrave + dup 305 /Aring + dup 303 /Atilde + dup 307 /Ccedilla + dup 311 /Eacute + dup 312 /Ecircumflex + dup 313 /Edieresis + dup 310 /Egrave + dup 315 /Iacute + dup 316 /Icircumflex + dup 317 /Idieresis + dup 314 /Igrave + dup 334 /Udieresis + dup 335 /Yacute + dup 376 /thorn + dup 337 /germandbls + dup 341 /aacute + dup 342 /acircumflex + dup 344 /adieresis + dup 346 /ae + dup 340 /agrave + dup 345 /aring + dup 347 /ccedilla + dup 351 /eacute + dup 352 /ecircumflex + dup 353 /edieresis + dup 350 /egrave + dup 355 /iacute + dup 356 /icircumflex + dup 357 /idieresis + dup 354 /igrave + dup 360 /dcroat + dup 361 /ntilde + dup 363 /oacute + dup 364 /ocircumflex + dup 366 /odieresis + dup 362 /ograve + dup 365 /otilde + dup 370 /oslash + dup 372 /uacute + dup 373 /ucircumflex + dup 374 /udieresis + dup 371 /ugrave + dup 375 /yacute + dup 377 /ydieresis + + % Set up ISO Latin 1 character encoding + /starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont + } def + /Times-Roman starnetISO def + /Times-Italic starnetISO def + /Times-Bold starnetISO def + /Times-BoldItalic starnetISO def + /Helvetica starnetISO def + /Helvetica-Oblique starnetISO def + /Helvetica-Bold starnetISO def + /Helvetica-BoldOblique starnetISO def + /Courier starnetISO def + /Courier-Oblique starnetISO def + /Courier-Bold starnetISO def + /Courier-BoldOblique starnetISO def + cleartomark + } bind def + + %%BeginResource: procset + /coord-font-family /Times-Roman def + /default-font-family /Times-Roman def + /coordfont coord-font-family findfont 8 scalefont def + + /InvScaleFactor 1.0 def + /set_scale { + dup 1 exch div /InvScaleFactor exch def + dup scale + } bind def + + % styles + /solid { [] 0 setdash } bind def + /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def + /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def + /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def + /bold { 2 setlinewidth } bind def + /filled { } bind def + /unfilled { } bind def + /rounded { } bind def + /diagonals { } bind def + + % hooks for setting color + /nodecolor { sethsbcolor } bind def + /edgecolor { sethsbcolor } bind def + /graphcolor { sethsbcolor } bind def + /nopcolor {pop pop pop} bind def + + /beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if + } bind def + + /set_font { + findfont exch + scalefont setfont + } def + + % draw aligned label in bounding box aligned to current point + /alignedtext { % width adj text + /text exch def + /adj exch def + /width exch def + gsave + width 0 gt { + text stringwidth pop adj mul 0 rmoveto + } if + [] 0 setdash + text show + grestore + } def + + /boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath + } bind def + + /ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix + } bind def + + /endpage { showpage } bind def + /showpage { } def + + /layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] + def + + /layerlen layercolorseq length def + + /setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def + } bind def + + /onlayer { curlayer ne {invis} if } def + + /onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if + } def + + /curlayer 0 def + + %%EndResource + %%EndProlog + %%BeginSetup + 14 default-font-family set_font + 1 setmiterlimit + % /arrowlength 10 def + % /arrowwidth 5 def + + % make sure pdfmark is harmless for PS-interpreters other than Distiller + /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse + % make '<<' and '>>' safe on PS Level 1 devices + /languagelevel where {pop languagelevel}{1} ifelse + 2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put + } if + + %%EndSetup + %%Page: 1 1 + %%PageBoundingBox: 36 36 345 241 + %%PageOrientation: Portrait + gsave + 35 35 310 206 boxprim clip newpath + 36 36 translate + 0 0 1 beginpage + 0 0 translate 0 rotate + 0.000 0.000 0.000 graphcolor + 14.00 /Times-Roman set_font + + % Node0x885d9c8 + gsave 10 dict begin + newpath 229 84 moveto + 260 84 lineto + stroke + newpath 260 84 moveto + 265 84 272 89 272 95 curveto + stroke + newpath 272 95 moveto + 272 111 lineto + stroke + newpath 272 111 moveto + 272 117 266 124 260 124 curveto + stroke + newpath 260 124 moveto + 229 124 lineto + stroke + newpath 229 124 moveto + 224 124 218 118 218 112 curveto + stroke + newpath 218 112 moveto + 218 96 lineto + stroke + newpath 218 96 moveto + 218 90 223 84 229 84 curveto + stroke + gsave 10 dict begin + 245 109 moveto 38 -0.5 (list: R) alignedtext + end grestore + newpath 218 104 moveto + 272 104 lineto + stroke + gsave 10 dict begin + 231 89 moveto 4 -0.5 ( ) alignedtext + end grestore + newpath 245 84 moveto + 245 104 lineto + stroke + gsave 10 dict begin + 258 89 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x885d9c8 -> Node0x885d9c8 + newpath 244 84 moveto + 256 74 277 62 290 75 curveto + 308 93 308 114 290 133 curveto + 283 139 276 137 268 131 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 270 129 moveto + 261 124 lineto + 266 133 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x885efb8 + gsave 10 dict begin + newpath 149 8 moveto + 180 8 lineto + stroke + newpath 180 8 moveto + 185 8 192 13 192 19 curveto + stroke + newpath 192 19 moveto + 192 35 lineto + stroke + newpath 192 35 moveto + 192 41 186 48 180 48 curveto + stroke + newpath 180 48 moveto + 149 48 lineto + stroke + newpath 149 48 moveto + 144 48 138 42 138 36 curveto + stroke + newpath 138 36 moveto + 138 20 lineto + stroke + newpath 138 20 moveto + 138 14 143 8 149 8 curveto + stroke + gsave 10 dict begin + 165 33 moveto 37 -0.5 (int: R) alignedtext + end grestore + newpath 138 28 moveto + 192 28 lineto + stroke + gsave 10 dict begin + 165 13 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x885d9c8 -> Node0x885efb8 + newpath 258 94 moveto + 258 94 228 73 201 54 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 202 51 moveto + 192 48 lineto + 199 56 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x88616d8 + gsave 10 dict begin + newpath 22 84 moveto + 65 84 lineto + stroke + newpath 65 84 moveto + 71 84 78 89 78 95 curveto + stroke + newpath 78 95 moveto + 78 111 lineto + stroke + newpath 78 111 moveto + 78 117 71 124 65 124 curveto + stroke + newpath 65 124 moveto + 22 124 lineto + stroke + newpath 22 124 moveto + 16 124 10 118 10 112 curveto + stroke + newpath 10 112 moveto + 10 96 lineto + stroke + newpath 10 96 moveto + 10 90 16 84 22 84 curveto + stroke + gsave 10 dict begin + 44 109 moveto 54 -0.5 (list: HM) alignedtext + end grestore + newpath 10 104 moveto + 78 104 lineto + stroke + gsave 10 dict begin + 27 89 moveto 4 -0.5 ( ) alignedtext + end grestore + newpath 44 84 moveto + 44 104 lineto + stroke + gsave 10 dict begin + 61 89 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x88616d8 -> Node0x885efb8 + newpath 61 94 moveto + 61 94 114 62 133 51 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 131 55 moveto + 138 48 lineto + 128 51 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x88616d8 -> Node0x88616d8 + newpath 40 84 moveto + 56 73 81 60 96 75 curveto + 114 93 114 114 96 133 curveto + 89 140 79 137 70 130 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 71 128 moveto + 62 124 lineto + 69 132 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x8861630 + gsave 10 dict begin + newpath 126 84 moveto + 169 84 lineto + stroke + newpath 169 84 moveto + 175 84 182 89 182 95 curveto + stroke + newpath 182 95 moveto + 182 111 lineto + stroke + newpath 182 111 moveto + 182 117 175 124 169 124 curveto + stroke + newpath 169 124 moveto + 126 124 lineto + stroke + newpath 126 124 moveto + 120 124 114 118 114 112 curveto + stroke + newpath 114 112 moveto + 114 96 lineto + stroke + newpath 114 96 moveto + 114 90 120 84 126 84 curveto + stroke + gsave 10 dict begin + 148 109 moveto 54 -0.5 (list: HM) alignedtext + end grestore + newpath 114 104 moveto + 182 104 lineto + stroke + gsave 10 dict begin + 131 89 moveto 4 -0.5 ( ) alignedtext + end grestore + newpath 148 84 moveto + 148 104 lineto + stroke + gsave 10 dict begin + 165 89 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x8861630 -> Node0x885efb8 + newpath 165 94 moveto + 165 94 165 76 165 59 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 168 58 moveto + 165 48 lineto + 163 58 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x8861630 -> Node0x8861630 + newpath 144 84 moveto + 159 73 185 60 200 75 curveto + 218 93 218 114 200 133 curveto + 192 140 183 137 174 130 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 175 128 moveto + 166 124 lineto + 173 132 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x88504c0 + gsave 10 dict begin + 245 178 27 18 ellipse_path + stroke + gsave 10 dict begin + 245 173 moveto 10 -0.5 (L) alignedtext + end grestore + end grestore + + % Node0x88504c0 -> Node0x885d9c8 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 245 155 moveto + 245 148 245 141 245 133 curveto + stroke + gsave 10 dict begin + solid + newpath 248 155 moveto + 243 155 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 248 134 moveto + 245 124 lineto + 243 134 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % Node0x8850508 + gsave 10 dict begin + 131 178 27 18 ellipse_path + stroke + gsave 10 dict begin + 131 173 moveto 17 -0.5 (R1) alignedtext + end grestore + end grestore + + % Node0x8850508 -> Node0x8861630 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 131 155 moveto + 131 142 131 125 131 113 curveto + stroke + gsave 10 dict begin + solid + newpath 134 155 moveto + 129 155 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 134 114 moveto + 131 104 lineto + 129 114 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % Node0x8850550 + gsave 10 dict begin + 27 178 27 18 ellipse_path + stroke + gsave 10 dict begin + 27 173 moveto 20 -0.5 (R2) alignedtext + end grestore + end grestore + + % Node0x8850550 -> Node0x88616d8 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 27 155 moveto + 27 142 27 125 27 113 curveto + stroke + gsave 10 dict begin + solid + newpath 30 155 moveto + 25 155 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 30 114 moveto + 27 104 lineto + 25 114 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + endpage + grestore + %%PageTrailer + %%EndPage: 1 + %%Trailer + %%Pages: 1 + end + restore + %%EOF + + %%EndDocument + @endspecial 1575 3502 a(\(b\))27 b(DS)17 b(Graph)h(for)f(splitclone) + 2781 3419 y @beginspecial 35 @llx 35 @lly 359 @urx 241 + @ury 864 @rhi @setspecial + %%BeginDocument: figs/bu.processlist.ps + %!PS-Adobe-2.0 + %%Creator: dot version 1.9 (Thu Feb 13 13:41:01 CST 2003) + %%For: (lattner) Chris Lattner + %%Title: DataStructures + %%Pages: (atend) + %%BoundingBox: 35 35 359 241 + %%EndComments + save + %%BeginProlog + /DotDict 200 dict def + DotDict begin + + /setupLatin1 { + mark + /EncodingVector 256 array def + EncodingVector 0 + + ISOLatin1Encoding 0 255 getinterval putinterval + + EncodingVector + dup 306 /AE + dup 301 /Aacute + dup 302 /Acircumflex + dup 304 /Adieresis + dup 300 /Agrave + dup 305 /Aring + dup 303 /Atilde + dup 307 /Ccedilla + dup 311 /Eacute + dup 312 /Ecircumflex + dup 313 /Edieresis + dup 310 /Egrave + dup 315 /Iacute + dup 316 /Icircumflex + dup 317 /Idieresis + dup 314 /Igrave + dup 334 /Udieresis + dup 335 /Yacute + dup 376 /thorn + dup 337 /germandbls + dup 341 /aacute + dup 342 /acircumflex + dup 344 /adieresis + dup 346 /ae + dup 340 /agrave + dup 345 /aring + dup 347 /ccedilla + dup 351 /eacute + dup 352 /ecircumflex + dup 353 /edieresis + dup 350 /egrave + dup 355 /iacute + dup 356 /icircumflex + dup 357 /idieresis + dup 354 /igrave + dup 360 /dcroat + dup 361 /ntilde + dup 363 /oacute + dup 364 /ocircumflex + dup 366 /odieresis + dup 362 /ograve + dup 365 /otilde + dup 370 /oslash + dup 372 /uacute + dup 373 /ucircumflex + dup 374 /udieresis + dup 371 /ugrave + dup 375 /yacute + dup 377 /ydieresis + + % Set up ISO Latin 1 character encoding + /starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont + } def + /Times-Roman starnetISO def + /Times-Italic starnetISO def + /Times-Bold starnetISO def + /Times-BoldItalic starnetISO def + /Helvetica starnetISO def + /Helvetica-Oblique starnetISO def + /Helvetica-Bold starnetISO def + /Helvetica-BoldOblique starnetISO def + /Courier starnetISO def + /Courier-Oblique starnetISO def + /Courier-Bold starnetISO def + /Courier-BoldOblique starnetISO def + cleartomark + } bind def + + %%BeginResource: procset + /coord-font-family /Times-Roman def + /default-font-family /Times-Roman def + /coordfont coord-font-family findfont 8 scalefont def + + /InvScaleFactor 1.0 def + /set_scale { + dup 1 exch div /InvScaleFactor exch def + dup scale + } bind def + + % styles + /solid { [] 0 setdash } bind def + /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def + /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def + /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def + /bold { 2 setlinewidth } bind def + /filled { } bind def + /unfilled { } bind def + /rounded { } bind def + /diagonals { } bind def + + % hooks for setting color + /nodecolor { sethsbcolor } bind def + /edgecolor { sethsbcolor } bind def + /graphcolor { sethsbcolor } bind def + /nopcolor {pop pop pop} bind def + + /beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if + } bind def + + /set_font { + findfont exch + scalefont setfont + } def + + % draw aligned label in bounding box aligned to current point + /alignedtext { % width adj text + /text exch def + /adj exch def + /width exch def + gsave + width 0 gt { + text stringwidth pop adj mul 0 rmoveto + } if + [] 0 setdash + text show + grestore + } def + + /boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath + } bind def + + /ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix + } bind def + + /endpage { showpage } bind def + /showpage { } def + + /layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] + def + + /layerlen layercolorseq length def + + /setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def + } bind def + + /onlayer { curlayer ne {invis} if } def + + /onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if + } def + + /curlayer 0 def + + %%EndResource + %%EndProlog + %%BeginSetup + 14 default-font-family set_font + 1 setmiterlimit + % /arrowlength 10 def + % /arrowwidth 5 def + + % make sure pdfmark is harmless for PS-interpreters other than Distiller + /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse + % make '<<' and '>>' safe on PS Level 1 devices + /languagelevel where {pop languagelevel}{1} ifelse + 2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put + } if + + %%EndSetup + %%Page: 1 1 + %%PageBoundingBox: 36 36 359 241 + %%PageOrientation: Portrait + gsave + 35 35 324 206 boxprim clip newpath + 36 36 translate + 0 0 1 beginpage + 0 0 translate 0 rotate + 0.000 0.000 0.000 graphcolor + 14.00 /Times-Roman set_font + + % Node0x885da00 + gsave 10 dict begin + newpath 160 8 moveto + 191 8 lineto + stroke + newpath 191 8 moveto + 196 8 203 13 203 19 curveto + stroke + newpath 203 19 moveto + 203 35 lineto + stroke + newpath 203 35 moveto + 203 41 197 48 191 48 curveto + stroke + newpath 191 48 moveto + 160 48 lineto + stroke + newpath 160 48 moveto + 155 48 149 42 149 36 curveto + stroke + newpath 149 36 moveto + 149 20 lineto + stroke + newpath 149 20 moveto + 149 14 154 8 160 8 curveto + stroke + gsave 10 dict begin + 176 33 moveto 37 -0.5 (int: R) alignedtext + end grestore + newpath 149 28 moveto + 203 28 lineto + stroke + gsave 10 dict begin + 176 13 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x885edb0 + gsave 10 dict begin + newpath 11 84 moveto + 67 84 lineto + stroke + newpath 67 84 moveto + 74 84 80 89 80 95 curveto + stroke + newpath 80 95 moveto + 80 111 lineto + stroke + newpath 80 111 moveto + 80 117 74 124 68 124 curveto + stroke + newpath 68 124 moveto + 12 124 lineto + stroke + newpath 12 124 moveto + 5 124 0 118 0 112 curveto + stroke + newpath 0 112 moveto + 0 96 lineto + stroke + newpath 0 96 moveto + 0 90 5 84 11 84 curveto + stroke + gsave 10 dict begin + 40 109 moveto 66 -0.5 (list: HMR) alignedtext + end grestore + newpath 0 104 moveto + 80 104 lineto + stroke + gsave 10 dict begin + 20 89 moveto 4 -0.5 ( ) alignedtext + end grestore + newpath 40 84 moveto + 40 104 lineto + stroke + gsave 10 dict begin + 60 89 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x885edb0 -> Node0x885da00 + newpath 60 94 moveto + 60 94 123 62 144 51 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 142 55 moveto + 149 48 lineto + 139 51 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x885edb0 -> Node0x885edb0 + newpath 34 84 moveto + 51 72 81 57 98 75 curveto + 117 93 117 114 98 133 curveto + 89 142 78 138 67 130 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 68 128 moveto + 59 124 lineto + 66 132 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x885ed78 + gsave 10 dict begin + newpath 127 84 moveto + 183 84 lineto + stroke + newpath 183 84 moveto + 190 84 196 89 196 95 curveto + stroke + newpath 196 95 moveto + 196 111 lineto + stroke + newpath 196 111 moveto + 196 117 190 124 184 124 curveto + stroke + newpath 184 124 moveto + 128 124 lineto + stroke + newpath 128 124 moveto + 121 124 116 118 116 112 curveto + stroke + newpath 116 112 moveto + 116 96 lineto + stroke + newpath 116 96 moveto + 116 90 121 84 127 84 curveto + stroke + gsave 10 dict begin + 156 109 moveto 66 -0.5 (list: HMR) alignedtext + end grestore + newpath 116 104 moveto + 196 104 lineto + stroke + gsave 10 dict begin + 136 89 moveto 4 -0.5 ( ) alignedtext + end grestore + newpath 156 84 moveto + 156 104 lineto + stroke + gsave 10 dict begin + 176 89 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x885ed78 -> Node0x885da00 + newpath 176 94 moveto + 176 94 176 76 176 59 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 179 58 moveto + 176 48 lineto + 174 58 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x885ed78 -> Node0x885ed78 + newpath 149 84 moveto + 167 72 196 57 214 75 curveto + 232 93 232 114 214 133 curveto + 205 142 193 138 183 130 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 184 128 moveto + 175 124 lineto + 182 132 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x885ed40 + gsave 10 dict begin + newpath 243 84 moveto + 274 84 lineto + stroke + newpath 274 84 moveto + 279 84 286 89 286 95 curveto + stroke + newpath 286 95 moveto + 286 111 lineto + stroke + newpath 286 111 moveto + 286 117 280 124 274 124 curveto + stroke + newpath 274 124 moveto + 243 124 lineto + stroke + newpath 243 124 moveto + 238 124 232 118 232 112 curveto + stroke + newpath 232 112 moveto + 232 96 lineto + stroke + newpath 232 96 moveto + 232 90 237 84 243 84 curveto + stroke + gsave 10 dict begin + 259 109 moveto 38 -0.5 (list: R) alignedtext + end grestore + newpath 232 104 moveto + 286 104 lineto + stroke + gsave 10 dict begin + 245 89 moveto 4 -0.5 ( ) alignedtext + end grestore + newpath 259 84 moveto + 259 104 lineto + stroke + gsave 10 dict begin + 272 89 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x885ed40 -> Node0x885da00 + newpath 272 94 moveto + 272 94 240 73 211 54 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 212 52 moveto + 203 48 lineto + 210 56 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x885ed40 -> Node0x885ed40 + newpath 258 84 moveto + 270 74 291 62 304 75 curveto + 322 93 322 114 304 133 curveto + 297 139 290 137 282 131 curveto + stroke + gsave 10 dict begin + solid + 0.000 0.000 0.000 edgecolor + newpath 284 129 moveto + 275 124 lineto + 280 133 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + end grestore + + % Node0x8850ae8 + gsave 10 dict begin + 259 178 27 18 ellipse_path + stroke + gsave 10 dict begin + 259 173 moveto 10 -0.5 (L) alignedtext + end grestore + end grestore + + % Node0x8850ae8 -> Node0x885ed40 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 259 155 moveto + 259 148 259 141 259 133 curveto + stroke + gsave 10 dict begin + solid + newpath 262 155 moveto + 257 155 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 262 134 moveto + 259 124 lineto + 257 134 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % Node0x88545f8 + gsave 10 dict begin + 40 178 27 18 ellipse_path + stroke + gsave 10 dict begin + 40 173 moveto 13 -0.5 (A) alignedtext + end grestore + end grestore + + % Node0x88545f8 -> Node0x885edb0 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 40 155 moveto + 40 148 40 141 40 133 curveto + stroke + gsave 10 dict begin + solid + newpath 43 155 moveto + 38 155 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 43 134 moveto + 40 124 lineto + 38 134 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % Node0x8854638 + gsave 10 dict begin + 156 178 27 18 ellipse_path + stroke + gsave 10 dict begin + 156 173 moveto 11 -0.5 (B) alignedtext + end grestore + end grestore + + % Node0x8854638 -> Node0x885ed78 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 156 155 moveto + 156 148 156 141 156 133 curveto + stroke + gsave 10 dict begin + solid + newpath 159 155 moveto + 154 155 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 159 134 moveto + 156 124 lineto + 154 134 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + endpage + grestore + %%PageTrailer + %%EndPage: 1 + %%Trailer + %%Pages: 1 + end + restore + %%EOF + + %%EndDocument + @endspecial 2967 3502 a(\(c\))28 b(DS)17 b(Graph)g(for)g(processlist)p + -150 3594 V 1148 3679 a Fn(Figur)o(e)h(2.)h Fz(B)o(U)g(DSGraphs)g(for)g + (functions)g(in)g(Figure)g(1)g(\(a\))-150 3845 y FA(2.)91 + b(Backgr)n(ound:)21 b(P)n(oints-T)-8 b(o)22 b(Graph)f(&)i(Example)-150 + 3961 y Fz(In)h(this)g(section,)h(we)f(brie\003y)g(introduce)h(the)f + (running)i(e)o(xample)f(used)g(by)-150 4044 y(this)19 + b(paper)i(and)f(specify)g(the)g(points-to)g(graph)h(representation)f + (and)h(prop-)-150 4127 y(erties)15 b(that)h(are)f(used)i(by)f(our)g + (description)g(of)g(Automatic)g(Pool)f(Allocation)-150 + 4210 y(and)26 b(its)f(optimizations.)g(Figure)g(1\(a\))h(sho)n(ws)g + (the)f(running)h(e)o(xample)g(we)-150 4293 y(use)h(to)f(illustrate)g + (the)g(pool)i(allocation)e(transformation.)h(This)f(program)-150 + 4376 y(fragment)c(tra)o(v)o(erses)g(an)g(input)g(list)f(\()p + Fm(L)p Fz(\),)h(creating)g(tw)o(o)g(ne)n(w)g(lists)g(\()p + Fm(A)f Fz(and)-150 4459 y Fm(B)t Fz(\))i(based)i(on)g(the)f(input)g + (list,)f(processes)i(the)f(ne)n(w)g(lists)f(separately)-5 + b(,)25 b(and)-150 4542 y(\002nally)19 b(deallocates)g(them.)-50 + 4625 y(Automatic)i(Pool)g(Allocation)h(is)f(dri)n(v)o(en)h(by)g(a)f + (points-to)h(graph)g(com-)-150 4708 y(puted)f(by)h(some)f(pointer)g + (analysis)g(that)g(uses)g(an)g(e)o(xplicit)f(representation)-150 + 4791 y(of)26 b(memory)g([27)q(].)e(In)i(our)g(implementation,)g(we)g + (use)g(an)f(algorithm)h(we)-150 4874 y(call)17 b(Data)f(Structure)h + (Analysis)g(\(DSA\))f([32])h(to)g(compute)h(these)f(points-to)-150 + 4957 y(graphs.)22 b(DSA)f(is)f Fy(conte)o(xt-sensitive)i + Fz(\(both)g(in)f(its)g(analysis)h(and)g(in)f(that)g(it)-150 + 5040 y(distinguishes)26 b(heap)g(and)g(stack)f(objects)h(by)f(entire)g + (ac)o(yclic)h(call)e(paths\),)-150 5123 y Fy(uni\002cation-based)p + Fz(,)30 b(and)f Fy(\002eld-sensitive)p Fz(,)f(and)h(we)f(belie)n(v)o(e) + g(these)h(prop-)-150 5206 y(erties)e(are)g(important)g(for)g(pool)h + (allocation)g(for)f(the)g(reasons)h(e)o(xplained)-150 + 5289 y(belo)n(w)-5 b(.)25 b(W)-6 b(e)24 b(ha)o(v)o(e)i(sho)n(wn)f(that) + g(DSA)f(is)h(both)g(e)o(xtremely)g(f)o(ast)g(and)g(scal-)-150 + 5372 y(able)18 b(\(it)f(can)h(analyze)h(programs)g(of)f(220K)g(lines)g + (of)g(code)g(lik)o(e)g(176.gcc)h(in)2042 3845 y(under)k(2)f(seconds)h + ([32)q(]\),)e(and)h(requires)h(a)f(small)f(fraction)i(of)f(the)g + (compi-)2042 3928 y(lation)d(time)f(tak)o(en)i(by)f(\223)p + Fs(gcc)40 b(-O3)p Fz(.)-5 b(\224)2141 4011 y Fn(Context-sensiti)o(v)o + (e)39 b Fz(naming)f(of)h(heap)f(objects)h(by)f(\(ac)o(yclic\))g(call) + 2042 4094 y(paths)18 b(is)g(required)h(to)f(distinguish)h(data)f + (structure)g(instances)h(that)f(may)h(be)2042 4177 y(created,)g + (processed,)i(or)e(destro)o(yed)i(by)f(calling)g(common)h(functions.)f + (F)o(or)2042 4260 y(e)o(xample,)c(this)f(property)i(enables)g(DSA)e(to) + g(determine)i(that)e(lists)g Fm(A)g Fz(and)h Fm(B)2042 + 4343 y Fz(are)21 b(disjoint)g(in)h(Figure)f(1\(a\))g(e)n(v)o(en)h + (though)h(their)e(nodes)h(are)g(allocated)f(at)2042 4426 + y(a)h(common)i(allocation)f(site,)f(enabling)i(pool)f(allocation)g(to)g + (assign)g(them)2042 4509 y(to)i(distinct)g(pools.)h(W)m(ith)e(less)i + (or)f(no)h(conte)o(xt-sensiti)n(vity)g(\(e.g.,)e(if)h(heap)2042 + 4592 y(objects)18 b(were)f(distinguished)i(only)f(by)g(allocation)g + (site\),)f(such)h(data)g(struc-)2042 4675 y(tures)h(w)o(ould)g(not)h + (be)f(se)o(gre)o(gated)g(into)g(distinct)g(pools.)2141 + 4758 y(A)i Fn(uni\002cation-based)e Fz(pointer)j(analysis)g([43])f(mer) + o(ges)h(the)f(potential)2042 4841 y(tar)o(gets)i(of)g(a)g(pointer)h + (into)f(a)g(single)g(set)g(of)g(objects)h(,)f(yielding)h(a)f(points-) + 2042 4924 y(to)h(graph)i(where)e(e)n(v)o(ery)i(pointer)e(v)n(ariable)i + (or)e(pointer)h(\002eld)f(points)h(to)f(at)2042 5007 + y(most)g(one)h(node.)g(W)-6 b(e)24 b(use)h(a)g(uni\002cation-based)g + (approach)h(for)f(tw)o(o)f(rea-)2042 5090 y(sons.)d(First,)f(as)h(we)h + (ar)o(gued)g(in)f([32],)g(it)f(is)h(crucial)h(to)f(making)h(DSA)e(both) + 2042 5173 y(e)o(xtremely)h(f)o(ast)g(and)g(scalable)g(despite)g + (distinguishing)h(memory)g(objects)2042 5256 y(by)e(call)g(paths.)g + (Second,)h(it)e(greatly)i(simpli\002es)e(Automatic)h(Pool)g(Alloca-) + 2042 5339 y(tion)k(because)i(it)d(ensures)i(that)g(e)n(v)o(ery)g + (pointer)f(points)h(to)f(a)h(unique)g(node)2042 5422 + y(and)18 b(hence)h(a)e(unique)i(pool.)f(Pool)f(allocation)h(without)g + (uni\002cation)g(w)o(ould)p eop end + %%Page: 4 4 + TeXDict begin 4 3 bop -150 66 a Fz(require)20 b(a)f(mechanism)h + (\(e.g.,)f(\223f)o(at)g(pointers\224\))h(to)f(track)g(the)h(pool)f + (pointed)-150 149 y(to)27 b(by)g(each)g(pointer)g(v)n(alue)g(at)g(run)g + (time,)f(which)h(is)f(signi\002cantly)h(more)-150 232 + y(comple)o(x)19 b(and)g(can)f(hurt)g(both)h(performance)g(and)g + (compatibility)g(with)e(e)o(x-)-150 315 y(ternal)29 b(libraries.)f + (Furthermore,)h(there)h(is)e(some)i(e)n(vidence)g(that)f(adding)-150 + 399 y(conte)o(xt-sensiti)n(vity)19 b(substantially)g(reduces)h(the)e + (precision)h(adv)n(antage)h(of)-150 482 y(subset-based)g(o)o(v)o(er)g + (uni\002cation-based)g(algorithms)f([36)q(,)f(16)q(,)g(32)q(].)-50 + 565 y(A)30 b Fn(\002eld-sensiti)o(v)o(e)g Fz(pointer)h(analysis)h + (distinguishes)g(the)f(tar)o(gets)f(of)-150 648 y(distinct)e(pointer)h + (\002elds)f(within)g(a)g(record.)h(This)e(is)h(important)h(in)f(prac-) + -150 731 y(tice)20 b(for)h(pool)g(allocation)g(with)f(a)g + (uni\002cation-based)i(algorithm)f(because)-150 814 y(mer)o(ging)e(the) + f(tar)o(gets)g(of)g(unrelated)i(pointer)e(\002elds)g(in)g(a)h(node)g(w) + o(ould)g(lose)-150 897 y(most)k(of)g(the)h(internal)f(structural)g + (information)h(for)f(multi-le)n(v)o(el)f(pointer)o(-)-150 + 980 y(based)29 b(data)g(structures.)f(DSA)g(is)g(\002eld-sensiti)n(v)o + (e)g(for)h(memory)g(objects)-150 1063 y(that)23 b(are)g(accessed)i(in)e + (a)g(type-consistent)h(w)o(ay)-5 b(,)24 b(a)f(property)h(which)g(it)f + (in-)-150 1146 y(fers)c(during)g(the)g(analysis.)-50 + 1229 y(While)39 b(we)g(used)i(DSA)d(in)i(our)g(w)o(ork,)g(we)f(kno)n(w) + i(se)n(v)o(eral)f(other)-150 1312 y(conte)o(xt-sensiti)n(v)o(e)21 + b(analyses)f([20)q(,)f(37)q(,)g(10)q(,)g(38])h(which)g(pro)o(vide)g + (all)g(of)f(the)-150 1395 y(properties)24 b(required)h(by)g(the)f + (transformation)g(or)g(could)h(be)f(e)o(xtended)h(to)-150 + 1478 y(do)20 b(so.)g(W)-6 b(e)19 b(describe)i(the)f(properties)g(of)g + (the)g(points-to)h(graphs)f(and)h(other)-150 1561 y(information)16 + b(required)h(by)f(the)g(Automatic)g(Pool)f(Allocation)h(transforma-) + -150 1644 y(tion)j(belo)n(w)-5 b(.)-150 1814 y Fn(2.1)75 + b(P)o(oints-to)18 b(Graph)g(Assumptions)-150 1930 y Fz(This)d(section)g + (describes)h(the)g(properties)g(of)f(the)g(points-to)h(graphs)g(used)g + (by)-150 2013 y(Automatic)k(Pool)g(Allocation,)g(which)g(we)g(term)f + (Data)h(Structure)f(\(or)h(DS\))-150 2096 y(Graphs.)j(A)f(DS)g(graph)h + (is)f(a)g(compile-time)h(description)g(of)g(the)f(memory)-150 + 2180 y(objects)h(created)f(by)h(a)f(function)i(or)e(program)h(and)g + (their)f(points-to)h(prop-)-150 2263 y(erties.)f(W)-6 + b(e)22 b(assume)i(that)e(a)h(DS)f(graph)h(is)g(computed)h(for)e(each)i + (function,)-150 2346 y(representing)j(the)e(memory)h(objects)g + (reachable)h(from)e(v)n(ariables)h(in)f(that)-150 2429 + y(function)19 b(or)g(from)g(global)g(v)n(ariables.)g(F)o(or)f + (reference,)h(Figure)f(2)h(sho)n(w)g(the)-150 2512 y(graphs)h(computed) + g(by)g(DSA)e(for)h(the)g(functions)g(in)g(the)g(e)o(xample.)-50 + 2595 y(F)o(ormally)-5 b(,)32 b(a)h Fn(DS)g(Graph)g Fz(is)f(a)i + (directed)f(multi-graph,)h(where)f(the)-150 2678 y(nodes)20 + b(and)g(edges)f(are)g(de\002ned)h(as)f(follo)n(ws:)-50 + 2761 y Fn(DS)j(Node:)h Fz(A)f(DS)g(node)i(is)f(a)g(5-tuple)g + Fi(f)p Fm(\034)t(;)14 b(F)r(;)f(M)t(;)g(A;)g(G)p Fi(g)p + Fz(.)23 b Fm(\034)31 b Fz(is)23 b(some)-150 2844 y + (\(program-de\002ned\))h(scalar)m(,)d(array)-5 b(,)22 + b(record)h(or)f(function)h(type,)f(or)g Fi(?)f Fz(rep-)-150 + 2927 y(resenting)f(an)f(unkno)n(wn)i(type.)e(In)g(the)g + (transformation,)h Fi(?)e Fz(is)h(treated)g(lik)o(e)-150 + 3010 y(an)h(unkno)n(wn-size)i(array)d(of)h(bytes)g(\(the)g + Fm(A)f Fz(\003ag,)g(described)h(belo)n(w)-5 b(,)20 b(is)g(set)-150 + 3093 y(to)g(true)f(when)h Fm(\034)31 b Fl(=)23 b Fi(?)p + Fz(\).)c Fm(F)30 b Fz(is)19 b(an)h(array)g(of)f(\002elds,)g(one)i(for)e + (each)i(possible)-150 3176 y(\002eld)j(of)g(the)g(type)h + Fm(\034)9 b Fz(.)23 b(Scalar)h(types)g(and)h Fi(?)f Fz(ha)o(v)o(e)h(a)f + (single)g(\002eld,)g(record)-150 3259 y(types)i(ha)o(v)o(e)g(a)f + (\002eld)h(for)f(each)h(element)g(of)g(the)g(record,)f(array)h(types)g + (are)-150 3342 y(treated)h(as)g(their)f(element)h(type)g(\(i.e.)f + (array)h(inde)o(xing)h(is)e(ignored\),)i(and)-150 3425 + y(functions)e(do)f(not)g(ha)o(v)o(e)g(\002elds.)f Fm(M)33 + b Fz(is)24 b(a)h(set)f(of)h(memory)h(classes,)e(writ-)-150 + 3508 y(ten)18 b(as)g(a)g(subset)g(of)g Fi(f)p Fn(H)p + Fm(;)13 b Fn(S)p Fm(;)g Fn(G)p Fm(;)g Fn(U)p Fi(g)p Fz(,)18 + b(indicating)g(Heap,)g(Stack,)g(Global)g(and)-150 3591 + y(Unkno)n(wn)28 b(memory)f(objects)g(respecti)n(v)o(ely)g(\(multiple)f + (\003ags)g(can)h(be)g(set)-150 3674 y(on)21 b(one)g(node)h(due)f(to)f + (the)h(use)g(of)g(uni\002cation\).)f(A)g(node)i(with)e + Fn(U)k Fi(2)h Fm(M)k Fz(is)-150 3757 y(assigned)22 b(type)g + Fi(?)p Fz(.)f(Finally)-5 b(,)21 b(if)f Fn(G)27 b Fi(2)f + Fm(M)8 b Fz(,)21 b(then)h Fm(G)f Fz(is)g(a)g(non-empty)i(set)e(of)-150 + 3840 y(global)d(v)n(ariables)g(and)g(functions)h(included)f(in)g(the)f + (objects)h(for)f(this)h(node;)-150 3923 y(otherwise,)25 + b Fm(G)h Fz(is)f(empty)-5 b(.)25 b Fm(A)g Fz(is)g(a)h(boolean)g(that)f + (is)g(true)h(if)f(the)g(node)i(in-)-150 4006 y(cludes)c(an)g(array)g + (object.)g(Finally)-5 b(,)22 b(though)h(this)g(paper)g(does)g(not)g + (use)g(the)-150 4089 y(information,)d(DSA)g(also)g(infers)g(Mod)h(and)g + (Ref)e(information,)i(which)f(are)-150 4172 y(sho)n(wn)g(as)f(\223)p + Fn(M)p Fz(\224)f(and)i(\223)p Fn(R)p Fz(\224)f(in)g(the)g(\002gures.) + -50 4255 y Fn(DS)30 b(Edge:)g Fz(A)g(DS)g(edge)i(is)e(a)h(4-tuple)g + Fi(f)p Fm(s;)13 b(f)1206 4263 y Fh(s)1240 4255 y Fm(;)g(t;)g(f)1373 + 4263 y Fh(t)1401 4255 y Fi(g)p Fz(.)30 b Fm(s)h Fz(and)g + Fm(t)f Fz(are)-150 4338 y(DS)36 b(nodes,)h(while)f Fm(f)450 + 4346 y Fh(s)520 4338 y Fz(and)h Fm(f)701 4346 y Fh(t)766 + 4338 y Fz(are)g(\002elds)f(of)g Fm(s)g Fz(and)i Fm(t)e + Fz(respecti)n(v)o(ely)-5 b(.)-150 4421 y(Thus,)21 b(the)f(graph)i(pro)o + (vides)g(a)f(\002eld-sensiti)n(v)o(e)f(representation)i(of)f(points-) + -150 4504 y(to)26 b(information.)g(A)g(\002eld)g(of)g(a)g(node)h(may)f + (lack)g(an)h(outgoing)g(DS)e(edge)-150 4587 y(only)32 + b(if)e(the)h(\002eld)g(is)g(kno)n(wn)h(not)f(to)g(contain)h(a)f + (pointer)g(type,)g(e.g.,)g(if)-150 4670 y(the)h(node)h(represents)f(a)g + (function)g(\(the)g(function)h(itself)e(doesn')o(t)h(point)-150 + 4753 y(to)e(an)o(ything)i(else\),)e(is)g(a)h(\003oating)f(point)h(or)g + (small)f(inte)o(ger)h(type,)f(or)h(if)-150 4836 y Fm(M)j + Fl(=)25 b Fi(f)p Fn(U)p Fi(g)p Fz(.)c(In)g(this)g(paper)m(,)g(we)g(use) + g(the)g(notation)h(\223N\()p Fm(ptr)r Fz(\)\224)e(to)h(indicate)-150 + 4919 y(the)e(node)h(which)f(the)g(scalar)g(pointer)g + Fm(ptr)h Fz(points)g(to.)-50 5002 y(Figure)h(2\(b\))g(sho)n(ws)h(the)f + (DS)g(graph)h(computed)h(by)e(our)h(compiler)f(for)-150 + 5085 y(function)g Fs(splitclone)h Fz(of)e(the)f(e)o(xample.)i(Note)f + (that)g(each)g(node)h(of)f(type)-150 5172 y Fs(list)g + Fz(has)g(tw)o(o)f(\002elds)437 5140 y Ft(2)466 5172 y + Fz(.)g(The)g(c)o(ycles)h(indicate)g(recursi)n(v)o(e)g(data)f + (structures.)p -150 5289 997 3 v -150 5340 a Ft(2)-113 + 5363 y Fw(The)14 b(diagrams)h(in)g(this)f(paper)h(sho)o(w)f(pointers)h + (to)g(nodes)f(in)h(cases)e(where)i(the)f(pointer)i(tar)o(gets)-150 + 5430 y(the)f(\002rst)f(\002eld)h(of)g(the)g(node,)f(due)g(to)h + (limitations)g(of)g(the)g(graph)g(layout)f(tool)h(we)g(use.)2042 + 46 y Fg(void)36 b(poolcreate\(Pool*)k(PD,)c(uint)h(Size,)f(uint)h + (Align\))2192 121 y Fj(Initialize)20 b(a)e(pool)f(descriptor)l(.)2042 + 196 y Fg(void)36 b(pooldestroy\(Pool*)k(PD\))2192 270 + y Fj(Release)19 b(pool)f(memory)f(and)g(destro)o(y)i(pool)e(descriptor) + l(.)2042 345 y Fg(void*)36 b(poolalloc\(Pool*)k(PD,)c(uint)h + (numBytes\))2192 420 y Fj(Allocate)19 b(an)f(object)h(of)e + Fg(numBytes)h Fj(bytes.)2042 494 y Fg(void)36 b(poolfree)i(\(Pool*)f + (PD,)f(void*)h(ptr\))2192 569 y Fj(Mark)17 b(the)h(object)h(pointed)g + (to)e(by)g Ff(ptr)i Fj(as)d(free.)2042 644 y Fg(void*)36 + b(poolrealloc\(Pool*)41 b(PD,)36 b(void*)g(ptr,)h(uint)f(numBytes\)) + 2192 719 y Fj(Resize)18 b(an)g(object)h(to)e Fg(numBytes)i + Fj(bytes.)2042 868 y Fg(void)36 b(poolinit)p 2502 868 + 22 4 v 28 w(bp\(Pool)h(*PD,)g(uint)f(Align\))2192 943 + y Fj(Initialize)20 b(a)e(b)o(ump-pointer)g(pool)g(descriptor)l(.)2042 + 1017 y Fg(void)36 b(*poolalloc)p 2572 1017 V 28 w(bp\(Pool)i(*PD,)e + (uint)h(NumBytes\))2192 1092 y Fj(Allocate)19 b(memory)e(from)g(a)g(b)o + (ump-pointer)i(pool.)2042 1167 y Fg(void)36 b(pooldestroy)p + 2607 1167 V 29 w(bp\(Pool)h(*PD\))2192 1242 y Fj(Release)19 + b(a)e(b)o(ump-pointer)i(pool.)p 2042 1292 1993 3 v 2173 + 1377 a Fn(Figur)o(e)f(3.)g Fz(Interf)o(ace)i(to)f(the)g(Pool)f + (Allocator)h(Runtime)g(Library)2042 1554 y Fm(R)q Fl(1)24 + b Fz(and)h Fm(R)q Fl(2)f Fz(point)h(to)f(distinct)h(nodes,)g + (indicating)g(that)f(the)h(tw)o(o)f(link)o(ed)2042 1637 + y(lists)18 b(are)h(completely)h(disjoint.)2141 1720 y(There)k(are)f(tw) + o(o)g(other)g(assumptions)i(about)f(DS)e(graphs)i(used)g(in)f(this)2042 + 1803 y(w)o(ork.)29 b(First,)f(we)g(assume)i(that)f(the)g(DS)f(Graph)i + (for)f(each)g(function)h(in-)2042 1886 y(cludes)20 b(information)h + (about)f(that)g(function)g(and)h(all)e(of)h(the)g(functions)g(that)2042 + 1969 y(it)i(calls)h(\(b)o(ut)f(no)i(information)f(about)h(its)e + (callers\).)g(Section)h(3.3)g(e)o(xplains)2042 2052 y(why)28 + b(this)f(assumption)i(is)e(safe.)h(F)o(or)f(e)o(xample,)h(a)g(node)g + (with)g Fn(H)38 b Fi(2)g Fm(M)2042 2135 y Fz(indicates)22 + b(heap)h(objects)f(allocated)g(or)g(freed)g(in)g(the)g(current)g + (function)h(or)2042 2218 y(its)16 b(callees,)g(b)o(ut)h(not)g(its)f + (callers.)g(Se)n(v)o(eral)g(conte)o(xt-sensiti)n(v)o(e)i(analyses,)f + (in-)2042 2301 y(cluding)24 b(DSA)e(and)i(others)f([37)q(,)g(38],)g + (compute)h(separate)g(\223Bottom-Up\224)2042 2384 y(\(B)o(U\))17 + b(and)h(\223T)-6 b(op-T)g(o)n(wn\224)19 b(\(TD\))e(graphs:)h(the)g + (Bottom-Up)g(graphs)g(capture)2042 2467 y(e)o(xactly)28 + b(the)g(information)g(required.)h(F)o(or)e(e)o(xample,)h(the)g(graph)h + (in)f(Fig-)2042 2550 y(ure)16 b(2\(b\))h(incorporates)g(the)f + (points-to,)h(mod/ref,)f(and)h(\003ag)f(ef)n(fects)g(of)g(both)2042 + 2633 y(calls)22 b(to)g(\223createnode\224:)i(it)d(includes)i(tw)o(o)g + (copies)f(\(one)h(for)f(each)h(call\))f(of)2042 2716 + y(the)f(H)g(\003ag)h(and)g(the)f(edge)h(from)g(the)f(list)g(node)h(to)f + (the)h(inte)o(ger)f(data)h(node)2042 2799 y(present)d(in)g(Figure)g + (2\(a\).)2141 2882 y(Second,)g(there)g(are)f(a)h(fe)n(w)f(primiti)n(v)o + (e)g(operations)h(on)g(DS)f(graphs)h(used)2042 2965 y(in)h(the)g + (transformation,)g(including)h(mer)o(ging)g(tw)o(o)f(graphs)h(and)f + (matching)2042 3048 y(nodes)25 b(between)g(graphs)g(for)f(a)h(callee)f + (and)h(a)f(caller)l(.)g(These)g(are)g(de\002ned)2042 + 3131 y(and)19 b(e)o(xplained)h(where)g(the)o(y)f(are)g(used)g(in)g(the) + g(ne)o(xt)g(Section.)2042 3313 y FA(3.)91 b(The)22 b(Cor)n(e)g(T)-7 + b(ransf)n(ormation)2042 3429 y Fz(The)19 b(pool)h(allocation)g + (transformation)g(operates)h(on)f(a)f(program)h(contain-)2042 + 3512 y(ing)f(calls)f(to)g Fs(malloc)i Fz(and)f Fs(free)p + Fz(,)g(and)h(transforms)f(the)f(program)i(to)e(use)h(a)2042 + 3595 y(pool)g(library)-5 b(,)18 b(described)h(belo)n(w)-5 + b(.)18 b(The)g(algorithm)h(uses)f(a)h(points-to)f(graph)2042 + 3679 y(and)j(call)g(graph,)g(both)h(of)f(which)g(are)g(computed)h(by)f + (DSA)f(in)h(our)g(imple-)2042 3762 y(mentation.)28 b(The)f + (transformation)i(is)e(a)h(frame)n(w)o(ork)h(which)f(has)g(se)n(v)o + (eral)2042 3845 y(optional)15 b(re\002nements.)g(In)f(this)g(section,)h + (we)f(present)h(a)g(\223basic\224)g(v)o(ersion)g(of)2042 + 3928 y(the)21 b(transformation)h(in)g(which)g(all)f(heap)h(objects)g + (are)f(allocated)h(in)f(pools)2042 4011 y(\(i.e.,)c(none)j(are)f + (allocated)h(directly)f(via)g Fs(malloc)p Fz(\))h(and)f(e)n(v)o(ery)h + (node)g(in)f(the)2042 4094 y(points-to)i(graph)h(generates)h(a)e + (separate)g(static)g(pool)h(\(e)o(xplained)g(belo)n(w\).)2042 + 4177 y(In)d(the)g(ne)o(xt)g(section,)g(we)g(discuss)g(re\002nements)h + (to)e(this)h(basic)g(approach.)2042 4317 y Fn(3.1)75 + b(P)o(ool)18 b(Allocator)i(Runtime)d(Library)2042 4433 + y Fz(Figure)j(3)g(sho)n(ws)g(the)h(interf)o(ace)f(to)g(the)g(runtime)g + (library)-5 b(.)20 b(Pools)g(are)g(iden-)2042 4516 y(ti\002ed)c(by)h(a) + g(pool)h(descriptor)f(of)g(type)h Fs(Pool)p Fz(.)f(The)g(functions)h + Fs(poolalloc)p Fz(,)2042 4599 y Fs(poolfree)p Fz(,)46 + b(and)f Fs(poolrealloc)i Fz(allocate,)d(deallocate,)h(and)g(resize)2042 + 4682 y(memory)33 b(in)f(a)g(pool.)g(The)g Fs(poolcreate)i + Fz(function)f(initializes)e(a)h(pool)2042 4765 y(descriptor)21 + b(for)f(an)h(empty)g(pool,)g(with)f(an)h(optional)g(size)f(hint)h + (\(pro)o(viding)2042 4848 y(a)28 b(f)o(ast)h(path)g(for)g(a)f(commonly) + i(allocated)f(size\))g(and)g(an)g(alignment)g(re-)2042 + 4932 y(quired)23 b(for)f(the)h(pool)g(\(this)f(def)o(aults)g(to)h(8,)f + (as)g(in)h(man)o(y)g(standard)g(malloc)2042 5015 y(libraries\).)k + Fs(pooldestroy)j Fz(releases)f(all)e(pool)i(memory)g(to)f(the)g(system) + 2042 5098 y(heap.)23 b(The)f(last)h(three)f(functions)i(\(with)e(suf)n + (\002x)g(\223)p 3369 5098 24 4 v 29 w Fs(bp)p Fz(\224\))h(are)f(v)n + (ariants)h(that)2042 5181 y(use)15 b(a)f(f)o(ast)h(\223b)o(ump)g + (pointer\224)g(allocation)g(method,)h(described)f(in)g(Section)f(5.) + 2141 5264 y(The)21 b(library)f(internally)h(obtains)g(memory)h(from)e + (the)h(system)g(heap)g(in)2042 5347 y(blocks)g(of)f(one)i(or)e(more)h + (pages)g(at)f(a)h(time)f(using)h Fs(malloc)g Fz(\(doubling)h(the)2042 + 5430 y(size)30 b(each)h(time\).)f(W)-6 b(e)30 b(implemented)h(multiple) + g(allocation)g(algorithms)p eop end + %%Page: 5 5 + TeXDict begin 5 4 bop -150 66 a Fz(b)o(ut)20 b(the)g(v)o(ersion)h(used) + f(here)h(is)e(a)h(general)h(free-list-based)f(allocator)h(with)-150 + 149 y(coalescing)g(of)e(adjacent)i(free)e(objects.)h(It)f(maintains)h + (a)f(four)o(-byte)h(header)-150 232 y(per)26 b(object)f(to)h(record)g + (object)g(size.)f(The)g(def)o(ault)h(alignment)g(of)g(objects)-150 + 315 y(\(e.g.,)d(4-)g(or)h(8-byte\))g(can)g(be)g(chosen)h(on)f(a)g(per)o + (-pool)g(basis,)f(for)g(reasons)-150 399 y(described)d(in)f(Section)g + (5.)g(The)g(pool)h(library)f(is)g(general)h(in)f(the)g(sense)g(that) + -150 482 y(it)f(does)i(not)f(require)g(all)g(allocations)g(from)g(a)g + (pool)g(to)g(be)g(the)g(same)h(size.)-150 639 y Fn(3.2)75 + b(Ov)o(er)o(view)20 b(Using)f(an)f(Example)-150 756 y + Fz(The)26 b(basic)h(pool)g(allocation)f(transformation)h(is)f + (illustrated)g(for)g(the)g(e)o(x-)-150 839 y(ample)18 + b(program)g(in)g(Figure)f(1\(b\),)h(which)g(sho)n(ws)g(the)g(results)f + (of)h(our)g(basic)-150 922 y(transformation)24 b(in)g(C)f(syntax.)h + (The)f(incoming)i(list)d Fm(L)i Fz(and)g(the)f(tw)o(o)h(ne)n(w)-150 + 1005 y(lists)16 b(ha)o(v)o(e)h(each)g(been)g(allocated)g(to)g(distinct) + f(pools)h(\(the)g(pool)g(for)f Fm(L)h Fz(is)f(not)-150 + 1088 y(passed)k(in)e(and)h(so)g(not)g(sho)n(wn;)g(the)g(ne)n(w)g(lists) + f(use)g(pools)i(PD1)e(and)h(PD2\).)-150 1171 y(The)k(list)f(nodes)i + (for)f Fm(A)g Fz(and)h Fm(B)i Fz(will)d(be)g(se)o(gre)o(gated)h(in)f + (the)g(heap,)g(unlik)o(e)-150 1254 y(the)28 b(original)f(program)i + (where)f(the)o(y)f(will)g(be)h(laid)f(out)h(in)f(some)i(unpre-)-150 + 1337 y(dictable)d(f)o(ashion)g(\(and)g(possibly)g(interlea)o(v)o(ed\))g + (in)f(memory)-5 b(.)26 b(The)g(items)-150 1420 y(in)21 + b(each)h(pool)g(are)f(e)o(xplicitly)g(deallocated)h(and)g(the)g(pools)g + (are)f(destro)o(yed)-150 1503 y(within)e Fs(processList)i + Fz(when)e(the)g(data)h(the)o(y)f(contain)g(is)g(no)g(longer)h(li)n(v)o + (e.)-50 1586 y(W)-6 b(e)19 b(can)i(use)f(this)g(e)o(xample)g(to)g(e)o + (xplain)h(the)f(basic)g(steps)g(of)g(the)g(trans-)-150 + 1669 y(formation.)d(The)f(DS)g(graphs)h(are)g(sho)n(wn)g(in)g(Figure)f + (2.)g(First,)f(we)i(use)g(each)-150 1752 y(function')l(s)30 + b(DS)f(graph)h(to)f(determine)h(which)g Fn(H)f Fz(nodes)h(are)g + (accessible)-150 1835 y(outside)25 b(their)g(respecti)n(v)o(e)h + (functions,)f(i.e.,)f(\223escape\224)i(to)e(the)h(caller)l(.)f(The)-150 + 1918 y Fn(H)17 b Fz(nodes)h(in)g Fs(createnode)h Fz(and)f + Fs(splitclone)h Fz(do)f(escape,)g(because)g(the)o(y)-150 + 2001 y(are)26 b(reachable)g(from)g(a)f(returned)h(pointer)g(and)h(a)e + (formal)h(ar)o(gument,)g(re-)-150 2084 y(specti)n(v)o(ely)-5 + b(.)25 b(The)g(tw)o(o)f(in)g Fs(processlist)j Fz(\()p + Fs(A)e Fz(and)g Fs(B)p Fz(\))f(do)h(not.)g(The)f(latter)-150 + 2167 y(are)19 b(candidates)h(for)f(ne)n(w)g(pools)h(in)e + Fs(processlist)p Fz(.)-50 2250 y(The)h(transformation)i(phase)f + (inserts)g(code)h(to)e(create)h(and)g(destro)o(y)h(the)-150 + 2333 y(pool)32 b(descriptors)g(for)g Fs(A)f Fz(\()p Fs(PD1)p + Fz(\))h(and)h Fs(B)e Fz(\()p Fs(PD2)p Fz(\))h(in)f Fs(processlist)j + Fz(\(see)-150 2416 y(Figure)25 b(1\(b\)\).)g(It)g(adds)h(pool)g + (descriptor)g(ar)o(guments)h(for)e(e)n(v)o(ery)h Fn(H)f + Fz(node)-150 2499 y(that)i(escapes)h(its)e(function,)h(i.e.,)f(for)h + (nodes)h(pointed)g(to)f(by)g Fs(R1)g Fz(and)h Fs(R2)-150 + 2582 y Fz(in)e Fs(splitclone)h Fz(and)f(the)g(node)h(pointed)f(to)g(by) + g Fs(New)g Fz(in)g Fs(createNode)p Fz(.)-150 2665 y(It)c(re)n(writes)f + (the)h(calls)g(to)g Fs(malloc)h Fz(and)g Fs(free)g Fz(with)f(calls)f + (to)h Fs(poolalloc)-150 2748 y Fz(and)e Fs(poolfree)p + Fz(,)h(passing)g(appropriate)g(pool)f(descriptors)g(as)g(ar)o(guments.) + -150 2831 y(Finally)-5 b(,)30 b(it)h(re)n(writes)f(other)i(calls)e(to)h + (\(e.g.,)g(the)g(calls)f(to)h Fs(splitclone)-150 2914 + y Fz(and)c Fs(createnode)p Fz(\))i(to)d(pass)h(an)o(y)h(necessary)f + (pool)h(descriptor)f(pointers)-150 2997 y(as)19 b(ar)o(guments.)g(At)g + (this)f(point,)h(the)g(basic)g(transformation)h(is)f(complete.)-50 + 3080 y(Further)40 b(re\002nements)g(of)g(the)h(transformation)f(mo)o(v) + o(e)h(the)f Fs(pool-)-150 3163 y(destroy)17 b Fz(for)e + Fs(PD1)g Fz(as)g(early)h(as)f(possible)h(within)f(the)g(function)h + Fs(process-)-150 3246 y(list)p Fz(,)30 b(and)h(then)f(eliminate)g(the)g + (calls)g(to)g(free)g(items)f(in)h(the)g(tw)o(o)g(lists)-150 + 3329 y(\(since)22 b(these)h(items)f(will)f(be)i(released)f(by)h + (pooldestro)o(y)h(before)f(an)o(y)g(ne)n(w)-150 3412 + y(allocations)18 b(from)f(an)o(y)h(pool\))g(and)g(hence)h(the)e(loop)h + (enclosing)h(those)f(calls)-150 3495 y(to)g(free.)f(The)h(\002nal)f + (resulting)h(code)h(\(Figure)e(8\))h(puts)g(each)h(link)o(ed)f(list)f + (into)-150 3578 y(a)k(separate)h(pool)h(on)f(the)f(heap,)h(made)g(the)g + (list)f(objects)g(of)h(each)g(list)f(con-)-150 3661 y(tiguous)29 + b(in)f(memory)-5 b(,)29 b(and)f(reclaims)g(all)g(the)g(memory)h(for)f + (each)g(list)g(at)-150 3744 y(once)23 b(instead)h(of)e(freeing)h(items) + f(indi)n(vidually)-5 b(.)24 b(In)f(the)f(e)o(xample,)h(the)g(list)-150 + 3827 y(nodes)d(are)f(placed)h(in)e(dynamic)i(allocation)g(order)f + (within)g(their)f(pool.)-150 3985 y Fn(3.3)75 b(Analysis:)19 + b(Finding)d(P)o(ool)j(Descriptors)g(f)n(or)g(each)g(H)g(Node)-150 + 4101 y Fz(The)g(analysis)g(phase)g(identi\002es)g(which)g(pool)g + (descriptors)g(must)g(be)g(a)o(v)n(ail-)-150 4184 y(able)k(in)g(each)h + (function,)f(determines)h(where)f(the)o(y)h(must)f(be)g(created)h(and) + -150 4267 y(destro)o(yed,)k(and)f(assigns)h(pool)f(descriptors)g(to)g + (DS)f(nodes.)h(W)-6 b(e)26 b(use)h(the)-150 4350 y(term)d + Fy(static)g(pool)h Fz(to)f(refer)g(to)g(a)g(single)g + Fs(poolcreate)j Fz(statement)d(in)g(the)-150 4433 y(generated)e(code.)g + (By)f(de\002nition,)g Fn(H)26 b Fi(2)g Fm(M)j Fz(for)21 + b(a)h(node)g(if)e(the)i(objects)f(of)-150 4516 y(that)h(node)i(are)e + (returned)h(by)g Fs(malloc)g Fz(or)g(passed)g(into)f + Fs(free)h Fz(by)g(the)g(cur)o(-)-150 4599 y(rent)j(function)h(or)f(an)o + (y)h(of)f(its)g(callees,)g(since)g(we)h(assume)g(a)f(Bottom-up)-150 + 4682 y(DS)20 b(graph)h(\(see)f(Section)g(2.1\).)g(These)h(identify)f(e) + o(xactly)h(those)g(nodes)g(for)-150 4765 y(which)e(a)g(pool)h + (descriptor)f(must)g(be)g Fy(available)h Fz(in)f(the)g(current)g + (function.)-50 4848 y(Automatic)24 b(Pool)g(Allocation)g(computes)h(a)f + (map)g(\(pdmap\))h(identify-)-150 4932 y(ing)f(the)g(pool)h(descriptor) + g(corresponding)h(to)e(each)g(DS)g(node)h(with)e Fn(H)31 + b Fi(2)-150 5015 y Fm(M)8 b Fz(.)26 b(W)-6 b(e)25 b(initially)h + (restrict)f(pdmap)i(to)f(be)g(a)g(one-to-one)i(mapping)f(from)-150 + 5098 y(DS)19 b(nodes)i(to)e(pool)h(descriptor)h(v)n(ariables;)f + (Section)f(6)h(e)o(xtends)h(pdmap)f(to)-150 5181 y(allo)n(w)25 + b(a)g(man)o(y-to-one)i(mapping.)f(W)-6 b(e)24 b(must)i(handle)g(tw)o(o) + f(cases:)g(1\))g(the)-150 5264 y(pool)c(escapes)f(the)g(current)h + (function)f(and)h(2\))f(the)g(pool)g(lifetime)f(is)h(bound)-150 + 5347 y(by)d(the)h(function.)f(In)g(the)g(\002rst)f(case,)h(we)g(add)h + (a)f(pool)g(descriptor)h(ar)o(gument)-150 5430 y(to)d(the)h(function,)f + (in)g(the)h(second,)g(we)f(create)h(a)f(descriptor)h(on)f(the)h(stack)f + (for)2042 66 y(the)j(function)h(and)g(call)f Fs(poolcreate)p + Fz(/)p Fs(pooldestroy)p Fz(.)k(These)c(tw)o(o)h(cases)2042 + 149 y(are)g(dif)n(ferentiated)g(by)g(the)g(\223escapes\224)i(property)e + (for)g(the)g(DS)f(node.)2141 232 y(The)j(\223escapes\224)i(property)f + (is)e(determined)i(by)g(a)f(simple)g(escape)h(anal-)2042 + 315 y(ysis)33 b(on)g(the)g(bottom-up)h(DS)e(graphs,)h(implemented)h(as) + e(a)h(depth-\002rst)2042 399 y(tra)o(v)o(ersal.)17 b(In)g(particular)m + (,)h(a)g(node)g(escapes)h(if)n(f)e(1\))h(a)g(pointer)g(to)g(the)g(node) + g(is)2042 482 y(returned)j(by)h(the)f(function)g(\(e.g.)f + Fs(createnode)p Fz(\))j(2\))e(the)g(node)h(is)e(pointed)2042 + 565 y(to)i(by)g(a)g(formal)g(ar)o(gument)h(\(e.g.)e(the)h(R1)g(node)h + (in)f Fs(splitclone)p Fz(\))i(3\))e(the)2042 648 y(node)d(is)e(pointed) + h(to)g(by)g(global)h(v)n(ariable)f(and)g(the)g(current)g(function)h(is) + e(not)2042 731 y(main,)i(or)f(4\))h(\(inducti)n(v)o(ely\))h(an)f + (escaping)h(node)g(points)g(to)f(the)g(node.)2141 814 + y(A)k(subtle)f(point)h(is)f(that)h(an)o(y)g(node)g(that)g(does)g(not)f + (escape)i(a)e(function)2042 897 y(will)j(be)i(unaf)n(fected)h(by)f + (callers)g(of)g(the)f(function,)i(since)f(the)f(objects)h(at)2042 + 980 y(such)g(a)g(node)h(are)f(not)g(reachable)h(\(in)f(f)o(act,)f(may)i + (not)f(e)o(xist\))g(before)g(the)2042 1063 y(current)h(function)g(is)f + (called)g(or)h(after)f(it)f(returns.)i Fy(This)f(e)o(xplains)g(why)h + (it)2042 1146 y(is)h(safe)h(to)g(use)g(a)g(B)o(U)g(gr)o(aph)h(for)f + (pool)g(allocation)p Fz(:)h(Ev)o(en)f(though)h(the)2042 + 1229 y(B)o(U)22 b(graph)h(does)g(not)f(re\003ect)g(an)o(y)g(aliases)g + (induced)i(by)f(callers,)e(the)h(non-)2042 1312 y(escaping)g(nodes)f + (are)g(correctly)f(identi\002able)h(and)g(all)f(information)h(about) + 2042 1395 y(them)c(is)g(complete,)h(including)h(their)e(type)h + Fm(\034)9 b Fz(,)16 b(incoming)j(points-to)e(edges,)2042 + 1478 y(and)23 b(\003ags.)g(In)g(f)o(act,)f(in)h(DSA,)f(the)h(escapes)h + (property)f(is)g(e)o(xplicitly)g(com-)2042 1561 y(puted)g(and)g(all)f + (non-escaping)j(nodes)f(are)e(mark)o(ed)i(using)f(a)f(\223)p + Fn(C)p Fz(\224omplete)2042 1644 y(\003ag)h([32)q(].)g(It)g(can)h(be)g + (computed)h(easily)f(using)g(the)g(abo)o(v)o(e)h(de\002nition)f(by)2042 + 1727 y(an)o(y)19 b(conte)o(xt-sensiti)n(v)o(e)h(algorithm)f(that)g(has) + g(similar)g(points-to)g(graphs.)2042 1863 y Fn(3.3.1)75 + b(The)18 b(Basic)h(T)-6 b(ransf)n(ormation)2042 1979 + y Fz(Figure)28 b(4)h(sho)n(ws)g(the)f(pseudocode)j(for)e(a)f(basic)h(v) + o(ersion)g(of)f(the)h(Auto-)2042 2062 y(matic)20 b(Pool)g(Allocation)g + (transformation,)h(which)g(does)f(not)h(handle)g(indi-)2042 + 2145 y(rect)f(function)g(calls.)g(The)g(algorithm)g(mak)o(es)h(tw)o(o)f + (passes)g(o)o(v)o(er)h(the)f(func-)2042 2228 y(tions)j(in)f(the)h + (program)h(in)e(arbitrary)h(order)l(.)g(The)f(\002rst)g(\(lines)h + (1\22611\))g(adds)2042 2311 y(ar)o(guments)k(to)e(functions,)i(creates) + f(local)g(pool)h(descriptors,)f(and)h(b)o(uilds)2042 + 2394 y(the)c(pdmap.)i(The)e(second)i(\(lines)e(12\22620\))i(re)n + (writes)e(the)h(bodies)g(of)g(func-)2042 2477 y(tions)19 + b(using)g(pdmap.)2292 2569 y Fq(basicpoolallocate)p Fw(\(program)e + Fp(P)9 b Fw(\))2248 2636 y(1)73 b Fu(8)p Fp(F)27 b Fu(2)15 + b Fw(functions\()p Fp(P)9 b Fw(\))2248 2702 y(2)131 b(dsgraph)15 + b Fp(G)j Fe(=)p Fw(DSGraphF)o(orFunction\()p Fp(F)9 b + Fw(\))2248 2769 y(3)131 b Fu(8)p Fp(n)19 b Fu(2)14 b + Fw(nodes\()p Fp(G)p Fw(\))320 b(//)15 b(Find)g(pooldesc)f(for)i(heap)e + (nodes)2248 2835 y(4)189 b(if)15 b(\()p Fq(H)g Fu(2)k + Fp(n:M)6 b Fw(\))2248 2901 y(5)247 b(if)15 b(\(escapes\()p + Fp(n)p Fw(\)\))241 b(//)15 b(If)g(node)g(escapes)e(fn)2248 + 2968 y(6)305 b(Pool*)16 b Fp(a)e Fw(=)g(AddPoolDescAr)o(gument\()p + Fp(F)9 b Fw(,)15 b Fp(n)p Fw(\))2248 3034 y(7)305 b(pdmap\()p + Fp(n)p Fw(\))16 b(=)e Fp(a)193 b Fw(//)15 b(Remember)g(pooldesc)2248 + 3101 y(8)305 b(ar)o(gnodes\()p Fp(F)9 b Fw(\))15 b(=)g(ar)o(gnodes\()p + Fp(F)9 b Fw(\))15 b Fu([)f(f)p Fp(n)p Fu(g)2248 3167 + y Fw(9)247 b(else)496 b(//)15 b(Node)f(is)h(local)f(to)h(fn)2234 + 3234 y(10)290 b(Pool*)16 b Fp(pd)e Fw(=)g(AddInitAndDestro)o + (yLocalPool\()p Fp(F)9 b Fw(,)16 b Fp(n)p Fw(\))2234 + 3300 y(11)290 b(pdmap\()p Fp(n)p Fw(\))16 b(=)e Fp(pd)2234 + 3393 y Fw(12)58 b Fu(8)p Fp(F)27 b Fu(2)15 b Fw(functions\()p + Fp(P)9 b Fw(\))2234 3459 y(13)116 b Fu(8)p Fp(I)23 b + Fu(2)c Fp(instr)r(uctions)p Fe(\()p Fp(F)9 b Fe(\))71 + b Fw(//)15 b(Re)o(write)f(function)2234 3525 y(14)174 + b(if)15 b(\()p Fp(I)20 b Fw(isa)14 b(`)p Fp(ptr)j Fw(=)d(malloc\()p + Fp(siz)r(e)p Fw(\)'\))2234 3592 y(15)232 b(replace)15 + b Fp(I)k Fw(with)c('poolalloc\(pdmap\(N\()p Fp(ptr)r + Fw(\)\),)h Fp(siz)r(e)p Fw(\)')2234 3658 y(16)174 b(else)14 + b(if)h(\()p Fp(I)20 b Fw(isa)14 b(`free\()p Fp(ptr)r + Fw(\)'\))2234 3725 y(17)232 b(replace)15 b Fp(I)k Fw(with)c + (`poolfree\(pdmap\(N\()p Fp(ptr)r Fw(\)\),)i Fp(ptr)r + Fw(\)')2234 3791 y(18)174 b(else)14 b(if)h(\()p Fp(I)20 + b Fw(isa)14 b(`call)h Fp(C)t(allee)p Fw(\()p Fp(ar)r(g)r(s)p + Fw(\)'\))2234 3857 y(19)232 b Fu(8)p Fp(n)19 b Fu(2)14 + b Fw(ar)o(gnodes\()p Fp(C)t(allee)p Fw(\))2234 3924 y(20)290 + b(addCallAr)o(gument\(pdmap\(NodeInCaller\()p Fp(F)r(;)13 + b(I)5 b(;)11 b(n)p Fw(\)\)\))p 2042 4021 1993 3 v 2405 + 4106 a Fn(Figur)o(e)18 b(4.)g Fz(Pseudo)i(code)g(for)f(basic)g + (algorithm)2141 4210 y(F)o(or)24 b(each)g(node)h(that)f(needs)h(a)f + (pool)g(in)g(the)g(function,)h(the)f(algorithm)2042 4293 + y(either)k(adds)i(a)e(pool)i(descriptor)f(ar)o(gument)g(\(if)f(the)h + (DS)f(node)h(escapes\))2042 4376 y(or)c(it)f(allocates)h(a)g(pool)h + (descriptor)f(on)h(the)f(stack.)g(Non-escaping)h(pools)2042 + 4459 y(are)17 b(initialized)g(\(using)g Fs(poolcreate)p + Fz(\))i(on)f(entry)f(to)g(the)g(function)h(and)g(de-)2042 + 4542 y(stro)o(yed)23 b(\()p Fs(pooldestroy)p Fz(\))i(at)d(e)n(v)o(ery)h + (e)o(xit)g(of)f(the)h(function)g(\(these)g(place-)2042 + 4625 y(ment)i(choices)g(are)g(impro)o(v)o(ed)g(in)g(Section)f(4.2\).)g + (Because)i(the)e(DS)g(node)2042 4708 y(does)g(not)f(escape)h(the)f + (function,)g(we)g(are)g(guaranteed)i(that)e(an)o(y)g(memory)2042 + 4791 y(allocated)g(from)f(that)h(pool)g(can)g(ne)n(v)o(er)g(be)g + (accessed)h(outside)f(of)g(the)g(cur)o(-)2042 4874 y(rent)c(function,)h + (i.e.,)f(it)f(is)i(safe)f(to)h(destro)o(y)g(the)g(pool,)g(e)n(v)o(en)g + (if)f(some)h(mem-)2042 4957 y(ory)d(w)o(as)f(not)h(deallocated)g(by)g + (the)f(original)h(program.)g(Note)f(that)h(this)f(may)2042 + 5040 y(actually)j(eliminate)g(some)g(memory)h(leaks)f(in)g(the)g + (program!)2141 5123 y(In)g(the)g(second)h(pass)f(\(lines)g(12\22620\),) + h(the)e(algorithm)h(replaces)h(calls)e(to)2042 5209 y + Fs(malloc\(\))25 b Fz(and)f Fs(free\(\))2744 5178 y Ft(3)2797 + 5209 y Fz(with)f(calls)g(to)h Fs(poolalloc)h Fz(and)f + Fs(poolfree)p Fz(.)p 2042 5289 997 3 v 2042 5340 a Ft(3)2079 + 5363 y Fw(Note)e(that)h(\223malloc)f(wrappers\224)g(\(lik)o(e)h + Fd(calloc)p Fw(,)e Fd(operator)30 b(new)p Fw(,)21 b Fd(strdup)p + Fw(,)g(etc\))i(do)f(not)2042 5430 y(need)j(special)f(support)i(from)g + (the)g(pool)f(allocator)m(.)g(Their)g(bodies)g(are)g(simply)h(link)o + (ed)g(into)p eop end + %%Page: 6 6 + TeXDict begin 6 5 bop -150 66 a Fz(W)-6 b(e)26 b(pass)h(the)f + (appropriate)h(pool)g(descriptor)g(pointer)g(using)g(the)f(pdmap)-150 + 149 y(information)f(sa)o(v)o(ed)f(by)g(the)g(\002rst)f(pass.)h(Since)g + (the)g(DS)f(node)i(must)f(ha)o(v)o(e)-150 232 y(an)16 + b Fn(H)f Fz(\003ag,)g(a)h(pool)g(descriptor)g(is)f(guaranteed)i(to)f + (be)f(a)o(v)n(ailable)h(in)g(the)f(map.)-50 315 y(Calls)29 + b(to)h(functions)h(other)f(than)g Fs(malloc)h Fz(or)f + Fs(free)h Fz(must)f(pass)g(ad-)-150 399 y(ditional)25 + b(pool)h(descriptor)g(ar)o(guments)g(for)g(memory)g(that)f(escapes)h + (from)-150 482 y(them.)32 b(Because)g(the)g(B)o(U)f(Graph)i(of)e(the)h + (callee)g(re\003ects)f(all)g(accessed)-150 565 y(memory)20 + b(objects)f(of)g(all)g(transiti)n(v)o(e)f(callees,)h(an)o(y)h(heap)f + (objects)h(allocated)-150 648 y(by)c(a)f(callee)h(will)e(be)i + (represented)g(by)g(an)g Fn(H)f Fz(node)i(in)e(the)g(caller)g(graph)i + (\(this)-150 731 y(is)23 b(true)h(e)n(v)o(en)g(for)g(recursi)n(v)o(e)g + (functions)h(lik)o(e)e Fs(splitclone)p Fz(\).)i(This)f(prop-)-150 + 814 y(erty)16 b(guarantees)h(that)f(a)g(caller)g(will)f(ha)o(v)o(e)h + (all)g(of)g(the)g(pool)h(descriptors)f(that)-150 897 + y(an)o(y)j(callee)g(will)f(e)n(v)o(er)i(need.)-50 980 + y(A)34 b(k)o(e)o(y)i(primiti)n(v)o(e)e(computable)i(from)f(DS)f(graphs) + h(is)g(a)f(mapping,)-150 1063 y Fm(N)8 b(odeI)e(nC)f(al)q(l)q(er)r + Fl(\()p Fm(F)r(;)13 b(C)q(;)g(n)p Fl(\))p Fz(.)25 b(F)o(or)g(a)g(call)g + (instruction,)h Fm(C)5 b Fz(,)25 b(in)g(a)g(function)-150 + 1146 y Fm(F)11 b Fz(,)25 b(if)h Fm(n)g Fz(is)g(a)g(DS)g(node)h(in)f(an) + o(y)h(possible)f(callee)h(at)f(that)g(call)f(site,)h(then)-150 + 1229 y Fm(n)-104 1197 y Fc(0)-60 1229 y Fl(=)21 b Fm(N)8 + b(odeI)e(nC)f(al)q(l)q(er)r Fl(\()p Fm(F)r(;)13 b(C)q(;)g(n)p + Fl(\))18 b Fz(identi\002es)g(the)g(node)h(in)f(the)g(DS)f(graph)-150 + 1312 y(of)h Fm(F)28 b Fz(corresponding)20 b(to)e(node)h + Fm(n)f Fz(due)g(to)g(side-ef)n(fects)g(of)g(the)f(call)h + Fm(C)23 b Fz(\(i.e.,)-150 1395 y Fm(n)-104 1363 y Fc(0)-60 + 1395 y Fz(includes)f(the)g(memory)h(objects)f(of)f(node)i + Fm(n)f Fz(visible)f(in)h Fm(F)32 b Fz(due)22 b(to)g(this)-150 + 1478 y(call\).)29 b(The)h(mapping)h(is)f(computed)i(in)d(a)h(single)h + (linear)o(-time)e(tra)o(v)o(ersal)-150 1561 y(o)o(v)o(er)c(matching)g + (paths)g(in)f(the)g(caller)h(and)g(callee)f(graphs,)h(starting)f(from) + -150 1644 y(matching)17 b(pairs)f(of)f(actual)h(and)h(formal)f(nodes,)g + (matching)h(pairs)f(of)g(global)-150 1727 y(v)n(ariable)32 + b(nodes,)g(and)g(the)g(return)f(v)n(alue)i(nodes)f(in)f(the)h(tw)o(o)f + (graphs)i(if)-150 1810 y(an)o(y)-5 b(.)30 b(If)g Fm(n)g + Fz(escapes)h(from)f(the)g(callee,)f(then)i(the)f(matching)g(node)h + Fm(n)1740 1778 y Fc(0)1793 1810 y Fz(is)-150 1893 y(guaranteed)23 + b(to)f(e)o(xist)f(in)g(the)h(caller')l(s)f(B)o(U)h(graph)g(\(due)g(to)g + (the)f(bottom-up)-150 1976 y(inlining)27 b(process)h(used)g(to)f + (construct)h(the)f(B)o(U)g(graphs\),)h(and)f(is)g(unique)-150 + 2059 y(because)20 b(the)f(DS)f(graphs)i(are)f(uni\002cation-based)h + ([32)q(].)-50 2142 y(Identifying)i(which)g(pool)g(of)g(the)g(caller)f + (\()p Fm(F)11 b Fz(\))21 b(to)g(pass)i(for)e(callee)h(pool)-150 + 2225 y(ar)o(guments)32 b(at)f(call)g(instruction)h Fm(I)37 + b Fz(is)31 b(no)n(w)h(straightforw)o(ard:)f(for)h(each)-150 + 2308 y(callee)22 b(node)h Fm(n)f Fz(that)g(needs)h(an)f(ar)o(gument)g + (pool)h(descriptor)m(,)f(we)g(pass)g(the)-150 2391 y(pool)16 + b(descriptor)f(for)g(the)g(node)h Fm(N)8 b(odeI)e(nC)f(al)q(l)q(er)r + Fl(\()p Fm(F)r(;)12 b(I)6 b(;)13 b(n)p Fl(\))i Fz(in)g(the)g(caller')l + (s)-150 2474 y(DS)26 b(graph.)i(W)-6 b(e)27 b(record)h(the)f(set)g(of)g + (nodes)h(\(\223ar)o(gnodes\224\))h(that)e(must)g(be)-150 + 2557 y(passed)20 b(into)f(each)g(function,)h(in)f(the)g(\002rst)f + (pass.)-50 2640 y(V)-8 b(ariable-ar)o(gument)22 b(functions)h(do)f(not) + h(need)g(an)o(y)f(special)g(treatment)-150 2723 y(in)33 + b(the)f(transformation)i(because)g(of)e(their)h(representation)g(in)g + (the)f(B)o(U)-150 2806 y(graphs)d(computed)g(by)f(DSA.)e(In)i + (particular)m(,)f(the)h(DS)e(graph)j(nodes)f(for)-150 + 2889 y(all)19 b(pointer)o(-compatible)h(ar)o(guments)g(passed)h(via)e + (the)h(\223)p Fs(...)p Fz(\224)g(mechanism)-150 2972 + y(\(i.e.,)g(recei)n(v)o(ed)i(via)g Fs(va)p 473 2972 24 + 4 v 28 w(arg)p Fz(\))g(are)f(mer)o(ged)h(so)g(that)f(the)o(y)h(are)f + (represented)-150 3055 y(by)d(a)g(single)g(DS)e(node)j(in)f(the)f + (caller)h(and)g(callee.)f(If)g(the)h(DS)f(node)h(pointed)-150 + 3138 y(to)25 b(by)h(this)f(ar)o(gument)g(node)i(has)e + Fn(H)33 b Fi(2)h Fm(M)8 b Fz(,)25 b(a)g(single)g(pool)h(ar)o(gument)g + (is)-150 3221 y(added)c(to)e(the)h(function.)g(At)f(e)n(v)o(ery)h(call) + g(site)f(of)g(this)h(function,)g(the)f(nodes)-150 3304 + y(for)e(the)g(actual)g(ar)o(gument)h(\(corresponding)h(to)e(the)h(mer)o + (ged)f(formals\))g(will)-150 3387 y(also)28 b(ha)o(v)o(e)h(been)g(mer)o + (ged,)f(and)h(the)g(pool)g(corresponding)h(to)e(this)g(node)-150 + 3470 y(will)j(be)h(found)h(by)f Fm(N)8 b(odeI)e(nC)f(al)q(l)q(er)r + Fl(\()p Fm(F)r(;)12 b(I)6 b(;)13 b(n)p Fl(\))32 b Fz(and)g(passed)h(in) + e(as)h(the)-150 3553 y(pool)19 b(ar)o(gument.)g(Note)g(that)f(e)o + (xplicit)g(ar)o(guments)i(before)f(the)f Fs(...)h Fz(are)g(not)-150 + 3636 y(mer)o(ged)g(and)h(can)f(ha)o(v)o(e)h(distinct)e(pools.)-150 + 3808 y Fn(3.3.2)75 b(P)o(assing)19 b(Descriptors)g(f)n(or)g(Indir)o + (ect)f(Function)f(Calls)-150 3924 y Fz(Indirect)29 b(function)h(calls)f + (mak)o(e)i(it)d(much)i(more)g(comple)o(x)g(to)f(pass)h(cor)o(-)-150 + 4007 y(rect)18 b(pool)h(descriptor)g(ar)o(guments)f(to)h(each)f + (function.)h(There)f(are)g(multiple)-150 4090 y(dif)n(\002culties.)25 + b(First,)f(dif)n(ferent)i(functions)g(called)g(via)g(a)f(function)i + (pointer)-150 4173 y(at)e(the)g(same)h(call)e(site)h(may)h(require)f + (dif)n(ferent)g(sets)g(of)h(pools.)f(Figure)g(5)-150 + 4256 y(sho)n(ws)h(a)f(simple)g(e)o(xample)g(where)h Fs(func1)g + Fz(needs)f(no)h(pools)g(b)o(ut)e Fs(func2)-150 4339 y + Fz(needs)h(one)f(pool,)h(and)f(both)h(are)f(called)g(at)g(the)g(same)g + (site.)f(Second,)i(dif-)-150 4422 y(ferent)e(indirect)g(call)g(sites)g + (can)g(ha)o(v)o(e)h(dif)n(ferent)f(b)o(ut)g(o)o(v)o(erlapping)h(sets)f + (of)-150 4506 y(callees,)h(e.g.,)f Fi(f)p Fm(F)333 4514 + y Fb(1)368 4506 y Fm(;)13 b(F)451 4514 y Fb(2)486 4506 + y Fi(g)24 b Fz(and)h Fi(f)p Fm(F)767 4514 y Fb(2)802 + 4506 y Fm(;)13 b(F)885 4514 y Fb(3)919 4506 y Fi(g)25 + b Fz(at)e(tw)o(o)h(dif)n(ferent)g(call)g(sites.)f(In)-150 + 4589 y(order)18 b(to)f(a)o(v)o(oid)g(cloning)i Fm(F)571 + 4597 y Fb(2)622 4589 y Fz(into)f(tw)o(o)f(v)o(ersions,)h(we)f(must)h + (pass)g(the)f(same)-150 4672 y(pool)23 b(ar)o(guments)g(to)f(all)g + (three)g(functions)h Fm(F)1034 4680 y Fb(1)1069 4672 + y Fm(;)13 b(F)1152 4680 y Fb(2)1208 4672 y Fz(and)23 + b Fm(F)1387 4680 y Fb(3)1422 4672 y Fz(.)e(This)h(raises)g(a)-150 + 4755 y(third)j(major)g(problem:)h(because)g(the)f(call)g(graph)h(says)g + (that)f Fm(F)1555 4763 y Fb(3)1614 4755 y Fz(is)g(not)g(a)-150 + 4838 y(callee)c(at)g(the)g(\002rst)f(call-site,)h(its)f(DS)h(graph)h(w) + o(as)f(ne)n(v)o(er)h(inlined)f(into)g(that)-150 4921 + y(of)d(the)g(caller)f(at)g(that)h(call-site.)f(This)g(means)h(that)g + (the)g(matching)g(of)g(nodes)-150 5004 y(between)d(caller)g(and)g + (callee)g(graphs,)g(which)g(is)f(essential)h(for)f(passing)i(pool)-150 + 5087 y(descriptors,)23 b(may)h(be)f(unde\002ned:)h Fm(N)8 + b(odeI)e(nC)f(al)q(l)q(er)r Fl(\()p Fm(F)r(;)13 b(C)q(;)g(n)p + Fl(\))23 b Fz(may)g(not)-150 5170 y(e)o(xist)h(for)g(all)g(escaping)h + Fm(n)p Fz(.)f(Programs)g(that)g(violate)h(the)f(type)h(signatures)p + -150 5289 997 3 v -150 5363 a Fw(the)19 b(program)h(and)e(treated)h(as) + f(if)i(the)o(y)f(were)f(a)h(user)g(function,)g(getting)g(ne)o(w)f(pool) + h(descriptor)-150 5430 y(ar)o(guments)c(to)f(indicate)h(which)f(pool)h + (to)g(allocate)f(from.)2051 96 y Fq(i)9 b(n)g(t)17 b + Fu(\003)36 b Fw(f)7 b(u)g(n)g(c)g(1)15 b(\()j Fq(i)9 + b(n)g(t)17 b Fu(\003)37 b Fw(i)8 b(n)18 b(\))34 b Fu(f)g(\003)18 + b Fw(i)8 b(n)48 b(=)39 b(1)13 b(;)47 b Fq(r)7 b(e)g(t)g(u)g(r)g(n)49 + b Fw(i)8 b(n)19 b(;)34 b Fu(g)2051 163 y Fq(i)9 b(n)g(t)17 + b Fu(\003)36 b Fw(f)7 b(u)g(n)g(c)g(2)15 b(\()j Fq(i)9 + b(n)g(t)17 b Fu(\003)37 b Fw(i)8 b(n)20 b(\))38 b Fu(f)47 + b Fw(f)10 b(r)g(e)g(e)17 b(\()f(i)8 b(n)20 b(\))12 b(;)2817 + 229 y(i)c(n)46 b(=)38 b(\()21 b Fq(i)9 b(n)g(t)20 b Fu(\003)9 + b Fw(\))41 b(m)7 b(a)g(l)g(l)g(o)g(c)16 b(\()i Fq(s)10 + b(i)g(z)g(e)g(o)g(f)18 b Fw(\()g Fq(i)9 b(n)g(t)23 b + Fw(\))12 b(\))h(;)2809 296 y Fu(\003)c Fw(i)f(n)48 b(=)39 + b(2)13 b(;)47 b Fq(r)7 b(e)g(t)g(u)g(r)g(n)49 b Fw(i)8 + b(n)19 b(;)34 b Fu(g)2051 362 y Fq(i)9 b(n)g(t)57 b Fw(c)11 + b(a)g(l)h(l)f(e)h(r)19 b(\()f Fq(i)9 b(n)g(t)41 b Fw(X)6 + b(\))33 b Fu(f)2121 428 y Fq(i)9 b(n)g(t)18 b Fu(\003)29 + b Fw(\()8 b Fu(\003)15 b Fw(f)7 b(p)18 b(\))10 b(\()20 + b Fq(i)9 b(n)g(t)21 b Fu(\003)11 b Fw(\))36 b(=)g(\()7 + b(X)36 b Fp(>)31 b Fw(1)8 b(\))g(?)39 b(f)7 b(u)g(n)g(c)g(1)51 + b(:)h(f)7 b(u)g(n)g(c)g(2)17 b(;)2121 495 y Fq(i)9 b(n)g(t)39 + b Fu(\003)10 b Fw(p)41 b(=)c(\()21 b Fq(i)9 b(n)g(t)20 + b Fu(\003)9 b Fw(\))41 b(m)7 b(a)g(l)g(l)g(o)g(c)16 b(\()j + Fq(s)9 b(i)h(z)g(e)g(o)g(f)18 b Fw(\()g Fq(i)9 b(n)g(t)23 + b Fw(\))12 b(\))h(;)2121 561 y Fq(i)c(n)g(t)39 b Fu(\003)10 + b Fw(q)39 b(=)j(f)7 b(p)16 b(\()11 b(p)j(\))e(;)2118 + 628 y Fq(r)7 b(e)g(t)g(u)g(r)g(n)35 b Fu(\003)10 b Fw(q)j(;)2042 + 694 y Fu(g)2297 827 y Fz(\(a\))19 b(Input)g(C)g(program)h(with)e(an)h + (indirect)g(function)h(call)2051 1001 y Fq(i)9 b(n)g(t)17 + b Fu(\003)36 b Fw(f)7 b(u)g(n)g(c)g(1)15 b(\()g(P)7 b(o)g(o)g(l)13 + b Fu(\003)29 b Fw(P)16 b(,)50 b Fq(i)9 b(n)g(t)18 b Fu(\003)37 + b Fw(i)8 b(n)18 b(\))34 b Fu(f)g(\003)18 b Fw(i)8 b(n)48 + b(=)39 b(1)13 b(;)46 b Fq(r)7 b(e)g(t)g(u)g(r)g(n)50 + b Fw(i)8 b(n)18 b(;)35 b Fu(g)2051 1068 y Fq(i)9 b(n)g(t)17 + b Fu(\003)36 b Fw(f)7 b(u)g(n)g(c)g(2)15 b(\()g(P)7 b(o)g(o)g(l)13 + b Fu(\003)29 b Fw(P)16 b(,)50 b Fq(i)9 b(n)g(t)18 b Fu(\003)37 + b Fw(i)8 b(n)20 b(\))37 b Fu(f)47 b Fw(p)9 b(o)g(o)g(l)g(f)g(r)g(e)g(e) + 21 b(\()9 b(P)16 b(,)49 b(i)8 b(n)20 b(\))12 b(;)2538 + 1134 y(i)c(n)47 b(=)37 b(\()21 b Fq(i)9 b(n)g(t)20 b + Fu(\003)9 b Fw(\))43 b(p)10 b(o)g(o)g(l)f(a)h(l)g(l)g(o)g(c)17 + b(\()9 b(P)16 b(,)51 b Fq(s)9 b(i)i(z)f(e)f(o)h(f)19 + b Fw(\()e Fq(i)9 b(n)g(t)23 b Fw(\))13 b(\))f(;)2530 + 1200 y Fu(\003)d Fw(i)f(n)48 b(=)39 b(2)13 b(;)47 b Fq(r)7 + b(e)g(t)g(u)g(r)g(n)49 b Fw(i)8 b(n)19 b(;)34 b Fu(g)2051 + 1333 y Fq(i)9 b(n)g(t)57 b Fw(c)11 b(a)g(l)h(l)f(e)h(r)19 + b(\()f Fq(i)9 b(n)g(t)41 b Fw(X)6 b(\))33 b Fu(f)2118 + 1400 y Fw(P)7 b(o)g(o)g(l)41 b(PD1)14 b(;)86 b(p)10 b(o)f(o)h(l)g(c)f + (r)h(e)g(a)f(t)h(e)i(\()r(&)r(PD1)18 b(,)48 b(.)17 b(.)f(.)h(\))g(;) + 2121 1466 y Fq(i)9 b(n)g(t)18 b Fu(\003)29 b Fw(\()8 + b Fu(\003)15 b Fw(f)7 b(p)18 b(\))10 b(\()20 b Fq(i)9 + b(n)g(t)21 b Fu(\003)11 b Fw(\))36 b(=)g(\()7 b(X)36 + b Fp(>)31 b Fw(1)8 b(\))g(?)39 b(f)7 b(u)g(n)g(c)g(1)51 + b(:)h(f)7 b(u)g(n)g(c)g(2)17 b(;)2121 1533 y Fq(i)9 b(n)g(t)39 + b Fu(\003)10 b Fw(p)41 b(=)c(\()21 b Fq(i)9 b(n)g(t)20 + b Fu(\003)9 b Fw(\))43 b(p)10 b(o)g(o)g(l)g(a)f(l)h(l)g(o)g(c)17 + b(\()8 b(PD1)15 b(,)52 b Fq(s)9 b(i)h(z)g(e)g(o)g(f)18 + b Fw(\()g Fq(i)9 b(n)g(t)23 b Fw(\))12 b(\))h(;)2121 + 1599 y Fq(i)c(n)g(t)39 b Fu(\003)10 b Fw(q)39 b(=)j(f)7 + b(p)16 b(\()8 b(PD1)15 b(,)44 b(p)15 b(\))c(;)2121 1665 + y(p)e(o)g(o)g(l)g(d)g(e)g(s)g(t)g(r)g(o)g(y)j(\()r(&)r(PD1)j(\))f(;)49 + b Fq(r)7 b(e)g(t)g(u)g(r)g(n)35 b Fu(\003)10 b Fw(q)i(;)2042 + 1732 y Fu(g)2570 1923 y Fz(\(b\))19 b(C)f(code)i(after)f(pool)g + (allocation)2058 2504 y @beginspecial 35 @llx 35 @lly + 267 @urx 165 @ury 648 @rhi @setspecial + %%BeginDocument: figs/td.func2.ps + %!PS-Adobe-2.0 + %%Creator: dot version 1.9 (Thu Feb 13 13:41:01 CST 2003) + %%For: (vadve) Vikram Adve + %%Title: DataStructures + %%Pages: (atend) + %%BoundingBox: 35 35 267 165 + %%EndComments + save + %%BeginProlog + /DotDict 200 dict def + DotDict begin + + /setupLatin1 { + mark + /EncodingVector 256 array def + EncodingVector 0 + + ISOLatin1Encoding 0 255 getinterval putinterval + + EncodingVector + dup 306 /AE + dup 301 /Aacute + dup 302 /Acircumflex + dup 304 /Adieresis + dup 300 /Agrave + dup 305 /Aring + dup 303 /Atilde + dup 307 /Ccedilla + dup 311 /Eacute + dup 312 /Ecircumflex + dup 313 /Edieresis + dup 310 /Egrave + dup 315 /Iacute + dup 316 /Icircumflex + dup 317 /Idieresis + dup 314 /Igrave + dup 334 /Udieresis + dup 335 /Yacute + dup 376 /thorn + dup 337 /germandbls + dup 341 /aacute + dup 342 /acircumflex + dup 344 /adieresis + dup 346 /ae + dup 340 /agrave + dup 345 /aring + dup 347 /ccedilla + dup 351 /eacute + dup 352 /ecircumflex + dup 353 /edieresis + dup 350 /egrave + dup 355 /iacute + dup 356 /icircumflex + dup 357 /idieresis + dup 354 /igrave + dup 360 /dcroat + dup 361 /ntilde + dup 363 /oacute + dup 364 /ocircumflex + dup 366 /odieresis + dup 362 /ograve + dup 365 /otilde + dup 370 /oslash + dup 372 /uacute + dup 373 /ucircumflex + dup 374 /udieresis + dup 371 /ugrave + dup 375 /yacute + dup 377 /ydieresis + + % Set up ISO Latin 1 character encoding + /starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont + } def + /Times-Roman starnetISO def + /Times-Italic starnetISO def + /Times-Bold starnetISO def + /Times-BoldItalic starnetISO def + /Helvetica starnetISO def + /Helvetica-Oblique starnetISO def + /Helvetica-Bold starnetISO def + /Helvetica-BoldOblique starnetISO def + /Courier starnetISO def + /Courier-Oblique starnetISO def + /Courier-Bold starnetISO def + /Courier-BoldOblique starnetISO def + cleartomark + } bind def + + %%BeginResource: procset + /coord-font-family /Times-Roman def + /default-font-family /Times-Roman def + /coordfont coord-font-family findfont 8 scalefont def + + /InvScaleFactor 1.0 def + /set_scale { + dup 1 exch div /InvScaleFactor exch def + dup scale + } bind def + + % styles + /solid { [] 0 setdash } bind def + /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def + /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def + /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def + /bold { 2 setlinewidth } bind def + /filled { } bind def + /unfilled { } bind def + /rounded { } bind def + /diagonals { } bind def + + % hooks for setting color + /nodecolor { sethsbcolor } bind def + /edgecolor { sethsbcolor } bind def + /graphcolor { sethsbcolor } bind def + /nopcolor {pop pop pop} bind def + + /beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if + } bind def + + /set_font { + findfont exch + scalefont setfont + } def + + % draw aligned label in bounding box aligned to current point + /alignedtext { % width adj text + /text exch def + /adj exch def + /width exch def + gsave + width 0 gt { + text stringwidth pop adj mul 0 rmoveto + } if + [] 0 setdash + text show + grestore + } def + + /boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath + } bind def + + /ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix + } bind def + + /endpage { showpage } bind def + /showpage { } def + + /layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] + def + + /layerlen layercolorseq length def + + /setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def + } bind def + + /onlayer { curlayer ne {invis} if } def + + /onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if + } def + + /curlayer 0 def + + %%EndResource + %%EndProlog + %%BeginSetup + 14 default-font-family set_font + 1 setmiterlimit + % /arrowlength 10 def + % /arrowwidth 5 def + + % make sure pdfmark is harmless for PS-interpreters other than Distiller + /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse + % make '<<' and '>>' safe on PS Level 1 devices + /languagelevel where {pop languagelevel}{1} ifelse + 2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put + } if + + %%EndSetup + %%Page: 1 1 + %%PageBoundingBox: 36 36 267 165 + %%PageOrientation: Portrait + gsave + 35 35 232 130 boxprim clip newpath + 36 36 translate + 0 0 1 beginpage + 0 0 translate 0 rotate + 0.000 0.000 0.000 graphcolor + 14.00 /Times-Roman set_font + + % Node0x9f1e6c8 + gsave 10 dict begin + newpath 77 8 moveto + 121 8 lineto + stroke + newpath 121 8 moveto + 126 8 133 13 133 19 curveto + stroke + newpath 133 19 moveto + 133 35 lineto + stroke + newpath 133 35 moveto + 133 41 127 48 121 48 curveto + stroke + newpath 121 48 moveto + 77 48 lineto + stroke + newpath 77 48 moveto + 72 48 66 42 66 36 curveto + stroke + newpath 66 36 moveto + 66 20 lineto + stroke + newpath 66 20 moveto + 66 14 71 8 77 8 curveto + stroke + gsave 10 dict begin + 99 33 moveto 53 -0.5 (int: HM) alignedtext + end grestore + newpath 66 28 moveto + 133 28 lineto + stroke + gsave 10 dict begin + 99 13 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x9f17c38 + gsave 10 dict begin + 27 102 27 18 ellipse_path + stroke + gsave 10 dict begin + 27 97 moveto 18 -0.5 ( in) alignedtext + end grestore + end grestore + + % Node0x9f17c38 -> Node0x9f1e6c8 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 45 84 moveto + 53 75 64 65 73 55 curveto + stroke + gsave 10 dict begin + solid + newpath 47 85 moveto + 44 82 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 74 57 moveto + 79 48 lineto + 71 54 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % Node0x9f19d38 + gsave 10 dict begin + 99 102 27 18 ellipse_path + stroke + gsave 10 dict begin + 99 97 moveto 32 -0.5 ( tmp) alignedtext + end grestore + end grestore + + % Node0x9f19d38 -> Node0x9f1e6c8 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 99 79 moveto + 99 72 99 65 99 57 curveto + stroke + gsave 10 dict begin + solid + newpath 102 79 moveto + 97 79 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 102 58 moveto + 99 48 lineto + 97 58 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % Node0x9f17ab8 + gsave 10 dict begin + 187 102 43 18 ellipse_path + stroke + gsave 10 dict begin + 187 97 moveto 65 -0.5 (returning) alignedtext + end grestore + end grestore + + % Node0x9f17ab8 -> Node0x9f1e6c8 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 164 83 moveto + 153 75 141 64 130 54 curveto + stroke + gsave 10 dict begin + solid + newpath 165 81 moveto + 162 84 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 132 53 moveto + 123 48 lineto + 129 56 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + endpage + grestore + %%PageTrailer + %%EndPage: 1 + %%Trailer + %%Pages: 1 + end + restore + %%EOF + + %%EndDocument + @endspecial 2134 2587 a(\(c\))g(Mer)o(ged)h(EB)o(U)e(Graph)h(for)2271 + 2670 y Fs(func1)h Fz(and)g Fs(func2)3092 2538 y @beginspecial + 35 @llx 35 @lly 291 @urx 177 @ury 648 @rhi @setspecial + %%BeginDocument: figs/td.main.ps + %!PS-Adobe-2.0 + %%Creator: dot version 1.9 (Thu Feb 13 13:41:01 CST 2003) + %%For: (vadve) Vikram Adve + %%Title: DataStructures + %%Pages: (atend) + %%BoundingBox: 35 35 291 177 + %%EndComments + save + %%BeginProlog + /DotDict 200 dict def + DotDict begin + + /setupLatin1 { + mark + /EncodingVector 256 array def + EncodingVector 0 + + ISOLatin1Encoding 0 255 getinterval putinterval + + EncodingVector + dup 306 /AE + dup 301 /Aacute + dup 302 /Acircumflex + dup 304 /Adieresis + dup 300 /Agrave + dup 305 /Aring + dup 303 /Atilde + dup 307 /Ccedilla + dup 311 /Eacute + dup 312 /Ecircumflex + dup 313 /Edieresis + dup 310 /Egrave + dup 315 /Iacute + dup 316 /Icircumflex + dup 317 /Idieresis + dup 314 /Igrave + dup 334 /Udieresis + dup 335 /Yacute + dup 376 /thorn + dup 337 /germandbls + dup 341 /aacute + dup 342 /acircumflex + dup 344 /adieresis + dup 346 /ae + dup 340 /agrave + dup 345 /aring + dup 347 /ccedilla + dup 351 /eacute + dup 352 /ecircumflex + dup 353 /edieresis + dup 350 /egrave + dup 355 /iacute + dup 356 /icircumflex + dup 357 /idieresis + dup 354 /igrave + dup 360 /dcroat + dup 361 /ntilde + dup 363 /oacute + dup 364 /ocircumflex + dup 366 /odieresis + dup 362 /ograve + dup 365 /otilde + dup 370 /oslash + dup 372 /uacute + dup 373 /ucircumflex + dup 374 /udieresis + dup 371 /ugrave + dup 375 /yacute + dup 377 /ydieresis + + % Set up ISO Latin 1 character encoding + /starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont + } def + /Times-Roman starnetISO def + /Times-Italic starnetISO def + /Times-Bold starnetISO def + /Times-BoldItalic starnetISO def + /Helvetica starnetISO def + /Helvetica-Oblique starnetISO def + /Helvetica-Bold starnetISO def + /Helvetica-BoldOblique starnetISO def + /Courier starnetISO def + /Courier-Oblique starnetISO def + /Courier-Bold starnetISO def + /Courier-BoldOblique starnetISO def + cleartomark + } bind def + + %%BeginResource: procset + /coord-font-family /Times-Roman def + /default-font-family /Times-Roman def + /coordfont coord-font-family findfont 8 scalefont def + + /InvScaleFactor 1.0 def + /set_scale { + dup 1 exch div /InvScaleFactor exch def + dup scale + } bind def + + % styles + /solid { [] 0 setdash } bind def + /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def + /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def + /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def + /bold { 2 setlinewidth } bind def + /filled { } bind def + /unfilled { } bind def + /rounded { } bind def + /diagonals { } bind def + + % hooks for setting color + /nodecolor { sethsbcolor } bind def + /edgecolor { sethsbcolor } bind def + /graphcolor { sethsbcolor } bind def + /nopcolor {pop pop pop} bind def + + /beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if + } bind def + + /set_font { + findfont exch + scalefont setfont + } def + + % draw aligned label in bounding box aligned to current point + /alignedtext { % width adj text + /text exch def + /adj exch def + /width exch def + gsave + width 0 gt { + text stringwidth pop adj mul 0 rmoveto + } if + [] 0 setdash + text show + grestore + } def + + /boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath + } bind def + + /ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix + } bind def + + /endpage { showpage } bind def + /showpage { } def + + /layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] + def + + /layerlen layercolorseq length def + + /setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def + } bind def + + /onlayer { curlayer ne {invis} if } def + + /onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if + } def + + /curlayer 0 def + + %%EndResource + %%EndProlog + %%BeginSetup + 14 default-font-family set_font + 1 setmiterlimit + % /arrowlength 10 def + % /arrowwidth 5 def + + % make sure pdfmark is harmless for PS-interpreters other than Distiller + /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse + % make '<<' and '>>' safe on PS Level 1 devices + /languagelevel where {pop languagelevel}{1} ifelse + 2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put + } if + + %%EndSetup + %%Page: 1 1 + %%PageBoundingBox: 36 36 291 177 + %%PageOrientation: Portrait + gsave + 35 35 256 142 boxprim clip newpath + 36 36 translate + 0 0 1 beginpage + 0 0 translate 0 rotate + 0.000 0.000 0.000 graphcolor + 14.00 /Times-Roman set_font + + % Node0x9f17cf8 + gsave 10 dict begin + newpath 11 8 moveto + 97 8 lineto + stroke + newpath 97 8 moveto + 103 8 110 14 110 20 curveto + stroke + newpath 110 20 moveto + 110 47 lineto + stroke + newpath 110 47 moveto + 110 53 104 60 98 60 curveto + stroke + newpath 98 60 moveto + 12 60 lineto + stroke + newpath 12 60 moveto + 6 60 0 53 0 47 curveto + stroke + newpath 0 47 moveto + 0 20 lineto + stroke + newpath 0 20 moveto + 0 14 5 8 11 8 curveto + stroke + gsave 10 dict begin + 55 45 moveto 96 -0.5 (int* \(int*\): GU) alignedtext + 55 29 moveto 56 -0.5 ( %func1) alignedtext + 55 13 moveto 60 -0.5 ( %func2) alignedtext + end grestore + end grestore + + % Node0x9f18ba8 + gsave 10 dict begin + newpath 154 14 moveto + 210 14 lineto + stroke + newpath 210 14 moveto + 217 14 223 19 223 25 curveto + stroke + newpath 223 25 moveto + 223 41 lineto + stroke + newpath 223 41 moveto + 223 47 217 54 211 54 curveto + stroke + newpath 211 54 moveto + 155 54 lineto + stroke + newpath 155 54 moveto + 148 54 143 48 143 42 curveto + stroke + newpath 143 42 moveto + 143 26 lineto + stroke + newpath 143 26 moveto + 143 20 148 14 154 14 curveto + stroke + gsave 10 dict begin + 183 39 moveto 66 -0.5 (int: HMR) alignedtext + end grestore + newpath 143 34 moveto + 223 34 lineto + stroke + gsave 10 dict begin + 183 19 moveto 4 -0.5 ( ) alignedtext + end grestore + end grestore + + % Node0x9f18b70 + gsave 10 dict begin + 155 114 27 18 ellipse_path + stroke + gsave 10 dict begin + 155 109 moveto 8 -0.5 (q) alignedtext + end grestore + end grestore + + % Node0x9f18b70 -> Node0x9f18ba8 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 162 92 moveto + 165 84 169 73 173 63 curveto + stroke + gsave 10 dict begin + solid + newpath 165 92 moveto + 160 91 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 175 64 moveto + 176 54 lineto + 170 63 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % Node0x9f188a0 + gsave 10 dict begin + 55 114 27 18 ellipse_path + stroke + gsave 10 dict begin + 55 109 moveto 16 -0.5 (fp) alignedtext + end grestore + end grestore + + % Node0x9f188a0 -> Node0x9f17cf8 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 55 91 moveto + 55 84 55 77 55 70 curveto + stroke + gsave 10 dict begin + solid + newpath 58 91 moveto + 53 91 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 58 70 moveto + 55 60 lineto + 53 70 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + + % Node0x9f182e0 + gsave 10 dict begin + 227 114 27 18 ellipse_path + stroke + gsave 10 dict begin + 227 109 moveto 13 -0.5 ( p) alignedtext + end grestore + end grestore + + % Node0x9f182e0 -> Node0x9f18ba8 + gsave 10 dict begin + 0.000 0.000 0.631 edgecolor + newpath 216 93 moveto + 211 84 205 73 199 63 curveto + stroke + gsave 10 dict begin + solid + newpath 218 91 moveto + 214 94 lineto + stroke + end grestore + gsave 10 dict begin + solid + 0.000 0.000 0.631 edgecolor + newpath 201 62 moveto + 194 54 lineto + 197 64 lineto + closepath + fill + 0.000 0.000 0.631 edgecolor + end grestore + end grestore + endpage + grestore + %%PageTrailer + %%EndPage: 1 + %%Trailer + %%Pages: 1 + end + restore + %%EOF + + %%EndDocument + @endspecial 3159 2621 a Fz(\(d\):)e(EB)o(U)g(Graph)i(for)f + Fs(caller)p 2042 2765 1993 3 v 2383 2850 a Fn(Figur)o(e)f(5.)h(Example) + g(with)e(function)h(pointers)2068 2933 y Fy(Though)28 + b Fk(func1)f Fy(and)g Fk(func2)h Fy(ar)m(e)f(called)g(at)f(the)h(same)f + (call)h(site)o(,)f(only)2042 3016 y(one)g(needs)g(a)f(pool)h + (descriptor)-8 b(.)26 b(The)f(algorithm)h(puts)g(them)f(in)g(a)h + (single)2042 3099 y(equivalence)e(class,)f(mer)m(g)o(es)h(their)e(DS)h + (gr)o(aphs,)h(adds)f(a)g(pool)h(ar)m(gument)2042 3182 + y(to)19 b(both)g(functions.)2042 3354 y Fz(of)i(functions)i(at)e(call)g + (sites)g(\(not)h(uncommon)h(in)f(C)f(code\))h(e)o(xacerbate)h(all)2042 + 3437 y(three)i(problems)g(because)h(an)o(y)f(attempt)g(to)f(match)h + (pool)h(ar)o(guments)f(e)o(x-)2042 3520 y(plicitly)c(for)g(dif)n + (ferent)g(callees)h(must)f(account)h(for)f(mismatches)h(between)2042 + 3603 y(the)d(actual)g(and)g(formals)g(for)g(each)h(possible)f(callee.) + 2141 3686 y(Our)24 b(solution)g(is)f(composed)i(of)e(tw)o(o)h(k)o(e)o + (y)g(principles,)f(described)i(be-)2042 3769 y(lo)n(w)-5 + b(,)20 b(and)h(sho)n(wn)g(in)f(pseudocode)j(in)e(Figure)f(6.)g(The)g + (\002rst)g(principle)g(is)g(to)2042 3852 y(partition)c(into)h(equi)n(v) + n(alence)h(classes)f(so)f(that)g(all)g(potentially)h(callees)g(at)f(an) + 2042 3935 y(indirect)h(call)g(site)g(are)g(in)g(the)g(same)g(class.)g + (W)-6 b(e)17 b(then)h(treat)e Fy(all)h Fz(functions)h(in)2042 + 4018 y(the)f(same)h(equi)n(v)n(alence)i(class)d(as)h(potential)f + (callees)h(for)f(that)h(call)f(site.)g(F)o(or)2042 4101 + y(e)o(xample,)23 b Fs(func1)h Fz(and)g Fs(func2)g Fz(in)f(the)g(e)o + (xample)h(\002gure)f(are)h(put)f(into)g(the)2042 4184 + y(same)f(class,)f(and)h(so)f(are)h Fm(F)2780 4192 y Fb(1)2814 + 4184 y Fm(;)13 b(F)2897 4192 y Fb(2)2953 4184 y Fz(and)22 + b Fm(F)3131 4192 y Fb(3)3187 4184 y Fz(in)g(the)f(e)o(xample)h(abo)o(v) + o(e.)g(Lines)2042 4267 y(1-2)e(uses)g(the)g(call)f(graph)h(to)g + (partition)g(all)f(the)g(functions)i(of)e(the)h(program)2042 + 4350 y(into)f(disjoint)g(equi)n(v)n(alence)h(classes)g(in)e(this)h + (manner)l(.)2141 4433 y(The)d(second)h(principle)e(is)h(to)f(simplify)g + (matching)i(nodes)f(between)g(dif-)2042 4516 y(ferent)21 + b(callees)h(at)f(a)g(call)g(site)g(with)g(the)h(nodes)h(of)e(the)h + (caller)f(by)h(mer)o(ging)2042 4599 y(the)e(graphs)g(of)g(all)f + (functions)i(in)e(an)h(equi)n(v)n(alence)i(class,)d(and)h(then)g + (updat-)2042 4682 y(ing)c(the)g(caller)g(graphs)h(to)f(be)g(consistent) + h(with)f(the)g(mer)o(ged)g(callee)g(graphs.)2042 4765 + y(Mer)o(ging)21 b(the)g(graphs)h(ensures)f(that)g(an)g(identical)g(set) + f(of)h(pool)h(descriptor)2042 4848 y(formal)17 b(ar)o(guments)i(will)d + (be)i(inferred)g(for)f(all)g(functions)i(in)e(the)h(class.)f(Up-)2042 + 4932 y(dating)22 b(the)g(caller)f(graphs)i(to)f(be)g(consistent)g(with) + g(the)g(callee)f(graphs)i(\(as)2042 5015 y(e)o(xplained)i(belo)n(w\))g + (ensures)g(that)f(the)h(third)f(problem)h(abo)o(v)o(e)h(\227)e + (\002nding)2042 5098 y(matching)c(nodes)g(between)f(callee)g(and)h + (caller)e(\227)h(is)f(al)o(w)o(ays)i(possible.)2141 5181 + y(In)j(the)h(e)o(xample,)f(the)g(algorithm)h(mer)o(ges)f(the)g(DS)f + (graphs)i(of)f Fs(func1)2042 5264 y Fz(and)e Fs(func2)h + Fz(into)f(the)g(common)h(graph)g(sho)n(wn)g(in)f(Figure)f(5\(c\),)h + (and)h(uses)2042 5347 y(this)j(common)i(graph)g(to)f(transform)g(both)g + (functions.)g(This)g(results)f(in)h(a)2042 5430 y(matching)18 + b(set)f(of)h(pool)g(ar)o(guments)g(for)g(both)g(functions,)g(e)n(v)o + (en)g(though)h(the)p eop end + %%Page: 7 7 + TeXDict begin 7 6 bop -150 66 a Fz(pool)22 b(will)f(be)h(unused)h(in)e + Fs(func1)p Fz(.)h(This)g(common)g(graph)h(is)e(mer)o(ged)h(into)-150 + 149 y(the)i(caller)m(,)g(resulting)g(in)g(the)g(graph)h(sho)n(wn)g(in)f + (Figure)g(5\(d\).)g(Using)h(this)-150 232 y(graph,)19 + b(one)h(descriptor)g(is)e(passed)i(to)f(both)g(functions)h(at)f(the)g + (call)f(site.)-50 315 y(The)23 b(implementation)h(of)f(these)h(graph)g + (mer)o(ging)g(and)g(inlining)f(steps)-150 399 y(\(lines)16 + b(3-8)h(of)g(Figure)f(6\))h(use)g(tw)o(o)f(primiti)n(v)o(e)h(DSA)f + (operations)h(\226)g(mer)o(ging)-150 482 y(tw)o(o)k(graphs)h(and)g + (performing)g(a)f(bottom-up)h(inlining)g(pass)f(on)h(strongly-)-150 + 565 y(connected)36 b(components)g(\(SCCs\))d(of)h(the)g(call)f(graph.)i + (T)-6 b(o)34 b(mer)o(ge)g(the)-150 648 y(graphs)17 b(of)f(tw)o(o)g + (functions)h(in)f(an)g(equi)n(v)n(alence)i(class)e(\(lines)g(3-4\),)g + (we)g(cop)o(y)-150 731 y(one)h(graph)g(into)f(the)g(other)m(,)h(then)f + (unify)h(corresponding)h(formal)f(ar)o(gument)-150 814 + y(nodes)23 b(\(ignoring)f(an)o(y)g(e)o(xtra)g(nodes)g(in)g(one)g(of)g + (the)f(graphs)i(if)e(the)g(formal)-150 897 y(ar)o(gument)29 + b(lists)e(do)h(not)g(match\),)g(global)h(nodes,)g(and)f(the)g(return)h + (v)n(alue)-150 980 y(node)23 b(of)f(each)g(graph.)g(Unifying)h(nodes)f + (causes)h(recursi)n(v)o(e)f(mer)o(ging)h(and)-150 1063 + y(can)15 b(potentially)g(cause)g(loss)g(of)f(some)h(type)g(information) + g(if)f(mer)o(ged)h(nodes)-150 1146 y(ha)o(v)o(e)k(incompatible)h + (types.)-50 1229 y(Finally)-5 b(,)17 b(we)g(perform)h(a)g(bottom-up)g + (\223inlining\224)h(pass)f(on)g(the)g(strongly)-150 1312 + y(connected)27 b(components)h(\(SCCs\))c(of)i(the)f(call)h(graph,)g + (inlining)g(mer)o(ged)-150 1395 y(graphs)20 b(of)e(the)h(callees)g + (into)g(their)f(callers.)h(This)f(simply)h(requires)g(repeat-)-150 + 1478 y(ing)d(the)g(bottom-up)h(inlining)g(pass)f(of)g(the)g(DSA)g + (algorithm)g(\(starting)g(with)-150 1561 y(the)i(mer)o(ged)h(equi)n(v)n + (alence-class)h(graphs)f(of)f(each)h(function\).)g(This)e(step)i(is) + -150 1644 y(described)h(in)f(detail)g(in)f([32)q(].)-50 + 1727 y(W)-6 b(e)16 b(call)h(the)g(resulting)h(DS)e(graphs)i(the)f(EB)o + (U)g(\(\223equi)n(v)n(alence)i(bottom-)-150 1810 y(up\224\))g(graphs.)f + (The)g(EB)o(U)g(graph)h(is)e(more)i(conserv)n(ati)n(v)o(e)g(than)g(the) + f(original)-150 1893 y(DS)25 b(graph)i(because)h(functions)f(kno)n(wn)g + (not)f(to)g(be)h(called)f(at)g(a)g(call-site)-150 1976 + y(may)g(be)f(mer)o(ged)h(into)f(the)h(caller)f(along)h(with)f(those)h + (that)f(are)g(\(because)-150 2059 y(the)o(y)k(are)f(in)h(the)f(same)h + (equi)n(v)n(alence)h(class\).)e(Such)h(cases)g(do)g(not)f(arise)-150 + 2142 y(often)36 b(in)g(practice,)f(and)i(the)e(mer)o(ging)h(of)g(equi)n + (v)n(alence)i(class)d(graphs)-150 2225 y(greatly)25 b(simpli\002es)f + (the)h(o)o(v)o(erall)g(transformation)h(algorithm)f(by)g(solving)-150 + 2308 y(the)18 b(abo)o(v)o(e)g(three)g(problems)h(with)e(a)h(uniform)g + (strate)o(gy)g(based)h(on)f(e)o(xisting)-150 2391 y(DS)g(graph)i + (primiti)n(v)o(es.)30 2517 y Fq(completepoolallocate)p + Fw(\(program)e Fp(P)9 b Fw(\))-28 2584 y(1)87 b Fu(8)p + Fp(cs)19 b Fu(2)14 b Fw(callsites\()p Fp(P)9 b Fw(\))517 + b(//)15 b Fo(Build)f(equivalence)g(classes)-28 2650 y + Fw(2)145 b(unify)16 b(equi)o(vclasses\(callees\()p Fp(cs)p + Fw(\)\))-28 2716 y(3)87 b Fu(8)p Fp(ec)19 b Fu(2)14 b + Fw(equi)o(vclasses\(functions\()p Fp(P)9 b Fw(\)\))160 + b(//)15 b Fo(Build)f(gr)o(aph)h(for)f(eac)o(h)g(class)-28 + 2783 y Fw(4)145 b(ECGraph\(ec\))15 b(=)f(mer)o + (geGraphs\(DSGraphs\(members\(ec\)\)\))-28 2849 y(5)87 + b Fu(8)p Fp(scc)18 b Fu(2)d Fw(tarjanscc\002nder\(callgraph\()p + Fp(P)9 b Fw(\)\))-28 2916 y(6)145 b(ECGraph\(scc\))14 + b(=)h(mer)o(geGraphs\(ECGraphs\(functions\(scc\)\)\))-28 + 2982 y(7)145 b Fu(8)p Fp(cs)19 b Fu(2)14 b Fw(callsites\()p + Fp(scc)p Fw(\))419 b(//)15 b Fo(Inline)g(callees)f(into)h(caller)-28 + 3049 y Fw(8)203 b(ECGraph\(scc\))14 b(=)h(mer)o(geGraph\()p + Fp(cs)p Fw(,)g(ECGraph\(callees\()p Fp(cs)p Fw(\)\)\))-28 + 3115 y(9)87 b Fq(basicpoolallocate)p Fw(\()p Fp(P)9 b + Fw(\))p -150 3196 1993 3 v 92 3280 a Fn(Figur)o(e)18 + b(6.)g Fz(Pseudo)i(code)g(for)e(complete)i(pool)g(allocator)-50 + 3419 y(Gi)n(v)o(en)g(the)h(EB)o(U)e(graphs)i(for)f(a)h(program,)f(the)h + (pool)g(allocator)f(is)g(no)n(w)-150 3502 y(guaranteed)e(to)e(ha)o(v)o + (e)h(all)f(of)g(the)g(pool)h(descriptors)g(required)h(at)e(an)g + (indirect)-150 3585 y(call)22 b(site)f(for)h(an)o(y)h(of)f(the)g + (potential)g(callees)g(of)g(the)h(call)e(site,)h(allo)n(wing)g(it)-150 + 3668 y(to)16 b(apply)h(the)g Fs(basicpoolallocate)j Fz(algorithm)c + (safely)-5 b(.)17 b(Note)f(that)g(lines)-150 3751 y(17-19)28 + b(simply)f(ha)o(v)o(e)g(to)g(use)g(the)g(common)h(graph)g(for)e(all)h + (callees)f(e)n(v)o(en)-150 3834 y(though)20 b(there)f(may)h(no)n(w)f + (be)g(multiple)g(callers)g(for)g(the)g(call)f(at)h(line)g(17.)-50 + 3917 y(A)i(detailed)i(discussion)g(of)f(the)g(comple)o(xity)h(of)f(the) + g(Automatic)g(Pool)-150 4000 y(Allocation)f(algorithm)g(is)f(outside)i + (the)f(scope)g(of)g(this)g(w)o(ork)g(b)o(ut)f(is)h(a)o(v)n(ail-)-150 + 4083 y(able)d(in)f([32].)g(Brie\003y)-5 b(,)17 b(all)g(parts)g(of)g + (the)h(algorithm)f(with)g(the)h(e)o(xception)g(of)-150 + 4166 y(lines)f(5-8)h(of)g(Figure)f(6)g(are)h(linear)f(in)g(the)h(total) + f(size)g(of)h(all)f(DS)f(graphs)j(and)-150 4249 y(the)27 + b(number)g(of)g(instructions)f(in)h(the)f(program,)h(and)h + Fl(\002\()p Fm(n\013)p Fl(\()p Fm(n)p Fl(\)\))e Fz(in)g(the)-150 + 4332 y(number)20 b(of)g(call)f(graph)h(edges.)g(The)f(comple)o(xity)h + (of)f(lines)h(5\2268,)f(the)h(EB)o(U)-150 4415 y(phase,)c(is)f(similar) + f(to)i(the)f(B)o(U)g(phase)h(of)g(DSA,)e(i.e.,)g Fl(\002\()p + Fm(n\013)p Fl(\()p Fm(n)p Fl(\))s(+)s Fm(k)r(\013)p Fl(\()p + Fm(k)r Fl(\))p Fm(c)p Fl(\))p Fz(,)-150 4498 y(if)k Fm(n)p + Fz(,)h Fm(k)i Fz(and)e Fm(c)g Fz(denote)h(the)f(total)f(number)i(of)f + (instructions,)g(the)f(maximum)-150 4581 y(size)h(of)f(a)h(DS)f(graph)h + (for)g(a)f(single)h(procedure,)h(and)f(the)g(number)h(of)e(edges)-150 + 4664 y(in)h(the)f(call)h(graph.)g(In)g(practice,)f Fm(k)j + Fz(is)d(v)o(ery)h(small,)f(typically)h(on)g(the)g(order)-150 + 4747 y(of)g(a)g(hundred)h(nodes)g(or)f(less,)g(e)n(v)o(en)g(for)g(lar)o + (ge)g(programs)h([32].)-150 4948 y FA(4.)91 b(Algorithm)22 + b(Re\002nements)f(and)h(Implementation)-150 5064 y Fn(4.1)75 + b(Ar)o(gument)19 b(P)o(assing)g(f)n(or)g(Global)g(P)o(ools)-150 + 5181 y Fz(A)e(DS)f(node)i(reachable)g(from)f(a)g(global)h(v)n(ariable)g + (requires)f(a)g(pool)h(created)-150 5264 y(in)g Fs(main)i + Fz(because)g(the)e(heap)i(objects)f(at)f(that)g(node)i(may)f(be)g(li)n + (v)o(e)f(through-)-150 5347 y(out)k(the)g(lifetime)f(of)h(the)g + (program.)h(This)f(introduces)h(a)e(major)i(source)f(of)-150 + 5430 y(runtime)f(o)o(v)o(erhead)h(because)f(such)h(a)e(pool)h(w)o(ould) + h(ha)o(v)o(e)e(to)h(passed)g(do)n(wn)2121 55 y Fq(i)9 + b(n)g(t)57 b Fw(p)11 b(r)h(o)g(c)f(e)g(s)g(s)g(l)h(i)g(s)f(t)19 + b(\()j(l)14 b(i)g(s)f(t)21 b Fu(\003)28 b Fw(L)9 b(\))33 + b Fu(f)2195 121 y Fw(l)14 b(i)g(s)f(t)42 b Fu(\003)5 + b Fw(A)h(,)35 b Fu(\003)9 b Fw(B)e(,)35 b Fu(\003)14 + b Fw(t)t(m)t(p)e(;)2188 188 y(P)7 b(o)g(o)g(l)41 b(PD1)15 + b(,)41 b(PD2)15 b(;)88 b Fo(/)12 b(/)61 b(i)13 b(n)h(i)f(t)g(i)h(a)f(l) + g(i)h(z)e(e)56 b(p)8 b(o)g(o)g(l)g(s)2191 254 y Fw(p)i(o)f(o)h(l)g(c)g + (r)g(e)f(a)h(t)f(e)j(\()r(&)r(PD1)19 b(,)48 b(.)17 b(.)g(.)g(\))h(;)59 + b(p)10 b(o)f(o)h(l)g(c)g(r)g(e)f(a)h(t)f(e)j(\()r(&)r(PD2)18 + b(,)48 b(.)17 b(.)f(.)h(\))g(;)2192 320 y(s)11 b(p)g(l)h(i)f(t)g(c)g(l) + h(o)f(n)g(e)i(\()r(&)r(PD1)c(,)29 b(&)8 b(PD2)15 b(,)41 + b(L)7 b(,)29 b(&)5 b(A)s(,)29 b(&)6 b(B)j(\))j(;)2191 + 387 y(p)e(r)g(o)g(c)g(e)g(s)g(s)g(P)g(o)g(r)g(t)g(i)g(o)g(n)h(\()5 + b(A)10 b(\))k(;)89 b Fo(/)13 b(/)55 b(P)8 b(r)g(o)g(c)g(e)g(s)g(s)51 + b(f)13 b(i)h(r)f(s)g(t)62 b(l)14 b(i)g(s)f(t)2191 453 + y Fw(p)d(r)g(o)g(c)g(e)g(s)g(s)g(P)g(o)g(r)g(t)g(i)g(o)g(n)h(\()6 + b(B)12 b(\))i(;)89 b Fo(/)13 b(/)56 b(p)8 b(r)g(o)g(c)g(e)g(s)g(s)50 + b(s)7 b(e)g(c)g(o)g(n)g(d)54 b(l)14 b(i)g(s)f(t)2188 + 586 y Fq(w)7 b(h)g(i)g(l)g(e)15 b Fw(\()5 b(A)j(\))37 + b Fu(f)k Fw(t)t(m)t(p)t(=)o(A)-13 b Fu(\000)c Fp(>)l + Fw(N)5 b(e)g(x)g(t)19 b(;)51 b(p)9 b(o)g(o)g(l)g(f)g(r)g(e)g(e)15 + b(\()r(&)r(PD1)g(,)38 b(A)10 b(\))k(;)38 b(A)n(=)t(t)t(m)t(p)13 + b(;)35 b Fu(g)2190 653 y Fw(p)9 b(o)g(o)g(l)g(d)g(e)g(s)g(t)g(r)g(o)g + (y)k(\()r(&)r(PD1)i(\))f(;)124 b Fo(/)13 b(/)45 b(N)n(O)n(T)n(E)11 + b(:)49 b(t)12 b(h)f(i)g(s)49 b(m)t(o)t(v)t(e)t(d)42 b(u)t(p)2188 + 785 y Fq(w)7 b(h)g(i)g(l)g(e)15 b Fw(\()7 b(B)i(\))37 + b Fu(f)k Fw(t)t(m)t(p)t(=B)-11 b Fu(\000)-17 b Fp(>)l + Fw(N)5 b(e)g(x)g(t)19 b(;)51 b(p)9 b(o)g(o)g(l)g(f)g(r)g(e)g(e)15 + b(\()r(&)r(PD2)g(,)39 b(B)12 b(\))i(;)40 b(B)o(=)t(t)t(m)t(p)13 + b(;)35 b Fu(g)2190 852 y Fw(p)9 b(o)g(o)g(l)g(d)g(e)g(s)g(t)g(r)g(o)g + (y)k(\()r(&)r(PD2)i(\))f(;)124 b Fo(/)13 b(/)56 b(d)9 + b(e)g(s)g(t)g(r)g(o)g(y)51 b(p)7 b(o)g(o)g(l)43 b(PD2)2112 + 918 y Fu(g)p 2042 949 V 2237 1034 a Fn(Figur)o(e)18 b(7.)h + Fz(After)f(mo)o(ving)i Fs(pooldestroy\(&PD1\))i Fz(earlier)2121 + 1236 y Fq(i)9 b(n)g(t)57 b Fw(p)11 b(r)h(o)g(c)f(e)g(s)g(s)g(l)h(i)g(s) + f(t)19 b(\()j(l)14 b(i)g(s)f(t)21 b Fu(\003)28 b Fw(L)9 + b(\))33 b Fu(f)2195 1303 y Fw(l)14 b(i)g(s)f(t)42 b Fu(\003)5 + b Fw(A)h(,)35 b Fu(\003)9 b Fw(B)e(,)35 b Fu(\003)14 + b Fw(t)t(m)t(p)e(;)2188 1369 y(P)7 b(o)g(o)g(l)41 b(PD1)15 + b(,)41 b(PD2)11 b(;)2191 1436 y(p)f(o)f(o)h(l)g(c)g(r)g(e)f(a)h(t)f(e)j + (\()r(&)r(PD1)19 b(,)48 b(.)17 b(.)g(.)g(\))h(;)59 b(p)10 + b(o)f(o)h(l)g(c)g(r)g(e)f(a)h(t)f(e)j(\()r(&)r(PD2)18 + b(,)48 b(.)17 b(.)f(.)h(\))g(;)2192 1502 y(s)11 b(p)g(l)h(i)f(t)g(c)g + (l)h(o)f(n)g(e)i(\()r(&)r(PD1)c(,)29 b(&)8 b(PD2)15 b(,)41 + b(L)7 b(,)29 b(&)5 b(A)s(,)29 b(&)6 b(B)j(\))j(;)2191 + 1569 y(p)e(r)g(o)g(c)g(e)g(s)g(s)g(P)g(o)g(r)g(t)g(i)g(o)g(n)h(\()5 + b(A)10 b(\))k(;)89 b Fo(/)13 b(/)55 b(P)8 b(r)g(o)g(c)g(e)g(s)g(s)51 + b(f)13 b(i)h(r)f(s)g(t)62 b(l)14 b(i)g(s)f(t)2191 1635 + y Fw(p)d(r)g(o)g(c)g(e)g(s)g(s)g(P)g(o)g(r)g(t)g(i)g(o)g(n)h(\()6 + b(B)12 b(\))i(;)89 b Fo(/)13 b(/)56 b(p)8 b(r)g(o)g(c)g(e)g(s)g(s)50 + b(s)7 b(e)g(c)g(o)g(n)g(d)54 b(l)14 b(i)g(s)f(t)2190 + 1701 y Fw(p)c(o)g(o)g(l)g(d)g(e)g(s)g(t)g(r)g(o)g(y)k(\()r(&)r(PD1)i + (\))f(;)89 b Fo(/)13 b(/)56 b(d)9 b(e)g(s)g(t)g(r)g(o)g(y)51 + b(p)7 b(o)g(o)g(l)47 b(\()22 b(i)9 b(n)g(c)g(l)g(u)g(d)g(i)g(n)g(g)55 + b(n)6 b(o)g(d)g(e)g(s)15 b(\))2190 1768 y Fw(p)9 b(o)g(o)g(l)g(d)g(e)g + (s)g(t)g(r)g(o)g(y)k(\()r(&)r(PD2)i(\))f(;)89 b Fo(/)13 + b(/)56 b(d)9 b(e)g(s)g(t)g(r)g(o)g(y)51 b(p)7 b(o)g(o)g(l)47 + b(\()22 b(i)9 b(n)g(c)g(l)g(u)g(d)g(i)g(n)g(g)55 b(n)6 + b(o)g(d)g(e)g(s)15 b(\))2112 1834 y Fu(g)p 2042 1865 + V 2150 1950 a Fn(Figur)o(e)j(8.)h Fz(After)f(eliminating)h + Fs(poolfree)i Fz(calls)e(and)g(dead)h(loops)2042 2164 + y(through)h(man)o(y)g(layers)g(of)f(function)h(calls)f(to)g(be)h(a)o(v) + n(ailable)f(in)h(each)g(func-)2042 2247 y(tion)e(that)g(actually)h + (allocates)f(or)h(frees)f(data)g(in)h(the)f(pool.)h(In)f(practice,)g + (we)2042 2330 y(ha)o(v)o(e)j(found)i(that)e(programs)h(which)f(ha)o(v)o + (e)h(man)o(y)g(heap)g(nodes)g(reachable)2042 2413 y(from)29 + b(globals)h(may)f(get)g(thousands)i(of)e(ar)o(guments)h(added)g(to)f + (the)g(pro-)2042 2496 y(gram.)2141 2579 y(The)24 b(solution)h(is)e + (simple:)h(we)f(create)h(a)g(global)g(v)n(ariable)h(to)f(hold)g(the) + 2042 2662 y(pool)30 b(descriptor)g(for)f(each)h(heap)g(node)g + (reachable)h(from)e(a)g(global)h(and)2042 2745 y(use)g(this)f(where)h + (needed,)g(instead)g(of)g(passing)g(the)g(pool)g(descriptor)g(in)2042 + 2828 y(via)18 b(function)h(ar)o(guments.)f(In)g(practice,)g(this)g + (re\002nement)h(greatly)f(reduces)2042 2911 y(the)31 + b(number)g(of)g(pool)g(ar)o(guments)h(that)e(must)h(be)g(passed)h(to)e + (functions)2042 2994 y(in)h(some)g(C)g(programs.)h(Most)f(importantly) + -5 b(,)31 b(it)g(ensures)g(that)g(the)g(only)2042 3077 + y(pool)g(ar)o(guments)f(that)h(must)f(be)g(passed)h(to)g(a)f(function)h + (are)f(for)g(nodes)2042 3160 y(reachable)c(from)f(pointers)h(passed)g + (in)f(as)g(function)h(ar)o(guments,)f(making)2042 3243 + y(the)30 b(number)i(of)e(pool)h(ar)o(guments)h(gro)n(w)e(with)h(the)f + (number)i(of)e(formal)2042 3326 y(pointer)19 b(ar)o(guments)h(in)f(the) + g(original)g(function.)2042 3487 y Fn(4.2)75 b(poolcr)o(eate/pooldestr) + o(oy)19 b(Placement)2042 3603 y Fz(The)f(algorithm)h(described)h(abo)o + (v)o(e)g(places)f Fs(poolcreate)p Fz(/)p Fs(pooldestroy)2042 + 3686 y Fz(calls)d(at)h(the)g(entry)g(and)h(e)o(xits)f(of)g(each)g + (function.)h(In)f(practice,)g(the)g(lifetime)2042 3769 + y(of)d(the)h(data)f(objects)h(in)g(a)f(pool)h(may)g(be)o(gin)g(at)f(a)h + (later)f(point)g(in)h(the)f(function)2042 3852 y(and)35 + b(may)g(end)g(before)g(the)g(end)g(of)f(the)h(function.)g(Mo)o(ving)h + (the)e(pool)2042 3935 y(create/destro)o(y)18 b(calls)g(later)e(and)j + (earlier)e(within)g(the)g(function)i(reduces)f(the)2042 + 4018 y(lifetime)27 b(of)h(objects)h(in)f(the)g(pool.)g(This)g + (re\002nement)g(can)h(also)f(mak)o(e)h(it)2042 4101 y(more)19 + b(lik)o(ely)g(that)g(the)g(re\002nement)g(in)g(Section)g(4.3)g(can)g + (apply)-5 b(.)2141 4184 y(W)f(e)31 b(modi\002ed)h(the)f(basic)g + (algorithm)h(so)f(that)g(it)g(initially)f(does)i(not)2042 + 4267 y(insert)f Fs(poolcreate)j Fz(/)e Fs(pooldestroy)i + Fz(calls)d(b)o(ut)h(performs)g(all)g(other)2042 4350 + y(transformations.)23 b(F)o(or)g(each)h(pool)g(that)f(must)g(be)h + (created)f(in)g(a)h(function,)2042 4433 y(we)31 b(use)h(tw)o(o)g + (simple)g(depth-\002rst)g(tra)o(v)o(ersals)f(of)h(the)f(CFG)g(to)h + (identify)2042 4516 y(all)25 b(basic)g(blocks)h(where)g(the)f(pool)h + (descriptor)g(must)f(be)h(li)n(v)o(e,)e(based)j(on)2042 + 4599 y(its)21 b(uses,)h(and)h(then)g(place)f Fs(poolcreate)p + Fz(/)p Fs(pooldestroy)27 b Fz(calls)21 b(at)h(edges)2042 + 4682 y(entering)27 b(or)f(lea)o(ving)h(a)f(li)n(v)o(e)g(block)h(from)f + (or)h(to)f(a)g(non-li)n(v)o(e)h(block.)g(The)2042 4765 + y(o)o(v)o(erall)16 b(algorithm)h(is)g(e)o(xtremely)g(simple)f(and)h + (linear)g(in)f(the)h(size)g(of)f(CFG.)2141 4848 y(Figure)24 + b(7)g(illustrates)f(this)g(placement)i(for)e(the)h Fs(processlist)i + Fz(func-)2042 4932 y(tion)j(in)g(our)g(e)o(xample.)g(The)g(call)g(to)f + Fs(pooldestroy\(&PD1\))33 b Fz(has)c(been)2042 5015 y(mo)o(v)o(ed)20 + b(earlier)g(in)f(the)h(function,)g(to)g(immediately)g(after)f(the)h + Fs(while)g Fz(loop)2042 5098 y(that)d(reads)g(the)g(Ne)o(xt)g(\002eld)f + (from)h(nodes)h(in)f(PD1)g(pool.)g(The)g Fs(poolcreate)2042 + 5181 y Fz(calls)h(for)h(both)h(pools)f(cannot)h(be)f(mo)o(v)o(ed)h(an)o + (y)g(later)l(.)2141 5264 y(In)33 b(general,)g(the)f Fs(poolcreate)j + Fz(and)e Fs(pooldestroy)i Fz(calls)d(can)h(be)2042 5347 + y(mo)o(v)o(ed)f(interprocedurally)h(to)e(further)h(reduce)g(the)g + (lifetime)e(of)i(pools,)2042 5430 y(similar)k(to)g(Aik)o(en)h(et)f(al.) + -5 b(')l(s)36 b(w)o(ork)h([1].)f(Ho)n(we)n(v)o(er)m(,)h(that)g(w)o + (ould)g(lik)o(ely)p eop end + %%Page: 8 8 + TeXDict begin 8 7 bop -150 66 a Fz(require)43 b(a)g(more)h(e)o(xpensi)n + (v)o(e,)g(\003o)n(w-sensiti)n(v)o(e)f(interprocedural)h(algo-)-150 + 149 y(rithm)19 b([1])f(and)i(we)f(ha)o(v)o(e)g(not)g(attempted)g(this)g + (so)g(f)o(ar)l(.)-150 286 y Fn(4.3)75 b Fs(poolfree)21 + b Fn(Elimination)-150 403 y Fz(The)26 b(\002nal)f(re\002nement)h(is)f + (to)h(eliminate)f(unnecessary)j Fs(poolfree)f Fz(calls.)-150 + 486 y(Man)o(y)k(short-li)n(v)o(ed)g(data)f(structures)g(ha)o(v)o(e)g(a) + g(\223b)o(uild-use-destro)o(y\224)i(pat-)-150 569 y(tern,)21 + b(in)g(which)h(all)f(allocations)g(happen)i(before)f(an)o(y)g + (deallocations.)g(F)o(or)-150 652 y(e)o(xample,)d(consider)h(Figure)f + (7.)g(Between)g(the)g(call)g(to)f Fs(poolfree\(&PD1,)-150 + 735 y(A\))25 b Fz(and)h(the)f(call)g(to)g Fs(pooldestroy\(&PD1\))p + Fz(,)k(there)c(are)g(no)h(allocations)-150 818 y(out)i(of)f + Fy(any)h Fz(pool.)g(This)f(means)h(that)f(it)g(is)g(unnecessary)i(to)f + (release)f(the)-150 901 y(memory)h(in)f(pool)h(PD1)f(an)o(y)h(earlier)f + (than)h(the)f Fs(pooldestroy\(&PD1\))p Fz(,)-150 984 + y(when)c(all)f(the)g(memory)h(of)f(the)h(pool)g(will)e(be)i(released)f + (back)i(to)e(the)g(sys-)-150 1067 y(tem.)30 b(W)-6 b(e)30 + b(eliminate)g(the)g(call)g(to)g Fs(poolfree\(&PD1,)42 + b(A\))p Fz(,)31 b(which)f(also)-150 1150 y(allo)n(ws)38 + b(the)h(compiler)g(to)f(eliminate)g(the)g(enclosing)i(loop)f + (\(similarly)-150 1233 y(for)28 b Fs(PD2)p Fz(\).)g(Ef)n(fecti)n(v)o + (ely)-5 b(,)27 b(we)h(ha)o(v)o(e)g(performed)h(a)f(simple)g(kind)h(of)f + Fy(static)-150 1316 y(garba)o(g)o(e)21 b(collection)e + Fz(for)g(the)g(objects)g(in)g(this)f(pool)i([31].)e(Note)h(that)g(mo)o + (v-)-150 1399 y(ing)i Fs(pooldestroy)j Fz(calls)d(earlier)g(in)g(the)g + (code)h(can)g(increase)g(the)f(oppor)o(-)-150 1482 y(tunities)e(for)g + (\002nding)g(candidate)h Fs(poolfree)g Fz(calls)f(to)g(eliminate.)-50 + 1565 y(Again,)c(we)h(implemented)h(this)f(optimization)g(as)g(a)g + (simple,)g(backw)o(ard)-150 1648 y(data\003o)n(w)g(analysis)h(on)f(the) + g(CFG,)f(without)h(interprocedural)h(information.)-150 + 1731 y(The)23 b(analysis)h(looks)h(for)e(an)o(y)h(occurrence)h(of)e + Fs(poolfree\(P\))j Fz(such)e(that)-150 1814 y Fy(no)f + Fz(path)f(from)g(the)h Fs(poolfree)g Fz(to)f(the)h Fs(pooldestroy)h + Fz(calls)e(for)g Fm(P)33 b Fz(con-)-150 1897 y(tains)25 + b(an)o(y)h(allocation)f(out)g(of)g(an)o(y)h(pool)g(\(including)g + Fm(P)11 b Fz(\).)24 b(The)h(result)f(for)-150 1980 y + Fs(processlist)d Fz(is)e(sho)n(wn)h(in)e(Figure)h(8.)-150 + 2159 y FA(5.)91 b(P)n(ool)22 b(Allocation)h(Optimizations)-150 + 2275 y Fz(W)-6 b(e)19 b(describe)i(four)f(simple)g(optimizations)g + (that)g(e)o(xploit)g(the)g(partitioning)-150 2358 y(of)j(heap)i + (objects)f(and)g(the)f(dif)n(ferences)h(in)g(beha)o(vior)g(of)f(dif)n + (ferent)h(pools.)-150 2441 y(The)19 b(bene\002ts)g(of)g(all)f(four)h + (optimizations)h(are)f(e)n(v)n(aluated)h(in)f(Section)g(9.)-50 + 2524 y(1\))28 b Fn(A)-7 b(v)o(oiding)27 b(pool)h(allocation)g(f)n(or)g + (singleton)f(objects:)h Fz(Our)g(sim-)-150 2607 y(plest)f(optimization) + h(a)o(v)o(oids)f(pool-allocating)h(nodes)g(that)f(appear)h(to)f(be)-150 + 2690 y(used)18 b(for)g(a)f(single)h(object.)g(W)-6 b(e)17 + b(identify)g(such)i(pools)f(by)g(\002nding)g Fn(H)f Fz(nodes)-150 + 2773 y(not)24 b(pointed)i(to)e(by)g(an)o(y)h(other)g(memory)g(object)f + (\(including)i(itself\),)d(e.g.)-150 2856 y(the)o(y)j(are)g(only)h + (pointed)g(to)f(by)h(local)f(scalar)g(v)n(ariables.)g(This)g(optimiza-) + -150 2939 y(tion)f(a)o(v)o(oids)f(creating)h(and)h(destro)o(ying)g(a)e + (pool)i(descriptor)f(\(minor\))g(and)-150 3022 y(a)o(v)o(oids)i + (signi\002cant)h(w)o(asted)g(space)g(when)g(the)f(object)h(is)f(much)i + (smaller)-150 3105 y(than)23 b(the)f(smallest)g(internal)g(page)h + (\(potentially)g(signi\002cant)f(when)h(man)o(y)-150 + 3188 y(such)d(pools)f(are)g(created\).)g(W)-6 b(e)19 + b(term)f(this)h(\223Selecti)n(v)o(e)g(P)-7 b(A)f(\224.)-50 + 3271 y(2\))41 b Fn(Eliminating)f Fs(poolfree)j Fn(operations:)e + Fz(The)g(re\002nement)h(de-)-150 3354 y(scribed)18 b(in)f(Section)f + (4.3)i(is)e(an)i(optimization)f(that)g(can)h(eliminate)f(the)g(\002nal) + -150 3437 y Fs(poolfree)31 b Fz(operations)g(of)f(a)g(data)g + (structure,)f(which)h(we)g(term)f(\223Pool-)-150 3520 + y(FreeElim.)-5 b(\224)24 b(In)h(some)h(cases,)g(this)f(optimization)h + (can)g(mak)o(e)g(entire)f(data)-150 3603 y(structure)h(tra)o(v)o + (ersals)f(dead,)h(as)f(in)h(the)g(e)o(xample)g(abo)o(v)o(e.)g(As)g + (noted,)g(this)-150 3686 y(optimization)19 b(is)g(enhanced)i(by)e + (smart)g Fs(pooldestroy)i Fz(positioning.)-50 3769 y(Note)f(that)h(se)o + (gre)o(gating)h(data)f(structures)g(into)g(distinct)f(pools)i(is)e + (what)-150 3852 y(enables)g(this)f(optimization)h(to)f(e)o(xploit)g + (the)g(\223b)o(uild-use-destro)o(y\224)i(pattern)-150 + 3935 y(sho)n(wn)28 b(by)f(\(some\))f(data)h(structures.)g(F)o(or)f(e)o + (xample,)h(if)f(there)g(were)h(an)o(y)-150 4018 y(allocations)e(for)f + (the)g(second)i(list)d(between)i Fs(pooldestroy\(&PD1\))j + Fz(and)-150 4101 y(the)j(second)i Fs(while)f Fz(loop,)g(the)f + (optimization)h(w)o(ould)g(not)g(be)g(possible)-150 4184 + y(without)19 b(separating)h(the)f(lists)f(into)h(distinct)g(pools.)-50 + 4267 y(3\))e Fn(\223Bump-pointer\224)g(allocation:)h + Fz(If)f(memory)i(is)e(ne)n(v)o(er)h(free')l(d)g(back)-150 + 4350 y(to)j(a)g(pool,)g(there)g(is)f(no)h(need)h(for)f(the)g(pool)g + (library)g(to)g(maintain)g(freelists)-150 4433 y(or)16 + b(the)h(4-byte)g(header)g(on)g(each)g(object.)g(The)f(b)o(ump)h + (pointer)g(optimization)-150 4516 y(detects)22 b(pools)h(whose)g + (memory)g(is)f(only)h(released)g(by)f(a)g(pooldestro)o(y)-5 + b(,)24 b(as)-150 4599 y(e)o(xplained)32 b(belo)n(w)-5 + b(.)32 b(It)e(then)i(changes)h(the)e(pool)g(operations)i(to)e(use)g + (the)-150 4682 y(\223)p -112 4682 24 4 v 28 w Fs(bp)p + Fz(\224)26 b(v)o(ersions)f(of)g(the)g(pool)g(routines)g(for)g(such)h + (pools.)f(This)f(allocator)-150 4765 y(has)30 b(a)g(shorter)g + (allocation)g(path)g(than)g(the)g(normal)g(pool)h(allocator)f(and)-150 + 4848 y(packs)37 b(objects)g(more)g(densely)g(in)g(memory)g(and)g(cache) + g(\(due)g(to)f(the)-150 4932 y(missing)27 b(object)h(header\).)f(This)g + (optimization)g(is)g(clearly)g(enhanced)i(by)-150 5015 + y(the)24 b(poolfree)g(elimination)g(optimization,)f(which)h(allo)n(ws)g + (both)g(pools)g(in)-150 5098 y(the)19 b(e)o(xample)h(to)f(be)g(changed) + h(into)f(b)o(ump)h(pointer)f(pools.)-50 5181 y(W)-6 b(e)25 + b(implemented)i(this)e(as)h(a)g(simple)g(post-pass)h(o)o(v)o(er)f(the)g + (program.)-150 5264 y(Our)i(implementation)h(w)o(alks)f(the)g(use)h + (chain)f(of)g(each)h(pool)g(descriptor)-150 5347 y(looking)e(for)f(an)o + (y)g(use)h(that)e(is)h(not)g(a)g Fs(poolcreate)p Fz(,)h + Fs(pooldestroy)p Fz(,)h(or)-150 5430 y Fs(poolalloc)p + Fz(.)d(If)e(only)h(these)g(uses)g(occur)m(,)g(the)g(pool)g(is)f + (promoted)i(to)e(use)2042 66 y(a)28 b(b)o(ump)h(pointer)f(by)h + (replacing)g(the)f(ordinary)h(pool)g(library)g(calls)e(with)2042 + 149 y(the)21 b(\223)p 2192 149 V 28 w Fs(bp)p Fz(\224)h(v)o(ersions.)f + (Note)g(that)g(our)h(implementation)g(currently)f(cannot)2042 + 232 y(promote)33 b(an)o(y)g(pools)g(whose)g(descriptors)g(are)f(passed) + h(into)g(an)o(y)g(other)2042 315 y(function,)19 b(including)h(user)f + (functions)h(lik)o(e)f(those)h(in)e(the)h(e)o(xample.)2141 + 399 y(4\))25 b Fn(Intelligent)d(object)i(alignment:)g + Fz(A)g(traditional)g Fs(malloc)h Fz(library)2042 482 + y(must)15 b(be)f(conserv)n(ati)n(v)o(e)j(about)e(memory)h(alignment)f + (because)h(it)e(lacks)h(type)2042 565 y(information)24 + b(for)f(the)g(memory)h(it)f(allocates.)g(Man)o(y)h(architectures)g + (\(e.g.,)2042 648 y(Sparc)19 b(V9\))h Fy(r)m(equir)m(e)g + Fz(that)g(certain)f(8-byte)h(v)n(alues)h(\(e.g.,)d(C)h(doubles\))i + (must)2042 731 y(be)j(8-byte)g(aligned,)g(while)f(others)h(\(e.g.,)f + (x86\))h(impose)g(signi\002cant)g(per)o(-)2042 814 y(formance)18 + b(penalties)g(if)f(such)h(v)n(alues)g(are)g(misaligned.)g(This)f + (forces)g(man)o(y)2042 897 y(system)k(malloc)h(libraries)f(to)g(use)g + (8-byte)h(alignment)g(for)f Fy(all)g Fz(objects,)g(in-)2042 + 980 y(creasing)e(memory)f(consumption)i(and)f(reducing)g(cache)g + (density)-5 b(.)19 b(F)o(or)e(e)o(x-)2042 1063 y(ample,)g(tw)o(o)h + (successi)n(v)o(e)g(16)g(byte)g(objects)g(will)e(be)i(placed)g(24)g + (bytes)g(apart)2042 1146 y(because)k(4)f(bytes)h(are)f(typically)h + (used)f(as)h(a)f(malloc)g(object)g(header)m(,)h(forc-)2042 + 1229 y(ing)d(an)g(e)o(xtra)g(4)g(bytes)h(of)e(padding)j(per)e(object)g + (for)g(proper)h(alignment.)2141 1312 y(Because)28 b(man)o(y)g(pools)f + (are)g(type)h(homogeneous,)h(we)e(ha)o(v)o(e)g(reliable)2042 + 1395 y(compile-time)h(information)g(about)g(data)g(types)g(in)f(such)h + (pools.)g(There-)2042 1478 y(fore,)20 b(we)g(use)g(4-byte)h(alignment)g + (when)g(it)f(is)f(pro)o(v)n(ably)j(safe)e(\(i.e.,)f(a)h(pool)2042 + 1561 y(is)j(type)h(homogenous)i Fy(and)g Fz(no)e(\002eld)f(of)h(the)f + (object)h(will)e(be)i(improperly)2042 1644 y(aligned)c(for)f(the)g(tar) + o(get)g(architecture\).)g(Otherwise)g(we)g(use)g(8-byte)h(align-)2042 + 1727 y(ment.)f(The)f(alignment)i(is)f(speci\002ed)g(when)g(the)g(pool)h + (is)e(created.)2042 1910 y FA(6.)91 b(Node)21 b(Collocation)i + (Heuristics)2042 2026 y Fz(The)34 b(pool)h(allocation)g(algorithm)g(so) + g(f)o(ar)f(pro)o(vides)h(a)g(frame)n(w)o(ork)g(for)2042 + 2109 y(se)o(gre)o(gating)f(heap)g(data)g(structures)f(b)o(ut)g(ne)n(v)o + (er)h(collocates)g(objects)g(of)2042 2192 y(tw)o(o)25 + b(DS)f(nodes)i(into)f(the)g(same)g(pool.)g(W)-6 b(e)24 + b(can)i(adapt)f(the)g(algorithm)g(to)2042 2275 y(collocate)j(a)f(set)h + (of)f(nodes)i(by)f(changing)i(line)d(9)h(so)g(that)f + Fs(poolcreate)2042 2358 y Fz(and)35 b Fs(pooldestroy)i + Fz(are)d(inserted)h(for)g(only)g(one)g(of)g(the)f(nodes,)h(and)2042 + 2441 y(initializing)18 b(pdmap)i(to)f(use)g(the)g(same)h(descriptor)f + (for)g(the)g(other)g(nodes.)2141 2524 y(Since)37 b(heap)h(objects)g + (are)f(laid)g(out)g(separately)h(and)g(dynamically)2042 + 2607 y(within)25 b(each)h(pool,)f(collocating)h(objects)g(can)g(gi)n(v) + o(e)g(the)f(compiler)h(some)2042 2690 y(control)38 b(o)o(v)o(er)h + (internal)f(layout)h(of)f(data)h(structures.)f(Ev)o(en)g(more)h(so-) + 2042 2773 y(phisticated)27 b(control)h(might)f(be)g(possible)h(using)f + (additional)h(techniques)2042 2856 y(\(e.g.,)18 b([9]\))h(customized)h + (on)f(each)h(pool.)2141 2939 y(W)-6 b(e)25 b(propose)h(tw)o(o)e(e)o + (xample)i(static)e(options)h(for)g(choosing)h(which)f + Fn(H)2042 3022 y Fz(nodes)g(should)g(share)f(a)g(common)i(pool.)e(W)-6 + b(e)23 b(de\002ne)i(a)f Fy(Collection)g Fz(to)g(be)2042 + 3105 y(either)17 b(a)h(node)h(with)e Fm(A)k Fl(=)g Fm(tr)r(ue)p + Fz(,)c(or)h(an)o(y)g(non-tri)n(vial)g(strongly)g(connected)2042 + 3188 y(component)30 b(\(i.e.,)d(containing)i(at)f(least)g(one)h(c)o + (ycle\))f(in)g(the)g(DS)g(Graph.)2042 3271 y(Gi)n(v)o(en)17 + b(this,)f(an)o(y)h Fn(H)g Fz(node)g(reachable)h(from)f(a)g(Collection)f + (represents)i(a)e(set)2042 3354 y(of)j(objects)i(that)e(may)h(be)g + (visited)g(by)g(a)g(single)g(tra)o(v)o(ersal)f(o)o(v)o(er)h(the)g + (objects)2042 3437 y(of)f(the)g(Collection.)2141 3520 + y Fn(OneP)o(oolP)o(erCollection:)39 b Fz(All)20 b(candidate)h + Fn(H)g Fz(nodes)g(in)f(a)h(collection)2042 3603 y(are)i(assigned)h(to)f + (a)g(single)g(pool.)g(An)o(y)h(other)f Fn(H)g Fz(node)h(reachable)g + (from)f(a)2042 3686 y(collection)17 b(\(without)g(going)h(through)g + (another)g(collection\))f(is)f(assigned)i(to)2042 3769 + y(the)25 b(same)g(pool)h(as)f(the)g(collection.)g(This)g(choice)h(ef)n + (fecti)n(v)o(ely)f(partitions)2042 3852 y(the)h(heap)h(so)g(that)f + (each)h(minimal)g(\223tra)o(v)o(ersable\224)f(collection)h(of)g + (objects)2042 3935 y(becomes)20 b(a)e(separate)i(pool.)f(Intuiti)n(v)o + (ely)-5 b(,)18 b(this)h(gi)n(v)o(es)g(the)g(\002nest-grain)g(par)o(-) + 2042 4018 y(titioning)j(of)g(recursi)n(v)o(e)g(data)h(structures,)e + (which)i(are)f(often)g(hierarchical.)2042 4101 y(It)d(f)o(a)o(v)o(ors)g + (tra)o(v)o(ersals)g(o)o(v)o(er)g(a)h(single)f(collection)h(within)f + (such)i(a)e(hierarchi-)2042 4184 y(cal)g(\(i.e.,)e(multi-collection\))i + (data)g(structure.)2141 4267 y Fn(MaximalDS:)j Fz(A)g(maximal)g + (connected)i(subgraph)g(of)e(the)g(DS)f(graph)2042 4350 + y(in)34 b(which)h(all)f(nodes)h(are)f Fn(H)h Fz(nodes)g(are)f(assigned) + i(to)e(a)g(single)h(pool.)2042 4433 y(This)c(partition)g(could)h(be)f + (useful)g(as)h(a)f(def)o(ault)g(choice)h(if)f(there)g(is)g(no)2042 + 4516 y(information)19 b(about)h(tra)o(v)o(ersal)e(orders)i(within)e + (and)i(across)f(collections.)2141 4599 y(Our)30 b(implementation)g + (supports)g(\003e)o(xible)g(colocation)g(policies,)f(b)o(ut)2042 + 4682 y(in)21 b(practice)h(we)g(ha)o(v)o(e)g(found)h(that)e(using)i(a)e + (static)g(collocation)i(heuristics)2042 4765 y(rarely)c(outperform)i + (\(and)f(is)f(often)g(w)o(orse)h(than\))g(assigning)h(each)f + Fn(H)f Fz(node)2042 4848 y(to)36 b(a)h(separate)g(pool)g(\(see)g([32])g + (for)f(a)h(discussion\).)g(W)-6 b(e)36 b(e)o(xpect)h(that)2042 + 4932 y(more)29 b(sophisticated)h(static)f(analysis)h(of)f(tra)o(v)o + (ersal)f(patterns)i(combined)2042 5015 y(with)e(pro\002le)h(data)g + (will)f(be)h(needed)i(to)d(statically)h(choose)h(the)f(optimal)2042 + 5098 y(colocation)23 b(con\002guration.)g(W)-6 b(e)21 + b(lea)o(v)o(e)h(it)g(to)g(future)g(w)o(ork)g(to)g(de)n(v)o(elop)i(an) + 2042 5181 y(ef)n(fecti)n(v)o(e)17 b(approach)h(for)f(pro\002table)g + (collocation.)g(The)g(discussion)g(abo)o(v)o(e,)2042 + 5264 y(sho)n(ws,)25 b(ho)n(we)n(v)o(er)h(that)e(\(a\))h(collocation)h + (of)e(pools)i(can)f(be)g(implemented)2042 5347 y(easily)-5 + b(,)16 b(and)h(\(b\))g(qualitati)n(v)o(ely)-5 b(,)16 + b(the)h(pointer)g(analysis)f(and)i(pool)f(allocation)2042 + 5430 y(pro)o(vide)j(a)e(useful)i(basis)f(for)g(per)o(-data-structure)g + (choices.)p eop end + %%Page: 9 9 + TeXDict begin 9 8 bop -150 66 a FA(7.)91 b(Compiler)22 + b(A)n(pplications)g(of)h(P)n(ool)f(Allocation)-150 183 + y Fz(W)-6 b(e)20 b(belie)n(v)o(e)h(that)g(Automatic)g(Pool)f + (Allocation)h(combined)h(with)e(the)h(un-)-150 266 y(derlying)i + (pointer)g(analysis)g(pro)o(vides)g(a)f(ne)n(w)h(frame)n(w)o(ork)g(for) + f(analyzing)-150 349 y(and)17 b(optimizing)f(pointer)o(-intensi)n(v)o + (e)h(programs,)g(operating)g(at)e(the)h(le)n(v)o(el)g(of)-150 + 432 y(entire)22 b(data)g(structure)g(instances,)h(instead)f(of)g(indi)n + (vidual)h(load/store)g(op-)-150 515 y(erations)i(or)g(indi)n(vidual)g + (data)g(types.)g(This)f(is)h(because)h(Automatic)e(Pool)-150 + 598 y(Allocation)d(pro)o(vides)i(four)e(fundamental)h(bene\002ts)g(to)f + (subsequent)i(com-)-150 681 y(piler)c(passes:)-127 829 + y(1.)29 b Fy(Data)18 b(structur)m(e-speci\002c)h(policies)e(via)h(se)m + (gr)m(e)m(gation)p Fz(:)h(Allocating)e(dis-)-42 912 y(tinct)26 + b(data)g(structures)h(from)f(dif)n(ferent)g(pools)h(allo)n(ws)f + (compiler)h(and)-42 995 y(run-time)22 b(techniques)h(to)f(be)g + (customized)h(for)f(each)g(instance.)g(These)-42 1078 + y(techniques)32 b(can)g(use)f(both)g(static)g(pool)g(properties)h + (\(e.g.,)e(type)i(in-)-42 1161 y(formation)25 b(and)g(points-to)g + (relationships\))g(and)g(dynamic)h(properties)-42 1244 + y(\(an)o(ything)20 b(recordable)g(in)f(per)o(-pool)g(metadata\).)-127 + 1344 y(2.)29 b Fy(Mapping)j(of)e(pointer)o(s)h(to)f(pool)g(descriptor)o + (s)p Fz(:)i(The)e(transformation)-42 1427 y(pro)o(vides)19 + b(a)f(static)f(man)o(y-to-one)j(mapping)f(of)f(heap)h(pointers)g(to)f + (pool)-42 1510 y(descriptors.)32 b(This)g(information)h(is)f(k)o(e)o(y) + h(to)f(most)h(transformations)-42 1593 y(that)25 b(e)o(xploit)g(pool)g + (allocation)g(because)h(it)f(enables)g(the)g(compiler)g(to)-42 + 1676 y(transform)18 b(pointer)h(operations)g(into)e(pool-speci\002c)i + (code)g(sequences.)-42 1759 y(It)f(is)h(used)g(by)h(both)f(the)g(e)o + (xample)h(applications)g(described)g(belo)n(w)-5 b(.)-127 + 1859 y(3.)29 b Fy(T)-6 b(ype-homo)o(g)o(eneous)40 b(pools)p + Fz(:)d(Man)o(y)g(pools)g(are)f(completely)h(type-)-42 + 1942 y(homogeneous,)49 b(as)d(sho)n(wn)h(in)f(Section)h(9,)f(e)n(v)o + (en)h(C)f(programs.)-42 2025 y(No)o(v)o(el)22 b(compiler)h(and)g + (run-time)g(techniques)g(are)g(possible)g(for)f(type-)-42 + 2108 y(homogeneous)k(pools)e(that)f(w)o(ould)i(not)e(be)h(possible)g + (on)g(other)g(pools)-42 2191 y(or)19 b(the)g(general)g(heap)h(\(e.g.)f + (the)g(alignment)g(optimization\).)-127 2290 y(4.)29 + b Fy(Knowledg)o(e)e(of)e(the)h(run-time)g(points-to)g(gr)o(aph)p + Fz(:)h(One)e(w)o(ay)i(to)e(vie)n(w)-42 2373 y(pool)j(allocation)f(is)g + (that)g(it)f(partitions)i(the)f(heap)h(to)f(pro)o(vide)h(a)f(run-)-42 + 2456 y(time)15 b(representation)h(of)f(the)h(points-to)f(graph.)h(The)f + (compiler)h(has)g(full)-42 2539 y(information)24 b(about)h(which)e + (pools)i(contain)f(pointers)g(to)g(other)g(pools)-42 + 2622 y(and,)e(for)f(type-homogeneous)k(pools,)d(where)g(all)f(the)h + (intra-pool)g(and)-42 2705 y(inter)o(-pool)h(pointers)h(are)f(located.) + g(Such)h(information)f(is)g(useful)h(an)o(y)-42 2788 + y(time)18 b(pointers)i(need)g(to)e(be)i(tra)o(v)o(ersed)f(or)f(re)n + (written)h(at)g(run-time.)-50 2937 y(The)28 b(optimizations)g + (described)h(earlier)f(sho)n(w)g(some)h(simple)f(e)o(xam-)-150 + 3020 y(ples)17 b(of)g(ho)n(w)h(compiler)f(techniques)h(can)g(e)o + (xploit)f(these)g(bene\002ts.)g(In)g(other)-150 3103 + y(w)o(ork,)27 b(we)g(de)n(v)o(eloped)i(tw)o(o)e(ne)n(w)h(compiler)f + (techniques)i(that)d(are)i(much)-150 3186 y(more)21 b(sophisticated)h + (and)f(e)o(xploit)g(man)o(y)g(or)g(all)f(of)g(the)h(abo)o(v)o(e)h + (properties)-150 3269 y(of)i(pool)i(allocation.)e(W)-6 + b(e)24 b(summarize)h(these)g(v)o(ery)g(brie\003y)f(here;)h(each)g(is) + -150 3352 y(described)20 b(in)f(detail)g(else)n(where)g([19)q(,)f(35)q + (]:)-150 3476 y Fn(T)-6 b(ranspar)o(ent)38 b(P)o(ointer)f(Compr)o + (ession)p Fz(:)g(After)h(pool)h(allocation,)f(the)-150 + 3559 y(static)18 b(mapping)i(of)e(pointers)h(to)g(pool)g(descriptors)g + (allo)n(ws)g(us)f(to)h(use)g Fy(pool)-150 3642 y(indices)g + Fz(\(i.e.,)f(byte)i(of)n(fsets)f(relati)n(v)o(e)g(to)f(the)h(pool)h + (base\))g(instead)f(of)g(point-)-150 3725 y(ers)k(to)g(identify)h + (objects)f(in)h(a)f(pool.)g(Since)g(most)h(indi)n(vidual)g(data)f + (struc-)-150 3810 y(tures)c(are)g(lik)o(ely)h(to)f(ha)o(v)o(e)g(f)o(ar) + h(less)f(than)g Fl(2)965 3778 y Fb(32)1050 3810 y Fz(distinct)g(nodes,) + h(se)o(gre)o(gating)-150 3893 y(data)26 b(structure)g(instances)g(allo) + n(ws)g(us)g(to)f(represent)h(these)g(inde)o(x)o(es)h(with)-150 + 3976 y(inte)o(gers)17 b(smaller)g(than)g(the)g(pointer)h(size)f + (\(e.g.,)f(32)h(bits)g(on)g(a)g(64-bit)g(host\).)-150 + 4059 y(In)f([35)q(],)f(we)h(implement)g(this)g(transformation)g(and)h + (sho)n(w)g(that)e(it)h(can)g(ha)o(v)o(e)-150 4142 y(a)28 + b(signi\002cant)g(and)h(sometimes)g(dramatic)f(impact)g(on)h(both)f + (the)h(perfor)o(-)-150 4225 y(mance)19 b(and)g(the)g(memory)g + (footprint)g(of)f(pointer)o(-intensti)n(v)o(e)h(programs)h(on)-150 + 4308 y(64-bit)d(systems.)f(This)h(transformation)g(e)o(xploits)g(the)f + (se)o(gre)o(gation)h(of)g(data)-150 4391 y(structures)h(into)g(pools)h + (\(which)f(allo)n(ws)g(small)f(indices\),)h(type)g(homogene-)-150 + 4474 y(ity)g(\(which)g(allo)n(ws)h(compression)g(of)f(indices)h(by)g + (re)n(writing)f(structure)g(ac-)-150 4557 y(cesses)26 + b(and)g(allocations\),)f(and)h(of)g(course)g(the)f(mapping)i(of)f + (pointers)f(to)-150 4640 y(pools)20 b(\(making)f(the)g(pool)h(base)f + (implicit\).)-50 4723 y(W)-6 b(e)19 b(also)h(describe)h(a)f(dynamic)h + (v)o(ersion)g(of)f(the)g(algorithm)h(where)f(the)-150 + 4806 y(pool)i(runtime)f(library)g(dynamically)h(re)n(writes)e(nodes)i + (to)f(gro)n(ws)h(pointers)-150 4890 y(in)c(data)h(structures)g(when)g + (the)g Fl(2)706 4858 y Fb(32)771 4890 y Fm(nd)f Fz(node)i(is)e + (allocated.)h(This)f(allo)n(ws)g(us)-150 4973 y(to)29 + b(speculati)n(v)o(ely)h(compress)g(pointers)g(to)f(32-bits)h(while)f + (retaining)g(the)-150 5056 y(ability)i(to)f(dynamically)i(e)o(xpand)g + (them)g(to)e(64-bits)h(if)g(full)f(addressing)-150 5139 + y(generality)19 b(is)g(needed.)-150 5264 y Fn(Pr)o(ogram)27 + b(Safety)e(W)o(ithout)f(Garbage)j(Collection)p Fz(:)e(All)g(the)h(pre)n + (vious)-150 5347 y(applications)j(of)g(pool)g(allocation)g(focus)h(on)f + (impro)o(ving)g(performance.)-150 5430 y(Another)d(major)g(application) + g(of)g(pool)g(allocation)g(has)g(been)h(to)f(enforce)2042 + 66 y(program)21 b(safety)g(while)f(allo)n(wing)h(e)o(xplicit)f(memory)h + (deallocation)g(for)f(C)2042 149 y(progams)k(\(the)f(techniques)h(for)f + (a)g(type-safe)h(subset)g(of)f(C)g(are)g(described)2042 + 232 y(in)e([19)q(])f(and)i(a)g(major)f(e)o(xtension)h(to)g(nearly)f + (arbitrary)h(C)f(is)f(in)i(progress\).)2042 315 y(This)17 + b(w)o(ork)i(e)o(xploits)f(tw)o(o)g(k)o(e)o(y)g(properties:)g(pools)h + (in)f(type-safe)g(programs)2042 399 y(are)e(type)g(homogeneous,)i(and)e + (the)g(se)o(gre)o(gation)h(of)e(indi)n(vidual)i(data)f(struc-)2042 + 482 y(tures)22 b(into)g(pools)h(ensures)f(that)g(man)o(y)h(pools)g(are) + f(relati)n(v)o(ely)g(short-li)n(v)o(ed.)2042 565 y(The)g + (type-homogeneity)i(means)f(that)e(e)n(v)o(en)i(with)f(e)o(xplicit)f + (deallocation,)2042 648 y(we)h(can)h(pre)n(v)o(ent)g(dangling)h + (pointers)f(into)f(the)h(pool)g(from)f(being)i(able)e(to)2042 + 731 y(cause)j(unintended)i(type)e(violations.)h(The)e(short)i(pool)f + (lifetimes)f(ensure)2042 814 y(that)19 b(memory)g(consumption)i(does)f + (not)f(increase)g(signi\002cantly)-5 b(.)2042 1054 y + FA(8.)91 b(Implementation)2042 1171 y Fz(W)-6 b(e)24 + b(implemented)i(Automatic)f(Pool)g(Allocation)g(as)g(a)g(link-time)f + (trans-)2042 1254 y(formation)c(using)h(the)f(LL)-7 b(VM)19 + b(Compiler)h(Infrastructure)h([34].)f(Perform-)2042 1337 + y(ing)j(cross-module,)h(interprocedural)g(techniques)g(\(lik)o(e)f + (automatic)g(pool)2042 1420 y(allocation\))17 b(at)f(link-time)h(has)g + (tw)o(o)g(adv)n(antages)i([3]:)d(it)h(preserv)o(es)g(most)g(of)2042 + 1503 y(the)f(bene\002ts)h(of)f(separate)h(compilation)g(\(requiring)f + (fe)n(w)h(or)f(no)h(changes)g(to)2042 1586 y(Mak)o(e\002les)g(for)f + (man)o(y)g(applications\),)h(and)g(it)e(ensures)i(that)f(as)g(much)h + (of)f(the)2042 1669 y(program)k(is)e(a)o(v)n(ailable)h(for)g + (interprocedural)h(optimization)g(as)e(possible.)2141 + 1752 y(Our)30 b(system)f(compiles)h(source)g(programs)g(into)f(the)h + (LL)-7 b(VM)28 b(repre-)2042 1835 y(sentation)d(\(for)f(C)g(and)h(C++,) + e(we)i(use)f(a)g(modi\002ed)h(v)o(ersion)g(of)f(the)h(GCC)2042 + 1918 y(front-end\),)g(applies)g(standard)h(intraprocedural)g + (optimizations)g(to)e(each)2042 2001 y(module,)f(links)g(the)g(LL)-7 + b(VM)22 b(object)h(\002les)g(into)g(a)f(single)i(LL)-7 + b(VM)21 b(module,)2042 2084 y(and)28 b(then)g(applies)h + (interprocedural)g(optimizations.)f(At)f(this)g(stage,)h(we)2042 + 2167 y(\002rst)d(compute)i(the)f(complete)h(Bottom-up)g(DS)e(graphs)i + (and)g(then)f(apply)2042 2250 y(the)h(Pool)f(Allocation)i(algorithm)f + (in)g(Figure)f(6.)h(Finally)-5 b(,)26 b(we)h(run)g(a)g(fe)n(w)2042 + 2333 y(passes)21 b(to)g(clean)g(up)h(the)e(resulting)i(code,)f(the)g + (most)g(important)g(of)g(which)2042 2416 y(are)g(interprocedural)h + (constant)f(propagation)i(\(IPCP\),)18 b(to)j(propagate)h(null)2042 + 2499 y(or)28 b(global)i(pool)f(descriptors)g(when)g(these)g(are)g + (passed)h(as)e(function)i(ar)o(-)2042 2582 y(guments,)c(and)g(dead)g + (ar)o(gument)g(elimination)g(\(to)f(remo)o(v)o(e)h(pool)g(pointer)2042 + 2665 y(ar)o(guments)j(made)h(dead)f(by)h(IPCP\).)c(The)j(resulting)g + (code)h(is)e(compiled)2042 2748 y(to)23 b(either)g(nati)n(v)o(e)g(or)g + (C)g(code)h(using)g(one)g(of)f(the)g(LL)-7 b(VM)22 b(back-ends,)i(and) + 2042 2831 y(link)o(ed)30 b(with)e(an)o(y)i(nati)n(v)o(e)g(code)g + (libraries)e(\(i.e.,)g(those)i(not)f(a)o(v)n(ailable)g(in)2042 + 2914 y(LL)-7 b(VM)18 b(form\))g(for)h(e)o(x)o(ecution.)2141 + 2997 y(Our)i(implementation)h(of)f(Data)g(Structure)g(Analysis)g(and)h + (Automatic)2042 3080 y(Pool)30 b(Allocation)g(are)g(publicly)h(a)o(v)n + (ailable)f(from)g(the)g(LL)-7 b(VM)29 b(web)i(site)2042 + 3163 y(\()p Fs(http://llvm.cs.uiuc.edu/)p Fz(\),)d(together)23 + b(with)g(the)g(LL)-7 b(VM)22 b(infras-)2042 3246 y(tructure,)27 + b(front-ends)h(for)f(C)f(and)i(C++,)f(and)h(most)f(of)g(the)g + (benchmarks)2042 3329 y(used)19 b(in)g(the)g(e)o(xperimental)h(e)n(v)n + (aluation)g(in)f(Section)g(9.)2042 3570 y FA(9.)91 b(Experimental)21 + b(Results)2042 3686 y Fz(W)-6 b(e)15 b(e)n(v)n(aluated)i(Automatic)f + (Pool)f(Allocation)h(e)o(xperimentally)h(in)e(order)h(to)2042 + 3769 y(study)j(se)n(v)o(eral)g(issues:)f(compilation)i(time,)e(o)o(v)o + (erall)g(performance)i(impact)2042 3852 y(of)d(pool)h(allocation,)f + (the)g(contrib)o(utions)h(of)g(the)f(later)g(optimizations)g(it)g(en-) + 2042 3935 y(ables,)i(and)g(the)g(ef)n(fect)g(on)h(the)f(performance)h + (of)f(the)g(memory)g(hierarchy)-5 b(.)2141 4018 y(F)o(or)34 + b(our)g(e)o(xperiments)g(in)g(this)f(paper)m(,)h(we)g(used)h(the)e(LL) + -7 b(VM-to-C)2042 4101 y(back-end)32 b(and)e(compiled)h(the)g + (resulting)f(C)g(code)h(with)e(GCC)h(3.4.2)g(at)2042 + 4184 y(-O3.)g(The)h(e)o(xperiments)h(were)e(run)i(on)f(an)g(AMD)g + (Athlon)g(MP)g(2100+)2042 4267 y(running)c(Fedora)f(Core)g(1)g(Linux.)g + (This)f(machine)i(has)f(e)o(xclusi)n(v)o(e)h(64KB)2042 + 4350 y(L1)e(and)h(256KB)g(L2)f(data)h(caches.)f(The)h(C)f(library)g(on) + h(this)f(system)h(im-)2042 4433 y(plements)j Fs(malloc)p + Fz(/)p Fs(free)h Fz(using)g(a)e(modi\002ed)h(Lea)g(allocator)m(,)f + (which)h(is)2042 4516 y(a)c(high)g(quality)h(general)f(purpose)h + (allocator)l(.)f(This)g(allocator)g(is)f(used)i(in)2042 + 4599 y(all)f(our)h(e)o(xperiments)h(belo)n(w)-5 b(,)26 + b(either)g(directly)g(from)g(the)f(application)i(or)2042 + 4682 y(the)g(pool)h(runtime)g(library)-5 b(.)27 b(All)f(runtimes)i + (reported)g(are)f(the)h(minimum)2042 4765 y(user+system)20 + b(time)e(from)h(three)g(e)o(x)o(ecutions)h(of)f(the)g(program.)2141 + 4848 y(F)o(or)31 b(this)f(w)o(ork,)h(we)g(are)g(most)g(interested)g(in) + g(heap)g(intensi)n(v)o(e)h(pro-)2042 4932 y(grams,)i(particularly)g + (those)h(that)e(use)i(recursi)n(v)o(e)f(data)h(structures.)f(F)o(or) + 2042 5015 y(this)15 b(reason,)h(we)g(include)g(numbers)h(for)e(the)h + (pointer)o(-intensi)n(v)o(e)g(SPECINT)2042 5098 y(2000)h(benchmarks,)g + (the)f(Ptrdist)f(suite)h([2],)f(the)h(Olden)h(suite)f([39],)f(and)i + (the)2042 5181 y(FreeBench)k(suite)f([40].)g(W)-6 b(e)20 + b(also)g(include)h(a)f(fe)n(w)h(standalone)g(programs:)2042 + 5264 y(Po)o(vray3.1)29 b(\(a)g(widely)g(used)g(open)h(source)g(ray)f + (tracer)m(,)f(a)o(v)n(ailable)h(from)2042 5347 y Fs(povray.org)p + Fz(\),)j(espresso,)g(fpgro)n(wth)g(\(a)f(patent-protected,)h(data)f + (min-)2042 5430 y(ing)18 b(algorithm)g([25]\),)f(llu-bench)i(\(a)e + (link)o(ed-list)h(microbenchmark\))h([46)q(],)p eop end + %%Page: 10 10 + TeXDict begin 10 9 bop -150 66 a Fz(and)21 b(\223chomp\224)g(from)f + (the)g(McGill)f(benchmark)j(suite.)e(All)f(b)o(ut)g(SPEC,)f(fp-)-150 + 149 y(gro)n(wth)h(and)h(po)o(vray31)h(are)e(a)o(v)n(ailable)g(from)g + Fs(llvm.cs.uiuc.edu)p Fz(.)-50 232 y(F)o(or)f(lack)i(of)f(space,)h(we)g + (elide)f(man)o(y)h(benchmarks)h(from)f(these)f(suites)-150 + 315 y(that)25 b(were)h(unaf)n(fected)h(by)f(pool)g(allocation.)f(This)g + (happens)j(for)d(se)n(v)o(eral)-150 399 y(reasons.)h(Some)g(of)g(the)g + (benchmarks,)h(including)g(181.mcf,)g(186.crafty)-5 b(,)-150 + 482 y(256.bzip2,)41 b(and)f(se)n(v)o(eral)h(FreeBench)f(benchmarks,)h + (ha)o(v)o(e)f(v)o(ery)g(fe)n(w)-150 565 y(dynamic)f(memory)f + (allocations.)g(A)f(fe)n(w)g(\(e.g.)g(197.parser)m(,)i(254.gap,)-150 + 648 y(255.v)o(orte)o(x\))28 b(ha)o(v)o(e)g(custom)g(memory)h + (allocators,)e(which)h(pre)n(v)o(ents)g(dis-)-150 731 + y(ambigution)d(of)f(allocated)g(memory)h(objects)f(and)g(causes)h(all)e + (objects)h(to)-150 814 y(be)c(placed)h(in)f(a)g(single)g(pool.)g(As)g + (an)g(e)o(xperiment,)g(we)g(remo)o(v)o(ed)h(the)f(cus-)-150 + 897 y(tom)i(memory)h(allocator)g(from)f(197.parser)h(and)g(replaced)g + (it)e(with)h(wrap-)-150 980 y(pers)h(that)f(just)h(call)f + Fs(malloc)p Fz(/)p Fs(free)p Fz(;)i(this)f(is)f(called)h(197.parser)o + (-b)g(belo)n(w)-5 b(.)-150 1063 y(W)f(e)16 b(can)i(do)f(this)g(to)g + (197.parser)h(\(b)o(ut)f(not)g(the)g(others\))g(because)h(its)f(custom) + -150 1146 y(allocator)24 b(has)g(semantics)g(identical)g(to)g + Fs(malloc)p Fz(/)p Fs(free)p Fz(.)h(Finally)-5 b(,)23 + b(almost)-150 1229 y(all)18 b(the)g(codes)h(in)f(the)g(McGill)g + (benchmark)i(suite)e(ha)o(v)o(e)g(run)h(times)e(that)h(are)-150 + 1312 y(too)h(small)g(to)g(be)g(measured)h(reliably)-5 + b(.)-150 1456 y Fn(9.1)75 b(P)o(ool)18 b(Allocation)h(Statistics)-150 + 1572 y Fz(T)-6 b(able)17 b(1)g(sho)n(ws)h(se)n(v)o(eral)g(basic)f + (statistics)f(about)i(pool)g(allocation)g(for)f(each)-150 + 1655 y(program.)24 b(The)g(StatPools)f(column)i(sho)n(ws)f(the)g + (number)h(of)e(static)h(pools)-150 1738 y(created)29 + b(in)g(the)g(program)h(\(when)f(using)g(Selecti)n(v)o(e)g(P)-7 + b(A\).)28 b(The)g(NumTH)-150 1821 y(column)g(sho)n(ws)g(the)g(static)f + (number)h(of)g(type)g(homogenous)i(pools,)e(and)-150 + 1904 y(TH\045)22 b(is)h(percentage)h(of)e(static)g(pools)i(that)e(are)h + (type-homogenous.)i(The)-150 1987 y(DynPools)30 b(column)g(lists)f(the) + g(number)h(of)g(dynamic)g(pools)g(created)g(by)-150 2070 + y(the)36 b(program.)h(T)-6 b(ot)35 b(Ar)o(gs)h(and)g(Max)h(Ar)o(gs)f + (are)g(the)g(total)f(number)i(of)-150 2153 y(formal)26 + b(ar)o(guments)i(added)f(to)g(the)f(program)i(across)f(all)f + (functions,)h(and)-150 2236 y(the)19 b(maximum)h(number)g(for)e(a)h + (single)h(function.)p -150 2331 2047 4 v -152 2398 4 + 67 v -100 2378 a Fw(Program)p 239 2398 V 249 w(LOC)p + 513 2398 V 529 2398 V 155 w(Stat)p 758 2398 V 100 w(Num)p + 974 2398 V 109 w(TH\045)p 1209 2398 V 1226 2398 V 146 + w(Dyn)p 1455 2398 V 1471 2398 V 152 w(T)-5 b(ot)p 1683 + 2398 V 105 w(Max)p 1894 2398 V -152 2464 V 239 2464 V + 513 2464 V 529 2464 V 581 2444 a(Pools)p 758 2464 V 139 + w(TH)p 974 2464 V 1209 2464 V 1226 2464 V 350 w(Pools)p + 1455 2464 V 1471 2464 V 117 w(Ar)o(gs)p 1683 2464 V 99 + w(Ar)o(gs)p 1894 2464 V -150 2468 2047 4 v -152 2534 + 4 67 v -100 2514 a(164.gzip)p 239 2534 V 246 w(8616)p + 513 2534 V 529 2534 V 217 w(4)p 758 2534 V 187 w(4)p + 974 2534 V 100 w(100\045)p 1209 2534 V 1226 2534 V 188 + w(44)p 1455 2534 V 1471 2534 V 199 w(1)p 1683 2534 V + 182 w(1)p 1894 2534 V -152 2600 V -100 2580 a(175.vpr)p + 239 2600 V 240 w(17728)p 513 2600 V 529 2600 V 159 w(107)p + 758 2600 V 158 w(91)p 974 2600 V 129 w(85\045)p 1209 + 2600 V 1226 2600 V 188 w(44)p 1455 2600 V 1471 2600 V + 170 w(23)p 1683 2600 V 182 w(4)p 1894 2600 V -152 2667 + V -100 2647 a(197.parser)o(-b)p 239 2667 V 128 w(11204)p + 513 2667 V 529 2667 V 188 w(49)p 758 2667 V 158 w(48)p + 974 2667 V 129 w(98\045)p 1209 2667 V 1226 2667 V 129 + w(6674)p 1455 2667 V 1471 2667 V 171 w(76)p 1683 2667 + V 153 w(16)p 1894 2667 V -152 2733 V -100 2713 a(252.eon)p + 239 2733 V 233 w(35819)p 513 2733 V 529 2733 V 159 w(124)p + 758 2733 V 129 w(123)p 974 2733 V 129 w(99\045)p 1209 + 2733 V 1226 2733 V 188 w(66)p 1455 2733 V 1471 2733 V + 141 w(549)p 1683 2733 V 153 w(41)p 1894 2733 V -152 2800 + V -100 2780 a(300.tw)o(olf)p 239 2800 V 196 w(20461)p + 513 2800 V 529 2800 V 188 w(94)p 758 2800 V 158 w(88)p + 974 2800 V 129 w(94\045)p 1209 2800 V 1226 2800 V 158 + w(227)p 1455 2800 V 1471 2800 V 200 w(1)p 1683 2800 V + 182 w(1)p 1894 2800 V -150 2803 2047 4 v -152 2869 4 + 67 v -100 2849 a(anagram)p 239 2869 V 278 w(650)p 513 + 2869 V 529 2869 V 216 w(4)p 758 2869 V 187 w(3)p 974 + 2869 V 129 w(75\045)p 1209 2869 V 1226 2869 V 217 w(4)p + 1455 2869 V 1471 2869 V 199 w(0)p 1683 2869 V 182 w(0)p + 1894 2869 V -152 2936 V -100 2916 a(bc)p 239 2936 V 393 + w(7297)p 513 2936 V 529 2936 V 188 w(24)p 758 2936 V + 158 w(22)p 974 2936 V 129 w(32\045)p 1209 2936 V 1226 + 2936 V 188 w(19)p 1455 2936 V 1471 2936 V 199 w(6)p 1683 + 2936 V 182 w(2)p 1894 2936 V -152 3002 V -100 2982 a(ft)p + 239 3002 V 413 w(1803)p 513 3002 V 529 3002 V 217 w(3)p + 758 3002 V 187 w(3)p 974 3002 V 100 w(100\045)p 1209 + 3002 V 1226 3002 V 217 w(4)p 1455 3002 V 1471 3002 V + 199 w(0)p 1683 3002 V 182 w(0)p 1894 3002 V -152 3069 + V -100 3049 a(ks)p 239 3069 V 426 w(782)p 513 3069 V + 529 3069 V 216 w(3)p 758 3069 V 187 w(3)p 974 3069 V + 100 w(100\045)p 1209 3069 V 1226 3069 V 217 w(3)p 1455 + 3069 V 1471 3069 V 199 w(0)p 1683 3069 V 182 w(0)p 1894 + 3069 V -152 3135 V -100 3115 a(yacr2)p 239 3135 V 319 + w(3982)p 513 3135 V 529 3135 V 188 w(20)p 758 3135 V + 158 w(20)p 974 3135 V 100 w(100\045)p 1209 3135 V 1226 + 3135 V 188 w(83)p 1455 3135 V 1471 3135 V 199 w(0)p 1683 + 3135 V 182 w(0)p 1894 3135 V -150 3138 2047 4 v -152 + 3205 4 67 v -100 3185 a(analyzer)p 239 3205 V 281 w(923)p + 513 3205 V 529 3205 V 216 w(5)p 758 3205 V 187 w(5)p + 974 3205 V 100 w(100\045)p 1209 3205 V 1226 3205 V 217 + w(8)p 1455 3205 V 1471 3205 V 199 w(0)p 1683 3205 V 182 + w(0)p 1894 3205 V -152 3271 V -100 3251 a(neural)p 239 + 3271 V 333 w(785)p 513 3271 V 529 3271 V 216 w(5)p 758 + 3271 V 187 w(5)p 974 3271 V 100 w(100\045)p 1209 3271 + V 1226 3271 V 188 w(93)p 1455 3271 V 1471 3271 V 199 + w(0)p 1683 3271 V 182 w(0)p 1894 3271 V -152 3338 V -100 + 3318 a(pcompress2)p 239 3338 V 200 w(903)p 513 3338 V + 529 3338 V 216 w(5)p 758 3338 V 187 w(5)p 974 3338 V + 100 w(100\045)p 1209 3338 V 1226 3338 V 217 w(8)p 1455 + 3338 V 1471 3338 V 199 w(0)p 1683 3338 V 182 w(0)p 1894 + 3338 V -150 3341 2047 4 v -152 3407 4 67 v -100 3387 + a(llu-bench)p 239 3407 V 259 w(191)p 513 3407 V 529 3407 + V 216 w(1)p 758 3407 V 187 w(1)p 974 3407 V 100 w(100\045)p + 1209 3407 V 1226 3407 V 217 w(2)p 1455 3407 V 1471 3407 + V 199 w(0)p 1683 3407 V 182 w(0)p 1894 3407 V -152 3474 + V -100 3454 a(chomp)p 239 3474 V 320 w(424)p 513 3474 + V 529 3474 V 216 w(4)p 758 3474 V 187 w(4)p 974 3474 + V 100 w(100\045)p 1209 3474 V 1226 3474 V 217 w(7)p 1455 + 3474 V 1471 3474 V 170 w(10)p 1683 3474 V 182 w(8)p 1894 + 3474 V -152 3540 V -100 3520 a(fpgro)o(wth)p 239 3540 + V 267 w(634)p 513 3540 V 529 3540 V 216 w(6)p 758 3540 + V 187 w(6)p 974 3540 V 100 w(100\045)p 1209 3540 V 1226 + 3540 V 121 w(3.4M)p 1455 3540 V 1471 3540 V 170 w(10)p + 1683 3540 V 182 w(6)p 1894 3540 V -152 3607 V -100 3587 + a(espresso)p 239 3607 V 221 w(14959)p 513 3607 V 529 + 3607 V 159 w(160)p 758 3607 V 129 w(160)p 974 3607 V + 100 w(100\045)p 1209 3607 V 1226 3607 V 116 w(100K)p + 1455 3607 V 1471 3607 V 142 w(191)p 1683 3607 V 153 w(13)p + 1894 3607 V -152 3673 V -100 3653 a(po)o(vray31)p 239 + 3673 V 172 w(108273)p 513 3673 V 529 3673 V 188 w(46)p + 758 3673 V 187 w(5)p 974 3673 V 129 w(11\045)p 1209 3673 + V 1226 3673 V 188 w(14)p 1455 3673 V 1471 3673 V 141 + w(290)p 1683 3673 V 182 w(4)p 1894 3673 V -150 3676 2047 + 4 v -152 3743 4 67 v -100 3723 a(bh)p 239 3743 V 390 + w(2090)p 513 3743 V 529 3743 V 217 w(1)p 758 3743 V 187 + w(0)p 974 3743 V 158 w(0\045)p 1209 3743 V 1226 3743 + V 217 w(1)p 1455 3743 V 1471 3743 V 199 w(0)p 1683 3743 + V 182 w(0)p 1894 3743 V -152 3809 V -100 3789 a(bisort)p + 239 3809 V 346 w(350)p 513 3809 V 529 3809 V 216 w(1)p + 758 3809 V 187 w(1)p 974 3809 V 100 w(100\045)p 1209 + 3809 V 1226 3809 V 217 w(1)p 1455 3809 V 1471 3809 V + 199 w(1)p 1683 3809 V 182 w(1)p 1894 3809 V -152 3876 + V -100 3856 a(em3d)p 239 3876 V 349 w(682)p 513 3876 + V 529 3876 V 187 w(12)p 758 3876 V 158 w(12)p 974 3876 + V 100 w(100\045)p 1209 3876 V 1226 3876 V 188 w(12)p + 1455 3876 V 1471 3876 V 199 w(3)p 1683 3876 V 182 w(2)p + 1894 3876 V -152 3942 V -100 3922 a(health)p 239 3942 + V 336 w(508)p 513 3942 V 529 3942 V 216 w(2)p 758 3942 + V 187 w(2)p 974 3942 V 100 w(100\045)p 1209 3942 V 1226 + 3942 V 217 w(2)p 1455 3942 V 1471 3942 V 199 w(4)p 1683 + 3942 V 182 w(2)p 1894 3942 V -152 4008 V -100 3988 a(mst)p + 239 4008 V 394 w(432)p 513 4008 V 529 4008 V 216 w(4)p + 758 4008 V 187 w(4)p 974 4008 V 100 w(100\045)p 1209 + 4008 V 1226 4008 V 217 w(4)p 1455 4008 V 1471 4008 V + 199 w(0)p 1683 4008 V 182 w(0)p 1894 4008 V -152 4075 + V -100 4055 a(perimeter)p 239 4075 V 256 w(484)p 513 + 4075 V 529 4075 V 216 w(1)p 758 4075 V 187 w(1)p 974 + 4075 V 100 w(100\045)p 1209 4075 V 1226 4075 V 217 w(1)p + 1455 4075 V 1471 4075 V 199 w(1)p 1683 4075 V 182 w(1)p + 1894 4075 V -152 4141 V -100 4121 a(po)o(wer)p 239 4141 + V 334 w(622)p 513 4141 V 529 4141 V 216 w(3)p 758 4141 + V 187 w(3)p 974 4141 V 100 w(100\045)p 1209 4141 V 1226 + 4141 V 217 w(3)p 1455 4141 V 1471 4141 V 199 w(9)p 1683 + 4141 V 182 w(7)p 1894 4141 V -152 4208 V -100 4188 a(treeadd)p + 239 4208 V 307 w(245)p 513 4208 V 529 4208 V 216 w(6)p + 758 4208 V 187 w(6)p 974 4208 V 100 w(100\045)p 1209 + 4208 V 1226 4208 V 217 w(6)p 1455 4208 V 1471 4208 V + 199 w(1)p 1683 4208 V 182 w(1)p 1894 4208 V -152 4274 + V -100 4254 a(tsp)p 239 4274 V 410 w(579)p 513 4274 V + 529 4274 V 216 w(1)p 758 4274 V 187 w(1)p 974 4274 V + 100 w(100\045)p 1209 4274 V 1226 4274 V 217 w(1)p 1455 + 4274 V 1471 4274 V 199 w(1)p 1683 4274 V 182 w(1)p 1894 + 4274 V -150 4277 2047 4 v -150 4322 1993 3 v 239 4406 + a Fn(T)e(able)19 b(1.)g Fz(Basic)f(Pool)h(Allocation)g(Statistics)-50 + 4516 y(The)32 b(programs)h(v)n(ary)g(greatly)g(in)f(terms)h(of)f(the)h + (ratio)f(of)g(dynamic)-150 4599 y(pool)23 b(instances)g(\(Dyn)g + (Pools\))f(to)g(static)g(pools)h(\(Stat)e(Pools\).)h + Fs(fpgrowth)-150 4682 y Fz(has)28 b(a)f(particularly)h(high)g(ratio)f + (because)i(it)d(creates)i(a)f(ne)n(w)h(pool)g(\(for)f(a)-150 + 4765 y(local)22 b(search)h(tree\))f(in)g(each)h(call)f(to)g(a)g + (recursi)n(v)o(e)h(function.)g(The)f(number)-150 4848 + y(of)h(ar)o(guments)i(added)f(to)g(the)f(programs)i(is)e(generally)h + (modest.)g(252.eon)-150 4932 y(has)e(a)g(lar)o(ge)g(number)h(of)f(ar)o + (guments)h(added)g(because)g(the)f(standard)h(C++)-150 + 5015 y(library)15 b(is)g(statically)g(link)o(ed)h(in,)f(pro)o(viding)h + (a)g(lar)o(ge)f(amount)h(of)f(cold)h(code.)-50 5098 y(The)23 + b(Th\045)g(column)h(also)g(sho)n(ws)g(that)f(for)g(most)g(pools,)h(DSA) + e(is)h(able)-150 5181 y(to)k(successfully)i(pro)o(v)o(e)f(that)f + (memory)h(in)g(the)f(pool)h(is)f(used)h(in)g(a)f(type-)-150 + 5264 y(consistent)c(manner)m(,)g(which)g(we)g(ha)o(v)o(e)g(found)h + (true)e(across)h(a)g(wide)g(range)-150 5347 y(of)i(C)g(programs.)h + (This)f(allo)n(ws)g(intelligent)g(alignment)h(decisions,)g(gi)n(v)o(es) + -150 5430 y(the)16 b(pool)g(runtime)g(information)h(about)f(e)o + (xpected)i(size)d(for)h(single)g(objects,)2042 66 y(and)28 + b(enables)g(other)g(no)o(v)o(el)g(compiler)g(techniques)h(described)g + (brie\003y)e(in)2042 149 y(Section)19 b(7.)p 2042 235 + 1030 4 v 2040 302 4 67 v 2092 282 a Fw(Program)p 2431 + 302 V 2447 302 V 208 w(BP)p 2618 302 V 116 w(BP\045)p + 2853 302 V 2870 302 V 116 w(PFE)p 3070 302 V 2042 305 + 1030 4 v 2040 371 4 67 v 2092 351 a(164.gzip)p 2431 371 + V 2447 371 V 247 w(1)p 2618 371 V 129 w(25\045)p 2853 + 371 V 2870 371 V 187 w(9)p 3070 371 V 2040 438 V 2092 + 418 a(175.vpr)p 2431 438 V 2447 438 V 241 w(27)p 2618 + 438 V 129 w(25\045)p 2853 438 V 2870 438 V 158 w(29)p + 3070 438 V 2040 504 V 2092 484 a(197.parser)o(-b)p 2431 + 504 V 2447 504 V 158 w(3)p 2618 504 V 158 w(6\045)p 2853 + 504 V 2870 504 V 187 w(0)p 3070 504 V 2040 571 V 2092 + 551 a(252.eon)p 2431 571 V 2447 571 V 263 w(0)p 2618 + 571 V 158 w(0\045)p 2853 571 V 2870 571 V 158 w(28)p + 3070 571 V 2040 637 V 2092 617 a(300.tw)o(olf)p 2431 + 637 V 2447 637 V 197 w(61)p 2618 637 V 129 w(65\045)p + 2853 637 V 2870 637 V 187 w(1)p 3070 637 V 2042 640 1030 + 4 v 2040 707 4 67 v 2092 687 a(anagram)p 2431 707 V 2447 + 707 V 249 w(2)p 2618 707 V 129 w(50\045)p 2853 707 V + 2870 707 V 187 w(0)p 3070 707 V 2040 773 V 2092 753 a(bc)p + 2431 773 V 2447 773 V 394 w(3)p 2618 773 V 129 w(13\045)p + 2853 773 V 2870 773 V 187 w(0)p 3070 773 V 2040 840 V + 2092 820 a(ft)p 2431 840 V 2447 840 V 414 w(2)p 2618 + 840 V 129 w(67\045)p 2853 840 V 2870 840 V 187 w(0)p + 3070 840 V 2040 906 V 2092 886 a(ks)p 2431 906 V 2447 + 906 V 397 w(3)p 2618 906 V 99 w(100\045)p 2853 906 V + 2870 906 V 188 w(0)p 3070 906 V 2040 972 V 2092 952 a(yacr2)p + 2431 972 V 2447 972 V 320 w(7)p 2618 972 V 129 w(35\045)p + 2853 972 V 2870 972 V 187 w(0)p 3070 972 V 2042 976 1030 + 4 v 2040 1042 4 67 v 2092 1022 a(analyzer)p 2431 1042 + V 2447 1042 V 252 w(5)p 2618 1042 V 99 w(100\045)p 2853 + 1042 V 2870 1042 V 188 w(0)p 3070 1042 V 2040 1109 V + 2092 1089 a(neural)p 2431 1109 V 2447 1109 V 304 w(5)p + 2618 1109 V 99 w(100\045)p 2853 1109 V 2870 1109 V 188 + w(0)p 3070 1109 V 2040 1175 V 2092 1155 a(pcompress2)p + 2431 1175 V 2447 1175 V 171 w(0)p 2618 1175 V 158 w(0\045)p + 2853 1175 V 2870 1175 V 187 w(0)p 3070 1175 V 2042 1178 + 1030 4 v 3104 235 962 4 v 3102 302 4 67 v 3154 282 a(Program)p + 3425 302 V 3442 302 V 140 w(BP)p 3612 302 V 116 w(BP\045)p + 3848 302 V 3864 302 V 117 w(PFE)p 4064 302 V 3104 305 + 962 4 v 3102 371 4 67 v 3154 351 a(llu-bench)p 3425 371 + V 3442 371 V 162 w(1)p 3612 371 V 100 w(100\045)p 3848 + 371 V 3864 371 V 188 w(0)p 4064 371 V 3102 438 V 3154 + 418 a(chomp)p 3425 438 V 3442 438 V 223 w(0)p 3612 438 + V 158 w(0\045)p 3848 438 V 3864 438 V 188 w(0)p 4064 + 438 V 3102 504 V 3154 484 a(fpgro)o(wth)p 3425 504 V + 3442 504 V 170 w(0)p 3612 504 V 158 w(0\045)p 3848 504 + V 3864 504 V 188 w(0)p 4064 504 V 3102 571 V 3154 551 + a(espresso)p 3425 571 V 3442 571 V 183 w(1)p 3612 571 + V 158 w(1\045)p 3848 571 V 3864 571 V 188 w(3)p 4064 + 571 V 3102 637 V 3154 617 a(po)o(vray31)p 3425 637 V + 3442 637 V 163 w(6)p 3612 637 V 129 w(13\045)p 3848 637 + V 3864 637 V 159 w(28)p 4064 637 V 3104 640 962 4 v 3102 + 707 4 67 v 3154 687 a(bh)p 3425 707 V 3442 707 V 323 + w(1)p 3612 707 V 100 w(100\045)p 3848 707 V 3864 707 + V 188 w(0)p 4064 707 V 3102 773 V 3154 753 a(bisort)p + 3425 773 V 3442 773 V 249 w(1)p 3612 773 V 100 w(100\045)p + 3848 773 V 3864 773 V 188 w(0)p 4064 773 V 3102 840 V + 3154 820 a(em3d)p 3425 840 V 3442 840 V 252 w(6)p 3612 + 840 V 129 w(50\045)p 3848 840 V 3864 840 V 188 w(0)p + 4064 840 V 3102 906 V 3154 886 a(health)p 3425 906 V + 3442 906 V 239 w(2)p 3612 906 V 100 w(100\045)p 3848 + 906 V 3864 906 V 188 w(0)p 4064 906 V 3102 972 V 3154 + 952 a(mst)p 3425 972 V 3442 972 V 297 w(4)p 3612 972 + V 100 w(100\045)p 3848 972 V 3864 972 V 188 w(0)p 4064 + 972 V 3102 1039 V 3154 1019 a(perimeter)p 3425 1039 V + 3442 1039 V 159 w(1)p 3612 1039 V 100 w(100\045)p 3848 + 1039 V 3864 1039 V 188 w(0)p 4064 1039 V 3102 1105 V + 3154 1085 a(po)o(wer)p 3425 1105 V 3442 1105 V 237 w(3)p + 3612 1105 V 100 w(100\045)p 3848 1105 V 3864 1105 V 188 + w(0)p 4064 1105 V 3102 1172 V 3154 1152 a(treeadd)p 3425 + 1172 V 3442 1172 V 210 w(2)p 3612 1172 V 129 w(33\045)p + 3848 1172 V 3864 1172 V 188 w(0)p 4064 1172 V 3102 1238 + V 3154 1218 a(tsp)p 3425 1238 V 3442 1238 V 313 w(1)p + 3612 1238 V 100 w(100\045)p 3848 1238 V 3864 1238 V 188 + w(0)p 4064 1238 V 3104 1241 962 4 v 2042 1286 1993 3 + v 2417 1370 a Fn(T)-7 b(able)18 b(2.)h Fz(Statistics)e(for)i(Pool)g + (Optimizations)2141 1517 y(T)-6 b(able)25 b(2)f(sho)n(ws)h(the)f + (static)g(number)h(of)f(pools)h(that)f(can)h(use)f(a)h(b)o(ump)2042 + 1600 y(pointer)e(after)g(poolfree)h(elimination)f(\(BP\),)f(and)h + (number)h(of)f Fs(poolfree)2042 1683 y Fz(calls)36 b(deleted)g(when)h + (PoolFree)e(Elim)g(is)h(enabled)h(\(PFE\).)d(The)i(table)2042 + 1766 y(sho)n(ws)28 b(that)g(in)g(man)o(y)g(programs)h(\(the)f(lar)o + (ger)g(such)g(e)o(xamples)h(are)f(vpr)m(,)2042 1849 y(tw)o(olf,)22 + b(yacr2,)i(and)g(po)o(vray\),)f(a)g(signi\002cant)h(fraction)f(of)g + (pools)h(are)f(iden-)2042 1932 y(ti\002ed)j(as)g(eligible)h(b)o + (ump-pointer)h(pools,)f(i.e.,)e(indi)n(vidual)i(pool)h(objects)2042 + 2015 y(are)22 b(ne)n(v)o(er)g(freed)h(back)f(to)g(the)g(pool.)g(F)o(or) + g(vpr)m(,)g(tw)o(olf)f(and)i(po)o(vray)-5 b(,)23 b(this)e(is)2042 + 2098 y(enabled)27 b(by)f(the)h(elimination)f(of)g(se)n(v)o(eral)g + Fs(poolfree)i Fz(operations.)e(This)2042 2181 y(elimination)c + (indicates)g(the)g(presence)h(of)f(the)g(b)o(uild-use-destro)o(y)i + (pattern)2042 2264 y(e)o(xplained)31 b(in)g(Section)f(5.)g(In)g + (175.vpr)m(,)i(for)e(e)o(xample,)h(pool)g(allocation)2042 + 2347 y(eliminates)19 b(29)g(poolfree)h(calls.)2042 2495 + y Fn(9.2)75 b(P)o(ool)18 b(Allocation)h(Compile)f(T)o(ime)2042 + 2611 y Fz(T)-6 b(able)24 b(3)g(sho)n(ws)h(the)g(compile)g(times)f(for)g + (pool)h(allocation)f(on)h(programs)2042 2694 y(bigger)c(than)h(1000)g + (lines)f(of)g(code.)g(It)g(breaks)h(do)n(wn)g(this)e(time)h(into)g + (three)2042 2777 y(components:)26 b(the)f(total)f(time)h(for)g(DSA)f + (\(which)h(can)g(be)g(used)g(by)h(other)2042 2860 y(clients)c(as)g + (well\),)f(the)h(time)f(to)h(compute)h(the)g(EB)o(U)e(graphs)i + (described)g(in)2042 2943 y(Section)16 b(3.3.2)g(\(which)g(are)g + (speci\002c)g(to)g(pool)g(allocation\),)g(and)h(the)f(time)f(to)2042 + 3026 y(perform)i(the)g(pool)g(allocation)g(transformation)g(itself.)f + (The)g(GCC)g(column)2042 3109 y(lists)i(the)h(time)f(to)h(compile)h + (the)f(program)g(with)g(GCC)f(3.4.2)h(at)g(-O3.)2141 + 3192 y(The)37 b(total)f(compilation)i(time)e(for)h(pool)g(allocation)g + (is)g(e)o(xtremely)2042 3275 y(modest,)27 b(taking)g(less)f(than)i + (1.25)f(seconds)h(in)e(all)g(cases)i(on)f(our)g(Athlon)2042 + 3359 y(2100+.)36 b(The)f(lar)o(gest)f(amount)i(of)f(time)f(is)h(spent)g + (analyzing)i(252.eon)2042 3442 y(\(which)28 b(has)h(a)f(lar)o(ge)f + (portion)i(of)f(the)g(standard)h(C++)f(library)h(statically)2042 + 3525 y(link)o(ed)22 b(into)g(it\),)e(follo)n(wed)i(by)g(po)o(vray31;)i + (these)e(are)f(the)h(only)g(programs)2042 3608 y(that)28 + b(took)h(more)f(than)h(1)f(second.)h(Furthermore,)f(much)h(of)f(the)h + (time)e(is)2042 3691 y(spent)34 b(in)f(DSA,)f(which)i(can)g(be)g(used)g + (for)f(a)h(v)n(ariety)g(of)f(applications)2042 3774 y(besides)24 + b(pool)f(allocation)h([32)q(].)e(Our)h(implementation)h(of)g(the)f(EB)o + (U)f(and)2042 3857 y(P)-7 b(A)31 b(passes)i(ha)o(v)o(e)g(not)f(been)h + (optimized)g(substantially)-5 b(,)32 b(so)h(the)o(y)f(could)2042 + 3940 y(probably)25 b(be)g(further)f(reduced.)i(Ov)o(erall,)d(these)i + (compilation)g(times)f(are)2042 4023 y(e)o(xtremely)19 + b(small)g(for)g(a)f(sophisticated)i(interprocedural)g(optimization.)p + 2042 4123 2092 4 v 2040 4190 4 67 v 2092 4170 a Fw(Program)p + 2431 4190 V 249 w(LOC)p 2705 4190 V 2721 4190 V 156 w(GCC)p + 2981 4190 V 2997 4190 V 116 w(DSA)p 3213 4190 V 100 w(EB)o(U)p + 3428 4190 V 132 w(P)-5 b(A)p 3630 4190 V 3646 4190 V + 116 w(T)g(otal)p 3864 4190 V 99 w(GCC\045)p 4132 4190 + V 2042 4193 2092 4 v 2040 4260 4 67 v 2092 4240 a(164.gzip)p + 2431 4260 V 246 w(8616)p 2705 4260 V 2721 4260 V 175 + w(2.67)p 2981 4260 V 2997 4260 V 130 w(0.02)p 3213 4260 + V 114 w(0.01)p 3428 4260 V 99 w(0.01)p 3630 4260 V 3646 + 4260 V 132 w(0.03)p 3864 4260 V 146 w(1.1\045)p 4132 + 4260 V 2040 4326 V 2092 4306 a(175.vpr)p 2431 4326 V + 240 w(17728)p 2705 4326 V 2721 4326 V 175 w(9.39)p 2981 + 4326 V 2997 4326 V 130 w(0.06)p 3213 4326 V 114 w(0.03)p + 3428 4326 V 99 w(0.05)p 3630 4326 V 3646 4326 V 132 w(0.14)p + 3864 4326 V 146 w(1.5\045)p 4132 4326 V 2040 4392 V 2092 + 4373 a(197.parser)o(-b)p 2431 4392 V 128 w(11204)p 2705 + 4392 V 2721 4392 V 175 w(9.03)p 2981 4392 V 2997 4392 + V 130 w(0.08)p 3213 4392 V 114 w(0.05)p 3428 4392 V 99 + w(0.05)p 3630 4392 V 3646 4392 V 132 w(0.18)p 3864 4392 + V 146 w(1.9\045)p 4132 4392 V 2040 4459 V 2092 4439 a(252.eon)p + 2431 4459 V 233 w(35819)p 2705 4459 V 2721 4459 V 117 + w(131.13)p 2981 4459 V 2997 4459 V 130 w(0.51)p 3213 + 4459 V 114 w(0.30)p 3428 4459 V 99 w(0.42)p 3630 4459 + V 3646 4459 V 132 w(1.23)p 3864 4459 V 146 w(0.9\045)p + 4132 4459 V 2040 4525 V 2092 4505 a(300.tw)o(olf)p 2431 + 4525 V 196 w(20459)p 2705 4525 V 2721 4525 V 146 w(17.21)p + 2981 4525 V 2997 4525 V 130 w(0.09)p 3213 4525 V 114 + w(0.07)p 3428 4525 V 99 w(0.03)p 3630 4525 V 3646 4525 + V 132 w(0.19)p 3864 4525 V 146 w(1.1\045)p 4132 4525 + V 2042 4529 2092 4 v 2040 4595 4 67 v 2092 4575 a(bc)p + 2431 4595 V 393 w(7297)p 2705 4595 V 2721 4595 V 175 + w(3.55)p 2981 4595 V 2997 4595 V 130 w(0.03)p 3213 4595 + V 114 w(0.02)p 3428 4595 V 99 w(0.01)p 3630 4595 V 3646 + 4595 V 132 w(0.06)p 3864 4595 V 146 w(1.7\045)p 4132 + 4595 V 2040 4661 V 2092 4642 a(ft)p 2431 4661 V 413 w(1803)p + 2705 4661 V 2721 4661 V 175 w(0.68)p 2981 4661 V 2997 + 4661 V 130 w(0.01)p 3213 4661 V 114 w(0.01)p 3428 4661 + V 99 w(0.01)p 3630 4661 V 3646 4661 V 132 w(0.02)p 3864 + 4661 V 146 w(2.9\045)p 4132 4661 V 2040 4728 V 2092 4708 + a(yacr2)p 2431 4728 V 319 w(3982)p 2705 4728 V 2721 4728 + V 175 w(1.79)p 2981 4728 V 2997 4728 V 130 w(0.02)p 3213 + 4728 V 114 w(0.01)p 3428 4728 V 99 w(0.01)p 3630 4728 + V 3646 4728 V 132 w(0.03)p 3864 4728 V 146 w(1.7\045)p + 4132 4728 V 2042 4731 2092 4 v 2040 4798 4 67 v 2092 + 4778 a(espresso)p 2431 4798 V 221 w(14959)p 2705 4798 + V 2721 4798 V 146 w(10.28)p 2981 4798 V 2997 4798 V 130 + w(0.14)p 3213 4798 V 114 w(0.08)p 3428 4798 V 99 w(0.08)p + 3630 4798 V 3646 4798 V 132 w(0.30)p 3864 4798 V 146 + w(2.9\045)p 4132 4798 V 2040 4864 V 2092 4844 a(po)o(vray31)p + 2431 4864 V 172 w(108273)p 2705 4864 V 2721 4864 V 146 + w(39.20)p 2981 4864 V 2997 4864 V 130 w(0.58)p 3213 4864 + V 114 w(0.33)p 3428 4864 V 99 w(0.27)p 3630 4864 V 3646 + 4864 V 132 w(1.18)p 3864 4864 V 146 w(3.0\045)p 4132 + 4864 V 2042 4867 2092 4 v 2040 4934 4 67 v 2092 4914 + a(bh)p 2431 4934 V 390 w(2090)p 2705 4934 V 2721 4934 + V 175 w(0.85)p 2981 4934 V 2997 4934 V 130 w(0.01)p 3213 + 4934 V 114 w(0.01)p 3428 4934 V 99 w(0.01)p 3630 4934 + V 3646 4934 V 132 w(0.01)p 3864 4934 V 146 w(1.2\045)p + 4132 4934 V 2042 4937 2092 4 v 2042 4981 1993 3 v 2136 + 5066 a Fn(T)e(able)18 b(3.)h Fz(Compile)g(time)g(\(seconds\))h(for)e + (programs)i Fm(>)f Fz(1000)h(LOC)2141 5264 y(T)-6 b(o)16 + b(put)g(these)g(times)g(in)f(perspecti)n(v)o(e,)i(the)f(GCC\045)f + (column)i(\(computed)2042 5347 y(as)28 b(\(T)-6 b(otal/GCC\)*100\),)28 + b(sho)n(ws)h(that)f(the)h(pool)g(allocation)g(transforma-)2042 + 5430 y(tion)c(tak)o(es)g(3\045)h(or)f(less)f(of)h(the)g(time)g(tak)o + (en)h(by)f(GCC)f(to)h(compile)h(these)p eop end + %%Page: 11 11 + TeXDict begin 11 10 bop -150 66 a Fz(programs.)20 b(This)e(is)h + (signi\002cant)g(because)h(GCC)e(-O3)h(performs)h(no)f(cross-)-150 + 149 y(module)25 b(optimizations)g(and)g(inlining)f(is)g(the)g(only)h + (interprocedural)g(op-)-150 232 y(timization)f(it)g(performs)g(within)g + (a)h(module.)f(Ov)o(erall,)g(we)g(belie)n(v)o(e)h(these)-150 + 315 y(compilation)20 b(times)e(are)h(quite)g(acceptable)h(for)f(a)g + (production)h(compiler)l(.)-150 464 y Fn(9.3)75 b(Baselines)19 + b(and)f(P)o(ool)g(Allocation)h(Ov)o(erheads)p -150 584 + 2081 4 v -152 651 4 67 v -100 631 a Fw(Program)p 239 + 651 V 255 651 V 248 w(GCC)p 515 651 V 119 w(NoP)-5 b(A)p + 774 651 V 791 651 V 146 w(One)14 b(-)p 1050 651 V 100 + w(OnePool)p 1353 651 V 1370 651 V 126 w(Only)h(-)p 1630 + 651 V 100 w(OnlyOH)p 1929 651 V -152 717 V 239 717 V + 255 717 V 515 717 V 774 717 V 791 717 V 896 697 a(Pool)p + 1050 717 V 143 w(Run)g(\045)p 1353 717 V 1370 717 V 192 + w(OH)p 1630 717 V 140 w(Run)g(\045)p 1929 717 V -150 + 721 2081 4 v -152 787 4 67 v -100 767 a(164.gzip)p 239 + 787 V 255 787 V 234 w(25.11)p 515 787 V 128 w(28.16)p + 774 787 V 791 787 V 146 w(28.44)p 1050 787 V 123 w(101.0\045)p + 1353 787 V 1370 787 V 146 w(28.17)p 1630 787 V 120 w(100.0\045)p + 1929 787 V -152 853 V -100 833 a(175.vpr)p 239 853 V + 255 853 V 257 w(10.54)p 515 853 V 128 w(10.88)p 774 853 + V 791 853 V 146 w(10.86)p 1050 853 V 152 w(99.8\045)p + 1353 853 V 1370 853 V 146 w(10.87)p 1630 853 V 149 w(99.9\045)p + 1929 853 V -152 920 V -100 900 a(197.parser)o(-b)p 239 + 920 V 255 920 V 145 w(12.59)p 515 920 V 128 w(12.42)p + 774 920 V 791 920 V 146 w(17.86)p 1050 920 V 123 w(142.7\045)p + 1353 920 V 1370 920 V 146 w(13.36)p 1630 920 V 120 w(106.7\045)p + 1929 920 V -152 986 V -100 966 a(252.eon)p 239 986 V + 255 986 V 279 w(1.15)p 515 986 V 158 w(0.86)p 774 986 + V 791 986 V 174 w(0.85)p 1050 986 V 152 w(98.8\045)p + 1353 986 V 1370 986 V 175 w(0.88)p 1630 986 V 120 w(102.3\045)p + 1929 986 V -152 1053 V -100 1033 a(300.tw)o(olf)p 239 + 1053 V 255 1053 V 213 w(20.26)p 515 1053 V 128 w(20.10)p + 774 1053 V 791 1053 V 146 w(19.98)p 1050 1053 V 152 w(99.4\045)p + 1353 1053 V 1370 1053 V 146 w(20.50)p 1630 1053 V 120 + w(102.0\045)p 1929 1053 V -150 1056 2081 4 v -152 1122 + 4 67 v -100 1102 a(anagram)p 239 1122 V 255 1122 V 265 + w(3.46)p 515 1122 V 158 w(3.02)p 774 1122 V 791 1122 + V 174 w(3.01)p 1050 1122 V 152 w(99.7\045)p 1353 1122 + V 1370 1122 V 175 w(3.02)p 1630 1122 V 120 w(100.0\045)p + 1929 1122 V -152 1189 V -100 1169 a(bc)p 239 1189 V 255 + 1189 V 410 w(1.71)p 515 1189 V 158 w(1.55)p 774 1189 + V 791 1189 V 174 w(1.48)p 1050 1189 V 152 w(95.5\045)p + 1353 1189 V 1370 1189 V 175 w(1.71)p 1630 1189 V 120 + w(110.3\045)p 1929 1189 V -152 1255 V -100 1235 a(ft)p + 239 1255 V 255 1255 V 401 w(63.74)p 515 1255 V 128 w(68.73)p + 774 1255 V 791 1255 V 146 w(66.08)p 1050 1255 V 152 w(96.1\045)p + 1353 1255 V 1370 1255 V 146 w(68.94)p 1630 1255 V 120 + w(100.3\045)p 1929 1255 V -152 1322 V -100 1302 a(ks)p + 239 1322 V 255 1322 V 413 w(4.56)p 515 1322 V 158 w(4.43)p + 774 1322 V 791 1322 V 174 w(5.30)p 1050 1322 V 123 w(119.6\045)p + 1353 1322 V 1370 1322 V 175 w(4.39)p 1630 1322 V 149 + w(99.1\045)p 1929 1322 V -152 1388 V -100 1368 a(yacr2)p + 239 1388 V 255 1388 V 336 w(3.76)p 515 1388 V 158 w(3.86)p + 774 1388 V 791 1388 V 174 w(3.94)p 1050 1388 V 123 w(102.0\045)p + 1353 1388 V 1370 1388 V 175 w(3.89)p 1630 1388 V 120 + w(100.8\045)p 1929 1388 V -150 1391 2081 4 v -152 1458 + 4 67 v -100 1438 a(analyzer)p 239 1458 V 255 1458 V 210 + w(324.54)p 515 1458 V 99 w(312.25)p 774 1458 V 791 1458 + V 116 w(314.69)p 1050 1458 V 124 w(100.8\045)p 1353 1458 + V 1370 1458 V 117 w(313.69)p 1630 1458 V 120 w(100.5\045)p + 1929 1458 V -152 1524 V -100 1504 a(neural)p 239 1524 + V 255 1524 V 291 w(88.82)p 515 1524 V 128 w(87.34)p 774 + 1524 V 791 1524 V 146 w(87.35)p 1050 1524 V 123 w(100.0\045)p + 1353 1524 V 1370 1524 V 146 w(87.60)p 1630 1524 V 120 + w(100.3\045)p 1929 1524 V -152 1591 V -100 1571 a(pcompress2)p + 239 1591 V 255 1591 V 158 w(38.61)p 515 1591 V 128 w(37.77)p + 774 1591 V 791 1591 V 146 w(37.44)p 1050 1591 V 152 w(99.1\045)p + 1353 1591 V 1370 1591 V 146 w(38.04)p 1630 1591 V 120 + w(100.7\045)p 1929 1591 V -150 1594 2081 4 v -152 1660 + 4 67 v -100 1640 a(llu-bench)p 239 1660 V 255 1660 V + 188 w(106.63)p 515 1660 V 99 w(106.50)p 774 1660 V 791 + 1660 V 116 w(108.86)p 1050 1660 V 124 w(102.2\045)p 1353 + 1660 V 1370 1660 V 117 w(106.76)p 1630 1660 V 120 w(100.2\045)p + 1929 1660 V -152 1727 V -100 1707 a(chomp)p 239 1727 + V 255 1727 V 278 w(17.26)p 515 1727 V 128 w(16.71)p 774 + 1727 V 791 1727 V 146 w(10.63)p 1050 1727 V 152 w(63.6\045)p + 1353 1727 V 1370 1727 V 146 w(16.82)p 1630 1727 V 120 + w(100.6\045)p 1929 1727 V -152 1793 V -100 1773 a(fpgro)o(wth)p + 239 1793 V 255 1793 V 225 w(36.27)p 515 1793 V 128 w(36.62)p + 774 1793 V 791 1793 V 146 w(36.49)p 1050 1793 V 152 w(99.7\045)p + 1353 1793 V 1370 1793 V 146 w(39.30)p 1630 1793 V 120 + w(107.3\045)p 1929 1793 V -152 1860 V -100 1840 a(espresso)p + 239 1860 V 255 1860 V 267 w(1.25)p 515 1860 V 158 w(1.22)p + 774 1860 V 791 1860 V 174 w(1.20)p 1050 1860 V 152 w(98.3\045)p + 1353 1860 V 1370 1860 V 175 w(1.26)p 1630 1860 V 120 + w(103.3\045)p 1929 1860 V -152 1926 V -100 1906 a(po)o(vray31)p + 239 1926 V 255 1926 V 247 w(9.41)p 515 1926 V 158 w(9.79)p + 774 1926 V 791 1926 V 174 w(9.69)p 1050 1926 V 152 w(98.9\045)p + 1353 1926 V 1370 1926 V 175 w(9.81)p 1630 1926 V 120 + w(100.2\045)p 1929 1926 V -150 1929 2081 4 v -152 1996 + 4 67 v -100 1976 a(bh)p 239 1996 V 255 1996 V 378 w(14.02)p + 515 1996 V 158 w(9.33)p 774 1996 V 791 1996 V 174 w(9.32)p + 1050 1996 V 152 w(99.9\045)p 1353 1996 V 1370 1996 V + 175 w(9.35)p 1630 1996 V 120 w(100.2\045)p 1929 1996 + V -152 2062 V -100 2042 a(bisort)p 239 2062 V 255 2062 + V 304 w(12.59)p 515 2062 V 128 w(13.06)p 774 2062 V 791 + 2062 V 146 w(13.14)p 1050 2062 V 123 w(100.6\045)p 1353 + 2062 V 1370 2062 V 146 w(13.20)p 1630 2062 V 120 w(101.1\045)p + 1929 2062 V -152 2129 V -100 2109 a(em3d)p 239 2129 V + 255 2129 V 336 w(9.55)p 515 2129 V 158 w(6.80)p 774 2129 + V 791 2129 V 174 w(6.76)p 1050 2129 V 152 w(99.4\045)p + 1353 2129 V 1370 2129 V 175 w(6.80)p 1630 2129 V 120 + w(100.0\045)p 1929 2129 V -152 2195 V -100 2175 a(health)p + 239 2195 V 255 2195 V 294 w(14.11)p 515 2195 V 128 w(13.99)p + 774 2195 V 791 2195 V 146 w(13.39)p 1050 2195 V 152 w(95.7\045)p + 1353 2195 V 1370 2195 V 146 w(13.98)p 1630 2195 V 149 + w(99.9\045)p 1929 2195 V -152 2261 V -100 2242 a(mst)p + 239 2261 V 255 2261 V 352 w(12.79)p 515 2261 V 128 w(13.14)p + 774 2261 V 791 2261 V 146 w(13.23)p 1050 2261 V 123 w(100.7\045)p + 1353 2261 V 1370 2261 V 146 w(13.34)p 1630 2261 V 120 + w(101.5\045)p 1929 2261 V -152 2328 V -100 2308 a(perimeter)p + 239 2328 V 255 2328 V 243 w(3.02)p 515 2328 V 158 w(2.92)p + 774 2328 V 791 2328 V 174 w(2.58)p 1050 2328 V 152 w(88.4\045)p + 1353 2328 V 1370 2328 V 175 w(3.00)p 1630 2328 V 120 + w(102.7\045)p 1929 2328 V -152 2394 V -100 2374 a(po)o(wer)p + 239 2394 V 255 2394 V 321 w(4.61)p 515 2394 V 158 w(2.91)p + 774 2394 V 791 2394 V 174 w(2.93)p 1050 2394 V 123 w(100.7\045)p + 1353 2394 V 1370 2394 V 175 w(2.92)p 1630 2394 V 120 + w(100.3\045)p 1929 2394 V -152 2461 V -100 2441 a(treeadd)p + 239 2461 V 255 2461 V 265 w(17.48)p 515 2461 V 128 w(17.41)p + 774 2461 V 791 2461 V 146 w(17.29)p 1050 2461 V 152 w(99.3\045)p + 1353 2461 V 1370 2461 V 175 w(17.6)p 1630 2461 V 120 + w(101.1\045)p 1929 2461 V -152 2527 V -100 2507 a(tsp)p + 239 2527 V 255 2527 V 397 w(7.17)p 515 2527 V 158 w(7.24)p + 774 2527 V 791 2527 V 174 w(7.08)p 1050 2527 V 152 w(97.8\045)p + 1353 2527 V 1370 2527 V 175 w(7.42)p 1630 2527 V 120 + w(102.5\045)p 1929 2527 V -150 2530 2081 4 v -150 2575 + 1993 3 v -105 2659 a Fn(T)-7 b(able)18 b(4.)h Fz(Baseline)g(\(NoP)-7 + b(A\),)18 b(allocator)m(,)h(and)h(o)o(v)o(erhead)g(comparisons)-50 + 2773 y(T)-6 b(able)35 b(4)h(sho)n(ws)g(data)g(to)f(characterize)h(the)g + (baseline)g(we)g(use)f(for)-150 2856 y(comparison)23 + b(and)g(isolate)f(the)g(o)o(v)o(erheads)i(added)f(to)f(a)g(program)h + (by)g(pool)-150 2939 y(allocation.)f(The)g(GCC)f(column)i(is)e(the)h(e) + o(x)o(ecution)h(time)f(of)f(the)h(program)-150 3022 y(with)27 + b(the)h(GCC)f(3.4.2)g(compiler)h(\(at)f(-O3\).)g(The)h(NoP)-7 + b(A)27 b(column)h(is)f(the)-150 3105 y(program)j(compiled)f(with)g(LL) + -7 b(VM)28 b(using)h(e)o(xactly)h(the)f(same)g(sequence)-150 + 3188 y(of)22 b(transformation)h(and)g(cleanup)h(passes)f(as)f(we)g(do)h + (for)f(pool)h(allocation)-150 3271 y(\(see)35 b(Section)f(8\),)h(b)o + (ut)f(with)g(the)h(pool)g(allocator)g(and)h(all)e(pool-based)-150 + 3354 y(optimizations)24 b(disabled.)f(Using)h(NoP)-7 + b(A)23 b(as)g(a)g(baseline)h(for)f(comparison)-150 3437 + y(belo)n(w)34 b(isolates)f(the)g(speedup)i(of)e(the)g(pool)h(allocator) + g(transformation)-150 3520 y(and)26 b(its)f(optimizations)h(by)g(f)o + (actoring)h(out)f(the)f(impact)h(of)f(other)h(LL)-7 b(VM)-150 + 3603 y(compiler)20 b(passes.)f(Comparing)i(GCC)e(to)g(NoP)-7 + b(A)19 b(sho)n(ws)h(that)f(the)g(LL)-7 b(VM-)-150 3686 + y(generated)25 b(code)h(is)d(no)i(w)o(orse)g(than)g(12\045)g(slo)n(wer) + f(than)h(GCC)f(code)h(and)-150 3769 y(is)h(sometimes)g(much)h(better)l + (.)f(This)g(indicates)g(that)g(the)h(code)g(quality)f(of)-150 + 3852 y(NoP)-7 b(A)19 b(is)f(reasonable)i(to)f(use)g(a)g(baseline)h(for) + f(comparisons.)-50 3935 y(Another)27 b(k)o(e)o(y)h(question)h(is)d(ho)n + (w)i(the)f(dif)n(ference)h(between)g(the)g(allo-)-150 + 4018 y(cator)f(in)f(our)h(pool)g(runtime)f(library)h(\(used)g(after)f + (pool)h(allocation\))g(and)-150 4101 y(the)19 b(standard)g(libc)g + (malloc)g(library)g(\(used)g(by)g(NoP)-7 b(A\))19 b(af)n(fect)f(the)h + (compar)o(-)-150 4184 y(isons.)24 b(This)f(is)h(signi\002cant)g + (because)h(our)f(pool)h(library)e(implementation)-150 + 4267 y(is)i(currently)h(not)g(thread-safe)g(\(though)g(it)f(is)g + (otherwise)h(fully)f(general\),)-150 4350 y(and)f(this)g(or)g(other)g + (implementation)g(details)g(could)h(sk)o(e)n(w)f(the)g(results)f(in) + -150 4433 y(our)j(f)o(a)o(v)o(or)l(.)f(T)-6 b(o)26 b(measure)g(this,)f + (we)h(transformed)g(the)g(programs)h(to)f(allo-)-150 + 4516 y(cate)f(out)g(of)g(a)f(single)h(global)h(pool)f(\(this)g + (transformation)g(does)h(not)f(add)-150 4599 y(pool)f(ar)o(guments)h + (or)e(other)h(o)o(v)o(erhead)h(to)e(the)h(program\),)g(ef)n(fecti)n(v)o + (ely)g(us-)-150 4682 y(ing)j(our)f(allocator)h(to)f(replace)h(malloc)f + (and)h(free)f(for)h(the)f(program)h(\(the)-150 4765 y(OnePool)f + (column\).)g(Comparing)g(with)g(NoP)-7 b(A)25 b(sho)n(ws)h(that)f(in)h + (all)f(b)o(ut)g(4)-150 4848 y(cases)j(\(197.parser)o(-b,)h(ks,)f(chomp) + h(and)f(perimter\),)g(OnePool)g(is)g(within)-150 4932 + y(about)h(5\045)f(of)g(NoP)-7 b(A.)28 b(The)f(lar)o(ge)h(slo)n(wdo)n + (wn)h(for)f(parser)o(-b)g(occurs)h(be-)-150 5015 y(cause)f(we)f(use)g + (a)g(singly-link)o(ed)h(free)f(list)f(and)i(the)f(order)g(of)g(frees)g + (pre-)-150 5098 y(v)o(ents)f(coalescing)h(adjacent)g(free)f(blocks.)h + Fs(chomp)f Fz(is)g(much)h(f)o(aster)f(with)-150 5181 + y(our)j(allocator)g(because)h(our)f(allocator)g(has)g(a)g(f)o(ast)g + (path)g(for)g(\002x)o(ed)f(size)-150 5264 y(allocations)23 + b(\(to)f(e)o(xploit)h(type)g(homogeneous)i(pools\))e(and)h(nearly)f + (all)f(al-)-150 5347 y(locations)f(in)g Fs(chomp)g Fz(are)g + (\(multiples)f(of\))h(this)f(\002x)o(ed)h(size.)f(As)h(sho)n(wn)g(be-) + -150 5430 y(lo)n(w)-5 b(,)26 b(in)h(all)f(cases)h(e)o(xcept)g + (perimeter)m(,)f(an)o(y)i(such)f(adv)n(antages)h(from)f(our)2042 + 66 y(runtime)21 b(library)f(\(e)n(v)o(en)i(chomp\))f(are)g(much)g + (smaller)g(than)g(the)f(aggre)o(gate)2042 149 y(performance)g(impro)o + (v)o(ements)g(due)g(to)e(pool)i(allocation.)2141 232 + y(Finally)-5 b(,)29 b(the)g(OnlyOH)g(column)h(aims)f(to)h(isolate)f + (the)g(performance)2042 315 y(o)o(v)o(erheads)d(in)f(the)g(transformed) + g(code,)h(namely)-5 b(,)25 b(e)o(xtra)g(pool)g(ar)o(guments)2042 + 399 y(on)f(functions)g(and)h(initializing)e(and)h(destro)o(ying)h(pool) + f(descriptors.)g(It)f(is)2042 482 y(computed)i(by)f(pool-allocating)h + (the)e(program,)h(b)o(ut)g(modifying)g(the)g(run-)2042 + 565 y(time)k(library)g(so)h(that)g(poolalloc/free)g(simply)g(call)f + (malloc/free.)g(Com-)2042 648 y(paring)20 b(to)g(NoP)-7 + b(A)20 b(sho)n(ws)h(that)f(this)f(o)o(v)o(erhead)j(is)d(ne)o(gligible)i + (or)f(quite)g(lo)n(w)2042 731 y(\(less)27 b(than)g(about)h(5\045\))g + (in)f(nearly)g(all)g(cases,)g(b)o(ut)g(is)g(slightly)g(higher)h(in)2042 + 814 y(197.parser)o(-b)j(\(7\045\),)f(bc\(10\045\),)h(and)g(fpgro)n(wth) + g(\(7\045\).)f(The)g(pool)h(allo-)2042 897 y(cator)c(must)f(o)o(v)o + (ercome)i(this)f(o)o(v)o(erhead)h(to)f(pro)o(vide)g(a)g(net)g + (performance)2042 980 y(impro)o(v)o(ement.)2042 1128 + y Fn(9.4)75 b(P)o(ool)18 b(Allocation)h(and)f(FullP)-6 + b(A)17 b(Aggr)o(egate)k(P)o(erf)n(ormance)2042 1244 y + Fz(T)-6 b(able)39 b(5)h(sho)n(ws)g(the)f(program)i(running)f(time)f + (and)h(speedups)i(\(rela-)2042 1327 y(ti)n(v)o(e)29 b(to)f(NoP)-7 + b(A\))29 b(for)f(automatic)i(pool)f(allocation)h(alone)f(\(BaseP)-7 + b(A\))28 b(and)2042 1410 y(for)37 b(pool)g(allocation)h(with)f(all)f + (pool-based)j(optimizations)f(\(FullP)-7 b(A\).)2042 + 1493 y(FullP)g(A)26 b(therefore)h(represents)h(the)f(aggre)o(gate)h + (performance)g(impact)f(of)2042 1576 y(this)f(w)o(ork.)h(As)f(the)g + (table)h(sho)n(ws,)g(FullP)-7 b(A)25 b(impro)o(v)o(es)i(the)g + (performance)2042 1659 y(of)h(man)o(y)i(programs)f(from)g(5\045)g(to)f + (20\045,)i(impro)o(v)o(es)f(analyzer)g(and)h(llu-)2042 + 1742 y(bench)22 b(by)f(roughly)i(2x,)e(and)h(ft)e(and)i(chomp)g(more)f + (than)h(10x.)f(In)g(no)h(case)2042 1825 y(does)32 b(FullP)-7 + b(A)30 b(hurt)i(the)f(performance)i(of)e(other)h(programs)g(relati)n(v) + o(e)f(to)2042 1908 y(NoP)-7 b(A.)15 b(Not)g(surprisingly)-5 + b(,)16 b(there)g(is)f(no)h(ob)o(vious)h(correlation)f(between)g(the) + 2042 1991 y(speedups)21 b(obtained)h(and)e(the)g(number)h(of)f(static)g + (or)g(dynamic)h(pools.)f(The)2042 2074 y(causes)f(and)h(breakdo)n(wn)h + (of)e(these)g(impro)o(v)o(ements)h(are)f(studied)g(belo)n(w)-5 + b(.)p 2129 2174 1804 4 v 2127 2241 4 67 v 2179 2221 a + Fw(Program)p 2518 2241 V 212 w(NoP)g(A)p 2778 2241 V + 2794 2241 V 116 w(BaseP)g(A)p 3076 2241 V 98 w(BaseP)g(A/)p + 3373 2241 V 3390 2241 V 115 w(FullP)g(A)p 3652 2241 V + 101 w(FullP)g(A/)p 3931 2241 V 2127 2307 V 2518 2307 + V 2778 2307 V 2794 2307 V 3076 2307 V 3185 2287 a(NoP)g(A)p + 3373 2307 V 3390 2307 V 3652 2307 V 418 w(NoP)g(A)p 3931 + 2307 V 2129 2311 1804 4 v 2127 2377 4 67 v 2179 2357 + a(164.gzip)p 2518 2377 V 218 w(28.09)p 2778 2377 V 2794 + 2377 V 167 w(27.93)p 3076 2377 V 196 w(0.99)p 3373 2377 + V 3390 2377 V 147 w(28.40)p 3652 2377 V 177 w(1.01)p + 3931 2377 V 2127 2443 V 2179 2424 a(175.vpr)p 2518 2443 + V 241 w(10.88)p 2778 2443 V 2794 2443 V 167 w(10.85)p + 3076 2443 V 196 w(1.00)p 3373 2443 V 3390 2443 V 147 + w(10.30)p 3652 2443 V 177 w(0.94)p 3931 2443 V 2127 2510 + V 2179 2490 a(197.parser)o(-b)p 2518 2510 V 129 w(12.52)p + 2778 2510 V 2794 2510 V 167 w(10.14)p 3076 2510 V 196 + w(0.81)p 3373 2510 V 3390 2510 V 176 w(9.84)p 3652 2510 + V 177 w(0.79)p 3931 2510 V 2127 2576 V 2179 2556 a(252.eon)p + 2518 2576 V 263 w(0.86)p 2778 2576 V 2794 2576 V 196 + w(0.84)p 3076 2576 V 196 w(0.98)p 3373 2576 V 3390 2576 + V 176 w(0.84)p 3652 2576 V 177 w(0.98)p 3931 2576 V 2127 + 2643 V 2179 2623 a(300.tw)o(olf)p 2518 2643 V 197 w(20.10)p + 2778 2643 V 2794 2643 V 167 w(17.59)p 3076 2643 V 196 + w(0.88)p 3373 2643 V 3390 2643 V 147 w(17.01)p 3652 2643 + V 177 w(0.85)p 3931 2643 V 2129 2646 1804 4 v 2127 2712 + 4 67 v 2179 2693 a(anagram)p 2518 2712 V 249 w(3.02)p + 2778 2712 V 2794 2712 V 196 w(3.00)p 3076 2712 V 196 + w(0.99)p 3373 2712 V 3390 2712 V 176 w(3.00)p 3652 2712 + V 177 w(0.99)p 3931 2712 V 2127 2779 V 2179 2759 a(bc)p + 2518 2779 V 394 w(1.55)p 2778 2779 V 2794 2779 V 196 + w(1.26)p 3076 2779 V 196 w(0.81)p 3373 2779 V 3390 2779 + V 176 w(1.24)p 3652 2779 V 177 w(0.80)p 3931 2779 V 2127 + 2845 V 2179 2825 a(ft)p 2518 2845 V 385 w(68.73)p 2778 + 2845 V 2794 2845 V 196 w(5.89)p 3076 2845 V 196 w(0.09)p + 3373 2845 V 3390 2845 V 176 w(4.98)p 3652 2845 V 177 + w(0.07)p 3931 2845 V 2127 2912 V 2179 2892 a(ks)p 2518 + 2912 V 397 w(4.43)p 2778 2912 V 2794 2912 V 196 w(4.38)p + 3076 2912 V 196 w(0.99)p 3373 2912 V 3390 2912 V 176 + w(4.39)p 3652 2912 V 177 w(0.99)p 3931 2912 V 2127 2978 + V 2179 2958 a(yacr2)p 2518 2978 V 320 w(3.89)p 2778 2978 + V 2794 2978 V 196 w(3.89)p 3076 2978 V 196 w(1.01)p 3373 + 2978 V 3390 2978 V 176 w(3.87)p 3652 2978 V 177 w(1.00)p + 3931 2978 V 2129 2981 1804 4 v 2127 3048 4 67 v 2179 + 3028 a(analyzer)p 2518 3048 V 194 w(312.25)p 2778 3048 + V 2794 3048 V 138 w(183.64)p 3076 3048 V 196 w(0.59)p + 3373 3048 V 3390 3048 V 118 w(130.53)p 3652 3048 V 177 + w(0.42)p 3931 3048 V 2127 3114 V 2179 3094 a(neural)p + 2518 3114 V 275 w(87.60)p 2778 3114 V 2794 3114 V 167 + w(87.33)p 3076 3114 V 196 w(1.00)p 3373 3114 V 3390 3114 + V 147 w(87.15)p 3652 3114 V 177 w(1.00)p 3931 3114 V + 2127 3181 V 2179 3161 a(pcompress2)p 2518 3181 V 142 + w(38.04)p 2778 3181 V 2794 3181 V 167 w(37.52)p 3076 + 3181 V 196 w(0.99)p 3373 3181 V 3390 3181 V 147 w(37.68)p + 3652 3181 V 177 w(1.00)p 3931 3181 V 2129 3184 1804 4 + v 2127 3250 4 67 v 2179 3231 a(llu-bench)p 2518 3250 + V 172 w(106.50)p 2778 3250 V 2794 3250 V 138 w(108.37)p + 3076 3250 V 196 w(1.02)p 3373 3250 V 3390 3250 V 147 + w(60.96)p 3652 3250 V 177 w(0.57)p 3931 3250 V 2127 3317 + V 2179 3297 a(chomp)p 2518 3317 V 262 w(16.71)p 2778 + 3317 V 2794 3317 V 196 w(1.71)p 3076 3317 V 196 w(0.10)p + 3373 3317 V 3390 3317 V 176 w(1.46)p 3652 3317 V 177 + w(0.09)p 3931 3317 V 2127 3383 V 2179 3363 a(fpgro)o(wth)p + 2518 3383 V 209 w(36.62)p 2778 3383 V 2794 3383 V 167 + w(31.13)p 3076 3383 V 196 w(0.85)p 3373 3383 V 3390 3383 + V 147 w(30.42)p 3652 3383 V 177 w(0.83)p 3931 3383 V + 2127 3450 V 2179 3430 a(espresso)p 2518 3450 V 251 w(1.22)p + 2778 3450 V 2794 3450 V 196 w(1.15)p 3076 3450 V 196 + w(0.94)p 3373 3450 V 3390 3450 V 176 w(1.09)p 3652 3450 + V 177 w(0.89)p 3931 3450 V 2127 3516 V 2179 3496 a(po)o(vray31)p + 2518 3516 V 231 w(9.79)p 2778 3516 V 2794 3516 V 196 + w(9.31)p 3076 3516 V 196 w(0.95)p 3373 3516 V 3390 3516 + V 176 w(9.12)p 3652 3516 V 177 w(0.93)p 3931 3516 V 2129 + 3519 1804 4 v 2127 3586 4 67 v 2179 3566 a(bh)p 2518 + 3586 V 391 w(9.33)p 2778 3586 V 2794 3586 V 196 w(9.41)p + 3076 3586 V 196 w(1.01)p 3373 3586 V 3390 3586 V 176 + w(8.88)p 3652 3586 V 177 w(0.95)p 3931 3586 V 2127 3652 + V 2179 3632 a(bisort)p 2518 3652 V 288 w(13.06)p 2778 + 3652 V 2794 3652 V 167 w(13.02)p 3076 3652 V 196 w(1.00)p + 3373 3652 V 3390 3652 V 147 w(11.04)p 3652 3652 V 177 + w(0.85)p 3931 3652 V 2127 3719 V 2179 3699 a(em3d)p 2518 + 3719 V 320 w(6.80)p 2778 3719 V 2794 3719 V 196 w(6.82)p + 3076 3719 V 196 w(1.00)p 3373 3719 V 3390 3719 V 176 + w(6.62)p 3652 3719 V 177 w(0.97)p 3931 3719 V 2127 3785 + V 2179 3765 a(health)p 2518 3785 V 278 w(13.99)p 2778 + 3785 V 2794 3785 V 167 w(13.35)p 3076 3785 V 196 w(0.95)p + 3373 3785 V 3390 3785 V 147 w(12.02)p 3652 3785 V 177 + w(0.86)p 3931 3785 V 2127 3852 V 2179 3832 a(mst)p 2518 + 3852 V 336 w(13.14)p 2778 3852 V 2794 3852 V 167 w(11.67)p + 3076 3852 V 196 w(0.89)p 3373 3852 V 3390 3852 V 147 + w(11.39)p 3652 3852 V 177 w(0.87)p 3931 3852 V 2127 3918 + V 2179 3898 a(perimeter)p 2518 3918 V 227 w(2.92)p 2778 + 3918 V 2794 3918 V 196 w(2.59)p 3076 3918 V 196 w(0.89)p + 3373 3918 V 3390 3918 V 176 w(2.45)p 3652 3918 V 177 + w(0.84)p 3931 3918 V 2127 3984 V 2179 3964 a(po)o(wer)p + 2518 3984 V 305 w(2.91)p 2778 3984 V 2794 3984 V 196 + w(2.91)p 3076 3984 V 196 w(1.00)p 3373 3984 V 3390 3984 + V 176 w(2.91)p 3652 3984 V 177 w(1.00)p 3931 3984 V 2127 + 4051 V 2179 4031 a(treeadd)p 2518 4051 V 249 w(17.41)p + 2778 4051 V 2794 4051 V 167 w(17.19)p 3076 4051 V 196 + w(0.99)p 3373 4051 V 3390 4051 V 147 w(16.85)p 3652 4051 + V 177 w(0.97)p 3931 4051 V 2127 4117 V 2179 4097 a(tsp)p + 2518 4117 V 381 w(7.24)p 2778 4117 V 2794 4117 V 196 + w(7.03)p 3076 4117 V 196 w(0.97)p 3373 4117 V 3390 4117 + V 176 w(5.95)p 3652 4117 V 177 w(0.82)p 3931 4117 V 2129 + 4121 1804 4 v 2042 4156 1993 3 v 2180 4241 a Fn(T)e(able)19 + b(5.)g Fz(Run)g(time)f(\(seconds\))i(and)g(runtime)f(ratios)g(vs.)g + (NoP)-7 b(A)2042 4400 y Fn(9.5)75 b(Locality)19 b(impr)o(o)o(v)o + (ements)2042 4516 y Fz(Figure)c(10)h(sho)n(ws)g(the)f(measured)h(cache) + g(miss)f(ratio)g(of)h(FullP)-7 b(A)14 b(compared)2042 + 4599 y(to)23 b(NoP)-7 b(A,)23 b(for)g(each)h(program)g(that)f(sped)h + (up)g(at)f(least)g(5\045.)h(The)f(runtime)2042 4682 y(ratios)i(for)h + (these)g(programs)h(are)e(sho)n(wn)i(in)f(Figure)f(9)h(to)g(help)g + (correlate)2042 4765 y(the)g(impro)o(v)o(ements)i(in)f(cache)g(misses)g + (and)g(running)h(times.)d(The)i(\002gure)2042 4848 y(includes)20 + b(data)h(for)e(the)h(number)h(of)f(accesses)h(that)f(miss)f(the)h + (Athlon')l(s)g(L1)2042 4932 y(D-cache,)29 b(the)h(number)g(of)g + (accesses)g(that)f(miss)g(the)h(L2)f(D-cache,)g(and)2042 + 5015 y(the)g(number)h(of)f(DTLB)f(misses)h(as)g(measured)h(by)g(the)f + (Athlon)g(perfor)o(-)2042 5098 y(mance)h(monitoring)h(counters.)g(The)e + (graph)i(sho)n(ws)g(that)e(the)h(programs)2042 5181 y(with)16 + b(the)h(lar)o(gest)g(speedups)h(generally)g(ha)o(v)o(e)f(dramatically)g + (reduced)h(miss)2042 5264 y(rates)k(at)g(e)n(v)o(ery)h(le)n(v)o(el)f + (of)g(the)g(cache)h(hierarchy)-5 b(.)23 b(The)f(bene\002ts)g(for)g + Fs(twolf)2042 5347 y Fz(and)c Fs(llu-bench)i Fz(are)e(primarily)g(at)f + (the)h(TLB)f(and)i(those)f(of)g Fs(ft)g Fz(are)g(much)2042 + 5430 y(greater)k(at)f(the)h(cache.)h(F)o(or)e(all)h(other)g(cases,)g + (the)g(reductions)h(are)f(closely)p eop end + %%Page: 12 12 + TeXDict begin 12 11 bop -47 1318 a @beginspecial 0 @llx + 0 @lly 792 @urx 612 @ury 1656 @rhi @setspecial + %%BeginDocument: Tables/BaseOptRuntimeRatios.ps + %!PS-Adobe-3.0 + %%Title: (\376\377) + %%Version: 1 2 + %%Creator: (\376\377) + %%CreationDate: (D:20050420090744) + %%For: (\376\377) + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%BoundingBox: 0 0 792 612 + %%Pages: 1 + %%DocumentProcessColors: (atend) + %%DocumentSuppliedResources: (atend) + %%EndComments + %%BeginDefaults + %%EndDefaults + %%BeginProlog + %%EndProlog + %%BeginSetup + %%BeginResource: l2check + %%Copyright: Copyright 1993 Adobe Systems Incorporated. All Rights Reserved. + systemdict /languagelevel known + { systemdict /languagelevel get 1 eq } + { true } + ifelse + { + initgraphics /Helvetica findfont 18 scalefont setfont + 72 600 moveto (Error: Your printer driver needs to be configured) dup show + 72 580 moveto (for printing to a PostScript Language Level 1 printer.) dup show + exch = = + /Helvetica-Bold findfont 16 scalefont setfont + 72 520 moveto (Windows and Unix) show + /Times-Roman findfont 16 scalefont setfont + 72 500 moveto (Select ?Language Level 1? in the PostScript options section) show + 72 480 moveto (of the Acrobat print dialog.) show + /Helvetica-Bold findfont 16 scalefont setfont + 72 440 moveto (Macintosh) show + /Times-Roman findfont 16 scalefont setfont + 72 420 moveto (In the Chooser, select your printer driver.) show + 72 400 moveto (Then select your printer and click the Setup button.) show + 72 380 moveto (Follow any on-screen dialogs that may appear.) show + showpage + quit + } + if + %%EndResource + userdict /pdf_svglb currentglobal put true setglobal + %%BeginResource: file Pscript_CFF PSVER + userdict/ct_CffDict 6 dict put ct_CffDict begin/F0Subr{systemdict/internaldict + known{1183615869 systemdict/internaldict get exec/FlxProc known{save true}{ + false}ifelse}{userdict/internaldict known not{userdict/internaldict{count 0 eq + {/internaldict errordict/invalidaccess get exec}if dup type/integertype ne{ + /internaldict errordict/invalidaccess get exec}if dup 1183615869 eq{pop 0}{ + /internaldict errordict/invalidaccess get exec}ifelse}dup 14 get 1 25 dict put + bind executeonly put}if 1183615869 userdict/internaldict get exec/FlxProc + known{save true}{false}ifelse}ifelse[systemdict/internaldict known not{100 + dict/begin cvx/mtx matrix/def cvx}if systemdict/currentpacking known{ + currentpacking true setpacking}if{systemdict/internaldict known{1183615869 + systemdict/internaldict get exec dup/$FlxDict known not{dup dup length exch + maxlength eq{pop userdict dup/$FlxDict known not{100 dict begin/mtx matrix def + dup/$FlxDict currentdict put end}if}{100 dict begin/mtx matrix def dup + /$FlxDict currentdict put end}ifelse}if/$FlxDict get begin}if grestore/exdef{ + exch def}def/dmin exch abs 100 div def/epX exdef/epY exdef/c4y2 exdef/c4x2 + exdef/c4y1 exdef/c4x1 exdef/c4y0 exdef/c4x0 exdef/c3y2 exdef/c3x2 exdef/c3y1 + exdef/c3x1 exdef/c3y0 exdef/c3x0 exdef/c1y2 exdef/c1x2 exdef/c2x2 c4x2 def + /c2y2 c4y2 def/yflag c1y2 c3y2 sub abs c1x2 c3x2 sub abs gt def/PickCoords{{ + c1x0 c1y0 c1x1 c1y1 c1x2 c1y2 c2x0 c2y0 c2x1 c2y1 c2x2 c2y2}{c3x0 c3y0 c3x1 + c3y1 c3x2 c3y2 c4x0 c4y0 c4x1 c4y1 c4x2 c4y2}ifelse/y5 exdef/x5 exdef/y4 exdef + /x4 exdef/y3 exdef/x3 exdef/y2 exdef/x2 exdef/y1 exdef/x1 exdef/y0 exdef/x0 + exdef}def mtx currentmatrix pop mtx 0 get abs 1e-05 lt mtx 3 get abs 1e-05 lt + or{/flipXY -1 def}{mtx 1 get abs 1e-05 lt mtx 2 get abs 1e-05 lt or{/flipXY 1 + def}{/flipXY 0 def}ifelse}ifelse/erosion 1 def systemdict/internaldict known{ + 1183615869 systemdict/internaldict get exec dup/erosion known{/erosion get + /erosion exch def}{pop}ifelse}if yflag{flipXY 0 eq c3y2 c4y2 eq or{false + PickCoords}{/shrink c3y2 c4y2 eq{0}{c1y2 c4y2 sub c3y2 c4y2 sub div abs}ifelse + def/yshrink{c4y2 sub shrink mul c4y2 add}def/c1y0 c3y0 yshrink def/c1y1 c3y1 + yshrink def/c2y0 c4y0 yshrink def/c2y1 c4y1 yshrink def/c1x0 c3x0 def/c1x1 + c3x1 def/c2x0 c4x0 def/c2x1 c4x1 def/dY 0 c3y2 c1y2 sub round dtransform + flipXY 1 eq{exch}if pop abs def dY dmin lt PickCoords y2 c1y2 sub abs .001 gt{ + c1x2 c1y2 transform flipXY 1 eq{exch}if/cx exch def/cy exch def/dY 0 y2 c1y2 + sub round dtransform flipXY 1 eq{exch}if pop def dY round dup 0 ne{/dY exdef}{ + pop dY 0 lt{-1}{1}ifelse/dY exdef}ifelse/erode PaintType 2 ne erosion .5 ge + and def erode{/cy cy .5 sub def}if/ey cy dY add def/ey ey ceiling ey sub ey + floor add def erode{/ey ey .5 add def}if ey cx flipXY 1 eq{exch}if itransform + exch pop y2 sub/eShift exch def/y1 y1 eShift add def/y2 y2 eShift add def/y3 + y3 eShift add def}if}ifelse}{flipXY 0 eq c3x2 c4x2 eq or{false PickCoords}{ + /shrink c3x2 c4x2 eq{0}{c1x2 c4x2 sub c3x2 c4x2 sub div abs}ifelse def/xshrink + {c4x2 sub shrink mul c4x2 add}def/c1x0 c3x0 xshrink def/c1x1 c3x1 xshrink def + /c2x0 c4x0 xshrink def/c2x1 c4x1 xshrink def/c1y0 c3y0 def/c1y1 c3y1 def/c2y0 + c4y0 def/c2y1 c4y1 def/dX c3x2 c1x2 sub round 0 dtransform flipXY -1 eq{exch} + if pop abs def dX dmin lt PickCoords x2 c1x2 sub abs .001 gt{c1x2 c1y2 + transform flipXY -1 eq{exch}if/cy exch def/cx exch def/dX x2 c1x2 sub round 0 + dtransform flipXY -1 eq{exch}if pop def dX round dup 0 ne{/dX exdef}{pop dX 0 + lt{-1}{1}ifelse/dX exdef}ifelse/erode PaintType 2 ne erosion .5 ge and def + erode{/cx cx .5 sub def}if/ex cx dX add def/ex ex ceiling ex sub ex floor add + def erode{/ex ex .5 add def}if ex cy flipXY -1 eq{exch}if itransform pop x2 + sub/eShift exch def/x1 x1 eShift add def/x2 x2 eShift add def/x3 x3 eShift add + def}if}ifelse}ifelse x2 x5 eq y2 y5 eq or{x5 y5 lineto}{x0 y0 x1 y1 x2 y2 + curveto x3 y3 x4 y4 x5 y5 curveto}ifelse epY epX}systemdict/currentpacking + known{exch setpacking}if/exec cvx/end cvx]cvx executeonly exch{pop true exch + restore}{systemdict/internaldict known not{1183615869 userdict/internaldict + get exec exch/FlxProc exch put true}{1183615869 systemdict/internaldict get + exec dup length exch maxlength eq{false}{1183615869 systemdict/internaldict + get exec exch/FlxProc exch put true}ifelse}ifelse}ifelse{systemdict + /internaldict known{1183615869 systemdict/internaldict get exec/FlxProc get + exec}{1183615869 userdict/internaldict get exec/FlxProc get exec}ifelse}if} + executeonly def/F1Subr{gsave currentpoint newpath moveto}bind def/F2Subr{ + currentpoint grestore gsave currentpoint newpath moveto}bind def/HSSubr{ + systemdict/internaldict known not{pop 3}{1183615869 systemdict/internaldict + get exec dup/startlock known{/startlock get exec}{dup/strtlck known{/strtlck + get exec}{pop 3}ifelse}ifelse}ifelse}bind def end + %%EndResource + + userdict /pdf_svglb get setglobal + /currentpacking where{pop currentpacking true setpacking}if + %%BeginResource: procset pdfvars + %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. All Rights Reserved. + %%Version: 5.0 6 + %%Title: definition of dictionary of variables used by PDF & PDFText procsets + userdict /PDF 160 dict put + userdict /PDFVars 89 dict dup begin put + /docSetupDone false def + /InitAll 0 def + /TermAll 0 def + /DocInitAll 0 def + /DocTermAll 0 def + /_pdfEncodings 2 array def + /_pdf_str1 1 string def + /_pdf_i 0 def + /_pdf_na 0 def + /_pdf_showproc 0 def + /_italMtx [1 0 .212557 1 0 0] def + /_italMtx_WMode1 [1 -.212557 0 1 0 0] def + /_italMtxType0 [1 0 .1062785 1 0 0] def + /_italMtx_WMode1Type0 [1 -.1062785 0 1 0 0] def + /_basefont 0 def + /_basefonto 0 def + /_pdf_oldCIDInit null def + /_pdf_FontDirectory 30 dict def + /_categories 10 dict def + /_sa? true def + /_ColorSep5044? false def + /nulldict 0 dict def + /_processColors 0 def + /overprintstack null def + /_defaulttransfer currenttransfer def + /_defaultflatness currentflat def + /_defaulthalftone null def + /_defaultcolortransfer null def + /_defaultblackgeneration null def + /_defaultundercolorremoval null def + /_defaultcolortransfer null def + PDF begin + [/c/cs/cm/d/d0/f/h/i/j/J/l/m/M/n/q/Q/re/ri/S/sc/sh/Tf/w/W + /applyInterpFunc/applystitchFunc/domainClip/encodeInput + /initgs/int/limit/rangeClip + /defineRes/findRes/setSA/pl + %% to keep CoolType entries in GlyphDirProcs safe from collisions with Win PS driver + /? /! /| /: /+ /GetGlyphDirectory + /pdf_flushFilters /pdf_readstring /pdf_dictOp /pdf_image /pdf_maskedImage + /pdf_shfill /pdf_sethalftone + ] {null def} bind forall + end + end + %%EndResource + PDFVars begin PDF begin + %%BeginResource: procset pdfutil + %%Copyright: Copyright 1993-1999 Adobe Systems Incorporated. All Rights Reserved. + %%Version: 4.0 2 + %%Title: Basic utilities used by other PDF procsets + /bd {bind def} bind def + /ld {load def} bd + /bld { + dup length dict begin + { null def } forall + bind + end + def + } bd + /dd { PDFVars 3 1 roll put } bd + /xdd { exch dd } bd + /Level2? + systemdict /languagelevel known + { systemdict /languagelevel get 2 ge } { false } ifelse + def + /Level1? Level2? not def + /Level3? + systemdict /languagelevel known + {systemdict /languagelevel get 3 eq } { false } ifelse + def + /getifknown { + 2 copy known { get true } { pop pop false } ifelse + } bd + /here { + currentdict exch getifknown + } bd + /isdefined? { where { pop true } { false } ifelse } bd + %%EndResource + %%BeginResource: procset pdf + %%Version: 5.0 7 + %%Copyright: Copyright 1998-2001 Adobe Systems Incorporated. All Rights Reserved. + %%Title: General operators for PDF, common to all Language Levels. + /cm { matrix astore concat } bd + /d /setdash ld + /f /fill ld + /h /closepath ld + /i {dup 0 eq {pop _defaultflatness} if setflat} bd + /j /setlinejoin ld + /J /setlinecap ld + /M /setmiterlimit ld + /n /newpath ld + /S /stroke ld + /w /setlinewidth ld + /W /clip ld + /initgs { + 0 setgray + [] 0 d + 0 j + 0 J + 10 M + 1 w + false setSA + /_defaulttransfer load settransfer + 0 i + /RelativeColorimetric ri + newpath + } bd + /int { + dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul + exch pop add exch pop + } bd + /limit { + dup 2 index le { exch } if pop + dup 2 index ge { exch } if pop + } bd + /domainClip { + Domain aload pop 3 2 roll + limit + } [/Domain] bld + /applyInterpFunc { + 0 1 DimOut 1 sub + { + dup C0 exch get exch + dup C1 exch get exch + 3 1 roll + 1 index sub + 3 index + N exp mul add + exch + currentdict /Range_lo known + { + dup Range_lo exch get exch + Range_hi exch get + 3 2 roll limit + } + { + pop + } + ifelse + exch + } for + pop + } [/DimOut /C0 /C1 /N /Range_lo /Range_hi] bld + /encodeInput { + NumParts 1 sub + 0 1 2 index + { + dup Bounds exch get + 2 index gt + { exit } + { dup + 3 index eq + { exit } + { pop } ifelse + } ifelse + } for + 3 2 roll pop + dup Bounds exch get exch + dup 1 add Bounds exch get exch + 2 mul + dup Encode exch get exch + 1 add Encode exch get + int + } [/NumParts /Bounds /Encode] bld + /rangeClip { + exch dup Range_lo exch get + exch Range_hi exch get + 3 2 roll + limit + } [/Range_lo /Range_hi] bld + /applyStitchFunc { + Functions exch get exec + currentdict /Range_lo known { + 0 1 DimOut 1 sub { + DimOut 1 add -1 roll + rangeClip + } for + } if + } [/Functions /Range_lo /DimOut] bld + /pdf_flushfilters + { + aload length + { dup status + 1 index currentfile ne and + { dup flushfile closefile } + { pop } + ifelse + } repeat + } bd + /pdf_readstring + { + 1 index dup length 1 sub get + exch readstring pop + exch pdf_flushfilters + } bind def + /pdf_dictOp + { + 3 2 roll + 10 dict copy + begin + _Filters dup length 1 sub get def + currentdict exch exec + _Filters pdf_flushfilters + end + } [/_Filters] bld + /pdf_image {{image} /DataSource pdf_dictOp} bd + /pdf_imagemask {{imagemask} /DataSource pdf_dictOp} bd + /pdf_shfill {{sh} /DataSource pdf_dictOp} bd + /pdf_sethalftone {{sethalftone} /Thresholds pdf_dictOp} bd + /pdf_maskedImage + { + 10 dict copy begin + /miDict currentdict def + /DataDict DataDict 10 dict copy def + DataDict begin + /DataSource + _Filters dup length 1 sub get + def + miDict image + _Filters pdf_flushfilters + end + end + } [/miDict /DataDict /_Filters] bld + /RadialShade { + 40 dict begin + /background exch def + /ext1 exch def + /ext0 exch def + /BBox exch def + /r2 exch def + /c2y exch def + /c2x exch def + /r1 exch def + /c1y exch def + /c1x exch def + /rampdict exch def + gsave + BBox length 0 gt { + newpath + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + newpath + } if + c1x c2x eq + { + c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse + } + { + /slope c2y c1y sub c2x c1x sub div def + /theta slope 1 atan def + c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if + c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if + } + ifelse + gsave + clippath + c1x c1y translate + theta rotate + -90 rotate + { pathbbox } stopped + { 0 0 0 0 } if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + } + { + rampdict begin + 40 dict begin + background length 0 gt { background sssetbackground gsave clippath fill grestore } if + gsave + c1x c1y translate + theta rotate + -90 rotate + /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def + /c1y 0 def + /c1x 0 def + /c2x 0 def + ext0 { + 0 getrampcolor + c2y r2 add r1 lt + { + c1x c1y r1 360 0 arcn + xMin yMin moveto + xMax yMin lineto + xMax yMax lineto + xMin yMax lineto + xMin yMin lineto + eofill + } + { + c2y r1 add r2 le + { + c1x c1y r1 0 360 arc + fill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r1 neg def + /p1y c1y def + /p2x r1 def + /p2y c1y def + p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto + fill + } + { + /AA r2 r1 sub c2y div def + /theta AA 1 AA dup mul sub sqrt div 1 atan def + /SS1 90 theta add dup sin exch cos div def + /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y p1x SS1 div neg def + /SS2 90 theta sub dup sin exch cos div def + /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y p2x SS2 div neg def + r1 r2 gt + { + /L1maxX p1x yMin p1y sub SS1 div add def + /L2maxX p2x yMin p2y sub SS2 div add def + } + { + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + } + ifelse + } + ifelse + } ifelse + } if + c1x c2x sub dup mul + c1y c2y sub dup mul + add 0.5 exp + 0 dtransform + dup mul exch dup mul add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt { exch } if pop + /hires exch def + hires mul + /numpix exch def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + } if + } if + /xInc c2x c1x sub numsteps div def + /yInc c2y c1y sub numsteps div def + /rInc r2 r1 sub numsteps div def + /cx c1x def + /cy c1y def + /radius r1 def + newpath + xInc 0 eq yInc 0 eq rInc 0 eq and and + { + 0 getrampcolor + cx cy radius 0 360 arc + stroke + NumSamples 1 sub getrampcolor + cx cy radius 72 hires div add 0 360 arc + 0 setlinewidth + stroke + } + { + 0 + numsteps + { + dup + subsampling { round cvi } if + getrampcolor + cx cy radius 0 360 arc + /cx cx xInc add def + /cy cy yInc add def + /radius radius rInc add def + cx cy radius 360 0 arcn + eofill + rampIndxInc add + } + repeat + pop + } ifelse + ext1 { + c2y r2 add r1 lt + { + c2x c2y r2 0 360 arc + fill + } + { + c2y r1 add r2 le + { + c2x c2y r2 360 0 arcn + xMin yMin moveto + xMax yMin lineto + xMax yMax lineto + xMin yMax lineto + xMin yMin lineto + eofill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r2 neg def + /p1y c2y def + /p2x r2 def + /p2y c2y def + p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto + fill + } + { + /AA r2 r1 sub c2y div def + /theta AA 1 AA dup mul sub sqrt div 1 atan def + /SS1 90 theta add dup sin exch cos div def + /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y c2y p1x SS1 div sub def + /SS2 90 theta sub dup sin exch cos div def + /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y c2y p2x SS2 div sub def + r1 r2 lt + { + /L1maxX p1x yMax p1y sub SS1 div add def + /L2maxX p2x yMax p2y sub SS2 div add def + } + { + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + } + ifelse + } + ifelse + } ifelse + } if + grestore + grestore + end + end + end + } ifelse + } bd + /GenStrips { + 40 dict begin + /background exch def + /ext1 exch def + /ext0 exch def + /BBox exch def + /y2 exch def + /x2 exch def + /y1 exch def + /x1 exch def + /rampdict exch def + gsave + BBox length 0 gt { + newpath + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + newpath + } if + x1 x2 eq + { + y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse + } + { + /slope y2 y1 sub x2 x1 sub div def + /theta slope 1 atan def + x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if + x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if + } + ifelse + gsave + clippath + x1 y1 translate + theta rotate + { pathbbox } stopped + { 0 0 0 0 } if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + } + { + rampdict begin + 20 dict begin + background length 0 gt { background sssetbackground gsave clippath fill grestore } if + gsave + x1 y1 translate + theta rotate + /xStart 0 def + /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def + /ySpan yMax yMin sub def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + xStart 0 transform + xEnd 0 transform + 3 -1 roll + sub dup mul + 3 1 roll + sub dup mul + add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt { exch } if pop + mul + /numpix exch def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + } if + } if + ext0 { + 0 getrampcolor + xMin xStart lt + { xMin yMin xMin neg ySpan rectfill } if + } if + /xInc xEnd xStart sub numsteps div def + /x xStart def + 0 + numsteps + { + dup + subsampling { round cvi } if + getrampcolor + x yMin xInc ySpan rectfill + /x x xInc add def + rampIndxInc add + } + repeat + pop + ext1 { + xMax xEnd gt + { xEnd yMin xMax xEnd sub ySpan rectfill } if + } if + grestore + grestore + end + end + end + } ifelse + } bd + %%EndResource + %%BeginResource: procset pdflev2 + %%Version: 5.0 15 + %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. All Rights Reserved. + %%LanguageLevel: 2 + %%Title: PDF operators, with code specific for Level 2 + /docinitialize { + PDF begin + /_defaulthalftone currenthalftone dd + /_defaultblackgeneration currentblackgeneration dd + /_defaultundercolorremoval currentundercolorremoval dd + /_defaultcolortransfer [currentcolortransfer] dd + /_defaulttransfer currenttransfer dd + end + PDFVars /docSetupDone true put + } bd + /initialize { + PDFVars /docSetupDone get { + _defaulthalftone sethalftone + /_defaultblackgeneration load setblackgeneration + /_defaultundercolorremoval load setundercolorremoval + _defaultcolortransfer aload pop setcolortransfer + } if + false setoverprint + } bd + /terminate { } bd + /c /curveto ld + /cs /setcolorspace ld + /l /lineto ld + /m /moveto ld + /q /gsave ld + /Q /grestore ld + /sc /setcolor ld + /setSA/setstrokeadjust ld + /re { + 4 2 roll m + 1 index 0 rlineto + 0 exch rlineto + neg 0 rlineto + h + } bd + /concattransferfuncs { + [ 3 1 roll /exec load exch /exec load ] cvx + } bd + /concatandsettransfer { + /_defaulttransfer load concattransferfuncs settransfer + } bd + /concatandsetcolortransfer { + _defaultcolortransfer aload pop + 8 -1 roll 5 -1 roll concattransferfuncs 7 1 roll + 6 -1 roll 4 -1 roll concattransferfuncs 5 1 roll + 4 -1 roll 3 -1 roll concattransferfuncs 3 1 roll + concattransferfuncs + setcolortransfer + } bd + /defineRes/defineresource ld + /findRes/findresource ld + currentglobal + true systemdict /setglobal get exec + [/Function /ExtGState /Form /Shading /FunctionDictionary /MadePattern /PatternPrototype /DataSource /Image] + { /Generic /Category findresource dup length dict copy /Category defineresource pop } + forall + systemdict /setglobal get exec + /ri + { + /findcolorrendering isdefined? + { + mark exch + findcolorrendering + counttomark 2 eq + { type /booleantype eq + { dup type /nametype eq + { dup /ColorRendering resourcestatus + { pop pop + dup /DefaultColorRendering ne + { + /ColorRendering findresource + setcolorrendering + } if + } if + } if + } if + } if + cleartomark + } + { pop + } ifelse + } bd + /knownColorants? { + pop false + } bd + /getrampcolor { + /indx exch def + 0 1 NumComp 1 sub { + dup + Samples exch get + dup type /stringtype eq { indx get } if + exch + Scaling exch get aload pop + 3 1 roll + mul add + } for + setcolor + } bd + /sssetbackground { aload pop setcolor } bd + %%EndResource + %%BeginResource: procset pdftext + %%Version: 5.0 6 + %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. All Rights Reserved. + %%Title: Text operators for PDF + PDF /PDFText 78 dict dup begin put + /docinitialize + { + /resourcestatus where { + pop + /CIDParams /ProcSet resourcestatus { + pop pop + false /CIDParams /ProcSet findresource /SetBuildCompatible get exec + } if + } if + PDF begin + PDFText /_pdfDefineIdentity-H known + { PDFText /_pdfDefineIdentity-H get exec} + if + end + } bd + /initialize { + PDFText begin + } bd + /terminate { end } bd + Level2? + { + /_safeput + { + 3 -1 roll load 3 1 roll put + } + bd + } + { + /_safeput + { + 2 index load dup dup length exch maxlength ge + { dup length 5 add dict copy + 3 index xdd + } + { pop } + ifelse + 3 -1 roll load 3 1 roll put + } + bd + } + ifelse + /pdf_has_composefont? systemdict /composefont known def + /CopyFont { + { + 1 index /FID ne 2 index /UniqueID ne and + { def } { pop pop } ifelse + } forall + } bd + /Type0CopyFont + { + exch + dup length dict + begin + CopyFont + [ + exch + FDepVector + { + dup /FontType get 0 eq + { + 1 index Type0CopyFont + /_pdfType0 exch definefont + } + { + /_pdfBaseFont exch + 2 index exec + } + ifelse + exch + } + forall + pop + ] + /FDepVector exch def + currentdict + end + } bd + Level2? {currentglobal true setglobal} if + /cHexEncoding + [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 + /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 + /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 + /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B + /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E + /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 + /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 + /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 + /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA + /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD + /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 + /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 + /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 + /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def + Level2? {setglobal} if + /modEnc { + /_enc xdd + /_icode 0 dd + counttomark 1 sub -1 0 + { + index + dup type /nametype eq + { + _enc _icode 3 -1 roll put + _icode 1 add + } + if + /_icode xdd + } for + cleartomark + _enc + } bd + /trEnc { + /_enc xdd + 255 -1 0 { + exch dup -1 eq + { pop /.notdef } + { Encoding exch get } + ifelse + _enc 3 1 roll put + } for + pop + _enc + } bd + /TE { + /_i xdd + StandardEncoding 256 array copy modEnc + _pdfEncodings exch _i exch put + } bd + /TZ + { + /_usePDFEncoding xdd + findfont + dup length 6 add dict + begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + /pdf_origFontName FontName def + /FontName exch def + currentdict /PaintType known + { PaintType 2 eq {/PaintType 0 def} if } + if + _usePDFEncoding 0 ge + { + /Encoding _pdfEncodings _usePDFEncoding get def + pop + } + { + _usePDFEncoding -1 eq + { + counttomark 0 eq + { pop } + { + Encoding 256 array copy + modEnc /Encoding exch def + } + ifelse + } + { + 256 array + trEnc /Encoding exch def + } + ifelse + } + ifelse + pdf_EuroProcSet pdf_origFontName known + { + pdf_origFontName pdf_AddEuroGlyphProc + } if + Level2? + { + currentdict /pdf_origFontName undef + } if + FontName currentdict + end + definefont pop + } + bd + Level2? + { + /TZG + { + currentglobal true setglobal + 2 index _pdfFontStatus + { + 2 index findfont + false setglobal + 3 index findfont + true setglobal + ne + { + 2 index findfont dup rcheck + { + dup length dict begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + currentdict end + } + if + 3 index exch definefont pop + } + if + } if + setglobal + TZ + } bd + } + { + /TZG {TZ} bd + } ifelse + Level2? + { + currentglobal false setglobal + userdict /pdftext_data 5 dict put + pdftext_data + begin + /saveStacks + { + pdftext_data + begin + /vmmode currentglobal def + false setglobal + count array astore /os exch def + end + countdictstack array dictstack pdftext_data exch /ds exch put + cleardictstack pdftext_data /dscount countdictstack put + pdftext_data /vmmode get setglobal + } bind def + /restoreStacks + { + pdftext_data /vmmode currentglobal put false setglobal + clear cleardictstack + pdftext_data /ds get dup + pdftext_data /dscount get 1 2 index length 1 sub + { get begin dup } for + pop pop + pdftext_data /os get aload pop + pdftext_data /vmmode get setglobal + } bind def + /testForClonePrinterBug + { + currentglobal true setglobal + /undefinedCategory /Generic /Category findresource + dup length dict copy /Category defineresource pop + setglobal + pdftext_data /saveStacks get exec + pdftext_data /vmmode currentglobal put false setglobal + /undefined /undefinedCategory { resourcestatus } stopped + pdftext_data exch /bugFound exch put + pdftext_data /vmmode get setglobal + pdftext_data /restoreStacks get exec + pdftext_data /bugFound get + } bind def + end + setglobal + /pdf_resourcestatus + pdftext_data /testForClonePrinterBug get exec + { + { + pdftext_data /saveStacks get exec + pdftext_data /os get dup dup length 1 sub + dup 1 sub dup 0 lt { pop 0 } if + exch 1 exch { get exch dup } for + pop pop + { resourcestatus } + stopped + { + clear cleardictstack pdftext_data /restoreStacks get exec + { pop pop } stopped pop false + } + { + count array astore pdftext_data exch /results exch put + pdftext_data /restoreStacks get exec pop pop + pdftext_data /results get aload pop + } + ifelse + } + } + { { resourcestatus } } + ifelse + bd + } + if + Level2? + { + /_pdfUndefineResource + { + currentglobal 3 1 roll + _pdf_FontDirectory 2 index 2 copy known + {undef} + {pop pop} + ifelse + 1 index (pdf) exch _pdfConcatNames 1 index + 1 index 1 _pdfConcatNames 1 index + 5 index 1 _pdfConcatNames 1 index + 4 + { + 2 copy pdf_resourcestatus + { + pop 2 lt + {2 copy findresource gcheck setglobal undefineresource} + {pop pop} + ifelse + } + { pop pop} + ifelse + } repeat + setglobal + } bd + } + { + /_pdfUndefineResource { pop pop} bd + } + ifelse + Level2? + { + /_pdfFontStatus + { + currentglobal exch + /Font pdf_resourcestatus + {pop pop true} + {false} + ifelse + exch setglobal + } bd + } + { + /_pdfFontStatusString 50 string def + _pdfFontStatusString 0 (fonts/) putinterval + /_pdfFontStatus + { + FontDirectory 1 index known + { pop true } + { + _pdfFontStatusString 6 42 getinterval + cvs length 6 add + _pdfFontStatusString exch 0 exch getinterval + { status } stopped + {pop false} + { + { pop pop pop pop true} + { false } + ifelse + } + ifelse + } + ifelse + } bd + } + ifelse + Level2? + { + /_pdfCIDFontStatus + { + /CIDFont /Category pdf_resourcestatus + { + pop pop + /CIDFont pdf_resourcestatus + {pop pop true} + {false} + ifelse + } + { pop false } + ifelse + } bd + } + if + /_pdfString100 100 string def + /_pdfComposeFontName + { + dup length 1 eq + { + 0 get + 1 index + type /nametype eq + { + _pdfString100 cvs + length dup dup _pdfString100 exch (-) putinterval + _pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval + 2 index exch cvs length + add 1 add _pdfString100 exch 0 exch getinterval + exch pop + true + } + { + pop pop + false + } + ifelse + } + { + false + } + ifelse + dup {exch cvn exch} if + } bd + /_pdfConcatNames + { + exch + _pdfString100 cvs + length dup dup _pdfString100 exch (-) putinterval + _pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval + 3 -1 roll exch cvs length + add 1 add _pdfString100 exch 0 exch getinterval + cvn + } bind def + /_pdfTextTempString 50 string def + /_pdfRegOrderingArray [(Adobe-Japan1) (Adobe-CNS1) (Adobe-Korea1) (Adobe-GB1)] def + /_pdf_CheckCIDSystemInfo + { + 1 index _pdfTextTempString cvs + (Identity) anchorsearch + { + pop pop pop pop true + } + { + false + _pdfRegOrderingArray + { + 2 index exch + anchorsearch + { pop pop pop true exit} + { pop } + ifelse + } + forall + exch pop + exch /CIDFont findresource + /CIDSystemInfo get + 3 -1 roll /CMap findresource + /CIDSystemInfo get + exch + 3 -1 roll + { + 2 copy + /Supplement get + exch + dup type /dicttype eq + {/Supplement get} + {pop 0 } + ifelse + ge + } + { true } + ifelse + { + dup /Registry get + 2 index /Registry get eq + { + /Ordering get + exch /Ordering get + dup type /arraytype eq + { + 1 index type /arraytype eq + { + true + 1 index length 1 sub -1 0 + { + dup 2 index exch get exch 3 index exch get ne + { pop false exit} + if + } for + exch pop exch pop + } + { pop pop false } + ifelse + } + { + eq + } + ifelse + } + { pop pop false } + ifelse + } + { pop pop false } + ifelse + } + ifelse + } bind def + pdf_has_composefont? + { + /_pdfComposeFont + { + 2 copy _pdfComposeFontName not + { + 2 index + } + if + (pdf) exch _pdfConcatNames + dup _pdfFontStatus + { dup findfont 5 2 roll pop pop pop true} + { + 4 1 roll + 1 index /CMap pdf_resourcestatus + { + pop pop + true + } + {false} + ifelse + 1 index true exch + { + _pdfCIDFontStatus not + {pop false exit} + if + } + forall + and + { + 1 index 1 index 0 get _pdf_CheckCIDSystemInfo + { + 3 -1 roll pop + 2 index 3 1 roll + composefont true + } + { + pop pop exch pop false + } + ifelse + } + { + _pdfComposeFontName + { + dup _pdfFontStatus + { + exch pop + 1 index exch + findfont definefont true + } + { + pop exch pop + false + } + ifelse + } + { + exch pop + false + } + ifelse + } + ifelse + { true } + { + dup _pdfFontStatus + { dup findfont true } + { pop false } + ifelse + } + ifelse + } + ifelse + } bd + } + { + /_pdfComposeFont + { + _pdfComposeFontName not + { + dup + } + if + dup + _pdfFontStatus + {exch pop dup findfont true} + { + 1 index + dup type /nametype eq + {pop} + {cvn} + ifelse + eq + {pop false} + { + dup _pdfFontStatus + {dup findfont true} + {pop false} + ifelse + } + ifelse + } + ifelse + } bd + } + ifelse + /_pdfStyleDicts 4 dict dup begin + /Adobe-Japan1 4 dict dup begin + Level2? + { + /Serif + /HeiseiMin-W3-83pv-RKSJ-H _pdfFontStatus + {/HeiseiMin-W3} + { + /HeiseiMin-W3 _pdfCIDFontStatus + {/HeiseiMin-W3} + {/Ryumin-Light} + ifelse + } + ifelse + def + /SansSerif + /HeiseiKakuGo-W5-83pv-RKSJ-H _pdfFontStatus + {/HeiseiKakuGo-W5} + { + /HeiseiKakuGo-W5 _pdfCIDFontStatus + {/HeiseiKakuGo-W5} + {/GothicBBB-Medium} + ifelse + } + ifelse + def + /HeiseiMaruGo-W4-83pv-RKSJ-H _pdfFontStatus + {/HeiseiMaruGo-W4} + { + /HeiseiMaruGo-W4 _pdfCIDFontStatus + {/HeiseiMaruGo-W4} + { + /Jun101-Light-RKSJ-H _pdfFontStatus + { /Jun101-Light } + { SansSerif } + ifelse + } + ifelse + } + ifelse + /RoundSansSerif exch def + /Default Serif def + } + { + /Serif /Ryumin-Light def + /SansSerif /GothicBBB-Medium def + { + (fonts/Jun101-Light-83pv-RKSJ-H) status + }stopped + {pop}{ + { pop pop pop pop /Jun101-Light } + { SansSerif } + ifelse + /RoundSansSerif exch def + }ifelse + /Default Serif def + } + ifelse + end + def + /Adobe-Korea1 4 dict dup begin + /Serif /HYSMyeongJo-Medium def + /SansSerif /HYGoThic-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-GB1 4 dict dup begin + /Serif /STSong-Light def + /SansSerif /STHeiti-Regular def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-CNS1 4 dict dup begin + /Serif /MKai-Medium def + /SansSerif /MHei-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + end + def + /TZzero + { + /_wmode xdd + /_styleArr xdd + /_regOrdering xdd + 3 copy + _pdfComposeFont + { + 5 2 roll pop pop pop + } + { + [ + 0 1 _styleArr length 1 sub + { + _styleArr exch get + _pdfStyleDicts _regOrdering 2 copy known + { + get + exch 2 copy known not + { pop /Default } + if + get + } + { + pop pop pop /Unknown + } + ifelse + } + for + ] + exch pop + 2 index 3 1 roll + _pdfComposeFont + {3 -1 roll pop} + { + findfont dup /FontName get exch + } + ifelse + } + ifelse + dup /WMode 2 copy known + { get _wmode ne } + { pop pop _wmode 1 eq} + ifelse + { + exch _wmode _pdfConcatNames + dup _pdfFontStatus + { exch pop dup findfont false} + { exch true } + ifelse + } + { + dup /FontType get 0 ne + } + ifelse + { + dup /FontType get 3 eq _wmode 1 eq and + { + _pdfVerticalRomanT3Font dup length 10 add dict copy + begin + /_basefont exch + dup length 3 add dict + begin + {1 index /FID ne {def}{pop pop} ifelse } + forall + /Encoding Encoding dup length array copy + dup 16#27 /quotesingle put + dup 16#60 /grave put + _regOrdering /Adobe-Japan1 eq + {dup 16#5c /yen put dup 16#a5 /yen put dup 16#b4 /yen put} + if + def + FontName + currentdict + end + definefont + def + /Encoding _basefont /Encoding get def + /_fauxfont true def + } + { + dup length 3 add dict + begin + {1 index /FID ne {def}{pop pop} ifelse } + forall + FontType 0 ne + { + /Encoding Encoding dup length array copy + dup 16#27 /quotesingle put + dup 16#60 /grave put + _regOrdering /Adobe-Japan1 eq + {dup 16#5c /yen put} + if + def + /_fauxfont true def + } if + } ifelse + /WMode _wmode def + dup dup /FontName exch def + currentdict + end + definefont pop + } + { + pop + } + ifelse + /_pdf_FontDirectory 3 1 roll _safeput + } + bd + Level2? + { + /Tf { + _pdf_FontDirectory 2 index 2 copy known + {get exch 3 -1 roll pop} + {pop pop} + ifelse + selectfont + } bd + } + { + /Tf { + _pdf_FontDirectory 2 index 2 copy known + {get exch 3 -1 roll pop} + {pop pop} + ifelse + exch findfont exch + dup type /arraytype eq + {makefont} + {scalefont} + ifelse + setfont + } bd + } + ifelse + /cshow where + { + pop /pdf_cshow /cshow load dd + /pdf_remove2 {pop pop} dd + } + { + /pdf_cshow {exch forall} dd + /pdf_remove2 {} dd + } ifelse + /pdf_xshow + { + /_pdf_na xdd + /_pdf_i 0 dd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 /_pdf_showproc load exec + {_pdf_na _pdf_i get} stopped + { pop pop } + { + _pdf_x _pdf_y moveto + 0 + rmoveto + } + ifelse + _pdf_i 1 add /_pdf_i xdd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + } + exch + pdf_cshow + } bd + /pdf_yshow + { + /_pdf_na xdd + /_pdf_i 0 dd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 /_pdf_showproc load exec + {_pdf_na _pdf_i get} stopped + { pop pop } + { + _pdf_x _pdf_y moveto + 0 exch + rmoveto + } + ifelse + _pdf_i 1 add /_pdf_i xdd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + } + exch + pdf_cshow + } bd + /pdf_xyshow + { + /_pdf_na xdd + /_pdf_i 0 dd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 /_pdf_showproc load exec + {_pdf_na _pdf_i get} stopped + { pop pop } + { + {_pdf_na _pdf_i 1 add get} stopped + { pop pop pop} + { + _pdf_x _pdf_y moveto + rmoveto + } + ifelse + } + ifelse + _pdf_i 2 add /_pdf_i xdd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + } + exch + pdf_cshow + } bd + /pdfl1xs {/_pdf_showproc /show load dd pdf_xshow} bd + /pdfl1ys {/_pdf_showproc /show load dd pdf_yshow} bd + /pdfl1xys {/_pdf_showproc /show load dd pdf_xyshow} bd + Level2? _ColorSep5044? not and + { + /pdfxs {{xshow} stopped {pdfl1xs} if} bd + /pdfys {{yshow} stopped {pdfl1ys} if} bd + /pdfxys {{xyshow} stopped {pdfl1xys} if} bd + } + { + /pdfxs /pdfl1xs load dd + /pdfys /pdfl1ys load dd + /pdfxys /pdfl1xys load dd + } ifelse + /pdf_charpath {false charpath} bd + /pdf_xcharpath {/_pdf_showproc /pdf_charpath load dd pdf_xshow} bd + /pdf_ycharpath {/_pdf_showproc /pdf_charpath load dd pdf_yshow} bd + /pdf_xycharpath {/_pdf_showproc /pdf_charpath load dd pdf_xyshow} bd + /pdf_strokepath + { + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 false charpath + currentpoint S moveto + } bind + exch pdf_cshow + } bd + /pdf_xstrokepath {/_pdf_showproc {pdf_charpath S} dd pdf_xshow} bd + /pdf_ystrokepath {/_pdf_showproc {pdf_charpath S} dd pdf_yshow} bd + /pdf_xystrokepath {/_pdf_showproc {pdf_charpath S} dd pdf_xyshow} bd + Level2? {currentglobal true setglobal} if + /d0/setcharwidth ld + /nND {{/.notdef} repeat} bd + /T3Defs { + /BuildChar + { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec + } + def + /BuildGlyph { + exch begin + GlyphProcs exch get exec + end + } def + /_pdfT3Font true def + } bd + /_pdfBoldRomanWidthProc + { + stringwidth 1 index 0 ne { exch .03 add exch }if setcharwidth + 0 0 + } bd + /_pdfType0WidthProc + { + dup stringwidth 0 0 moveto + 2 index true charpath pathbbox + 0 -1 + 7 index 2 div .88 + setcachedevice2 + pop + 0 0 + } bd + /_pdfType0WMode1WidthProc + { + dup stringwidth + pop 2 div neg -0.88 + 2 copy + moveto + 0 -1 + 5 -1 roll true charpath pathbbox + setcachedevice + } bd + /_pdfBoldBaseFont + 11 dict begin + /FontType 3 def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /Encoding cHexEncoding def + /_setwidthProc /_pdfBoldRomanWidthProc load def + /_bcstr1 1 string def + /BuildChar + { + exch begin + _basefont setfont + _bcstr1 dup 0 4 -1 roll put + dup + _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bd + currentdict + end + def + pdf_has_composefont? + { + /_pdfBoldBaseCIDFont + 11 dict begin + /CIDFontType 1 def + /CIDFontName /_pdfBoldBaseCIDFont def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /_setwidthProc /_pdfType0WidthProc load def + /_bcstr2 2 string def + /BuildGlyph + { + exch begin + _basefont setfont + _bcstr2 1 2 index 256 mod put + _bcstr2 0 3 -1 roll 256 idiv put + _bcstr2 dup _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bd + currentdict + end + def + /_pdfDefineIdentity-H + { + /Identity-H /CMap PDFText /pdf_resourcestatus get exec + { + pop pop + } + { + /CIDInit/ProcSet findresource begin 12 dict begin + begincmap + /CIDSystemInfo + 3 dict begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + currentdict + end + def + /CMapName /Identity-H def + /CMapVersion 1 def + /CMapType 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000> 0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } ifelse + } def + } if + /_pdfVerticalRomanT3Font + 10 dict begin + /FontType 3 def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /_bcstr1 1 string def + /BuildChar + { + exch begin + _basefont setfont + _bcstr1 dup 0 4 -1 roll put + dup + _pdfType0WidthProc + moveto + show + end + }bd + currentdict + end + def + Level2? {setglobal} if + /MakeBoldFont + { + dup /ct_SyntheticBold known + { + dup length 3 add dict begin + CopyFont + /ct_StrokeWidth .03 0 FontMatrix idtransform pop def + /ct_SyntheticBold true def + currentdict + end + definefont + } + { + dup dup length 3 add dict + begin + CopyFont + /PaintType 2 def + /StrokeWidth .03 0 FontMatrix idtransform pop def + /dummybold currentdict + end + definefont + dup /FontType get dup 9 ge exch 11 le and + { + _pdfBoldBaseCIDFont + dup length 3 add dict copy begin + dup /CIDSystemInfo get /CIDSystemInfo exch def + /_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont + /_basefont exch def + /_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont + /_basefonto exch def + currentdict + end + /CIDFont defineresource + } + { + _pdfBoldBaseFont + dup length 3 add dict copy begin + /_basefont exch def + /_basefonto exch def + currentdict + end + definefont + } + ifelse + } + ifelse + } bd + /MakeBold { + 1 index + _pdf_FontDirectory 2 index 2 copy known + {get} + {exch pop} + ifelse + findfont + dup + /FontType get 0 eq + { + dup /WMode known {dup /WMode get 1 eq }{false} ifelse + version length 4 ge + and + {version 0 4 getinterval cvi 2015 ge } + {true} + ifelse + {/_pdfType0WidthProc} + {/_pdfType0WMode1WidthProc} + ifelse + _pdfBoldBaseFont /_setwidthProc 3 -1 roll load put + {MakeBoldFont} Type0CopyFont definefont + } + { + dup /_fauxfont known not 1 index /SubstMaster known not and + { + _pdfBoldBaseFont /_setwidthProc /_pdfBoldRomanWidthProc load put + MakeBoldFont + } + { + 2 index 2 index eq + { exch pop } + { + dup length dict begin + CopyFont + currentdict + end + definefont + } + ifelse + } + ifelse + } + ifelse + pop pop + dup /dummybold ne + {/_pdf_FontDirectory exch dup _safeput } + { pop } + ifelse + }bd + /MakeItalic { + _pdf_FontDirectory exch 2 copy known + {get} + {exch pop} + ifelse + dup findfont + dup /FontInfo 2 copy known + { + get + /ItalicAngle 2 copy known + {get 0 eq } + { pop pop true} + ifelse + } + { pop pop true} + ifelse + { + exch pop + dup /FontType get 0 eq Level2? not and + { dup /FMapType get 6 eq } + { false } + ifelse + { + dup /WMode 2 copy known + { + get 1 eq + { _italMtx_WMode1Type0 } + { _italMtxType0 } + ifelse + } + { pop pop _italMtxType0 } + ifelse + } + { + dup /WMode 2 copy known + { + get 1 eq + { _italMtx_WMode1 } + { _italMtx } + ifelse + } + { pop pop _italMtx } + ifelse + } + ifelse + makefont + dup /FontType get 42 eq Level2? not or + { + dup length dict begin + CopyFont + currentdict + end + } + if + 1 index exch + definefont pop + /_pdf_FontDirectory exch dup _safeput + } + { + pop + 2 copy ne + { + /_pdf_FontDirectory 3 1 roll _safeput + } + { pop pop } + ifelse + } + ifelse + }bd + /MakeBoldItalic { + /dummybold exch + MakeBold + /dummybold + MakeItalic + }bd + Level2? + { + /pdf_CopyDict + {1 index length add dict copy} + def + } + { + /pdf_CopyDict + { + 1 index length add dict + 1 index wcheck + { copy } + { begin + {def} forall + currentdict + end + } + ifelse + } + def + } + ifelse + /pdf_AddEuroGlyphProc + { + currentdict /CharStrings known + { + CharStrings /Euro known not + { + dup + /CharStrings + CharStrings 1 pdf_CopyDict + begin + /Euro pdf_EuroProcSet 4 -1 roll get def + currentdict + end + def + /pdf_PSBuildGlyph /pdf_PSBuildGlyph load def + /pdf_PathOps /pdf_PathOps load def + /Symbol eq + { + /Encoding Encoding dup length array copy + dup 160 /Euro put def + } + if + } + { pop + } + ifelse + } + { pop + } + ifelse + } + def + Level2? {currentglobal true setglobal} if + /pdf_PathOps 4 dict dup begin + /m {moveto} def + /l {lineto} def + /c {curveto} def + /cp {closepath} def + end + def + /pdf_PSBuildGlyph + { + gsave + 8 -1 roll pop + 7 1 roll + currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse + dup 9 1 roll + { + currentdict /StrokeWidth 2 copy known + { + get 2 div + 5 1 roll + 4 -1 roll 4 index sub + 4 1 roll + 3 -1 roll 4 index sub + 3 1 roll + exch 4 index add exch + 4 index add + 5 -1 roll pop + } + { + pop pop + } + ifelse + } + if + setcachedevice + pdf_PathOps begin + exec + end + { + currentdict /StrokeWidth 2 copy known + { get } + { pop pop 0 } + ifelse + setlinewidth stroke + } + { + fill + } + ifelse + grestore + } def + /pdf_EuroProcSet 13 dict def + pdf_EuroProcSet + begin + /Courier-Bold + { + 600 0 6 -12 585 612 + { + 385 274 m + 180 274 l + 179 283 179 293 179 303 c + 179 310 179 316 180 323 c + 398 323 l + 423 404 l + 197 404 l + 219 477 273 520 357 520 c + 409 520 466 490 487 454 c + 487 389 l + 579 389 l + 579 612 l + 487 612 l + 487 560 l + 449 595 394 612 349 612 c + 222 612 130 529 98 404 c + 31 404 l + 6 323 l + 86 323 l + 86 304 l + 86 294 86 284 87 274 c + 31 274 l + 6 193 l + 99 193 l + 129 77 211 -12 359 -12 c + 398 -12 509 8 585 77 c + 529 145 l + 497 123 436 80 356 80 c + 285 80 227 122 198 193 c + 360 193 l + cp + 600 0 m + } + pdf_PSBuildGlyph + } def + /Courier-BoldOblique /Courier-Bold load def + /Courier + { + 600 0 17 -12 578 584 + { + 17 204 m + 97 204 l + 126 81 214 -12 361 -12 c + 440 -12 517 17 578 62 c + 554 109 l + 501 70 434 43 366 43 c + 266 43 184 101 154 204 c + 380 204 l + 400 259 l + 144 259 l + 144 270 143 281 143 292 c + 143 299 143 307 144 314 c + 418 314 l + 438 369 l + 153 369 l + 177 464 249 529 345 529 c + 415 529 484 503 522 463 c + 522 391 l + 576 391 l + 576 584 l + 522 584 l + 522 531 l + 473 566 420 584 348 584 c + 216 584 122 490 95 369 c + 37 369 l + 17 314 l + 87 314 l + 87 297 l + 87 284 88 272 89 259 c + 37 259 l + cp + 600 0 m + } + pdf_PSBuildGlyph + } def + /Courier-Oblique /Courier load def + /Helvetica + { + 556 0 24 -19 541 703 + { + 541 628 m + 510 669 442 703 354 703 c + 201 703 117 607 101 444 c + 50 444 l + 25 372 l + 97 372 l + 97 301 l + 49 301 l + 24 229 l + 103 229 l + 124 67 209 -19 350 -19 c + 435 -19 501 25 509 32 c + 509 131 l + 492 105 417 60 343 60 c + 267 60 204 127 197 229 c + 406 229 l + 430 301 l + 191 301 l + 191 372 l + 455 372 l + 479 444 l + 194 444 l + 201 531 245 624 348 624 c + 433 624 484 583 509 534 c + cp + 556 0 m + } + pdf_PSBuildGlyph + } def + /Helvetica-Oblique /Helvetica load def + /Helvetica-Bold + { + 556 0 12 -19 563 710 + { + 563 621 m + 537 659 463 710 363 710 c + 216 710 125 620 101 462 c + 51 462 l + 12 367 l + 92 367 l + 92 346 l + 92 337 93 328 93 319 c + 52 319 l + 12 224 l + 102 224 l + 131 58 228 -19 363 -19 c + 417 -19 471 -12 517 18 c + 517 146 l + 481 115 426 93 363 93 c + 283 93 254 166 246 224 c + 398 224 l + 438 319 l + 236 319 l + 236 367 l + 457 367 l + 497 462 l + 244 462 l + 259 552 298 598 363 598 c + 425 598 464 570 486 547 c + 507 526 513 517 517 509 c + cp + 556 0 m + } + pdf_PSBuildGlyph + } def + /Helvetica-BoldOblique /Helvetica-Bold load def + /Symbol + { + 750 0 20 -12 714 685 + { + 714 581 m + 650 645 560 685 465 685 c + 304 685 165 580 128 432 c + 50 432 l + 20 369 l + 116 369 l + 115 356 115 347 115 337 c + 115 328 115 319 116 306 c + 50 306 l + 20 243 l + 128 243 l + 165 97 300 -12 465 -12 c + 560 -12 635 25 685 65 c + 685 155 l + 633 91 551 51 465 51 c + 340 51 238 131 199 243 c + 555 243 l + 585 306 l + 184 306 l + 183 317 182 326 182 336 c + 182 346 183 356 184 369 c + 614 369 l 644 432 l + 199 432 l + 233 540 340 622 465 622 c + 555 622 636 580 685 520 c + cp + 750 0 m + } + pdf_PSBuildGlyph + } def + /Times-Bold + { + 500 0 16 -14 478 700 + { + 367 308 m + 224 308 l + 224 368 l + 375 368 l + 380 414 l + 225 414 l + 230 589 257 653 315 653 c + 402 653 431 521 444 457 c + 473 457 l + 473 698 l + 444 697 l + 441 679 437 662 418 662 c + 393 662 365 700 310 700 c + 211 700 97 597 73 414 c + 21 414 l + 16 368 l + 69 368 l + 69 359 68 350 68 341 c + 68 330 68 319 69 308 c + 21 308 l + 16 262 l + 73 262 l + 91 119 161 -14 301 -14 c + 380 -14 443 50 478 116 c + 448 136 l + 415 84 382 40 323 40 c + 262 40 231 77 225 262 c + 362 262 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + /Times-BoldItalic + { + 500 0 9 -20 542 686 + { + 542 686 m + 518 686 l + 513 673 507 660 495 660 c + 475 660 457 683 384 683 c + 285 683 170 584 122 430 c + 58 430 l + 34 369 l + 105 369 l + 101 354 92 328 90 312 c + 34 312 l + 9 251 l + 86 251 l + 85 238 84 223 84 207 c + 84 112 117 -14 272 -14 c + 326 -14 349 9 381 9 c + 393 9 393 -10 394 -20 c + 420 -20 l + 461 148 l + 429 148 l + 416 109 362 15 292 15 c + 227 15 197 55 197 128 c + 197 162 204 203 216 251 c + 378 251 l + 402 312 l + 227 312 l + 229 325 236 356 241 369 c + 425 369 l + 450 430 l + 255 430 l + 257 435 264 458 274 488 c + 298 561 337 654 394 654 c + 437 654 484 621 484 530 c + 484 516 l + 516 516 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + /Times-Italic + { + 500 0 23 -10 595 692 + { + 399 317 m + 196 317 l + 199 340 203 363 209 386 c + 429 386 l + 444 424 l + 219 424 l + 246 514 307 648 418 648 c + 448 648 471 638 492 616 c + 529 576 524 529 527 479 c + 549 475 l + 595 687 l + 570 687 l + 562 674 558 664 542 664 c + 518 664 474 692 423 692 c + 275 692 162 551 116 424 c + 67 424 l + 53 386 l + 104 386 l + 98 363 93 340 90 317 c + 37 317 l + 23 279 l + 86 279 l + 85 266 85 253 85 240 c + 85 118 137 -10 277 -10 c + 370 -10 436 58 488 128 c + 466 149 l + 424 101 375 48 307 48 c + 212 48 190 160 190 234 c + 190 249 191 264 192 279 c + 384 279 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + /Times-Roman + { + 500 0 10 -12 484 692 + { + 347 298 m + 171 298 l + 170 310 170 322 170 335 c + 170 362 l + 362 362 l + 374 403 l + 172 403 l + 184 580 244 642 308 642 c + 380 642 434 574 457 457 c + 481 462 l + 474 691 l + 449 691 l + 433 670 429 657 410 657 c + 394 657 360 692 299 692 c + 204 692 94 604 73 403 c + 22 403 l + 10 362 l + 70 362 l + 69 352 69 341 69 330 c + 69 319 69 308 70 298 c + 22 298 l + 10 257 l + 73 257 l + 97 57 216 -12 295 -12 c + 364 -12 427 25 484 123 c + 458 142 l + 425 101 384 37 316 37 c + 256 37 189 84 173 257 c + 335 257 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + end + Level2? {setglobal} if + currentdict readonly pop end + %%EndResource + PDFText begin + [userdict /pdf_svglb currentglobal put true setglobal + 39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis + /Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute + /egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde + /oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex + /udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls + /registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash + /.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef + /.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash + /questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef + /guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe + /endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide + /.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright + /fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand + /Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex + /Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex + /Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla + /hungarumlaut/ogonek/caron + 0 TE + [1/dotlessi/caron 39/quotesingle 96/grave + 127/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis + /dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE + /bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft + /quotedblright/bullet/endash/emdash/tilde/trademark/scaron + /guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling + /currency/yen/brokenbar/section/dieresis/copyright/ordfeminine + /guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus + /twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla + /onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters + /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash + /Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave + /aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute + /ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde + /ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute + /ucircumflex/udieresis/yacute/thorn/ydieresis + 1 TE + end + + userdict /pdf_svglb get setglobal + currentdict readonly pop + end end + /currentpacking where {pop setpacking}if + PDFVars/DocInitAll{[PDF PDFText]{/docinitialize get exec}forall }put + PDFVars/InitAll{[PDF PDFText]{/initialize get exec}forall initgs}put + PDFVars/TermAll{[PDFText PDF]{/terminate get exec}forall}put + PDFVars begin PDF begin + PDFVars/DocInitAll get exec PDFVars/InitAll get exec + PDFVars/TermAll get exec end end + + %%EndSetup + %%Page: 1 1 + %%BeginPageSetup + userdict /pgsave save put + PDFVars begin PDF begin PDFVars/InitAll get exec + userdict begin + userdict /pdf_svglb currentglobal put true setglobal + %%BeginResource: font Arial-BoldMT + ct_CffDict begin + %!FontType1 + 16 dict begin + /FontInfo 15 dict dup begin + /Notice (Copyright (c) 1991, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Arial is a trademark of The Monotype Corporation. registered in the US Patent and Trademark Office and elsewhere.) def + /version (001.001) def + /FullName (Arial MT Bold) def + /FamilyName (Arial MT) def + /Weight (Bold) def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def + end def + /FontName /Arial-BoldMT def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 0 /.notdef put + def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0 ] def + /FontBBox { -167 -250 1006 939 } def + /XUID [6 44341 ] def + /StrokeWidth 0 def + currentdict end + currentfile eexec A0B00ED5187D9C0F1ECDF51878C3AA5CAA3FFCA5020F48 + 69FCFE28B419AB05B54FAF364D68E82805BE1C1765A19BEC4D29A426539E9449 + 5BE860D6EEF29ED037F1F407E7FE48577F0B69E118A7C8737034DBBD04699FA2 + 80A7C6E922784295ED8C74A3C79BEB5BC6F95B767A170D04BD8041F7BDA3426A + 0B38EEBC414A4A52B6E26531115CF035146099BDF3B8A00193EF9C63D5056C56 + 27F34FF02A444A05338ECAEBA23251AC7E7B67DA94C2F71DFB3E6EBBF2B8CD64 + C128D630515F608E6436F23A665C100FEB078798141BB5533A2BE422590BB1C5 + 6D0F257E7C6438DB38F18E581BEDF1D3810B75C017FCEA8F9EAF3B486651B632 + F2D1D16279E221FE73375419D0A086839CFAAECC1618C4E60207E167DD9AEDDC + 37E07006BA902F4A4531AE919B9048413BE1EF9D321A92DD52A1B9B85D11116C + 5DEDF1C2112BD4E7BD1754F72123471DF2FA90FE00256B54B0D7DB81E1035390 + 4317D65A1B999795B9214ADD5CB2BD50C71B0C1C65DD95F7420FF93451281A99 + B3403CD0905E899046B1D4EEC1339434B286D808782ED4CC6D04AE1C92F14D32 + 73DD3E4C697AF30E029C876DC06033C5A55623074B84A6E5244237ADF6B563B4 + EE13D3EFCE21281E3F54526F5F1E4A5BC6CBD568A3D82E17B552176D7D0FC581 + 20F2549FB6A55AE982185B67D6962DBB1ECB64F77A2FBF7D597479E05AD8B833 + 7B2A2747961C244F8D47CE7372A440D2FA986D2EB57A64721615F6BFCCA1F0BF + 2EDAD01479994BB51DC4EB7C590A90EE81A1F3E477D760E7C886EF03BF55124C + 0A00F228D50F4F869ED28BF35C094F39087571769F759BE1EE3598DD5B58C9D8 + F85B744EF72FE601843D977E137AFCEF4E4E212035638E3E598B0EF2AE58E876 + 6440B3C60438D7A0EC054648CD04EB0A8E9A793E4F7FC322525C8AE24C726691 + 2A880F47C52FFC40B3974DF4D22C8B2BFC3ED011DD9B3FD11DEEAB8E04ACA611 + 2723B29E0D04F63BDD5B0836CA33BAD1310235EE9F1D69A5202F4CD581B8F66D + F5C9C045D628F0899B7E4188D2B262C1623403446E40C8CA3163884FDBA560D8 + A5449EDF3D6C52D1CAB8CBC763E39BAA68DDD188E021AB803EE3A6EE2EED2DD3 + 3E16D7B4A6AB33E849F894DDEC6CEFF007273F6693A44103C76BFDF0BFE9C415 + A3E69746FB35A20E885252D78F90692D0C7101FDE9E9EBB2953CD34F4D771E35 + A692E77C2B9045619A2BC3C2C058FA85589E32A5F4FEDFC98E4FD378AE32CB89 + 1A232210A3DA6F1266BA3BC55D748A864207064F4161EF8BDFBD9CCCBBCC1290 + FA3551CB543E7F74A8D7889B0A88EA23AD4B2787D084813663A144F34D0870B8 + 6FE2842D825DA8A6B33F9F886E82D3D4F39098AD8F9452474D3375FC9EC1255D + 017F13417A5EC4C91E2CB3796EB6D06F8499CA959785EEB01882D86D1A4AD689 + D802AF92E181B6276C0F267BAB4EBCDBC9CD978D93346EDCA8D28EA961C02347 + A9D9D531C73FEB745BA8BC37B94624E1E706D82B38CF26F434C596C821F445CD + A2CEDC3B10C63CC9CD2D506BCBE24C3E54B6E062298F094F6F2259271A2D8761 + FC07930CC62082493640A41C7C10BE1C659753638AB0F2FC3D2C22B355BA186B + 93B8EAF547557DAB8EEE8AF3B86BE3651D7B1455334062D7E20402F2AAEE9BFB + 6080A9AABD2611E581B25AEFEB596B08ED24ABC715FAF69863088C659A4C8E1C + 996B38C78BAE579AE0D181AE39B4C9C18A3B9278A1FD02EA8302C833376FC171 + BF9EAC985AAC026D472ED294051FE7C805714A13DB53938EB2501653B0404352 + CE6118F10D5F8A49D69BA3EE59FDF7F7B1ED07C1236A606C5B4D41321762E046 + 8019D9C64084A4C3DD4AEA4EB00D34EA00C643072CF5E44EA325EF80A9EEFD8F + 2C3C7E74EDE6A9AA0C191A2599B16FB09BF5EC8C9A2B1F17F6A1D8B598E311F7 + 4D2E047E053FC5F86E2D1FB64E78770DFC12F37985CAA063509B80A0269DB7F4 + 8D9B1DA6D24C3D27669B115EBE4CAF75EA2586724A9C1649F5C9F8D77776C904 + B52548DB3482119439BD2E3FBFFD4D1C602171437A57A3675658F8A346883EC2 + 0596DB9BB3B0F76AF1EC6A7BEEC44B39B76F24E427B15881D06F1DE0A499FF69 + 5D2C8B60A0CF57473F8607559DBCDA5D7C1544649F4F67C963EFFFE39F1D5471 + 7F303E886C54EA23DF62A172B5E75B1EDB98FC4ABB897E5E1DDCC5305BFF4E9F + C9BB5EFFC6F970A9D604231519A522606B3C9AA2AB17E6474EADA0B494A5439D + 0BD84093110E243CFFF77B68E57E70C5662BC7264D6CF6CF1DBB65712A311E8C + 2FDD3082AB7117A9802F46E8E6585673021AC210E8E821B7E5B8E63A6B68D78D + BE14692778BA472948C3DD2312BE3656382DB847E12F945DD6559FC8472F7466 + B28DCF25F249F0AC849871950B631A72606B8A3974FC27C9056F8BB8C88FBE36 + 4CE0E64AB23F1D8C10A435302124A6577FC6F4D13FA5B65F4C428FB9410EB583 + D62B2562654F1262209B130E7D779BBF67DED0874158CEE3EC414E6AF78EA5B0 + 51CF785BD7DF00AD450565245090EC55D5F03B0181413E02C73E851263AA425A + 1834E1E854BD004F1FC7E9C1E171D97129BCD9568F86AD51727BE077BF6AE2F1 + 672DE2CE46411C7D22B19078DBEFC082A73C979905E01133CD633CA92595C6B0 + DB688BB2DD5C8917D3BBCA94A994B84223AB4414B7B9CF19BDDD78FD215508EF + 4C1B52575493FFC1B0C00EDB5EA0719AB94DE49B507AE15BC0244B2A47474E6B + E5B846D3315425257B10868588EE49AE2E2A52EBDA205612E31EE015A95F9BDA + 494D5648F762997DAF12A512B3C43DF42729C0D21EA513151BA5DBE93F2A15CA + FFE20D77D30498782CA383EF952FF7B5EB19A2F0C5971D98CACDD7D8035D527E + 253BA55C2ABDC8E1778D882BC84E777A3B6051FF167FECA275B062BC67BAACC1 + 118AF58B082E8E4BC6FC7A80913A55C547D1DBBE57CB153A879D8BC02E2632F7 + 2061F11B252EEEC0B65853BFD0E6285439EA5A8A35B6C7E21A39ECACB39D0DC5 + 1D84FCAB4526021F9865D2EF3A1E4869F19D2966684339CB5A40D7D73C392DE6 + 29ADDF581649B180EFC6929ADA1958BD0AC8B17C88E364D9B908953FE60348C0 + 4015C80A4222D9CB14E4D51FEDABD792EAB645CDF7CA65674327DD1987A89F86 + 0B57095EE175B0F8B7EBA84D867FCA3DFEAEF38FE2769CE6751D17418D0368EA + 3327817A4CAF67D9F2AB7DA404E69C7FB35BC7BE7C1B429F64F687D4797CD398 + 311D643B8C7E30D5EF3EAB2A990F4385C3B0AD5C44F34FA306CBF0E52E7CF164 + 20FBD608DF9D2208029399E85EF137725748F95868AA280C6CA2D726687EFF7E + 1C26AA1D8A08D87BBAA3D222CFB9102DF9990841CCCBF7D717813FC43099FAA6 + CF3A7FFF2BE6A869BDF92D8FEE4A89D16C9BD3ABEAA6E07B13CE597F12C95732 + BB14C9A9A4902F27870FDBD4CF70EB37DB47C130564C18CB0A87AA09F7C5E045 + FC0D0B8B7EDD1C3F6F0D4EC46831B1B0D1CAB2C6E0EAF49B59654F5BDEBA31E7 + 4E35397A004996A281A44C802E1305E21C7EC9CF0F3E82BE805AFD4EC2F9FABD + E555A9EC58657D62E65A3A6AA610D87B89474EA2C0ABEB919B534D1F7177273B + BD0DBEBCE083BF67EAF2140F12FA6E48D8AB8ED2A874C821F66EB27DFF953865 + B4148AC5B3540D6E0B5D8D42850DC20486AC50907007C82CFCAE6C85E6DEBFAE + 3B00861F75BC5D6F28412851C658EA9CB9015A9D8AECF427FF575BEC703FC583 + 8525D86F7DA7FDA35C03DFED51BD629C5CE1F90A79B9E404BF94FEB843D5A564 + A100624431DC55E2B7DA8D04C84F7278C4F55AE63B44714861FA24E7B9B359EB + 1879A9F3000A005918ACDFC0A8AC38997EDB24CA4DCFCF3019DF0F5558D95743 + DFDEEB434C525765431A987AEA620CD5FB939B49D9BAC76D62BFDE83DF981673 + 674DA67BCFFB68DBAAB3889F3EEC8D7CED342A27991473410AF46F55D950111E + 87FDE431201DC5077C2B7480B1F5CE0ED2E60AC63C22A5578C193931532B7820 + E997333B8B6DF8ADC96C59C63164AD4911137BA379C92FF8905B40D6E8B22569 + 6576BD0C42E3A7934BF67D11962B5962CA91232FB61CA3EA105A7F8BB6EBF604 + 7CED87B27D056BFCA557B3D1213C1A807C0EC9D25A863EF4BC569F6467D837A5 + E72EAC1BD6649D6E55B992F1282406631264D040EA8FA1A76DB77D5516557C74 + D774F2704248B41143F81A0757ED477E1E693604F761BBC6A0A47D6C5E1BA8EF + 59BB3C4D6FC027490138F792DFFED59B1D8ACC964F845BAE1106728DBC1776A1 + 89C2BE31C01BABA8EFC45B6E6CAD399638EFABF0D4B45052ADE173859AE3D6E6 + 9E85BE3DAE09458781FC9C871C856C9E3B8C581318F700E27475E93A77D00025 + AF26B9AE72B81122A56A57C8459DF38926ED208F8FDC4443BFF2BD2E8D589873 + A947BE6AE8D501516D0A586EF0C39D13822325AF939C39B1D17CC2286FB8FA82 + E045C283380D9D627AAD6B4D4AB800EF9BBC3AEE1398E0571B372B14F1EA15C7 + 9148AA2DA402A72354D6C20093CC4EF4126C27727E0D5902665801E1D050B28F + 862A060841D463C69F64C60B1B169354CF07B1483ACAB968AD6ADDF317F9ACE3 + 85A274A39B3466B667689F16F50FBCCE75BB8EA6666CC69F4E460D17CEB7AE5C + CE3DAA9FE2110CD355E02CAE06074F99DA950DFA65B536ABA9F1B852C4A2D961 + 1A2564220ADA708E670541D32393F1071BC876281A33E5C9673E61EADD8B1680 + F5E69E1351D9683B58C053909B02BA394243315350875B209F56DF54F4DE83AA + 3E8F7CC4BA8FD8280FD516EFAAAA2881DD9514F644B6E893207BD4026FFE2252 + AF806254492FA55CE7D09F1B66243A72462B03D54350E6A55BC6F12EDE24149A + 18C6A45788C3BD3858E084155E4A15EEE56F48E6B019D2EB2D400B9117946949 + 4CD70B9703B3CC04772447AD2B968B49A8F9B07A0EB1199D78283FC914982841 + 36965AB09BE1E5CB7C7974667543AD854827B7333FC458D680A06C491CCD9E39 + D1E745BA3577A7CEF63A909C04CD9DE56AB57DA35B9AE97284516ADDDE7B59A5 + B5B55B5F7E49BA648900A7D511D3E7AC47693FE4DE21EB0FA6EF3AA35B980C22 + BE7BB24D6D31BC9E9376E7801F6946B41DC629FF341172174997D9D8111EA72C + AF09A38923DF201A2A2851EC341AE8DE43AD52DF3001FF15AA6BFF95F2A84DF6 + B521241BBB9D6010D09023312B54ACE4A0FCFDA9D8D21255A249A150C9E0A7D1 + AD894B82F9798E5CB072BCBBDFC5B79086BBC1B91E5C610DEA0F32A3F7F7317F + 9E4BC64042C41113D9ABF187120A734CE563426B8E7AAECAF43F5228D026E5B1 + 28DC8B6BC21264992D92F0AAF93018880FDDFDAAF7874A06B7D6412B9AF3BF1A + 6E58EF8E5C4283DD70BC40D0F0007E362424D629D9E1D877CA534E040A470071 + 7285DAE114C95D0A7ECFA95CFC79A5CA35FD190906C2CA17AF02E07FD68958BA + E33ACFFDC2478E099386AF4F2ADD465B25530A62E959FAD1AAB96A6C69420021 + 63B4EF8EB833C61701FC8A5DE37EEC42A1E574333ECC4DEFF71AE771B8344CD3 + F19A4A10A9984260622D770087E6F2FD5714E2F620079BCFCD6C1A9F5DE21D20 + AC45FC8C37A4DE50F88BCCE8569948E82B4CF6420CFBA7FDF1D95BD59A89845E + AAAC3C4CADAC48AB3ED5D37A6466CB1AC31C3C7182D421EA4CD7C2FE6D934098 + B87F457A4F498352E9BA688DB0B06857BA2ACCAEBB85CC2FD71B6103BA00AD14 + 55FF2FD9F53FACCF869337A7F2AB7B484F247160C6753DBFE587A1EB383B7C43 + 5860D8C3702B44711794C8559C1B8B97EB73B5FABDAD1FACDDC79BE1EA48F39C + 6D1799FFD4CF7971B97A8222CDF027C7FD8F7B4ED8B474713FAE4529F87000B5 + BCF5CA520D1450ECF367865D15856F4D127D8D98AEC55D464B96288068C0EE44 + 918E7F7909FCE4100CA06C24326380EEB0F4EEEAD49CE2C72FE93FB7ED764CE0 + 015039ED26935497A15583F6F0463A6CEC9323AFEB6D1722078FE036D56DE441 + 8FF5D396F9C98E41838DF1846F7D02D75A1376AD7F88C843A5D0B0233461719B + 2C0C271E42CD5FF6A799F516E8906F109E707BEE6D71581FC76D349ACB242D0D + 5CD9FD6EF5ADB121F904848F3184A3C2CC0DECE579D3438D4CD7B173FC4FDFBD + FD604FD61421E039908475DA6BDB61AEACDA9C225119301A5CE0F5F783F9F1EF + E58882E7565C93AAE411CAE92BB2AFA127D45BD7F477480148CAED36B30F14DC + 7A69B3B88F13047DD20EA481A13EF25AA98F66FE6F10AEA03DF80A1FA34A9D04 + 7E1CA9E37DDC0AC18978E8BCFF43DD81D0122A707C949C7ECA3EF598438B5679 + 915CFE2A9576E66981B91F637E666809E90895DC06CC543DE2C3380A4ED2D05A + 821DA469044EFC5F12C1CFD5037903675A703ACF2C1B49029A63D2A0B43D044D + 584FE44866A328545370001670165FAA76C57B97035432AF3536F892D93E30AE + 6495E4A6AE9E1C16ED2F5AB3F2BF81DB48D70DFEF38F1DA3A468208C21572491 + FCC4D92E17DFD95F365FE8D9D2D25B9C997E72DFCD2EF4B302ED428A9645298F + E20BB0EA75C189FB2E3E7A8E463FAF92AD214CC9263001F27758770CDAF007C8 + BCC9A085320B1F88AF02A88F9FD0120DF5C4104C2049304E360A22781CC2C27E + 9B661C7345BC1E61C451AC4285DEF04B0CFD137588BC0411F60F51F1254BC78E + C599E5A5B937261AE3B612B8C2FD49DAA029DB24B3DFC510D708D97EF0AD2473 + 27BFEF55BC3D6EE029014B3F88DE0E285B9378DD28CC2A8CA33BAB3E94EEDD69 + D95309FBC1DD6CB786D5FA277531679E33F8347876997B80F8B76594D1607F30 + 572EF1FF3361091EDAC28619803293FC40080F32B1DF166483FE6D81C94FB8BE + BA913D97C251909437780F2B403E33B0DA48497552FCF7BE786BFE9D2CCD5C24 + F54A0D3865C70C07C999E5FA0B822B916966A68310F5C692662746B2EE862BF0 + 5AF5F5EF1B1B6F741AAA581E9E1EF2916F1407B89C8E8C33BB5F48609E881761 + 5F5600E7013043B5DC141B951D6FAEF604849E3964C13BFE016A704791911276 + B0CCAF564B5CC6023A3334E69A02CA7BA64328B8F81C4C3FBCD779C763AA60EF + 6419FD6C0E416F5CE6A32096B737754F7DE6761CE028AD97CFDE2D16596CA20D + 5DE765F602758E4E635AC388CDB54E7E82D9516F2F8BD5059353F1A3BF030FBC + BCB1F18E76E9392B9340C2422C8DA7717F4EBE7112FD5BA7DD641C99DD65D6C8 + 27C715B9433A54873B2FBAFCDFD786699E24A7E7DE78BF4286D5B143A296DFD8 + F8619E732B7152DCD00441D192CE08167C53A3E70745C3BDDC3F5C692A001D02 + F2E36ECB32939D61C7ADE4FE924F1F8DB67D08BCF492D2421FEE4C6687E5AC26 + BF8A06A5CF79C5A5A627A14189110DB91E01A4F2D3D92F187918A6967713FBDE + 75022B551F8B999AD41A1F0F7FCF7C2E41F263B414CE924A7E88A47420E6911A + 27C971F333BFB47D7306BF74B44389F54BF9E51BE849F70DA288D16F7D091CA8 + 10DDB815056B0F8AB66D45E58B1779CB79223D32475901C122A4E7067B8E54B9 + 5A064CCB7808086CC0C8B7ACC66CEF056F3B4231E62D8D3A7C58929C3B25C40B + 427ACF3DE83F50D3C23236124642AA17C9299364BE276D3F2D58459A1E58B8C8 + 7EAB08390A461317C33B41881B46089FE5A4ADFB24B052877CD2998C631B8B7C + 3AE7C239DF03BF51E93A3ECA6AFA98DA43E981700240CBF7F96B0F8BF9B03FE4 + 54D3F7DAED9AD3992EDEF92F1ABB7261312DD935B4C625118B544B2DC234EF5B + 084799116232B24042D53A82FB4E1387936D290A8B9B150C12BC5529C8373203 + D4A6F1B88A2A0D7B6497099B9F63D44AB78B79420D165937DD644B688F9066B1 + D2F5D024FA7F1E082B9C9A90CA1C9E296944FF0270E23F7BC52D9FF158A03FF9 + 03A3D44A8919E8DB14BF1A3BD54895AF449DF8FD361443B7FAA9A11A89BEA2E6 + E99DA8C620B7AC082CEAB7ABD1C2FCB792BC1CF8BB98393367AD4939D59465D3 + B140413246EF6B5505E9843696B125DAB1E0D9E8DD23DB8DF4DCE3CB0B256775 + 45CC73D17E88E7B3A6C42986CE55C0722CAEB188B5E476A95112B4FC9B6BB35F + 8E56D5AE441CFB03288A291B9A5A56F78A4226FBF2B466575DEBCA6B7AA6210A + C23A3AD2DD7714D4A5995AD41AA3B5A6BECE076034C1991C8BFFBDEC29ECAD37 + F09086AF0811A92A60CC8E5EE2984301B5C7ECEBE3EBACE33059468311BBA691 + F8F4BA8CEDEFC000E020ED302DA02E2B46D9527E12374C8C710095C21C82D221 + 3059C20A1A6028D9426EA6CFEBD90DFF04FE8F942E68FFF01DE50B16234BAC4F + 2AFC733E1C844FC0FC37E8E92309D1EE60EEB16B13CFE61D21302021C8301BAD + 2D30BA2DF2BCE16453A98FF3D1D42A84CE81A5EA371EF62CCF054D086C5D672F + 93694B89DF5EBA809BFD56E492EEEF6DDD784EA205098828AA904773A19C2E22 + 26D660F6810969C3A142E9313B4F8325AE00845C048F5A68A682B4DAB655AD8C + 03F118107FB88E5D4BA332568003FBFF144D4EFD2142ECEC29F035F6BB37F240 + E2A323387BFB791D0F953F26B89CBA5C86D969D88C34F7C961540FE3B5D87E2E + 680CDE28EFB7C31ECB32817E6E7376101673B373D11BC381527158ABCAAB1235 + 7302EA2713C2AB89B7985E8685F4EF1074CA31D19E4F7AFF01CEB5657C790EA1 + 1595BB85EC158BBB0B52F01E2E68533B6C51DB791A41BE54E1E5002B0A8A7B16 + 483736867BF9295D6F5B1C067CA82BA1D5765DD8F2441780C82F83B12C2B12AC + AC5CABC89F17BD100299E9DDA79F0172F15783FF9433095FD3AEF9921AF4B290 + AD5EF82C25D606F8E1C57440B4786D662F61CCCFCD47129B64304543279F4ED8 + C623724788CB12FD9E8E1F11A16DCC2133544F0E4FD1061D3D39B4D1566B3490 + 21DFF979CB2A08A75B65E37685CEA98C02C3560F72AA308CD76C35E1E9516F3F + 91415E9C6D123E5DF16BAD3A9FA6082106925AEE211DF828574D627B4BBC8B20 + 6943F2C13DF109A7D23F3F181F80C63666A25310FD3BBCC792CE84B9E8BBBA0B + 67335016D177930B85A4356ED5EA80E154C5B255B69DFC91F5984EF1749A0057 + 93B1C7645BB87CA694178065B77143C701213746B83450F8F6AC91A0CA5A0B5E + C4D0CD25F518A674343ABCE8013135189C3F07DB93918F23D168A7704004D73A + 738395C255640C7AB99E0E184B4B4917F2FED7844F70082C9D202EF7544BCB1A + E841F633B999C3FCEF7B4FEFF1D5398C883BA8CA43CB4681DFB11CEA1C31D97C + 7C6184076CB38E076A5D4DC22AD1B84534A66C7E7BE7F2A0B7445FB2AC022E98 + 34F7854C98BC80CD937778FA01AADD72A8102E63A41E837BDB9CFAC77EB63F24 + BF2D7CECA59709A4AE2EB5D30CD2EA860DC28B288F01E2B71926DF89A7AFBA3C + DA19B30617CD594F1DBA57892A1D993FD9E63884D08FE488409FA3511E4E9749 + C1F2BE3590B6589B3B9B3E1159DC8D9BA97EDAE65FF0A0435654A61CAC628F1A + FF8B3794A013DA5D82B8520117A7412D4143FF9037E6BBA1191DA45C4542A5D8 + 881C313D13C377E636C814210F6D97124BC5BCDD13670191D7B43E03AF553AD7 + CA125308AC66E3687325EE5D5C9C11E4042B3B4CB43D8F635302CCBF7407AF0E + 9C87BCAF146A7AF48A2CE534ACD3119D04351E59B64594FCFAB7C76417215F37 + AFD22CCA4C0F4A98644366F86C9CF618531ED747C95AD237C516CE8FEFCE381C + 0E3A3D0B439C070BD0555B1415DF13DDADD6C836E1472EB1C1118FEDA9C1C583 + E06769BC993201AB1E132E13D0FB98E9621078AD082F63CE00C12F4B18AE585E + 454805896CDADF5492180BCB7E38DEC944C42A4DCA5C5D5FA69277E40166269C + D60335391712FED3F5D772742BD1BFF1FAA95F398750E4EC9A8DB9FEAFC74726 + 0B13D09B90D2424207903C456557BD6AEC9D89A08BF58FB60A18702D7CC2DFCE + 1ECFF113A68B68E7358A8F31AFAA04BA99488FCA4A8231929C710125D6DD1F3F + 44F504CF999EBF7D57FFFF39587FA052A5A084272A53EAB0B2F859BF91F65ACD + 9C748EEEB2235038F774669EB80DFC8D59B1696A99CC84FF07EBE52DD234D7FA + D04F431B2F97D8C446278A899E4F9C012AA31A95CF993F1980BBED045049E316 + 7EAD37C04CF86D3F12D0936944761CC01EE16E9B3018C715AE7C6701AA7F8150 + A86F293EF30EE68FD175E099CDA37DADAD32C0B97D173F49C5C9FD5D46187BC7 + 64D8BE8FC92A289203CAE007960EA02C61122191A89990484F74AD3A883CB135 + DE3A7F9093DC8AF2C8B4EF83CA995064BD13CE56995E56F645A1B9CEC7F93795 + 31B0F846359EF21BD8D20EEBED699890697CE3802978C80A5720E58A9D72AA7A + 6D283B3ADC5C5CD4F682E8BF13469BE319A802B17F65E5195038C990BB8D0B9E + 2BAFC8A2E1A5F477F2D5B9D187FDFFEF8E75249EC8D688B8A6FB40D2D0FDFAC3 + B937ABE9817CB4E611F8A128EB09FDD0D8584391A47F440F330D0BF08CAE2C90 + E7ADB27D34852C8FB0BE664E0F4FCF6078B458B7EAFE7746EA801C5F374D0B67 + A984851CDAC1CBCD55676059EC8720B6A4BBCCE5D5C5805EBBE3EC8DB03D50CF + 35BF3BEB41B39C75FB970687F1C0FA3F179CBAFC7816D4A1CC2458699BC42281 + 4A2D4448D032FB9C4F0F7277B243D03C6EE3DF8AE2D3D4353B28BF319E180D2D + 5E181C9AFB5C9F21BF4C0B5489FE5DCF02CB3C7C6F93D7D9C65622A32457ABD0 + 3337A7B94BB606FA84222FB2D3C17267D71D172D99E13391E279D62F35A6AD67 + 551AC747427AF2BFADC5ADF846613B189D9A5A1EC1AC2A1C0DCBD47576404B7A + ABEF094CD4858585C8ED8A343553175596AA3809EF8594F5CCDA6626D9A59D07 + 98622B580D1C2D7B0DAE199EDCED7664646C97C1D701A4EB1AD9D8E524FFC216 + 57EEABC7598F50E42E03D2F4AC74031956C4A56FD1CD6BF84F98E3B729FB7E26 + 29A945C4AA5544E0E27EA4AAC207F4D551517647959496ECCC70D167A3C3DFD3 + F87BEDEA0B3C780960C4560F4B0043B5DEC279AC41633F560EA60839898120E0 + AD9C3B9B931D38A73B2A03A5467033AD048CD88CAC1225B59F526C1E396EB67E + 70EF592D905FDED5C50E52D813A36794FB519F68E457615377F2491A186E42C1 + 28C0EF3DC6435833597AD2685398776914821FF0A6643276D8697D5B0461E924 + 6E5AE87EEC95E6D4CC5F3C6878C25F029F50CAC4532161723816BFF6A2A13F1C + 3E60DD883E84D2FB1C8EDD09DBFEA0BC4F95C3C1DEDF10A3FA212980263456A6 + BC708E401600375D1349D53B1DB3F4CF342416C8BD3FC9E95A40CDF49FAE3944 + FCF12D90B3E7173C6FE81693B533757BD3AF60124A6645ECCA5CA1528FEF57DD + 1144F34FE7A90C243028B7346A95E7859D81902513F3B24A4B3927EC123BC37C + 1ECDE61F931F73D5D32F61149FFE9AAFAE6CB9A6C08978B3DB9EA80FB756C446 + 01D1305BF4A7EF2B2AF1E1F02D258645A88231685CB573232AB777F8F7C60D19 + 7FEB70ED3107D841FFA1A7D4AB4858B56315825C264090059B3B906D4805F9D7 + 5C1F74012E14A68D1542A57315E71FA6C82B2904EC913BE67435C791EEC865B3 + 9A93A246AB8B24F8B2D324054DF4348796AD4C6E8F6ED09ED1BB8E980F3D62C0 + AA2103BD9107A0F7685CE43C25D1DCF400C0331E4EFB65F7927052DAFE331C5A + 0B9789B8C81790BAD5738376CB50F469B9C0AF89EDA54B18CA9283F6C04B4711 + 984ACE3D52A284863315905A8EA5CFEA9C70838A8E1EEC5245CC553399A962CB + 1140A106ADB20A701B590B2A571C09877D000E65946217EDFFE2596590C0F14D + 7EFE58F8E6D31EDF4493994AE08A0C56A8C95E2920F71B311D000AB4FAB2C38B + 96C28B19378E300DEA04F5350E25469D9753FBEF4F68EC03D1E29C7CDA8B7617 + E58E8340872C6EC64BFC93F6EF5BC1F64E186971E35D7E3531DE0B81034F21DF + EB65D8DC84DD4E8660257E84ADB9ED22BA3D831060E151D4B71FFA6482F9D1FE + 9D68DB59DB769C6A23B220562CDC6087A980EFD706AD8064042007A49A5EACF0 + 88CC426DDDBBBAB38D5084966C31A14BADCB29502D42D611A7B4A7D654E89840 + 04F0B7682458D5FBE2EA3E847A0749D1218480700BFAEFD5D63801A085E94677 + A4585D5A070ACFFFBC8CDFB4CDD368E33CB0BD8FBBC639E44AE36C7F2442940E + D2D79CD95454FD27AD8E0AF18F957D04A0483326E97C763B1BF794ADBAED630C + 97FC31BCE00FFC7643DB64AC4FC6763C11112B3D8703D739C2BEB52D9D4D2594 + E804D9D1289584FF0AE9722D6EBC4760391E03C878B0B3652CE0BE04747E7355 + 4B1B3F219CC3C15BFB92E92C28282080384CAEDA842293E8546E69716C215B58 + 301803208059992D905331DFF6485FC4AE24DC6481454F6D005AED73A7CE5276 + 6079ADDC65C086E434707179DFBB7B85293857395A0C02CE537EA4198540FCAA + 7FB2E3A183E9AF9730792295EFBC70FE109744895A119C37AAF80676FE6069CF + 079B2424D89A8C020D9BBA5C9C10EAF99B5262389E259DF8F4D6563998C21F29 + C958365DA770E22D606C13D892A0085CEEC72DC76CCAF5B55151590340B98714 + 9A87EF1154066BD130B8DB8B21D90A3D4BC617776EF9F36C06DB41BB1C06946C + 1177823C9203F3F32C4D7CE534012C291A762EAC1762ADC1F1A238B4F6F2B55F + 0C4A61E3E6213B8FBEA37424421416C54902B674638956F1F3100186BC780E72 + 738B2238406BCC59160C7262721F8299E3A9A9A7A92F1E9E10671EC18A540FC1 + 38C150C45E937A8A482A8BC627A9BAB1CC94BE02B02B32565BF1052EE18AF4BC + 838F671CEA9022ABBB7D97D5EAE1635F69B1CEEDFBC19D46E07F3D4B0783A3B2 + 50AB2C39FCD91BDF1277703B827E3B6B1DE524942F0EDA63DB1D5463B6D95285 + B793F7DA3601B8855D8344B4A104F93D66AB4D25E26D927A52F5C8B5FED789B2 + 8D4EC7419406D09A65A25A85E97CC464CEE5B5CCAFAFDCF1CBA78D0593149458 + ABF8794EF422C766CAD46189635453F51A12C8A81927943D27C72A53D0B9EC0B + 76A836F4928372523D13647414F08EEBDEA8BFD1FAAB403AC25F37BFDB0DF1CA + 2CE626220EA395C00A3375A6FE1CE0EA65F3AEF3D23CD328D25DD1A453D53F92 + 08EA1A31E41AF3372E02F767AA669F17A66016DD3479C49FF2C3D001D2A8C79C + 98354E80E9CBF98873184F48558A93F2A720A8A4D80DB2B7C1F72D0977979E62 + B4C9B5F28EB1FB582937D76E5CFAFD6BA7D7A4B7237F2F7B5E1B5968FF578467 + 580A1E65E2E84824C4C388D80D34E6CCFA755C88ECEB3B9544B933F80159D284 + 2E98E38D763F8474423E0C3DFC0E9D546A52CD0E16E3F78E3CFCA9F50CF65AB6 + 8E6F356CC46DD901D3BCFE408C7B8E947E54D9BBDA3B4ADB5D862B1E89F24A65 + A8229DD40B9258F11D1FC88D474C4EB444BE76E20CAD8F08DC3A826B457DA886 + 952A92477A930050F2E3FD35A2B5E828864F14F2F5541ACE5290EA64BFF5F8C4 + A2F5ACD0075C1A3501E88671339382905C918C5FA2BF5A645FEEDD85EA492B29 + 74642090CB2B1B976B6DB6B357BB32CFAEA302DEEE2B5F6E3241BECA989316A6 + 277996CC221BF6BD0F4B0CAE47751AA99094B87585F2B24240470FE19B461A43 + AD1837AB035E12F68A989AD69E26C3FD67A07229F435852AE4FC45810691E2DE + 278934F5848092454E57AABC69D687614E224101E361DF86E6F9B501BCC1952E + 19D5CB83AE7495E9C498FA75F84417DD53472BDB8D27B8B55B87640AF058FD85 + DD8169D418F438BA4B6753BB9BFF41985B5731AF468D4962BD089945BBF627C0 + 0CD8AB32AF62EFA4AA37E30DD229F1A5868310AF50D6C633BFD9382F73AB0384 + F3309EF0219A6B38C3B5347ED163EAA7F47399B91C3A09B054FB21E316893B8B + BEEBA09E4FD1E6B760A931B7D8E5A3B0706D5924809961F93BBA59313B8E3EAF + 5CA7E2855897322929B2FD58290A4CFE9DA58ADFE68776C89E06101EC1AEFAB2 + EFC54203F04D6872EA8356EA089D60E0EE944A78DBAF3A4786F6F524096557E6 + 570D9AEE1EE7A82622329BA04C1628ECDA430AD2C41CBC1D92D2297090DDA990 + 5790DCF3BED588A9144C321A4D60C97BC5A758433F776AB136C0E78397D5C382 + 635234889EF13D398FD198E41810BA66A5C73A23B40649A2A4EB36FB2E745362 + 10C81C6B72E3B9726549BFE71B91116ECC6B62D19D07D34A06795F798D05528E + FD457CAF852134C35F595A54CF31021D1116D3F4BD858A5BEF951947BC336139 + CCE57A8CD7CB1EC30A95614A388F403607241C864472220A2AA256EE682DE51A + CD6E49F6307FA965D65BA05D50CD9E1433BF2D8769AE1BB5273B7615D0C7AA4F + C47FBA8450A240C87FBCF5EE65172972FFC4A85536D57EFBF7CC8CC700D8819C + 124985C98F1394CF97B22EFB10027F63BE76EC6DB5F5866D004C32E9F2792FBD + EF44276EDEABEF0DC2F6F346719400FA2EF8151F79F7DE6517A13DC209DE81DE + 0FACCE6491D4866C06BE2B376735E48BDB800516D08CC6D5B454467E8EF83F8A + 982DCB86FFB3B9D4620A3E98356422FD328330DC64E1278AF07C798ED1319CC8 + 4F5311BB91B0DD5E5805380339EB94D575848DF52503030827866B7DE6E85D7B + ED098F4CD28D711C5337D231385F710B5AC60C149BD00C491E15DCA71F157027 + 8BBF22FBB4DA70F9616042A49F7F827D96B83B08A5A7C9CB3794B3BFD9DBA4E6 + FD066E91CAADDF99AEEB2308189AE578B5ED8E2A10652C3CA1EA29FFE04FF452 + 0C71E2D4DDBBC7634E0716CCE695DFF93A04B1984690005A240D1BC4B97370EB + 2D074EDFDC2C303CDC001910CC3B90D6F5DDFF3EF7BF6DB6A98ECBBA533B59EB + 83485B1988B0AAB2904AAF2F074A30F5CFE92DB1F6589D31C33E62946D44CD40 + E56FA1732B8610930ED87CD29F2CE1B52B156AC58505580FB21B8937F922B75B + 9610BA37775E7EC99DB805B7B39DEBE375EC2C82544DB55698E9DED37B28D0FE + 0181F035EB2DF8A84C202C893ABC9E5AEE4A70D7CCEC5B51A2B0CDB7B618F812 + 8E68346649654E2FD81B2E5B61452A4F35730AA9D71F7A241B2B3C39B2DC8018 + 05FCBD17853B8820269D1AA3C33699FD1EC55FDC15E28688A3CFFCA5CF86F0D4 + 31C8AD7503448FFE56B22E063E4699EC485192D492E2FF30008759B5332D79FB + D383BE46807C6DC44E6637EF10A4FCA02BAD7A6D62C05F756996B9F1EFC59A87 + C976DBED30F2FB223D6664FD46A3B94FE870EBDD2938C97582FFCC7613E66264 + 5A40580E4349F4427EA45BF59F29F1CC10B582BF9D9C2A46B9434F93BF9F562C + 90311D2030E00984723F82399B71D41459D6CA8083C7DB67806AAF3049DAF42F + 6F919691BD5B5D61D052CD3F732A47C642C1493DC917708666CE13A9DECC2283 + 78C1151D194C99E6518989D34D7ECB7F15BA0F726E79417AAF10879CD11FF84D + 2F8EC1A7CBB256D3D1BCEE00A9904F015EDD51A9AB05A85ABEC6F56B4B6A9CCA + E0B1EA47FFC0109C2E3798ED853817A96B8B23FBF512EA557796836385DF6806 + 4A7556BDF10D80C3622F4E6F0273A93A835924D2C73882D79286B254CE49A05B + D5CF8BE4D0C71A0BF83B9CA5E9289B8441914F45D1C2B455D90503E58B98BC11 + B3C694DAFDF167E5C5AB48F61F8B714422D8AD9A693015A84B0A5BDAE39D11D7 + 2B09ABB15358A0072E9AFF5CDFF175F897C6C751AAF9BB2D1AE97C84A3EAF913 + C999CDEF79AB170FC724A3DCE838C280DE524663CFA4856D122C72AA1979FCD1 + FA537FB73A0C854E3F21033FF8FBEBF6AB2F1D5BC49BE81809BEA2EBA6C1EA5D + FA63A6414760BC8E0ABDE07F7693281E970D3B1E32ED2D70533748C87ACC2D04 + 67077D3E4F72338E916AE32D3CB066986A203A8CC53D461D2A418443F49A00F8 + 14B12F59FF66E024BC3B0241E3352D865AB0451B2B1F710E744F35AB1FCE7C38 + 66000F479FE2BA3EB1906C48ACCAB652078CC3349E16071F777C3F9A0176EBDE + 564AA4552CE9EC8D4ECE4399A0D45CF831FB2C9A21EB789063079A7CF36FC8D7 + 2CA5992FF670600B29831F9EBB740E03171F946380558A07BE8F3A5B73FD8D5F + 2CA7B410541AB2071E3BB8855417F77C8D911AAE3932B6E2CEDBEEEED5FA58E9 + 09CE2CCFD16F0B8F808E3E43205F56A98BBB446CD9985FBEE58EB5C60E9A6887 + 71F7DF24E568E094082C3797D3761FB30DB8480F09612C589AD63E984B887072 + 922A04920450FB05BB301DBC3EEFA1D43F9693E4BB5AE0D4EB8C542F804A3D76 + 12152C6AC333393B346CBE059F1E26AE92A813D88E7FC5DC9DA061EEA3E1402F + 16E3C3A9C1BD0255700D96DF39D36FD2B86E423C448F17B67D9933DF8587D8A2 + E84EBF9D4635B43F125165C83A96FD60F800681474A4CCA8004324575F28C91C + B9D4B780646735697B75712FBB56A4B572AF7B7C8668F32AD81BFAE45E285D04 + A0E7CB89A92EA3FA21FB433F4F6A5CE38A12AA5E3E29C68452AA0E2A666CF0A0 + 6874108064E46C2D3B26B005AB8B4641860AAA42981D22B052F4394A839EC42A + D9C542B8DEF07ED20E377B3A389FCCC0F88F8590DCD417EF3E6E92013EE1FC51 + 13CD712AF88600764E251F47106D74F046D9C976B0BF24C5796B7FE15A310457 + 67AA335822241DB4CA4F3BCF6940377D55D78A5B46568821203F5C06881B6411 + 2364C3ECC5D43F6928B20C118F8A76166FCCFA749C0938D4756FACE32D977382 + 8B3E8EDD49825788339352DB6BA0198F980BA778F69695E9497C954EBB3F6032 + 2056B41B6D979C83DE9671CF7D773A118B7191AA7EC4BE45B4A0E5A448565028 + 3551CC4B84D159FD626EA0BD94162999FED7CF55C1F82112F488804D9B159756 + 05E24128E81A5EFC7E8ADC314BB6FA6D15B2715D5934FAEB688B6528AFEA3938 + FFC21E579E88D4DB719E852E6D5D2F60254E60A9B95AE0A0CB706C6CC935CA73 + C94D374C8F37B8EB1FD3DA1F0EA6490540C3F7BA7EA6F8C3242820A4559AF9CC + 3B00B5796358B4A1F9C267D06A4DE769DDA0C333152E0798228F892C166DD05C + 327AAFBBF3C071030C250B9C1E6A9FF4DD080F678B0D9117CCF55E2A75522933 + BDE13B3F17F8ACA22B6E25CDF3315ACC493208102B366F121692DAD2AC0C04AA + 32FD313B118EB56306489DEC5E5038D030915510CDD5D1FD2EB9EC0D31886043 + A60BFF521837BE1BC4FE40241A46D1933E9BA1274F07DA01CEEE5B6BB345E28A + 351D3A6456401B1AC56A7072466F2422233F31D219D9F1FA1F67B133F32C0E05 + D127F4DFADF0926D425F54B7D8315264FBF57937E81F598215E357786499AEEE + 91B59231585906B0D4F1AEC4703B6F2CAD9785324ECB079EB71DAB334F3052BE + 4BEA9D48DD36BD08A88553610488CED07B7E4C9518895F27C10A4DD9F7CE073B + AAE53081DD9619D0172EA6BD42D9021A0A398957C8BC28DB1937ACF6191E3A4F + 0EA3988B04EE13502F87E013278A65E280FA377EC96A354C96D8647CB7877F73 + 2D72D5205BFCD4BE8307A3105CBAA07B7EE9562C6D16B7BF856A67F03A0C9C83 + 29821298DC35E05714D326D41B8B940B158414265A1630FE2FB6759EFF9420CB + 41361949283832147FDA74BB9E8CF5B8332B90CCD2C949FBC1F75645E7A225EE + 667E25E4D58A644C5814B392686CF151B8598C2531946D1220DDF70FD5A6C09D + F438B3D262B8C3C50AD3BAA4B34F3551625860E08A1E8685D2CCCD5C96CA68A6 + 897FCE1C7B03CC0668E87502A0C02094465574D1AC54A3A473583364BDBD910E + 23051960DA316B686A152F4826CC05343FC851D56CFF8C9088F8A73108F98A4F + 17615D6D2E05C8D247AEAB582DFAE066FD7CE2AF16E783FF40EDA375B9B2E1AF + 77490CB3CE62F86B35D70F5BA5338EDB8663DC18BA394E71FF5ED665854A885A + D7E08BBB6A16BAF4266C9F650CFDD9E22786D20D97A35D82E1F26BCFBDB27F20 + 6C40296CD7D988C66026583DA561A3F325FECB8C022D149D8EBB57486F72E263 + A33D99A10AA876991DF949DC7B5F89466773939B9B045966AF4EF00B3F1F1BD1 + 051367CE71103CC52E8D966662A8220F03CEF49B0F3D751213C5F92CF0F63517 + 4F52B241E26E2F1F4B01D37A63D7C68D5DE1782CC502D747170BBF7E4C5D370D + 7FCF7AF0645567B7D0FFFC84CFACC566DC45955C907F9A71305566BE05E46C4C + 76903133F8EB4566939C93BB195459014F29552EAD08473E3CE60AF6AC886447 + 3E31E1597EF1720F94FEDBF533E9D5F9C135C956100DB2B733363A19A41AE93B + B3D14322CA7B1FAE0C305CF04BC52B70B4B501656EB990A185ED31F756059D35 + 9138E61F074C82D628BB483FF1ACBB64C66EFE9AE8426A04FBC10162C225E26E + AA4A2AC51205C02A0C6D9666D12C9FA8FBFF86EE5459904A22795E02CA51D0B8 + 1ECE92F687DD5400CECFE2A3A0B1B2B88031721D69ACB8BEC9392650AB3517D5 + 209EA8CDCDBD7C5F80017C5F5C86EB26CF4E84CA6C3FDA77608E7B54926273C7 + F6BDE6CEB0591F1ACE82CFA5C3A178AADC49628C9D998980517FA79378BCF84E + D8772238FBE755409E2564186F3A604AF5FEBB1D3CBCDDB483BE2CE1D1D39070 + 3953CCD24C921FADA6D18C410E86833E944FA9C37D0903812A82F387CD179E59 + 1533D1F6307AFC8326CCB258480F6B2CE9BBFE52DBC9EF8D98E56F6B7D16CCFD + C86D451B1CF95C5321910F63ADFCF6B1C798D41FD68B82C626706A3E61D294DF + 3F2E99C4810B03D07FA69901FE100619265BCBAB24C11827CB0D53965BEF2E96 + 8B5ACAA6B7F2C4B1DBC855B19330D304D61B510E6CFED840AFEAD12DCF9FFA48 + 45BC853233EA064F18D037B5B6C7A769DCC75AD1B4727FEF00BC04EF1D83CBC9 + ABD4D5535104746DB85D8551BAAB27039C6A579F5C573BBF5B0D8EF8C4DAF914 + C32E8A4CBCE9EEF6C651F26B9EED9B38012F15833CD5D7A9C4AC80A5387A0674 + 02AAA3470486465D5A4C98D8ED87B93348B327DB1C8F4CCFE11F502648F6A97E + 25DAD00B38F6F02EFAD1CFCAD96122CEA2EE672A5D6F2FC271E9C30E93865A09 + 26BB4E4B2F27A31DEFD714AB73BD8A467AE39EEC063BB3A6609CF010039A98BB + 7DEF9791F6C3CEDA5DBD139B4FE48DE30B462F71CD86D3BF0C3008289BB3B9C7 + CB0027450E7A8DA78ED34E9E352D4ECCE77825D308B01EDDDC16BCBE5A1D54B3 + 3E6FD9366D985F42FB18B3AD3DD3A1DA76272307684047A2518DD7DBFE0EE5CC + CCC6EE8C5EDA65725858C81E00AE14FF0C7B40BBC7F72846951817092403329F + BC2AD5ED026A3F5A471196D6532C1A6398950B49FC210029F10B21820BF2633B + 78C8BB785B7F1C784D218D679EA0B024FD2903E1B684F3D80A8E5C8DFCB66910 + 82EFC9C5CE7702713C449DE868AD9312069FFC4987E35571184D66D6AFED4F72 + B72AFA7BC9709826C0A550088FA82C21E41D74D8799DB7153AD348B95EBC404E + 72AA548969A5A8C2546E181725D0996443F9F8736CEF860918829F820FE1AF94 + B997E66D010F8E85EF5710CE00CB507315B8280484CE0A26A56C128AF91171F4 + 468A06B28736BE87E35BFCBCB67B03615ECC263FB44152A437FBB6681C74BB77 + 5FF7EB3B845C3293783F2043208F42B9A6FA7BB02BD8B62EABDC98B4116AAA00 + 61179776A5F8C915D8B94D6089132CA53B1589D02A06F13F767505E3ECB339D3 + 023F1C521C2E61FF555AF4370EC63BF856BBC7EF6D8867A212A8FC21CDB3BF1E + 948BEC51F961BC9E78A640745406F14E6835AC945A8B473E0E943387D3E9CBCD + 0C581443F986D25EF006B18FC8A80E8C24DE6DB6ACF3226DC5D3D224CF97FAF8 + CCDF50DED7B00B61564CA66C89FEE2F77E8BE7E6C6A0BCBEC3F8C74F74424F72 + F8790BB10455024C4D1B07D43910B380EB1131DA8C5148F0304B9905559BDA4E + 4AACE89411645F2B8FC1A6BFB12A34D78F579072EC1C31A5E9670CA65814BC6C + A625E283BCF38E2ADFEA8882C869C64B9D41419AEF012CDAE15FC6AEA3039B9F + B5EB82427AB0385440A5082A9FE606587E8C0C25178C2811AA832D3413139C10 + 2F5039E36CEC3CB51534BB7A20BD1E3D620A88BF182F47F9A5E86A365738D4F9 + A3AF07F936A9DB30910EF681B7A5F435124FA91582BB8C224F290B56ED27C8C7 + 0661A5C0CDC06144D8BE5064E56D36F5A1282D8D8B1F4E4C3CAD852D9A5E5B63 + 1D4C527A7BCC188F1E6ECE780EF4B85162DCE7D4C33CE8991085AFBE8CD20BF6 + F13B09CAD046A54E9317F628B45614786A79E6DDCA6200582525ACFB20DCD64D + 01658E4E5BEDC258CB5678419BFE8EDBA566F041DBEECF3E5F445D542A173213 + 3024B585EDD104DB59374431B457E79C175A641F51561B4850DDE539ADF8EEC2 + B58454D9F9EE52EC2E21E9FE64816B2CDD5BC806475AF35C0D867EBB2831C983 + 13753C1C9819842C79A8B3B4FD5E382FD688C6DC2B52B6D5D237ADF97E8CB728 + 59F5382489F61F00AA9CACB30DFF0F6AEBA0397798DE6BDD4E67EFCD46FF1649 + 2E6E7CDFC30412C02D24ACEA6707C91A8F9B663436C6EF13DC3D0B0BA51171CD + BFF353B9BCF63C310FD58409FE478FB9E20DCF9F62068B65286342C2C6D1F716 + 17355B7F647DB7BB4C4301AA870E1999732C602183A12AC800E31909CB1D1FB9 + CCEBF9052F964F8B01A62CA0B3AC74529865D1B992FBEE20215AF4EC11735486 + FC2B8050A1122F992D7B728744B97E8FF47E2EC7128849351E9397C166E24EFD + 30622C417338488D7731A3EECC40568481CC7C216E1D84D7C750181FC5937484 + 21421559A86073051690FFB0BB61DA8AA9F591BF0A33775D7463ED8FC75F3976 + FD02513AA561BAB092C1A271E07E67FC579E85A17F666A12BECE43E59110F196 + FB3FFFC8A498664B74D014A362BA6F949F516B73F7DF64F612EEB1C3EB56B6D3 + 67BA0DEB523E6EED6E0BC9E744C39D65EC0E5E6BC8E3D0800A5B65CA3EA829B0 + 8D31158B0BB5C7797430C5C49073120D85605A9E972C772DDD2B79159C42F51C + 56DB3D0FA0BBA7BEE2BEC7F98DBFEBA049D12AA5F2F8DF2D9E74942C354E03F7 + 307FE6F3B323A1E19C43B1FDD8EDF02E8EFAA4E046C6BD60F7DA5526784D5DA8 + CEFCF4D698EDC567BB86C198D594C5E7B9F6A5C4DE88EEC18A892E3856985DDD + BEA6BCF5C6EFA66A0795B333B5106986BA9FEE98C910E5EBD68FAB323442A84C + 66AD82EB62C1BD6E718D616EDE60EE03E4B4F784BBAB74357D9773B7D1FE4085 + 45D510C65C4BB7214B6FE75677E03445FA58BB0F009E3066F64E4B6A80B4CB92 + CFA3B1A5D3761F33288FF6A5346022467A3FD94100D52077473FE5A7A330ECB3 + 80C39564648779CF9BB9D4F9EEDCE5009EFABAB33F67F3520CDFD085AE741C58 + ED63B637F115ED68E4E069ABB21B3D7B3D6BF96F34AF66075E3014F884C43CC6 + 961088A9EB4E029827964F86E6073AB1CF3FA6A039B703E4B9F5EB6A5470D4A1 + 486E5ACEDBBE35FF75B725B6A19ABA44904D0C269721243E54A1B8D785AF79EA + 604D6A73721DB150B18F067505E66F89520E87788DC31256C84BFD95736273E1 + 5DE70C0E2BD50435F260A97C207BABD51EFF9186B1D0285A87FF452FE7B3C2FE + EBA59AA3A4C14B806A45D15261810B9D41F28ADDB24870CEDA21B26D1501C2FE + 7F815F205AA44342D35CEEE23ED90755669CAA1FBF19635A36271BE894FF98AA + 02642461FFAEB786509BA6D49BF7580E122B4D03C9FA13BB4C14AD6E97D4320D + 22C592E6D4F66FA1F3DAD918A99E7D41E9751DD2EEBB04B00DB9878EBF2303A0 + EDD0557D2AC8B6658A65BE488C0E2914FA50DE46C77D512F03973BF4D0357AF3 + FEBEC432D50C23E8035FDA32615C80FF62BB0C87FC8ABE06FB1EC225C2F4A56F + 3C366BE149A984BD7443FC797E6E9CEF59B1602302C499E671C64680CC038FAC + 5DB0BBAA7B6BA9A7D9223E802C6682B7BB2803AEC667AC1E226E4B137FAD6EAE + C5B5F231E90301EA996B403E218029A449FFC9808817F978902FBFABC9814FD4 + 4828A60052931BF22ABBE391466BC46DB059E4E1DD5FB2EC979E38730734DB2D + E71BC82D7130FE363563BCC60CF69ACE8BFEB00D9A80BD72D83EDB68F2E7A845 + 60B88841CC01362723C956E16AB013419CFD378BFEE5A9E07403B120CDA0F137 + 0E0111FC7BE6C6A4BCCED8F494F972336EC542EC00CC80FB4EC18A081338320E + A2EAA3A0A95499E637B6625B255C54898FA3295FC1F7E0744D158899CB7BCA21 + 46ACCBCEF4A34E264D68D5055E73049CEFA3DBBA6C623C51D325570DA5AAA8B8 + DEA11D428E7868221390FB9AC77E6898E1CA244B9D90640874CF18066C3AEDAE + EFC6526CA322FC7B1B58C587627E29591B5987D1D6637E08E056C0E1405467EE + 93A78756F8BB2E16F61B22F28D779F6F39C1FF89F6BC711261306BC4916D02CA + CECC7884A859F37AB1A5C31958D82C29D4D1DEBEF5DD5CB1E37F55FE5783A688 + BB287A17449582A1C7A2DF55503C06D75605B865B88E9D04A4E4E56901CC19D4 + 66BA12229F8F13114666AAC85DE4B7D509D3A086BC742EBA29A29462D825084F + C70FAC623FA00134C9057973653B9E53A40B632E70D0356BC5321F65E95A2805 + 679764A76A5E18C7796AB31CEF25FF68EBA6977E4811E5E1847F5D4D2A7AE60D + 616CE48FDFD07087F9492BC1871EF4C57AD37030B5E3C976DF4B7FD07DD15B5A + D7232B3FEA667301B50FAD4025DD05D2DCB603AC475AE262F8D7033C0099FEC7 + 2EA43CB3E1FE616CEB3AAECC41B8F6EC386290F996FA1935D76C0F249BF8BA31 + 01AC8AEDDE71CCB86A4AAF296442B0A30D1A9AB5A3B651684C5FEB9137484BB3 + 143173C33D18851F6CD60D8D66E970E20D391ED68421C912F4B965A173CEA0D0 + 9728C7D118DC26841AB6FDDC21E91DB1F6818BDB44474990A85D6435357DFA63 + 7035CD97C4CAD4BFFEBB757B5743CAE0D30DD1B65C4415115B46ED9753EC7045 + 3AE673FE89F063D13F21A1558C0328775B820EFBE798ACB4A8B7AFD67B4AF5F8 + 322DC1A60035FA89F9FE2C078581E07F6FEC3C9A23F580377C35BE7F7FBE0D1F + 9AFD67BBE221D777FC3CF7868C854E97F58003CCA61FD9C0D91B9E8D30C28D1F + 4E2A3A13F959A2CAB6D78EB63ADD0D34E0C428A377427CA120A277A45C71353F + DA4AB2B17C33B96EE99F8BC3A15CD7452BC9AC2E43EE827ACDA78979E8325CE1 + 50CA9E410073C957F5916CDE8083B34A68DB901C3918CABABA4950E6CA718527 + 65FC51158958014DC02EF0AAB451A7330076E41FF0637C6F97213BD7DEFF676D + 7D0038F07B1C69A10AC966099BA97A95EDD91C842C45809B4407F8D2310F3002 + AF4E5AEBE35521F73D3A36713BF38606BEE08E4EA2FB107D98998FADADE1E403 + EE993C27E8DC2084A5FB99E2723BDDBE62E0B0B321C22F89EB14F5007DEB1AD1 + 4ADD73C56B6D8A85642C347AEB2CF271E06EAA29C601E2954B4806A4D4FD135D + DD1E5B95110EDC7CF9CE81F238C20CEF8054B1AC7B709A2B360CE8AE8F442A79 + 83269789D19FA010CD061A28E7BBBADE01115B8692A314F7021DC3F490941C73 + 8ACAE6E8898DA2467194F44FDB570F9EE0C2ABB1AC82FAE62598F0BDBB545B81 + 76D11FFDA82D8B4246897F7930DBCA386D754ADAE65C041E5F26508C68ECC603 + 195F72200E46468C89F3972EB268327ACA34E04CA8DD2FDF4CC9CFCDC8C34725 + 82C08A276A7621431C52A7135B0B500E8CFF8D177D7045F4E5D0585E866D2CFA + F77328487A46D1EACE15E9B6B8EB7ECDB6A3669411580A142017DB8D429FE3F0 + 1FAAFE1C3A665ADD27DF56C7BC2F02973EB0B855CA955A88B6E9E41E8EA0456C + 1543518EB59A4DBB333625E8F7293DE9E981E4907FC8C0399BE6B8D053D1EC53 + 04C121C3728842D4E29441D4265117FF1316DA1ACB7F7F371C0732F49F86CA67 + 2AF10F9C910816268673AA090474D981803ED3577CE6F00DD59917AEA37E693A + 49AF39DAC61193C5FA8C6FE53B8F8D60E745960A779E61A3147A5C973710734C + C9D7EF05E63BB230C16C7378FDB6FD29476523F19D156A432C18690D04BB4888 + 7697C6AC165020575D7A041E505A87092D92EB376FA0EAE68DF11603E4DE3777 + 706E72F6586D1E510E1B89D1686ADBAE1796B7E3A5EF390A37B5279A2D766ADD + BDCE29FAF27CF48E841735864F8AC863CCAAF39FF2D78C3154F303E506D7E781 + 9FCA0B06C8A82C6B527068545890C4A17AAEF4CE53DB05440E2BCFC57F7D8CD2 + 5E81588153006031DC6FD9F944D3842972AC4E82DF0FCE98D99B090FF0E83FD5 + 0C140C1DED9392907F2FFC05CD6EA5FBCD32B7CD8C18FBF4DD9B367564323F13 + 79DDA88814193D1F90E61B43C51B8241B8F84DCC2AF0BBD3C166F57CE9C03EA2 + 4A3DE752B8AAEF9B469F61ACA3AC80C4B97A90BE85BA6CAAB48995C845901F16 + F5EF251BACFD1EE033323A4AD5742A1C923A23F47FC7ADA12A43896B21E7C83B + 6D771557A7F55C336B401197682532C208264FF7BE2251D09726C9502B0A4E14 + FCA1DC15BEADE1E9568DD85FE6305D3EAB59DDEF7CF15CDE4B00C5E36F049385 + 9E57021DB84BCBE80116A18EA6D860A02DE3B66818E1EB4504DC35446C408548 + 6ECCAEE996CA30F018468B222333ACBB7EDEB89DA739C9CC99468D832AA075F0 + D0DCC6448A01FEC983EF79830AB46ECF607C9BFB178D564C2A824DF65406B1E7 + F5F79B17F846EBE587179279116BED9A27DBD3980F4DE055217F1E6F1AC92EFA + FF3605537295239F04C244775BA25A56D25EA389757AD96418E9229CE0767F6D + E218DE11389A6D8823BE8F1E195691812167AFEA67444A28652F0E51C99CE2B9 + BC7309A63E39BF56CE63E4273C88802E205A5A2935878FC1FB34A9659AA61F22 + 1E2955E960055380FBD7EB843D4DF42336ADBB55BAD7F5F9DB4B30F7B3B8A4A8 + 2C0825E602C4E4F0B0208ADE162B1805A4DEC2F42EEF87533E440FE9B270111F + 2BBAC709A24CBA7FA2F297E6CED34706DBEF304345E85E8DF0D584BDC2D95A0D + C3CB351E96601109F17E6C5524C12FF4037D2EEDCF7B5EBB1E67DF582B4DFD0E + 7D4C6F38C21499DD2C5D34AAAF76AD1F28EBC050C7C86B7BB3A8CE1811029E34 + A52DC5341263C9BA95BAFCF0CD9E5329095CEF3993C8F8C083E13D8AFAC8464F + 81BCAC39A6191D62A5D3AF00F945255FD8923EFE38334F0DE898077515F6F3B3 + 43EF14A8A71C47323A5971BAB13A89FF9DE8C08AB378D71079537F463311AF0C + 45A733CD3EAD522816D94E2F05486F63E065E664ED8535817391C41D121D457A + DE4C143FA631574AA20DE037DB800183DFD8B7CF843B43D2754B0DA90217CD0B + 6BD23374A51665D05B69CF09D8D07E7C4F2FF4E3C7D8F5D9B4E20437EAB24F32 + FA71674F67CCE25CD182717B038B13079078159683A0B5913B4913760BC7D175 + B47B0026E587A625B2302ECC00023AC4043954EF9F0BB0C5C527A9EA022C8F63 + F3782D2A4A063EF7666D69837C013120EC46301A05C94470E54B70500C7F6929 + 4543AA2BD22A4BDDDC99EE05AB143F5E7F206A175917EF60A3A60C8441BDE14A + EFF3AB838F4A8074FC022A908488ABF5E513D71F832F75A8D38241D07387CFC8 + C1E1AF507A72AC13750038106473D7227BDF9E01312A4A9428DD6CE05E7B3879 + FD47B2D52726B48BE3D131DBE2078A2A0341518C8150988198F525575B72B241 + 2B57F4FFE79D255566447E8B8D104621BE20D9F2E8CE6168B9625EB787400957 + 12A248F5AC73918ACCD8138F7521FC913393ADB5C3E86E4623946B0C707A103C + 094E7CDF652E98ECD85A507BCFECA27717A49550CC60E0704C5BCD75BF30B462 + F862F34E21ABF2BEA5D204A2E7BE7013A35D4A2D6CA2618B2EBE4207E76C77E2 + 103F7783FFDED20D70C5CC3BE00547AAEF6927738BB39E90ABA55640C2EB3358 + 97FC0705ABDAFAF2DBCCDEDDA83B2B3A8CB427F490A225B7BE83DFC9A23DC84A + 8A5BA3A432636B8836298F1A12FAF6A18197C8AE74E58639CF01FBC6E988DBB8 + DD886656CB8631953C00540EDF46D0415AEE7E318FE3850A55CABF517B5BBCA7 + FD21BFD45CB6779FF635ECF7483F07DBDC5ADD39C7E5F83FD172F793EED60609 + DA3F0ACB6DE0439BDAF67692E92BA2C70E47928683F4A54D1EA3663BDEDA5458 + 2481EC036D27C019153554BA2D790172127ACF2D3C292895138EF64633BAA3F4 + 84DF48B1B36109C94BF8A80E79F8CA896B31057AE012AB7057771CD99326DFD2 + AE01D0231F3A0F0FEAEBC011A40EA69E9D91D373B5420C22D0BE00B5032BA3BF + A072FF63FCFD24CD465D499116F006C68644129D219681A48F659CDC9513193C + 61A797FC50730406CD5395DB96FD34A6820D2DD8AA68EB5F97CA60AAEB2A5229 + C7876F9E3C88DF70D16887B978B64EE5B6DE2FE02800ACB74A1A03715EECCAF1 + E91B638C3F747E3606E8F493115F90F3F05DFC45F87ADC0AF9034B762E049E21 + 7E3BF73226C190023E439B1B2729548B36F97DA2801026CF633CEEAB36CE6D41 + C2E993956B716B975CE4761A49430CE510B984791AE28F76C5E22CB55DBDBFCE + BE837EBF634A4A833E2A824DE14ED0DA50559CCC0C742FDD45C0313078D34BF6 + 18863CA4D3A3A392359A7BBD43331D4D5B556AD543FE822E6E4D126502D32E7F + 85C71FD804334EA20A61AE888C6BC1D072C9DA67238EF08FD61F26ECB14EA27D + CC7B89C1A570241EBE078738D169435CA55E1D03BB12429F8D32891819D9FA2A + 07BAEC21E59DE1E5A8C7572D03553A3465304354CD8ABA2CB168674469718EF1 + B68635C8D9991A4D91672A404FA2668FE9FFF8D4670E9EF44F10D0EA9F4604A1 + 7352432A5CE3BD3828B61F85FC982E76124DD1402FFC0CF728FF2F6169BAC75F + 328321970E901E44E32ED2228CCE3D512BC97A110EB977B2F86CCF76B2B56E30 + E255EFAE79E68C892022F4D0FA9166A358B1457679D5592CDEC46ABAC7387E51 + F7C13485F8040BF33962E0724FC9048D667CBA46F0CB219BD49E128ACBC8CC27 + 8F1490ABA2DC1E051680DFDEBA2C940D98826092C444E12B3AA87B2D0511E421 + 3B24343988A003FB5531FE7C56330C3428C8318AB1EC3DC949557D14D936F7CB + 0C18E9A92E8D2BE0E9DE496910196A78CAA5B12345E9A712FAA46E6C2FABE0AC + 492E4A58197E14D954D8AF1650ABD3CE13B5011C0FB537BA42B413A9AF29BF38 + 4FAA7699C9466AB41286A0E4E9D90057B696265ABEE8E515988151DC60D389C7 + D5A04E1EE1D120647721473245036873B3521A9FFF59761C46FFB00B0779E19B + F47BEA9055F941750E86B94C7C704D9748FDF5079B1778097D3F3D9B09FC9EFD + 92485EF758579611240036A1A24D41A2036E765F1B979AF7C37BC4B651DA3BEC + 2AC7ECBA06C54E2F72011C407AA2F3B55DEB3022005F35956578A2517D561FF5 + 66E90379C070AF246C56DE8490777229E0547961AB86FB0B25A26DC033DB5062 + 790F522904450329E110EF3F08D12F45443F584901A876D23CB84F77E02BA93F + 0FCA7D3D889AD5E8494CB9C8B5E3ED861A2683A8A25B66459A8745ACB39AD727 + 62444E065D5F84DE95103185308B4113E9EFF20D0DEF81D22D8E51B7AB9A35B5 + 1B4E985259B992F6DB20C2D43C46A2C701388FF32E686DEDC4E75843EF9BD195 + 23CB2BE00C07539850A4DC817A7553EFAEDA4D0274143D91C02DF30C08FC126D + 8C59EF815366E959E140A3756B6044CF88B57C32F6809B17E328612745C76D20 + 4B62B9CAD6F0825D2F6E2B33DB227D43982A56EBB068E117B2CAD2829151617C + AF83CCB445A862EBFD7BCD1CA6B40FC1F0791E56908FCBED69D469C03F853B13 + DD02F362507542066B9E278344433BA64E92A6E36B6C9237A6F9A400BC207BE7 + 899046750889F8C1960803708DAD56FB2637C4F84E98C5D9345ACCD09DBD4C4B + 8257DC4EE366B368AE7A405F8AB57E0D0F96C87336C3DE8B986A1F08C4DCE414 + 263C529F17028C075937E473D20309AD7DCB0B1D3A376E1C401A527024054328 + 98D3312EBF86DAA1071EB87CE449AF778EB4178C661AD5BD76680B560185D506 + 6B7ED11615F2E92CE534BB5D7A04CC537240B441840AFA4E74D96A9A77534E85 + 0A5CB0B0486C7A5A4FE53DCB66D5BB1F61CE18EAE8A82B047FD7F0DCB92A598D + 67A90D90BB253B3E9895C4A0C92D39878E44BFADC4ACD3EFD0763FC3E519CDD6 + 28030440B3A26920934D050EE398FCE347B52784DF304C6A049687B830D13116 + 7B41C000C5DA03379CC8673676223DD11441BF8FD5D0DE5CF726D3C294EDA249 + F7F15E75A415BAF6579207F29934B07845F3FED8E2CB424F2816E59934064146 + 661C2307B2B2791D15B8B3027C71BC760946FFDDA54560F8A461501C3CDE4D6E + 99F35012C9237FB169194DC226E921F6CF95A3095658A6E10E95721411ADD736 + E4D0111DBF59C9E40B2D517960670C8161DA233F08FFC404471B5E70D89F48DB + 79E7FB938A9B488F52E24B0E30F7179B3B19A5C1AFEDC72C8939F8FBFDDE4507 + DE26E8BD800ADD0037B13B04AF667C7186A3C109B180B261A2C8FF178175A5EC + D46A16DBC6EDF48755F71375A76195C8F5F782E2AB75098922B0E7215AACF7CB + 49551031E3365C3E62D29AB883D4C89D0312A8070BB88ED1D15DA031438BC96E + 30F3AE59B7CB718F29F929D51A1E17069D9785CC570ED435E677543624838AAA + CEB8DB807788490C3BC35A5EB8326A733756A971C0767C9FE9A1B2DB63FE75BD + F21777CB3A5EBF420B2C7C93654696A4792BB339038B8F3D709C9F87A9203DE3 + 182E883E2F85600BF242CCA06C5AC56F19B58C2D29C0214DD2F521137028B28B + 8FD75DEC70FE78DA48B394874DDE213BB32B32B46637807B4DDDA37B7B1BCA3E + DE1C1C029AD18965127114F87EA89639C2B156986116F7860F897FF0E2B3E1D2 + 94DB00CEC0B7F30E00748436D33469A3D42F608BC2D4D22C75325A52F117BD4F + 88A6F2ABBF2F0CAE2C4905924B9206EA770F9EC77006C29492ED18DF0224A78D + 0B88F750CCB72F194E4EFBBD4349891347CFAD1CD8B011E7C341C81488B4924C + 75C2439C3E767BCE8EFCD1D9DCF838B6650040C1BC262D7B83D216B902B5CB54 + 7D93A913FF4EFC3F21E6F474C0E008703672FE403D265FE9CA4BA846FB32B640 + 85F76F1B246B15B637BDF31782A79CBBD1109712B180F0027E10867FD6DFBEF4 + 9193D253D7B8023CD8A601EF891C78CDA2CC47C145C7955EE5BB36B82742EFFA + 1C994AFEA6F4F73B22549A84BAEDE9D67CCE99F3C82FCFCDBD63F022459DB23D + 6766325FB09D858C8C02FD41B6666DC1F79257F93A17EBC924E4961534FF2884 + 18AE9770FFF935EC29161C5ACCA9096B0FD4F2AE2849A6B5D5F07153831A77E8 + 4487635F85333967C6EAD2E97241167FA605BBE416F591088C42B72C3E1C65A0 + 7232A6CA5A3B2D56C8BC6C50F6B9A7A5C7B3062A97321DC596A6ECB550098944 + 777F43A69EF8A5DF9F326F059AC8C9BB30EB0C4CF4CCED4FECA07D3CF612544E + E252F73EE3456FDA4BBA6C9C26F76058B85CE37616DA29C02A7D63FB0888555D + 3A9531C27136C70EA4E26F8518F43AC6B83DD023A7F23CC828F2940BA5663EA2 + 129A071E3E6652092DA29EDFED3A71D07CF54B0252A5DC6DFCD23ED0BD9102A8 + 114832BB12A09E1F2AC9D8330D7F5465C90566B1ADBD86FE76BB7562618EEE57 + 6769529638C3D0DC3958EFDD7444A6A8EDA25AEE39599008B781AEA4D4F61753 + 620463BD0711E8DA1B90862A9B135C7E79B2BD583C58A9F07F5D2E7374E433F6 + 08951B1EDBA54B77D0075D19E600368E83FA588A3E338FDFB43002EB6BDB7DA5 + 7E4306A89E759931E9C3DD8894D9F87C134F71C39743A5EF7C2A03344C3C997A + 7ECE72C7E2FA0A3A2FE8FB35C6FDBA386356568DF097F36A2290DBE33F861627 + 49BFD9229A21B9000C653E9A7F2C218AE2FAF3F322749B6E6B429E10750DA995 + 450015D187E07444EF29F7FAE898AAFA87BCACFF6F629EECE9CB21BFFB8046E7 + 438F19F2AD412A31589BDC9FDDC426838901D1227790D99C34FCADB71EA837DE + 2E7C0ABF0371672701882FEDB619B224C703DA63FD694864C21F8D396C8042AE + E45D1617393ABE54B6E3FBAB3A6F057C05FF6D9D1C28A58FF4C52469E31B63F9 + ADB7EDF1905F1997BD09927D9B63D232C631F1162F0AC5E87AC2EDAC89790584 + 7502E04BA9BBDC677B174AE0A391C8165BD72EEFE0ACBBA91E7FDCB7448D188F + 19B94DD258B2A4E1803EC3F36C36313A2E56709668602B1AE95804D6D0FC17E1 + 6FABF07B0406F99A90496DB8AF1C10108B7D8496723B343FA78B1269185150E2 + 55147C6D36CA7CB13FB82E11F4CF3728C9F9CAF11091D703EEA811A96EC77ACE + AE19DF31933CA2C6C7DB2259B86086D11EC3B4139020AE2B0F6F48FD6E443C30 + 0744F452B922162D5BA8DF17DC6ADA2A3E71D08BA28A2BE510741DCA5A66E451 + 5B9EAB0E6FCC8E64BEA12E579B57AC89FCF737AFC9434FAFFE497597B9BCE237 + C66090F2E19D48BFB4FA0FBF0B14DB6C61228DDBA74EB7FEE7EFE42ECDCE1C90 + 593C2932E729D8C8357E61D3632FFE2C244D14DF8AB68E67EB39D1D251506309 + AA3789A2BD30752F696BF37EC79AB8F149CF81331D60E9773100FF4BD7860D12 + 5FDA98483B1CC148A06A28645B809A0CEC676B6A750B775A4BF9F8F337B4D899 + 65BF6379FF2B60E5F1A0E4EEFF1A64E048AF1B48EE00B880EF22A049950C87D3 + 2B553330465834217885838CC588C5BFCEB6B40DCD96C53D49DABD5B8E4E33FA + 187FE417AB8984D8779462DDE7B937A5C0CCF79FC58564C0895BD3270C1425A3 + 2087EF0DF2123977FEA40682B2FB23581ED07946B46F9185428A83A8C45A0DE6 + 091510DDD99A070FCEC9B6F9AFF77E2FB7CB294A8C890DB56A8FCDF7BFFBEC40 + D2BFCF285A8945CBFA76DBE7AE9F1538FCF9F218603E7A00052A1FD829BD2527 + 455FD00345531CC6A1401802FEA77D3BC920C9F3EF0B1735FAE3D0CC05808992 + 86FF7512DD5D31243A374C3218CE45580C2C0CD0F36430D1265B5A1D228E2BE2 + 9890A63B9788348E99E4569929F3255976A8B19D75D98FBF49362667664CB554 + 9BF9097A7A69FD1BEC5FE8B06354D8774C892BF5E4883F56DAA97E374C7218E5 + 444DF1A854A8F0C252BF1945A049D525F0C8FB5F9107A12DD70785569FE549F7 + C55C0D1AA1C1B2B510456EBFAE3B5BEB62A5083D31524A0AC3C7650220F7DF14 + 487B2BDC3A8588A8B023D744232B2F159396FC36E88923F603E7811C4E3EDF3F + DAE09B49D3FC5728845C661A8760526A41E9BC2C16BB7F87F20B25A521C151BE + C22768B3CCD89E37D8139B16030466C2F3266C3FDBCDCB5987EBF3ED998B6E42 + 7F4A9AE964D1AA8C5EC965D4113FC30FB127681B5E6F8062F70B453B60C680D6 + CC086586A0A871A6968BBFC46A82007A4E3F54211A93DF787BAE746D7D74D9C3 + E85617AD96470D171A560EB6A02890C7BF7922504FC8F530B2A9F93B27DB6E77 + 1492452242199DA5D2986AFF1000C1379ECE946092B2D8FFAF40666B287F8495 + 9A79463A7C4699B81965B5ABD65A2255515489D53ACEB6BEAB5D53B0C14A156A + E726A3ED630485CF3CE19FED00BC82D0C2D0615A296EEE8EB57E39A7475E660E + 808F451A907C6F82F415BBA6BF9715231136ADDCAD736851FD15AD84EA908729 + 4A07A7968C342055AAE50E01F9A774430F2B6F42FBFD917C356AEDC8DDF5D080 + CAAE489ED8C224DA39B3CA7FF1039DEE0B4F31F62811518016C8709CEB089349 + D32DAC85AC936F6D14C3CE29D1583DDFE1CE552162D06C2772E015379DA79991 + A52D6EB6B2B348D9E0F2EC65FBB589DAE68DCF25FBFCA22E3806461693E3E6DA + E60F8A8F8E1D2981CADC095FFDFC9FB0FBA8A90A7D08788A6A92068BCE6BAE8E + 64B2EDFDA0CC1A5033DADBC21177AD74F574F703883E1FDDA2971AFE3633D2B5 + 202A0304154C32DBE392F145ECD2CC400EC5DC9FE7483C5312B75628366BF1BB + 946CCC292D1CFA2790042DA92B9AB89E7EB405330043AEB7FAA4A5DB44EED1EB + 9349678E89DA8EFF8A2C5260D1A62656B79899C54883D90EFD3C6207CEB6383F + B8BEA09C166B3605F69008BE00D33E7462C98E82F8568B574697182B273A907B + B1922952E3EAF6B09E3FCCAF1753168A0DA6B20D800EB744F3F15FE88B4E17F2 + 20F545D626539FCCAC6EDEF669CD655662D652BA109E4F4860069D97C7878DDC + 4620C8AA5D9201EB1AA3D452F22DC65C51F3467EF6A69A9869EF17E721CFE506 + 084102E16E4861792BA86006E9514E2CE86E394B3584721891B7C8934C1655A5 + 91E3F0F423427DD19F19D8B1E6AEBF0354335DF49FE02E628D2B7F07AC4FEFE9 + 8CA6B96F9EFE5A46F58F91FDCA04B8520FD80B36688686F8738BED7E2DE9F915 + 7AAF8891D6AE0BEC7B5F340E2F83699812CEED19347F2440755B6B341E4F6581 + 1BD09BBFDAE99933B058948BE7D813E2988674ABC6434690CD48EF0E05FEEABD + 31CCE1D7AC5B3E53CE22877BAD5A29668C470F05DD9DF167ADEEFD4463FF5A55 + 3B74037CA4B3E62B130A11262DE53D5D9FBC6893B1F61E0D44AF5E1367DF8790 + 9C98A2B595D27B5AF420E02D961D3A75A4032364289AFA122367506D2B87259E + C54B83F46DF0F81563160383F388A5329B7532CD78263E7E823F04ACEBA1067F + DED6FC120EFF49FCD853F51D460973D32BD3E439850D86C752CCCAB7811510F9 + 22159D8E047846CAA424E1E6484FADF8CACD1195536B80F7B8821CDC623A3CA2 + FE79604407E645EC3D796800BBA74ECBCCBD774102A498827B4964F2640DECC5 + F36DB43B491C4083B282E07E87AF6B150E126BAB097BAB48F3F19C6FE0E09C7E + 5D44C148681BDB59767214ACF49DDC648CFE00985BFC3AC5DCF7ED60CC4A6E7E + 26F37EDC01CD9A11D38F0BA8F3D2C28FE60B85A22389C384D632A6F462089FED + F2DDA2EC8DC598A9FE74CB159AAACAB1694EB81629B3922A5847B2BE91C97738 + 771F3A294199F4D645F5584DCA1CDE915193088F88B17FE379B8FCA4788DEB8B + 97FF98327E1835BBCA0FA10E6A8E7AC1BBDB92AA3C0E2E8B2052CB5EDDEC91FE + 6142261328A12F74209CBC223B3CC1DC538A47B6D051BDBE4532F2C0070E99CA + 4E712B833894A79F6E96D7702BE8BFC7E2020D1845737E67080FDB27A089ECCE + 6A2DAE556D0A2C850064EE067FF012B30662D5F2C99CC48837D83FA20BD9ADF3 + E433619D0AFD513584B257D5566D89C109B37286FDE59490AA8034F9EAD60A94 + 43F365B42D269F39DD79B12FAA8CF72B9AADE21C0A05A74027ADC2C31B53B2D2 + 49DD421AEE56BB221D223AC1393B7F333A61E8438490E94E244FB0E9E4D72328 + 656537E520EC59BA3643BE41ECD548E3B29F6F03474AC8B7643E22CD69532DF3 + 459038C4A6C06E5F9BC261C7A78FE86CF4B35562875589379771D1237C2187D0 + 0AB27937E84ECD9B5FCBE984706B9E66E22455F1F9604FD07B6970A184DFAB33 + 56591B67ADC13821EA0F42CBEF82966F574CE1A5A1726B6F867F739E3698D3A6 + 73D7B618ADE471E8BEBFF45BE4ED9D0CC70FFCED114AF8792D25B679EF5630AF + 2099804108554CE001FC94880A494B67134F336B53C24202A9D7204ECBC65B4E + 6A0C75A3CFE1F1D282BEC4D6F88E378E6058FA334091284E99381FB6B87F8B81 + 4ECFA44AF3EAA047BA6003D50F60E36F0BE82B941E8C04BA9FA736678259F976 + 0D01B6B91F7FAD053563CC9D4DB263644CEB8C071D2BAEC7398D0F555B877963 + BAA008B357F4B1F300069E9679DDAB50F9614AD403D442AEFD83C5AD1DC005BA + 59654B6ED0B4DA041B8D49046B8F8BC59A042E80806299D01340D792E92D0315 + 7AF4DC96AAF65E1119E28DB741CC8EAD0843FD28167BAD60860C8763F2258155 + 05E4684B3A7AF3766F1115D1E3F89CDA946E798FFC87C0CF40C88651ED6BCE03 + AC08651067FDCD879129D8A191A789B8D87ECC89A73B78C0F0A95C4D0A957362 + 4628AFAC2F8BE51D1B1773D64FF7572EC5271D075A9E9B455CDD835AFCFE3605 + EB45DF68DEC50D8109F6DF28E3D1CA6BB050BE6436B48B72C72A71513A924D4D + E3723BEAF87B2CA32BB94CF02CA405976BCE483959EE1390B6F5ADAD581C1BEC + 7F6FAA9D19148F83392CD6BCC05BA14CFD3F58774ACF4B0F4EB0BA580FE45097 + 975F01DF0FDF617D0D0902521A92AFBBC537F6F46F53BC79959B8EDF4972F733 + 4959FD5F94A25437F45A371AE10DD437CC6B1FB908C5E3FCF90F9CD134EE88AA + 9166285041A9CAA606D2BB858EB8A9A0C9D86CF6D8801F3D6226D5842BCD6D69 + EBEED1A3D53B564E4B94B1354A53EEA8E1DA91012EF0A8DB1F31757CAEAAFF59 + C6215D166356A0C6FADDDE01528E1001FB89AA578ED54EB0159989BD8E6EB193 + F2170470CBE780E70843F65A777E4C4E30EC2C54F4C281C59D0CAAFE5DCC0C03 + 4B663D3FF0A2FF68D25B94CFF009DD0F7528329D6424690CDEDD3FAADFE7EA05 + 5C0DE6D645EDD3AF582DF3450D7E79DE1759E5914A1828BE7E5229DC36F31F0F + 5EE2E5E7496F1C1755A918947F4EA8A94441AE2914486B8F5FC0FE6891FB0871 + 884C3B3C047B4EFD3559BD3D1726C7F8BCFB614D8C3C47ED68BE8E1CAB2D0E99 + 97D354372E6A112083781AE023378030B0F207B6EDDBAC60A0F2AE1C62C1F46C + 9C51A083DB7F04DC1BAD29D4165B2BFFE451915836E55B64146ACFD8AC9D67CF + 9CB4AAB6A0CBE35A4BD03659399D3A615584A08E7C12A149E6E0A433FCC42016 + 266F8A26755E8D7A29445A3A5E785C45F4327BD3BD34E13D0CF63C4129BDE2B4 + 5C1D0376EAE7658A04E804DEFA2BEE2271B43BA2DCD794C4BDA0D9E833BDC925 + 5ADD649B82955A216675D87D8FAB75A6CFB3210CF37669F2156007C514873736 + 0F7933901E1857AC4F9C2DBD99CAE3104FB4D0BD81E072802F2BCF893DB97092 + E6EE28C8821701122199018806CC38588EAE24F1BBE04CE258C42774B0457DA1 + D541F46C83659B25B3C7932D8BBA40871C6DFE686665E768F9D1FAA01C97BABA + 04D407A6320B001496E068898FC3C33B8A557FF6E8AA40FAB528FCCF3038E576 + C5818CB86BA7198E4CDA922DDAF319C9F8889CB4AC5A2E0507D4F3BA9E684CB4 + D4AE82C90E3C55AF6E5211FF8A3E3279BB8F485832D8688A50BF4D42BC4D45AE + F14332533706155638DB94B076D1ED65D62046E2462F06CC5BFF9B7C1134201F + E5500D35CF6A1680B551DE45ECA52DA43CD2639F0456DCDB4E8CECE0425798F2 + 1EB9ADF95E529F01F1BD20A14D6222564F27E76DB0E27519D6DECCC06CBB4946 + 8319445F33EC6A3A8703370B568DD0391E9F95CC34C5EDA2240B3876FE7ADBB5 + C761B1D33A70DB5DB0D9210B03AB4D35981DB1F5B1A7B7B5AE6BC6B96405E185 + DB8106D1F41E971706BB9418A4EBEB712ED5CF5D77C9451533270B2A7C814547 + 8CF7DEE7FB64DD8EDAFC579FCC9AF43512D660D0C9C27B78017142E1233351A5 + 8D5F8F0B53CA613F834C990BB47AD38C19B55DC5AFDCDC329422B81C4D6F4AEB + 5A6332D12EF1F994E71E2715D043833ABB0E093D604B926E0557DDB69A477480 + 48BD2C008B21B92CFF7277F3903A14203C750734F0D466A4D5B3FAD797904459 + AEA8FCF9F4C924DFC61DDD935E78D1F8A3C932A4ECE9CA519E995CE991A92BFF + F12CC5DB11BC845B41948207071B3E89852748FFC34862C1DAC51924AAD20AC4 + ACDA65B085045C981D81AAE17AB65D60DEEABB2F420168ECB7D0AA8764D298D9 + 296BABA8EA2A9A27A0D87C3925946DD14211A959651EC3F658E5D372C4C37A26 + 8B13ABD03047FBCAB7BE046E69C032C4CEA56ADFD202D1EC3FE12F33FF267A35 + 1039E28DC6DD6F31794C476D64F401AAE28FCB000DE64C0B4F7053B6ADEB56C7 + 17316AC3064C7CBC0EDC78D98D7D82BB630D51E3FA0D231731CAFCCE5978D354 + A9C373494F45CDF9105707F7C6191B49607A2E64DAFFC2FE648AEB0AA0650207 + 29D6BBD672C2664EDCA914909323C47D6A4EC45D209DACDBC38A31C3C9D25BAA + DE4CD108D7FBA4833956713514F0D8202A0FBA388684C760643CF9D1374D405C + CE1D51E3C8E8868F0ED5CFFA6F3E3A204013C659D19DD4D548EC3FFC7F6DD34D + 91AC9CAFF89E98D9E3CE57512727348A720C98CDD3CE66B859D526CD55337D56 + 1ED91B3AB212CD77037AF0C3B8173282BD99F2F8EC82DBAD39E3B71ABB3F5BD8 + F373BDEB5E3627665563255F0D8F205ED27A162C51F26D1B4576FF441D98EB9E + 6933CB3F741788EB06B8286CF43BD1F39660387BD735A2A410A02E2A84E61DAB + 1EDB0444A664EE6EBC90CCDD866B0D30EC63C3B7C4A7597CFE0A77943D8F7EB5 + 9760C5AC3BF48FB66D893F70F6B15F70692E24D3AC2B8D22278C44D8F2D6E20A + 6ED89DBABCDEE5397C8F25C1C9FE96C5C71EF8B434C4F83CA8542D8C421298A7 + 29A2C3486B71E0835CA4ECCDDF7F85AA5EFD23B2BF7F146155F97FCA5AB364D3 + C7BEC21E7AB1CB94091837B81ECC1E980C11E487BC7DA5F28B37E18D0EFB6019 + 4A3243962ABF364167353775AD96B3691820BB85F9ED3C5BAEA7E91B634C9675 + 99FB33B89262BC5CAB773B34AA7ED222DB03A2374BD32393F1071BC876281A2F + 8666C1BA35BDF4906D5540B6E624D6772493517878A60D76332AFE7CD5E6929F + 223A72533A267B30BC4011BC9DF053CB0DF538213442A17312E11BB00142C06A + 86934756FE93F9D3073E3FC4DB904477FF391E4E319525FEA19BF00F25F56ABF + 21E5537B8E664F10DDA138A614F74C238E06D7C82FA33A2A4C21768C87345ABB + 23278DE80629A2E88E64017118E37E5BF92FB5B2458BA181E713B6290A5E2E57 + 5EFF0C8FD9971D808FC76605BB5D6C03E5FC2E3A4734562CE86D2ABCD0AC79E3 + 873B9CC4D05FCBBA5433B7B94BC81B6930D78053C1BA758FBC4BBD990D6A5AFC + EFEC37E6C92609C51EA9EBC95141EFE2189A014B0A40A93EE26108E58A44D0F4 + BF780E1D8AC03C428C760C9E76757F3E4FA8CDF717427F887AA7CA04A33C9B4F + E13157136B6D19C2C0288CB53269629177B6E3C956DFDC015A744D45745EA6E2 + 0F133400F685D829AFB5453F4809245E393EC56C5E18E5C1904778BD68F922F7 + 3AD0211853C1B9628B347CE13364A91CFEEFF6E913EC131F8DA6A04065242176 + A60E0A6719DC0103374639FF1551D29B3DAEDC04172D7A34B06C45DC66743AC7 + 0D1A8E44BDBEF7DB3638438E8C9E262F784CE7686F1E64CC6E6555DCF0C92768 + FE1890A2723289556A16A3502DD109C14E46A2FA8DCC44602AAD39F7EFE13F66 + 64C894844F5F606A817795714EB5A1D2D6E426E51FBF7978FE261E9C79333FAF + D372414328317AE6AC4020505BAC19233D77222AED2F67755C59048C7D41620E + 250CC2D36C15830AC101C28FC37C5E89DB5513C1928A1C4F958B7F1254F00EEA + B380482F14C7627B33EC91EB950186154D595F30A491EC6A6C7515B72A455637 + 4EEA74BF2D3856808DC6F53F0DD98F099D1FD7AC7392CEC0CAFB85A28F344075 + FCA511F6C810BDDA47B1F0E3C201ADEF0A613804EA6F354CFE6A279A03CE9EA1 + 298FC21C45C4811CBB7774F6AA5AE5794C112DC54AED87761F6DB83C79E67C7D + 6B8B625A6912B84579D343CDB5475DF1EE591C84A0CF4A23353482BE64F4627E + 7DE706449D005A254BEFFBB2DE2D2B077A6CCE6F2C65E5494EC7C3CA67FBF836 + 335CB56E048B01A1ADC9C6CF65FCA9C06AB4416B45C16E82DA0AFF75B5B590F8 + D5BF0FDD1DD6AAB68ECA8924ABE24F27981AAEE545EBB0B5FC59D14996FFA893 + B53C6B2A16DFCE9E4CD9C0BA9B85917C77134AC6ADC8AE29C2C1068ACCDBDF15 + C6152BF48A195531431E1E1D0DBD13D8E196E435C8A63C8148144E8C02B8A297 + 211F842BBEAE049A038A1A8E4B66092F31E3B6DB3408E0382F54B6409BA8C3B9 + 7D0470EFF1B2BDAE6E1FDF8E077DEB18C857B45E21C8BAF4543BF1F53BCA93AC + EFA462A363022E2EF1F196C4A8AECA836058A213ADD58358B625816FEC8324E7 + 7D63B3AF2775A5D1CA41D9AA824EBE0E1CBD48ABD7CD129A0DE3508D12E148D4 + 7CFE7D5E7EF8620E66DCB65400BADB0BE36425458CACC5CB90705824C9124461 + 4B440B4301123DA5D56022B4239F57214C6587E4422682F0A72F15F93A39874A + 4E096067967FABCB9079F24B1DED47C70E575C7C5538B859068DBA887736C026 + 78B84AF6BFE2E05769FC9F0A899B0D6DCC6E11861F879B0D315B249F284E925F + 0309ACE966A9B0A4B5D2EB6FC570CF41CA3B2B98FCE21958435C8B625012D37F + B44FAEEB62DBCC59C6D129F71EE8A0E988FA34961BB1863FE4EFF4A86110AE0D + 726C18854F35E806B9E0D8A8A2686228D0805FBEC25F6483423AE6E447808B60 + 3C86207E94F6B311ADB5F35E1B91CED27F845B4980D558E0081D0F1CD2E768B3 + 4D8CB623FC05D1BA7458B23D98D4292611C0E61183890AC3C87DD3BA9A62B024 + 2E60DD5E4660652345F86ED229555357A06123F1190CC954671884F1D2B81A0A + 201BAC968BCD2084831A6EF4A85601EDA64DC5200035EC8DA637394F38EBD9D9 + 6E445C4B95B6736B42A0648F11368B2C1C6B0B801586E34F8C28B5C21702F80F + 333EE81CE3A92F47B491A651224C05C300757EA8E26553BEC5673E9823FE2D06 + E3C9323AB1211FF39971FED4AF62413C98158DF7611A391A7E20BBA364FA787F + 4A7C9F900EF946C05F5DCE4626A5399E4DA47A3D98DACB56523E3573CAEA62F2 + 1395330431D9D5208264D8806C8F27C60DB0A4B2E239721F4E9572EB10597632 + 764A7E78B256070E5420C4FC85ACAB93C2AF0653668E10214A7922F2943967CE + EF83F543E06703859FC71808885A23A63414F494F1C16A1ED27EB974E5AAE965 + AA947E79544FCC3825CE0BB56C70EE2D04793E94A15882ED2F97FF33E689BA94 + BCC7CD90F4B949EB01BAEAABF904649FE3C58AC834856ED8311127D6C42A4515 + 1758E3B73D82D5E859BE7979FCB14D45C6C180223ADA127FE54B066A5A1ED6DC + EC00CDC83DAB49108D5D9EF92742EC14D47719B0DB5D82A63B9C462B2AFD38D9 + A5B71DBFC72F82DDD1177AE6BFA0568735D57983F9FD9F23E33D5156ACE336E6 + 71A7F9AB2FDD5C867A742A5C953F1B444A522233146878DF19F86C47F3AB39C5 + A2FBD8342C5F2C3757400BB325C5219B516C63F33D023EE882B7CCE8F224DF69 + 68A68AEA665F3A4413A8E3877F3BE11B624F71735928996DB1B93766F8BF6C1A + 2B4C8C740862707E5913DD6691E4D20267F222EF50F46EE108C35A4B2E0C5739 + 89F6B8FED1C5B0565C6D0C3018EA0F0703DCEE34290642914B0DCBCE66A621A6 + 47C3F103499099488E1F3B4623746950B613A2AB5178DFCD407854E556A41BF7 + 04267ED8DDFC5D4A692467B1025C570715917B936560DEE5F91B53BA55EE13F4 + 0A67F54A589F2BAD640235030017D05ED32E332DA06B599DAB69EE2DA3602856 + 03DAA6DF35A3A4AFCFC8CC1885A3E448A4864A1A8C9E38E24E86B98E73F04981 + 4BE6253E896B606C0CE61D65B4849C20D9459CCD9BDD17C25A340B55FE3A449C + CA7F0A09A6CDF4BA9FA2EAF253A4CDDA717D6974FA4C61A6ADD465FE06E53035 + E8577AF00EEA5B2763FFE3C7014A596CD4F9EE44919F95B404291E462E154D97 + 7D0C0C686E637EFCB3CB8E73CEA4EC6D118A3CC5668137E17DEC1D4EEE158688 + 7AD62667829D107FA7EDBF17B7BD4925CF8D475C0E52FE8A4460A52F5EB831AA + 5025B23F6D6B3F57A0E2E509A356A93328E86B6C85DF8872BFEE1CFB7A9461C3 + 9ECBE1B116001F23465D803B9B87C111C669345101AA9B824AE17EB80916326E + AE3B4F5C2E04AF8BB4596860A549BBF81803658AEDAA96A55EE0C8C8DC6AB9A9 + A7609AF4394B57B510F31AE295C22521EAA9488C132903C6D3B7C1B8ABF25C64 + 9EADCB68D02E6590EFD05FF30C6B8D8BA9E0ECC2F1AA6C7A68BE0F46C2A41A62 + 4445E4AA736E008814E8C55B022DDD85E985CD681D8A1B69542F3B0E9009B53A + 902C93823BAB638B3103755A48B4588AB8A72F109C6C67B5168C0763C27059DC + 1F60D7863AE9AC4A544731EB64794EB29A1A5CC640F3A614101823B4645DC0DE + 7DB420D32D0230E0FDADF8F2FC8D0310898CAB70A620AC7B2FB1B6A326311893 + 99031C8396B6511E21154F9C3971B78BC6B20AD8FB1417C04A309B8B5CAC7649 + 72C267BB988E285E5325AFC05BE59E8B816B337D0CF840DED8A26CBB332C48B8 + C02BC87ABC32C5F08F1BD1071F93E2A0EE2ADEACBCF33E689116F4CA9609B067 + 210E5482E30C3D9F0B154428FED0E13137B6B3B9E2AD4109AF39228AAC8782B4 + 2A84E22273171E969C7E408926E52A2B96152570D275A18D31F7C109E857EFBD + 64F1354AB5FCD767B50D55687E07F3026561F397FD7434DF9270862912E041F8 + 902064FE49E46258EB99AEF254B4E3C99E2A692A23C4E468B82877666C178F4F + C8ED4201315EF9B66A3DD93D81A1B6BAD7ED7B001E012A64BAFC4185560B0F75 + BEA48C7EDFB4199980BCB8073CC8F7CEAD8ADF1A68FA2294B6A884894EB02474 + 54F7831C4DA63758F7B7DF35E9D692522C5792AA834BEF7320712DB967D144B7 + 4897640A0B62D989C2836595D83E76583239F3A7D0F2E089C6EDF19E4DC018E1 + D0F5D7BDD8F2DB164155AA58A87FF275494918727CE8D04D3EBB3D3061D5B0B0 + 9AAC9B6FA98DB4608DFC9D4F4069CB5F1E4401900B135712763F8DBA4283E154 + 64D1E3CDDEF09C6DBC102C4CA0551E6DCCB5EFD78450327B096C6A8626C85218 + 742BF3C75800CB27E6AE63D3AC4880B246DB9583D4F2FFAFB1976AFD64391E08 + CD6D961F095FCAD9B14E63363A67BD6ECDA0D065032D021FEB6C612A61EDD50A + C15388B62536511A19A82B84E87234DC46BC248E60C5E0AE96CB0B92BF28A8BE + 07EBF8B0C55EB70CC9D29A53407A1CDA8E5AE1BE5B023FB4D6A5635B83821573 + AA5CD0E779F30D0F828FFC2990CC92E598340EA13910D2C0F1B2A96DEA9A0C5D + 0288428FC80268B86DC4FA2F0965050A709D57AF6DF9CC889FDB8864EDE545F7 + EEA233127E2D18B01A95FAD8B277B6A2300F6C76F6C0980F116F84A7C6011087 + C307464ADF91335255FD8A11FA0B0E661E5CB89886E95D3834E761C872BD83CA + 2D779B51B0E328F2C12C1298425B3FEC42BDD452A2D9ED78AEFE1042E86D61B9 + FBF9058AAAF60CE470C405756E2FE1D952376D82387CC532C60EF2F2EEAF91EE + 68FF258D85F18479E20DCFE517DA3D217E36AD6999AD46AE87ACA434B691240C + BB20799BE21224950B39766B39D36F95B82CBC99E6AEE2AAC64BE4E65CC3208B + 29D6804BAC78B4D4151349DFFC0D70393ADCCDCA1BEDBC6AB7ADC0BEABFDE2E4 + 5092F34FCE1D75EAAC2850E04786D89B98138A87BAB0F8827CFC7A560DC1994D + B2DDB1C9C3FE7D2D194CA9AE29279EF3B3157944BA742C5351E590331E72F809 + CB048AAC041F4B70B8FF9B9278059F3802878B8AD03C14976B6DB6B357BB32CF + AEA302019CE7C268F9BE6B54203E07CE8D6C9C3B41C60B64D77B3A5F22585F2D + 5B950E6288BCD0F49DFC228BC8DB9C576D3D89BE55CDC890E104CFC2A7CC2838 + 5211FC6610D52699D05FE917846535D3712A67B7B4BBBF31689E344C62F28F7F + 8F56A23D2B3FFD7B606EE5A327D0DC126260A426CC0C108C6A327BB3A37F1BBF + A6003EE764F01DBEDC3E550B3EF89EB0FEC675A3386DCEC17DC6FB97CC9E1A63 + 79F21F77656DF7EA5BD818BF4373FDE351DED5E3B688E365331BF13D41D95FE4 + 92B749974755CAAF7E078F81D1422A78DB14AED7C5CF69C8BC60B2C52D4999BF + B665FEF4D44F903DEE6D734DC9A35D0CF065F441E33BFFC2142B7BEA99ACCDB3 + 5F0EF390CA3126B11AA308EC966AA3A3CF7C9BD029788C6E2155000734ACDAD4 + 36834FA4A5D850594B19B3E69178C423F921DBC2FC8E63529276BAF3ACD132FD + 87DD28019FB96B6F59EBD4F890C170B6E45A6B46AF6F03A6CB76A49B8065F392 + 7E36AA50D872A9E0DEF0B4920B5F70BABE350E2FD1F8803238949E157D41CADD + 9474A0E10A9632700F15981DB84948B470AC218A5A960B3BB7EB71C3734BF37C + CAF51EF45EC3AB1D444F34D21F59477750C5B5E7848499EBEA36D95242EDD92B + 4B70CED0BB89595B1C5A4ABE99C928E33F9FB802B7E03DE033A61A2F8D3CF63E + 14266ED62BD57DCF0F28C8294B95397E3501EADCFA0B6748182A79B00342A75B + 803C8DB8222C43412D72CB0535DDF3FD540BF19AECD7164C1644B648932E8E79 + FFCFD3CA3428DE8C3E91CD1CFADDF780733FB3AC98F3A975A92547BE3CBFCDFF + B4331AFA735C59D2E6BA8E20082414B528FC2D78B34142C2CC3DEE0D41757517 + 9CC54B2C8277C3BCA6664C3020D69FFABEA7BD80BE64A7EEE2B3FF1DDE293343 + 2F4E67026111D2AA89E8522519C07C15712D3DB72DB8E69E6E947A512D8313B8 + 354496C7AFCE3F74A16FA5089A98298DC4EADDCB7B8E86FF52F0D4965E74BFDC + 7B5804FCBB527ABEE658284281D082A06827393159F5A70CC798269917513A0E + 8BE1D8324D50F37824027F2E80C476D8C194BE88B79904BB51EA5571872E4DEE + 919460C00A40BE20280726EA86C9469BD2E7C5B905F81C791401D9D07CA04A10 + 36621F1825DCEE7F7FD09561274DD5DF5532FBB044F9BE0E8E0F4D985BA847A5 + D8640B5AF2267A66E98CCC2E136BEFAA7DC03B17FE1F95ABD2561824BA6CCD73 + BBACEF0F8614C5A1F81010DDDE7DAB4E3D360485813EA0E6810C0F5C2989B875 + FA588D931103CB7BE93A677CB9C975612861A01651C1009932A9D151069E51BC + 479F0D1D74F58BD2B5CC1B83D70A98E5E1F0EE53ED717A4BEF8AA247BD032F75 + 1812FA3A644FCD833A3BFA65793300A79A7CCD08FD4EEBC2158572FCA6FC532D + 3A0C391002F97A8308135E051B1FCBE1B070C417DFBEB8796722A1A14E3E6D3C + 6139868843EEF4DA1EC382BFD2A14127A0D9847328E8C23FF57EEF32CB7F7A20 + 06F65DF4A6B38E4EAADB43A6859E46724AFFF9AAB9E73347A1C02B8BCBE215EA + 93EC400B13DE4D5358E0A0CB706C6CC935CA7C8104066F9E81C55F53A1334DF3 + 2FE19B1CDDEF52F6AB729900A6EA6B7725F4BF537DC8124BD12FCF8AAE826E8E + 6C35DB3EBEF0D7B0EC746445EED004ADE24D4E663020D32AD273B46F4E7BFA1C + 6E6A9A152366ECAA15BE911A0D92DE538165405457CE0FBDF888C082523AFB86 + A6546D070F9BEA54FE4CEB33119183A907206113D3205B0EE82470D81BD49253 + F363AEFA109478E653FD3950A896D2B906C5B3B4A45ADC8850CB7B0A220FABF5 + 54C8B9E5A44349B409A57AD85E45417E74D97D2D596CD9E1F3BF24A6246332C3 + 64321409F02C84BA1067AC7FB45344F402A29FFCAD9CEC28DCF49C56B8F4EC63 + 8A7788F4AC2582892F289473919B575AA72FC765865A0C7DA00898AE099163DF + C7D8BC3AAEE07E08C4FB36D8A25728A39C849244F85A95D1359B0494EB786A04 + 986C09D1EECDB9C3F3ACE751C1555366924DB9B5A1044D1DAE16DB41E5A66E1F + 6A9579136363BACE2C1EFF5F55A8FDAC9CC4475E43C363410649F0A20654D4C1 + 915622AD5FBB48C70E09AA97E32392E33E08A5456F86D4036EB14B2FD1D3A67F + 52D5931FF44F8B835852D78AEB4C0F9F78A4553B44E932D104A434BE7B51EE4F + 643F17A66074FAE81411FBAD6A322EE8127484AB55B7DEC19B1A81F312F6BA45 + A01C9E1B06067D2B842754B636F0869B17CBDC1A4454C063F0B4A010C8DE95ED + 7CE8B314C38935086AB9B52AD649E82AB0B2E61A6DFB9420259E19E02F19B959 + 82026DC847AA61654C992540A5502BF6CF88CE08D22E80429764AE298F99E4BE + FE73A4BA4C4E31B883F5E804759770265B37B60B1593016F545CF833A72FC294 + 176ADC3D3F8EB61237B800E6797189C1ED790DF495F93B2B934BA323251E39E5 + 1AF43FE2F671207BB0028316CC85491AC6D5D37E4E3736FE6B0BB45769D9DDF9 + E1A559622DB050AB826DE48B31714A215F002B2564E27A83B6FFE4476520A647 + 625ECC7F00112E22AC3C10AD3EDF1C8860484EBE7EA6417E4375032950310ADE + 91700C0C173DA0E3D277ACAD119D46DDBF8104B80C380DB2FC811CB36873C146 + AC5AF37F127E8951F5CCBFD2876694B17F1FD7B07D6F0224909ED53BB1A338B6 + F80E40372E3744889CCF039923BF56808DB3DB61E8AAE9C1065E12E5E9BF2D0C + E8010A6553E1737A45A70240C566443CD63C61EA74A7EB5027A736C9DB46AAA9 + 4EDDA02B91D1ECC7BCC15DF930BAEF585B591574D1A795393DB119B5FB7A842E + 218A755C497F26F28FA23934C6DBBC940FE7981AE79CF00DC981BDC38000E89A + DFD1D99E489D4DA1A4BA716228E8C5CFF3D8A6497832367C0D02D13F6B1A6301 + F045427A65DF558F4527878B85CA63F06BAD303CD3C32F8DDC91D1B86FF35971 + A2FAF57B9FBCBEFC2B7C712B40E827893F11B8807112A58BBBE054DBBA4C0E93 + 8F1FD760CEF12CED1ACC1F3A0F5059F4D6730EC55486EF677EF3B836EA81C18A + 9FAB77CDCF5A0A031EDD4A37FCCA3D14E00279131EDD981253D080FA53882F09 + 350E7DB7B1487FB2D4BF6BA9DCE16E11D3D931E751233EBA8C0F35E2EC39B891 + DEC387C15518335041C66893B36C3B906ADA15CD8F88C99067285035290EB087 + 923038071845392B07B939BF104547BE0E30C51709BD9AF240BB686DB007A030 + 6FA3215F7C3E9DABC3EB7D4B5C789EDED99160730153E79E635BB5B8AF28D8ED + 093A3D6611EC565FC7781D14B3887FE201995D2F675F3F597EB50A9BB3404871 + 10D931B6DBB34A58583247AD731DD9CAAC7142DADA64898798B7E3B784015777 + C2BBB1BD11B6B8AB327D10181E5E9D08EEEDBAD19A76EF67B089AD3FB787C7E3 + 6702BB51B9D6819335644121BC00CAD5932B081376A7B7CB077A463E3BACEBEF + ED0A3877363A7747676F1837CFE539D9A86204BB717CB363092BE3A6317F2792 + 8283A88DC0D616DB3AD97DCECC794EF8EC0CCE6A6AC71D6CC55E861B59C5016F + 7C47E09E677DE1594E4B3CAC9C1695DCC265D45584118A96D059456A0E226A23 + C40A3723BA1BCA3F2473F1B208CF063BC16FAF9BCADB81E418BB1D84A83CD7A4 + 15752DC74DE2001383B461714E14CA006D0F759E232076A4604DD7ED9BD43C36 + DF3480069ECCF31D5F0CADB0A852D1722FF5079B92A0455AC8B6700BA4B7B99F + 3A216855317502C4A79A185712FB21BF34A37FAFDF59640451600F948FBF2DA4 + F2A28EFAB8C5D153225905E8D1D3D6B6678DEC3D1026443C43F735AB36E74661 + 0FB4E3C51552BB730BF5CEA82ACA519747349D912BB85052D28C36B2487E7E0B + 287ED78CF6CFCD751D4C5624DC40690433BAA19A521105B35137A108981C5D61 + C1D45DC3657CA1CD0FD21B64619203955539C55B6D35FD6C63B0A567463086F3 + 6F3B2063D3251710EC920DFC4B17F4A1E8AD80DCABD55F8630FE5EBC80BFB44A + 8803242FADCF41C83594C027A690CEAAACF2F9C66140706EB5AA340CF6BED080 + FAE33D5A34F2E27C1337EC9C2EE942145F41A39AB871FC6D5A9ECDA765C25064 + 9864BF68BACE2A3C224C7BA23A2CEA26A6E0B27F9DFAF25A9396BFCED0337603 + BEE2F121CF61512330D3C74F80D5F5DD3E66F77EFD0BE20CA59E806910CC2BD0 + EF2E7612C1E91BD928492D9EF9FEFE59F251BAF4B8C1902AAAFC5B96D5FC6814 + 26E221B12CF20DDBE7DC22BD919563961A1BC68939ABEA7B365916789F7E9F5D + E7ECD22E99212568546E1A321FBA29AC89BEC076C9DCB937DE55F317FC2E11D1 + 5D497FA86D69073032D18FB553588B3070E543D91E82FC34857E5067F9363494 + C175161E060C3C30FC6FD85FDFB9D3DCCD0392B10DD584528A46A7310A9D482A + EA44701653FEEE8A1114E82E3B96103D00D59AA44470E9B68A9B3703BE92EEA0 + CAAC9E79BFEFEA4572D3CD62FFB896132656A75F132B52E5C7D28D376AEFD606 + 048C372F3C7A420CF263D995FF671AE5212AE6E1082F7A130A3B090D6D41B971 + A70E2E70F0585187CDF3738DE5029E6B785F6FA63BBC0ECA7534B94662506A68 + A69BF0294D1F56533CBD2ABFABFC45DD30CFC65585BA9BE092D87328F398EFD4 + BA0FE2FEF791 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + /Arial-BoldMT findfont /Encoding get + dup 32 /space put + dup 33 /exclam put + dup 34 /quotedbl put + dup 35 /numbersign put + dup 36 /dollar put + dup 37 /percent put + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 43 /plus put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 59 /semicolon put + dup 60 /less put + dup 61 /equal put + dup 62 /greater put + dup 63 /question put + dup 64 /at put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 69 /E put + dup 70 /F put + dup 71 /G put + dup 72 /H put + dup 73 /I put + dup 74 /J put + dup 75 /K put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 81 /Q put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 86 /V put + dup 87 /W put + dup 88 /X put + dup 89 /Y put + dup 90 /Z put + dup 91 /bracketleft put + dup 92 /backslash put + dup 93 /bracketright put + dup 94 /asciicircum put + dup 95 /underscore put + dup 96 /quoteleft put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + dup 122 /z put + dup 123 /braceleft put + dup 124 /bar put + dup 125 /braceright put + dup 126 /asciitilde put + dup 161 /exclamdown put + dup 162 /cent put + dup 163 /sterling put + dup 164 /fraction put + dup 165 /yen put + dup 166 /florin put + dup 167 /section put + dup 168 /currency put + dup 169 /quotesingle put + dup 170 /quotedblleft put + dup 171 /guillemotleft put + dup 172 /guilsinglleft put + dup 173 /guilsinglright put + dup 174 /fi put + dup 175 /fl put + dup 177 /endash put + dup 178 /dagger put + dup 179 /daggerdbl put + dup 180 /periodcentered put + dup 182 /paragraph put + dup 183 /bullet put + dup 184 /quotesinglbase put + dup 185 /quotedblbase put + dup 186 /quotedblright put + dup 187 /guillemotright put + dup 188 /ellipsis put + dup 189 /perthousand put + dup 191 /questiondown put + dup 193 /grave put + dup 194 /acute put + dup 195 /circumflex put + dup 196 /tilde put + dup 197 /macron put + dup 198 /breve put + dup 199 /dotaccent put + dup 200 /dieresis put + dup 202 /ring put + dup 203 /cedilla put + dup 205 /hungarumlaut put + dup 206 /ogonek put + dup 207 /caron put + dup 208 /emdash put + dup 225 /AE put + dup 227 /ordfeminine put + dup 232 /Lslash put + dup 233 /Oslash put + dup 234 /OE put + dup 235 /ordmasculine put + dup 241 /ae put + dup 245 /dotlessi put + dup 248 /lslash put + dup 249 /oslash put + dup 250 /oe put + dup 251 /germandbls put + dup 0 /onesuperior put + dup 127 /.notdef put + pop + end + %%EndResource + + userdict /pdf_svglb get setglobal + end + [/N10/Arial-BoldMT 1 TZG + userdict begin + userdict /pdf_svglb currentglobal put true setglobal + %%BeginResource: font ArialMT + ct_CffDict begin + %!FontType1 + 16 dict begin + /FontInfo 15 dict dup begin + /Notice (Copyright (c) 1991, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Arial is a trademark of The Monotype Corporation, registered in the US Patent and Trademark Office and elsewhere.) def + /version (001.001) def + /FullName (Arial MT) def + /FamilyName (Arial MT) def + /Weight (Regular) def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def + end def + /FontName /ArialMT def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 0 /.notdef put + def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0 ] def + /FontBBox { -222 -250 1006 922 } def + /XUID [6 44339 ] def + /StrokeWidth 0 def + currentdict end + currentfile eexec A0B00ED5187D9C0F1ECDF51878C3AA5CAA3EC70E14AF46 + F38884AB0522111E1FD6B5E292C7A7C85F79C8CF269C29C6F79E84099DF3FE97 + 919C760621BE9B4756D5ECC123E0FEBC7A1BC9CFDCE3B7AB1B118837C4B97C17 + A4A2D65552C37CAAD683D3DABCC09A36FF0DBDB89E43724FD10F7C1BE056E775 + 101008AD51C29014E0B4AFF4CDE74E1CA5A64E39C83FCEE568A997B7D0D888FB + 5AE51C74D8CBBBF61463B3A1C80032F9E9B615124B88BD716363A24D9B750718 + 4290A3206B935F4107372023D4CF18300B61A6F017E700015589C6D8BC7BED9D + C6B3584EE181363F824D6F1E3CF3DF48A631A54AC4E8C81536C1461454CB4B63 + CBA14A6242F261EBAA3F7955E7C1E758A77E93DB07F4A86D1667FD99BA1B965D + 92FFB04F46A8F81AA8F43A6205BDEBF751C54A5394DF443719D16B0AFBFAF01B + C9203F81FDE5B931E192C430769AD893C30126CA27135878D49BFA89AC71C990 + D2A4E8825524271BDF10C6FB049A8B0E7475BED9B44CD4C2B8104452ACF12AA9 + AC8AFE331F9AF9B0A708BBF3F45200395732639C0F92AB91274625421A93F511 + 6771881AE8715C58B854B88976701B5385AFE60F40E1B56702BA711ABED94473 + B72503CDC76C7C34E0A2298FE19357CA17DF344A592ED134D171E58899FCA9D0 + 62653DAAEFF8D71C19F6D3958220794375F07D635FAC19B5C16DE6D9F30A648B + 9FD57832B6804A07E3B1C5D6B07F59AC95E2FCBE0E02CAD0960ED6C98F70D7F1 + BF7885DD5F0B40BAD91171728FADDFD616EE8A88FC18B5C8F16804C16D7F6408 + CA476477EA76AEA7911801F204F4E0C0313B1FF1EBC254D7323C0DC28797B201 + 5A904335690D638EC2C45723DA891C15965F7E459C7707B5CA2F5FD3AB3E68A0 + 313986EF4BA1E06DA9EF1C961944F5EAD42BF3F30C93B800BD3829FA6254F143 + 6E9FAE87431D328C947B5D4518A07B8BDFCD64BE3F120FB418101229783A489E + 248775C96CCB00A5E65470D0FCBAF0FAE402EBD451D060534D8C0BDBEBB5FCA1 + D2EC726465F6E37F50D455AD5A00EF50DB61B78CD04FAB58973478F3D9301CBF + 6EA03071660EAD7CD6BAD616C77689D560133648C8F3CC438400A2F69C672330 + F046654B0C61443F393DC0B4F138C0051B027383B50F624D1B597BD5B6FA0F3A + 255EA0200400F6EA8C15B2BBA215A6DF7152EB6E1DBA4ACCD4BCE3511207E8DD + 13212B8B2A33C259F9AE30A45B338BACC981BE53D6AEC541E6DE02A15260EDAF + CAE20D543A7277E81EFB454532425CC074D08E1E3E066F4B62AFF15EF8F59202 + EEA5CAF47E4C5F55C16C0F6BACA0E175A659043E50A65B8A4CAACB535CA5BF25 + 824F7EBB192DEBCF59F80B8E8FA78634C7E0C86BAE5385477AE8BB9CF7BADFB3 + 05296420051EA5FBB7780324620366F20EE93A46EC5A65047F69BE9E82953C57 + 5C363FAB8A11C647F86C8FAA99FB3C21E2E9B9311A7F61CA453F919912FC714D + B64BF3D52D3FD48D2BF9FE81EDDC7B93896BCD68C3DA1CAA36D446DE08F14F24 + 881212362D63355AC0A4A4C1DE86F48D18286C2EBC5325387915D77D6586E10F + 9F7332A871D5F876C17998EFD998EE49A21B141B60E33C515464787589D34945 + FC6D3C0697E124CB796B6570FD477D0921D4B5C20DA297A3A5990F39ACAC22CD + 7C0A2E2F6013054D2306398087113AE376AF6BF19822B988FD14AC9F0D11A0E4 + 5B6FA61BC823D97A1BD3B4EAD9CA98A68A8A82A95731ECD22DB5E62890A468C0 + 33E806EA900AA2683E537994FA1CBB14711CD8934550F385593F10E49455D48B + C883E2923D91AFACD479F37E4502A252C407B0A3E0E91F083ED08D5B9EA01C30 + 9B2A91B3EB2B2A9BE3BDEC6C2F1611F5FE5B6C5D6F63E1007ADC1EC081577BEF + 25703376B5CB3EF7AE0B682521326B0602AFC8EDD3F9D29B6681B97F2F6D02C1 + D6B9951EEA1CD4ECE1D1B9030D1E8E498ABF13905DA3A3EE416995456B39301F + 1A268AED8DFC91A4941FA2E15A40865DCE35E106B036811366F5A809D7BBADF2 + D3BE3E66576E1CD5F49F26F48231FB265825D1883F5529372B539765B684408B + D9827D62A85A3223BE93705ADD0EBE9B209C4198FC396CEA26F3C39EEBDFD571 + 696FC4FF8A1046721B1F5A2459772AD1B1D73E8815DF6075C56D6CB4821496E0 + 6177B9BCB8D9DD8141264C9351D1CB9C66F3CA360C73EBC99CF256AB34832665 + 418ED547CF8AF9967445629E3F8812D72C9A1367AF724B29503EBD2709A849A7 + 73B145ED245AF6F558EF3C3DD58A79841D2D8072829B4354B4FB9B92511C1DDE + 4419ABE724FE38922CB46D755965EAF364546A8113725EA3F655A17D23B86DBA + 967D6093A61D81E7D891F1FFCE8555AD2E572ABC392622947EEF2B19F37EE7BA + AA23C81AA8366982D80AF6F8E800DE29C5E9E9F27EA194D5DD0B05448BEB860A + 0F1F0A6B21B920C11019FCD3C7AB2A9131802E49A5C0D83D24282D2893A4D414 + 25607C2775199F43509E85DEBD1940B6BB515F1CAE035F62783B8CE47BD02AFB + 20A5F22CC3A1FECBCCF75E71B22DDCB8DDC1E6BAA1149EFB3643C90574D5854D + F042CFA4C6AD811BFBF1D9B3F28CF5CA542033379C85879D32122C8A647978B5 + 196B70CF7AD5F4986720107860406624DF6DEC7EF00F683504CAD094C1D9B02D + B0F85AB73DC47B4E598324D3D87348A08FE851CB80183CAFC75DA9F097F437F0 + 4B201BE3D266A020292DB51B30FB6789E6381981D1E4F90CAF8B0F2DFC6D169B + 30E18BE97EF91B75E09904BE317F7D6F881EDC478742EEC2B480E9E8A7DDD194 + 42B4ACBF73B56BF0719F73E4E0C4FC0FE55777E7DC2FB7C28E043BFA7D93D42B + D399400549C35FD4A97B36275903BD7F0B87BA7171186DF4E052114E06CEB9BC + 507FCA94AFD74BF077E0A0926A1ED0C76395A9EC95964026A4A3D1201551B0A4 + 505DAE3B203E6597D3CABFE5F0DA7173630CCB05EBAD3994A072DFC27BA6E93C + 965ADCEF109D4AC3AAC43F493750D1A3AB840159EAC69422A70E17F078931605 + A65F6D264A140DF4B0466E98FD9A620B48E9AE7AD462E8C6DAD19A6074CF929A + 5FC78056D249B2E2A4C64E3E378047787E25C8E3CB799831021990736A979469 + 291E01D76778C4854DAE4785D7554DD5E5159F2C95BF76B752DA815B8E123689 + C77DB25BF0A6F0DE18F8CD9E3E585C5F5A806ABDB3B1653BEEA0D7E0EFF2348A + 8AA54DB0B29E5A3FE8AE348EE04F1EAAA7A7CA16A43E7B6D4B71312A9BF29191 + 4C2B3DC2BBE1D3B5ADC998199239FE7639C1345A4BD8A6366436580CC30C0D05 + 84914262FC7E798A62CF2FEF968D05FD4C6863D9AFEF5AE41D12FDC272C50695 + E9AACE78A61FB7017430186DDFE3D535471936C2FB4C7AA03CA3C7D70CA15526 + 0F851513E08FB11A3A1AB04280E4C22F2F06434DC59CA70B7E9EA443668902F7 + 70058CAC92A2967EE581143887BD5165638B47B6F0A31F01647C28F56263EB6B + 70CBF3BC9C48DFDDD9D81BD7D323D3B1086E35B86A8D111B3B5A656119239CC0 + C106D49294DFA01E1D32745FC88F8A17E614A32164B891EB787F4D681E74A3A8 + 4EDAC7D8D6BBE9A84FC9F7FAB3D7E7211E4C57F9CFEF7C5C3D292971D4435199 + 2FB5C396D93A20FC01C54E903A7F0809F44FD39D74F194F06D5B2F6112181321 + 59BC06420509DCFC2AA4C7C0E2F7A01E47C4AF9D83474EC7C326ED7D45F67550 + 283B1DD83F682155C7579025A47218D6393B6E10F1108902553B1D9E4679927F + E6183F4673276A1371895857A61AED50ACD7250CD94F01E9728F26CDADAFA751 + D4F63803ED04708EB64E3576196065311C3CEFD7C823B8D03A71F983B2F61182 + 2D67217F51E80DEBFF0ACD0B71B7E4C5AF129DC11E18597B3930B67358181789 + 1ED9A4BA4304DE8C02D520423CEA3FEFACCCD6C51997E2E201F6E658EDAD7BD4 + 2E3AA2A040D205F5FFE0AACEC3CE9E35304F2FB46CFF000E19D908FC360AB518 + A6EAE095E3A510D06488F5C3356DE58C20C5383125A8B70F64CBD689F9CDEC93 + 57BA59AC019828F415225B57BC706072B26C15ABF21195F6E812D1BB55761502 + 878F7DB41EAEE10B72FD42BE5847344D108DB5FA5C74F8F92AB617C50FA6EA2F + 4DFB003C241E522E01FF393572F2024F506C99C4601195958FB17F6C2A7F0754 + FA9DEEA8466C67ED10B6B49826C6F417C402D485CFB262847B307A9481209A62 + 554927F8860664038D73E298BF0A865EF16075A64633F2E2D5F7604C4E4A1535 + 6CFCFE727A89C10F122EFD87D157177065A8676D9E668ABFAA25537BD5319418 + F6C9C826082D3277DDAEA8DA0C332AEE80E03DAB6B1F7CEA226830BB7EBFB709 + 832560C9174EA571FF354742FE0AEBCEDFE381899B2BA05F61C0D8ABCDFE3B8D + 274A6A0D49520EF4EB02C62FC5160AEA8BD284445238EDF8A057BC091B85F418 + 5E979392F00A218EDDE76F97E2839B17E7B4013F130682AAACBE2F9218A5A93A + 3CFC057F5AF071F75B82206F94FA17F54E6F71BFD578EE68801F1567E97C9E8C + 4B1A22889D06C7FA4668981F8D70729AC4001D4636228A46BED87EDC73D5AEED + DA1BEA33F6093848FD2A6AD0F6FAD9A6DDC132FAA99398D22819CF29D5C2AEF2 + 9349373FF31A56942922C297F03C923E52FCCF4FC49B3AD1D9B05FC03F77D26B + C266952BEE8927F257BB29BE33E2DC8D37293F348EB776F1595C2C705AFBD1D5 + 981A9F80BA14BA7FE2AE63F9629300797CCB7BBABD8ABACCAFEFB4FA0C3F6834 + B0605AC8992CEB28DD64840FE35F8B82C3F28DCA7F59E7BC15D3CB752DB98E70 + 5DFC14336FBD98825E25422E29CF9A454B39749D7966DABE2A62B10E651FE4AF + 1BD2D7967C93CB7551E099927CB0F327B98204F5CC896C8F54DFF84E54C316C4 + E7E80C35DE22DB201CDA5CC2DCED211BD2C0301F44CA54DE07AD73CD4605835A + B026D2E53F6518551C180469A83D5F7131E367452306C1D71E357DBFA8BA9329 + FA86682E0A5A85A91BA04972CA5138ABA88959B004BB9377484493051DD68056 + 1452C5D202A15A433188F9DF70526AD0B5305C14812CF2481D22CFAF89E357C0 + 97541CCE109C468AE99ACEC83FC85D4184D7333A4EC3ED05AB4A4A313F8DCD85 + BAC1BB0E4DFA9CB36DCE88099A0FAEC665138EDD86436191BEBF4F67D4492865 + CE2E446C3CD9634A474E7B53EE756C93B3EE1EAF95BB66DD465D52D853FD2434 + 1760250C3070601BB35E4485ABCFCA9E9D257334889DD0909C9A86399A41D623 + 20EF0320886BFC2F9535C231851CA6F445FFB4449DBA10A78E6C77AA45C5A880 + 3F46952BC328B80D38BC1EBF615EF7C603C8734ABF624DF726B6B6FB281D7DE7 + 5993A64E15B7BED306D4D293D5A7DC84148D14A918AE73856C7685C238C2ADB7 + 6A4FCBC74DE4837DBD244DBBD722D09A253FBE3757AF79D4262582FDA40E4EC3 + 4B1DEDA6797C15AC457349203A28871D17D447280DA7E811D24033D38BC3253C + 1B213EC5DD2FC811A5DABFF75F282486B192093BEF15FA2E510C15DBB9681C92 + F8CD64F1B41901559285B089B87EAD0451FFEB200DD126A264597DB8550CF94B + FBBB78899EC837CB7C2E381BF444B4C1E2AA2CB19836726DB0E745C0A3029521 + 602D5EA7BD26F33B2BEE4A255F0D301A372724214741FA66503A801CB88C6BB0 + 5C6F22BFE4E8F6FD3F37927AF7C71F9EB5F42BCFE1C26AF0A40E16B9238E65A9 + FC4812BEF803C8D42ED81D5F9E6F130267D4516DCB084412E72E2E4EA3A4FDAD + AB6067B4057A35B7E507ABCBE265581A2E60D930EAB40763A9131FE72CD14C15 + 1AFDDE4C0154D812E7222A9F587CA1BFAF7E70F05493DB925A8ED8D97D07A30E + 83633F45923213D47DB0D546A818873AF1DD0FEBEEFC2F4BA27C2AA140954678 + 7A3DE247426E23CB0B5C0C2A535D1378AC6C153F7934542F3F0803AAB9FE206F + 67EA2A77C782C72F0214A3EBA8B4776214BBF5537EFAF0C8864B6F7847BC07E2 + 538774ACD5727D517C77F910035857B3E6869D14F81216E35C615CB010CE1692 + 79C7F8626498BD854DE0E5E13D50B09C16ABBD96D3A817E53CD541454BD23797 + 8AB95BDAD2D0CF607BED989668A3404976D194DE3DBE045292061EF685560868 + 54B4F11CCB21489E7A2DD8C120E70A7C6EAC263B1B89401981D13BE1FE2D3AEA + 7572935DA23FF1FCE073689EDABCE1144C31B4521811C56D0B787551AA6D87CF + DC7B1C6936851BBB0CE2923E8CC97C30E3DB86F0588DB1CBD9751E3806669089 + DB0F32070C9DD2310E54313113D3D3AA330A99B4893D8FF077662960CA4AEB8D + 6FB4CEDF2ED2926597D155A7BEC8EA3011E735D9A7B17EBADB27C09E34E5909C + CCDFE5B74556577A1F31073B9BE6876F397A6B51C415565F6CF4F8477876A909 + 7AF23CE9283F99924A00670E377FC6CC2C5A2EABC51687C0A0E3E7833E270520 + CAAFBE18BF863B4B950F6916D6CA8E6454EA76C04931C7BC883C0070AFA0DA33 + B3DD70DE68114E8A1C6E164D227A3F8F317B73116043A0C145025CC8A322A637 + 583C084D10C5F154EC29D15439DD8F436A2D4C56D56D147B851BF96A3F0535F4 + C0B865CFF88DFE0DECFC6AC9A30F51E6768BD8475E76DDA2D8FD48C5102706CC + 98CB773088B05F0492F2F82FB213745B88D87151AB317085D0444492421F27C3 + C01B3C1901BF86E719ECBAC5525F9B0FA862F3A10E549B9F07D9F3B43AC51BE2 + 9E107E737D3188A91CF57D7C739583835073A7082E94336EA42BADB20918A370 + 2E5E6F121C11BF956C3C23F1F1F9DFED5F187DAFB3528C6936BCE11AF4793087 + 763B4F2F4A81592EC7074D2ED1BB0724D82629CA7E054BB2C1EBA8B49486A11A + F8C92EF89C735AD88242C3165CF44EC64ABCFE378C1EFA1F11E979C3D09DE332 + 1DEC2A8C1CD30E12D4A960CD33C72ABA46BE1BA9AB05F1746A1F707A746F5AC9 + 023910335FFE88A5F9B9768A9673845D30C201A6CA3C2E65FC911EFAE8E54BCE + F877A8236A2835CD2789A31EA9F7F422FD785A3503AD0EFF2B58105FD86CA536 + 938DFE5549BB115FF1170E31EFBA8E6ADA58730AE2F3313913DEE77E01D97EA7 + 71C5FEADD8DCED4F881DCC1A702BAD8D36A0A26C1EDBC4F00F0BB21BA91A4090 + 8BA77A7CD5BBF1D25BC0416B5DE1456EA3188DE97FE0EC0797119E9C8E81FCB7 + B9B137E9E4DB829A47A4FDEF03D93F5F45197F46B2E7C04ABFD55C960C2F3BB8 + 7A9EBAF2BCCA67D6D78DC86FC44F55730490DB4C00EA25CE4D4A5AC4AA45B973 + 10D3D1B7CF84E5C3877DB63EB307E3AC2FCB62FA9CCE135A5809C7D77B20983F + E2471999B318EA15D8A33389A86B84EE277BED89971F32588795B64767D20621 + BEB1C7F003F9AB28D396C2CEA1B668C570A90CB21F5E69F440046D2E255E8DD8 + D0A30521005616262259349A174E88B8CF8468B94876DE0CDC2C2AF592FBE1FE + E94912C87E4D2EC34A10700BBE528FC38675766FE8DDBEE5355D2163156B50FA + 2B74CBD15D3950D36521F6E971510A5A6DEA8D50D0F4B3A9124BA2CFBB81164C + 351E911EDE208416757BD186DED69B24C81095A7CB7BF185E5B69B842CE11CF7 + D80E92CA194E46162A5EE583A61C212475A0F9B70F5A8FED079DFEEF281609E5 + E7A953EF08DCF8117F9872E392395012EA536B8EFBA94DD04D94C1EF7714DF01 + 482BC1D9022406CDFDD713F8A4596AE80CB3F211DC2942FD033401D236F8D433 + B37A27FAF8362C22A69A558BCB6F6DEFC0F853D379ABC4706971E169EA482ADD + 2BB3F2E91972C87BEF275FD07735815E0589FA5C02F2A51B8EBD6DC6333738CD + 1D5C910A279E9AEDA7496AFC29E36F678C72DE40EA33F2750A36846A2B0D2A0C + 961D48289B981A2EAEA7CBF3B215724FFBFC720E949717ADA630CFCC704B1307 + C652D4ACD8E662380F9C2E11088BFE6EC6ADAD402464BB35E629B05169A78927 + 11704A570B24357C0E267C1700BF6DC76A2BBCC6F8181F710652DF2A85BEF960 + 241256325284F09A457DCB98A6E8D273952966804BCC023A216EDECAE681A522 + 7314668D3B38C0FCDC11EB7CD50781790509BD9C0706810CBA7C7F4F0D0AC364 + B6732C64FA47A65FC5DA6DC109C18F4F52E02DEC24E434D9F6BD9A53711A4042 + 6483BA0C7C2B8A85CB30D4F1C5F0761F61CD0A99890D7DAA6C97EF326BCDC88C + 0A9F6C6C2D57950CB482D4C4E7E3503FAAF70850EAF284D73A4D7CA5440D625D + C96AB5634CFCC923CFACA343C0A3A361756D55EEA1FA1E9458DDF965C6C0721E + 92C5A066FE13F9F87EA9B3AC013BE4D5E85D7948F182C1C09CCD3C7945035BC0 + AB8BD07B2F0CCBEC6EC156340F12478E47F28766A3667960BACEC484E745663E + 774177E99D32F9518A31C0B88281D6270BC5DF83CC23D686C25C6796FBD4E617 + DB97D6F572BF4E91E1738AE1F7A7B0FCCC4EA07E5587B99836B6BD04949A5112 + 9AEBAF7D89259CFF3E03DA661B3B1F82BE911DF21E45A4C3002E15737170F1E4 + 323B0B7A025F0987FCD7F6A7C9EFCED4D09DDB60F10FEEACFBB32B898BDC4413 + 0329D6D1260176B9E2AD358DF23C526DBDFB27F6F2FC81E3B4FF796D3D1856B7 + 25D2A48B2F82BC1EFAFC038823852E753ADC3614BDFC4B5240FD8F47C1DCFFE7 + DF66DEF58D9E1633E57DEE8C7F8BBC9BE0884EFAE93894B8709D88161CC43132 + 695A72320B57344199C502DDA81A446D1320DC4B62B7F6D7D7CD43E94005DD7C + 88F0FA0E339869EAB6F0859627F61F5BEDA3795059388222DB4FAB385D681BE2 + 926000A8009A42A1252104E6FF7F1490259419F89A47233D86E083A5AB852AA1 + D3555D05F4B6B52C28479B91CDB53323517B6B40458AC4A3F567DF142B654D14 + CAD1A682439D29908E29EBC65889A472E9B15E6468E9ADE97CC6FE90945702A4 + 262B8E6BD70D0AB853AE8E57E302049A02139C82454024093F9724685C8B8F94 + 34E23495444F3B8D195B1BEE6025286CD66DD297FE7C5350BB3F4AC0A23D9B6B + CF0D4A411C7D018291150EB9AA5351030FB716D1E0FA5ABF14A1CE6D98AE9F03 + BDC1497FDB995F1BD7482673B12BF732709B22B1EEB113A389AF650BA6CE57D9 + 9CC63BB5A3E8D0A06480ECF7C9A87436C239219C246E42A7B5AEAF43DA8042F5 + AE62704E332B12A5344D50F672099E4543F5CE715227B347D3EB34F01CEB1FC7 + C2C1E151B787739775647A7F27A6DB802AB28F2A83472D8EEF7A74BE517C61E4 + E6BFC3FC8E1022B63623FD987629C10A4B0E8A8563F2E6CDB34249F2002CCF4A + 2AAD7677D6298DA001C00CC59A45CA32D7373D3146737A5DD6D9C3FB40CD16D2 + 37A5F759FC904936856CE916AFBFC3099D8D8CB48891002B222110E169D32E61 + 53442A14A1AD51280B918029B9699AAFCC01B0821781A23CD5A5159703A2C2EF + B9BA7DC8FFDEBB091A0703426B8B37C37156BEED1B67526995BB659CC9757171 + 502C27380D4FF5D3B84D9B50DA2E7DAC00A9B4F737E2F0259D3678DD3790DD91 + 3A59CF899F89C68F4A4846DBE7D1F5BE4D544C4796B086E3D93D199D6ECDC003 + ADED84D3F8973364BD288B8A662395450062893C1237F6E9CB438E1F9AD54C48 + 4DFB2C86D923E7D33B6E42CEF8A55F0A67238927D8548E8F9D27758B8D1E72ED + 9AEA686369CDA9CBAA3FADD8BC374A462D955E641DC537E2D581D641F19062BE + 34D14F7D120ACE457D58D888874E84A44E1706AFD76AEA9C956BBCDCD959837B + 7292ACE14D63BA658C049255AAF1191A797FB9559C473521FE3E8F7A6E5C9ABF + B539268C27554413C9F1B7B822020C9949732F6918EDAC9ADEDB11E049C4B239 + 3672F95D00D6BAEF22EE08737D32820D7CDF18EE825159577F65B5ED2377A68F + 2FD871D4407D212187F5E244239C35DBEE6894ADAEAB8F5CEA9FFE0F2F2AF3EA + 9F99F097AC38F210D9EA5C66700058C33E5087E2003E77E2D3E7BE37E9E7B0CD + 2A9295EFEDE8A0D1154196ABA5CAA8A5D65A1C0205FF05237F58C097B78A9E7D + AE71257606438617BBC922D7808CC73897F6605B39EFC269E674F6766C52F061 + E8C14DDF8E6F1FBAB411F50C4E9E1CB90541403BED5A569238A62F1B38E4FEB1 + B9D4C82FF075F64108679F06DE974C2B98154F8E71CBC4445AF6B9D43E715C41 + A424477DC3BE7900018EBB602045D605E9EDBCF0457F45649D869489A7B7D8EF + D0B5B00E0EB522FD0C67453089839D8601625F03E646CDA3E9D7B03473597555 + 5D6989548EFAB9D2AF83E2F8C26CDE5A9DD7FEDDBA3C1865444027ACCB3AF41E + 20A9ADD814E6C60315716B618E75364EC70CD99FAA93278AE712C5EFC1DFBE96 + 579144AED2BABBC932665D840B48B9FD71B263A1D86EE2A08E6DCCDB791720C7 + A83BB28A3629DB628F623EAD1E8910FA6B905E1B9639E2EE4812B5AE9C42AB1F + 9596508320EA819B33CFA017F8636707C24106DBC4F3F7E56D0F726B455CF905 + 6117383B6994F9B08AB0811FF256390717726F0EF0B97D98C514234722E87B33 + 0957ADB0E40AB53C301F363AB2006663E8511CB09B4791D5254A8B42C01D4653 + CE459F2C8F44410A3975126E2F12A759CD253881D9D1CF91A1A62B056D84069E + FDA1A4B9D76B2019880B1C2C5AE9DACDED2FCA522B507425C033C39D34E914F6 + DC4CBACBA8069FC4917AA791DC56A9CB90080222064CDB87CD26E89B79BBD375 + 67FF6BFE2CD60F20A808C679C130B66FA17B31E6C3F41EC28BD1C4C2A96E944A + 05662279988A7F41E1AFAD375138CEF9288697CC55BF125F7AF57B6843C690E3 + 5FC7F7B2802DE0260498F7D723923EA12A5DBDE2BD757FF33E2EA8BAA974E53C + 890A9E1C29E85484D7176A63C038ED69663F2EDE72E54F0C03FC546D8424812B + E40EF5DB62C7D50827671FBBCF27F0A9AADB8D15E246ACEFE25BB49430C9C37E + 415BE72ED38AE50B22B5C9634ED88ABFB6438DD6B13C74BD7CB9A6DDD234BA6A + D281AA1A5B567CACE5738227295BFE7C18C868DB982BDB0B4D033AD60FE20C6D + EB9353877904F0C8B4D951DEBFD96DC897C1084418AA332A063017016766260A + 4F48298C2BD39257D40E8F75FD3507EA809E4805939A59E9922CB15B2EF0ADBF + 5BA0FFA96C67DB2220B5A59AB03F3FE3A365116746798892CA7285F0839C7FF0 + E03C450FC11C30932C007E12A6B6902B8834A9C067B6EC5531CB137371C533F3 + 75B17E3CC307D346944F80A8DA6F3C6C2AEA295A013EE084E7B1C42D158B7EBB + 6B5E30B06C379EC7F66B8CB9A50DD34A8233E1CE18471A8CF7EEC646D3E378A4 + 453D932CF50B7E576A005772596B25B11F78B4BB89973CD55C40E19E2DA99135 + 1CC77D7B2449FC7339466DAAFF480C5269E55A16F5A71BC41F282F466276E884 + 9332EB5B86E2D96F11AF1E5A5AAF521EA203062BDD877415DC357896D5294897 + E1EED1CB0EF2F3E52E6AA7AC396662F4E7DD2AE83A740C961A322EE11846040C + 81AFB289A4D7F422222847A164DB13BAA768AB50FD177936FCFD117BFC5EE961 + 4EA21017301254C78CE6D18B985C463DF43044C2388D21E4EC51BD489DC170D6 + B712359A6735B19093A25AFA743FF0D1A88591BB2D5876DE9055C646F75A1510 + 198B21767C67A655C967093731CE31424AC8C63C4E3654BCDCB90F2A2DB9828A + 91A97EE0C13C1E3FFEEFDA52C4F2C326552EB93F2047CA1345F1F139BD9A9649 + 81FE4F0BC006CDE8F3EAEB3C5E2AA537F2F9A770ECF05001D22EB192C5E83AE4 + E6E2757B1675438372CBD0BF4BA3680CFE9387E834AE7F6741089D89858DE31E + 57D0AF4113157CE1B79CE5FC3880959B3179D488345DBFA33ABCDD3213BC388F + 3FFF9CA54083A0A47F37D5CF1EF48F9AF64AA904011A0DC5580D9E5F9D02B2CA + 61F9A74805FF7EEA16A5ED0A1213752AFAA894F5E750115B448EC2530ED5DE57 + FEC6F6AE773195F5E907CE9918E0AA6602CF974CADDE726C4B4EE2A05549F168 + 76C0EB34D633F0C51F6D21D34BA56706775BE1023A8889CA73E28812E1A8D5A9 + FEE81C9DC165557ECCA94DF7CE945B3CD24CB0497137D3297C635AE9305D2CA6 + B705F070A52D127A1B1862B72E8C2815CBF23EC80CADF7239596A5F2012E33F7 + C87B95531D574F525555F4FE8EE0662FBA341DABF23EB24F8026D327E039DA44 + 89362D91C2D138E6D768B49A4F8B79F56641DF6F16562FD6416459DE3BDAF053 + 714745C7E9CA273D57BDC647E8D36FD750D1871CE0DAEA9454485E3AA1F981E8 + 0791A6FEB2AA25AEEF544B7B351FDD2CF8CD64571A79BC199A288574D7132B8E + F24DF197828B625081CE072AF9001AE81DDDF994F369DD52E7250E8F42EA55C5 + CD0AFD5572BE4FECCE06AFA0A48D70A929838530CAEB5F6179B37B9FF84958AC + D0E615668A0832A26CF95C53FAD456BCC0AB2C330024D8B85D249D2CE6FF67AE + 39DB4B95C1AE20BB730C9F268892B0497C8D353EEBBCDA5B695E449B7A5D164A + 9BE1319BD377E4097BDDF21830C18489CADE6BABF640CDE853082CBF0A3BF931 + 143422991DFA2D7F670B83BF78730712FFDFD4CA4112CC6934284652D8C1DC0E + 51022CD9F1BE46CE700D458E5B1BB0917D871EB8A27256897E042C91B6FC470B + D41D75F955F6456D55FFF7962D601EAF6E066A7781381208F61E31853317F7EF + B638C3BBFABCE1C8C68944C36DB2DD375B038E0B5F10091FAA0F185884C238A7 + F983EB48CCE8CE08DE7BA22C8D670EECB5402F3B335642B92232BCA7437E45F8 + CFF3082A5D0DAFAF3D06A3B05DF217CC131EFB7EFCAD55185E1A26C2FE2A30CB + BD1B783BFA2FD5D3C003B30DF8F678BF31600E19DE6A824EDB7B0437603F23E7 + B68003A221E125CEB715E67E6FD896E1B835D43426E69B3978AF9FE9B0B32966 + 8C27EF77BCDC956AC40F9B3832306CE237E440D796968821AE2DC60B271F8ED2 + 5F09BDB5DF2BFCA8654EC28FFAEF28725F2933A068D2ACBC1B217FE6D46D700C + 208FD63C717282D152EF5BCE49F2B1A99D436A84B502AD48B931CC9D13F23483 + 0429A536EB8E2145B96736D9A102D65A5F3E73D048B2CE6DE41D566116785D90 + A4FBCD0D377F6DEC7EDB4047D850FA8AE349C1342E39FB3E9E21EBB3DB3906FC + 0FA3411F6175CA8B6DBC99123F2F94002E1D20B98FBA8ADB9C8FAFF99FC67093 + 867FE1F1D699EAA27A3E90E6B8EBB4A5948E6EF426CCA1E9F9CE276E73842161 + 14E6268EC487A6CA0580BF4550C7C3DDC81700DBB4C58A8303CC76E5DBE3EDB8 + 7F80C22C857D60FB0A723374EB7DFEA1F4A987F14757EC1870719701219D9F92 + F01AAF8E0F5AB1E245361D235AC7122C58F66BF57D401CE9A17BB98A994178EF + A25126EC3DB7CFC26AC8942877FE586B566CCC61C07EBD44CECE694D36E7287F + A9B5B022DFFB7C1B56388FD43D2AE2D0A6630D28A4049761BCFE117FF7B55EC6 + 47606DB758AF1FA50AA3FD5C7D1C766BD88CBDFCEF0D497D4C0DC0F6F2860547 + 35A2D4F79C65D5B8E43B9CA952622682ABD20BFB2BDD04D89004CB1BBFAE89C9 + D373477ED7CC7C6484137B77EC745A34364F88D9A0C53C1DDA908B50DBE2AD6C + E1CD8EC1A8BE3AA9FF0B2DD245D8FC50868989D93B05FF30D8825953EF79548A + 89578D7BC51D3F8623987885AD56C4076F35D10DC10EB7369769C5E9D8EFC993 + 644D5863BE900DBA3886682226407E4BD2B3CBB3F0BE8A827555C7CCBE07807E + 81A5235F10321CC7AF816668973603E2BADC29ED0718245099C3BB0F8027D241 + 4FEE7A27DD8BBD52FF76302AB688E6C452EDA6D6AE3921B430EE62159C960B4F + 7E5078010F6419F24DBEFBA09D9286594EA69D6B83A83D9C7B706C4019CDCE1A + E6702B4096EB885CBFC0F1D83A1643D9881AB062734810A35F780E156E7538A2 + D8672E00F98CD218D7AD59382435851597C6FB5C681E99AA3B54D984E1E6355F + E7EA8B8F9D0AB617733FBEB7F4C77922A131D8FD4513BEA5B52C07EFE1D0AC44 + 85B1ECE90F3957B1583FA02CE642CFABE419A79D5D7B40B46D68AAF77B731BFF + AE71F66F4A8B5180001605D4ADCA0104BC8DDDA2E75496B2FAB5CD5E26CB1194 + FD71A73EC803DB5726D7D8CD98F17F059E0FE003FE9210078956A3F829241CDB + 2C66159AB563AE1D6AECF15F1AD3588510ABD7B5095C5EDEE2758DF8A074EFF1 + 4CDC2A369F44F43773849691B4BDD94B87C6C2300276D2652BDABCD8354A9C32 + 30CE2FDD010645F586C41D4AEB1168940AC38E485C415396F6E51174FE49BC04 + E0F4A41DCBBE1FE050160EAA865D0A1C2C7BD9EDEFEEF6B2FCEEF92FA2E794E3 + 5D48B0A1E8FDD58060CA6A0B49D1D99721BDA689DDA975D523EE96502E88C529 + 1217AF7920A1F79F19E0327FBB203041B9DC04DD6324C285B87A8C76AF32FE30 + 9B59EC61042511EBB5D21699495D1C675330678576B5BD6D5A611CAF8825E628 + E0E77BFA9563AE8EC8388CE431D2257C88E1BD6C0A919E8427BAC54F7B9FBE88 + 87C60A5683A64DC8B001A52FAAD02F2F557A33F9BA4C774086DFF5E0CBF45599 + D23642AC8513F89905D96FCC32784B0F2C61E0FC4F3B32AA7AE08D65404845B8 + 6C8FB766F111F4200F1DB20EC50C2657E96CD1E25B43AE45A4B4BF413E2D9FB8 + D78AF6F6BA1ED3438F167E197C40AA586B7C3BD0CC3AFBAED567A8464A902E04 + C571780783F0AFA3CBA16235A581381AFD266145DE84F23A4A3962A7FDB54A57 + 457EA9488217E54862CEDE4F291A0F7E79CCF8D2C3D0CD8FDB280CCA1C425939 + C837715B22DBA1E1D0BEBFC252C45B8F653794C13913722F486C26E75CADCE77 + AF57571C04F3D0FE0A0E2A0BA88D46AA758B0EFE8B2449D97F27B37D28509503 + B6078BD53C505E6922AA22144857B5BA47AB9A13A6DBFBB03D03FE7BD9B59371 + CC59708A7C82FD6B0483DD845D53FC8CBDA75AD21259C7DD96C7E823325FD8EE + 172C6A034717A3353F7361C213C3E7C224152CC010BBE00B75CCA4EFFC122434 + 4B267CA4FC0260FF88AF16D4473E6BD03A0089D1BDC389BB2D0A2BE9A6A79713 + C2642E1D787F62DA9102EF9EE3C040FF746C933240AEDFCAB24CC03594491D0E + A7E451CD51E3A681CF7CD0F09BA2F1D7EB6CF3838D3373A7D88E04AB2E6CF446 + 851617CFDB8BACC4AB63DC2CBB9AEBA4F75A217BBF8200A24C47BA6B9EA62E67 + CB66CB16C449DB4EC5283C8C2DF3CD1F6974E95FC177B9A09452B3D66F285756 + DD0ADAA460F3E89349C36FF759AB0BFFCD811F2C03E98DCA3E73891A4BB9403C + CFC58F6B06E082DF7B14A9B981E0715D0C51E847614B144761FFC8121C7BC226 + ABC2F1F140D3C24B5BDB56B489E5D2C3E4B9F8FD1A8F8885D950CEDDB16C9D26 + C0082A49CD719AF0690A0B597F5CEFF356D86D8D948C943C9AC7BA0717969B8C + 9E53D837884195C5455639CE51EB71184294BAAAD10D60600EF53E600ED09D84 + 155629C4F57BED39943CB09420DDB6D6A689D147ADB3E2F839E0D35866875E31 + 03B555A16D3EB508A6AD112496AD5A075561615C498DABC6CBE8E29C2E289D18 + 0FD1E04BC0AAAAF54D7316C59BF8A7D0FE929A9ADE643A99C29CB8B5EEF9D0EC + A0EC5886D7C63B2BF802E6838F7C5CDE3BB885D1B4866B0E854B68F6B071C15E + 4CED37F535D56F232B68D07D9352372987A7D66EFBA92FC6C42CB37F857041D7 + 6425DCB774523D16430B5672B535AF436599F760DBAE1CF7C33D9637DD8DF283 + 8B355BA6C80674191DF895FA92B54774B42BA45C7B0FB08215AF42943140136A + D750719821316AC907D72AF38C4206A40305A53D17DAF53198CBADA262C77AC4 + 75EA4A4DD77037D91E76764A7BA4573A610996ED3A721ACECE828EE8D0704356 + 0290382EE000586053560E747C65B2CFF9D16A4C7BCD1DD4016B95457CD545BC + 8A1B3AB239202C106BA9CB13C5606D8FE667BBD97D71D424C8B108C09CA9EBF0 + FE003E1345803D249E101F4F24C8B9296920EB1057ED5081D55CDD08B289289A + 21252531E494137765312365ED5FCDC994DDCE88010C31FF63A5225344E67063 + 09166712A9AAE98BD976D6EC42BFF36BF20B6293707B48A26D60E136F0F8B0E2 + 4B264A41D54447246554F596C04E552DE0271D0DC22A788AFE6E78623D94CD38 + 3728C67DEF29BC237AED6CFD87D4453E06BE19E12B69AB66CB174D5EF85441C6 + CD3133C5D8030E628EEFEE11A067E8141213E6398197B47FDAAB002328911626 + 8D40108D56316D8A9554D8487C5C3531F8BB03135341ACA5B66FAC08DC4FD018 + B3DD562A6D32710CA57141F28B461D810179FE2313488E17559F486EC80EFA6A + 955C19BD0D7F58A5D2D319D3249EE8488931EA56F2A92A727F7690F6CE5EC903 + B296DDA6AC3757523418A2D96DA8810B4AA9DC746434DC4540927849BEBE96A1 + C86F0492E55257058C08B13F97DE7B9EB8C3B9355ADC5D4401D1E00876D43341 + 873F064732F136F18561EA03DB2BD71FA728D2BC7D3E070AFF24F200BCECE913 + 0D360614A3114089CD297C85B6AAECFC29FDBDEFE4C9C67C2FC390F148E50EF3 + E38719E2F6471758B3158402F90A239F17F26983201AAB0E0700C9C2E32F4444 + 5DE750154DAA72EE4AA53185026BDD2A23DBB630C87DA4FC51F1C6016399C09A + 284282745FF0049EBD208873EEA93EBB638F8F646D10D99B759604D617F5A1CE + 9D8D9C8D5E1DF497157497D147C509E1B584986E93F6D85864A79D417944E1F0 + 2A2FEFFFCC51DDD4470BEF1CE553A7E406C424187240D221704A2F45017EA94B + B9AB319074FA0078A046E2F10F83D9FAD2F729DC762570017FF61C4E6EE5319A + 2BEBF3BD9F6392DA468F5F5472FB09EE7B4B3FAC19EA648ED1D5EAB5598193A2 + 4B0AA0E69F2015FA20CCEAFBB75047D36527DD7A58643D6FFDB0F7E98B95313C + 35A06C2D98535055D04B55B1D616701C5EC6E71D497D5224084CDB92AE80C7C5 + 309C9C23CB55954B26BA124B6D8A8E95AB0FA759E3C1CF0430A06D5BB7A8F5FF + 62CDF1530B09E0F6B6012AD85ACB62F3AF7AE208FAD8857339D86944716B87D2 + 97F76489B0BF3922030B51587AEC7F452B69E8C16FFEF7405BF365F421044EFF + F0B2BE653172DE00E2B51736839D1707CD47A5E835ED694917F88389CAEBA855 + D35C672186FE2F349C1AF67ADB85EB9E1EDB563C33017C40DC18AAE3F15D8CF4 + 25116B0F888443A38D9AB76DCA31FAC4660AE9CC0879B1D7C565708DA4D3DE43 + 1B32A6F80542202D3F4A00B1C525B3153C3DFEA43E37BAA2E123CD74ED5F70C5 + F2709D715E003405A1255AED63CCAE605F93506D9AF5C192C3E56832E9F30D67 + A10DADEEFCAE0F9A40DC1BFCB35191B8EA36BB1479EFED817FF10A536150C721 + 41912891CEFCBA381C423CC8C484EE819E0E87584F7D2A065AE0FDC204AB0510 + 2FC186E4FEFC78CFA2728ABEA420547E0B382C663E61422A74CA7E883E3609E5 + F213B85AD58EE17EC9508A2B211F710CDD6A7A30A35022055B855F6378EAB2BE + 240B4741693D19431233BF10C077EB3622310CCCAC9DC4C3C1A19DB8A6A5F11A + C67374F42EF95ACFDB76DEAFF26DF395ACEFA96E17C1F1CFD8C5F4FA5ED30278 + 7A275B5BA38DCF85DE620C8A00DD1EBA329B05ACC3BF51AAEBBE3D997F7E099F + F5F1582BE3AF8371244493E55C545D600BA2BE3E3776BE1300C94F68B673B762 + D6224EA03385475C2E1CFBF96BEE9A959ECE84CEBF2BE09C43FDB040D30C5C38 + 936A0B4F247D7ACFBBEB24A44CFE6A32D5E19B105C8A17B8ECF3EB20E25B4BD8 + A44AB3CA654D52188DA0DB64B14CDF7F715A1277F697A90089DD57A0DF687202 + 80A5AA94644102AF56694C2747270A37954B6450B683BC059A0BEAFD1690C098 + 32B58EE07E0A1B6588E7E5A98CF34278AF39019FCD9E7025B2DB213BDE9CE3E8 + 214AA55A1AE848B320E76A1146DACDFDFEF57A2E4943C0BAAADDCE294951878E + 51CCAEC70FED225817BAA3D5AD8C219B13812661E5F8D0B1B3FE8D0DB3104EFC + 199B93F6D931E85E5AEAC9E459831170E809DBD9B308A4AC4C44DA74D425538C + 21A2AB0738306A1438D3CF44FFDFF5D057E6D0887C8488934F1AA9840E7EBC9D + 5A949629949A82AEDF6D87B45B4044093CC24B64D0D8E8C74FF1336FF2E4E238 + 054EA9CB2ED4436FC9567458D0301312D3CE7314D641B6224057E617E902C6F1 + CA3152BF5C4ADDFBC021198299583E9F2EF014BD6109413999EE5F371B5A744C + 2B8B7C4633B2A902F939090AAF77DF909B4F021D80F91A7CD8DF18AECF6BD94D + 23E69570DF5B5619532012326F6347F889E0E22F9E1165E9F4B2EFCEDA0BE3D9 + AB90C57BAF1EA87E5E25B997C77B548140148B4FCB268AE927A9C448359A7AD3 + 645E433242ABA7D34F5F948BF598417EA8A1D91F2AC9B27E79BBBA9212E279A0 + D794797E87F600DAFFED607B86959A759F2832D0225D8058C231C6BEA2981027 + B1524CF43D947BB469BDA67764403080F33DA089B62362C7CCA4A6F95B7533B7 + DC553D1726A82B74F3A4DE1534202D2A7712126475C22BE8B876B30F7C968EEA + 3A26562C49E4B8F20A48EF0C5A478A7E5ABF4E4C982FD1BD8A9DCA5C12F2D88F + 5B53DAD8FC18BB75989960069BFA56C8CB83AC916446E702F82B62B43B3D57B2 + DD0F9A47A70211B7EB07D2AB6A297CB06BD2F72C0A264281D6BF99E636AB3F49 + E5CDC67F2962BBCB0CB70B9FF66A9D631BF42EE4A3217264F7815C141DB66F7F + A633AD7150B76F1E364A6D33C178B6646497448488E6ABD3ACA55C191F76DB9A + 268B5787BD6555BBA3DF109B52DC5FFFDA7B54F3AED7ECB29D22493C31D72139 + 4E49D4150C7E6D7EADEC2678AA546942041C17571F1E4AE81CFEE3A593790870 + 389DC39FCDE10917E863C46A1E40ACDBE212A3780B3BCD3495099B3026D7C42D + BB9C9A4E1A44B0D8C5013FA259F081A567641E07FBF3B0DC278EC5FF271AEC28 + 2745B17A60FAA4812BBA24671E50B7144B0D686524F5959F36F29C9E475956C0 + 0237172B0BEAE2CDCF08C153A03A99F8AD4753185F836111ECB6C500FD6AB4FB + EBE0599BBEFEB59D4F529CF206D5E342292348B2B8F0CD6B59F90D940E4DEA2D + 4CC61CE08D728653B7D56197427B09B90F06D479EFA3937EE3439388AE5C7726 + EC72D2A51AAA09DB49C49C439C06CBD1BE16BC633A60A5D2162EBFD984A8B364 + ED5F145966CB8DC129A980116F5379D5D4B039782E377ED397D59A20F06E9333 + F7AEE48EB502C31C89D9D642D63CF1895BA62EE171546FAE203FDE5B53B311CA + 4641768A821D653C683E3097988DF7A354179FC5A47708F7EC20149461BED8A3 + 55084D743A115C1438A212BF46535CF9CEE6F437FE0A637EF5B27401E6967C11 + AEBEE3B044CE9D02805E3301D2FB3A0F5F00AEF082F51702AE4689BF220FBCE5 + 4508787A74F576DDC6DC4514F446938DFD331DE5E4E519B7D6871EA5FA1AE260 + DA402F6DB6919A6B0DA02764E5EEA390DB9806311C0597D9D3F25E2A7977EB61 + F8AED9403571934E56614F3AED73265D1794AA3580D561CB19F154546F0AD1E3 + C2565DDACB0149B771541551C71AD7B6C181F8101DC4376434628A2DAE345331 + 39DE8F8DD67E6EA0077D285B91AFBACA260D1AEE256DCB6D4EC744FBB967F57D + 524E11C5531AF1FB78469DB344E0B5EDD6E55F030ABACD77C50B593C45001635 + 9B8E97BCC0A856F145D71FC868C9811148E9B44B7B9DA90D88482E6823FF289E + 02DD0354CC2BA97A60D1DE7D56DEC4B0FF456950F516F4BDB2908485E27807EA + A51A3CF11BCC81D3A9575761C65EFBF054A38591DD62FAE8108C04854154E75F + CDF594C9B14AD2E0A97D6DB1940D6D882AAB867091FFF864138D5EE6E7F898EF + 64FB106F0035D9816536E699051F6347EF854BA1F10F5DEF45478A3050DD12B9 + 0C5BFA626320DC9DAB7B56BE3636A3CAF827B793724460899757755918E2BF91 + B1A3DDFB8E3F69A8D2FCC1D9BE3E7E11BEDB4C318D34CC6813A4D0BCA7484992 + 723409E89B85FEB06C98F5749F850CFA269EBCE996DE990EC4523436334C89DF + 8BD8F5ED431B54F887F1CE678DF651AA5AFB5CBAAC2A7C888D368115319F3606 + AC1CAF7C1A76196A56E83F4CDB34C04BEC725D5AB8753B141652CCED1710AB42 + C25644AAEFB8F079E8D45F7B5BB9B435A80C2137EBCD27DCC53E8B59E2B258CD + DDEF12CF54532540D3A6E4953BC7C24321542B3248B8DEBB3F7922FC5208979F + 037DE5898C407E32EFC58AC958DD5635C199998D4B0742013A536EA6CF28EB73 + 61CD12FFB4EEE4204174118BC2554DD88197A52B290970D728D4C65DD9621E58 + 2FAB5D31627F08B6BFC18D244AFFB69B72E7AE47C9DAF05988A70E711269FD62 + A3E883D2C3ABDAB020016FCF66522CEDB123E27620CC4E44B39B5E557C00CD15 + 664B23F27B2CFE4605C8F89970E69876ADA8219CB67153B5A17342DF7FB90F03 + CE20AFAF03C4E7CD775D3F8D9E9C69EB709592DEC37E92B711669EF9FABCD362 + C3FC574D666A8E2AC8AA17B13ABEE49EE59A5170D2FB75E471D88320723B2DDC + 576E54A24E330E42650B8BDDD9B3838BE8080C855000ADFF6B20F27EDAEDB57A + FDD41C5B3C27A557C1078182ABFA4C93AFFED7843EB63711B126CBE589918AB1 + 57E2D1395B1695F2078B03CE7529ED943F45FE33DF449DE1B65F6197A3AC95D1 + 50B6EEDDC9F7680D64C14C2AED99628BEAB5137CBADE741FDEC04CD4EE7D24C2 + 8237BE6B631A7F5091E17B25774BBDD344322D77A9A9278290C6203352DB7C16 + 87DB0CB44F4C979C2AE37B3316D94152CF21970C770F946317740DCD964AE8F8 + 645FB20C24A194A04F1DD79E31F9618C99EA7D02F19B18673A8C6656E1F3CA5B + 863B56D9D9849A6CDA0E5E839ED20225649EC6394D1B390CA374E32DE1E206F9 + ACC0EEED44D8C8565A47BBB45B5AA1D268561AC83102A55301580FF33C7B6AED + 1B2476459E1050E77C7506B0CB70931188FD3A592D364AC8FB723F8910D20FD9 + 8CB0512084E4F57A3014E275C93A177BE32CEB05141EB55C82AFD9BC59D7E0C1 + BB9B0CE8CDEA149D0CC7DB9623D9C6044CB638C2A1B9D9B4D1D95C2B6810C50A + 09636DFEAD86E174AD2ABB50759F19EE1BB60EE1E743A31FF6A089FB0D5BAF8F + ACFC210065E9868685DD2D157A6A3301A090CEB6947986525CD014D245DA7E33 + 881156B5A5F29254FB2E54727CF5FE024AA8828C7C7362FF7C62A87664D9B167 + D334FB37D304446A136FB3FBDFE16301B0A3C5ECBD402712EF3D21343ABF89E3 + EBC8CCD40296A99BBE47B6DDC552CA136F253CDA15369AA62F42A168FE6FFE69 + 4E4C5A936E112AEB1072246E6341E5D950FA76F89B5D6505FEBB983476CCBBCA + 31C06CB803459628777BE8964EF0CA1F1D4F3B397A26640450D296A3A8E25844 + A207DFAA2CD381F7763B70E6C63C2837EF6678278205B7AB473B7758CA2648ED + A92E77292A5D1FD1FEB89D8FC7D2814C7FF9441AD489F2F72D2ED53FC73DF8F2 + 697B2C0F1A4529F8045482A7487960AFBA6FBF1F09A424A97F1EFDA9A4CDD7FE + B8AF1056C93DF5CD6BF669C443EBF50F286739E1B57A8828262AC7638B90D404 + A2BB1EA11CCF090789D6654A52EF9F8AC850AFAD9F52C27B6E7CCA6ED24005D3 + A2F618FF5C9D8D0A6820AB5EEBABFD5BCE0F5539087970EAC64117C860D4890D + AB7C7673F77A0170635C889C928E27BB75FCAF602E5CF5C3754DAA86633876CD + 52C6E7566F21D1EBAC870FF14311BB4E2B74E595D52DDE3AAE9E7B58F8C7EA82 + CF88E1ABE8B8B31F8B5ED5001C6FCC6AB54C9C352643D1E32B61CCAF59BDEFE7 + A0340454BEEAF3BA4DBCB350D26BF9F6CF0BE109CC95FAA3AF291D52EC2E8DB9 + C98458FB7C58E767BF2276B9790B8DB232DE2C3D139AD6F44842952D4F0D1CEB + 3761A46AA126A48CE53BDDC8AF9C2AA7151FBBE5C37EEC7756FE18A8A45CD29C + 0E5D191174E9DE37B900D3C72F490B08EBA9663E68AFC62E8AD55BE0330563C3 + 25431F9A036E64EB611091B10E6A7600D8849FC7CDB0135B79C9B9650EF87EDC + 2A0458DEB8FBCCCB0F5898C6F187847F74C58F354B3EFC16AB9D17EBF9961B51 + B19970687C6390D530F37592ABA60FCCA00C14A24A54C0402296DAF11ACFB597 + 55EADF450B444EF233F2E80A612091E3DC81620053F377121CC8D16DA84E3DAA + E7B926D6202EA64A59D0E129F349E683AEF0A7D51D59C309D25C429230B64C3D + 6A9347989AEEB6937A8161C4C67CC26BB136FBD0BE18B99CABC1E270F25B7B3D + 256C99B48D059A112CD114133AA85E61561F873C6FB8E0B09F19746D53551C47 + D77D89AECDE9B1D814235AFB537E77A0B1D25865C068AD792C8F328020698757 + BB294CA1FD42734AB2486EBEC5162C2710021F4223D4A3F76F98CE7F6E7E48D3 + 969B5AD21D052385085C5641C287A77213561191479A35E8CD629CB3DAFDDCB4 + 67DB0930A2B956C90971706DDDDCE4B1371BB0D22DD3AAC237621EC82D40F342 + 04DC1FC16B07FBCED716B4129BF6FE2CA9C41D0F926FDDACCE5A49F5FCAB38D9 + E9AF637C2F2D21313A450617300CE255684D27F45D1F85318A5962DFDC7A00BF + 299B95E1A85E7DD1932C626D29E0CDA025ED8FEF38E5CC69E6F300A623FC085E + 92F121EB273CEBB9D8DA65339F1A4A88D7011A31E52369884C5F55D56D2C6E24 + D99B329A06A09507326E0D47C5A24D69388EABB40E2AFE0567C99C321775C7A1 + 4E622A18A6E355EA9770EF6D13706B4DCAEBA182B7BDB1B1E99F2ACFE0DC47B6 + 765C85F0E15599AFA69008BCDDDE22470C901EA09EED374E8AD79E3A98818333 + 6B92ABA34192965CB2EC92F91D66B40933851B5AA57D28048009917DC292F95F + 3F68FC8BA05572652EFE8D60F1859F90EC716CB1886B5E21D7457E9CE57906F7 + 7D648F070D3FF615C77C31BDD9A34B1FD7DA9770B05276511D6BE46F0F6AC080 + 78FF8AC9CF75B5A22F6E7E44BF087FA8477E4D73AE5B5B2A33AF31AA8B10C624 + 41F201754678CDABBC3B13DF00AB039B1DC26D5422D982F44BDC3A316BC0BDCD + 6FB356F4991D3433A830622F70B7B31DB0C1941F3F9BD06FE9850E2EB7E80DD4 + 6B8ADA70E5A54E0608CE8B680D1BD1FC664951E486B5BC5135BA211619795A6D + 67EBBF00BF8949457AFEF63CBBC7956F6001731D43C25D4E532713B3E775954D + AAA3D02DED26B02519529792243DE59859B25E6FE4651478626F77EDFCC08846 + 65AC5DBF140F32D3B814C44F926A5BA3B919E1DFD240AF6D694F136A795D20C7 + 34A725B497F3A7549F9A3BF3CD39777F23D779D46A9769FD637C6A4BF3CAA4CE + 78F7378E3D9EF1545F4346858A3DDB5189E32CBA278F86678C1F4EE22DFE56A2 + 240157E8C3A080B92EE6458B406366C967EF877530DD9FB0E12F7A9C0C50C7BE + D44107AA1D5EF1654714CEAABFD0C3C5FD7C83AAF0F83D7114C6AECCAA176D4A + 000E3DA7D8FB3CA39BEDA918CF942924AAD15F160B08ECC564C14CF304294591 + 3585709F4634C9899E3D45CF469CDAD6AADF505D302F97B88FF022179339030D + 00AB98190CA9AC09171F77670B7CEF7B71590318EF14718F8FFBF25352A66BAF + A2F5834118E888ECDF192D5F0D0531C55897B435643FEC11E3946CC0E1C4D67F + A030DFF2B639699E37BA20DA179980B3AD58F1FAE92F42A0D88536CEEA55E63F + 6DA128D50636890EC3E543F5B8EA27DB0924129A792E12E3AC34FBE687603D64 + BFAE518065694E478787A6BB2ED19962399727862E9C15262510ADC499B16BCD + 5FAAAEA4C207468A651B72774C83D5315464DDD24E312AA91C746B95DC012D3D + A4117130BAAFFEBB2035E2D4D89B4E6E0217FC140DD9973C906904D82FD6995C + E2E203205723BCEA3420CBCC4D3A825462365566F4C2D30ED17A13791E1BABBB + AA8415A75FAAC00204FA2562ADAEABC3431BED083BFAD41D751E50CC86D3B0E6 + 8F359F40BE4C99A298FEE4CC2C861E33B6F58D438D72D17D98674840C8309752 + B6B35DA1B9715B6E3D967A9B52FB881389BBD4CA3641DC1B6D84D093D41CF5B0 + 226E53D7AFFA27D9355C964A9C679B7E387A3C5999B1F146B2238C5F77B92D3F + 6DCB4A7C4AEC7F30F521C33AADD370BB8F49F23CCD2B35D5DA181CF1BC0C353B + FFF250424B90BB3EA4B66E6B60C6DE4F646575F4BA3C76231DD4505488A9F54A + C2455E3DEFC629CE2E4143A9F219E8EDB341469F6B436519E3AE9B1F0486C172 + E6BA02A9C422316AF07A0BE8310AA6F84D0B6E5DD75C1666C5C3897EBFD6E528 + BA5FB1D38B886EF694AAB231938749FEAC6A5006E6CAF450BBC3C0DDA8A6E917 + 27DE03E89A22A3FB166909C69176634AC30C90951D98AE02DBE54ED3E37EE271 + D3D73907F0E6A7C33D45C7B311684AF3436A1D2857AEACF70D2DCFBD1D9BD55C + A0647EE82D60147683F41071503D852155D45AD85899B063EBF6E97A15DC826A + B2745B87F68900D79ACB9EBF74D9C556079C6C4A1E7F175D411A64AB1584A40D + B8F49B98BC58EE95CD7E3B7E2A0EA16A1DC61CCAD706E5E7E58C007D1C9281E7 + 09F70E7DDA6F141E9DCDE51146F732B1A2C9A5B4BD1E4429A21E74F47FB4851E + 0D0E6D10D4823EB915E507DD7CC9E0A7CD3B9A6FEE38F3CD0A4AA85E73AFBEFF + 45C84F188C7FD83CEDCC8EB6BDC47A0C754D9EB386B01F5EFDBA137F25D7EE5C + 15E4E8A3111BEBA6BCE3B7633CE12F4E3AAA910AAD7CB068B2598069888AE586 + 8D0183C089053E654B0A20A778C5AD6D428A67E9742DE5FBA30B2A1EA6D974CB + B2A5E7BFD981BE5FB045013D326299D428719D59E289A143FDC737987DFB7324 + A8261A0FF5224CAA525D9C24746A0F000CFA0847394C6A51EA3622CAF7DDED55 + B726D54B09C6127D0E4BA193E063882CABD22E752D3FA4BD6DF7B448A4F6B90C + 2A0142E2FFE229547863ACBD9247809CE4122D48923F7C41A8E4F4528676FCB1 + 5D35657C825190B3CBC9773510F88F6E55F0A1A14AD46C8FF2921C1B87306933 + 9E6BC800D116BF568718B2F3B4F0057B9EE15E5FCA85126B720F76A2C6230C6A + 411ECCE95E05D38D963D35E350D82090B628CC25BC5C2BC723461033A375A128 + ED02A20894359BC73B3D111D121DB869FE415B6408D11E7649BFA587871B66DD + 6342ADEEF677E5A4B4C5248BD991DD881FBD20FFC442B00752BC6AC3191E4F35 + FFA0B09A32080B1161DB3E8962548A957374E26581052051A7D6E09A28814435 + 434E0E48A5D93F1CF5641860C97DACCF30A34F44740B6507A28D812E64EF4088 + AF34DB5F95947C0BC5C6210B2839479E2F1B921CF963682344A0405731730EC1 + 0B44DDD919292D2221530278B536893FD16051196A45277175A003BD120A70B5 + C5BE289575C072264832809D271E55F3754784E51AACC2F6364E3367FCDF9187 + 7A68A2CDEE368231B72C289C040462D69CDA4E26FC32D24630D08B0AD0BDE2B6 + C02D3C0BFF00471B681A5CFB301394A72BEECF5647BDB0C8006C0FF1DAF40FB0 + 55DEBA8C6CBCD7A0DD27BA39180E6DD12271679DC571E5E8CCC33C363CD0DFB8 + 02521B34139C3514FE4122E3C26248DF880DA01EF8BD421A5E30ECE022E120DB + D74E16FA80FA2F1997EB804F17D543B38A314F85FFC4F9566CCA1D2332F4DC49 + 348D44B82EF497E7F27DEB3B5FC9F66B6614BA3F970138383362D0E59983093B + 072805078D6A3C167C79DB82834916C24CA46CC47A5E5D480AA9A44C445E9716 + 1ECFC6DAE237BF66A3A7217721508905CD33650E08B1C7C511A28ADFF14D38EF + 1311EE90312DC74D55D221BE1CCEDB298A43309AD3DD9007BB08A6EB69B13BC2 + 2611DF4B054E83D3E0AA2AA8BE73F1728D8E0E3AFD6D0411E81DA3BB148C5EAB + 16F0733CA1FBA8FBA84C8A3C483667FB62C879961E7E695D607DD76434B2383A + 43941B02B0F4FD4B615B5D949FB141129E0B67806F49FA9BB43005CE9F5B5D3A + 9E0E95DA897A8B20333922D789A3FF150E7824DFAE2078F67615447E4266D1D1 + A52D568388A1CE96847B0F77813221E049FEF913E17A4B0E37F5F362235894D3 + C0C19B7777D7442C39304368631A2881C4CF03C60CE54076B0CBF3C7B91C7392 + B4B61DBA8D6392885CB7F000DB2EBEDF1BB93117D6B9B1D432CBCE3F63F36C09 + 55FE99040B0EE6C003B844A7E6BC58F0011E17F799120EAC87424BC8869C8198 + 67B5FCF19EF4131B66E56BD2FFAAB92DFF34A9951AB9CC63CAF8B9027D338AC8 + F5D5371C7AE27675E5B8D790A1901CCA7628B4484C64AECE23316B8E17650F93 + 13906C730C824EA1A95DB9D2BAAB9FB207799873DD4F17364BBABEBA08837F45 + 2F99F0C15FE395125C816EA40FFCA8662B362663C3C2F8591F2F7B61843291BE + 2B6856ADEBE40C00FB3D847B95500CF08DED40133AD625A48D00C31DFA11424E + 2063FB2842642FC0C30B07065AE8C02A3857D63E831A46DA8954D6295D41E208 + 41C5FD103267AF0A3B2A5D550F7B8992B36D2ED2F1C29653309144E025C9C22C + B8BBF7DF78EC58568CAA880597DF881A1D9EF50B458C6B35E9E470993F40619E + 5C3FBB32DA0A8E33D976B576F67C4BFF6792598160186C192565C3E4C71D850B + 6B35356E4A3D2277391617ED635DC10D7761593DD9B45D1A29E57FDBC96F183B + 1F6C802AD1F992E1BE9DEF23B0C7C7202034579F1E2108EF941F6884FEB9625D + 3EC5BA5CE14E5420B819F7694664A8224ACC2F1BA3D88F5FD588611ACD9F98B0 + 764583CDD35668D0AFB1EE4C6AB90205A8CA16EF528CA3D6822DC04F9ED1D883 + 3423BD0F2088E2F141010B159D927AC595DC41088CEAEE3836DCFCF6A7B20832 + 362B431B359144E2DCC8180FD0D63104F6253B12FAFAC902C557924593948BCE + E760488B506489594EC9F6DED77AB531404B26558F2B80247144C7EBA41DA089 + 8127A314F85B99FDDBA311961FC5CC66FEAA064A0F91567CCFF71AB4D17EF851 + E6199D9BA9D9C54C90EBA0E2F2187F9A1234517574D5554E2B59F9F152738B5E + 7C899B184B63E9DEED9EE169BD5E21F82EEF762DAE78DD25908852F2831E5C90 + 89F1BCA499D39037282EE83224DCB43D785E13E93BB7D68A43A283499AB86A41 + CEAD535DC60CC200F60A3DA117E86D53E314F427E3B499B412BD81561A596B54 + 9E272BDA5BC9E1FAD7E0AA741EDE4A6204065A48108E7C1B4B5AB31B78A35448 + 7F59056B2ADDAD1470DD94149E583A728F11DCCC3B9CC26210DEA187BEFEF53F + 132022CF94D62B1A32E414E766B61FD3018D23F9EC43F7779A5E868E014AD274 + 6280E3C09E0D6338EA772C907CC7E0864026A567B391C9C384D571239C4B07E8 + 5D69623F5B334A48C01F59939EA95DE46CB1D7C5CCA3164C9625176700C62D06 + 8CF75083AA5C34DBF7D99A7BB76A49BA7F86F27655228E7F7FBFBC1353A1F265 + F816FC421DF7CB3A828F8809686786C7E3125E04FE2A5C0DA940ED496B4FE43E + 534EE8845003E23A6C044CFCD646DB1A6A26810B40891D4376728EB773E4BFB2 + B27F4B7E68EC751380F2D10BBD3F8216D5A8880C5BC37BB7816380DE0EA0A4FA + C5FD212372BAD4DC928D27DC3201E38D4B7965C26824301F3817FAE62E548FB5 + EDA51B86F5D1EEF70D981564AED8B02A1521E610799710D8A9C6DC84EEDA2D06 + AAE228A8D991969CD62341FD968C9B29CD888515726A7E1E3070F311E1C15A09 + 3B73544441807DE088F9B12160CF63BC24C43B24A1C28AB1262F767345708806 + E22846F903D7196B93182B4F3A76F46682DA369401E9D4B1B0F940046EF3359A + 485B01A022682CD97A2397AD51292FDE26919614C39925C96E15CCC79C203706 + 92D47F40782C9CB919FA96875AD6A21A84290F56CBEB34BB54138F39D82CE443 + CB1F3AE8822477027A9A0DD0056855C47AB850511FC77C749B2EB2440479A61D + 0319E049117D61442CA4C648B0184401ABBEEDB9F12A14EEED6A30B2C576BF81 + 09384737582A5C6A562EDA458DC8B343A4C24E892727D7713B1AA09167F1D204 + F197E5F7A687E76F87170EE4E3C766DD8C5BB1D7D9901F244D8B47EFE44DF138 + 57D7708FA0F7F6FC0E81C61AC38F64EAF873CE3EC5F8F201796BFC2E6D93482E + 53E6D0DD61F7C27CA8729AD7B244AA6D4CF17C56BBDD7D7B5CE90E7C76B743B6 + 0D1B536E0CC7870785E538BE35D7627943C528B88D7CA573BD429166A74F75F0 + D36FE3E794E66BC5937FE0F8F185ABFED1CC3BF979954C3D7789E15025C1095E + 0AACB4DCFAEE557C374D0B6C9140C7E98DC564AF0F2B7F943585B5C0B52E69E5 + 5DB4693A042BB28FAF27CDA13C2FC486D31688355A3134C1D8E629E17507A632 + FD0FA7A99B50D350033AFD2E9157B0C7EF9CB0445A1151E3E1234D3F699140D8 + A0D7598A38C890A41155A025691A8274E663FFAFCEECA733121C4FBAB02F1AD0 + C90EF6FCBB8F8A774A14F9BA2F98F8551401ACEE6E5AF73EBC96BB02F864F65F + 54FB1F26101846258EB0216E9527FA4BF3D701441A9B04E1AAEFE136C83DB0DD + DB6A5250ADFAC29B7AA11E5D24CD3BCAF585AA44185C3095EB3EA0498D257B27 + 70EF25C2E8BB3358C8D47A80272500E641CD4823C25058FB247FEF11607B7B5F + D0DBDB9612D449EE067318C2B4E74BA771A554995B04AF4EF856ED6EE7C50E32 + C7FC84E0D5E20C999726ADFA481887CF51A73E7C83C60AD5721C4318DC10D41C + A6FE0BC8E1FA9FFE42D9316F21653BFF2362A0B70F1299A37C4AD982411475FA + CE92CF8C652B4D33B6C462B0F545FDC6D70052F58A1F3716560E2A736FD09404 + 1C04E6081CD1AF63CEB3FE4B3D9CD04F9E9D2E2027279627CD332B988039AB29 + A54E708EFF9292C150CB845B3B22B24B99BE687024EFFAEACE4A28ADABE8987D + CC95D3198DB6929B2D768CD001E14DFEC6D755BD7F74DA20852512949C555552 + 3987A708D1D9DA4831CFABAF7A3E9AD970E384B44E3A8260F8F4B08796A21905 + 36233FE34113AB20F9387C62EACC2A04E54BE09D4FB773B47EA0C73E5140802F + B2EF016AD675023267DA33D5CE7FF5B9C4E00D4BCEECF69065ACD63B27738A9F + 0BA5CB135F1222DB6E63D8030DEF64D14B5BF599DBD72239EC0CC305B950847D + DC58C9028E2D37C075130437EF7934A738CA706E9C2342EF3FA6EFD66F336349 + A83F354A2F8F24C22D19EA2FE8AC3BF08AD93DA7FEEACF303B2D780F9E424594 + 32A19507AEB0919DDFB6B396D57F817AAFD51FC3D387AFAFA9792FFF344CDE2A + BC2266176A8731E5F3CB9E466A2A41FE81556D2A4D503D0F61889C7F7CF1D4B2 + 2C634D58F81DF62FB770FD5F3F44B221BE19CD25EBB7F420D93DC60D247CF541 + 6D9E0924B7F28A5CE70A98678864710C8B9678710A90A9B9EF50F33602967BC1 + 02776DE5489C8699331DAEAC4FD2BA11F9BC2B957660E8FF82BCBCBCCBA153D7 + E438A514CFFEE8DB3BDF8AE63178D01ABA9D029FA29347CFE3CF2ADB5B2B06D5 + BD30AD6F0D328B9886340812AD5EAC4488A2A1F8AEFB739E73094D207E69CE22 + 1AD38B99C639FE5A464BF2245CBD29E96D164A0A07AABE123015453506AE553F + 3E2F3F6392587A1853693A9EF713AE8D784345C5E3F8B73EC3B7AD3252CB6A0A + F52CF8C59DA49CCE0D5A8164B8FC027EFB874E43ED02122C27782178103315C9 + 507C90FDF4AE8C0F58520D024CB864E4BD8F7B423E5BCA4DFD1F044C1BEB2986 + FA468B96E3402A10A0B3185830CE5AD2F56BF8EE198FE076C3361EC35FCDB400 + 779A5EBD3320ECBBBD3789CC921CAFB85E15C2D5CAA8752D1F152A14EF281218 + 5F779D342C37C8F0E287A2F18366CE027D670621D2A6FA60E87F5A5805CC90A6 + 141DADE1959FE08949E5CD55ABF790560765D56E4C85FA893ABBECF20F8AF13F + F334C74579CF89E9F4CBD9A47BE9DE7E050E7CF63F3FAC8DF8D6804AC7FB515F + 03B9C4431A4A7D376804FDC763EBD81C62B2354B3FDB5ACA9DFEBE09B3D7666B + 3633EF66D7E4E903C273D1D6AE0D02EDF11FBC70CACC06372BDA0BA70798CD65 + F5D50100D05176B4AAE693531937769B040170733BB0351D33F6518C29286A70 + 27F1C1FDEA5E1CCEA3DFB91384C6A0CB4F1C956565BDD1D984E179589B8DAFC1 + 1564BE8B02209348FFE16C60B433DF6515AE1A43DA9109030F5DEC13A5362129 + 5E24161C102AE64542367C8A1F40625BB9076E5D53913F6B43DE52D8E825C12A + 00E07AEEF9727BC4BF8F6A2DEB858938C9068EAF891FBB15B30F70B86E314E59 + 998A41FBCA38E0125597C3124012E1BDBFE4281EA75A99168C6C33B1C5DA393B + CC68FD6B68C3373E318B2D49D11737085E6498906C1EF952C11674A2D9DAF363 + D93BA9A3FC52B14E223089347D8A548FB380184EBF47EB96AEE509D46D8CC849 + BE63A79A652ECE1AC4CB2E6B3961E000D790661FC90B45F72FC7DA0D99AB91CD + 041D0F0AD4DE42DC383C4BFE5DED1A6C9ED44023637C172C89A6B213CEC6B44B + 84F6DA0A7BB4B46F4F1B6791156B0BA74B31A2A4F8706B37D717A729E46AA435 + EFC3ED8ED23113F2C8B71AF202EE4D8A79C19B254680659B6D2930AF8CAA2B9D + A46F961FB6B1C8D91977D98961141A8A2061A2C2E225863601926B717C751BDE + 2D5CBDB5688C3D379E80E43A7C3319C60854A3DAE518E2957634345F84907661 + 9DE9912B8B3FEB72F47869BA2F4740DBD7CD54BCE2F8DF0AC235CAB1B4F904C6 + CF50DA353149254CE0E88B6A4B81F536AC838E6E4A22642CB5921737EC6E7C49 + A04D5F0F4E1B1B8E33400E0C4CE90A4332B6671ACFBBCF5BF06441EDB67B37ED + 890B2ADDCFB3F898D6AEB59A1D2754932E0696756DC94B488068448270E76D87 + 2742A7FDED0FAD8C9DBC2220AC7B37F7D0B7D53757B4FDBE9E9FB18351630973 + B357242453A2D1F671B2CDCD69926711E5EA8924D802D3757B13E058E4E51623 + 560C3B19986A02264C848BB3FD80BF0FCA88B525A3A709D53DC26F88EA09C688 + BD0063E4286D80FF19C2FAF67D422751E2AE723E77FE7824223BBB0431CA3135 + 967D3F1F322E70162CF1800F5FF8CE54B60529F2F4283E227DCD55096D853F4C + 07583F23E797E28544C862B3895EB433C3A1CC4B7CF86AE11B86D03C4ACAF459 + E54ADFCB9FD6F73384009FDA17109CDF8188FE5E308A13B66FCCF15A1EF0128D + C31F3F412938D43F470F30F3F0537CEFD282369424BA1B8242FE3A60A88FC5BD + 737F1305CF784B66B326F518536E8F86E951375E0B5397198F24429AD2674645 + EADAF13D700B753FAE75133A602C9700D198ACEE2679FF849F47321C399E9CD2 + 05C0B6252849C4D827E8F74904CE186F6D79F4D3C048CCDEF05EC122707BD905 + 79D9045FD16935F8553865C8296EBC794CFC32060313C5A539D96F5D3CD1F3C9 + CB3DE8EF376A9E5D64C3449D44C495E81FC91B7D3C9C470C83D7F108CB4B603F + DB2D9FD4E29078A171F4717C1A94F51F1C2B786F417BCEDEEA957461CC174896 + 91A5B043256998716381E843EC7E6F82839D98E2C7BF936FC6E0205B59648420 + 6BAE1F221CF366BA96B88799F5D12E06077FD6180854386A4889605070747B71 + DDA3B8BCAAA26E3B1D0F2576E5199767EEA10F510DBAB888D38F36D424BC6382 + 738FA6B5B2DA9AFBAA19C100FBB01B415AEDC1A951F41755DFC7E9F4EB67D9B6 + 8142C7C3077F638A76EB503A2AD2F69961072635F567CD8EC9749463E003DBEF + 7E0724E5414B9521048C860078F5946248A8BAF885473C0E8CC022E74C35BA51 + 7DB29DABBD58F6C71360D68AEF5A62F19667E6A02FFA1766E9B4FF376DC557A2 + 400F154DAF277DFAE65A0F571EE62C7C227662B284901A609D7A6F9768CB7411 + B9468046CD4DFCA84E112B233589FDAE508809DA855B84F738881A1ED5A97C91 + 57BD7C94D6F4D313D7B9E5229140B74EB2E40159F1C91676EE3B8A47308223E2 + B320701AFE105941A47E0345FEE521183EAE75DF6D1A4E809E72D2F2394827B7 + 79AF5FCEB13E58D443162F16B7CCD64218198B0C1CBD72467CC4146D4A91D898 + 7F177F7658DCA6DA46E47026B211202B1BAD60F79E8017305FD769D3DD054935 + 88FA73098293D8733334028000872F8367E4D89745FFF758426D621DEF2AB2D8 + 1330D98C1B35DF980B5C64CA341DCD96462FC0412C385676411A1EBC4B3CB613 + 2DC8BF7FB1223FB71435F31D91792744BFA5529389680E3DA9EDCA27A430890D + 195A97D1DB3B2FB5020419213B74746E8BB7441E7FF7FE5C81BB4B5FF2D87667 + CFE9CFEEE090F26C8B3892280689835BA5598FE9178A6ADC05038261335CDFBE + 56F02ABC96D95C02B0E4DCB56A8108B19FF26D92664234FCD7794B2F2AA2F32C + 4771500133C6EF95B5DD7ED7DB48CC98F433025260D5F7B4A46209244FC79217 + 9B31B106BEA4F95C867380ABCE1D9A1AFCBB2FC0C977F38B52BBEDA251C8B46E + CDDED593419E564218DA2F65188A89E857CA9F71BF4A47FFF8DA6E427F083B86 + 8DC22A41E187500CA741BD2CFEA46FA11E5065FC62D6EDEC9EECE1E376BD9CC0 + 0EC9D96961C5558029B650B5F304681E99E12712ADB5E3586106B28C19B46D55 + 4D5A4870D50DCD9611F7237F425511837762E0192AC419E2B33F60CDF2ECB420 + 3E1D1856E02F5DBFA6AC0F610B3EFBD83EC23F2A2E658F4EC5CD68CB5B68CFF6 + 091174BB71EF410023F06A4621C0128C6979204D65A63BFE21E7DC38DF13D20B + A41AE125F850FF69F2B1F5B4125548A87F02D341592665DE119FF20D402B621C + 9446639AE1B31F7FF9B1B3BFEA1332CAB2038EBDA834E10F56AE8CE84C71BE8A + 6E48F9EEBD079A0A765CA637529D26806A73D46BB466EFD574E50999F65E8F8A + C0A08D28F3F6D77F155BBF26CBC24E478BF7979D1012B705559089699AD70858 + FC2E0F4AF05ED631AC5B068BD2AC2700DF59EEBA9CCD7EF49F6B3BAFF31547F9 + BC9558E18FA0D87856F2F17158776F1C5889AAE7E6089DFA6B2B71A6C823B00C + 19F028C521D86D6E8A933176C363DAE90F1260566B45A8D4AF75689AFC2CB234 + 89725F84E2F91CD9BB50755BD07B80B0975CB1F29E590A99922877E90F328E7C + BAD59A3FF7F5E07D9CE3C12C5E4AD9CD8E0ECE5648651E5488EE0C6F32DBF457 + C484668CFA377C2E7DD5C5BE31CF12B771C740869517EC7F156EE966F8ADA714 + A46DAFEF7FA3A7AF49F259A5CF200243D25DB34A15DD00C7E06BAF9DBD4EE17F + 5BD830C7DBCBF7A890E9406C943D4E086160B6B859F487B763E0BCBFFB5155A9 + D90F25E552A84B4BA7FA10568663A9D80353EBF87877ED9A79A2E3B815E348E2 + B27BE1DA6702092B134CB7026A595E1C2A75087846B3B8A1B3ABA608E4F375F6 + FCA9C952DA86F0421DC54C9AE27B0A2D3CDB217018F47927F74C4773F8F88D34 + 69ECA096530B072BDD6B136BAF2D254B1291310287F591377D429FD65E7318A5 + 7B440D0A161ED03634AE380A04BDA62CB8F03492B1BDBFA1CD172FBA954302FF + 226ACE7D5B7DDD8908B296033F201B8221173ACD176DE7F6F009390660509120 + 8920562BEEC05B592669A2178CC9D20A69CF22D26797AA5565861719BE16136E + 815E5EC7AE1C473F1A03CBB170454955A3F74AACAD127AC14B0FB307262B42FA + CD4AE7CA6F60BA3C4B3CF8B4710F4EC979B471865B8596B00BCF20490905E403 + AC81E09855AA4E79C870D3D33A7FEC2F8879B42B3282656B9B40BD15622B9792 + 964571A671BF71F369D9ADF7BF0213F01DCFC6A53565B915F55A374F85E77224 + 66449FE859396D519C50132C92D5219BA7DC7785B6604970897650B4793FBBD0 + 4EDE56D2347F43B0AAFE335095E8816CBF379A27C70FB01DD516941098A66FB9 + 278805AE5A24F9A1FE69B5C8BBB1822BB3C47C842F1CA1C89913BCE23EAB8647 + 15CD6660CD3223FE616B64964791E703522FFB85DFF39A92A641330239049C68 + 53D2650B8E0B1BC9D7332B7E5EF571724558F329110142B04D699834EC68D519 + DEB22CE4733C50005045B520B038C6C6FA4102FA4B5F1B4CF0FF777C0D1613E4 + C648CEB54034B42E041BBA3A68BF0A5337E1C8B1C105CF0E347ACC8514BF65A1 + 3976A303A713E2E502C5C62224FC4BDEE6BBEB425185B6557CBEE81526A8E707 + 7626D1663B7F1DB8EFF63157D29B650B2E1584D86792F1F1CD0F331CD226BBD9 + F3303FACC384B5C40B909268402DEB37C5A9860F6B939FA15C4B5EAC786A7DEC + D58E647ECEFF2EABECAEA0F05D249F89C30903ED5E686C2E84F345242C2EDF23 + 9253CFEB7DC01A43F0C0B46640E81533884633D211B74FB3A5D0592F8EB94819 + 43C6A5E660FFD8AD40E0B1E6B50EF4AFF828E338DF3AB9C327D2E516C86C178D + 6BEEEEDCCF8B32905CADCAA1EE12375DDC6EF30733EB90A5EE66A83B28F2C00D + 4ABB2981DA254177A50E362CC3FAC83037F9BAE515666CACF14A01B9B57B595B + D5A8EAE08C0A42DD48D42910E30C35867A819566E6F048D3B909EBABA159D267 + FFF4C55CC12B5A5D876FF7B0B032012E593FD5265A467CB2DA7C5586CF1BFD78 + E9A4B066C058243FE56C5AB4379AA453E72541DAEE5973CF463EEB87B6B50295 + 54CBCC1101058CAA7F5525350370C064B92BEEDF23A08CEBF155F1D2E8B46C0A + F245F44EF179505F57FB4CEF271C5826F00F322F59A4684B3D8AFFED411B0957 + AD7CFEBC8153328C043E8D53B8E40D92E51A437008CBD238089FE575A44ACC24 + AC8F5B1F6B25B92BEB6762D7CB80C0B0AED644147507DBE05349DE04DE3AA7A5 + 40C551BBF099B46FA74D0B0FE8872D994788ECF772CC65385BE59758C95AA150 + A1FE1BE38C8675D272A6334932365D629F675DCF3EEB6F1886547367B8A5A39B + 8906971D7FF412F2C53448783031BD9CC109CE450DE67E29BDC39302C18B0E7B + 1EF42B69BBD957D94AD70BFE77330A257111BBD261607B5B5778D45CF3663441 + 1FE4EA373F542C2BCADA91FBBADD68E69FD9AB7E999482307476A7430D319565 + 41A371F660BFFF00AFC9B46981A948384B2A83B1871711F6E82F732540B897D5 + 51C8D6A9647EF43CB31E6BAFC00A25429E5BBAEDF70879B764A7645A106A7142 + 22ECC5F6EF95748862285F407F1CE08C8A086A09A58C080049F2318D2B392F13 + 454C7E10B0D0E15D75B3A977F8ACF1554208D28B63ABC887A65D69EF5B1EE4CB + A4F06D3B8279AE97AA36BF9B16263675ABF8C378F9E7DF4CBEDCC03E705C34DA + 374DB462EA99CCCC9D1FD2CCC7078D06BE46CEBCB659B9FD88CA44CEFA9A77CF + B11BAEC9C081D337553912F8D58A50F4A45C3C7503195A5AA10E22F78AD21CD8 + 602827A464F9805FD00C2AA4199E7E9B33923A0AC6ED203E5E58CF826E33CB4E + CA9337D39F6EE56BBBDD2F4BC3EB27ADCC217D6EC79F6841DEF9AE82810337A0 + F52E0193BB62128121EDC27DA1DAA9CC24572692E56F64C23617F67A8441F3EE + D47D5C1CA56590DC0531B75B5EDE8CF4413E60CFB868BA9F0D27FDF7787BCDB8 + F13F0C5C9F9F749A1CCD413D7ACA8700FBA6ACC9AE5D0C4EC73FE3FFF8A62C64 + B9BA399984BAFFB3C4287F45BA311C921020FF90AD6EF89D5272E2EA96CDC444 + 7248B7FAB06436DB95463368791ACC30B8897341B8DB33618368AFF5A5A73D1B + 772D43F037194882F5328B468B25C3728797471E3261D2EEBA1EBD69EBD86D6B + CE26DBDDBEF15AFF62827C64452F841926EEC3524B640826374A80E410719EF8 + 97A039E25439C17B31AF2370C8D498260AC5505FFF2060521113F6A3E29DAC4C + CF283021F4DD6917378D7358A5D03DDBD95AF4DE7CF10DBA767AC100D51C0B8A + 2FD58767610FA2ADC366D39E2C204450681DBC3FFAC765CD5588CC0A1CC9479E + 6822B2D1CD785D700E2F4684A2167B584E257DF53E681D0D25E0ABBD5E281A29 + C24A997172D00143D55E112F4974DC430E967731B2B9D940C3619FED976F4214 + 7AF362DCF85774746000B34A462A998DA8200B5A3852D2B6C1EB336F12026693 + 4A664EA7AFBAC4DE16A88D4AE27AB15893C4DE003721452B6F77D36CEF86BC90 + 3EEB4FD4B30CD23BDE3BB218351FD3BF0B5A89866F7EC4A40EED6793D0C62EA3 + CEEA3507F5C04D38411BE356472BEC194B8493F5018C5A255BC4FF97317D4E8B + C425306093B3B3C325B317137C2336212106787C8BC9E6AF6E465E35E6B8DF41 + 28C1BC138E89009519603C7C2FD1BD5C6C5FE490E298568FCC60A331CD299B61 + EAAADCE321B4BE8A14574CEFBAC8A8900E4F39FA1D0CF0408CE67C77F08261B9 + EFCCEF71173A64AEF366A42C300AC9B4214DF25995BC5EDBA90FCAA3F0756932 + 19796F29D81D571954558F9A0D64850826BF40263E2C5D0DB44C0F9F078E4073 + 2AC87EC87AD89178901A0D34B33A19E053EC098B3150DCBF9DDF287816FE9CC4 + 8ECF86BEFC30F3E22C618286EAC6C36EBA595B51D1EA66053A1B6D2A2F01FD96 + 408A486483646D4DF996F0B519CC273E59D7AF7473BAE49026BC912216A17D76 + 9A34940B2BEE1DFB2ACDD40BA3170BC4D02B88485ED47D964AAB67930A8066FC + 2575364ECF3C0B01DB2FAE3237BBABE481753CEF96CD37141413878C33961F4E + 8CF6278915F5410767A2957E5D3169E3D75DDB7125727A8C0F57AB119C69DD40 + 7E52684743BBD00C4DB517F5079F5B24F2AD4778BB7D4E681E841FFD534A1E98 + B1D138CD9CE880F0871768011D22322292FC060D30380A23783E6F31C078B09D + F57685CDCF1E0E113D23152EDFFC322594F9DFBAC141541C2A83B5695F176E7B + DAEFFD367FF69595919D74A7DE97990FE8263112D3390D4C146125C078F89398 + EDF6B6304858C5DDECC065FFBE03E3BE4C7D1B03494CACC5FF40BA7BE4B8C288 + 62F17FFD212FADAB91D552F999F1F63D0062E3A8F722F33A442E3AFE5AF5B942 + 4B40F79A069307D5BBC68A29D1065A7C025F92C10BC6FA93029D86C618BD6D42 + F9F02FDF6E0650B024D9E82EABF5E8566B306AA75F58898137096A3F201912E4 + AA53440D726F3A8483363104E1C1831EEBE72C1C65335DCDBA00CB0ACF624BB7 + C16772AC7114ED7D5BCCA84ADFE28597D6612D1D16C99992F5BCC82EAF285B47 + 16F8A6DEC91A50E80373406446229975939E5278FB870BC4D5B981A3D4D1DE60 + 597854E1B6A78E66AD7392AA152894DBE57325C1BD90BFB08CDB0881A9BC5662 + 80EED3C4E1845F8905960AD6718E81552EDD94383577773F25E1F6CCAF12FAB4 + 15CDB8B94052C9F430875D63957CB4F102F8DA43BD56D6BA96CB67488F6435A2 + FFFF9D0F6314376B075D7923F749FE1FA02E89D1697A12A1C9C10F947B0F0A71 + 3C0C98A23DA9E4749FD25C4179194051191DD03F4A9D677271EEA5DEDC8FC7DA + CC3BCE2DD71A6453917C3BF0EA36DF5D9D8870541EDC17912BE51EC86D31FFBB + 7ECDAD7E3BB0EB2D93F6DBD8CEF95836CD1C4AB38BD6E6090B96DA85B9F517C0 + 21D44C501727FB90D70D9DFCFE034D0A4643730FA162633656302385BF79B31A + 0EA0801512008BCBC8736CF01AE382149BE74449711CC0F181AD08DC07298B41 + 7AB2DA7CE18533E4A9503F193A659ED9BAB67C7F150BA04635251BE1A626B6B5 + D4241E6CFD2EE1224C3E818582D082C6F73A8157B3C2F2B037C8325FD875400A + EDE69B3882A9458524F0B5A9C10F47398A9B98540BE2DDF736DE58395D51A1F1 + 9343383CC77B82573BC56730A221C48CC17C4553B05BD631077257C5C3CC5E03 + DE41E12DCF9856BD5922E697B80C854890808D91CB4A403183D04AFB1D91FADD + 7F745309D01C58C078EF5A22589500A1F82A580A71028A9D3D9CBCC13381D6C5 + A6684FA7ADE79D339C824230D15EE191FE74EC6907CD3AB70D0B7AC68072FD69 + E7566A8F5F325B61C84D3058D245B61740D8B17DF73B380C1936F71691BF8CE3 + EC0384B626334C850A2041F6C9FDE1E9999975E5D41779829B817DC683CBA598 + 48E78EF9594CEA1C1D0673EF83239157636AB5A76F173200A3FF0746E30C7C46 + A77C4F2F542B1D9B152D11B338636828504DADEE2A6FA6903EB56DD5A77D1499 + 1A48DD4745659C90FC75D065D0E4B6080769095F16017A4FE5553DCC74D80DA4 + A7C352A5E6E5B66493AB0325BA4D562CA35481003D01EF6FF6C417764188B010 + 3156A2BCB475DE8C79542BE2863E5408D298983350B9932177C5389B76B66FB1 + 6A449C9285CA4B819FB99914F1D163F7B50912843A39F81AF60E0973C40F43B8 + FFA331CAB4D9C493C98234C330F9CE5A2F5D4BD021C10BB197115999FDA23A61 + 97F973843B40210C08AF43559070D09B9B6F0BED0AF1A7AD1D26E74402B92A8B + 6A0E92240DFD38C37E190B5B670BC8AF08727BFAFF2DA93F3072C36A005A914C + 739673EE6BF33FEF3EC4B0A294816011BEE7039C6FC82E9306D3711B9F0FD7B9 + FDA88801B916D069B5875BCF853D09C91BE63723928CD8A12EF4898910F61090 + 8F1719D323716C8A625FA25BF896C315AEBABA554303F46B9525DE7790AF0998 + 12841D7F967360B55C523F12C732B0B3181AC6B5768568E0FD53292DECA6B499 + 27ADBA848AC163C0BEE7558184C29F01AC14ED54BCA98E8A673DDFFE8145607D + 2B0C9F33ABF381AB8D6F47A76D7550E0F6CA6D49747CCDC3A7E45982404A0C78 + 0FFCB2257CCB71ACFA024A0008BFBF3B884EE41D1F9B39EDC4A4026683CA2067 + F1F599DE3C002218F48D38FDA394A841C2AF3B4AA6399828AAACDCB7E833B7E5 + CC602662F204F5BDA78935BDE4AFA6400338966B3A9D02D1233B7125078892D6 + 113C908FEBFE8E7FBD1A9D37834C114C26C38D01A2BB380E17FF8D65CEBC8695 + E2BEA9E08F1EC6C3256B35183701A8B565C646247FD3DC31C041D863D6015A01 + BD66E1A0B7783B9514DC75C9D25FCE7073ED6D796B80D23F602409611BB1FB0D + 325CB94C1CBC2FF49D3067B20B58E38AA67F75987A62354AAE04E53E9EAED79A + 076FFC79214E25E6A3BE79DB94E31246AB373669044F4A04D25A5EE1C0C3F2F4 + A99883EE2694AD494AD95A76665E2CA9C32F81D9A18F0271BE545ACEE2856592 + CB3FBD47844DAE2CD992D7E8F9823008B7D5A1D54A699B1E21084A935EB91870 + BEF490B176801EE3FF1B0CF5EF529511B4C9ACBEDCF9B0D2E1492C6E8A417A66 + BA5B70A8A5EC603248F2573133CDA97160FC6F37854963D21ABE77F3538E08E6 + 149C98380884452A2C831D9751B28F7D9A2B66625AFB9C270CB24F4F4D9EF98A + 350A563AB6870DEDA6DF5A1FB55F12E5E1F345AAA2FDD5DB8A65D77C6EA56D26 + 6EEA82880A782DEEF3C6CD889DE76CD879676D31DCF8DAD04F5DD199B7DF8D32 + 9262FC346B6D74C7636DC7662F91FDEA7F9B12ACF67F2701492EE4048DF22184 + 0FA882B8BD3D3D4B42491B726D59797B7D8D2E406DFF53ACAD7C8E1E805C6F58 + 236FCE5D392A2E009402261C33326641C56974DA66F9CD6C4803F825C703AD88 + D1F134336D69068771706FFE35F0C30D32755E97697D425E0DFD81DEB9A60D07 + AF515939FFFCD96F1B1F0A1A09F5FF89410B4BFDA312F53197D6AD44E4E81D7F + 253566BEFD684A19FDCFBFBDD87BF3D8EC15AAA11DC98D807BBF91FE6A63F2D8 + CB32AA593B2A271960D10ED3858F3EE929BFB6963DF2BDD4F57890771F262861 + 4B32758FBB163E5745D793C3321C1A18DF914BFF37B57DBFB3C4301CBE812032 + 65870B75F41931614A729F52BE2E3FAB7CF442120B58D6E7BAFA1A39D30C4EF3 + A2453EB3D5A9BC08607C59438787ED9822A370343521898886F54D73CA54CE81 + 5A3C0DE2B5E0F1C9F9ADCDDD1B42242562680DCD6A688B0AE334C66F17661542 + F03DDCCCD64E9586EDB8AA3D653144138E4E4D9A90739700A231909E51EF9F58 + 45D87D0CAEF5C1CDD98608C2DFAAAF732F10BC36EABF4BCBCD635830948BE8CB + 357772A871E4172E4946DCCDD04C044FDB868C5EC1EE6E96817D94E8F0B5B017 + 2959E569FFCB5D164B10A9EB7B94522C3BDF2957C721847BFCF7DA77A1CD242E + 2345B46759D42B18002E5BD6E6CDF8F7B7DF14D8B4B7ED0F2EC44BC58EDF435E + E930D065A7F6D2C7013E0411394C2A77F3C4D091E0339E08ECCD38F3CC4291AC + 4F17E959F0E49DA2B52ED46CE35E8E396D1D9C8C2B0615195AD4AF2BE5696C82 + 72632F6EF88083D6A269377EB077098188C96F738770ABA5A5EDB5B563DCC9A9 + C0C7A5C725803F9192EBC35A96F1AAECFF25F64BA4A565E2DD064A0E1BACC9CE + 60EB7281F7EB173851246B8617072BD1E66E134F519E0F1E404F27219AF71AF0 + ED27A4C9F71D6AAE1458FD394286A57F9E44C3C44184FD71094493EB93FBCC37 + D95640004D5B5F2E6B0C88CC9624241D3FE3041266F349295A346779B4677C80 + F377DAFA6C9A92FCEEDD04F71E370B287CC3D330CB1988F69EBF880426772809 + CE104D285B626CFC15643DEBB8844EB1E10F9B87FF6F66DB46CCEAC261C23807 + 38FA8DA37FF154A90F1E3CF889A2CA6C66B8B2FFF2FCF0B6DD2C718543E9B76E + B8954A9D17AB6659A0D3150277FADE660699413D89DCC5D8F2F45A6D592A302F + 655DABD5F88BE437428D96A53D67D19671BA6660D628FE989A0E26451D769940 + A88C13DECF306EA5B2FB448B43648277817A55D4C2E81C5868365F6C612C7A53 + B5C741C39C2EC58BC9D1BCAD7BD99268AFDAE014C811DA2473556FB50B6B0518 + 3C27AE62898209EA05A0F07020574E660BB339A9CA7B8A2AC68CC5ABA31EFBF6 + 4EBBA04B291CEF7971193DE1E935E1CAA8DD81D23EB5E9AD1348B204AE7C316D + 99421EE9F904A31FF491DA3465FFA4D4AC545FDE78738FBCF3607B146B8840E8 + 418E2A1A5F749AE01FFF32B695F61A20DF8169EB83F54F5120E29C6FEB50DDCC + 9D53D37295B798958388A0E2135CE6E06B21D3ACD1047287A00128298F931B91 + 0103AEC5DFDF838F898E84574D0E05EE8D08C95877CB86912425E6E3BE817408 + 580760D95F86227254D63388754302819A9F900A28F9F2D6A861ED36283E075D + 2DD606B284070E537C384FBBCE26B6BAC082C8D97C23104D5646EFAF7D7E25AE + 678B777D6BA675F78C9AA10D3CAD8FBDEE445A988CB2D8C2A267FF3175E4CD3E + E553449793A4737CBF8E25EB2B6DA7735BD11D050344E1F71295802B0D716799 + 410F391BBA38B5285EB85A92E3A2F4F7DE940D95D720227CEB46E00D635A8197 + DFE053D0B93C4DBF47B501DDF9950F2D3EFCD3CD6AF835CA4B81D6AF9BDBCFD1 + 64598AAD45E5AE436F95A7BA8C8CBED550FAECD75CF3EE8D0A654489ABC5B9CB + BC8595CE2E23A396FC467798DC61DB826316AF739259BDBD49C1A4DD14B8289F + DA880CD88C18B1285ABF35763224E40B87A5EAF714538ACB5873F28B1E715BDB + 21303ED5B40BA3D057F2D215D1A1B40626F8244C92932F78E6BDD789C06E2E44 + F2C8665B8306203D16A638A0AB7FEBA955CB1BBD1817C76F87477A881183ACCC + BC90304090510F17197F2B3110A5FD76D828603CB217926044498866562DFD5B + 4C887EB20FA90C0B9F4B33B74CAB76593296C9E1FA9830BFBA909E48854B42F8 + A06BBA84431900E0AD3D1947EBD145824936EB94453B1C074BFEE73069407147 + 5A159802DA0A366827ED9BC75683FFF40B5D75AF58D70E2EA5FE3864C219AFDA + BAD5C60A3B2AEA907F9ACF47BE50348E94F36F706CCB5A61C1EE7EA7C5A2C6FE + 5DC656AEE91174442DB79D3C3764FD21CC82A9B8F9BC9772D4E3F9B5573277D6 + 980012C8BA4C63EA2861A37A23D41A924BF08EA6C2682CE5A4F1B82D493139EB + 4E03125C84232EE11C7829DA6C886D77006F1FDCF479F8C6ED2B9B04735D5CB0 + 4A96153250DE03A29760A2FB7784CE214908B4773581F4EC4BF09FFD65F29E59 + 60760474C59BA9474CBC2F7C1AC8A849562F4DCA4105EBE29F23304489F97B67 + 733C58C2E8924EED9DE7E68F8CA61E7A0145B75C3ED249507531A7427E142705 + BF45C934DDF3F85B7A0F3E5DB96A02B265938028B46543A45A67EE3278190C53 + E046D763A6F86FEF962D6C30101D2D06FBEB5B426DF0FDE54CADBA492228014D + 3916AD26205092E5F5B3AC4F70F2ADB9107A3D9BAC651AF51A40D8B74BE3A93F + 72D6C0AEA8315FF45AD0D3A86FFFE5A8E6DDB2393A393FE015A2702EAA92D630 + 115E7358EBFEE3FA1B9D9218C115FBBF76C0520031A794B831C363A9C912254F + D86D028A8EF1ACEBC567FB31AE26CFC0DC9A55CBD975B4799DB899CBCA006BE7 + 6A671CA04983F4BB67EB1C5D14A82B3711087F6FBA10258CD318E03D35A49D97 + BBAF88C86D7EC90853163514AB02C6112125370A4880F94B7ADE4B1027CC65CD + 667D6AD254E2593C2F00099F423527BB180380CD41D007F5C3CD4ACBCE59D3ED + C97437CEFE0E4E310DD9A5E34ED1986C92AE9B7CE083384B37FC03B4B1FBDED2 + E14F139351ECD1C0742A2B8555349D79CEBCEAA2A1B56A1B1FD6A3B82DB47949 + 9AD783107FE4CED56DE3CDF46217DDEEFD7D2A39D9C8485F00922AE866F9B364 + 2F815E58D125727CB26CBF0043AA7071AC45F9329C9B8F00F0CF45701C60B6D0 + 9689A65643DF97365BF3EB747773A1ADFD02FC9721737AC2F00C4FF22F546E2C + C354B199E55CD3D7846A8D1759C35D0803BF876D845C454CAB711B39C1CF3E3B + 790D713FAB9439A13AE0B119812E4FD978A6498947C432A05F4A49556523461C + B217424DBE8D1C2EE7CB4C1755A96BF71F9A668E41285DE8EA87537D3751C397 + 116B40D7866B2CBC0C8DA3E9E8EDB10F42F77C73B98F7D68283CE323CCB36CF6 + 59B44153C994FA483F8369658A62754A56C2E1B66E76998E7C32201B6403B186 + 1850EE877F56D175FA7395400EFF76FA8FEC7E50854F493316E8311BEFE34CA2 + 3ECCDDFED7F9D0C3E387474EC1DFF9928C18368646026F0BEC11732A6EEBEC67 + 6E50F14C3FEC9205BF01988437F0E32EC84F3C2C5CC68C85AFC1D5E6A4CF5790 + 373E480401903055D2865D3069EBFBB75037FD74A0E5DC17720BBC2B900A3EC5 + D5AA21251FE3918E3D2B8FAC02272B8861B3D65C1CD287B8C483BE7BA65AE9C2 + F9F4A09F806614B70365472385674E516663BD6E7E7220ED7CBC2E5AD79B72B5 + A99255D300636C24B8AB799F903C0E06F49DC00A78B8E540547F96F1D7CB328E + 4A8B533E5159C142A3F0ABDE3369D42A465C82EF5E01CF18D166A4E86FABD95A + A245B4D43C647310CAC5042FED03267EBF81ADB40E9E2D4F41194DAD6DC1E37A + 6BC7C00A28506B5FA9611CD8A167268A991172B97B40A898EAD22077DC44B945 + FDB8AD4F87E8023FBAD44DE025F05877D81A61EB0272137BEB7ED4952283268D + 6489BA70BA0825F5F13366B33768E3194A06B7D53DDFF3113B36CF0DC6A71F56 + B6726762B236F988DA3D8F40FC97906995EA46A306FAA174C7157EE7F21009CF + FE78D783A698108536D1CAFAD4155B30D6C7F655597E17522EAA40CEB0BCF267 + 4202ACBB86D59E2A92166B8FB47B2A6DCC3223F6AE4DFF8AA68CB7DA4ABF65DC + 5DC977AD81D7085FE052E661795F556BA4959F54CBF2864AB96241DA06BDD40C + 6C7147AEC6DBCA99516166DB3EB2644A62708779C23AF12B2C628901BB3170FA + 4E79800154787DBFA92E8E599485A009170C2C4AD5F065F71004A59445635BDA + E8FF885324CAFA11909FDB3CB4E2C44C0CB4AE26B63EEDDC518178597F244081 + D5B2DEE2300A51C8B8B510D667AF90DF80BDA9CD1278EBF007D2536D96E45148 + E0D8380D9176219180E3473A3EB2FE68BFBB52A70EC937E9D3FBCCD84F27D837 + 73C9F5A94EDCDCA87F541EE9A13267955E80A6558AE7D4D39B29F1EF549EE1B0 + 51980E27B28BA43972D37771863F4A9FCB14DD4AE6F367EE3E474042E4702358 + 6AD9F0E046A12397D7800BC0D31E710CCF9F7D97ADF0E2E018C6CE59EC8C8EF1 + FA2E1CADD83860E0D80F1BD06F203F898DEABA47E4BCB7A7E7DC31A61ECDAD1D + 06E66BC130DE4A2A23CC99B7D1C43448DFAB8F906D3855D61B2A46E6C1621ADC + ADFC817771707C7B762DBE73CC7E3972A89284C4F8E804A6B901D856CCB80769 + F5ABF020D5CDB10EEEB5490623C0435A16AAE8894136BA3E31F126EE78E0C8BC + A5FD518355C1736615E0E15FE5C8BD98A91FBB3ECCAB61A739212C4D2B878BFB + 111138C1575CAC87F14D3EC5163A92E1E3AAB9262A1747BFA2761F0F810EB355 + 3FCC4C2CD357835632AE4E5B27891C562C3F7D4D0B692E33F73FA871E4899E42 + AB9D40FF36D019BE222C8DD68E0944ACD642E5B0E2636BF11269E9A95909361C + B4943296B2B2DB1592D4F6DEFBC4B1B71D9A1A3E9BDA8A71A461569E6F6655ED + 0B3BF5D489E4550C5C9B517A42E26266B0738E3A9B56798097EFDDC02F138781 + B904452FA2A1C4D2BFE8D7F2EF0F9DA1F78FA1F3C95C044F820CE50D64DFB592 + 9BA23B80BF61195688D8DAE00793322AF789AA18B77A4BFE2121FAE31318054F + 252B4D43E2D95F9EE8651547E0517A000EA7CDDC01F90699C9E9B6811C73BA46 + 88EAE94907FCB5D8CFDB026D2788C3C2C1F125A1AE199BFEE87A816C754403CC + 66F5ABA1339438F228F5046F41FBBD4D68A82058602528A2AAB45CDDEA82BE69 + 4D0E0081D9CBABA174F6A871CDC42A9630F2DEFF0824EE2D4E1A33BD09825093 + DDE75F9A27FCD28FCB28FC02A678AED604AB23DEA5925D73127F2BC2943FCE6F + F32AAD928D7BCD88FFD961E8DA50C41014A4975934D96E203DFC0D3445C2C89B + 0C0E27A8ED7C754ACD7C7FC142CDC08A8A2F4E774340A8CFB55910D7F35F1FA5 + D1A02889B69ED9481698D9C2E9179A7D45BF678BE1F9EECB8D9366564ED5DC99 + C82E056B082F1350BA389857EBCC9499FC84EA8F69A2744D334392918D715CA6 + F92437AF9B0C8BBE1D105CE2696DF6DD87C81DA9E9957D84FC0E8985F6BC81C3 + C6726AE0E28F693F56FFD370A71F826FFEEC21EC7275604F7F9B2A8AA067523E + 21DAF1C5E45E06661A6A111907123C0F8AC823693BBA60017DD743D0C061E91D + 0093E91DCB5BA63024AE519423AE086EF048BF44B43A6108A988B4C1E343CDDE + 4864EBC6423FEFB48E9FE18930647622B664D59F80B04A9621C05B5ED6574694 + 668F6F255963FCADE0CDBCF3DA24A00BC42C634BECE069A90BF73EBE07F03F6F + 76FBCEF1A001DE598B50D9D0C85C793F5BC70ABF479FFAF51D3C766A02A1CD7D + 9850F107D585B698B5850F8DD6CD5F3D8AA7E6CAE31716CC5FE64E759C6B8743 + BBD93E8F5674CC999D1E21B5988B055EFC864C7E1E6A71D20B4284DAC8CDD087 + ADF9AB3FC77C6CEDED60FF8F36CF3F706F8BBCD834F74FC543DEA66AA7D486A6 + B7A127E399E22E429C7F927DB82D5D64F336D9933952884E7BD3C3E7A8C5B511 + 936C07CCEC7808CB64FFFCFCB899FEFC84EEFAAE1F52F5E49F1C151C57A4FA13 + 3775573BD150C3C0DA86A9AFCEAE297888455E86FBC254BF3A67C9AC7D682204 + 7613EFC8FA15DB8362F79377F9FC395FDD302CF2E2D60D921C7E191E4E78B714 + 65084A88467C3C2CB790AD3380018E095EEB27B1A9186D69785650A51993CB25 + + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + /ArialMT findfont /Encoding get + dup 32 /space put + dup 33 /exclam put + dup 34 /quotedbl put + dup 35 /numbersign put + dup 36 /dollar put + dup 37 /percent put + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 43 /plus put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 59 /semicolon put + dup 60 /less put + dup 61 /equal put + dup 62 /greater put + dup 63 /question put + dup 64 /at put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 69 /E put + dup 70 /F put + dup 71 /G put + dup 72 /H put + dup 73 /I put + dup 74 /J put + dup 75 /K put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 81 /Q put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 86 /V put + dup 87 /W put + dup 88 /X put + dup 89 /Y put + dup 90 /Z put + dup 91 /bracketleft put + dup 92 /backslash put + dup 93 /bracketright put + dup 94 /asciicircum put + dup 95 /underscore put + dup 96 /quoteleft put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + dup 122 /z put + dup 123 /braceleft put + dup 124 /bar put + dup 125 /braceright put + dup 126 /asciitilde put + dup 161 /exclamdown put + dup 162 /cent put + dup 163 /sterling put + dup 164 /fraction put + dup 165 /yen put + dup 166 /florin put + dup 167 /section put + dup 168 /currency put + dup 169 /quotesingle put + dup 170 /quotedblleft put + dup 171 /guillemotleft put + dup 172 /guilsinglleft put + dup 173 /guilsinglright put + dup 174 /fi put + dup 175 /fl put + dup 177 /endash put + dup 178 /dagger put + dup 179 /daggerdbl put + dup 180 /periodcentered put + dup 182 /paragraph put + dup 183 /bullet put + dup 184 /quotesinglbase put + dup 185 /quotedblbase put + dup 186 /quotedblright put + dup 187 /guillemotright put + dup 188 /ellipsis put + dup 189 /perthousand put + dup 191 /questiondown put + dup 193 /grave put + dup 194 /acute put + dup 195 /circumflex put + dup 196 /tilde put + dup 197 /macron put + dup 198 /breve put + dup 199 /dotaccent put + dup 200 /dieresis put + dup 202 /ring put + dup 203 /cedilla put + dup 205 /hungarumlaut put + dup 206 /ogonek put + dup 207 /caron put + dup 208 /emdash put + dup 225 /AE put + dup 227 /ordfeminine put + dup 232 /Lslash put + dup 233 /Oslash put + dup 234 /OE put + dup 235 /ordmasculine put + dup 241 /ae put + dup 245 /dotlessi put + dup 248 /lslash put + dup 249 /oslash put + dup 250 /oe put + dup 251 /germandbls put + dup 0 /onesuperior put + dup 127 /.notdef put + pop + end + %%EndResource + + userdict /pdf_svglb get setglobal + end + [/N8/ArialMT 1 TZG + %%EndPageSetup + 0 0 792 612 re + W + n + n + 5.03999 4.79999 779.28 603.12 re + [/DeviceRGB] cs 1 1 1 sc + + f + 0.23999 w + 1 J + 2 j + 1 M + n + 92.88 591.84 m + 784.32 591.84 l + 784.32 138 l + 92.88 138 l + 92.88 591.84 l + h + 0 0 0 sc + S + q + n + 92.88 179.04 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 179.28 m + 784.32 179.28 l + S + Q + q + n + 92.88 220.32 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 220.56 m + 784.32 220.56 l + S + Q + q + n + 92.88 261.6 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 261.84 m + 784.32 261.84 l + S + Q + q + n + 92.88 302.88 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 303.12 m + 784.32 303.12 l + S + Q + q + n + 92.88 344.16 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 344.4 m + 784.32 344.4 l + S + Q + q + n + 92.88 385.2 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 385.44 m + 784.32 385.44 l + S + Q + q + n + 92.88 426.48 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 426.72 m + 784.32 426.72 l + S + Q + q + n + 92.88 467.76 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 468 m + 784.32 468 l + S + Q + q + n + 92.88 509.04 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 509.28 m + 784.32 509.28 l + S + Q + q + n + 92.88 550.32 691.44 0.23999 re + h + W + n + 1 j + 10 M + n + 92.88 550.56 m + 784.32 550.56 l + S + Q + q + n + 92.88 592.8 m + 92.88 137.04 l + 784.32 137.04 l + 784.32 592.8 l + 334.56 592.8 l + 334.56 562.08 l + 158.64 562.08 l + 158.64 592.8 l + h + eoclip + n + 1 j + 10 M + n + 92.88 591.84 m + 784.32 591.84 l + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 0.959991 612 m + 0.959991 0.959991 l + 788.4 0.959991 l + 788.4 612 l + 158.64 604.32 m + 158.64 562.08 l + 334.56 562.08 l + 334.56 604.32 l + h + eoclip + n + 0.959991 w + 0 J + 1 j + 10 M + n + 92.88 138 691.44 453.84 re + 0.501999 0.501999 0.501999 sc + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 94.8 138 26.88 418.56 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 102 138 12.24 411.36 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 138 138 26.88 341.28 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 145.2 138 12.24 334.08 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 181.2 138 26.88 391.44 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 188.4 138 12.24 384.24 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 224.4 138 26.88 342.48 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 231.6 138 12.24 335.28 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 267.6 138 26.88 42.48 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 274.8 138 12.24 35.28 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 310.8 138 26.88 249.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 318 138 12.24 242.64 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 354 138 26.88 426.96 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 361.2 138 12.24 419.76 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 397.2 138 26.88 49.44 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 404.4 138 12.24 42.24 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 440.64 138 26.88 357.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 447.84 138 12.24 350.64 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 483.84 138 26.88 396 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 491.04 138 12.24 388.8 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 527.04 138 26.88 399.6 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 534.24 138 12.24 392.4 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 570.24 138 26.88 418.56 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 577.44 138 12.24 411.36 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 613.44 138 26.88 400.8 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 620.64 138 12.24 393.6 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 656.64 138 26.88 373.68 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 663.84 138 12.24 366.48 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 699.84 138 26.88 373.2 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 707.04 138 12.24 366 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 743.04 138 26.88 407.76 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 750.24 138 12.24 400.56 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 107.28 138 26.64 397.68 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 114.48 138 12 390.48 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 150.48 138 26.64 331.44 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 157.68 138 12 324.24 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 193.68 138 26.64 356.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 200.88 138 12 349.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 236.88 138 26.64 337.2 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 244.08 138 12 330 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 280.08 138 26.64 37.2 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 287.28 138 12 30 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 323.28 138 26.64 179.76 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 330.48 138 12 172.56 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 366.48 138 26.64 243.36 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 373.68 138 12 236.16 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 409.68 138 26.88 43.2 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 416.88 138 12.24 36 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 453.12 138 26.64 349.92 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 460.32 138 12 342.72 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 496.32 138 26.64 375.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 503.52 138 12 368.64 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 539.52 138 26.64 391.44 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 546.72 138 12 384.24 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 582.72 138 26.64 355.92 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 589.92 138 12 348.72 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 625.92 138 26.64 361.68 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 633.12 138 12 354.48 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 669.12 138 26.64 364.8 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 676.32 138 12 357.6 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 712.32 138 26.64 353.28 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 719.52 138 12 346.08 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 755.52 138 26.64 346.32 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 762.72 138 12 339.12 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + 1 j + 10 M + n + 92.88 591.84 m + 92.88 138 l + S + n + 86.88 138 m + 92.88 138 l + S + n + 86.88 179.28 m + 92.88 179.28 l + S + n + 86.88 220.56 m + 92.88 220.56 l + S + n + 86.88 261.84 m + 92.88 261.84 l + S + n + 86.88 303.12 m + 92.88 303.12 l + S + n + 86.88 344.4 m + 92.88 344.4 l + S + n + 86.88 385.44 m + 92.88 385.44 l + S + n + 86.88 426.72 m + 92.88 426.72 l + S + n + 86.88 468 m + 92.88 468 l + S + n + 86.88 509.28 m + 92.88 509.28 l + S + n + 86.88 550.56 m + 92.88 550.56 l + S + n + 86.88 591.84 m + 92.88 591.84 l + S + n + 92.88 138 m + 784.32 138 l + S + n + 92.88 132 m + 92.88 138 l + S + n + 136.08 132 m + 136.08 138 l + S + n + 179.28 132 m + 179.28 138 l + S + n + 222.48 132 m + 222.48 138 l + S + n + 265.68 132 m + 265.68 138 l + S + n + 308.88 132 m + 308.88 138 l + S + n + 352.08 132 m + 352.08 138 l + S + n + 395.28 132 m + 395.28 138 l + S + n + 438.72 132 m + 438.72 138 l + S + n + 481.92 132 m + 481.92 138 l + S + n + 525.12 132 m + 525.12 138 l + S + n + 568.32 132 m + 568.32 138 l + S + n + 611.52 132 m + 611.52 138 l + S + n + 654.72 132 m + 654.72 138 l + S + n + 697.92 132 m + 697.92 138 l + S + n + 741.12 132 m + 741.12 138 l + S + n + 784.32 132 m + 784.32 138 l + S + 67.2 131.52 m + /N8 19.44 Tf + (0) show + 50.88 172.8 m + (0.1) + [10.9214 5.51711 10.9214 ] pdfxs + 50.88 214.08 m + (0.2) + [10.9214 5.51711 10.9214 ] pdfxs + 50.88 255.36 m + (0.3) + [10.9214 5.51711 10.9214 ] pdfxs + 50.88 296.64 m + (0.4) + [10.9214 5.51711 10.9214 ] pdfxs + 50.88 337.92 m + (0.5) + [10.9214 5.51711 10.9214 ] pdfxs + 50.88 378.96 m + (0.6) + [10.9214 5.51711 10.9214 ] pdfxs + 50.88 420.24 m + (0.7) + [10.9214 5.51711 10.9214 ] pdfxs + 50.88 461.52 m + (0.8) + [10.9214 5.51711 10.9214 ] pdfxs + 50.88 502.8 m + (0.9) + [10.9214 5.51711 10.9214 ] pdfxs + 67.2 544.08 m + (1) show + 50.88 585.36 m + (1.1) + [10.9214 5.51711 10.9214 ] pdfxs + 106.56 122.88 m + /N8 [0 -19.44 19.44 0 0 0] Tf + (175.vpr) + [-10.8383 -10.8383 -10.8383 -5.43401 -9.74969 -10.8383 -6.50306 ] pdfys + 149.76 122.64 m + (197.parser-b) + [-10.8248 -10.8248 -10.8248 -5.4205 -10.8248 -10.8248 -6.48956 -9.73618 -10.8248 -6.48956 -6.48956 + -10.8248 ] pdfys + 192.96 122.88 m + (300.twolf) + [-10.8576 -10.8576 -10.8576 -5.45331 -5.45331 -14.0847 -10.8576 -4.36468 -5.45331 ] pdfys + 236.16 123.12 m + (bc) + [-10.7443 -9.65571 ] pdfys + 279.36 123.12 m + (ft) + [-5.52001 -5.52001 ] pdfys + 322.56 122.88 m + (analyzer) + [-10.8356 -10.8356 -10.8356 -4.34267 -9.74699 -9.74699 -10.8356 -6.50036 ] pdfys + 365.76 122.88 m + (llu-bench) + [-4.35258 -4.35258 -10.8455 -6.51027 -10.8455 -10.8455 -10.8455 -9.75689 -10.8455 ] pdfys + 408.96 122.88 m + (chomp) + [-9.81208 -10.9007 -10.9007 -16.2855 -10.9007 ] pdfys + 452.4 122.88 m + (fpgrowth) + [-5.47521 -10.8795 -10.8795 -6.54426 -10.8795 -14.1066 -5.47521 -10.8795 ] pdfys + 495.6 122.88 m + (espresso) + [-10.8801 -9.79148 -10.8801 -6.54486 -10.8801 -9.79148 -9.79148 -10.8801 ] pdfys + 538.8 122.88 m + (povray31) + [-10.834 -10.834 -9.74538 -6.49876 -10.834 -9.74538 -10.834 -10.834 ] pdfys + 582 122.88 m + (bisort) + [-10.8468 -4.35387 -9.75819 -10.8468 -6.51156 -5.44251 ] pdfys + 625.2 122.88 m + (health) + [-10.8228 -10.8228 -10.8228 -4.32987 -5.4185 -10.8228 ] pdfys + 668.4 122.88 m + (mst) + [-16.3141 -9.84069 -5.52501 ] pdfys + 711.6 122.64 m + (perimeter) + [-10.8336 -10.8336 -6.49836 -4.34067 -16.2184 -10.8336 -5.42931 -10.8336 -6.49836 ] pdfys + 754.8 122.88 m + (tsp) + [-5.48001 -9.79569 -10.8843 ] pdfys + 36.72 219.12 m + /N10 [0 19.44 -19.44 0 0 0] Tf + (Runtime ratio \(smaller is faster\)) + [14.0833 11.9253 11.9253 6.52096 5.45191 17.3299 10.8562 5.52001 7.60989 10.8562 6.52096 + 5.45191 11.9253 5.52001 6.52096 10.8562 17.3299 10.8562 5.45191 5.45191 10.8562 7.60989 + 5.52001 5.45191 10.8562 5.52001 6.52096 10.8562 10.8562 6.52096 10.8562 7.60989 6.52096 + ] pdfys + n + 158.88 562.08 175.44 42 re + 1 1 1 sc + f + n + 158.64 562.08 175.68 42.24 re + 0 0 0 sc + S + q + 1 0 0 1 0.0132904 0 cm + n + 158.88 580.8 21.12 23.28 re + h + W + n + 0.959991 w + 0 J + n + 163.2 588.24 9.35999 9.35999 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + 176.4 587.76 m + /N8 15.6 Tf + (Base Pool Allocator) + [10.3764 8.64471 7.77111 8.64471 4.32 10.3764 8.64471 8.64471 3.43431 4.32 10.3764 + 3.43431 3.43431 8.64471 7.77111 8.64471 4.30791 8.64471 5.1658 ] pdfxs + q + 1 0 0 1 0.0132904 0 cm + n + 158.88 562.32 21.12 21.36 re + h + W + n + 0.959991 w + 0 J + n + 163.2 567.12 9.35999 9.35999 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + 176.4 566.64 m + (PA + All Optimizations) + [10.3473 10.3473 4.32 9.05239 4.32 10.3473 3.4052 3.4052 4.32 12.0788 8.61559 + 4.2788 3.4052 12.9367 3.4052 7.742 8.61559 4.2788 3.4052 8.61559 8.61559 7.742 + ] pdfxs + PDFVars/TermAll get exec end end + userdict /pgsave get restore + showpage + %%PageTrailer + %%EndPage + %%Trailer + %%DocumentProcessColors: Cyan Magenta Yellow Black + %%DocumentSuppliedResources: + %%+ font Arial-BoldMT + %%+ font ArialMT + %%+ procset (Adobe Acrobat - PDF operators) 1.2 0 + %%+ procset (Adobe Acrobat - type operators) 1.2 0 + %%EOF + + %%EndDocument + @endspecial -150 1354 1993 3 v 84 1438 a Fn(Figur)o(e)18 + b(9.)g Fj(Aggre)o(gate)h(e)o(x)o(ecution)h(time)e(ratios)g(\(1.0)f(=)g + (NoP)-6 b(A\))-47 2980 y @beginspecial 0 @llx 0 @lly + 792 @urx 612 @ury 1656 @rhi @setspecial + %%BeginDocument: Tables/CacheEffects.ps + %!PS-Adobe-3.0 + %%Title: (\376\377) + %%Version: 1 2 + %%Creator: (\376\377) + %%CreationDate: (D:20050420101903) + %%For: (\376\377) + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%BoundingBox: 0 0 792 612 + %%Pages: 1 + %%DocumentProcessColors: (atend) + %%DocumentSuppliedResources: (atend) + %%EndComments + %%BeginDefaults + %%EndDefaults + %%BeginProlog + %%EndProlog + %%BeginSetup + %%BeginResource: l2check + %%Copyright: Copyright 1993 Adobe Systems Incorporated. All Rights Reserved. + systemdict /languagelevel known + { systemdict /languagelevel get 1 eq } + { true } + ifelse + { + initgraphics /Helvetica findfont 18 scalefont setfont + 72 600 moveto (Error: Your printer driver needs to be configured) dup show + 72 580 moveto (for printing to a PostScript Language Level 1 printer.) dup show + exch = = + /Helvetica-Bold findfont 16 scalefont setfont + 72 520 moveto (Windows and Unix) show + /Times-Roman findfont 16 scalefont setfont + 72 500 moveto (Select ?Language Level 1? in the PostScript options section) show + 72 480 moveto (of the Acrobat print dialog.) show + /Helvetica-Bold findfont 16 scalefont setfont + 72 440 moveto (Macintosh) show + /Times-Roman findfont 16 scalefont setfont + 72 420 moveto (In the Chooser, select your printer driver.) show + 72 400 moveto (Then select your printer and click the Setup button.) show + 72 380 moveto (Follow any on-screen dialogs that may appear.) show + showpage + quit + } + if + %%EndResource + userdict /pdf_svglb currentglobal put true setglobal + %%BeginResource: file Pscript_CFF PSVER + userdict/ct_CffDict 6 dict put ct_CffDict begin/F0Subr{systemdict/internaldict + known{1183615869 systemdict/internaldict get exec/FlxProc known{save true}{ + false}ifelse}{userdict/internaldict known not{userdict/internaldict{count 0 eq + {/internaldict errordict/invalidaccess get exec}if dup type/integertype ne{ + /internaldict errordict/invalidaccess get exec}if dup 1183615869 eq{pop 0}{ + /internaldict errordict/invalidaccess get exec}ifelse}dup 14 get 1 25 dict put + bind executeonly put}if 1183615869 userdict/internaldict get exec/FlxProc + known{save true}{false}ifelse}ifelse[systemdict/internaldict known not{100 + dict/begin cvx/mtx matrix/def cvx}if systemdict/currentpacking known{ + currentpacking true setpacking}if{systemdict/internaldict known{1183615869 + systemdict/internaldict get exec dup/$FlxDict known not{dup dup length exch + maxlength eq{pop userdict dup/$FlxDict known not{100 dict begin/mtx matrix def + dup/$FlxDict currentdict put end}if}{100 dict begin/mtx matrix def dup + /$FlxDict currentdict put end}ifelse}if/$FlxDict get begin}if grestore/exdef{ + exch def}def/dmin exch abs 100 div def/epX exdef/epY exdef/c4y2 exdef/c4x2 + exdef/c4y1 exdef/c4x1 exdef/c4y0 exdef/c4x0 exdef/c3y2 exdef/c3x2 exdef/c3y1 + exdef/c3x1 exdef/c3y0 exdef/c3x0 exdef/c1y2 exdef/c1x2 exdef/c2x2 c4x2 def + /c2y2 c4y2 def/yflag c1y2 c3y2 sub abs c1x2 c3x2 sub abs gt def/PickCoords{{ + c1x0 c1y0 c1x1 c1y1 c1x2 c1y2 c2x0 c2y0 c2x1 c2y1 c2x2 c2y2}{c3x0 c3y0 c3x1 + c3y1 c3x2 c3y2 c4x0 c4y0 c4x1 c4y1 c4x2 c4y2}ifelse/y5 exdef/x5 exdef/y4 exdef + /x4 exdef/y3 exdef/x3 exdef/y2 exdef/x2 exdef/y1 exdef/x1 exdef/y0 exdef/x0 + exdef}def mtx currentmatrix pop mtx 0 get abs 1e-05 lt mtx 3 get abs 1e-05 lt + or{/flipXY -1 def}{mtx 1 get abs 1e-05 lt mtx 2 get abs 1e-05 lt or{/flipXY 1 + def}{/flipXY 0 def}ifelse}ifelse/erosion 1 def systemdict/internaldict known{ + 1183615869 systemdict/internaldict get exec dup/erosion known{/erosion get + /erosion exch def}{pop}ifelse}if yflag{flipXY 0 eq c3y2 c4y2 eq or{false + PickCoords}{/shrink c3y2 c4y2 eq{0}{c1y2 c4y2 sub c3y2 c4y2 sub div abs}ifelse + def/yshrink{c4y2 sub shrink mul c4y2 add}def/c1y0 c3y0 yshrink def/c1y1 c3y1 + yshrink def/c2y0 c4y0 yshrink def/c2y1 c4y1 yshrink def/c1x0 c3x0 def/c1x1 + c3x1 def/c2x0 c4x0 def/c2x1 c4x1 def/dY 0 c3y2 c1y2 sub round dtransform + flipXY 1 eq{exch}if pop abs def dY dmin lt PickCoords y2 c1y2 sub abs .001 gt{ + c1x2 c1y2 transform flipXY 1 eq{exch}if/cx exch def/cy exch def/dY 0 y2 c1y2 + sub round dtransform flipXY 1 eq{exch}if pop def dY round dup 0 ne{/dY exdef}{ + pop dY 0 lt{-1}{1}ifelse/dY exdef}ifelse/erode PaintType 2 ne erosion .5 ge + and def erode{/cy cy .5 sub def}if/ey cy dY add def/ey ey ceiling ey sub ey + floor add def erode{/ey ey .5 add def}if ey cx flipXY 1 eq{exch}if itransform + exch pop y2 sub/eShift exch def/y1 y1 eShift add def/y2 y2 eShift add def/y3 + y3 eShift add def}if}ifelse}{flipXY 0 eq c3x2 c4x2 eq or{false PickCoords}{ + /shrink c3x2 c4x2 eq{0}{c1x2 c4x2 sub c3x2 c4x2 sub div abs}ifelse def/xshrink + {c4x2 sub shrink mul c4x2 add}def/c1x0 c3x0 xshrink def/c1x1 c3x1 xshrink def + /c2x0 c4x0 xshrink def/c2x1 c4x1 xshrink def/c1y0 c3y0 def/c1y1 c3y1 def/c2y0 + c4y0 def/c2y1 c4y1 def/dX c3x2 c1x2 sub round 0 dtransform flipXY -1 eq{exch} + if pop abs def dX dmin lt PickCoords x2 c1x2 sub abs .001 gt{c1x2 c1y2 + transform flipXY -1 eq{exch}if/cy exch def/cx exch def/dX x2 c1x2 sub round 0 + dtransform flipXY -1 eq{exch}if pop def dX round dup 0 ne{/dX exdef}{pop dX 0 + lt{-1}{1}ifelse/dX exdef}ifelse/erode PaintType 2 ne erosion .5 ge and def + erode{/cx cx .5 sub def}if/ex cx dX add def/ex ex ceiling ex sub ex floor add + def erode{/ex ex .5 add def}if ex cy flipXY -1 eq{exch}if itransform pop x2 + sub/eShift exch def/x1 x1 eShift add def/x2 x2 eShift add def/x3 x3 eShift add + def}if}ifelse}ifelse x2 x5 eq y2 y5 eq or{x5 y5 lineto}{x0 y0 x1 y1 x2 y2 + curveto x3 y3 x4 y4 x5 y5 curveto}ifelse epY epX}systemdict/currentpacking + known{exch setpacking}if/exec cvx/end cvx]cvx executeonly exch{pop true exch + restore}{systemdict/internaldict known not{1183615869 userdict/internaldict + get exec exch/FlxProc exch put true}{1183615869 systemdict/internaldict get + exec dup length exch maxlength eq{false}{1183615869 systemdict/internaldict + get exec exch/FlxProc exch put true}ifelse}ifelse}ifelse{systemdict + /internaldict known{1183615869 systemdict/internaldict get exec/FlxProc get + exec}{1183615869 userdict/internaldict get exec/FlxProc get exec}ifelse}if} + executeonly def/F1Subr{gsave currentpoint newpath moveto}bind def/F2Subr{ + currentpoint grestore gsave currentpoint newpath moveto}bind def/HSSubr{ + systemdict/internaldict known not{pop 3}{1183615869 systemdict/internaldict + get exec dup/startlock known{/startlock get exec}{dup/strtlck known{/strtlck + get exec}{pop 3}ifelse}ifelse}ifelse}bind def end + %%EndResource + + userdict /pdf_svglb get setglobal + /currentpacking where{pop currentpacking true setpacking}if + %%BeginResource: procset pdfvars + %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. All Rights Reserved. + %%Version: 5.0 6 + %%Title: definition of dictionary of variables used by PDF & PDFText procsets + userdict /PDF 160 dict put + userdict /PDFVars 89 dict dup begin put + /docSetupDone false def + /InitAll 0 def + /TermAll 0 def + /DocInitAll 0 def + /DocTermAll 0 def + /_pdfEncodings 2 array def + /_pdf_str1 1 string def + /_pdf_i 0 def + /_pdf_na 0 def + /_pdf_showproc 0 def + /_italMtx [1 0 .212557 1 0 0] def + /_italMtx_WMode1 [1 -.212557 0 1 0 0] def + /_italMtxType0 [1 0 .1062785 1 0 0] def + /_italMtx_WMode1Type0 [1 -.1062785 0 1 0 0] def + /_basefont 0 def + /_basefonto 0 def + /_pdf_oldCIDInit null def + /_pdf_FontDirectory 30 dict def + /_categories 10 dict def + /_sa? true def + /_ColorSep5044? false def + /nulldict 0 dict def + /_processColors 0 def + /overprintstack null def + /_defaulttransfer currenttransfer def + /_defaultflatness currentflat def + /_defaulthalftone null def + /_defaultcolortransfer null def + /_defaultblackgeneration null def + /_defaultundercolorremoval null def + /_defaultcolortransfer null def + PDF begin + [/c/cs/cm/d/d0/f/h/i/j/J/l/m/M/n/q/Q/re/ri/S/sc/sh/Tf/w/W + /applyInterpFunc/applystitchFunc/domainClip/encodeInput + /initgs/int/limit/rangeClip + /defineRes/findRes/setSA/pl + %% to keep CoolType entries in GlyphDirProcs safe from collisions with Win PS driver + /? /! /| /: /+ /GetGlyphDirectory + /pdf_flushFilters /pdf_readstring /pdf_dictOp /pdf_image /pdf_maskedImage + /pdf_shfill /pdf_sethalftone + ] {null def} bind forall + end + end + %%EndResource + PDFVars begin PDF begin + %%BeginResource: procset pdfutil + %%Copyright: Copyright 1993-1999 Adobe Systems Incorporated. All Rights Reserved. + %%Version: 4.0 2 + %%Title: Basic utilities used by other PDF procsets + /bd {bind def} bind def + /ld {load def} bd + /bld { + dup length dict begin + { null def } forall + bind + end + def + } bd + /dd { PDFVars 3 1 roll put } bd + /xdd { exch dd } bd + /Level2? + systemdict /languagelevel known + { systemdict /languagelevel get 2 ge } { false } ifelse + def + /Level1? Level2? not def + /Level3? + systemdict /languagelevel known + {systemdict /languagelevel get 3 eq } { false } ifelse + def + /getifknown { + 2 copy known { get true } { pop pop false } ifelse + } bd + /here { + currentdict exch getifknown + } bd + /isdefined? { where { pop true } { false } ifelse } bd + %%EndResource + %%BeginResource: procset pdf + %%Version: 5.0 7 + %%Copyright: Copyright 1998-2001 Adobe Systems Incorporated. All Rights Reserved. + %%Title: General operators for PDF, common to all Language Levels. + /cm { matrix astore concat } bd + /d /setdash ld + /f /fill ld + /h /closepath ld + /i {dup 0 eq {pop _defaultflatness} if setflat} bd + /j /setlinejoin ld + /J /setlinecap ld + /M /setmiterlimit ld + /n /newpath ld + /S /stroke ld + /w /setlinewidth ld + /W /clip ld + /initgs { + 0 setgray + [] 0 d + 0 j + 0 J + 10 M + 1 w + false setSA + /_defaulttransfer load settransfer + 0 i + /RelativeColorimetric ri + newpath + } bd + /int { + dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul + exch pop add exch pop + } bd + /limit { + dup 2 index le { exch } if pop + dup 2 index ge { exch } if pop + } bd + /domainClip { + Domain aload pop 3 2 roll + limit + } [/Domain] bld + /applyInterpFunc { + 0 1 DimOut 1 sub + { + dup C0 exch get exch + dup C1 exch get exch + 3 1 roll + 1 index sub + 3 index + N exp mul add + exch + currentdict /Range_lo known + { + dup Range_lo exch get exch + Range_hi exch get + 3 2 roll limit + } + { + pop + } + ifelse + exch + } for + pop + } [/DimOut /C0 /C1 /N /Range_lo /Range_hi] bld + /encodeInput { + NumParts 1 sub + 0 1 2 index + { + dup Bounds exch get + 2 index gt + { exit } + { dup + 3 index eq + { exit } + { pop } ifelse + } ifelse + } for + 3 2 roll pop + dup Bounds exch get exch + dup 1 add Bounds exch get exch + 2 mul + dup Encode exch get exch + 1 add Encode exch get + int + } [/NumParts /Bounds /Encode] bld + /rangeClip { + exch dup Range_lo exch get + exch Range_hi exch get + 3 2 roll + limit + } [/Range_lo /Range_hi] bld + /applyStitchFunc { + Functions exch get exec + currentdict /Range_lo known { + 0 1 DimOut 1 sub { + DimOut 1 add -1 roll + rangeClip + } for + } if + } [/Functions /Range_lo /DimOut] bld + /pdf_flushfilters + { + aload length + { dup status + 1 index currentfile ne and + { dup flushfile closefile } + { pop } + ifelse + } repeat + } bd + /pdf_readstring + { + 1 index dup length 1 sub get + exch readstring pop + exch pdf_flushfilters + } bind def + /pdf_dictOp + { + 3 2 roll + 10 dict copy + begin + _Filters dup length 1 sub get def + currentdict exch exec + _Filters pdf_flushfilters + end + } [/_Filters] bld + /pdf_image {{image} /DataSource pdf_dictOp} bd + /pdf_imagemask {{imagemask} /DataSource pdf_dictOp} bd + /pdf_shfill {{sh} /DataSource pdf_dictOp} bd + /pdf_sethalftone {{sethalftone} /Thresholds pdf_dictOp} bd + /pdf_maskedImage + { + 10 dict copy begin + /miDict currentdict def + /DataDict DataDict 10 dict copy def + DataDict begin + /DataSource + _Filters dup length 1 sub get + def + miDict image + _Filters pdf_flushfilters + end + end + } [/miDict /DataDict /_Filters] bld + /RadialShade { + 40 dict begin + /background exch def + /ext1 exch def + /ext0 exch def + /BBox exch def + /r2 exch def + /c2y exch def + /c2x exch def + /r1 exch def + /c1y exch def + /c1x exch def + /rampdict exch def + gsave + BBox length 0 gt { + newpath + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + newpath + } if + c1x c2x eq + { + c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse + } + { + /slope c2y c1y sub c2x c1x sub div def + /theta slope 1 atan def + c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if + c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if + } + ifelse + gsave + clippath + c1x c1y translate + theta rotate + -90 rotate + { pathbbox } stopped + { 0 0 0 0 } if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + } + { + rampdict begin + 40 dict begin + background length 0 gt { background sssetbackground gsave clippath fill grestore } if + gsave + c1x c1y translate + theta rotate + -90 rotate + /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def + /c1y 0 def + /c1x 0 def + /c2x 0 def + ext0 { + 0 getrampcolor + c2y r2 add r1 lt + { + c1x c1y r1 360 0 arcn + xMin yMin moveto + xMax yMin lineto + xMax yMax lineto + xMin yMax lineto + xMin yMin lineto + eofill + } + { + c2y r1 add r2 le + { + c1x c1y r1 0 360 arc + fill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r1 neg def + /p1y c1y def + /p2x r1 def + /p2y c1y def + p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto + fill + } + { + /AA r2 r1 sub c2y div def + /theta AA 1 AA dup mul sub sqrt div 1 atan def + /SS1 90 theta add dup sin exch cos div def + /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y p1x SS1 div neg def + /SS2 90 theta sub dup sin exch cos div def + /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y p2x SS2 div neg def + r1 r2 gt + { + /L1maxX p1x yMin p1y sub SS1 div add def + /L2maxX p2x yMin p2y sub SS2 div add def + } + { + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + } + ifelse + } + ifelse + } ifelse + } if + c1x c2x sub dup mul + c1y c2y sub dup mul + add 0.5 exp + 0 dtransform + dup mul exch dup mul add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt { exch } if pop + /hires exch def + hires mul + /numpix exch def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + } if + } if + /xInc c2x c1x sub numsteps div def + /yInc c2y c1y sub numsteps div def + /rInc r2 r1 sub numsteps div def + /cx c1x def + /cy c1y def + /radius r1 def + newpath + xInc 0 eq yInc 0 eq rInc 0 eq and and + { + 0 getrampcolor + cx cy radius 0 360 arc + stroke + NumSamples 1 sub getrampcolor + cx cy radius 72 hires div add 0 360 arc + 0 setlinewidth + stroke + } + { + 0 + numsteps + { + dup + subsampling { round cvi } if + getrampcolor + cx cy radius 0 360 arc + /cx cx xInc add def + /cy cy yInc add def + /radius radius rInc add def + cx cy radius 360 0 arcn + eofill + rampIndxInc add + } + repeat + pop + } ifelse + ext1 { + c2y r2 add r1 lt + { + c2x c2y r2 0 360 arc + fill + } + { + c2y r1 add r2 le + { + c2x c2y r2 360 0 arcn + xMin yMin moveto + xMax yMin lineto + xMax yMax lineto + xMin yMax lineto + xMin yMin lineto + eofill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r2 neg def + /p1y c2y def + /p2x r2 def + /p2y c2y def + p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto + fill + } + { + /AA r2 r1 sub c2y div def + /theta AA 1 AA dup mul sub sqrt div 1 atan def + /SS1 90 theta add dup sin exch cos div def + /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y c2y p1x SS1 div sub def + /SS2 90 theta sub dup sin exch cos div def + /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y c2y p2x SS2 div sub def + r1 r2 lt + { + /L1maxX p1x yMax p1y sub SS1 div add def + /L2maxX p2x yMax p2y sub SS2 div add def + } + { + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + } + ifelse + } + ifelse + } ifelse + } if + grestore + grestore + end + end + end + } ifelse + } bd + /GenStrips { + 40 dict begin + /background exch def + /ext1 exch def + /ext0 exch def + /BBox exch def + /y2 exch def + /x2 exch def + /y1 exch def + /x1 exch def + /rampdict exch def + gsave + BBox length 0 gt { + newpath + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + newpath + } if + x1 x2 eq + { + y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse + } + { + /slope y2 y1 sub x2 x1 sub div def + /theta slope 1 atan def + x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if + x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if + } + ifelse + gsave + clippath + x1 y1 translate + theta rotate + { pathbbox } stopped + { 0 0 0 0 } if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + } + { + rampdict begin + 20 dict begin + background length 0 gt { background sssetbackground gsave clippath fill grestore } if + gsave + x1 y1 translate + theta rotate + /xStart 0 def + /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def + /ySpan yMax yMin sub def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + xStart 0 transform + xEnd 0 transform + 3 -1 roll + sub dup mul + 3 1 roll + sub dup mul + add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt { exch } if pop + mul + /numpix exch def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + } if + } if + ext0 { + 0 getrampcolor + xMin xStart lt + { xMin yMin xMin neg ySpan rectfill } if + } if + /xInc xEnd xStart sub numsteps div def + /x xStart def + 0 + numsteps + { + dup + subsampling { round cvi } if + getrampcolor + x yMin xInc ySpan rectfill + /x x xInc add def + rampIndxInc add + } + repeat + pop + ext1 { + xMax xEnd gt + { xEnd yMin xMax xEnd sub ySpan rectfill } if + } if + grestore + grestore + end + end + end + } ifelse + } bd + %%EndResource + %%BeginResource: procset pdflev2 + %%Version: 5.0 15 + %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. All Rights Reserved. + %%LanguageLevel: 2 + %%Title: PDF operators, with code specific for Level 2 + /docinitialize { + PDF begin + /_defaulthalftone currenthalftone dd + /_defaultblackgeneration currentblackgeneration dd + /_defaultundercolorremoval currentundercolorremoval dd + /_defaultcolortransfer [currentcolortransfer] dd + /_defaulttransfer currenttransfer dd + end + PDFVars /docSetupDone true put + } bd + /initialize { + PDFVars /docSetupDone get { + _defaulthalftone sethalftone + /_defaultblackgeneration load setblackgeneration + /_defaultundercolorremoval load setundercolorremoval + _defaultcolortransfer aload pop setcolortransfer + } if + false setoverprint + } bd + /terminate { } bd + /c /curveto ld + /cs /setcolorspace ld + /l /lineto ld + /m /moveto ld + /q /gsave ld + /Q /grestore ld + /sc /setcolor ld + /setSA/setstrokeadjust ld + /re { + 4 2 roll m + 1 index 0 rlineto + 0 exch rlineto + neg 0 rlineto + h + } bd + /concattransferfuncs { + [ 3 1 roll /exec load exch /exec load ] cvx + } bd + /concatandsettransfer { + /_defaulttransfer load concattransferfuncs settransfer + } bd + /concatandsetcolortransfer { + _defaultcolortransfer aload pop + 8 -1 roll 5 -1 roll concattransferfuncs 7 1 roll + 6 -1 roll 4 -1 roll concattransferfuncs 5 1 roll + 4 -1 roll 3 -1 roll concattransferfuncs 3 1 roll + concattransferfuncs + setcolortransfer + } bd + /defineRes/defineresource ld + /findRes/findresource ld + currentglobal + true systemdict /setglobal get exec + [/Function /ExtGState /Form /Shading /FunctionDictionary /MadePattern /PatternPrototype /DataSource /Image] + { /Generic /Category findresource dup length dict copy /Category defineresource pop } + forall + systemdict /setglobal get exec + /ri + { + /findcolorrendering isdefined? + { + mark exch + findcolorrendering + counttomark 2 eq + { type /booleantype eq + { dup type /nametype eq + { dup /ColorRendering resourcestatus + { pop pop + dup /DefaultColorRendering ne + { + /ColorRendering findresource + setcolorrendering + } if + } if + } if + } if + } if + cleartomark + } + { pop + } ifelse + } bd + /knownColorants? { + pop false + } bd + /getrampcolor { + /indx exch def + 0 1 NumComp 1 sub { + dup + Samples exch get + dup type /stringtype eq { indx get } if + exch + Scaling exch get aload pop + 3 1 roll + mul add + } for + setcolor + } bd + /sssetbackground { aload pop setcolor } bd + %%EndResource + %%BeginResource: procset pdftext + %%Version: 5.0 6 + %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. All Rights Reserved. + %%Title: Text operators for PDF + PDF /PDFText 78 dict dup begin put + /docinitialize + { + /resourcestatus where { + pop + /CIDParams /ProcSet resourcestatus { + pop pop + false /CIDParams /ProcSet findresource /SetBuildCompatible get exec + } if + } if + PDF begin + PDFText /_pdfDefineIdentity-H known + { PDFText /_pdfDefineIdentity-H get exec} + if + end + } bd + /initialize { + PDFText begin + } bd + /terminate { end } bd + Level2? + { + /_safeput + { + 3 -1 roll load 3 1 roll put + } + bd + } + { + /_safeput + { + 2 index load dup dup length exch maxlength ge + { dup length 5 add dict copy + 3 index xdd + } + { pop } + ifelse + 3 -1 roll load 3 1 roll put + } + bd + } + ifelse + /pdf_has_composefont? systemdict /composefont known def + /CopyFont { + { + 1 index /FID ne 2 index /UniqueID ne and + { def } { pop pop } ifelse + } forall + } bd + /Type0CopyFont + { + exch + dup length dict + begin + CopyFont + [ + exch + FDepVector + { + dup /FontType get 0 eq + { + 1 index Type0CopyFont + /_pdfType0 exch definefont + } + { + /_pdfBaseFont exch + 2 index exec + } + ifelse + exch + } + forall + pop + ] + /FDepVector exch def + currentdict + end + } bd + Level2? {currentglobal true setglobal} if + /cHexEncoding + [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 + /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 + /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 + /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B + /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E + /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 + /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 + /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 + /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA + /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD + /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 + /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 + /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 + /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def + Level2? {setglobal} if + /modEnc { + /_enc xdd + /_icode 0 dd + counttomark 1 sub -1 0 + { + index + dup type /nametype eq + { + _enc _icode 3 -1 roll put + _icode 1 add + } + if + /_icode xdd + } for + cleartomark + _enc + } bd + /trEnc { + /_enc xdd + 255 -1 0 { + exch dup -1 eq + { pop /.notdef } + { Encoding exch get } + ifelse + _enc 3 1 roll put + } for + pop + _enc + } bd + /TE { + /_i xdd + StandardEncoding 256 array copy modEnc + _pdfEncodings exch _i exch put + } bd + /TZ + { + /_usePDFEncoding xdd + findfont + dup length 6 add dict + begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + /pdf_origFontName FontName def + /FontName exch def + currentdict /PaintType known + { PaintType 2 eq {/PaintType 0 def} if } + if + _usePDFEncoding 0 ge + { + /Encoding _pdfEncodings _usePDFEncoding get def + pop + } + { + _usePDFEncoding -1 eq + { + counttomark 0 eq + { pop } + { + Encoding 256 array copy + modEnc /Encoding exch def + } + ifelse + } + { + 256 array + trEnc /Encoding exch def + } + ifelse + } + ifelse + pdf_EuroProcSet pdf_origFontName known + { + pdf_origFontName pdf_AddEuroGlyphProc + } if + Level2? + { + currentdict /pdf_origFontName undef + } if + FontName currentdict + end + definefont pop + } + bd + Level2? + { + /TZG + { + currentglobal true setglobal + 2 index _pdfFontStatus + { + 2 index findfont + false setglobal + 3 index findfont + true setglobal + ne + { + 2 index findfont dup rcheck + { + dup length dict begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + currentdict end + } + if + 3 index exch definefont pop + } + if + } if + setglobal + TZ + } bd + } + { + /TZG {TZ} bd + } ifelse + Level2? + { + currentglobal false setglobal + userdict /pdftext_data 5 dict put + pdftext_data + begin + /saveStacks + { + pdftext_data + begin + /vmmode currentglobal def + false setglobal + count array astore /os exch def + end + countdictstack array dictstack pdftext_data exch /ds exch put + cleardictstack pdftext_data /dscount countdictstack put + pdftext_data /vmmode get setglobal + } bind def + /restoreStacks + { + pdftext_data /vmmode currentglobal put false setglobal + clear cleardictstack + pdftext_data /ds get dup + pdftext_data /dscount get 1 2 index length 1 sub + { get begin dup } for + pop pop + pdftext_data /os get aload pop + pdftext_data /vmmode get setglobal + } bind def + /testForClonePrinterBug + { + currentglobal true setglobal + /undefinedCategory /Generic /Category findresource + dup length dict copy /Category defineresource pop + setglobal + pdftext_data /saveStacks get exec + pdftext_data /vmmode currentglobal put false setglobal + /undefined /undefinedCategory { resourcestatus } stopped + pdftext_data exch /bugFound exch put + pdftext_data /vmmode get setglobal + pdftext_data /restoreStacks get exec + pdftext_data /bugFound get + } bind def + end + setglobal + /pdf_resourcestatus + pdftext_data /testForClonePrinterBug get exec + { + { + pdftext_data /saveStacks get exec + pdftext_data /os get dup dup length 1 sub + dup 1 sub dup 0 lt { pop 0 } if + exch 1 exch { get exch dup } for + pop pop + { resourcestatus } + stopped + { + clear cleardictstack pdftext_data /restoreStacks get exec + { pop pop } stopped pop false + } + { + count array astore pdftext_data exch /results exch put + pdftext_data /restoreStacks get exec pop pop + pdftext_data /results get aload pop + } + ifelse + } + } + { { resourcestatus } } + ifelse + bd + } + if + Level2? + { + /_pdfUndefineResource + { + currentglobal 3 1 roll + _pdf_FontDirectory 2 index 2 copy known + {undef} + {pop pop} + ifelse + 1 index (pdf) exch _pdfConcatNames 1 index + 1 index 1 _pdfConcatNames 1 index + 5 index 1 _pdfConcatNames 1 index + 4 + { + 2 copy pdf_resourcestatus + { + pop 2 lt + {2 copy findresource gcheck setglobal undefineresource} + {pop pop} + ifelse + } + { pop pop} + ifelse + } repeat + setglobal + } bd + } + { + /_pdfUndefineResource { pop pop} bd + } + ifelse + Level2? + { + /_pdfFontStatus + { + currentglobal exch + /Font pdf_resourcestatus + {pop pop true} + {false} + ifelse + exch setglobal + } bd + } + { + /_pdfFontStatusString 50 string def + _pdfFontStatusString 0 (fonts/) putinterval + /_pdfFontStatus + { + FontDirectory 1 index known + { pop true } + { + _pdfFontStatusString 6 42 getinterval + cvs length 6 add + _pdfFontStatusString exch 0 exch getinterval + { status } stopped + {pop false} + { + { pop pop pop pop true} + { false } + ifelse + } + ifelse + } + ifelse + } bd + } + ifelse + Level2? + { + /_pdfCIDFontStatus + { + /CIDFont /Category pdf_resourcestatus + { + pop pop + /CIDFont pdf_resourcestatus + {pop pop true} + {false} + ifelse + } + { pop false } + ifelse + } bd + } + if + /_pdfString100 100 string def + /_pdfComposeFontName + { + dup length 1 eq + { + 0 get + 1 index + type /nametype eq + { + _pdfString100 cvs + length dup dup _pdfString100 exch (-) putinterval + _pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval + 2 index exch cvs length + add 1 add _pdfString100 exch 0 exch getinterval + exch pop + true + } + { + pop pop + false + } + ifelse + } + { + false + } + ifelse + dup {exch cvn exch} if + } bd + /_pdfConcatNames + { + exch + _pdfString100 cvs + length dup dup _pdfString100 exch (-) putinterval + _pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval + 3 -1 roll exch cvs length + add 1 add _pdfString100 exch 0 exch getinterval + cvn + } bind def + /_pdfTextTempString 50 string def + /_pdfRegOrderingArray [(Adobe-Japan1) (Adobe-CNS1) (Adobe-Korea1) (Adobe-GB1)] def + /_pdf_CheckCIDSystemInfo + { + 1 index _pdfTextTempString cvs + (Identity) anchorsearch + { + pop pop pop pop true + } + { + false + _pdfRegOrderingArray + { + 2 index exch + anchorsearch + { pop pop pop true exit} + { pop } + ifelse + } + forall + exch pop + exch /CIDFont findresource + /CIDSystemInfo get + 3 -1 roll /CMap findresource + /CIDSystemInfo get + exch + 3 -1 roll + { + 2 copy + /Supplement get + exch + dup type /dicttype eq + {/Supplement get} + {pop 0 } + ifelse + ge + } + { true } + ifelse + { + dup /Registry get + 2 index /Registry get eq + { + /Ordering get + exch /Ordering get + dup type /arraytype eq + { + 1 index type /arraytype eq + { + true + 1 index length 1 sub -1 0 + { + dup 2 index exch get exch 3 index exch get ne + { pop false exit} + if + } for + exch pop exch pop + } + { pop pop false } + ifelse + } + { + eq + } + ifelse + } + { pop pop false } + ifelse + } + { pop pop false } + ifelse + } + ifelse + } bind def + pdf_has_composefont? + { + /_pdfComposeFont + { + 2 copy _pdfComposeFontName not + { + 2 index + } + if + (pdf) exch _pdfConcatNames + dup _pdfFontStatus + { dup findfont 5 2 roll pop pop pop true} + { + 4 1 roll + 1 index /CMap pdf_resourcestatus + { + pop pop + true + } + {false} + ifelse + 1 index true exch + { + _pdfCIDFontStatus not + {pop false exit} + if + } + forall + and + { + 1 index 1 index 0 get _pdf_CheckCIDSystemInfo + { + 3 -1 roll pop + 2 index 3 1 roll + composefont true + } + { + pop pop exch pop false + } + ifelse + } + { + _pdfComposeFontName + { + dup _pdfFontStatus + { + exch pop + 1 index exch + findfont definefont true + } + { + pop exch pop + false + } + ifelse + } + { + exch pop + false + } + ifelse + } + ifelse + { true } + { + dup _pdfFontStatus + { dup findfont true } + { pop false } + ifelse + } + ifelse + } + ifelse + } bd + } + { + /_pdfComposeFont + { + _pdfComposeFontName not + { + dup + } + if + dup + _pdfFontStatus + {exch pop dup findfont true} + { + 1 index + dup type /nametype eq + {pop} + {cvn} + ifelse + eq + {pop false} + { + dup _pdfFontStatus + {dup findfont true} + {pop false} + ifelse + } + ifelse + } + ifelse + } bd + } + ifelse + /_pdfStyleDicts 4 dict dup begin + /Adobe-Japan1 4 dict dup begin + Level2? + { + /Serif + /HeiseiMin-W3-83pv-RKSJ-H _pdfFontStatus + {/HeiseiMin-W3} + { + /HeiseiMin-W3 _pdfCIDFontStatus + {/HeiseiMin-W3} + {/Ryumin-Light} + ifelse + } + ifelse + def + /SansSerif + /HeiseiKakuGo-W5-83pv-RKSJ-H _pdfFontStatus + {/HeiseiKakuGo-W5} + { + /HeiseiKakuGo-W5 _pdfCIDFontStatus + {/HeiseiKakuGo-W5} + {/GothicBBB-Medium} + ifelse + } + ifelse + def + /HeiseiMaruGo-W4-83pv-RKSJ-H _pdfFontStatus + {/HeiseiMaruGo-W4} + { + /HeiseiMaruGo-W4 _pdfCIDFontStatus + {/HeiseiMaruGo-W4} + { + /Jun101-Light-RKSJ-H _pdfFontStatus + { /Jun101-Light } + { SansSerif } + ifelse + } + ifelse + } + ifelse + /RoundSansSerif exch def + /Default Serif def + } + { + /Serif /Ryumin-Light def + /SansSerif /GothicBBB-Medium def + { + (fonts/Jun101-Light-83pv-RKSJ-H) status + }stopped + {pop}{ + { pop pop pop pop /Jun101-Light } + { SansSerif } + ifelse + /RoundSansSerif exch def + }ifelse + /Default Serif def + } + ifelse + end + def + /Adobe-Korea1 4 dict dup begin + /Serif /HYSMyeongJo-Medium def + /SansSerif /HYGoThic-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-GB1 4 dict dup begin + /Serif /STSong-Light def + /SansSerif /STHeiti-Regular def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-CNS1 4 dict dup begin + /Serif /MKai-Medium def + /SansSerif /MHei-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + end + def + /TZzero + { + /_wmode xdd + /_styleArr xdd + /_regOrdering xdd + 3 copy + _pdfComposeFont + { + 5 2 roll pop pop pop + } + { + [ + 0 1 _styleArr length 1 sub + { + _styleArr exch get + _pdfStyleDicts _regOrdering 2 copy known + { + get + exch 2 copy known not + { pop /Default } + if + get + } + { + pop pop pop /Unknown + } + ifelse + } + for + ] + exch pop + 2 index 3 1 roll + _pdfComposeFont + {3 -1 roll pop} + { + findfont dup /FontName get exch + } + ifelse + } + ifelse + dup /WMode 2 copy known + { get _wmode ne } + { pop pop _wmode 1 eq} + ifelse + { + exch _wmode _pdfConcatNames + dup _pdfFontStatus + { exch pop dup findfont false} + { exch true } + ifelse + } + { + dup /FontType get 0 ne + } + ifelse + { + dup /FontType get 3 eq _wmode 1 eq and + { + _pdfVerticalRomanT3Font dup length 10 add dict copy + begin + /_basefont exch + dup length 3 add dict + begin + {1 index /FID ne {def}{pop pop} ifelse } + forall + /Encoding Encoding dup length array copy + dup 16#27 /quotesingle put + dup 16#60 /grave put + _regOrdering /Adobe-Japan1 eq + {dup 16#5c /yen put dup 16#a5 /yen put dup 16#b4 /yen put} + if + def + FontName + currentdict + end + definefont + def + /Encoding _basefont /Encoding get def + /_fauxfont true def + } + { + dup length 3 add dict + begin + {1 index /FID ne {def}{pop pop} ifelse } + forall + FontType 0 ne + { + /Encoding Encoding dup length array copy + dup 16#27 /quotesingle put + dup 16#60 /grave put + _regOrdering /Adobe-Japan1 eq + {dup 16#5c /yen put} + if + def + /_fauxfont true def + } if + } ifelse + /WMode _wmode def + dup dup /FontName exch def + currentdict + end + definefont pop + } + { + pop + } + ifelse + /_pdf_FontDirectory 3 1 roll _safeput + } + bd + Level2? + { + /Tf { + _pdf_FontDirectory 2 index 2 copy known + {get exch 3 -1 roll pop} + {pop pop} + ifelse + selectfont + } bd + } + { + /Tf { + _pdf_FontDirectory 2 index 2 copy known + {get exch 3 -1 roll pop} + {pop pop} + ifelse + exch findfont exch + dup type /arraytype eq + {makefont} + {scalefont} + ifelse + setfont + } bd + } + ifelse + /cshow where + { + pop /pdf_cshow /cshow load dd + /pdf_remove2 {pop pop} dd + } + { + /pdf_cshow {exch forall} dd + /pdf_remove2 {} dd + } ifelse + /pdf_xshow + { + /_pdf_na xdd + /_pdf_i 0 dd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 /_pdf_showproc load exec + {_pdf_na _pdf_i get} stopped + { pop pop } + { + _pdf_x _pdf_y moveto + 0 + rmoveto + } + ifelse + _pdf_i 1 add /_pdf_i xdd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + } + exch + pdf_cshow + } bd + /pdf_yshow + { + /_pdf_na xdd + /_pdf_i 0 dd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 /_pdf_showproc load exec + {_pdf_na _pdf_i get} stopped + { pop pop } + { + _pdf_x _pdf_y moveto + 0 exch + rmoveto + } + ifelse + _pdf_i 1 add /_pdf_i xdd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + } + exch + pdf_cshow + } bd + /pdf_xyshow + { + /_pdf_na xdd + /_pdf_i 0 dd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 /_pdf_showproc load exec + {_pdf_na _pdf_i get} stopped + { pop pop } + { + {_pdf_na _pdf_i 1 add get} stopped + { pop pop pop} + { + _pdf_x _pdf_y moveto + rmoveto + } + ifelse + } + ifelse + _pdf_i 2 add /_pdf_i xdd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + } + exch + pdf_cshow + } bd + /pdfl1xs {/_pdf_showproc /show load dd pdf_xshow} bd + /pdfl1ys {/_pdf_showproc /show load dd pdf_yshow} bd + /pdfl1xys {/_pdf_showproc /show load dd pdf_xyshow} bd + Level2? _ColorSep5044? not and + { + /pdfxs {{xshow} stopped {pdfl1xs} if} bd + /pdfys {{yshow} stopped {pdfl1ys} if} bd + /pdfxys {{xyshow} stopped {pdfl1xys} if} bd + } + { + /pdfxs /pdfl1xs load dd + /pdfys /pdfl1ys load dd + /pdfxys /pdfl1xys load dd + } ifelse + /pdf_charpath {false charpath} bd + /pdf_xcharpath {/_pdf_showproc /pdf_charpath load dd pdf_xshow} bd + /pdf_ycharpath {/_pdf_showproc /pdf_charpath load dd pdf_yshow} bd + /pdf_xycharpath {/_pdf_showproc /pdf_charpath load dd pdf_xyshow} bd + /pdf_strokepath + { + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 false charpath + currentpoint S moveto + } bind + exch pdf_cshow + } bd + /pdf_xstrokepath {/_pdf_showproc {pdf_charpath S} dd pdf_xshow} bd + /pdf_ystrokepath {/_pdf_showproc {pdf_charpath S} dd pdf_yshow} bd + /pdf_xystrokepath {/_pdf_showproc {pdf_charpath S} dd pdf_xyshow} bd + Level2? {currentglobal true setglobal} if + /d0/setcharwidth ld + /nND {{/.notdef} repeat} bd + /T3Defs { + /BuildChar + { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec + } + def + /BuildGlyph { + exch begin + GlyphProcs exch get exec + end + } def + /_pdfT3Font true def + } bd + /_pdfBoldRomanWidthProc + { + stringwidth 1 index 0 ne { exch .03 add exch }if setcharwidth + 0 0 + } bd + /_pdfType0WidthProc + { + dup stringwidth 0 0 moveto + 2 index true charpath pathbbox + 0 -1 + 7 index 2 div .88 + setcachedevice2 + pop + 0 0 + } bd + /_pdfType0WMode1WidthProc + { + dup stringwidth + pop 2 div neg -0.88 + 2 copy + moveto + 0 -1 + 5 -1 roll true charpath pathbbox + setcachedevice + } bd + /_pdfBoldBaseFont + 11 dict begin + /FontType 3 def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /Encoding cHexEncoding def + /_setwidthProc /_pdfBoldRomanWidthProc load def + /_bcstr1 1 string def + /BuildChar + { + exch begin + _basefont setfont + _bcstr1 dup 0 4 -1 roll put + dup + _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bd + currentdict + end + def + pdf_has_composefont? + { + /_pdfBoldBaseCIDFont + 11 dict begin + /CIDFontType 1 def + /CIDFontName /_pdfBoldBaseCIDFont def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /_setwidthProc /_pdfType0WidthProc load def + /_bcstr2 2 string def + /BuildGlyph + { + exch begin + _basefont setfont + _bcstr2 1 2 index 256 mod put + _bcstr2 0 3 -1 roll 256 idiv put + _bcstr2 dup _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bd + currentdict + end + def + /_pdfDefineIdentity-H + { + /Identity-H /CMap PDFText /pdf_resourcestatus get exec + { + pop pop + } + { + /CIDInit/ProcSet findresource begin 12 dict begin + begincmap + /CIDSystemInfo + 3 dict begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + currentdict + end + def + /CMapName /Identity-H def + /CMapVersion 1 def + /CMapType 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000> 0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } ifelse + } def + } if + /_pdfVerticalRomanT3Font + 10 dict begin + /FontType 3 def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /_bcstr1 1 string def + /BuildChar + { + exch begin + _basefont setfont + _bcstr1 dup 0 4 -1 roll put + dup + _pdfType0WidthProc + moveto + show + end + }bd + currentdict + end + def + Level2? {setglobal} if + /MakeBoldFont + { + dup /ct_SyntheticBold known + { + dup length 3 add dict begin + CopyFont + /ct_StrokeWidth .03 0 FontMatrix idtransform pop def + /ct_SyntheticBold true def + currentdict + end + definefont + } + { + dup dup length 3 add dict + begin + CopyFont + /PaintType 2 def + /StrokeWidth .03 0 FontMatrix idtransform pop def + /dummybold currentdict + end + definefont + dup /FontType get dup 9 ge exch 11 le and + { + _pdfBoldBaseCIDFont + dup length 3 add dict copy begin + dup /CIDSystemInfo get /CIDSystemInfo exch def + /_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont + /_basefont exch def + /_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont + /_basefonto exch def + currentdict + end + /CIDFont defineresource + } + { + _pdfBoldBaseFont + dup length 3 add dict copy begin + /_basefont exch def + /_basefonto exch def + currentdict + end + definefont + } + ifelse + } + ifelse + } bd + /MakeBold { + 1 index + _pdf_FontDirectory 2 index 2 copy known + {get} + {exch pop} + ifelse + findfont + dup + /FontType get 0 eq + { + dup /WMode known {dup /WMode get 1 eq }{false} ifelse + version length 4 ge + and + {version 0 4 getinterval cvi 2015 ge } + {true} + ifelse + {/_pdfType0WidthProc} + {/_pdfType0WMode1WidthProc} + ifelse + _pdfBoldBaseFont /_setwidthProc 3 -1 roll load put + {MakeBoldFont} Type0CopyFont definefont + } + { + dup /_fauxfont known not 1 index /SubstMaster known not and + { + _pdfBoldBaseFont /_setwidthProc /_pdfBoldRomanWidthProc load put + MakeBoldFont + } + { + 2 index 2 index eq + { exch pop } + { + dup length dict begin + CopyFont + currentdict + end + definefont + } + ifelse + } + ifelse + } + ifelse + pop pop + dup /dummybold ne + {/_pdf_FontDirectory exch dup _safeput } + { pop } + ifelse + }bd + /MakeItalic { + _pdf_FontDirectory exch 2 copy known + {get} + {exch pop} + ifelse + dup findfont + dup /FontInfo 2 copy known + { + get + /ItalicAngle 2 copy known + {get 0 eq } + { pop pop true} + ifelse + } + { pop pop true} + ifelse + { + exch pop + dup /FontType get 0 eq Level2? not and + { dup /FMapType get 6 eq } + { false } + ifelse + { + dup /WMode 2 copy known + { + get 1 eq + { _italMtx_WMode1Type0 } + { _italMtxType0 } + ifelse + } + { pop pop _italMtxType0 } + ifelse + } + { + dup /WMode 2 copy known + { + get 1 eq + { _italMtx_WMode1 } + { _italMtx } + ifelse + } + { pop pop _italMtx } + ifelse + } + ifelse + makefont + dup /FontType get 42 eq Level2? not or + { + dup length dict begin + CopyFont + currentdict + end + } + if + 1 index exch + definefont pop + /_pdf_FontDirectory exch dup _safeput + } + { + pop + 2 copy ne + { + /_pdf_FontDirectory 3 1 roll _safeput + } + { pop pop } + ifelse + } + ifelse + }bd + /MakeBoldItalic { + /dummybold exch + MakeBold + /dummybold + MakeItalic + }bd + Level2? + { + /pdf_CopyDict + {1 index length add dict copy} + def + } + { + /pdf_CopyDict + { + 1 index length add dict + 1 index wcheck + { copy } + { begin + {def} forall + currentdict + end + } + ifelse + } + def + } + ifelse + /pdf_AddEuroGlyphProc + { + currentdict /CharStrings known + { + CharStrings /Euro known not + { + dup + /CharStrings + CharStrings 1 pdf_CopyDict + begin + /Euro pdf_EuroProcSet 4 -1 roll get def + currentdict + end + def + /pdf_PSBuildGlyph /pdf_PSBuildGlyph load def + /pdf_PathOps /pdf_PathOps load def + /Symbol eq + { + /Encoding Encoding dup length array copy + dup 160 /Euro put def + } + if + } + { pop + } + ifelse + } + { pop + } + ifelse + } + def + Level2? {currentglobal true setglobal} if + /pdf_PathOps 4 dict dup begin + /m {moveto} def + /l {lineto} def + /c {curveto} def + /cp {closepath} def + end + def + /pdf_PSBuildGlyph + { + gsave + 8 -1 roll pop + 7 1 roll + currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse + dup 9 1 roll + { + currentdict /StrokeWidth 2 copy known + { + get 2 div + 5 1 roll + 4 -1 roll 4 index sub + 4 1 roll + 3 -1 roll 4 index sub + 3 1 roll + exch 4 index add exch + 4 index add + 5 -1 roll pop + } + { + pop pop + } + ifelse + } + if + setcachedevice + pdf_PathOps begin + exec + end + { + currentdict /StrokeWidth 2 copy known + { get } + { pop pop 0 } + ifelse + setlinewidth stroke + } + { + fill + } + ifelse + grestore + } def + /pdf_EuroProcSet 13 dict def + pdf_EuroProcSet + begin + /Courier-Bold + { + 600 0 6 -12 585 612 + { + 385 274 m + 180 274 l + 179 283 179 293 179 303 c + 179 310 179 316 180 323 c + 398 323 l + 423 404 l + 197 404 l + 219 477 273 520 357 520 c + 409 520 466 490 487 454 c + 487 389 l + 579 389 l + 579 612 l + 487 612 l + 487 560 l + 449 595 394 612 349 612 c + 222 612 130 529 98 404 c + 31 404 l + 6 323 l + 86 323 l + 86 304 l + 86 294 86 284 87 274 c + 31 274 l + 6 193 l + 99 193 l + 129 77 211 -12 359 -12 c + 398 -12 509 8 585 77 c + 529 145 l + 497 123 436 80 356 80 c + 285 80 227 122 198 193 c + 360 193 l + cp + 600 0 m + } + pdf_PSBuildGlyph + } def + /Courier-BoldOblique /Courier-Bold load def + /Courier + { + 600 0 17 -12 578 584 + { + 17 204 m + 97 204 l + 126 81 214 -12 361 -12 c + 440 -12 517 17 578 62 c + 554 109 l + 501 70 434 43 366 43 c + 266 43 184 101 154 204 c + 380 204 l + 400 259 l + 144 259 l + 144 270 143 281 143 292 c + 143 299 143 307 144 314 c + 418 314 l + 438 369 l + 153 369 l + 177 464 249 529 345 529 c + 415 529 484 503 522 463 c + 522 391 l + 576 391 l + 576 584 l + 522 584 l + 522 531 l + 473 566 420 584 348 584 c + 216 584 122 490 95 369 c + 37 369 l + 17 314 l + 87 314 l + 87 297 l + 87 284 88 272 89 259 c + 37 259 l + cp + 600 0 m + } + pdf_PSBuildGlyph + } def + /Courier-Oblique /Courier load def + /Helvetica + { + 556 0 24 -19 541 703 + { + 541 628 m + 510 669 442 703 354 703 c + 201 703 117 607 101 444 c + 50 444 l + 25 372 l + 97 372 l + 97 301 l + 49 301 l + 24 229 l + 103 229 l + 124 67 209 -19 350 -19 c + 435 -19 501 25 509 32 c + 509 131 l + 492 105 417 60 343 60 c + 267 60 204 127 197 229 c + 406 229 l + 430 301 l + 191 301 l + 191 372 l + 455 372 l + 479 444 l + 194 444 l + 201 531 245 624 348 624 c + 433 624 484 583 509 534 c + cp + 556 0 m + } + pdf_PSBuildGlyph + } def + /Helvetica-Oblique /Helvetica load def + /Helvetica-Bold + { + 556 0 12 -19 563 710 + { + 563 621 m + 537 659 463 710 363 710 c + 216 710 125 620 101 462 c + 51 462 l + 12 367 l + 92 367 l + 92 346 l + 92 337 93 328 93 319 c + 52 319 l + 12 224 l + 102 224 l + 131 58 228 -19 363 -19 c + 417 -19 471 -12 517 18 c + 517 146 l + 481 115 426 93 363 93 c + 283 93 254 166 246 224 c + 398 224 l + 438 319 l + 236 319 l + 236 367 l + 457 367 l + 497 462 l + 244 462 l + 259 552 298 598 363 598 c + 425 598 464 570 486 547 c + 507 526 513 517 517 509 c + cp + 556 0 m + } + pdf_PSBuildGlyph + } def + /Helvetica-BoldOblique /Helvetica-Bold load def + /Symbol + { + 750 0 20 -12 714 685 + { + 714 581 m + 650 645 560 685 465 685 c + 304 685 165 580 128 432 c + 50 432 l + 20 369 l + 116 369 l + 115 356 115 347 115 337 c + 115 328 115 319 116 306 c + 50 306 l + 20 243 l + 128 243 l + 165 97 300 -12 465 -12 c + 560 -12 635 25 685 65 c + 685 155 l + 633 91 551 51 465 51 c + 340 51 238 131 199 243 c + 555 243 l + 585 306 l + 184 306 l + 183 317 182 326 182 336 c + 182 346 183 356 184 369 c + 614 369 l 644 432 l + 199 432 l + 233 540 340 622 465 622 c + 555 622 636 580 685 520 c + cp + 750 0 m + } + pdf_PSBuildGlyph + } def + /Times-Bold + { + 500 0 16 -14 478 700 + { + 367 308 m + 224 308 l + 224 368 l + 375 368 l + 380 414 l + 225 414 l + 230 589 257 653 315 653 c + 402 653 431 521 444 457 c + 473 457 l + 473 698 l + 444 697 l + 441 679 437 662 418 662 c + 393 662 365 700 310 700 c + 211 700 97 597 73 414 c + 21 414 l + 16 368 l + 69 368 l + 69 359 68 350 68 341 c + 68 330 68 319 69 308 c + 21 308 l + 16 262 l + 73 262 l + 91 119 161 -14 301 -14 c + 380 -14 443 50 478 116 c + 448 136 l + 415 84 382 40 323 40 c + 262 40 231 77 225 262 c + 362 262 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + /Times-BoldItalic + { + 500 0 9 -20 542 686 + { + 542 686 m + 518 686 l + 513 673 507 660 495 660 c + 475 660 457 683 384 683 c + 285 683 170 584 122 430 c + 58 430 l + 34 369 l + 105 369 l + 101 354 92 328 90 312 c + 34 312 l + 9 251 l + 86 251 l + 85 238 84 223 84 207 c + 84 112 117 -14 272 -14 c + 326 -14 349 9 381 9 c + 393 9 393 -10 394 -20 c + 420 -20 l + 461 148 l + 429 148 l + 416 109 362 15 292 15 c + 227 15 197 55 197 128 c + 197 162 204 203 216 251 c + 378 251 l + 402 312 l + 227 312 l + 229 325 236 356 241 369 c + 425 369 l + 450 430 l + 255 430 l + 257 435 264 458 274 488 c + 298 561 337 654 394 654 c + 437 654 484 621 484 530 c + 484 516 l + 516 516 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + /Times-Italic + { + 500 0 23 -10 595 692 + { + 399 317 m + 196 317 l + 199 340 203 363 209 386 c + 429 386 l + 444 424 l + 219 424 l + 246 514 307 648 418 648 c + 448 648 471 638 492 616 c + 529 576 524 529 527 479 c + 549 475 l + 595 687 l + 570 687 l + 562 674 558 664 542 664 c + 518 664 474 692 423 692 c + 275 692 162 551 116 424 c + 67 424 l + 53 386 l + 104 386 l + 98 363 93 340 90 317 c + 37 317 l + 23 279 l + 86 279 l + 85 266 85 253 85 240 c + 85 118 137 -10 277 -10 c + 370 -10 436 58 488 128 c + 466 149 l + 424 101 375 48 307 48 c + 212 48 190 160 190 234 c + 190 249 191 264 192 279 c + 384 279 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + /Times-Roman + { + 500 0 10 -12 484 692 + { + 347 298 m + 171 298 l + 170 310 170 322 170 335 c + 170 362 l + 362 362 l + 374 403 l + 172 403 l + 184 580 244 642 308 642 c + 380 642 434 574 457 457 c + 481 462 l + 474 691 l + 449 691 l + 433 670 429 657 410 657 c + 394 657 360 692 299 692 c + 204 692 94 604 73 403 c + 22 403 l + 10 362 l + 70 362 l + 69 352 69 341 69 330 c + 69 319 69 308 70 298 c + 22 298 l + 10 257 l + 73 257 l + 97 57 216 -12 295 -12 c + 364 -12 427 25 484 123 c + 458 142 l + 425 101 384 37 316 37 c + 256 37 189 84 173 257 c + 335 257 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + end + Level2? {setglobal} if + currentdict readonly pop end + %%EndResource + PDFText begin + [userdict /pdf_svglb currentglobal put true setglobal + 39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis + /Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute + /egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde + /oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex + /udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls + /registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash + /.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef + /.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash + /questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef + /guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe + /endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide + /.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright + /fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand + /Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex + /Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex + /Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla + /hungarumlaut/ogonek/caron + 0 TE + [1/dotlessi/caron 39/quotesingle 96/grave + 127/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis + /dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE + /bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft + /quotedblright/bullet/endash/emdash/tilde/trademark/scaron + /guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling + /currency/yen/brokenbar/section/dieresis/copyright/ordfeminine + /guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus + /twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla + /onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters + /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash + /Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave + /aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute + /ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde + /ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute + /ucircumflex/udieresis/yacute/thorn/ydieresis + 1 TE + end + + userdict /pdf_svglb get setglobal + currentdict readonly pop + end end + /currentpacking where {pop setpacking}if + PDFVars/DocInitAll{[PDF PDFText]{/docinitialize get exec}forall }put + PDFVars/InitAll{[PDF PDFText]{/initialize get exec}forall initgs}put + PDFVars/TermAll{[PDFText PDF]{/terminate get exec}forall}put + PDFVars begin PDF begin + PDFVars/DocInitAll get exec PDFVars/InitAll get exec + PDFVars/TermAll get exec end end + + %%EndSetup + %%Page: 1 1 + %%BeginPageSetup + userdict /pgsave save put + PDFVars begin PDF begin PDFVars/InitAll get exec + userdict begin + userdict /pdf_svglb currentglobal put true setglobal + %%BeginResource: font Arial-BoldMT + ct_CffDict begin + %!FontType1 + 16 dict begin + /FontInfo 15 dict dup begin + /Notice (Copyright (c) 1991, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Arial is a trademark of The Monotype Corporation. registered in the US Patent and Trademark Office and elsewhere.) def + /version (001.001) def + /FullName (Arial MT Bold) def + /FamilyName (Arial MT) def + /Weight (Bold) def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def + end def + /FontName /Arial-BoldMT def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 0 /.notdef put + def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0 ] def + /FontBBox { -167 -250 1006 939 } def + /XUID [6 44341 ] def + /StrokeWidth 0 def + currentdict end + currentfile eexec A0B00ED5187D9C0F1ECDF51878C3AA5CAA3FFCA5020F48 + 69FCFE28B419AB05B54FAF364D68E82805BE1C1765A19BEC4D29A426539E9449 + 5BE860D6EEF29ED037F1F407E7FE48577F0B69E118A7C8737034DBBD04699FA2 + 80A7C6E922784295ED8C74A3C79BEB5BC6F95B767A170D04BD8041F7BDA3426A + 0B38EEBC414A4A52B6E26531115CF035146099BDF3B8A00193EF9C63D5056C56 + 27F34FF02A444A05338ECAEBA23251AC7E7B67DA94C2F71DFB3E6EBBF2B8CD64 + C128D630515F608E6436F23A665C100FEB078798141BB5533A2BE422590BB1C5 + 6D0F257E7C6438DB38F18E581BEDF1D3810B75C017FCEA8F9EAF3B486651B632 + F2D1D16279E221FE73375419D0A086839CFAAECC1618C4E60207E167DD9AEDDC + 37E07006BA902F4A4531AE919B9048413BE1EF9D321A92DD52A1B9B85D11116C + 5DEDF1C2112BD4E7BD1754F72123471DF2FA90FE00256B54B0D7DB81E1035390 + 4317D65A1B999795B9214ADD5CB2BD50C71B0C1C65DD95F7420FF93451281A99 + B3403CD0905E899046B1D4EEC1339434B286D808782ED4CC6D04AE1C92F14D32 + 73DD3E4C697AF30E029C876DC06033C5A55623074B84A6E5244237ADF6B563B4 + EE13D3EFCE21281E3F54526F5F1E4A5BC6CBD568A3D82E17B552176D7D0FC581 + 20F2549FB6A55AE982185B67D6962DBB1ECB64F77A2FBF7D597479E05AD8B833 + 7B2A2747961C244F8D47CE7372A440D2FA986D2EB57A64721615F6BFCCA1F0BF + 2EDAD01479994BB51DC4EB7C590A90EE81A1F3E477D760E7C886EF03BF55124C + 0A00F228D50F4F869ED28BF35C094F39087571769F759BE1EE3598DD5B58C9D8 + F85B744EF72FE601843D977E137AFCEF4E4E212035638E3E598B0EF2AE58E876 + 6440B3C60438D7A0EC054648CD04EB0A8E9A793E4F7FC322525C8AE24C726691 + 2A880F47C52FFC40B3974DF4D22C8B2BFC3ED011DD9B3FD11DEEAB8E04ACA611 + 2723B29E0D04F63BDD5B0836CA33BAD1310235EE9F1D69A5202F4CD581B8F66D + F5C9C045D628F0899B7E4188D2B262C1623403446E40C8CA3163884FDBA560D8 + A5449EDF3D6C52D1CAB8CBC763E39BAA68DDD188E021AB803EE3A6EE2EED2DD3 + 3E16D7B4A6AB33E849F894DDEC6CEFF007273F6693A44103C76BFDF0BFE9C415 + A3E69746FB35A20E885252D78F90692D0C7101FDE9E9EBB2953CD34F4D771E35 + A692E77C2B9045619A2BC3C2C058FA85589E32A5F4FEDFC98E4FD378AE32CB89 + 1A232210A3DA6F1266BA3BC55D748A864207064F4161EF8BDFBD9CCCBBCC1290 + FA3551CB543E7F74A8D7889B0A88EA23AD4B2787D084813663A144F34D0870B8 + 6FE2842D825DA8A6B33F9F886E82D3D4F39098AD8F9452474D3375FC9EC1255D + 017F13417A5EC4C91E2CB3796EB6D06F8499CA959785EEB01882D86D1A4AD689 + D802AF92E181B6276C0F267BAB4EBCDBC9CD978D93346EDCA8D28EA961C02347 + A9D9D531C73FEB745BA8BC37B94624E1E706D82B38CF26F434C596C821F445CD + A2CEDC3B10C63CC9CD2D506BCBE24C3E54B6E062298F094F6F2259271A2D8761 + FC07930CC62082493640A41C7C10BE1C659753638AB0F2FC3D2C22B355BA186B + 93B8EAF547557DAB8EEE8AF3B86BE3651D7B1455334062D7E20402F2AAEE9BFB + 6080A9AABD2611E581B25AEFEB596B08ED24ABC715FAF69863088C659A4C8E1C + 996B38C78BAE579AE0D181AE39B4C9C18A3B9278A1FD02EA8302C833376FC171 + BF9EAC985AAC026D472ED294051FE7C805714A13DB53938EB2501653B0404352 + CE6118F10D5F8A49D69BA3EE59FDF7F7B1ED07C1236A606C5B4D41321762E046 + 8019D9C64084A4C3DD4AEA4EB00D34EA00C643072CF5E44EA325EF80A9EEFD8F + 2C3C7E74EDE6A9AA0C191A2599B16FB09BF5EC8C9A2B1F17F6A1D8B598E311F7 + 4D2E047E053FC5F86E2D1FB64E78770DFC12F37985CAA063509B80A0269DB7F4 + 8D9B1DA6D24C3D27669B115EBE4CAF75EA2586724A9C1649F5C9F8D77776C904 + B52548DB3482119439BD2E3FBFFD4D1C602171437A57A3675658F8A346883EC2 + 0596DB9BB3B0F76AF1EC6A7BEEC44B39B76F24E427B15881D06F1DE0A499FF69 + 5D2C8B60A0CF57473F8607559DBCDA5D7C1544649F4F67C963EFFFE39F1D5471 + 7F303E886C54EA23DF62A172B5E75B1EDB98FC4ABB897E5E1DDCC5305BFF4E9F + C9BB5EFFC6F970A9D604231519A522606B3C9AA2AB17E6474EADA0B494A5439D + 0BD84093110E243CFFF77B68E57E70C5662BC7264D6CF6CF1DBB65712A311E8C + 2FDD3082AB7117A9802F46E8E6585673021AC210E8E821B7E5B8E63A6B68D78D + BE14692778BA472948C3DD2312BE3656382DB847E12F945DD6559FC8472F7466 + B28DCF25F249F0AC849871950B631A72606B8A3974FC27C9056F8BB8C88FBE36 + 4CE0E64AB23F1D8C10A435302124A6577FC6F4D13FA5B65F4C428FB9410EB583 + D62B2562654F1262209B130E7D779BBF67DED0874158CEE3EC414E6AF78EA5B0 + 51CF785BD7DF00AD450565245090EC55D5F03B0181413E02C73E851263AA425A + 1834E1E854BD004F1FC7E9C1E171D97129BCD9568F86AD51727BE077BF6AE2F1 + 672DE2CE46411C7D22B19078DBEFC082A73C979905E01133CD633CA92595C6B0 + DB688BB2DD5C8917D3BBCA94A994B84223AB4414B7B9CF19BDDD78FD215508EF + 4C1B52575493FFC1B0C00EDB5EA0719AB94DE49B507AE15BC0244B2A47474E6B + E5B846D3315425257B10868588EE49AE2E2A52EBDA205612E31EE015A95F9BDA + 494D5648F762997DAF12A512B3C43DF42729C0D21EA513151BA5DBE93F2A15CA + FFE20D77D30498782CA383EF952FF7B5EB19A2F0C5971D98CACDD7D8035D527E + 253BA55C2ABDC8E1778D882BC84E777A3B6051FF167FECA275B062BC67BAACC1 + 118AF58B082E8E4BC6FC7A80913A55C547D1DBBE57CB153A879D8BC02E2632F7 + 2061F11B252EEEC0B65853BFD0E6285439EA5A8A35B6C7E21A39ECACB39D0DC5 + 1D84FCAB4526021F9865D2EF3A1E4869F19D2966684339CB5A40D7D73C392DE6 + 29ADDF581649B180EFC6929ADA1958BD0AC8B17C88E364D9B908953FE60348C0 + 4015C80A4222D9CB14E4D51FEDABD792EAB645CDF7CA65674327DD1987A89F86 + 0B57095EE175B0F8B7EBA84D867FCA3DFEAEF38FE2769CE6751D17418D0368EA + 3327817A4CAF67D9F2AB7DA404E69C7FB35BC7BE7C1B429F64F687D4797CD398 + 311D643B8C7E30D5EF3EAB2A990F4385C3B0AD5C44F34FA306CBF0E52E7CF164 + 20FBD608DF9D2208029399E85EF137725748F95868AA280C6CA2D726687EFF7E + 1C26AA1D8A08D87BBAA3D222CFB9102DF9990841CCCBF7D717813FC43099FAA6 + CF3A7FFF2BE6A869BDF92D8FEE4A89D16C9BD3ABEAA6E07B13CE597F12C95732 + BB14C9A9A4902F27870FDBD4CF70EB37DB47C130564C18CB0A87AA09F7C5E045 + FC0D0B8B7EDD1C3F6F0D4EC46831B1B0D1CAB2C6E0EAF49B59654F5BDEBA31E7 + 4E35397A004996A281A44C802E1305E21C7EC9CF0F3E82BE805AFD4EC2F9FABD + E555A9EC58657D62E65A3A6AA610D87B89474EA2C0ABEB919B534D1F7177273B + BD0DBEBCE083BF67EAF2140F12FA6E48D8AB8ED2A874C821F66EB27DFF953865 + B4148AC5B3540D6E0B5D8D42850DC20486AC50907007C82CFCAE6C85E6DEBFAE + 3B00861F75BC5D6F28412851C658EA9CB9015A9D8AECF427FF575BEC703FC583 + 8525D86F7DA7FDA35C03DFED51BD629C5CE1F90A79B9E404BF94FEB843D5A564 + A100624431DC55E2B7DA8D04C84F7278C4F55AE63B44714861FA24E7B9B359EB + 1879A9F3000A005918ACDFC0A8AC38997EDB24CA4DCFCF3019DF0F5558D95743 + DFDEEB434C525765431A987AEA620CD5FB939B49D9BAC76D62BFDE83DF981673 + 674DA67BCFFB68DBAAB3889F3EEC8D7CED342A27991473410AF46F55D950111E + 87FDE431201DC5077C2B7480B1F5CE0ED2E60AC63C22A5578C193931532B7820 + E997333B8B6DF8ADC96C59C63164AD4911137BA379C92FF8905B40D6E8B22569 + 6576BD0C42E3A7934BF67D11962B5962CA91232FB61CA3EA105A7F8BB6EBF604 + 7CED87B27D056BFCA557B3D1213C1A807C0EC9D25A863EF4BC569F6467D837A5 + E72EAC1BD6649D6E55B992F1282406631264D040EA8FA1A76DB77D5516557C74 + D774F2704248B41143F81A0757ED477E1E693604F761BBC6A0A47D6C5E1BA8EF + 59BB3C4D6FC027490138F792DFFED59B1D8ACC964F845BAE1106728DBC1776A1 + 89C2BE31C01BABA8EFC45B6E6CAD399638EFABF0D4B45052ADE173859AE3D6E6 + 9E85BE3DAE09458781FC9C871C856C9E3B8C581318F700E27475E93A77D00025 + AF26B9AE72B81122A56A57C8459DF38926ED208F8FDC4443BFF2BD2E8D589873 + A947BE6AE8D501516D0A586EF0C39D13822325AF939C39B1D17CC2286FB8FA82 + E045C283380D9D627AAD6B4D4AB800EF9BBC3AEE1398E0571B372B14F1EA15C7 + 9148AA2DA402A72354D6C20093CC4EF4126C27727E0D5902665801E1D050B28F + 862A060841D463C69F64C60B1B169354CF07B1483ACAB968AD6ADDF317F9ACE3 + 85A274A39B3466B667689F16F50FBCCE75BB8EA6666CC69F4E460D17CEB7AE5C + CE3DAA9FE2110CD355E02CAE06074F99DA950DFA65B536ABA9F1B852C4A2D961 + 1A2564220ADA708E670541D32393F1071BC876281A33E5C9673E61EADD8B1680 + F5E69E1351D9683B58C053909B02BA394243315350875B209F56DF54F4DE83AA + 3E8F7CC4BA8FD8280FD516EFAAAA2881DD9514F644B6E893207BD4026FFE2252 + AF806254492FA55CE7D09F1B66243A72462B03D54350E6A55BC6F12EDE24149A + 18C6A45788C3BD3858E084155E4A15EEE56F48E6B019D2EB2D400B9117946949 + 4CD70B9703B3CC04772447AD2B968B49A8F9B07A0EB1199D78283FC914982841 + 36965AB09BE1E5CB7C7974667543AD854827B7333FC458D680A06C491CCD9E39 + D1E745BA3577A7CEF63A909C04CD9DE56AB57DA35B9AE97284516ADDDE7B59A5 + B5B55B5F7E49BA648900A7D511D3E7AC47693FE4DE21EB0FA6EF3AA35B980C22 + BE7BB24D6D31BC9E9376E7801F6946B41DC629FF341172174997D9D8111EA72C + AF09A38923DF201A2A2851EC341AE8DE43AD52DF3001FF15AA6BFF95F2A84DF6 + B521241BBB9D6010D09023312B54ACE4A0FCFDA9D8D21255A249A150C9E0A7D1 + AD894B82F9798E5CB072BCBBDFC5B79086BBC1B91E5C610DEA0F32A3F7F7317F + 9E4BC64042C41113D9ABF187120A734CE563426B8E7AAECAF43F5228D026E5B1 + 28DC8B6BC21264992D92F0AAF93018880FDDFDAAF7874A06B7D6412B9AF3BF1A + 6E58EF8E5C4283DD70BC40D0F0007E362424D629D9E1D877CA534E040A470071 + 7285DAE114C95D0A7ECFA95CFC79A5CA35FD190906C2CA17AF02E07FD68958BA + E33ACFFDC2478E099386AF4F2ADD465B25530A62E959FAD1AAB96A6C69420021 + 63B4EF8EB833C61701FC8A5DE37EEC42A1E574333ECC4DEFF71AE771B8344CD3 + F19A4A10A9984260622D770087E6F2FD5714E2F620079BCFCD6C1A9F5DE21D20 + AC45FC8C37A4DE50F88BCCE8569948E82B4CF6420CFBA7FDF1D95BD59A89845E + AAAC3C4CADAC48AB3ED5D37A6466CB1AC31C3C7182D421EA4CD7C2FE6D934098 + B87F457A4F498352E9BA688DB0B06857BA2ACCAEBB85CC2FD71B6103BA00AD14 + 55FF2FD9F53FACCF869337A7F2AB7B484F247160C6753DBFE587A1EB383B7C43 + 5860D8C3702B44711794C8559C1B8B97EB73B5FABDAD1FACDDC79BE1EA48F39C + 6D1799FFD4CF7971B97A8222CDF027C7FD8F7B4ED8B474713FAE4529F87000B5 + BCF5CA520D1450ECF367865D15856F4D127D8D98AEC55D464B96288068C0EE44 + 918E7F7909FCE4100CA06C24326380EEB0F4EEEAD49CE2C72FE93FB7ED764CE0 + 015039ED26935497A15583F6F0463A6CEC9323AFEB6D1722078FE036D56DE441 + 8FF5D396F9C98E41838DF1846F7D02D75A1376AD7F88C843A5D0B0233461719B + 2C0C271E42CD5FF6A799F516E8906F109E707BEE6D71581FC76D349ACB242D0D + 5CD9FD6EF5ADB121F904848F3184A3C2CC0DECE579D3438D4CD7B173FC4FDFBD + FD604FD61421E039908475DA6BDB61AEACDA9C225119301A5CE0F5F783F9F1EF + E58882E7565C93AAE411CAE92BB2AFA127D45BD7F477480148CAED36B30F14DC + 7A69B3B88F13047DD20EA481A13EF25AA98F66FE6F10AEA03DF80A1FA34A9D04 + 7E1CA9E37DDC0AC18978E8BCFF43DD81D0122A707C949C7ECA3EF598438B5679 + 915CFE2A9576E66981B91F637E666809E90895DC06CC543DE2C3380A4ED2D05A + 821DA469044EFC5F12C1CFD5037903675A703ACF2C1B49029A63D2A0B43D044D + 584FE44866A328545370001670165FAA76C57B97035432AF3536F892D93E30AE + 6495E4A6AE9E1C16ED2F5AB3F2BF81DB48D70DFEF38F1DA3A468208C21572491 + FCC4D92E17DFD95F365FE8D9D2D25B9C997E72DFCD2EF4B302ED428A9645298F + E20BB0EA75C189FB2E3E7A8E463FAF92AD214CC9263001F27758770CDAF007C8 + BCC9A085320B1F88AF02A88F9FD0120DF5C4104C2049304E360A22781CC2C27E + 9B661C7345BC1E61C451AC4285DEF04B0CFD137588BC0411F60F51F1254BC78E + C599E5A5B937261AE3B612B8C2FD49DAA029DB24B3DFC510D708D97EF0AD2473 + 27BFEF55BC3D6EE029014B3F88DE0E285B9378DD28CC2A8CA33BAB3E94EEDD69 + D95309FBC1DD6CB786D5FA277531679E33F8347876997B80F8B76594D1607F30 + 572EF1FF3361091EDAC28619803293FC40080F32B1DF166483FE6D81C94FB8BE + BA913D97C251909437780F2B403E33B0DA48497552FCF7BE786BFE9D2CCD5C24 + F54A0D3865C70C07C999E5FA0B822B916966A68310F5C692662746B2EE862BF0 + 5AF5F5EF1B1B6F741AAA581E9E1EF2916F1407B89C8E8C33BB5F48609E881761 + 5F5600E7013043B5DC141B951D6FAEF604849E3964C13BFE016A704791911276 + B0CCAF564B5CC6023A3334E69A02CA7BA64328B8F81C4C3FBCD779C763AA60EF + 6419FD6C0E416F5CE6A32096B737754F7DE6761CE028AD97CFDE2D16596CA20D + 5DE765F602758E4E635AC388CDB54E7E82D9516F2F8BD5059353F1A3BF030FBC + BCB1F18E76E9392B9340C2422C8DA7717F4EBE7112FD5BA7DD641C99DD65D6C8 + 27C715B9433A54873B2FBAFCDFD786699E24A7E7DE78BF4286D5B143A296DFD8 + F8619E732B7152DCD00441D192CE08167C53A3E70745C3BDDC3F5C692A001D02 + F2E36ECB32939D61C7ADE4FE924F1F8DB67D08BCF492D2421FEE4C6687E5AC26 + BF8A06A5CF79C5A5A627A14189110DB91E01A4F2D3D92F187918A6967713FBDE + 75022B551F8B999AD41A1F0F7FCF7C2E41F263B414CE924A7E88A47420E6911A + 27C971F333BFB47D7306BF74B44389F54BF9E51BE849F70DA288D16F7D091CA8 + 10DDB815056B0F8AB66D45E58B1779CB79223D32475901C122A4E7067B8E54B9 + 5A064CCB7808086CC0C8B7ACC66CEF056F3B4231E62D8D3A7C58929C3B25C40B + 427ACF3DE83F50D3C23236124642AA17C9299364BE276D3F2D58459A1E58B8C8 + 7EAB08390A461317C33B41881B46089FE5A4ADFB24B052877CD2998C631B8B7C + 3AE7C239DF03BF51E93A3ECA6AFA98DA43E981700240CBF7F96B0F8BF9B03FE4 + 54D3F7DAED9AD3992EDEF92F1ABB7261312DD935B4C625118B544B2DC234EF5B + 084799116232B24042D53A82FB4E1387936D290A8B9B150C12BC5529C8373203 + D4A6F1B88A2A0D7B6497099B9F63D44AB78B79420D165937DD644B688F9066B1 + D2F5D024FA7F1E082B9C9A90CA1C9E296944FF0270E23F7BC52D9FF158A03FF9 + 03A3D44A8919E8DB14BF1A3BD54895AF449DF8FD361443B7FAA9A11A89BEA2E6 + E99DA8C620B7AC082CEAB7ABD1C2FCB792BC1CF8BB98393367AD4939D59465D3 + B140413246EF6B5505E9843696B125DAB1E0D9E8DD23DB8DF4DCE3CB0B256775 + 45CC73D17E88E7B3A6C42986CE55C0722CAEB188B5E476A95112B4FC9B6BB35F + 8E56D5AE441CFB03288A291B9A5A56F78A4226FBF2B466575DEBCA6B7AA6210A + C23A3AD2DD7714D4A5995AD41AA3B5A6BECE076034C1991C8BFFBDEC29ECAD37 + F09086AF0811A92A60CC8E5EE2984301B5C7ECEBE3EBACE33059468311BBA691 + F8F4BA8CEDEFC000E020ED302DA02E2B46D9527E12374C8C710095C21C82D221 + 3059C20A1A6028D9426EA6CFEBD90DFF04FE8F942E68FFF01DE50B16234BAC4F + 2AFC733E1C844FC0FC37E8E92309D1EE60EEB16B13CFE61D21302021C8301BAD + 2D30BA2DF2BCE16453A98FF3D1D42A84CE81A5EA371EF62CCF054D086C5D672F + 93694B89DF5EBA809BFD56E492EEEF6DDD784EA205098828AA904773A19C2E22 + 26D660F6810969C3A142E9313B4F8325AE00845C048F5A68A682B4DAB655AD8C + 03F118107FB88E5D4BA332568003FBFF144D4EFD2142ECEC29F035F6BB37F240 + E2A323387BFB791D0F953F26B89CBA5C86D969D88C34F7C961540FE3B5D87E2E + 680CDE28EFB7C31ECB32817E6E7376101673B373D11BC381527158ABCAAB1235 + 7302EA2713C2AB89B7985E8685F4EF1074CA31D19E4F7AFF01CEB5657C790EA1 + 1595BB85EC158BBB0B52F01E2E68533B6C51DB791A41BE54E1E5002B0A8A7B16 + 483736867BF9295D6F5B1C067CA82BA1D5765DD8F2441780C82F83B12C2B12AC + AC5CABC89F17BD100299E9DDA79F0172F15783FF9433095FD3AEF9921AF4B290 + AD5EF82C25D606F8E1C57440B4786D662F61CCCFCD47129B64304543279F4ED8 + C623724788CB12FD9E8E1F11A16DCC2133544F0E4FD1061D3D39B4D1566B3490 + 21DFF979CB2A08A75B65E37685CEA98C02C3560F72AA308CD76C35E1E9516F3F + 91415E9C6D123E5DF16BAD3A9FA6082106925AEE211DF828574D627B4BBC8B20 + 6943F2C13DF109A7D23F3F181F80C63666A25310FD3BBCC792CE84B9E8BBBA0B + 67335016D177930B85A4356ED5EA80E154C5B255B69DFC91F5984EF1749A0057 + 93B1C7645BB87CA694178065B77143C701213746B83450F8F6AC91A0CA5A0B5E + C4D0CD25F518A674343ABCE8013135189C3F07DB93918F23D168A7704004D73A + 738395C255640C7AB99E0E184B4B4917F2FED7844F70082C9D202EF7544BCB1A + E841F633B999C3FCEF7B4FEFF1D5398C883BA8CA43CB4681DFB11CEA1C31D97C + 7C6184076CB38E076A5D4DC22AD1B84534A66C7E7BE7F2A0B7445FB2AC022E98 + 34F7854C98BC80CD937778FA01AADD72A8102E63A41E837BDB9CFAC77EB63F24 + BF2D7CECA59709A4AE2EB5D30CD2EA860DC28B288F01E2B71926DF89A7AFBA3C + DA19B30617CD594F1DBA57892A1D993FD9E63884D08FE488409FA3511E4E9749 + C1F2BE3590B6589B3B9B3E1159DC8D9BA97EDAE65FF0A0435654A61CAC628F1A + FF8B3794A013DA5D82B8520117A7412D4143FF9037E6BBA1191DA45C4542A5D8 + 881C313D13C377E636C814210F6D97124BC5BCDD13670191D7B43E03AF553AD7 + CA125308AC66E3687325EE5D5C9C11E4042B3B4CB43D8F635302CCBF7407AF0E + 9C87BCAF146A7AF48A2CE534ACD3119D04351E59B64594FCFAB7C76417215F37 + AFD22CCA4C0F4A98644366F86C9CF618531ED747C95AD237C516CE8FEFCE381C + 0E3A3D0B439C070BD0555B1415DF13DDADD6C836E1472EB1C1118FEDA9C1C583 + E06769BC993201AB1E132E13D0FB98E9621078AD082F63CE00C12F4B18AE585E + 454805896CDADF5492180BCB7E38DEC944C42A4DCA5C5D5FA69277E40166269C + D60335391712FED3F5D772742BD1BFF1FAA95F398750E4EC9A8DB9FEAFC74726 + 0B13D09B90D2424207903C456557BD6AEC9D89A08BF58FB60A18702D7CC2DFCE + 1ECFF113A68B68E7358A8F31AFAA04BA99488FCA4A8231929C710125D6DD1F3F + 44F504CF999EBF7D57FFFF39587FA052A5A084272A53EAB0B2F859BF91F65ACD + 9C748EEEB2235038F774669EB80DFC8D59B1696A99CC84FF07EBE52DD234D7FA + D04F431B2F97D8C446278A899E4F9C012AA31A95CF993F1980BBED045049E316 + 7EAD37C04CF86D3F12D0936944761CC01EE16E9B3018C715AE7C6701AA7F8150 + A86F293EF30EE68FD175E099CDA37DADAD32C0B97D173F49C5C9FD5D46187BC7 + 64D8BE8FC92A289203CAE007960EA02C61122191A89990484F74AD3A883CB135 + DE3A7F9093DC8AF2C8B4EF83CA995064BD13CE56995E56F645A1B9CEC7F93795 + 31B0F846359EF21BD8D20EEBED699890697CE3802978C80A5720E58A9D72AA7A + 6D283B3ADC5C5CD4F682E8BF13469BE319A802B17F65E5195038C990BB8D0B9E + 2BAFC8A2E1A5F477F2D5B9D187FDFFEF8E75249EC8D688B8A6FB40D2D0FDFAC3 + B937ABE9817CB4E611F8A128EB09FDD0D8584391A47F440F330D0BF08CAE2C90 + E7ADB27D34852C8FB0BE664E0F4FCF6078B458B7EAFE7746EA801C5F374D0B67 + A984851CDAC1CBCD55676059EC8720B6A4BBCCE5D5C5805EBBE3EC8DB03D50CF + 35BF3BEB41B39C75FB970687F1C0FA3F179CBAFC7816D4A1CC2458699BC42281 + 4A2D4448D032FB9C4F0F7277B243D03C6EE3DF8AE2D3D4353B28BF319E180D2D + 5E181C9AFB5C9F21BF4C0B5489FE5DCF02CB3C7C6F93D7D9C65622A32457ABD0 + 3337A7B94BB606FA84222FB2D3C17267D71D172D99E13391E279D62F35A6AD67 + 551AC747427AF2BFADC5ADF846613B189D9A5A1EC1AC2A1C0DCBD47576404B7A + ABEF094CD4858585C8ED8A343553175596AA3809EF8594F5CCDA6626D9A59D07 + 98622B580D1C2D7B0DAE199EDCED7664646C97C1D701A4EB1AD9D8E524FFC216 + 57EEABC7598F50E42E03D2F4AC74031956C4A56FD1CD6BF84F98E3B729FB7E26 + 29A945C4AA5544E0E27EA4AAC207F4D551517647959496ECCC70D167A3C3DFD3 + F87BEDEA0B3C780960C4560F4B0043B5DEC279AC41633F560EA60839898120E0 + AD9C3B9B931D38A73B2A03A5467033AD048CD88CAC1225B59F526C1E396EB67E + 70EF592D905FDED5C50E52D813A36794FB519F68E457615377F2491A186E42C1 + 28C0EF3DC6435833597AD2685398776914821FF0A6643276D8697D5B0461E924 + 6E5AE87EEC95E6D4CC5F3C6878C25F029F50CAC4532161723816BFF6A2A13F1C + 3E60DD883E84D2FB1C8EDD09DBFEA0BC4F95C3C1DEDF10A3FA212980263456A6 + BC708E401600375D1349D53B1DB3F4CF342416C8BD3FC9E95A40CDF49FAE3944 + FCF12D90B3E7173C6FE81693B533757BD3AF60124A6645ECCA5CA1528FEF57DD + 1144F34FE7A90C243028B7346A95E7859D81902513F3B24A4B3927EC123BC37C + 1ECDE61F931F73D5D32F61149FFE9AAFAE6CB9A6C08978B3DB9EA80FB756C446 + 01D1305BF4A7EF2B2AF1E1F02D258645A88231685CB573232AB777F8F7C60D19 + 7FEB70ED3107D841FFA1A7D4AB4858B56315825C264090059B3B906D4805F9D7 + 5C1F74012E14A68D1542A57315E71FA6C82B2904EC913BE67435C791EEC865B3 + 9A93A246AB8B24F8B2D324054DF4348796AD4C6E8F6ED09ED1BB8E980F3D62C0 + AA2103BD9107A0F7685CE43C25D1DCF400C0331E4EFB65F7927052DAFE331C5A + 0B9789B8C81790BAD5738376CB50F469B9C0AF89EDA54B18CA9283F6C04B4711 + 984ACE3D52A284863315905A8EA5CFEA9C70838A8E1EEC5245CC553399A962CB + 1140A106ADB20A701B590B2A571C09877D000E65946217EDFFE2596590C0F14D + 7EFE58F8E6D31EDF4493994AE08A0C56A8C95E2920F71B311D000AB4FAB2C38B + 96C28B19378E300DEA04F5350E25469D9753FBEF4F68EC03D1E29C7CDA8B7617 + E58E8340872C6EC64BFC93F6EF5BC1F64E186971E35D7E3531DE0B81034F21DF + EB65D8DC84DD4E8660257E84ADB9ED22BA3D831060E151D4B71FFA6482F9D1FE + 9D68DB59DB769C6A23B220562CDC6087A980EFD706AD8064042007A49A5EACF0 + 88CC426DDDBBBAB38D5084966C31A14BADCB29502D42D611A7B4A7D654E89840 + 04F0B7682458D5FBE2EA3E847A0749D1218480700BFAEFD5D63801A085E94677 + A4585D5A070ACFFFBC8CDFB4CDD368E33CB0BD8FBBC639E44AE36C7F2442940E + D2D79CD95454FD27AD8E0AF18F957D04A0483326E97C763B1BF794ADBAED630C + 97FC31BCE00FFC7643DB64AC4FC6763C11112B3D8703D739C2BEB52D9D4D2594 + E804D9D1289584FF0AE9722D6EBC4760391E03C878B0B3652CE0BE04747E7355 + 4B1B3F219CC3C15BFB92E92C28282080384CAEDA842293E8546E69716C215B58 + 301803208059992D905331DFF6485FC4AE24DC6481454F6D005AED73A7CE5276 + 6079ADDC65C086E434707179DFBB7B85293857395A0C02CE537EA4198540FCAA + 7FB2E3A183E9AF9730792295EFBC70FE109744895A119C37AAF80676FE6069CF + 079B2424D89A8C020D9BBA5C9C10EAF99B5262389E259DF8F4D6563998C21F29 + C958365DA770E22D606C13D892A0085CEEC72DC76CCAF5B55151590340B98714 + 9A87EF1154066BD130B8DB8B21D90A3D4BC617776EF9F36C06DB41BB1C06946C + 1177823C9203F3F32C4D7CE534012C291A762EAC1762ADC1F1A238B4F6F2B55F + 0C4A61E3E6213B8FBEA37424421416C54902B674638956F1F3100186BC780E72 + 738B2238406BCC59160C7262721F8299E3A9A9A7A92F1E9E10671EC18A540FC1 + 38C150C45E937A8A482A8BC627A9BAB1CC94BE02B02B32565BF1052EE18AF4BC + 838F671CEA9022ABBB7D97D5EAE1635F69B1CEEDFBC19D46E07F3D4B0783A3B2 + 50AB2C39FCD91BDF1277703B827E3B6B1DE524942F0EDA63DB1D5463B6D95285 + B793F7DA3601B8855D8344B4A104F93D66AB4D25E26D927A52F5C8B5FED789B2 + 8D4EC7419406D09A65A25A85E97CC464CEE5B5CCAFAFDCF1CBA78D0593149458 + ABF8794EF422C766CAD46189635453F51A12C8A81927943D27C72A53D0B9EC0B + 76A836F4928372523D13647414F08EEBDEA8BFD1FAAB403AC25F37BFDB0DF1CA + 2CE626220EA395C00A3375A6FE1CE0EA65F3AEF3D23CD328D25DD1A453D53F92 + 08EA1A31E41AF3372E02F767AA669F17A66016DD3479C49FF2C3D001D2A8C79C + 98354E80E9CBF98873184F48558A93F2A720A8A4D80DB2B7C1F72D0977979E62 + B4C9B5F28EB1FB582937D76E5CFAFD6BA7D7A4B7237F2F7B5E1B5968FF578467 + 580A1E65E2E84824C4C388D80D34E6CCFA755C88ECEB3B9544B933F80159D284 + 2E98E38D763F8474423E0C3DFC0E9D546A52CD0E16E3F78E3CFCA9F50CF65AB6 + 8E6F356CC46DD901D3BCFE408C7B8E947E54D9BBDA3B4ADB5D862B1E89F24A65 + A8229DD40B9258F11D1FC88D474C4EB444BE76E20CAD8F08DC3A826B457DA886 + 952A92477A930050F2E3FD35A2B5E828864F14F2F5541ACE5290EA64BFF5F8C4 + A2F5ACD0075C1A3501E88671339382905C918C5FA2BF5A645FEEDD85EA492B29 + 74642090CB2B1B976B6DB6B357BB32CFAEA302DEEE2B5F6E3241BECA989316A6 + 277996CC221BF6BD0F4B0CAE47751AA99094B87585F2B24240470FE19B461A43 + AD1837AB035E12F68A989AD69E26C3FD67A07229F435852AE4FC45810691E2DE + 278934F5848092454E57AABC69D687614E224101E361DF86E6F9B501BCC1952E + 19D5CB83AE7495E9C498FA75F84417DD53472BDB8D27B8B55B87640AF058FD85 + DD8169D418F438BA4B6753BB9BFF41985B5731AF468D4962BD089945BBF627C0 + 0CD8AB32AF62EFA4AA37E30DD229F1A5868310AF50D6C633BFD9382F73AB0384 + F3309EF0219A6B38C3B5347ED163EAA7F47399B91C3A09B054FB21E316893B8B + BEEBA09E4FD1E6B760A931B7D8E5A3B0706D5924809961F93BBA59313B8E3EAF + 5CA7E2855897322929B2FD58290A4CFE9DA58ADFE68776C89E06101EC1AEFAB2 + EFC54203F04D6872EA8356EA089D60E0EE944A78DBAF3A4786F6F524096557E6 + 570D9AEE1EE7A82622329BA04C1628ECDA430AD2C41CBC1D92D2297090DDA990 + 5790DCF3BED588A9144C321A4D60C97BC5A758433F776AB136C0E78397D5C382 + 635234889EF13D398FD198E41810BA66A5C73A23B40649A2A4EB36FB2E745362 + 10C81C6B72E3B9726549BFE71B91116ECC6B62D19D07D34A06795F798D05528E + FD457CAF852134C35F595A54CF31021D1116D3F4BD858A5BEF951947BC336139 + CCE57A8CD7CB1EC30A95614A388F403607241C864472220A2AA256EE682DE51A + CD6E49F6307FA965D65BA05D50CD9E1433BF2D8769AE1BB5273B7615D0C7AA4F + C47FBA8450A240C87FBCF5EE65172972FFC4A85536D57EFBF7CC8CC700D8819C + 124985C98F1394CF97B22EFB10027F63BE76EC6DB5F5866D004C32E9F2792FBD + EF44276EDEABEF0DC2F6F346719400FA2EF8151F79F7DE6517A13DC209DE81DE + 0FACCE6491D4866C06BE2B376735E48BDB800516D08CC6D5B454467E8EF83F8A + 982DCB86FFB3B9D4620A3E98356422FD328330DC64E1278AF07C798ED1319CC8 + 4F5311BB91B0DD5E5805380339EB94D575848DF52503030827866B7DE6E85D7B + ED098F4CD28D711C5337D231385F710B5AC60C149BD00C491E15DCA71F157027 + 8BBF22FBB4DA70F9616042A49F7F827D96B83B08A5A7C9CB3794B3BFD9DBA4E6 + FD066E91CAADDF99AEEB2308189AE578B5ED8E2A10652C3CA1EA29FFE04FF452 + 0C71E2D4DDBBC7634E0716CCE695DFF93A04B1984690005A240D1BC4B97370EB + 2D074EDFDC2C303CDC001910CC3B90D6F5DDFF3EF7BF6DB6A98ECBBA533B59EB + 83485B1988B0AAB2904AAF2F074A30F5CFE92DB1F6589D31C33E62946D44CD40 + E56FA1732B8610930ED87CD29F2CE1B52B156AC58505580FB21B8937F922B75B + 9610BA37775E7EC99DB805B7B39DEBE375EC2C82544DB55698E9DED37B28D0FE + 0181F035EB2DF8A84C202C893ABC9E5AEE4A70D7CCEC5B51A2B0CDB7B618F812 + 8E68346649654E2FD81B2E5B61452A4F35730AA9D71F7A241B2B3C39B2DC8018 + 05FCBD17853B8820269D1AA3C33699FD1EC55FDC15E28688A3CFFCA5CF86F0D4 + 31C8AD7503448FFE56B22E063E4699EC485192D492E2FF30008759B5332D79FB + D383BE46807C6DC44E6637EF10A4FCA02BAD7A6D62C05F756996B9F1EFC59A87 + C976DBED30F2FB223D6664FD46A3B94FE870EBDD2938C97582FFCC7613E66264 + 5A40580E4349F4427EA45BF59F29F1CC10B582BF9D9C2A46B9434F93BF9F562C + 90311D2030E00984723F82399B71D41459D6CA8083C7DB67806AAF3049DAF42F + 6F919691BD5B5D61D052CD3F732A47C642C1493DC917708666CE13A9DECC2283 + 78C1151D194C99E6518989D34D7ECB7F15BA0F726E79417AAF10879CD11FF84D + 2F8EC1A7CBB256D3D1BCEE00A9904F015EDD51A9AB05A85ABEC6F56B4B6A9CCA + E0B1EA47FFC0109C2E3798ED853817A96B8B23FBF512EA557796836385DF6806 + 4A7556BDF10D80C3622F4E6F0273A93A835924D2C73882D79286B254CE49A05B + D5CF8BE4D0C71A0BF83B9CA5E9289B8441914F45D1C2B455D90503E58B98BC11 + B3C694DAFDF167E5C5AB48F61F8B714422D8AD9A693015A84B0A5BDAE39D11D7 + 2B09ABB15358A0072E9AFF5CDFF175F897C6C751AAF9BB2D1AE97C84A3EAF913 + C999CDEF79AB170FC724A3DCE838C280DE524663CFA4856D122C72AA1979FCD1 + FA537FB73A0C854E3F21033FF8FBEBF6AB2F1D5BC49BE81809BEA2EBA6C1EA5D + FA63A6414760BC8E0ABDE07F7693281E970D3B1E32ED2D70533748C87ACC2D04 + 67077D3E4F72338E916AE32D3CB066986A203A8CC53D461D2A418443F49A00F8 + 14B12F59FF66E024BC3B0241E3352D865AB0451B2B1F710E744F35AB1FCE7C38 + 66000F479FE2BA3EB1906C48ACCAB652078CC3349E16071F777C3F9A0176EBDE + 564AA4552CE9EC8D4ECE4399A0D45CF831FB2C9A21EB789063079A7CF36FC8D7 + 2CA5992FF670600B29831F9EBB740E03171F946380558A07BE8F3A5B73FD8D5F + 2CA7B410541AB2071E3BB8855417F77C8D911AAE3932B6E2CEDBEEEED5FA58E9 + 09CE2CCFD16F0B8F808E3E43205F56A98BBB446CD9985FBEE58EB5C60E9A6887 + 71F7DF24E568E094082C3797D3761FB30DB8480F09612C589AD63E984B887072 + 922A04920450FB05BB301DBC3EEFA1D43F9693E4BB5AE0D4EB8C542F804A3D76 + 12152C6AC333393B346CBE059F1E26AE92A813D88E7FC5DC9DA061EEA3E1402F + 16E3C3A9C1BD0255700D96DF39D36FD2B86E423C448F17B67D9933DF8587D8A2 + E84EBF9D4635B43F125165C83A96FD60F800681474A4CCA8004324575F28C91C + B9D4B780646735697B75712FBB56A4B572AF7B7C8668F32AD81BFAE45E285D04 + A0E7CB89A92EA3FA21FB433F4F6A5CE38A12AA5E3E29C68452AA0E2A666CF0A0 + 6874108064E46C2D3B26B005AB8B4641860AAA42981D22B052F4394A839EC42A + D9C542B8DEF07ED20E377B3A389FCCC0F88F8590DCD417EF3E6E92013EE1FC51 + 13CD712AF88600764E251F47106D74F046D9C976B0BF24C5796B7FE15A310457 + 67AA335822241DB4CA4F3BCF6940377D55D78A5B46568821203F5C06881B6411 + 2364C3ECC5D43F6928B20C118F8A76166FCCFA749C0938D4756FACE32D977382 + 8B3E8EDD49825788339352DB6BA0198F980BA778F69695E9497C954EBB3F6032 + 2056B41B6D979C83DE9671CF7D773A118B7191AA7EC4BE45B4A0E5A448565028 + 3551CC4B84D159FD626EA0BD94162999FED7CF55C1F82112F488804D9B159756 + 05E24128E81A5EFC7E8ADC314BB6FA6D15B2715D5934FAEB688B6528AFEA3938 + FFC21E579E88D4DB719E852E6D5D2F60254E60A9B95AE0A0CB706C6CC935CA73 + C94D374C8F37B8EB1FD3DA1F0EA6490540C3F7BA7EA6F8C3242820A4559AF9CC + 3B00B5796358B4A1F9C267D06A4DE769DDA0C333152E0798228F892C166DD05C + 327AAFBBF3C071030C250B9C1E6A9FF4DD080F678B0D9117CCF55E2A75522933 + BDE13B3F17F8ACA22B6E25CDF3315ACC493208102B366F121692DAD2AC0C04AA + 32FD313B118EB56306489DEC5E5038D030915510CDD5D1FD2EB9EC0D31886043 + A60BFF521837BE1BC4FE40241A46D1933E9BA1274F07DA01CEEE5B6BB345E28A + 351D3A6456401B1AC56A7072466F2422233F31D219D9F1FA1F67B133F32C0E05 + D127F4DFADF0926D425F54B7D8315264FBF57937E81F598215E357786499AEEE + 91B59231585906B0D4F1AEC4703B6F2CAD9785324ECB079EB71DAB334F3052BE + 4BEA9D48DD36BD08A88553610488CED07B7E4C9518895F27C10A4DD9F7CE073B + AAE53081DD9619D0172EA6BD42D9021A0A398957C8BC28DB1937ACF6191E3A4F + 0EA3988B04EE13502F87E013278A65E280FA377EC96A354C96D8647CB7877F73 + 2D72D5205BFCD4BE8307A3105CBAA07B7EE9562C6D16B7BF856A67F03A0C9C83 + 29821298DC35E05714D326D41B8B940B158414265A1630FE2FB6759EFF9420CB + 41361949283832147FDA74BB9E8CF5B8332B90CCD2C949FBC1F75645E7A225EE + 667E25E4D58A644C5814B392686CF151B8598C2531946D1220DDF70FD5A6C09D + F438B3D262B8C3C50AD3BAA4B34F3551625860E08A1E8685D2CCCD5C96CA68A6 + 897FCE1C7B03CC0668E87502A0C02094465574D1AC54A3A473583364BDBD910E + 23051960DA316B686A152F4826CC05343FC851D56CFF8C9088F8A73108F98A4F + 17615D6D2E05C8D247AEAB582DFAE066FD7CE2AF16E783FF40EDA375B9B2E1AF + 77490CB3CE62F86B35D70F5BA5338EDB8663DC18BA394E71FF5ED665854A885A + D7E08BBB6A16BAF4266C9F650CFDD9E22786D20D97A35D82E1F26BCFBDB27F20 + 6C40296CD7D988C66026583DA561A3F325FECB8C022D149D8EBB57486F72E263 + A33D99A10AA876991DF949DC7B5F89466773939B9B045966AF4EF00B3F1F1BD1 + 051367CE71103CC52E8D966662A8220F03CEF49B0F3D751213C5F92CF0F63517 + 4F52B241E26E2F1F4B01D37A63D7C68D5DE1782CC502D747170BBF7E4C5D370D + 7FCF7AF0645567B7D0FFFC84CFACC566DC45955C907F9A71305566BE05E46C4C + 76903133F8EB4566939C93BB195459014F29552EAD08473E3CE60AF6AC886447 + 3E31E1597EF1720F94FEDBF533E9D5F9C135C956100DB2B733363A19A41AE93B + B3D14322CA7B1FAE0C305CF04BC52B70B4B501656EB990A185ED31F756059D35 + 9138E61F074C82D628BB483FF1ACBB64C66EFE9AE8426A04FBC10162C225E26E + AA4A2AC51205C02A0C6D9666D12C9FA8FBFF86EE5459904A22795E02CA51D0B8 + 1ECE92F687DD5400CECFE2A3A0B1B2B88031721D69ACB8BEC9392650AB3517D5 + 209EA8CDCDBD7C5F80017C5F5C86EB26CF4E84CA6C3FDA77608E7B54926273C7 + F6BDE6CEB0591F1ACE82CFA5C3A178AADC49628C9D998980517FA79378BCF84E + D8772238FBE755409E2564186F3A604AF5FEBB1D3CBCDDB483BE2CE1D1D39070 + 3953CCD24C921FADA6D18C410E86833E944FA9C37D0903812A82F387CD179E59 + 1533D1F6307AFC8326CCB258480F6B2CE9BBFE52DBC9EF8D98E56F6B7D16CCFD + C86D451B1CF95C5321910F63ADFCF6B1C798D41FD68B82C626706A3E61D294DF + 3F2E99C4810B03D07FA69901FE100619265BCBAB24C11827CB0D53965BEF2E96 + 8B5ACAA6B7F2C4B1DBC855B19330D304D61B510E6CFED840AFEAD12DCF9FFA48 + 45BC853233EA064F18D037B5B6C7A769DCC75AD1B4727FEF00BC04EF1D83CBC9 + ABD4D5535104746DB85D8551BAAB27039C6A579F5C573BBF5B0D8EF8C4DAF914 + C32E8A4CBCE9EEF6C651F26B9EED9B38012F15833CD5D7A9C4AC80A5387A0674 + 02AAA3470486465D5A4C98D8ED87B93348B327DB1C8F4CCFE11F502648F6A97E + 25DAD00B38F6F02EFAD1CFCAD96122CEA2EE672A5D6F2FC271E9C30E93865A09 + 26BB4E4B2F27A31DEFD714AB73BD8A467AE39EEC063BB3A6609CF010039A98BB + 7DEF9791F6C3CEDA5DBD139B4FE48DE30B462F71CD86D3BF0C3008289BB3B9C7 + CB0027450E7A8DA78ED34E9E352D4ECCE77825D308B01EDDDC16BCBE5A1D54B3 + 3E6FD9366D985F42FB18B3AD3DD3A1DA76272307684047A2518DD7DBFE0EE5CC + CCC6EE8C5EDA65725858C81E00AE14FF0C7B40BBC7F72846951817092403329F + BC2AD5ED026A3F5A471196D6532C1A6398950B49FC210029F10B21820BF2633B + 78C8BB785B7F1C784D218D679EA0B024FD2903E1B684F3D80A8E5C8DFCB66910 + 82EFC9C5CE7702713C449DE868AD9312069FFC4987E35571184D66D6AFED4F72 + B72AFA7BC9709826C0A550088FA82C21E41D74D8799DB7153AD348B95EBC404E + 72AA548969A5A8C2546E181725D0996443F9F8736CEF860918829F820FE1AF94 + B997E66D010F8E85EF5710CE00CB507315B8280484CE0A26A56C128AF91171F4 + 468A06B28736BE87E35BFCBCB67B03615ECC263FB44152A437FBB6681C74BB77 + 5FF7EB3B845C3293783F2043208F42B9A6FA7BB02BD8B62EABDC98B4116AAA00 + 61179776A5F8C915D8B94D6089132CA53B1589D02A06F13F767505E3ECB339D3 + 023F1C521C2E61FF555AF4370EC63BF856BBC7EF6D8867A212A8FC21CDB3BF1E + 948BEC51F961BC9E78A640745406F14E6835AC945A8B473E0E943387D3E9CBCD + 0C581443F986D25EF006B18FC8A80E8C24DE6DB6ACF3226DC5D3D224CF97FAF8 + CCDF50DED7B00B61564CA66C89FEE2F77E8BE7E6C6A0BCBEC3F8C74F74424F72 + F8790BB10455024C4D1B07D43910B380EB1131DA8C5148F0304B9905559BDA4E + 4AACE89411645F2B8FC1A6BFB12A34D78F579072EC1C31A5E9670CA65814BC6C + A625E283BCF38E2ADFEA8882C869C64B9D41419AEF012CDAE15FC6AEA3039B9F + B5EB82427AB0385440A5082A9FE606587E8C0C25178C2811AA832D3413139C10 + 2F5039E36CEC3CB51534BB7A20BD1E3D620A88BF182F47F9A5E86A365738D4F9 + A3AF07F936A9DB30910EF681B7A5F435124FA91582BB8C224F290B56ED27C8C7 + 0661A5C0CDC06144D8BE5064E56D36F5A1282D8D8B1F4E4C3CAD852D9A5E5B63 + 1D4C527A7BCC188F1E6ECE780EF4B85162DCE7D4C33CE8991085AFBE8CD20BF6 + F13B09CAD046A54E9317F628B45614786A79E6DDCA6200582525ACFB20DCD64D + 01658E4E5BEDC258CB5678419BFE8EDBA566F041DBEECF3E5F445D542A173213 + 3024B585EDD104DB59374431B457E79C175A641F51561B4850DDE539ADF8EEC2 + B58454D9F9EE52EC2E21E9FE64816B2CDD5BC806475AF35C0D867EBB2831C983 + 13753C1C9819842C79A8B3B4FD5E382FD688C6DC2B52B6D5D237ADF97E8CB728 + 59F5382489F61F00AA9CACB30DFF0F6AEBA0397798DE6BDD4E67EFCD46FF1649 + 2E6E7CDFC30412C02D24ACEA6707C91A8F9B663436C6EF13DC3D0B0BA51171CD + BFF353B9BCF63C310FD58409FE478FB9E20DCF9F62068B65286342C2C6D1F716 + 17355B7F647DB7BB4C4301AA870E1999732C602183A12AC800E31909CB1D1FB9 + CCEBF9052F964F8B01A62CA0B3AC74529865D1B992FBEE20215AF4EC11735486 + FC2B8050A1122F992D7B728744B97E8FF47E2EC7128849351E9397C166E24EFD + 30622C417338488D7731A3EECC40568481CC7C216E1D84D7C750181FC5937484 + 21421559A86073051690FFB0BB61DA8AA9F591BF0A33775D7463ED8FC75F3976 + FD02513AA561BAB092C1A271E07E67FC579E85A17F666A12BECE43E59110F196 + FB3FFFC8A498664B74D014A362BA6F949F516B73F7DF64F612EEB1C3EB56B6D3 + 67BA0DEB523E6EED6E0BC9E744C39D65EC0E5E6BC8E3D0800A5B65CA3EA829B0 + 8D31158B0BB5C7797430C5C49073120D85605A9E972C772DDD2B79159C42F51C + 56DB3D0FA0BBA7BEE2BEC7F98DBFEBA049D12AA5F2F8DF2D9E74942C354E03F7 + 307FE6F3B323A1E19C43B1FDD8EDF02E8EFAA4E046C6BD60F7DA5526784D5DA8 + CEFCF4D698EDC567BB86C198D594C5E7B9F6A5C4DE88EEC18A892E3856985DDD + BEA6BCF5C6EFA66A0795B333B5106986BA9FEE98C910E5EBD68FAB323442A84C + 66AD82EB62C1BD6E718D616EDE60EE03E4B4F784BBAB74357D9773B7D1FE4085 + 45D510C65C4BB7214B6FE75677E03445FA58BB0F009E3066F64E4B6A80B4CB92 + CFA3B1A5D3761F33288FF6A5346022467A3FD94100D52077473FE5A7A330ECB3 + 80C39564648779CF9BB9D4F9EEDCE5009EFABAB33F67F3520CDFD085AE741C58 + ED63B637F115ED68E4E069ABB21B3D7B3D6BF96F34AF66075E3014F884C43CC6 + 961088A9EB4E029827964F86E6073AB1CF3FA6A039B703E4B9F5EB6A5470D4A1 + 486E5ACEDBBE35FF75B725B6A19ABA44904D0C269721243E54A1B8D785AF79EA + 604D6A73721DB150B18F067505E66F89520E87788DC31256C84BFD95736273E1 + 5DE70C0E2BD50435F260A97C207BABD51EFF9186B1D0285A87FF452FE7B3C2FE + EBA59AA3A4C14B806A45D15261810B9D41F28ADDB24870CEDA21B26D1501C2FE + 7F815F205AA44342D35CEEE23ED90755669CAA1FBF19635A36271BE894FF98AA + 02642461FFAEB786509BA6D49BF7580E122B4D03C9FA13BB4C14AD6E97D4320D + 22C592E6D4F66FA1F3DAD918A99E7D41E9751DD2EEBB04B00DB9878EBF2303A0 + EDD0557D2AC8B6658A65BE488C0E2914FA50DE46C77D512F03973BF4D0357AF3 + FEBEC432D50C23E8035FDA32615C80FF62BB0C87FC8ABE06FB1EC225C2F4A56F + 3C366BE149A984BD7443FC797E6E9CEF59B1602302C499E671C64680CC038FAC + 5DB0BBAA7B6BA9A7D9223E802C6682B7BB2803AEC667AC1E226E4B137FAD6EAE + C5B5F231E90301EA996B403E218029A449FFC9808817F978902FBFABC9814FD4 + 4828A60052931BF22ABBE391466BC46DB059E4E1DD5FB2EC979E38730734DB2D + E71BC82D7130FE363563BCC60CF69ACE8BFEB00D9A80BD72D83EDB68F2E7A845 + 60B88841CC01362723C956E16AB013419CFD378BFEE5A9E07403B120CDA0F137 + 0E0111FC7BE6C6A4BCCED8F494F972336EC542EC00CC80FB4EC18A081338320E + A2EAA3A0A95499E637B6625B255C54898FA3295FC1F7E0744D158899CB7BCA21 + 46ACCBCEF4A34E264D68D5055E73049CEFA3DBBA6C623C51D325570DA5AAA8B8 + DEA11D428E7868221390FB9AC77E6898E1CA244B9D90640874CF18066C3AEDAE + EFC6526CA322FC7B1B58C587627E29591B5987D1D6637E08E056C0E1405467EE + 93A78756F8BB2E16F61B22F28D779F6F39C1FF89F6BC711261306BC4916D02CA + CECC7884A859F37AB1A5C31958D82C29D4D1DEBEF5DD5CB1E37F55FE5783A688 + BB287A17449582A1C7A2DF55503C06D75605B865B88E9D04A4E4E56901CC19D4 + 66BA12229F8F13114666AAC85DE4B7D509D3A086BC742EBA29A29462D825084F + C70FAC623FA00134C9057973653B9E53A40B632E70D0356BC5321F65E95A2805 + 679764A76A5E18C7796AB31CEF25FF68EBA6977E4811E5E1847F5D4D2A7AE60D + 616CE48FDFD07087F9492BC1871EF4C57AD37030B5E3C976DF4B7FD07DD15B5A + D7232B3FEA667301B50FAD4025DD05D2DCB603AC475AE262F8D7033C0099FEC7 + 2EA43CB3E1FE616CEB3AAECC41B8F6EC386290F996FA1935D76C0F249BF8BA31 + 01AC8AEDDE71CCB86A4AAF296442B0A30D1A9AB5A3B651684C5FEB9137484BB3 + 143173C33D18851F6CD60D8D66E970E20D391ED68421C912F4B965A173CEA0D0 + 9728C7D118DC26841AB6FDDC21E91DB1F6818BDB44474990A85D6435357DFA63 + 7035CD97C4CAD4BFFEBB757B5743CAE0D30DD1B65C4415115B46ED9753EC7045 + 3AE673FE89F063D13F21A1558C0328775B820EFBE798ACB4A8B7AFD67B4AF5F8 + 322DC1A60035FA89F9FE2C078581E07F6FEC3C9A23F580377C35BE7F7FBE0D1F + 9AFD67BBE221D777FC3CF7868C854E97F58003CCA61FD9C0D91B9E8D30C28D1F + 4E2A3A13F959A2CAB6D78EB63ADD0D34E0C428A377427CA120A277A45C71353F + DA4AB2B17C33B96EE99F8BC3A15CD7452BC9AC2E43EE827ACDA78979E8325CE1 + 50CA9E410073C957F5916CDE8083B34A68DB901C3918CABABA4950E6CA718527 + 65FC51158958014DC02EF0AAB451A7330076E41FF0637C6F97213BD7DEFF676D + 7D0038F07B1C69A10AC966099BA97A95EDD91C842C45809B4407F8D2310F3002 + AF4E5AEBE35521F73D3A36713BF38606BEE08E4EA2FB107D98998FADADE1E403 + EE993C27E8DC2084A5FB99E2723BDDBE62E0B0B321C22F89EB14F5007DEB1AD1 + 4ADD73C56B6D8A85642C347AEB2CF271E06EAA29C601E2954B4806A4D4FD135D + DD1E5B95110EDC7CF9CE81F238C20CEF8054B1AC7B709A2B360CE8AE8F442A79 + 83269789D19FA010CD061A28E7BBBADE01115B8692A314F7021DC3F490941C73 + 8ACAE6E8898DA2467194F44FDB570F9EE0C2ABB1AC82FAE62598F0BDBB545B81 + 76D11FFDA82D8B4246897F7930DBCA386D754ADAE65C041E5F26508C68ECC603 + 195F72200E46468C89F3972EB268327ACA34E04CA8DD2FDF4CC9CFCDC8C34725 + 82C08A276A7621431C52A7135B0B500E8CFF8D177D7045F4E5D0585E866D2CFA + F77328487A46D1EACE15E9B6B8EB7ECDB6A3669411580A142017DB8D429FE3F0 + 1FAAFE1C3A665ADD27DF56C7BC2F02973EB0B855CA955A88B6E9E41E8EA0456C + 1543518EB59A4DBB333625E8F7293DE9E981E4907FC8C0399BE6B8D053D1EC53 + 04C121C3728842D4E29441D4265117FF1316DA1ACB7F7F371C0732F49F86CA67 + 2AF10F9C910816268673AA090474D981803ED3577CE6F00DD59917AEA37E693A + 49AF39DAC61193C5FA8C6FE53B8F8D60E745960A779E61A3147A5C973710734C + C9D7EF05E63BB230C16C7378FDB6FD29476523F19D156A432C18690D04BB4888 + 7697C6AC165020575D7A041E505A87092D92EB376FA0EAE68DF11603E4DE3777 + 706E72F6586D1E510E1B89D1686ADBAE1796B7E3A5EF390A37B5279A2D766ADD + BDCE29FAF27CF48E841735864F8AC863CCAAF39FF2D78C3154F303E506D7E781 + 9FCA0B06C8A82C6B527068545890C4A17AAEF4CE53DB05440E2BCFC57F7D8CD2 + 5E81588153006031DC6FD9F944D3842972AC4E82DF0FCE98D99B090FF0E83FD5 + 0C140C1DED9392907F2FFC05CD6EA5FBCD32B7CD8C18FBF4DD9B367564323F13 + 79DDA88814193D1F90E61B43C51B8241B8F84DCC2AF0BBD3C166F57CE9C03EA2 + 4A3DE752B8AAEF9B469F61ACA3AC80C4B97A90BE85BA6CAAB48995C845901F16 + F5EF251BACFD1EE033323A4AD5742A1C923A23F47FC7ADA12A43896B21E7C83B + 6D771557A7F55C336B401197682532C208264FF7BE2251D09726C9502B0A4E14 + FCA1DC15BEADE1E9568DD85FE6305D3EAB59DDEF7CF15CDE4B00C5E36F049385 + 9E57021DB84BCBE80116A18EA6D860A02DE3B66818E1EB4504DC35446C408548 + 6ECCAEE996CA30F018468B222333ACBB7EDEB89DA739C9CC99468D832AA075F0 + D0DCC6448A01FEC983EF79830AB46ECF607C9BFB178D564C2A824DF65406B1E7 + F5F79B17F846EBE587179279116BED9A27DBD3980F4DE055217F1E6F1AC92EFA + FF3605537295239F04C244775BA25A56D25EA389757AD96418E9229CE0767F6D + E218DE11389A6D8823BE8F1E195691812167AFEA67444A28652F0E51C99CE2B9 + BC7309A63E39BF56CE63E4273C88802E205A5A2935878FC1FB34A9659AA61F22 + 1E2955E960055380FBD7EB843D4DF42336ADBB55BAD7F5F9DB4B30F7B3B8A4A8 + 2C0825E602C4E4F0B0208ADE162B1805A4DEC2F42EEF87533E440FE9B270111F + 2BBAC709A24CBA7FA2F297E6CED34706DBEF304345E85E8DF0D584BDC2D95A0D + C3CB351E96601109F17E6C5524C12FF4037D2EEDCF7B5EBB1E67DF582B4DFD0E + 7D4C6F38C21499DD2C5D34AAAF76AD1F28EBC050C7C86B7BB3A8CE1811029E34 + A52DC5341263C9BA95BAFCF0CD9E5329095CEF3993C8F8C083E13D8AFAC8464F + 81BCAC39A6191D62A5D3AF00F945255FD8923EFE38334F0DE898077515F6F3B3 + 43EF14A8A71C47323A5971BAB13A89FF9DE8C08AB378D71079537F463311AF0C + 45A733CD3EAD522816D94E2F05486F63E065E664ED8535817391C41D121D457A + DE4C143FA631574AA20DE037DB800183DFD8B7CF843B43D2754B0DA90217CD0B + 6BD23374A51665D05B69CF09D8D07E7C4F2FF4E3C7D8F5D9B4E20437EAB24F32 + FA71674F67CCE25CD182717B038B13079078159683A0B5913B4913760BC7D175 + B47B0026E587A625B2302ECC00023AC4043954EF9F0BB0C5C527A9EA022C8F63 + F3782D2A4A063EF7666D69837C013120EC46301A05C94470E54B70500C7F6929 + 4543AA2BD22A4BDDDC99EE05AB143F5E7F206A175917EF60A3A60C8441BDE14A + EFF3AB838F4A8074FC022A908488ABF5E513D71F832F75A8D38241D07387CFC8 + C1E1AF507A72AC13750038106473D7227BDF9E01312A4A9428DD6CE05E7B3879 + FD47B2D52726B48BE3D131DBE2078A2A0341518C8150988198F525575B72B241 + 2B57F4FFE79D255566447E8B8D104621BE20D9F2E8CE6168B9625EB787400957 + 12A248F5AC73918ACCD8138F7521FC913393ADB5C3E86E4623946B0C707A103C + 094E7CDF652E98ECD85A507BCFECA27717A49550CC60E0704C5BCD75BF30B462 + F862F34E21ABF2BEA5D204A2E7BE7013A35D4A2D6CA2618B2EBE4207E76C77E2 + 103F7783FFDED20D70C5CC3BE00547AAEF6927738BB39E90ABA55640C2EB3358 + 97FC0705ABDAFAF2DBCCDEDDA83B2B3A8CB427F490A225B7BE83DFC9A23DC84A + 8A5BA3A432636B8836298F1A12FAF6A18197C8AE74E58639CF01FBC6E988DBB8 + DD886656CB8631953C00540EDF46D0415AEE7E318FE3850A55CABF517B5BBCA7 + FD21BFD45CB6779FF635ECF7483F07DBDC5ADD39C7E5F83FD172F793EED60609 + DA3F0ACB6DE0439BDAF67692E92BA2C70E47928683F4A54D1EA3663BDEDA5458 + 2481EC036D27C019153554BA2D790172127ACF2D3C292895138EF64633BAA3F4 + 84DF48B1B36109C94BF8A80E79F8CA896B31057AE012AB7057771CD99326DFD2 + AE01D0231F3A0F0FEAEBC011A40EA69E9D91D373B5420C22D0BE00B5032BA3BF + A072FF63FCFD24CD465D499116F006C68644129D219681A48F659CDC9513193C + 61A797FC50730406CD5395DB96FD34A6820D2DD8AA68EB5F97CA60AAEB2A5229 + C7876F9E3C88DF70D16887B978B64EE5B6DE2FE02800ACB74A1A03715EECCAF1 + E91B638C3F747E3606E8F493115F90F3F05DFC45F87ADC0AF9034B762E049E21 + 7E3BF73226C190023E439B1B2729548B36F97DA2801026CF633CEEAB36CE6D41 + C2E993956B716B975CE4761A49430CE510B984791AE28F76C5E22CB55DBDBFCE + BE837EBF634A4A833E2A824DE14ED0DA50559CCC0C742FDD45C0313078D34BF6 + 18863CA4D3A3A392359A7BBD43331D4D5B556AD543FE822E6E4D126502D32E7F + 85C71FD804334EA20A61AE888C6BC1D072C9DA67238EF08FD61F26ECB14EA27D + CC7B89C1A570241EBE078738D169435CA55E1D03BB12429F8D32891819D9FA2A + 07BAEC21E59DE1E5A8C7572D03553A3465304354CD8ABA2CB168674469718EF1 + B68635C8D9991A4D91672A404FA2668FE9FFF8D4670E9EF44F10D0EA9F4604A1 + 7352432A5CE3BD3828B61F85FC982E76124DD1402FFC0CF728FF2F6169BAC75F + 328321970E901E44E32ED2228CCE3D512BC97A110EB977B2F86CCF76B2B56E30 + E255EFAE79E68C892022F4D0FA9166A358B1457679D5592CDEC46ABAC7387E51 + F7C13485F8040BF33962E0724FC9048D667CBA46F0CB219BD49E128ACBC8CC27 + 8F1490ABA2DC1E051680DFDEBA2C940D98826092C444E12B3AA87B2D0511E421 + 3B24343988A003FB5531FE7C56330C3428C8318AB1EC3DC949557D14D936F7CB + 0C18E9A92E8D2BE0E9DE496910196A78CAA5B12345E9A712FAA46E6C2FABE0AC + 492E4A58197E14D954D8AF1650ABD3CE13B5011C0FB537BA42B413A9AF29BF38 + 4FAA7699C9466AB41286A0E4E9D90057B696265ABEE8E515988151DC60D389C7 + D5A04E1EE1D120647721473245036873B3521A9FFF59761C46FFB00B0779E19B + F47BEA9055F941750E86B94C7C704D9748FDF5079B1778097D3F3D9B09FC9EFD + 92485EF758579611240036A1A24D41A2036E765F1B979AF7C37BC4B651DA3BEC + 2AC7ECBA06C54E2F72011C407AA2F3B55DEB3022005F35956578A2517D561FF5 + 66E90379C070AF246C56DE8490777229E0547961AB86FB0B25A26DC033DB5062 + 790F522904450329E110EF3F08D12F45443F584901A876D23CB84F77E02BA93F + 0FCA7D3D889AD5E8494CB9C8B5E3ED861A2683A8A25B66459A8745ACB39AD727 + 62444E065D5F84DE95103185308B4113E9EFF20D0DEF81D22D8E51B7AB9A35B5 + 1B4E985259B992F6DB20C2D43C46A2C701388FF32E686DEDC4E75843EF9BD195 + 23CB2BE00C07539850A4DC817A7553EFAEDA4D0274143D91C02DF30C08FC126D + 8C59EF815366E959E140A3756B6044CF88B57C32F6809B17E328612745C76D20 + 4B62B9CAD6F0825D2F6E2B33DB227D43982A56EBB068E117B2CAD2829151617C + AF83CCB445A862EBFD7BCD1CA6B40FC1F0791E56908FCBED69D469C03F853B13 + DD02F362507542066B9E278344433BA64E92A6E36B6C9237A6F9A400BC207BE7 + 899046750889F8C1960803708DAD56FB2637C4F84E98C5D9345ACCD09DBD4C4B + 8257DC4EE366B368AE7A405F8AB57E0D0F96C87336C3DE8B986A1F08C4DCE414 + 263C529F17028C075937E473D20309AD7DCB0B1D3A376E1C401A527024054328 + 98D3312EBF86DAA1071EB87CE449AF778EB4178C661AD5BD76680B560185D506 + 6B7ED11615F2E92CE534BB5D7A04CC537240B441840AFA4E74D96A9A77534E85 + 0A5CB0B0486C7A5A4FE53DCB66D5BB1F61CE18EAE8A82B047FD7F0DCB92A598D + 67A90D90BB253B3E9895C4A0C92D39878E44BFADC4ACD3EFD0763FC3E519CDD6 + 28030440B3A26920934D050EE398FCE347B52784DF304C6A049687B830D13116 + 7B41C000C5DA03379CC8673676223DD11441BF8FD5D0DE5CF726D3C294EDA249 + F7F15E75A415BAF6579207F29934B07845F3FED8E2CB424F2816E59934064146 + 661C2307B2B2791D15B8B3027C71BC760946FFDDA54560F8A461501C3CDE4D6E + 99F35012C9237FB169194DC226E921F6CF95A3095658A6E10E95721411ADD736 + E4D0111DBF59C9E40B2D517960670C8161DA233F08FFC404471B5E70D89F48DB + 79E7FB938A9B488F52E24B0E30F7179B3B19A5C1AFEDC72C8939F8FBFDDE4507 + DE26E8BD800ADD0037B13B04AF667C7186A3C109B180B261A2C8FF178175A5EC + D46A16DBC6EDF48755F71375A76195C8F5F782E2AB75098922B0E7215AACF7CB + 49551031E3365C3E62D29AB883D4C89D0312A8070BB88ED1D15DA031438BC96E + 30F3AE59B7CB718F29F929D51A1E17069D9785CC570ED435E677543624838AAA + CEB8DB807788490C3BC35A5EB8326A733756A971C0767C9FE9A1B2DB63FE75BD + F21777CB3A5EBF420B2C7C93654696A4792BB339038B8F3D709C9F87A9203DE3 + 182E883E2F85600BF242CCA06C5AC56F19B58C2D29C0214DD2F521137028B28B + 8FD75DEC70FE78DA48B394874DDE213BB32B32B46637807B4DDDA37B7B1BCA3E + DE1C1C029AD18965127114F87EA89639C2B156986116F7860F897FF0E2B3E1D2 + 94DB00CEC0B7F30E00748436D33469A3D42F608BC2D4D22C75325A52F117BD4F + 88A6F2ABBF2F0CAE2C4905924B9206EA770F9EC77006C29492ED18DF0224A78D + 0B88F750CCB72F194E4EFBBD4349891347CFAD1CD8B011E7C341C81488B4924C + 75C2439C3E767BCE8EFCD1D9DCF838B6650040C1BC262D7B83D216B902B5CB54 + 7D93A913FF4EFC3F21E6F474C0E008703672FE403D265FE9CA4BA846FB32B640 + 85F76F1B246B15B637BDF31782A79CBBD1109712B180F0027E10867FD6DFBEF4 + 9193D253D7B8023CD8A601EF891C78CDA2CC47C145C7955EE5BB36B82742EFFA + 1C994AFEA6F4F73B22549A84BAEDE9D67CCE99F3C82FCFCDBD63F022459DB23D + 6766325FB09D858C8C02FD41B6666DC1F79257F93A17EBC924E4961534FF2884 + 18AE9770FFF935EC29161C5ACCA9096B0FD4F2AE2849A6B5D5F07153831A77E8 + 4487635F85333967C6EAD2E97241167FA605BBE416F591088C42B72C3E1C65A0 + 7232A6CA5A3B2D56C8BC6C50F6B9A7A5C7B3062A97321DC596A6ECB550098944 + 777F43A69EF8A5DF9F326F059AC8C9BB30EB0C4CF4CCED4FECA07D3CF612544E + E252F73EE3456FDA4BBA6C9C26F76058B85CE37616DA29C02A7D63FB0888555D + 3A9531C27136C70EA4E26F8518F43AC6B83DD023A7F23CC828F2940BA5663EA2 + 129A071E3E6652092DA29EDFED3A71D07CF54B0252A5DC6DFCD23ED0BD9102A8 + 114832BB12A09E1F2AC9D8330D7F5465C90566B1ADBD86FE76BB7562618EEE57 + 6769529638C3D0DC3958EFDD7444A6A8EDA25AEE39599008B781AEA4D4F61753 + 620463BD0711E8DA1B90862A9B135C7E79B2BD583C58A9F07F5D2E7374E433F6 + 08951B1EDBA54B77D0075D19E600368E83FA588A3E338FDFB43002EB6BDB7DA5 + 7E4306A89E759931E9C3DD8894D9F87C134F71C39743A5EF7C2A03344C3C997A + 7ECE72C7E2FA0A3A2FE8FB35C6FDBA386356568DF097F36A2290DBE33F861627 + 49BFD9229A21B9000C653E9A7F2C218AE2FAF3F322749B6E6B429E10750DA995 + 450015D187E07444EF29F7FAE898AAFA87BCACFF6F629EECE9CB21BFFB8046E7 + 438F19F2AD412A31589BDC9FDDC426838901D1227790D99C34FCADB71EA837DE + 2E7C0ABF0371672701882FEDB619B224C703DA63FD694864C21F8D396C8042AE + E45D1617393ABE54B6E3FBAB3A6F057C05FF6D9D1C28A58FF4C52469E31B63F9 + ADB7EDF1905F1997BD09927D9B63D232C631F1162F0AC5E87AC2EDAC89790584 + 7502E04BA9BBDC677B174AE0A391C8165BD72EEFE0ACBBA91E7FDCB7448D188F + 19B94DD258B2A4E1803EC3F36C36313A2E56709668602B1AE95804D6D0FC17E1 + 6FABF07B0406F99A90496DB8AF1C10108B7D8496723B343FA78B1269185150E2 + 55147C6D36CA7CB13FB82E11F4CF3728C9F9CAF11091D703EEA811A96EC77ACE + AE19DF31933CA2C6C7DB2259B86086D11EC3B4139020AE2B0F6F48FD6E443C30 + 0744F452B922162D5BA8DF17DC6ADA2A3E71D08BA28A2BE510741DCA5A66E451 + 5B9EAB0E6FCC8E64BEA12E579B57AC89FCF737AFC9434FAFFE497597B9BCE237 + C66090F2E19D48BFB4FA0FBF0B14DB6C61228DDBA74EB7FEE7EFE42ECDCE1C90 + 593C2932E729D8C8357E61D3632FFE2C244D14DF8AB68E67EB39D1D251506309 + AA3789A2BD30752F696BF37EC79AB8F149CF81331D60E9773100FF4BD7860D12 + 5FDA98483B1CC148A06A28645B809A0CEC676B6A750B775A4BF9F8F337B4D899 + 65BF6379FF2B60E5F1A0E4EEFF1A64E048AF1B48EE00B880EF22A049950C87D3 + 2B553330465834217885838CC588C5BFCEB6B40DCD96C53D49DABD5B8E4E33FA + 187FE417AB8984D8779462DDE7B937A5C0CCF79FC58564C0895BD3270C1425A3 + 2087EF0DF2123977FEA40682B2FB23581ED07946B46F9185428A83A8C45A0DE6 + 091510DDD99A070FCEC9B6F9AFF77E2FB7CB294A8C890DB56A8FCDF7BFFBEC40 + D2BFCF285A8945CBFA76DBE7AE9F1538FCF9F218603E7A00052A1FD829BD2527 + 455FD00345531CC6A1401802FEA77D3BC920C9F3EF0B1735FAE3D0CC05808992 + 86FF7512DD5D31243A374C3218CE45580C2C0CD0F36430D1265B5A1D228E2BE2 + 9890A63B9788348E99E4569929F3255976A8B19D75D98FBF49362667664CB554 + 9BF9097A7A69FD1BEC5FE8B06354D8774C892BF5E4883F56DAA97E374C7218E5 + 444DF1A854A8F0C252BF1945A049D525F0C8FB5F9107A12DD70785569FE549F7 + C55C0D1AA1C1B2B510456EBFAE3B5BEB62A5083D31524A0AC3C7650220F7DF14 + 487B2BDC3A8588A8B023D744232B2F159396FC36E88923F603E7811C4E3EDF3F + DAE09B49D3FC5728845C661A8760526A41E9BC2C16BB7F87F20B25A521C151BE + C22768B3CCD89E37D8139B16030466C2F3266C3FDBCDCB5987EBF3ED998B6E42 + 7F4A9AE964D1AA8C5EC965D4113FC30FB127681B5E6F8062F70B453B60C680D6 + CC086586A0A871A6968BBFC46A82007A4E3F54211A93DF787BAE746D7D74D9C3 + E85617AD96470D171A560EB6A02890C7BF7922504FC8F530B2A9F93B27DB6E77 + 1492452242199DA5D2986AFF1000C1379ECE946092B2D8FFAF40666B287F8495 + 9A79463A7C4699B81965B5ABD65A2255515489D53ACEB6BEAB5D53B0C14A156A + E726A3ED630485CF3CE19FED00BC82D0C2D0615A296EEE8EB57E39A7475E660E + 808F451A907C6F82F415BBA6BF9715231136ADDCAD736851FD15AD84EA908729 + 4A07A7968C342055AAE50E01F9A774430F2B6F42FBFD917C356AEDC8DDF5D080 + CAAE489ED8C224DA39B3CA7FF1039DEE0B4F31F62811518016C8709CEB089349 + D32DAC85AC936F6D14C3CE29D1583DDFE1CE552162D06C2772E015379DA79991 + A52D6EB6B2B348D9E0F2EC65FBB589DAE68DCF25FBFCA22E3806461693E3E6DA + E60F8A8F8E1D2981CADC095FFDFC9FB0FBA8A90A7D08788A6A92068BCE6BAE8E + 64B2EDFDA0CC1A5033DADBC21177AD74F574F703883E1FDDA2971AFE3633D2B5 + 202A0304154C32DBE392F145ECD2CC400EC5DC9FE7483C5312B75628366BF1BB + 946CCC292D1CFA2790042DA92B9AB89E7EB405330043AEB7FAA4A5DB44EED1EB + 9349678E89DA8EFF8A2C5260D1A62656B79899C54883D90EFD3C6207CEB6383F + B8BEA09C166B3605F69008BE00D33E7462C98E82F8568B574697182B273A907B + B1922952E3EAF6B09E3FCCAF1753168A0DA6B20D800EB744F3F15FE88B4E17F2 + 20F545D626539FCCAC6EDEF669CD655662D652BA109E4F4860069D97C7878DDC + 4620C8AA5D9201EB1AA3D452F22DC65C51F3467EF6A69A9869EF17E721CFE506 + 084102E16E4861792BA86006E9514E2CE86E394B3584721891B7C8934C1655A5 + 91E3F0F423427DD19F19D8B1E6AEBF0354335DF49FE02E628D2B7F07AC4FEFE9 + 8CA6B96F9EFE5A46F58F91FDCA04B8520FD80B36688686F8738BED7E2DE9F915 + 7AAF8891D6AE0BEC7B5F340E2F83699812CEED19347F2440755B6B341E4F6581 + 1BD09BBFDAE99933B058948BE7D813E2988674ABC6434690CD48EF0E05FEEABD + 31CCE1D7AC5B3E53CE22877BAD5A29668C470F05DD9DF167ADEEFD4463FF5A55 + 3B74037CA4B3E62B130A11262DE53D5D9FBC6893B1F61E0D44AF5E1367DF8790 + 9C98A2B595D27B5AF420E02D961D3A75A4032364289AFA122367506D2B87259E + C54B83F46DF0F81563160383F388A5329B7532CD78263E7E823F04ACEBA1067F + DED6FC120EFF49FCD853F51D460973D32BD3E439850D86C752CCCAB7811510F9 + 22159D8E047846CAA424E1E6484FADF8CACD1195536B80F7B8821CDC623A3CA2 + FE79604407E645EC3D796800BBA74ECBCCBD774102A498827B4964F2640DECC5 + F36DB43B491C4083B282E07E87AF6B150E126BAB097BAB48F3F19C6FE0E09C7E + 5D44C148681BDB59767214ACF49DDC648CFE00985BFC3AC5DCF7ED60CC4A6E7E + 26F37EDC01CD9A11D38F0BA8F3D2C28FE60B85A22389C384D632A6F462089FED + F2DDA2EC8DC598A9FE74CB159AAACAB1694EB81629B3922A5847B2BE91C97738 + 771F3A294199F4D645F5584DCA1CDE915193088F88B17FE379B8FCA4788DEB8B + 97FF98327E1835BBCA0FA10E6A8E7AC1BBDB92AA3C0E2E8B2052CB5EDDEC91FE + 6142261328A12F74209CBC223B3CC1DC538A47B6D051BDBE4532F2C0070E99CA + 4E712B833894A79F6E96D7702BE8BFC7E2020D1845737E67080FDB27A089ECCE + 6A2DAE556D0A2C850064EE067FF012B30662D5F2C99CC48837D83FA20BD9ADF3 + E433619D0AFD513584B257D5566D89C109B37286FDE59490AA8034F9EAD60A94 + 43F365B42D269F39DD79B12FAA8CF72B9AADE21C0A05A74027ADC2C31B53B2D2 + 49DD421AEE56BB221D223AC1393B7F333A61E8438490E94E244FB0E9E4D72328 + 656537E520EC59BA3643BE41ECD548E3B29F6F03474AC8B7643E22CD69532DF3 + 459038C4A6C06E5F9BC261C7A78FE86CF4B35562875589379771D1237C2187D0 + 0AB27937E84ECD9B5FCBE984706B9E66E22455F1F9604FD07B6970A184DFAB33 + 56591B67ADC13821EA0F42CBEF82966F574CE1A5A1726B6F867F739E3698D3A6 + 73D7B618ADE471E8BEBFF45BE4ED9D0CC70FFCED114AF8792D25B679EF5630AF + 2099804108554CE001FC94880A494B67134F336B53C24202A9D7204ECBC65B4E + 6A0C75A3CFE1F1D282BEC4D6F88E378E6058FA334091284E99381FB6B87F8B81 + 4ECFA44AF3EAA047BA6003D50F60E36F0BE82B941E8C04BA9FA736678259F976 + 0D01B6B91F7FAD053563CC9D4DB263644CEB8C071D2BAEC7398D0F555B877963 + BAA008B357F4B1F300069E9679DDAB50F9614AD403D442AEFD83C5AD1DC005BA + 59654B6ED0B4DA041B8D49046B8F8BC59A042E80806299D01340D792E92D0315 + 7AF4DC96AAF65E1119E28DB741CC8EAD0843FD28167BAD60860C8763F2258155 + 05E4684B3A7AF3766F1115D1E3F89CDA946E798FFC87C0CF40C88651ED6BCE03 + AC08651067FDCD879129D8A191A789B8D87ECC89A73B78C0F0A95C4D0A957362 + 4628AFAC2F8BE51D1B1773D64FF7572EC5271D075A9E9B455CDD835AFCFE3605 + EB45DF68DEC50D8109F6DF28E3D1CA6BB050BE6436B48B72C72A71513A924D4D + E3723BEAF87B2CA32BB94CF02CA405976BCE483959EE1390B6F5ADAD581C1BEC + 7F6FAA9D19148F83392CD6BCC05BA14CFD3F58774ACF4B0F4EB0BA580FE45097 + 975F01DF0FDF617D0D0902521A92AFBBC537F6F46F53BC79959B8EDF4972F733 + 4959FD5F94A25437F45A371AE10DD437CC6B1FB908C5E3FCF90F9CD134EE88AA + 9166285041A9CAA606D2BB858EB8A9A0C9D86CF6D8801F3D6226D5842BCD6D69 + EBEED1A3D53B564E4B94B1354A53EEA8E1DA91012EF0A8DB1F31757CAEAAFF59 + C6215D166356A0C6FADDDE01528E1001FB89AA578ED54EB0159989BD8E6EB193 + F2170470CBE780E70843F65A777E4C4E30EC2C54F4C281C59D0CAAFE5DCC0C03 + 4B663D3FF0A2FF68D25B94CFF009DD0F7528329D6424690CDEDD3FAADFE7EA05 + 5C0DE6D645EDD3AF582DF3450D7E79DE1759E5914A1828BE7E5229DC36F31F0F + 5EE2E5E7496F1C1755A918947F4EA8A94441AE2914486B8F5FC0FE6891FB0871 + 884C3B3C047B4EFD3559BD3D1726C7F8BCFB614D8C3C47ED68BE8E1CAB2D0E99 + 97D354372E6A112083781AE023378030B0F207B6EDDBAC60A0F2AE1C62C1F46C + 9C51A083DB7F04DC1BAD29D4165B2BFFE451915836E55B64146ACFD8AC9D67CF + 9CB4AAB6A0CBE35A4BD03659399D3A615584A08E7C12A149E6E0A433FCC42016 + 266F8A26755E8D7A29445A3A5E785C45F4327BD3BD34E13D0CF63C4129BDE2B4 + 5C1D0376EAE7658A04E804DEFA2BEE2271B43BA2DCD794C4BDA0D9E833BDC925 + 5ADD649B82955A216675D87D8FAB75A6CFB3210CF37669F2156007C514873736 + 0F7933901E1857AC4F9C2DBD99CAE3104FB4D0BD81E072802F2BCF893DB97092 + E6EE28C8821701122199018806CC38588EAE24F1BBE04CE258C42774B0457DA1 + D541F46C83659B25B3C7932D8BBA40871C6DFE686665E768F9D1FAA01C97BABA + 04D407A6320B001496E068898FC3C33B8A557FF6E8AA40FAB528FCCF3038E576 + C5818CB86BA7198E4CDA922DDAF319C9F8889CB4AC5A2E0507D4F3BA9E684CB4 + D4AE82C90E3C55AF6E5211FF8A3E3279BB8F485832D8688A50BF4D42BC4D45AE + F14332533706155638DB94B076D1ED65D62046E2462F06CC5BFF9B7C1134201F + E5500D35CF6A1680B551DE45ECA52DA43CD2639F0456DCDB4E8CECE0425798F2 + 1EB9ADF95E529F01F1BD20A14D6222564F27E76DB0E27519D6DECCC06CBB4946 + 8319445F33EC6A3A8703370B568DD0391E9F95CC34C5EDA2240B3876FE7ADBB5 + C761B1D33A70DB5DB0D9210B03AB4D35981DB1F5B1A7B7B5AE6BC6B96405E185 + DB8106D1F41E971706BB9418A4EBEB712ED5CF5D77C9451533270B2A7C814547 + 8CF7DEE7FB64DD8EDAFC579FCC9AF43512D660D0C9C27B78017142E1233351A5 + 8D5F8F0B53CA613F834C990BB47AD38C19B55DC5AFDCDC329422B81C4D6F4AEB + 5A6332D12EF1F994E71E2715D043833ABB0E093D604B926E0557DDB69A477480 + 48BD2C008B21B92CFF7277F3903A14203C750734F0D466A4D5B3FAD797904459 + AEA8FCF9F4C924DFC61DDD935E78D1F8A3C932A4ECE9CA519E995CE991A92BFF + F12CC5DB11BC845B41948207071B3E89852748FFC34862C1DAC51924AAD20AC4 + ACDA65B085045C981D81AAE17AB65D60DEEABB2F420168ECB7D0AA8764D298D9 + 296BABA8EA2A9A27A0D87C3925946DD14211A959651EC3F658E5D372C4C37A26 + 8B13ABD03047FBCAB7BE046E69C032C4CEA56ADFD202D1EC3FE12F33FF267A35 + 1039E28DC6DD6F31794C476D64F401AAE28FCB000DE64C0B4F7053B6ADEB56C7 + 17316AC3064C7CBC0EDC78D98D7D82BB630D51E3FA0D231731CAFCCE5978D354 + A9C373494F45CDF9105707F7C6191B49607A2E64DAFFC2FE648AEB0AA0650207 + 29D6BBD672C2664EDCA914909323C47D6A4EC45D209DACDBC38A31C3C9D25BAA + DE4CD108D7FBA4833956713514F0D8202A0FBA388684C760643CF9D1374D405C + CE1D51E3C8E8868F0ED5CFFA6F3E3A204013C659D19DD4D548EC3FFC7F6DD34D + 91AC9CAFF89E98D9E3CE57512727348A720C98CDD3CE66B859D526CD55337D56 + 1ED91B3AB212CD77037AF0C3B8173282BD99F2F8EC82DBAD39E3B71ABB3F5BD8 + F373BDEB5E3627665563255F0D8F205ED27A162C51F26D1B4576FF441D98EB9E + 6933CB3F741788EB06B8286CF43BD1F39660387BD735A2A410A02E2A84E61DAB + 1EDB0444A664EE6EBC90CCDD866B0D30EC63C3B7C4A7597CFE0A77943D8F7EB5 + 9760C5AC3BF48FB66D893F70F6B15F70692E24D3AC2B8D22278C44D8F2D6E20A + 6ED89DBABCDEE5397C8F25C1C9FE96C5C71EF8B434C4F83CA8542D8C421298A7 + 29A2C3486B71E0835CA4ECCDDF7F85AA5EFD23B2BF7F146155F97FCA5AB364D3 + C7BEC21E7AB1CB94091837B81ECC1E980C11E487BC7DA5F28B37E18D0EFB6019 + 4A3243962ABF364167353775AD96B3691820BB85F9ED3C5BAEA7E91B634C9675 + 99FB33B89262BC5CAB773B34AA7ED222DB03A2374BD32393F1071BC876281A2F + 8666C1BA35BDF4906D5540B6E624D6772493517878A60D76332AFE7CD5E6929F + 223A72533A267B30BC4011BC9DF053CB0DF538213442A17312E11BB00142C06A + 86934756FE93F9D3073E3FC4DB904477FF391E4E319525FEA19BF00F25F56ABF + 21E5537B8E664F10DDA138A614F74C238E06D7C82FA33A2A4C21768C87345ABB + 23278DE80629A2E88E64017118E37E5BF92FB5B2458BA181E713B6290A5E2E57 + 5EFF0C8FD9971D808FC76605BB5D6C03E5FC2E3A4734562CE86D2ABCD0AC79E3 + 873B9CC4D05FCBBA5433B7B94BC81B6930D78053C1BA758FBC4BBD990D6A5AFC + EFEC37E6C92609C51EA9EBC95141EFE2189A014B0A40A93EE26108E58A44D0F4 + BF780E1D8AC03C428C760C9E76757F3E4FA8CDF717427F887AA7CA04A33C9B4F + E13157136B6D19C2C0288CB53269629177B6E3C956DFDC015A744D45745EA6E2 + 0F133400F685D829AFB5453F4809245E393EC56C5E18E5C1904778BD68F922F7 + 3AD0211853C1B9628B347CE13364A91CFEEFF6E913EC131F8DA6A04065242176 + A60E0A6719DC0103374639FF1551D29B3DAEDC04172D7A34B06C45DC66743AC7 + 0D1A8E44BDBEF7DB3638438E8C9E262F784CE7686F1E64CC6E6555DCF0C92768 + FE1890A2723289556A16A3502DD109C14E46A2FA8DCC44602AAD39F7EFE13F66 + 64C894844F5F606A817795714EB5A1D2D6E426E51FBF7978FE261E9C79333FAF + D372414328317AE6AC4020505BAC19233D77222AED2F67755C59048C7D41620E + 250CC2D36C15830AC101C28FC37C5E89DB5513C1928A1C4F958B7F1254F00EEA + B380482F14C7627B33EC91EB950186154D595F30A491EC6A6C7515B72A455637 + 4EEA74BF2D3856808DC6F53F0DD98F099D1FD7AC7392CEC0CAFB85A28F344075 + FCA511F6C810BDDA47B1F0E3C201ADEF0A613804EA6F354CFE6A279A03CE9EA1 + 298FC21C45C4811CBB7774F6AA5AE5794C112DC54AED87761F6DB83C79E67C7D + 6B8B625A6912B84579D343CDB5475DF1EE591C84A0CF4A23353482BE64F4627E + 7DE706449D005A254BEFFBB2DE2D2B077A6CCE6F2C65E5494EC7C3CA67FBF836 + 335CB56E048B01A1ADC9C6CF65FCA9C06AB4416B45C16E82DA0AFF75B5B590F8 + D5BF0FDD1DD6AAB68ECA8924ABE24F27981AAEE545EBB0B5FC59D14996FFA893 + B53C6B2A16DFCE9E4CD9C0BA9B85917C77134AC6ADC8AE29C2C1068ACCDBDF15 + C6152BF48A195531431E1E1D0DBD13D8E196E435C8A63C8148144E8C02B8A297 + 211F842BBEAE049A038A1A8E4B66092F31E3B6DB3408E0382F54B6409BA8C3B9 + 7D0470EFF1B2BDAE6E1FDF8E077DEB18C857B45E21C8BAF4543BF1F53BCA93AC + EFA462A363022E2EF1F196C4A8AECA836058A213ADD58358B625816FEC8324E7 + 7D63B3AF2775A5D1CA41D9AA824EBE0E1CBD48ABD7CD129A0DE3508D12E148D4 + 7CFE7D5E7EF8620E66DCB65400BADB0BE36425458CACC5CB90705824C9124461 + 4B440B4301123DA5D56022B4239F57214C6587E4422682F0A72F15F93A39874A + 4E096067967FABCB9079F24B1DED47C70E575C7C5538B859068DBA887736C026 + 78B84AF6BFE2E05769FC9F0A899B0D6DCC6E11861F879B0D315B249F284E925F + 0309ACE966A9B0A4B5D2EB6FC570CF41CA3B2B98FCE21958435C8B625012D37F + B44FAEEB62DBCC59C6D129F71EE8A0E988FA34961BB1863FE4EFF4A86110AE0D + 726C18854F35E806B9E0D8A8A2686228D0805FBEC25F6483423AE6E447808B60 + 3C86207E94F6B311ADB5F35E1B91CED27F845B4980D558E0081D0F1CD2E768B3 + 4D8CB623FC05D1BA7458B23D98D4292611C0E61183890AC3C87DD3BA9A62B024 + 2E60DD5E4660652345F86ED229555357A06123F1190CC954671884F1D2B81A0A + 201BAC968BCD2084831A6EF4A85601EDA64DC5200035EC8DA637394F38EBD9D9 + 6E445C4B95B6736B42A0648F11368B2C1C6B0B801586E34F8C28B5C21702F80F + 333EE81CE3A92F47B491A651224C05C300757EA8E26553BEC5673E9823FE2D06 + E3C9323AB1211FF39971FED4AF62413C98158DF7611A391A7E20BBA364FA787F + 4A7C9F900EF946C05F5DCE4626A5399E4DA47A3D98DACB56523E3573CAEA62F2 + 1395330431D9D5208264D8806C8F27C60DB0A4B2E239721F4E9572EB10597632 + 764A7E78B256070E5420C4FC85ACAB93C2AF0653668E10214A7922F2943967CE + EF83F543E06703859FC71808885A23A63414F494F1C16A1ED27EB974E5AAE965 + AA947E79544FCC3825CE0BB56C70EE2D04793E94A15882ED2F97FF33E689BA94 + BCC7CD90F4B949EB01BAEAABF904649FE3C58AC834856ED8311127D6C42A4515 + 1758E3B73D82D5E859BE7979FCB14D45C6C180223ADA127FE54B066A5A1ED6DC + EC00CDC83DAB49108D5D9EF92742EC14D47719B0DB5D82A63B9C462B2AFD38D9 + A5B71DBFC72F82DDD1177AE6BFA0568735D57983F9FD9F23E33D5156ACE336E6 + 71A7F9AB2FDD5C867A742A5C953F1B444A522233146878DF19F86C47F3AB39C5 + A2FBD8342C5F2C3757400BB325C5219B516C63F33D023EE882B7CCE8F224DF69 + 68A68AEA665F3A4413A8E3877F3BE11B624F71735928996DB1B93766F8BF6C1A + 2B4C8C740862707E5913DD6691E4D20267F222EF50F46EE108C35A4B2E0C5739 + 89F6B8FED1C5B0565C6D0C3018EA0F0703DCEE34290642914B0DCBCE66A621A6 + 47C3F103499099488E1F3B4623746950B613A2AB5178DFCD407854E556A41BF7 + 04267ED8DDFC5D4A692467B1025C570715917B936560DEE5F91B53BA55EE13F4 + 0A67F54A589F2BAD640235030017D05ED32E332DA06B599DAB69EE2DA3602856 + 03DAA6DF35A3A4AFCFC8CC1885A3E448A4864A1A8C9E38E24E86B98E73F04981 + 4BE6253E896B606C0CE61D65B4849C20D9459CCD9BDD17C25A340B55FE3A449C + CA7F0A09A6CDF4BA9FA2EAF253A4CDDA717D6974FA4C61A6ADD465FE06E53035 + E8577AF00EEA5B2763FFE3C7014A596CD4F9EE44919F95B404291E462E154D97 + 7D0C0C686E637EFCB3CB8E73CEA4EC6D118A3CC5668137E17DEC1D4EEE158688 + 7AD62667829D107FA7EDBF17B7BD4925CF8D475C0E52FE8A4460A52F5EB831AA + 5025B23F6D6B3F57A0E2E509A356A93328E86B6C85DF8872BFEE1CFB7A9461C3 + 9ECBE1B116001F23465D803B9B87C111C669345101AA9B824AE17EB80916326E + AE3B4F5C2E04AF8BB4596860A549BBF81803658AEDAA96A55EE0C8C8DC6AB9A9 + A7609AF4394B57B510F31AE295C22521EAA9488C132903C6D3B7C1B8ABF25C64 + 9EADCB68D02E6590EFD05FF30C6B8D8BA9E0ECC2F1AA6C7A68BE0F46C2A41A62 + 4445E4AA736E008814E8C55B022DDD85E985CD681D8A1B69542F3B0E9009B53A + 902C93823BAB638B3103755A48B4588AB8A72F109C6C67B5168C0763C27059DC + 1F60D7863AE9AC4A544731EB64794EB29A1A5CC640F3A614101823B4645DC0DE + 7DB420D32D0230E0FDADF8F2FC8D0310898CAB70A620AC7B2FB1B6A326311893 + 99031C8396B6511E21154F9C3971B78BC6B20AD8FB1417C04A309B8B5CAC7649 + 72C267BB988E285E5325AFC05BE59E8B816B337D0CF840DED8A26CBB332C48B8 + C02BC87ABC32C5F08F1BD1071F93E2A0EE2ADEACBCF33E689116F4CA9609B067 + 210E5482E30C3D9F0B154428FED0E13137B6B3B9E2AD4109AF39228AAC8782B4 + 2A84E22273171E969C7E408926E52A2B96152570D275A18D31F7C109E857EFBD + 64F1354AB5FCD767B50D55687E07F3026561F397FD7434DF9270862912E041F8 + 902064FE49E46258EB99AEF254B4E3C99E2A692A23C4E468B82877666C178F4F + C8ED4201315EF9B66A3DD93D81A1B6BAD7ED7B001E012A64BAFC4185560B0F75 + BEA48C7EDFB4199980BCB8073CC8F7CEAD8ADF1A68FA2294B6A884894EB02474 + 54F7831C4DA63758F7B7DF35E9D692522C5792AA834BEF7320712DB967D144B7 + 4897640A0B62D989C2836595D83E76583239F3A7D0F2E089C6EDF19E4DC018E1 + D0F5D7BDD8F2DB164155AA58A87FF275494918727CE8D04D3EBB3D3061D5B0B0 + 9AAC9B6FA98DB4608DFC9D4F4069CB5F1E4401900B135712763F8DBA4283E154 + 64D1E3CDDEF09C6DBC102C4CA0551E6DCCB5EFD78450327B096C6A8626C85218 + 742BF3C75800CB27E6AE63D3AC4880B246DB9583D4F2FFAFB1976AFD64391E08 + CD6D961F095FCAD9B14E63363A67BD6ECDA0D065032D021FEB6C612A61EDD50A + C15388B62536511A19A82B84E87234DC46BC248E60C5E0AE96CB0B92BF28A8BE + 07EBF8B0C55EB70CC9D29A53407A1CDA8E5AE1BE5B023FB4D6A5635B83821573 + AA5CD0E779F30D0F828FFC2990CC92E598340EA13910D2C0F1B2A96DEA9A0C5D + 0288428FC80268B86DC4FA2F0965050A709D57AF6DF9CC889FDB8864EDE545F7 + EEA233127E2D18B01A95FAD8B277B6A2300F6C76F6C0980F116F84A7C6011087 + C307464ADF91335255FD8A11FA0B0E661E5CB89886E95D3834E761C872BD83CA + 2D779B51B0E328F2C12C1298425B3FEC42BDD452A2D9ED78AEFE1042E86D61B9 + FBF9058AAAF60CE470C405756E2FE1D952376D82387CC532C60EF2F2EEAF91EE + 68FF258D85F18479E20DCFE517DA3D217E36AD6999AD46AE87ACA434B691240C + BB20799BE21224950B39766B39D36F95B82CBC99E6AEE2AAC64BE4E65CC3208B + 29D6804BAC78B4D4151349DFFC0D70393ADCCDCA1BEDBC6AB7ADC0BEABFDE2E4 + 5092F34FCE1D75EAAC2850E04786D89B98138A87BAB0F8827CFC7A560DC1994D + B2DDB1C9C3FE7D2D194CA9AE29279EF3B3157944BA742C5351E590331E72F809 + CB048AAC041F4B70B8FF9B9278059F3802878B8AD03C14976B6DB6B357BB32CF + AEA302019CE7C268F9BE6B54203E07CE8D6C9C3B41C60B64D77B3A5F22585F2D + 5B950E6288BCD0F49DFC228BC8DB9C576D3D89BE55CDC890E104CFC2A7CC2838 + 5211FC6610D52699D05FE917846535D3712A67B7B4BBBF31689E344C62F28F7F + 8F56A23D2B3FFD7B606EE5A327D0DC126260A426CC0C108C6A327BB3A37F1BBF + A6003EE764F01DBEDC3E550B3EF89EB0FEC675A3386DCEC17DC6FB97CC9E1A63 + 79F21F77656DF7EA5BD818BF4373FDE351DED5E3B688E365331BF13D41D95FE4 + 92B749974755CAAF7E078F81D1422A78DB14AED7C5CF69C8BC60B2C52D4999BF + B665FEF4D44F903DEE6D734DC9A35D0CF065F441E33BFFC2142B7BEA99ACCDB3 + 5F0EF390CA3126B11AA308EC966AA3A3CF7C9BD029788C6E2155000734ACDAD4 + 36834FA4A5D850594B19B3E69178C423F921DBC2FC8E63529276BAF3ACD132FD + 87DD28019FB96B6F59EBD4F890C170B6E45A6B46AF6F03A6CB76A49B8065F392 + 7E36AA50D872A9E0DEF0B4920B5F70BABE350E2FD1F8803238949E157D41CADD + 9474A0E10A9632700F15981DB84948B470AC218A5A960B3BB7EB71C3734BF37C + CAF51EF45EC3AB1D444F34D21F59477750C5B5E7848499EBEA36D95242EDD92B + 4B70CED0BB89595B1C5A4ABE99C928E33F9FB802B7E03DE033A61A2F8D3CF63E + 14266ED62BD57DCF0F28C8294B95397E3501EADCFA0B6748182A79B00342A75B + 803C8DB8222C43412D72CB0535DDF3FD540BF19AECD7164C1644B648932E8E79 + FFCFD3CA3428DE8C3E91CD1CFADDF780733FB3AC98F3A975A92547BE3CBFCDFF + B4331AFA735C59D2E6BA8E20082414B528FC2D78B34142C2CC3DEE0D41757517 + 9CC54B2C8277C3BCA6664C3020D69FFABEA7BD80BE64A7EEE2B3FF1DDE293343 + 2F4E67026111D2AA89E8522519C07C15712D3DB72DB8E69E6E947A512D8313B8 + 354496C7AFCE3F74A16FA5089A98298DC4EADDCB7B8E86FF52F0D4965E74BFDC + 7B5804FCBB527ABEE658284281D082A06827393159F5A70CC798269917513A0E + 8BE1D8324D50F37824027F2E80C476D8C194BE88B79904BB51EA5571872E4DEE + 919460C00A40BE20280726EA86C9469BD2E7C5B905F81C791401D9D07CA04A10 + 36621F1825DCEE7F7FD09561274DD5DF5532FBB044F9BE0E8E0F4D985BA847A5 + D8640B5AF2267A66E98CCC2E136BEFAA7DC03B17FE1F95ABD2561824BA6CCD73 + BBACEF0F8614C5A1F81010DDDE7DAB4E3D360485813EA0E6810C0F5C2989B875 + FA588D931103CB7BE93A677CB9C975612861A01651C1009932A9D151069E51BC + 479F0D1D74F58BD2B5CC1B83D70A98E5E1F0EE53ED717A4BEF8AA247BD032F75 + 1812FA3A644FCD833A3BFA65793300A79A7CCD08FD4EEBC2158572FCA6FC532D + 3A0C391002F97A8308135E051B1FCBE1B070C417DFBEB8796722A1A14E3E6D3C + 6139868843EEF4DA1EC382BFD2A14127A0D9847328E8C23FF57EEF32CB7F7A20 + 06F65DF4A6B38E4EAADB43A6859E46724AFFF9AAB9E73347A1C02B8BCBE215EA + 93EC400B13DE4D5358E0A0CB706C6CC935CA7C8104066F9E81C55F53A1334DF3 + 2FE19B1CDDEF52F6AB729900A6EA6B7725F4BF537DC8124BD12FCF8AAE826E8E + 6C35DB3EBEF0D7B0EC746445EED004ADE24D4E663020D32AD273B46F4E7BFA1C + 6E6A9A152366ECAA15BE911A0D92DE538165405457CE0FBDF888C082523AFB86 + A6546D070F9BEA54FE4CEB33119183A907206113D3205B0EE82470D81BD49253 + F363AEFA109478E653FD3950A896D2B906C5B3B4A45ADC8850CB7B0A220FABF5 + 54C8B9E5A44349B409A57AD85E45417E74D97D2D596CD9E1F3BF24A6246332C3 + 64321409F02C84BA1067AC7FB45344F402A29FFCAD9CEC28DCF49C56B8F4EC63 + 8A7788F4AC2582892F289473919B575AA72FC765865A0C7DA00898AE099163DF + C7D8BC3AAEE07E08C4FB36D8A25728A39C849244F85A95D1359B0494EB786A04 + 986C09D1EECDB9C3F3ACE751C1555366924DB9B5A1044D1DAE16DB41E5A66E1F + 6A9579136363BACE2C1EFF5F55A8FDAC9CC4475E43C363410649F0A20654D4C1 + 915622AD5FBB48C70E09AA97E32392E33E08A5456F86D4036EB14B2FD1D3A67F + 52D5931FF44F8B835852D78AEB4C0F9F78A4553B44E932D104A434BE7B51EE4F + 643F17A66074FAE81411FBAD6A322EE8127484AB55B7DEC19B1A81F312F6BA45 + A01C9E1B06067D2B842754B636F0869B17CBDC1A4454C063F0B4A010C8DE95ED + 7CE8B314C38935086AB9B52AD649E82AB0B2E61A6DFB9420259E19E02F19B959 + 82026DC847AA61654C992540A5502BF6CF88CE08D22E80429764AE298F99E4BE + FE73A4BA4C4E31B883F5E804759770265B37B60B1593016F545CF833A72FC294 + 176ADC3D3F8EB61237B800E6797189C1ED790DF495F93B2B934BA323251E39E5 + 1AF43FE2F671207BB0028316CC85491AC6D5D37E4E3736FE6B0BB45769D9DDF9 + E1A559622DB050AB826DE48B31714A215F002B2564E27A83B6FFE4476520A647 + 625ECC7F00112E22AC3C10AD3EDF1C8860484EBE7EA6417E4375032950310ADE + 91700C0C173DA0E3D277ACAD119D46DDBF8104B80C380DB2FC811CB36873C146 + AC5AF37F127E8951F5CCBFD2876694B17F1FD7B07D6F0224909ED53BB1A338B6 + F80E40372E3744889CCF039923BF56808DB3DB61E8AAE9C1065E12E5E9BF2D0C + E8010A6553E1737A45A70240C566443CD63C61EA74A7EB5027A736C9DB46AAA9 + 4EDDA02B91D1ECC7BCC15DF930BAEF585B591574D1A795393DB119B5FB7A842E + 218A755C497F26F28FA23934C6DBBC940FE7981AE79CF00DC981BDC38000E89A + DFD1D99E489D4DA1A4BA716228E8C5CFF3D8A6497832367C0D02D13F6B1A6301 + F045427A65DF558F4527878B85CA63F06BAD303CD3C32F8DDC91D1B86FF35971 + A2FAF57B9FBCBEFC2B7C712B40E827893F11B8807112A58BBBE054DBBA4C0E93 + 8F1FD760CEF12CED1ACC1F3A0F5059F4D6730EC55486EF677EF3B836EA81C18A + 9FAB77CDCF5A0A031EDD4A37FCCA3D14E00279131EDD981253D080FA53882F09 + 350E7DB7B1487FB2D4BF6BA9DCE16E11D3D931E751233EBA8C0F35E2EC39B891 + DEC387C15518335041C66893B36C3B906ADA15CD8F88C99067285035290EB087 + 923038071845392B07B939BF104547BE0E30C51709BD9AF240BB686DB007A030 + 6FA3215F7C3E9DABC3EB7D4B5C789EDED99160730153E79E635BB5B8AF28D8ED + 093A3D6611EC565FC7781D14B3887FE201995D2F675F3F597EB50A9BB3404871 + 10D931B6DBB34A58583247AD731DD9CAAC7142DADA64898798B7E3B784015777 + C2BBB1BD11B6B8AB327D10181E5E9D08EEEDBAD19A76EF67B089AD3FB787C7E3 + 6702BB51B9D6819335644121BC00CAD5932B081376A7B7CB077A463E3BACEBEF + ED0A3877363A7747676F1837CFE539D9A86204BB717CB363092BE3A6317F2792 + 8283A88DC0D616DB3AD97DCECC794EF8EC0CCE6A6AC71D6CC55E861B59C5016F + 7C47E09E677DE1594E4B3CAC9C1695DCC265D45584118A96D059456A0E226A23 + C40A3723BA1BCA3F2473F1B208CF063BC16FAF9BCADB81E418BB1D84A83CD7A4 + 15752DC74DE2001383B461714E14CA006D0F759E232076A4604DD7ED9BD43C36 + DF3480069ECCF31D5F0CADB0A852D1722FF5079B92A0455AC8B6700BA4B7B99F + 3A216855317502C4A79A185712FB21BF34A37FAFDF59640451600F948FBF2DA4 + F2A28EFAB8C5D153225905E8D1D3D6B6678DEC3D1026443C43F735AB36E74661 + 0FB4E3C51552BB730BF5CEA82ACA519747349D912BB85052D28C36B2487E7E0B + 287ED78CF6CFCD751D4C5624DC40690433BAA19A521105B35137A108981C5D61 + C1D45DC3657CA1CD0FD21B64619203955539C55B6D35FD6C63B0A567463086F3 + 6F3B2063D3251710EC920DFC4B17F4A1E8AD80DCABD55F8630FE5EBC80BFB44A + 8803242FADCF41C83594C027A690CEAAACF2F9C66140706EB5AA340CF6BED080 + FAE33D5A34F2E27C1337EC9C2EE942145F41A39AB871FC6D5A9ECDA765C25064 + 9864BF68BACE2A3C224C7BA23A2CEA26A6E0B27F9DFAF25A9396BFCED0337603 + BEE2F121CF61512330D3C74F80D5F5DD3E66F77EFD0BE20CA59E806910CC2BD0 + EF2E7612C1E91BD928492D9EF9FEFE59F251BAF4B8C1902AAAFC5B96D5FC6814 + 26E221B12CF20DDBE7DC22BD919563961A1BC68939ABEA7B365916789F7E9F5D + E7ECD22E99212568546E1A321FBA29AC89BEC076C9DCB937DE55F317FC2E11D1 + 5D497FA86D69073032D18FB553588B3070E543D91E82FC34857E5067F9363494 + C175161E060C3C30FC6FD85FDFB9D3DCCD0392B10DD584528A46A7310A9D482A + EA44701653FEEE8A1114E82E3B96103D00D59AA44470E9B68A9B3703BE92EEA0 + CAAC9E79BFEFEA4572D3CD62FFB896132656A75F132B52E5C7D28D376AEFD606 + 048C372F3C7A420CF263D995FF671AE5212AE6E1082F7A130A3B090D6D41B971 + A70E2E70F0585187CDF3738DE5029E6B785F6FA63BBC0ECA7534B94662506A68 + A69BF0294D1F56533CBD2ABFABFC45DD30CFC65585BA9BE092D87328F398EFD4 + BA0FE2FEF791 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + /Arial-BoldMT findfont /Encoding get + dup 32 /space put + dup 33 /exclam put + dup 34 /quotedbl put + dup 35 /numbersign put + dup 36 /dollar put + dup 37 /percent put + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 43 /plus put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 59 /semicolon put + dup 60 /less put + dup 61 /equal put + dup 62 /greater put + dup 63 /question put + dup 64 /at put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 69 /E put + dup 70 /F put + dup 71 /G put + dup 72 /H put + dup 73 /I put + dup 74 /J put + dup 75 /K put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 81 /Q put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 86 /V put + dup 87 /W put + dup 88 /X put + dup 89 /Y put + dup 90 /Z put + dup 91 /bracketleft put + dup 92 /backslash put + dup 93 /bracketright put + dup 94 /asciicircum put + dup 95 /underscore put + dup 96 /quoteleft put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + dup 122 /z put + dup 123 /braceleft put + dup 124 /bar put + dup 125 /braceright put + dup 126 /asciitilde put + dup 161 /exclamdown put + dup 162 /cent put + dup 163 /sterling put + dup 164 /fraction put + dup 165 /yen put + dup 166 /florin put + dup 167 /section put + dup 168 /currency put + dup 169 /quotesingle put + dup 170 /quotedblleft put + dup 171 /guillemotleft put + dup 172 /guilsinglleft put + dup 173 /guilsinglright put + dup 174 /fi put + dup 175 /fl put + dup 177 /endash put + dup 178 /dagger put + dup 179 /daggerdbl put + dup 180 /periodcentered put + dup 182 /paragraph put + dup 183 /bullet put + dup 184 /quotesinglbase put + dup 185 /quotedblbase put + dup 186 /quotedblright put + dup 187 /guillemotright put + dup 188 /ellipsis put + dup 189 /perthousand put + dup 191 /questiondown put + dup 193 /grave put + dup 194 /acute put + dup 195 /circumflex put + dup 196 /tilde put + dup 197 /macron put + dup 198 /breve put + dup 199 /dotaccent put + dup 200 /dieresis put + dup 202 /ring put + dup 203 /cedilla put + dup 205 /hungarumlaut put + dup 206 /ogonek put + dup 207 /caron put + dup 208 /emdash put + dup 225 /AE put + dup 227 /ordfeminine put + dup 232 /Lslash put + dup 233 /Oslash put + dup 234 /OE put + dup 235 /ordmasculine put + dup 241 /ae put + dup 245 /dotlessi put + dup 248 /lslash put + dup 249 /oslash put + dup 250 /oe put + dup 251 /germandbls put + dup 0 /onesuperior put + dup 127 /.notdef put + pop + end + %%EndResource + + userdict /pdf_svglb get setglobal + end + [/N10/Arial-BoldMT 1 TZG + userdict begin + userdict /pdf_svglb currentglobal put true setglobal + %%BeginResource: font ArialMT + ct_CffDict begin + %!FontType1 + 16 dict begin + /FontInfo 15 dict dup begin + /Notice (Copyright (c) 1991, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Arial is a trademark of The Monotype Corporation, registered in the US Patent and Trademark Office and elsewhere.) def + /version (001.001) def + /FullName (Arial MT) def + /FamilyName (Arial MT) def + /Weight (Regular) def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def + end def + /FontName /ArialMT def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 0 /.notdef put + def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0 ] def + /FontBBox { -222 -250 1006 922 } def + /XUID [6 44339 ] def + /StrokeWidth 0 def + currentdict end + currentfile eexec A0B00ED5187D9C0F1ECDF51878C3AA5CAA3EC70E14AF46 + F38884AB0522111E1FD6B5E292C7A7C85F79C8CF269C29C6F79E84099DF3FE97 + 919C760621BE9B4756D5ECC123E0FEBC7A1BC9CFDCE3B7AB1B118837C4B97C17 + A4A2D65552C37CAAD683D3DABCC09A36FF0DBDB89E43724FD10F7C1BE056E775 + 101008AD51C29014E0B4AFF4CDE74E1CA5A64E39C83FCEE568A997B7D0D888FB + 5AE51C74D8CBBBF61463B3A1C80032F9E9B615124B88BD716363A24D9B750718 + 4290A3206B935F4107372023D4CF18300B61A6F017E700015589C6D8BC7BED9D + C6B3584EE181363F824D6F1E3CF3DF48A631A54AC4E8C81536C1461454CB4B63 + CBA14A6242F261EBAA3F7955E7C1E758A77E93DB07F4A86D1667FD99BA1B965D + 92FFB04F46A8F81AA8F43A6205BDEBF751C54A5394DF443719D16B0AFBFAF01B + C9203F81FDE5B931E192C430769AD893C30126CA27135878D49BFA89AC71C990 + D2A4E8825524271BDF10C6FB049A8B0E7475BED9B44CD4C2B8104452ACF12AA9 + AC8AFE331F9AF9B0A708BBF3F45200395732639C0F92AB91274625421A93F511 + 6771881AE8715C58B854B88976701B5385AFE60F40E1B56702BA711ABED94473 + B72503CDC76C7C34E0A2298FE19357CA17DF344A592ED134D171E58899FCA9D0 + 62653DAAEFF8D71C19F6D3958220794375F07D635FAC19B5C16DE6D9F30A648B + 9FD57832B6804A07E3B1C5D6B07F59AC95E2FCBE0E02CAD0960ED6C98F70D7F1 + BF7885DD5F0B40BAD91171728FADDFD616EE8A88FC18B5C8F16804C16D7F6408 + CA476477EA76AEA7911801F204F4E0C0313B1FF1EBC254D7323C0DC28797B201 + 5A904335690D638EC2C45723DA891C15965F7E459C7707B5CA2F5FD3AB3E68A0 + 313986EF4BA1E06DA9EF1C961944F5EAD42BF3F30C93B800BD3829FA6254F143 + 6E9FAE87431D328C947B5D4518A07B8BDFCD64BE3F120FB418101229783A489E + 248775C96CCB00A5E65470D0FCBAF0FAE402EBD451D060534D8C0BDBEBB5FCA1 + D2EC726465F6E37F50D455AD5A00EF50DB61B78CD04FAB58973478F3D9301CBF + 6EA03071660EAD7CD6BAD616C77689D560133648C8F3CC438400A2F69C672330 + F046654B0C61443F393DC0B4F138C0051B027383B50F624D1B597BD5B6FA0F3A + 255EA0200400F6EA8C15B2BBA215A6DF7152EB6E1DBA4ACCD4BCE3511207E8DD + 13212B8B2A33C259F9AE30A45B338BACC981BE53D6AEC541E6DE02A15260EDAF + CAE20D543A7277E81EFB454532425CC074D08E1E3E066F4B62AFF15EF8F59202 + EEA5CAF47E4C5F55C16C0F6BACA0E175A659043E50A65B8A4CAACB535CA5BF25 + 824F7EBB192DEBCF59F80B8E8FA78634C7E0C86BAE5385477AE8BB9CF7BADFB3 + 05296420051EA5FBB7780324620366F20EE93A46EC5A65047F69BE9E82953C57 + 5C363FAB8A11C647F86C8FAA99FB3C21E2E9B9311A7F61CA453F919912FC714D + B64BF3D52D3FD48D2BF9FE81EDDC7B93896BCD68C3DA1CAA36D446DE08F14F24 + 881212362D63355AC0A4A4C1DE86F48D18286C2EBC5325387915D77D6586E10F + 9F7332A871D5F876C17998EFD998EE49A21B141B60E33C515464787589D34945 + FC6D3C0697E124CB796B6570FD477D0921D4B5C20DA297A3A5990F39ACAC22CD + 7C0A2E2F6013054D2306398087113AE376AF6BF19822B988FD14AC9F0D11A0E4 + 5B6FA61BC823D97A1BD3B4EAD9CA98A68A8A82A95731ECD22DB5E62890A468C0 + 33E806EA900AA2683E537994FA1CBB14711CD8934550F385593F10E49455D48B + C883E2923D91AFACD479F37E4502A252C407B0A3E0E91F083ED08D5B9EA01C30 + 9B2A91B3EB2B2A9BE3BDEC6C2F1611F5FE5B6C5D6F63E1007ADC1EC081577BEF + 25703376B5CB3EF7AE0B682521326B0602AFC8EDD3F9D29B6681B97F2F6D02C1 + D6B9951EEA1CD4ECE1D1B9030D1E8E498ABF13905DA3A3EE416995456B39301F + 1A268AED8DFC91A4941FA2E15A40865DCE35E106B036811366F5A809D7BBADF2 + D3BE3E66576E1CD5F49F26F48231FB265825D1883F5529372B539765B684408B + D9827D62A85A3223BE93705ADD0EBE9B209C4198FC396CEA26F3C39EEBDFD571 + 696FC4FF8A1046721B1F5A2459772AD1B1D73E8815DF6075C56D6CB4821496E0 + 6177B9BCB8D9DD8141264C9351D1CB9C66F3CA360C73EBC99CF256AB34832665 + 418ED547CF8AF9967445629E3F8812D72C9A1367AF724B29503EBD2709A849A7 + 73B145ED245AF6F558EF3C3DD58A79841D2D8072829B4354B4FB9B92511C1DDE + 4419ABE724FE38922CB46D755965EAF364546A8113725EA3F655A17D23B86DBA + 967D6093A61D81E7D891F1FFCE8555AD2E572ABC392622947EEF2B19F37EE7BA + AA23C81AA8366982D80AF6F8E800DE29C5E9E9F27EA194D5DD0B05448BEB860A + 0F1F0A6B21B920C11019FCD3C7AB2A9131802E49A5C0D83D24282D2893A4D414 + 25607C2775199F43509E85DEBD1940B6BB515F1CAE035F62783B8CE47BD02AFB + 20A5F22CC3A1FECBCCF75E71B22DDCB8DDC1E6BAA1149EFB3643C90574D5854D + F042CFA4C6AD811BFBF1D9B3F28CF5CA542033379C85879D32122C8A647978B5 + 196B70CF7AD5F4986720107860406624DF6DEC7EF00F683504CAD094C1D9B02D + B0F85AB73DC47B4E598324D3D87348A08FE851CB80183CAFC75DA9F097F437F0 + 4B201BE3D266A020292DB51B30FB6789E6381981D1E4F90CAF8B0F2DFC6D169B + 30E18BE97EF91B75E09904BE317F7D6F881EDC478742EEC2B480E9E8A7DDD194 + 42B4ACBF73B56BF0719F73E4E0C4FC0FE55777E7DC2FB7C28E043BFA7D93D42B + D399400549C35FD4A97B36275903BD7F0B87BA7171186DF4E052114E06CEB9BC + 507FCA94AFD74BF077E0A0926A1ED0C76395A9EC95964026A4A3D1201551B0A4 + 505DAE3B203E6597D3CABFE5F0DA7173630CCB05EBAD3994A072DFC27BA6E93C + 965ADCEF109D4AC3AAC43F493750D1A3AB840159EAC69422A70E17F078931605 + A65F6D264A140DF4B0466E98FD9A620B48E9AE7AD462E8C6DAD19A6074CF929A + 5FC78056D249B2E2A4C64E3E378047787E25C8E3CB799831021990736A979469 + 291E01D76778C4854DAE4785D7554DD5E5159F2C95BF76B752DA815B8E123689 + C77DB25BF0A6F0DE18F8CD9E3E585C5F5A806ABDB3B1653BEEA0D7E0EFF2348A + 8AA54DB0B29E5A3FE8AE348EE04F1EAAA7A7CA16A43E7B6D4B71312A9BF29191 + 4C2B3DC2BBE1D3B5ADC998199239FE7639C1345A4BD8A6366436580CC30C0D05 + 84914262FC7E798A62CF2FEF968D05FD4C6863D9AFEF5AE41D12FDC272C50695 + E9AACE78A61FB7017430186DDFE3D535471936C2FB4C7AA03CA3C7D70CA15526 + 0F851513E08FB11A3A1AB04280E4C22F2F06434DC59CA70B7E9EA443668902F7 + 70058CAC92A2967EE581143887BD5165638B47B6F0A31F01647C28F56263EB6B + 70CBF3BC9C48DFDDD9D81BD7D323D3B1086E35B86A8D111B3B5A656119239CC0 + C106D49294DFA01E1D32745FC88F8A17E614A32164B891EB787F4D681E74A3A8 + 4EDAC7D8D6BBE9A84FC9F7FAB3D7E7211E4C57F9CFEF7C5C3D292971D4435199 + 2FB5C396D93A20FC01C54E903A7F0809F44FD39D74F194F06D5B2F6112181321 + 59BC06420509DCFC2AA4C7C0E2F7A01E47C4AF9D83474EC7C326ED7D45F67550 + 283B1DD83F682155C7579025A47218D6393B6E10F1108902553B1D9E4679927F + E6183F4673276A1371895857A61AED50ACD7250CD94F01E9728F26CDADAFA751 + D4F63803ED04708EB64E3576196065311C3CEFD7C823B8D03A71F983B2F61182 + 2D67217F51E80DEBFF0ACD0B71B7E4C5AF129DC11E18597B3930B67358181789 + 1ED9A4BA4304DE8C02D520423CEA3FEFACCCD6C51997E2E201F6E658EDAD7BD4 + 2E3AA2A040D205F5FFE0AACEC3CE9E35304F2FB46CFF000E19D908FC360AB518 + A6EAE095E3A510D06488F5C3356DE58C20C5383125A8B70F64CBD689F9CDEC93 + 57BA59AC019828F415225B57BC706072B26C15ABF21195F6E812D1BB55761502 + 878F7DB41EAEE10B72FD42BE5847344D108DB5FA5C74F8F92AB617C50FA6EA2F + 4DFB003C241E522E01FF393572F2024F506C99C4601195958FB17F6C2A7F0754 + FA9DEEA8466C67ED10B6B49826C6F417C402D485CFB262847B307A9481209A62 + 554927F8860664038D73E298BF0A865EF16075A64633F2E2D5F7604C4E4A1535 + 6CFCFE727A89C10F122EFD87D157177065A8676D9E668ABFAA25537BD5319418 + F6C9C826082D3277DDAEA8DA0C332AEE80E03DAB6B1F7CEA226830BB7EBFB709 + 832560C9174EA571FF354742FE0AEBCEDFE381899B2BA05F61C0D8ABCDFE3B8D + 274A6A0D49520EF4EB02C62FC5160AEA8BD284445238EDF8A057BC091B85F418 + 5E979392F00A218EDDE76F97E2839B17E7B4013F130682AAACBE2F9218A5A93A + 3CFC057F5AF071F75B82206F94FA17F54E6F71BFD578EE68801F1567E97C9E8C + 4B1A22889D06C7FA4668981F8D70729AC4001D4636228A46BED87EDC73D5AEED + DA1BEA33F6093848FD2A6AD0F6FAD9A6DDC132FAA99398D22819CF29D5C2AEF2 + 9349373FF31A56942922C297F03C923E52FCCF4FC49B3AD1D9B05FC03F77D26B + C266952BEE8927F257BB29BE33E2DC8D37293F348EB776F1595C2C705AFBD1D5 + 981A9F80BA14BA7FE2AE63F9629300797CCB7BBABD8ABACCAFEFB4FA0C3F6834 + B0605AC8992CEB28DD64840FE35F8B82C3F28DCA7F59E7BC15D3CB752DB98E70 + 5DFC14336FBD98825E25422E29CF9A454B39749D7966DABE2A62B10E651FE4AF + 1BD2D7967C93CB7551E099927CB0F327B98204F5CC896C8F54DFF84E54C316C4 + E7E80C35DE22DB201CDA5CC2DCED211BD2C0301F44CA54DE07AD73CD4605835A + B026D2E53F6518551C180469A83D5F7131E367452306C1D71E357DBFA8BA9329 + FA86682E0A5A85A91BA04972CA5138ABA88959B004BB9377484493051DD68056 + 1452C5D202A15A433188F9DF70526AD0B5305C14812CF2481D22CFAF89E357C0 + 97541CCE109C468AE99ACEC83FC85D4184D7333A4EC3ED05AB4A4A313F8DCD85 + BAC1BB0E4DFA9CB36DCE88099A0FAEC665138EDD86436191BEBF4F67D4492865 + CE2E446C3CD9634A474E7B53EE756C93B3EE1EAF95BB66DD465D52D853FD2434 + 1760250C3070601BB35E4485ABCFCA9E9D257334889DD0909C9A86399A41D623 + 20EF0320886BFC2F9535C231851CA6F445FFB4449DBA10A78E6C77AA45C5A880 + 3F46952BC328B80D38BC1EBF615EF7C603C8734ABF624DF726B6B6FB281D7DE7 + 5993A64E15B7BED306D4D293D5A7DC84148D14A918AE73856C7685C238C2ADB7 + 6A4FCBC74DE4837DBD244DBBD722D09A253FBE3757AF79D4262582FDA40E4EC3 + 4B1DEDA6797C15AC457349203A28871D17D447280DA7E811D24033D38BC3253C + 1B213EC5DD2FC811A5DABFF75F282486B192093BEF15FA2E510C15DBB9681C92 + F8CD64F1B41901559285B089B87EAD0451FFEB200DD126A264597DB8550CF94B + FBBB78899EC837CB7C2E381BF444B4C1E2AA2CB19836726DB0E745C0A3029521 + 602D5EA7BD26F33B2BEE4A255F0D301A372724214741FA66503A801CB88C6BB0 + 5C6F22BFE4E8F6FD3F37927AF7C71F9EB5F42BCFE1C26AF0A40E16B9238E65A9 + FC4812BEF803C8D42ED81D5F9E6F130267D4516DCB084412E72E2E4EA3A4FDAD + AB6067B4057A35B7E507ABCBE265581A2E60D930EAB40763A9131FE72CD14C15 + 1AFDDE4C0154D812E7222A9F587CA1BFAF7E70F05493DB925A8ED8D97D07A30E + 83633F45923213D47DB0D546A818873AF1DD0FEBEEFC2F4BA27C2AA140954678 + 7A3DE247426E23CB0B5C0C2A535D1378AC6C153F7934542F3F0803AAB9FE206F + 67EA2A77C782C72F0214A3EBA8B4776214BBF5537EFAF0C8864B6F7847BC07E2 + 538774ACD5727D517C77F910035857B3E6869D14F81216E35C615CB010CE1692 + 79C7F8626498BD854DE0E5E13D50B09C16ABBD96D3A817E53CD541454BD23797 + 8AB95BDAD2D0CF607BED989668A3404976D194DE3DBE045292061EF685560868 + 54B4F11CCB21489E7A2DD8C120E70A7C6EAC263B1B89401981D13BE1FE2D3AEA + 7572935DA23FF1FCE073689EDABCE1144C31B4521811C56D0B787551AA6D87CF + DC7B1C6936851BBB0CE2923E8CC97C30E3DB86F0588DB1CBD9751E3806669089 + DB0F32070C9DD2310E54313113D3D3AA330A99B4893D8FF077662960CA4AEB8D + 6FB4CEDF2ED2926597D155A7BEC8EA3011E735D9A7B17EBADB27C09E34E5909C + CCDFE5B74556577A1F31073B9BE6876F397A6B51C415565F6CF4F8477876A909 + 7AF23CE9283F99924A00670E377FC6CC2C5A2EABC51687C0A0E3E7833E270520 + CAAFBE18BF863B4B950F6916D6CA8E6454EA76C04931C7BC883C0070AFA0DA33 + B3DD70DE68114E8A1C6E164D227A3F8F317B73116043A0C145025CC8A322A637 + 583C084D10C5F154EC29D15439DD8F436A2D4C56D56D147B851BF96A3F0535F4 + C0B865CFF88DFE0DECFC6AC9A30F51E6768BD8475E76DDA2D8FD48C5102706CC + 98CB773088B05F0492F2F82FB213745B88D87151AB317085D0444492421F27C3 + C01B3C1901BF86E719ECBAC5525F9B0FA862F3A10E549B9F07D9F3B43AC51BE2 + 9E107E737D3188A91CF57D7C739583835073A7082E94336EA42BADB20918A370 + 2E5E6F121C11BF956C3C23F1F1F9DFED5F187DAFB3528C6936BCE11AF4793087 + 763B4F2F4A81592EC7074D2ED1BB0724D82629CA7E054BB2C1EBA8B49486A11A + F8C92EF89C735AD88242C3165CF44EC64ABCFE378C1EFA1F11E979C3D09DE332 + 1DEC2A8C1CD30E12D4A960CD33C72ABA46BE1BA9AB05F1746A1F707A746F5AC9 + 023910335FFE88A5F9B9768A9673845D30C201A6CA3C2E65FC911EFAE8E54BCE + F877A8236A2835CD2789A31EA9F7F422FD785A3503AD0EFF2B58105FD86CA536 + 938DFE5549BB115FF1170E31EFBA8E6ADA58730AE2F3313913DEE77E01D97EA7 + 71C5FEADD8DCED4F881DCC1A702BAD8D36A0A26C1EDBC4F00F0BB21BA91A4090 + 8BA77A7CD5BBF1D25BC0416B5DE1456EA3188DE97FE0EC0797119E9C8E81FCB7 + B9B137E9E4DB829A47A4FDEF03D93F5F45197F46B2E7C04ABFD55C960C2F3BB8 + 7A9EBAF2BCCA67D6D78DC86FC44F55730490DB4C00EA25CE4D4A5AC4AA45B973 + 10D3D1B7CF84E5C3877DB63EB307E3AC2FCB62FA9CCE135A5809C7D77B20983F + E2471999B318EA15D8A33389A86B84EE277BED89971F32588795B64767D20621 + BEB1C7F003F9AB28D396C2CEA1B668C570A90CB21F5E69F440046D2E255E8DD8 + D0A30521005616262259349A174E88B8CF8468B94876DE0CDC2C2AF592FBE1FE + E94912C87E4D2EC34A10700BBE528FC38675766FE8DDBEE5355D2163156B50FA + 2B74CBD15D3950D36521F6E971510A5A6DEA8D50D0F4B3A9124BA2CFBB81164C + 351E911EDE208416757BD186DED69B24C81095A7CB7BF185E5B69B842CE11CF7 + D80E92CA194E46162A5EE583A61C212475A0F9B70F5A8FED079DFEEF281609E5 + E7A953EF08DCF8117F9872E392395012EA536B8EFBA94DD04D94C1EF7714DF01 + 482BC1D9022406CDFDD713F8A4596AE80CB3F211DC2942FD033401D236F8D433 + B37A27FAF8362C22A69A558BCB6F6DEFC0F853D379ABC4706971E169EA482ADD + 2BB3F2E91972C87BEF275FD07735815E0589FA5C02F2A51B8EBD6DC6333738CD + 1D5C910A279E9AEDA7496AFC29E36F678C72DE40EA33F2750A36846A2B0D2A0C + 961D48289B981A2EAEA7CBF3B215724FFBFC720E949717ADA630CFCC704B1307 + C652D4ACD8E662380F9C2E11088BFE6EC6ADAD402464BB35E629B05169A78927 + 11704A570B24357C0E267C1700BF6DC76A2BBCC6F8181F710652DF2A85BEF960 + 241256325284F09A457DCB98A6E8D273952966804BCC023A216EDECAE681A522 + 7314668D3B38C0FCDC11EB7CD50781790509BD9C0706810CBA7C7F4F0D0AC364 + B6732C64FA47A65FC5DA6DC109C18F4F52E02DEC24E434D9F6BD9A53711A4042 + 6483BA0C7C2B8A85CB30D4F1C5F0761F61CD0A99890D7DAA6C97EF326BCDC88C + 0A9F6C6C2D57950CB482D4C4E7E3503FAAF70850EAF284D73A4D7CA5440D625D + C96AB5634CFCC923CFACA343C0A3A361756D55EEA1FA1E9458DDF965C6C0721E + 92C5A066FE13F9F87EA9B3AC013BE4D5E85D7948F182C1C09CCD3C7945035BC0 + AB8BD07B2F0CCBEC6EC156340F12478E47F28766A3667960BACEC484E745663E + 774177E99D32F9518A31C0B88281D6270BC5DF83CC23D686C25C6796FBD4E617 + DB97D6F572BF4E91E1738AE1F7A7B0FCCC4EA07E5587B99836B6BD04949A5112 + 9AEBAF7D89259CFF3E03DA661B3B1F82BE911DF21E45A4C3002E15737170F1E4 + 323B0B7A025F0987FCD7F6A7C9EFCED4D09DDB60F10FEEACFBB32B898BDC4413 + 0329D6D1260176B9E2AD358DF23C526DBDFB27F6F2FC81E3B4FF796D3D1856B7 + 25D2A48B2F82BC1EFAFC038823852E753ADC3614BDFC4B5240FD8F47C1DCFFE7 + DF66DEF58D9E1633E57DEE8C7F8BBC9BE0884EFAE93894B8709D88161CC43132 + 695A72320B57344199C502DDA81A446D1320DC4B62B7F6D7D7CD43E94005DD7C + 88F0FA0E339869EAB6F0859627F61F5BEDA3795059388222DB4FAB385D681BE2 + 926000A8009A42A1252104E6FF7F1490259419F89A47233D86E083A5AB852AA1 + D3555D05F4B6B52C28479B91CDB53323517B6B40458AC4A3F567DF142B654D14 + CAD1A682439D29908E29EBC65889A472E9B15E6468E9ADE97CC6FE90945702A4 + 262B8E6BD70D0AB853AE8E57E302049A02139C82454024093F9724685C8B8F94 + 34E23495444F3B8D195B1BEE6025286CD66DD297FE7C5350BB3F4AC0A23D9B6B + CF0D4A411C7D018291150EB9AA5351030FB716D1E0FA5ABF14A1CE6D98AE9F03 + BDC1497FDB995F1BD7482673B12BF732709B22B1EEB113A389AF650BA6CE57D9 + 9CC63BB5A3E8D0A06480ECF7C9A87436C239219C246E42A7B5AEAF43DA8042F5 + AE62704E332B12A5344D50F672099E4543F5CE715227B347D3EB34F01CEB1FC7 + C2C1E151B787739775647A7F27A6DB802AB28F2A83472D8EEF7A74BE517C61E4 + E6BFC3FC8E1022B63623FD987629C10A4B0E8A8563F2E6CDB34249F2002CCF4A + 2AAD7677D6298DA001C00CC59A45CA32D7373D3146737A5DD6D9C3FB40CD16D2 + 37A5F759FC904936856CE916AFBFC3099D8D8CB48891002B222110E169D32E61 + 53442A14A1AD51280B918029B9699AAFCC01B0821781A23CD5A5159703A2C2EF + B9BA7DC8FFDEBB091A0703426B8B37C37156BEED1B67526995BB659CC9757171 + 502C27380D4FF5D3B84D9B50DA2E7DAC00A9B4F737E2F0259D3678DD3790DD91 + 3A59CF899F89C68F4A4846DBE7D1F5BE4D544C4796B086E3D93D199D6ECDC003 + ADED84D3F8973364BD288B8A662395450062893C1237F6E9CB438E1F9AD54C48 + 4DFB2C86D923E7D33B6E42CEF8A55F0A67238927D8548E8F9D27758B8D1E72ED + 9AEA686369CDA9CBAA3FADD8BC374A462D955E641DC537E2D581D641F19062BE + 34D14F7D120ACE457D58D888874E84A44E1706AFD76AEA9C956BBCDCD959837B + 7292ACE14D63BA658C049255AAF1191A797FB9559C473521FE3E8F7A6E5C9ABF + B539268C27554413C9F1B7B822020C9949732F6918EDAC9ADEDB11E049C4B239 + 3672F95D00D6BAEF22EE08737D32820D7CDF18EE825159577F65B5ED2377A68F + 2FD871D4407D212187F5E244239C35DBEE6894ADAEAB8F5CEA9FFE0F2F2AF3EA + 9F99F097AC38F210D9EA5C66700058C33E5087E2003E77E2D3E7BE37E9E7B0CD + 2A9295EFEDE8A0D1154196ABA5CAA8A5D65A1C0205FF05237F58C097B78A9E7D + AE71257606438617BBC922D7808CC73897F6605B39EFC269E674F6766C52F061 + E8C14DDF8E6F1FBAB411F50C4E9E1CB90541403BED5A569238A62F1B38E4FEB1 + B9D4C82FF075F64108679F06DE974C2B98154F8E71CBC4445AF6B9D43E715C41 + A424477DC3BE7900018EBB602045D605E9EDBCF0457F45649D869489A7B7D8EF + D0B5B00E0EB522FD0C67453089839D8601625F03E646CDA3E9D7B03473597555 + 5D6989548EFAB9D2AF83E2F8C26CDE5A9DD7FEDDBA3C1865444027ACCB3AF41E + 20A9ADD814E6C60315716B618E75364EC70CD99FAA93278AE712C5EFC1DFBE96 + 579144AED2BABBC932665D840B48B9FD71B263A1D86EE2A08E6DCCDB791720C7 + A83BB28A3629DB628F623EAD1E8910FA6B905E1B9639E2EE4812B5AE9C42AB1F + 9596508320EA819B33CFA017F8636707C24106DBC4F3F7E56D0F726B455CF905 + 6117383B6994F9B08AB0811FF256390717726F0EF0B97D98C514234722E87B33 + 0957ADB0E40AB53C301F363AB2006663E8511CB09B4791D5254A8B42C01D4653 + CE459F2C8F44410A3975126E2F12A759CD253881D9D1CF91A1A62B056D84069E + FDA1A4B9D76B2019880B1C2C5AE9DACDED2FCA522B507425C033C39D34E914F6 + DC4CBACBA8069FC4917AA791DC56A9CB90080222064CDB87CD26E89B79BBD375 + 67FF6BFE2CD60F20A808C679C130B66FA17B31E6C3F41EC28BD1C4C2A96E944A + 05662279988A7F41E1AFAD375138CEF9288697CC55BF125F7AF57B6843C690E3 + 5FC7F7B2802DE0260498F7D723923EA12A5DBDE2BD757FF33E2EA8BAA974E53C + 890A9E1C29E85484D7176A63C038ED69663F2EDE72E54F0C03FC546D8424812B + E40EF5DB62C7D50827671FBBCF27F0A9AADB8D15E246ACEFE25BB49430C9C37E + 415BE72ED38AE50B22B5C9634ED88ABFB6438DD6B13C74BD7CB9A6DDD234BA6A + D281AA1A5B567CACE5738227295BFE7C18C868DB982BDB0B4D033AD60FE20C6D + EB9353877904F0C8B4D951DEBFD96DC897C1084418AA332A063017016766260A + 4F48298C2BD39257D40E8F75FD3507EA809E4805939A59E9922CB15B2EF0ADBF + 5BA0FFA96C67DB2220B5A59AB03F3FE3A365116746798892CA7285F0839C7FF0 + E03C450FC11C30932C007E12A6B6902B8834A9C067B6EC5531CB137371C533F3 + 75B17E3CC307D346944F80A8DA6F3C6C2AEA295A013EE084E7B1C42D158B7EBB + 6B5E30B06C379EC7F66B8CB9A50DD34A8233E1CE18471A8CF7EEC646D3E378A4 + 453D932CF50B7E576A005772596B25B11F78B4BB89973CD55C40E19E2DA99135 + 1CC77D7B2449FC7339466DAAFF480C5269E55A16F5A71BC41F282F466276E884 + 9332EB5B86E2D96F11AF1E5A5AAF521EA203062BDD877415DC357896D5294897 + E1EED1CB0EF2F3E52E6AA7AC396662F4E7DD2AE83A740C961A322EE11846040C + 81AFB289A4D7F422222847A164DB13BAA768AB50FD177936FCFD117BFC5EE961 + 4EA21017301254C78CE6D18B985C463DF43044C2388D21E4EC51BD489DC170D6 + B712359A6735B19093A25AFA743FF0D1A88591BB2D5876DE9055C646F75A1510 + 198B21767C67A655C967093731CE31424AC8C63C4E3654BCDCB90F2A2DB9828A + 91A97EE0C13C1E3FFEEFDA52C4F2C326552EB93F2047CA1345F1F139BD9A9649 + 81FE4F0BC006CDE8F3EAEB3C5E2AA537F2F9A770ECF05001D22EB192C5E83AE4 + E6E2757B1675438372CBD0BF4BA3680CFE9387E834AE7F6741089D89858DE31E + 57D0AF4113157CE1B79CE5FC3880959B3179D488345DBFA33ABCDD3213BC388F + 3FFF9CA54083A0A47F37D5CF1EF48F9AF64AA904011A0DC5580D9E5F9D02B2CA + 61F9A74805FF7EEA16A5ED0A1213752AFAA894F5E750115B448EC2530ED5DE57 + FEC6F6AE773195F5E907CE9918E0AA6602CF974CADDE726C4B4EE2A05549F168 + 76C0EB34D633F0C51F6D21D34BA56706775BE1023A8889CA73E28812E1A8D5A9 + FEE81C9DC165557ECCA94DF7CE945B3CD24CB0497137D3297C635AE9305D2CA6 + B705F070A52D127A1B1862B72E8C2815CBF23EC80CADF7239596A5F2012E33F7 + C87B95531D574F525555F4FE8EE0662FBA341DABF23EB24F8026D327E039DA44 + 89362D91C2D138E6D768B49A4F8B79F56641DF6F16562FD6416459DE3BDAF053 + 714745C7E9CA273D57BDC647E8D36FD750D1871CE0DAEA9454485E3AA1F981E8 + 0791A6FEB2AA25AEEF544B7B351FDD2CF8CD64571A79BC199A288574D7132B8E + F24DF197828B625081CE072AF9001AE81DDDF994F369DD52E7250E8F42EA55C5 + CD0AFD5572BE4FECCE06AFA0A48D70A929838530CAEB5F6179B37B9FF84958AC + D0E615668A0832A26CF95C53FAD456BCC0AB2C330024D8B85D249D2CE6FF67AE + 39DB4B95C1AE20BB730C9F268892B0497C8D353EEBBCDA5B695E449B7A5D164A + 9BE1319BD377E4097BDDF21830C18489CADE6BABF640CDE853082CBF0A3BF931 + 143422991DFA2D7F670B83BF78730712FFDFD4CA4112CC6934284652D8C1DC0E + 51022CD9F1BE46CE700D458E5B1BB0917D871EB8A27256897E042C91B6FC470B + D41D75F955F6456D55FFF7962D601EAF6E066A7781381208F61E31853317F7EF + B638C3BBFABCE1C8C68944C36DB2DD375B038E0B5F10091FAA0F185884C238A7 + F983EB48CCE8CE08DE7BA22C8D670EECB5402F3B335642B92232BCA7437E45F8 + CFF3082A5D0DAFAF3D06A3B05DF217CC131EFB7EFCAD55185E1A26C2FE2A30CB + BD1B783BFA2FD5D3C003B30DF8F678BF31600E19DE6A824EDB7B0437603F23E7 + B68003A221E125CEB715E67E6FD896E1B835D43426E69B3978AF9FE9B0B32966 + 8C27EF77BCDC956AC40F9B3832306CE237E440D796968821AE2DC60B271F8ED2 + 5F09BDB5DF2BFCA8654EC28FFAEF28725F2933A068D2ACBC1B217FE6D46D700C + 208FD63C717282D152EF5BCE49F2B1A99D436A84B502AD48B931CC9D13F23483 + 0429A536EB8E2145B96736D9A102D65A5F3E73D048B2CE6DE41D566116785D90 + A4FBCD0D377F6DEC7EDB4047D850FA8AE349C1342E39FB3E9E21EBB3DB3906FC + 0FA3411F6175CA8B6DBC99123F2F94002E1D20B98FBA8ADB9C8FAFF99FC67093 + 867FE1F1D699EAA27A3E90E6B8EBB4A5948E6EF426CCA1E9F9CE276E73842161 + 14E6268EC487A6CA0580BF4550C7C3DDC81700DBB4C58A8303CC76E5DBE3EDB8 + 7F80C22C857D60FB0A723374EB7DFEA1F4A987F14757EC1870719701219D9F92 + F01AAF8E0F5AB1E245361D235AC7122C58F66BF57D401CE9A17BB98A994178EF + A25126EC3DB7CFC26AC8942877FE586B566CCC61C07EBD44CECE694D36E7287F + A9B5B022DFFB7C1B56388FD43D2AE2D0A6630D28A4049761BCFE117FF7B55EC6 + 47606DB758AF1FA50AA3FD5C7D1C766BD88CBDFCEF0D497D4C0DC0F6F2860547 + 35A2D4F79C65D5B8E43B9CA952622682ABD20BFB2BDD04D89004CB1BBFAE89C9 + D373477ED7CC7C6484137B77EC745A34364F88D9A0C53C1DDA908B50DBE2AD6C + E1CD8EC1A8BE3AA9FF0B2DD245D8FC50868989D93B05FF30D8825953EF79548A + 89578D7BC51D3F8623987885AD56C4076F35D10DC10EB7369769C5E9D8EFC993 + 644D5863BE900DBA3886682226407E4BD2B3CBB3F0BE8A827555C7CCBE07807E + 81A5235F10321CC7AF816668973603E2BADC29ED0718245099C3BB0F8027D241 + 4FEE7A27DD8BBD52FF76302AB688E6C452EDA6D6AE3921B430EE62159C960B4F + 7E5078010F6419F24DBEFBA09D9286594EA69D6B83A83D9C7B706C4019CDCE1A + E6702B4096EB885CBFC0F1D83A1643D9881AB062734810A35F780E156E7538A2 + D8672E00F98CD218D7AD59382435851597C6FB5C681E99AA3B54D984E1E6355F + E7EA8B8F9D0AB617733FBEB7F4C77922A131D8FD4513BEA5B52C07EFE1D0AC44 + 85B1ECE90F3957B1583FA02CE642CFABE419A79D5D7B40B46D68AAF77B731BFF + AE71F66F4A8B5180001605D4ADCA0104BC8DDDA2E75496B2FAB5CD5E26CB1194 + FD71A73EC803DB5726D7D8CD98F17F059E0FE003FE9210078956A3F829241CDB + 2C66159AB563AE1D6AECF15F1AD3588510ABD7B5095C5EDEE2758DF8A074EFF1 + 4CDC2A369F44F43773849691B4BDD94B87C6C2300276D2652BDABCD8354A9C32 + 30CE2FDD010645F586C41D4AEB1168940AC38E485C415396F6E51174FE49BC04 + E0F4A41DCBBE1FE050160EAA865D0A1C2C7BD9EDEFEEF6B2FCEEF92FA2E794E3 + 5D48B0A1E8FDD58060CA6A0B49D1D99721BDA689DDA975D523EE96502E88C529 + 1217AF7920A1F79F19E0327FBB203041B9DC04DD6324C285B87A8C76AF32FE30 + 9B59EC61042511EBB5D21699495D1C675330678576B5BD6D5A611CAF8825E628 + E0E77BFA9563AE8EC8388CE431D2257C88E1BD6C0A919E8427BAC54F7B9FBE88 + 87C60A5683A64DC8B001A52FAAD02F2F557A33F9BA4C774086DFF5E0CBF45599 + D23642AC8513F89905D96FCC32784B0F2C61E0FC4F3B32AA7AE08D65404845B8 + 6C8FB766F111F4200F1DB20EC50C2657E96CD1E25B43AE45A4B4BF413E2D9FB8 + D78AF6F6BA1ED3438F167E197C40AA586B7C3BD0CC3AFBAED567A8464A902E04 + C571780783F0AFA3CBA16235A581381AFD266145DE84F23A4A3962A7FDB54A57 + 457EA9488217E54862CEDE4F291A0F7E79CCF8D2C3D0CD8FDB280CCA1C425939 + C837715B22DBA1E1D0BEBFC252C45B8F653794C13913722F486C26E75CADCE77 + AF57571C04F3D0FE0A0E2A0BA88D46AA758B0EFE8B2449D97F27B37D28509503 + B6078BD53C505E6922AA22144857B5BA47AB9A13A6DBFBB03D03FE7BD9B59371 + CC59708A7C82FD6B0483DD845D53FC8CBDA75AD21259C7DD96C7E823325FD8EE + 172C6A034717A3353F7361C213C3E7C224152CC010BBE00B75CCA4EFFC122434 + 4B267CA4FC0260FF88AF16D4473E6BD03A0089D1BDC389BB2D0A2BE9A6A79713 + C2642E1D787F62DA9102EF9EE3C040FF746C933240AEDFCAB24CC03594491D0E + A7E451CD51E3A681CF7CD0F09BA2F1D7EB6CF3838D3373A7D88E04AB2E6CF446 + 851617CFDB8BACC4AB63DC2CBB9AEBA4F75A217BBF8200A24C47BA6B9EA62E67 + CB66CB16C449DB4EC5283C8C2DF3CD1F6974E95FC177B9A09452B3D66F285756 + DD0ADAA460F3E89349C36FF759AB0BFFCD811F2C03E98DCA3E73891A4BB9403C + CFC58F6B06E082DF7B14A9B981E0715D0C51E847614B144761FFC8121C7BC226 + ABC2F1F140D3C24B5BDB56B489E5D2C3E4B9F8FD1A8F8885D950CEDDB16C9D26 + C0082A49CD719AF0690A0B597F5CEFF356D86D8D948C943C9AC7BA0717969B8C + 9E53D837884195C5455639CE51EB71184294BAAAD10D60600EF53E600ED09D84 + 155629C4F57BED39943CB09420DDB6D6A689D147ADB3E2F839E0D35866875E31 + 03B555A16D3EB508A6AD112496AD5A075561615C498DABC6CBE8E29C2E289D18 + 0FD1E04BC0AAAAF54D7316C59BF8A7D0FE929A9ADE643A99C29CB8B5EEF9D0EC + A0EC5886D7C63B2BF802E6838F7C5CDE3BB885D1B4866B0E854B68F6B071C15E + 4CED37F535D56F232B68D07D9352372987A7D66EFBA92FC6C42CB37F857041D7 + 6425DCB774523D16430B5672B535AF436599F760DBAE1CF7C33D9637DD8DF283 + 8B355BA6C80674191DF895FA92B54774B42BA45C7B0FB08215AF42943140136A + D750719821316AC907D72AF38C4206A40305A53D17DAF53198CBADA262C77AC4 + 75EA4A4DD77037D91E76764A7BA4573A610996ED3A721ACECE828EE8D0704356 + 0290382EE000586053560E747C65B2CFF9D16A4C7BCD1DD4016B95457CD545BC + 8A1B3AB239202C106BA9CB13C5606D8FE667BBD97D71D424C8B108C09CA9EBF0 + FE003E1345803D249E101F4F24C8B9296920EB1057ED5081D55CDD08B289289A + 21252531E494137765312365ED5FCDC994DDCE88010C31FF63A5225344E67063 + 09166712A9AAE98BD976D6EC42BFF36BF20B6293707B48A26D60E136F0F8B0E2 + 4B264A41D54447246554F596C04E552DE0271D0DC22A788AFE6E78623D94CD38 + 3728C67DEF29BC237AED6CFD87D4453E06BE19E12B69AB66CB174D5EF85441C6 + CD3133C5D8030E628EEFEE11A067E8141213E6398197B47FDAAB002328911626 + 8D40108D56316D8A9554D8487C5C3531F8BB03135341ACA5B66FAC08DC4FD018 + B3DD562A6D32710CA57141F28B461D810179FE2313488E17559F486EC80EFA6A + 955C19BD0D7F58A5D2D319D3249EE8488931EA56F2A92A727F7690F6CE5EC903 + B296DDA6AC3757523418A2D96DA8810B4AA9DC746434DC4540927849BEBE96A1 + C86F0492E55257058C08B13F97DE7B9EB8C3B9355ADC5D4401D1E00876D43341 + 873F064732F136F18561EA03DB2BD71FA728D2BC7D3E070AFF24F200BCECE913 + 0D360614A3114089CD297C85B6AAECFC29FDBDEFE4C9C67C2FC390F148E50EF3 + E38719E2F6471758B3158402F90A239F17F26983201AAB0E0700C9C2E32F4444 + 5DE750154DAA72EE4AA53185026BDD2A23DBB630C87DA4FC51F1C6016399C09A + 284282745FF0049EBD208873EEA93EBB638F8F646D10D99B759604D617F5A1CE + 9D8D9C8D5E1DF497157497D147C509E1B584986E93F6D85864A79D417944E1F0 + 2A2FEFFFCC51DDD4470BEF1CE553A7E406C424187240D221704A2F45017EA94B + B9AB319074FA0078A046E2F10F83D9FAD2F729DC762570017FF61C4E6EE5319A + 2BEBF3BD9F6392DA468F5F5472FB09EE7B4B3FAC19EA648ED1D5EAB5598193A2 + 4B0AA0E69F2015FA20CCEAFBB75047D36527DD7A58643D6FFDB0F7E98B95313C + 35A06C2D98535055D04B55B1D616701C5EC6E71D497D5224084CDB92AE80C7C5 + 309C9C23CB55954B26BA124B6D8A8E95AB0FA759E3C1CF0430A06D5BB7A8F5FF + 62CDF1530B09E0F6B6012AD85ACB62F3AF7AE208FAD8857339D86944716B87D2 + 97F76489B0BF3922030B51587AEC7F452B69E8C16FFEF7405BF365F421044EFF + F0B2BE653172DE00E2B51736839D1707CD47A5E835ED694917F88389CAEBA855 + D35C672186FE2F349C1AF67ADB85EB9E1EDB563C33017C40DC18AAE3F15D8CF4 + 25116B0F888443A38D9AB76DCA31FAC4660AE9CC0879B1D7C565708DA4D3DE43 + 1B32A6F80542202D3F4A00B1C525B3153C3DFEA43E37BAA2E123CD74ED5F70C5 + F2709D715E003405A1255AED63CCAE605F93506D9AF5C192C3E56832E9F30D67 + A10DADEEFCAE0F9A40DC1BFCB35191B8EA36BB1479EFED817FF10A536150C721 + 41912891CEFCBA381C423CC8C484EE819E0E87584F7D2A065AE0FDC204AB0510 + 2FC186E4FEFC78CFA2728ABEA420547E0B382C663E61422A74CA7E883E3609E5 + F213B85AD58EE17EC9508A2B211F710CDD6A7A30A35022055B855F6378EAB2BE + 240B4741693D19431233BF10C077EB3622310CCCAC9DC4C3C1A19DB8A6A5F11A + C67374F42EF95ACFDB76DEAFF26DF395ACEFA96E17C1F1CFD8C5F4FA5ED30278 + 7A275B5BA38DCF85DE620C8A00DD1EBA329B05ACC3BF51AAEBBE3D997F7E099F + F5F1582BE3AF8371244493E55C545D600BA2BE3E3776BE1300C94F68B673B762 + D6224EA03385475C2E1CFBF96BEE9A959ECE84CEBF2BE09C43FDB040D30C5C38 + 936A0B4F247D7ACFBBEB24A44CFE6A32D5E19B105C8A17B8ECF3EB20E25B4BD8 + A44AB3CA654D52188DA0DB64B14CDF7F715A1277F697A90089DD57A0DF687202 + 80A5AA94644102AF56694C2747270A37954B6450B683BC059A0BEAFD1690C098 + 32B58EE07E0A1B6588E7E5A98CF34278AF39019FCD9E7025B2DB213BDE9CE3E8 + 214AA55A1AE848B320E76A1146DACDFDFEF57A2E4943C0BAAADDCE294951878E + 51CCAEC70FED225817BAA3D5AD8C219B13812661E5F8D0B1B3FE8D0DB3104EFC + 199B93F6D931E85E5AEAC9E459831170E809DBD9B308A4AC4C44DA74D425538C + 21A2AB0738306A1438D3CF44FFDFF5D057E6D0887C8488934F1AA9840E7EBC9D + 5A949629949A82AEDF6D87B45B4044093CC24B64D0D8E8C74FF1336FF2E4E238 + 054EA9CB2ED4436FC9567458D0301312D3CE7314D641B6224057E617E902C6F1 + CA3152BF5C4ADDFBC021198299583E9F2EF014BD6109413999EE5F371B5A744C + 2B8B7C4633B2A902F939090AAF77DF909B4F021D80F91A7CD8DF18AECF6BD94D + 23E69570DF5B5619532012326F6347F889E0E22F9E1165E9F4B2EFCEDA0BE3D9 + AB90C57BAF1EA87E5E25B997C77B548140148B4FCB268AE927A9C448359A7AD3 + 645E433242ABA7D34F5F948BF598417EA8A1D91F2AC9B27E79BBBA9212E279A0 + D794797E87F600DAFFED607B86959A759F2832D0225D8058C231C6BEA2981027 + B1524CF43D947BB469BDA67764403080F33DA089B62362C7CCA4A6F95B7533B7 + DC553D1726A82B74F3A4DE1534202D2A7712126475C22BE8B876B30F7C968EEA + 3A26562C49E4B8F20A48EF0C5A478A7E5ABF4E4C982FD1BD8A9DCA5C12F2D88F + 5B53DAD8FC18BB75989960069BFA56C8CB83AC916446E702F82B62B43B3D57B2 + DD0F9A47A70211B7EB07D2AB6A297CB06BD2F72C0A264281D6BF99E636AB3F49 + E5CDC67F2962BBCB0CB70B9FF66A9D631BF42EE4A3217264F7815C141DB66F7F + A633AD7150B76F1E364A6D33C178B6646497448488E6ABD3ACA55C191F76DB9A + 268B5787BD6555BBA3DF109B52DC5FFFDA7B54F3AED7ECB29D22493C31D72139 + 4E49D4150C7E6D7EADEC2678AA546942041C17571F1E4AE81CFEE3A593790870 + 389DC39FCDE10917E863C46A1E40ACDBE212A3780B3BCD3495099B3026D7C42D + BB9C9A4E1A44B0D8C5013FA259F081A567641E07FBF3B0DC278EC5FF271AEC28 + 2745B17A60FAA4812BBA24671E50B7144B0D686524F5959F36F29C9E475956C0 + 0237172B0BEAE2CDCF08C153A03A99F8AD4753185F836111ECB6C500FD6AB4FB + EBE0599BBEFEB59D4F529CF206D5E342292348B2B8F0CD6B59F90D940E4DEA2D + 4CC61CE08D728653B7D56197427B09B90F06D479EFA3937EE3439388AE5C7726 + EC72D2A51AAA09DB49C49C439C06CBD1BE16BC633A60A5D2162EBFD984A8B364 + ED5F145966CB8DC129A980116F5379D5D4B039782E377ED397D59A20F06E9333 + F7AEE48EB502C31C89D9D642D63CF1895BA62EE171546FAE203FDE5B53B311CA + 4641768A821D653C683E3097988DF7A354179FC5A47708F7EC20149461BED8A3 + 55084D743A115C1438A212BF46535CF9CEE6F437FE0A637EF5B27401E6967C11 + AEBEE3B044CE9D02805E3301D2FB3A0F5F00AEF082F51702AE4689BF220FBCE5 + 4508787A74F576DDC6DC4514F446938DFD331DE5E4E519B7D6871EA5FA1AE260 + DA402F6DB6919A6B0DA02764E5EEA390DB9806311C0597D9D3F25E2A7977EB61 + F8AED9403571934E56614F3AED73265D1794AA3580D561CB19F154546F0AD1E3 + C2565DDACB0149B771541551C71AD7B6C181F8101DC4376434628A2DAE345331 + 39DE8F8DD67E6EA0077D285B91AFBACA260D1AEE256DCB6D4EC744FBB967F57D + 524E11C5531AF1FB78469DB344E0B5EDD6E55F030ABACD77C50B593C45001635 + 9B8E97BCC0A856F145D71FC868C9811148E9B44B7B9DA90D88482E6823FF289E + 02DD0354CC2BA97A60D1DE7D56DEC4B0FF456950F516F4BDB2908485E27807EA + A51A3CF11BCC81D3A9575761C65EFBF054A38591DD62FAE8108C04854154E75F + CDF594C9B14AD2E0A97D6DB1940D6D882AAB867091FFF864138D5EE6E7F898EF + 64FB106F0035D9816536E699051F6347EF854BA1F10F5DEF45478A3050DD12B9 + 0C5BFA626320DC9DAB7B56BE3636A3CAF827B793724460899757755918E2BF91 + B1A3DDFB8E3F69A8D2FCC1D9BE3E7E11BEDB4C318D34CC6813A4D0BCA7484992 + 723409E89B85FEB06C98F5749F850CFA269EBCE996DE990EC4523436334C89DF + 8BD8F5ED431B54F887F1CE678DF651AA5AFB5CBAAC2A7C888D368115319F3606 + AC1CAF7C1A76196A56E83F4CDB34C04BEC725D5AB8753B141652CCED1710AB42 + C25644AAEFB8F079E8D45F7B5BB9B435A80C2137EBCD27DCC53E8B59E2B258CD + DDEF12CF54532540D3A6E4953BC7C24321542B3248B8DEBB3F7922FC5208979F + 037DE5898C407E32EFC58AC958DD5635C199998D4B0742013A536EA6CF28EB73 + 61CD12FFB4EEE4204174118BC2554DD88197A52B290970D728D4C65DD9621E58 + 2FAB5D31627F08B6BFC18D244AFFB69B72E7AE47C9DAF05988A70E711269FD62 + A3E883D2C3ABDAB020016FCF66522CEDB123E27620CC4E44B39B5E557C00CD15 + 664B23F27B2CFE4605C8F89970E69876ADA8219CB67153B5A17342DF7FB90F03 + CE20AFAF03C4E7CD775D3F8D9E9C69EB709592DEC37E92B711669EF9FABCD362 + C3FC574D666A8E2AC8AA17B13ABEE49EE59A5170D2FB75E471D88320723B2DDC + 576E54A24E330E42650B8BDDD9B3838BE8080C855000ADFF6B20F27EDAEDB57A + FDD41C5B3C27A557C1078182ABFA4C93AFFED7843EB63711B126CBE589918AB1 + 57E2D1395B1695F2078B03CE7529ED943F45FE33DF449DE1B65F6197A3AC95D1 + 50B6EEDDC9F7680D64C14C2AED99628BEAB5137CBADE741FDEC04CD4EE7D24C2 + 8237BE6B631A7F5091E17B25774BBDD344322D77A9A9278290C6203352DB7C16 + 87DB0CB44F4C979C2AE37B3316D94152CF21970C770F946317740DCD964AE8F8 + 645FB20C24A194A04F1DD79E31F9618C99EA7D02F19B18673A8C6656E1F3CA5B + 863B56D9D9849A6CDA0E5E839ED20225649EC6394D1B390CA374E32DE1E206F9 + ACC0EEED44D8C8565A47BBB45B5AA1D268561AC83102A55301580FF33C7B6AED + 1B2476459E1050E77C7506B0CB70931188FD3A592D364AC8FB723F8910D20FD9 + 8CB0512084E4F57A3014E275C93A177BE32CEB05141EB55C82AFD9BC59D7E0C1 + BB9B0CE8CDEA149D0CC7DB9623D9C6044CB638C2A1B9D9B4D1D95C2B6810C50A + 09636DFEAD86E174AD2ABB50759F19EE1BB60EE1E743A31FF6A089FB0D5BAF8F + ACFC210065E9868685DD2D157A6A3301A090CEB6947986525CD014D245DA7E33 + 881156B5A5F29254FB2E54727CF5FE024AA8828C7C7362FF7C62A87664D9B167 + D334FB37D304446A136FB3FBDFE16301B0A3C5ECBD402712EF3D21343ABF89E3 + EBC8CCD40296A99BBE47B6DDC552CA136F253CDA15369AA62F42A168FE6FFE69 + 4E4C5A936E112AEB1072246E6341E5D950FA76F89B5D6505FEBB983476CCBBCA + 31C06CB803459628777BE8964EF0CA1F1D4F3B397A26640450D296A3A8E25844 + A207DFAA2CD381F7763B70E6C63C2837EF6678278205B7AB473B7758CA2648ED + A92E77292A5D1FD1FEB89D8FC7D2814C7FF9441AD489F2F72D2ED53FC73DF8F2 + 697B2C0F1A4529F8045482A7487960AFBA6FBF1F09A424A97F1EFDA9A4CDD7FE + B8AF1056C93DF5CD6BF669C443EBF50F286739E1B57A8828262AC7638B90D404 + A2BB1EA11CCF090789D6654A52EF9F8AC850AFAD9F52C27B6E7CCA6ED24005D3 + A2F618FF5C9D8D0A6820AB5EEBABFD5BCE0F5539087970EAC64117C860D4890D + AB7C7673F77A0170635C889C928E27BB75FCAF602E5CF5C3754DAA86633876CD + 52C6E7566F21D1EBAC870FF14311BB4E2B74E595D52DDE3AAE9E7B58F8C7EA82 + CF88E1ABE8B8B31F8B5ED5001C6FCC6AB54C9C352643D1E32B61CCAF59BDEFE7 + A0340454BEEAF3BA4DBCB350D26BF9F6CF0BE109CC95FAA3AF291D52EC2E8DB9 + C98458FB7C58E767BF2276B9790B8DB232DE2C3D139AD6F44842952D4F0D1CEB + 3761A46AA126A48CE53BDDC8AF9C2AA7151FBBE5C37EEC7756FE18A8A45CD29C + 0E5D191174E9DE37B900D3C72F490B08EBA9663E68AFC62E8AD55BE0330563C3 + 25431F9A036E64EB611091B10E6A7600D8849FC7CDB0135B79C9B9650EF87EDC + 2A0458DEB8FBCCCB0F5898C6F187847F74C58F354B3EFC16AB9D17EBF9961B51 + B19970687C6390D530F37592ABA60FCCA00C14A24A54C0402296DAF11ACFB597 + 55EADF450B444EF233F2E80A612091E3DC81620053F377121CC8D16DA84E3DAA + E7B926D6202EA64A59D0E129F349E683AEF0A7D51D59C309D25C429230B64C3D + 6A9347989AEEB6937A8161C4C67CC26BB136FBD0BE18B99CABC1E270F25B7B3D + 256C99B48D059A112CD114133AA85E61561F873C6FB8E0B09F19746D53551C47 + D77D89AECDE9B1D814235AFB537E77A0B1D25865C068AD792C8F328020698757 + BB294CA1FD42734AB2486EBEC5162C2710021F4223D4A3F76F98CE7F6E7E48D3 + 969B5AD21D052385085C5641C287A77213561191479A35E8CD629CB3DAFDDCB4 + 67DB0930A2B956C90971706DDDDCE4B1371BB0D22DD3AAC237621EC82D40F342 + 04DC1FC16B07FBCED716B4129BF6FE2CA9C41D0F926FDDACCE5A49F5FCAB38D9 + E9AF637C2F2D21313A450617300CE255684D27F45D1F85318A5962DFDC7A00BF + 299B95E1A85E7DD1932C626D29E0CDA025ED8FEF38E5CC69E6F300A623FC085E + 92F121EB273CEBB9D8DA65339F1A4A88D7011A31E52369884C5F55D56D2C6E24 + D99B329A06A09507326E0D47C5A24D69388EABB40E2AFE0567C99C321775C7A1 + 4E622A18A6E355EA9770EF6D13706B4DCAEBA182B7BDB1B1E99F2ACFE0DC47B6 + 765C85F0E15599AFA69008BCDDDE22470C901EA09EED374E8AD79E3A98818333 + 6B92ABA34192965CB2EC92F91D66B40933851B5AA57D28048009917DC292F95F + 3F68FC8BA05572652EFE8D60F1859F90EC716CB1886B5E21D7457E9CE57906F7 + 7D648F070D3FF615C77C31BDD9A34B1FD7DA9770B05276511D6BE46F0F6AC080 + 78FF8AC9CF75B5A22F6E7E44BF087FA8477E4D73AE5B5B2A33AF31AA8B10C624 + 41F201754678CDABBC3B13DF00AB039B1DC26D5422D982F44BDC3A316BC0BDCD + 6FB356F4991D3433A830622F70B7B31DB0C1941F3F9BD06FE9850E2EB7E80DD4 + 6B8ADA70E5A54E0608CE8B680D1BD1FC664951E486B5BC5135BA211619795A6D + 67EBBF00BF8949457AFEF63CBBC7956F6001731D43C25D4E532713B3E775954D + AAA3D02DED26B02519529792243DE59859B25E6FE4651478626F77EDFCC08846 + 65AC5DBF140F32D3B814C44F926A5BA3B919E1DFD240AF6D694F136A795D20C7 + 34A725B497F3A7549F9A3BF3CD39777F23D779D46A9769FD637C6A4BF3CAA4CE + 78F7378E3D9EF1545F4346858A3DDB5189E32CBA278F86678C1F4EE22DFE56A2 + 240157E8C3A080B92EE6458B406366C967EF877530DD9FB0E12F7A9C0C50C7BE + D44107AA1D5EF1654714CEAABFD0C3C5FD7C83AAF0F83D7114C6AECCAA176D4A + 000E3DA7D8FB3CA39BEDA918CF942924AAD15F160B08ECC564C14CF304294591 + 3585709F4634C9899E3D45CF469CDAD6AADF505D302F97B88FF022179339030D + 00AB98190CA9AC09171F77670B7CEF7B71590318EF14718F8FFBF25352A66BAF + A2F5834118E888ECDF192D5F0D0531C55897B435643FEC11E3946CC0E1C4D67F + A030DFF2B639699E37BA20DA179980B3AD58F1FAE92F42A0D88536CEEA55E63F + 6DA128D50636890EC3E543F5B8EA27DB0924129A792E12E3AC34FBE687603D64 + BFAE518065694E478787A6BB2ED19962399727862E9C15262510ADC499B16BCD + 5FAAAEA4C207468A651B72774C83D5315464DDD24E312AA91C746B95DC012D3D + A4117130BAAFFEBB2035E2D4D89B4E6E0217FC140DD9973C906904D82FD6995C + E2E203205723BCEA3420CBCC4D3A825462365566F4C2D30ED17A13791E1BABBB + AA8415A75FAAC00204FA2562ADAEABC3431BED083BFAD41D751E50CC86D3B0E6 + 8F359F40BE4C99A298FEE4CC2C861E33B6F58D438D72D17D98674840C8309752 + B6B35DA1B9715B6E3D967A9B52FB881389BBD4CA3641DC1B6D84D093D41CF5B0 + 226E53D7AFFA27D9355C964A9C679B7E387A3C5999B1F146B2238C5F77B92D3F + 6DCB4A7C4AEC7F30F521C33AADD370BB8F49F23CCD2B35D5DA181CF1BC0C353B + FFF250424B90BB3EA4B66E6B60C6DE4F646575F4BA3C76231DD4505488A9F54A + C2455E3DEFC629CE2E4143A9F219E8EDB341469F6B436519E3AE9B1F0486C172 + E6BA02A9C422316AF07A0BE8310AA6F84D0B6E5DD75C1666C5C3897EBFD6E528 + BA5FB1D38B886EF694AAB231938749FEAC6A5006E6CAF450BBC3C0DDA8A6E917 + 27DE03E89A22A3FB166909C69176634AC30C90951D98AE02DBE54ED3E37EE271 + D3D73907F0E6A7C33D45C7B311684AF3436A1D2857AEACF70D2DCFBD1D9BD55C + A0647EE82D60147683F41071503D852155D45AD85899B063EBF6E97A15DC826A + B2745B87F68900D79ACB9EBF74D9C556079C6C4A1E7F175D411A64AB1584A40D + B8F49B98BC58EE95CD7E3B7E2A0EA16A1DC61CCAD706E5E7E58C007D1C9281E7 + 09F70E7DDA6F141E9DCDE51146F732B1A2C9A5B4BD1E4429A21E74F47FB4851E + 0D0E6D10D4823EB915E507DD7CC9E0A7CD3B9A6FEE38F3CD0A4AA85E73AFBEFF + 45C84F188C7FD83CEDCC8EB6BDC47A0C754D9EB386B01F5EFDBA137F25D7EE5C + 15E4E8A3111BEBA6BCE3B7633CE12F4E3AAA910AAD7CB068B2598069888AE586 + 8D0183C089053E654B0A20A778C5AD6D428A67E9742DE5FBA30B2A1EA6D974CB + B2A5E7BFD981BE5FB045013D326299D428719D59E289A143FDC737987DFB7324 + A8261A0FF5224CAA525D9C24746A0F000CFA0847394C6A51EA3622CAF7DDED55 + B726D54B09C6127D0E4BA193E063882CABD22E752D3FA4BD6DF7B448A4F6B90C + 2A0142E2FFE229547863ACBD9247809CE4122D48923F7C41A8E4F4528676FCB1 + 5D35657C825190B3CBC9773510F88F6E55F0A1A14AD46C8FF2921C1B87306933 + 9E6BC800D116BF568718B2F3B4F0057B9EE15E5FCA85126B720F76A2C6230C6A + 411ECCE95E05D38D963D35E350D82090B628CC25BC5C2BC723461033A375A128 + ED02A20894359BC73B3D111D121DB869FE415B6408D11E7649BFA587871B66DD + 6342ADEEF677E5A4B4C5248BD991DD881FBD20FFC442B00752BC6AC3191E4F35 + FFA0B09A32080B1161DB3E8962548A957374E26581052051A7D6E09A28814435 + 434E0E48A5D93F1CF5641860C97DACCF30A34F44740B6507A28D812E64EF4088 + AF34DB5F95947C0BC5C6210B2839479E2F1B921CF963682344A0405731730EC1 + 0B44DDD919292D2221530278B536893FD16051196A45277175A003BD120A70B5 + C5BE289575C072264832809D271E55F3754784E51AACC2F6364E3367FCDF9187 + 7A68A2CDEE368231B72C289C040462D69CDA4E26FC32D24630D08B0AD0BDE2B6 + C02D3C0BFF00471B681A5CFB301394A72BEECF5647BDB0C8006C0FF1DAF40FB0 + 55DEBA8C6CBCD7A0DD27BA39180E6DD12271679DC571E5E8CCC33C363CD0DFB8 + 02521B34139C3514FE4122E3C26248DF880DA01EF8BD421A5E30ECE022E120DB + D74E16FA80FA2F1997EB804F17D543B38A314F85FFC4F9566CCA1D2332F4DC49 + 348D44B82EF497E7F27DEB3B5FC9F66B6614BA3F970138383362D0E59983093B + 072805078D6A3C167C79DB82834916C24CA46CC47A5E5D480AA9A44C445E9716 + 1ECFC6DAE237BF66A3A7217721508905CD33650E08B1C7C511A28ADFF14D38EF + 1311EE90312DC74D55D221BE1CCEDB298A43309AD3DD9007BB08A6EB69B13BC2 + 2611DF4B054E83D3E0AA2AA8BE73F1728D8E0E3AFD6D0411E81DA3BB148C5EAB + 16F0733CA1FBA8FBA84C8A3C483667FB62C879961E7E695D607DD76434B2383A + 43941B02B0F4FD4B615B5D949FB141129E0B67806F49FA9BB43005CE9F5B5D3A + 9E0E95DA897A8B20333922D789A3FF150E7824DFAE2078F67615447E4266D1D1 + A52D568388A1CE96847B0F77813221E049FEF913E17A4B0E37F5F362235894D3 + C0C19B7777D7442C39304368631A2881C4CF03C60CE54076B0CBF3C7B91C7392 + B4B61DBA8D6392885CB7F000DB2EBEDF1BB93117D6B9B1D432CBCE3F63F36C09 + 55FE99040B0EE6C003B844A7E6BC58F0011E17F799120EAC87424BC8869C8198 + 67B5FCF19EF4131B66E56BD2FFAAB92DFF34A9951AB9CC63CAF8B9027D338AC8 + F5D5371C7AE27675E5B8D790A1901CCA7628B4484C64AECE23316B8E17650F93 + 13906C730C824EA1A95DB9D2BAAB9FB207799873DD4F17364BBABEBA08837F45 + 2F99F0C15FE395125C816EA40FFCA8662B362663C3C2F8591F2F7B61843291BE + 2B6856ADEBE40C00FB3D847B95500CF08DED40133AD625A48D00C31DFA11424E + 2063FB2842642FC0C30B07065AE8C02A3857D63E831A46DA8954D6295D41E208 + 41C5FD103267AF0A3B2A5D550F7B8992B36D2ED2F1C29653309144E025C9C22C + B8BBF7DF78EC58568CAA880597DF881A1D9EF50B458C6B35E9E470993F40619E + 5C3FBB32DA0A8E33D976B576F67C4BFF6792598160186C192565C3E4C71D850B + 6B35356E4A3D2277391617ED635DC10D7761593DD9B45D1A29E57FDBC96F183B + 1F6C802AD1F992E1BE9DEF23B0C7C7202034579F1E2108EF941F6884FEB9625D + 3EC5BA5CE14E5420B819F7694664A8224ACC2F1BA3D88F5FD588611ACD9F98B0 + 764583CDD35668D0AFB1EE4C6AB90205A8CA16EF528CA3D6822DC04F9ED1D883 + 3423BD0F2088E2F141010B159D927AC595DC41088CEAEE3836DCFCF6A7B20832 + 362B431B359144E2DCC8180FD0D63104F6253B12FAFAC902C557924593948BCE + E760488B506489594EC9F6DED77AB531404B26558F2B80247144C7EBA41DA089 + 8127A314F85B99FDDBA311961FC5CC66FEAA064A0F91567CCFF71AB4D17EF851 + E6199D9BA9D9C54C90EBA0E2F2187F9A1234517574D5554E2B59F9F152738B5E + 7C899B184B63E9DEED9EE169BD5E21F82EEF762DAE78DD25908852F2831E5C90 + 89F1BCA499D39037282EE83224DCB43D785E13E93BB7D68A43A283499AB86A41 + CEAD535DC60CC200F60A3DA117E86D53E314F427E3B499B412BD81561A596B54 + 9E272BDA5BC9E1FAD7E0AA741EDE4A6204065A48108E7C1B4B5AB31B78A35448 + 7F59056B2ADDAD1470DD94149E583A728F11DCCC3B9CC26210DEA187BEFEF53F + 132022CF94D62B1A32E414E766B61FD3018D23F9EC43F7779A5E868E014AD274 + 6280E3C09E0D6338EA772C907CC7E0864026A567B391C9C384D571239C4B07E8 + 5D69623F5B334A48C01F59939EA95DE46CB1D7C5CCA3164C9625176700C62D06 + 8CF75083AA5C34DBF7D99A7BB76A49BA7F86F27655228E7F7FBFBC1353A1F265 + F816FC421DF7CB3A828F8809686786C7E3125E04FE2A5C0DA940ED496B4FE43E + 534EE8845003E23A6C044CFCD646DB1A6A26810B40891D4376728EB773E4BFB2 + B27F4B7E68EC751380F2D10BBD3F8216D5A8880C5BC37BB7816380DE0EA0A4FA + C5FD212372BAD4DC928D27DC3201E38D4B7965C26824301F3817FAE62E548FB5 + EDA51B86F5D1EEF70D981564AED8B02A1521E610799710D8A9C6DC84EEDA2D06 + AAE228A8D991969CD62341FD968C9B29CD888515726A7E1E3070F311E1C15A09 + 3B73544441807DE088F9B12160CF63BC24C43B24A1C28AB1262F767345708806 + E22846F903D7196B93182B4F3A76F46682DA369401E9D4B1B0F940046EF3359A + 485B01A022682CD97A2397AD51292FDE26919614C39925C96E15CCC79C203706 + 92D47F40782C9CB919FA96875AD6A21A84290F56CBEB34BB54138F39D82CE443 + CB1F3AE8822477027A9A0DD0056855C47AB850511FC77C749B2EB2440479A61D + 0319E049117D61442CA4C648B0184401ABBEEDB9F12A14EEED6A30B2C576BF81 + 09384737582A5C6A562EDA458DC8B343A4C24E892727D7713B1AA09167F1D204 + F197E5F7A687E76F87170EE4E3C766DD8C5BB1D7D9901F244D8B47EFE44DF138 + 57D7708FA0F7F6FC0E81C61AC38F64EAF873CE3EC5F8F201796BFC2E6D93482E + 53E6D0DD61F7C27CA8729AD7B244AA6D4CF17C56BBDD7D7B5CE90E7C76B743B6 + 0D1B536E0CC7870785E538BE35D7627943C528B88D7CA573BD429166A74F75F0 + D36FE3E794E66BC5937FE0F8F185ABFED1CC3BF979954C3D7789E15025C1095E + 0AACB4DCFAEE557C374D0B6C9140C7E98DC564AF0F2B7F943585B5C0B52E69E5 + 5DB4693A042BB28FAF27CDA13C2FC486D31688355A3134C1D8E629E17507A632 + FD0FA7A99B50D350033AFD2E9157B0C7EF9CB0445A1151E3E1234D3F699140D8 + A0D7598A38C890A41155A025691A8274E663FFAFCEECA733121C4FBAB02F1AD0 + C90EF6FCBB8F8A774A14F9BA2F98F8551401ACEE6E5AF73EBC96BB02F864F65F + 54FB1F26101846258EB0216E9527FA4BF3D701441A9B04E1AAEFE136C83DB0DD + DB6A5250ADFAC29B7AA11E5D24CD3BCAF585AA44185C3095EB3EA0498D257B27 + 70EF25C2E8BB3358C8D47A80272500E641CD4823C25058FB247FEF11607B7B5F + D0DBDB9612D449EE067318C2B4E74BA771A554995B04AF4EF856ED6EE7C50E32 + C7FC84E0D5E20C999726ADFA481887CF51A73E7C83C60AD5721C4318DC10D41C + A6FE0BC8E1FA9FFE42D9316F21653BFF2362A0B70F1299A37C4AD982411475FA + CE92CF8C652B4D33B6C462B0F545FDC6D70052F58A1F3716560E2A736FD09404 + 1C04E6081CD1AF63CEB3FE4B3D9CD04F9E9D2E2027279627CD332B988039AB29 + A54E708EFF9292C150CB845B3B22B24B99BE687024EFFAEACE4A28ADABE8987D + CC95D3198DB6929B2D768CD001E14DFEC6D755BD7F74DA20852512949C555552 + 3987A708D1D9DA4831CFABAF7A3E9AD970E384B44E3A8260F8F4B08796A21905 + 36233FE34113AB20F9387C62EACC2A04E54BE09D4FB773B47EA0C73E5140802F + B2EF016AD675023267DA33D5CE7FF5B9C4E00D4BCEECF69065ACD63B27738A9F + 0BA5CB135F1222DB6E63D8030DEF64D14B5BF599DBD72239EC0CC305B950847D + DC58C9028E2D37C075130437EF7934A738CA706E9C2342EF3FA6EFD66F336349 + A83F354A2F8F24C22D19EA2FE8AC3BF08AD93DA7FEEACF303B2D780F9E424594 + 32A19507AEB0919DDFB6B396D57F817AAFD51FC3D387AFAFA9792FFF344CDE2A + BC2266176A8731E5F3CB9E466A2A41FE81556D2A4D503D0F61889C7F7CF1D4B2 + 2C634D58F81DF62FB770FD5F3F44B221BE19CD25EBB7F420D93DC60D247CF541 + 6D9E0924B7F28A5CE70A98678864710C8B9678710A90A9B9EF50F33602967BC1 + 02776DE5489C8699331DAEAC4FD2BA11F9BC2B957660E8FF82BCBCBCCBA153D7 + E438A514CFFEE8DB3BDF8AE63178D01ABA9D029FA29347CFE3CF2ADB5B2B06D5 + BD30AD6F0D328B9886340812AD5EAC4488A2A1F8AEFB739E73094D207E69CE22 + 1AD38B99C639FE5A464BF2245CBD29E96D164A0A07AABE123015453506AE553F + 3E2F3F6392587A1853693A9EF713AE8D784345C5E3F8B73EC3B7AD3252CB6A0A + F52CF8C59DA49CCE0D5A8164B8FC027EFB874E43ED02122C27782178103315C9 + 507C90FDF4AE8C0F58520D024CB864E4BD8F7B423E5BCA4DFD1F044C1BEB2986 + FA468B96E3402A10A0B3185830CE5AD2F56BF8EE198FE076C3361EC35FCDB400 + 779A5EBD3320ECBBBD3789CC921CAFB85E15C2D5CAA8752D1F152A14EF281218 + 5F779D342C37C8F0E287A2F18366CE027D670621D2A6FA60E87F5A5805CC90A6 + 141DADE1959FE08949E5CD55ABF790560765D56E4C85FA893ABBECF20F8AF13F + F334C74579CF89E9F4CBD9A47BE9DE7E050E7CF63F3FAC8DF8D6804AC7FB515F + 03B9C4431A4A7D376804FDC763EBD81C62B2354B3FDB5ACA9DFEBE09B3D7666B + 3633EF66D7E4E903C273D1D6AE0D02EDF11FBC70CACC06372BDA0BA70798CD65 + F5D50100D05176B4AAE693531937769B040170733BB0351D33F6518C29286A70 + 27F1C1FDEA5E1CCEA3DFB91384C6A0CB4F1C956565BDD1D984E179589B8DAFC1 + 1564BE8B02209348FFE16C60B433DF6515AE1A43DA9109030F5DEC13A5362129 + 5E24161C102AE64542367C8A1F40625BB9076E5D53913F6B43DE52D8E825C12A + 00E07AEEF9727BC4BF8F6A2DEB858938C9068EAF891FBB15B30F70B86E314E59 + 998A41FBCA38E0125597C3124012E1BDBFE4281EA75A99168C6C33B1C5DA393B + CC68FD6B68C3373E318B2D49D11737085E6498906C1EF952C11674A2D9DAF363 + D93BA9A3FC52B14E223089347D8A548FB380184EBF47EB96AEE509D46D8CC849 + BE63A79A652ECE1AC4CB2E6B3961E000D790661FC90B45F72FC7DA0D99AB91CD + 041D0F0AD4DE42DC383C4BFE5DED1A6C9ED44023637C172C89A6B213CEC6B44B + 84F6DA0A7BB4B46F4F1B6791156B0BA74B31A2A4F8706B37D717A729E46AA435 + EFC3ED8ED23113F2C8B71AF202EE4D8A79C19B254680659B6D2930AF8CAA2B9D + A46F961FB6B1C8D91977D98961141A8A2061A2C2E225863601926B717C751BDE + 2D5CBDB5688C3D379E80E43A7C3319C60854A3DAE518E2957634345F84907661 + 9DE9912B8B3FEB72F47869BA2F4740DBD7CD54BCE2F8DF0AC235CAB1B4F904C6 + CF50DA353149254CE0E88B6A4B81F536AC838E6E4A22642CB5921737EC6E7C49 + A04D5F0F4E1B1B8E33400E0C4CE90A4332B6671ACFBBCF5BF06441EDB67B37ED + 890B2ADDCFB3F898D6AEB59A1D2754932E0696756DC94B488068448270E76D87 + 2742A7FDED0FAD8C9DBC2220AC7B37F7D0B7D53757B4FDBE9E9FB18351630973 + B357242453A2D1F671B2CDCD69926711E5EA8924D802D3757B13E058E4E51623 + 560C3B19986A02264C848BB3FD80BF0FCA88B525A3A709D53DC26F88EA09C688 + BD0063E4286D80FF19C2FAF67D422751E2AE723E77FE7824223BBB0431CA3135 + 967D3F1F322E70162CF1800F5FF8CE54B60529F2F4283E227DCD55096D853F4C + 07583F23E797E28544C862B3895EB433C3A1CC4B7CF86AE11B86D03C4ACAF459 + E54ADFCB9FD6F73384009FDA17109CDF8188FE5E308A13B66FCCF15A1EF0128D + C31F3F412938D43F470F30F3F0537CEFD282369424BA1B8242FE3A60A88FC5BD + 737F1305CF784B66B326F518536E8F86E951375E0B5397198F24429AD2674645 + EADAF13D700B753FAE75133A602C9700D198ACEE2679FF849F47321C399E9CD2 + 05C0B6252849C4D827E8F74904CE186F6D79F4D3C048CCDEF05EC122707BD905 + 79D9045FD16935F8553865C8296EBC794CFC32060313C5A539D96F5D3CD1F3C9 + CB3DE8EF376A9E5D64C3449D44C495E81FC91B7D3C9C470C83D7F108CB4B603F + DB2D9FD4E29078A171F4717C1A94F51F1C2B786F417BCEDEEA957461CC174896 + 91A5B043256998716381E843EC7E6F82839D98E2C7BF936FC6E0205B59648420 + 6BAE1F221CF366BA96B88799F5D12E06077FD6180854386A4889605070747B71 + DDA3B8BCAAA26E3B1D0F2576E5199767EEA10F510DBAB888D38F36D424BC6382 + 738FA6B5B2DA9AFBAA19C100FBB01B415AEDC1A951F41755DFC7E9F4EB67D9B6 + 8142C7C3077F638A76EB503A2AD2F69961072635F567CD8EC9749463E003DBEF + 7E0724E5414B9521048C860078F5946248A8BAF885473C0E8CC022E74C35BA51 + 7DB29DABBD58F6C71360D68AEF5A62F19667E6A02FFA1766E9B4FF376DC557A2 + 400F154DAF277DFAE65A0F571EE62C7C227662B284901A609D7A6F9768CB7411 + B9468046CD4DFCA84E112B233589FDAE508809DA855B84F738881A1ED5A97C91 + 57BD7C94D6F4D313D7B9E5229140B74EB2E40159F1C91676EE3B8A47308223E2 + B320701AFE105941A47E0345FEE521183EAE75DF6D1A4E809E72D2F2394827B7 + 79AF5FCEB13E58D443162F16B7CCD64218198B0C1CBD72467CC4146D4A91D898 + 7F177F7658DCA6DA46E47026B211202B1BAD60F79E8017305FD769D3DD054935 + 88FA73098293D8733334028000872F8367E4D89745FFF758426D621DEF2AB2D8 + 1330D98C1B35DF980B5C64CA341DCD96462FC0412C385676411A1EBC4B3CB613 + 2DC8BF7FB1223FB71435F31D91792744BFA5529389680E3DA9EDCA27A430890D + 195A97D1DB3B2FB5020419213B74746E8BB7441E7FF7FE5C81BB4B5FF2D87667 + CFE9CFEEE090F26C8B3892280689835BA5598FE9178A6ADC05038261335CDFBE + 56F02ABC96D95C02B0E4DCB56A8108B19FF26D92664234FCD7794B2F2AA2F32C + 4771500133C6EF95B5DD7ED7DB48CC98F433025260D5F7B4A46209244FC79217 + 9B31B106BEA4F95C867380ABCE1D9A1AFCBB2FC0C977F38B52BBEDA251C8B46E + CDDED593419E564218DA2F65188A89E857CA9F71BF4A47FFF8DA6E427F083B86 + 8DC22A41E187500CA741BD2CFEA46FA11E5065FC62D6EDEC9EECE1E376BD9CC0 + 0EC9D96961C5558029B650B5F304681E99E12712ADB5E3586106B28C19B46D55 + 4D5A4870D50DCD9611F7237F425511837762E0192AC419E2B33F60CDF2ECB420 + 3E1D1856E02F5DBFA6AC0F610B3EFBD83EC23F2A2E658F4EC5CD68CB5B68CFF6 + 091174BB71EF410023F06A4621C0128C6979204D65A63BFE21E7DC38DF13D20B + A41AE125F850FF69F2B1F5B4125548A87F02D341592665DE119FF20D402B621C + 9446639AE1B31F7FF9B1B3BFEA1332CAB2038EBDA834E10F56AE8CE84C71BE8A + 6E48F9EEBD079A0A765CA637529D26806A73D46BB466EFD574E50999F65E8F8A + C0A08D28F3F6D77F155BBF26CBC24E478BF7979D1012B705559089699AD70858 + FC2E0F4AF05ED631AC5B068BD2AC2700DF59EEBA9CCD7EF49F6B3BAFF31547F9 + BC9558E18FA0D87856F2F17158776F1C5889AAE7E6089DFA6B2B71A6C823B00C + 19F028C521D86D6E8A933176C363DAE90F1260566B45A8D4AF75689AFC2CB234 + 89725F84E2F91CD9BB50755BD07B80B0975CB1F29E590A99922877E90F328E7C + BAD59A3FF7F5E07D9CE3C12C5E4AD9CD8E0ECE5648651E5488EE0C6F32DBF457 + C484668CFA377C2E7DD5C5BE31CF12B771C740869517EC7F156EE966F8ADA714 + A46DAFEF7FA3A7AF49F259A5CF200243D25DB34A15DD00C7E06BAF9DBD4EE17F + 5BD830C7DBCBF7A890E9406C943D4E086160B6B859F487B763E0BCBFFB5155A9 + D90F25E552A84B4BA7FA10568663A9D80353EBF87877ED9A79A2E3B815E348E2 + B27BE1DA6702092B134CB7026A595E1C2A75087846B3B8A1B3ABA608E4F375F6 + FCA9C952DA86F0421DC54C9AE27B0A2D3CDB217018F47927F74C4773F8F88D34 + 69ECA096530B072BDD6B136BAF2D254B1291310287F591377D429FD65E7318A5 + 7B440D0A161ED03634AE380A04BDA62CB8F03492B1BDBFA1CD172FBA954302FF + 226ACE7D5B7DDD8908B296033F201B8221173ACD176DE7F6F009390660509120 + 8920562BEEC05B592669A2178CC9D20A69CF22D26797AA5565861719BE16136E + 815E5EC7AE1C473F1A03CBB170454955A3F74AACAD127AC14B0FB307262B42FA + CD4AE7CA6F60BA3C4B3CF8B4710F4EC979B471865B8596B00BCF20490905E403 + AC81E09855AA4E79C870D3D33A7FEC2F8879B42B3282656B9B40BD15622B9792 + 964571A671BF71F369D9ADF7BF0213F01DCFC6A53565B915F55A374F85E77224 + 66449FE859396D519C50132C92D5219BA7DC7785B6604970897650B4793FBBD0 + 4EDE56D2347F43B0AAFE335095E8816CBF379A27C70FB01DD516941098A66FB9 + 278805AE5A24F9A1FE69B5C8BBB1822BB3C47C842F1CA1C89913BCE23EAB8647 + 15CD6660CD3223FE616B64964791E703522FFB85DFF39A92A641330239049C68 + 53D2650B8E0B1BC9D7332B7E5EF571724558F329110142B04D699834EC68D519 + DEB22CE4733C50005045B520B038C6C6FA4102FA4B5F1B4CF0FF777C0D1613E4 + C648CEB54034B42E041BBA3A68BF0A5337E1C8B1C105CF0E347ACC8514BF65A1 + 3976A303A713E2E502C5C62224FC4BDEE6BBEB425185B6557CBEE81526A8E707 + 7626D1663B7F1DB8EFF63157D29B650B2E1584D86792F1F1CD0F331CD226BBD9 + F3303FACC384B5C40B909268402DEB37C5A9860F6B939FA15C4B5EAC786A7DEC + D58E647ECEFF2EABECAEA0F05D249F89C30903ED5E686C2E84F345242C2EDF23 + 9253CFEB7DC01A43F0C0B46640E81533884633D211B74FB3A5D0592F8EB94819 + 43C6A5E660FFD8AD40E0B1E6B50EF4AFF828E338DF3AB9C327D2E516C86C178D + 6BEEEEDCCF8B32905CADCAA1EE12375DDC6EF30733EB90A5EE66A83B28F2C00D + 4ABB2981DA254177A50E362CC3FAC83037F9BAE515666CACF14A01B9B57B595B + D5A8EAE08C0A42DD48D42910E30C35867A819566E6F048D3B909EBABA159D267 + FFF4C55CC12B5A5D876FF7B0B032012E593FD5265A467CB2DA7C5586CF1BFD78 + E9A4B066C058243FE56C5AB4379AA453E72541DAEE5973CF463EEB87B6B50295 + 54CBCC1101058CAA7F5525350370C064B92BEEDF23A08CEBF155F1D2E8B46C0A + F245F44EF179505F57FB4CEF271C5826F00F322F59A4684B3D8AFFED411B0957 + AD7CFEBC8153328C043E8D53B8E40D92E51A437008CBD238089FE575A44ACC24 + AC8F5B1F6B25B92BEB6762D7CB80C0B0AED644147507DBE05349DE04DE3AA7A5 + 40C551BBF099B46FA74D0B0FE8872D994788ECF772CC65385BE59758C95AA150 + A1FE1BE38C8675D272A6334932365D629F675DCF3EEB6F1886547367B8A5A39B + 8906971D7FF412F2C53448783031BD9CC109CE450DE67E29BDC39302C18B0E7B + 1EF42B69BBD957D94AD70BFE77330A257111BBD261607B5B5778D45CF3663441 + 1FE4EA373F542C2BCADA91FBBADD68E69FD9AB7E999482307476A7430D319565 + 41A371F660BFFF00AFC9B46981A948384B2A83B1871711F6E82F732540B897D5 + 51C8D6A9647EF43CB31E6BAFC00A25429E5BBAEDF70879B764A7645A106A7142 + 22ECC5F6EF95748862285F407F1CE08C8A086A09A58C080049F2318D2B392F13 + 454C7E10B0D0E15D75B3A977F8ACF1554208D28B63ABC887A65D69EF5B1EE4CB + A4F06D3B8279AE97AA36BF9B16263675ABF8C378F9E7DF4CBEDCC03E705C34DA + 374DB462EA99CCCC9D1FD2CCC7078D06BE46CEBCB659B9FD88CA44CEFA9A77CF + B11BAEC9C081D337553912F8D58A50F4A45C3C7503195A5AA10E22F78AD21CD8 + 602827A464F9805FD00C2AA4199E7E9B33923A0AC6ED203E5E58CF826E33CB4E + CA9337D39F6EE56BBBDD2F4BC3EB27ADCC217D6EC79F6841DEF9AE82810337A0 + F52E0193BB62128121EDC27DA1DAA9CC24572692E56F64C23617F67A8441F3EE + D47D5C1CA56590DC0531B75B5EDE8CF4413E60CFB868BA9F0D27FDF7787BCDB8 + F13F0C5C9F9F749A1CCD413D7ACA8700FBA6ACC9AE5D0C4EC73FE3FFF8A62C64 + B9BA399984BAFFB3C4287F45BA311C921020FF90AD6EF89D5272E2EA96CDC444 + 7248B7FAB06436DB95463368791ACC30B8897341B8DB33618368AFF5A5A73D1B + 772D43F037194882F5328B468B25C3728797471E3261D2EEBA1EBD69EBD86D6B + CE26DBDDBEF15AFF62827C64452F841926EEC3524B640826374A80E410719EF8 + 97A039E25439C17B31AF2370C8D498260AC5505FFF2060521113F6A3E29DAC4C + CF283021F4DD6917378D7358A5D03DDBD95AF4DE7CF10DBA767AC100D51C0B8A + 2FD58767610FA2ADC366D39E2C204450681DBC3FFAC765CD5588CC0A1CC9479E + 6822B2D1CD785D700E2F4684A2167B584E257DF53E681D0D25E0ABBD5E281A29 + C24A997172D00143D55E112F4974DC430E967731B2B9D940C3619FED976F4214 + 7AF362DCF85774746000B34A462A998DA8200B5A3852D2B6C1EB336F12026693 + 4A664EA7AFBAC4DE16A88D4AE27AB15893C4DE003721452B6F77D36CEF86BC90 + 3EEB4FD4B30CD23BDE3BB218351FD3BF0B5A89866F7EC4A40EED6793D0C62EA3 + CEEA3507F5C04D38411BE356472BEC194B8493F5018C5A255BC4FF97317D4E8B + C425306093B3B3C325B317137C2336212106787C8BC9E6AF6E465E35E6B8DF41 + 28C1BC138E89009519603C7C2FD1BD5C6C5FE490E298568FCC60A331CD299B61 + EAAADCE321B4BE8A14574CEFBAC8A8900E4F39FA1D0CF0408CE67C77F08261B9 + EFCCEF71173A64AEF366A42C300AC9B4214DF25995BC5EDBA90FCAA3F0756932 + 19796F29D81D571954558F9A0D64850826BF40263E2C5D0DB44C0F9F078E4073 + 2AC87EC87AD89178901A0D34B33A19E053EC098B3150DCBF9DDF287816FE9CC4 + 8ECF86BEFC30F3E22C618286EAC6C36EBA595B51D1EA66053A1B6D2A2F01FD96 + 408A486483646D4DF996F0B519CC273E59D7AF7473BAE49026BC912216A17D76 + 9A34940B2BEE1DFB2ACDD40BA3170BC4D02B88485ED47D964AAB67930A8066FC + 2575364ECF3C0B01DB2FAE3237BBABE481753CEF96CD37141413878C33961F4E + 8CF6278915F5410767A2957E5D3169E3D75DDB7125727A8C0F57AB119C69DD40 + 7E52684743BBD00C4DB517F5079F5B24F2AD4778BB7D4E681E841FFD534A1E98 + B1D138CD9CE880F0871768011D22322292FC060D30380A23783E6F31C078B09D + F57685CDCF1E0E113D23152EDFFC322594F9DFBAC141541C2A83B5695F176E7B + DAEFFD367FF69595919D74A7DE97990FE8263112D3390D4C146125C078F89398 + EDF6B6304858C5DDECC065FFBE03E3BE4C7D1B03494CACC5FF40BA7BE4B8C288 + 62F17FFD212FADAB91D552F999F1F63D0062E3A8F722F33A442E3AFE5AF5B942 + 4B40F79A069307D5BBC68A29D1065A7C025F92C10BC6FA93029D86C618BD6D42 + F9F02FDF6E0650B024D9E82EABF5E8566B306AA75F58898137096A3F201912E4 + AA53440D726F3A8483363104E1C1831EEBE72C1C65335DCDBA00CB0ACF624BB7 + C16772AC7114ED7D5BCCA84ADFE28597D6612D1D16C99992F5BCC82EAF285B47 + 16F8A6DEC91A50E80373406446229975939E5278FB870BC4D5B981A3D4D1DE60 + 597854E1B6A78E66AD7392AA152894DBE57325C1BD90BFB08CDB0881A9BC5662 + 80EED3C4E1845F8905960AD6718E81552EDD94383577773F25E1F6CCAF12FAB4 + 15CDB8B94052C9F430875D63957CB4F102F8DA43BD56D6BA96CB67488F6435A2 + FFFF9D0F6314376B075D7923F749FE1FA02E89D1697A12A1C9C10F947B0F0A71 + 3C0C98A23DA9E4749FD25C4179194051191DD03F4A9D677271EEA5DEDC8FC7DA + CC3BCE2DD71A6453917C3BF0EA36DF5D9D8870541EDC17912BE51EC86D31FFBB + 7ECDAD7E3BB0EB2D93F6DBD8CEF95836CD1C4AB38BD6E6090B96DA85B9F517C0 + 21D44C501727FB90D70D9DFCFE034D0A4643730FA162633656302385BF79B31A + 0EA0801512008BCBC8736CF01AE382149BE74449711CC0F181AD08DC07298B41 + 7AB2DA7CE18533E4A9503F193A659ED9BAB67C7F150BA04635251BE1A626B6B5 + D4241E6CFD2EE1224C3E818582D082C6F73A8157B3C2F2B037C8325FD875400A + EDE69B3882A9458524F0B5A9C10F47398A9B98540BE2DDF736DE58395D51A1F1 + 9343383CC77B82573BC56730A221C48CC17C4553B05BD631077257C5C3CC5E03 + DE41E12DCF9856BD5922E697B80C854890808D91CB4A403183D04AFB1D91FADD + 7F745309D01C58C078EF5A22589500A1F82A580A71028A9D3D9CBCC13381D6C5 + A6684FA7ADE79D339C824230D15EE191FE74EC6907CD3AB70D0B7AC68072FD69 + E7566A8F5F325B61C84D3058D245B61740D8B17DF73B380C1936F71691BF8CE3 + EC0384B626334C850A2041F6C9FDE1E9999975E5D41779829B817DC683CBA598 + 48E78EF9594CEA1C1D0673EF83239157636AB5A76F173200A3FF0746E30C7C46 + A77C4F2F542B1D9B152D11B338636828504DADEE2A6FA6903EB56DD5A77D1499 + 1A48DD4745659C90FC75D065D0E4B6080769095F16017A4FE5553DCC74D80DA4 + A7C352A5E6E5B66493AB0325BA4D562CA35481003D01EF6FF6C417764188B010 + 3156A2BCB475DE8C79542BE2863E5408D298983350B9932177C5389B76B66FB1 + 6A449C9285CA4B819FB99914F1D163F7B50912843A39F81AF60E0973C40F43B8 + FFA331CAB4D9C493C98234C330F9CE5A2F5D4BD021C10BB197115999FDA23A61 + 97F973843B40210C08AF43559070D09B9B6F0BED0AF1A7AD1D26E74402B92A8B + 6A0E92240DFD38C37E190B5B670BC8AF08727BFAFF2DA93F3072C36A005A914C + 739673EE6BF33FEF3EC4B0A294816011BEE7039C6FC82E9306D3711B9F0FD7B9 + FDA88801B916D069B5875BCF853D09C91BE63723928CD8A12EF4898910F61090 + 8F1719D323716C8A625FA25BF896C315AEBABA554303F46B9525DE7790AF0998 + 12841D7F967360B55C523F12C732B0B3181AC6B5768568E0FD53292DECA6B499 + 27ADBA848AC163C0BEE7558184C29F01AC14ED54BCA98E8A673DDFFE8145607D + 2B0C9F33ABF381AB8D6F47A76D7550E0F6CA6D49747CCDC3A7E45982404A0C78 + 0FFCB2257CCB71ACFA024A0008BFBF3B884EE41D1F9B39EDC4A4026683CA2067 + F1F599DE3C002218F48D38FDA394A841C2AF3B4AA6399828AAACDCB7E833B7E5 + CC602662F204F5BDA78935BDE4AFA6400338966B3A9D02D1233B7125078892D6 + 113C908FEBFE8E7FBD1A9D37834C114C26C38D01A2BB380E17FF8D65CEBC8695 + E2BEA9E08F1EC6C3256B35183701A8B565C646247FD3DC31C041D863D6015A01 + BD66E1A0B7783B9514DC75C9D25FCE7073ED6D796B80D23F602409611BB1FB0D + 325CB94C1CBC2FF49D3067B20B58E38AA67F75987A62354AAE04E53E9EAED79A + 076FFC79214E25E6A3BE79DB94E31246AB373669044F4A04D25A5EE1C0C3F2F4 + A99883EE2694AD494AD95A76665E2CA9C32F81D9A18F0271BE545ACEE2856592 + CB3FBD47844DAE2CD992D7E8F9823008B7D5A1D54A699B1E21084A935EB91870 + BEF490B176801EE3FF1B0CF5EF529511B4C9ACBEDCF9B0D2E1492C6E8A417A66 + BA5B70A8A5EC603248F2573133CDA97160FC6F37854963D21ABE77F3538E08E6 + 149C98380884452A2C831D9751B28F7D9A2B66625AFB9C270CB24F4F4D9EF98A + 350A563AB6870DEDA6DF5A1FB55F12E5E1F345AAA2FDD5DB8A65D77C6EA56D26 + 6EEA82880A782DEEF3C6CD889DE76CD879676D31DCF8DAD04F5DD199B7DF8D32 + 9262FC346B6D74C7636DC7662F91FDEA7F9B12ACF67F2701492EE4048DF22184 + 0FA882B8BD3D3D4B42491B726D59797B7D8D2E406DFF53ACAD7C8E1E805C6F58 + 236FCE5D392A2E009402261C33326641C56974DA66F9CD6C4803F825C703AD88 + D1F134336D69068771706FFE35F0C30D32755E97697D425E0DFD81DEB9A60D07 + AF515939FFFCD96F1B1F0A1A09F5FF89410B4BFDA312F53197D6AD44E4E81D7F + 253566BEFD684A19FDCFBFBDD87BF3D8EC15AAA11DC98D807BBF91FE6A63F2D8 + CB32AA593B2A271960D10ED3858F3EE929BFB6963DF2BDD4F57890771F262861 + 4B32758FBB163E5745D793C3321C1A18DF914BFF37B57DBFB3C4301CBE812032 + 65870B75F41931614A729F52BE2E3FAB7CF442120B58D6E7BAFA1A39D30C4EF3 + A2453EB3D5A9BC08607C59438787ED9822A370343521898886F54D73CA54CE81 + 5A3C0DE2B5E0F1C9F9ADCDDD1B42242562680DCD6A688B0AE334C66F17661542 + F03DDCCCD64E9586EDB8AA3D653144138E4E4D9A90739700A231909E51EF9F58 + 45D87D0CAEF5C1CDD98608C2DFAAAF732F10BC36EABF4BCBCD635830948BE8CB + 357772A871E4172E4946DCCDD04C044FDB868C5EC1EE6E96817D94E8F0B5B017 + 2959E569FFCB5D164B10A9EB7B94522C3BDF2957C721847BFCF7DA77A1CD242E + 2345B46759D42B18002E5BD6E6CDF8F7B7DF14D8B4B7ED0F2EC44BC58EDF435E + E930D065A7F6D2C7013E0411394C2A77F3C4D091E0339E08ECCD38F3CC4291AC + 4F17E959F0E49DA2B52ED46CE35E8E396D1D9C8C2B0615195AD4AF2BE5696C82 + 72632F6EF88083D6A269377EB077098188C96F738770ABA5A5EDB5B563DCC9A9 + C0C7A5C725803F9192EBC35A96F1AAECFF25F64BA4A565E2DD064A0E1BACC9CE + 60EB7281F7EB173851246B8617072BD1E66E134F519E0F1E404F27219AF71AF0 + ED27A4C9F71D6AAE1458FD394286A57F9E44C3C44184FD71094493EB93FBCC37 + D95640004D5B5F2E6B0C88CC9624241D3FE3041266F349295A346779B4677C80 + F377DAFA6C9A92FCEEDD04F71E370B287CC3D330CB1988F69EBF880426772809 + CE104D285B626CFC15643DEBB8844EB1E10F9B87FF6F66DB46CCEAC261C23807 + 38FA8DA37FF154A90F1E3CF889A2CA6C66B8B2FFF2FCF0B6DD2C718543E9B76E + B8954A9D17AB6659A0D3150277FADE660699413D89DCC5D8F2F45A6D592A302F + 655DABD5F88BE437428D96A53D67D19671BA6660D628FE989A0E26451D769940 + A88C13DECF306EA5B2FB448B43648277817A55D4C2E81C5868365F6C612C7A53 + B5C741C39C2EC58BC9D1BCAD7BD99268AFDAE014C811DA2473556FB50B6B0518 + 3C27AE62898209EA05A0F07020574E660BB339A9CA7B8A2AC68CC5ABA31EFBF6 + 4EBBA04B291CEF7971193DE1E935E1CAA8DD81D23EB5E9AD1348B204AE7C316D + 99421EE9F904A31FF491DA3465FFA4D4AC545FDE78738FBCF3607B146B8840E8 + 418E2A1A5F749AE01FFF32B695F61A20DF8169EB83F54F5120E29C6FEB50DDCC + 9D53D37295B798958388A0E2135CE6E06B21D3ACD1047287A00128298F931B91 + 0103AEC5DFDF838F898E84574D0E05EE8D08C95877CB86912425E6E3BE817408 + 580760D95F86227254D63388754302819A9F900A28F9F2D6A861ED36283E075D + 2DD606B284070E537C384FBBCE26B6BAC082C8D97C23104D5646EFAF7D7E25AE + 678B777D6BA675F78C9AA10D3CAD8FBDEE445A988CB2D8C2A267FF3175E4CD3E + E553449793A4737CBF8E25EB2B6DA7735BD11D050344E1F71295802B0D716799 + 410F391BBA38B5285EB85A92E3A2F4F7DE940D95D720227CEB46E00D635A8197 + DFE053D0B93C4DBF47B501DDF9950F2D3EFCD3CD6AF835CA4B81D6AF9BDBCFD1 + 64598AAD45E5AE436F95A7BA8C8CBED550FAECD75CF3EE8D0A654489ABC5B9CB + BC8595CE2E23A396FC467798DC61DB826316AF739259BDBD49C1A4DD14B8289F + DA880CD88C18B1285ABF35763224E40B87A5EAF714538ACB5873F28B1E715BDB + 21303ED5B40BA3D057F2D215D1A1B40626F8244C92932F78E6BDD789C06E2E44 + F2C8665B8306203D16A638A0AB7FEBA955CB1BBD1817C76F87477A881183ACCC + BC90304090510F17197F2B3110A5FD76D828603CB217926044498866562DFD5B + 4C887EB20FA90C0B9F4B33B74CAB76593296C9E1FA9830BFBA909E48854B42F8 + A06BBA84431900E0AD3D1947EBD145824936EB94453B1C074BFEE73069407147 + 5A159802DA0A366827ED9BC75683FFF40B5D75AF58D70E2EA5FE3864C219AFDA + BAD5C60A3B2AEA907F9ACF47BE50348E94F36F706CCB5A61C1EE7EA7C5A2C6FE + 5DC656AEE91174442DB79D3C3764FD21CC82A9B8F9BC9772D4E3F9B5573277D6 + 980012C8BA4C63EA2861A37A23D41A924BF08EA6C2682CE5A4F1B82D493139EB + 4E03125C84232EE11C7829DA6C886D77006F1FDCF479F8C6ED2B9B04735D5CB0 + 4A96153250DE03A29760A2FB7784CE214908B4773581F4EC4BF09FFD65F29E59 + 60760474C59BA9474CBC2F7C1AC8A849562F4DCA4105EBE29F23304489F97B67 + 733C58C2E8924EED9DE7E68F8CA61E7A0145B75C3ED249507531A7427E142705 + BF45C934DDF3F85B7A0F3E5DB96A02B265938028B46543A45A67EE3278190C53 + E046D763A6F86FEF962D6C30101D2D06FBEB5B426DF0FDE54CADBA492228014D + 3916AD26205092E5F5B3AC4F70F2ADB9107A3D9BAC651AF51A40D8B74BE3A93F + 72D6C0AEA8315FF45AD0D3A86FFFE5A8E6DDB2393A393FE015A2702EAA92D630 + 115E7358EBFEE3FA1B9D9218C115FBBF76C0520031A794B831C363A9C912254F + D86D028A8EF1ACEBC567FB31AE26CFC0DC9A55CBD975B4799DB899CBCA006BE7 + 6A671CA04983F4BB67EB1C5D14A82B3711087F6FBA10258CD318E03D35A49D97 + BBAF88C86D7EC90853163514AB02C6112125370A4880F94B7ADE4B1027CC65CD + 667D6AD254E2593C2F00099F423527BB180380CD41D007F5C3CD4ACBCE59D3ED + C97437CEFE0E4E310DD9A5E34ED1986C92AE9B7CE083384B37FC03B4B1FBDED2 + E14F139351ECD1C0742A2B8555349D79CEBCEAA2A1B56A1B1FD6A3B82DB47949 + 9AD783107FE4CED56DE3CDF46217DDEEFD7D2A39D9C8485F00922AE866F9B364 + 2F815E58D125727CB26CBF0043AA7071AC45F9329C9B8F00F0CF45701C60B6D0 + 9689A65643DF97365BF3EB747773A1ADFD02FC9721737AC2F00C4FF22F546E2C + C354B199E55CD3D7846A8D1759C35D0803BF876D845C454CAB711B39C1CF3E3B + 790D713FAB9439A13AE0B119812E4FD978A6498947C432A05F4A49556523461C + B217424DBE8D1C2EE7CB4C1755A96BF71F9A668E41285DE8EA87537D3751C397 + 116B40D7866B2CBC0C8DA3E9E8EDB10F42F77C73B98F7D68283CE323CCB36CF6 + 59B44153C994FA483F8369658A62754A56C2E1B66E76998E7C32201B6403B186 + 1850EE877F56D175FA7395400EFF76FA8FEC7E50854F493316E8311BEFE34CA2 + 3ECCDDFED7F9D0C3E387474EC1DFF9928C18368646026F0BEC11732A6EEBEC67 + 6E50F14C3FEC9205BF01988437F0E32EC84F3C2C5CC68C85AFC1D5E6A4CF5790 + 373E480401903055D2865D3069EBFBB75037FD74A0E5DC17720BBC2B900A3EC5 + D5AA21251FE3918E3D2B8FAC02272B8861B3D65C1CD287B8C483BE7BA65AE9C2 + F9F4A09F806614B70365472385674E516663BD6E7E7220ED7CBC2E5AD79B72B5 + A99255D300636C24B8AB799F903C0E06F49DC00A78B8E540547F96F1D7CB328E + 4A8B533E5159C142A3F0ABDE3369D42A465C82EF5E01CF18D166A4E86FABD95A + A245B4D43C647310CAC5042FED03267EBF81ADB40E9E2D4F41194DAD6DC1E37A + 6BC7C00A28506B5FA9611CD8A167268A991172B97B40A898EAD22077DC44B945 + FDB8AD4F87E8023FBAD44DE025F05877D81A61EB0272137BEB7ED4952283268D + 6489BA70BA0825F5F13366B33768E3194A06B7D53DDFF3113B36CF0DC6A71F56 + B6726762B236F988DA3D8F40FC97906995EA46A306FAA174C7157EE7F21009CF + FE78D783A698108536D1CAFAD4155B30D6C7F655597E17522EAA40CEB0BCF267 + 4202ACBB86D59E2A92166B8FB47B2A6DCC3223F6AE4DFF8AA68CB7DA4ABF65DC + 5DC977AD81D7085FE052E661795F556BA4959F54CBF2864AB96241DA06BDD40C + 6C7147AEC6DBCA99516166DB3EB2644A62708779C23AF12B2C628901BB3170FA + 4E79800154787DBFA92E8E599485A009170C2C4AD5F065F71004A59445635BDA + E8FF885324CAFA11909FDB3CB4E2C44C0CB4AE26B63EEDDC518178597F244081 + D5B2DEE2300A51C8B8B510D667AF90DF80BDA9CD1278EBF007D2536D96E45148 + E0D8380D9176219180E3473A3EB2FE68BFBB52A70EC937E9D3FBCCD84F27D837 + 73C9F5A94EDCDCA87F541EE9A13267955E80A6558AE7D4D39B29F1EF549EE1B0 + 51980E27B28BA43972D37771863F4A9FCB14DD4AE6F367EE3E474042E4702358 + 6AD9F0E046A12397D7800BC0D31E710CCF9F7D97ADF0E2E018C6CE59EC8C8EF1 + FA2E1CADD83860E0D80F1BD06F203F898DEABA47E4BCB7A7E7DC31A61ECDAD1D + 06E66BC130DE4A2A23CC99B7D1C43448DFAB8F906D3855D61B2A46E6C1621ADC + ADFC817771707C7B762DBE73CC7E3972A89284C4F8E804A6B901D856CCB80769 + F5ABF020D5CDB10EEEB5490623C0435A16AAE8894136BA3E31F126EE78E0C8BC + A5FD518355C1736615E0E15FE5C8BD98A91FBB3ECCAB61A739212C4D2B878BFB + 111138C1575CAC87F14D3EC5163A92E1E3AAB9262A1747BFA2761F0F810EB355 + 3FCC4C2CD357835632AE4E5B27891C562C3F7D4D0B692E33F73FA871E4899E42 + AB9D40FF36D019BE222C8DD68E0944ACD642E5B0E2636BF11269E9A95909361C + B4943296B2B2DB1592D4F6DEFBC4B1B71D9A1A3E9BDA8A71A461569E6F6655ED + 0B3BF5D489E4550C5C9B517A42E26266B0738E3A9B56798097EFDDC02F138781 + B904452FA2A1C4D2BFE8D7F2EF0F9DA1F78FA1F3C95C044F820CE50D64DFB592 + 9BA23B80BF61195688D8DAE00793322AF789AA18B77A4BFE2121FAE31318054F + 252B4D43E2D95F9EE8651547E0517A000EA7CDDC01F90699C9E9B6811C73BA46 + 88EAE94907FCB5D8CFDB026D2788C3C2C1F125A1AE199BFEE87A816C754403CC + 66F5ABA1339438F228F5046F41FBBD4D68A82058602528A2AAB45CDDEA82BE69 + 4D0E0081D9CBABA174F6A871CDC42A9630F2DEFF0824EE2D4E1A33BD09825093 + DDE75F9A27FCD28FCB28FC02A678AED604AB23DEA5925D73127F2BC2943FCE6F + F32AAD928D7BCD88FFD961E8DA50C41014A4975934D96E203DFC0D3445C2C89B + 0C0E27A8ED7C754ACD7C7FC142CDC08A8A2F4E774340A8CFB55910D7F35F1FA5 + D1A02889B69ED9481698D9C2E9179A7D45BF678BE1F9EECB8D9366564ED5DC99 + C82E056B082F1350BA389857EBCC9499FC84EA8F69A2744D334392918D715CA6 + F92437AF9B0C8BBE1D105CE2696DF6DD87C81DA9E9957D84FC0E8985F6BC81C3 + C6726AE0E28F693F56FFD370A71F826FFEEC21EC7275604F7F9B2A8AA067523E + 21DAF1C5E45E06661A6A111907123C0F8AC823693BBA60017DD743D0C061E91D + 0093E91DCB5BA63024AE519423AE086EF048BF44B43A6108A988B4C1E343CDDE + 4864EBC6423FEFB48E9FE18930647622B664D59F80B04A9621C05B5ED6574694 + 668F6F255963FCADE0CDBCF3DA24A00BC42C634BECE069A90BF73EBE07F03F6F + 76FBCEF1A001DE598B50D9D0C85C793F5BC70ABF479FFAF51D3C766A02A1CD7D + 9850F107D585B698B5850F8DD6CD5F3D8AA7E6CAE31716CC5FE64E759C6B8743 + BBD93E8F5674CC999D1E21B5988B055EFC864C7E1E6A71D20B4284DAC8CDD087 + ADF9AB3FC77C6CEDED60FF8F36CF3F706F8BBCD834F74FC543DEA66AA7D486A6 + B7A127E399E22E429C7F927DB82D5D64F336D9933952884E7BD3C3E7A8C5B511 + 936C07CCEC7808CB64FFFCFCB899FEFC84EEFAAE1F52F5E49F1C151C57A4FA13 + 3775573BD150C3C0DA86A9AFCEAE297888455E86FBC254BF3A67C9AC7D682204 + 7613EFC8FA15DB8362F79377F9FC395FDD302CF2E2D60D921C7E191E4E78B714 + 65084A88467C3C2CB790AD3380018E095EEB27B1A9186D69785650A51993CB25 + + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + /ArialMT findfont /Encoding get + dup 32 /space put + dup 33 /exclam put + dup 34 /quotedbl put + dup 35 /numbersign put + dup 36 /dollar put + dup 37 /percent put + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 43 /plus put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 59 /semicolon put + dup 60 /less put + dup 61 /equal put + dup 62 /greater put + dup 63 /question put + dup 64 /at put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 69 /E put + dup 70 /F put + dup 71 /G put + dup 72 /H put + dup 73 /I put + dup 74 /J put + dup 75 /K put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 81 /Q put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 86 /V put + dup 87 /W put + dup 88 /X put + dup 89 /Y put + dup 90 /Z put + dup 91 /bracketleft put + dup 92 /backslash put + dup 93 /bracketright put + dup 94 /asciicircum put + dup 95 /underscore put + dup 96 /quoteleft put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + dup 122 /z put + dup 123 /braceleft put + dup 124 /bar put + dup 125 /braceright put + dup 126 /asciitilde put + dup 161 /exclamdown put + dup 162 /cent put + dup 163 /sterling put + dup 164 /fraction put + dup 165 /yen put + dup 166 /florin put + dup 167 /section put + dup 168 /currency put + dup 169 /quotesingle put + dup 170 /quotedblleft put + dup 171 /guillemotleft put + dup 172 /guilsinglleft put + dup 173 /guilsinglright put + dup 174 /fi put + dup 175 /fl put + dup 177 /endash put + dup 178 /dagger put + dup 179 /daggerdbl put + dup 180 /periodcentered put + dup 182 /paragraph put + dup 183 /bullet put + dup 184 /quotesinglbase put + dup 185 /quotedblbase put + dup 186 /quotedblright put + dup 187 /guillemotright put + dup 188 /ellipsis put + dup 189 /perthousand put + dup 191 /questiondown put + dup 193 /grave put + dup 194 /acute put + dup 195 /circumflex put + dup 196 /tilde put + dup 197 /macron put + dup 198 /breve put + dup 199 /dotaccent put + dup 200 /dieresis put + dup 202 /ring put + dup 203 /cedilla put + dup 205 /hungarumlaut put + dup 206 /ogonek put + dup 207 /caron put + dup 208 /emdash put + dup 225 /AE put + dup 227 /ordfeminine put + dup 232 /Lslash put + dup 233 /Oslash put + dup 234 /OE put + dup 235 /ordmasculine put + dup 241 /ae put + dup 245 /dotlessi put + dup 248 /lslash put + dup 249 /oslash put + dup 250 /oe put + dup 251 /germandbls put + dup 0 /onesuperior put + dup 127 /.notdef put + pop + end + %%EndResource + + userdict /pdf_svglb get setglobal + end + [/N8/ArialMT 1 TZG + %%EndPageSetup + 0 0 792 612 re + W + n + n + 5.03999 4.79999 779.28 603.12 re + [/DeviceRGB] cs 1 1 1 sc + + f + 0.23999 w + 1 J + 2 j + 1 M + n + 53.04 597.84 m + 783.84 597.84 l + 783.84 107.52 l + 53.04 107.52 l + 53.04 597.84 l + h + 0 0 0 sc + S + q + n + 53.04 189.12 730.8 0.23999 re + h + W + n + 1 j + 10 M + n + 53.04 189.36 m + 783.84 189.36 l + S + Q + q + n + 53.04 270.72 730.8 0.23999 re + h + W + n + 1 j + 10 M + n + 53.04 270.96 m + 783.84 270.96 l + S + Q + q + n + 53.04 352.56 730.8 0.23999 re + h + W + n + 1 j + 10 M + n + 53.04 352.8 m + 783.84 352.8 l + S + Q + q + n + 53.04 434.16 730.8 0.23999 re + h + W + n + 1 j + 10 M + n + 53.04 434.4 m + 783.84 434.4 l + S + Q + q + n + 53.04 598.8 m + 53.04 106.56 l + 783.84 106.56 l + 783.84 598.8 l + 214.56 586.56 m + 214.56 516 l + 331.2 516 l + 331.2 586.56 l + h + eoclip + n + 1 j + 10 M + n + 53.04 516.24 m + 783.84 516.24 l + S + Q + q + n + 53.04 597.6 730.8 0.23999 re + h + W + n + 1 j + 10 M + n + 53.04 597.84 m + 783.84 597.84 l + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 0.959991 612 m + 0.959991 0.959991 l + 788.4 0.959991 l + 788.4 612 l + 214.56 586.56 m + 214.56 516 l + 331.2 516 l + 331.2 586.56 l + h + eoclip + n + 0.959991 w + 0 J + 1 j + 10 M + n + 53.04 107.52 730.8 490.32 re + 0.501999 0.501999 0.501999 sc + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 53.28 107.52 24.48 405.36 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 60.48 107.52 9.84 398.16 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 98.88 107.52 24.72 288.96 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 106.08 107.52 10.08 281.76 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 144.72 107.52 24.48 384 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 151.92 107.52 9.84 376.8 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 190.32 107.52 24.48 380.16 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 197.52 107.52 9.84 372.96 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 235.92 107.52 24.72 74.16 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 243.12 107.52 10.08 66.96 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 281.76 107.52 24.48 165.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 288.96 107.52 9.84 158.64 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 327.36 107.52 24.48 209.76 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 334.56 107.52 9.84 202.56 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 372.96 107.52 24.72 110.16 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 380.16 107.52 10.08 102.96 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 418.8 107.52 24.48 406.32 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 426 107.52 9.84 399.12 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 464.4 107.52 24.48 110.88 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 471.6 107.52 9.84 103.68 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 510 107.52 24.48 397.92 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 517.2 107.52 9.84003 390.72 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 555.6 107.52 24.72 395.76 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 562.8 107.52 10.08 388.56 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 601.44 107.52 24.48 392.64 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 608.64 107.52 9.83997 385.44 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 647.04 107.52 24.48 342.72 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 654.24 107.52 9.83997 335.52 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 692.64 107.52 24.72 345.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 699.84 107.52 10.08 338.64 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 738.48 107.52 24.48 361.92 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 745.68 107.52 9.84003 354.72 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 63.36 107.52 24.72 405.36 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 70.56 107.52 10.08 398.16 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 109.2 107.52 24.48 297.6 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 116.4 107.52 9.84 290.4 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 154.8 107.52 24.72 405.36 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 162 107.52 10.08 398.16 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 200.4 107.52 24.72 384 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 207.6 107.52 10.08 376.8 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 246.24 107.52 24.48 110.88 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 253.44 107.52 9.83998 103.68 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 291.84 107.52 24.72 167.04 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 299.04 107.52 10.08 159.84 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 337.44 107.52 24.72 391.92 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 344.64 107.52 10.08 384.72 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 383.28 107.52 24.48 180 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 390.48 107.52 9.84 172.8 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 428.88 107.52 24.72 414.48 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 436.08 107.52 10.08 407.28 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 474.48 107.52 24.72 347.52 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 481.68 107.52 10.08 340.32 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 520.08 107.52 24.72 397.92 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 527.28 107.52 10.08 390.72 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 565.92 107.52 24.48 395.04 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 573.12 107.52 9.83997 387.84 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 611.52 107.52 24.72 330 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 618.72 107.52 10.08 322.8 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 657.12 107.52 24.72 334.8 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 664.32 107.52 10.08 327.6 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 702.96 107.52 24.48 334.32 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 710.16 107.52 9.84003 327.12 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 748.56 107.52 24.72 368.64 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 755.76 107.52 10.08 361.44 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 73.68 107.52 24.48 414 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 80.88 107.52 9.84 406.8 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 119.28 107.52 24.72 234.72 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 126.48 107.52 10.08 227.52 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 165.12 107.52 24.48 163.2 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 172.32 107.52 9.84 156 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 210.72 107.52 24.48 374.88 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 217.92 107.52 9.84 367.68 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 256.32 107.52 24.72 265.68 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 263.52 107.52 10.08 258.48 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 302.16 107.52 24.48 81.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 309.36 107.52 9.84 74.64 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 347.76 107.52 24.48 179.04 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 354.96 107.52 9.84 171.84 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 393.36 107.52 24.72 57.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 400.56 107.52 10.08 50.64 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 439.2 107.52 24.48 339.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 446.4 107.52 9.84 332.64 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 484.8 107.52 24.48 63.36 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 492 107.52 9.84 56.16 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 530.4 107.52 24.48 402.48 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 537.6 107.52 9.83997 395.28 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 576 107.52 24.72 347.04 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 583.2 107.52 10.08 339.84 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 621.84 107.52 24.48 432.48 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 629.04 107.52 9.84003 425.28 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 667.44 107.52 24.48 407.04 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 674.64 107.52 9.83997 399.84 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 713.04 107.52 24.72 347.76 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 720.24 107.52 10.08 340.56 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 758.88 107.52 24.48 365.28 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 766.08 107.52 9.83997 358.08 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + 1 j + 10 M + n + 53.04 597.84 m + 53.04 107.52 l + S + n + 49.2 107.52 m + 53.04 107.52 l + S + n + 49.2 189.36 m + 53.04 189.36 l + S + n + 49.2 270.96 m + 53.04 270.96 l + S + n + 49.2 352.8 m + 53.04 352.8 l + S + n + 49.2 434.4 m + 53.04 434.4 l + S + n + 49.2 516.24 m + 53.04 516.24 l + S + n + 49.2 597.84 m + 53.04 597.84 l + S + n + 53.04 107.52 m + 783.84 107.52 l + S + n + 53.04 102.72 m + 53.04 107.52 l + S + n + 98.64 102.72 m + 98.64 107.52 l + S + n + 144.48 102.72 m + 144.48 107.52 l + S + n + 190.08 102.72 m + 190.08 107.52 l + S + n + 235.68 102.72 m + 235.68 107.52 l + S + n + 281.52 102.72 m + 281.52 107.52 l + S + n + 327.12 102.72 m + 327.12 107.52 l + S + n + 372.72 102.72 m + 372.72 107.52 l + S + n + 418.56 102.72 m + 418.56 107.52 l + S + n + 464.16 102.72 m + 464.16 107.52 l + S + n + 509.76 102.72 m + 509.76 107.52 l + S + n + 555.36 102.72 m + 555.36 107.52 l + S + n + 601.2 102.72 m + 601.2 107.52 l + S + n + 646.8 102.72 m + 646.8 107.52 l + S + n + 692.4 102.72 m + 692.4 107.52 l + S + n + 738.24 102.72 m + 738.24 107.52 l + S + n + 783.84 102.72 m + 783.84 107.52 l + S + 36.96 103.44 m + /N8 12 Tf + (0) show + 26.88 185.28 m + (0.2) + [6.71199 3.37599 6.71199 ] pdfxs + 26.88 266.88 m + (0.4) + [6.71199 3.37599 6.71199 ] pdfxs + 26.88 348.72 m + (0.6) + [6.71199 3.37599 6.71199 ] pdfxs + 26.88 430.32 m + (0.8) + [6.71199 3.37599 6.71199 ] pdfxs + 36.96 512.16 m + (1) show + 26.88 593.76 m + (1.2) + [6.71199 3.37599 6.71199 ] pdfxs + 69.6 95.52 m + /N8 [0 -15.6 15.6 0 0 0] Tf + (175.vpr) + [-8.68128 -8.68128 -8.68128 -4.34449 -7.80769 -8.68128 -5.20237 ] pdfys + 115.2 95.52 m + (197.parser-b) + [-8.68389 -8.68389 -8.68389 -4.3471 -8.68389 -8.68389 -5.20498 -7.8103 -8.68389 -5.20498 -5.20498 + -8.68389 ] pdfys + 161.04 95.52 m + (300.twolf) + [-8.6435 -8.6435 -8.6435 -4.30671 -4.30671 -11.2331 -8.6435 -3.43311 -4.30671 ] pdfys + 206.64 95.76 m + (bc) + [-8.59679 -7.7232 ] pdfys + 252.24 95.76 m + (ft) + [-4.32 -4.32 ] pdfys + 298.08 95.52 m + (analyzer) + [-8.68449 -8.68449 -8.68449 -3.47409 -7.81089 -7.81089 -8.68449 -5.20558 ] pdfys + 343.68 95.52 m + (llu-bench) + [-3.47109 -3.47109 -8.68148 -5.20257 -8.68148 -8.68148 -8.68148 -7.80788 -8.68148 ] pdfys + 389.28 95.52 m + (chomp) show + 435.12 95.52 m + (fpgrowth) + [-4.3286 -8.6654 -8.6654 -5.18649 -8.6654 -11.255 -4.3286 -8.6654 ] pdfys + 480.72 95.52 m + (espresso) + [-8.74248 -7.86889 -8.74248 -5.26357 -8.74248 -7.86889 -7.86889 -8.74248 ] pdfys + 526.32 95.52 m + (povray31) + [-8.69329 -8.69329 -7.81969 -5.21438 -8.69329 -7.81969 -8.69329 -8.69329 ] pdfys + 572.16 95.52 m + (b) show + (i) + [-3.46619 ] pdfys + (sort) show + 617.76 95.52 m + (health) + [-8.6312 -8.6312 -8.6312 -3.42081 -4.29441 -8.6312 ] pdfys + 663.36 95.76 m + (mst) + [-13.0975 -7.90279 -4.43959 ] pdfys + 709.2 95.52 m + (perimeter) + [-8.66039 -8.66039 -5.18148 -3.45 -12.9815 -8.66039 -4.3236 -8.66039 -5.18148 ] pdfys + 754.8 95.76 m + (tsp) + [-4.43999 -7.90319 -8.77679 ] pdfys + 23.52 289.44 m + /N10 [0 15.84 -15.84 0 0 0] Tf + (Cache miss ratio) + [11.4622 8.83273 8.83273 9.70381 8.83273 4.32002 14.1076 4.42921 8.83273 8.83273 4.32002 + 6.18757 8.83273 5.3003 4.42921 9.70381 ] pdfys + n + 214.8 516 116.16 70.32 re + 1 1 1 sc + f + n + 214.56 516 116.4 70.56 re + 0 0 0 sc + S + q + 1 0 0 1 0.0132904 0 cm + n + 214.8 561.12 22.8 25.2 re + h + W + n + 0.959991 w + 0 J + n + 219.6 568.56 10.56 10.56 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + 234.48 568.08 m + /N8 17.76 Tf + (L1 Misses) + [9.82946 9.82946 5.03998 14.7489 3.89763 8.83491 8.83491 9.82946 8.83491 ] pdfxs + q + 1 0 0 1 0.0132904 0 cm + n + 214.8 537.6 22.8 25.2 re + h + W + n + 0.959991 w + 0 J + n + 219.6 545.04 10.56 10.56 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + 234.48 544.56 m + (L2 Misses) + [9.82946 9.82946 5.03998 14.7489 3.89763 8.83491 8.83491 9.82946 8.83491 ] pdfxs + q + 1 0 0 1 0.0132904 0 cm + n + 214.8 516.24 22.8 23.04 re + h + W + n + 0.959991 w + 0 J + n + 219.6 521.52 10.56 10.56 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + 234.48 521.04 m + (TLB Misses) + [10.7997 9.82305 11.7945 5.03997 14.7424 3.89122 8.8285 8.8285 9.82305 8.8285 ] pdfxs + PDFVars/TermAll get exec end end + userdict /pgsave get restore + showpage + %%PageTrailer + %%EndPage + %%Trailer + %%DocumentProcessColors: Cyan Magenta Yellow Black + %%DocumentSuppliedResources: + %%+ font ArialMT + %%+ font Arial-BoldMT + %%+ procset (Adobe Acrobat - PDF operators) 1.2 0 + %%+ procset (Adobe Acrobat - type operators) 1.2 0 + %%EOF + + %%EndDocument + @endspecial -150 3016 V 76 3101 a Fn(Figur)o(e)18 b(10.)h + Fj(Ratio)f(of)f(misses)g(at)h(L1/L2/TLB:)f(FullP)-6 b(A/NoP)g(A)-150 + 3354 y Fz(correlated)22 b(at)g(all)g(the)g(three)g(le)n(v)o(els)g(of)g + (the)g(memory)h(hierarchy)-5 b(.)22 b(This)g(in-)-150 + 3437 y(dicates)i(that)g(in)g(these)g(cases,)h(the)f(performance)h + (bene\002ts)f(are)g(primarily)-150 3520 y(due)f(to)f(smaller)g(w)o + (orking)h(sets,)f(which)h(w)o(ould)g(be)f(produced)i(by)f(defrag-)-150 + 3603 y(menting)d(the)f(heap.)-50 3686 y(T)-6 b(o)28 b(characterize)i + (this)e(ef)n(fect,)h(we)g(discuss)g(chomp)h(in)f(more)g(detail.)-150 + 3769 y(Chomp)16 b(allocates)f(three)g(dif)n(ferent)h(nodes,)g(which)f + (we)g(call)g(L,)f(P)-8 b(,)14 b(&)h(D.)f(L)h(is)-150 + 3852 y(an)j(8-byte)g(object)g(of)f(type)p 576 3852 24 + 4 v 46 w Fs(list)p Fz(,)h(P)f(is)g(a)g(16-byte)i(object)e(of)h(type)p + 1643 3852 V 46 w Fs(play)p Fz(,)-150 3935 y(and)27 b(D)f(is)f(an)i + (array)f(of)g(int.)g(Chomp)h(uses)f(an)h(irre)o(gular)f(allocation)g + (pat-)-150 4018 y(tern,)c(b)o(ut)g(generally)i(intermix)o(es)e(object)h + (allocations)g(\(e.g.)f(it)g(starts)g(with)-150 4101 + y(DPDLDPDLDLDDDPDLDL...\).)10 b(When)15 b(using)g(malloc,)g(these)g + (objects)-150 4184 y(are)25 b(interspersed)i(on)f(the)f(heap,)h + (roughly)h(corresponding)g(to)f(allocation)-150 4267 + y(order)h(\(reuse)g(of)g(freed)g(memory)h(mak)o(es)g(it)e(ine)o + (xact\).)h(When)g(using)g(the)-150 4350 y(pool)21 b(allocator)m(,)g + (the)g(three)f(dif)n(ferent)h(objects)g(are)g(put)g(in)g(separate)g + (pools,)-150 4433 y(and)16 b(objects)g(in)f(each)h(pool)f(are)h + (roughly)g(in)f(allocation)h(order)g(\(P)e(is)h(e)o(xactly)-150 + 4516 y(in)k(allocation)g(order\).)-50 4599 y(These)f(layout)h(patterns) + f(mean)h(that,)f(without)g(Pool)g(Allocation,)h(the)f(L)-150 + 4682 y(and)h(P)e(list)h(nodes)h(are)f(dispersed)h(in)f(memory)h(\(e.g.) + f(with)g(v)n(ariable)g(strides)-150 4765 y(of)d(100-500)j(bytes)d(for)h + (the)f(P)g(objects\))g(whereas)h(the)g(pool)g(allocator)f(packs)-150 + 4848 y(them)33 b(together)h(\(achie)n(ving)h(a)e(perfect)h(stride)f(of) + g(20)h(bytes)f(for)h(the)f(P)-150 4932 y(objects,)20 + b(16)g(for)f(the)h(object)g(and)g(4)g(for)g(the)g(object)g(header\).)g + (This)f(change)-150 5015 y(dramatically)31 b(reduces)h(the)f(cache)g + (footprint)g(of)g(link)o(ed)h(list)e(tra)o(v)o(ersals)-150 + 5098 y(o)o(v)o(er)24 b(the)f(P)g(and)h(L)f(nodes.)h(In)f(the)h(case)f + (of)h(the)f(P)g(list,)f(it)h(yields)g(optimal)-150 5181 + y(cache)28 b(density)f(and)h(pro)o(vides)f(the)g(hardw)o(are)h(stride)f + (prefetcher)g(with)f(a)-150 5264 y(linear)d(access)g(pattern.)g(This)g + (combination)h(pro)o(vides)g(a)f(reduction)h(from)-150 + 5347 y(251M)j(L1)f(misses)h(to)f(63M)h(L1)f(misses.)g(While)f(chomp)j + (is)d(an)i(e)o(xtreme)-150 5430 y(case,)19 b(it)f(illustrates)g(e)o + (xactly)i(the)f(ef)n(fect)g(we)f(aim)h(for)l(.)2042 66 + y Fn(9.6)75 b(Contrib)o(utions)16 b(of)j(Indi)o(vidual)f(Optimizations) + 2042 183 y Fz(Figure)26 b(11)g(sho)n(ws)h(the)f(runtime)h(ratio)e(of)h + (each)h(program)g(with)f(one)h(op-)2042 266 y(timization)d(disabled)i + (at)e(a)h(time,)f(and)h(compares)h(it)e(to)g(a)h(baseline)g(of)g(all) + 2042 349 y(optimizations)e(on.)h(This)e(sho)n(ws)i(ho)n(w)f(much)h(the) + f(program)h(slo)n(ws)f(do)n(wn)2042 432 y(when)j(a)f(particular)h + (optimization)g(is)f(disabled,)g(which)h(is)f(correlated)h(to)2042 + 515 y(ho)n(w)15 b(much)h(the)f(optimization)g(helps)g(the)g + (performance)h(of)f(the)g(code.)g(Note)2042 598 y(that)i(if)f(tw)o(o)h + (optimizations)h(can)f(pro)o(vide)h(the)f(speedup)i(\(e.g.)e(either)g + (use)g(of)2042 681 y(alignment-opt)g(or)e(b)o(ump-pointer)i(to)f + (reduce)h(inter)o(-object)e(padding\),)i(dis-)2042 764 + y(abling)k(either)h(will)e(not)h(sho)n(w)h(a)f(slo)n(wdo)n(wn.)h + (Despite)f(this,)g(this)g(analysis)2042 847 y(does)e(pro)o(vide)h + (useful)g(insight)f(into)g(the)g(ef)n(fect)f(of)h(the)g(optimizations.) + 2106 2380 y @beginspecial 0 @llx 0 @lly 792 @urx 612 + @ury 1728 @rhi @setspecial + %%BeginDocument: Tables/OptimizationEffect.ps + %!PS-Adobe-3.0 + %%Title: (\376\377) + %%Version: 1 2 + %%Creator: (\376\377) + %%CreationDate: (D:20050420113457) + %%For: (\376\377) + %%DocumentData: Clean7Bit + %%LanguageLevel: 2 + %%BoundingBox: 0 0 792 612 + %%Pages: 1 + %%DocumentProcessColors: (atend) + %%DocumentSuppliedResources: (atend) + %%EndComments + %%BeginDefaults + %%EndDefaults + %%BeginProlog + %%EndProlog + %%BeginSetup + %%BeginResource: l2check + %%Copyright: Copyright 1993 Adobe Systems Incorporated. All Rights Reserved. + systemdict /languagelevel known + { systemdict /languagelevel get 1 eq } + { true } + ifelse + { + initgraphics /Helvetica findfont 18 scalefont setfont + 72 600 moveto (Error: Your printer driver needs to be configured) dup show + 72 580 moveto (for printing to a PostScript Language Level 1 printer.) dup show + exch = = + /Helvetica-Bold findfont 16 scalefont setfont + 72 520 moveto (Windows and Unix) show + /Times-Roman findfont 16 scalefont setfont + 72 500 moveto (Select ?Language Level 1? in the PostScript options section) show + 72 480 moveto (of the Acrobat print dialog.) show + /Helvetica-Bold findfont 16 scalefont setfont + 72 440 moveto (Macintosh) show + /Times-Roman findfont 16 scalefont setfont + 72 420 moveto (In the Chooser, select your printer driver.) show + 72 400 moveto (Then select your printer and click the Setup button.) show + 72 380 moveto (Follow any on-screen dialogs that may appear.) show + showpage + quit + } + if + %%EndResource + userdict /pdf_svglb currentglobal put true setglobal + %%BeginResource: file Pscript_CFF PSVER + userdict/ct_CffDict 6 dict put ct_CffDict begin/F0Subr{systemdict/internaldict + known{1183615869 systemdict/internaldict get exec/FlxProc known{save true}{ + false}ifelse}{userdict/internaldict known not{userdict/internaldict{count 0 eq + {/internaldict errordict/invalidaccess get exec}if dup type/integertype ne{ + /internaldict errordict/invalidaccess get exec}if dup 1183615869 eq{pop 0}{ + /internaldict errordict/invalidaccess get exec}ifelse}dup 14 get 1 25 dict put + bind executeonly put}if 1183615869 userdict/internaldict get exec/FlxProc + known{save true}{false}ifelse}ifelse[systemdict/internaldict known not{100 + dict/begin cvx/mtx matrix/def cvx}if systemdict/currentpacking known{ + currentpacking true setpacking}if{systemdict/internaldict known{1183615869 + systemdict/internaldict get exec dup/$FlxDict known not{dup dup length exch + maxlength eq{pop userdict dup/$FlxDict known not{100 dict begin/mtx matrix def + dup/$FlxDict currentdict put end}if}{100 dict begin/mtx matrix def dup + /$FlxDict currentdict put end}ifelse}if/$FlxDict get begin}if grestore/exdef{ + exch def}def/dmin exch abs 100 div def/epX exdef/epY exdef/c4y2 exdef/c4x2 + exdef/c4y1 exdef/c4x1 exdef/c4y0 exdef/c4x0 exdef/c3y2 exdef/c3x2 exdef/c3y1 + exdef/c3x1 exdef/c3y0 exdef/c3x0 exdef/c1y2 exdef/c1x2 exdef/c2x2 c4x2 def + /c2y2 c4y2 def/yflag c1y2 c3y2 sub abs c1x2 c3x2 sub abs gt def/PickCoords{{ + c1x0 c1y0 c1x1 c1y1 c1x2 c1y2 c2x0 c2y0 c2x1 c2y1 c2x2 c2y2}{c3x0 c3y0 c3x1 + c3y1 c3x2 c3y2 c4x0 c4y0 c4x1 c4y1 c4x2 c4y2}ifelse/y5 exdef/x5 exdef/y4 exdef + /x4 exdef/y3 exdef/x3 exdef/y2 exdef/x2 exdef/y1 exdef/x1 exdef/y0 exdef/x0 + exdef}def mtx currentmatrix pop mtx 0 get abs 1e-05 lt mtx 3 get abs 1e-05 lt + or{/flipXY -1 def}{mtx 1 get abs 1e-05 lt mtx 2 get abs 1e-05 lt or{/flipXY 1 + def}{/flipXY 0 def}ifelse}ifelse/erosion 1 def systemdict/internaldict known{ + 1183615869 systemdict/internaldict get exec dup/erosion known{/erosion get + /erosion exch def}{pop}ifelse}if yflag{flipXY 0 eq c3y2 c4y2 eq or{false + PickCoords}{/shrink c3y2 c4y2 eq{0}{c1y2 c4y2 sub c3y2 c4y2 sub div abs}ifelse + def/yshrink{c4y2 sub shrink mul c4y2 add}def/c1y0 c3y0 yshrink def/c1y1 c3y1 + yshrink def/c2y0 c4y0 yshrink def/c2y1 c4y1 yshrink def/c1x0 c3x0 def/c1x1 + c3x1 def/c2x0 c4x0 def/c2x1 c4x1 def/dY 0 c3y2 c1y2 sub round dtransform + flipXY 1 eq{exch}if pop abs def dY dmin lt PickCoords y2 c1y2 sub abs .001 gt{ + c1x2 c1y2 transform flipXY 1 eq{exch}if/cx exch def/cy exch def/dY 0 y2 c1y2 + sub round dtransform flipXY 1 eq{exch}if pop def dY round dup 0 ne{/dY exdef}{ + pop dY 0 lt{-1}{1}ifelse/dY exdef}ifelse/erode PaintType 2 ne erosion .5 ge + and def erode{/cy cy .5 sub def}if/ey cy dY add def/ey ey ceiling ey sub ey + floor add def erode{/ey ey .5 add def}if ey cx flipXY 1 eq{exch}if itransform + exch pop y2 sub/eShift exch def/y1 y1 eShift add def/y2 y2 eShift add def/y3 + y3 eShift add def}if}ifelse}{flipXY 0 eq c3x2 c4x2 eq or{false PickCoords}{ + /shrink c3x2 c4x2 eq{0}{c1x2 c4x2 sub c3x2 c4x2 sub div abs}ifelse def/xshrink + {c4x2 sub shrink mul c4x2 add}def/c1x0 c3x0 xshrink def/c1x1 c3x1 xshrink def + /c2x0 c4x0 xshrink def/c2x1 c4x1 xshrink def/c1y0 c3y0 def/c1y1 c3y1 def/c2y0 + c4y0 def/c2y1 c4y1 def/dX c3x2 c1x2 sub round 0 dtransform flipXY -1 eq{exch} + if pop abs def dX dmin lt PickCoords x2 c1x2 sub abs .001 gt{c1x2 c1y2 + transform flipXY -1 eq{exch}if/cy exch def/cx exch def/dX x2 c1x2 sub round 0 + dtransform flipXY -1 eq{exch}if pop def dX round dup 0 ne{/dX exdef}{pop dX 0 + lt{-1}{1}ifelse/dX exdef}ifelse/erode PaintType 2 ne erosion .5 ge and def + erode{/cx cx .5 sub def}if/ex cx dX add def/ex ex ceiling ex sub ex floor add + def erode{/ex ex .5 add def}if ex cy flipXY -1 eq{exch}if itransform pop x2 + sub/eShift exch def/x1 x1 eShift add def/x2 x2 eShift add def/x3 x3 eShift add + def}if}ifelse}ifelse x2 x5 eq y2 y5 eq or{x5 y5 lineto}{x0 y0 x1 y1 x2 y2 + curveto x3 y3 x4 y4 x5 y5 curveto}ifelse epY epX}systemdict/currentpacking + known{exch setpacking}if/exec cvx/end cvx]cvx executeonly exch{pop true exch + restore}{systemdict/internaldict known not{1183615869 userdict/internaldict + get exec exch/FlxProc exch put true}{1183615869 systemdict/internaldict get + exec dup length exch maxlength eq{false}{1183615869 systemdict/internaldict + get exec exch/FlxProc exch put true}ifelse}ifelse}ifelse{systemdict + /internaldict known{1183615869 systemdict/internaldict get exec/FlxProc get + exec}{1183615869 userdict/internaldict get exec/FlxProc get exec}ifelse}if} + executeonly def/F1Subr{gsave currentpoint newpath moveto}bind def/F2Subr{ + currentpoint grestore gsave currentpoint newpath moveto}bind def/HSSubr{ + systemdict/internaldict known not{pop 3}{1183615869 systemdict/internaldict + get exec dup/startlock known{/startlock get exec}{dup/strtlck known{/strtlck + get exec}{pop 3}ifelse}ifelse}ifelse}bind def end + %%EndResource + + userdict /pdf_svglb get setglobal + /currentpacking where{pop currentpacking true setpacking}if + %%BeginResource: procset pdfvars + %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. All Rights Reserved. + %%Version: 5.0 6 + %%Title: definition of dictionary of variables used by PDF & PDFText procsets + userdict /PDF 160 dict put + userdict /PDFVars 89 dict dup begin put + /docSetupDone false def + /InitAll 0 def + /TermAll 0 def + /DocInitAll 0 def + /DocTermAll 0 def + /_pdfEncodings 2 array def + /_pdf_str1 1 string def + /_pdf_i 0 def + /_pdf_na 0 def + /_pdf_showproc 0 def + /_italMtx [1 0 .212557 1 0 0] def + /_italMtx_WMode1 [1 -.212557 0 1 0 0] def + /_italMtxType0 [1 0 .1062785 1 0 0] def + /_italMtx_WMode1Type0 [1 -.1062785 0 1 0 0] def + /_basefont 0 def + /_basefonto 0 def + /_pdf_oldCIDInit null def + /_pdf_FontDirectory 30 dict def + /_categories 10 dict def + /_sa? true def + /_ColorSep5044? false def + /nulldict 0 dict def + /_processColors 0 def + /overprintstack null def + /_defaulttransfer currenttransfer def + /_defaultflatness currentflat def + /_defaulthalftone null def + /_defaultcolortransfer null def + /_defaultblackgeneration null def + /_defaultundercolorremoval null def + /_defaultcolortransfer null def + PDF begin + [/c/cs/cm/d/d0/f/h/i/j/J/l/m/M/n/q/Q/re/ri/S/sc/sh/Tf/w/W + /applyInterpFunc/applystitchFunc/domainClip/encodeInput + /initgs/int/limit/rangeClip + /defineRes/findRes/setSA/pl + %% to keep CoolType entries in GlyphDirProcs safe from collisions with Win PS driver + /? /! /| /: /+ /GetGlyphDirectory + /pdf_flushFilters /pdf_readstring /pdf_dictOp /pdf_image /pdf_maskedImage + /pdf_shfill /pdf_sethalftone + ] {null def} bind forall + end + end + %%EndResource + PDFVars begin PDF begin + %%BeginResource: procset pdfutil + %%Copyright: Copyright 1993-1999 Adobe Systems Incorporated. All Rights Reserved. + %%Version: 4.0 2 + %%Title: Basic utilities used by other PDF procsets + /bd {bind def} bind def + /ld {load def} bd + /bld { + dup length dict begin + { null def } forall + bind + end + def + } bd + /dd { PDFVars 3 1 roll put } bd + /xdd { exch dd } bd + /Level2? + systemdict /languagelevel known + { systemdict /languagelevel get 2 ge } { false } ifelse + def + /Level1? Level2? not def + /Level3? + systemdict /languagelevel known + {systemdict /languagelevel get 3 eq } { false } ifelse + def + /getifknown { + 2 copy known { get true } { pop pop false } ifelse + } bd + /here { + currentdict exch getifknown + } bd + /isdefined? { where { pop true } { false } ifelse } bd + %%EndResource + %%BeginResource: procset pdf + %%Version: 5.0 7 + %%Copyright: Copyright 1998-2001 Adobe Systems Incorporated. All Rights Reserved. + %%Title: General operators for PDF, common to all Language Levels. + /cm { matrix astore concat } bd + /d /setdash ld + /f /fill ld + /h /closepath ld + /i {dup 0 eq {pop _defaultflatness} if setflat} bd + /j /setlinejoin ld + /J /setlinecap ld + /M /setmiterlimit ld + /n /newpath ld + /S /stroke ld + /w /setlinewidth ld + /W /clip ld + /initgs { + 0 setgray + [] 0 d + 0 j + 0 J + 10 M + 1 w + false setSA + /_defaulttransfer load settransfer + 0 i + /RelativeColorimetric ri + newpath + } bd + /int { + dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul + exch pop add exch pop + } bd + /limit { + dup 2 index le { exch } if pop + dup 2 index ge { exch } if pop + } bd + /domainClip { + Domain aload pop 3 2 roll + limit + } [/Domain] bld + /applyInterpFunc { + 0 1 DimOut 1 sub + { + dup C0 exch get exch + dup C1 exch get exch + 3 1 roll + 1 index sub + 3 index + N exp mul add + exch + currentdict /Range_lo known + { + dup Range_lo exch get exch + Range_hi exch get + 3 2 roll limit + } + { + pop + } + ifelse + exch + } for + pop + } [/DimOut /C0 /C1 /N /Range_lo /Range_hi] bld + /encodeInput { + NumParts 1 sub + 0 1 2 index + { + dup Bounds exch get + 2 index gt + { exit } + { dup + 3 index eq + { exit } + { pop } ifelse + } ifelse + } for + 3 2 roll pop + dup Bounds exch get exch + dup 1 add Bounds exch get exch + 2 mul + dup Encode exch get exch + 1 add Encode exch get + int + } [/NumParts /Bounds /Encode] bld + /rangeClip { + exch dup Range_lo exch get + exch Range_hi exch get + 3 2 roll + limit + } [/Range_lo /Range_hi] bld + /applyStitchFunc { + Functions exch get exec + currentdict /Range_lo known { + 0 1 DimOut 1 sub { + DimOut 1 add -1 roll + rangeClip + } for + } if + } [/Functions /Range_lo /DimOut] bld + /pdf_flushfilters + { + aload length + { dup status + 1 index currentfile ne and + { dup flushfile closefile } + { pop } + ifelse + } repeat + } bd + /pdf_readstring + { + 1 index dup length 1 sub get + exch readstring pop + exch pdf_flushfilters + } bind def + /pdf_dictOp + { + 3 2 roll + 10 dict copy + begin + _Filters dup length 1 sub get def + currentdict exch exec + _Filters pdf_flushfilters + end + } [/_Filters] bld + /pdf_image {{image} /DataSource pdf_dictOp} bd + /pdf_imagemask {{imagemask} /DataSource pdf_dictOp} bd + /pdf_shfill {{sh} /DataSource pdf_dictOp} bd + /pdf_sethalftone {{sethalftone} /Thresholds pdf_dictOp} bd + /pdf_maskedImage + { + 10 dict copy begin + /miDict currentdict def + /DataDict DataDict 10 dict copy def + DataDict begin + /DataSource + _Filters dup length 1 sub get + def + miDict image + _Filters pdf_flushfilters + end + end + } [/miDict /DataDict /_Filters] bld + /RadialShade { + 40 dict begin + /background exch def + /ext1 exch def + /ext0 exch def + /BBox exch def + /r2 exch def + /c2y exch def + /c2x exch def + /r1 exch def + /c1y exch def + /c1x exch def + /rampdict exch def + gsave + BBox length 0 gt { + newpath + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + newpath + } if + c1x c2x eq + { + c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse + } + { + /slope c2y c1y sub c2x c1x sub div def + /theta slope 1 atan def + c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if + c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if + } + ifelse + gsave + clippath + c1x c1y translate + theta rotate + -90 rotate + { pathbbox } stopped + { 0 0 0 0 } if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + } + { + rampdict begin + 40 dict begin + background length 0 gt { background sssetbackground gsave clippath fill grestore } if + gsave + c1x c1y translate + theta rotate + -90 rotate + /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def + /c1y 0 def + /c1x 0 def + /c2x 0 def + ext0 { + 0 getrampcolor + c2y r2 add r1 lt + { + c1x c1y r1 360 0 arcn + xMin yMin moveto + xMax yMin lineto + xMax yMax lineto + xMin yMax lineto + xMin yMin lineto + eofill + } + { + c2y r1 add r2 le + { + c1x c1y r1 0 360 arc + fill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r1 neg def + /p1y c1y def + /p2x r1 def + /p2y c1y def + p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto + fill + } + { + /AA r2 r1 sub c2y div def + /theta AA 1 AA dup mul sub sqrt div 1 atan def + /SS1 90 theta add dup sin exch cos div def + /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y p1x SS1 div neg def + /SS2 90 theta sub dup sin exch cos div def + /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y p2x SS2 div neg def + r1 r2 gt + { + /L1maxX p1x yMin p1y sub SS1 div add def + /L2maxX p2x yMin p2y sub SS2 div add def + } + { + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + } + ifelse + } + ifelse + } ifelse + } if + c1x c2x sub dup mul + c1y c2y sub dup mul + add 0.5 exp + 0 dtransform + dup mul exch dup mul add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt { exch } if pop + /hires exch def + hires mul + /numpix exch def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + } if + } if + /xInc c2x c1x sub numsteps div def + /yInc c2y c1y sub numsteps div def + /rInc r2 r1 sub numsteps div def + /cx c1x def + /cy c1y def + /radius r1 def + newpath + xInc 0 eq yInc 0 eq rInc 0 eq and and + { + 0 getrampcolor + cx cy radius 0 360 arc + stroke + NumSamples 1 sub getrampcolor + cx cy radius 72 hires div add 0 360 arc + 0 setlinewidth + stroke + } + { + 0 + numsteps + { + dup + subsampling { round cvi } if + getrampcolor + cx cy radius 0 360 arc + /cx cx xInc add def + /cy cy yInc add def + /radius radius rInc add def + cx cy radius 360 0 arcn + eofill + rampIndxInc add + } + repeat + pop + } ifelse + ext1 { + c2y r2 add r1 lt + { + c2x c2y r2 0 360 arc + fill + } + { + c2y r1 add r2 le + { + c2x c2y r2 360 0 arcn + xMin yMin moveto + xMax yMin lineto + xMax yMax lineto + xMin yMax lineto + xMin yMin lineto + eofill + } + { + c2x c2y r2 0 360 arc fill + r1 r2 eq + { + /p1x r2 neg def + /p1y c2y def + /p2x r2 def + /p2y c2y def + p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto + fill + } + { + /AA r2 r1 sub c2y div def + /theta AA 1 AA dup mul sub sqrt div 1 atan def + /SS1 90 theta add dup sin exch cos div def + /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def + /p1y c2y p1x SS1 div sub def + /SS2 90 theta sub dup sin exch cos div def + /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def + /p2y c2y p2x SS2 div sub def + r1 r2 lt + { + /L1maxX p1x yMax p1y sub SS1 div add def + /L2maxX p2x yMax p2y sub SS2 div add def + } + { + /L1maxX 0 def + /L2maxX 0 def + }ifelse + p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto + L1maxX L1maxX p1x sub SS1 mul p1y add lineto + fill + } + ifelse + } + ifelse + } ifelse + } if + grestore + grestore + end + end + end + } ifelse + } bd + /GenStrips { + 40 dict begin + /background exch def + /ext1 exch def + /ext0 exch def + /BBox exch def + /y2 exch def + /x2 exch def + /y1 exch def + /x1 exch def + /rampdict exch def + gsave + BBox length 0 gt { + newpath + BBox 0 get BBox 1 get moveto + BBox 2 get BBox 0 get sub 0 rlineto + 0 BBox 3 get BBox 1 get sub rlineto + BBox 2 get BBox 0 get sub neg 0 rlineto + closepath + clip + newpath + } if + x1 x2 eq + { + y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse + } + { + /slope y2 y1 sub x2 x1 sub div def + /theta slope 1 atan def + x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if + x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if + } + ifelse + gsave + clippath + x1 y1 translate + theta rotate + { pathbbox } stopped + { 0 0 0 0 } if + /yMax exch def + /xMax exch def + /yMin exch def + /xMin exch def + grestore + xMax xMin eq yMax yMin eq or + { + grestore + end + } + { + rampdict begin + 20 dict begin + background length 0 gt { background sssetbackground gsave clippath fill grestore } if + gsave + x1 y1 translate + theta rotate + /xStart 0 def + /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def + /ySpan yMax yMin sub def + /numsteps NumSamples def + /rampIndxInc 1 def + /subsampling false def + xStart 0 transform + xEnd 0 transform + 3 -1 roll + sub dup mul + 3 1 roll + sub dup mul + add 0.5 exp 72 div + 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt + 1 index 1 index lt { exch } if pop + mul + /numpix exch def + numpix 0 ne + { + NumSamples numpix div 0.5 gt + { + /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def + /rampIndxInc NumSamples 1 sub numsteps div def + /subsampling true def + } if + } if + ext0 { + 0 getrampcolor + xMin xStart lt + { xMin yMin xMin neg ySpan rectfill } if + } if + /xInc xEnd xStart sub numsteps div def + /x xStart def + 0 + numsteps + { + dup + subsampling { round cvi } if + getrampcolor + x yMin xInc ySpan rectfill + /x x xInc add def + rampIndxInc add + } + repeat + pop + ext1 { + xMax xEnd gt + { xEnd yMin xMax xEnd sub ySpan rectfill } if + } if + grestore + grestore + end + end + end + } ifelse + } bd + %%EndResource + %%BeginResource: procset pdflev2 + %%Version: 5.0 15 + %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. All Rights Reserved. + %%LanguageLevel: 2 + %%Title: PDF operators, with code specific for Level 2 + /docinitialize { + PDF begin + /_defaulthalftone currenthalftone dd + /_defaultblackgeneration currentblackgeneration dd + /_defaultundercolorremoval currentundercolorremoval dd + /_defaultcolortransfer [currentcolortransfer] dd + /_defaulttransfer currenttransfer dd + end + PDFVars /docSetupDone true put + } bd + /initialize { + PDFVars /docSetupDone get { + _defaulthalftone sethalftone + /_defaultblackgeneration load setblackgeneration + /_defaultundercolorremoval load setundercolorremoval + _defaultcolortransfer aload pop setcolortransfer + } if + false setoverprint + } bd + /terminate { } bd + /c /curveto ld + /cs /setcolorspace ld + /l /lineto ld + /m /moveto ld + /q /gsave ld + /Q /grestore ld + /sc /setcolor ld + /setSA/setstrokeadjust ld + /re { + 4 2 roll m + 1 index 0 rlineto + 0 exch rlineto + neg 0 rlineto + h + } bd + /concattransferfuncs { + [ 3 1 roll /exec load exch /exec load ] cvx + } bd + /concatandsettransfer { + /_defaulttransfer load concattransferfuncs settransfer + } bd + /concatandsetcolortransfer { + _defaultcolortransfer aload pop + 8 -1 roll 5 -1 roll concattransferfuncs 7 1 roll + 6 -1 roll 4 -1 roll concattransferfuncs 5 1 roll + 4 -1 roll 3 -1 roll concattransferfuncs 3 1 roll + concattransferfuncs + setcolortransfer + } bd + /defineRes/defineresource ld + /findRes/findresource ld + currentglobal + true systemdict /setglobal get exec + [/Function /ExtGState /Form /Shading /FunctionDictionary /MadePattern /PatternPrototype /DataSource /Image] + { /Generic /Category findresource dup length dict copy /Category defineresource pop } + forall + systemdict /setglobal get exec + /ri + { + /findcolorrendering isdefined? + { + mark exch + findcolorrendering + counttomark 2 eq + { type /booleantype eq + { dup type /nametype eq + { dup /ColorRendering resourcestatus + { pop pop + dup /DefaultColorRendering ne + { + /ColorRendering findresource + setcolorrendering + } if + } if + } if + } if + } if + cleartomark + } + { pop + } ifelse + } bd + /knownColorants? { + pop false + } bd + /getrampcolor { + /indx exch def + 0 1 NumComp 1 sub { + dup + Samples exch get + dup type /stringtype eq { indx get } if + exch + Scaling exch get aload pop + 3 1 roll + mul add + } for + setcolor + } bd + /sssetbackground { aload pop setcolor } bd + %%EndResource + %%BeginResource: procset pdftext + %%Version: 5.0 6 + %%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. All Rights Reserved. + %%Title: Text operators for PDF + PDF /PDFText 78 dict dup begin put + /docinitialize + { + /resourcestatus where { + pop + /CIDParams /ProcSet resourcestatus { + pop pop + false /CIDParams /ProcSet findresource /SetBuildCompatible get exec + } if + } if + PDF begin + PDFText /_pdfDefineIdentity-H known + { PDFText /_pdfDefineIdentity-H get exec} + if + end + } bd + /initialize { + PDFText begin + } bd + /terminate { end } bd + Level2? + { + /_safeput + { + 3 -1 roll load 3 1 roll put + } + bd + } + { + /_safeput + { + 2 index load dup dup length exch maxlength ge + { dup length 5 add dict copy + 3 index xdd + } + { pop } + ifelse + 3 -1 roll load 3 1 roll put + } + bd + } + ifelse + /pdf_has_composefont? systemdict /composefont known def + /CopyFont { + { + 1 index /FID ne 2 index /UniqueID ne and + { def } { pop pop } ifelse + } forall + } bd + /Type0CopyFont + { + exch + dup length dict + begin + CopyFont + [ + exch + FDepVector + { + dup /FontType get 0 eq + { + 1 index Type0CopyFont + /_pdfType0 exch definefont + } + { + /_pdfBaseFont exch + 2 index exec + } + ifelse + exch + } + forall + pop + ] + /FDepVector exch def + currentdict + end + } bd + Level2? {currentglobal true setglobal} if + /cHexEncoding + [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 + /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 + /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 + /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B + /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E + /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 + /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 + /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 + /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA + /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD + /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 + /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 + /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 + /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def + Level2? {setglobal} if + /modEnc { + /_enc xdd + /_icode 0 dd + counttomark 1 sub -1 0 + { + index + dup type /nametype eq + { + _enc _icode 3 -1 roll put + _icode 1 add + } + if + /_icode xdd + } for + cleartomark + _enc + } bd + /trEnc { + /_enc xdd + 255 -1 0 { + exch dup -1 eq + { pop /.notdef } + { Encoding exch get } + ifelse + _enc 3 1 roll put + } for + pop + _enc + } bd + /TE { + /_i xdd + StandardEncoding 256 array copy modEnc + _pdfEncodings exch _i exch put + } bd + /TZ + { + /_usePDFEncoding xdd + findfont + dup length 6 add dict + begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + /pdf_origFontName FontName def + /FontName exch def + currentdict /PaintType known + { PaintType 2 eq {/PaintType 0 def} if } + if + _usePDFEncoding 0 ge + { + /Encoding _pdfEncodings _usePDFEncoding get def + pop + } + { + _usePDFEncoding -1 eq + { + counttomark 0 eq + { pop } + { + Encoding 256 array copy + modEnc /Encoding exch def + } + ifelse + } + { + 256 array + trEnc /Encoding exch def + } + ifelse + } + ifelse + pdf_EuroProcSet pdf_origFontName known + { + pdf_origFontName pdf_AddEuroGlyphProc + } if + Level2? + { + currentdict /pdf_origFontName undef + } if + FontName currentdict + end + definefont pop + } + bd + Level2? + { + /TZG + { + currentglobal true setglobal + 2 index _pdfFontStatus + { + 2 index findfont + false setglobal + 3 index findfont + true setglobal + ne + { + 2 index findfont dup rcheck + { + dup length dict begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + currentdict end + } + if + 3 index exch definefont pop + } + if + } if + setglobal + TZ + } bd + } + { + /TZG {TZ} bd + } ifelse + Level2? + { + currentglobal false setglobal + userdict /pdftext_data 5 dict put + pdftext_data + begin + /saveStacks + { + pdftext_data + begin + /vmmode currentglobal def + false setglobal + count array astore /os exch def + end + countdictstack array dictstack pdftext_data exch /ds exch put + cleardictstack pdftext_data /dscount countdictstack put + pdftext_data /vmmode get setglobal + } bind def + /restoreStacks + { + pdftext_data /vmmode currentglobal put false setglobal + clear cleardictstack + pdftext_data /ds get dup + pdftext_data /dscount get 1 2 index length 1 sub + { get begin dup } for + pop pop + pdftext_data /os get aload pop + pdftext_data /vmmode get setglobal + } bind def + /testForClonePrinterBug + { + currentglobal true setglobal + /undefinedCategory /Generic /Category findresource + dup length dict copy /Category defineresource pop + setglobal + pdftext_data /saveStacks get exec + pdftext_data /vmmode currentglobal put false setglobal + /undefined /undefinedCategory { resourcestatus } stopped + pdftext_data exch /bugFound exch put + pdftext_data /vmmode get setglobal + pdftext_data /restoreStacks get exec + pdftext_data /bugFound get + } bind def + end + setglobal + /pdf_resourcestatus + pdftext_data /testForClonePrinterBug get exec + { + { + pdftext_data /saveStacks get exec + pdftext_data /os get dup dup length 1 sub + dup 1 sub dup 0 lt { pop 0 } if + exch 1 exch { get exch dup } for + pop pop + { resourcestatus } + stopped + { + clear cleardictstack pdftext_data /restoreStacks get exec + { pop pop } stopped pop false + } + { + count array astore pdftext_data exch /results exch put + pdftext_data /restoreStacks get exec pop pop + pdftext_data /results get aload pop + } + ifelse + } + } + { { resourcestatus } } + ifelse + bd + } + if + Level2? + { + /_pdfUndefineResource + { + currentglobal 3 1 roll + _pdf_FontDirectory 2 index 2 copy known + {undef} + {pop pop} + ifelse + 1 index (pdf) exch _pdfConcatNames 1 index + 1 index 1 _pdfConcatNames 1 index + 5 index 1 _pdfConcatNames 1 index + 4 + { + 2 copy pdf_resourcestatus + { + pop 2 lt + {2 copy findresource gcheck setglobal undefineresource} + {pop pop} + ifelse + } + { pop pop} + ifelse + } repeat + setglobal + } bd + } + { + /_pdfUndefineResource { pop pop} bd + } + ifelse + Level2? + { + /_pdfFontStatus + { + currentglobal exch + /Font pdf_resourcestatus + {pop pop true} + {false} + ifelse + exch setglobal + } bd + } + { + /_pdfFontStatusString 50 string def + _pdfFontStatusString 0 (fonts/) putinterval + /_pdfFontStatus + { + FontDirectory 1 index known + { pop true } + { + _pdfFontStatusString 6 42 getinterval + cvs length 6 add + _pdfFontStatusString exch 0 exch getinterval + { status } stopped + {pop false} + { + { pop pop pop pop true} + { false } + ifelse + } + ifelse + } + ifelse + } bd + } + ifelse + Level2? + { + /_pdfCIDFontStatus + { + /CIDFont /Category pdf_resourcestatus + { + pop pop + /CIDFont pdf_resourcestatus + {pop pop true} + {false} + ifelse + } + { pop false } + ifelse + } bd + } + if + /_pdfString100 100 string def + /_pdfComposeFontName + { + dup length 1 eq + { + 0 get + 1 index + type /nametype eq + { + _pdfString100 cvs + length dup dup _pdfString100 exch (-) putinterval + _pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval + 2 index exch cvs length + add 1 add _pdfString100 exch 0 exch getinterval + exch pop + true + } + { + pop pop + false + } + ifelse + } + { + false + } + ifelse + dup {exch cvn exch} if + } bd + /_pdfConcatNames + { + exch + _pdfString100 cvs + length dup dup _pdfString100 exch (-) putinterval + _pdfString100 exch 1 add dup _pdfString100 length exch sub getinterval + 3 -1 roll exch cvs length + add 1 add _pdfString100 exch 0 exch getinterval + cvn + } bind def + /_pdfTextTempString 50 string def + /_pdfRegOrderingArray [(Adobe-Japan1) (Adobe-CNS1) (Adobe-Korea1) (Adobe-GB1)] def + /_pdf_CheckCIDSystemInfo + { + 1 index _pdfTextTempString cvs + (Identity) anchorsearch + { + pop pop pop pop true + } + { + false + _pdfRegOrderingArray + { + 2 index exch + anchorsearch + { pop pop pop true exit} + { pop } + ifelse + } + forall + exch pop + exch /CIDFont findresource + /CIDSystemInfo get + 3 -1 roll /CMap findresource + /CIDSystemInfo get + exch + 3 -1 roll + { + 2 copy + /Supplement get + exch + dup type /dicttype eq + {/Supplement get} + {pop 0 } + ifelse + ge + } + { true } + ifelse + { + dup /Registry get + 2 index /Registry get eq + { + /Ordering get + exch /Ordering get + dup type /arraytype eq + { + 1 index type /arraytype eq + { + true + 1 index length 1 sub -1 0 + { + dup 2 index exch get exch 3 index exch get ne + { pop false exit} + if + } for + exch pop exch pop + } + { pop pop false } + ifelse + } + { + eq + } + ifelse + } + { pop pop false } + ifelse + } + { pop pop false } + ifelse + } + ifelse + } bind def + pdf_has_composefont? + { + /_pdfComposeFont + { + 2 copy _pdfComposeFontName not + { + 2 index + } + if + (pdf) exch _pdfConcatNames + dup _pdfFontStatus + { dup findfont 5 2 roll pop pop pop true} + { + 4 1 roll + 1 index /CMap pdf_resourcestatus + { + pop pop + true + } + {false} + ifelse + 1 index true exch + { + _pdfCIDFontStatus not + {pop false exit} + if + } + forall + and + { + 1 index 1 index 0 get _pdf_CheckCIDSystemInfo + { + 3 -1 roll pop + 2 index 3 1 roll + composefont true + } + { + pop pop exch pop false + } + ifelse + } + { + _pdfComposeFontName + { + dup _pdfFontStatus + { + exch pop + 1 index exch + findfont definefont true + } + { + pop exch pop + false + } + ifelse + } + { + exch pop + false + } + ifelse + } + ifelse + { true } + { + dup _pdfFontStatus + { dup findfont true } + { pop false } + ifelse + } + ifelse + } + ifelse + } bd + } + { + /_pdfComposeFont + { + _pdfComposeFontName not + { + dup + } + if + dup + _pdfFontStatus + {exch pop dup findfont true} + { + 1 index + dup type /nametype eq + {pop} + {cvn} + ifelse + eq + {pop false} + { + dup _pdfFontStatus + {dup findfont true} + {pop false} + ifelse + } + ifelse + } + ifelse + } bd + } + ifelse + /_pdfStyleDicts 4 dict dup begin + /Adobe-Japan1 4 dict dup begin + Level2? + { + /Serif + /HeiseiMin-W3-83pv-RKSJ-H _pdfFontStatus + {/HeiseiMin-W3} + { + /HeiseiMin-W3 _pdfCIDFontStatus + {/HeiseiMin-W3} + {/Ryumin-Light} + ifelse + } + ifelse + def + /SansSerif + /HeiseiKakuGo-W5-83pv-RKSJ-H _pdfFontStatus + {/HeiseiKakuGo-W5} + { + /HeiseiKakuGo-W5 _pdfCIDFontStatus + {/HeiseiKakuGo-W5} + {/GothicBBB-Medium} + ifelse + } + ifelse + def + /HeiseiMaruGo-W4-83pv-RKSJ-H _pdfFontStatus + {/HeiseiMaruGo-W4} + { + /HeiseiMaruGo-W4 _pdfCIDFontStatus + {/HeiseiMaruGo-W4} + { + /Jun101-Light-RKSJ-H _pdfFontStatus + { /Jun101-Light } + { SansSerif } + ifelse + } + ifelse + } + ifelse + /RoundSansSerif exch def + /Default Serif def + } + { + /Serif /Ryumin-Light def + /SansSerif /GothicBBB-Medium def + { + (fonts/Jun101-Light-83pv-RKSJ-H) status + }stopped + {pop}{ + { pop pop pop pop /Jun101-Light } + { SansSerif } + ifelse + /RoundSansSerif exch def + }ifelse + /Default Serif def + } + ifelse + end + def + /Adobe-Korea1 4 dict dup begin + /Serif /HYSMyeongJo-Medium def + /SansSerif /HYGoThic-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-GB1 4 dict dup begin + /Serif /STSong-Light def + /SansSerif /STHeiti-Regular def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + /Adobe-CNS1 4 dict dup begin + /Serif /MKai-Medium def + /SansSerif /MHei-Medium def + /RoundSansSerif SansSerif def + /Default Serif def + end + def + end + def + /TZzero + { + /_wmode xdd + /_styleArr xdd + /_regOrdering xdd + 3 copy + _pdfComposeFont + { + 5 2 roll pop pop pop + } + { + [ + 0 1 _styleArr length 1 sub + { + _styleArr exch get + _pdfStyleDicts _regOrdering 2 copy known + { + get + exch 2 copy known not + { pop /Default } + if + get + } + { + pop pop pop /Unknown + } + ifelse + } + for + ] + exch pop + 2 index 3 1 roll + _pdfComposeFont + {3 -1 roll pop} + { + findfont dup /FontName get exch + } + ifelse + } + ifelse + dup /WMode 2 copy known + { get _wmode ne } + { pop pop _wmode 1 eq} + ifelse + { + exch _wmode _pdfConcatNames + dup _pdfFontStatus + { exch pop dup findfont false} + { exch true } + ifelse + } + { + dup /FontType get 0 ne + } + ifelse + { + dup /FontType get 3 eq _wmode 1 eq and + { + _pdfVerticalRomanT3Font dup length 10 add dict copy + begin + /_basefont exch + dup length 3 add dict + begin + {1 index /FID ne {def}{pop pop} ifelse } + forall + /Encoding Encoding dup length array copy + dup 16#27 /quotesingle put + dup 16#60 /grave put + _regOrdering /Adobe-Japan1 eq + {dup 16#5c /yen put dup 16#a5 /yen put dup 16#b4 /yen put} + if + def + FontName + currentdict + end + definefont + def + /Encoding _basefont /Encoding get def + /_fauxfont true def + } + { + dup length 3 add dict + begin + {1 index /FID ne {def}{pop pop} ifelse } + forall + FontType 0 ne + { + /Encoding Encoding dup length array copy + dup 16#27 /quotesingle put + dup 16#60 /grave put + _regOrdering /Adobe-Japan1 eq + {dup 16#5c /yen put} + if + def + /_fauxfont true def + } if + } ifelse + /WMode _wmode def + dup dup /FontName exch def + currentdict + end + definefont pop + } + { + pop + } + ifelse + /_pdf_FontDirectory 3 1 roll _safeput + } + bd + Level2? + { + /Tf { + _pdf_FontDirectory 2 index 2 copy known + {get exch 3 -1 roll pop} + {pop pop} + ifelse + selectfont + } bd + } + { + /Tf { + _pdf_FontDirectory 2 index 2 copy known + {get exch 3 -1 roll pop} + {pop pop} + ifelse + exch findfont exch + dup type /arraytype eq + {makefont} + {scalefont} + ifelse + setfont + } bd + } + ifelse + /cshow where + { + pop /pdf_cshow /cshow load dd + /pdf_remove2 {pop pop} dd + } + { + /pdf_cshow {exch forall} dd + /pdf_remove2 {} dd + } ifelse + /pdf_xshow + { + /_pdf_na xdd + /_pdf_i 0 dd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 /_pdf_showproc load exec + {_pdf_na _pdf_i get} stopped + { pop pop } + { + _pdf_x _pdf_y moveto + 0 + rmoveto + } + ifelse + _pdf_i 1 add /_pdf_i xdd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + } + exch + pdf_cshow + } bd + /pdf_yshow + { + /_pdf_na xdd + /_pdf_i 0 dd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 /_pdf_showproc load exec + {_pdf_na _pdf_i get} stopped + { pop pop } + { + _pdf_x _pdf_y moveto + 0 exch + rmoveto + } + ifelse + _pdf_i 1 add /_pdf_i xdd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + } + exch + pdf_cshow + } bd + /pdf_xyshow + { + /_pdf_na xdd + /_pdf_i 0 dd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 /_pdf_showproc load exec + {_pdf_na _pdf_i get} stopped + { pop pop } + { + {_pdf_na _pdf_i 1 add get} stopped + { pop pop pop} + { + _pdf_x _pdf_y moveto + rmoveto + } + ifelse + } + ifelse + _pdf_i 2 add /_pdf_i xdd + currentpoint + /_pdf_y xdd + /_pdf_x xdd + } + exch + pdf_cshow + } bd + /pdfl1xs {/_pdf_showproc /show load dd pdf_xshow} bd + /pdfl1ys {/_pdf_showproc /show load dd pdf_yshow} bd + /pdfl1xys {/_pdf_showproc /show load dd pdf_xyshow} bd + Level2? _ColorSep5044? not and + { + /pdfxs {{xshow} stopped {pdfl1xs} if} bd + /pdfys {{yshow} stopped {pdfl1ys} if} bd + /pdfxys {{xyshow} stopped {pdfl1xys} if} bd + } + { + /pdfxs /pdfl1xs load dd + /pdfys /pdfl1ys load dd + /pdfxys /pdfl1xys load dd + } ifelse + /pdf_charpath {false charpath} bd + /pdf_xcharpath {/_pdf_showproc /pdf_charpath load dd pdf_xshow} bd + /pdf_ycharpath {/_pdf_showproc /pdf_charpath load dd pdf_yshow} bd + /pdf_xycharpath {/_pdf_showproc /pdf_charpath load dd pdf_xyshow} bd + /pdf_strokepath + { + { + pdf_remove2 + _pdf_str1 exch 0 exch put + _pdf_str1 false charpath + currentpoint S moveto + } bind + exch pdf_cshow + } bd + /pdf_xstrokepath {/_pdf_showproc {pdf_charpath S} dd pdf_xshow} bd + /pdf_ystrokepath {/_pdf_showproc {pdf_charpath S} dd pdf_yshow} bd + /pdf_xystrokepath {/_pdf_showproc {pdf_charpath S} dd pdf_xyshow} bd + Level2? {currentglobal true setglobal} if + /d0/setcharwidth ld + /nND {{/.notdef} repeat} bd + /T3Defs { + /BuildChar + { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec + } + def + /BuildGlyph { + exch begin + GlyphProcs exch get exec + end + } def + /_pdfT3Font true def + } bd + /_pdfBoldRomanWidthProc + { + stringwidth 1 index 0 ne { exch .03 add exch }if setcharwidth + 0 0 + } bd + /_pdfType0WidthProc + { + dup stringwidth 0 0 moveto + 2 index true charpath pathbbox + 0 -1 + 7 index 2 div .88 + setcachedevice2 + pop + 0 0 + } bd + /_pdfType0WMode1WidthProc + { + dup stringwidth + pop 2 div neg -0.88 + 2 copy + moveto + 0 -1 + 5 -1 roll true charpath pathbbox + setcachedevice + } bd + /_pdfBoldBaseFont + 11 dict begin + /FontType 3 def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /Encoding cHexEncoding def + /_setwidthProc /_pdfBoldRomanWidthProc load def + /_bcstr1 1 string def + /BuildChar + { + exch begin + _basefont setfont + _bcstr1 dup 0 4 -1 roll put + dup + _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bd + currentdict + end + def + pdf_has_composefont? + { + /_pdfBoldBaseCIDFont + 11 dict begin + /CIDFontType 1 def + /CIDFontName /_pdfBoldBaseCIDFont def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /_setwidthProc /_pdfType0WidthProc load def + /_bcstr2 2 string def + /BuildGlyph + { + exch begin + _basefont setfont + _bcstr2 1 2 index 256 mod put + _bcstr2 0 3 -1 roll 256 idiv put + _bcstr2 dup _setwidthProc + 3 copy + moveto + show + _basefonto setfont + moveto + show + end + }bd + currentdict + end + def + /_pdfDefineIdentity-H + { + /Identity-H /CMap PDFText /pdf_resourcestatus get exec + { + pop pop + } + { + /CIDInit/ProcSet findresource begin 12 dict begin + begincmap + /CIDSystemInfo + 3 dict begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + currentdict + end + def + /CMapName /Identity-H def + /CMapVersion 1 def + /CMapType 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 1 begincidrange + <0000> 0 + endcidrange + endcmap + CMapName currentdict/CMap defineresource pop + end + end + } ifelse + } def + } if + /_pdfVerticalRomanT3Font + 10 dict begin + /FontType 3 def + /FontMatrix[1 0 0 1 0 0]def + /FontBBox[0 0 1 1]def + /_bcstr1 1 string def + /BuildChar + { + exch begin + _basefont setfont + _bcstr1 dup 0 4 -1 roll put + dup + _pdfType0WidthProc + moveto + show + end + }bd + currentdict + end + def + Level2? {setglobal} if + /MakeBoldFont + { + dup /ct_SyntheticBold known + { + dup length 3 add dict begin + CopyFont + /ct_StrokeWidth .03 0 FontMatrix idtransform pop def + /ct_SyntheticBold true def + currentdict + end + definefont + } + { + dup dup length 3 add dict + begin + CopyFont + /PaintType 2 def + /StrokeWidth .03 0 FontMatrix idtransform pop def + /dummybold currentdict + end + definefont + dup /FontType get dup 9 ge exch 11 le and + { + _pdfBoldBaseCIDFont + dup length 3 add dict copy begin + dup /CIDSystemInfo get /CIDSystemInfo exch def + /_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont + /_basefont exch def + /_Type0Identity /Identity-H 3 -1 roll [ exch ] composefont + /_basefonto exch def + currentdict + end + /CIDFont defineresource + } + { + _pdfBoldBaseFont + dup length 3 add dict copy begin + /_basefont exch def + /_basefonto exch def + currentdict + end + definefont + } + ifelse + } + ifelse + } bd + /MakeBold { + 1 index + _pdf_FontDirectory 2 index 2 copy known + {get} + {exch pop} + ifelse + findfont + dup + /FontType get 0 eq + { + dup /WMode known {dup /WMode get 1 eq }{false} ifelse + version length 4 ge + and + {version 0 4 getinterval cvi 2015 ge } + {true} + ifelse + {/_pdfType0WidthProc} + {/_pdfType0WMode1WidthProc} + ifelse + _pdfBoldBaseFont /_setwidthProc 3 -1 roll load put + {MakeBoldFont} Type0CopyFont definefont + } + { + dup /_fauxfont known not 1 index /SubstMaster known not and + { + _pdfBoldBaseFont /_setwidthProc /_pdfBoldRomanWidthProc load put + MakeBoldFont + } + { + 2 index 2 index eq + { exch pop } + { + dup length dict begin + CopyFont + currentdict + end + definefont + } + ifelse + } + ifelse + } + ifelse + pop pop + dup /dummybold ne + {/_pdf_FontDirectory exch dup _safeput } + { pop } + ifelse + }bd + /MakeItalic { + _pdf_FontDirectory exch 2 copy known + {get} + {exch pop} + ifelse + dup findfont + dup /FontInfo 2 copy known + { + get + /ItalicAngle 2 copy known + {get 0 eq } + { pop pop true} + ifelse + } + { pop pop true} + ifelse + { + exch pop + dup /FontType get 0 eq Level2? not and + { dup /FMapType get 6 eq } + { false } + ifelse + { + dup /WMode 2 copy known + { + get 1 eq + { _italMtx_WMode1Type0 } + { _italMtxType0 } + ifelse + } + { pop pop _italMtxType0 } + ifelse + } + { + dup /WMode 2 copy known + { + get 1 eq + { _italMtx_WMode1 } + { _italMtx } + ifelse + } + { pop pop _italMtx } + ifelse + } + ifelse + makefont + dup /FontType get 42 eq Level2? not or + { + dup length dict begin + CopyFont + currentdict + end + } + if + 1 index exch + definefont pop + /_pdf_FontDirectory exch dup _safeput + } + { + pop + 2 copy ne + { + /_pdf_FontDirectory 3 1 roll _safeput + } + { pop pop } + ifelse + } + ifelse + }bd + /MakeBoldItalic { + /dummybold exch + MakeBold + /dummybold + MakeItalic + }bd + Level2? + { + /pdf_CopyDict + {1 index length add dict copy} + def + } + { + /pdf_CopyDict + { + 1 index length add dict + 1 index wcheck + { copy } + { begin + {def} forall + currentdict + end + } + ifelse + } + def + } + ifelse + /pdf_AddEuroGlyphProc + { + currentdict /CharStrings known + { + CharStrings /Euro known not + { + dup + /CharStrings + CharStrings 1 pdf_CopyDict + begin + /Euro pdf_EuroProcSet 4 -1 roll get def + currentdict + end + def + /pdf_PSBuildGlyph /pdf_PSBuildGlyph load def + /pdf_PathOps /pdf_PathOps load def + /Symbol eq + { + /Encoding Encoding dup length array copy + dup 160 /Euro put def + } + if + } + { pop + } + ifelse + } + { pop + } + ifelse + } + def + Level2? {currentglobal true setglobal} if + /pdf_PathOps 4 dict dup begin + /m {moveto} def + /l {lineto} def + /c {curveto} def + /cp {closepath} def + end + def + /pdf_PSBuildGlyph + { + gsave + 8 -1 roll pop + 7 1 roll + currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse + dup 9 1 roll + { + currentdict /StrokeWidth 2 copy known + { + get 2 div + 5 1 roll + 4 -1 roll 4 index sub + 4 1 roll + 3 -1 roll 4 index sub + 3 1 roll + exch 4 index add exch + 4 index add + 5 -1 roll pop + } + { + pop pop + } + ifelse + } + if + setcachedevice + pdf_PathOps begin + exec + end + { + currentdict /StrokeWidth 2 copy known + { get } + { pop pop 0 } + ifelse + setlinewidth stroke + } + { + fill + } + ifelse + grestore + } def + /pdf_EuroProcSet 13 dict def + pdf_EuroProcSet + begin + /Courier-Bold + { + 600 0 6 -12 585 612 + { + 385 274 m + 180 274 l + 179 283 179 293 179 303 c + 179 310 179 316 180 323 c + 398 323 l + 423 404 l + 197 404 l + 219 477 273 520 357 520 c + 409 520 466 490 487 454 c + 487 389 l + 579 389 l + 579 612 l + 487 612 l + 487 560 l + 449 595 394 612 349 612 c + 222 612 130 529 98 404 c + 31 404 l + 6 323 l + 86 323 l + 86 304 l + 86 294 86 284 87 274 c + 31 274 l + 6 193 l + 99 193 l + 129 77 211 -12 359 -12 c + 398 -12 509 8 585 77 c + 529 145 l + 497 123 436 80 356 80 c + 285 80 227 122 198 193 c + 360 193 l + cp + 600 0 m + } + pdf_PSBuildGlyph + } def + /Courier-BoldOblique /Courier-Bold load def + /Courier + { + 600 0 17 -12 578 584 + { + 17 204 m + 97 204 l + 126 81 214 -12 361 -12 c + 440 -12 517 17 578 62 c + 554 109 l + 501 70 434 43 366 43 c + 266 43 184 101 154 204 c + 380 204 l + 400 259 l + 144 259 l + 144 270 143 281 143 292 c + 143 299 143 307 144 314 c + 418 314 l + 438 369 l + 153 369 l + 177 464 249 529 345 529 c + 415 529 484 503 522 463 c + 522 391 l + 576 391 l + 576 584 l + 522 584 l + 522 531 l + 473 566 420 584 348 584 c + 216 584 122 490 95 369 c + 37 369 l + 17 314 l + 87 314 l + 87 297 l + 87 284 88 272 89 259 c + 37 259 l + cp + 600 0 m + } + pdf_PSBuildGlyph + } def + /Courier-Oblique /Courier load def + /Helvetica + { + 556 0 24 -19 541 703 + { + 541 628 m + 510 669 442 703 354 703 c + 201 703 117 607 101 444 c + 50 444 l + 25 372 l + 97 372 l + 97 301 l + 49 301 l + 24 229 l + 103 229 l + 124 67 209 -19 350 -19 c + 435 -19 501 25 509 32 c + 509 131 l + 492 105 417 60 343 60 c + 267 60 204 127 197 229 c + 406 229 l + 430 301 l + 191 301 l + 191 372 l + 455 372 l + 479 444 l + 194 444 l + 201 531 245 624 348 624 c + 433 624 484 583 509 534 c + cp + 556 0 m + } + pdf_PSBuildGlyph + } def + /Helvetica-Oblique /Helvetica load def + /Helvetica-Bold + { + 556 0 12 -19 563 710 + { + 563 621 m + 537 659 463 710 363 710 c + 216 710 125 620 101 462 c + 51 462 l + 12 367 l + 92 367 l + 92 346 l + 92 337 93 328 93 319 c + 52 319 l + 12 224 l + 102 224 l + 131 58 228 -19 363 -19 c + 417 -19 471 -12 517 18 c + 517 146 l + 481 115 426 93 363 93 c + 283 93 254 166 246 224 c + 398 224 l + 438 319 l + 236 319 l + 236 367 l + 457 367 l + 497 462 l + 244 462 l + 259 552 298 598 363 598 c + 425 598 464 570 486 547 c + 507 526 513 517 517 509 c + cp + 556 0 m + } + pdf_PSBuildGlyph + } def + /Helvetica-BoldOblique /Helvetica-Bold load def + /Symbol + { + 750 0 20 -12 714 685 + { + 714 581 m + 650 645 560 685 465 685 c + 304 685 165 580 128 432 c + 50 432 l + 20 369 l + 116 369 l + 115 356 115 347 115 337 c + 115 328 115 319 116 306 c + 50 306 l + 20 243 l + 128 243 l + 165 97 300 -12 465 -12 c + 560 -12 635 25 685 65 c + 685 155 l + 633 91 551 51 465 51 c + 340 51 238 131 199 243 c + 555 243 l + 585 306 l + 184 306 l + 183 317 182 326 182 336 c + 182 346 183 356 184 369 c + 614 369 l 644 432 l + 199 432 l + 233 540 340 622 465 622 c + 555 622 636 580 685 520 c + cp + 750 0 m + } + pdf_PSBuildGlyph + } def + /Times-Bold + { + 500 0 16 -14 478 700 + { + 367 308 m + 224 308 l + 224 368 l + 375 368 l + 380 414 l + 225 414 l + 230 589 257 653 315 653 c + 402 653 431 521 444 457 c + 473 457 l + 473 698 l + 444 697 l + 441 679 437 662 418 662 c + 393 662 365 700 310 700 c + 211 700 97 597 73 414 c + 21 414 l + 16 368 l + 69 368 l + 69 359 68 350 68 341 c + 68 330 68 319 69 308 c + 21 308 l + 16 262 l + 73 262 l + 91 119 161 -14 301 -14 c + 380 -14 443 50 478 116 c + 448 136 l + 415 84 382 40 323 40 c + 262 40 231 77 225 262 c + 362 262 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + /Times-BoldItalic + { + 500 0 9 -20 542 686 + { + 542 686 m + 518 686 l + 513 673 507 660 495 660 c + 475 660 457 683 384 683 c + 285 683 170 584 122 430 c + 58 430 l + 34 369 l + 105 369 l + 101 354 92 328 90 312 c + 34 312 l + 9 251 l + 86 251 l + 85 238 84 223 84 207 c + 84 112 117 -14 272 -14 c + 326 -14 349 9 381 9 c + 393 9 393 -10 394 -20 c + 420 -20 l + 461 148 l + 429 148 l + 416 109 362 15 292 15 c + 227 15 197 55 197 128 c + 197 162 204 203 216 251 c + 378 251 l + 402 312 l + 227 312 l + 229 325 236 356 241 369 c + 425 369 l + 450 430 l + 255 430 l + 257 435 264 458 274 488 c + 298 561 337 654 394 654 c + 437 654 484 621 484 530 c + 484 516 l + 516 516 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + /Times-Italic + { + 500 0 23 -10 595 692 + { + 399 317 m + 196 317 l + 199 340 203 363 209 386 c + 429 386 l + 444 424 l + 219 424 l + 246 514 307 648 418 648 c + 448 648 471 638 492 616 c + 529 576 524 529 527 479 c + 549 475 l + 595 687 l + 570 687 l + 562 674 558 664 542 664 c + 518 664 474 692 423 692 c + 275 692 162 551 116 424 c + 67 424 l + 53 386 l + 104 386 l + 98 363 93 340 90 317 c + 37 317 l + 23 279 l + 86 279 l + 85 266 85 253 85 240 c + 85 118 137 -10 277 -10 c + 370 -10 436 58 488 128 c + 466 149 l + 424 101 375 48 307 48 c + 212 48 190 160 190 234 c + 190 249 191 264 192 279 c + 384 279 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + /Times-Roman + { + 500 0 10 -12 484 692 + { + 347 298 m + 171 298 l + 170 310 170 322 170 335 c + 170 362 l + 362 362 l + 374 403 l + 172 403 l + 184 580 244 642 308 642 c + 380 642 434 574 457 457 c + 481 462 l + 474 691 l + 449 691 l + 433 670 429 657 410 657 c + 394 657 360 692 299 692 c + 204 692 94 604 73 403 c + 22 403 l + 10 362 l + 70 362 l + 69 352 69 341 69 330 c + 69 319 69 308 70 298 c + 22 298 l + 10 257 l + 73 257 l + 97 57 216 -12 295 -12 c + 364 -12 427 25 484 123 c + 458 142 l + 425 101 384 37 316 37 c + 256 37 189 84 173 257 c + 335 257 l + cp + 500 0 m + } + pdf_PSBuildGlyph + } def + end + Level2? {setglobal} if + currentdict readonly pop end + %%EndResource + PDFText begin + [userdict /pdf_svglb currentglobal put true setglobal + 39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis + /Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute + /egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde + /oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex + /udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls + /registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash + /.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef + /.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash + /questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef + /guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe + /endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide + /.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright + /fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand + /Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex + /Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex + /Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla + /hungarumlaut/ogonek/caron + 0 TE + [1/dotlessi/caron 39/quotesingle 96/grave + 127/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis + /dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE + /bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft + /quotedblright/bullet/endash/emdash/tilde/trademark/scaron + /guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling + /currency/yen/brokenbar/section/dieresis/copyright/ordfeminine + /guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus + /twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla + /onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters + /questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash + /Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave + /aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute + /ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde + /ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute + /ucircumflex/udieresis/yacute/thorn/ydieresis + 1 TE + end + + userdict /pdf_svglb get setglobal + currentdict readonly pop + end end + /currentpacking where {pop setpacking}if + PDFVars/DocInitAll{[PDF PDFText]{/docinitialize get exec}forall }put + PDFVars/InitAll{[PDF PDFText]{/initialize get exec}forall initgs}put + PDFVars/TermAll{[PDFText PDF]{/terminate get exec}forall}put + PDFVars begin PDF begin + PDFVars/DocInitAll get exec PDFVars/InitAll get exec + PDFVars/TermAll get exec end end + + %%EndSetup + %%Page: 1 1 + %%BeginPageSetup + userdict /pgsave save put + PDFVars begin PDF begin PDFVars/InitAll get exec + userdict begin + userdict /pdf_svglb currentglobal put true setglobal + %%BeginResource: font Arial-BoldMT + ct_CffDict begin + %!FontType1 + 16 dict begin + /FontInfo 15 dict dup begin + /Notice (Copyright (c) 1991, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Arial is a trademark of The Monotype Corporation. registered in the US Patent and Trademark Office and elsewhere.) def + /version (001.001) def + /FullName (Arial MT Bold) def + /FamilyName (Arial MT) def + /Weight (Bold) def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def + end def + /FontName /Arial-BoldMT def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 0 /.notdef put + def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0 ] def + /FontBBox { -167 -250 1006 939 } def + /XUID [6 44341 ] def + /StrokeWidth 0 def + currentdict end + currentfile eexec A0B00ED5187D9C0F1ECDF51878C3AA5CAA3FFCA5020F48 + 69FCFE28B419AB05B54FAF364D68E82805BE1C1765A19BEC4D29A426539E9449 + 5BE860D6EEF29ED037F1F407E7FE48577F0B69E118A7C8737034DBBD04699FA2 + 80A7C6E922784295ED8C74A3C79BEB5BC6F95B767A170D04BD8041F7BDA3426A + 0B38EEBC414A4A52B6E26531115CF035146099BDF3B8A00193EF9C63D5056C56 + 27F34FF02A444A05338ECAEBA23251AC7E7B67DA94C2F71DFB3E6EBBF2B8CD64 + C128D630515F608E6436F23A665C100FEB078798141BB5533A2BE422590BB1C5 + 6D0F257E7C6438DB38F18E581BEDF1D3810B75C017FCEA8F9EAF3B486651B632 + F2D1D16279E221FE73375419D0A086839CFAAECC1618C4E60207E167DD9AEDDC + 37E07006BA902F4A4531AE919B9048413BE1EF9D321A92DD52A1B9B85D11116C + 5DEDF1C2112BD4E7BD1754F72123471DF2FA90FE00256B54B0D7DB81E1035390 + 4317D65A1B999795B9214ADD5CB2BD50C71B0C1C65DD95F7420FF93451281A99 + B3403CD0905E899046B1D4EEC1339434B286D808782ED4CC6D04AE1C92F14D32 + 73DD3E4C697AF30E029C876DC06033C5A55623074B84A6E5244237ADF6B563B4 + EE13D3EFCE21281E3F54526F5F1E4A5BC6CBD568A3D82E17B552176D7D0FC581 + 20F2549FB6A55AE982185B67D6962DBB1ECB64F77A2FBF7D597479E05AD8B833 + 7B2A2747961C244F8D47CE7372A440D2FA986D2EB57A64721615F6BFCCA1F0BF + 2EDAD01479994BB51DC4EB7C590A90EE81A1F3E477D760E7C886EF03BF55124C + 0A00F228D50F4F869ED28BF35C094F39087571769F759BE1EE3598DD5B58C9D8 + F85B744EF72FE601843D977E137AFCEF4E4E212035638E3E598B0EF2AE58E876 + 6440B3C60438D7A0EC054648CD04EB0A8E9A793E4F7FC322525C8AE24C726691 + 2A880F47C52FFC40B3974DF4D22C8B2BFC3ED011DD9B3FD11DEEAB8E04ACA611 + 2723B29E0D04F63BDD5B0836CA33BAD1310235EE9F1D69A5202F4CD581B8F66D + F5C9C045D628F0899B7E4188D2B262C1623403446E40C8CA3163884FDBA560D8 + A5449EDF3D6C52D1CAB8CBC763E39BAA68DDD188E021AB803EE3A6EE2EED2DD3 + 3E16D7B4A6AB33E849F894DDEC6CEFF007273F6693A44103C76BFDF0BFE9C415 + A3E69746FB35A20E885252D78F90692D0C7101FDE9E9EBB2953CD34F4D771E35 + A692E77C2B9045619A2BC3C2C058FA85589E32A5F4FEDFC98E4FD378AE32CB89 + 1A232210A3DA6F1266BA3BC55D748A864207064F4161EF8BDFBD9CCCBBCC1290 + FA3551CB543E7F74A8D7889B0A88EA23AD4B2787D084813663A144F34D0870B8 + 6FE2842D825DA8A6B33F9F886E82D3D4F39098AD8F9452474D3375FC9EC1255D + 017F13417A5EC4C91E2CB3796EB6D06F8499CA959785EEB01882D86D1A4AD689 + D802AF92E181B6276C0F267BAB4EBCDBC9CD978D93346EDCA8D28EA961C02347 + A9D9D531C73FEB745BA8BC37B94624E1E706D82B38CF26F434C596C821F445CD + A2CEDC3B10C63CC9CD2D506BCBE24C3E54B6E062298F094F6F2259271A2D8761 + FC07930CC62082493640A41C7C10BE1C659753638AB0F2FC3D2C22B355BA186B + 93B8EAF547557DAB8EEE8AF3B86BE3651D7B1455334062D7E20402F2AAEE9BFB + 6080A9AABD2611E581B25AEFEB596B08ED24ABC715FAF69863088C659A4C8E1C + 996B38C78BAE579AE0D181AE39B4C9C18A3B9278A1FD02EA8302C833376FC171 + BF9EAC985AAC026D472ED294051FE7C805714A13DB53938EB2501653B0404352 + CE6118F10D5F8A49D69BA3EE59FDF7F7B1ED07C1236A606C5B4D41321762E046 + 8019D9C64084A4C3DD4AEA4EB00D34EA00C643072CF5E44EA325EF80A9EEFD8F + 2C3C7E74EDE6A9AA0C191A2599B16FB09BF5EC8C9A2B1F17F6A1D8B598E311F7 + 4D2E047E053FC5F86E2D1FB64E78770DFC12F37985CAA063509B80A0269DB7F4 + 8D9B1DA6D24C3D27669B115EBE4CAF75EA2586724A9C1649F5C9F8D77776C904 + B52548DB3482119439BD2E3FBFFD4D1C602171437A57A3675658F8A346883EC2 + 0596DB9BB3B0F76AF1EC6A7BEEC44B39B76F24E427B15881D06F1DE0A499FF69 + 5D2C8B60A0CF57473F8607559DBCDA5D7C1544649F4F67C963EFFFE39F1D5471 + 7F303E886C54EA23DF62A172B5E75B1EDB98FC4ABB897E5E1DDCC5305BFF4E9F + C9BB5EFFC6F970A9D604231519A522606B3C9AA2AB17E6474EADA0B494A5439D + 0BD84093110E243CFFF77B68E57E70C5662BC7264D6CF6CF1DBB65712A311E8C + 2FDD3082AB7117A9802F46E8E6585673021AC210E8E821B7E5B8E63A6B68D78D + BE14692778BA472948C3DD2312BE3656382DB847E12F945DD6559FC8472F7466 + B28DCF25F249F0AC849871950B631A72606B8A3974FC27C9056F8BB8C88FBE36 + 4CE0E64AB23F1D8C10A435302124A6577FC6F4D13FA5B65F4C428FB9410EB583 + D62B2562654F1262209B130E7D779BBF67DED0874158CEE3EC414E6AF78EA5B0 + 51CF785BD7DF00AD450565245090EC55D5F03B0181413E02C73E851263AA425A + 1834E1E854BD004F1FC7E9C1E171D97129BCD9568F86AD51727BE077BF6AE2F1 + 672DE2CE46411C7D22B19078DBEFC082A73C979905E01133CD633CA92595C6B0 + DB688BB2DD5C8917D3BBCA94A994B84223AB4414B7B9CF19BDDD78FD215508EF + 4C1B52575493FFC1B0C00EDB5EA0719AB94DE49B507AE15BC0244B2A47474E6B + E5B846D3315425257B10868588EE49AE2E2A52EBDA205612E31EE015A95F9BDA + 494D5648F762997DAF12A512B3C43DF42729C0D21EA513151BA5DBE93F2A15CA + FFE20D77D30498782CA383EF952FF7B5EB19A2F0C5971D98CACDD7D8035D527E + 253BA55C2ABDC8E1778D882BC84E777A3B6051FF167FECA275B062BC67BAACC1 + 118AF58B082E8E4BC6FC7A80913A55C547D1DBBE57CB153A879D8BC02E2632F7 + 2061F11B252EEEC0B65853BFD0E6285439EA5A8A35B6C7E21A39ECACB39D0DC5 + 1D84FCAB4526021F9865D2EF3A1E4869F19D2966684339CB5A40D7D73C392DE6 + 29ADDF581649B180EFC6929ADA1958BD0AC8B17C88E364D9B908953FE60348C0 + 4015C80A4222D9CB14E4D51FEDABD792EAB645CDF7CA65674327DD1987A89F86 + 0B57095EE175B0F8B7EBA84D867FCA3DFEAEF38FE2769CE6751D17418D0368EA + 3327817A4CAF67D9F2AB7DA404E69C7FB35BC7BE7C1B429F64F687D4797CD398 + 311D643B8C7E30D5EF3EAB2A990F4385C3B0AD5C44F34FA306CBF0E52E7CF164 + 20FBD608DF9D2208029399E85EF137725748F95868AA280C6CA2D726687EFF7E + 1C26AA1D8A08D87BBAA3D222CFB9102DF9990841CCCBF7D717813FC43099FAA6 + CF3A7FFF2BE6A869BDF92D8FEE4A89D16C9BD3ABEAA6E07B13CE597F12C95732 + BB14C9A9A4902F27870FDBD4CF70EB37DB47C130564C18CB0A87AA09F7C5E045 + FC0D0B8B7EDD1C3F6F0D4EC46831B1B0D1CAB2C6E0EAF49B59654F5BDEBA31E7 + 4E35397A004996A281A44C802E1305E21C7EC9CF0F3E82BE805AFD4EC2F9FABD + E555A9EC58657D62E65A3A6AA610D87B89474EA2C0ABEB919B534D1F7177273B + BD0DBEBCE083BF67EAF2140F12FA6E48D8AB8ED2A874C821F66EB27DFF953865 + B4148AC5B3540D6E0B5D8D42850DC20486AC50907007C82CFCAE6C85E6DEBFAE + 3B00861F75BC5D6F28412851C658EA9CB9015A9D8AECF427FF575BEC703FC583 + 8525D86F7DA7FDA35C03DFED51BD629C5CE1F90A79B9E404BF94FEB843D5A564 + A100624431DC55E2B7DA8D04C84F7278C4F55AE63B44714861FA24E7B9B359EB + 1879A9F3000A005918ACDFC0A8AC38997EDB24CA4DCFCF3019DF0F5558D95743 + DFDEEB434C525765431A987AEA620CD5FB939B49D9BAC76D62BFDE83DF981673 + 674DA67BCFFB68DBAAB3889F3EEC8D7CED342A27991473410AF46F55D950111E + 87FDE431201DC5077C2B7480B1F5CE0ED2E60AC63C22A5578C193931532B7820 + E997333B8B6DF8ADC96C59C63164AD4911137BA379C92FF8905B40D6E8B22569 + 6576BD0C42E3A7934BF67D11962B5962CA91232FB61CA3EA105A7F8BB6EBF604 + 7CED87B27D056BFCA557B3D1213C1A807C0EC9D25A863EF4BC569F6467D837A5 + E72EAC1BD6649D6E55B992F1282406631264D040EA8FA1A76DB77D5516557C74 + D774F2704248B41143F81A0757ED477E1E693604F761BBC6A0A47D6C5E1BA8EF + 59BB3C4D6FC027490138F792DFFED59B1D8ACC964F845BAE1106728DBC1776A1 + 89C2BE31C01BABA8EFC45B6E6CAD399638EFABF0D4B45052ADE173859AE3D6E6 + 9E85BE3DAE09458781FC9C871C856C9E3B8C581318F700E27475E93A77D00025 + AF26B9AE72B81122A56A57C8459DF38926ED208F8FDC4443BFF2BD2E8D589873 + A947BE6AE8D501516D0A586EF0C39D13822325AF939C39B1D17CC2286FB8FA82 + E045C283380D9D627AAD6B4D4AB800EF9BBC3AEE1398E0571B372B14F1EA15C7 + 9148AA2DA402A72354D6C20093CC4EF4126C27727E0D5902665801E1D050B28F + 862A060841D463C69F64C60B1B169354CF07B1483ACAB968AD6ADDF317F9ACE3 + 85A274A39B3466B667689F16F50FBCCE75BB8EA6666CC69F4E460D17CEB7AE5C + CE3DAA9FE2110CD355E02CAE06074F99DA950DFA65B536ABA9F1B852C4A2D961 + 1A2564220ADA708E670541D32393F1071BC876281A33E5C9673E61EADD8B1680 + F5E69E1351D9683B58C053909B02BA394243315350875B209F56DF54F4DE83AA + 3E8F7CC4BA8FD8280FD516EFAAAA2881DD9514F644B6E893207BD4026FFE2252 + AF806254492FA55CE7D09F1B66243A72462B03D54350E6A55BC6F12EDE24149A + 18C6A45788C3BD3858E084155E4A15EEE56F48E6B019D2EB2D400B9117946949 + 4CD70B9703B3CC04772447AD2B968B49A8F9B07A0EB1199D78283FC914982841 + 36965AB09BE1E5CB7C7974667543AD854827B7333FC458D680A06C491CCD9E39 + D1E745BA3577A7CEF63A909C04CD9DE56AB57DA35B9AE97284516ADDDE7B59A5 + B5B55B5F7E49BA648900A7D511D3E7AC47693FE4DE21EB0FA6EF3AA35B980C22 + BE7BB24D6D31BC9E9376E7801F6946B41DC629FF341172174997D9D8111EA72C + AF09A38923DF201A2A2851EC341AE8DE43AD52DF3001FF15AA6BFF95F2A84DF6 + B521241BBB9D6010D09023312B54ACE4A0FCFDA9D8D21255A249A150C9E0A7D1 + AD894B82F9798E5CB072BCBBDFC5B79086BBC1B91E5C610DEA0F32A3F7F7317F + 9E4BC64042C41113D9ABF187120A734CE563426B8E7AAECAF43F5228D026E5B1 + 28DC8B6BC21264992D92F0AAF93018880FDDFDAAF7874A06B7D6412B9AF3BF1A + 6E58EF8E5C4283DD70BC40D0F0007E362424D629D9E1D877CA534E040A470071 + 7285DAE114C95D0A7ECFA95CFC79A5CA35FD190906C2CA17AF02E07FD68958BA + E33ACFFDC2478E099386AF4F2ADD465B25530A62E959FAD1AAB96A6C69420021 + 63B4EF8EB833C61701FC8A5DE37EEC42A1E574333ECC4DEFF71AE771B8344CD3 + F19A4A10A9984260622D770087E6F2FD5714E2F620079BCFCD6C1A9F5DE21D20 + AC45FC8C37A4DE50F88BCCE8569948E82B4CF6420CFBA7FDF1D95BD59A89845E + AAAC3C4CADAC48AB3ED5D37A6466CB1AC31C3C7182D421EA4CD7C2FE6D934098 + B87F457A4F498352E9BA688DB0B06857BA2ACCAEBB85CC2FD71B6103BA00AD14 + 55FF2FD9F53FACCF869337A7F2AB7B484F247160C6753DBFE587A1EB383B7C43 + 5860D8C3702B44711794C8559C1B8B97EB73B5FABDAD1FACDDC79BE1EA48F39C + 6D1799FFD4CF7971B97A8222CDF027C7FD8F7B4ED8B474713FAE4529F87000B5 + BCF5CA520D1450ECF367865D15856F4D127D8D98AEC55D464B96288068C0EE44 + 918E7F7909FCE4100CA06C24326380EEB0F4EEEAD49CE2C72FE93FB7ED764CE0 + 015039ED26935497A15583F6F0463A6CEC9323AFEB6D1722078FE036D56DE441 + 8FF5D396F9C98E41838DF1846F7D02D75A1376AD7F88C843A5D0B0233461719B + 2C0C271E42CD5FF6A799F516E8906F109E707BEE6D71581FC76D349ACB242D0D + 5CD9FD6EF5ADB121F904848F3184A3C2CC0DECE579D3438D4CD7B173FC4FDFBD + FD604FD61421E039908475DA6BDB61AEACDA9C225119301A5CE0F5F783F9F1EF + E58882E7565C93AAE411CAE92BB2AFA127D45BD7F477480148CAED36B30F14DC + 7A69B3B88F13047DD20EA481A13EF25AA98F66FE6F10AEA03DF80A1FA34A9D04 + 7E1CA9E37DDC0AC18978E8BCFF43DD81D0122A707C949C7ECA3EF598438B5679 + 915CFE2A9576E66981B91F637E666809E90895DC06CC543DE2C3380A4ED2D05A + 821DA469044EFC5F12C1CFD5037903675A703ACF2C1B49029A63D2A0B43D044D + 584FE44866A328545370001670165FAA76C57B97035432AF3536F892D93E30AE + 6495E4A6AE9E1C16ED2F5AB3F2BF81DB48D70DFEF38F1DA3A468208C21572491 + FCC4D92E17DFD95F365FE8D9D2D25B9C997E72DFCD2EF4B302ED428A9645298F + E20BB0EA75C189FB2E3E7A8E463FAF92AD214CC9263001F27758770CDAF007C8 + BCC9A085320B1F88AF02A88F9FD0120DF5C4104C2049304E360A22781CC2C27E + 9B661C7345BC1E61C451AC4285DEF04B0CFD137588BC0411F60F51F1254BC78E + C599E5A5B937261AE3B612B8C2FD49DAA029DB24B3DFC510D708D97EF0AD2473 + 27BFEF55BC3D6EE029014B3F88DE0E285B9378DD28CC2A8CA33BAB3E94EEDD69 + D95309FBC1DD6CB786D5FA277531679E33F8347876997B80F8B76594D1607F30 + 572EF1FF3361091EDAC28619803293FC40080F32B1DF166483FE6D81C94FB8BE + BA913D97C251909437780F2B403E33B0DA48497552FCF7BE786BFE9D2CCD5C24 + F54A0D3865C70C07C999E5FA0B822B916966A68310F5C692662746B2EE862BF0 + 5AF5F5EF1B1B6F741AAA581E9E1EF2916F1407B89C8E8C33BB5F48609E881761 + 5F5600E7013043B5DC141B951D6FAEF604849E3964C13BFE016A704791911276 + B0CCAF564B5CC6023A3334E69A02CA7BA64328B8F81C4C3FBCD779C763AA60EF + 6419FD6C0E416F5CE6A32096B737754F7DE6761CE028AD97CFDE2D16596CA20D + 5DE765F602758E4E635AC388CDB54E7E82D9516F2F8BD5059353F1A3BF030FBC + BCB1F18E76E9392B9340C2422C8DA7717F4EBE7112FD5BA7DD641C99DD65D6C8 + 27C715B9433A54873B2FBAFCDFD786699E24A7E7DE78BF4286D5B143A296DFD8 + F8619E732B7152DCD00441D192CE08167C53A3E70745C3BDDC3F5C692A001D02 + F2E36ECB32939D61C7ADE4FE924F1F8DB67D08BCF492D2421FEE4C6687E5AC26 + BF8A06A5CF79C5A5A627A14189110DB91E01A4F2D3D92F187918A6967713FBDE + 75022B551F8B999AD41A1F0F7FCF7C2E41F263B414CE924A7E88A47420E6911A + 27C971F333BFB47D7306BF74B44389F54BF9E51BE849F70DA288D16F7D091CA8 + 10DDB815056B0F8AB66D45E58B1779CB79223D32475901C122A4E7067B8E54B9 + 5A064CCB7808086CC0C8B7ACC66CEF056F3B4231E62D8D3A7C58929C3B25C40B + 427ACF3DE83F50D3C23236124642AA17C9299364BE276D3F2D58459A1E58B8C8 + 7EAB08390A461317C33B41881B46089FE5A4ADFB24B052877CD2998C631B8B7C + 3AE7C239DF03BF51E93A3ECA6AFA98DA43E981700240CBF7F96B0F8BF9B03FE4 + 54D3F7DAED9AD3992EDEF92F1ABB7261312DD935B4C625118B544B2DC234EF5B + 084799116232B24042D53A82FB4E1387936D290A8B9B150C12BC5529C8373203 + D4A6F1B88A2A0D7B6497099B9F63D44AB78B79420D165937DD644B688F9066B1 + D2F5D024FA7F1E082B9C9A90CA1C9E296944FF0270E23F7BC52D9FF158A03FF9 + 03A3D44A8919E8DB14BF1A3BD54895AF449DF8FD361443B7FAA9A11A89BEA2E6 + E99DA8C620B7AC082CEAB7ABD1C2FCB792BC1CF8BB98393367AD4939D59465D3 + B140413246EF6B5505E9843696B125DAB1E0D9E8DD23DB8DF4DCE3CB0B256775 + 45CC73D17E88E7B3A6C42986CE55C0722CAEB188B5E476A95112B4FC9B6BB35F + 8E56D5AE441CFB03288A291B9A5A56F78A4226FBF2B466575DEBCA6B7AA6210A + C23A3AD2DD7714D4A5995AD41AA3B5A6BECE076034C1991C8BFFBDEC29ECAD37 + F09086AF0811A92A60CC8E5EE2984301B5C7ECEBE3EBACE33059468311BBA691 + F8F4BA8CEDEFC000E020ED302DA02E2B46D9527E12374C8C710095C21C82D221 + 3059C20A1A6028D9426EA6CFEBD90DFF04FE8F942E68FFF01DE50B16234BAC4F + 2AFC733E1C844FC0FC37E8E92309D1EE60EEB16B13CFE61D21302021C8301BAD + 2D30BA2DF2BCE16453A98FF3D1D42A84CE81A5EA371EF62CCF054D086C5D672F + 93694B89DF5EBA809BFD56E492EEEF6DDD784EA205098828AA904773A19C2E22 + 26D660F6810969C3A142E9313B4F8325AE00845C048F5A68A682B4DAB655AD8C + 03F118107FB88E5D4BA332568003FBFF144D4EFD2142ECEC29F035F6BB37F240 + E2A323387BFB791D0F953F26B89CBA5C86D969D88C34F7C961540FE3B5D87E2E + 680CDE28EFB7C31ECB32817E6E7376101673B373D11BC381527158ABCAAB1235 + 7302EA2713C2AB89B7985E8685F4EF1074CA31D19E4F7AFF01CEB5657C790EA1 + 1595BB85EC158BBB0B52F01E2E68533B6C51DB791A41BE54E1E5002B0A8A7B16 + 483736867BF9295D6F5B1C067CA82BA1D5765DD8F2441780C82F83B12C2B12AC + AC5CABC89F17BD100299E9DDA79F0172F15783FF9433095FD3AEF9921AF4B290 + AD5EF82C25D606F8E1C57440B4786D662F61CCCFCD47129B64304543279F4ED8 + C623724788CB12FD9E8E1F11A16DCC2133544F0E4FD1061D3D39B4D1566B3490 + 21DFF979CB2A08A75B65E37685CEA98C02C3560F72AA308CD76C35E1E9516F3F + 91415E9C6D123E5DF16BAD3A9FA6082106925AEE211DF828574D627B4BBC8B20 + 6943F2C13DF109A7D23F3F181F80C63666A25310FD3BBCC792CE84B9E8BBBA0B + 67335016D177930B85A4356ED5EA80E154C5B255B69DFC91F5984EF1749A0057 + 93B1C7645BB87CA694178065B77143C701213746B83450F8F6AC91A0CA5A0B5E + C4D0CD25F518A674343ABCE8013135189C3F07DB93918F23D168A7704004D73A + 738395C255640C7AB99E0E184B4B4917F2FED7844F70082C9D202EF7544BCB1A + E841F633B999C3FCEF7B4FEFF1D5398C883BA8CA43CB4681DFB11CEA1C31D97C + 7C6184076CB38E076A5D4DC22AD1B84534A66C7E7BE7F2A0B7445FB2AC022E98 + 34F7854C98BC80CD937778FA01AADD72A8102E63A41E837BDB9CFAC77EB63F24 + BF2D7CECA59709A4AE2EB5D30CD2EA860DC28B288F01E2B71926DF89A7AFBA3C + DA19B30617CD594F1DBA57892A1D993FD9E63884D08FE488409FA3511E4E9749 + C1F2BE3590B6589B3B9B3E1159DC8D9BA97EDAE65FF0A0435654A61CAC628F1A + FF8B3794A013DA5D82B8520117A7412D4143FF9037E6BBA1191DA45C4542A5D8 + 881C313D13C377E636C814210F6D97124BC5BCDD13670191D7B43E03AF553AD7 + CA125308AC66E3687325EE5D5C9C11E4042B3B4CB43D8F635302CCBF7407AF0E + 9C87BCAF146A7AF48A2CE534ACD3119D04351E59B64594FCFAB7C76417215F37 + AFD22CCA4C0F4A98644366F86C9CF618531ED747C95AD237C516CE8FEFCE381C + 0E3A3D0B439C070BD0555B1415DF13DDADD6C836E1472EB1C1118FEDA9C1C583 + E06769BC993201AB1E132E13D0FB98E9621078AD082F63CE00C12F4B18AE585E + 454805896CDADF5492180BCB7E38DEC944C42A4DCA5C5D5FA69277E40166269C + D60335391712FED3F5D772742BD1BFF1FAA95F398750E4EC9A8DB9FEAFC74726 + 0B13D09B90D2424207903C456557BD6AEC9D89A08BF58FB60A18702D7CC2DFCE + 1ECFF113A68B68E7358A8F31AFAA04BA99488FCA4A8231929C710125D6DD1F3F + 44F504CF999EBF7D57FFFF39587FA052A5A084272A53EAB0B2F859BF91F65ACD + 9C748EEEB2235038F774669EB80DFC8D59B1696A99CC84FF07EBE52DD234D7FA + D04F431B2F97D8C446278A899E4F9C012AA31A95CF993F1980BBED045049E316 + 7EAD37C04CF86D3F12D0936944761CC01EE16E9B3018C715AE7C6701AA7F8150 + A86F293EF30EE68FD175E099CDA37DADAD32C0B97D173F49C5C9FD5D46187BC7 + 64D8BE8FC92A289203CAE007960EA02C61122191A89990484F74AD3A883CB135 + DE3A7F9093DC8AF2C8B4EF83CA995064BD13CE56995E56F645A1B9CEC7F93795 + 31B0F846359EF21BD8D20EEBED699890697CE3802978C80A5720E58A9D72AA7A + 6D283B3ADC5C5CD4F682E8BF13469BE319A802B17F65E5195038C990BB8D0B9E + 2BAFC8A2E1A5F477F2D5B9D187FDFFEF8E75249EC8D688B8A6FB40D2D0FDFAC3 + B937ABE9817CB4E611F8A128EB09FDD0D8584391A47F440F330D0BF08CAE2C90 + E7ADB27D34852C8FB0BE664E0F4FCF6078B458B7EAFE7746EA801C5F374D0B67 + A984851CDAC1CBCD55676059EC8720B6A4BBCCE5D5C5805EBBE3EC8DB03D50CF + 35BF3BEB41B39C75FB970687F1C0FA3F179CBAFC7816D4A1CC2458699BC42281 + 4A2D4448D032FB9C4F0F7277B243D03C6EE3DF8AE2D3D4353B28BF319E180D2D + 5E181C9AFB5C9F21BF4C0B5489FE5DCF02CB3C7C6F93D7D9C65622A32457ABD0 + 3337A7B94BB606FA84222FB2D3C17267D71D172D99E13391E279D62F35A6AD67 + 551AC747427AF2BFADC5ADF846613B189D9A5A1EC1AC2A1C0DCBD47576404B7A + ABEF094CD4858585C8ED8A343553175596AA3809EF8594F5CCDA6626D9A59D07 + 98622B580D1C2D7B0DAE199EDCED7664646C97C1D701A4EB1AD9D8E524FFC216 + 57EEABC7598F50E42E03D2F4AC74031956C4A56FD1CD6BF84F98E3B729FB7E26 + 29A945C4AA5544E0E27EA4AAC207F4D551517647959496ECCC70D167A3C3DFD3 + F87BEDEA0B3C780960C4560F4B0043B5DEC279AC41633F560EA60839898120E0 + AD9C3B9B931D38A73B2A03A5467033AD048CD88CAC1225B59F526C1E396EB67E + 70EF592D905FDED5C50E52D813A36794FB519F68E457615377F2491A186E42C1 + 28C0EF3DC6435833597AD2685398776914821FF0A6643276D8697D5B0461E924 + 6E5AE87EEC95E6D4CC5F3C6878C25F029F50CAC4532161723816BFF6A2A13F1C + 3E60DD883E84D2FB1C8EDD09DBFEA0BC4F95C3C1DEDF10A3FA212980263456A6 + BC708E401600375D1349D53B1DB3F4CF342416C8BD3FC9E95A40CDF49FAE3944 + FCF12D90B3E7173C6FE81693B533757BD3AF60124A6645ECCA5CA1528FEF57DD + 1144F34FE7A90C243028B7346A95E7859D81902513F3B24A4B3927EC123BC37C + 1ECDE61F931F73D5D32F61149FFE9AAFAE6CB9A6C08978B3DB9EA80FB756C446 + 01D1305BF4A7EF2B2AF1E1F02D258645A88231685CB573232AB777F8F7C60D19 + 7FEB70ED3107D841FFA1A7D4AB4858B56315825C264090059B3B906D4805F9D7 + 5C1F74012E14A68D1542A57315E71FA6C82B2904EC913BE67435C791EEC865B3 + 9A93A246AB8B24F8B2D324054DF4348796AD4C6E8F6ED09ED1BB8E980F3D62C0 + AA2103BD9107A0F7685CE43C25D1DCF400C0331E4EFB65F7927052DAFE331C5A + 0B9789B8C81790BAD5738376CB50F469B9C0AF89EDA54B18CA9283F6C04B4711 + 984ACE3D52A284863315905A8EA5CFEA9C70838A8E1EEC5245CC553399A962CB + 1140A106ADB20A701B590B2A571C09877D000E65946217EDFFE2596590C0F14D + 7EFE58F8E6D31EDF4493994AE08A0C56A8C95E2920F71B311D000AB4FAB2C38B + 96C28B19378E300DEA04F5350E25469D9753FBEF4F68EC03D1E29C7CDA8B7617 + E58E8340872C6EC64BFC93F6EF5BC1F64E186971E35D7E3531DE0B81034F21DF + EB65D8DC84DD4E8660257E84ADB9ED22BA3D831060E151D4B71FFA6482F9D1FE + 9D68DB59DB769C6A23B220562CDC6087A980EFD706AD8064042007A49A5EACF0 + 88CC426DDDBBBAB38D5084966C31A14BADCB29502D42D611A7B4A7D654E89840 + 04F0B7682458D5FBE2EA3E847A0749D1218480700BFAEFD5D63801A085E94677 + A4585D5A070ACFFFBC8CDFB4CDD368E33CB0BD8FBBC639E44AE36C7F2442940E + D2D79CD95454FD27AD8E0AF18F957D04A0483326E97C763B1BF794ADBAED630C + 97FC31BCE00FFC7643DB64AC4FC6763C11112B3D8703D739C2BEB52D9D4D2594 + E804D9D1289584FF0AE9722D6EBC4760391E03C878B0B3652CE0BE04747E7355 + 4B1B3F219CC3C15BFB92E92C28282080384CAEDA842293E8546E69716C215B58 + 301803208059992D905331DFF6485FC4AE24DC6481454F6D005AED73A7CE5276 + 6079ADDC65C086E434707179DFBB7B85293857395A0C02CE537EA4198540FCAA + 7FB2E3A183E9AF9730792295EFBC70FE109744895A119C37AAF80676FE6069CF + 079B2424D89A8C020D9BBA5C9C10EAF99B5262389E259DF8F4D6563998C21F29 + C958365DA770E22D606C13D892A0085CEEC72DC76CCAF5B55151590340B98714 + 9A87EF1154066BD130B8DB8B21D90A3D4BC617776EF9F36C06DB41BB1C06946C + 1177823C9203F3F32C4D7CE534012C291A762EAC1762ADC1F1A238B4F6F2B55F + 0C4A61E3E6213B8FBEA37424421416C54902B674638956F1F3100186BC780E72 + 738B2238406BCC59160C7262721F8299E3A9A9A7A92F1E9E10671EC18A540FC1 + 38C150C45E937A8A482A8BC627A9BAB1CC94BE02B02B32565BF1052EE18AF4BC + 838F671CEA9022ABBB7D97D5EAE1635F69B1CEEDFBC19D46E07F3D4B0783A3B2 + 50AB2C39FCD91BDF1277703B827E3B6B1DE524942F0EDA63DB1D5463B6D95285 + B793F7DA3601B8855D8344B4A104F93D66AB4D25E26D927A52F5C8B5FED789B2 + 8D4EC7419406D09A65A25A85E97CC464CEE5B5CCAFAFDCF1CBA78D0593149458 + ABF8794EF422C766CAD46189635453F51A12C8A81927943D27C72A53D0B9EC0B + 76A836F4928372523D13647414F08EEBDEA8BFD1FAAB403AC25F37BFDB0DF1CA + 2CE626220EA395C00A3375A6FE1CE0EA65F3AEF3D23CD328D25DD1A453D53F92 + 08EA1A31E41AF3372E02F767AA669F17A66016DD3479C49FF2C3D001D2A8C79C + 98354E80E9CBF98873184F48558A93F2A720A8A4D80DB2B7C1F72D0977979E62 + B4C9B5F28EB1FB582937D76E5CFAFD6BA7D7A4B7237F2F7B5E1B5968FF578467 + 580A1E65E2E84824C4C388D80D34E6CCFA755C88ECEB3B9544B933F80159D284 + 2E98E38D763F8474423E0C3DFC0E9D546A52CD0E16E3F78E3CFCA9F50CF65AB6 + 8E6F356CC46DD901D3BCFE408C7B8E947E54D9BBDA3B4ADB5D862B1E89F24A65 + A8229DD40B9258F11D1FC88D474C4EB444BE76E20CAD8F08DC3A826B457DA886 + 952A92477A930050F2E3FD35A2B5E828864F14F2F5541ACE5290EA64BFF5F8C4 + A2F5ACD0075C1A3501E88671339382905C918C5FA2BF5A645FEEDD85EA492B29 + 74642090CB2B1B976B6DB6B357BB32CFAEA302DEEE2B5F6E3241BECA989316A6 + 277996CC221BF6BD0F4B0CAE47751AA99094B87585F2B24240470FE19B461A43 + AD1837AB035E12F68A989AD69E26C3FD67A07229F435852AE4FC45810691E2DE + 278934F5848092454E57AABC69D687614E224101E361DF86E6F9B501BCC1952E + 19D5CB83AE7495E9C498FA75F84417DD53472BDB8D27B8B55B87640AF058FD85 + DD8169D418F438BA4B6753BB9BFF41985B5731AF468D4962BD089945BBF627C0 + 0CD8AB32AF62EFA4AA37E30DD229F1A5868310AF50D6C633BFD9382F73AB0384 + F3309EF0219A6B38C3B5347ED163EAA7F47399B91C3A09B054FB21E316893B8B + BEEBA09E4FD1E6B760A931B7D8E5A3B0706D5924809961F93BBA59313B8E3EAF + 5CA7E2855897322929B2FD58290A4CFE9DA58ADFE68776C89E06101EC1AEFAB2 + EFC54203F04D6872EA8356EA089D60E0EE944A78DBAF3A4786F6F524096557E6 + 570D9AEE1EE7A82622329BA04C1628ECDA430AD2C41CBC1D92D2297090DDA990 + 5790DCF3BED588A9144C321A4D60C97BC5A758433F776AB136C0E78397D5C382 + 635234889EF13D398FD198E41810BA66A5C73A23B40649A2A4EB36FB2E745362 + 10C81C6B72E3B9726549BFE71B91116ECC6B62D19D07D34A06795F798D05528E + FD457CAF852134C35F595A54CF31021D1116D3F4BD858A5BEF951947BC336139 + CCE57A8CD7CB1EC30A95614A388F403607241C864472220A2AA256EE682DE51A + CD6E49F6307FA965D65BA05D50CD9E1433BF2D8769AE1BB5273B7615D0C7AA4F + C47FBA8450A240C87FBCF5EE65172972FFC4A85536D57EFBF7CC8CC700D8819C + 124985C98F1394CF97B22EFB10027F63BE76EC6DB5F5866D004C32E9F2792FBD + EF44276EDEABEF0DC2F6F346719400FA2EF8151F79F7DE6517A13DC209DE81DE + 0FACCE6491D4866C06BE2B376735E48BDB800516D08CC6D5B454467E8EF83F8A + 982DCB86FFB3B9D4620A3E98356422FD328330DC64E1278AF07C798ED1319CC8 + 4F5311BB91B0DD5E5805380339EB94D575848DF52503030827866B7DE6E85D7B + ED098F4CD28D711C5337D231385F710B5AC60C149BD00C491E15DCA71F157027 + 8BBF22FBB4DA70F9616042A49F7F827D96B83B08A5A7C9CB3794B3BFD9DBA4E6 + FD066E91CAADDF99AEEB2308189AE578B5ED8E2A10652C3CA1EA29FFE04FF452 + 0C71E2D4DDBBC7634E0716CCE695DFF93A04B1984690005A240D1BC4B97370EB + 2D074EDFDC2C303CDC001910CC3B90D6F5DDFF3EF7BF6DB6A98ECBBA533B59EB + 83485B1988B0AAB2904AAF2F074A30F5CFE92DB1F6589D31C33E62946D44CD40 + E56FA1732B8610930ED87CD29F2CE1B52B156AC58505580FB21B8937F922B75B + 9610BA37775E7EC99DB805B7B39DEBE375EC2C82544DB55698E9DED37B28D0FE + 0181F035EB2DF8A84C202C893ABC9E5AEE4A70D7CCEC5B51A2B0CDB7B618F812 + 8E68346649654E2FD81B2E5B61452A4F35730AA9D71F7A241B2B3C39B2DC8018 + 05FCBD17853B8820269D1AA3C33699FD1EC55FDC15E28688A3CFFCA5CF86F0D4 + 31C8AD7503448FFE56B22E063E4699EC485192D492E2FF30008759B5332D79FB + D383BE46807C6DC44E6637EF10A4FCA02BAD7A6D62C05F756996B9F1EFC59A87 + C976DBED30F2FB223D6664FD46A3B94FE870EBDD2938C97582FFCC7613E66264 + 5A40580E4349F4427EA45BF59F29F1CC10B582BF9D9C2A46B9434F93BF9F562C + 90311D2030E00984723F82399B71D41459D6CA8083C7DB67806AAF3049DAF42F + 6F919691BD5B5D61D052CD3F732A47C642C1493DC917708666CE13A9DECC2283 + 78C1151D194C99E6518989D34D7ECB7F15BA0F726E79417AAF10879CD11FF84D + 2F8EC1A7CBB256D3D1BCEE00A9904F015EDD51A9AB05A85ABEC6F56B4B6A9CCA + E0B1EA47FFC0109C2E3798ED853817A96B8B23FBF512EA557796836385DF6806 + 4A7556BDF10D80C3622F4E6F0273A93A835924D2C73882D79286B254CE49A05B + D5CF8BE4D0C71A0BF83B9CA5E9289B8441914F45D1C2B455D90503E58B98BC11 + B3C694DAFDF167E5C5AB48F61F8B714422D8AD9A693015A84B0A5BDAE39D11D7 + 2B09ABB15358A0072E9AFF5CDFF175F897C6C751AAF9BB2D1AE97C84A3EAF913 + C999CDEF79AB170FC724A3DCE838C280DE524663CFA4856D122C72AA1979FCD1 + FA537FB73A0C854E3F21033FF8FBEBF6AB2F1D5BC49BE81809BEA2EBA6C1EA5D + FA63A6414760BC8E0ABDE07F7693281E970D3B1E32ED2D70533748C87ACC2D04 + 67077D3E4F72338E916AE32D3CB066986A203A8CC53D461D2A418443F49A00F8 + 14B12F59FF66E024BC3B0241E3352D865AB0451B2B1F710E744F35AB1FCE7C38 + 66000F479FE2BA3EB1906C48ACCAB652078CC3349E16071F777C3F9A0176EBDE + 564AA4552CE9EC8D4ECE4399A0D45CF831FB2C9A21EB789063079A7CF36FC8D7 + 2CA5992FF670600B29831F9EBB740E03171F946380558A07BE8F3A5B73FD8D5F + 2CA7B410541AB2071E3BB8855417F77C8D911AAE3932B6E2CEDBEEEED5FA58E9 + 09CE2CCFD16F0B8F808E3E43205F56A98BBB446CD9985FBEE58EB5C60E9A6887 + 71F7DF24E568E094082C3797D3761FB30DB8480F09612C589AD63E984B887072 + 922A04920450FB05BB301DBC3EEFA1D43F9693E4BB5AE0D4EB8C542F804A3D76 + 12152C6AC333393B346CBE059F1E26AE92A813D88E7FC5DC9DA061EEA3E1402F + 16E3C3A9C1BD0255700D96DF39D36FD2B86E423C448F17B67D9933DF8587D8A2 + E84EBF9D4635B43F125165C83A96FD60F800681474A4CCA8004324575F28C91C + B9D4B780646735697B75712FBB56A4B572AF7B7C8668F32AD81BFAE45E285D04 + A0E7CB89A92EA3FA21FB433F4F6A5CE38A12AA5E3E29C68452AA0E2A666CF0A0 + 6874108064E46C2D3B26B005AB8B4641860AAA42981D22B052F4394A839EC42A + D9C542B8DEF07ED20E377B3A389FCCC0F88F8590DCD417EF3E6E92013EE1FC51 + 13CD712AF88600764E251F47106D74F046D9C976B0BF24C5796B7FE15A310457 + 67AA335822241DB4CA4F3BCF6940377D55D78A5B46568821203F5C06881B6411 + 2364C3ECC5D43F6928B20C118F8A76166FCCFA749C0938D4756FACE32D977382 + 8B3E8EDD49825788339352DB6BA0198F980BA778F69695E9497C954EBB3F6032 + 2056B41B6D979C83DE9671CF7D773A118B7191AA7EC4BE45B4A0E5A448565028 + 3551CC4B84D159FD626EA0BD94162999FED7CF55C1F82112F488804D9B159756 + 05E24128E81A5EFC7E8ADC314BB6FA6D15B2715D5934FAEB688B6528AFEA3938 + FFC21E579E88D4DB719E852E6D5D2F60254E60A9B95AE0A0CB706C6CC935CA73 + C94D374C8F37B8EB1FD3DA1F0EA6490540C3F7BA7EA6F8C3242820A4559AF9CC + 3B00B5796358B4A1F9C267D06A4DE769DDA0C333152E0798228F892C166DD05C + 327AAFBBF3C071030C250B9C1E6A9FF4DD080F678B0D9117CCF55E2A75522933 + BDE13B3F17F8ACA22B6E25CDF3315ACC493208102B366F121692DAD2AC0C04AA + 32FD313B118EB56306489DEC5E5038D030915510CDD5D1FD2EB9EC0D31886043 + A60BFF521837BE1BC4FE40241A46D1933E9BA1274F07DA01CEEE5B6BB345E28A + 351D3A6456401B1AC56A7072466F2422233F31D219D9F1FA1F67B133F32C0E05 + D127F4DFADF0926D425F54B7D8315264FBF57937E81F598215E357786499AEEE + 91B59231585906B0D4F1AEC4703B6F2CAD9785324ECB079EB71DAB334F3052BE + 4BEA9D48DD36BD08A88553610488CED07B7E4C9518895F27C10A4DD9F7CE073B + AAE53081DD9619D0172EA6BD42D9021A0A398957C8BC28DB1937ACF6191E3A4F + 0EA3988B04EE13502F87E013278A65E280FA377EC96A354C96D8647CB7877F73 + 2D72D5205BFCD4BE8307A3105CBAA07B7EE9562C6D16B7BF856A67F03A0C9C83 + 29821298DC35E05714D326D41B8B940B158414265A1630FE2FB6759EFF9420CB + 41361949283832147FDA74BB9E8CF5B8332B90CCD2C949FBC1F75645E7A225EE + 667E25E4D58A644C5814B392686CF151B8598C2531946D1220DDF70FD5A6C09D + F438B3D262B8C3C50AD3BAA4B34F3551625860E08A1E8685D2CCCD5C96CA68A6 + 897FCE1C7B03CC0668E87502A0C02094465574D1AC54A3A473583364BDBD910E + 23051960DA316B686A152F4826CC05343FC851D56CFF8C9088F8A73108F98A4F + 17615D6D2E05C8D247AEAB582DFAE066FD7CE2AF16E783FF40EDA375B9B2E1AF + 77490CB3CE62F86B35D70F5BA5338EDB8663DC18BA394E71FF5ED665854A885A + D7E08BBB6A16BAF4266C9F650CFDD9E22786D20D97A35D82E1F26BCFBDB27F20 + 6C40296CD7D988C66026583DA561A3F325FECB8C022D149D8EBB57486F72E263 + A33D99A10AA876991DF949DC7B5F89466773939B9B045966AF4EF00B3F1F1BD1 + 051367CE71103CC52E8D966662A8220F03CEF49B0F3D751213C5F92CF0F63517 + 4F52B241E26E2F1F4B01D37A63D7C68D5DE1782CC502D747170BBF7E4C5D370D + 7FCF7AF0645567B7D0FFFC84CFACC566DC45955C907F9A71305566BE05E46C4C + 76903133F8EB4566939C93BB195459014F29552EAD08473E3CE60AF6AC886447 + 3E31E1597EF1720F94FEDBF533E9D5F9C135C956100DB2B733363A19A41AE93B + B3D14322CA7B1FAE0C305CF04BC52B70B4B501656EB990A185ED31F756059D35 + 9138E61F074C82D628BB483FF1ACBB64C66EFE9AE8426A04FBC10162C225E26E + AA4A2AC51205C02A0C6D9666D12C9FA8FBFF86EE5459904A22795E02CA51D0B8 + 1ECE92F687DD5400CECFE2A3A0B1B2B88031721D69ACB8BEC9392650AB3517D5 + 209EA8CDCDBD7C5F80017C5F5C86EB26CF4E84CA6C3FDA77608E7B54926273C7 + F6BDE6CEB0591F1ACE82CFA5C3A178AADC49628C9D998980517FA79378BCF84E + D8772238FBE755409E2564186F3A604AF5FEBB1D3CBCDDB483BE2CE1D1D39070 + 3953CCD24C921FADA6D18C410E86833E944FA9C37D0903812A82F387CD179E59 + 1533D1F6307AFC8326CCB258480F6B2CE9BBFE52DBC9EF8D98E56F6B7D16CCFD + C86D451B1CF95C5321910F63ADFCF6B1C798D41FD68B82C626706A3E61D294DF + 3F2E99C4810B03D07FA69901FE100619265BCBAB24C11827CB0D53965BEF2E96 + 8B5ACAA6B7F2C4B1DBC855B19330D304D61B510E6CFED840AFEAD12DCF9FFA48 + 45BC853233EA064F18D037B5B6C7A769DCC75AD1B4727FEF00BC04EF1D83CBC9 + ABD4D5535104746DB85D8551BAAB27039C6A579F5C573BBF5B0D8EF8C4DAF914 + C32E8A4CBCE9EEF6C651F26B9EED9B38012F15833CD5D7A9C4AC80A5387A0674 + 02AAA3470486465D5A4C98D8ED87B93348B327DB1C8F4CCFE11F502648F6A97E + 25DAD00B38F6F02EFAD1CFCAD96122CEA2EE672A5D6F2FC271E9C30E93865A09 + 26BB4E4B2F27A31DEFD714AB73BD8A467AE39EEC063BB3A6609CF010039A98BB + 7DEF9791F6C3CEDA5DBD139B4FE48DE30B462F71CD86D3BF0C3008289BB3B9C7 + CB0027450E7A8DA78ED34E9E352D4ECCE77825D308B01EDDDC16BCBE5A1D54B3 + 3E6FD9366D985F42FB18B3AD3DD3A1DA76272307684047A2518DD7DBFE0EE5CC + CCC6EE8C5EDA65725858C81E00AE14FF0C7B40BBC7F72846951817092403329F + BC2AD5ED026A3F5A471196D6532C1A6398950B49FC210029F10B21820BF2633B + 78C8BB785B7F1C784D218D679EA0B024FD2903E1B684F3D80A8E5C8DFCB66910 + 82EFC9C5CE7702713C449DE868AD9312069FFC4987E35571184D66D6AFED4F72 + B72AFA7BC9709826C0A550088FA82C21E41D74D8799DB7153AD348B95EBC404E + 72AA548969A5A8C2546E181725D0996443F9F8736CEF860918829F820FE1AF94 + B997E66D010F8E85EF5710CE00CB507315B8280484CE0A26A56C128AF91171F4 + 468A06B28736BE87E35BFCBCB67B03615ECC263FB44152A437FBB6681C74BB77 + 5FF7EB3B845C3293783F2043208F42B9A6FA7BB02BD8B62EABDC98B4116AAA00 + 61179776A5F8C915D8B94D6089132CA53B1589D02A06F13F767505E3ECB339D3 + 023F1C521C2E61FF555AF4370EC63BF856BBC7EF6D8867A212A8FC21CDB3BF1E + 948BEC51F961BC9E78A640745406F14E6835AC945A8B473E0E943387D3E9CBCD + 0C581443F986D25EF006B18FC8A80E8C24DE6DB6ACF3226DC5D3D224CF97FAF8 + CCDF50DED7B00B61564CA66C89FEE2F77E8BE7E6C6A0BCBEC3F8C74F74424F72 + F8790BB10455024C4D1B07D43910B380EB1131DA8C5148F0304B9905559BDA4E + 4AACE89411645F2B8FC1A6BFB12A34D78F579072EC1C31A5E9670CA65814BC6C + A625E283BCF38E2ADFEA8882C869C64B9D41419AEF012CDAE15FC6AEA3039B9F + B5EB82427AB0385440A5082A9FE606587E8C0C25178C2811AA832D3413139C10 + 2F5039E36CEC3CB51534BB7A20BD1E3D620A88BF182F47F9A5E86A365738D4F9 + A3AF07F936A9DB30910EF681B7A5F435124FA91582BB8C224F290B56ED27C8C7 + 0661A5C0CDC06144D8BE5064E56D36F5A1282D8D8B1F4E4C3CAD852D9A5E5B63 + 1D4C527A7BCC188F1E6ECE780EF4B85162DCE7D4C33CE8991085AFBE8CD20BF6 + F13B09CAD046A54E9317F628B45614786A79E6DDCA6200582525ACFB20DCD64D + 01658E4E5BEDC258CB5678419BFE8EDBA566F041DBEECF3E5F445D542A173213 + 3024B585EDD104DB59374431B457E79C175A641F51561B4850DDE539ADF8EEC2 + B58454D9F9EE52EC2E21E9FE64816B2CDD5BC806475AF35C0D867EBB2831C983 + 13753C1C9819842C79A8B3B4FD5E382FD688C6DC2B52B6D5D237ADF97E8CB728 + 59F5382489F61F00AA9CACB30DFF0F6AEBA0397798DE6BDD4E67EFCD46FF1649 + 2E6E7CDFC30412C02D24ACEA6707C91A8F9B663436C6EF13DC3D0B0BA51171CD + BFF353B9BCF63C310FD58409FE478FB9E20DCF9F62068B65286342C2C6D1F716 + 17355B7F647DB7BB4C4301AA870E1999732C602183A12AC800E31909CB1D1FB9 + CCEBF9052F964F8B01A62CA0B3AC74529865D1B992FBEE20215AF4EC11735486 + FC2B8050A1122F992D7B728744B97E8FF47E2EC7128849351E9397C166E24EFD + 30622C417338488D7731A3EECC40568481CC7C216E1D84D7C750181FC5937484 + 21421559A86073051690FFB0BB61DA8AA9F591BF0A33775D7463ED8FC75F3976 + FD02513AA561BAB092C1A271E07E67FC579E85A17F666A12BECE43E59110F196 + FB3FFFC8A498664B74D014A362BA6F949F516B73F7DF64F612EEB1C3EB56B6D3 + 67BA0DEB523E6EED6E0BC9E744C39D65EC0E5E6BC8E3D0800A5B65CA3EA829B0 + 8D31158B0BB5C7797430C5C49073120D85605A9E972C772DDD2B79159C42F51C + 56DB3D0FA0BBA7BEE2BEC7F98DBFEBA049D12AA5F2F8DF2D9E74942C354E03F7 + 307FE6F3B323A1E19C43B1FDD8EDF02E8EFAA4E046C6BD60F7DA5526784D5DA8 + CEFCF4D698EDC567BB86C198D594C5E7B9F6A5C4DE88EEC18A892E3856985DDD + BEA6BCF5C6EFA66A0795B333B5106986BA9FEE98C910E5EBD68FAB323442A84C + 66AD82EB62C1BD6E718D616EDE60EE03E4B4F784BBAB74357D9773B7D1FE4085 + 45D510C65C4BB7214B6FE75677E03445FA58BB0F009E3066F64E4B6A80B4CB92 + CFA3B1A5D3761F33288FF6A5346022467A3FD94100D52077473FE5A7A330ECB3 + 80C39564648779CF9BB9D4F9EEDCE5009EFABAB33F67F3520CDFD085AE741C58 + ED63B637F115ED68E4E069ABB21B3D7B3D6BF96F34AF66075E3014F884C43CC6 + 961088A9EB4E029827964F86E6073AB1CF3FA6A039B703E4B9F5EB6A5470D4A1 + 486E5ACEDBBE35FF75B725B6A19ABA44904D0C269721243E54A1B8D785AF79EA + 604D6A73721DB150B18F067505E66F89520E87788DC31256C84BFD95736273E1 + 5DE70C0E2BD50435F260A97C207BABD51EFF9186B1D0285A87FF452FE7B3C2FE + EBA59AA3A4C14B806A45D15261810B9D41F28ADDB24870CEDA21B26D1501C2FE + 7F815F205AA44342D35CEEE23ED90755669CAA1FBF19635A36271BE894FF98AA + 02642461FFAEB786509BA6D49BF7580E122B4D03C9FA13BB4C14AD6E97D4320D + 22C592E6D4F66FA1F3DAD918A99E7D41E9751DD2EEBB04B00DB9878EBF2303A0 + EDD0557D2AC8B6658A65BE488C0E2914FA50DE46C77D512F03973BF4D0357AF3 + FEBEC432D50C23E8035FDA32615C80FF62BB0C87FC8ABE06FB1EC225C2F4A56F + 3C366BE149A984BD7443FC797E6E9CEF59B1602302C499E671C64680CC038FAC + 5DB0BBAA7B6BA9A7D9223E802C6682B7BB2803AEC667AC1E226E4B137FAD6EAE + C5B5F231E90301EA996B403E218029A449FFC9808817F978902FBFABC9814FD4 + 4828A60052931BF22ABBE391466BC46DB059E4E1DD5FB2EC979E38730734DB2D + E71BC82D7130FE363563BCC60CF69ACE8BFEB00D9A80BD72D83EDB68F2E7A845 + 60B88841CC01362723C956E16AB013419CFD378BFEE5A9E07403B120CDA0F137 + 0E0111FC7BE6C6A4BCCED8F494F972336EC542EC00CC80FB4EC18A081338320E + A2EAA3A0A95499E637B6625B255C54898FA3295FC1F7E0744D158899CB7BCA21 + 46ACCBCEF4A34E264D68D5055E73049CEFA3DBBA6C623C51D325570DA5AAA8B8 + DEA11D428E7868221390FB9AC77E6898E1CA244B9D90640874CF18066C3AEDAE + EFC6526CA322FC7B1B58C587627E29591B5987D1D6637E08E056C0E1405467EE + 93A78756F8BB2E16F61B22F28D779F6F39C1FF89F6BC711261306BC4916D02CA + CECC7884A859F37AB1A5C31958D82C29D4D1DEBEF5DD5CB1E37F55FE5783A688 + BB287A17449582A1C7A2DF55503C06D75605B865B88E9D04A4E4E56901CC19D4 + 66BA12229F8F13114666AAC85DE4B7D509D3A086BC742EBA29A29462D825084F + C70FAC623FA00134C9057973653B9E53A40B632E70D0356BC5321F65E95A2805 + 679764A76A5E18C7796AB31CEF25FF68EBA6977E4811E5E1847F5D4D2A7AE60D + 616CE48FDFD07087F9492BC1871EF4C57AD37030B5E3C976DF4B7FD07DD15B5A + D7232B3FEA667301B50FAD4025DD05D2DCB603AC475AE262F8D7033C0099FEC7 + 2EA43CB3E1FE616CEB3AAECC41B8F6EC386290F996FA1935D76C0F249BF8BA31 + 01AC8AEDDE71CCB86A4AAF296442B0A30D1A9AB5A3B651684C5FEB9137484BB3 + 143173C33D18851F6CD60D8D66E970E20D391ED68421C912F4B965A173CEA0D0 + 9728C7D118DC26841AB6FDDC21E91DB1F6818BDB44474990A85D6435357DFA63 + 7035CD97C4CAD4BFFEBB757B5743CAE0D30DD1B65C4415115B46ED9753EC7045 + 3AE673FE89F063D13F21A1558C0328775B820EFBE798ACB4A8B7AFD67B4AF5F8 + 322DC1A60035FA89F9FE2C078581E07F6FEC3C9A23F580377C35BE7F7FBE0D1F + 9AFD67BBE221D777FC3CF7868C854E97F58003CCA61FD9C0D91B9E8D30C28D1F + 4E2A3A13F959A2CAB6D78EB63ADD0D34E0C428A377427CA120A277A45C71353F + DA4AB2B17C33B96EE99F8BC3A15CD7452BC9AC2E43EE827ACDA78979E8325CE1 + 50CA9E410073C957F5916CDE8083B34A68DB901C3918CABABA4950E6CA718527 + 65FC51158958014DC02EF0AAB451A7330076E41FF0637C6F97213BD7DEFF676D + 7D0038F07B1C69A10AC966099BA97A95EDD91C842C45809B4407F8D2310F3002 + AF4E5AEBE35521F73D3A36713BF38606BEE08E4EA2FB107D98998FADADE1E403 + EE993C27E8DC2084A5FB99E2723BDDBE62E0B0B321C22F89EB14F5007DEB1AD1 + 4ADD73C56B6D8A85642C347AEB2CF271E06EAA29C601E2954B4806A4D4FD135D + DD1E5B95110EDC7CF9CE81F238C20CEF8054B1AC7B709A2B360CE8AE8F442A79 + 83269789D19FA010CD061A28E7BBBADE01115B8692A314F7021DC3F490941C73 + 8ACAE6E8898DA2467194F44FDB570F9EE0C2ABB1AC82FAE62598F0BDBB545B81 + 76D11FFDA82D8B4246897F7930DBCA386D754ADAE65C041E5F26508C68ECC603 + 195F72200E46468C89F3972EB268327ACA34E04CA8DD2FDF4CC9CFCDC8C34725 + 82C08A276A7621431C52A7135B0B500E8CFF8D177D7045F4E5D0585E866D2CFA + F77328487A46D1EACE15E9B6B8EB7ECDB6A3669411580A142017DB8D429FE3F0 + 1FAAFE1C3A665ADD27DF56C7BC2F02973EB0B855CA955A88B6E9E41E8EA0456C + 1543518EB59A4DBB333625E8F7293DE9E981E4907FC8C0399BE6B8D053D1EC53 + 04C121C3728842D4E29441D4265117FF1316DA1ACB7F7F371C0732F49F86CA67 + 2AF10F9C910816268673AA090474D981803ED3577CE6F00DD59917AEA37E693A + 49AF39DAC61193C5FA8C6FE53B8F8D60E745960A779E61A3147A5C973710734C + C9D7EF05E63BB230C16C7378FDB6FD29476523F19D156A432C18690D04BB4888 + 7697C6AC165020575D7A041E505A87092D92EB376FA0EAE68DF11603E4DE3777 + 706E72F6586D1E510E1B89D1686ADBAE1796B7E3A5EF390A37B5279A2D766ADD + BDCE29FAF27CF48E841735864F8AC863CCAAF39FF2D78C3154F303E506D7E781 + 9FCA0B06C8A82C6B527068545890C4A17AAEF4CE53DB05440E2BCFC57F7D8CD2 + 5E81588153006031DC6FD9F944D3842972AC4E82DF0FCE98D99B090FF0E83FD5 + 0C140C1DED9392907F2FFC05CD6EA5FBCD32B7CD8C18FBF4DD9B367564323F13 + 79DDA88814193D1F90E61B43C51B8241B8F84DCC2AF0BBD3C166F57CE9C03EA2 + 4A3DE752B8AAEF9B469F61ACA3AC80C4B97A90BE85BA6CAAB48995C845901F16 + F5EF251BACFD1EE033323A4AD5742A1C923A23F47FC7ADA12A43896B21E7C83B + 6D771557A7F55C336B401197682532C208264FF7BE2251D09726C9502B0A4E14 + FCA1DC15BEADE1E9568DD85FE6305D3EAB59DDEF7CF15CDE4B00C5E36F049385 + 9E57021DB84BCBE80116A18EA6D860A02DE3B66818E1EB4504DC35446C408548 + 6ECCAEE996CA30F018468B222333ACBB7EDEB89DA739C9CC99468D832AA075F0 + D0DCC6448A01FEC983EF79830AB46ECF607C9BFB178D564C2A824DF65406B1E7 + F5F79B17F846EBE587179279116BED9A27DBD3980F4DE055217F1E6F1AC92EFA + FF3605537295239F04C244775BA25A56D25EA389757AD96418E9229CE0767F6D + E218DE11389A6D8823BE8F1E195691812167AFEA67444A28652F0E51C99CE2B9 + BC7309A63E39BF56CE63E4273C88802E205A5A2935878FC1FB34A9659AA61F22 + 1E2955E960055380FBD7EB843D4DF42336ADBB55BAD7F5F9DB4B30F7B3B8A4A8 + 2C0825E602C4E4F0B0208ADE162B1805A4DEC2F42EEF87533E440FE9B270111F + 2BBAC709A24CBA7FA2F297E6CED34706DBEF304345E85E8DF0D584BDC2D95A0D + C3CB351E96601109F17E6C5524C12FF4037D2EEDCF7B5EBB1E67DF582B4DFD0E + 7D4C6F38C21499DD2C5D34AAAF76AD1F28EBC050C7C86B7BB3A8CE1811029E34 + A52DC5341263C9BA95BAFCF0CD9E5329095CEF3993C8F8C083E13D8AFAC8464F + 81BCAC39A6191D62A5D3AF00F945255FD8923EFE38334F0DE898077515F6F3B3 + 43EF14A8A71C47323A5971BAB13A89FF9DE8C08AB378D71079537F463311AF0C + 45A733CD3EAD522816D94E2F05486F63E065E664ED8535817391C41D121D457A + DE4C143FA631574AA20DE037DB800183DFD8B7CF843B43D2754B0DA90217CD0B + 6BD23374A51665D05B69CF09D8D07E7C4F2FF4E3C7D8F5D9B4E20437EAB24F32 + FA71674F67CCE25CD182717B038B13079078159683A0B5913B4913760BC7D175 + B47B0026E587A625B2302ECC00023AC4043954EF9F0BB0C5C527A9EA022C8F63 + F3782D2A4A063EF7666D69837C013120EC46301A05C94470E54B70500C7F6929 + 4543AA2BD22A4BDDDC99EE05AB143F5E7F206A175917EF60A3A60C8441BDE14A + EFF3AB838F4A8074FC022A908488ABF5E513D71F832F75A8D38241D07387CFC8 + C1E1AF507A72AC13750038106473D7227BDF9E01312A4A9428DD6CE05E7B3879 + FD47B2D52726B48BE3D131DBE2078A2A0341518C8150988198F525575B72B241 + 2B57F4FFE79D255566447E8B8D104621BE20D9F2E8CE6168B9625EB787400957 + 12A248F5AC73918ACCD8138F7521FC913393ADB5C3E86E4623946B0C707A103C + 094E7CDF652E98ECD85A507BCFECA27717A49550CC60E0704C5BCD75BF30B462 + F862F34E21ABF2BEA5D204A2E7BE7013A35D4A2D6CA2618B2EBE4207E76C77E2 + 103F7783FFDED20D70C5CC3BE00547AAEF6927738BB39E90ABA55640C2EB3358 + 97FC0705ABDAFAF2DBCCDEDDA83B2B3A8CB427F490A225B7BE83DFC9A23DC84A + 8A5BA3A432636B8836298F1A12FAF6A18197C8AE74E58639CF01FBC6E988DBB8 + DD886656CB8631953C00540EDF46D0415AEE7E318FE3850A55CABF517B5BBCA7 + FD21BFD45CB6779FF635ECF7483F07DBDC5ADD39C7E5F83FD172F793EED60609 + DA3F0ACB6DE0439BDAF67692E92BA2C70E47928683F4A54D1EA3663BDEDA5458 + 2481EC036D27C019153554BA2D790172127ACF2D3C292895138EF64633BAA3F4 + 84DF48B1B36109C94BF8A80E79F8CA896B31057AE012AB7057771CD99326DFD2 + AE01D0231F3A0F0FEAEBC011A40EA69E9D91D373B5420C22D0BE00B5032BA3BF + A072FF63FCFD24CD465D499116F006C68644129D219681A48F659CDC9513193C + 61A797FC50730406CD5395DB96FD34A6820D2DD8AA68EB5F97CA60AAEB2A5229 + C7876F9E3C88DF70D16887B978B64EE5B6DE2FE02800ACB74A1A03715EECCAF1 + E91B638C3F747E3606E8F493115F90F3F05DFC45F87ADC0AF9034B762E049E21 + 7E3BF73226C190023E439B1B2729548B36F97DA2801026CF633CEEAB36CE6D41 + C2E993956B716B975CE4761A49430CE510B984791AE28F76C5E22CB55DBDBFCE + BE837EBF634A4A833E2A824DE14ED0DA50559CCC0C742FDD45C0313078D34BF6 + 18863CA4D3A3A392359A7BBD43331D4D5B556AD543FE822E6E4D126502D32E7F + 85C71FD804334EA20A61AE888C6BC1D072C9DA67238EF08FD61F26ECB14EA27D + CC7B89C1A570241EBE078738D169435CA55E1D03BB12429F8D32891819D9FA2A + 07BAEC21E59DE1E5A8C7572D03553A3465304354CD8ABA2CB168674469718EF1 + B68635C8D9991A4D91672A404FA2668FE9FFF8D4670E9EF44F10D0EA9F4604A1 + 7352432A5CE3BD3828B61F85FC982E76124DD1402FFC0CF728FF2F6169BAC75F + 328321970E901E44E32ED2228CCE3D512BC97A110EB977B2F86CCF76B2B56E30 + E255EFAE79E68C892022F4D0FA9166A358B1457679D5592CDEC46ABAC7387E51 + F7C13485F8040BF33962E0724FC9048D667CBA46F0CB219BD49E128ACBC8CC27 + 8F1490ABA2DC1E051680DFDEBA2C940D98826092C444E12B3AA87B2D0511E421 + 3B24343988A003FB5531FE7C56330C3428C8318AB1EC3DC949557D14D936F7CB + 0C18E9A92E8D2BE0E9DE496910196A78CAA5B12345E9A712FAA46E6C2FABE0AC + 492E4A58197E14D954D8AF1650ABD3CE13B5011C0FB537BA42B413A9AF29BF38 + 4FAA7699C9466AB41286A0E4E9D90057B696265ABEE8E515988151DC60D389C7 + D5A04E1EE1D120647721473245036873B3521A9FFF59761C46FFB00B0779E19B + F47BEA9055F941750E86B94C7C704D9748FDF5079B1778097D3F3D9B09FC9EFD + 92485EF758579611240036A1A24D41A2036E765F1B979AF7C37BC4B651DA3BEC + 2AC7ECBA06C54E2F72011C407AA2F3B55DEB3022005F35956578A2517D561FF5 + 66E90379C070AF246C56DE8490777229E0547961AB86FB0B25A26DC033DB5062 + 790F522904450329E110EF3F08D12F45443F584901A876D23CB84F77E02BA93F + 0FCA7D3D889AD5E8494CB9C8B5E3ED861A2683A8A25B66459A8745ACB39AD727 + 62444E065D5F84DE95103185308B4113E9EFF20D0DEF81D22D8E51B7AB9A35B5 + 1B4E985259B992F6DB20C2D43C46A2C701388FF32E686DEDC4E75843EF9BD195 + 23CB2BE00C07539850A4DC817A7553EFAEDA4D0274143D91C02DF30C08FC126D + 8C59EF815366E959E140A3756B6044CF88B57C32F6809B17E328612745C76D20 + 4B62B9CAD6F0825D2F6E2B33DB227D43982A56EBB068E117B2CAD2829151617C + AF83CCB445A862EBFD7BCD1CA6B40FC1F0791E56908FCBED69D469C03F853B13 + DD02F362507542066B9E278344433BA64E92A6E36B6C9237A6F9A400BC207BE7 + 899046750889F8C1960803708DAD56FB2637C4F84E98C5D9345ACCD09DBD4C4B + 8257DC4EE366B368AE7A405F8AB57E0D0F96C87336C3DE8B986A1F08C4DCE414 + 263C529F17028C075937E473D20309AD7DCB0B1D3A376E1C401A527024054328 + 98D3312EBF86DAA1071EB87CE449AF778EB4178C661AD5BD76680B560185D506 + 6B7ED11615F2E92CE534BB5D7A04CC537240B441840AFA4E74D96A9A77534E85 + 0A5CB0B0486C7A5A4FE53DCB66D5BB1F61CE18EAE8A82B047FD7F0DCB92A598D + 67A90D90BB253B3E9895C4A0C92D39878E44BFADC4ACD3EFD0763FC3E519CDD6 + 28030440B3A26920934D050EE398FCE347B52784DF304C6A049687B830D13116 + 7B41C000C5DA03379CC8673676223DD11441BF8FD5D0DE5CF726D3C294EDA249 + F7F15E75A415BAF6579207F29934B07845F3FED8E2CB424F2816E59934064146 + 661C2307B2B2791D15B8B3027C71BC760946FFDDA54560F8A461501C3CDE4D6E + 99F35012C9237FB169194DC226E921F6CF95A3095658A6E10E95721411ADD736 + E4D0111DBF59C9E40B2D517960670C8161DA233F08FFC404471B5E70D89F48DB + 79E7FB938A9B488F52E24B0E30F7179B3B19A5C1AFEDC72C8939F8FBFDDE4507 + DE26E8BD800ADD0037B13B04AF667C7186A3C109B180B261A2C8FF178175A5EC + D46A16DBC6EDF48755F71375A76195C8F5F782E2AB75098922B0E7215AACF7CB + 49551031E3365C3E62D29AB883D4C89D0312A8070BB88ED1D15DA031438BC96E + 30F3AE59B7CB718F29F929D51A1E17069D9785CC570ED435E677543624838AAA + CEB8DB807788490C3BC35A5EB8326A733756A971C0767C9FE9A1B2DB63FE75BD + F21777CB3A5EBF420B2C7C93654696A4792BB339038B8F3D709C9F87A9203DE3 + 182E883E2F85600BF242CCA06C5AC56F19B58C2D29C0214DD2F521137028B28B + 8FD75DEC70FE78DA48B394874DDE213BB32B32B46637807B4DDDA37B7B1BCA3E + DE1C1C029AD18965127114F87EA89639C2B156986116F7860F897FF0E2B3E1D2 + 94DB00CEC0B7F30E00748436D33469A3D42F608BC2D4D22C75325A52F117BD4F + 88A6F2ABBF2F0CAE2C4905924B9206EA770F9EC77006C29492ED18DF0224A78D + 0B88F750CCB72F194E4EFBBD4349891347CFAD1CD8B011E7C341C81488B4924C + 75C2439C3E767BCE8EFCD1D9DCF838B6650040C1BC262D7B83D216B902B5CB54 + 7D93A913FF4EFC3F21E6F474C0E008703672FE403D265FE9CA4BA846FB32B640 + 85F76F1B246B15B637BDF31782A79CBBD1109712B180F0027E10867FD6DFBEF4 + 9193D253D7B8023CD8A601EF891C78CDA2CC47C145C7955EE5BB36B82742EFFA + 1C994AFEA6F4F73B22549A84BAEDE9D67CCE99F3C82FCFCDBD63F022459DB23D + 6766325FB09D858C8C02FD41B6666DC1F79257F93A17EBC924E4961534FF2884 + 18AE9770FFF935EC29161C5ACCA9096B0FD4F2AE2849A6B5D5F07153831A77E8 + 4487635F85333967C6EAD2E97241167FA605BBE416F591088C42B72C3E1C65A0 + 7232A6CA5A3B2D56C8BC6C50F6B9A7A5C7B3062A97321DC596A6ECB550098944 + 777F43A69EF8A5DF9F326F059AC8C9BB30EB0C4CF4CCED4FECA07D3CF612544E + E252F73EE3456FDA4BBA6C9C26F76058B85CE37616DA29C02A7D63FB0888555D + 3A9531C27136C70EA4E26F8518F43AC6B83DD023A7F23CC828F2940BA5663EA2 + 129A071E3E6652092DA29EDFED3A71D07CF54B0252A5DC6DFCD23ED0BD9102A8 + 114832BB12A09E1F2AC9D8330D7F5465C90566B1ADBD86FE76BB7562618EEE57 + 6769529638C3D0DC3958EFDD7444A6A8EDA25AEE39599008B781AEA4D4F61753 + 620463BD0711E8DA1B90862A9B135C7E79B2BD583C58A9F07F5D2E7374E433F6 + 08951B1EDBA54B77D0075D19E600368E83FA588A3E338FDFB43002EB6BDB7DA5 + 7E4306A89E759931E9C3DD8894D9F87C134F71C39743A5EF7C2A03344C3C997A + 7ECE72C7E2FA0A3A2FE8FB35C6FDBA386356568DF097F36A2290DBE33F861627 + 49BFD9229A21B9000C653E9A7F2C218AE2FAF3F322749B6E6B429E10750DA995 + 450015D187E07444EF29F7FAE898AAFA87BCACFF6F629EECE9CB21BFFB8046E7 + 438F19F2AD412A31589BDC9FDDC426838901D1227790D99C34FCADB71EA837DE + 2E7C0ABF0371672701882FEDB619B224C703DA63FD694864C21F8D396C8042AE + E45D1617393ABE54B6E3FBAB3A6F057C05FF6D9D1C28A58FF4C52469E31B63F9 + ADB7EDF1905F1997BD09927D9B63D232C631F1162F0AC5E87AC2EDAC89790584 + 7502E04BA9BBDC677B174AE0A391C8165BD72EEFE0ACBBA91E7FDCB7448D188F + 19B94DD258B2A4E1803EC3F36C36313A2E56709668602B1AE95804D6D0FC17E1 + 6FABF07B0406F99A90496DB8AF1C10108B7D8496723B343FA78B1269185150E2 + 55147C6D36CA7CB13FB82E11F4CF3728C9F9CAF11091D703EEA811A96EC77ACE + AE19DF31933CA2C6C7DB2259B86086D11EC3B4139020AE2B0F6F48FD6E443C30 + 0744F452B922162D5BA8DF17DC6ADA2A3E71D08BA28A2BE510741DCA5A66E451 + 5B9EAB0E6FCC8E64BEA12E579B57AC89FCF737AFC9434FAFFE497597B9BCE237 + C66090F2E19D48BFB4FA0FBF0B14DB6C61228DDBA74EB7FEE7EFE42ECDCE1C90 + 593C2932E729D8C8357E61D3632FFE2C244D14DF8AB68E67EB39D1D251506309 + AA3789A2BD30752F696BF37EC79AB8F149CF81331D60E9773100FF4BD7860D12 + 5FDA98483B1CC148A06A28645B809A0CEC676B6A750B775A4BF9F8F337B4D899 + 65BF6379FF2B60E5F1A0E4EEFF1A64E048AF1B48EE00B880EF22A049950C87D3 + 2B553330465834217885838CC588C5BFCEB6B40DCD96C53D49DABD5B8E4E33FA + 187FE417AB8984D8779462DDE7B937A5C0CCF79FC58564C0895BD3270C1425A3 + 2087EF0DF2123977FEA40682B2FB23581ED07946B46F9185428A83A8C45A0DE6 + 091510DDD99A070FCEC9B6F9AFF77E2FB7CB294A8C890DB56A8FCDF7BFFBEC40 + D2BFCF285A8945CBFA76DBE7AE9F1538FCF9F218603E7A00052A1FD829BD2527 + 455FD00345531CC6A1401802FEA77D3BC920C9F3EF0B1735FAE3D0CC05808992 + 86FF7512DD5D31243A374C3218CE45580C2C0CD0F36430D1265B5A1D228E2BE2 + 9890A63B9788348E99E4569929F3255976A8B19D75D98FBF49362667664CB554 + 9BF9097A7A69FD1BEC5FE8B06354D8774C892BF5E4883F56DAA97E374C7218E5 + 444DF1A854A8F0C252BF1945A049D525F0C8FB5F9107A12DD70785569FE549F7 + C55C0D1AA1C1B2B510456EBFAE3B5BEB62A5083D31524A0AC3C7650220F7DF14 + 487B2BDC3A8588A8B023D744232B2F159396FC36E88923F603E7811C4E3EDF3F + DAE09B49D3FC5728845C661A8760526A41E9BC2C16BB7F87F20B25A521C151BE + C22768B3CCD89E37D8139B16030466C2F3266C3FDBCDCB5987EBF3ED998B6E42 + 7F4A9AE964D1AA8C5EC965D4113FC30FB127681B5E6F8062F70B453B60C680D6 + CC086586A0A871A6968BBFC46A82007A4E3F54211A93DF787BAE746D7D74D9C3 + E85617AD96470D171A560EB6A02890C7BF7922504FC8F530B2A9F93B27DB6E77 + 1492452242199DA5D2986AFF1000C1379ECE946092B2D8FFAF40666B287F8495 + 9A79463A7C4699B81965B5ABD65A2255515489D53ACEB6BEAB5D53B0C14A156A + E726A3ED630485CF3CE19FED00BC82D0C2D0615A296EEE8EB57E39A7475E660E + 808F451A907C6F82F415BBA6BF9715231136ADDCAD736851FD15AD84EA908729 + 4A07A7968C342055AAE50E01F9A774430F2B6F42FBFD917C356AEDC8DDF5D080 + CAAE489ED8C224DA39B3CA7FF1039DEE0B4F31F62811518016C8709CEB089349 + D32DAC85AC936F6D14C3CE29D1583DDFE1CE552162D06C2772E015379DA79991 + A52D6EB6B2B348D9E0F2EC65FBB589DAE68DCF25FBFCA22E3806461693E3E6DA + E60F8A8F8E1D2981CADC095FFDFC9FB0FBA8A90A7D08788A6A92068BCE6BAE8E + 64B2EDFDA0CC1A5033DADBC21177AD74F574F703883E1FDDA2971AFE3633D2B5 + 202A0304154C32DBE392F145ECD2CC400EC5DC9FE7483C5312B75628366BF1BB + 946CCC292D1CFA2790042DA92B9AB89E7EB405330043AEB7FAA4A5DB44EED1EB + 9349678E89DA8EFF8A2C5260D1A62656B79899C54883D90EFD3C6207CEB6383F + B8BEA09C166B3605F69008BE00D33E7462C98E82F8568B574697182B273A907B + B1922952E3EAF6B09E3FCCAF1753168A0DA6B20D800EB744F3F15FE88B4E17F2 + 20F545D626539FCCAC6EDEF669CD655662D652BA109E4F4860069D97C7878DDC + 4620C8AA5D9201EB1AA3D452F22DC65C51F3467EF6A69A9869EF17E721CFE506 + 084102E16E4861792BA86006E9514E2CE86E394B3584721891B7C8934C1655A5 + 91E3F0F423427DD19F19D8B1E6AEBF0354335DF49FE02E628D2B7F07AC4FEFE9 + 8CA6B96F9EFE5A46F58F91FDCA04B8520FD80B36688686F8738BED7E2DE9F915 + 7AAF8891D6AE0BEC7B5F340E2F83699812CEED19347F2440755B6B341E4F6581 + 1BD09BBFDAE99933B058948BE7D813E2988674ABC6434690CD48EF0E05FEEABD + 31CCE1D7AC5B3E53CE22877BAD5A29668C470F05DD9DF167ADEEFD4463FF5A55 + 3B74037CA4B3E62B130A11262DE53D5D9FBC6893B1F61E0D44AF5E1367DF8790 + 9C98A2B595D27B5AF420E02D961D3A75A4032364289AFA122367506D2B87259E + C54B83F46DF0F81563160383F388A5329B7532CD78263E7E823F04ACEBA1067F + DED6FC120EFF49FCD853F51D460973D32BD3E439850D86C752CCCAB7811510F9 + 22159D8E047846CAA424E1E6484FADF8CACD1195536B80F7B8821CDC623A3CA2 + FE79604407E645EC3D796800BBA74ECBCCBD774102A498827B4964F2640DECC5 + F36DB43B491C4083B282E07E87AF6B150E126BAB097BAB48F3F19C6FE0E09C7E + 5D44C148681BDB59767214ACF49DDC648CFE00985BFC3AC5DCF7ED60CC4A6E7E + 26F37EDC01CD9A11D38F0BA8F3D2C28FE60B85A22389C384D632A6F462089FED + F2DDA2EC8DC598A9FE74CB159AAACAB1694EB81629B3922A5847B2BE91C97738 + 771F3A294199F4D645F5584DCA1CDE915193088F88B17FE379B8FCA4788DEB8B + 97FF98327E1835BBCA0FA10E6A8E7AC1BBDB92AA3C0E2E8B2052CB5EDDEC91FE + 6142261328A12F74209CBC223B3CC1DC538A47B6D051BDBE4532F2C0070E99CA + 4E712B833894A79F6E96D7702BE8BFC7E2020D1845737E67080FDB27A089ECCE + 6A2DAE556D0A2C850064EE067FF012B30662D5F2C99CC48837D83FA20BD9ADF3 + E433619D0AFD513584B257D5566D89C109B37286FDE59490AA8034F9EAD60A94 + 43F365B42D269F39DD79B12FAA8CF72B9AADE21C0A05A74027ADC2C31B53B2D2 + 49DD421AEE56BB221D223AC1393B7F333A61E8438490E94E244FB0E9E4D72328 + 656537E520EC59BA3643BE41ECD548E3B29F6F03474AC8B7643E22CD69532DF3 + 459038C4A6C06E5F9BC261C7A78FE86CF4B35562875589379771D1237C2187D0 + 0AB27937E84ECD9B5FCBE984706B9E66E22455F1F9604FD07B6970A184DFAB33 + 56591B67ADC13821EA0F42CBEF82966F574CE1A5A1726B6F867F739E3698D3A6 + 73D7B618ADE471E8BEBFF45BE4ED9D0CC70FFCED114AF8792D25B679EF5630AF + 2099804108554CE001FC94880A494B67134F336B53C24202A9D7204ECBC65B4E + 6A0C75A3CFE1F1D282BEC4D6F88E378E6058FA334091284E99381FB6B87F8B81 + 4ECFA44AF3EAA047BA6003D50F60E36F0BE82B941E8C04BA9FA736678259F976 + 0D01B6B91F7FAD053563CC9D4DB263644CEB8C071D2BAEC7398D0F555B877963 + BAA008B357F4B1F300069E9679DDAB50F9614AD403D442AEFD83C5AD1DC005BA + 59654B6ED0B4DA041B8D49046B8F8BC59A042E80806299D01340D792E92D0315 + 7AF4DC96AAF65E1119E28DB741CC8EAD0843FD28167BAD60860C8763F2258155 + 05E4684B3A7AF3766F1115D1E3F89CDA946E798FFC87C0CF40C88651ED6BCE03 + AC08651067FDCD879129D8A191A789B8D87ECC89A73B78C0F0A95C4D0A957362 + 4628AFAC2F8BE51D1B1773D64FF7572EC5271D075A9E9B455CDD835AFCFE3605 + EB45DF68DEC50D8109F6DF28E3D1CA6BB050BE6436B48B72C72A71513A924D4D + E3723BEAF87B2CA32BB94CF02CA405976BCE483959EE1390B6F5ADAD581C1BEC + 7F6FAA9D19148F83392CD6BCC05BA14CFD3F58774ACF4B0F4EB0BA580FE45097 + 975F01DF0FDF617D0D0902521A92AFBBC537F6F46F53BC79959B8EDF4972F733 + 4959FD5F94A25437F45A371AE10DD437CC6B1FB908C5E3FCF90F9CD134EE88AA + 9166285041A9CAA606D2BB858EB8A9A0C9D86CF6D8801F3D6226D5842BCD6D69 + EBEED1A3D53B564E4B94B1354A53EEA8E1DA91012EF0A8DB1F31757CAEAAFF59 + C6215D166356A0C6FADDDE01528E1001FB89AA578ED54EB0159989BD8E6EB193 + F2170470CBE780E70843F65A777E4C4E30EC2C54F4C281C59D0CAAFE5DCC0C03 + 4B663D3FF0A2FF68D25B94CFF009DD0F7528329D6424690CDEDD3FAADFE7EA05 + 5C0DE6D645EDD3AF582DF3450D7E79DE1759E5914A1828BE7E5229DC36F31F0F + 5EE2E5E7496F1C1755A918947F4EA8A94441AE2914486B8F5FC0FE6891FB0871 + 884C3B3C047B4EFD3559BD3D1726C7F8BCFB614D8C3C47ED68BE8E1CAB2D0E99 + 97D354372E6A112083781AE023378030B0F207B6EDDBAC60A0F2AE1C62C1F46C + 9C51A083DB7F04DC1BAD29D4165B2BFFE451915836E55B64146ACFD8AC9D67CF + 9CB4AAB6A0CBE35A4BD03659399D3A615584A08E7C12A149E6E0A433FCC42016 + 266F8A26755E8D7A29445A3A5E785C45F4327BD3BD34E13D0CF63C4129BDE2B4 + 5C1D0376EAE7658A04E804DEFA2BEE2271B43BA2DCD794C4BDA0D9E833BDC925 + 5ADD649B82955A216675D87D8FAB75A6CFB3210CF37669F2156007C514873736 + 0F7933901E1857AC4F9C2DBD99CAE3104FB4D0BD81E072802F2BCF893DB97092 + E6EE28C8821701122199018806CC38588EAE24F1BBE04CE258C42774B0457DA1 + D541F46C83659B25B3C7932D8BBA40871C6DFE686665E768F9D1FAA01C97BABA + 04D407A6320B001496E068898FC3C33B8A557FF6E8AA40FAB528FCCF3038E576 + C5818CB86BA7198E4CDA922DDAF319C9F8889CB4AC5A2E0507D4F3BA9E684CB4 + D4AE82C90E3C55AF6E5211FF8A3E3279BB8F485832D8688A50BF4D42BC4D45AE + F14332533706155638DB94B076D1ED65D62046E2462F06CC5BFF9B7C1134201F + E5500D35CF6A1680B551DE45ECA52DA43CD2639F0456DCDB4E8CECE0425798F2 + 1EB9ADF95E529F01F1BD20A14D6222564F27E76DB0E27519D6DECCC06CBB4946 + 8319445F33EC6A3A8703370B568DD0391E9F95CC34C5EDA2240B3876FE7ADBB5 + C761B1D33A70DB5DB0D9210B03AB4D35981DB1F5B1A7B7B5AE6BC6B96405E185 + DB8106D1F41E971706BB9418A4EBEB712ED5CF5D77C9451533270B2A7C814547 + 8CF7DEE7FB64DD8EDAFC579FCC9AF43512D660D0C9C27B78017142E1233351A5 + 8D5F8F0B53CA613F834C990BB47AD38C19B55DC5AFDCDC329422B81C4D6F4AEB + 5A6332D12EF1F994E71E2715D043833ABB0E093D604B926E0557DDB69A477480 + 48BD2C008B21B92CFF7277F3903A14203C750734F0D466A4D5B3FAD797904459 + AEA8FCF9F4C924DFC61DDD935E78D1F8A3C932A4ECE9CA519E995CE991A92BFF + F12CC5DB11BC845B41948207071B3E89852748FFC34862C1DAC51924AAD20AC4 + ACDA65B085045C981D81AAE17AB65D60DEEABB2F420168ECB7D0AA8764D298D9 + 296BABA8EA2A9A27A0D87C3925946DD14211A959651EC3F658E5D372C4C37A26 + 8B13ABD03047FBCAB7BE046E69C032C4CEA56ADFD202D1EC3FE12F33FF267A35 + 1039E28DC6DD6F31794C476D64F401AAE28FCB000DE64C0B4F7053B6ADEB56C7 + 17316AC3064C7CBC0EDC78D98D7D82BB630D51E3FA0D231731CAFCCE5978D354 + A9C373494F45CDF9105707F7C6191B49607A2E64DAFFC2FE648AEB0AA0650207 + 29D6BBD672C2664EDCA914909323C47D6A4EC45D209DACDBC38A31C3C9D25BAA + DE4CD108D7FBA4833956713514F0D8202A0FBA388684C760643CF9D1374D405C + CE1D51E3C8E8868F0ED5CFFA6F3E3A204013C659D19DD4D548EC3FFC7F6DD34D + 91AC9CAFF89E98D9E3CE57512727348A720C98CDD3CE66B859D526CD55337D56 + 1ED91B3AB212CD77037AF0C3B8173282BD99F2F8EC82DBAD39E3B71ABB3F5BD8 + F373BDEB5E3627665563255F0D8F205ED27A162C51F26D1B4576FF441D98EB9E + 6933CB3F741788EB06B8286CF43BD1F39660387BD735A2A410A02E2A84E61DAB + 1EDB0444A664EE6EBC90CCDD866B0D30EC63C3B7C4A7597CFE0A77943D8F7EB5 + 9760C5AC3BF48FB66D893F70F6B15F70692E24D3AC2B8D22278C44D8F2D6E20A + 6ED89DBABCDEE5397C8F25C1C9FE96C5C71EF8B434C4F83CA8542D8C421298A7 + 29A2C3486B71E0835CA4ECCDDF7F85AA5EFD23B2BF7F146155F97FCA5AB364D3 + C7BEC21E7AB1CB94091837B81ECC1E980C11E487BC7DA5F28B37E18D0EFB6019 + 4A3243962ABF364167353775AD96B3691820BB85F9ED3C5BAEA7E91B634C9675 + 99FB33B89262BC5CAB773B34AA7ED222DB03A2374BD32393F1071BC876281A2F + 8666C1BA35BDF4906D5540B6E624D6772493517878A60D76332AFE7CD5E6929F + 223A72533A267B30BC4011BC9DF053CB0DF538213442A17312E11BB00142C06A + 86934756FE93F9D3073E3FC4DB904477FF391E4E319525FEA19BF00F25F56ABF + 21E5537B8E664F10DDA138A614F74C238E06D7C82FA33A2A4C21768C87345ABB + 23278DE80629A2E88E64017118E37E5BF92FB5B2458BA181E713B6290A5E2E57 + 5EFF0C8FD9971D808FC76605BB5D6C03E5FC2E3A4734562CE86D2ABCD0AC79E3 + 873B9CC4D05FCBBA5433B7B94BC81B6930D78053C1BA758FBC4BBD990D6A5AFC + EFEC37E6C92609C51EA9EBC95141EFE2189A014B0A40A93EE26108E58A44D0F4 + BF780E1D8AC03C428C760C9E76757F3E4FA8CDF717427F887AA7CA04A33C9B4F + E13157136B6D19C2C0288CB53269629177B6E3C956DFDC015A744D45745EA6E2 + 0F133400F685D829AFB5453F4809245E393EC56C5E18E5C1904778BD68F922F7 + 3AD0211853C1B9628B347CE13364A91CFEEFF6E913EC131F8DA6A04065242176 + A60E0A6719DC0103374639FF1551D29B3DAEDC04172D7A34B06C45DC66743AC7 + 0D1A8E44BDBEF7DB3638438E8C9E262F784CE7686F1E64CC6E6555DCF0C92768 + FE1890A2723289556A16A3502DD109C14E46A2FA8DCC44602AAD39F7EFE13F66 + 64C894844F5F606A817795714EB5A1D2D6E426E51FBF7978FE261E9C79333FAF + D372414328317AE6AC4020505BAC19233D77222AED2F67755C59048C7D41620E + 250CC2D36C15830AC101C28FC37C5E89DB5513C1928A1C4F958B7F1254F00EEA + B380482F14C7627B33EC91EB950186154D595F30A491EC6A6C7515B72A455637 + 4EEA74BF2D3856808DC6F53F0DD98F099D1FD7AC7392CEC0CAFB85A28F344075 + FCA511F6C810BDDA47B1F0E3C201ADEF0A613804EA6F354CFE6A279A03CE9EA1 + 298FC21C45C4811CBB7774F6AA5AE5794C112DC54AED87761F6DB83C79E67C7D + 6B8B625A6912B84579D343CDB5475DF1EE591C84A0CF4A23353482BE64F4627E + 7DE706449D005A254BEFFBB2DE2D2B077A6CCE6F2C65E5494EC7C3CA67FBF836 + 335CB56E048B01A1ADC9C6CF65FCA9C06AB4416B45C16E82DA0AFF75B5B590F8 + D5BF0FDD1DD6AAB68ECA8924ABE24F27981AAEE545EBB0B5FC59D14996FFA893 + B53C6B2A16DFCE9E4CD9C0BA9B85917C77134AC6ADC8AE29C2C1068ACCDBDF15 + C6152BF48A195531431E1E1D0DBD13D8E196E435C8A63C8148144E8C02B8A297 + 211F842BBEAE049A038A1A8E4B66092F31E3B6DB3408E0382F54B6409BA8C3B9 + 7D0470EFF1B2BDAE6E1FDF8E077DEB18C857B45E21C8BAF4543BF1F53BCA93AC + EFA462A363022E2EF1F196C4A8AECA836058A213ADD58358B625816FEC8324E7 + 7D63B3AF2775A5D1CA41D9AA824EBE0E1CBD48ABD7CD129A0DE3508D12E148D4 + 7CFE7D5E7EF8620E66DCB65400BADB0BE36425458CACC5CB90705824C9124461 + 4B440B4301123DA5D56022B4239F57214C6587E4422682F0A72F15F93A39874A + 4E096067967FABCB9079F24B1DED47C70E575C7C5538B859068DBA887736C026 + 78B84AF6BFE2E05769FC9F0A899B0D6DCC6E11861F879B0D315B249F284E925F + 0309ACE966A9B0A4B5D2EB6FC570CF41CA3B2B98FCE21958435C8B625012D37F + B44FAEEB62DBCC59C6D129F71EE8A0E988FA34961BB1863FE4EFF4A86110AE0D + 726C18854F35E806B9E0D8A8A2686228D0805FBEC25F6483423AE6E447808B60 + 3C86207E94F6B311ADB5F35E1B91CED27F845B4980D558E0081D0F1CD2E768B3 + 4D8CB623FC05D1BA7458B23D98D4292611C0E61183890AC3C87DD3BA9A62B024 + 2E60DD5E4660652345F86ED229555357A06123F1190CC954671884F1D2B81A0A + 201BAC968BCD2084831A6EF4A85601EDA64DC5200035EC8DA637394F38EBD9D9 + 6E445C4B95B6736B42A0648F11368B2C1C6B0B801586E34F8C28B5C21702F80F + 333EE81CE3A92F47B491A651224C05C300757EA8E26553BEC5673E9823FE2D06 + E3C9323AB1211FF39971FED4AF62413C98158DF7611A391A7E20BBA364FA787F + 4A7C9F900EF946C05F5DCE4626A5399E4DA47A3D98DACB56523E3573CAEA62F2 + 1395330431D9D5208264D8806C8F27C60DB0A4B2E239721F4E9572EB10597632 + 764A7E78B256070E5420C4FC85ACAB93C2AF0653668E10214A7922F2943967CE + EF83F543E06703859FC71808885A23A63414F494F1C16A1ED27EB974E5AAE965 + AA947E79544FCC3825CE0BB56C70EE2D04793E94A15882ED2F97FF33E689BA94 + BCC7CD90F4B949EB01BAEAABF904649FE3C58AC834856ED8311127D6C42A4515 + 1758E3B73D82D5E859BE7979FCB14D45C6C180223ADA127FE54B066A5A1ED6DC + EC00CDC83DAB49108D5D9EF92742EC14D47719B0DB5D82A63B9C462B2AFD38D9 + A5B71DBFC72F82DDD1177AE6BFA0568735D57983F9FD9F23E33D5156ACE336E6 + 71A7F9AB2FDD5C867A742A5C953F1B444A522233146878DF19F86C47F3AB39C5 + A2FBD8342C5F2C3757400BB325C5219B516C63F33D023EE882B7CCE8F224DF69 + 68A68AEA665F3A4413A8E3877F3BE11B624F71735928996DB1B93766F8BF6C1A + 2B4C8C740862707E5913DD6691E4D20267F222EF50F46EE108C35A4B2E0C5739 + 89F6B8FED1C5B0565C6D0C3018EA0F0703DCEE34290642914B0DCBCE66A621A6 + 47C3F103499099488E1F3B4623746950B613A2AB5178DFCD407854E556A41BF7 + 04267ED8DDFC5D4A692467B1025C570715917B936560DEE5F91B53BA55EE13F4 + 0A67F54A589F2BAD640235030017D05ED32E332DA06B599DAB69EE2DA3602856 + 03DAA6DF35A3A4AFCFC8CC1885A3E448A4864A1A8C9E38E24E86B98E73F04981 + 4BE6253E896B606C0CE61D65B4849C20D9459CCD9BDD17C25A340B55FE3A449C + CA7F0A09A6CDF4BA9FA2EAF253A4CDDA717D6974FA4C61A6ADD465FE06E53035 + E8577AF00EEA5B2763FFE3C7014A596CD4F9EE44919F95B404291E462E154D97 + 7D0C0C686E637EFCB3CB8E73CEA4EC6D118A3CC5668137E17DEC1D4EEE158688 + 7AD62667829D107FA7EDBF17B7BD4925CF8D475C0E52FE8A4460A52F5EB831AA + 5025B23F6D6B3F57A0E2E509A356A93328E86B6C85DF8872BFEE1CFB7A9461C3 + 9ECBE1B116001F23465D803B9B87C111C669345101AA9B824AE17EB80916326E + AE3B4F5C2E04AF8BB4596860A549BBF81803658AEDAA96A55EE0C8C8DC6AB9A9 + A7609AF4394B57B510F31AE295C22521EAA9488C132903C6D3B7C1B8ABF25C64 + 9EADCB68D02E6590EFD05FF30C6B8D8BA9E0ECC2F1AA6C7A68BE0F46C2A41A62 + 4445E4AA736E008814E8C55B022DDD85E985CD681D8A1B69542F3B0E9009B53A + 902C93823BAB638B3103755A48B4588AB8A72F109C6C67B5168C0763C27059DC + 1F60D7863AE9AC4A544731EB64794EB29A1A5CC640F3A614101823B4645DC0DE + 7DB420D32D0230E0FDADF8F2FC8D0310898CAB70A620AC7B2FB1B6A326311893 + 99031C8396B6511E21154F9C3971B78BC6B20AD8FB1417C04A309B8B5CAC7649 + 72C267BB988E285E5325AFC05BE59E8B816B337D0CF840DED8A26CBB332C48B8 + C02BC87ABC32C5F08F1BD1071F93E2A0EE2ADEACBCF33E689116F4CA9609B067 + 210E5482E30C3D9F0B154428FED0E13137B6B3B9E2AD4109AF39228AAC8782B4 + 2A84E22273171E969C7E408926E52A2B96152570D275A18D31F7C109E857EFBD + 64F1354AB5FCD767B50D55687E07F3026561F397FD7434DF9270862912E041F8 + 902064FE49E46258EB99AEF254B4E3C99E2A692A23C4E468B82877666C178F4F + C8ED4201315EF9B66A3DD93D81A1B6BAD7ED7B001E012A64BAFC4185560B0F75 + BEA48C7EDFB4199980BCB8073CC8F7CEAD8ADF1A68FA2294B6A884894EB02474 + 54F7831C4DA63758F7B7DF35E9D692522C5792AA834BEF7320712DB967D144B7 + 4897640A0B62D989C2836595D83E76583239F3A7D0F2E089C6EDF19E4DC018E1 + D0F5D7BDD8F2DB164155AA58A87FF275494918727CE8D04D3EBB3D3061D5B0B0 + 9AAC9B6FA98DB4608DFC9D4F4069CB5F1E4401900B135712763F8DBA4283E154 + 64D1E3CDDEF09C6DBC102C4CA0551E6DCCB5EFD78450327B096C6A8626C85218 + 742BF3C75800CB27E6AE63D3AC4880B246DB9583D4F2FFAFB1976AFD64391E08 + CD6D961F095FCAD9B14E63363A67BD6ECDA0D065032D021FEB6C612A61EDD50A + C15388B62536511A19A82B84E87234DC46BC248E60C5E0AE96CB0B92BF28A8BE + 07EBF8B0C55EB70CC9D29A53407A1CDA8E5AE1BE5B023FB4D6A5635B83821573 + AA5CD0E779F30D0F828FFC2990CC92E598340EA13910D2C0F1B2A96DEA9A0C5D + 0288428FC80268B86DC4FA2F0965050A709D57AF6DF9CC889FDB8864EDE545F7 + EEA233127E2D18B01A95FAD8B277B6A2300F6C76F6C0980F116F84A7C6011087 + C307464ADF91335255FD8A11FA0B0E661E5CB89886E95D3834E761C872BD83CA + 2D779B51B0E328F2C12C1298425B3FEC42BDD452A2D9ED78AEFE1042E86D61B9 + FBF9058AAAF60CE470C405756E2FE1D952376D82387CC532C60EF2F2EEAF91EE + 68FF258D85F18479E20DCFE517DA3D217E36AD6999AD46AE87ACA434B691240C + BB20799BE21224950B39766B39D36F95B82CBC99E6AEE2AAC64BE4E65CC3208B + 29D6804BAC78B4D4151349DFFC0D70393ADCCDCA1BEDBC6AB7ADC0BEABFDE2E4 + 5092F34FCE1D75EAAC2850E04786D89B98138A87BAB0F8827CFC7A560DC1994D + B2DDB1C9C3FE7D2D194CA9AE29279EF3B3157944BA742C5351E590331E72F809 + CB048AAC041F4B70B8FF9B9278059F3802878B8AD03C14976B6DB6B357BB32CF + AEA302019CE7C268F9BE6B54203E07CE8D6C9C3B41C60B64D77B3A5F22585F2D + 5B950E6288BCD0F49DFC228BC8DB9C576D3D89BE55CDC890E104CFC2A7CC2838 + 5211FC6610D52699D05FE917846535D3712A67B7B4BBBF31689E344C62F28F7F + 8F56A23D2B3FFD7B606EE5A327D0DC126260A426CC0C108C6A327BB3A37F1BBF + A6003EE764F01DBEDC3E550B3EF89EB0FEC675A3386DCEC17DC6FB97CC9E1A63 + 79F21F77656DF7EA5BD818BF4373FDE351DED5E3B688E365331BF13D41D95FE4 + 92B749974755CAAF7E078F81D1422A78DB14AED7C5CF69C8BC60B2C52D4999BF + B665FEF4D44F903DEE6D734DC9A35D0CF065F441E33BFFC2142B7BEA99ACCDB3 + 5F0EF390CA3126B11AA308EC966AA3A3CF7C9BD029788C6E2155000734ACDAD4 + 36834FA4A5D850594B19B3E69178C423F921DBC2FC8E63529276BAF3ACD132FD + 87DD28019FB96B6F59EBD4F890C170B6E45A6B46AF6F03A6CB76A49B8065F392 + 7E36AA50D872A9E0DEF0B4920B5F70BABE350E2FD1F8803238949E157D41CADD + 9474A0E10A9632700F15981DB84948B470AC218A5A960B3BB7EB71C3734BF37C + CAF51EF45EC3AB1D444F34D21F59477750C5B5E7848499EBEA36D95242EDD92B + 4B70CED0BB89595B1C5A4ABE99C928E33F9FB802B7E03DE033A61A2F8D3CF63E + 14266ED62BD57DCF0F28C8294B95397E3501EADCFA0B6748182A79B00342A75B + 803C8DB8222C43412D72CB0535DDF3FD540BF19AECD7164C1644B648932E8E79 + FFCFD3CA3428DE8C3E91CD1CFADDF780733FB3AC98F3A975A92547BE3CBFCDFF + B4331AFA735C59D2E6BA8E20082414B528FC2D78B34142C2CC3DEE0D41757517 + 9CC54B2C8277C3BCA6664C3020D69FFABEA7BD80BE64A7EEE2B3FF1DDE293343 + 2F4E67026111D2AA89E8522519C07C15712D3DB72DB8E69E6E947A512D8313B8 + 354496C7AFCE3F74A16FA5089A98298DC4EADDCB7B8E86FF52F0D4965E74BFDC + 7B5804FCBB527ABEE658284281D082A06827393159F5A70CC798269917513A0E + 8BE1D8324D50F37824027F2E80C476D8C194BE88B79904BB51EA5571872E4DEE + 919460C00A40BE20280726EA86C9469BD2E7C5B905F81C791401D9D07CA04A10 + 36621F1825DCEE7F7FD09561274DD5DF5532FBB044F9BE0E8E0F4D985BA847A5 + D8640B5AF2267A66E98CCC2E136BEFAA7DC03B17FE1F95ABD2561824BA6CCD73 + BBACEF0F8614C5A1F81010DDDE7DAB4E3D360485813EA0E6810C0F5C2989B875 + FA588D931103CB7BE93A677CB9C975612861A01651C1009932A9D151069E51BC + 479F0D1D74F58BD2B5CC1B83D70A98E5E1F0EE53ED717A4BEF8AA247BD032F75 + 1812FA3A644FCD833A3BFA65793300A79A7CCD08FD4EEBC2158572FCA6FC532D + 3A0C391002F97A8308135E051B1FCBE1B070C417DFBEB8796722A1A14E3E6D3C + 6139868843EEF4DA1EC382BFD2A14127A0D9847328E8C23FF57EEF32CB7F7A20 + 06F65DF4A6B38E4EAADB43A6859E46724AFFF9AAB9E73347A1C02B8BCBE215EA + 93EC400B13DE4D5358E0A0CB706C6CC935CA7C8104066F9E81C55F53A1334DF3 + 2FE19B1CDDEF52F6AB729900A6EA6B7725F4BF537DC8124BD12FCF8AAE826E8E + 6C35DB3EBEF0D7B0EC746445EED004ADE24D4E663020D32AD273B46F4E7BFA1C + 6E6A9A152366ECAA15BE911A0D92DE538165405457CE0FBDF888C082523AFB86 + A6546D070F9BEA54FE4CEB33119183A907206113D3205B0EE82470D81BD49253 + F363AEFA109478E653FD3950A896D2B906C5B3B4A45ADC8850CB7B0A220FABF5 + 54C8B9E5A44349B409A57AD85E45417E74D97D2D596CD9E1F3BF24A6246332C3 + 64321409F02C84BA1067AC7FB45344F402A29FFCAD9CEC28DCF49C56B8F4EC63 + 8A7788F4AC2582892F289473919B575AA72FC765865A0C7DA00898AE099163DF + C7D8BC3AAEE07E08C4FB36D8A25728A39C849244F85A95D1359B0494EB786A04 + 986C09D1EECDB9C3F3ACE751C1555366924DB9B5A1044D1DAE16DB41E5A66E1F + 6A9579136363BACE2C1EFF5F55A8FDAC9CC4475E43C363410649F0A20654D4C1 + 915622AD5FBB48C70E09AA97E32392E33E08A5456F86D4036EB14B2FD1D3A67F + 52D5931FF44F8B835852D78AEB4C0F9F78A4553B44E932D104A434BE7B51EE4F + 643F17A66074FAE81411FBAD6A322EE8127484AB55B7DEC19B1A81F312F6BA45 + A01C9E1B06067D2B842754B636F0869B17CBDC1A4454C063F0B4A010C8DE95ED + 7CE8B314C38935086AB9B52AD649E82AB0B2E61A6DFB9420259E19E02F19B959 + 82026DC847AA61654C992540A5502BF6CF88CE08D22E80429764AE298F99E4BE + FE73A4BA4C4E31B883F5E804759770265B37B60B1593016F545CF833A72FC294 + 176ADC3D3F8EB61237B800E6797189C1ED790DF495F93B2B934BA323251E39E5 + 1AF43FE2F671207BB0028316CC85491AC6D5D37E4E3736FE6B0BB45769D9DDF9 + E1A559622DB050AB826DE48B31714A215F002B2564E27A83B6FFE4476520A647 + 625ECC7F00112E22AC3C10AD3EDF1C8860484EBE7EA6417E4375032950310ADE + 91700C0C173DA0E3D277ACAD119D46DDBF8104B80C380DB2FC811CB36873C146 + AC5AF37F127E8951F5CCBFD2876694B17F1FD7B07D6F0224909ED53BB1A338B6 + F80E40372E3744889CCF039923BF56808DB3DB61E8AAE9C1065E12E5E9BF2D0C + E8010A6553E1737A45A70240C566443CD63C61EA74A7EB5027A736C9DB46AAA9 + 4EDDA02B91D1ECC7BCC15DF930BAEF585B591574D1A795393DB119B5FB7A842E + 218A755C497F26F28FA23934C6DBBC940FE7981AE79CF00DC981BDC38000E89A + DFD1D99E489D4DA1A4BA716228E8C5CFF3D8A6497832367C0D02D13F6B1A6301 + F045427A65DF558F4527878B85CA63F06BAD303CD3C32F8DDC91D1B86FF35971 + A2FAF57B9FBCBEFC2B7C712B40E827893F11B8807112A58BBBE054DBBA4C0E93 + 8F1FD760CEF12CED1ACC1F3A0F5059F4D6730EC55486EF677EF3B836EA81C18A + 9FAB77CDCF5A0A031EDD4A37FCCA3D14E00279131EDD981253D080FA53882F09 + 350E7DB7B1487FB2D4BF6BA9DCE16E11D3D931E751233EBA8C0F35E2EC39B891 + DEC387C15518335041C66893B36C3B906ADA15CD8F88C99067285035290EB087 + 923038071845392B07B939BF104547BE0E30C51709BD9AF240BB686DB007A030 + 6FA3215F7C3E9DABC3EB7D4B5C789EDED99160730153E79E635BB5B8AF28D8ED + 093A3D6611EC565FC7781D14B3887FE201995D2F675F3F597EB50A9BB3404871 + 10D931B6DBB34A58583247AD731DD9CAAC7142DADA64898798B7E3B784015777 + C2BBB1BD11B6B8AB327D10181E5E9D08EEEDBAD19A76EF67B089AD3FB787C7E3 + 6702BB51B9D6819335644121BC00CAD5932B081376A7B7CB077A463E3BACEBEF + ED0A3877363A7747676F1837CFE539D9A86204BB717CB363092BE3A6317F2792 + 8283A88DC0D616DB3AD97DCECC794EF8EC0CCE6A6AC71D6CC55E861B59C5016F + 7C47E09E677DE1594E4B3CAC9C1695DCC265D45584118A96D059456A0E226A23 + C40A3723BA1BCA3F2473F1B208CF063BC16FAF9BCADB81E418BB1D84A83CD7A4 + 15752DC74DE2001383B461714E14CA006D0F759E232076A4604DD7ED9BD43C36 + DF3480069ECCF31D5F0CADB0A852D1722FF5079B92A0455AC8B6700BA4B7B99F + 3A216855317502C4A79A185712FB21BF34A37FAFDF59640451600F948FBF2DA4 + F2A28EFAB8C5D153225905E8D1D3D6B6678DEC3D1026443C43F735AB36E74661 + 0FB4E3C51552BB730BF5CEA82ACA519747349D912BB85052D28C36B2487E7E0B + 287ED78CF6CFCD751D4C5624DC40690433BAA19A521105B35137A108981C5D61 + C1D45DC3657CA1CD0FD21B64619203955539C55B6D35FD6C63B0A567463086F3 + 6F3B2063D3251710EC920DFC4B17F4A1E8AD80DCABD55F8630FE5EBC80BFB44A + 8803242FADCF41C83594C027A690CEAAACF2F9C66140706EB5AA340CF6BED080 + FAE33D5A34F2E27C1337EC9C2EE942145F41A39AB871FC6D5A9ECDA765C25064 + 9864BF68BACE2A3C224C7BA23A2CEA26A6E0B27F9DFAF25A9396BFCED0337603 + BEE2F121CF61512330D3C74F80D5F5DD3E66F77EFD0BE20CA59E806910CC2BD0 + EF2E7612C1E91BD928492D9EF9FEFE59F251BAF4B8C1902AAAFC5B96D5FC6814 + 26E221B12CF20DDBE7DC22BD919563961A1BC68939ABEA7B365916789F7E9F5D + E7ECD22E99212568546E1A321FBA29AC89BEC076C9DCB937DE55F317FC2E11D1 + 5D497FA86D69073032D18FB553588B3070E543D91E82FC34857E5067F9363494 + C175161E060C3C30FC6FD85FDFB9D3DCCD0392B10DD584528A46A7310A9D482A + EA44701653FEEE8A1114E82E3B96103D00D59AA44470E9B68A9B3703BE92EEA0 + CAAC9E79BFEFEA4572D3CD62FFB896132656A75F132B52E5C7D28D376AEFD606 + 048C372F3C7A420CF263D995FF671AE5212AE6E1082F7A130A3B090D6D41B971 + A70E2E70F0585187CDF3738DE5029E6B785F6FA63BBC0ECA7534B94662506A68 + A69BF0294D1F56533CBD2ABFABFC45DD30CFC65585BA9BE092D87328F398EFD4 + BA0FE2FEF791 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + /Arial-BoldMT findfont /Encoding get + dup 32 /space put + dup 33 /exclam put + dup 34 /quotedbl put + dup 35 /numbersign put + dup 36 /dollar put + dup 37 /percent put + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 43 /plus put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 59 /semicolon put + dup 60 /less put + dup 61 /equal put + dup 62 /greater put + dup 63 /question put + dup 64 /at put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 69 /E put + dup 70 /F put + dup 71 /G put + dup 72 /H put + dup 73 /I put + dup 74 /J put + dup 75 /K put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 81 /Q put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 86 /V put + dup 87 /W put + dup 88 /X put + dup 89 /Y put + dup 90 /Z put + dup 91 /bracketleft put + dup 92 /backslash put + dup 93 /bracketright put + dup 94 /asciicircum put + dup 95 /underscore put + dup 96 /quoteleft put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + dup 122 /z put + dup 123 /braceleft put + dup 124 /bar put + dup 125 /braceright put + dup 126 /asciitilde put + dup 161 /exclamdown put + dup 162 /cent put + dup 163 /sterling put + dup 164 /fraction put + dup 165 /yen put + dup 166 /florin put + dup 167 /section put + dup 168 /currency put + dup 169 /quotesingle put + dup 170 /quotedblleft put + dup 171 /guillemotleft put + dup 172 /guilsinglleft put + dup 173 /guilsinglright put + dup 174 /fi put + dup 175 /fl put + dup 177 /endash put + dup 178 /dagger put + dup 179 /daggerdbl put + dup 180 /periodcentered put + dup 182 /paragraph put + dup 183 /bullet put + dup 184 /quotesinglbase put + dup 185 /quotedblbase put + dup 186 /quotedblright put + dup 187 /guillemotright put + dup 188 /ellipsis put + dup 189 /perthousand put + dup 191 /questiondown put + dup 193 /grave put + dup 194 /acute put + dup 195 /circumflex put + dup 196 /tilde put + dup 197 /macron put + dup 198 /breve put + dup 199 /dotaccent put + dup 200 /dieresis put + dup 202 /ring put + dup 203 /cedilla put + dup 205 /hungarumlaut put + dup 206 /ogonek put + dup 207 /caron put + dup 208 /emdash put + dup 225 /AE put + dup 227 /ordfeminine put + dup 232 /Lslash put + dup 233 /Oslash put + dup 234 /OE put + dup 235 /ordmasculine put + dup 241 /ae put + dup 245 /dotlessi put + dup 248 /lslash put + dup 249 /oslash put + dup 250 /oe put + dup 251 /germandbls put + dup 0 /onesuperior put + dup 127 /.notdef put + pop + end + %%EndResource + + userdict /pdf_svglb get setglobal + end + [/N10/Arial-BoldMT 1 TZG + userdict begin + userdict /pdf_svglb currentglobal put true setglobal + %%BeginResource: font ArialMT + ct_CffDict begin + %!FontType1 + 16 dict begin + /FontInfo 15 dict dup begin + /Notice (Copyright (c) 1991, 1993, 1996, 1997, 1998, 1999 Adobe Systems Incorporated. All Rights Reserved.Arial is a trademark of The Monotype Corporation, registered in the US Patent and Trademark Office and elsewhere.) def + /version (001.001) def + /FullName (Arial MT) def + /FamilyName (Arial MT) def + /Weight (Regular) def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -100 def + /UnderlineThickness 50 def + end def + /FontName /ArialMT def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 0 /.notdef put + def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0 ] def + /FontBBox { -222 -250 1006 922 } def + /XUID [6 44339 ] def + /StrokeWidth 0 def + currentdict end + currentfile eexec A0B00ED5187D9C0F1ECDF51878C3AA5CAA3EC70E14AF46 + F38884AB0522111E1FD6B5E292C7A7C85F79C8CF269C29C6F79E84099DF3FE97 + 919C760621BE9B4756D5ECC123E0FEBC7A1BC9CFDCE3B7AB1B118837C4B97C17 + A4A2D65552C37CAAD683D3DABCC09A36FF0DBDB89E43724FD10F7C1BE056E775 + 101008AD51C29014E0B4AFF4CDE74E1CA5A64E39C83FCEE568A997B7D0D888FB + 5AE51C74D8CBBBF61463B3A1C80032F9E9B615124B88BD716363A24D9B750718 + 4290A3206B935F4107372023D4CF18300B61A6F017E700015589C6D8BC7BED9D + C6B3584EE181363F824D6F1E3CF3DF48A631A54AC4E8C81536C1461454CB4B63 + CBA14A6242F261EBAA3F7955E7C1E758A77E93DB07F4A86D1667FD99BA1B965D + 92FFB04F46A8F81AA8F43A6205BDEBF751C54A5394DF443719D16B0AFBFAF01B + C9203F81FDE5B931E192C430769AD893C30126CA27135878D49BFA89AC71C990 + D2A4E8825524271BDF10C6FB049A8B0E7475BED9B44CD4C2B8104452ACF12AA9 + AC8AFE331F9AF9B0A708BBF3F45200395732639C0F92AB91274625421A93F511 + 6771881AE8715C58B854B88976701B5385AFE60F40E1B56702BA711ABED94473 + B72503CDC76C7C34E0A2298FE19357CA17DF344A592ED134D171E58899FCA9D0 + 62653DAAEFF8D71C19F6D3958220794375F07D635FAC19B5C16DE6D9F30A648B + 9FD57832B6804A07E3B1C5D6B07F59AC95E2FCBE0E02CAD0960ED6C98F70D7F1 + BF7885DD5F0B40BAD91171728FADDFD616EE8A88FC18B5C8F16804C16D7F6408 + CA476477EA76AEA7911801F204F4E0C0313B1FF1EBC254D7323C0DC28797B201 + 5A904335690D638EC2C45723DA891C15965F7E459C7707B5CA2F5FD3AB3E68A0 + 313986EF4BA1E06DA9EF1C961944F5EAD42BF3F30C93B800BD3829FA6254F143 + 6E9FAE87431D328C947B5D4518A07B8BDFCD64BE3F120FB418101229783A489E + 248775C96CCB00A5E65470D0FCBAF0FAE402EBD451D060534D8C0BDBEBB5FCA1 + D2EC726465F6E37F50D455AD5A00EF50DB61B78CD04FAB58973478F3D9301CBF + 6EA03071660EAD7CD6BAD616C77689D560133648C8F3CC438400A2F69C672330 + F046654B0C61443F393DC0B4F138C0051B027383B50F624D1B597BD5B6FA0F3A + 255EA0200400F6EA8C15B2BBA215A6DF7152EB6E1DBA4ACCD4BCE3511207E8DD + 13212B8B2A33C259F9AE30A45B338BACC981BE53D6AEC541E6DE02A15260EDAF + CAE20D543A7277E81EFB454532425CC074D08E1E3E066F4B62AFF15EF8F59202 + EEA5CAF47E4C5F55C16C0F6BACA0E175A659043E50A65B8A4CAACB535CA5BF25 + 824F7EBB192DEBCF59F80B8E8FA78634C7E0C86BAE5385477AE8BB9CF7BADFB3 + 05296420051EA5FBB7780324620366F20EE93A46EC5A65047F69BE9E82953C57 + 5C363FAB8A11C647F86C8FAA99FB3C21E2E9B9311A7F61CA453F919912FC714D + B64BF3D52D3FD48D2BF9FE81EDDC7B93896BCD68C3DA1CAA36D446DE08F14F24 + 881212362D63355AC0A4A4C1DE86F48D18286C2EBC5325387915D77D6586E10F + 9F7332A871D5F876C17998EFD998EE49A21B141B60E33C515464787589D34945 + FC6D3C0697E124CB796B6570FD477D0921D4B5C20DA297A3A5990F39ACAC22CD + 7C0A2E2F6013054D2306398087113AE376AF6BF19822B988FD14AC9F0D11A0E4 + 5B6FA61BC823D97A1BD3B4EAD9CA98A68A8A82A95731ECD22DB5E62890A468C0 + 33E806EA900AA2683E537994FA1CBB14711CD8934550F385593F10E49455D48B + C883E2923D91AFACD479F37E4502A252C407B0A3E0E91F083ED08D5B9EA01C30 + 9B2A91B3EB2B2A9BE3BDEC6C2F1611F5FE5B6C5D6F63E1007ADC1EC081577BEF + 25703376B5CB3EF7AE0B682521326B0602AFC8EDD3F9D29B6681B97F2F6D02C1 + D6B9951EEA1CD4ECE1D1B9030D1E8E498ABF13905DA3A3EE416995456B39301F + 1A268AED8DFC91A4941FA2E15A40865DCE35E106B036811366F5A809D7BBADF2 + D3BE3E66576E1CD5F49F26F48231FB265825D1883F5529372B539765B684408B + D9827D62A85A3223BE93705ADD0EBE9B209C4198FC396CEA26F3C39EEBDFD571 + 696FC4FF8A1046721B1F5A2459772AD1B1D73E8815DF6075C56D6CB4821496E0 + 6177B9BCB8D9DD8141264C9351D1CB9C66F3CA360C73EBC99CF256AB34832665 + 418ED547CF8AF9967445629E3F8812D72C9A1367AF724B29503EBD2709A849A7 + 73B145ED245AF6F558EF3C3DD58A79841D2D8072829B4354B4FB9B92511C1DDE + 4419ABE724FE38922CB46D755965EAF364546A8113725EA3F655A17D23B86DBA + 967D6093A61D81E7D891F1FFCE8555AD2E572ABC392622947EEF2B19F37EE7BA + AA23C81AA8366982D80AF6F8E800DE29C5E9E9F27EA194D5DD0B05448BEB860A + 0F1F0A6B21B920C11019FCD3C7AB2A9131802E49A5C0D83D24282D2893A4D414 + 25607C2775199F43509E85DEBD1940B6BB515F1CAE035F62783B8CE47BD02AFB + 20A5F22CC3A1FECBCCF75E71B22DDCB8DDC1E6BAA1149EFB3643C90574D5854D + F042CFA4C6AD811BFBF1D9B3F28CF5CA542033379C85879D32122C8A647978B5 + 196B70CF7AD5F4986720107860406624DF6DEC7EF00F683504CAD094C1D9B02D + B0F85AB73DC47B4E598324D3D87348A08FE851CB80183CAFC75DA9F097F437F0 + 4B201BE3D266A020292DB51B30FB6789E6381981D1E4F90CAF8B0F2DFC6D169B + 30E18BE97EF91B75E09904BE317F7D6F881EDC478742EEC2B480E9E8A7DDD194 + 42B4ACBF73B56BF0719F73E4E0C4FC0FE55777E7DC2FB7C28E043BFA7D93D42B + D399400549C35FD4A97B36275903BD7F0B87BA7171186DF4E052114E06CEB9BC + 507FCA94AFD74BF077E0A0926A1ED0C76395A9EC95964026A4A3D1201551B0A4 + 505DAE3B203E6597D3CABFE5F0DA7173630CCB05EBAD3994A072DFC27BA6E93C + 965ADCEF109D4AC3AAC43F493750D1A3AB840159EAC69422A70E17F078931605 + A65F6D264A140DF4B0466E98FD9A620B48E9AE7AD462E8C6DAD19A6074CF929A + 5FC78056D249B2E2A4C64E3E378047787E25C8E3CB799831021990736A979469 + 291E01D76778C4854DAE4785D7554DD5E5159F2C95BF76B752DA815B8E123689 + C77DB25BF0A6F0DE18F8CD9E3E585C5F5A806ABDB3B1653BEEA0D7E0EFF2348A + 8AA54DB0B29E5A3FE8AE348EE04F1EAAA7A7CA16A43E7B6D4B71312A9BF29191 + 4C2B3DC2BBE1D3B5ADC998199239FE7639C1345A4BD8A6366436580CC30C0D05 + 84914262FC7E798A62CF2FEF968D05FD4C6863D9AFEF5AE41D12FDC272C50695 + E9AACE78A61FB7017430186DDFE3D535471936C2FB4C7AA03CA3C7D70CA15526 + 0F851513E08FB11A3A1AB04280E4C22F2F06434DC59CA70B7E9EA443668902F7 + 70058CAC92A2967EE581143887BD5165638B47B6F0A31F01647C28F56263EB6B + 70CBF3BC9C48DFDDD9D81BD7D323D3B1086E35B86A8D111B3B5A656119239CC0 + C106D49294DFA01E1D32745FC88F8A17E614A32164B891EB787F4D681E74A3A8 + 4EDAC7D8D6BBE9A84FC9F7FAB3D7E7211E4C57F9CFEF7C5C3D292971D4435199 + 2FB5C396D93A20FC01C54E903A7F0809F44FD39D74F194F06D5B2F6112181321 + 59BC06420509DCFC2AA4C7C0E2F7A01E47C4AF9D83474EC7C326ED7D45F67550 + 283B1DD83F682155C7579025A47218D6393B6E10F1108902553B1D9E4679927F + E6183F4673276A1371895857A61AED50ACD7250CD94F01E9728F26CDADAFA751 + D4F63803ED04708EB64E3576196065311C3CEFD7C823B8D03A71F983B2F61182 + 2D67217F51E80DEBFF0ACD0B71B7E4C5AF129DC11E18597B3930B67358181789 + 1ED9A4BA4304DE8C02D520423CEA3FEFACCCD6C51997E2E201F6E658EDAD7BD4 + 2E3AA2A040D205F5FFE0AACEC3CE9E35304F2FB46CFF000E19D908FC360AB518 + A6EAE095E3A510D06488F5C3356DE58C20C5383125A8B70F64CBD689F9CDEC93 + 57BA59AC019828F415225B57BC706072B26C15ABF21195F6E812D1BB55761502 + 878F7DB41EAEE10B72FD42BE5847344D108DB5FA5C74F8F92AB617C50FA6EA2F + 4DFB003C241E522E01FF393572F2024F506C99C4601195958FB17F6C2A7F0754 + FA9DEEA8466C67ED10B6B49826C6F417C402D485CFB262847B307A9481209A62 + 554927F8860664038D73E298BF0A865EF16075A64633F2E2D5F7604C4E4A1535 + 6CFCFE727A89C10F122EFD87D157177065A8676D9E668ABFAA25537BD5319418 + F6C9C826082D3277DDAEA8DA0C332AEE80E03DAB6B1F7CEA226830BB7EBFB709 + 832560C9174EA571FF354742FE0AEBCEDFE381899B2BA05F61C0D8ABCDFE3B8D + 274A6A0D49520EF4EB02C62FC5160AEA8BD284445238EDF8A057BC091B85F418 + 5E979392F00A218EDDE76F97E2839B17E7B4013F130682AAACBE2F9218A5A93A + 3CFC057F5AF071F75B82206F94FA17F54E6F71BFD578EE68801F1567E97C9E8C + 4B1A22889D06C7FA4668981F8D70729AC4001D4636228A46BED87EDC73D5AEED + DA1BEA33F6093848FD2A6AD0F6FAD9A6DDC132FAA99398D22819CF29D5C2AEF2 + 9349373FF31A56942922C297F03C923E52FCCF4FC49B3AD1D9B05FC03F77D26B + C266952BEE8927F257BB29BE33E2DC8D37293F348EB776F1595C2C705AFBD1D5 + 981A9F80BA14BA7FE2AE63F9629300797CCB7BBABD8ABACCAFEFB4FA0C3F6834 + B0605AC8992CEB28DD64840FE35F8B82C3F28DCA7F59E7BC15D3CB752DB98E70 + 5DFC14336FBD98825E25422E29CF9A454B39749D7966DABE2A62B10E651FE4AF + 1BD2D7967C93CB7551E099927CB0F327B98204F5CC896C8F54DFF84E54C316C4 + E7E80C35DE22DB201CDA5CC2DCED211BD2C0301F44CA54DE07AD73CD4605835A + B026D2E53F6518551C180469A83D5F7131E367452306C1D71E357DBFA8BA9329 + FA86682E0A5A85A91BA04972CA5138ABA88959B004BB9377484493051DD68056 + 1452C5D202A15A433188F9DF70526AD0B5305C14812CF2481D22CFAF89E357C0 + 97541CCE109C468AE99ACEC83FC85D4184D7333A4EC3ED05AB4A4A313F8DCD85 + BAC1BB0E4DFA9CB36DCE88099A0FAEC665138EDD86436191BEBF4F67D4492865 + CE2E446C3CD9634A474E7B53EE756C93B3EE1EAF95BB66DD465D52D853FD2434 + 1760250C3070601BB35E4485ABCFCA9E9D257334889DD0909C9A86399A41D623 + 20EF0320886BFC2F9535C231851CA6F445FFB4449DBA10A78E6C77AA45C5A880 + 3F46952BC328B80D38BC1EBF615EF7C603C8734ABF624DF726B6B6FB281D7DE7 + 5993A64E15B7BED306D4D293D5A7DC84148D14A918AE73856C7685C238C2ADB7 + 6A4FCBC74DE4837DBD244DBBD722D09A253FBE3757AF79D4262582FDA40E4EC3 + 4B1DEDA6797C15AC457349203A28871D17D447280DA7E811D24033D38BC3253C + 1B213EC5DD2FC811A5DABFF75F282486B192093BEF15FA2E510C15DBB9681C92 + F8CD64F1B41901559285B089B87EAD0451FFEB200DD126A264597DB8550CF94B + FBBB78899EC837CB7C2E381BF444B4C1E2AA2CB19836726DB0E745C0A3029521 + 602D5EA7BD26F33B2BEE4A255F0D301A372724214741FA66503A801CB88C6BB0 + 5C6F22BFE4E8F6FD3F37927AF7C71F9EB5F42BCFE1C26AF0A40E16B9238E65A9 + FC4812BEF803C8D42ED81D5F9E6F130267D4516DCB084412E72E2E4EA3A4FDAD + AB6067B4057A35B7E507ABCBE265581A2E60D930EAB40763A9131FE72CD14C15 + 1AFDDE4C0154D812E7222A9F587CA1BFAF7E70F05493DB925A8ED8D97D07A30E + 83633F45923213D47DB0D546A818873AF1DD0FEBEEFC2F4BA27C2AA140954678 + 7A3DE247426E23CB0B5C0C2A535D1378AC6C153F7934542F3F0803AAB9FE206F + 67EA2A77C782C72F0214A3EBA8B4776214BBF5537EFAF0C8864B6F7847BC07E2 + 538774ACD5727D517C77F910035857B3E6869D14F81216E35C615CB010CE1692 + 79C7F8626498BD854DE0E5E13D50B09C16ABBD96D3A817E53CD541454BD23797 + 8AB95BDAD2D0CF607BED989668A3404976D194DE3DBE045292061EF685560868 + 54B4F11CCB21489E7A2DD8C120E70A7C6EAC263B1B89401981D13BE1FE2D3AEA + 7572935DA23FF1FCE073689EDABCE1144C31B4521811C56D0B787551AA6D87CF + DC7B1C6936851BBB0CE2923E8CC97C30E3DB86F0588DB1CBD9751E3806669089 + DB0F32070C9DD2310E54313113D3D3AA330A99B4893D8FF077662960CA4AEB8D + 6FB4CEDF2ED2926597D155A7BEC8EA3011E735D9A7B17EBADB27C09E34E5909C + CCDFE5B74556577A1F31073B9BE6876F397A6B51C415565F6CF4F8477876A909 + 7AF23CE9283F99924A00670E377FC6CC2C5A2EABC51687C0A0E3E7833E270520 + CAAFBE18BF863B4B950F6916D6CA8E6454EA76C04931C7BC883C0070AFA0DA33 + B3DD70DE68114E8A1C6E164D227A3F8F317B73116043A0C145025CC8A322A637 + 583C084D10C5F154EC29D15439DD8F436A2D4C56D56D147B851BF96A3F0535F4 + C0B865CFF88DFE0DECFC6AC9A30F51E6768BD8475E76DDA2D8FD48C5102706CC + 98CB773088B05F0492F2F82FB213745B88D87151AB317085D0444492421F27C3 + C01B3C1901BF86E719ECBAC5525F9B0FA862F3A10E549B9F07D9F3B43AC51BE2 + 9E107E737D3188A91CF57D7C739583835073A7082E94336EA42BADB20918A370 + 2E5E6F121C11BF956C3C23F1F1F9DFED5F187DAFB3528C6936BCE11AF4793087 + 763B4F2F4A81592EC7074D2ED1BB0724D82629CA7E054BB2C1EBA8B49486A11A + F8C92EF89C735AD88242C3165CF44EC64ABCFE378C1EFA1F11E979C3D09DE332 + 1DEC2A8C1CD30E12D4A960CD33C72ABA46BE1BA9AB05F1746A1F707A746F5AC9 + 023910335FFE88A5F9B9768A9673845D30C201A6CA3C2E65FC911EFAE8E54BCE + F877A8236A2835CD2789A31EA9F7F422FD785A3503AD0EFF2B58105FD86CA536 + 938DFE5549BB115FF1170E31EFBA8E6ADA58730AE2F3313913DEE77E01D97EA7 + 71C5FEADD8DCED4F881DCC1A702BAD8D36A0A26C1EDBC4F00F0BB21BA91A4090 + 8BA77A7CD5BBF1D25BC0416B5DE1456EA3188DE97FE0EC0797119E9C8E81FCB7 + B9B137E9E4DB829A47A4FDEF03D93F5F45197F46B2E7C04ABFD55C960C2F3BB8 + 7A9EBAF2BCCA67D6D78DC86FC44F55730490DB4C00EA25CE4D4A5AC4AA45B973 + 10D3D1B7CF84E5C3877DB63EB307E3AC2FCB62FA9CCE135A5809C7D77B20983F + E2471999B318EA15D8A33389A86B84EE277BED89971F32588795B64767D20621 + BEB1C7F003F9AB28D396C2CEA1B668C570A90CB21F5E69F440046D2E255E8DD8 + D0A30521005616262259349A174E88B8CF8468B94876DE0CDC2C2AF592FBE1FE + E94912C87E4D2EC34A10700BBE528FC38675766FE8DDBEE5355D2163156B50FA + 2B74CBD15D3950D36521F6E971510A5A6DEA8D50D0F4B3A9124BA2CFBB81164C + 351E911EDE208416757BD186DED69B24C81095A7CB7BF185E5B69B842CE11CF7 + D80E92CA194E46162A5EE583A61C212475A0F9B70F5A8FED079DFEEF281609E5 + E7A953EF08DCF8117F9872E392395012EA536B8EFBA94DD04D94C1EF7714DF01 + 482BC1D9022406CDFDD713F8A4596AE80CB3F211DC2942FD033401D236F8D433 + B37A27FAF8362C22A69A558BCB6F6DEFC0F853D379ABC4706971E169EA482ADD + 2BB3F2E91972C87BEF275FD07735815E0589FA5C02F2A51B8EBD6DC6333738CD + 1D5C910A279E9AEDA7496AFC29E36F678C72DE40EA33F2750A36846A2B0D2A0C + 961D48289B981A2EAEA7CBF3B215724FFBFC720E949717ADA630CFCC704B1307 + C652D4ACD8E662380F9C2E11088BFE6EC6ADAD402464BB35E629B05169A78927 + 11704A570B24357C0E267C1700BF6DC76A2BBCC6F8181F710652DF2A85BEF960 + 241256325284F09A457DCB98A6E8D273952966804BCC023A216EDECAE681A522 + 7314668D3B38C0FCDC11EB7CD50781790509BD9C0706810CBA7C7F4F0D0AC364 + B6732C64FA47A65FC5DA6DC109C18F4F52E02DEC24E434D9F6BD9A53711A4042 + 6483BA0C7C2B8A85CB30D4F1C5F0761F61CD0A99890D7DAA6C97EF326BCDC88C + 0A9F6C6C2D57950CB482D4C4E7E3503FAAF70850EAF284D73A4D7CA5440D625D + C96AB5634CFCC923CFACA343C0A3A361756D55EEA1FA1E9458DDF965C6C0721E + 92C5A066FE13F9F87EA9B3AC013BE4D5E85D7948F182C1C09CCD3C7945035BC0 + AB8BD07B2F0CCBEC6EC156340F12478E47F28766A3667960BACEC484E745663E + 774177E99D32F9518A31C0B88281D6270BC5DF83CC23D686C25C6796FBD4E617 + DB97D6F572BF4E91E1738AE1F7A7B0FCCC4EA07E5587B99836B6BD04949A5112 + 9AEBAF7D89259CFF3E03DA661B3B1F82BE911DF21E45A4C3002E15737170F1E4 + 323B0B7A025F0987FCD7F6A7C9EFCED4D09DDB60F10FEEACFBB32B898BDC4413 + 0329D6D1260176B9E2AD358DF23C526DBDFB27F6F2FC81E3B4FF796D3D1856B7 + 25D2A48B2F82BC1EFAFC038823852E753ADC3614BDFC4B5240FD8F47C1DCFFE7 + DF66DEF58D9E1633E57DEE8C7F8BBC9BE0884EFAE93894B8709D88161CC43132 + 695A72320B57344199C502DDA81A446D1320DC4B62B7F6D7D7CD43E94005DD7C + 88F0FA0E339869EAB6F0859627F61F5BEDA3795059388222DB4FAB385D681BE2 + 926000A8009A42A1252104E6FF7F1490259419F89A47233D86E083A5AB852AA1 + D3555D05F4B6B52C28479B91CDB53323517B6B40458AC4A3F567DF142B654D14 + CAD1A682439D29908E29EBC65889A472E9B15E6468E9ADE97CC6FE90945702A4 + 262B8E6BD70D0AB853AE8E57E302049A02139C82454024093F9724685C8B8F94 + 34E23495444F3B8D195B1BEE6025286CD66DD297FE7C5350BB3F4AC0A23D9B6B + CF0D4A411C7D018291150EB9AA5351030FB716D1E0FA5ABF14A1CE6D98AE9F03 + BDC1497FDB995F1BD7482673B12BF732709B22B1EEB113A389AF650BA6CE57D9 + 9CC63BB5A3E8D0A06480ECF7C9A87436C239219C246E42A7B5AEAF43DA8042F5 + AE62704E332B12A5344D50F672099E4543F5CE715227B347D3EB34F01CEB1FC7 + C2C1E151B787739775647A7F27A6DB802AB28F2A83472D8EEF7A74BE517C61E4 + E6BFC3FC8E1022B63623FD987629C10A4B0E8A8563F2E6CDB34249F2002CCF4A + 2AAD7677D6298DA001C00CC59A45CA32D7373D3146737A5DD6D9C3FB40CD16D2 + 37A5F759FC904936856CE916AFBFC3099D8D8CB48891002B222110E169D32E61 + 53442A14A1AD51280B918029B9699AAFCC01B0821781A23CD5A5159703A2C2EF + B9BA7DC8FFDEBB091A0703426B8B37C37156BEED1B67526995BB659CC9757171 + 502C27380D4FF5D3B84D9B50DA2E7DAC00A9B4F737E2F0259D3678DD3790DD91 + 3A59CF899F89C68F4A4846DBE7D1F5BE4D544C4796B086E3D93D199D6ECDC003 + ADED84D3F8973364BD288B8A662395450062893C1237F6E9CB438E1F9AD54C48 + 4DFB2C86D923E7D33B6E42CEF8A55F0A67238927D8548E8F9D27758B8D1E72ED + 9AEA686369CDA9CBAA3FADD8BC374A462D955E641DC537E2D581D641F19062BE + 34D14F7D120ACE457D58D888874E84A44E1706AFD76AEA9C956BBCDCD959837B + 7292ACE14D63BA658C049255AAF1191A797FB9559C473521FE3E8F7A6E5C9ABF + B539268C27554413C9F1B7B822020C9949732F6918EDAC9ADEDB11E049C4B239 + 3672F95D00D6BAEF22EE08737D32820D7CDF18EE825159577F65B5ED2377A68F + 2FD871D4407D212187F5E244239C35DBEE6894ADAEAB8F5CEA9FFE0F2F2AF3EA + 9F99F097AC38F210D9EA5C66700058C33E5087E2003E77E2D3E7BE37E9E7B0CD + 2A9295EFEDE8A0D1154196ABA5CAA8A5D65A1C0205FF05237F58C097B78A9E7D + AE71257606438617BBC922D7808CC73897F6605B39EFC269E674F6766C52F061 + E8C14DDF8E6F1FBAB411F50C4E9E1CB90541403BED5A569238A62F1B38E4FEB1 + B9D4C82FF075F64108679F06DE974C2B98154F8E71CBC4445AF6B9D43E715C41 + A424477DC3BE7900018EBB602045D605E9EDBCF0457F45649D869489A7B7D8EF + D0B5B00E0EB522FD0C67453089839D8601625F03E646CDA3E9D7B03473597555 + 5D6989548EFAB9D2AF83E2F8C26CDE5A9DD7FEDDBA3C1865444027ACCB3AF41E + 20A9ADD814E6C60315716B618E75364EC70CD99FAA93278AE712C5EFC1DFBE96 + 579144AED2BABBC932665D840B48B9FD71B263A1D86EE2A08E6DCCDB791720C7 + A83BB28A3629DB628F623EAD1E8910FA6B905E1B9639E2EE4812B5AE9C42AB1F + 9596508320EA819B33CFA017F8636707C24106DBC4F3F7E56D0F726B455CF905 + 6117383B6994F9B08AB0811FF256390717726F0EF0B97D98C514234722E87B33 + 0957ADB0E40AB53C301F363AB2006663E8511CB09B4791D5254A8B42C01D4653 + CE459F2C8F44410A3975126E2F12A759CD253881D9D1CF91A1A62B056D84069E + FDA1A4B9D76B2019880B1C2C5AE9DACDED2FCA522B507425C033C39D34E914F6 + DC4CBACBA8069FC4917AA791DC56A9CB90080222064CDB87CD26E89B79BBD375 + 67FF6BFE2CD60F20A808C679C130B66FA17B31E6C3F41EC28BD1C4C2A96E944A + 05662279988A7F41E1AFAD375138CEF9288697CC55BF125F7AF57B6843C690E3 + 5FC7F7B2802DE0260498F7D723923EA12A5DBDE2BD757FF33E2EA8BAA974E53C + 890A9E1C29E85484D7176A63C038ED69663F2EDE72E54F0C03FC546D8424812B + E40EF5DB62C7D50827671FBBCF27F0A9AADB8D15E246ACEFE25BB49430C9C37E + 415BE72ED38AE50B22B5C9634ED88ABFB6438DD6B13C74BD7CB9A6DDD234BA6A + D281AA1A5B567CACE5738227295BFE7C18C868DB982BDB0B4D033AD60FE20C6D + EB9353877904F0C8B4D951DEBFD96DC897C1084418AA332A063017016766260A + 4F48298C2BD39257D40E8F75FD3507EA809E4805939A59E9922CB15B2EF0ADBF + 5BA0FFA96C67DB2220B5A59AB03F3FE3A365116746798892CA7285F0839C7FF0 + E03C450FC11C30932C007E12A6B6902B8834A9C067B6EC5531CB137371C533F3 + 75B17E3CC307D346944F80A8DA6F3C6C2AEA295A013EE084E7B1C42D158B7EBB + 6B5E30B06C379EC7F66B8CB9A50DD34A8233E1CE18471A8CF7EEC646D3E378A4 + 453D932CF50B7E576A005772596B25B11F78B4BB89973CD55C40E19E2DA99135 + 1CC77D7B2449FC7339466DAAFF480C5269E55A16F5A71BC41F282F466276E884 + 9332EB5B86E2D96F11AF1E5A5AAF521EA203062BDD877415DC357896D5294897 + E1EED1CB0EF2F3E52E6AA7AC396662F4E7DD2AE83A740C961A322EE11846040C + 81AFB289A4D7F422222847A164DB13BAA768AB50FD177936FCFD117BFC5EE961 + 4EA21017301254C78CE6D18B985C463DF43044C2388D21E4EC51BD489DC170D6 + B712359A6735B19093A25AFA743FF0D1A88591BB2D5876DE9055C646F75A1510 + 198B21767C67A655C967093731CE31424AC8C63C4E3654BCDCB90F2A2DB9828A + 91A97EE0C13C1E3FFEEFDA52C4F2C326552EB93F2047CA1345F1F139BD9A9649 + 81FE4F0BC006CDE8F3EAEB3C5E2AA537F2F9A770ECF05001D22EB192C5E83AE4 + E6E2757B1675438372CBD0BF4BA3680CFE9387E834AE7F6741089D89858DE31E + 57D0AF4113157CE1B79CE5FC3880959B3179D488345DBFA33ABCDD3213BC388F + 3FFF9CA54083A0A47F37D5CF1EF48F9AF64AA904011A0DC5580D9E5F9D02B2CA + 61F9A74805FF7EEA16A5ED0A1213752AFAA894F5E750115B448EC2530ED5DE57 + FEC6F6AE773195F5E907CE9918E0AA6602CF974CADDE726C4B4EE2A05549F168 + 76C0EB34D633F0C51F6D21D34BA56706775BE1023A8889CA73E28812E1A8D5A9 + FEE81C9DC165557ECCA94DF7CE945B3CD24CB0497137D3297C635AE9305D2CA6 + B705F070A52D127A1B1862B72E8C2815CBF23EC80CADF7239596A5F2012E33F7 + C87B95531D574F525555F4FE8EE0662FBA341DABF23EB24F8026D327E039DA44 + 89362D91C2D138E6D768B49A4F8B79F56641DF6F16562FD6416459DE3BDAF053 + 714745C7E9CA273D57BDC647E8D36FD750D1871CE0DAEA9454485E3AA1F981E8 + 0791A6FEB2AA25AEEF544B7B351FDD2CF8CD64571A79BC199A288574D7132B8E + F24DF197828B625081CE072AF9001AE81DDDF994F369DD52E7250E8F42EA55C5 + CD0AFD5572BE4FECCE06AFA0A48D70A929838530CAEB5F6179B37B9FF84958AC + D0E615668A0832A26CF95C53FAD456BCC0AB2C330024D8B85D249D2CE6FF67AE + 39DB4B95C1AE20BB730C9F268892B0497C8D353EEBBCDA5B695E449B7A5D164A + 9BE1319BD377E4097BDDF21830C18489CADE6BABF640CDE853082CBF0A3BF931 + 143422991DFA2D7F670B83BF78730712FFDFD4CA4112CC6934284652D8C1DC0E + 51022CD9F1BE46CE700D458E5B1BB0917D871EB8A27256897E042C91B6FC470B + D41D75F955F6456D55FFF7962D601EAF6E066A7781381208F61E31853317F7EF + B638C3BBFABCE1C8C68944C36DB2DD375B038E0B5F10091FAA0F185884C238A7 + F983EB48CCE8CE08DE7BA22C8D670EECB5402F3B335642B92232BCA7437E45F8 + CFF3082A5D0DAFAF3D06A3B05DF217CC131EFB7EFCAD55185E1A26C2FE2A30CB + BD1B783BFA2FD5D3C003B30DF8F678BF31600E19DE6A824EDB7B0437603F23E7 + B68003A221E125CEB715E67E6FD896E1B835D43426E69B3978AF9FE9B0B32966 + 8C27EF77BCDC956AC40F9B3832306CE237E440D796968821AE2DC60B271F8ED2 + 5F09BDB5DF2BFCA8654EC28FFAEF28725F2933A068D2ACBC1B217FE6D46D700C + 208FD63C717282D152EF5BCE49F2B1A99D436A84B502AD48B931CC9D13F23483 + 0429A536EB8E2145B96736D9A102D65A5F3E73D048B2CE6DE41D566116785D90 + A4FBCD0D377F6DEC7EDB4047D850FA8AE349C1342E39FB3E9E21EBB3DB3906FC + 0FA3411F6175CA8B6DBC99123F2F94002E1D20B98FBA8ADB9C8FAFF99FC67093 + 867FE1F1D699EAA27A3E90E6B8EBB4A5948E6EF426CCA1E9F9CE276E73842161 + 14E6268EC487A6CA0580BF4550C7C3DDC81700DBB4C58A8303CC76E5DBE3EDB8 + 7F80C22C857D60FB0A723374EB7DFEA1F4A987F14757EC1870719701219D9F92 + F01AAF8E0F5AB1E245361D235AC7122C58F66BF57D401CE9A17BB98A994178EF + A25126EC3DB7CFC26AC8942877FE586B566CCC61C07EBD44CECE694D36E7287F + A9B5B022DFFB7C1B56388FD43D2AE2D0A6630D28A4049761BCFE117FF7B55EC6 + 47606DB758AF1FA50AA3FD5C7D1C766BD88CBDFCEF0D497D4C0DC0F6F2860547 + 35A2D4F79C65D5B8E43B9CA952622682ABD20BFB2BDD04D89004CB1BBFAE89C9 + D373477ED7CC7C6484137B77EC745A34364F88D9A0C53C1DDA908B50DBE2AD6C + E1CD8EC1A8BE3AA9FF0B2DD245D8FC50868989D93B05FF30D8825953EF79548A + 89578D7BC51D3F8623987885AD56C4076F35D10DC10EB7369769C5E9D8EFC993 + 644D5863BE900DBA3886682226407E4BD2B3CBB3F0BE8A827555C7CCBE07807E + 81A5235F10321CC7AF816668973603E2BADC29ED0718245099C3BB0F8027D241 + 4FEE7A27DD8BBD52FF76302AB688E6C452EDA6D6AE3921B430EE62159C960B4F + 7E5078010F6419F24DBEFBA09D9286594EA69D6B83A83D9C7B706C4019CDCE1A + E6702B4096EB885CBFC0F1D83A1643D9881AB062734810A35F780E156E7538A2 + D8672E00F98CD218D7AD59382435851597C6FB5C681E99AA3B54D984E1E6355F + E7EA8B8F9D0AB617733FBEB7F4C77922A131D8FD4513BEA5B52C07EFE1D0AC44 + 85B1ECE90F3957B1583FA02CE642CFABE419A79D5D7B40B46D68AAF77B731BFF + AE71F66F4A8B5180001605D4ADCA0104BC8DDDA2E75496B2FAB5CD5E26CB1194 + FD71A73EC803DB5726D7D8CD98F17F059E0FE003FE9210078956A3F829241CDB + 2C66159AB563AE1D6AECF15F1AD3588510ABD7B5095C5EDEE2758DF8A074EFF1 + 4CDC2A369F44F43773849691B4BDD94B87C6C2300276D2652BDABCD8354A9C32 + 30CE2FDD010645F586C41D4AEB1168940AC38E485C415396F6E51174FE49BC04 + E0F4A41DCBBE1FE050160EAA865D0A1C2C7BD9EDEFEEF6B2FCEEF92FA2E794E3 + 5D48B0A1E8FDD58060CA6A0B49D1D99721BDA689DDA975D523EE96502E88C529 + 1217AF7920A1F79F19E0327FBB203041B9DC04DD6324C285B87A8C76AF32FE30 + 9B59EC61042511EBB5D21699495D1C675330678576B5BD6D5A611CAF8825E628 + E0E77BFA9563AE8EC8388CE431D2257C88E1BD6C0A919E8427BAC54F7B9FBE88 + 87C60A5683A64DC8B001A52FAAD02F2F557A33F9BA4C774086DFF5E0CBF45599 + D23642AC8513F89905D96FCC32784B0F2C61E0FC4F3B32AA7AE08D65404845B8 + 6C8FB766F111F4200F1DB20EC50C2657E96CD1E25B43AE45A4B4BF413E2D9FB8 + D78AF6F6BA1ED3438F167E197C40AA586B7C3BD0CC3AFBAED567A8464A902E04 + C571780783F0AFA3CBA16235A581381AFD266145DE84F23A4A3962A7FDB54A57 + 457EA9488217E54862CEDE4F291A0F7E79CCF8D2C3D0CD8FDB280CCA1C425939 + C837715B22DBA1E1D0BEBFC252C45B8F653794C13913722F486C26E75CADCE77 + AF57571C04F3D0FE0A0E2A0BA88D46AA758B0EFE8B2449D97F27B37D28509503 + B6078BD53C505E6922AA22144857B5BA47AB9A13A6DBFBB03D03FE7BD9B59371 + CC59708A7C82FD6B0483DD845D53FC8CBDA75AD21259C7DD96C7E823325FD8EE + 172C6A034717A3353F7361C213C3E7C224152CC010BBE00B75CCA4EFFC122434 + 4B267CA4FC0260FF88AF16D4473E6BD03A0089D1BDC389BB2D0A2BE9A6A79713 + C2642E1D787F62DA9102EF9EE3C040FF746C933240AEDFCAB24CC03594491D0E + A7E451CD51E3A681CF7CD0F09BA2F1D7EB6CF3838D3373A7D88E04AB2E6CF446 + 851617CFDB8BACC4AB63DC2CBB9AEBA4F75A217BBF8200A24C47BA6B9EA62E67 + CB66CB16C449DB4EC5283C8C2DF3CD1F6974E95FC177B9A09452B3D66F285756 + DD0ADAA460F3E89349C36FF759AB0BFFCD811F2C03E98DCA3E73891A4BB9403C + CFC58F6B06E082DF7B14A9B981E0715D0C51E847614B144761FFC8121C7BC226 + ABC2F1F140D3C24B5BDB56B489E5D2C3E4B9F8FD1A8F8885D950CEDDB16C9D26 + C0082A49CD719AF0690A0B597F5CEFF356D86D8D948C943C9AC7BA0717969B8C + 9E53D837884195C5455639CE51EB71184294BAAAD10D60600EF53E600ED09D84 + 155629C4F57BED39943CB09420DDB6D6A689D147ADB3E2F839E0D35866875E31 + 03B555A16D3EB508A6AD112496AD5A075561615C498DABC6CBE8E29C2E289D18 + 0FD1E04BC0AAAAF54D7316C59BF8A7D0FE929A9ADE643A99C29CB8B5EEF9D0EC + A0EC5886D7C63B2BF802E6838F7C5CDE3BB885D1B4866B0E854B68F6B071C15E + 4CED37F535D56F232B68D07D9352372987A7D66EFBA92FC6C42CB37F857041D7 + 6425DCB774523D16430B5672B535AF436599F760DBAE1CF7C33D9637DD8DF283 + 8B355BA6C80674191DF895FA92B54774B42BA45C7B0FB08215AF42943140136A + D750719821316AC907D72AF38C4206A40305A53D17DAF53198CBADA262C77AC4 + 75EA4A4DD77037D91E76764A7BA4573A610996ED3A721ACECE828EE8D0704356 + 0290382EE000586053560E747C65B2CFF9D16A4C7BCD1DD4016B95457CD545BC + 8A1B3AB239202C106BA9CB13C5606D8FE667BBD97D71D424C8B108C09CA9EBF0 + FE003E1345803D249E101F4F24C8B9296920EB1057ED5081D55CDD08B289289A + 21252531E494137765312365ED5FCDC994DDCE88010C31FF63A5225344E67063 + 09166712A9AAE98BD976D6EC42BFF36BF20B6293707B48A26D60E136F0F8B0E2 + 4B264A41D54447246554F596C04E552DE0271D0DC22A788AFE6E78623D94CD38 + 3728C67DEF29BC237AED6CFD87D4453E06BE19E12B69AB66CB174D5EF85441C6 + CD3133C5D8030E628EEFEE11A067E8141213E6398197B47FDAAB002328911626 + 8D40108D56316D8A9554D8487C5C3531F8BB03135341ACA5B66FAC08DC4FD018 + B3DD562A6D32710CA57141F28B461D810179FE2313488E17559F486EC80EFA6A + 955C19BD0D7F58A5D2D319D3249EE8488931EA56F2A92A727F7690F6CE5EC903 + B296DDA6AC3757523418A2D96DA8810B4AA9DC746434DC4540927849BEBE96A1 + C86F0492E55257058C08B13F97DE7B9EB8C3B9355ADC5D4401D1E00876D43341 + 873F064732F136F18561EA03DB2BD71FA728D2BC7D3E070AFF24F200BCECE913 + 0D360614A3114089CD297C85B6AAECFC29FDBDEFE4C9C67C2FC390F148E50EF3 + E38719E2F6471758B3158402F90A239F17F26983201AAB0E0700C9C2E32F4444 + 5DE750154DAA72EE4AA53185026BDD2A23DBB630C87DA4FC51F1C6016399C09A + 284282745FF0049EBD208873EEA93EBB638F8F646D10D99B759604D617F5A1CE + 9D8D9C8D5E1DF497157497D147C509E1B584986E93F6D85864A79D417944E1F0 + 2A2FEFFFCC51DDD4470BEF1CE553A7E406C424187240D221704A2F45017EA94B + B9AB319074FA0078A046E2F10F83D9FAD2F729DC762570017FF61C4E6EE5319A + 2BEBF3BD9F6392DA468F5F5472FB09EE7B4B3FAC19EA648ED1D5EAB5598193A2 + 4B0AA0E69F2015FA20CCEAFBB75047D36527DD7A58643D6FFDB0F7E98B95313C + 35A06C2D98535055D04B55B1D616701C5EC6E71D497D5224084CDB92AE80C7C5 + 309C9C23CB55954B26BA124B6D8A8E95AB0FA759E3C1CF0430A06D5BB7A8F5FF + 62CDF1530B09E0F6B6012AD85ACB62F3AF7AE208FAD8857339D86944716B87D2 + 97F76489B0BF3922030B51587AEC7F452B69E8C16FFEF7405BF365F421044EFF + F0B2BE653172DE00E2B51736839D1707CD47A5E835ED694917F88389CAEBA855 + D35C672186FE2F349C1AF67ADB85EB9E1EDB563C33017C40DC18AAE3F15D8CF4 + 25116B0F888443A38D9AB76DCA31FAC4660AE9CC0879B1D7C565708DA4D3DE43 + 1B32A6F80542202D3F4A00B1C525B3153C3DFEA43E37BAA2E123CD74ED5F70C5 + F2709D715E003405A1255AED63CCAE605F93506D9AF5C192C3E56832E9F30D67 + A10DADEEFCAE0F9A40DC1BFCB35191B8EA36BB1479EFED817FF10A536150C721 + 41912891CEFCBA381C423CC8C484EE819E0E87584F7D2A065AE0FDC204AB0510 + 2FC186E4FEFC78CFA2728ABEA420547E0B382C663E61422A74CA7E883E3609E5 + F213B85AD58EE17EC9508A2B211F710CDD6A7A30A35022055B855F6378EAB2BE + 240B4741693D19431233BF10C077EB3622310CCCAC9DC4C3C1A19DB8A6A5F11A + C67374F42EF95ACFDB76DEAFF26DF395ACEFA96E17C1F1CFD8C5F4FA5ED30278 + 7A275B5BA38DCF85DE620C8A00DD1EBA329B05ACC3BF51AAEBBE3D997F7E099F + F5F1582BE3AF8371244493E55C545D600BA2BE3E3776BE1300C94F68B673B762 + D6224EA03385475C2E1CFBF96BEE9A959ECE84CEBF2BE09C43FDB040D30C5C38 + 936A0B4F247D7ACFBBEB24A44CFE6A32D5E19B105C8A17B8ECF3EB20E25B4BD8 + A44AB3CA654D52188DA0DB64B14CDF7F715A1277F697A90089DD57A0DF687202 + 80A5AA94644102AF56694C2747270A37954B6450B683BC059A0BEAFD1690C098 + 32B58EE07E0A1B6588E7E5A98CF34278AF39019FCD9E7025B2DB213BDE9CE3E8 + 214AA55A1AE848B320E76A1146DACDFDFEF57A2E4943C0BAAADDCE294951878E + 51CCAEC70FED225817BAA3D5AD8C219B13812661E5F8D0B1B3FE8D0DB3104EFC + 199B93F6D931E85E5AEAC9E459831170E809DBD9B308A4AC4C44DA74D425538C + 21A2AB0738306A1438D3CF44FFDFF5D057E6D0887C8488934F1AA9840E7EBC9D + 5A949629949A82AEDF6D87B45B4044093CC24B64D0D8E8C74FF1336FF2E4E238 + 054EA9CB2ED4436FC9567458D0301312D3CE7314D641B6224057E617E902C6F1 + CA3152BF5C4ADDFBC021198299583E9F2EF014BD6109413999EE5F371B5A744C + 2B8B7C4633B2A902F939090AAF77DF909B4F021D80F91A7CD8DF18AECF6BD94D + 23E69570DF5B5619532012326F6347F889E0E22F9E1165E9F4B2EFCEDA0BE3D9 + AB90C57BAF1EA87E5E25B997C77B548140148B4FCB268AE927A9C448359A7AD3 + 645E433242ABA7D34F5F948BF598417EA8A1D91F2AC9B27E79BBBA9212E279A0 + D794797E87F600DAFFED607B86959A759F2832D0225D8058C231C6BEA2981027 + B1524CF43D947BB469BDA67764403080F33DA089B62362C7CCA4A6F95B7533B7 + DC553D1726A82B74F3A4DE1534202D2A7712126475C22BE8B876B30F7C968EEA + 3A26562C49E4B8F20A48EF0C5A478A7E5ABF4E4C982FD1BD8A9DCA5C12F2D88F + 5B53DAD8FC18BB75989960069BFA56C8CB83AC916446E702F82B62B43B3D57B2 + DD0F9A47A70211B7EB07D2AB6A297CB06BD2F72C0A264281D6BF99E636AB3F49 + E5CDC67F2962BBCB0CB70B9FF66A9D631BF42EE4A3217264F7815C141DB66F7F + A633AD7150B76F1E364A6D33C178B6646497448488E6ABD3ACA55C191F76DB9A + 268B5787BD6555BBA3DF109B52DC5FFFDA7B54F3AED7ECB29D22493C31D72139 + 4E49D4150C7E6D7EADEC2678AA546942041C17571F1E4AE81CFEE3A593790870 + 389DC39FCDE10917E863C46A1E40ACDBE212A3780B3BCD3495099B3026D7C42D + BB9C9A4E1A44B0D8C5013FA259F081A567641E07FBF3B0DC278EC5FF271AEC28 + 2745B17A60FAA4812BBA24671E50B7144B0D686524F5959F36F29C9E475956C0 + 0237172B0BEAE2CDCF08C153A03A99F8AD4753185F836111ECB6C500FD6AB4FB + EBE0599BBEFEB59D4F529CF206D5E342292348B2B8F0CD6B59F90D940E4DEA2D + 4CC61CE08D728653B7D56197427B09B90F06D479EFA3937EE3439388AE5C7726 + EC72D2A51AAA09DB49C49C439C06CBD1BE16BC633A60A5D2162EBFD984A8B364 + ED5F145966CB8DC129A980116F5379D5D4B039782E377ED397D59A20F06E9333 + F7AEE48EB502C31C89D9D642D63CF1895BA62EE171546FAE203FDE5B53B311CA + 4641768A821D653C683E3097988DF7A354179FC5A47708F7EC20149461BED8A3 + 55084D743A115C1438A212BF46535CF9CEE6F437FE0A637EF5B27401E6967C11 + AEBEE3B044CE9D02805E3301D2FB3A0F5F00AEF082F51702AE4689BF220FBCE5 + 4508787A74F576DDC6DC4514F446938DFD331DE5E4E519B7D6871EA5FA1AE260 + DA402F6DB6919A6B0DA02764E5EEA390DB9806311C0597D9D3F25E2A7977EB61 + F8AED9403571934E56614F3AED73265D1794AA3580D561CB19F154546F0AD1E3 + C2565DDACB0149B771541551C71AD7B6C181F8101DC4376434628A2DAE345331 + 39DE8F8DD67E6EA0077D285B91AFBACA260D1AEE256DCB6D4EC744FBB967F57D + 524E11C5531AF1FB78469DB344E0B5EDD6E55F030ABACD77C50B593C45001635 + 9B8E97BCC0A856F145D71FC868C9811148E9B44B7B9DA90D88482E6823FF289E + 02DD0354CC2BA97A60D1DE7D56DEC4B0FF456950F516F4BDB2908485E27807EA + A51A3CF11BCC81D3A9575761C65EFBF054A38591DD62FAE8108C04854154E75F + CDF594C9B14AD2E0A97D6DB1940D6D882AAB867091FFF864138D5EE6E7F898EF + 64FB106F0035D9816536E699051F6347EF854BA1F10F5DEF45478A3050DD12B9 + 0C5BFA626320DC9DAB7B56BE3636A3CAF827B793724460899757755918E2BF91 + B1A3DDFB8E3F69A8D2FCC1D9BE3E7E11BEDB4C318D34CC6813A4D0BCA7484992 + 723409E89B85FEB06C98F5749F850CFA269EBCE996DE990EC4523436334C89DF + 8BD8F5ED431B54F887F1CE678DF651AA5AFB5CBAAC2A7C888D368115319F3606 + AC1CAF7C1A76196A56E83F4CDB34C04BEC725D5AB8753B141652CCED1710AB42 + C25644AAEFB8F079E8D45F7B5BB9B435A80C2137EBCD27DCC53E8B59E2B258CD + DDEF12CF54532540D3A6E4953BC7C24321542B3248B8DEBB3F7922FC5208979F + 037DE5898C407E32EFC58AC958DD5635C199998D4B0742013A536EA6CF28EB73 + 61CD12FFB4EEE4204174118BC2554DD88197A52B290970D728D4C65DD9621E58 + 2FAB5D31627F08B6BFC18D244AFFB69B72E7AE47C9DAF05988A70E711269FD62 + A3E883D2C3ABDAB020016FCF66522CEDB123E27620CC4E44B39B5E557C00CD15 + 664B23F27B2CFE4605C8F89970E69876ADA8219CB67153B5A17342DF7FB90F03 + CE20AFAF03C4E7CD775D3F8D9E9C69EB709592DEC37E92B711669EF9FABCD362 + C3FC574D666A8E2AC8AA17B13ABEE49EE59A5170D2FB75E471D88320723B2DDC + 576E54A24E330E42650B8BDDD9B3838BE8080C855000ADFF6B20F27EDAEDB57A + FDD41C5B3C27A557C1078182ABFA4C93AFFED7843EB63711B126CBE589918AB1 + 57E2D1395B1695F2078B03CE7529ED943F45FE33DF449DE1B65F6197A3AC95D1 + 50B6EEDDC9F7680D64C14C2AED99628BEAB5137CBADE741FDEC04CD4EE7D24C2 + 8237BE6B631A7F5091E17B25774BBDD344322D77A9A9278290C6203352DB7C16 + 87DB0CB44F4C979C2AE37B3316D94152CF21970C770F946317740DCD964AE8F8 + 645FB20C24A194A04F1DD79E31F9618C99EA7D02F19B18673A8C6656E1F3CA5B + 863B56D9D9849A6CDA0E5E839ED20225649EC6394D1B390CA374E32DE1E206F9 + ACC0EEED44D8C8565A47BBB45B5AA1D268561AC83102A55301580FF33C7B6AED + 1B2476459E1050E77C7506B0CB70931188FD3A592D364AC8FB723F8910D20FD9 + 8CB0512084E4F57A3014E275C93A177BE32CEB05141EB55C82AFD9BC59D7E0C1 + BB9B0CE8CDEA149D0CC7DB9623D9C6044CB638C2A1B9D9B4D1D95C2B6810C50A + 09636DFEAD86E174AD2ABB50759F19EE1BB60EE1E743A31FF6A089FB0D5BAF8F + ACFC210065E9868685DD2D157A6A3301A090CEB6947986525CD014D245DA7E33 + 881156B5A5F29254FB2E54727CF5FE024AA8828C7C7362FF7C62A87664D9B167 + D334FB37D304446A136FB3FBDFE16301B0A3C5ECBD402712EF3D21343ABF89E3 + EBC8CCD40296A99BBE47B6DDC552CA136F253CDA15369AA62F42A168FE6FFE69 + 4E4C5A936E112AEB1072246E6341E5D950FA76F89B5D6505FEBB983476CCBBCA + 31C06CB803459628777BE8964EF0CA1F1D4F3B397A26640450D296A3A8E25844 + A207DFAA2CD381F7763B70E6C63C2837EF6678278205B7AB473B7758CA2648ED + A92E77292A5D1FD1FEB89D8FC7D2814C7FF9441AD489F2F72D2ED53FC73DF8F2 + 697B2C0F1A4529F8045482A7487960AFBA6FBF1F09A424A97F1EFDA9A4CDD7FE + B8AF1056C93DF5CD6BF669C443EBF50F286739E1B57A8828262AC7638B90D404 + A2BB1EA11CCF090789D6654A52EF9F8AC850AFAD9F52C27B6E7CCA6ED24005D3 + A2F618FF5C9D8D0A6820AB5EEBABFD5BCE0F5539087970EAC64117C860D4890D + AB7C7673F77A0170635C889C928E27BB75FCAF602E5CF5C3754DAA86633876CD + 52C6E7566F21D1EBAC870FF14311BB4E2B74E595D52DDE3AAE9E7B58F8C7EA82 + CF88E1ABE8B8B31F8B5ED5001C6FCC6AB54C9C352643D1E32B61CCAF59BDEFE7 + A0340454BEEAF3BA4DBCB350D26BF9F6CF0BE109CC95FAA3AF291D52EC2E8DB9 + C98458FB7C58E767BF2276B9790B8DB232DE2C3D139AD6F44842952D4F0D1CEB + 3761A46AA126A48CE53BDDC8AF9C2AA7151FBBE5C37EEC7756FE18A8A45CD29C + 0E5D191174E9DE37B900D3C72F490B08EBA9663E68AFC62E8AD55BE0330563C3 + 25431F9A036E64EB611091B10E6A7600D8849FC7CDB0135B79C9B9650EF87EDC + 2A0458DEB8FBCCCB0F5898C6F187847F74C58F354B3EFC16AB9D17EBF9961B51 + B19970687C6390D530F37592ABA60FCCA00C14A24A54C0402296DAF11ACFB597 + 55EADF450B444EF233F2E80A612091E3DC81620053F377121CC8D16DA84E3DAA + E7B926D6202EA64A59D0E129F349E683AEF0A7D51D59C309D25C429230B64C3D + 6A9347989AEEB6937A8161C4C67CC26BB136FBD0BE18B99CABC1E270F25B7B3D + 256C99B48D059A112CD114133AA85E61561F873C6FB8E0B09F19746D53551C47 + D77D89AECDE9B1D814235AFB537E77A0B1D25865C068AD792C8F328020698757 + BB294CA1FD42734AB2486EBEC5162C2710021F4223D4A3F76F98CE7F6E7E48D3 + 969B5AD21D052385085C5641C287A77213561191479A35E8CD629CB3DAFDDCB4 + 67DB0930A2B956C90971706DDDDCE4B1371BB0D22DD3AAC237621EC82D40F342 + 04DC1FC16B07FBCED716B4129BF6FE2CA9C41D0F926FDDACCE5A49F5FCAB38D9 + E9AF637C2F2D21313A450617300CE255684D27F45D1F85318A5962DFDC7A00BF + 299B95E1A85E7DD1932C626D29E0CDA025ED8FEF38E5CC69E6F300A623FC085E + 92F121EB273CEBB9D8DA65339F1A4A88D7011A31E52369884C5F55D56D2C6E24 + D99B329A06A09507326E0D47C5A24D69388EABB40E2AFE0567C99C321775C7A1 + 4E622A18A6E355EA9770EF6D13706B4DCAEBA182B7BDB1B1E99F2ACFE0DC47B6 + 765C85F0E15599AFA69008BCDDDE22470C901EA09EED374E8AD79E3A98818333 + 6B92ABA34192965CB2EC92F91D66B40933851B5AA57D28048009917DC292F95F + 3F68FC8BA05572652EFE8D60F1859F90EC716CB1886B5E21D7457E9CE57906F7 + 7D648F070D3FF615C77C31BDD9A34B1FD7DA9770B05276511D6BE46F0F6AC080 + 78FF8AC9CF75B5A22F6E7E44BF087FA8477E4D73AE5B5B2A33AF31AA8B10C624 + 41F201754678CDABBC3B13DF00AB039B1DC26D5422D982F44BDC3A316BC0BDCD + 6FB356F4991D3433A830622F70B7B31DB0C1941F3F9BD06FE9850E2EB7E80DD4 + 6B8ADA70E5A54E0608CE8B680D1BD1FC664951E486B5BC5135BA211619795A6D + 67EBBF00BF8949457AFEF63CBBC7956F6001731D43C25D4E532713B3E775954D + AAA3D02DED26B02519529792243DE59859B25E6FE4651478626F77EDFCC08846 + 65AC5DBF140F32D3B814C44F926A5BA3B919E1DFD240AF6D694F136A795D20C7 + 34A725B497F3A7549F9A3BF3CD39777F23D779D46A9769FD637C6A4BF3CAA4CE + 78F7378E3D9EF1545F4346858A3DDB5189E32CBA278F86678C1F4EE22DFE56A2 + 240157E8C3A080B92EE6458B406366C967EF877530DD9FB0E12F7A9C0C50C7BE + D44107AA1D5EF1654714CEAABFD0C3C5FD7C83AAF0F83D7114C6AECCAA176D4A + 000E3DA7D8FB3CA39BEDA918CF942924AAD15F160B08ECC564C14CF304294591 + 3585709F4634C9899E3D45CF469CDAD6AADF505D302F97B88FF022179339030D + 00AB98190CA9AC09171F77670B7CEF7B71590318EF14718F8FFBF25352A66BAF + A2F5834118E888ECDF192D5F0D0531C55897B435643FEC11E3946CC0E1C4D67F + A030DFF2B639699E37BA20DA179980B3AD58F1FAE92F42A0D88536CEEA55E63F + 6DA128D50636890EC3E543F5B8EA27DB0924129A792E12E3AC34FBE687603D64 + BFAE518065694E478787A6BB2ED19962399727862E9C15262510ADC499B16BCD + 5FAAAEA4C207468A651B72774C83D5315464DDD24E312AA91C746B95DC012D3D + A4117130BAAFFEBB2035E2D4D89B4E6E0217FC140DD9973C906904D82FD6995C + E2E203205723BCEA3420CBCC4D3A825462365566F4C2D30ED17A13791E1BABBB + AA8415A75FAAC00204FA2562ADAEABC3431BED083BFAD41D751E50CC86D3B0E6 + 8F359F40BE4C99A298FEE4CC2C861E33B6F58D438D72D17D98674840C8309752 + B6B35DA1B9715B6E3D967A9B52FB881389BBD4CA3641DC1B6D84D093D41CF5B0 + 226E53D7AFFA27D9355C964A9C679B7E387A3C5999B1F146B2238C5F77B92D3F + 6DCB4A7C4AEC7F30F521C33AADD370BB8F49F23CCD2B35D5DA181CF1BC0C353B + FFF250424B90BB3EA4B66E6B60C6DE4F646575F4BA3C76231DD4505488A9F54A + C2455E3DEFC629CE2E4143A9F219E8EDB341469F6B436519E3AE9B1F0486C172 + E6BA02A9C422316AF07A0BE8310AA6F84D0B6E5DD75C1666C5C3897EBFD6E528 + BA5FB1D38B886EF694AAB231938749FEAC6A5006E6CAF450BBC3C0DDA8A6E917 + 27DE03E89A22A3FB166909C69176634AC30C90951D98AE02DBE54ED3E37EE271 + D3D73907F0E6A7C33D45C7B311684AF3436A1D2857AEACF70D2DCFBD1D9BD55C + A0647EE82D60147683F41071503D852155D45AD85899B063EBF6E97A15DC826A + B2745B87F68900D79ACB9EBF74D9C556079C6C4A1E7F175D411A64AB1584A40D + B8F49B98BC58EE95CD7E3B7E2A0EA16A1DC61CCAD706E5E7E58C007D1C9281E7 + 09F70E7DDA6F141E9DCDE51146F732B1A2C9A5B4BD1E4429A21E74F47FB4851E + 0D0E6D10D4823EB915E507DD7CC9E0A7CD3B9A6FEE38F3CD0A4AA85E73AFBEFF + 45C84F188C7FD83CEDCC8EB6BDC47A0C754D9EB386B01F5EFDBA137F25D7EE5C + 15E4E8A3111BEBA6BCE3B7633CE12F4E3AAA910AAD7CB068B2598069888AE586 + 8D0183C089053E654B0A20A778C5AD6D428A67E9742DE5FBA30B2A1EA6D974CB + B2A5E7BFD981BE5FB045013D326299D428719D59E289A143FDC737987DFB7324 + A8261A0FF5224CAA525D9C24746A0F000CFA0847394C6A51EA3622CAF7DDED55 + B726D54B09C6127D0E4BA193E063882CABD22E752D3FA4BD6DF7B448A4F6B90C + 2A0142E2FFE229547863ACBD9247809CE4122D48923F7C41A8E4F4528676FCB1 + 5D35657C825190B3CBC9773510F88F6E55F0A1A14AD46C8FF2921C1B87306933 + 9E6BC800D116BF568718B2F3B4F0057B9EE15E5FCA85126B720F76A2C6230C6A + 411ECCE95E05D38D963D35E350D82090B628CC25BC5C2BC723461033A375A128 + ED02A20894359BC73B3D111D121DB869FE415B6408D11E7649BFA587871B66DD + 6342ADEEF677E5A4B4C5248BD991DD881FBD20FFC442B00752BC6AC3191E4F35 + FFA0B09A32080B1161DB3E8962548A957374E26581052051A7D6E09A28814435 + 434E0E48A5D93F1CF5641860C97DACCF30A34F44740B6507A28D812E64EF4088 + AF34DB5F95947C0BC5C6210B2839479E2F1B921CF963682344A0405731730EC1 + 0B44DDD919292D2221530278B536893FD16051196A45277175A003BD120A70B5 + C5BE289575C072264832809D271E55F3754784E51AACC2F6364E3367FCDF9187 + 7A68A2CDEE368231B72C289C040462D69CDA4E26FC32D24630D08B0AD0BDE2B6 + C02D3C0BFF00471B681A5CFB301394A72BEECF5647BDB0C8006C0FF1DAF40FB0 + 55DEBA8C6CBCD7A0DD27BA39180E6DD12271679DC571E5E8CCC33C363CD0DFB8 + 02521B34139C3514FE4122E3C26248DF880DA01EF8BD421A5E30ECE022E120DB + D74E16FA80FA2F1997EB804F17D543B38A314F85FFC4F9566CCA1D2332F4DC49 + 348D44B82EF497E7F27DEB3B5FC9F66B6614BA3F970138383362D0E59983093B + 072805078D6A3C167C79DB82834916C24CA46CC47A5E5D480AA9A44C445E9716 + 1ECFC6DAE237BF66A3A7217721508905CD33650E08B1C7C511A28ADFF14D38EF + 1311EE90312DC74D55D221BE1CCEDB298A43309AD3DD9007BB08A6EB69B13BC2 + 2611DF4B054E83D3E0AA2AA8BE73F1728D8E0E3AFD6D0411E81DA3BB148C5EAB + 16F0733CA1FBA8FBA84C8A3C483667FB62C879961E7E695D607DD76434B2383A + 43941B02B0F4FD4B615B5D949FB141129E0B67806F49FA9BB43005CE9F5B5D3A + 9E0E95DA897A8B20333922D789A3FF150E7824DFAE2078F67615447E4266D1D1 + A52D568388A1CE96847B0F77813221E049FEF913E17A4B0E37F5F362235894D3 + C0C19B7777D7442C39304368631A2881C4CF03C60CE54076B0CBF3C7B91C7392 + B4B61DBA8D6392885CB7F000DB2EBEDF1BB93117D6B9B1D432CBCE3F63F36C09 + 55FE99040B0EE6C003B844A7E6BC58F0011E17F799120EAC87424BC8869C8198 + 67B5FCF19EF4131B66E56BD2FFAAB92DFF34A9951AB9CC63CAF8B9027D338AC8 + F5D5371C7AE27675E5B8D790A1901CCA7628B4484C64AECE23316B8E17650F93 + 13906C730C824EA1A95DB9D2BAAB9FB207799873DD4F17364BBABEBA08837F45 + 2F99F0C15FE395125C816EA40FFCA8662B362663C3C2F8591F2F7B61843291BE + 2B6856ADEBE40C00FB3D847B95500CF08DED40133AD625A48D00C31DFA11424E + 2063FB2842642FC0C30B07065AE8C02A3857D63E831A46DA8954D6295D41E208 + 41C5FD103267AF0A3B2A5D550F7B8992B36D2ED2F1C29653309144E025C9C22C + B8BBF7DF78EC58568CAA880597DF881A1D9EF50B458C6B35E9E470993F40619E + 5C3FBB32DA0A8E33D976B576F67C4BFF6792598160186C192565C3E4C71D850B + 6B35356E4A3D2277391617ED635DC10D7761593DD9B45D1A29E57FDBC96F183B + 1F6C802AD1F992E1BE9DEF23B0C7C7202034579F1E2108EF941F6884FEB9625D + 3EC5BA5CE14E5420B819F7694664A8224ACC2F1BA3D88F5FD588611ACD9F98B0 + 764583CDD35668D0AFB1EE4C6AB90205A8CA16EF528CA3D6822DC04F9ED1D883 + 3423BD0F2088E2F141010B159D927AC595DC41088CEAEE3836DCFCF6A7B20832 + 362B431B359144E2DCC8180FD0D63104F6253B12FAFAC902C557924593948BCE + E760488B506489594EC9F6DED77AB531404B26558F2B80247144C7EBA41DA089 + 8127A314F85B99FDDBA311961FC5CC66FEAA064A0F91567CCFF71AB4D17EF851 + E6199D9BA9D9C54C90EBA0E2F2187F9A1234517574D5554E2B59F9F152738B5E + 7C899B184B63E9DEED9EE169BD5E21F82EEF762DAE78DD25908852F2831E5C90 + 89F1BCA499D39037282EE83224DCB43D785E13E93BB7D68A43A283499AB86A41 + CEAD535DC60CC200F60A3DA117E86D53E314F427E3B499B412BD81561A596B54 + 9E272BDA5BC9E1FAD7E0AA741EDE4A6204065A48108E7C1B4B5AB31B78A35448 + 7F59056B2ADDAD1470DD94149E583A728F11DCCC3B9CC26210DEA187BEFEF53F + 132022CF94D62B1A32E414E766B61FD3018D23F9EC43F7779A5E868E014AD274 + 6280E3C09E0D6338EA772C907CC7E0864026A567B391C9C384D571239C4B07E8 + 5D69623F5B334A48C01F59939EA95DE46CB1D7C5CCA3164C9625176700C62D06 + 8CF75083AA5C34DBF7D99A7BB76A49BA7F86F27655228E7F7FBFBC1353A1F265 + F816FC421DF7CB3A828F8809686786C7E3125E04FE2A5C0DA940ED496B4FE43E + 534EE8845003E23A6C044CFCD646DB1A6A26810B40891D4376728EB773E4BFB2 + B27F4B7E68EC751380F2D10BBD3F8216D5A8880C5BC37BB7816380DE0EA0A4FA + C5FD212372BAD4DC928D27DC3201E38D4B7965C26824301F3817FAE62E548FB5 + EDA51B86F5D1EEF70D981564AED8B02A1521E610799710D8A9C6DC84EEDA2D06 + AAE228A8D991969CD62341FD968C9B29CD888515726A7E1E3070F311E1C15A09 + 3B73544441807DE088F9B12160CF63BC24C43B24A1C28AB1262F767345708806 + E22846F903D7196B93182B4F3A76F46682DA369401E9D4B1B0F940046EF3359A + 485B01A022682CD97A2397AD51292FDE26919614C39925C96E15CCC79C203706 + 92D47F40782C9CB919FA96875AD6A21A84290F56CBEB34BB54138F39D82CE443 + CB1F3AE8822477027A9A0DD0056855C47AB850511FC77C749B2EB2440479A61D + 0319E049117D61442CA4C648B0184401ABBEEDB9F12A14EEED6A30B2C576BF81 + 09384737582A5C6A562EDA458DC8B343A4C24E892727D7713B1AA09167F1D204 + F197E5F7A687E76F87170EE4E3C766DD8C5BB1D7D9901F244D8B47EFE44DF138 + 57D7708FA0F7F6FC0E81C61AC38F64EAF873CE3EC5F8F201796BFC2E6D93482E + 53E6D0DD61F7C27CA8729AD7B244AA6D4CF17C56BBDD7D7B5CE90E7C76B743B6 + 0D1B536E0CC7870785E538BE35D7627943C528B88D7CA573BD429166A74F75F0 + D36FE3E794E66BC5937FE0F8F185ABFED1CC3BF979954C3D7789E15025C1095E + 0AACB4DCFAEE557C374D0B6C9140C7E98DC564AF0F2B7F943585B5C0B52E69E5 + 5DB4693A042BB28FAF27CDA13C2FC486D31688355A3134C1D8E629E17507A632 + FD0FA7A99B50D350033AFD2E9157B0C7EF9CB0445A1151E3E1234D3F699140D8 + A0D7598A38C890A41155A025691A8274E663FFAFCEECA733121C4FBAB02F1AD0 + C90EF6FCBB8F8A774A14F9BA2F98F8551401ACEE6E5AF73EBC96BB02F864F65F + 54FB1F26101846258EB0216E9527FA4BF3D701441A9B04E1AAEFE136C83DB0DD + DB6A5250ADFAC29B7AA11E5D24CD3BCAF585AA44185C3095EB3EA0498D257B27 + 70EF25C2E8BB3358C8D47A80272500E641CD4823C25058FB247FEF11607B7B5F + D0DBDB9612D449EE067318C2B4E74BA771A554995B04AF4EF856ED6EE7C50E32 + C7FC84E0D5E20C999726ADFA481887CF51A73E7C83C60AD5721C4318DC10D41C + A6FE0BC8E1FA9FFE42D9316F21653BFF2362A0B70F1299A37C4AD982411475FA + CE92CF8C652B4D33B6C462B0F545FDC6D70052F58A1F3716560E2A736FD09404 + 1C04E6081CD1AF63CEB3FE4B3D9CD04F9E9D2E2027279627CD332B988039AB29 + A54E708EFF9292C150CB845B3B22B24B99BE687024EFFAEACE4A28ADABE8987D + CC95D3198DB6929B2D768CD001E14DFEC6D755BD7F74DA20852512949C555552 + 3987A708D1D9DA4831CFABAF7A3E9AD970E384B44E3A8260F8F4B08796A21905 + 36233FE34113AB20F9387C62EACC2A04E54BE09D4FB773B47EA0C73E5140802F + B2EF016AD675023267DA33D5CE7FF5B9C4E00D4BCEECF69065ACD63B27738A9F + 0BA5CB135F1222DB6E63D8030DEF64D14B5BF599DBD72239EC0CC305B950847D + DC58C9028E2D37C075130437EF7934A738CA706E9C2342EF3FA6EFD66F336349 + A83F354A2F8F24C22D19EA2FE8AC3BF08AD93DA7FEEACF303B2D780F9E424594 + 32A19507AEB0919DDFB6B396D57F817AAFD51FC3D387AFAFA9792FFF344CDE2A + BC2266176A8731E5F3CB9E466A2A41FE81556D2A4D503D0F61889C7F7CF1D4B2 + 2C634D58F81DF62FB770FD5F3F44B221BE19CD25EBB7F420D93DC60D247CF541 + 6D9E0924B7F28A5CE70A98678864710C8B9678710A90A9B9EF50F33602967BC1 + 02776DE5489C8699331DAEAC4FD2BA11F9BC2B957660E8FF82BCBCBCCBA153D7 + E438A514CFFEE8DB3BDF8AE63178D01ABA9D029FA29347CFE3CF2ADB5B2B06D5 + BD30AD6F0D328B9886340812AD5EAC4488A2A1F8AEFB739E73094D207E69CE22 + 1AD38B99C639FE5A464BF2245CBD29E96D164A0A07AABE123015453506AE553F + 3E2F3F6392587A1853693A9EF713AE8D784345C5E3F8B73EC3B7AD3252CB6A0A + F52CF8C59DA49CCE0D5A8164B8FC027EFB874E43ED02122C27782178103315C9 + 507C90FDF4AE8C0F58520D024CB864E4BD8F7B423E5BCA4DFD1F044C1BEB2986 + FA468B96E3402A10A0B3185830CE5AD2F56BF8EE198FE076C3361EC35FCDB400 + 779A5EBD3320ECBBBD3789CC921CAFB85E15C2D5CAA8752D1F152A14EF281218 + 5F779D342C37C8F0E287A2F18366CE027D670621D2A6FA60E87F5A5805CC90A6 + 141DADE1959FE08949E5CD55ABF790560765D56E4C85FA893ABBECF20F8AF13F + F334C74579CF89E9F4CBD9A47BE9DE7E050E7CF63F3FAC8DF8D6804AC7FB515F + 03B9C4431A4A7D376804FDC763EBD81C62B2354B3FDB5ACA9DFEBE09B3D7666B + 3633EF66D7E4E903C273D1D6AE0D02EDF11FBC70CACC06372BDA0BA70798CD65 + F5D50100D05176B4AAE693531937769B040170733BB0351D33F6518C29286A70 + 27F1C1FDEA5E1CCEA3DFB91384C6A0CB4F1C956565BDD1D984E179589B8DAFC1 + 1564BE8B02209348FFE16C60B433DF6515AE1A43DA9109030F5DEC13A5362129 + 5E24161C102AE64542367C8A1F40625BB9076E5D53913F6B43DE52D8E825C12A + 00E07AEEF9727BC4BF8F6A2DEB858938C9068EAF891FBB15B30F70B86E314E59 + 998A41FBCA38E0125597C3124012E1BDBFE4281EA75A99168C6C33B1C5DA393B + CC68FD6B68C3373E318B2D49D11737085E6498906C1EF952C11674A2D9DAF363 + D93BA9A3FC52B14E223089347D8A548FB380184EBF47EB96AEE509D46D8CC849 + BE63A79A652ECE1AC4CB2E6B3961E000D790661FC90B45F72FC7DA0D99AB91CD + 041D0F0AD4DE42DC383C4BFE5DED1A6C9ED44023637C172C89A6B213CEC6B44B + 84F6DA0A7BB4B46F4F1B6791156B0BA74B31A2A4F8706B37D717A729E46AA435 + EFC3ED8ED23113F2C8B71AF202EE4D8A79C19B254680659B6D2930AF8CAA2B9D + A46F961FB6B1C8D91977D98961141A8A2061A2C2E225863601926B717C751BDE + 2D5CBDB5688C3D379E80E43A7C3319C60854A3DAE518E2957634345F84907661 + 9DE9912B8B3FEB72F47869BA2F4740DBD7CD54BCE2F8DF0AC235CAB1B4F904C6 + CF50DA353149254CE0E88B6A4B81F536AC838E6E4A22642CB5921737EC6E7C49 + A04D5F0F4E1B1B8E33400E0C4CE90A4332B6671ACFBBCF5BF06441EDB67B37ED + 890B2ADDCFB3F898D6AEB59A1D2754932E0696756DC94B488068448270E76D87 + 2742A7FDED0FAD8C9DBC2220AC7B37F7D0B7D53757B4FDBE9E9FB18351630973 + B357242453A2D1F671B2CDCD69926711E5EA8924D802D3757B13E058E4E51623 + 560C3B19986A02264C848BB3FD80BF0FCA88B525A3A709D53DC26F88EA09C688 + BD0063E4286D80FF19C2FAF67D422751E2AE723E77FE7824223BBB0431CA3135 + 967D3F1F322E70162CF1800F5FF8CE54B60529F2F4283E227DCD55096D853F4C + 07583F23E797E28544C862B3895EB433C3A1CC4B7CF86AE11B86D03C4ACAF459 + E54ADFCB9FD6F73384009FDA17109CDF8188FE5E308A13B66FCCF15A1EF0128D + C31F3F412938D43F470F30F3F0537CEFD282369424BA1B8242FE3A60A88FC5BD + 737F1305CF784B66B326F518536E8F86E951375E0B5397198F24429AD2674645 + EADAF13D700B753FAE75133A602C9700D198ACEE2679FF849F47321C399E9CD2 + 05C0B6252849C4D827E8F74904CE186F6D79F4D3C048CCDEF05EC122707BD905 + 79D9045FD16935F8553865C8296EBC794CFC32060313C5A539D96F5D3CD1F3C9 + CB3DE8EF376A9E5D64C3449D44C495E81FC91B7D3C9C470C83D7F108CB4B603F + DB2D9FD4E29078A171F4717C1A94F51F1C2B786F417BCEDEEA957461CC174896 + 91A5B043256998716381E843EC7E6F82839D98E2C7BF936FC6E0205B59648420 + 6BAE1F221CF366BA96B88799F5D12E06077FD6180854386A4889605070747B71 + DDA3B8BCAAA26E3B1D0F2576E5199767EEA10F510DBAB888D38F36D424BC6382 + 738FA6B5B2DA9AFBAA19C100FBB01B415AEDC1A951F41755DFC7E9F4EB67D9B6 + 8142C7C3077F638A76EB503A2AD2F69961072635F567CD8EC9749463E003DBEF + 7E0724E5414B9521048C860078F5946248A8BAF885473C0E8CC022E74C35BA51 + 7DB29DABBD58F6C71360D68AEF5A62F19667E6A02FFA1766E9B4FF376DC557A2 + 400F154DAF277DFAE65A0F571EE62C7C227662B284901A609D7A6F9768CB7411 + B9468046CD4DFCA84E112B233589FDAE508809DA855B84F738881A1ED5A97C91 + 57BD7C94D6F4D313D7B9E5229140B74EB2E40159F1C91676EE3B8A47308223E2 + B320701AFE105941A47E0345FEE521183EAE75DF6D1A4E809E72D2F2394827B7 + 79AF5FCEB13E58D443162F16B7CCD64218198B0C1CBD72467CC4146D4A91D898 + 7F177F7658DCA6DA46E47026B211202B1BAD60F79E8017305FD769D3DD054935 + 88FA73098293D8733334028000872F8367E4D89745FFF758426D621DEF2AB2D8 + 1330D98C1B35DF980B5C64CA341DCD96462FC0412C385676411A1EBC4B3CB613 + 2DC8BF7FB1223FB71435F31D91792744BFA5529389680E3DA9EDCA27A430890D + 195A97D1DB3B2FB5020419213B74746E8BB7441E7FF7FE5C81BB4B5FF2D87667 + CFE9CFEEE090F26C8B3892280689835BA5598FE9178A6ADC05038261335CDFBE + 56F02ABC96D95C02B0E4DCB56A8108B19FF26D92664234FCD7794B2F2AA2F32C + 4771500133C6EF95B5DD7ED7DB48CC98F433025260D5F7B4A46209244FC79217 + 9B31B106BEA4F95C867380ABCE1D9A1AFCBB2FC0C977F38B52BBEDA251C8B46E + CDDED593419E564218DA2F65188A89E857CA9F71BF4A47FFF8DA6E427F083B86 + 8DC22A41E187500CA741BD2CFEA46FA11E5065FC62D6EDEC9EECE1E376BD9CC0 + 0EC9D96961C5558029B650B5F304681E99E12712ADB5E3586106B28C19B46D55 + 4D5A4870D50DCD9611F7237F425511837762E0192AC419E2B33F60CDF2ECB420 + 3E1D1856E02F5DBFA6AC0F610B3EFBD83EC23F2A2E658F4EC5CD68CB5B68CFF6 + 091174BB71EF410023F06A4621C0128C6979204D65A63BFE21E7DC38DF13D20B + A41AE125F850FF69F2B1F5B4125548A87F02D341592665DE119FF20D402B621C + 9446639AE1B31F7FF9B1B3BFEA1332CAB2038EBDA834E10F56AE8CE84C71BE8A + 6E48F9EEBD079A0A765CA637529D26806A73D46BB466EFD574E50999F65E8F8A + C0A08D28F3F6D77F155BBF26CBC24E478BF7979D1012B705559089699AD70858 + FC2E0F4AF05ED631AC5B068BD2AC2700DF59EEBA9CCD7EF49F6B3BAFF31547F9 + BC9558E18FA0D87856F2F17158776F1C5889AAE7E6089DFA6B2B71A6C823B00C + 19F028C521D86D6E8A933176C363DAE90F1260566B45A8D4AF75689AFC2CB234 + 89725F84E2F91CD9BB50755BD07B80B0975CB1F29E590A99922877E90F328E7C + BAD59A3FF7F5E07D9CE3C12C5E4AD9CD8E0ECE5648651E5488EE0C6F32DBF457 + C484668CFA377C2E7DD5C5BE31CF12B771C740869517EC7F156EE966F8ADA714 + A46DAFEF7FA3A7AF49F259A5CF200243D25DB34A15DD00C7E06BAF9DBD4EE17F + 5BD830C7DBCBF7A890E9406C943D4E086160B6B859F487B763E0BCBFFB5155A9 + D90F25E552A84B4BA7FA10568663A9D80353EBF87877ED9A79A2E3B815E348E2 + B27BE1DA6702092B134CB7026A595E1C2A75087846B3B8A1B3ABA608E4F375F6 + FCA9C952DA86F0421DC54C9AE27B0A2D3CDB217018F47927F74C4773F8F88D34 + 69ECA096530B072BDD6B136BAF2D254B1291310287F591377D429FD65E7318A5 + 7B440D0A161ED03634AE380A04BDA62CB8F03492B1BDBFA1CD172FBA954302FF + 226ACE7D5B7DDD8908B296033F201B8221173ACD176DE7F6F009390660509120 + 8920562BEEC05B592669A2178CC9D20A69CF22D26797AA5565861719BE16136E + 815E5EC7AE1C473F1A03CBB170454955A3F74AACAD127AC14B0FB307262B42FA + CD4AE7CA6F60BA3C4B3CF8B4710F4EC979B471865B8596B00BCF20490905E403 + AC81E09855AA4E79C870D3D33A7FEC2F8879B42B3282656B9B40BD15622B9792 + 964571A671BF71F369D9ADF7BF0213F01DCFC6A53565B915F55A374F85E77224 + 66449FE859396D519C50132C92D5219BA7DC7785B6604970897650B4793FBBD0 + 4EDE56D2347F43B0AAFE335095E8816CBF379A27C70FB01DD516941098A66FB9 + 278805AE5A24F9A1FE69B5C8BBB1822BB3C47C842F1CA1C89913BCE23EAB8647 + 15CD6660CD3223FE616B64964791E703522FFB85DFF39A92A641330239049C68 + 53D2650B8E0B1BC9D7332B7E5EF571724558F329110142B04D699834EC68D519 + DEB22CE4733C50005045B520B038C6C6FA4102FA4B5F1B4CF0FF777C0D1613E4 + C648CEB54034B42E041BBA3A68BF0A5337E1C8B1C105CF0E347ACC8514BF65A1 + 3976A303A713E2E502C5C62224FC4BDEE6BBEB425185B6557CBEE81526A8E707 + 7626D1663B7F1DB8EFF63157D29B650B2E1584D86792F1F1CD0F331CD226BBD9 + F3303FACC384B5C40B909268402DEB37C5A9860F6B939FA15C4B5EAC786A7DEC + D58E647ECEFF2EABECAEA0F05D249F89C30903ED5E686C2E84F345242C2EDF23 + 9253CFEB7DC01A43F0C0B46640E81533884633D211B74FB3A5D0592F8EB94819 + 43C6A5E660FFD8AD40E0B1E6B50EF4AFF828E338DF3AB9C327D2E516C86C178D + 6BEEEEDCCF8B32905CADCAA1EE12375DDC6EF30733EB90A5EE66A83B28F2C00D + 4ABB2981DA254177A50E362CC3FAC83037F9BAE515666CACF14A01B9B57B595B + D5A8EAE08C0A42DD48D42910E30C35867A819566E6F048D3B909EBABA159D267 + FFF4C55CC12B5A5D876FF7B0B032012E593FD5265A467CB2DA7C5586CF1BFD78 + E9A4B066C058243FE56C5AB4379AA453E72541DAEE5973CF463EEB87B6B50295 + 54CBCC1101058CAA7F5525350370C064B92BEEDF23A08CEBF155F1D2E8B46C0A + F245F44EF179505F57FB4CEF271C5826F00F322F59A4684B3D8AFFED411B0957 + AD7CFEBC8153328C043E8D53B8E40D92E51A437008CBD238089FE575A44ACC24 + AC8F5B1F6B25B92BEB6762D7CB80C0B0AED644147507DBE05349DE04DE3AA7A5 + 40C551BBF099B46FA74D0B0FE8872D994788ECF772CC65385BE59758C95AA150 + A1FE1BE38C8675D272A6334932365D629F675DCF3EEB6F1886547367B8A5A39B + 8906971D7FF412F2C53448783031BD9CC109CE450DE67E29BDC39302C18B0E7B + 1EF42B69BBD957D94AD70BFE77330A257111BBD261607B5B5778D45CF3663441 + 1FE4EA373F542C2BCADA91FBBADD68E69FD9AB7E999482307476A7430D319565 + 41A371F660BFFF00AFC9B46981A948384B2A83B1871711F6E82F732540B897D5 + 51C8D6A9647EF43CB31E6BAFC00A25429E5BBAEDF70879B764A7645A106A7142 + 22ECC5F6EF95748862285F407F1CE08C8A086A09A58C080049F2318D2B392F13 + 454C7E10B0D0E15D75B3A977F8ACF1554208D28B63ABC887A65D69EF5B1EE4CB + A4F06D3B8279AE97AA36BF9B16263675ABF8C378F9E7DF4CBEDCC03E705C34DA + 374DB462EA99CCCC9D1FD2CCC7078D06BE46CEBCB659B9FD88CA44CEFA9A77CF + B11BAEC9C081D337553912F8D58A50F4A45C3C7503195A5AA10E22F78AD21CD8 + 602827A464F9805FD00C2AA4199E7E9B33923A0AC6ED203E5E58CF826E33CB4E + CA9337D39F6EE56BBBDD2F4BC3EB27ADCC217D6EC79F6841DEF9AE82810337A0 + F52E0193BB62128121EDC27DA1DAA9CC24572692E56F64C23617F67A8441F3EE + D47D5C1CA56590DC0531B75B5EDE8CF4413E60CFB868BA9F0D27FDF7787BCDB8 + F13F0C5C9F9F749A1CCD413D7ACA8700FBA6ACC9AE5D0C4EC73FE3FFF8A62C64 + B9BA399984BAFFB3C4287F45BA311C921020FF90AD6EF89D5272E2EA96CDC444 + 7248B7FAB06436DB95463368791ACC30B8897341B8DB33618368AFF5A5A73D1B + 772D43F037194882F5328B468B25C3728797471E3261D2EEBA1EBD69EBD86D6B + CE26DBDDBEF15AFF62827C64452F841926EEC3524B640826374A80E410719EF8 + 97A039E25439C17B31AF2370C8D498260AC5505FFF2060521113F6A3E29DAC4C + CF283021F4DD6917378D7358A5D03DDBD95AF4DE7CF10DBA767AC100D51C0B8A + 2FD58767610FA2ADC366D39E2C204450681DBC3FFAC765CD5588CC0A1CC9479E + 6822B2D1CD785D700E2F4684A2167B584E257DF53E681D0D25E0ABBD5E281A29 + C24A997172D00143D55E112F4974DC430E967731B2B9D940C3619FED976F4214 + 7AF362DCF85774746000B34A462A998DA8200B5A3852D2B6C1EB336F12026693 + 4A664EA7AFBAC4DE16A88D4AE27AB15893C4DE003721452B6F77D36CEF86BC90 + 3EEB4FD4B30CD23BDE3BB218351FD3BF0B5A89866F7EC4A40EED6793D0C62EA3 + CEEA3507F5C04D38411BE356472BEC194B8493F5018C5A255BC4FF97317D4E8B + C425306093B3B3C325B317137C2336212106787C8BC9E6AF6E465E35E6B8DF41 + 28C1BC138E89009519603C7C2FD1BD5C6C5FE490E298568FCC60A331CD299B61 + EAAADCE321B4BE8A14574CEFBAC8A8900E4F39FA1D0CF0408CE67C77F08261B9 + EFCCEF71173A64AEF366A42C300AC9B4214DF25995BC5EDBA90FCAA3F0756932 + 19796F29D81D571954558F9A0D64850826BF40263E2C5D0DB44C0F9F078E4073 + 2AC87EC87AD89178901A0D34B33A19E053EC098B3150DCBF9DDF287816FE9CC4 + 8ECF86BEFC30F3E22C618286EAC6C36EBA595B51D1EA66053A1B6D2A2F01FD96 + 408A486483646D4DF996F0B519CC273E59D7AF7473BAE49026BC912216A17D76 + 9A34940B2BEE1DFB2ACDD40BA3170BC4D02B88485ED47D964AAB67930A8066FC + 2575364ECF3C0B01DB2FAE3237BBABE481753CEF96CD37141413878C33961F4E + 8CF6278915F5410767A2957E5D3169E3D75DDB7125727A8C0F57AB119C69DD40 + 7E52684743BBD00C4DB517F5079F5B24F2AD4778BB7D4E681E841FFD534A1E98 + B1D138CD9CE880F0871768011D22322292FC060D30380A23783E6F31C078B09D + F57685CDCF1E0E113D23152EDFFC322594F9DFBAC141541C2A83B5695F176E7B + DAEFFD367FF69595919D74A7DE97990FE8263112D3390D4C146125C078F89398 + EDF6B6304858C5DDECC065FFBE03E3BE4C7D1B03494CACC5FF40BA7BE4B8C288 + 62F17FFD212FADAB91D552F999F1F63D0062E3A8F722F33A442E3AFE5AF5B942 + 4B40F79A069307D5BBC68A29D1065A7C025F92C10BC6FA93029D86C618BD6D42 + F9F02FDF6E0650B024D9E82EABF5E8566B306AA75F58898137096A3F201912E4 + AA53440D726F3A8483363104E1C1831EEBE72C1C65335DCDBA00CB0ACF624BB7 + C16772AC7114ED7D5BCCA84ADFE28597D6612D1D16C99992F5BCC82EAF285B47 + 16F8A6DEC91A50E80373406446229975939E5278FB870BC4D5B981A3D4D1DE60 + 597854E1B6A78E66AD7392AA152894DBE57325C1BD90BFB08CDB0881A9BC5662 + 80EED3C4E1845F8905960AD6718E81552EDD94383577773F25E1F6CCAF12FAB4 + 15CDB8B94052C9F430875D63957CB4F102F8DA43BD56D6BA96CB67488F6435A2 + FFFF9D0F6314376B075D7923F749FE1FA02E89D1697A12A1C9C10F947B0F0A71 + 3C0C98A23DA9E4749FD25C4179194051191DD03F4A9D677271EEA5DEDC8FC7DA + CC3BCE2DD71A6453917C3BF0EA36DF5D9D8870541EDC17912BE51EC86D31FFBB + 7ECDAD7E3BB0EB2D93F6DBD8CEF95836CD1C4AB38BD6E6090B96DA85B9F517C0 + 21D44C501727FB90D70D9DFCFE034D0A4643730FA162633656302385BF79B31A + 0EA0801512008BCBC8736CF01AE382149BE74449711CC0F181AD08DC07298B41 + 7AB2DA7CE18533E4A9503F193A659ED9BAB67C7F150BA04635251BE1A626B6B5 + D4241E6CFD2EE1224C3E818582D082C6F73A8157B3C2F2B037C8325FD875400A + EDE69B3882A9458524F0B5A9C10F47398A9B98540BE2DDF736DE58395D51A1F1 + 9343383CC77B82573BC56730A221C48CC17C4553B05BD631077257C5C3CC5E03 + DE41E12DCF9856BD5922E697B80C854890808D91CB4A403183D04AFB1D91FADD + 7F745309D01C58C078EF5A22589500A1F82A580A71028A9D3D9CBCC13381D6C5 + A6684FA7ADE79D339C824230D15EE191FE74EC6907CD3AB70D0B7AC68072FD69 + E7566A8F5F325B61C84D3058D245B61740D8B17DF73B380C1936F71691BF8CE3 + EC0384B626334C850A2041F6C9FDE1E9999975E5D41779829B817DC683CBA598 + 48E78EF9594CEA1C1D0673EF83239157636AB5A76F173200A3FF0746E30C7C46 + A77C4F2F542B1D9B152D11B338636828504DADEE2A6FA6903EB56DD5A77D1499 + 1A48DD4745659C90FC75D065D0E4B6080769095F16017A4FE5553DCC74D80DA4 + A7C352A5E6E5B66493AB0325BA4D562CA35481003D01EF6FF6C417764188B010 + 3156A2BCB475DE8C79542BE2863E5408D298983350B9932177C5389B76B66FB1 + 6A449C9285CA4B819FB99914F1D163F7B50912843A39F81AF60E0973C40F43B8 + FFA331CAB4D9C493C98234C330F9CE5A2F5D4BD021C10BB197115999FDA23A61 + 97F973843B40210C08AF43559070D09B9B6F0BED0AF1A7AD1D26E74402B92A8B + 6A0E92240DFD38C37E190B5B670BC8AF08727BFAFF2DA93F3072C36A005A914C + 739673EE6BF33FEF3EC4B0A294816011BEE7039C6FC82E9306D3711B9F0FD7B9 + FDA88801B916D069B5875BCF853D09C91BE63723928CD8A12EF4898910F61090 + 8F1719D323716C8A625FA25BF896C315AEBABA554303F46B9525DE7790AF0998 + 12841D7F967360B55C523F12C732B0B3181AC6B5768568E0FD53292DECA6B499 + 27ADBA848AC163C0BEE7558184C29F01AC14ED54BCA98E8A673DDFFE8145607D + 2B0C9F33ABF381AB8D6F47A76D7550E0F6CA6D49747CCDC3A7E45982404A0C78 + 0FFCB2257CCB71ACFA024A0008BFBF3B884EE41D1F9B39EDC4A4026683CA2067 + F1F599DE3C002218F48D38FDA394A841C2AF3B4AA6399828AAACDCB7E833B7E5 + CC602662F204F5BDA78935BDE4AFA6400338966B3A9D02D1233B7125078892D6 + 113C908FEBFE8E7FBD1A9D37834C114C26C38D01A2BB380E17FF8D65CEBC8695 + E2BEA9E08F1EC6C3256B35183701A8B565C646247FD3DC31C041D863D6015A01 + BD66E1A0B7783B9514DC75C9D25FCE7073ED6D796B80D23F602409611BB1FB0D + 325CB94C1CBC2FF49D3067B20B58E38AA67F75987A62354AAE04E53E9EAED79A + 076FFC79214E25E6A3BE79DB94E31246AB373669044F4A04D25A5EE1C0C3F2F4 + A99883EE2694AD494AD95A76665E2CA9C32F81D9A18F0271BE545ACEE2856592 + CB3FBD47844DAE2CD992D7E8F9823008B7D5A1D54A699B1E21084A935EB91870 + BEF490B176801EE3FF1B0CF5EF529511B4C9ACBEDCF9B0D2E1492C6E8A417A66 + BA5B70A8A5EC603248F2573133CDA97160FC6F37854963D21ABE77F3538E08E6 + 149C98380884452A2C831D9751B28F7D9A2B66625AFB9C270CB24F4F4D9EF98A + 350A563AB6870DEDA6DF5A1FB55F12E5E1F345AAA2FDD5DB8A65D77C6EA56D26 + 6EEA82880A782DEEF3C6CD889DE76CD879676D31DCF8DAD04F5DD199B7DF8D32 + 9262FC346B6D74C7636DC7662F91FDEA7F9B12ACF67F2701492EE4048DF22184 + 0FA882B8BD3D3D4B42491B726D59797B7D8D2E406DFF53ACAD7C8E1E805C6F58 + 236FCE5D392A2E009402261C33326641C56974DA66F9CD6C4803F825C703AD88 + D1F134336D69068771706FFE35F0C30D32755E97697D425E0DFD81DEB9A60D07 + AF515939FFFCD96F1B1F0A1A09F5FF89410B4BFDA312F53197D6AD44E4E81D7F + 253566BEFD684A19FDCFBFBDD87BF3D8EC15AAA11DC98D807BBF91FE6A63F2D8 + CB32AA593B2A271960D10ED3858F3EE929BFB6963DF2BDD4F57890771F262861 + 4B32758FBB163E5745D793C3321C1A18DF914BFF37B57DBFB3C4301CBE812032 + 65870B75F41931614A729F52BE2E3FAB7CF442120B58D6E7BAFA1A39D30C4EF3 + A2453EB3D5A9BC08607C59438787ED9822A370343521898886F54D73CA54CE81 + 5A3C0DE2B5E0F1C9F9ADCDDD1B42242562680DCD6A688B0AE334C66F17661542 + F03DDCCCD64E9586EDB8AA3D653144138E4E4D9A90739700A231909E51EF9F58 + 45D87D0CAEF5C1CDD98608C2DFAAAF732F10BC36EABF4BCBCD635830948BE8CB + 357772A871E4172E4946DCCDD04C044FDB868C5EC1EE6E96817D94E8F0B5B017 + 2959E569FFCB5D164B10A9EB7B94522C3BDF2957C721847BFCF7DA77A1CD242E + 2345B46759D42B18002E5BD6E6CDF8F7B7DF14D8B4B7ED0F2EC44BC58EDF435E + E930D065A7F6D2C7013E0411394C2A77F3C4D091E0339E08ECCD38F3CC4291AC + 4F17E959F0E49DA2B52ED46CE35E8E396D1D9C8C2B0615195AD4AF2BE5696C82 + 72632F6EF88083D6A269377EB077098188C96F738770ABA5A5EDB5B563DCC9A9 + C0C7A5C725803F9192EBC35A96F1AAECFF25F64BA4A565E2DD064A0E1BACC9CE + 60EB7281F7EB173851246B8617072BD1E66E134F519E0F1E404F27219AF71AF0 + ED27A4C9F71D6AAE1458FD394286A57F9E44C3C44184FD71094493EB93FBCC37 + D95640004D5B5F2E6B0C88CC9624241D3FE3041266F349295A346779B4677C80 + F377DAFA6C9A92FCEEDD04F71E370B287CC3D330CB1988F69EBF880426772809 + CE104D285B626CFC15643DEBB8844EB1E10F9B87FF6F66DB46CCEAC261C23807 + 38FA8DA37FF154A90F1E3CF889A2CA6C66B8B2FFF2FCF0B6DD2C718543E9B76E + B8954A9D17AB6659A0D3150277FADE660699413D89DCC5D8F2F45A6D592A302F + 655DABD5F88BE437428D96A53D67D19671BA6660D628FE989A0E26451D769940 + A88C13DECF306EA5B2FB448B43648277817A55D4C2E81C5868365F6C612C7A53 + B5C741C39C2EC58BC9D1BCAD7BD99268AFDAE014C811DA2473556FB50B6B0518 + 3C27AE62898209EA05A0F07020574E660BB339A9CA7B8A2AC68CC5ABA31EFBF6 + 4EBBA04B291CEF7971193DE1E935E1CAA8DD81D23EB5E9AD1348B204AE7C316D + 99421EE9F904A31FF491DA3465FFA4D4AC545FDE78738FBCF3607B146B8840E8 + 418E2A1A5F749AE01FFF32B695F61A20DF8169EB83F54F5120E29C6FEB50DDCC + 9D53D37295B798958388A0E2135CE6E06B21D3ACD1047287A00128298F931B91 + 0103AEC5DFDF838F898E84574D0E05EE8D08C95877CB86912425E6E3BE817408 + 580760D95F86227254D63388754302819A9F900A28F9F2D6A861ED36283E075D + 2DD606B284070E537C384FBBCE26B6BAC082C8D97C23104D5646EFAF7D7E25AE + 678B777D6BA675F78C9AA10D3CAD8FBDEE445A988CB2D8C2A267FF3175E4CD3E + E553449793A4737CBF8E25EB2B6DA7735BD11D050344E1F71295802B0D716799 + 410F391BBA38B5285EB85A92E3A2F4F7DE940D95D720227CEB46E00D635A8197 + DFE053D0B93C4DBF47B501DDF9950F2D3EFCD3CD6AF835CA4B81D6AF9BDBCFD1 + 64598AAD45E5AE436F95A7BA8C8CBED550FAECD75CF3EE8D0A654489ABC5B9CB + BC8595CE2E23A396FC467798DC61DB826316AF739259BDBD49C1A4DD14B8289F + DA880CD88C18B1285ABF35763224E40B87A5EAF714538ACB5873F28B1E715BDB + 21303ED5B40BA3D057F2D215D1A1B40626F8244C92932F78E6BDD789C06E2E44 + F2C8665B8306203D16A638A0AB7FEBA955CB1BBD1817C76F87477A881183ACCC + BC90304090510F17197F2B3110A5FD76D828603CB217926044498866562DFD5B + 4C887EB20FA90C0B9F4B33B74CAB76593296C9E1FA9830BFBA909E48854B42F8 + A06BBA84431900E0AD3D1947EBD145824936EB94453B1C074BFEE73069407147 + 5A159802DA0A366827ED9BC75683FFF40B5D75AF58D70E2EA5FE3864C219AFDA + BAD5C60A3B2AEA907F9ACF47BE50348E94F36F706CCB5A61C1EE7EA7C5A2C6FE + 5DC656AEE91174442DB79D3C3764FD21CC82A9B8F9BC9772D4E3F9B5573277D6 + 980012C8BA4C63EA2861A37A23D41A924BF08EA6C2682CE5A4F1B82D493139EB + 4E03125C84232EE11C7829DA6C886D77006F1FDCF479F8C6ED2B9B04735D5CB0 + 4A96153250DE03A29760A2FB7784CE214908B4773581F4EC4BF09FFD65F29E59 + 60760474C59BA9474CBC2F7C1AC8A849562F4DCA4105EBE29F23304489F97B67 + 733C58C2E8924EED9DE7E68F8CA61E7A0145B75C3ED249507531A7427E142705 + BF45C934DDF3F85B7A0F3E5DB96A02B265938028B46543A45A67EE3278190C53 + E046D763A6F86FEF962D6C30101D2D06FBEB5B426DF0FDE54CADBA492228014D + 3916AD26205092E5F5B3AC4F70F2ADB9107A3D9BAC651AF51A40D8B74BE3A93F + 72D6C0AEA8315FF45AD0D3A86FFFE5A8E6DDB2393A393FE015A2702EAA92D630 + 115E7358EBFEE3FA1B9D9218C115FBBF76C0520031A794B831C363A9C912254F + D86D028A8EF1ACEBC567FB31AE26CFC0DC9A55CBD975B4799DB899CBCA006BE7 + 6A671CA04983F4BB67EB1C5D14A82B3711087F6FBA10258CD318E03D35A49D97 + BBAF88C86D7EC90853163514AB02C6112125370A4880F94B7ADE4B1027CC65CD + 667D6AD254E2593C2F00099F423527BB180380CD41D007F5C3CD4ACBCE59D3ED + C97437CEFE0E4E310DD9A5E34ED1986C92AE9B7CE083384B37FC03B4B1FBDED2 + E14F139351ECD1C0742A2B8555349D79CEBCEAA2A1B56A1B1FD6A3B82DB47949 + 9AD783107FE4CED56DE3CDF46217DDEEFD7D2A39D9C8485F00922AE866F9B364 + 2F815E58D125727CB26CBF0043AA7071AC45F9329C9B8F00F0CF45701C60B6D0 + 9689A65643DF97365BF3EB747773A1ADFD02FC9721737AC2F00C4FF22F546E2C + C354B199E55CD3D7846A8D1759C35D0803BF876D845C454CAB711B39C1CF3E3B + 790D713FAB9439A13AE0B119812E4FD978A6498947C432A05F4A49556523461C + B217424DBE8D1C2EE7CB4C1755A96BF71F9A668E41285DE8EA87537D3751C397 + 116B40D7866B2CBC0C8DA3E9E8EDB10F42F77C73B98F7D68283CE323CCB36CF6 + 59B44153C994FA483F8369658A62754A56C2E1B66E76998E7C32201B6403B186 + 1850EE877F56D175FA7395400EFF76FA8FEC7E50854F493316E8311BEFE34CA2 + 3ECCDDFED7F9D0C3E387474EC1DFF9928C18368646026F0BEC11732A6EEBEC67 + 6E50F14C3FEC9205BF01988437F0E32EC84F3C2C5CC68C85AFC1D5E6A4CF5790 + 373E480401903055D2865D3069EBFBB75037FD74A0E5DC17720BBC2B900A3EC5 + D5AA21251FE3918E3D2B8FAC02272B8861B3D65C1CD287B8C483BE7BA65AE9C2 + F9F4A09F806614B70365472385674E516663BD6E7E7220ED7CBC2E5AD79B72B5 + A99255D300636C24B8AB799F903C0E06F49DC00A78B8E540547F96F1D7CB328E + 4A8B533E5159C142A3F0ABDE3369D42A465C82EF5E01CF18D166A4E86FABD95A + A245B4D43C647310CAC5042FED03267EBF81ADB40E9E2D4F41194DAD6DC1E37A + 6BC7C00A28506B5FA9611CD8A167268A991172B97B40A898EAD22077DC44B945 + FDB8AD4F87E8023FBAD44DE025F05877D81A61EB0272137BEB7ED4952283268D + 6489BA70BA0825F5F13366B33768E3194A06B7D53DDFF3113B36CF0DC6A71F56 + B6726762B236F988DA3D8F40FC97906995EA46A306FAA174C7157EE7F21009CF + FE78D783A698108536D1CAFAD4155B30D6C7F655597E17522EAA40CEB0BCF267 + 4202ACBB86D59E2A92166B8FB47B2A6DCC3223F6AE4DFF8AA68CB7DA4ABF65DC + 5DC977AD81D7085FE052E661795F556BA4959F54CBF2864AB96241DA06BDD40C + 6C7147AEC6DBCA99516166DB3EB2644A62708779C23AF12B2C628901BB3170FA + 4E79800154787DBFA92E8E599485A009170C2C4AD5F065F71004A59445635BDA + E8FF885324CAFA11909FDB3CB4E2C44C0CB4AE26B63EEDDC518178597F244081 + D5B2DEE2300A51C8B8B510D667AF90DF80BDA9CD1278EBF007D2536D96E45148 + E0D8380D9176219180E3473A3EB2FE68BFBB52A70EC937E9D3FBCCD84F27D837 + 73C9F5A94EDCDCA87F541EE9A13267955E80A6558AE7D4D39B29F1EF549EE1B0 + 51980E27B28BA43972D37771863F4A9FCB14DD4AE6F367EE3E474042E4702358 + 6AD9F0E046A12397D7800BC0D31E710CCF9F7D97ADF0E2E018C6CE59EC8C8EF1 + FA2E1CADD83860E0D80F1BD06F203F898DEABA47E4BCB7A7E7DC31A61ECDAD1D + 06E66BC130DE4A2A23CC99B7D1C43448DFAB8F906D3855D61B2A46E6C1621ADC + ADFC817771707C7B762DBE73CC7E3972A89284C4F8E804A6B901D856CCB80769 + F5ABF020D5CDB10EEEB5490623C0435A16AAE8894136BA3E31F126EE78E0C8BC + A5FD518355C1736615E0E15FE5C8BD98A91FBB3ECCAB61A739212C4D2B878BFB + 111138C1575CAC87F14D3EC5163A92E1E3AAB9262A1747BFA2761F0F810EB355 + 3FCC4C2CD357835632AE4E5B27891C562C3F7D4D0B692E33F73FA871E4899E42 + AB9D40FF36D019BE222C8DD68E0944ACD642E5B0E2636BF11269E9A95909361C + B4943296B2B2DB1592D4F6DEFBC4B1B71D9A1A3E9BDA8A71A461569E6F6655ED + 0B3BF5D489E4550C5C9B517A42E26266B0738E3A9B56798097EFDDC02F138781 + B904452FA2A1C4D2BFE8D7F2EF0F9DA1F78FA1F3C95C044F820CE50D64DFB592 + 9BA23B80BF61195688D8DAE00793322AF789AA18B77A4BFE2121FAE31318054F + 252B4D43E2D95F9EE8651547E0517A000EA7CDDC01F90699C9E9B6811C73BA46 + 88EAE94907FCB5D8CFDB026D2788C3C2C1F125A1AE199BFEE87A816C754403CC + 66F5ABA1339438F228F5046F41FBBD4D68A82058602528A2AAB45CDDEA82BE69 + 4D0E0081D9CBABA174F6A871CDC42A9630F2DEFF0824EE2D4E1A33BD09825093 + DDE75F9A27FCD28FCB28FC02A678AED604AB23DEA5925D73127F2BC2943FCE6F + F32AAD928D7BCD88FFD961E8DA50C41014A4975934D96E203DFC0D3445C2C89B + 0C0E27A8ED7C754ACD7C7FC142CDC08A8A2F4E774340A8CFB55910D7F35F1FA5 + D1A02889B69ED9481698D9C2E9179A7D45BF678BE1F9EECB8D9366564ED5DC99 + C82E056B082F1350BA389857EBCC9499FC84EA8F69A2744D334392918D715CA6 + F92437AF9B0C8BBE1D105CE2696DF6DD87C81DA9E9957D84FC0E8985F6BC81C3 + C6726AE0E28F693F56FFD370A71F826FFEEC21EC7275604F7F9B2A8AA067523E + 21DAF1C5E45E06661A6A111907123C0F8AC823693BBA60017DD743D0C061E91D + 0093E91DCB5BA63024AE519423AE086EF048BF44B43A6108A988B4C1E343CDDE + 4864EBC6423FEFB48E9FE18930647622B664D59F80B04A9621C05B5ED6574694 + 668F6F255963FCADE0CDBCF3DA24A00BC42C634BECE069A90BF73EBE07F03F6F + 76FBCEF1A001DE598B50D9D0C85C793F5BC70ABF479FFAF51D3C766A02A1CD7D + 9850F107D585B698B5850F8DD6CD5F3D8AA7E6CAE31716CC5FE64E759C6B8743 + BBD93E8F5674CC999D1E21B5988B055EFC864C7E1E6A71D20B4284DAC8CDD087 + ADF9AB3FC77C6CEDED60FF8F36CF3F706F8BBCD834F74FC543DEA66AA7D486A6 + B7A127E399E22E429C7F927DB82D5D64F336D9933952884E7BD3C3E7A8C5B511 + 936C07CCEC7808CB64FFFCFCB899FEFC84EEFAAE1F52F5E49F1C151C57A4FA13 + 3775573BD150C3C0DA86A9AFCEAE297888455E86FBC254BF3A67C9AC7D682204 + 7613EFC8FA15DB8362F79377F9FC395FDD302CF2E2D60D921C7E191E4E78B714 + 65084A88467C3C2CB790AD3380018E095EEB27B1A9186D69785650A51993CB25 + + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + /ArialMT findfont /Encoding get + dup 32 /space put + dup 33 /exclam put + dup 34 /quotedbl put + dup 35 /numbersign put + dup 36 /dollar put + dup 37 /percent put + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 43 /plus put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 59 /semicolon put + dup 60 /less put + dup 61 /equal put + dup 62 /greater put + dup 63 /question put + dup 64 /at put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 69 /E put + dup 70 /F put + dup 71 /G put + dup 72 /H put + dup 73 /I put + dup 74 /J put + dup 75 /K put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 81 /Q put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 86 /V put + dup 87 /W put + dup 88 /X put + dup 89 /Y put + dup 90 /Z put + dup 91 /bracketleft put + dup 92 /backslash put + dup 93 /bracketright put + dup 94 /asciicircum put + dup 95 /underscore put + dup 96 /quoteleft put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + dup 122 /z put + dup 123 /braceleft put + dup 124 /bar put + dup 125 /braceright put + dup 126 /asciitilde put + dup 161 /exclamdown put + dup 162 /cent put + dup 163 /sterling put + dup 164 /fraction put + dup 165 /yen put + dup 166 /florin put + dup 167 /section put + dup 168 /currency put + dup 169 /quotesingle put + dup 170 /quotedblleft put + dup 171 /guillemotleft put + dup 172 /guilsinglleft put + dup 173 /guilsinglright put + dup 174 /fi put + dup 175 /fl put + dup 177 /endash put + dup 178 /dagger put + dup 179 /daggerdbl put + dup 180 /periodcentered put + dup 182 /paragraph put + dup 183 /bullet put + dup 184 /quotesinglbase put + dup 185 /quotedblbase put + dup 186 /quotedblright put + dup 187 /guillemotright put + dup 188 /ellipsis put + dup 189 /perthousand put + dup 191 /questiondown put + dup 193 /grave put + dup 194 /acute put + dup 195 /circumflex put + dup 196 /tilde put + dup 197 /macron put + dup 198 /breve put + dup 199 /dotaccent put + dup 200 /dieresis put + dup 202 /ring put + dup 203 /cedilla put + dup 205 /hungarumlaut put + dup 206 /ogonek put + dup 207 /caron put + dup 208 /emdash put + dup 225 /AE put + dup 227 /ordfeminine put + dup 232 /Lslash put + dup 233 /Oslash put + dup 234 /OE put + dup 235 /ordmasculine put + dup 241 /ae put + dup 245 /dotlessi put + dup 248 /lslash put + dup 249 /oslash put + dup 250 /oe put + dup 251 /germandbls put + dup 0 /onesuperior put + dup 127 /.notdef put + pop + end + %%EndResource + + userdict /pdf_svglb get setglobal + end + [/N8/ArialMT 1 TZG + %%EndPageSetup + 0 0 792 612 re + W + n + n + 5.03999 4.79999 779.28 603.12 re + [/DeviceRGB] cs 1 1 1 sc + + f + 0.23999 w + 1 J + 2 j + 1 M + n + 65.52 593.76 m + 784.32 593.76 l + 784.32 96.72 l + 65.52 96.72 l + 65.52 593.76 l + h + 0 0 0 sc + S + q + n + 65.52 151.68 718.8 0.23999 re + h + W + n + 1 j + 10 M + n + 65.52 151.92 m + 784.32 151.92 l + S + Q + q + n + 65.52 206.88 718.8 0.23999 re + h + W + n + 1 j + 10 M + n + 65.52 207.12 m + 784.32 207.12 l + S + Q + q + n + 65.52 262.08 718.8 0.23999 re + h + W + n + 1 j + 10 M + n + 65.52 262.32 m + 784.32 262.32 l + S + Q + q + n + 65.52 317.28 718.8 0.23999 re + h + W + n + 1 j + 10 M + n + 65.52 317.52 m + 784.32 317.52 l + S + Q + q + n + 65.52 372.72 718.8 0.23999 re + h + W + n + 1 j + 10 M + n + 65.52 372.96 m + 784.32 372.96 l + S + Q + q + n + 65.52 427.92 718.8 0.23999 re + h + W + n + 1 j + 10 M + n + 65.52 428.16 m + 784.32 428.16 l + S + Q + q + n + 65.52 594.72 m + 65.52 95.76 l + 784.32 95.76 l + 784.32 594.72 l + 572.16 555.6 m + 572.16 448.8 l + 761.04 448.8 l + 761.04 555.6 l + h + eoclip + n + 1 j + 10 M + n + 65.52 483.36 m + 784.32 483.36 l + S + Q + q + n + 65.52 594.72 m + 65.52 95.76 l + 784.32 95.76 l + 784.32 594.72 l + 572.16 555.6 m + 572.16 448.8 l + 761.04 448.8 l + 761.04 555.6 l + h + eoclip + n + 1 j + 10 M + n + 65.52 538.56 m + 784.32 538.56 l + S + Q + q + n + 65.52 593.52 718.8 0.23999 re + h + W + n + 1 j + 10 M + n + 65.52 593.76 m + 784.32 593.76 l + S + Q + q + n + 0.959991 612 m + 0.959991 0.959991 l + 788.4 0.959991 l + 788.4 612 l + 572.16 555.6 m + 572.16 448.8 l + 761.04 448.8 l + 761.04 555.6 l + h + eoclip + n + 1 j + 10 M + n + 65.52 96.72 718.8 497.04 re + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 65.52 96.72 19.2 68.88 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 70.56 96.72 6.71999 61.68 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 108.24 96.72 21.36 72 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 115.44 96.72 6.71999 64.8 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 153.12 96.72 21.36 73.68 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 160.32 96.72 6.71999 66.48 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 198.24 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 205.44 96.72 6.71999 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 243.12 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 250.32 96.72 6.71999 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 288 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 295.2 96.72 6.71997 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 332.88 96.72 21.36 62.64 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 340.08 96.72 6.72 55.44 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 377.76 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 384.96 96.72 6.72 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 422.88 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 430.08 96.72 6.72 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 467.76 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 474.96 96.72 6.72 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 512.64 96.72 21.36 70.8 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 519.84 96.72 6.71997 63.6 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 557.52 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 564.72 96.72 6.71997 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 602.4 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 609.6 96.72 6.71997 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 647.28 96.72 21.36 76.08 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 654.48 96.72 6.71997 68.88 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 692.4 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 699.6 96.72 6.71997 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 737.28 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 744.48 96.72 6.71997 55.2 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 70.32 96.72 21.36 80.64 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 77.52 96.72 6.71999 73.44 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 115.2 96.72 21.36 95.04 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 122.4 96.72 6.71999 87.84 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 160.08 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 167.28 96.72 6.71999 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 205.2 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 212.4 96.72 6.71999 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 250.08 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 257.28 96.72 6.72 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 294.96 96.72 21.36 63.12 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 302.16 96.72 6.71997 55.92 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 339.84 96.72 21.36 62.64 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 347.04 96.72 6.71997 55.44 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 384.72 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 391.92 96.72 6.71997 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 429.84 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 437.04 96.72 6.71997 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 474.72 96.72 21.36 72.48 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 481.92 96.72 6.71997 65.28 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 519.6 96.72 21.36 68.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 526.8 96.72 6.71997 61.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 564.48 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 571.68 96.72 6.71997 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 609.36 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 616.56 96.72 6.71997 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 654.24 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 661.44 96.72 6.71997 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 699.36 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 706.56 96.72 6.71997 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 744.24 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 751.44 96.72 6.71997 55.2 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 77.28 96.72 21.12 91.44 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 84.48 96.72 6.48 84.24 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 122.16 96.72 21.12 81.6 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 129.36 96.72 6.48 74.4 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 167.04 96.72 21.36 90.72 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 174.24 96.72 6.71999 83.52 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 212.16 96.72 21.12 71.28 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 219.36 96.72 6.48 64.08 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 257.04 96.72 21.12 162.24 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 264.24 96.72 6.47998 155.04 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 301.92 96.72 21.12 180 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 309.12 96.72 6.47998 172.8 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 346.8 96.72 21.12 189.6 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 354 96.72 6.47998 182.4 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 391.68 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 398.88 96.72 6.71997 55.2 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 436.8 96.72 21.12 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 444 96.72 6.47998 55.2 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 481.68 96.72 21.12 72.48 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 488.88 96.72 6.47998 65.28 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 526.56 96.72 21.12 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 533.76 96.72 6.47998 55.2 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 571.44 96.72 21.12 161.52 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 578.64 96.72 6.47998 154.32 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 616.32 96.72 21.12 141.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 623.52 96.72 6.47998 134.64 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 661.2 96.72 21.36 97.92 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 668.4 96.72 6.71997 90.72 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 706.32 96.72 21.12 94.08 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 713.52 96.72 6.47998 86.88 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 751.2 96.72 21.12 160.8 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 758.4 96.72 6.47998 153.6 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 84 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 91.2 96.72 6.71999 55.2 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 128.88 96.72 21.36 70.32 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 136.08 96.72 6.71999 63.12 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 174 96.72 21.36 96.96 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 181.2 96.72 6.71999 89.76 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 218.88 96.72 21.36 71.28 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 226.08 96.72 6.71999 64.08 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 263.76 96.72 21.36 158.88 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 270.96 96.72 6.72 151.68 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 308.64 96.72 21.36 63.12 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 315.84 96.72 6.72 55.92 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 353.52 96.72 21.36 62.64 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 360.72 96.72 6.71997 55.44 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 398.64 96.72 21.36 156.96 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 405.84 96.72 6.72 149.76 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 443.52 96.72 21.36 75.36 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 450.72 96.72 6.71997 68.16 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 488.4 96.72 21.36 72.48 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 495.6 96.72 6.71997 65.28 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 533.28 96.72 21.36 65.52 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 540.48 96.72 6.71997 58.32 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 578.16 96.72 21.36 62.4 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 585.36 96.72 6.71997 55.2 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 623.04 96.72 21.36 108.72 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 630.24 96.72 6.71997 101.52 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 668.16 96.72 21.36 89.04 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 675.36 96.72 6.71997 81.84 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 713.04 96.72 21.36 82.8 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 720.24 96.72 6.71997 75.6 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 757.92 96.72 21.36 165.36 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 765.12 96.72 6.71997 158.16 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 90.96 96.72 21.36 91.92 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 98.16 96.72 6.71999 84.72 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 135.84 96.72 21.36 79.2 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 143.04 96.72 6.71999 72 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 180.96 96.72 21.36 117.84 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 188.16 96.72 6.71999 110.64 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 225.84 96.72 21.36 71.28 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 233.04 96.72 6.71999 64.08 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 270.72 96.72 21.36 163.44 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 277.92 96.72 6.71997 156.24 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 315.6 96.72 21.36 287.04 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 322.8 96.72 6.71997 279.84 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 360.48 96.72 21.36 492 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 367.68 96.72 6.71997 484.8 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 405.6 96.72 21.36 156.96 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 412.8 96.72 6.71997 149.76 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 450.48 96.72 21.36 75.36 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 457.68 96.72 6.71997 68.16 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 495.36 96.72 21.36 92.88 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 502.56 96.72 6.71997 85.68 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 540.24 96.72 21.36 73.92 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 547.44 96.72 6.71997 66.72 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 585.12 96.72 21.36 161.52 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 592.32 96.72 6.71997 154.32 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 630 96.72 21.36 123.6 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 637.2 96.72 6.71997 116.4 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 675.12 96.72 21.36 76.08 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 682.32 96.72 6.71997 68.88 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 720 96.72 21.36 94.08 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 727.2 96.72 6.71997 86.88 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + q + 1 0 0 1 0.0132904 0 cm + n + 764.88 96.72 21.36 162.72 re + h + W + n + 0.959991 w + 0 J + 1 j + 10 M + n + 772.08 96.72 6.71997 155.52 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + 1 j + 10 M + n + 65.52 593.76 m + 65.52 96.72 l + S + n + 60.24 96.72 m + 65.52 96.72 l + S + n + 60.24 151.92 m + 65.52 151.92 l + S + n + 60.24 207.12 m + 65.52 207.12 l + S + n + 60.24 262.32 m + 65.52 262.32 l + S + n + 60.24 317.52 m + 65.52 317.52 l + S + n + 60.24 372.96 m + 65.52 372.96 l + S + n + 60.24 428.16 m + 65.52 428.16 l + S + n + 60.24 483.36 m + 65.52 483.36 l + S + n + 60.24 538.56 m + 65.52 538.56 l + S + n + 60.24 593.76 m + 65.52 593.76 l + S + n + 65.52 96.72 m + 784.32 96.72 l + S + n + 65.52 92.4 m + 65.52 96.72 l + S + n + 110.4 92.4 m + 110.4 96.72 l + S + n + 155.28 92.4 m + 155.28 96.72 l + S + n + 200.4 92.4 m + 200.4 96.72 l + S + n + 245.28 92.4 m + 245.28 96.72 l + S + n + 290.16 92.4 m + 290.16 96.72 l + S + n + 335.04 92.4 m + 335.04 96.72 l + S + n + 379.92 92.4 m + 379.92 96.72 l + S + n + 425.04 92.4 m + 425.04 96.72 l + S + n + 469.92 92.4 m + 469.92 96.72 l + S + n + 514.8 92.4 m + 514.8 96.72 l + S + n + 559.68 92.4 m + 559.68 96.72 l + S + n + 604.56 92.4 m + 604.56 96.72 l + S + n + 649.44 92.4 m + 649.44 96.72 l + S + n + 694.56 92.4 m + 694.56 96.72 l + S + n + 739.44 92.4 m + 739.44 96.72 l + S + n + 784.32 92.4 m + 784.32 96.72 l + S + 29.04 91.2 m + /N8 17.04 Tf + (0.9) + [9.49903 4.76191 9.49903 ] pdfxs + 43.2 146.4 m + (1) show + 29.04 201.6 m + (1.1) + [9.49903 4.76191 9.49903 ] pdfxs + 29.04 256.8 m + (1.2) + [9.49903 4.76191 9.49903 ] pdfxs + 29.04 312 m + (1.3) + [9.49903 4.76191 9.49903 ] pdfxs + 29.04 367.44 m + (1.4) + [9.49903 4.76191 9.49903 ] pdfxs + 29.04 422.64 m + (1.5) + [9.49903 4.76191 9.49903 ] pdfxs + 29.04 477.84 m + (1.6) + [9.49903 4.76191 9.49903 ] pdfxs + 29.04 533.04 m + (1.7) + [9.49903 4.76191 9.49903 ] pdfxs + 29.04 588.24 m + (1.8) + [9.49903 4.76191 9.49903 ] pdfxs + 82.08 90 m + /N8 [0 -14.16 14.16 0 0 0] Tf + (175.vpr) + [-7.91525 -7.91525 -7.91525 -3.97877 -7.12229 -7.91525 -4.75747 ] pdfys + 126.96 90 m + (197.parser-b) + [-7.92355 -7.92355 -7.92355 -3.98707 -7.92355 -7.92355 -4.76577 -7.13059 -7.92355 -4.76577 -4.76577 + -7.92355 ] pdfys + 171.84 90 m + (300.twolf) + [-7.86985 -7.86985 -7.86985 -3.93338 -3.93338 -10.2204 -7.86985 -3.14042 -3.93338 ] pdfys + 216.72 90.24 m + (bc) + [-7.95645 -7.16349 ] pdfys + 261.6 90.24 m + (ft) + [-3.83998 -3.83998 ] pdfys + 306.72 90 m + (analyzer) + [-7.93414 -7.93414 -7.93414 -3.20471 -7.14118 -7.14118 -7.93414 -4.77636 ] pdfys + 351.6 90 m + (llu-bench) + [-3.18721 -3.18721 -7.91664 -4.75886 -7.91664 -7.91664 -7.91664 -7.12368 -7.91664 ] pdfys + 396.48 90 m + (chomp) + [-7.12519 -7.91815 -7.91815 -11.8404 -7.91815 ] pdfys + 441.36 90 m + (fpgrowth) + [-3.92859 -7.86506 -7.86506 -4.70728 -7.86506 -10.2156 -3.92859 -7.86506 ] pdfys + 486.24 90 m + (espresso) + [-7.95204 -7.15908 -7.95204 -4.79426 -7.95204 -7.15908 -7.15908 -7.95204 ] pdfys + 531.12 90 m + (povray31) + [-7.94294 -7.94294 -7.14999 -4.78516 -7.94294 -7.14999 -7.94294 -7.94294 ] pdfys + 576.24 90 m + (bisort) + [-7.90273 -3.1733 -7.10978 -7.90273 -4.74496 -3.96626 ] pdfys + 621.12 90 m + (health) + [-7.88435 -7.88435 -7.88435 -3.15492 -3.94787 -7.88435 ] pdfys + 666 90 m + (mst) + [-11.7913 -7.0761 -3.93258 ] pdfys + 710.88 90 m + (perimeter) + [-7.89544 -7.89544 -4.73766 -3.16601 -11.8177 -7.89544 -3.95897 -7.89544 -4.73766 ] pdfys + 755.76 90 m + (tsp) + [-3.95997 -7.10349 -7.89645 ] pdfys + 26.64 205.44 m + /N10 [0 18.72 -18.72 0 0 0] Tf + (Runtime ratio \(smaller is faster\)) + [13.4945 11.4165 11.4165 6.21233 5.18287 16.6209 10.387 5.28007 7.26093 10.387 6.21233 + 5.18287 11.4165 5.28007 6.21233 10.387 16.6209 10.387 5.18287 5.18287 10.387 7.26093 + 5.28007 5.18287 10.387 5.28007 6.21233 10.387 10.387 6.21233 10.387 7.26093 6.21233 + ] pdfys + n + 572.4 448.8 188.4 106.56 re + 1 1 1 sc + f + n + 572.16 448.8 188.64 106.8 re + 0 0 0 sc + S + q + 1 0 0 1 0.0132904 0 cm + n + 572.4 531.84 21.36 23.52 re + h + W + n + 0.959991 w + 0 J + n + 576.72 539.28 9.59998 9.59998 re + h + q + 0.599991 0.599991 1 sc + eofill + Q + S + Q + 590.4 538.8 m + /N8 15.84 Tf + (Selective PA Disabled) + [10.609 8.85063 3.56008 8.85063 7.96359 4.44711 3.56008 7.96359 8.85063 4.32002 10.609 + 10.609 4.32002 11.4801 3.56008 7.96359 8.85063 8.85063 3.56008 8.85063 8.85063 ] pdfxs + q + 1 0 0 1 0.0132904 0 cm + n + 572.4 510.48 21.36 24.24 re + h + W + n + 0.959991 w + 0 J + n + 576.72 517.92 9.59998 9.59998 re + h + q + 0.599991 0.199997 0.399994 sc + eofill + Q + S + Q + 590.4 517.44 m + (PoolFree Elim Disabled) + [10.6157 8.85733 8.85733 3.56677 9.72841 5.32489 8.85733 8.85733 4.32002 10.6157 3.56677 + 3.56677 13.2449 4.32002 11.4868 3.56677 7.97029 8.85733 8.85733 3.56677 8.85733 8.85733 + ] pdfxs + q + 1 0 0 1 0.0132904 0 cm + n + 572.4 489.12 21.36 24.24 re + h + W + n + 0.959991 w + 0 J + n + 576.72 496.56 9.59998 9.59998 re + h + q + 1 1 0.799988 sc + eofill + Q + S + Q + 590.4 496.08 m + (Bump Pointer Disabled) + [10.6131 8.85473 13.2423 8.85473 4.31993 10.6131 8.85473 3.56418 8.85473 4.45122 8.85473 + 5.3223 4.31993 11.4842 3.56418 7.9677 8.85473 8.85473 3.56418 8.85473 8.85473 ] pdfxs + q + 1 0 0 1 0.0132904 0 cm + n + 572.4 467.76 21.36 24.24 re + h + W + n + 0.959991 w + 0 J + n + 576.72 475.2 9.59998 9.59998 re + h + q + 0.799988 1 1 sc + eofill + Q + S + Q + 590.4 474.72 m + (Align Opt Disabled) + [10.6127 3.56377 3.56377 8.85432 8.85432 4.32001 12.3708 8.85432 4.4508 4.32001 11.4838 + 3.56377 7.96729 8.85432 8.85432 3.56377 8.85432 8.85432 ] pdfxs + q + 1 0 0 1 0.0132904 0 cm + n + 572.4 449.04 21.36 21.6 re + h + W + n + 0.959991 w + 0 J + n + 576.72 453.84 9.59998 9.60001 re + h + q + 0.399994 0 0.399994 sc + eofill + Q + S + Q + 590.4 453.36 m + (All Disabled \(Base PA\)) + [10.6099 3.56098 3.56098 4.32002 11.481 3.56098 7.96449 8.85153 8.85153 3.56098 8.85153 + 8.85153 4.32002 5.3191 10.6099 8.85153 7.96449 8.85153 4.32002 10.6099 10.6099 5.3191 + ] pdfxs + PDFVars/TermAll get exec end end + userdict /pgsave get restore + showpage + %%PageTrailer + %%EndPage + %%Trailer + %%DocumentProcessColors: Cyan Magenta Yellow Black + %%DocumentSuppliedResources: + %%+ font ArialMT + %%+ font Arial-BoldMT + %%+ procset (Adobe Acrobat - PDF operators) 1.2 0 + %%+ procset (Adobe Acrobat - type operators) 1.2 0 + %%EOF + + %%EndDocument + @endspecial 2042 2416 1993 3 v 2164 2501 a Fn(Figur)o(e)f(11.)h + Fj(Optimization)i(contrib)o(utions)e(\(1.0)e(=)g(FullP)-6 + b(A,)17 b(all)h(optzns\))2141 2636 y Fz(All)40 b(of)h(the)g + (optimizations)g(e)o(xcept)g(Selecti)n(v)o(eP)-7 b(A)40 + b(contrib)o(ute)h(no-)2042 2719 y(ticeable)28 b(impro)o(v)o(ements)h + (to)f(at)g(least)f(one)i(program.)g(Selecti)n(v)o(eP)-7 + b(A)27 b(pro-)2042 2802 y(vides)k(no)g(signi\002cant)f(speedup)i(b)o + (ut)e(does)h(not)g(hurt)g(performance)g(and)2042 2885 + y(it)26 b(is)h(useful)h(because)g(it)f(can)h(impro)o(v)o(e)f(memory)h + (consumption)i(signi\002-)2042 2968 y(cantly)20 b(in)f(some)h(cases.)f + (The)g(poolfree)h(optimization)g(impro)o(v)o(es)g(175.vpr)m(,)2042 + 3051 y(197.parser)o(-b,)g(espresso,)h(and)f(po)o(vray31.)h(The)f(b)o + (ump)h(pointer)f(optimiza-)2042 3134 y(tion)26 b(appears)i(to)e(be)h + (the)f(most)h(signi\002cant)g(of)f(the)h(three,)f(being)h(partic-)2042 + 3217 y(ularly)g(v)n(aluable)h(to)f(175.vpr)m(,)h(300.tw)o(olf,)f(ft,)f + (analyzer)m(,)i(llu-bench,)f(and)2042 3300 y(se)n(v)o(eral)17 + b(Olden)h(programs.)g(Close)f(inspection)h(of)g(175.vpr)g(is)f + (particularly)2042 3383 y(interesting:)22 b(BaseP)-7 + b(A)22 b(is)g(not)h(f)o(aster)f(than)h(NoP)-7 b(A,)22 + b(b)o(ut)g(a)g(combination)i(of)2042 3466 y(poolfree)17 + b(elimination)f(and)g(the)h(b)o(ump)f(pointer)g(optimization)h(reduces) + g(the)2042 3549 y(runtime)28 b(of)f(the)h(program)h(to)f(95.7\045)g(of) + g(NoP)-7 b(A)27 b(\(Selecti)n(v)o(eP)-7 b(A)27 b(reduces)2042 + 3632 y(it)d(further)i(to)f(94.6\045\).)h(Finally)-5 b(,)25 + b(se)n(v)o(eral)g(programs)i(bene\002ted)f(from)f(the)2042 + 3715 y(alignment)19 b(optimization,)g(particularly)h(ft,)e(chomp,)h + (health)h(and)f(tsp.)2141 3798 y(The)29 b(speedup)h(potential)e(of)g + (these)h(simple)f(pool)h(optimizations)g(are)2042 3881 + y(particularly)18 b(notable)h(because)g(the)o(y)f(are)g(all)f(v)o(ery)i + (simple)f(optimizations,)2042 3964 y(b)o(ut)h(can)i(only)f(be)h + (performed)f(only)h(once)g(the)f(heap)g(has)h(been)f(se)o(gre)o(gated) + 2042 4047 y(into)f(pools.)2042 4234 y FA(10.)90 b(Related)22 + b(W)-7 b(ork)2042 4350 y Fz(The)26 b(primary)g(goal)g(of)g(the)g(pool)g + (allocation)h(transformation)f(is)g(to)g(gi)n(v)o(e)2042 + 4433 y(the)21 b(compiler)h(some)f(control)h(o)o(v)o(er)g(the)f(layout)h + (of)f(data)g(structures)h(in)f(the)2042 4516 y(heap.)j(W)-6 + b(e)23 b(achie)n(v)o(e)i(this)e(using)h(a)g(conte)o(xt-sensiti)n(v)o(e) + h(points-to)f(graph)g(to)2042 4599 y(distinguish)k(data)g(structure)g + (instances)h(and)f(object)g(lifetimes.)f(W)-6 b(e)27 + b(\002rst)2042 4682 y(contrast)32 b(this)g(w)o(ork)h(with)f(pre)n + (vious)i(approaches)g(for)e(in\003uencing)h(the)2042 + 4765 y(layout)18 b(of)f(heap)h(objects,)g(and)g(then)f(with)g(pre)n + (vious)i(w)o(ork)f(on)g(partitioning)2042 4848 y(the)h(heap)h(for)e + (automatic)i(\(re)o(gion-based\))g(memory)g(management.)2141 + 4932 y(Chilimbi)42 b(et)h(al.)f([12])h(describe)g(a)f(semi-automatic)h + (tool)g(called)2042 5015 y Fs(ccmorph)22 b Fz(that)f(reor)o(ganizes)h + (the)f(layout)h(of)f(homogeneous)j(trees)d(at)g(run-)2042 + 5098 y(time)29 b(to)g(impro)o(v)o(e)h(locality)-5 b(.)29 + b(It)g(relies)g(on)h(programmer)g(annotations)h(to)2042 + 5181 y(identify)j(the)f(root)h(of)g(a)f(tree)h(and)g(to)g(indicate)g + (the)f(reor)o(ganization)h(is)2042 5264 y(safe.)28 b(W)-6 + b(e)29 b(automatically)g(identify)g(and)g(se)o(gre)o(gate)g(instances)h + (of)e(man)o(y)2042 5347 y(kinds)19 b(of)g(logical)f(data)h(structures,) + g(b)o(ut)f(do)h(not)g(yet)f(identify)h(when)g(a)g Fy(run-)2042 + 5430 y(time)e Fz(reor)o(ganization)h(w)o(ould)h(be)f(safe.)f(The)o(y)h + (also)g(describe)h(another)f(tool,)p eop end + %%Page: 13 13 + TeXDict begin 13 12 bop -150 66 a Fs(ccmalloc)p Fz(,)30 + b(which)g(is)e(a)h Fs(malloc)h Fz(replacement)g(that)f(accepts)g(hints) + g(to)-150 149 y(allocate)23 b(one)g(object)h(near)f(another)g(object.)g + (These)g(hints)g(only)g(pro)o(vides)-150 232 y(local)c(information)h + (for)f(an)g(object)g(pair)g(and)h(not)f(an)o(y)h(global)g(information) + -150 315 y(about)g(entire)f(data)g(structures.)-50 399 + y(Hirzel)h(et)g(al.)g([28)q(])g(describe)i(a)e(technique)i(to)f(impro)o + (v)o(e)g(the)g(ef)n(fecti)n(v)o(e-)-150 482 y(ness)g(of)h(Garbage)f + (Collection)h(by)f(partitioning)h(heap)f(objects)h(according)-150 + 565 y(to)28 b(their)f(connecti)n(vity)i(properties.)f(Unlik)o(e)g(our)g + (w)o(ork,)g(their)f(partitions)-150 648 y(are)c(not)h(se)o(gre)o(gated) + g(on)g(the)f(runtime)h(heap,)g(are)f(not)h(directly)f(related)g(to)-150 + 731 y(distinct)h(data)g(structures,)g(and)h(the)f(graph)h(of)g + (partitions)f(is)f(restricted)h(to)-150 814 y(be)19 b(a)g(D)m(A)m(G,)f + (which)h(pre)n(v)o(ents)h(\002ne)f(grained)g(partitioning)g(of)g + (mutually)h(re-)-150 897 y(cursi)n(v)o(e)f(structures)h(\(lik)o(e)f + (graphs\).)-50 980 y(Se)n(v)o(eral)i(proposed)j(techniques)f(aim)e(to)h + (impro)o(v)o(e)h(storage)f(allocation)-150 1063 y(or)15 + b(GC)g(performance)i(by)e(relating)h(objects)f(based)h(on)g(their)f + (predicted)h(life-)-150 1146 y(times)21 b([26)q(,)g(18)q(,)g(4)q(,)g + (15,)h(13,)g(41].)f(These)h(techniques)i(use)e(heuristics)g(such)-150 + 1229 y(as)17 b(allocation)h(site,)e(call)h(stack,)g(or)g(object)g + (size,)g(combined)h(with)f(pro\002ling)-150 1312 y(information,)27 + b(to)f(predict)h(lifetime)f(properties)h(approximately)-5 + b(.)27 b(In)g(con-)-150 1395 y(trast,)22 b(our)g(approach)j(uses)d(a)h + (more)g(rigorous)g(analysis)g(to)f(group)i(objects)-150 + 1478 y(both)c(by)f(structural)g(relationships)g(and)h(statically)e + (deri)n(v)o(ed)i(lifetimes.)-50 1561 y(Other)46 b(authors)i(ha)o(v)o(e) + f(de)n(v)o(eloped)i(techniques)f(\(usually)g(pro\002le-)-150 + 1644 y(based\))18 b(to)f(reor)o(ganize)g(\002elds)g(within)g(a)g + (single)g(structure)g(or)g(place)h(objects)-150 1727 + y(near)h(each)h(other)f(to)g(impro)o(v)o(e)h(locality)f(of)g(reference) + g([23)q(,)f(9)q(,)g(41)q(,)g(11)q(,)g(29)q(].)-150 1810 + y(These)23 b(placement)h(decisions)g(are)e(orthogonal)j(to)e(the)g + (choices)g(made)h(by)-150 1893 y(Automatic)d(Pool)g(Allocation,)f(and)i + (could)f(therefore)g(be)g(combined)i(with)-150 1976 y(our)c + (transformation.)h(This)e(an)h(important)h(direction)f(for)g(future)g + (w)o(ork.)-50 2059 y(There)f(has)g(been)h(signi\002cant)f(w)o(ork)h(on) + f(runtime)g(libraries)g(for)g(re)o(gion-)-150 2142 y(based)39 + b(memory)g(management)g([5],)f(and)g(on)h(language)g(mechanisms)-150 + 2225 y(for)32 b(manual)h(re)o(gion-based)h(memory)f(management)h(as)f + (an)f(alternati)n(v)o(e)-150 2308 y(to)42 b(garbage)g(collection,)g + (e.g.,)f(Real-time)g(Ja)o(v)n(a)h([7)q(],)f(RC)g([21],)g(Cy-)-150 + 2391 y(clone)17 b([30,)f(22)q(],)f(and)i(others)f([21)q(,)g(17,)g(8].)g + (Compared)h(with)f(our)g(approach,)-150 2474 y(these)k(library-)f(or)h + (language-based)i(techniques)f(are)f(much)g(easier)g(to)g(im-)-150 + 2557 y(plement,)26 b(b)o(ut)f(require)i(signi\002cant)f(manual)g(ef)n + (fort)g(to)f(use.)h(In)g(addition,)-150 2640 y(although)d(the)e(re)o + (gion-based)i(libraries)e(and)h(languages)h(e)o(xpose)f(the)g(rela-) + -150 2723 y(tionship)i(between)h(objects)f(and)h(re)o(gions)f(to)g(the) + g(compiler)m(,)g(the)o(y)g(do)g(not)-150 2806 y(e)o(xpose)j(an)o(y)f + (notion)h(of)e(higher)o(-le)n(v)o(el)h(data)g(structures)g(or)g(ho)n(w) + h(the)o(y)f(re-)-150 2889 y(late)18 b(to)g(objects)h(and)g(re)o(gions.) + f(Therefore,)g(the)h(compiler)f(does)h(not)g(obtain)-150 + 2972 y(information)25 b(about)g(data)g(structures)g(and)g(tra)o(v)o + (ersals)f(that)g(could)i(enable)-150 3055 y(optimizations)20 + b(on)f(logical)g(data)g(structures.)-50 3138 y(There)k(is)f(a)h(rich)g + (body)i(of)e(w)o(ork)h(on)f Fy(automatic)h Fz(re)o(gion)f(inference)h + (as)-150 3221 y(a)e(technique)i(for)e(memory)h(management,)g(for)f + (both)h(functional)g([45,)f(44)q(,)-150 3304 y(1,)g(24)q(])f(and)i + (object-oriented)g(languages)h([14)q(,)d(10)q(].)h(Unlik)o(e)g(this)g + (body)h(of)-150 3387 y(our)18 b(w)o(ork,)g(our)g(primary)g(goal)g(is)f + (to)h(se)o(gre)o(gate)g(and)g(control)g(the)g(layout)g(of)-150 + 3470 y(data)d(structures)h(in)e(the)i(heap)f(for)g(better)g + (performance)h(and)g(to)f(enable)h(sub-)-150 3553 y(sequent)27 + b(compiler)f(techniques)g(that)g(e)o(xploit)g(kno)n(wledge)h(of)e + (these)h(lay-)-150 3636 y(outs.)d(W)-6 b(e)23 b(describe)g(se)n(v)o + (eral)h(optimizations)g(that)e(e)o(xploit)i(data)f(structure)-150 + 3719 y(pools,)i(and)g(e)o(xplore)g(the)g(performance)h(implications)f + (of)f(data)h(structure)-150 3802 y(se)o(gre)o(gation)18 + b(on)h(program)g(performance)g(in)f(some)g(detail.)f(There)h(are)g + (also)-150 3885 y(some)25 b(k)o(e)o(y)g(technical)g(dif)n(ferences)h + (between)f(this)f(prior)h(w)o(ork)g(and)g(ours.)-150 + 3968 y(First,)18 b(all)g(these)i(pre)n(vious)g(techniques)g(e)o(xcept)g + (the)f(w)o(ork)h(of)f(Cherem)h(and)-150 4051 y(Rugina)k([10])f(are)h + (based)g(on)f(type)h(inference)g(with)f(a)g(re)o(gion-based)i(type)-150 + 4134 y(system.)i(It)g(does)h(not)f(appear)h(straightforw)o(ard)g(to)f + (e)o(xtend)i(the)e(type)h(in-)-150 4218 y(ference)19 + b(approaches)h(to)f(w)o(ork)g(for)f(weakly-typed)i(languages)g(lik)o(e) + f(C)f(and)-150 4301 y(C++,)28 b(which)h(can)g(contain)g(pointer)g + (casts,)g(v)n(arar)o(gs)f(functions,)i(unions,)-150 4384 + y(etc.,)23 b(on)h(which)f(type)h(information)g(is)f(dif)n(\002cult)g + (to)g(propagate)i(statically)-5 b(.)-150 4467 y(In)23 + b(contrast,)g(both)g(our)g(underlying)i(pointer)e(analysis)g(and)h(our) + f(transfor)o(-)-150 4550 y(mation)29 b(algorithm)h(correctly)f(handle)h + (all)e(the)h(comple)o(x)h(features)g(of)f(C)-150 4633 + y(and)20 b(C++,)g(by)g(distinguishing)h(objects)f(with)f(kno)n(wn)i + (and)f(unkno)n(wn)i(type)-150 4716 y(\(in)g(the)h(points-to)g(graph\))g + (and)g(by)g(using)g(a)g(conserv)n(ati)n(v)o(e)h(and)f(v)o(ery)g(ef)n + (\002-)-150 4799 y(cient)h(graph)g(mer)o(ging)h(technique)g(\(the)f + (same)g(as)f(in)h(DSA\))f(to)h(deal)g(with)-150 4882 + y(potentially)e(type-unsafe)g(uses)g(of)f(pointers)h(during)h(the)e + (transformation.)-150 4965 y(Second,)d(using)h(a)f(pointer)g(analysis)h + (as)e(the)h(basis)h(for)e(our)i(transformation)-150 5048 + y(enables)f(additional)g(optimizations)g(by)f(e)o(xploiting)h(the)f(e)o + (xplicit)g(relation-)-150 5131 y(ship)24 b(between)g(a)f(points-to)h + (graph)g(and)g(pools.)g(Finally)-5 b(,)22 b(the)i(use)g(of)f(type)-150 + 5214 y(inference)f(and)f(a)g(rich)g(type-system)h(is)f(not)g(well)g + (suited)g(for)g(modern)h(op-)-150 5297 y(timizing)c(compilers,)h(which) + g(are)f(usually)h(based)g(on)g(a)f(mid-le)n(v)o(el)h(or)f(lo)n(w-)-150 + 5380 y(le)n(v)o(el)i(internal)g(representation)h(supporting)g(multiple) + e(source)i(languages.)2042 66 y(Our)28 b(approach)i(is)d + (speci\002cally)i(designed)g(for)f(use)h(in)f(such)h(compilers,)2042 + 149 y(and)20 b(relies)e(only)i(a)f(simple,)g(mid-le)n(v)o(el)g + (intermediate)g(representation)h(and)2042 232 y(pointer)f(analysis.) + 2141 315 y(The)25 b(w)o(ork)h(of)f(Cherem)h(and)f(Rugina)h([10)q(])e(w) + o(as)i(performed)g(concur)o(-)2042 399 y(rently)17 b(with)g(ours)h(and) + g(our)f(approaches)j(are)d(technically)h(similar)e(in)i(some)2042 + 482 y(k)o(e)o(y)e(w)o(ays.)g(The)o(y)f(describe)i(a)e(re)o(gion)h + (inference)g(approach)h(for)f(Ja)o(v)n(a)f(based)2042 + 565 y(on)20 b(a)g(\003o)n(w-insensiti)n(v)o(e,)f(conte)o(xt-sensiti)n + (v)o(e)i(points-to)f(analysis.)g(Because)2042 648 y(their)30 + b(primary)h(focus)h(is)e(automatic)h(memory)h(management,)g(the)o(y)f + (are)2042 731 y(much)d(more)h(aggressi)n(v)o(e)g(about)f(computing)h + (re)o(gion)g(lifetimes,)e(includ-)2042 814 y(ing)d(loop-carried)g(re)o + (gions.)g(Our)g(re)o(gions)g Fy(can)g Fz(be)g(placed)h(as)e(\003e)o + (xibly)h(as)2042 897 y(theirs,)32 b(b)o(ut)g(we)g(use)h(a)f(simpler)h + (placement)g(analysis.)g(Lik)o(e)f(the)h(type-)2042 980 + y(inference)c(approaches,)h(ho)n(we)n(v)o(er)m(,)f(their)f(w)o(ork)h + (also)f(does)i(not)e(support)2042 1063 y(weakly)g(typed)h(languages)h + (lik)o(e)e(C.)g(Although)h(the)f(underlying)i(pointer)2042 + 1146 y(analysis)d(could)g(be)f(e)o(xtended)i(to)e(do)h(so)g(\(using)f + (our)h(approach,)h(for)e(e)o(x-)2042 1229 y(ample\),)g(we)g(belie)n(v)o + (e)g(the)g(transformation)h(w)o(ould)g(be)f(more)h(dif)n(\002cult)e(to) + 2042 1312 y(e)o(xtend.)k(Furthermore,)f(the)o(y)h(too)g(focus)g(on)g + (automatic)g(memory)h(man-)2042 1395 y(agement,)23 b(and)h(do)f(not)g + (e)o(xplore)h(the)f(impact)g(of)g(their)f(w)o(ork)i(on)f(memory)2042 + 1478 y(hierarchy)j(performance)h(or)f(consider)h(other)f(optimizations) + h(that)e(could)2042 1561 y(e)o(xploit)h(their)g(re)o(gion)h + (information.)f(W)-6 b(e)25 b(e)o(xpect)i(that)f(our)h(optimization) + 2042 1644 y(techniques)18 b(could)g(be)f(fruitfully)g(combined)h(with)f + (their)g(re)o(gion)g(inference)2042 1727 y(algorithm)i(for)g(Ja)o(v)n + (a)g(programs.)2141 1810 y(There)e(is)f(a)h(wide)f(range)i(of)e(w)o + (ork)h(on)g(techniques)h(for)f(stack)g(allocation)2042 + 1893 y(of)k(heap)h(objects)g(as)f(well)g(as)g(techniques)i(for)e + (static)g(garbage)h(collection,)2042 1976 y(both)28 b(of)g(which)g(are) + g(based)h(on)f(analyzing)h(the)f(lifetimes)f(of)h(objects)g(in)2042 + 2059 y(programs)e(\(e.g.,)f(see)h([6,)f(42)q(,)g(31)q(])g(and)h(the)g + (references)g(therein\).)g(These)2042 2142 y(techniques)17 + b(do)g(not)f(attempt)g(to)g(analyze)h(or)f(control)h(the)f(layout)h(of) + f(logical)2042 2225 y(data)29 b(structures)h(in)f(the)g(heap)h + Fy(per)g(se)p Fz(,)f(and)h(are)f(lar)o(gely)g(orthogonal)i(to)2042 + 2308 y(our)23 b(w)o(ork.)g(A)f(minor)h(e)o(xception)h(is)e(that)g(our)h + (optimization)h(to)e(eliminate)2042 2391 y Fs(poolfree)31 + b Fz(for)e(a)g(pool)h(\(when)f(there)h(are)f(no)g(interv)o(ening)i + (allocations)2042 2474 y(before)24 b(the)f(subsequent)i + Fs(pooldestroy)p Fz(\))h(essentially)d(replaces)h(e)o(xplicit)2042 + 2557 y(deallocation)c(with)f(static)f(reclamation)i(of)f(memory)h(in)f + (the)g(pool.)h(This)e(is)2042 2640 y(the)g(in)m(v)o(erse)g(of)g(\(and)g + (much)h(more)f(limited)f(than\))h(the)g(w)o(ork)g(on)h(static)e(GC,) + 2042 2723 y(which)i(aims)g(to)g(replace)g(or)g(optimize)g(runtime)g + (GC.)2141 2806 y(Finally)-5 b(,)18 b(in)g(an)h(early)f(w)o(orkshop)i + (paper)f([33)q(],)e(we)h(proposed)i(the)f(basic)2042 + 2889 y(idea)d(of)g(Automatic)h(Pool)e(Allocation.)h(That)g(w)o(ork)h + (did)f(not)h(consider)g(ho)n(w)2042 2972 y(to)29 b(handle)g(the)g(k)o + (e)o(y)h(dif)n(\002cult)f(cases)g(for)g(this)f(transformation,)i + (namely)-5 b(,)2042 3055 y(function)18 b(pointers)g(and)g(ef)n + (\002cient)f(handling)h(of)f(recursion.)h(It)f(relied)g(on)h(an)2042 + 3138 y(early)-5 b(,)16 b(non-scalable)h(v)o(ersion)g(of)e(DSA)h + (\(which)g(did)g(not)g(support)h(practical)2042 3221 + y(handling)33 b(of)f(non-type-safe)h(data)f(structures\),)g(did)g(not)g + (describe)h(an)o(y)2042 3304 y(optimizations)27 b(to)g(e)o(xploit)g + (pool)g(allocation,)g(and)h(did)f(not)g(e)n(v)n(aluate)h(the)2042 + 3387 y(performance)j(impact)e(of)h(pool)g(allocation.)g(The)g(current)g + (algorithm)f(is)2042 3470 y(general,)19 b(practical)g(and)h(ef)n + (\002cient,)e(and)h(supersedes)i(the)e(pre)n(vious)h(w)o(ork.)2042 + 3736 y FA(11.)90 b(Conclusions)21 b(and)h(Futur)n(e)g(W)-7 + b(ork)2042 3852 y Fz(The)18 b(primary)h(contrib)o(ution)h(of)e(this)h + (paper)g(is)f(a)h(practical,)f(ef)n(\002cient)h(com-)2042 + 3935 y(piler)g(algorithm)h(to)f(se)o(gre)o(gate)h(distinct)f(instances) + h(of)g(logical)f(data)h(struc-)2042 4018 y(tures)28 b(into)g(separate)g + (pools)h(in)e(the)h(heap.)h(Our)e(implementation)i(of)f(the)2042 + 4101 y(algorithm)j(applies)f(to)h(the)f(full)g(generality)h(of)g(C)f + (and)h(C++)f(programs)2042 4184 y(and)24 b(performs)g(se)n(v)o(eral)g + (additional)g(optimizations)h(that)e(tak)o(e)h(adv)n(antage)2042 + 4267 y(of)i(pool)h(allocation.)f(Our)h(results)f(sho)n(w)h(that)f(for)g + (man)o(y)h(programs,)g(the)2042 4350 y(transformation)e(achie)n(v)o(es) + g(the)f(major)h(goal)f(stated)h(in)f(the)g(Introduction,)2042 + 4433 y(namely)-5 b(,)18 b(that)f(it)f(can)i(impro)o(v)o(e)g(program)g + (performance,)g(sometimes)g(quite)2042 4516 y(substantially)-5 + b(.)16 b(The)f(complete)i(implementation)f(and)h(most)e(of)h(our)g + (bench-)2042 4599 y(marks)j(are)g(publicly)h(a)o(v)n(ailable)f(at)f + Fs(llvm.cs.uiuc.edu)p Fz(.)2141 4682 y(W)-6 b(e)33 b(belie)n(v)o(e)i + (that)e(the)h(combination)h(of)e(Data)h(Structure)f(Analysis)2042 + 4765 y(and)g(Automatic)f(Pool)g(Allocation)h(together)g(pro)o(vide)g(a) + f(ne)n(w)h(founda-)2042 4848 y(tion)h(for)f(analyzing)j(and)e + (transforming)h(pointer)o(-intensi)n(v)o(e)f(programs,)2042 + 4932 y(not)21 b(in)g(terms)g(of)g(indi)n(vidual)g(memory)h(references)g + (or)f(data)g(elements)g(b)o(ut)2042 5015 y(rather)f Fy(in)f(terms)h(of) + g(how)g(suc)o(h)h(pr)m(o)o(gr)o(ams)g(cr)m(eate)f(and)h(use)f(entir)m + (e)g(lo)o(gical)2042 5098 y(data)e(structur)m(es)p Fz(.)h(W)-6 + b(e)17 b(term)g(this)h(a)g(\223macroscopic\224)h(approach)h(to)d + (pointer)o(-)2042 5181 y(intensi)n(v)o(e)27 b(data)h(structures.)f(The) + g(broad)g(goal)h(of)f(our)g(ongoing)i(w)o(ork)e(is)2042 + 5264 y(to)32 b(continue)h(in)m(v)o(estigating)f(no)o(v)o(el)h + (macroscopic)g(techniques)h(for)e(pro-)2042 5347 y(gram)c + (optimization,)g(program)h(monitoring,)g(memory)f(safety)-5 + b(,)28 b(and)h(au-)2042 5430 y(tomatic)f(memory)h(management.)h(The)e + (\002rst)f(tw)o(o)h(major)h(e)o(xamples)g(de-)p eop end + %%Page: 14 14 + TeXDict begin 14 13 bop -150 66 a Fz(scribed)19 b(brie\003y)f(in)g + (Section)g(7)g(illustrate)g(the)g(potential)g(po)n(wer)h(of)f(this)g + (ap-)-150 149 y(proach)i(for)f(enabling)h(no)o(v)o(el)f(solutions)h(to) + f(dif)n(\002cult)f(compiler)h(problems.)-150 394 y FA(Ackno)o + (wledgments)-150 511 y Fz(This)42 b(w)o(ork)h(has)f(been)h(supported)h + (in)e(part)g(by)h(an)g(NSF)e(CAREER)-150 594 y(A)-7 b(w)o(ard)28 + b(\(EIA-00-93426\),)g(the)g(NSF)e(Ne)o(xt)h(Generation)i(Softw)o(are)e + (Pro-)-150 677 y(gram)h(\(EIA-01-03756\),)g(the)g(MARCO)f(F)o(ocus)g + (Research)h(Center)g(Pro-)-150 760 y(gram)i(through)h(GSRC,)d(and)i(by) + g(an)g(Intel)f(Graduate)h(Fello)n(wship.)f(The)-150 843 + y(authors)d(w)o(ould)g(lik)o(e)g(to)f(thank)h(John)g(Criswell)e(for)i + (his)f(assistance)h(with)-150 926 y(Linux)j(performance)h(monitoring)f + (counters)h(and)f(with)f(se)n(v)o(eral)h(bench-)-150 + 1009 y(marks,)e(and)g(Sumant)g(K)m(o)n(wshik)h(for)f(his)g(contrib)o + (utions)g(to)g(parts)f(of)h(the)-150 1092 y(implementation.)j(W)-6 + b(e)30 b(are)f(also)h(grateful)g(to)g(Shengnan)h(Cong)f(for)g(her)-150 + 1175 y(assistance)23 b(with)g(the)g(fpgro)n(wth)g(program,)g(the)g + (members)h(of)e(the)h(LL)-7 b(VM)-150 1258 y(group)30 + b(for)e(their)g(comments)i(and)f(suggestions)h(on)f(the)g(paper)m(,)g + (and)g(the)-150 1341 y(anon)o(ymous)21 b(re)n(vie)n(wers)e(for)g(their) + g(v)n(aluable)h(feedback.)-150 1586 y FA(Refer)n(ences)-117 + 1694 y Fj([1])30 b(A.)d(Aik)o(en,)h(M.)f(F)t(\250)-26 + b(ahndrich,)30 b(and)e(R.)g(Le)n(vien.)59 b(Better)30 + b(static)g(memory)-10 1768 y(management:)j(Impro)o(ving)g(re)o + (gion-based)h(analysis)f(of)e(higher)o(-order)-10 1843 + y(languages.)26 b(In)17 b Fa(PLDI)p Fj(,)f(pages)h(174\226185,)h(June)f + (1995.)-117 1934 y([2])30 b(T)-5 b(.)36 b(Austin,)i(et)g(al.)90 + b(The)37 b(Pointer)o(-intensi)n(v)o(e)42 b(Benchmark)d(Suite.)-10 + 2009 y Fg(www.cs.wisc.edu/~austin/)q(ptr-)q(dis)q(t.ht)q(ml)p + Fj(,)22 b(Sept)c(1995.)-117 2100 y([3])30 b(A.)22 b(A)-6 + b(yers,)23 b(S.)g(de)h(Jong,)f(J.)f(Pe)o(yton,)j(and)f(R.)f(Schooler)l + (.)46 b(Scalable)26 b(cross-)-10 2175 y(module)18 b(optimization.)27 + b(In)17 b Fa(PLDI)p Fj(,)f(Montreal,)i(June)g(1998.)-117 + 2267 y([4])30 b(D.)h(A.)h(Barrett)i(and)f(B.)f(G.)g(Zorn.)73 + b(Using)32 b(lifetime)j(predictors)g(to)-10 2341 y(impro)o(v)o(e)21 + b(memory)f(allocation)k(performance.)36 b(In)20 b Fa(PLDI)p + Fj(,)f(pages)i(187\226196,)-10 2416 y(Alb)o(uquerque,)d(Ne)n(w)g(Me)o + (xixo,)g(June)f(1993.)-117 2507 y([5])30 b(E.)16 b(D.)g(Ber)o(ger)m(,)j + (B.)d(G.)h(Zorn,)f(and)i(K.)f(S.)f(McKinle)o(y)l(.)27 + b(Reconsidering)20 b(custom)-10 2582 y(memory)d(allocation.)27 + b(In)17 b Fa(OOPSLA)p Fj(,)e(Seattle,)k(W)-5 b(ashington,)18 + b(No)o(v)l(.)f(2002.)-117 2673 y([6])30 b(B.)22 b(Blanchet.)45 + b(Escape)23 b(Analysis)h(for)f(Ja)o(v)n(a\(TM\):)g(Theory)g(and)h + (Practice.)-10 2748 y Fa(T)o(OPLAS)p Fj(,)15 b(25\(6\):713\226775,)k + (No)o(v)e(2003.)-117 2839 y([7])30 b(G.)24 b(Bollella)29 + b(and)d(J.)f(Gosling.)52 b(The)26 b(real-time)i(speci\002cation)h(for)c + (Ja)o(v)n(a.)-10 2914 y Fa(Computer)p Fj(,)18 b(33\(6\):47\22654,)g + (2000.)-117 3005 y([8])30 b(C.)23 b(Bo)o(yapati,)i(A.)e(Salcianu,)i(W) + -6 b(.)22 b(Beebee,)j(and)f(M.)f(Rinard.)45 b(Ownership)-10 + 3080 y(types)17 b(for)g(safe)g(re)o(gion-based)j(memory)d(management)h + (in)f(real-time)j(ja)o(v)n(a.)k(In)-10 3155 y Fa(PLDI)p + Fj(,)15 b(2003.)-117 3246 y([9])30 b(B.)17 b(Calder)m(,)j(K.)d + (Chandra,)j(S.)d(John,)h(and)g(T)-5 b(.)17 b(Austin.)29 + b(Cache-conscious)21 b(data)-10 3321 y(placement.)38 + b(In)20 b Fa(Pr)m(oc.)g(ASPLOS-VIII)p Fj(,)f(pages)j(139\226149,)f(San) + g(Jose,)f(USA,)-10 3396 y(1998.)-150 3487 y([10])30 b(S.)21 + b(Cherem)i(and)f(R.)g(Rugina.)41 b(Re)o(gion)24 b(analysis)f(and)g + (transformation)h(for)-10 3562 y(ja)o(v)n(a)e(programs.)36 + b(In)20 b Fa(2004)h(Int'l)h(Symposium)g(On)e(Memory)i(Mana)o(g)o(ement) + p Fj(,)-10 3636 y(V)-7 b(ancouv)o(er)m(,)18 b(Canada,)h(Oct.)e(2004.) + -150 3728 y([11])30 b(T)-5 b(.)24 b(M.)h(Chilimbi,)i(B.)e(Da)o(vidson,) + h(and)g(J.)f(R.)g(Larus.)51 b(Cache-conscious)-10 3802 + y(structure)19 b(de\002nition.)26 b(In)17 b Fa(PLDI'99)p + Fj(,)f(pages)i(13\22624.)f(A)m(CM)g(Press,)g(1999.)-150 + 3894 y([12])30 b(T)-5 b(.)13 b(M.)h(Chilimbi,)i(M.)e(D.)g(Hill,)i(and)f + (J.)f(R.)g(Larus.)19 b(Cache-conscious)f(structure)-10 + 3968 y(layout.)25 b(In)17 b Fa(PLDI'99)p Fj(,)g(pages)g(1\22612.)g(A)m + (CM)h(Press,)e(1999.)-150 4060 y([13])30 b(T)-5 b(.)15 + b(M.)g(Chilimbi)j(and)e(J.)g(R.)f(Larus.)22 b(Using)16 + b(generational)k(garbage)e(collection)-10 4134 y(to)27 + b(implement)i(cache-conscious)j(data)c(placement.)60 + b Fa(A)n(CM)27 b(SIGPLAN)-10 4209 y(Notices)p Fj(,)18 + b(34\(3\):37\22648,)h(1999.)-150 4301 y([14])30 b(W)-6 + b(.-N.)16 b(Chin,)j(F)-5 b(.)17 b(Craciun,)j(S.)e(Qin,)g(and)g(M.)g + (Rinard.)29 b(Re)o(gion)20 b(inference)h(for)-10 4375 + y(an)c(object-oriented)22 b(language.)k(In)17 b Fa(PLDI)p + Fj(,)f(W)-5 b(ashington,)18 b(DC,)e(June)h(2004.)-150 + 4467 y([15])30 b(R.)22 b(Courts.)42 b(Impro)o(ving)23 + b(locality)j(of)c(reference)j(in)e(a)g(garbage-collecting)-10 + 4541 y(memory)17 b(management)i(system.)24 b Fa(CA)n(CM)p + Fj(,)16 b(31\(9\):1128\2261138,)k(1988.)-150 4633 y([16])30 + b(M.)20 b(Das.)36 b(Uni\002cation-based)25 b(pointer)e(analysis)f(with) + g(directional)j(assign-)-10 4707 y(ments.)f(In)17 b Fa(PLDI)p + Fj(,)f(pages)h(35\22646,)h(2000.)-150 4799 y([17])30 + b(R.)25 b(DeLine)i(and)f(M.)f(F)t(\250)-26 b(ahndrich.)54 + b(Enforcing)27 b(high-le)n(v)o(el)i(protocols)f(in)-10 + 4873 y(lo)n(w-le)n(v)o(el)20 b(softw)o(are.)25 b(In)17 + b Fa(PLDI)p Fj(,)f(Sno)n(wbird,)i(UT)-5 b(,)16 b(June)h(2001.)-150 + 4965 y([18])30 b(A.)e(Demers,)h(M.)g(W)-5 b(eiser)m(,)29 + b(B.)g(Hayes,)h(H.)e(Boehm,)h(D.)g(Bobro)n(w)l(,)g(and)-10 + 5039 y(S.)f(Shenk)o(er)l(.)64 b(Combining)31 b(generational)h(and)e + (conserv)n(ati)n(v)o(e)j(garbage)-10 5114 y(collection:)26 + b(frame)n(w)o(ork)d(and)g(implementations.)42 b(In)22 + b Fa(Pr)m(oc.)f(A)n(CM)h(POPL)p Fj(,)-10 5189 y(pages)c(261\226269,)f + (1990.)-150 5280 y([19])30 b(D.)21 b(Dhurjati,)j(S.)d(K)n(o)n(wshik,)h + (V)-9 b(.)22 b(Adv)o(e,)g(and)h(C.)f(Lattner)l(.)42 b(Memory)23 + b(safety)-10 5355 y(without)e(garbage)g(collection)i(for)c(embedded)i + (applications.)36 b Fa(T)l(r)o(ansactions)-10 5430 y(on)17 + b(Embedded)h(Computing)h(Systems)p Fj(,)e(4\(1\):73\226111,)i(Feb)m(.)e + (2005.)2042 66 y([20])29 b(M.)18 b(F)t(\250)-26 b(ahndrich,)21 + b(J.)d(Rehof,)h(and)g(M.)f(Das.)29 b(Scalable)22 b(conte)o(xt-sensiti)n + (v)o(e)h(\003o)n(w)2181 141 y(analysis)c(using)f(instantiation)k + (constraints.)27 b(In)17 b Fa(PLDI)p Fj(,)g(V)-7 b(ancouv)o(er)m(,)19 + b(Canada,)2181 216 y(June)f(2000.)2042 307 y([21])29 + b(D.)17 b(Gay)h(and)f(A.)g(Aik)o(en.)26 b(Memory)18 b(management)h + (with)f(e)o(xplicit)i(re)o(gions.)26 b(In)2181 382 y + Fa(PLDI)p Fj(,)16 b(pages)i(313\226323,)g(Montreal,)g(Canada,)h(1998.) + 2042 473 y([22])29 b(D.)15 b(Grossman,)h(G.)e(Morrisett,)k(T)-5 + b(.)14 b(Jim,)h(M.)g(Hicks,)h(Y)-9 b(.)15 b(W)-5 b(ang,)15 + b(and)h(J.)f(Chene)o(y)l(.)2181 548 y(Re)o(gion-based)20 + b(memory)d(management)i(in)f(c)o(yclone.)26 b(In)17 b + Fa(PLDI)p Fj(,)e(June)j(2002.)2042 639 y([23])29 b(D.)13 + b(Grunw)o(ald)i(and)f(B.)f(Zorn.)j(Customalloc:)h(Ef)n(\002cient)e + (synthesized)h(memory)2181 714 y(allocators.)27 b Fa(SP&E)p + Fj(,)15 b(23\(8\):851\226869,)k(1993.)2042 805 y([24])29 + b(N.)15 b(Hallenber)o(g,)j(M.)d(Elsman,)h(and)g(M.)f(T)-5 + b(ofte.)22 b(Combining)17 b(re)o(gion)g(inference)2181 + 880 y(and)h(garbage)g(collection.)28 b(In)17 b Fa(PLDI)p + Fj(,)f(Berlin,)i(German)o(y)l(,)f(June)g(2002.)2042 971 + y([25])29 b(J.)17 b(Han,)f(J.)g(Pei,)i(and)f(Y)-9 b(.)17 + b(Y)l(in.)24 b(Mining)18 b(frequent)h(patterns)g(without)g(candidate) + 2181 1046 y(generation.)27 b(In)17 b Fa(SIGMOD)p Fj(,)g(pages)h + (1\22612,)f(2000.)2042 1137 y([26])29 b(D.)19 b(R.)g(Hanson.)32 + b(F)o(ast)19 b(allocation)k(and)d(deallcoation)k(of)19 + b(memory)g(based)h(on)2181 1212 y(object)f(lifetimes.)26 + b Fa(SP&E)p Fj(,)16 b(20\(1\):5\22612,)i(Jan)f(1990.)2042 + 1303 y([27])29 b(M.)21 b(Hind.)37 b(Pointer)23 b(analysis:)g(ha)o(v)o + (en')o(t)g(we)e(solv)o(ed)h(this)g(problem)g(yet?)39 + b(In)2181 1378 y Fa(P)-6 b(ASTE)p Fj(,)16 b(pages)h(54\22661.)h(A)m(CM) + f(Press,)f(2001.)2042 1469 y([28])29 b(M.)24 b(Hirzel,)i(A.)d(Diw)o + (an,)i(and)g(M.)f(Hertz.)48 b(Connecti)n(vity-based)30 + b(garbage)2181 1544 y(collection.)e(In)17 b Fa(OOPSLA)p + Fj(,)e(pages)j(359\226373,)g(2003.)2042 1636 y([29])29 + b(X.)e(Huang,)h(S.)f(Blackb)o(urn,)j(K.)d(McKinle)o(y)l(,)i(E.)d(Moss,) + h(Z.)g(W)-5 b(ang,)27 b(and)2181 1710 y(P)-7 b(.)24 b(Cheng.)49 + b(The)24 b(garbage)i(collection)i(adv)n(antage:)g(impro)o(ving)e + (program)2181 1785 y(locality)l(.)h(In)17 b Fa(OOPSLA)p + Fj(,)e(pages)j(69\22680,)f(2004.)2042 1876 y([30])29 + b(T)-5 b(.)30 b(Jim,)f(G.)h(Morrisett,)h(D.)f(Grossman,)f(M.)h(Hicks,)g + (J.)g(Chene)o(y)l(,)h(and)2181 1951 y(Y)-9 b(.)18 b(W)-5 + b(ang.)25 b(Cyclone:)20 b(A)d(safe)h(dialect)i(of)d(C.)26 + b(In)17 b Fa(USENIX)g(Annual)h(T)-6 b(ec)o(hnical)2181 + 2026 y(Confer)n(ence)p Fj(,)19 b(Montere)o(y)l(,)g(CA,)d(2002.)2042 + 2117 y([31])29 b(R.)22 b(Jones.)41 b Fa(Garba)o(g)o(e)24 + b(Collection.)h(Algorithms)e(for)f(A)o(utomatic)i(Dynamic)2181 + 2192 y(Memory)18 b(Mana)o(g)o(ement)p Fj(.)27 b(John)17 + b(W)m(ile)o(y)i(&)d(Sons,)g(1999.)2042 2283 y([32])29 + b(C.)k(Lattner)l(.)76 b Fa(Macr)m(oscopic)35 b(Data)f(Structur)n(e)g + (Analysis)f(and)g(Opti-)2181 2358 y(mization)p Fj(.)68 + b(PhD)30 b(thesis,)g(Computer)i(Science)g(Dept.,)e(Uni)n(v)o(ersity)j + (of)2181 2433 y(Illinois)j(at)f(Urbana-Champaign,)i(Urbana,)e(IL,)d + (May)j(2005.)79 b Fa(See)2181 2507 y Fg(http://llvm.cs.uiuc.ed)q(u)p + Fa(.)2042 2599 y Fj([33])29 b(C.)18 b(Lattner)h(and)f(V)-9 + b(.)18 b(Adv)o(e.)26 b(Automatic)20 b(Pool)e(Allocation)j(for)d + (Disjoint)h(Data)2181 2673 y(Structures.)26 b(In)17 b + Fa(MSP)p Fj(,)g(Berlin,)h(German)o(y)l(,)f(Jun)g(2002.)2042 + 2765 y([34])29 b(C.)d(Lattner)h(and)f(V)-9 b(.)25 b(Adv)o(e.)53 + b(LL)-7 b(VM:)25 b(A)g(Compilation)k(Frame)n(w)o(ork)e(for)2181 + 2839 y(Lifelong)22 b(Program)e(Analysis)h(and)f(Transformation.)36 + b(In)19 b Fa(CGO)p Fj(,)h(San)g(Jose,)2181 2914 y(USA,)d(Mar)g(2004.) + 2042 3005 y([35])29 b(C.)f(Lattner)i(and)f(V)-9 b(.)28 + b(Adv)o(e.)61 b(Transparent)30 b(Pointer)g(Compression)g(for)2181 + 3080 y(Link)o(ed)20 b(Data)f(Structures.)30 b(In)18 b + Fa(Pr)m(oc.)g(A)n(CM)g(W)-6 b(orkshop)19 b(on)g(Memory)g(System)2181 + 3155 y(P)-5 b(erformance)p Fj(,)18 b(Chicago,)h(IL,)d(Jun)g(2005.)2042 + 3246 y([36])29 b(D.)21 b(Liang)g(and)h(M.)e(J.)g(Harrold.)39 + b(Ef)n(\002cient)22 b(points-to)h(analysis)g(for)e(whole-)2181 + 3321 y(program)d(analysis.)26 b(In)17 b Fa(ESEC)f(/)h(SIGSOFT)f(FSE)p + Fj(,)g(pages)i(199\226215,)g(1999.)2042 3412 y([37])29 + b(D.)19 b(Liang)h(and)g(M.)f(J.)f(Harrold.)34 b(Ef)n(\002cient)21 + b(computation)h(of)d(parameterized)2181 3487 y(pointer)g(information)g + (for)f(interprocedural)j(analysis.)k(In)17 b Fa(SAS)p + Fj(,)g(July)g(2001.)2042 3578 y([38])29 b(E.)23 b(M.)f(Nystrom,)h + (H.-S.)f(Kim,)h(and)g(W)-6 b(.)22 b(mei)i(W)-6 b(.)22 + b(Hwu.)44 b(Bottom-up)24 b(and)2181 3653 y(top-do)n(wn)d(conte)o + (xt-sensiti)n(v)o(e)i(summary-based)d(pointer)h(analysis.)31 + b(In)18 b Fa(SAS)p Fj(,)2181 3728 y(2004.)2042 3819 y([39])29 + b(A.)13 b(Rogers,)h(M.)f(Carlisle,)i(J.)e(Repp)o(y)l(,)h(and)g(L.)e + (Hendren.)18 b(Supporting)e(dynamic)2181 3894 y(data)f(structures)h(on) + e(distrib)o(uted)i(memory)e(machines.)k Fa(T)o(OPLAS)p + Fj(,)12 b(17\(2\),)i(Mar)l(.)2181 3968 y(1995.)2042 4060 + y([40])29 b(P)-7 b(.)22 b(Rundber)o(g)j(and)f(F)-5 b(.)22 + b(W)-5 b(ar)o(g.)43 b(The)23 b(FreeBench)j(v1.0)d(Benchmark)i(Suite.) + 2181 4134 y Fg(http://www.freebench.o)q(rg)p Fj(,)e(Jan)17 + b(2002.)2042 4226 y([41])29 b(M.)21 b(L.)e(Seidl)j(and)g(B.)e(G.)g + (Zorn.)37 b(Se)o(gre)o(gating)23 b(heap)f(objects)h(by)e(reference)2181 + 4301 y(beha)o(vior)e(and)e(lifetime.)26 b(In)17 b Fa(ASPLOS-VIII)p + Fj(,)f(pages)h(12\22623,)g(San)g(Jose,)g(USA,)2181 4375 + y(1998.)2042 4467 y([42])29 b(R.)22 b(Shaham,)h(E.)e(Y)-7 + b(aha)o(v)l(,)22 b(E.)f(K.)g(K)n(olodner)m(,)j(and)e(M.)g(Sagi)n(v)l(.) + 41 b(Establishing)2181 4541 y(local)24 b(temporal)g(heap)e(safety)h + (properties)h(with)f(applications)i(to)d(compile-)2181 + 4616 y(time)c(memory)f(management.)26 b(In)17 b Fa(SAS)p + Fj(,)f(San)h(Die)o(go,)h(USA,)e(June)h(2003.)2042 4707 + y([43])29 b(B.)21 b(Steensgaard.)38 b(Points-to)23 b(analysis)f(in)f + (almost)h(linear)h(time.)37 b(In)20 b Fa(POPL)p Fj(,)2181 + 4782 y(pages)e(32\22641,)g(Jan)f(1996.)2042 4873 y([44])29 + b(M.)21 b(T)-5 b(ofte)21 b(and)g(L.)f(Birk)o(edal.)39 + b(A)21 b(re)o(gion)h(inference)i(algorithm.)39 b Fa(T)o(OPLAS)p + Fj(,)2181 4948 y(20\(4\):724\226768,)19 b(July)f(1998.)2042 + 5039 y([45])29 b(M.)19 b(T)-5 b(ofte)19 b(and)g(J.-P)-7 + b(.)17 b(T)-5 b(alpin.)31 b(Implementation)22 b(of)d(the)h(typed)g + (call-by-v)n(alue)2181 5114 y Ff(\025)p Fj(-calculus)g(using)e(a)f + (stack)h(of)f(re)o(gions.)25 b(In)17 b Fa(POPL)p Fj(,)e(pages)j + (188\226201,)f(1994.)2042 5205 y([46])29 b(C.)d(B.)f(Zilles.)53 + b(Benchmark)27 b(health)h(considered)g(harmful.)53 b + Fa(SIGARCH)2181 5280 y(Comput.)18 b(Ar)n(c)o(hit.)f(Ne)o(ws)p + Fj(,)g(29\(3\):4\2265,)h(2001.)p eop end + %%Trailer + + userdict /end-hook known{end-hook}if + %%EOF Index: llvm-www/pubs/index.html diff -u llvm-www/pubs/index.html:1.14 llvm-www/pubs/index.html:1.15 --- llvm-www/pubs/index.html:1.14 Thu Nov 4 06:20:40 2004 +++ llvm-www/pubs/index.html Wed Apr 20 23:46:11 2005 @@ -53,6 +53,13 @@
    +
  1. "Automatic Pool Allocation: +Improving Performance by Controlling Data Structure Layout in the Heap"
    +Chris Lattner and Vikram Adve. Proc. of the 2005 ACM SIGPLAN Conference on +Programming Language Design and Implementation (PLDI'05), Chicago, Illinois, +Jun, 2005.
  2. +
  3. "RubyComp - A Ruby-to-LLVM Compiler Prototype"
    Anders Alexandersson. Masters Thesis, Division of Computer Science at the Department of Informatics and Mathematics, From lattner at cs.uiuc.edu Wed Apr 20 23:52:54 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 20 Apr 2005 23:52:54 -0500 Subject: [llvm-commits] CVS: llvm/docs/WritingAnLLVMPass.html Message-ID: <200504210452.j3L4qsde024273@apoc.cs.uiuc.edu> Changes in directory llvm/docs: WritingAnLLVMPass.html updated: 1.38 -> 1.39 --- Log message: update to match build changes. --- Diffs of the changes: (+3 -3) WritingAnLLVMPass.html | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/docs/WritingAnLLVMPass.html diff -u llvm/docs/WritingAnLLVMPass.html:1.38 llvm/docs/WritingAnLLVMPass.html:1.39 --- llvm/docs/WritingAnLLVMPass.html:1.38 Mon Jan 10 23:16:23 2005 +++ llvm/docs/WritingAnLLVMPass.html Wed Apr 20 23:52:37 2005 @@ -1477,8 +1477,8 @@
     (gdb) break PassManager::run
     Breakpoint 1 at 0x2413bc: file Pass.cpp, line 70.
    -(gdb) run test.bc -load $(LLVMTOP)/llvm/lib/Debug/[libname].so -[passoption]
    -Starting program: opt test.bc -load $(LLVMTOP)/llvm/lib/Debug/[libname].so -[passoption]
    +(gdb) run test.bc -load $(LLVMTOP)/llvm/Debug/lib/[libname].so -[passoption]
    +Starting program: opt test.bc -load $(LLVMTOP)/llvm/Debug/lib/[libname].so -[passoption]
     Breakpoint 1, PassManager::run (this=0xffbef174, M=@0x70b298) at Pass.cpp:70
     70      bool PassManager::run(Module &M) { return PM->run(M); }
     (gdb)
    @@ -1593,7 +1593,7 @@
     
       Chris Lattner
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2005/01/11 05:16:23 $ + Last modified: $Date: 2005/04/21 04:52:37 $ From lattner at cs.uiuc.edu Wed Apr 20 23:54:12 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 20 Apr 2005 23:54:12 -0500 Subject: [llvm-commits] CVS: llvm/docs/WritingAnLLVMPass.html Message-ID: <200504210454.j3L4sCL9024302@apoc.cs.uiuc.edu> Changes in directory llvm/docs: WritingAnLLVMPass.html updated: 1.39 -> 1.40 --- Log message: Fix some broken links, taking care of PR554: http://llvm.cs.uiuc.edu/PR554 --- Diffs of the changes: (+7 -7) WritingAnLLVMPass.html | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) Index: llvm/docs/WritingAnLLVMPass.html diff -u llvm/docs/WritingAnLLVMPass.html:1.39 llvm/docs/WritingAnLLVMPass.html:1.40 --- llvm/docs/WritingAnLLVMPass.html:1.39 Wed Apr 20 23:52:37 2005 +++ llvm/docs/WritingAnLLVMPass.html Wed Apr 20 23:53:58 2005 @@ -242,7 +242,7 @@

    This declares a "Hello" class that is a subclass of FunctionPass. +href="http://llvm.cs.uiuc.edu/doxygen/classllvm_1_1FunctionPass.html">FunctionPass. The different builtin pass subclasses are described in detail later, but for now, know that FunctionPass's operate a function at a @@ -424,7 +424,7 @@

    The most plain and boring type of pass is the "ImmutablePass" +href="http://llvm.cs.uiuc.edu/doxygen/classllvm_1_1ImmutablePass.html">ImmutablePass" class. This pass type is used for passes that do not have to be run, do not change state, and never need to be updated. This is not a normal type of transformation or analysis, but can provide information about the current @@ -485,7 +485,7 @@

    The "CallGraphSCCPass" +href="http://llvm.cs.uiuc.edu/doxygen/classllvm_1_1CallGraphSCCPass.html">CallGraphSCCPass" is used by passes that need to traverse the program bottom-up on the call graph (callees before callers). Deriving from CallGraphSCCPass provides some mechanics for building and traversing the CallGraph, but also allows the system @@ -1011,9 +1011,9 @@

       // This is an example implementation from an analysis, which does not modify
       // the program at all, yet has a prerequisite.
    -  void PostDominanceFrontier::getAnalysisUsage(AnalysisUsage &AU) const {
    +  void PostDominanceFrontier::getAnalysisUsage(AnalysisUsage &AU) const {
         AU.setPreservesAll();
    -    AU.addRequired<PostDominatorTree>();
    +    AU.addRequired<PostDominatorTree>();
       }
     
    @@ -1267,7 +1267,7 @@ the LLVM program representation for a single function at a time, instead of traversing the entire program. It reduces the memory consumption of compiler, because, for example, only one DominatorSet +href="http://llvm.cs.uiuc.edu/doxygen/classllvm_1_1DominatorSet.html">DominatorSet needs to be calculated at a time. This also makes it possible some interesting enhancements in the future.

  4. @@ -1593,7 +1593,7 @@ Chris Lattner
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2005/04/21 04:52:37 $ + Last modified: $Date: 2005/04/21 04:53:58 $ From lattner at cs.uiuc.edu Wed Apr 20 23:59:03 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 20 Apr 2005 23:59:03 -0500 Subject: [llvm-commits] CVS: llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html Message-ID: <200504210459.j3L4x3AX024362@apoc.cs.uiuc.edu> Changes in directory llvm-www/pubs: 2005-05-21-PLDI-PoolAlloc.html updated: 1.1 -> 1.2 --- Log message: make this valid html and add the buttons --- Diffs of the changes: (+9 -2) 2005-05-21-PLDI-PoolAlloc.html | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) Index: llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html diff -u llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html:1.1 llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html:1.2 --- llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html:1.1 Wed Apr 20 23:46:11 2005 +++ llvm-www/pubs/2005-05-21-PLDI-PoolAlloc.html Wed Apr 20 23:58:46 2005 @@ -1,8 +1,8 @@ - - + + Automatic Pool Allocation: Improving Performance by Controlling Data Structure Layout in the Heap @@ -71,5 +71,12 @@ } + +
    + Valid CSS! + Valid HTML 4.01! + From lattner at cs.uiuc.edu Thu Apr 21 00:31:30 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 00:31:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/SimplifyCFG.cpp Message-ID: <200504210531.j3L5VUsm024755@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: SimplifyCFG.cpp updated: 1.67 -> 1.68 --- Log message: Teach simplifycfg that setcc is cheap and non-trapping, so that it can convert this: %tmp.1 = seteq int %i, 0 ; [#uses=1] br bool %tmp.1, label %shortcirc_done, label %shortcirc_next shortcirc_next: ; preds = %entry %tmp.4 = seteq int %j, 0 ; [#uses=1] br label %shortcirc_done shortcirc_done: ; preds = %shortcirc_next, %entry %shortcirc_val = phi bool [ %tmp.4, %shortcirc_next ], [ true, %entry ] ; [#uses=1] to this: %tmp.1 = seteq int %i, 0 ; [#uses=1] %tmp.4 = seteq int %j, 0 ; [#uses=1] %shortcirc_val = select bool %tmp.1, bool true, bool %tmp.4 ; [#uses=1] ... which is later simplified by instcombine into an or. --- Diffs of the changes: (+6 -0) SimplifyCFG.cpp | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp diff -u llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.67 llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.68 --- llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.67 Tue Apr 12 13:51:33 2005 +++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp Thu Apr 21 00:31:13 2005 @@ -232,6 +232,12 @@ case Instruction::Xor: case Instruction::Shl: case Instruction::Shr: + case Instruction::SetEQ: + case Instruction::SetNE: + case Instruction::SetLT: + case Instruction::SetGT: + case Instruction::SetLE: + case Instruction::SetGE: break; // These are all cheap and non-trapping instructions. } From lattner at cs.uiuc.edu Thu Apr 21 00:43:30 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 00:43:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp Message-ID: <200504210543.j3L5hUHv025279@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: InstructionCombining.cpp updated: 1.322 -> 1.323 --- Log message: Instcombine this: %shortcirc_val = select bool %tmp.1, bool true, bool %tmp.4 ; [#uses=1] %tmp.6 = cast bool %shortcirc_val to int ; [#uses=1] into this: %shortcirc_val = or bool %tmp.1, %tmp.4 ; [#uses=1] %tmp.6 = cast bool %shortcirc_val to int ; [#uses=1] not this: %tmp.4.cast = cast bool %tmp.4 to int ; [#uses=1] %tmp.6 = select bool %tmp.1, int 1, int %tmp.4.cast ; [#uses=1] --- Diffs of the changes: (+3 -0) InstructionCombining.cpp | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.322 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.323 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.322 Tue Apr 19 01:04:18 2005 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Thu Apr 21 00:43:13 2005 @@ -548,6 +548,9 @@ Value *FV = SI->getOperand(2); if (isa(TV) || isa(FV)) { + // Bool selects with constant operands can be folded to logical ops. + if (SI->getType() == Type::BoolTy) return 0; + Value *SelectTrueVal = FoldOperationIntoSelectOperand(Op, TV, IC); Value *SelectFalseVal = FoldOperationIntoSelectOperand(Op, FV, IC); From lattner at cs.uiuc.edu Thu Apr 21 01:12:57 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 01:12:57 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200504210612.j3L6CvmW026781@apoc.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.88 -> 1.89 --- Log message: Fold (x & 8) != 0 and (x & 8) == 8 into (x & 8) >> 3. This turns this PPC code: rlwinm r2, r3, 0, 28, 28 cmpwi cr7, r2, 8 mfcr r2 rlwinm r3, r2, 31, 31, 31 into this: rlwinm r2, r3, 0, 28, 28 srwi r2, r2, 3 rlwinm r3, r2, 0, 31, 31 Next up, nuking the extra and. --- Diffs of the changes: (+22 -0) SelectionDAG.cpp | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.88 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.89 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.88 Sun Apr 17 23:48:12 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Apr 21 01:12:41 2005 @@ -507,6 +507,28 @@ // FIXME: Implement the rest of these. + + // Fold bit comparisons when we can. + if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) && + VT == N1.getValueType() && N1.getOpcode() == ISD::AND) + if (ConstantSDNode *AndRHS = + dyn_cast(N1.getOperand(1))) { + if (Cond == ISD::SETNE && C2 == 0) {// (X & 8) != 0 --> (X & 8) >> 3 + // Perform the xform if the AND RHS is a single bit. + if ((AndRHS->getValue() & (AndRHS->getValue()-1)) == 0) { + return getNode(ISD::SRL, VT, N1, + getConstant(ExactLog2(AndRHS->getValue()), + TLI.getShiftAmountTy())); + } + } else if (Cond == ISD::SETEQ && C2 == AndRHS->getValue()) { + // (X & 8) == 8 --> (X & 8) >> 3 + // Perform the xform if C2 is a single bit. + if ((C2 & (C2-1)) == 0) { + return getNode(ISD::SRL, VT, N1, + getConstant(ExactLog2(C2),TLI.getShiftAmountTy())); + } + } + } } } else if (isa(N1.Val)) { // Ensure that the constant occurs on the RHS. From lattner at cs.uiuc.edu Thu Apr 21 01:28:32 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 01:28:32 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200504210628.j3L6SWPR027726@apoc.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.89 -> 1.90 --- Log message: Improve and elimination. On PPC, for: bool %test(int %X) { %Y = and int %X, 8 %Z = setne int %Y, 0 ret bool %Z } we now generate this: rlwinm r2, r3, 0, 28, 28 srwi r3, r2, 3 instead of this: rlwinm r2, r3, 0, 28, 28 srwi r2, r2, 3 rlwinm r3, r2, 0, 31, 31 I'll leave it to Nate to get it down to one instruction. :) --------------------------------------------------------------------- --- Diffs of the changes: (+26 -6) SelectionDAG.cpp | 32 ++++++++++++++++++++++++++------ 1 files changed, 26 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.89 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.90 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.89 Thu Apr 21 01:12:41 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Apr 21 01:28:15 2005 @@ -781,7 +781,7 @@ case ISD::AND: // (X & C1) & C2 == 0 iff C1 & C2 == 0. - if (ConstantSDNode *AndRHS = dyn_cast(Op.getOperand(0))) + if (ConstantSDNode *AndRHS = dyn_cast(Op.getOperand(1))) return MaskedValueIsZero(Op.getOperand(0),AndRHS->getValue() & Mask, TLI); // FALL THROUGH @@ -792,9 +792,23 @@ case ISD::SELECT: return MaskedValueIsZero(Op.getOperand(1), Mask, TLI) && MaskedValueIsZero(Op.getOperand(2), Mask, TLI); - - // TODO: (shl X, C1) & C2 == 0 iff (-1 << C1) & C2 == 0 - // TODO: (ushr X, C1) & C2 == 0 iff (-1 >> C1) & C2 == 0 + + case ISD::SRL: + // (ushr X, C1) & C2 == 0 iff X & (C2 << C1) == 0 + if (ConstantSDNode *ShAmt = dyn_cast(Op.getOperand(1))) { + uint64_t NewVal = Mask << ShAmt->getValue(); + SrcBits = MVT::getSizeInBits(Op.getValueType()); + if (SrcBits != 64) NewVal &= (1ULL << SrcBits)-1; + return MaskedValueIsZero(Op.getOperand(0), NewVal, TLI); + } + return false; + case ISD::SHL: + // (ushl X, C1) & C2 == 0 iff X & (C2 >> C1) == 0 + if (ConstantSDNode *ShAmt = dyn_cast(Op.getOperand(1))) { + uint64_t NewVal = Mask >> ShAmt->getValue(); + return MaskedValueIsZero(Op.getOperand(0), NewVal, TLI); + } + return false; default: break; } @@ -941,8 +955,14 @@ if (MaskedValueIsZero(N1, C2, TLI)) // X and 0 -> 0 return getConstant(0, VT); - if (MaskedValueIsZero(N1, ~C2, TLI)) - return N1; // if (X & ~C2) -> 0, the and is redundant + { + uint64_t NotC2 = ~C2; + if (VT != MVT::i64) + NotC2 &= (1ULL << MVT::getSizeInBits(VT))-1; + + if (MaskedValueIsZero(N1, NotC2, TLI)) + return N1; // if (X & ~C2) -> 0, the and is redundant + } // FIXME: Should add a corresponding version of this for // ZERO_EXTEND/SIGN_EXTEND by converting them to an ANY_EXTEND node which From alkis at cs.uiuc.edu Thu Apr 21 03:27:40 2005 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Thu, 21 Apr 2005 03:27:40 -0500 Subject: [llvm-commits] CVS: llvm-java/test/Programs/SingleSource/UnitTests/test.c Test.java Message-ID: <200504210827.DAA26369@zion.cs.uiuc.edu> Changes in directory llvm-java/test/Programs/SingleSource/UnitTests: test.c updated: 1.6 -> 1.7 Test.java updated: 1.9 -> 1.10 --- Log message: Add instance and static methods to test calling Java methods through JNI. --- Diffs of the changes: (+129 -1) Test.java | 30 +++++++++++++++++- test.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 1 deletion(-) Index: llvm-java/test/Programs/SingleSource/UnitTests/test.c diff -u llvm-java/test/Programs/SingleSource/UnitTests/test.c:1.6 llvm-java/test/Programs/SingleSource/UnitTests/test.c:1.7 --- llvm-java/test/Programs/SingleSource/UnitTests/test.c:1.6 Sat Apr 2 20:05:33 2005 +++ llvm-java/test/Programs/SingleSource/UnitTests/test.c Thu Apr 21 03:27:28 2005 @@ -138,3 +138,103 @@ b = (*env)->GetStaticByteField(env, clazz, id); Java_Test_println__I(env, clazz, b); } + +void Java_Test_printMethods(JNIEnv *env, jobject obj) +{ + jclass classTest; + jclass objClass; + jfieldID id; + jboolean z; + jint i; + jlong l; + jfloat f; + jdouble d; + jshort s; + jbyte b; + + classTest = (*env)->FindClass(env, "Test"); + if (!classTest) + printf("ERROR: Class Test not found!\n"); + + if (!(*env)->IsInstanceOf(env, obj, classTest)) + printf("ERROR: IsInstanceOf\n"); + objClass = (*env)->GetObjectClass(env, obj); + if (!(*env)->IsAssignableFrom(env, objClass, classTest)) + printf("ERROR: IsAssignableFrom\n"); + + id = (*env)->GetMethodID(env, objClass, "z", "()Z"); + z = (*env)->CallBooleanMethod(env, obj, id); + Java_Test_println__Z(env, objClass, z); + + id = (*env)->GetMethodID(env, objClass, "i", "(I)I"); + i = (*env)->CallIntMethod(env, obj, id, 2); + Java_Test_println__I(env, objClass, i); + + id = (*env)->GetMethodID(env, objClass, "j", "(BS)J"); + l = (*env)->CallLongMethod(env, obj, id, 23, 45); + Java_Test_println__J(env, objClass, l); + + id = (*env)->GetMethodID(env, objClass, "f", "(B)F"); + f = (*env)->CallFloatMethod(env, obj, id, 123); + Java_Test_println__F(env, objClass, f); + + id = (*env)->GetMethodID(env, objClass, "d", "(IJ)D"); + d = (*env)->CallDoubleMethod(env, obj, id, 654, 123ll); + Java_Test_println__D(env, objClass, d); + + id = (*env)->GetMethodID(env, objClass, "s", "(DB)S"); + s = (*env)->CallShortMethod(env, obj, id, 2.0, 123); + Java_Test_println__I(env, objClass, s); + + id = (*env)->GetMethodID(env, objClass, "b", "(SF)B"); + b = (*env)->CallByteMethod(env, obj, id, 23, -2.0); + Java_Test_println__I(env, objClass, b); +} + +void Java_Test_printStaticMethods(JNIEnv *env, jobject clazz) +{ + jclass classTest; + jfieldID id; + jboolean z; + jint i; + jlong l; + jfloat f; + jdouble d; + jshort s; + jbyte b; + + classTest = (*env)->FindClass(env, "Test"); + if (!classTest) + printf("ERROR: Class Test not found!\n"); + + if (!(*env)->IsAssignableFrom(env, clazz, classTest)) + printf("ERROR: IsAssignableFrom\n"); + + id = (*env)->GetStaticMethodID(env, clazz, "Z", "()Z"); + z = (*env)->CallStaticBooleanMethod(env, clazz, id); + Java_Test_println__Z(env, clazz, z); + + id = (*env)->GetStaticMethodID(env, clazz, "I", "(I)I"); + i = (*env)->CallStaticIntMethod(env, clazz, id, 2); + Java_Test_println__I(env, clazz, i); + + id = (*env)->GetStaticMethodID(env, clazz, "J", "(BS)J"); + l = (*env)->CallStaticLongMethod(env, clazz, id, 23, 45); + Java_Test_println__J(env, clazz, l); + + id = (*env)->GetStaticMethodID(env, clazz, "F", "(B)F"); + f = (*env)->CallStaticFloatMethod(env, clazz, id, 123); + Java_Test_println__F(env, clazz, f); + + id = (*env)->GetStaticMethodID(env, clazz, "D", "(IJ)D"); + d = (*env)->CallStaticDoubleMethod(env, clazz, id, 654, 12354123ll); + Java_Test_println__D(env, clazz, d); + + id = (*env)->GetStaticMethodID(env, clazz, "S", "(DB)S"); + s = (*env)->CallStaticShortMethod(env, clazz, id, 2.0, 123); + Java_Test_println__I(env, clazz, s); + + id = (*env)->GetStaticMethodID(env, clazz, "B", "(SF)B"); + b = (*env)->CallStaticByteMethod(env, clazz, id, 21, -58.0); + Java_Test_println__I(env, clazz, b); +} Index: llvm-java/test/Programs/SingleSource/UnitTests/Test.java diff -u llvm-java/test/Programs/SingleSource/UnitTests/Test.java:1.9 llvm-java/test/Programs/SingleSource/UnitTests/Test.java:1.10 --- llvm-java/test/Programs/SingleSource/UnitTests/Test.java:1.9 Sat Apr 2 20:05:33 2005 +++ llvm-java/test/Programs/SingleSource/UnitTests/Test.java Thu Apr 21 03:27:28 2005 @@ -1,5 +1,6 @@ public class Test { + // Fields to test JNI getFieldID and getField functions. public boolean z = false; public int i = 123; public long l = 1234567890123456789L; @@ -8,6 +9,7 @@ public short s = 456; public byte b = 78; + // Fields to test JNI getStaticFieldID and getStaticField functions. public static boolean Z = true; public static int I = 321; public static long L = 1234567890987654321L; @@ -16,6 +18,25 @@ public static short S = 654; public static byte B = 87; + // Methods to test JNI getMethodID and callMethod functions. + public boolean z() { return z; } + public int i(int ii) { return i + ii; } + public long j(byte bb, short ss) { return l + bb + ss; } + public float f(byte bb) { return f + bb; } + public double d(int ii, long ll) { return d + ii + ll; } + public short s(double dd, byte bb) { return (short) (s + dd + bb); } + public byte b(short ss, float ff) { return (byte)(B + ff + ss); } + + // Methods to test JNI getStaticMethodID and + // callStaticMethod functions. + public static boolean Z() { return Z; } + public static int I(int jj) { return I + jj; } + public static long J(byte bb, short ss) { return L + bb + ss; } + public static float F(byte bb) { return F + bb; } + public static double D(int ii, long ll) { return D + ii + ll; } + public static short S(double dd, byte bb) { return (short) (S + dd + bb); } + public static byte B(short ss, float ff) { return (byte)(B + ff + ss); } + static { System.loadLibrary("test"); } @@ -37,6 +58,8 @@ public native void printFields(); public static native void printStaticFields(); + public native void printMethods(); + public static native void printStaticMethods(); public static void main(String[] args) { println(true); @@ -51,8 +74,13 @@ println(-753.46); println(new byte[] { 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' }); println("Hello world"); - + println("Printing static fields:"); printStaticFields(); + println("Printing member fields:"); new Test().printFields(); + println("Calling static methods:"); + printStaticMethods(); + println("Calling member methods:"); + new Test().printMethods(); } } From lattner at cs.uiuc.edu Thu Apr 21 11:05:02 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:05:02 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Analysis/Interval.h Message-ID: <200504211605.j3LG52Xe029400@apoc.cs.uiuc.edu> Changes in directory llvm/include/llvm/Analysis: Interval.h updated: 1.18 -> 1.19 --- Log message: Improve doxygen documentation, patch contributed by Evan Jones! --- Diffs of the changes: (+31 -31) Interval.h | 62 ++++++++++++++++++++++++++++++------------------------------- 1 files changed, 31 insertions(+), 31 deletions(-) Index: llvm/include/llvm/Analysis/Interval.h diff -u llvm/include/llvm/Analysis/Interval.h:1.18 llvm/include/llvm/Analysis/Interval.h:1.19 --- llvm/include/llvm/Analysis/Interval.h:1.18 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/Analysis/Interval.h Thu Apr 21 11:04:44 2005 @@ -30,14 +30,14 @@ //===----------------------------------------------------------------------===// // -// Interval Class - An Interval is a set of nodes defined such that every node -// in the interval has all of its predecessors in the interval (except for the -// header) -// +/// Interval Class - An Interval is a set of nodes defined such that every node +/// in the interval has all of its predecessors in the interval (except for the +/// header) +/// class Interval { - // HeaderNode - The header BasicBlock, which dominates all BasicBlocks in this - // interval. Also, any loops in this interval must go through the HeaderNode. - // + /// HeaderNode - The header BasicBlock, which dominates all BasicBlocks in this + /// interval. Also, any loops in this interval must go through the HeaderNode. + /// BasicBlock *HeaderNode; public: typedef std::vector::iterator succ_iterator; @@ -53,22 +53,22 @@ inline BasicBlock *getHeaderNode() const { return HeaderNode; } - // Nodes - The basic blocks in this interval. - // + /// Nodes - The basic blocks in this interval. + /// std::vector Nodes; - // Successors - List of BasicBlocks that are reachable directly from nodes in - // this interval, but are not in the interval themselves. - // These nodes necessarily must be header nodes for other intervals. - // + /// Successors - List of BasicBlocks that are reachable directly from nodes in + /// this interval, but are not in the interval themselves. + /// These nodes necessarily must be header nodes for other intervals. + /// std::vector Successors; - // Predecessors - List of BasicBlocks that have this Interval's header block - // as one of their successors. - // + /// Predecessors - List of BasicBlocks that have this Interval's header block + /// as one of their successors. + /// std::vector Predecessors; - // contains - Find out if a basic block is in this interval + /// contains - Find out if a basic block is in this interval inline bool contains(BasicBlock *BB) const { for (unsigned i = 0; i < Nodes.size(); ++i) if (Nodes[i] == BB) return true; @@ -77,7 +77,7 @@ //return find(Nodes.begin(), Nodes.end(), BB) != Nodes.end(); } - // isSuccessor - find out if a basic block is a successor of this Interval + /// isSuccessor - find out if a basic block is a successor of this Interval inline bool isSuccessor(BasicBlock *BB) const { for (unsigned i = 0; i < Successors.size(); ++i) if (Successors[i] == BB) return true; @@ -86,24 +86,24 @@ //return find(Successors.begin(), Successors.end(), BB) != Successors.end(); } - // Equality operator. It is only valid to compare two intervals from the same - // partition, because of this, all we have to check is the header node for - // equality. - // + /// Equality operator. It is only valid to compare two intervals from the same + /// partition, because of this, all we have to check is the header node for + /// equality. + /// inline bool operator==(const Interval &I) const { return HeaderNode == I.HeaderNode; } - // isLoop - Find out if there is a back edge in this interval... + /// isLoop - Find out if there is a back edge in this interval... bool isLoop() const; - // print - Show contents in human readable format... + /// print - Show contents in human readable format... void print(std::ostream &O) const; }; -// succ_begin/succ_end - define methods so that Intervals may be used -// just like BasicBlocks can with the succ_* functions, and *::succ_iterator. -// +/// succ_begin/succ_end - define methods so that Intervals may be used +/// just like BasicBlocks can with the succ_* functions, and *::succ_iterator. +/// inline Interval::succ_iterator succ_begin(Interval *I) { return I->Successors.begin(); } @@ -111,9 +111,9 @@ return I->Successors.end(); } -// pred_begin/pred_end - define methods so that Intervals may be used -// just like BasicBlocks can with the pred_* functions, and *::pred_iterator. -// +/// pred_begin/pred_end - define methods so that Intervals may be used +/// just like BasicBlocks can with the pred_* functions, and *::pred_iterator. +/// inline Interval::pred_iterator pred_begin(Interval *I) { return I->Predecessors.begin(); } @@ -127,7 +127,7 @@ static NodeType *getEntryNode(Interval *I) { return I; } - // nodes_iterator/begin/end - Allow iteration over all nodes in the graph + /// nodes_iterator/begin/end - Allow iteration over all nodes in the graph static inline ChildIteratorType child_begin(NodeType *N) { return succ_begin(N); } From lattner at cs.uiuc.edu Thu Apr 21 11:05:03 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:05:03 -0500 Subject: [llvm-commits] CVS: llvm/lib/VMCore/BasicBlock.cpp Message-ID: <200504211605.j3LG53jZ029406@apoc.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: BasicBlock.cpp updated: 1.60 -> 1.61 --- Log message: Improve doxygen documentation, patch contributed by Evan Jones! --- Diffs of the changes: (+11 -11) BasicBlock.cpp | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) Index: llvm/lib/VMCore/BasicBlock.cpp diff -u llvm/lib/VMCore/BasicBlock.cpp:1.60 llvm/lib/VMCore/BasicBlock.cpp:1.61 --- llvm/lib/VMCore/BasicBlock.cpp:1.60 Tue Apr 12 13:52:14 2005 +++ llvm/lib/VMCore/BasicBlock.cpp Thu Apr 21 11:04:49 2005 @@ -195,17 +195,17 @@ } -// splitBasicBlock - This splits a basic block into two at the specified -// instruction. Note that all instructions BEFORE the specified iterator stay -// as part of the original basic block, an unconditional branch is added to -// the new BB, and the rest of the instructions in the BB are moved to the new -// BB, including the old terminator. This invalidates the iterator. -// -// Note that this only works on well formed basic blocks (must have a -// terminator), and 'I' must not be the end of instruction list (which would -// cause a degenerate basic block to be formed, having a terminator inside of -// the basic block). -// +/// splitBasicBlock - This splits a basic block into two at the specified +/// instruction. Note that all instructions BEFORE the specified iterator stay +/// as part of the original basic block, an unconditional branch is added to +/// the new BB, and the rest of the instructions in the BB are moved to the new +/// BB, including the old terminator. This invalidates the iterator. +/// +/// Note that this only works on well formed basic blocks (must have a +/// terminator), and 'I' must not be the end of instruction list (which would +/// cause a degenerate basic block to be formed, having a terminator inside of +/// the basic block). +/// BasicBlock *BasicBlock::splitBasicBlock(iterator I, const std::string &BBName) { assert(getTerminator() && "Can't use splitBasicBlock on degenerate BB!"); assert(I != InstList.end() && From lattner at cs.uiuc.edu Thu Apr 21 11:05:04 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:05:04 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/BasicBlockUtils.cpp Message-ID: <200504211605.j3LG54hM029412@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: BasicBlockUtils.cpp updated: 1.12 -> 1.13 --- Log message: Improve doxygen documentation, patch contributed by Evan Jones! --- Diffs of the changes: (+17 -17) BasicBlockUtils.cpp | 34 +++++++++++++++++----------------- 1 files changed, 17 insertions(+), 17 deletions(-) Index: llvm/lib/Transforms/Utils/BasicBlockUtils.cpp diff -u llvm/lib/Transforms/Utils/BasicBlockUtils.cpp:1.12 llvm/lib/Transforms/Utils/BasicBlockUtils.cpp:1.13 --- llvm/lib/Transforms/Utils/BasicBlockUtils.cpp:1.12 Sat Mar 5 13:05:20 2005 +++ llvm/lib/Transforms/Utils/BasicBlockUtils.cpp Thu Apr 21 11:04:48 2005 @@ -20,9 +20,9 @@ #include using namespace llvm; -// ReplaceInstWithValue - Replace all uses of an instruction (specified by BI) -// with a value, then remove and delete the original instruction. -// +/// ReplaceInstWithValue - Replace all uses of an instruction (specified by BI) +/// with a value, then remove and delete the original instruction. +/// void llvm::ReplaceInstWithValue(BasicBlock::InstListType &BIL, BasicBlock::iterator &BI, Value *V) { Instruction &I = *BI; @@ -40,10 +40,10 @@ } -// ReplaceInstWithInst - Replace the instruction specified by BI with the -// instruction specified by I. The original instruction is deleted and BI is -// updated to point to the new instruction. -// +/// ReplaceInstWithInst - Replace the instruction specified by BI with the +/// instruction specified by I. The original instruction is deleted and BI is +/// updated to point to the new instruction. +/// void llvm::ReplaceInstWithInst(BasicBlock::InstListType &BIL, BasicBlock::iterator &BI, Instruction *I) { assert(I->getParent() == 0 && @@ -59,21 +59,21 @@ BI = New; } -// ReplaceInstWithInst - Replace the instruction specified by From with the -// instruction specified by To. -// +/// ReplaceInstWithInst - Replace the instruction specified by From with the +/// instruction specified by To. +/// void llvm::ReplaceInstWithInst(Instruction *From, Instruction *To) { BasicBlock::iterator BI(From); ReplaceInstWithInst(From->getParent()->getInstList(), BI, To); } -// RemoveSuccessor - Change the specified terminator instruction such that its -// successor #SuccNum no longer exists. Because this reduces the outgoing -// degree of the current basic block, the actual terminator instruction itself -// may have to be changed. In the case where the last successor of the block is -// deleted, a return instruction is inserted in its place which can cause a -// surprising change in program behavior if it is not expected. -// +/// RemoveSuccessor - Change the specified terminator instruction such that its +/// successor #SuccNum no longer exists. Because this reduces the outgoing +/// degree of the current basic block, the actual terminator instruction itself +/// may have to be changed. In the case where the last successor of the block is +/// deleted, a return instruction is inserted in its place which can cause a +/// surprising change in program behavior if it is not expected. +/// void llvm::RemoveSuccessor(TerminatorInst *TI, unsigned SuccNum) { assert(SuccNum < TI->getNumSuccessors() && "Trying to remove a nonexistant successor!"); From lattner at cs.uiuc.edu Thu Apr 21 11:06:16 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:06:16 -0500 Subject: [llvm-commits] CVS: llvm/lib/VMCore/BasicBlock.cpp Message-ID: <200504211606.j3LG6GAM029481@apoc.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: BasicBlock.cpp updated: 1.61 -> 1.62 --- Log message: Improve doxygen, from part of Evan's patch that didn't apply. --- Diffs of the changes: (+6 -6) BasicBlock.cpp | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/lib/VMCore/BasicBlock.cpp diff -u llvm/lib/VMCore/BasicBlock.cpp:1.61 llvm/lib/VMCore/BasicBlock.cpp:1.62 --- llvm/lib/VMCore/BasicBlock.cpp:1.61 Thu Apr 21 11:04:49 2005 +++ llvm/lib/VMCore/BasicBlock.cpp Thu Apr 21 11:06:03 2005 @@ -128,12 +128,12 @@ return (PI == E) ? ThePred : 0 /*multiple preds*/; } -// removePredecessor - This method is used to notify a BasicBlock that the -// specified Predecessor of the block is no longer able to reach it. This is -// actually not used to update the Predecessor list, but is actually used to -// update the PHI nodes that reside in the block. Note that this should be -// called while the predecessor still refers to this block. -// +/// removePredecessor - This method is used to notify a BasicBlock that the +/// specified Predecessor of the block is no longer able to reach it. This is +/// actually not used to update the Predecessor list, but is actually used to +/// update the PHI nodes that reside in the block. Note that this should be +/// called while the predecessor still refers to this block. +/// void BasicBlock::removePredecessor(BasicBlock *Pred, bool DontDeleteUselessPHIs) { assert((hasNUsesOrMore(16)||// Reduce cost of this assertion for complex CFGs. From lattner at cs.uiuc.edu Thu Apr 21 11:09:16 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:09:16 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Analysis/DataStructure/DataStructure.h Message-ID: <200504211609.j3LG9G5H030610@apoc.cs.uiuc.edu> Changes in directory llvm/include/llvm/Analysis/DataStructure: DataStructure.h updated: 1.92 -> 1.93 --- Log message: add support for taking the address of free. --- Diffs of the changes: (+8 -4) DataStructure.h | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) Index: llvm/include/llvm/Analysis/DataStructure/DataStructure.h diff -u llvm/include/llvm/Analysis/DataStructure/DataStructure.h:1.92 llvm/include/llvm/Analysis/DataStructure/DataStructure.h:1.93 --- llvm/include/llvm/Analysis/DataStructure/DataStructure.h:1.92 Sat Apr 2 14:08:06 2005 +++ llvm/include/llvm/Analysis/DataStructure/DataStructure.h Thu Apr 21 11:08:59 2005 @@ -126,14 +126,17 @@ DSGraph &getDSGraph(const Function &F) const { hash_map::const_iterator I = DSInfo.find(const_cast(&F)); - assert(I != DSInfo.end() && "Function not in module!"); - return *I->second; + if (I != DSInfo.end()) + return *I->second; + return const_cast(this)-> + CreateGraphForExternalFunction(F); } DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } EquivalenceClasses &getGlobalECs() { return GlobalECs; } + DSGraph &CreateGraphForExternalFunction(const Function &F); /// deleteValue/copyValue - Interfaces to update the DSGraphs in the program. /// These correspond to the interfaces defined in the AliasAnalysis class. @@ -234,8 +237,9 @@ DSGraph &getDSGraph(const Function &F) const { hash_map::const_iterator I = DSInfo.find(const_cast(&F)); - assert(I != DSInfo.end() && "Function not in module!"); - return *I->second; + if (I != DSInfo.end()) return *I->second; + return const_cast(this)-> + getOrCreateDSGraph(const_cast(F)); } DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } From lattner at cs.uiuc.edu Thu Apr 21 11:09:57 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:09:57 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp Message-ID: <200504211609.j3LG9vdJ030630@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/DataStructure: BottomUpClosure.cpp updated: 1.112 -> 1.113 --- Log message: add support for taking and resolving the address of free. --- Diffs of the changes: (+31 -2) BottomUpClosure.cpp | 33 +++++++++++++++++++++++++++++++-- 1 files changed, 31 insertions(+), 2 deletions(-) Index: llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp diff -u llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.112 llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.113 --- llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.112 Fri Mar 25 10:45:43 2005 +++ llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp Thu Apr 21 11:09:43 2005 @@ -19,6 +19,7 @@ #include "llvm/Module.h" #include "llvm/ADT/Statistic.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/Timer.h" using namespace llvm; namespace { @@ -172,7 +173,8 @@ std::set ECGlobals; BuildGlobalECs(*GlobalsGraph, ECGlobals); if (!ECGlobals.empty()) { - DEBUG(std::cerr << "Eliminating " << ECGlobals.size() << " EC Globals!\n"); + NamedRegionTimer X("Bottom-UP EC Cleanup"); + std::cerr << "Eliminating " << ECGlobals.size() << " EC Globals!\n"; for (hash_map::iterator I = DSInfo.begin(), E = DSInfo.end(); I != E; ++I) EliminateUsesOfECGlobals(*I->second, ECGlobals); @@ -225,7 +227,8 @@ return F->getName() == "printf" || F->getName() == "sscanf" || F->getName() == "fprintf" || F->getName() == "open" || F->getName() == "sprintf" || F->getName() == "fputs" || - F->getName() == "fscanf"; + F->getName() == "fscanf" || F->getName() == "malloc" || + F->getName() == "free"; } static bool isResolvableFunc(const Function* callee) { @@ -404,6 +407,32 @@ GlobalsGraph = 0; } +DSGraph &BUDataStructures::CreateGraphForExternalFunction(const Function &Fn) { + Function *F = const_cast(&Fn); + DSGraph *DSG = new DSGraph(GlobalECs, GlobalsGraph->getTargetData()); + DSInfo[F] = DSG; + DSG->setGlobalsGraph(GlobalsGraph); + DSG->setPrintAuxCalls(); + + // Add function to the graph. + DSG->getReturnNodes().insert(std::make_pair(F, DSNodeHandle())); + + if (F->getName() == "free") { // Taking the address of free. + + // Free should take a single pointer argument, mark it as heap memory. + DSNode *N = new DSNode(0, DSG); + N->setHeapNodeMarker(); + DSG->getNodeForValue(F->arg_begin()).mergeWith(N); + + } else { + std::cerr << "Unrecognized external function: " << F->getName() << "\n"; + abort(); + } + + return *DSG; +} + + void BUDataStructures::calculateGraph(DSGraph &Graph) { // Move our call site list into TempFCs so that inline call sites go into the // new call site list and doesn't invalidate our iterators! From lattner at cs.uiuc.edu Thu Apr 21 11:10:16 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:10:16 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/GlobalValue.h Message-ID: <200504211610.j3LGAGe7030645@apoc.cs.uiuc.edu> Changes in directory llvm/include/llvm: GlobalValue.h updated: 1.21 -> 1.22 --- Log message: Add doxygen comments, patch contributed by Evan Jones. --- Diffs of the changes: (+6 -6) GlobalValue.h | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/include/llvm/GlobalValue.h diff -u llvm/include/llvm/GlobalValue.h:1.21 llvm/include/llvm/GlobalValue.h:1.22 --- llvm/include/llvm/GlobalValue.h:1.21 Fri Jan 28 18:32:30 2005 +++ llvm/include/llvm/GlobalValue.h Thu Apr 21 11:10:03 2005 @@ -28,12 +28,12 @@ GlobalValue(const GlobalValue &); // do not implement public: enum LinkageTypes { - ExternalLinkage, // Externally visible function - LinkOnceLinkage, // Keep one copy of named function when linking (inline) - WeakLinkage, // Keep one copy of named function when linking (weak) - AppendingLinkage, // Special purpose, only applies to global arrays - InternalLinkage, // Rename collisions when linking (static functions) - GhostLinkage // Stand-in functions for streaming fns from BC files + ExternalLinkage, /// Externally visible function + LinkOnceLinkage, /// Keep one copy of named function when linking (inline) + WeakLinkage, /// Keep one copy of named function when linking (weak) + AppendingLinkage, /// Special purpose, only applies to global arrays + InternalLinkage, /// Rename collisions when linking (static functions) + GhostLinkage /// Stand-in functions for streaming fns from BC files }; protected: GlobalValue(const Type *Ty, ValueTy vty, Use *Ops, unsigned NumOps, From lattner at cs.uiuc.edu Thu Apr 21 11:10:52 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:10:52 -0500 Subject: [llvm-commits] CVS: llvm-poolalloc/test/Makefile Message-ID: <200504211610.j3LGAqMc030663@apoc.cs.uiuc.edu> Changes in directory llvm-poolalloc/test: Makefile updated: 1.30 -> 1.31 --- Log message: add an option to disable stable numbers --- Diffs of the changes: (+10 -3) Makefile | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) Index: llvm-poolalloc/test/Makefile diff -u llvm-poolalloc/test/Makefile:1.30 llvm-poolalloc/test/Makefile:1.31 --- llvm-poolalloc/test/Makefile:1.30 Sat Apr 2 13:53:52 2005 +++ llvm-poolalloc/test/Makefile Thu Apr 21 11:10:39 2005 @@ -11,6 +11,13 @@ LEVEL = .. include $(LEVEL)/Makefile.common +ifndef NO_STABLE_NUMBERS +STABLERUN := GET_STABLE_NUMBERS=1 +else +STABLERUN := +endif + + LARGE_PROBLEM_SIZE_DIRS := \ MultiSource/Benchmarks/llubenchmark \ MultiSource/Benchmarks/FreeBench \ @@ -143,7 +150,7 @@ test:: (cd $(LLVM_OBJ_ROOT)/projects/llvm-test/$(SUBDIR); \ PROJECT_DIR=$(PROJ_OBJ_ROOT) $(MAKE) -j1 TEST=poolalloc \ - GET_STABLE_NUMBERS=1 report report.html) + $(STABLERUN) report report.html) @printf "\a"; sleep 1; printf "\a"; sleep 1; printf "\a" pacompiletime:: @@ -155,7 +162,7 @@ ptrcomp:: (cd $(LLVM_OBJ_ROOT)/projects/llvm-test/$(SUBDIR); \ PROJECT_DIR=$(PROJ_OBJ_ROOT) $(MAKE) -j1 TEST=ptrcomp \ - GET_STABLE_NUMBERS=1 report report.html) + $(STABLERUN) report report.html) @printf "\a"; sleep 1; printf "\a"; sleep 1; printf "\a" vtl:: @@ -173,7 +180,7 @@ optzn:: (cd $(LLVM_OBJ_ROOT)/projects/llvm-test/$(SUBDIR); \ PROJECT_DIR=$(PROJ_OBJ_ROOT) $(MAKE) -j1 TEST=optzn \ - GET_STABLE_NUMBERS=1 test report report.csv) + $(STABLERUN) test report report.csv) @printf "\a"; sleep 1; printf "\a"; sleep 1; printf "\a" p4perf:: From lattner at cs.uiuc.edu Thu Apr 21 11:11:12 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:11:12 -0500 Subject: [llvm-commits] CVS: llvm-poolalloc/test/TEST.optzn.Makefile TEST.optzn.report TEST.pacompiletime.report TEST.poolalloc.Makefile TEST.poolalloc.report Message-ID: <200504211611.j3LGBCxR030687@apoc.cs.uiuc.edu> Changes in directory llvm-poolalloc/test: TEST.optzn.Makefile updated: 1.1 -> 1.2 TEST.optzn.report updated: 1.1 -> 1.2 TEST.pacompiletime.report updated: 1.1 -> 1.2 TEST.poolalloc.Makefile updated: 1.38 -> 1.39 TEST.poolalloc.report updated: 1.25 -> 1.26 --- Log message: tweak a bunch of reports --- Diffs of the changes: (+112 -58) TEST.optzn.Makefile | 84 ++++++++++++++++++++++++++++++++-------------- TEST.optzn.report | 2 - TEST.pacompiletime.report | 4 +- TEST.poolalloc.Makefile | 48 +++++++++++++------------- TEST.poolalloc.report | 32 +++++++++++++---- 5 files changed, 112 insertions(+), 58 deletions(-) Index: llvm-poolalloc/test/TEST.optzn.Makefile diff -u llvm-poolalloc/test/TEST.optzn.Makefile:1.1 llvm-poolalloc/test/TEST.optzn.Makefile:1.2 --- llvm-poolalloc/test/TEST.optzn.Makefile:1.1 Thu Nov 11 04:13:00 2004 +++ llvm-poolalloc/test/TEST.optzn.Makefile Thu Apr 21 11:10:58 2005 @@ -21,12 +21,12 @@ RELDIR := $(subst $(PROGDIR),,$(CURDIR)) # Pool allocator pass shared object -PA_SO := $(PROJECT_DIR)/lib/Debug/libpoolalloc$(SHLIBEXT) +PA_SO := $(PROJECT_DIR)/Debug/lib/poolalloc$(SHLIBEXT) # Pool allocator runtime library #PA_RT := $(PROJECT_DIR)/lib/Bytecode/libpoolalloc_fl_rt.bc #PA_RT_O := $(PROJECT_DIR)/lib/$(CONFIGURATION)/poolalloc_rt.o -PA_RT_O := $(PROJECT_DIR)/lib/Release/poolalloc_rt.o +PA_RT_O := $(PROJECT_DIR)/Release/lib/poolalloc_rt.o #PA_RT_O := $(PROJECT_DIR)/lib/Release/poolalloc_fl_rt.o # Command to run opt with the pool allocator pass loaded @@ -36,11 +36,17 @@ # output to a file. OPT_PA_STATS = $(OPT_PA) -info-output-file=$(CURDIR)/$@.info -stats -time-passes -OPTZN_PASSES := -globaldce -ipconstprop -deadargelim -adce -instcombine -simplifycfg +OPTZN_PASSES := -globaldce -ipsccp -deadargelim -adce -instcombine -simplifycfg # This rule runs the pool allocator on the .llvm.bc file to produce a new .bc # file +$(PROGRAMS_TO_TEST:%=Output/%.$(TEST).basepa.bc): \ +Output/%.$(TEST).basepa.bc: Output/%.llvm.bc $(PA_SO) $(LOPT) + - at rm -f $(CURDIR)/$@.info + -$(OPT_PA_STATS) -poolalloc -poolalloc-disable-alignopt -poolalloc-heuristic=AllNodes $(EXTRA_PA_FLAGS) $(OPTZN_PASSES) $< -o $@ -f 2>&1 > $@.out + + $(PROGRAMS_TO_TEST:%=Output/%.$(TEST).selectivepa.bc): \ Output/%.$(TEST).selectivepa.bc: Output/%.llvm.bc $(PA_SO) $(LOPT) - at rm -f $(CURDIR)/$@.info @@ -49,22 +55,26 @@ $(PROGRAMS_TO_TEST:%=Output/%.$(TEST).bumpptr.bc): \ Output/%.$(TEST).bumpptr.bc: Output/%.llvm.bc $(PA_SO) $(LOPT) - at rm -f $(CURDIR)/$@.info - -$(OPT_PA_STATS) -poolalloc $(OPTZN_PASSES) $< -o $@ -f 2>&1 > $@.out + -$(OPT_PA_STATS) -poolalloc $(EXTRA_PA_FLAGS) $(OPTZN_PASSES) $< -o $@ -f 2>&1 > $@.out -$(PROGRAMS_TO_TEST:%=Output/%.$(TEST).basepa.bc): \ -Output/%.$(TEST).basepa.bc: Output/%.llvm.bc $(PA_SO) $(LOPT) +$(PROGRAMS_TO_TEST:%=Output/%.$(TEST).align.bc): \ +Output/%.$(TEST).align.bc: Output/%.llvm.bc $(PA_SO) $(LOPT) - at rm -f $(CURDIR)/$@.info - -$(OPT_PA_STATS) -poolalloc -poolalloc-heuristic=AllNodes -poolalloc-force-all-poolfrees $(OPTZN_PASSES) $< -o $@ -f 2>&1 > $@.out + -$(OPT_PA_STATS) -poolalloc -poolalloc-disable-alignopt $(EXTRA_PA_FLAGS) $(OPTZN_PASSES) -pooloptimize $< -o $@ -f 2>&1 > $@.out $(PROGRAMS_TO_TEST:%=Output/%.$(TEST).freeelim.bc): \ Output/%.$(TEST).freeelim.bc: Output/%.llvm.bc $(PA_SO) $(LOPT) - at rm -f $(CURDIR)/$@.info - -$(OPT_PA_STATS) -poolalloc -poolalloc-force-all-poolfrees $(OPTZN_PASSES) -pooloptimize $< -o $@ -f 2>&1 > $@.out + -$(OPT_PA_STATS) -poolalloc -poolalloc-force-all-poolfrees $(EXTRA_PA_FLAGS) $(OPTZN_PASSES) -pooloptimize $< -o $@ -f 2>&1 > $@.out # This rule compiles the new .bc file into a .c file using CBE +$(PROGRAMS_TO_TEST:%=Output/%.basepa.cbe.c): \ +Output/%.basepa.cbe.c: Output/%.$(TEST).basepa.bc $(LLC) + -$(LLC) -march=c -f $< -o $@ + $(PROGRAMS_TO_TEST:%=Output/%.selectivepa.cbe.c): \ Output/%.selectivepa.cbe.c: Output/%.$(TEST).selectivepa.bc $(LLC) -$(LLC) -march=c -f $< -o $@ @@ -73,8 +83,8 @@ Output/%.bumpptr.cbe.c: Output/%.$(TEST).bumpptr.bc $(LLC) -$(LLC) -march=c -f $< -o $@ -$(PROGRAMS_TO_TEST:%=Output/%.basepa.cbe.c): \ -Output/%.basepa.cbe.c: Output/%.$(TEST).basepa.bc $(LLC) +$(PROGRAMS_TO_TEST:%=Output/%.align.cbe.c): \ +Output/%.align.cbe.c: Output/%.$(TEST).align.bc $(LLC) -$(LLC) -march=c -f $< -o $@ $(PROGRAMS_TO_TEST:%=Output/%.freeelim.cbe.c): \ @@ -83,6 +93,10 @@ +$(PROGRAMS_TO_TEST:%=Output/%.basepa.cbe): \ +Output/%.basepa.cbe: Output/%.basepa.cbe.c $(PA_RT_O) + -$(CC) $(CFLAGS) $< $(PA_RT_O) $(LLCLIBS) $(LDFLAGS) -o $@ + $(PROGRAMS_TO_TEST:%=Output/%.selectivepa.cbe): \ Output/%.selectivepa.cbe: Output/%.selectivepa.cbe.c $(PA_RT_O) -$(CC) $(CFLAGS) $< $(PA_RT_O) $(LLCLIBS) $(LDFLAGS) -o $@ @@ -91,8 +105,8 @@ Output/%.bumpptr.cbe: Output/%.bumpptr.cbe.c $(PA_RT_O) -$(CC) $(CFLAGS) $< $(PA_RT_O) $(LLCLIBS) $(LDFLAGS) -o $@ -$(PROGRAMS_TO_TEST:%=Output/%.basepa.cbe): \ -Output/%.basepa.cbe: Output/%.basepa.cbe.c $(PA_RT_O) +$(PROGRAMS_TO_TEST:%=Output/%.align.cbe): \ +Output/%.align.cbe: Output/%.align.cbe.c $(PA_RT_O) -$(CC) $(CFLAGS) $< $(PA_RT_O) $(LLCLIBS) $(LDFLAGS) -o $@ $(PROGRAMS_TO_TEST:%=Output/%.freeelim.cbe): \ @@ -105,6 +119,10 @@ # This rule runs the generated executable, generating timing information, for # normal test programs +$(PROGRAMS_TO_TEST:%=Output/%.basepa.out-cbe): \ +Output/%.basepa.out-cbe: Output/%.basepa.cbe + -$(RUNSAFELY) $(STDIN_FILENAME) $@ $< $(RUN_OPTIONS) + $(PROGRAMS_TO_TEST:%=Output/%.selectivepa.out-cbe): \ Output/%.selectivepa.out-cbe: Output/%.selectivepa.cbe -$(RUNSAFELY) $(STDIN_FILENAME) $@ $< $(RUN_OPTIONS) @@ -113,8 +131,8 @@ Output/%.bumpptr.out-cbe: Output/%.bumpptr.cbe -$(RUNSAFELY) $(STDIN_FILENAME) $@ $< $(RUN_OPTIONS) -$(PROGRAMS_TO_TEST:%=Output/%.basepa.out-cbe): \ -Output/%.basepa.out-cbe: Output/%.basepa.cbe +$(PROGRAMS_TO_TEST:%=Output/%.align.out-cbe): \ +Output/%.align.out-cbe: Output/%.align.cbe -$(RUNSAFELY) $(STDIN_FILENAME) $@ $< $(RUN_OPTIONS) $(PROGRAMS_TO_TEST:%=Output/%.freeelim.out-cbe): \ @@ -125,6 +143,14 @@ # This rule runs the generated executable, generating timing information, for # SPEC +$(PROGRAMS_TO_TEST:%=Output/%.basepa.out-cbe): \ +Output/%.basepa.out-cbe: Output/%.basepa.cbe + -$(SPEC_SANDBOX) basepacbe-$(RUN_TYPE) $@ $(REF_IN_DIR) \ + $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ + ../../$< $(RUN_OPTIONS) + -(cd Output/basepacbe-$(RUN_TYPE); cat $(LOCAL_OUTPUTS)) > $@ + -cp Output/basepacbe-$(RUN_TYPE)/$(STDOUT_FILENAME).time $@.time + $(PROGRAMS_TO_TEST:%=Output/%.selectivepa.out-cbe): \ Output/%.selectivepa.out-cbe: Output/%.selectivepa.cbe -$(SPEC_SANDBOX) selectivepacbe-$(RUN_TYPE) $@ $(REF_IN_DIR) \ @@ -141,13 +167,13 @@ -(cd Output/bumpptrcbe-$(RUN_TYPE); cat $(LOCAL_OUTPUTS)) > $@ -cp Output/bumpptrcbe-$(RUN_TYPE)/$(STDOUT_FILENAME).time $@.time -$(PROGRAMS_TO_TEST:%=Output/%.basepa.out-cbe): \ -Output/%.basepa.out-cbe: Output/%.basepa.cbe - -$(SPEC_SANDBOX) basepacbe-$(RUN_TYPE) $@ $(REF_IN_DIR) \ +$(PROGRAMS_TO_TEST:%=Output/%.align.out-cbe): \ +Output/%.align.out-cbe: Output/%.align.cbe + -$(SPEC_SANDBOX) aligncbe-$(RUN_TYPE) $@ $(REF_IN_DIR) \ $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ ../../$< $(RUN_OPTIONS) - -(cd Output/basepacbe-$(RUN_TYPE); cat $(LOCAL_OUTPUTS)) > $@ - -cp Output/basepacbe-$(RUN_TYPE)/$(STDOUT_FILENAME).time $@.time + -(cd Output/aligncbe-$(RUN_TYPE); cat $(LOCAL_OUTPUTS)) > $@ + -cp Output/aligncbe-$(RUN_TYPE)/$(STDOUT_FILENAME).time $@.time $(PROGRAMS_TO_TEST:%=Output/%.freeelim.out-cbe): \ Output/%.freeelim.out-cbe: Output/%.freeelim.cbe @@ -162,6 +188,11 @@ # This rule diffs the post-poolallocated version to make sure we didn't break # the program! +$(PROGRAMS_TO_TEST:%=Output/%.basepa.diff-cbe): \ +Output/%.basepa.diff-cbe: Output/%.out-nat Output/%.basepa.out-cbe + @cp Output/$*.out-nat Output/$*.basepa.out-nat + -$(DIFFPROG) cbe $*.basepa $(HIDEDIFF) + $(PROGRAMS_TO_TEST:%=Output/%.selectivepa.diff-cbe): \ Output/%.selectivepa.diff-cbe: Output/%.out-nat Output/%.selectivepa.out-cbe @cp Output/$*.out-nat Output/$*.selectivepa.out-nat @@ -172,10 +203,10 @@ @cp Output/$*.out-nat Output/$*.bumpptr.out-nat -$(DIFFPROG) cbe $*.bumpptr $(HIDEDIFF) -$(PROGRAMS_TO_TEST:%=Output/%.basepa.diff-cbe): \ -Output/%.basepa.diff-cbe: Output/%.out-nat Output/%.basepa.out-cbe - @cp Output/$*.out-nat Output/$*.basepa.out-nat - -$(DIFFPROG) cbe $*.basepa $(HIDEDIFF) +$(PROGRAMS_TO_TEST:%=Output/%.align.diff-cbe): \ +Output/%.align.diff-cbe: Output/%.out-nat Output/%.align.out-cbe + @cp Output/$*.out-nat Output/$*.align.out-nat + -$(DIFFPROG) cbe $*.align $(HIDEDIFF) $(PROGRAMS_TO_TEST:%=Output/%.freeelim.diff-cbe): \ Output/%.freeelim.diff-cbe: Output/%.out-nat Output/%.freeelim.out-cbe @@ -188,9 +219,10 @@ # generated from. $(PROGRAMS_TO_TEST:%=Output/%.$(TEST).report.txt): \ Output/%.$(TEST).report.txt: Output/%.out-nat \ + Output/%.basepa.diff-cbe \ Output/%.selectivepa.diff-cbe \ Output/%.bumpptr.diff-cbe \ - Output/%.basepa.diff-cbe \ + Output/%.align.diff-cbe \ Output/%.freeelim.diff-cbe \ Output/%.LOC.txt @echo > $@ @@ -198,6 +230,10 @@ printf "CBE-RUN-TIME-BASEPA: " >> $@;\ grep "^program" Output/$*.basepa.out-cbe.time >> $@;\ fi + @-if test -f Output/$*.align.diff-cbe; then \ + printf "CBE-RUN-TIME-ALIGN: " >> $@;\ + grep "^program" Output/$*.align.out-cbe.time >> $@;\ + fi @-if test -f Output/$*.freeelim.diff-cbe; then \ printf "CBE-RUN-TIME-FREEELIM: " >> $@;\ grep "^program" Output/$*.freeelim.out-cbe.time >> $@;\ Index: llvm-poolalloc/test/TEST.optzn.report diff -u llvm-poolalloc/test/TEST.optzn.report:1.1 llvm-poolalloc/test/TEST.optzn.report:1.2 --- llvm-poolalloc/test/TEST.optzn.report:1.1 Thu Nov 11 04:13:00 2004 +++ llvm-poolalloc/test/TEST.optzn.report Thu Apr 21 11:10:58 2005 @@ -65,10 +65,10 @@ [], # Times ["BasePA", 'CBE-RUN-TIME-BASEPA: program\s*([.0-9m:]+)', \&FormatTime], - [], ["NoSelectivePA", 'CBE-RUN-TIME-SELECTIVEPA: program\s*([.0-9m:]+)', \&FormatTime], ["NoFreeElim", 'CBE-RUN-TIME-FREEELIM: program\s*([.0-9m:]+)', \&FormatTime], ["NoBumpPtr", 'CBE-RUN-TIME-BUMPPTR: program\s*([.0-9m:]+)', \&FormatTime], + ["NoAlign", 'CBE-RUN-TIME-ALIGN: program\s*([.0-9m:]+)', \&FormatTime], [] ); Index: llvm-poolalloc/test/TEST.pacompiletime.report diff -u llvm-poolalloc/test/TEST.pacompiletime.report:1.1 llvm-poolalloc/test/TEST.pacompiletime.report:1.2 --- llvm-poolalloc/test/TEST.pacompiletime.report:1.1 Sat Apr 2 13:53:52 2005 +++ llvm-poolalloc/test/TEST.pacompiletime.report Thu Apr 21 11:10:58 2005 @@ -49,9 +49,11 @@ ["LOC", "${USERSYSTTIME}Local"], ["BU", "${USERSYSTTIME}Bottom-up"], ["TD", "${USERSYSTTIME}Top-down"], + ["DSASUM", sub { return SumCols(@_, 3); }], + [], ["COM", "${USERSYSTTIME}'Complete'"], ["EQ", "${USERSYSTTIME}Equivalence"], - ["DSASUM", sub { return SumCols(@_, 5); }], + ["EBUSUM", sub { return SumCols(@_, 2); }], [], ["PA Time", "${USERSYSTTIME}Pool allocate"], [] Index: llvm-poolalloc/test/TEST.poolalloc.Makefile diff -u llvm-poolalloc/test/TEST.poolalloc.Makefile:1.38 llvm-poolalloc/test/TEST.poolalloc.Makefile:1.39 --- llvm-poolalloc/test/TEST.poolalloc.Makefile:1.38 Mon Apr 11 16:34:36 2005 +++ llvm-poolalloc/test/TEST.poolalloc.Makefile Thu Apr 21 11:10:58 2005 @@ -46,10 +46,10 @@ - at rm -f $(CURDIR)/$@.info -$(OPT_PA_STATS) -poolalloc $(EXTRA_PA_FLAGS) $(OPTZN_PASSES) -pooloptimize $< -o $@ -f 2>&1 > $@.out -$(PROGRAMS_TO_TEST:%=Output/%.$(TEST).allnodes.bc): \ -Output/%.$(TEST).allnodes.bc: Output/%.llvm.bc $(PA_SO) $(LOPT) +$(PROGRAMS_TO_TEST:%=Output/%.$(TEST).basepa.bc): \ +Output/%.$(TEST).basepa.bc: Output/%.llvm.bc $(PA_SO) $(LOPT) - at rm -f $(CURDIR)/$@.info - -$(OPT_PA_STATS) -poolalloc -poolalloc-heuristic=AllNodes $(OPTZN_PASSES) -pooloptimize $< -o $@ -f 2>&1 > $@.out + -$(OPT_PA_STATS) -poolalloc -poolalloc-disable-alignopt -poolalloc-force-all-poolfrees -poolalloc-heuristic=AllNodes $(OPTZN_PASSES) $< -o $@ -f 2>&1 > $@.out $(PROGRAMS_TO_TEST:%=Output/%.$(TEST).mallocrepl.bc): \ @@ -72,8 +72,8 @@ Output/%.poolalloc.cbe.c: Output/%.$(TEST).poolalloc.bc $(LLC) -$(LLC) -march=c -f $< -o $@ -$(PROGRAMS_TO_TEST:%=Output/%.allnodes.cbe.c): \ -Output/%.allnodes.cbe.c: Output/%.$(TEST).allnodes.bc $(LLC) +$(PROGRAMS_TO_TEST:%=Output/%.basepa.cbe.c): \ +Output/%.basepa.cbe.c: Output/%.$(TEST).basepa.bc $(LLC) -$(LLC) -march=c -f $< -o $@ $(PROGRAMS_TO_TEST:%=Output/%.mallocrepl.cbe.c): \ @@ -94,8 +94,8 @@ Output/%.poolalloc.cbe: Output/%.poolalloc.cbe.c $(PA_RT_O) -$(CC) $(CFLAGS) $< $(PA_RT_O) $(LLCLIBS) $(LDFLAGS) -o $@ -$(PROGRAMS_TO_TEST:%=Output/%.allnodes.cbe): \ -Output/%.allnodes.cbe: Output/%.allnodes.cbe.c $(PA_RT_O) +$(PROGRAMS_TO_TEST:%=Output/%.basepa.cbe): \ +Output/%.basepa.cbe: Output/%.basepa.cbe.c $(PA_RT_O) -$(CC) $(CFLAGS) $< $(PA_RT_O) $(LLCLIBS) $(LDFLAGS) -o $@ $(PROGRAMS_TO_TEST:%=Output/%.mallocrepl.cbe): \ @@ -120,8 +120,8 @@ Output/%.poolalloc.out-cbe: Output/%.poolalloc.cbe -$(RUNSAFELY) $(STDIN_FILENAME) $@ $< $(RUN_OPTIONS) -$(PROGRAMS_TO_TEST:%=Output/%.allnodes.out-cbe): \ -Output/%.allnodes.out-cbe: Output/%.allnodes.cbe +$(PROGRAMS_TO_TEST:%=Output/%.basepa.out-cbe): \ +Output/%.basepa.out-cbe: Output/%.basepa.cbe -$(RUNSAFELY) $(STDIN_FILENAME) $@ $< $(RUN_OPTIONS) $(PROGRAMS_TO_TEST:%=Output/%.mallocrepl.out-cbe): \ @@ -147,13 +147,13 @@ -(cd Output/poolalloccbe-$(RUN_TYPE); cat $(LOCAL_OUTPUTS)) > $@ -cp Output/poolalloccbe-$(RUN_TYPE)/$(STDOUT_FILENAME).time $@.time -$(PROGRAMS_TO_TEST:%=Output/%.allnodes.out-cbe): \ -Output/%.allnodes.out-cbe: Output/%.allnodes.cbe - -$(SPEC_SANDBOX) allnodescbe-$(RUN_TYPE) $@ $(REF_IN_DIR) \ +$(PROGRAMS_TO_TEST:%=Output/%.basepa.out-cbe): \ +Output/%.basepa.out-cbe: Output/%.basepa.cbe + -$(SPEC_SANDBOX) basepacbe-$(RUN_TYPE) $@ $(REF_IN_DIR) \ $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ ../../$< $(RUN_OPTIONS) - -(cd Output/allnodescbe-$(RUN_TYPE); cat $(LOCAL_OUTPUTS)) > $@ - -cp Output/allnodescbe-$(RUN_TYPE)/$(STDOUT_FILENAME).time $@.time + -(cd Output/basepacbe-$(RUN_TYPE); cat $(LOCAL_OUTPUTS)) > $@ + -cp Output/basepacbe-$(RUN_TYPE)/$(STDOUT_FILENAME).time $@.time $(PROGRAMS_TO_TEST:%=Output/%.mallocrepl.out-cbe): \ Output/%.mallocrepl.out-cbe: Output/%.mallocrepl.cbe @@ -189,10 +189,10 @@ @cp Output/$*.out-nat Output/$*.poolalloc.out-nat -$(DIFFPROG) cbe $*.poolalloc $(HIDEDIFF) -$(PROGRAMS_TO_TEST:%=Output/%.allnodes.diff-cbe): \ -Output/%.allnodes.diff-cbe: Output/%.out-nat Output/%.allnodes.out-cbe - @cp Output/$*.out-nat Output/$*.allnodes.out-nat - -$(DIFFPROG) cbe $*.allnodes $(HIDEDIFF) +$(PROGRAMS_TO_TEST:%=Output/%.basepa.diff-cbe): \ +Output/%.basepa.diff-cbe: Output/%.out-nat Output/%.basepa.out-cbe + @cp Output/$*.out-nat Output/$*.basepa.out-nat + -$(DIFFPROG) cbe $*.basepa $(HIDEDIFF) $(PROGRAMS_TO_TEST:%=Output/%.mallocrepl.diff-cbe): \ Output/%.mallocrepl.diff-cbe: Output/%.out-nat Output/%.mallocrepl.out-cbe @@ -216,7 +216,7 @@ Output/%.$(TEST).report.txt: Output/%.out-nat \ Output/%.nonpa.diff-cbe \ Output/%.poolalloc.diff-cbe \ - Output/%.allnodes.diff-cbe \ + Output/%.basepa.diff-cbe \ Output/%.mallocrepl.diff-cbe \ Output/%.onlyoverhead.diff-cbe \ Output/%.LOC.txt @@ -237,9 +237,9 @@ printf "CBE-RUN-TIME-ONLYOVERHEAD: " >> $@;\ grep "^program" Output/$*.onlyoverhead.out-cbe.time >> $@;\ fi - @-if test -f Output/$*.allnodes.diff-cbe; then \ - printf "CBE-RUN-TIME-ALLNODES: " >> $@;\ - grep "^program" Output/$*.allnodes.out-cbe.time >> $@;\ + @-if test -f Output/$*.basepa.diff-cbe; then \ + printf "CBE-RUN-TIME-BASEPA: " >> $@;\ + grep "^program" Output/$*.basepa.out-cbe.time >> $@;\ fi @-if test -f Output/$*.poolalloc.diff-cbe; then \ printf "CBE-RUN-TIME-POOLALLOC: " >> $@;\ @@ -247,8 +247,8 @@ fi printf "LOC: " >> $@ cat Output/$*.LOC.txt >> $@ - @cat Output/$*.$(TEST).allnodes.bc.info >> $@ - @#cat Output/$*.$(TEST).allnodes.bc.out >> $@ + @cat Output/$*.$(TEST).poolalloc.bc.info >> $@ + @#cat Output/$*.$(TEST).basepa.bc.out >> $@ $(PROGRAMS_TO_TEST:%=test.$(TEST).%): \ Index: llvm-poolalloc/test/TEST.poolalloc.report diff -u llvm-poolalloc/test/TEST.poolalloc.report:1.25 llvm-poolalloc/test/TEST.poolalloc.report:1.26 --- llvm-poolalloc/test/TEST.poolalloc.report:1.25 Thu Nov 11 04:13:00 2004 +++ llvm-poolalloc/test/TEST.poolalloc.report Thu Apr 21 11:10:58 2005 @@ -35,12 +35,6 @@ my $PTRDIST = 'MultiSource/Benchmarks/Ptrdist'; @LatexRowMapOrder = ( - "anagram/anagram" => 'anagram', - "bc/bc" => 'bc', - "ft/ft" => 'ft', - "ks/ks" => 'ks', - "yacr2/yacr2" => 'yacr2', - '-' => '-', '164.gzip/164.gzip' => '164.gzip', '175.vpr/175.vpr' => '175.vpr', '181.mcf/181.mcf' => '181.mcf', @@ -51,7 +45,27 @@ '256.bzip2/256.bzip2' => '256.bzip2', '300.twolf/300.twolf' => '300.twolf', '-' => '-', + "anagram/anagram" => 'anagram', + "bc/bc" => 'bc', + "ft/ft" => 'ft', + "ks/ks" => 'ks', + "yacr2/yacr2" => 'yacr2', + '-' => '-', "analyzer" => 'analyzer', + "neural" => 'neural', + "pcompress2" => 'pcompress2', + "piff2" => 'piff2', + '-' => '-', + "bh/bh" => 'bh', + "bisort/bisort" => 'bisort', + "em3d/em3d" => 'em3d', + "health/health" => 'health', + "mst/mst" => 'mst', + "perimeter/perimeter" => 'perimeter', + "power/power" => 'power', + "treeadd/treeadd" => 'treeadd', + "tsp/tsp" => 'tsp', + '-' => '-', "llu" => 'llu-bench', ); @@ -77,13 +91,15 @@ ["PA Time", 'CBE-RUN-TIME-POOLALLOC: program\s*([.0-9m:]+)', \&FormatTime], ["PA run%", \&RuntimePercent], [], - ["AllNodes", 'CBE-RUN-TIME-ALLNODES: program\s*([.0-9m:]+)', \&FormatTime], - ["AN run%", \&RuntimePercent], + ["Basepa", 'CBE-RUN-TIME-BASEPA: program\s*([.0-9m:]+)', \&FormatTime], + ["Base run%", \&RuntimePercent], [], ["NumPools", '([0-9]+).*Number of pools allocated'], ["Typesafe", '([0-9]+).*Number of typesafe pools'], ["BumpPtr", '([0-9]+).*Number of bump pointer pools'], + ["PFE", '([0-9]+).*Number of poolfree.s elided'], ["NumArgs", '([0-9]+).*Number of function arguments added'], + ["MaxArgs", '([0-9]+).*Maximum function arguments added'], #["Nonprofit", '([0-9]+).*Number of DSNodes not profitable'], [] ); From reid at x10sys.com Thu Apr 21 11:12:15 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 21 Apr 2005 11:12:15 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/System/Process.h Message-ID: <200504211612.LAA05619@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/System: Process.h updated: 1.5 -> 1.6 --- Log message: Add two new methods for getting the User Id and Group Id values for the current process. --- Diffs of the changes: (+10 -0) Process.h | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/include/llvm/System/Process.h diff -u llvm/include/llvm/System/Process.h:1.5 llvm/include/llvm/System/Process.h:1.6 --- llvm/include/llvm/System/Process.h:1.5 Sat Jan 8 14:15:57 2005 +++ llvm/include/llvm/System/Process.h Thu Apr 21 11:12:04 2005 @@ -63,6 +63,16 @@ ///< Returns the current amount of system time for the process ); + /// This static function will return the process' current user id number. + /// Not all operating systems support this feature. Where it is not + /// supported, the function should return 65536 as the value. + static int GetCurrentUserId(); + + /// This static function will return the process' current group id number. + /// Not all operating systems support this feature. Where it is not + /// supported, the function should return 65536 as the value. + static int GetCurrentGroupId(); + /// This function makes the necessary calls to the operating system to /// prevent core files or any other kind of large memory dumps that can /// occur when a program fails. From reid at x10sys.com Thu Apr 21 11:13:08 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 21 Apr 2005 11:13:08 -0500 Subject: [llvm-commits] CVS: llvm/lib/System/Win32/Process.inc Message-ID: <200504211613.LAA05656@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Win32: Process.inc updated: 1.10 -> 1.11 --- Log message: Provide an implementation of the GetCurrentUserId and GetCurrentGroupId methods that were recently added to the interface. --- Diffs of the changes: (+10 -0) Process.inc | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/lib/System/Win32/Process.inc diff -u llvm/lib/System/Win32/Process.inc:1.10 llvm/lib/System/Win32/Process.inc:1.11 --- llvm/lib/System/Win32/Process.inc:1.10 Fri Feb 18 21:01:13 2005 +++ llvm/lib/System/Win32/Process.inc Thu Apr 21 11:12:57 2005 @@ -91,6 +91,16 @@ sys_time.nanoseconds( unsigned(KernelTime % 10000000) * 100 ); } +int Process::GetCurrentUserId() +{ + return 65536; +} + +int Process::GetCurrentGroupId() +{ + return 65536; +} + // Some LLVM programs such as bugpoint produce core files as a normal part of // their operation. To prevent the disk from filling up, this configuration item // does what's necessary to prevent their generation. From reid at x10sys.com Thu Apr 21 11:13:08 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 21 Apr 2005 11:13:08 -0500 Subject: [llvm-commits] CVS: llvm/lib/System/Unix/Process.inc Message-ID: <200504211613.LAA05660@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Unix: Process.inc updated: 1.9 -> 1.10 --- Log message: Provide an implementation of the GetCurrentUserId and GetCurrentGroupId methods that were recently added to the interface. --- Diffs of the changes: (+10 -0) Process.inc | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/lib/System/Unix/Process.inc diff -u llvm/lib/System/Unix/Process.inc:1.9 llvm/lib/System/Unix/Process.inc:1.10 --- llvm/lib/System/Unix/Process.inc:1.9 Sat Jan 8 14:15:57 2005 +++ llvm/lib/System/Unix/Process.inc Thu Apr 21 11:12:57 2005 @@ -109,6 +109,16 @@ #endif } +int Process::GetCurrentUserId() +{ + return getuid(); +} + +int Process::GetCurrentGroupId() +{ + return getgid(); +} + // Some LLVM programs such as bugpoint produce core files as a normal part of // their operation. To prevent the disk from filling up, this function // does what's necessary to prevent their generation. From reid at x10sys.com Thu Apr 21 11:15:30 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 21 Apr 2005 11:15:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Archive/ArchiveWriter.cpp Message-ID: <200504211615.LAA05751@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Archive: ArchiveWriter.cpp updated: 1.16 -> 1.17 --- Log message: Eliminate calls to system dependent function getuid by using the newly implemented sys::Process::GetCurrentUserId function. Replace similarly for getgid. --- Diffs of the changes: (+3 -2) ArchiveWriter.cpp | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm/lib/Bytecode/Archive/ArchiveWriter.cpp diff -u llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.16 llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.17 --- llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.16 Tue Apr 19 22:55:35 2005 +++ llvm/lib/Bytecode/Archive/ArchiveWriter.cpp Thu Apr 21 11:15:19 2005 @@ -15,6 +15,7 @@ #include "llvm/Bytecode/Reader.h" #include "llvm/Support/Compressor.h" #include "llvm/System/Signals.h" +#include "llvm/System/Process.h" #include #include #include @@ -320,9 +321,9 @@ char buffer[32]; sprintf(buffer, "%-8o", 0644); memcpy(Hdr.mode,buffer,8); - sprintf(buffer, "%-6u", getuid()); + sprintf(buffer, "%-6u", sys::Process::GetCurrentUserId()); memcpy(Hdr.uid,buffer,6); - sprintf(buffer, "%-6u", getgid()); + sprintf(buffer, "%-6u", sys::Process::GetCurrentGroupId()); memcpy(Hdr.gid,buffer,6); sprintf(buffer,"%-12u", unsigned(secondsSinceEpoch)); memcpy(Hdr.date,buffer,12); From lattner at cs.uiuc.edu Thu Apr 21 11:47:02 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 11:47:02 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/LowerSetJmp.cpp Message-ID: <200504211647.j3LGl2dP031542@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: LowerSetJmp.cpp updated: 1.22 -> 1.23 --- Log message: Fix a bug where we would not promote calls to invokes if they occured in the same block as the setjmp. Thanks to Greg Pettyjohn for noticing this! --- Diffs of the changes: (+5 -3) LowerSetJmp.cpp | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/IPO/LowerSetJmp.cpp diff -u llvm/lib/Transforms/IPO/LowerSetJmp.cpp:1.22 llvm/lib/Transforms/IPO/LowerSetJmp.cpp:1.23 --- llvm/lib/Transforms/IPO/LowerSetJmp.cpp:1.22 Fri Jan 28 18:38:45 2005 +++ llvm/lib/Transforms/IPO/LowerSetJmp.cpp Thu Apr 21 11:46:46 2005 @@ -238,8 +238,7 @@ // "llvm.{setjmp,longjmp}" functions and none of the setjmp/longjmp error // handling functions (beginning with __llvm_sjljeh_...they don't throw // exceptions). -bool LowerSetJmp::IsTransformableFunction(const std::string& Name) -{ +bool LowerSetJmp::IsTransformableFunction(const std::string& Name) { std::string SJLJEh("__llvm_sjljeh"); if (Name.size() > SJLJEh.size()) @@ -407,7 +406,10 @@ BasicBlock* SetJmpContBlock = ABlock->splitBasicBlock(Inst); assert(SetJmpContBlock && "Couldn't split setjmp BB!!"); - SetJmpContBlock->setName("SetJmpContBlock"); + SetJmpContBlock->setName(ABlock->getName()+"SetJmpCont"); + + // Add the SetJmpContBlock to the set of blocks reachable from a setjmp. + DFSBlocks.insert(SetJmpContBlock); // This PHI node will be in the new block created from the // splitBasicBlock call. From lattner at cs.uiuc.edu Thu Apr 21 12:38:20 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 12:38:20 -0500 Subject: [llvm-commits] CVS: llvm-test/MultiSource/Applications/kimwitu++/Makefile Message-ID: <200504211738.j3LHcKMZ001204@apoc.cs.uiuc.edu> Changes in directory llvm-test/MultiSource/Applications/kimwitu++: Makefile updated: 1.5 -> 1.6 --- Log message: don't let kc++ clobber its own files when it runs the test. This means that I can finally run the test multiple times now! :) --- Diffs of the changes: (+1 -1) Makefile | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/MultiSource/Applications/kimwitu++/Makefile diff -u llvm-test/MultiSource/Applications/kimwitu++/Makefile:1.5 llvm-test/MultiSource/Applications/kimwitu++/Makefile:1.6 --- llvm-test/MultiSource/Applications/kimwitu++/Makefile:1.5 Sat Jan 15 21:16:10 2005 +++ llvm-test/MultiSource/Applications/kimwitu++/Makefile Thu Apr 21 12:38:04 2005 @@ -3,6 +3,6 @@ CPPFLAGS=-I$(PROJ_SRC_DIR) -DYYDEBUG=1 LDFLAGS = -lstdc++ LIBS += -lstdc++ -RUN_OPTIONS = -o -v -s kcc $(PROJ_SRC_DIR)/inputs/f3.k $(PROJ_SRC_DIR)/inputs/f2.k $(PROJ_SRC_DIR)/inputs/f1.k +RUN_OPTIONS = -f test -o -v -s kcc $(PROJ_SRC_DIR)/inputs/f3.k $(PROJ_SRC_DIR)/inputs/f2.k $(PROJ_SRC_DIR)/inputs/f1.k include ../../Makefile.multisrc From reid at x10sys.com Thu Apr 21 12:50:08 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 21 Apr 2005 12:50:08 -0500 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Archive/Archive.cpp Message-ID: <200504211750.MAA06380@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Archive: Archive.cpp updated: 1.6 -> 1.7 --- Log message: Use the actual uid/gid for defaulting the fields in the archive. --- Diffs of the changes: (+3 -2) Archive.cpp | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm/lib/Bytecode/Archive/Archive.cpp diff -u llvm/lib/Bytecode/Archive/Archive.cpp:1.6 llvm/lib/Bytecode/Archive/Archive.cpp:1.7 --- llvm/lib/Bytecode/Archive/Archive.cpp:1.6 Thu Jan 27 19:17:07 2005 +++ llvm/lib/Bytecode/Archive/Archive.cpp Thu Apr 21 12:49:57 2005 @@ -14,6 +14,7 @@ #include "ArchiveInternals.h" #include "llvm/ModuleProvider.h" +#include "llvm/System/Process.h" using namespace llvm; @@ -40,8 +41,8 @@ ArchiveMember::ArchiveMember() : next(0), prev(0), parent(0), path(""), flags(0), data(0) { - info.user = 1000; - info.group = 1000; + info.user = sys::Process::GetCurrentUserId(); + info.group = sys::Process::GetCurrentGroupId(); info.mode = 0777; info.fileSize = 0; info.modTime = sys::TimeValue::now(); From lattner at cs.uiuc.edu Thu Apr 21 14:03:41 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 14:03:41 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelPattern.cpp Message-ID: <200504211903.j3LJ3fjH002285@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelPattern.cpp updated: 1.105 -> 1.106 --- Log message: Handle (store &GV -> mem) as a store immediate. This often occurs for printf format strings and other stuff. Instead of generating this: movl $l1__2E_str_1, %eax movl %eax, (%esp) we now emit: movl $l1__2E_str_1, (%esp) --- Diffs of the changes: (+14 -0) X86ISelPattern.cpp | 14 ++++++++++++++ 1 files changed, 14 insertions(+) Index: llvm/lib/Target/X86/X86ISelPattern.cpp diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.105 llvm/lib/Target/X86/X86ISelPattern.cpp:1.106 --- llvm/lib/Target/X86/X86ISelPattern.cpp:1.105 Tue Apr 12 22:29:53 2005 +++ llvm/lib/Target/X86/X86ISelPattern.cpp Thu Apr 21 14:03:24 2005 @@ -3120,6 +3120,20 @@ addFullAddress(BuildMI(BB, Opc, 4+1), AM).addImm(CN->getValue()); return; } + } else if (GlobalAddressSDNode *GA = + dyn_cast(N.getOperand(1))) { + assert(GA->getValueType(0) == MVT::i32 && "Bad pointer operand"); + + if (getRegPressure(N.getOperand(0)) > getRegPressure(N.getOperand(2))) { + Select(N.getOperand(0)); + SelectAddress(N.getOperand(2), AM); + } else { + SelectAddress(N.getOperand(2), AM); + Select(N.getOperand(0)); + } + addFullAddress(BuildMI(BB, X86::MOV32mi, 4+1), + AM).addGlobalAddress(GA->getGlobal()); + return; } // Check to see if this is a load/op/store combination. From lattner at cs.uiuc.edu Thu Apr 21 14:11:20 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 14:11:20 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelSimple.cpp Message-ID: <200504211911.j3LJBKoX004299@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelSimple.cpp updated: 1.312 -> 1.313 --- Log message: Handle stores of global address as stores of immediates. Instead of: test1: movl $N, %eax movl %eax, G ret emit: test1: movl $N, G ret --- Diffs of the changes: (+5 -0) X86ISelSimple.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/Target/X86/X86ISelSimple.cpp diff -u llvm/lib/Target/X86/X86ISelSimple.cpp:1.312 llvm/lib/Target/X86/X86ISelSimple.cpp:1.313 --- llvm/lib/Target/X86/X86ISelSimple.cpp:1.312 Sat Apr 9 10:23:56 2005 +++ llvm/lib/Target/X86/X86ISelSimple.cpp Thu Apr 21 14:11:03 2005 @@ -1620,6 +1620,9 @@ } else if (Args[i].Val && isa(Args[i].Val)) { addRegOffset(BuildMI(BB, X86::MOV32mi, 5), X86::ESP, ArgOffset).addImm(0); + } else if (Args[i].Val && isa(Args[i].Val)) { + addRegOffset(BuildMI(BB, X86::MOV32mi, 5), X86::ESP, ArgOffset) + .addGlobalAddress(cast(Args[i].Val)); } else { ArgReg = Args[i].Val ? getReg(Args[i].Val) : Args[i].Reg; addRegOffset(BuildMI(BB, X86::MOV32mr, 5), @@ -3311,6 +3314,8 @@ } } else if (isa(I.getOperand(0))) { addFullAddress(BuildMI(BB, X86::MOV32mi, 5), AM).addImm(0); + } else if (GlobalValue *GV = dyn_cast(I.getOperand(0))) { + addFullAddress(BuildMI(BB, X86::MOV32mi, 5), AM).addGlobalAddress(GV); } else if (ConstantBool *CB = dyn_cast(I.getOperand(0))) { addFullAddress(BuildMI(BB, X86::MOV8mi, 5), AM).addImm(CB->getValue()); } else if (ConstantFP *CFP = dyn_cast(I.getOperand(0))) { From brukman at cs.uiuc.edu Thu Apr 21 14:12:18 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 14:12:18 -0500 Subject: [llvm-commits] CVS: llvm-www/Features.html Message-ID: <200504211912.OAA07085@zion.cs.uiuc.edu> Changes in directory llvm-www: Features.html updated: 1.14 -> 1.15 --- Log message: * LLVM is not a new "public release", it's been public for quite some time now * PowerPC has a JIT * New backends now exist: Alpha and IA-64 * Minor formatting changes: wrap long lines and delete extraneous whitespace --- Diffs of the changes: (+15 -14) Features.html | 29 +++++++++++++++-------------- 1 files changed, 15 insertions(+), 14 deletions(-) Index: llvm-www/Features.html diff -u llvm-www/Features.html:1.14 llvm-www/Features.html:1.15 --- llvm-www/Features.html:1.14 Thu Oct 14 22:05:24 2004 +++ llvm-www/Features.html Thu Apr 21 14:12:07 2005 @@ -1,8 +1,7 @@
    LLVM Features
    -

    The public release of LLVM is a fully functional -release of our compiler system for C and C++. As such, it includes the +

    The LLVM compiler system for C and C++ includes the following:

      @@ -11,27 +10,29 @@ includes a front-end for "Stacker", a Forth-like language. -
    • A stable implementation of the LLVM instruction set, which serves +
    • A stable implementation of the LLVM instruction set, which serves as both the online and offline code representation, together with assembly (ASCII) and bytecode (binary) readers and writers, and a verifier.
    • -
    • A powerful pass-management system that automatically sequences passes +
    • A powerful pass-management system that automatically sequences passes (including analysis, transformation, and code-generation passes) based on their dependences, and pipelines them for efficiency.
    • -
    • A wide range of global scalar optimizations.
    • +
    • A wide range of global scalar optimizations.
    • -
    • A link-time interprocedural optimization framework with a rich set of +
    • A link-time interprocedural optimization framework with a rich set of analyses and transformations, including sophisticated whole-program pointer analysis, call graph construction, and support for profile-guided optimizations.
    • -
    • Native code generators for x86, Sparc, and PowerPC.
    • +
    • Static native code generators for x86, Sparc, PowerPC, Alpha, and + IA-64.
    • -
    • A Just-In-Time (JIT) code generation system for x86 and Sparc.
    • +
    • A Just-In-Time (JIT) code generation system for x86, Sparc, and + PowerPC.
    • A C back-end useful for testing and for generating native code on targets - other than X86, Sparc, and PowerPC.
    • + other than the ones listed above.
    • A profiling system similar to gprof.
    • @@ -49,7 +50,8 @@
    • LLVM uses a simple low-level language with strictly defined semantics.
    • -
    • It includes front-ends for C, +
    • It includes front-ends for C, C++, and Stacker (a forth-like language). Front-ends for Java, Scheme, and other languages are in development.
    • @@ -65,10 +67,9 @@
    • LLVM has full support for accurate garbage collection.
    • -
    • It includes native code generators for X86, Sparc, and PowerPC (the X86 and - Sparc works as JIT or static compilers, PowerPC just provides a static compiler - so far). LLVM can also compile to C code, for portability. Other native - backends are in development.
    • +
    • It includes native code generators for X86, Sparc, PowerPC, Alpha, and + IA-64. LLVM can also compile to C code on targets where it does not have + native back-end support. Other native backends are in development.
    • LLVM has extensive documentation and has hosted many projects of various sorts.
    • From brukman at cs.uiuc.edu Thu Apr 21 15:12:04 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:12:04 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/AbstractTypeUser.h Argument.h BasicBlock.h CallGraphSCCPass.h Constant.h Constants.h DerivedTypes.h Function.h GlobalValue.h GlobalVariable.h InstrTypes.h Instruction.h Instructions.h IntrinsicInst.h Intrinsics.h Linker.h Module.h ModuleProvider.h PassAnalysisSupport.h Pass.h PassManager.h PassSupport.h SymbolTable.h SymbolTableListTraits.h Type.h Use.h User.h Value.h Message-ID: <200504212012.PAA00325@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: AbstractTypeUser.h updated: 1.23 -> 1.24 Argument.h updated: 1.10 -> 1.11 BasicBlock.h updated: 1.52 -> 1.53 CallGraphSCCPass.h updated: 1.6 -> 1.7 Constant.h updated: 1.22 -> 1.23 Constants.h updated: 1.69 -> 1.70 DerivedTypes.h updated: 1.66 -> 1.67 Function.h updated: 1.63 -> 1.64 GlobalValue.h updated: 1.22 -> 1.23 GlobalVariable.h updated: 1.32 -> 1.33 InstrTypes.h updated: 1.42 -> 1.43 Instruction.h updated: 1.66 -> 1.67 Instructions.h updated: 1.15 -> 1.16 IntrinsicInst.h updated: 1.5 -> 1.6 Intrinsics.h updated: 1.29 -> 1.30 Linker.h updated: 1.14 -> 1.15 Module.h updated: 1.60 -> 1.61 ModuleProvider.h updated: 1.10 -> 1.11 PassAnalysisSupport.h updated: 1.18 -> 1.19 Pass.h updated: 1.50 -> 1.51 PassManager.h updated: 1.12 -> 1.13 PassSupport.h updated: 1.20 -> 1.21 SymbolTable.h updated: 1.49 -> 1.50 SymbolTableListTraits.h updated: 1.4 -> 1.5 Type.h updated: 1.74 -> 1.75 Use.h updated: 1.11 -> 1.12 User.h updated: 1.34 -> 1.35 Value.h updated: 1.75 -> 1.76 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+297 -297) AbstractTypeUser.h | 6 +- Argument.h | 6 +- BasicBlock.h | 14 +++--- CallGraphSCCPass.h | 4 - Constant.h | 8 +-- Constants.h | 30 ++++++------- DerivedTypes.h | 34 +++++++-------- Function.h | 14 +++--- GlobalValue.h | 10 ++-- GlobalVariable.h | 10 ++-- InstrTypes.h | 20 ++++----- Instruction.h | 14 +++--- Instructions.h | 52 ++++++++++++------------ IntrinsicInst.h | 18 ++++---- Intrinsics.h | 4 - Linker.h | 104 ++++++++++++++++++++++++------------------------ Module.h | 10 ++-- ModuleProvider.h | 12 ++--- Pass.h | 4 - PassAnalysisSupport.h | 10 ++-- PassManager.h | 6 +- PassSupport.h | 16 +++---- SymbolTable.h | 72 ++++++++++++++++----------------- SymbolTableListTraits.h | 6 +- Type.h | 54 ++++++++++++------------ Use.h | 12 ++--- User.h | 14 +++--- Value.h | 30 ++++++------- 28 files changed, 297 insertions(+), 297 deletions(-) Index: llvm/include/llvm/AbstractTypeUser.h diff -u llvm/include/llvm/AbstractTypeUser.h:1.23 llvm/include/llvm/AbstractTypeUser.h:1.24 --- llvm/include/llvm/AbstractTypeUser.h:1.23 Wed Oct 27 11:14:47 2004 +++ llvm/include/llvm/AbstractTypeUser.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/AbstractTypeUser.h - AbstractTypeUser Interface ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // The AbstractTypeUser class is an interface to be implemented by classes who @@ -79,7 +79,7 @@ void removeUser(); public: // ctor - Add use to type if abstract. Note that Ty must not be null - inline PATypeHandle(const Type *ty, AbstractTypeUser *user) + inline PATypeHandle(const Type *ty, AbstractTypeUser *user) : Ty(ty), User(user) { addUser(); } Index: llvm/include/llvm/Argument.h diff -u llvm/include/llvm/Argument.h:1.10 llvm/include/llvm/Argument.h:1.11 --- llvm/include/llvm/Argument.h:1.10 Sat Mar 5 13:51:20 2005 +++ llvm/include/llvm/Argument.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/Argument.h - Definition of the Argument class ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the Argument class, which represents an incoming formal @@ -41,7 +41,7 @@ inline const Function *getParent() const { return Parent; } inline Function *getParent() { return Parent; } - + // getNext/Prev - Return the next or previous argument in the list. Argument *getNext() { return Next; } const Argument *getNext() const { return Next; } Index: llvm/include/llvm/BasicBlock.h diff -u llvm/include/llvm/BasicBlock.h:1.52 llvm/include/llvm/BasicBlock.h:1.53 --- llvm/include/llvm/BasicBlock.h:1.52 Tue Apr 12 13:51:53 2005 +++ llvm/include/llvm/BasicBlock.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/BasicBlock.h - Represent a basic block in the VM ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // @@ -16,7 +16,7 @@ // ///===---------------------------------------------------------------------===// // -// Note that well formed basic blocks are formed of a list of instructions +// Note that well formed basic blocks are formed of a list of instructions // followed by a single TerminatorInst instruction. TerminatorInst's may not // occur in the middle of basic blocks, and must terminate the blocks. // @@ -91,7 +91,7 @@ /// TerminatorInst *getTerminator(); const TerminatorInst *const getTerminator() const; - + /// removeFromParent - This method unlinks 'this' from the containing /// function, but does not delete it. /// @@ -144,14 +144,14 @@ /// 'delete' a whole class at a time, even though there may be circular /// references... first all references are dropped, and all use counts go to /// zero. Then everything is delete'd for real. Note that no operations are - /// valid on an object that has "dropped all references", except operator + /// valid on an object that has "dropped all references", except operator /// delete. /// void dropAllReferences(); /// removePredecessor - This method is used to notify a BasicBlock that the /// specified Predecessor of the block is no longer able to reach it. This is - /// actually not used to update the Predecessor list, but is actually used to + /// actually not used to update the Predecessor list, but is actually used to /// update the PHI nodes that reside in the block. Note that this should be /// called while the predecessor still refers to this block. /// @@ -164,7 +164,7 @@ /// new BB, including the old terminator. The newly formed BasicBlock is /// returned. This function invalidates the specified iterator. /// - /// Note that this only works on well formed basic blocks (must have a + /// Note that this only works on well formed basic blocks (must have a /// terminator), and 'I' must not be the end of instruction list (which would /// cause a degenerate basic block to be formed, having a terminator inside of /// the basic block). Index: llvm/include/llvm/CallGraphSCCPass.h diff -u llvm/include/llvm/CallGraphSCCPass.h:1.6 llvm/include/llvm/CallGraphSCCPass.h:1.7 --- llvm/include/llvm/CallGraphSCCPass.h:1.6 Sun Sep 19 23:42:18 2004 +++ llvm/include/llvm/CallGraphSCCPass.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===- CallGraphSCCPass.h - Pass that operates BU on call graph -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the CallGraphSCCPass class, which is used for passes which Index: llvm/include/llvm/Constant.h diff -u llvm/include/llvm/Constant.h:1.22 llvm/include/llvm/Constant.h:1.23 --- llvm/include/llvm/Constant.h:1.22 Sat Mar 5 13:51:20 2005 +++ llvm/include/llvm/Constant.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/Constant.h - Constant class definition -------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the declaration of the Constant class. @@ -38,7 +38,7 @@ // Specialize get/setOperand for Constant's as their operands are always // constants as well. - Constant *getOperand(unsigned i) { + Constant *getOperand(unsigned i) { return static_cast(User::getOperand(i)); } const Constant *getOperand(unsigned i) const { @@ -56,7 +56,7 @@ /// destroyConstantImpl as the last thing they do, to destroy all users and /// delete this. virtual void destroyConstant() { assert(0 && "Not reached!"); } - + //// Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const Constant *) { return true; } static inline bool classof(const GlobalValue *) { return true; } Index: llvm/include/llvm/Constants.h diff -u llvm/include/llvm/Constants.h:1.69 llvm/include/llvm/Constants.h:1.70 --- llvm/include/llvm/Constants.h:1.69 Sat Mar 19 05:40:31 2005 +++ llvm/include/llvm/Constants.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/Constants.h - Constant class subclass definitions --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the declarations for the subclasses of Constant, which @@ -356,7 +356,7 @@ /// get() - Static factory methods - Return objects of the specified value static Constant *get(const ArrayType *T, const std::vector &); static Constant *get(const std::string &Initializer); - + /// getType - Specialize the getType() method to always return an ArrayType, /// which reduces the amount of casting needed in parts of the compiler. /// @@ -423,7 +423,7 @@ virtual void destroyConstant(); virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, bool DisableChecking = false); - + /// Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const ConstantStruct *) { return true; } static bool classof(const Value *V) { @@ -446,7 +446,7 @@ /// get() - Static factory methods - Return objects of the specified value static Constant *get(const PackedType *T, const std::vector &); static Constant *get(const std::vector &V); - + /// getType - Specialize the getType() method to always return an PackedType, /// which reduces the amount of casting needed in parts of the compiler. /// @@ -519,12 +519,12 @@ friend struct ConstantCreator > >; friend struct ConvertConstantType; - + protected: ConstantExpr(const Type *Ty, unsigned Opcode, Use *Ops, unsigned NumOps) : Constant(Ty, ConstantExprVal, Ops, NumOps) { // Operation type (an Instruction opcode) is stored as the SubclassData. - SubclassData = Opcode; + SubclassData = Opcode; } // These private methods are used by the type resolution code to create @@ -537,13 +537,13 @@ Constant *C1, Constant *C2, Constant *C3); static Constant *getGetElementPtrTy(const Type *Ty, Constant *C, const std::vector &IdxList); - + public: // Static methods to construct a ConstantExpr of different kinds. Note that // these methods may return a object that is not an instance of the // ConstantExpr class, because they will attempt to fold the constant // expression into something simpler if possible. - + /// Cast constant expr /// static Constant *getCast(Constant *C, const Type *Ty); @@ -603,29 +603,29 @@ const std::vector &IdxList); static Constant *getGetElementPtr(Constant *C, const std::vector &IdxList); - + /// isNullValue - Return true if this is the value that would be returned by /// getNullValue. virtual bool isNullValue() const { return false; } - + /// getOpcode - Return the opcode at the root of this constant expression unsigned getOpcode() const { return SubclassData; } /// getOpcodeName - Return a string representation for an opcode. const char *getOpcodeName() const; - + virtual void destroyConstant(); virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, bool DisableChecking = false); - + /// Override methods to provide more type information... - inline Constant *getOperand(unsigned i) { + inline Constant *getOperand(unsigned i) { return cast(User::getOperand(i)); } inline Constant *getOperand(unsigned i) const { return const_cast(cast(User::getOperand(i))); } - + /// Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const ConstantExpr *) { return true; } Index: llvm/include/llvm/DerivedTypes.h diff -u llvm/include/llvm/DerivedTypes.h:1.66 llvm/include/llvm/DerivedTypes.h:1.67 --- llvm/include/llvm/DerivedTypes.h:1.66 Sat Jan 8 16:44:06 2005 +++ llvm/include/llvm/DerivedTypes.h Thu Apr 21 15:11:51 2005 @@ -1,13 +1,13 @@ //===-- llvm/DerivedTypes.h - Classes for handling data types ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This file contains the declarations of classes that represent "derived +// This file contains the declarations of classes that represent "derived // types". These are things like "arrays of x" or "structure of x, y, z" or // "method returning x taking (y,z) as parameters", etc... // @@ -61,7 +61,7 @@ delete this; } - + public: //===--------------------------------------------------------------------===// @@ -112,12 +112,12 @@ const FunctionType &operator=(const FunctionType &); // Do not implement protected: /// This should really be private, but it squelches a bogus warning - /// from GCC to make them protected: warning: `class FunctionType' only + /// from GCC to make them protected: warning: `class FunctionType' only /// defines private constructors and has no friends /// /// Private ctor - Only can be created by a static member... /// - FunctionType(const Type *Result, const std::vector &Params, + FunctionType(const Type *Result, const std::vector &Params, bool IsVarArgs); public: @@ -146,7 +146,7 @@ // Implement the AbstractTypeUser interface. virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy); virtual void typeBecameConcrete(const DerivedType *AbsTy); - + // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const FunctionType *T) { return true; } static inline bool classof(const Type *T) { @@ -171,7 +171,7 @@ // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const CompositeType *T) { return true; } static inline bool classof(const Type *T) { - return T->getTypeID() == ArrayTyID || + return T->getTypeID() == ArrayTyID || T->getTypeID() == StructTyID || T->getTypeID() == PointerTyID || T->getTypeID() == PackedTyID; @@ -188,7 +188,7 @@ protected: /// This should really be private, but it squelches a bogus warning - /// from GCC to make them protected: warning: `class StructType' only + /// from GCC to make them protected: warning: `class StructType' only /// defines private constructors and has no friends /// /// Private ctor - Only can be created by a static member... @@ -231,12 +231,12 @@ }; -/// SequentialType - This is the superclass of the array, pointer and packed +/// SequentialType - This is the superclass of the array, pointer and packed /// type classes. All of these represent "arrays" in memory. The array type /// represents a specifically sized array, pointer types are unsized/unknown -/// size arrays, packed types represent specifically sized arrays that -/// allow for use of SIMD instructions. SequentialType holds the common -/// features of all, which stem from the fact that all three lay their +/// size arrays, packed types represent specifically sized arrays that +/// allow for use of SIMD instructions. SequentialType holds the common +/// features of all, which stem from the fact that all three lay their /// components out in memory identically. /// class SequentialType : public CompositeType { @@ -280,7 +280,7 @@ const ArrayType &operator=(const ArrayType &); // Do not implement protected: /// This should really be private, but it squelches a bogus warning - /// from GCC to make them protected: warning: `class ArrayType' only + /// from GCC to make them protected: warning: `class ArrayType' only /// defines private constructors and has no friends /// /// Private ctor - Only can be created by a static member... @@ -316,7 +316,7 @@ const PackedType &operator=(const PackedType &); // Do not implement protected: /// This should really be private, but it squelches a bogus warning - /// from GCC to make them protected: warning: `class PackedType' only + /// from GCC to make them protected: warning: `class PackedType' only /// defines private constructors and has no friends /// /// Private ctor - Only can be created by a static member... @@ -351,7 +351,7 @@ const PointerType &operator=(const PointerType &); // Do not implement protected: // This should really be private, but it squelches a bogus warning - // from GCC to make them protected: warning: `class PointerType' only + // from GCC to make them protected: warning: `class PointerType' only // defines private constructors and has no friends // Private ctor - Only can be created by a static member... @@ -380,7 +380,7 @@ const OpaqueType &operator=(const OpaqueType &); // DO NOT IMPLEMENT protected: /// This should really be private, but it squelches a bogus warning - /// from GCC to make them protected: warning: `class OpaqueType' only + /// from GCC to make them protected: warning: `class OpaqueType' only /// defines private constructors and has no friends /// /// Private ctor - Only can be created by a static member... Index: llvm/include/llvm/Function.h diff -u llvm/include/llvm/Function.h:1.63 llvm/include/llvm/Function.h:1.64 --- llvm/include/llvm/Function.h:1.63 Mon Mar 14 23:13:47 2005 +++ llvm/include/llvm/Function.h Thu Apr 21 15:11:51 2005 @@ -1,13 +1,13 @@ //===-- llvm/Function.h - Class to represent a single function --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This file contains the declaration of the Function class, which represents a +// This file contains the declaration of the Function class, which represents a // single function/procedure in LLVM. // // A function basically consists of a list of basic blocks, a list of arguments, @@ -66,7 +66,7 @@ ArgumentListType ArgumentList; // The formal arguments SymbolTable *SymTab; - + friend class SymbolTableListTraits; void setParent(Module *parent); @@ -161,7 +161,7 @@ inline SymbolTable &getSymbolTable() { return *SymTab; } inline const SymbolTable &getSymbolTable() const { return *SymTab; } - + //===--------------------------------------------------------------------===// // BasicBlock iterator forwarding functions // @@ -209,7 +209,7 @@ /// in your path. /// void viewCFG() const; - + /// viewCFGOnly - This function is meant for use from the debugger. It works /// just like viewCFG, but it does not include the contents of basic blocks /// into the nodes, just the label. If you are only interested in the CFG @@ -228,7 +228,7 @@ /// 'delete' a whole module at a time, even though there may be circular /// references... first all references are dropped, and all use counts go to /// zero. Then everything is deleted for real. Note that no operations are - /// valid on an object that has "dropped all references", except operator + /// valid on an object that has "dropped all references", except operator /// delete. /// /// Since no other object in the module can have references into the body of a Index: llvm/include/llvm/GlobalValue.h diff -u llvm/include/llvm/GlobalValue.h:1.22 llvm/include/llvm/GlobalValue.h:1.23 --- llvm/include/llvm/GlobalValue.h:1.22 Thu Apr 21 11:10:03 2005 +++ llvm/include/llvm/GlobalValue.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/GlobalValue.h - Class to represent a global value --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file is a common base class of all globally definable objects. As such, @@ -48,9 +48,9 @@ } /// If the usage is empty (except transitively dead constants), then this - /// global value can can be safely deleted since the destructor will + /// global value can can be safely deleted since the destructor will /// delete the dead constants as well. - /// @brief Determine if the usage of this global value is empty except + /// @brief Determine if the usage of this global value is empty except /// for transitively dead constants. bool use_empty_except_constants(); @@ -103,7 +103,7 @@ // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const GlobalValue *T) { return true; } static inline bool classof(const Value *V) { - return V->getValueType() == Value::FunctionVal || + return V->getValueType() == Value::FunctionVal || V->getValueType() == Value::GlobalVariableVal; } }; Index: llvm/include/llvm/GlobalVariable.h diff -u llvm/include/llvm/GlobalVariable.h:1.32 llvm/include/llvm/GlobalVariable.h:1.33 --- llvm/include/llvm/GlobalVariable.h:1.32 Sat Mar 5 13:51:20 2005 +++ llvm/include/llvm/GlobalVariable.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/GlobalVariable.h - GlobalVariable class ------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the declaration of the GlobalVariable class, which @@ -110,12 +110,12 @@ /// and deletes it. /// void eraseFromParent(); - - /// Override Constant's implementation of this method so we can + + /// Override Constant's implementation of this method so we can /// replace constant initializers. virtual void replaceUsesOfWithOnConstant(Value *From, Value *To, bool DisableChecking = false); - + virtual void print(std::ostream &OS) const; // Methods for support type inquiry through isa, cast, and dyn_cast: Index: llvm/include/llvm/InstrTypes.h diff -u llvm/include/llvm/InstrTypes.h:1.42 llvm/include/llvm/InstrTypes.h:1.43 --- llvm/include/llvm/InstrTypes.h:1.42 Fri Jan 28 18:32:51 2005 +++ llvm/include/llvm/InstrTypes.h Thu Apr 21 15:11:51 2005 @@ -1,14 +1,14 @@ //===-- llvm/InstrTypes.h - Important Instruction subclasses ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines various meta classes of instructions that exist in the VM -// representation. Specific concrete subclasses of these may be found in the +// representation. Specific concrete subclasses of these may be found in the // i*.h files... // //===----------------------------------------------------------------------===// @@ -24,7 +24,7 @@ // TerminatorInst Class //===----------------------------------------------------------------------===// -/// TerminatorInst - Subclasses of this class are all able to terminate a basic +/// TerminatorInst - Subclasses of this class are all able to terminate a basic /// block. Thus, these are all the flow control type of operations. /// class TerminatorInst : public Instruction { @@ -153,7 +153,7 @@ static BinaryOperator *create(BinaryOps Op, Value *S1, Value *S2, const std::string &Name = "", Instruction *InsertBefore = 0); - + /// create() - Construct a binary instruction, given the opcode and the two /// operands. Also automatically insert this instruction to the end of the /// BasicBlock specified. @@ -183,11 +183,11 @@ return create(Instruction::OPC, V1, V2, Name, I);\ } #include "llvm/Instruction.def" - + /// Helper functions to construct and inspect unary operations (NEG and NOT) /// via binary operators SUB and XOR: - /// + /// /// createNeg, createNot - Create the NEG and NOT /// instructions out of SUB and XOR instructions. /// @@ -207,13 +207,13 @@ /// getNegArgument, getNotArgument - Helper functions to extract the /// unary argument of a NEG or NOT operation implemented via Sub or Xor. - /// + /// static const Value* getNegArgument(const BinaryOperator* Bop); static Value* getNegArgument( BinaryOperator* Bop); static const Value* getNotArgument(const BinaryOperator* Bop); static Value* getNotArgument( BinaryOperator* Bop); - BinaryOps getOpcode() const { + BinaryOps getOpcode() const { return static_cast(Instruction::getOpcode()); } @@ -231,7 +231,7 @@ // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const BinaryOperator *) { return true; } static inline bool classof(const Instruction *I) { - return I->getOpcode() >= BinaryOpsBegin && I->getOpcode() < BinaryOpsEnd; + return I->getOpcode() >= BinaryOpsBegin && I->getOpcode() < BinaryOpsEnd; } static inline bool classof(const Value *V) { return isa(V) && classof(cast(V)); Index: llvm/include/llvm/Instruction.h diff -u llvm/include/llvm/Instruction.h:1.66 llvm/include/llvm/Instruction.h:1.67 --- llvm/include/llvm/Instruction.h:1.66 Mon Mar 7 14:35:45 2005 +++ llvm/include/llvm/Instruction.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/Instruction.h - Instruction class definition -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the declaration of the Instruction class, which is the @@ -70,7 +70,7 @@ /// extra information (e.g. load is volatile) agree. bool isIdenticalTo(Instruction *I) const; - + // Accessor methods... // inline const BasicBlock *getParent() const { return Parent; } @@ -94,7 +94,7 @@ void eraseFromParent(); // --------------------------------------------------------------------------- - /// Subclass classification... getOpcode() returns a member of + /// Subclass classification... getOpcode() returns a member of /// one of the enums that is coming soon (down below)... /// unsigned getOpcode() const { return getValueType() - InstructionVal; } @@ -144,10 +144,10 @@ /// isTrappingInstruction - Return true if the instruction may trap. /// bool isTrapping() const { - return isTrapping(getOpcode()); + return isTrapping(getOpcode()); } static bool isTrapping(unsigned op); - + virtual void print(std::ostream &OS) const { print(OS, 0); } void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const; @@ -156,7 +156,7 @@ static inline bool classof(const Value *V) { return V->getValueType() >= Value::InstructionVal; } - + //---------------------------------------------------------------------- // Exported enumerations... // Index: llvm/include/llvm/Instructions.h diff -u llvm/include/llvm/Instructions.h:1.15 llvm/include/llvm/Instructions.h:1.16 --- llvm/include/llvm/Instructions.h:1.15 Tue Mar 15 21:46:55 2005 +++ llvm/include/llvm/Instructions.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/Instructions.h - Instruction subclass definitions --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file exposes the class definitions of all of the subclasses of the @@ -34,9 +34,9 @@ /// class AllocationInst : public UnaryInstruction { protected: - AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, + AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, const std::string &Name = "", Instruction *InsertBefore = 0); - AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, + AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, const std::string &Name, BasicBlock *InsertAtEnd); public: @@ -55,7 +55,7 @@ /// getType - Overload to return most specific pointer type /// inline const PointerType *getType() const { - return reinterpret_cast(Instruction::getType()); + return reinterpret_cast(Instruction::getType()); } /// getAllocatedType - Return the type that is being allocated by the @@ -175,7 +175,7 @@ LoadInst(const LoadInst &LI) : UnaryInstruction(LI.getType(), Load, LI.getOperand(0)) { setVolatile(LI.isVolatile()); - + #ifndef NDEBUG AssertOK(); #endif @@ -221,7 +221,7 @@ // StoreInst Class //===----------------------------------------------------------------------===// -/// StoreInst - an instruction for storing to memory +/// StoreInst - an instruction for storing to memory /// class StoreInst : public Instruction { Use Ops[2]; @@ -252,7 +252,7 @@ void setVolatile(bool V) { SubclassData = V; } /// Transparently provide more efficient getOperand methods. - Value *getOperand(unsigned i) const { + Value *getOperand(unsigned i) const { assert(i < 2 && "getOperand() out of range!"); return Ops[i]; } @@ -319,7 +319,7 @@ ~GetElementPtrInst(); virtual GetElementPtrInst *clone() const; - + // getType - Overload to return most specific pointer type... inline const PointerType *getType() const { return reinterpret_cast(Instruction::getType()); @@ -328,15 +328,15 @@ /// getIndexedType - Returns the type of the element that would be loaded with /// a load instruction with the specified parameters. /// - /// A null type is returned if the indices are invalid for the specified + /// A null type is returned if the indices are invalid for the specified /// pointer type. /// - static const Type *getIndexedType(const Type *Ptr, + static const Type *getIndexedType(const Type *Ptr, const std::vector &Indices, bool AllowStructLeaf = false); static const Type *getIndexedType(const Type *Ptr, Value *Idx0, Value *Idx1, bool AllowStructLeaf = false); - + inline op_iterator idx_begin() { return op_begin()+1; } inline const_op_iterator idx_begin() const { return op_begin()+1; } inline op_iterator idx_end() { return op_end(); } @@ -355,7 +355,7 @@ inline unsigned getNumIndices() const { // Note: always non-negative return getNumOperands() - 1; } - + inline bool hasIndices() const { return getNumOperands() > 1; } @@ -430,7 +430,7 @@ /// the instruction (i->getType()). /// class CastInst : public UnaryInstruction { - CastInst(const CastInst &CI) + CastInst(const CastInst &CI) : UnaryInstruction(CI.getType(), Cast, CI.getOperand(0)) { } public: @@ -486,9 +486,9 @@ Instruction *InsertBefore = 0); CallInst(Value *F, Value *Actual, const std::string& Name, BasicBlock *InsertAtEnd); - explicit CallInst(Value *F, const std::string &Name = "", + explicit CallInst(Value *F, const std::string &Name = "", Instruction *InsertBefore = 0); - explicit CallInst(Value *F, const std::string &Name, + explicit CallInst(Value *F, const std::string &Name, BasicBlock *InsertAtEnd); ~CallInst(); @@ -509,7 +509,7 @@ // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const CallInst *) { return true; } static inline bool classof(const Instruction *I) { - return I->getOpcode() == Instruction::Call; + return I->getOpcode() == Instruction::Call; } static inline bool classof(const Value *V) { return isa(V) && classof(cast(V)); @@ -568,7 +568,7 @@ // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const ShiftInst *) { return true; } static inline bool classof(const Instruction *I) { - return (I->getOpcode() == Instruction::Shr) | + return (I->getOpcode() == Instruction::Shr) | (I->getOpcode() == Instruction::Shl); } static inline bool classof(const Value *V) { @@ -772,7 +772,7 @@ /// getIncomingBlock - Return incoming basic block #x /// - BasicBlock *getIncomingBlock(unsigned i) const { + BasicBlock *getIncomingBlock(unsigned i) const { return reinterpret_cast(getOperand(i*2+1)); } void setIncomingBlock(unsigned i, BasicBlock *BB) { @@ -795,7 +795,7 @@ OperandList[OpNo].init(V, this); OperandList[OpNo+1].init(reinterpret_cast(BB), this); } - + /// removeIncomingValue - Remove an incoming value. This is useful if a /// predecessor basic block is deleted. The value removed is returned. /// @@ -812,12 +812,12 @@ return removeIncomingValue(Idx, DeletePHIIfEmpty); } - /// getBasicBlockIndex - Return the first index of the specified basic + /// getBasicBlockIndex - Return the first index of the specified basic /// block in the value list for this PHI. Returns -1 if no instance. /// int getBasicBlockIndex(const BasicBlock *BB) const { Use *OL = OperandList; - for (unsigned i = 0, e = getNumOperands(); i != e; i += 2) + for (unsigned i = 0, e = getNumOperands(); i != e; i += 2) if (OL[i+1] == reinterpret_cast(BB)) return i/2; return -1; } @@ -829,7 +829,7 @@ /// Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const PHINode *) { return true; } static inline bool classof(const Instruction *I) { - return I->getOpcode() == Instruction::PHI; + return I->getOpcode() == Instruction::PHI; } static inline bool classof(const Value *V) { return isa(V) && classof(cast(V)); @@ -1007,7 +1007,7 @@ BasicBlock *getSuccessor(unsigned i) const { assert(i < getNumSuccessors() && "Successor # out of range for Branch!"); - return (i == 0) ? cast(getOperand(0)) : + return (i == 0) ? cast(getOperand(0)) : cast(getOperand(1)); } @@ -1052,7 +1052,7 @@ /// be specified here to make memory allocation more efficient. This /// constructor can also autoinsert before another instruction. SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases, - Instruction *InsertBefore = 0) + Instruction *InsertBefore = 0) : TerminatorInst(Instruction::Switch, 0, 0, InsertBefore) { init(Value, Default, NumCases); } @@ -1062,7 +1062,7 @@ /// be specified here to make memory allocation more efficient. This /// constructor also autoinserts at the end of the specified BasicBlock. SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases, - BasicBlock *InsertAtEnd) + BasicBlock *InsertAtEnd) : TerminatorInst(Instruction::Switch, 0, 0, InsertAtEnd) { init(Value, Default, NumCases); } Index: llvm/include/llvm/IntrinsicInst.h diff -u llvm/include/llvm/IntrinsicInst.h:1.5 llvm/include/llvm/IntrinsicInst.h:1.6 --- llvm/include/llvm/IntrinsicInst.h:1.5 Sat Jan 1 12:58:23 2005 +++ llvm/include/llvm/IntrinsicInst.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/InstrinsicInst.h - Intrinsic Instruction Wrappers --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines classes that make it really easy to deal with intrinsic @@ -53,11 +53,11 @@ static inline bool classof(const CallInst *I) { if (const Function *CF = I->getCalledFunction()) switch (CF->getIntrinsicID()) { - case Intrinsic::dbg_stoppoint: - case Intrinsic::dbg_region_start: - case Intrinsic::dbg_region_end: - case Intrinsic::dbg_func_start: - case Intrinsic::dbg_declare: + case Intrinsic::dbg_stoppoint: + case Intrinsic::dbg_region_start: + case Intrinsic::dbg_region_end: + case Intrinsic::dbg_func_start: + case Intrinsic::dbg_declare: return true; default: break; } @@ -81,7 +81,7 @@ } Value *getContext() const { return const_cast(getOperand(4)); } - + // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const DbgStopPointInst *) { return true; } static inline bool classof(const CallInst *I) { @@ -159,7 +159,7 @@ /// value is guaranteed to be a pointer. Value *getSource() const { return StripPointerCasts(getRawSource()); } - + void setSource(Value *Ptr) { assert(getRawSource()->getType() == Ptr->getType() && "setSource called with pointer of wrong type!"); Index: llvm/include/llvm/Intrinsics.h diff -u llvm/include/llvm/Intrinsics.h:1.29 llvm/include/llvm/Intrinsics.h:1.30 --- llvm/include/llvm/Intrinsics.h:1.29 Mon Mar 28 14:05:49 2005 +++ llvm/include/llvm/Intrinsics.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a set of enums which allow processing of intrinsic Index: llvm/include/llvm/Linker.h diff -u llvm/include/llvm/Linker.h:1.14 llvm/include/llvm/Linker.h:1.15 --- llvm/include/llvm/Linker.h:1.14 Sun Dec 12 20:58:05 2004 +++ llvm/include/llvm/Linker.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===- llvm/Linker.h - Module Linker Interface ------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the interface to the module/file/archive linker. @@ -22,15 +22,15 @@ class Module; /// This class provides the core functionality of linking in LLVM. It retains a -/// Module object which is the composite of the modules and libraries linked -/// into it. The composite Module can be retrieved via the getModule() method. -/// In this case the Linker still retains ownership of the Module. If the -/// releaseModule() method is used, the ownership of the Module is transferred +/// Module object which is the composite of the modules and libraries linked +/// into it. The composite Module can be retrieved via the getModule() method. +/// In this case the Linker still retains ownership of the Module. If the +/// releaseModule() method is used, the ownership of the Module is transferred /// to the caller and the Linker object is only suitable for destruction. -/// The Linker can link Modules from memory, bytecode files, or bytecode -/// archives. It retains a set of search paths in which to find any libraries -/// presented to it. By default, the linker will generate error and warning -/// messages to std::cerr but this capability can be turned off with the +/// The Linker can link Modules from memory, bytecode files, or bytecode +/// archives. It retains a set of search paths in which to find any libraries +/// presented to it. By default, the linker will generate error and warning +/// messages to std::cerr but this capability can be turned off with the /// QuietWarnings and QuietErrors flags. It can also be instructed to verbosely /// print out the linking actions it is taking with the Verbose flag. /// @brief The LLVM Linker. @@ -41,14 +41,14 @@ public: /// This type is used to pass the linkage items (libraries and files) to /// the LinkItems function. It is composed of string/bool pairs. The string - /// provides the name of the file or library (as with the -l option). The - /// bool should be true for libraries and false for files, signifying + /// provides the name of the file or library (as with the -l option). The + /// bool should be true for libraries and false for files, signifying /// "isLibrary". /// @brief A list of linkage items typedef std::vector > ItemList; /// This enumeration is used to control various optional features of the - /// linker. + /// linker. enum ControlFlags { Verbose = 1, ///< Print to std::cerr what steps the linker is taking QuietWarnings = 2, ///< Don't print errors and warnings to std::cerr. @@ -78,33 +78,33 @@ /// @{ public: /// This method gets the composite module into which linking is being - /// done. The Composite module starts out empty and accumulates modules + /// done. The Composite module starts out empty and accumulates modules /// linked into it via the various LinkIn* methods. This method does not /// release the Module to the caller. The Linker retains ownership and will - /// destruct the Module when the Linker is destructed. + /// destruct the Module when the Linker is destructed. /// @see releaseModule /// @brief Get the linked/composite module. Module* getModule() const { return Composite; } /// This method releases the composite Module into which linking is being /// done. Ownership of the composite Module is transferred to the caller who - /// must arrange for its destruct. After this method is called, the Linker - /// terminates the linking session for the returned Module. It will no - /// longer utilize the returned Module but instead resets itself for - /// subsequent linking as if the constructor had been called. The Linker's - /// LibPaths and flags to be reset, and memory will be released. - /// @brief Release the linked/composite module. + /// must arrange for its destruct. After this method is called, the Linker + /// terminates the linking session for the returned Module. It will no + /// longer utilize the returned Module but instead resets itself for + /// subsequent linking as if the constructor had been called. The Linker's + /// LibPaths and flags to be reset, and memory will be released. + /// @brief Release the linked/composite module. Module* releaseModule(); /// This method gets the list of libraries that form the path that the - /// Linker will search when it is presented with a library name. + /// Linker will search when it is presented with a library name. /// @brief Get the Linkers library path const std::vector& getLibPaths() const { return LibPaths; } /// This method returns an error string suitable for printing to the user. /// The return value will be empty unless an error occurred in one of the /// LinkIn* methods. In those cases, the LinkIn* methods will have returned - /// true, indicating an error occurred. At most one error is retained so + /// true, indicating an error occurred. At most one error is retained so /// this function always returns the last error that occurred. Note that if /// the Quiet control flag is not set, the error string will have already /// been printed to std::cerr. @@ -124,7 +124,7 @@ void addPath(const sys::Path& path); /// Add a set of paths to the list of paths that the linker will search. The - /// Linker accumulates the set of libraries added. The \p paths will be + /// Linker accumulates the set of libraries added. The \p paths will be /// added to the end of the Linker's list. Order will be retained. /// @brief Add a set of paths. void addPaths(const std::vector& paths); @@ -140,14 +140,14 @@ /// @brief Set control flags. void setFlags(unsigned flags) { Flags = flags; } - /// This method is the main interface to the linker. It can be used to + /// This method is the main interface to the linker. It can be used to /// link a set of linkage items into a module. A linkage item is either a /// file name with fully qualified path, or a library for which the Linker's /// LibraryPath will be utilized to locate the library. The bool value in - /// the LinkItemKind should be set to true for libraries. This function - /// allows linking to preserve the order of specification associated with - /// the command line, or for other purposes. Each item will be linked in - /// turn as it occurs in \p Items. + /// the LinkItemKind should be set to true for libraries. This function + /// allows linking to preserve the order of specification associated with + /// the command line, or for other purposes. Each item will be linked in + /// turn as it occurs in \p Items. /// @returns true if an error occurred, false otherwise /// @see LinkItemKind /// @see getLastError @@ -156,11 +156,11 @@ const ItemList& Items // Set of libraries/files to link in ); - /// This function links the bytecode \p Files into the composite module. - /// Note that this does not do any linking of unresolved symbols. The \p - /// Files are all completely linked into \p HeadModule regardless of - /// unresolved symbols. This function just loads each bytecode file and - /// calls LinkInModule on them. + /// This function links the bytecode \p Files into the composite module. + /// Note that this does not do any linking of unresolved symbols. The \p + /// Files are all completely linked into \p HeadModule regardless of + /// unresolved symbols. This function just loads each bytecode file and + /// calls LinkInModule on them. /// @returns true if an error occurs, false otherwise /// @see getLastError /// @brief Link in multiple files. @@ -179,11 +179,11 @@ const sys::Path& File ///< File to link in. ); - /// This function provides a way to selectively link in a set of modules, - /// found in libraries, based on the unresolved symbols in the composite + /// This function provides a way to selectively link in a set of modules, + /// found in libraries, based on the unresolved symbols in the composite /// module. Each item in \p Libraries should be the base name of a library, /// as if given with the -l option of a linker tool. The Linker's LibPaths - /// are searched for the \p Libraries and any found will be linked in with + /// are searched for the \p Libraries and any found will be linked in with /// LinkInArchive. If an error occurs, the Linker's error string is set. /// @see LinkInArchive /// @see getLastError @@ -193,9 +193,9 @@ const std::vector & Libraries ///< Libraries to link in ); - /// This function provides a way to selectively link in a set of modules, + /// This function provides a way to selectively link in a set of modules, /// found in one library, based on the unresolved symbols in the composite - /// module.The \p Library should be the base name of a library, as if given + /// module.The \p Library should be the base name of a library, as if given /// with the -l option of a linker tool. The Linker's LibPaths are searched /// for the \P Library and if found, it will be linked in with via the /// LinkInArchive method. If an error occurs, the Linker's error string is @@ -209,25 +209,25 @@ ); /// This function links one bytecode archive, \p Filename, into the module. - /// The archive is searched to resolve outstanding symbols. Any modules in - /// the archive that resolve outstanding symbols will be linked in. The - /// library is searched repeatedly until no more modules that resolve + /// The archive is searched to resolve outstanding symbols. Any modules in + /// the archive that resolve outstanding symbols will be linked in. The + /// library is searched repeatedly until no more modules that resolve /// symbols can be found. If an error occurs, the error string is set. - /// To speed up this function, ensure the the archive has been processed + /// To speed up this function, ensure the the archive has been processed /// llvm-ranlib or the S option was given to llvm-ar when the archive was /// created. These tools add a symbol table to the archive which makes the /// search for undefined symbols much faster. /// @see getLastError - /// @returns true if an error occurs, otherwise false. + /// @returns true if an error occurs, otherwise false. /// @brief Link in one archive. - bool LinkInArchive( + bool LinkInArchive( const sys::Path& Filename ///< Filename of the archive to link ); /// This method links the \p Src module into the Linker's Composite module - /// by calling LinkModules. All the other LinkIn* methods eventually - /// result in calling this method to link a Module into the Linker's - /// composite. + /// by calling LinkModules. All the other LinkIn* methods eventually + /// result in calling this method to link a Module into the Linker's + /// composite. /// @see LinkModules /// @returns True if an error occurs, false otherwise. /// @brief Link in a module. @@ -235,11 +235,11 @@ Module* Src ///< Module linked into \p Dest ) { return LinkModules(Composite, Src, &Error); } - /// This is the heart of the linker. This method will take unconditional + /// This is the heart of the linker. This method will take unconditional /// control of the \p Src module and link it into the \p Dest module. The /// \p Src module will be destructed or subsumed by this method. In either /// case it is not usable by the caller after this method is invoked. Only - /// the \p Dest module will remain. The \p Src module is linked into the + /// the \p Dest module will remain. The \p Src module is linked into the /// Linker's composite module such that types, global variables, functions, /// and etc. are matched and resolved. If an error occurs, this function /// returns true and ErrorMsg is set to a descriptive message about the @@ -277,7 +277,7 @@ std::string Error; ///< Text of error that occurred. std::string ProgramName; ///< Name of the program being linked /// @} - + }; } // End llvm namespace Index: llvm/include/llvm/Module.h diff -u llvm/include/llvm/Module.h:1.60 llvm/include/llvm/Module.h:1.61 --- llvm/include/llvm/Module.h:1.60 Mon Mar 14 23:13:47 2005 +++ llvm/include/llvm/Module.h Thu Apr 21 15:11:51 2005 @@ -1,13 +1,13 @@ //===-- llvm/Module.h - C++ class to represent a VM module ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This file contains the declarations for the Module class that is used to +// This file contains the declarations for the Module class that is used to // maintain all the information related to a VM module. // // A module also maintains a GlobalValRefMap object that is used to hold all @@ -229,7 +229,7 @@ /// @brief Remove a library from the list of dependent libraries inline void removeLibrary(const std::string& Lib) { LibraryList.remove(Lib); } - /// @brief Get all the libraries + /// @brief Get all the libraries inline const LibraryListType& getLibraries() const { return LibraryList; } //===--------------------------------------------------------------------===// @@ -245,7 +245,7 @@ /// 'delete' a whole class at a time, even though there may be circular /// references... first all references are dropped, and all use counts go to /// zero. Then everything is delete'd for real. Note that no operations are - /// valid on an object that has "dropped all references", except operator + /// valid on an object that has "dropped all references", except operator /// delete. /// void dropAllReferences(); Index: llvm/include/llvm/ModuleProvider.h diff -u llvm/include/llvm/ModuleProvider.h:1.10 llvm/include/llvm/ModuleProvider.h:1.11 --- llvm/include/llvm/ModuleProvider.h:1.10 Sat Jan 31 18:32:48 2004 +++ llvm/include/llvm/ModuleProvider.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/ModuleProvider.h - Interface for module providers --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides an abstract interface for loading a module from some @@ -48,12 +48,12 @@ /// releaseModule - no longer delete the Module* when provider is destroyed. /// Note that this can throw an exception if the module is corrupt! /// - virtual Module* releaseModule() { + virtual Module* releaseModule() { // Since we're losing control of this Module, we must hand it back complete materializeModule(); - Module *tempM = TheModule; - TheModule = 0; - return tempM; + Module *tempM = TheModule; + TheModule = 0; + return tempM; } }; Index: llvm/include/llvm/PassAnalysisSupport.h diff -u llvm/include/llvm/PassAnalysisSupport.h:1.18 llvm/include/llvm/PassAnalysisSupport.h:1.19 --- llvm/include/llvm/PassAnalysisSupport.h:1.18 Fri Mar 12 00:13:15 2004 +++ llvm/include/llvm/PassAnalysisSupport.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===- llvm/PassAnalysisSupport.h - Analysis Pass Support code --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines stuff that is used to define and "use" Analysis Passes. @@ -25,10 +25,10 @@ //===----------------------------------------------------------------------===// // AnalysisUsage - Represent the analysis usage information of a pass. This -// tracks analyses that the pass REQUIRES (must be available when the pass +// tracks analyses that the pass REQUIRES (must be available when the pass // runs), REQUIRES TRANSITIVE (must be available throughout the lifetime of the // pass), and analyses that the pass PRESERVES (the pass does not invalidate the -// results of these analyses). This information is provided by a pass to the +// results of these analyses). This information is provided by a pass to the // Pass infrastructure through the getAnalysisUsage virtual function. // class AnalysisUsage { @@ -37,7 +37,7 @@ bool PreservesAll; public: AnalysisUsage() : PreservesAll(false) {} - + // addRequired - Add the specified ID to the required set of the usage info // for a pass. // Index: llvm/include/llvm/Pass.h diff -u llvm/include/llvm/Pass.h:1.50 llvm/include/llvm/Pass.h:1.51 --- llvm/include/llvm/Pass.h:1.50 Tue Mar 15 21:54:50 2005 +++ llvm/include/llvm/Pass.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===- llvm/Pass.h - Base class for Passes ----------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a base class that indicates that a specified class is a Index: llvm/include/llvm/PassManager.h diff -u llvm/include/llvm/PassManager.h:1.12 llvm/include/llvm/PassManager.h:1.13 --- llvm/include/llvm/PassManager.h:1.12 Sun Sep 19 23:42:19 2004 +++ llvm/include/llvm/PassManager.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===- llvm/PassManager.h - Container for Passes ----------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the PassManager class. This class is used to hold, @@ -63,7 +63,7 @@ /// void add(FunctionPass *P); - /// add - ImmutablePasses are not FunctionPasses, so we have a + /// add - ImmutablePasses are not FunctionPasses, so we have a /// special hack to get them into a FunctionPassManager. /// void add(ImmutablePass *IP); Index: llvm/include/llvm/PassSupport.h diff -u llvm/include/llvm/PassSupport.h:1.20 llvm/include/llvm/PassSupport.h:1.21 --- llvm/include/llvm/PassSupport.h:1.20 Fri Jun 4 15:39:05 2004 +++ llvm/include/llvm/PassSupport.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===- llvm/PassSupport.h - Pass Support code -------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines stuff that is used to define and "use" Passes. This file @@ -55,7 +55,7 @@ /// PassInfo ctor - Do not call this directly, this should only be invoked /// through RegisterPass. - PassInfo(const char *name, const char *arg, const std::type_info &ti, + PassInfo(const char *name, const char *arg, const std::type_info &ti, unsigned char pt, Pass *(*normal)() = 0, Pass *(*targetctor)(TargetMachine &) = 0) : PassName(name), PassArgument(arg), TypeInfo(ti), PassType(pt), @@ -86,7 +86,7 @@ /// getNormalCtor - Return a pointer to a function, that when called, creates /// an instance of the pass and returns it. This pointer may be null if there /// is no default constructor for the pass. - /// + /// Pass *(*getNormalCtor() const)() { return NormalCtor; } @@ -135,7 +135,7 @@ /// for example will not be able to see the pass and attempts to create the pass /// will fail. This template is used in the follow manner (at global scope, in /// your .cpp file): -/// +/// /// static RegisterPass tmp("passopt", "My Pass Name"); /// /// This statement will cause your pass to be created by calling the default @@ -145,7 +145,7 @@ /// /// Pass *createMyPass(foo &opt) { return new MyPass(opt); } /// static RegisterPass tmp("passopt", "My Name", createMyPass); -/// +/// struct RegisterPassBase { /// getPassInfo - Get the pass info for the registered class... /// @@ -172,7 +172,7 @@ template struct RegisterPass : public RegisterPassBase { - + // Register Pass using default constructor... RegisterPass(const char *PassArg, const char *Name, unsigned char PassTy = 0){ registerPass(new PassInfo(Name, PassArg, typeid(PassName), PassTy, @@ -226,7 +226,7 @@ RegisterOpt(const char *PassArg, const char *Name, FunctionPass *(*ctor)(), bool CFGOnly = false) { registerPass(new PassInfo(Name, PassArg, typeid(PassName), - PassInfo::Optimization, + PassInfo::Optimization, static_cast(ctor))); if (CFGOnly) setOnlyUsesCFG(); } Index: llvm/include/llvm/SymbolTable.h diff -u llvm/include/llvm/SymbolTable.h:1.49 llvm/include/llvm/SymbolTable.h:1.50 --- llvm/include/llvm/SymbolTable.h:1.49 Sun Mar 6 00:03:44 2005 +++ llvm/include/llvm/SymbolTable.h Thu Apr 21 15:11:51 2005 @@ -1,11 +1,11 @@ //===-- llvm/SymbolTable.h - Implement a type plane'd symtab ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and re-written by Reid -// Spencer. It is distributed under the University of Illinois Open Source +// Spencer. It is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the main symbol table for LLVM. @@ -21,23 +21,23 @@ namespace llvm { /// This class provides a symbol table of name/value pairs that is broken -/// up by type. For each Type* there is a "plane" of name/value pairs in -/// the symbol table. Identical types may have overlapping symbol names as -/// long as they are distinct. The SymbolTable also tracks, separately, a -/// map of name/type pairs. This allows types to be named. Types are treated +/// up by type. For each Type* there is a "plane" of name/value pairs in +/// the symbol table. Identical types may have overlapping symbol names as +/// long as they are distinct. The SymbolTable also tracks, separately, a +/// map of name/type pairs. This allows types to be named. Types are treated /// distinctly from Values. -/// +/// /// The SymbolTable provides several utility functions for answering common /// questions about its contents as well as an iterator interface for -/// directly iterating over the contents. To reduce confusion, the terms +/// directly iterating over the contents. To reduce confusion, the terms /// "type", "value", and "plane" are used consistently. For example, -/// There is a TypeMap typedef that is the mapping of names to Types. -/// Similarly there is a ValueMap typedef that is the mapping of +/// There is a TypeMap typedef that is the mapping of names to Types. +/// Similarly there is a ValueMap typedef that is the mapping of /// names to Values. Finally, there is a PlaneMap typedef that is the /// mapping of types to planes of ValueMap. This is the basic structure /// of the symbol table. When you call type_begin() you're asking /// for an iterator at the start of the TypeMap. When you call -/// plane_begin(), you're asking for an iterator at the start of +/// plane_begin(), you're asking for an iterator at the start of /// the PlaneMap. Finally, when you call value_begin(), you're asking /// for an iterator at the start of a ValueMap for a specific type /// plane. @@ -102,7 +102,7 @@ /// @brief Lookup a type by name. Type* lookupType(const std::string& name) const; - /// @returns true iff the type map and the type plane are both not + /// @returns true iff the type map and the type plane are both not /// empty. /// @brief Determine if the symbol table is empty inline bool isEmpty() const { return pmap.empty() && tmap.empty(); } @@ -110,17 +110,17 @@ /// @brief The number of name/type pairs is returned. inline unsigned num_types() const { return (unsigned)tmap.size(); } - /// Given a base name, return a string that is either equal to it or - /// derived from it that does not already occur in the symbol table + /// Given a base name, return a string that is either equal to it or + /// derived from it that does not already occur in the symbol table /// for the specified type. /// @brief Get a name unique to this symbol table - std::string getUniqueName(const Type *Ty, + std::string getUniqueName(const Type *Ty, const std::string &BaseName) const; /// This function can be used from the debugger to display the /// content of the symbol table while debugging. /// @brief Print out symbol table on stderr - void dump() const; + void dump() const; /// @} /// @name Iteration @@ -129,12 +129,12 @@ /// Get an iterator that starts at the beginning of the type planes. /// The iterator will iterate over the Type/ValueMap pairs in the - /// type planes. + /// type planes. inline plane_iterator plane_begin() { return pmap.begin(); } - /// Get a const_iterator that starts at the beginning of the type - /// planes. The iterator will iterate over the Type/ValueMap pairs - /// in the type planes. + /// Get a const_iterator that starts at the beginning of the type + /// planes. The iterator will iterate over the Type/ValueMap pairs + /// in the type planes. inline plane_const_iterator plane_begin() const { return pmap.begin(); } /// Get an iterator at the end of the type planes. This serves as @@ -148,9 +148,9 @@ /// Get an iterator that starts at the beginning of a type plane. /// The iterator will iterate over the name/value pairs in the type plane. /// @note The type plane must already exist before using this. - inline value_iterator value_begin(const Type *Typ) { + inline value_iterator value_begin(const Type *Typ) { assert(Typ && "Can't get value iterator with null type!"); - return pmap.find(Typ)->second.begin(); + return pmap.find(Typ)->second.begin(); } /// Get a const_iterator that starts at the beginning of a type plane. @@ -158,23 +158,23 @@ /// @note The type plane must already exist before using this. inline value_const_iterator value_begin(const Type *Typ) const { assert(Typ && "Can't get value iterator with null type!"); - return pmap.find(Typ)->second.begin(); + return pmap.find(Typ)->second.begin(); } /// Get an iterator to the end of a type plane. This serves as the marker /// for end of iteration of the type plane. /// @note The type plane must already exist before using this. - inline value_iterator value_end(const Type *Typ) { + inline value_iterator value_end(const Type *Typ) { assert(Typ && "Can't get value iterator with null type!"); - return pmap.find(Typ)->second.end(); + return pmap.find(Typ)->second.end(); } /// Get a const_iterator to the end of a type plane. This serves as the /// marker for end of iteration of the type plane. /// @note The type plane must already exist before using this. - inline value_const_iterator value_end(const Type *Typ) const { + inline value_const_iterator value_end(const Type *Typ) const { assert(Typ && "Can't get value iterator with null type!"); - return pmap.find(Typ)->second.end(); + return pmap.find(Typ)->second.end(); } /// Get an iterator to the start of the name/Type map. @@ -187,7 +187,7 @@ /// marker for end of iteration of the types. inline type_iterator type_end() { return tmap.end(); } - /// Get a const-iterator to the end of the name/Type map. This serves + /// Get a const-iterator to the end of the name/Type map. This serves /// as the marker for end of iteration of the types. inline type_const_iterator type_end() const { return tmap.end(); } @@ -202,9 +202,9 @@ /// This method returns a plane_iterator for iteration over the /// type planes starting at a specific plane, given by \p Ty. /// @brief Find a type plane. - inline plane_iterator find(const Type* Typ) { + inline plane_iterator find(const Type* Typ) { assert(Typ && "Can't find type plane with null type!"); - return pmap.find(Typ); + return pmap.find(Typ); } @@ -265,7 +265,7 @@ /// @brief Insert a value into the symbol table with the specified name. void insertEntry(const std::string &Name, const Type *Ty, Value *V); - /// This function is called when one of the types in the type plane + /// This function is called when one of the types in the type plane /// is refined. virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy); @@ -273,20 +273,20 @@ virtual void typeBecameConcrete(const DerivedType *AbsTy); /// @} -/// @name Internal Data +/// @name Internal Data /// @{ private: /// This is the main content of the symbol table. It provides /// separate type planes for named values. That is, each named - /// value is organized into a separate dictionary based on + /// value is organized into a separate dictionary based on /// Type. This means that the same name can be used for different - /// types without conflict. + /// types without conflict. /// @brief The mapping of types to names to values. PlaneMap pmap; /// This is the type plane. It is separated from the pmap - /// because the elements of the map are name/Type pairs not + /// because the elements of the map are name/Type pairs not /// name/Value pairs and Type is not a Value. TypeMap tmap; Index: llvm/include/llvm/SymbolTableListTraits.h diff -u llvm/include/llvm/SymbolTableListTraits.h:1.4 llvm/include/llvm/SymbolTableListTraits.h:1.5 --- llvm/include/llvm/SymbolTableListTraits.h:1.4 Tue Nov 11 16:41:30 2003 +++ llvm/include/llvm/SymbolTableListTraits.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/SymbolTableListTraits.h - Traits for iplist --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a generic class that is used to implement the automatic @@ -64,7 +64,7 @@ void addNodeToList(ValueSubClass *V); void removeNodeFromList(ValueSubClass *V); - void transferNodesFromList(iplist > &L2, ilist_iterator first, ilist_iterator last); Index: llvm/include/llvm/Type.h diff -u llvm/include/llvm/Type.h:1.74 llvm/include/llvm/Type.h:1.75 --- llvm/include/llvm/Type.h:1.74 Mon Mar 7 14:35:45 2005 +++ llvm/include/llvm/Type.h Thu Apr 21 15:11:51 2005 @@ -1,18 +1,18 @@ //===-- llvm/Type.h - Classes for handling data types -----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the declaration of the Type class. For more "Type" type // stuff, look in DerivedTypes.h. // // Note that instances of the Type class are immutable: once they are created, -// they are never changed. Also note that only one instance of a particular -// type is ever created. Thus seeing if two types are equal is a matter of +// they are never changed. Also note that only one instance of a particular +// type is ever created. Thus seeing if two types are equal is a matter of // doing a trivial pointer comparison. // // Types, once allocated, are never free'd, unless they are an abstract type @@ -20,7 +20,7 @@ // // Opaque types are simple derived types with no state. There may be many // different Opaque type objects floating around, but two are only considered -// identical if they are pointer equals of each other. This allows us to have +// identical if they are pointer equals of each other. This allows us to have // two opaque types that end up resolving to different concrete types later. // // Opaque types are also kinda weird and scary and different because they have @@ -55,7 +55,7 @@ ///===-------------------------------------------------------------------===// /// Definitions of all of the base types for the Type system. Based on this /// value, you can cast to a "DerivedType" subclass (see DerivedTypes.h) - /// Note: If you add an element to this, you need to add an element to the + /// Note: If you add an element to this, you need to add an element to the /// Type::getPrimitiveType function, or else things will break! /// enum TypeID { @@ -66,14 +66,14 @@ UIntTyID , IntTyID, // 6, 7: 32 bit types... ULongTyID , LongTyID, // 8, 9: 64 bit types... FloatTyID , DoubleTyID, // 10,11: Floating point types... - LabelTyID , // 12 : Labels... + LabelTyID , // 12 : Labels... // Derived types... see DerivedTypes.h file... // Make sure FirstDerivedTyID stays up to date!!! FunctionTyID , StructTyID, // Functions... Structs... ArrayTyID , PointerTyID, // Array... pointer... OpaqueTyID, // Opaque type instances... - PackedTyID, // SIMD 'packed' format... + PackedTyID, // SIMD 'packed' format... //... NumTypeIDs, // Must remain as last defined ID @@ -145,18 +145,18 @@ /// Float and Double. /// bool isSigned() const { - return ID == SByteTyID || ID == ShortTyID || - ID == IntTyID || ID == LongTyID; + return ID == SByteTyID || ID == ShortTyID || + ID == IntTyID || ID == LongTyID; } - + /// isUnsigned - Return whether a numeric type is unsigned. This is not quite /// the complement of isSigned... nonnumeric types return false as they do /// with isSigned. This returns true for UByteTy, UShortTy, UIntTy, and /// ULongTy - /// + /// bool isUnsigned() const { - return ID == UByteTyID || ID == UShortTyID || - ID == UIntTyID || ID == ULongTyID; + return ID == UByteTyID || ID == UShortTyID || + ID == UIntTyID || ID == ULongTyID; } /// isInteger - Equivalent to isSigned() || isUnsigned() @@ -173,7 +173,7 @@ bool isFloatingPoint() const { return ID == FloatTyID || ID == DoubleTyID; } /// isAbstract - True if the type is either an Opaque type, or is a derived - /// type that includes an opaque type somewhere in it. + /// type that includes an opaque type somewhere in it. /// inline bool isAbstract() const { return Abstract; } @@ -192,7 +192,7 @@ /// isFirstClassType - Return true if the value is holdable in a register. /// inline bool isFirstClassType() const { - return (ID != VoidTyID && ID <= LastPrimitiveTyID) || + return (ID != VoidTyID && ID <= LastPrimitiveTyID) || ID == PointerTyID || ID == PackedTyID; } @@ -271,7 +271,7 @@ static Type *VoidTy , *BoolTy; static Type *SByteTy, *UByteTy, *ShortTy, *UShortTy, - *IntTy , *UIntTy, + *IntTy , *UIntTy, *LongTy , *ULongTy; static Type *FloatTy, *DoubleTy; @@ -295,7 +295,7 @@ assert(isAbstract() && "Cannot add a reference to a non-abstract type!"); ++RefCount; } - + void dropRef() const { assert(isAbstract() && "Cannot drop a reference to a non-abstract type!"); assert(RefCount && "No objects are currently referencing this object!"); @@ -325,7 +325,7 @@ //===----------------------------------------------------------------------===// // Define some inline methods for the AbstractTypeUser.h:PATypeHandle class. -// These are defined here because they MUST be inlined, yet are dependent on +// These are defined here because they MUST be inlined, yet are dependent on // the definition of the Type class. Of course Type derives from Value, which // contains an AbstractTypeUser instance, so there is no good way to factor out // the code. Hence this bit of uglyness. @@ -375,7 +375,7 @@ //===----------------------------------------------------------------------===// -// Provide specializations of GraphTraits to be able to treat a type as a +// Provide specializations of GraphTraits to be able to treat a type as a // graph of sub types... template <> struct GraphTraits { @@ -383,10 +383,10 @@ typedef Type::subtype_iterator ChildIteratorType; static inline NodeType *getEntryNode(Type *T) { return T; } - static inline ChildIteratorType child_begin(NodeType *N) { - return N->subtype_begin(); + static inline ChildIteratorType child_begin(NodeType *N) { + return N->subtype_begin(); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return N->subtype_end(); } }; @@ -396,15 +396,15 @@ typedef Type::subtype_iterator ChildIteratorType; static inline NodeType *getEntryNode(const Type *T) { return T; } - static inline ChildIteratorType child_begin(NodeType *N) { - return N->subtype_begin(); + static inline ChildIteratorType child_begin(NodeType *N) { + return N->subtype_begin(); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return N->subtype_end(); } }; -template <> inline bool isa_impl(const Type &Ty) { +template <> inline bool isa_impl(const Type &Ty) { return Ty.getTypeID() == Type::PointerTyID; } Index: llvm/include/llvm/Use.h diff -u llvm/include/llvm/Use.h:1.11 llvm/include/llvm/Use.h:1.12 --- llvm/include/llvm/Use.h:1.11 Mon Jan 31 19:21:51 2005 +++ llvm/include/llvm/Use.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/Use.h - Definition of the Use class ----------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This defines the Use class. The Use class represents the operand of an @@ -114,7 +114,7 @@ value_use_iterator(const _Self &I) : U(I.U) {} value_use_iterator() {} - bool operator==(const _Self &x) const { + bool operator==(const _Self &x) const { return U == x.U; } bool operator!=(const _Self &x) const { @@ -125,14 +125,14 @@ _Self &operator++() { // Preincrement assert(U && "Cannot increment end iterator!"); U = U->getNext(); - return *this; + return *this; } _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; + _Self tmp = *this; ++*this; return tmp; } // Retrieve a reference to the current SCC - UserTy *operator*() const { + UserTy *operator*() const { assert(U && "Cannot increment end iterator!"); return U->getUser(); } Index: llvm/include/llvm/User.h diff -u llvm/include/llvm/User.h:1.34 llvm/include/llvm/User.h:1.35 --- llvm/include/llvm/User.h:1.34 Sun Feb 27 00:15:09 2005 +++ llvm/include/llvm/User.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/User.h - User class definition ---------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This class defines the interface that one who 'use's a Value must implement. @@ -39,11 +39,11 @@ unsigned NumOperands; public: - User(const Type *Ty, unsigned vty, Use *OpList, unsigned NumOps, + User(const Type *Ty, unsigned vty, Use *OpList, unsigned NumOps, const std::string &name = "") : Value(Ty, vty, name), OperandList(OpList), NumOperands(NumOps) {} - Value *getOperand(unsigned i) const { + Value *getOperand(unsigned i) const { assert(i < NumOperands && "getOperand() out of range!"); return OperandList[i]; } @@ -69,7 +69,7 @@ // 'delete' a whole class at a time, even though there may be circular // references... first all references are dropped, and all use counts go to // zero. Then everything is delete'd for real. Note that no operations are - // valid on an object that has "dropped all references", except operator + // valid on an object that has "dropped all references", except operator // delete. // void dropAllReferences() { @@ -92,7 +92,7 @@ template<> struct simplify_type { typedef Value* SimpleType; - + static SimpleType getSimplifiedValue(const User::op_iterator &Val) { return static_cast(Val->get()); } @@ -103,7 +103,7 @@ template<> struct simplify_type { typedef Value* SimpleType; - + static SimpleType getSimplifiedValue(const User::const_op_iterator &Val) { return static_cast(Val->get()); } Index: llvm/include/llvm/Value.h diff -u llvm/include/llvm/Value.h:1.75 llvm/include/llvm/Value.h:1.76 --- llvm/include/llvm/Value.h:1.75 Tue Mar 15 21:46:55 2005 +++ llvm/include/llvm/Value.h Thu Apr 21 15:11:51 2005 @@ -1,10 +1,10 @@ //===-- llvm/Value.h - Definition of the Value class ------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the very important Value class. This is subclassed by a @@ -60,7 +60,7 @@ public: Value(const Type *Ty, unsigned scid, const std::string &name = ""); virtual ~Value(); - + /// dump - Support for debugging, callable in GDB: V->dump() // virtual void dump() const; @@ -68,19 +68,19 @@ /// print - Implement operator<< on Value... /// virtual void print(std::ostream &O) const = 0; - + /// All values are typed, get the type of this value. /// inline const Type *getType() const { return Ty; } - + // All values can potentially be named... inline bool hasName() const { return !Name.empty(); } inline const std::string &getName() const { return Name; } void setName(const std::string &name); - + /// replaceAllUsesWith - Go through the uses list for this definition and make - /// each use point to "V" instead of "this". After this completes, 'this's + /// each use point to "V" instead of "this". After this completes, 'this's /// use list is guaranteed to be empty. /// void replaceAllUsesWith(Value *V); @@ -184,7 +184,7 @@ if (Val) removeFromList(); } -void Use::set(Value *V) { +void Use::set(Value *V) { if (Val) removeFromList(); Val = V; if (V) V->addUse(*this); @@ -194,7 +194,7 @@ // isa - Provide some specializations of isa so that we don't have to include // the subtype header files to test to see if the value is a subclass... // -template <> inline bool isa_impl(const Value &Val) { +template <> inline bool isa_impl(const Value &Val) { return Val.getValueType() == Value::SimpleConstantVal || Val.getValueType() == Value::FunctionVal || Val.getValueType() == Value::GlobalVariableVal || @@ -202,22 +202,22 @@ Val.getValueType() == Value::ConstantAggregateZeroVal || Val.getValueType() == Value::UndefValueVal; } -template <> inline bool isa_impl(const Value &Val) { +template <> inline bool isa_impl(const Value &Val) { return Val.getValueType() == Value::ArgumentVal; } -template <> inline bool isa_impl(const Value &Val) { +template <> inline bool isa_impl(const Value &Val) { return Val.getValueType() >= Value::InstructionVal; } -template <> inline bool isa_impl(const Value &Val) { +template <> inline bool isa_impl(const Value &Val) { return Val.getValueType() == Value::BasicBlockVal; } -template <> inline bool isa_impl(const Value &Val) { +template <> inline bool isa_impl(const Value &Val) { return Val.getValueType() == Value::FunctionVal; } -template <> inline bool isa_impl(const Value &Val) { +template <> inline bool isa_impl(const Value &Val) { return Val.getValueType() == Value::GlobalVariableVal; } -template <> inline bool isa_impl(const Value &Val) { +template <> inline bool isa_impl(const Value &Val) { return isa(Val) || isa(Val); } From brukman at cs.uiuc.edu Thu Apr 21 15:14:01 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:14:01 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/BitSetVector.h DepthFirstIterator.h EquivalenceClasses.h GraphTraits.h HashExtras.h PostOrderIterator.h SCCIterator.h STLExtras.h SetOperations.h SetVector.h Statistic.h StringExtras.h Tree.h VectorExtras.h Message-ID: <200504212014.PAA00403@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: BitSetVector.h updated: 1.13 -> 1.14 DepthFirstIterator.h updated: 1.13 -> 1.14 EquivalenceClasses.h updated: 1.15 -> 1.16 GraphTraits.h updated: 1.7 -> 1.8 HashExtras.h updated: 1.12 -> 1.13 PostOrderIterator.h updated: 1.16 -> 1.17 SCCIterator.h updated: 1.20 -> 1.21 STLExtras.h updated: 1.20 -> 1.21 SetOperations.h updated: 1.7 -> 1.8 SetVector.h updated: 1.9 -> 1.10 Statistic.h updated: 1.13 -> 1.14 StringExtras.h updated: 1.25 -> 1.26 Tree.h updated: 1.11 -> 1.12 VectorExtras.h updated: 1.4 -> 1.5 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+95 -95) BitSetVector.h | 40 ++++++++++++++++++++-------------------- DepthFirstIterator.h | 22 +++++++++++----------- EquivalenceClasses.h | 12 ++++++------ GraphTraits.h | 12 ++++++------ HashExtras.h | 4 ++-- PostOrderIterator.h | 16 ++++++++-------- SCCIterator.h | 18 +++++++++--------- STLExtras.h | 20 ++++++++++---------- SetOperations.h | 10 +++++----- SetVector.h | 8 ++++---- Statistic.h | 4 ++-- StringExtras.h | 14 +++++++------- Tree.h | 6 +++--- VectorExtras.h | 4 ++-- 14 files changed, 95 insertions(+), 95 deletions(-) Index: llvm/include/llvm/ADT/BitSetVector.h diff -u llvm/include/llvm/ADT/BitSetVector.h:1.13 llvm/include/llvm/ADT/BitSetVector.h:1.14 --- llvm/include/llvm/ADT/BitSetVector.h:1.13 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/ADT/BitSetVector.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===-- llvm/ADT/BitVectorSet.h - A bit-vector rep. of sets -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This is an implementation of the bit-vector representation of sets. Unlike @@ -15,11 +15,11 @@ // universal set) can be chosen at creation time. // // External functions: -// +// // bool Disjoint(const BitSetVector& set1, const BitSetVector& set2): // Tests if two sets have an empty intersection. // This is more efficient than !(set1 & set2).any(). -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_BITSETVECTOR_H @@ -47,7 +47,7 @@ // Utility functions for the representation static unsigned NumWords(unsigned Size) { return (Size+BITSET_WORDSIZE-1)/BITSET_WORDSIZE; - } + } static unsigned LastWordSize(unsigned Size) { return Size % BITSET_WORDSIZE; } // Clear the unused bits in the last word. @@ -67,7 +67,7 @@ public: class iterator; - /// + /// /// Constructor: create a set of the maximum size maxSetSize. /// The set is initialized to empty. /// @@ -77,9 +77,9 @@ /// size - Return the number of bits tracked by this bit vector... unsigned size() const { return maxSize; } - /// + /// /// Modifier methods: reset, set for entire set, operator[] for one element. - /// + /// void reset() { for (unsigned i=0, N = bitsetVec.size(); i < N; ++i) bitsetVec[i].reset(); @@ -95,11 +95,11 @@ return bitsetVec[ndiv][nmod]; } iterator begin() { return iterator::begin(*this); } - iterator end() { return iterator::end(*this); } + iterator end() { return iterator::end(*this); } - /// + /// /// Comparison operations: equal, not equal - /// + /// bool operator == (const BitSetVector& set2) const { assert(maxSize == set2.maxSize && "Illegal == comparison"); for (unsigned i = 0; i < bitsetVec.size(); ++i) @@ -111,9 +111,9 @@ return ! (*this == set2); } - /// + /// /// Set membership operations: single element, any, none, count - /// + /// bool test(unsigned n) const { assert(n < size() && "BitSetVector: Bit number out of range"); unsigned ndiv = n / BITSET_WORDSIZE, nmod = n % BITSET_WORDSIZE; @@ -138,9 +138,9 @@ return (count() == size()); } - /// + /// /// Set operations: intersection, union, disjoint union, complement. - /// + /// BitSetVector operator& (const BitSetVector& set2) const { assert(maxSize == set2.maxSize && "Illegal intersection"); BitSetVector result(maxSize); @@ -170,19 +170,19 @@ return result; } - /// + /// /// Printing and debugging support - /// + /// void print(std::ostream &O) const; void dump() const { print(std::cerr); } public: - // + // // An iterator to enumerate the bits in a BitSetVector. // Eventually, this needs to inherit from bidirectional_iterator. // But this iterator may not be as useful as I once thought and // may just go away. - // + // class iterator { unsigned currentBit; unsigned currentWord; @@ -257,7 +257,7 @@ /// /// Optimized versions of fundamental comparison operations -/// +/// inline bool Disjoint(const BitSetVector& set1, const BitSetVector& set2) { Index: llvm/include/llvm/ADT/DepthFirstIterator.h diff -u llvm/include/llvm/ADT/DepthFirstIterator.h:1.13 llvm/include/llvm/ADT/DepthFirstIterator.h:1.14 --- llvm/include/llvm/ADT/DepthFirstIterator.h:1.13 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/ADT/DepthFirstIterator.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===- llvm/ADT/DepthFirstIterator.h - Depth First iterator -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file builds on the ADT/GraphTraits.h file to build generic depth @@ -58,7 +58,7 @@ // Generic Depth First Iterator -template::NodeType*>, bool ExtStorage = false, class GT = GraphTraits > class df_iterator : public forward_iterator, @@ -85,7 +85,7 @@ VisitStack.push_back(std::make_pair(Node, GT::child_begin(Node))); } } - inline df_iterator(SetType &S) + inline df_iterator(SetType &S) : df_iterator_storage(S) { // End is when stack is empty } @@ -106,13 +106,13 @@ } static inline _Self end(GraphT G, SetType &S) { return _Self(S); } - inline bool operator==(const _Self& x) const { + inline bool operator==(const _Self& x) const { return VisitStack.size() == x.VisitStack.size() && VisitStack == x.VisitStack; } inline bool operator!=(const _Self& x) const { return !operator==(x); } - inline pointer operator*() const { + inline pointer operator*() const { return VisitStack.back().first; } @@ -127,7 +127,7 @@ std::pair &Top = VisitStack.back(); NodeType *Node = Top.first; ChildItTy &It = Top.second; - + while (It != GT::child_end(Node)) { NodeType *Next = *It++; if (!this->Visited.count(Next)) { // Has our next sibling been visited? @@ -137,22 +137,22 @@ return *this; } } - + // Oops, ran out of successors... go up a level on the stack. VisitStack.pop_back(); } while (!VisitStack.empty()); - return *this; + return *this; } inline _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; + _Self tmp = *this; ++*this; return tmp; } // nodeVisited - return true if this iterator has already visited the // specified node. This is public, and will probably be used to iterate over // nodes that a depth first iteration did not find: ie unreachable nodes. // - inline bool nodeVisited(NodeType *Node) const { + inline bool nodeVisited(NodeType *Node) const { return this->Visited.count(Node) != 0; } }; Index: llvm/include/llvm/ADT/EquivalenceClasses.h diff -u llvm/include/llvm/ADT/EquivalenceClasses.h:1.15 llvm/include/llvm/ADT/EquivalenceClasses.h:1.16 --- llvm/include/llvm/ADT/EquivalenceClasses.h:1.15 Sun Mar 20 19:36:35 2005 +++ llvm/include/llvm/ADT/EquivalenceClasses.h Thu Apr 21 15:13:50 2005 @@ -1,15 +1,15 @@ //===-- llvm/ADT/EquivalenceClasses.h - Generic Equiv. Classes --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // Generic implementation of equivalence classes through the use Tarjan's // efficient union-find algorithm. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_EQUIVALENCECLASSES_H @@ -128,7 +128,7 @@ } return *this; } - + //===--------------------------------------------------------------------===// // Inspection methods // @@ -220,7 +220,7 @@ // point to the L2 leader node. const ECValue &L1LV = *L1.Node, &L2LV = *L2.Node; L1LV.getEndOfList()->setNext(&L2LV); - + // Update L1LV's end of list pointer. L1LV.Leader = L2LV.getEndOfList(); Index: llvm/include/llvm/ADT/GraphTraits.h diff -u llvm/include/llvm/ADT/GraphTraits.h:1.7 llvm/include/llvm/ADT/GraphTraits.h:1.8 --- llvm/include/llvm/ADT/GraphTraits.h:1.7 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/ADT/GraphTraits.h Thu Apr 21 15:13:50 2005 @@ -1,13 +1,13 @@ //===-- llvm/ADT/GraphTraits.h - Graph traits template ----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This file defines the little GraphTraits template class that should be +// This file defines the little GraphTraits template class that should be // specialized by classes that want to be iteratable by generic graph iterators. // // This file also defines the marker class Inverse that is used to iterate over @@ -35,9 +35,9 @@ // static ChildIteratorType child_begin(NodeType *) // static ChildIteratorType child_end (NodeType *) - // Return iterators that point to the beginning and ending of the child + // Return iterators that point to the beginning and ending of the child // node list for the specified node. - // + // // typedef ...iterator nodes_iterator; @@ -50,7 +50,7 @@ // If anyone tries to use this class without having an appropriate // specialization, make an error. If you get this error, it's because you // need to include the appropriate specialization of GraphTraits<> for your - // graph, or you need to define it for a new graph type. Either that or + // graph, or you need to define it for a new graph type. Either that or // your argument to XXX_begin(...) is unknown or needs to have the proper .h // file #include'd. // Index: llvm/include/llvm/ADT/HashExtras.h diff -u llvm/include/llvm/ADT/HashExtras.h:1.12 llvm/include/llvm/ADT/HashExtras.h:1.13 --- llvm/include/llvm/ADT/HashExtras.h:1.12 Wed Dec 8 14:59:18 2004 +++ llvm/include/llvm/ADT/HashExtras.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===-- llvm/ADT/HashExtras.h - Useful functions for STL hash ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains some templates that are useful if you are working with the Index: llvm/include/llvm/ADT/PostOrderIterator.h diff -u llvm/include/llvm/ADT/PostOrderIterator.h:1.16 llvm/include/llvm/ADT/PostOrderIterator.h:1.17 --- llvm/include/llvm/ADT/PostOrderIterator.h:1.16 Tue Sep 28 09:42:44 2004 +++ llvm/include/llvm/ADT/PostOrderIterator.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===- llvm/ADT/PostOrderIterator.h - PostOrder iterator --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file builds on the ADT/GraphTraits.h file to build a generic graph @@ -58,12 +58,12 @@ static inline _Self begin(GraphT G) { return _Self(GT::getEntryNode(G)); } static inline _Self end (GraphT G) { return _Self(); } - inline bool operator==(const _Self& x) const { + inline bool operator==(const _Self& x) const { return VisitStack == x.VisitStack; } inline bool operator!=(const _Self& x) const { return !operator==(x); } - inline pointer operator*() const { + inline pointer operator*() const { return VisitStack.top().first; } @@ -77,11 +77,11 @@ VisitStack.pop(); if (!VisitStack.empty()) traverseChild(); - return *this; + return *this; } inline _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; + _Self tmp = *this; ++*this; return tmp; } }; @@ -112,10 +112,10 @@ //===--------------------------------------------------------------------===// // Reverse Post Order CFG iterator code //===--------------------------------------------------------------------===// -// +// // This is used to visit basic blocks in a method in reverse post order. This // class is awkward to use because I don't know a good incremental algorithm to -// computer RPO from a graph. Because of this, the construction of the +// computer RPO from a graph. Because of this, the construction of the // ReversePostOrderTraversal object is expensive (it must walk the entire graph // with a postorder iterator to build the data structures). The moral of this // story is: Don't create more ReversePostOrderTraversal classes than necessary. Index: llvm/include/llvm/ADT/SCCIterator.h diff -u llvm/include/llvm/ADT/SCCIterator.h:1.20 llvm/include/llvm/ADT/SCCIterator.h:1.21 --- llvm/include/llvm/ADT/SCCIterator.h:1.20 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/ADT/SCCIterator.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===-- Support/SCCIterator.h - Strongly Connected Comp. Iter. --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This builds on the llvm/ADT/GraphTraits.h file to find the strongly connected @@ -12,7 +12,7 @@ // // The SCC iterator has the important property that if a node in SCC S1 has an // edge to a node in SCC S2, then it visits S1 *after* S2. -// +// // To visit S1 *before* S2, use the scc_iterator on the Inverse graph. // (NOTE: This requires some simple wrappers and is not supported yet.) // @@ -118,7 +118,7 @@ do { CurrentSCC.push_back(SCCNodeStack.back()); SCCNodeStack.pop_back(); - nodeVisitNumbers[CurrentSCC.back()] = ~0UL; + nodeVisitNumbers[CurrentSCC.back()] = ~0UL; } while (CurrentSCC.back() != visitingN); return; } @@ -144,7 +144,7 @@ return CurrentSCC.empty(); } - inline bool operator==(const _Self& x) const { + inline bool operator==(const _Self& x) const { return VisitStack == x.VisitStack && CurrentSCC == x.CurrentSCC; } inline bool operator!=(const _Self& x) const { return !operator==(x); } @@ -152,18 +152,18 @@ // Iterator traversal: forward iteration only inline _Self& operator++() { // Preincrement GetNextSCC(); - return *this; + return *this; } inline _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; + _Self tmp = *this; ++*this; return tmp; } // Retrieve a reference to the current SCC - inline const SccTy &operator*() const { + inline const SccTy &operator*() const { assert(!CurrentSCC.empty() && "Dereferencing END SCC iterator!"); return CurrentSCC; } - inline SccTy &operator*() { + inline SccTy &operator*() { assert(!CurrentSCC.empty() && "Dereferencing END SCC iterator!"); return CurrentSCC; } Index: llvm/include/llvm/ADT/STLExtras.h diff -u llvm/include/llvm/ADT/STLExtras.h:1.20 llvm/include/llvm/ADT/STLExtras.h:1.21 --- llvm/include/llvm/ADT/STLExtras.h:1.20 Tue Feb 22 17:36:37 2005 +++ llvm/include/llvm/ADT/STLExtras.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===- llvm/ADT/STLExtras.h - Useful STL related functions ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains some templates that are useful if you are working with the @@ -35,13 +35,13 @@ }; // deleter - Very very very simple method that is used to invoke operator -// delete on something. It is used like this: +// delete on something. It is used like this: // // for_each(V.begin(), B.end(), deleter); // -template -static inline void deleter(T *Ptr) { - delete Ptr; +template +static inline void deleter(T *Ptr) { + delete Ptr; } @@ -78,7 +78,7 @@ inline mapped_iterator(const mapped_iterator &It) : current(It.current), Fn(It.Fn) {} - inline value_type operator*() const { // All this work to do this + inline value_type operator*() const { // All this work to do this return Fn(*current); // little change } @@ -90,7 +90,7 @@ _Self& operator+= (difference_type n) { current += n; return *this; } _Self operator- (difference_type n) const { return _Self(current - n); } _Self& operator-= (difference_type n) { current -= n; return *this; } - reference operator[](difference_type n) const { return *(*this + n); } + reference operator[](difference_type n) const { return *(*this + n); } inline bool operator!=(const _Self &X) const { return !operator==(X); } inline bool operator==(const _Self &X) const { return current == X.current; } @@ -102,7 +102,7 @@ }; template -inline mapped_iterator<_Iterator, Func> +inline mapped_iterator<_Iterator, Func> operator+(typename mapped_iterator<_Iterator, Func>::difference_type N, const mapped_iterator<_Iterator, Func>& X) { return mapped_iterator<_Iterator, Func>(X.getCurrent() - N); @@ -164,7 +164,7 @@ // a std::pair. Since an example is worth 1000 words: // // typedef std::map Int2IntMap; -// +// // Int2IntMap myMap; // Int2IntMap::iterator where; // bool inserted; Index: llvm/include/llvm/ADT/SetOperations.h diff -u llvm/include/llvm/ADT/SetOperations.h:1.7 llvm/include/llvm/ADT/SetOperations.h:1.8 --- llvm/include/llvm/ADT/SetOperations.h:1.7 Wed Oct 13 10:09:21 2004 +++ llvm/include/llvm/ADT/SetOperations.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===-- llvm/ADT/SetOperations.h - Generic Set Operations -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines generic set operations that may be used on set's of @@ -20,7 +20,7 @@ /// set_union(A, B) - Compute A := A u B, return whether A changed. /// template -bool set_union(S1Ty &S1, const S2Ty &S2) { +bool set_union(S1Ty &S1, const S2Ty &S2) { bool Changed = false; for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end(); @@ -60,9 +60,9 @@ /// set_subtract(A, B) - Compute A := A - B /// template -void set_subtract(S1Ty &S1, const S2Ty &S2) { +void set_subtract(S1Ty &S1, const S2Ty &S2) { for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end(); - SI != SE; ++SI) + SI != SE; ++SI) S1.erase(*SI); } Index: llvm/include/llvm/ADT/SetVector.h diff -u llvm/include/llvm/ADT/SetVector.h:1.9 llvm/include/llvm/ADT/SetVector.h:1.10 --- llvm/include/llvm/ADT/SetVector.h:1.9 Wed Oct 13 10:11:23 2004 +++ llvm/include/llvm/ADT/SetVector.h Thu Apr 21 15:13:50 2005 @@ -1,13 +1,13 @@ //===- llvm/ADT/SetVector.h - Set with insert order iteration ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by Reid Spencer and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This file implements a set that has insertion order iteration +// This file implements a set that has insertion order iteration // characteristics. This is useful for keeping a set of things that need to be // visited later but in a deterministic order (insertion order). The interface // is purposefully minimal. @@ -24,7 +24,7 @@ namespace llvm { -/// This class provides a way to keep a set of things that also has the +/// This class provides a way to keep a set of things that also has the /// property of a deterministic iteration order. The order of iteration is the /// order of insertion. /// @brief A vector that has set insertion semantics. Index: llvm/include/llvm/ADT/Statistic.h diff -u llvm/include/llvm/ADT/Statistic.h:1.13 llvm/include/llvm/ADT/Statistic.h:1.14 --- llvm/include/llvm/ADT/Statistic.h:1.13 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/ADT/Statistic.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===-- llvm/ADT/Statistic.h - Easy way to expose stats ---------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the 'Statistic' class, which is designed to be an easy way Index: llvm/include/llvm/ADT/StringExtras.h diff -u llvm/include/llvm/ADT/StringExtras.h:1.25 llvm/include/llvm/ADT/StringExtras.h:1.26 --- llvm/include/llvm/ADT/StringExtras.h:1.25 Fri Jan 28 01:22:20 2005 +++ llvm/include/llvm/ADT/StringExtras.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===-- llvm/ADT/StringExtras.h - Useful string functions -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains some functions that are useful when dealing with strings. @@ -77,21 +77,21 @@ } static inline std::string itostr(long long X) { - if (X < 0) + if (X < 0) return utostr(static_cast(-X), true); else return utostr(static_cast(X)); } - + static inline std::string itostr(long X) { - if (X < 0) + if (X < 0) return utostr(static_cast(-X), true); else return utostr(static_cast(X)); } static inline std::string itostr(int X) { - if (X < 0) + if (X < 0) return utostr(static_cast(-X), true); else return utostr(static_cast(X)); @@ -105,7 +105,7 @@ return B; } -static inline std::string LowercaseString(const std::string &S) { +static inline std::string LowercaseString(const std::string &S) { std::string result(S); for (unsigned i = 0; i < S.length(); ++i) if (isupper(result[i])) Index: llvm/include/llvm/ADT/Tree.h diff -u llvm/include/llvm/ADT/Tree.h:1.11 llvm/include/llvm/ADT/Tree.h:1.12 --- llvm/include/llvm/ADT/Tree.h:1.11 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/ADT/Tree.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===- llvm/ADT/Tree.h - Generic n-way tree structure -----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This class defines a generic N way tree node structure. The tree structure @@ -35,7 +35,7 @@ ConcreteTreeNode *par) : Children(children), Parent(par) {} inline Tree(const std::vector &children, - ConcreteTreeNode *par, const Payload &data) + ConcreteTreeNode *par, const Payload &data) : Children(children), Parent(par), Data(data) {} // Tree dtor - Free all children Index: llvm/include/llvm/ADT/VectorExtras.h diff -u llvm/include/llvm/ADT/VectorExtras.h:1.4 llvm/include/llvm/ADT/VectorExtras.h:1.5 --- llvm/include/llvm/ADT/VectorExtras.h:1.4 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/ADT/VectorExtras.h Thu Apr 21 15:13:50 2005 @@ -1,10 +1,10 @@ //===-- llvm/ADT/VectorExtras.h - Helpers for std::vector -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains helper functions which are useful for working with the From brukman at cs.uiuc.edu Thu Apr 21 15:16:43 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:16:43 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Analysis/AliasAnalysis.h AliasSetTracker.h CallGraph.h CFGPrinter.h ConstantsScanner.h Dominators.h Expressions.h FindUnsafePointerTypes.h FindUsedTypes.h Interval.h IntervalIterator.h IntervalPartition.h LoadValueNumbering.h LoopInfo.h Passes.h PostDominators.h ProfileInfo.h ProfileInfoLoader.h ProfileInfoTypes.h ScalarEvolutionExpressions.h ScalarEvolution.h Trace.h ValueNumbering.h Verifier.h Message-ID: <200504212016.PAA00505@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Analysis: AliasAnalysis.h updated: 1.20 -> 1.21 AliasSetTracker.h updated: 1.24 -> 1.25 CallGraph.h updated: 1.42 -> 1.43 CFGPrinter.h updated: 1.1 -> 1.2 ConstantsScanner.h updated: 1.15 -> 1.16 Dominators.h updated: 1.48 -> 1.49 Expressions.h updated: 1.11 -> 1.12 FindUnsafePointerTypes.h updated: 1.17 -> 1.18 FindUsedTypes.h updated: 1.23 -> 1.24 Interval.h updated: 1.19 -> 1.20 IntervalIterator.h updated: 1.20 -> 1.21 IntervalPartition.h updated: 1.21 -> 1.22 LoadValueNumbering.h updated: 1.4 -> 1.5 LoopInfo.h updated: 1.44 -> 1.45 Passes.h updated: 1.5 -> 1.6 PostDominators.h updated: 1.8 -> 1.9 ProfileInfo.h updated: 1.4 -> 1.5 ProfileInfoLoader.h updated: 1.3 -> 1.4 ProfileInfoTypes.h updated: 1.1 -> 1.2 ScalarEvolutionExpressions.h updated: 1.5 -> 1.6 ScalarEvolution.h updated: 1.9 -> 1.10 Trace.h updated: 1.3 -> 1.4 ValueNumbering.h updated: 1.7 -> 1.8 Verifier.h updated: 1.13 -> 1.14 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+143 -143) AliasAnalysis.h | 36 +++++++++++++++--------------- AliasSetTracker.h | 18 +++++++-------- CFGPrinter.h | 4 +-- CallGraph.h | 6 ++--- ConstantsScanner.h | 8 +++--- Dominators.h | 16 ++++++------- Expressions.h | 6 ++--- FindUnsafePointerTypes.h | 8 +++--- FindUsedTypes.h | 4 +-- Interval.h | 18 +++++++-------- IntervalIterator.h | 50 +++++++++++++++++++++---------------------- IntervalPartition.h | 4 +-- LoadValueNumbering.h | 4 +-- LoopInfo.h | 16 ++++++------- Passes.h | 20 ++++++++--------- PostDominators.h | 4 +-- ProfileInfo.h | 6 ++--- ProfileInfoLoader.h | 4 +-- ProfileInfoTypes.h | 4 +-- ScalarEvolution.h | 16 ++++++------- ScalarEvolutionExpressions.h | 12 +++++----- Trace.h | 2 - ValueNumbering.h | 4 +-- Verifier.h | 16 ++++++------- 24 files changed, 143 insertions(+), 143 deletions(-) Index: llvm/include/llvm/Analysis/AliasAnalysis.h diff -u llvm/include/llvm/Analysis/AliasAnalysis.h:1.20 llvm/include/llvm/Analysis/AliasAnalysis.h:1.21 --- llvm/include/llvm/Analysis/AliasAnalysis.h:1.20 Wed Mar 23 17:27:34 2005 +++ llvm/include/llvm/Analysis/AliasAnalysis.h Thu Apr 21 15:16:31 2005 @@ -1,10 +1,10 @@ //===- llvm/Analysis/AliasAnalysis.h - Alias Analysis Interface -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the generic AliasAnalysis interface, which is used as the @@ -50,7 +50,7 @@ /// called multiple times. /// void InitializeAliasAnalysis(Pass *P); - + // getAnalysisUsage - All alias analysis implementations should invoke this // directly (using AliasAnalysis::getAnalysisUsage(AU)) to make sure that // TargetData is required by the pass. @@ -108,8 +108,8 @@ /// bits which may be or'd together. /// enum ModRefResult { NoModRef = 0, Ref = 1, Mod = 2, ModRef = 3 }; - - + + /// ModRefBehavior - Summary of how a function affects memory in the program. /// Loads from constant globals are not considered memory accesses for this /// interface. Also, functions may freely modify stack space local to their @@ -120,14 +120,14 @@ // // This property corresponds to the GCC 'const' attribute. DoesNotAccessMemory, - + // AccessesArguments - This function accesses function arguments in // non-volatile and well known ways, but does not access any other memory. // // Clients may call getArgumentAccesses to get specific information about // how pointer arguments are used. AccessesArguments, - + // AccessesArgumentsAndGlobals - This function has accesses function // arguments and global variables in non-volatile and well-known ways, but // does not access any other memory. @@ -135,18 +135,18 @@ // Clients may call getArgumentAccesses to get specific information about // how pointer arguments and globals are used. AccessesArgumentsAndGlobals, - + // OnlyReadsMemory - This function does not perform any non-local stores or // volatile loads, but may read from any memory location. // // This property corresponds to the GCC 'pure' attribute. OnlyReadsMemory, - + // UnknownModRefBehavior - This indicates that the function could not be // classified into one of the behaviors above. UnknownModRefBehavior }; - + /// PointerAccessInfo - This struct is used to return results for pointers, /// globals, and the return value of a function. struct PointerAccessInfo { @@ -154,11 +154,11 @@ /// the function, a GlobalVariable, or null, corresponding to the return /// value for the function. Value *V; - + /// ModRefInfo - Whether the pointer is loaded or stored to/from. /// ModRefResult ModRefInfo; - + /// AccessType - Specific fine-grained access information for the argument. /// If none of these classifications is general enough, the /// getModRefBehavior method should not return AccessesArguments*. If a @@ -168,25 +168,25 @@ /// ScalarAccess - The pointer is dereferenced. /// ScalarAccess, - + /// ArrayAccess - The pointer is indexed through as an array of elements. /// ArrayAccess, - + /// ElementAccess ?? P->F only? - + /// CallsThrough - Indirect calls are made through the specified function /// pointer. CallsThrough, }; - }; - + }; + /// getModRefBehavior - Return the behavior of the specified function if /// called from the specified call site. The call site may be null in which /// case the most generic behavior of this function should be returned. virtual ModRefBehavior getModRefBehavior(Function *F, CallSite CS, std::vector *Info = 0); - + /// doesNotAccessMemory - If the specified function is known to never read or /// write memory, return true. If the function only reads from known-constant /// memory, it is also legal to return true. Functions that unwind the stack Index: llvm/include/llvm/Analysis/AliasSetTracker.h diff -u llvm/include/llvm/Analysis/AliasSetTracker.h:1.24 llvm/include/llvm/Analysis/AliasSetTracker.h:1.25 --- llvm/include/llvm/Analysis/AliasSetTracker.h:1.24 Sat Nov 27 12:37:04 2004 +++ llvm/include/llvm/Analysis/AliasSetTracker.h Thu Apr 21 15:16:31 2005 @@ -1,17 +1,17 @@ //===- llvm/Analysis/AliasSetTracker.h - Build Alias Sets -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines two classes: AliasSetTracker and AliasSet. These interface // are used to classify a collection of pointer references into a maximal number // of disjoint sets. Each AliasSet object constructed by the AliasSetTracker // object refers to memory disjoint from the other sets. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_ALIASSETTRACKER_H @@ -58,7 +58,7 @@ unsigned getSize() const { return Size; } - AliasSet *getAliasSet(AliasSetTracker &AST) { + AliasSet *getAliasSet(AliasSetTracker &AST) { assert(AS && "No AliasSet yet!"); if (AS->Forward) { AliasSet *OldAS = AS; @@ -163,7 +163,7 @@ HashNodePair *CurNode; public: iterator(HashNodePair *CN = 0) : CurNode(CN) {} - + bool operator==(const iterator& x) const { return CurNode == x.CurNode; } @@ -173,7 +173,7 @@ CurNode = I.CurNode; return *this; } - + value_type &operator*() const { assert(CurNode && "Dereferencing AliasSet.end()!"); return *CurNode; @@ -182,14 +182,14 @@ Value *getPointer() const { return CurNode->first; } unsigned getSize() const { return CurNode->second.getSize(); } - + iterator& operator++() { // Preincrement assert(CurNode && "Advancing past AliasSet.end()!"); CurNode = CurNode->second.getNext(); return *this; } iterator operator++(int) { // Postincrement - iterator tmp = *this; ++*this; return tmp; + iterator tmp = *this; ++*this; return tmp; } }; @@ -306,7 +306,7 @@ AliasSet *getAliasSetForPointerIfExists(Value *P, unsigned Size) { return findAliasSetForPointer(P, Size); } - + /// containsPointer - Return true if the specified location is represented by /// this alias set, false otherwise. This does not modify the AST object or /// alias sets. Index: llvm/include/llvm/Analysis/CallGraph.h diff -u llvm/include/llvm/Analysis/CallGraph.h:1.42 llvm/include/llvm/Analysis/CallGraph.h:1.43 --- llvm/include/llvm/Analysis/CallGraph.h:1.42 Sun Sep 19 23:42:22 2004 +++ llvm/include/llvm/Analysis/CallGraph.h Thu Apr 21 15:16:31 2005 @@ -1,13 +1,13 @@ //===- CallGraph.h - Build a Module's call graph ----------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This interface is used to build and manipulate a call graph, which is a very +// This interface is used to build and manipulate a call graph, which is a very // useful tool for interprocedural optimization. // // Every function in a module is represented as a node in the call graph. The Index: llvm/include/llvm/Analysis/CFGPrinter.h diff -u llvm/include/llvm/Analysis/CFGPrinter.h:1.1 llvm/include/llvm/Analysis/CFGPrinter.h:1.2 --- llvm/include/llvm/Analysis/CFGPrinter.h:1.1 Mon Apr 26 11:27:53 2004 +++ llvm/include/llvm/Analysis/CFGPrinter.h Thu Apr 21 15:16:31 2005 @@ -1,10 +1,10 @@ //===-- CFGPrinter.h - CFG printer external interface ------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines external functions that can be called to explicitly Index: llvm/include/llvm/Analysis/ConstantsScanner.h diff -u llvm/include/llvm/Analysis/ConstantsScanner.h:1.15 llvm/include/llvm/Analysis/ConstantsScanner.h:1.16 --- llvm/include/llvm/Analysis/ConstantsScanner.h:1.15 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/Analysis/ConstantsScanner.h Thu Apr 21 15:16:31 2005 @@ -1,10 +1,10 @@ //==- llvm/Analysis/ConstantsScanner.h - Iterate over constants -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This class implements an iterator to walk through the constants referenced by @@ -48,7 +48,7 @@ : InstI(inst_end(F)), OpIdx(0) { } - inline bool operator==(const _Self& x) const { return OpIdx == x.OpIdx && + inline bool operator==(const _Self& x) const { return OpIdx == x.OpIdx && InstI == x.InstI; } inline bool operator!=(const _Self& x) const { return !operator==(x); } @@ -75,7 +75,7 @@ } inline _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; + _Self tmp = *this; ++*this; return tmp; } inline bool atEnd() const { return InstI.atEnd(); } Index: llvm/include/llvm/Analysis/Dominators.h diff -u llvm/include/llvm/Analysis/Dominators.h:1.48 llvm/include/llvm/Analysis/Dominators.h:1.49 --- llvm/include/llvm/Analysis/Dominators.h:1.48 Mon Dec 6 22:03:45 2004 +++ llvm/include/llvm/Analysis/Dominators.h Thu Apr 21 15:16:31 2005 @@ -1,10 +1,10 @@ //===- llvm/Analysis/Dominators.h - Dominator Info Calculation --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the following classes: @@ -13,13 +13,13 @@ // 2. DominatorSet: Calculates the [reverse] dominator set for a function // 3. DominatorTree: Represent the ImmediateDominator as an explicit tree // structure. -// 4. DominanceFrontier: Calculate and hold the dominance frontier for a +// 4. DominanceFrontier: Calculate and hold the dominance frontier for a // function. // // These data structures are listed in increasing order of complexity. It -// takes longer to calculate the dominator frontier, for example, than the +// takes longer to calculate the dominator frontier, for example, than the // ImmediateDominator mapping. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_DOMINATORS_H @@ -140,9 +140,9 @@ unsigned Semi; unsigned Size; BasicBlock *Label, *Parent, *Child, *Ancestor; - + std::vector Bucket; - + InfoRec() : Semi(0), Size(0), Label(0), Parent(0), Child(0), Ancestor(0){} }; @@ -306,7 +306,7 @@ inline Node *getIDom() const { return IDom; } inline const std::vector &getChildren() const { return Children; } - /// dominates - Returns true iff this dominates N. Note that this is not a + /// dominates - Returns true iff this dominates N. Note that this is not a /// constant time operation! /// inline bool dominates(const Node *N) const { Index: llvm/include/llvm/Analysis/Expressions.h diff -u llvm/include/llvm/Analysis/Expressions.h:1.11 llvm/include/llvm/Analysis/Expressions.h:1.12 --- llvm/include/llvm/Analysis/Expressions.h:1.11 Thu Mar 11 17:08:20 2004 +++ llvm/include/llvm/Analysis/Expressions.h Thu Apr 21 15:16:31 2005 @@ -1,17 +1,17 @@ //===- llvm/Analysis/Expressions.h - Expression Analysis Utils --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a package of expression analysis utilties: // // ClassifyExpr: Analyze an expression to determine the complexity of the // expression, and which other variables it depends on. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_EXPRESSIONS_H Index: llvm/include/llvm/Analysis/FindUnsafePointerTypes.h diff -u llvm/include/llvm/Analysis/FindUnsafePointerTypes.h:1.17 llvm/include/llvm/Analysis/FindUnsafePointerTypes.h:1.18 --- llvm/include/llvm/Analysis/FindUnsafePointerTypes.h:1.17 Sun Sep 19 23:42:22 2004 +++ llvm/include/llvm/Analysis/FindUnsafePointerTypes.h Thu Apr 21 15:16:31 2005 @@ -1,13 +1,13 @@ //===- llvm/Analysis/FindUnsafePointerTypes.h - Unsafe pointers -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This file defines a pass that can be used to determine, interprocedurally, +// This file defines a pass that can be used to determine, interprocedurally, // which pointer types are accessed unsafely in a program. If there is an // "unsafe" access to a specific pointer type, transformations that depend on // type safety cannot be permitted. @@ -18,7 +18,7 @@ // Additionally, this analysis exports a hidden command line argument that (when // enabled) prints out the reasons a type was determined to be unsafe. Just add // -printunsafeptrinst to the command line of the tool you want to get it. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_UNSAFEPOINTERTYPES_H Index: llvm/include/llvm/Analysis/FindUsedTypes.h diff -u llvm/include/llvm/Analysis/FindUsedTypes.h:1.23 llvm/include/llvm/Analysis/FindUsedTypes.h:1.24 --- llvm/include/llvm/Analysis/FindUsedTypes.h:1.23 Sun Sep 19 23:42:22 2004 +++ llvm/include/llvm/Analysis/FindUsedTypes.h Thu Apr 21 15:16:31 2005 @@ -1,10 +1,10 @@ //===- llvm/Analysis/FindUsedTypes.h - Find all Types in use ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This pass is used to seek out all of the types in use by the program. Index: llvm/include/llvm/Analysis/Interval.h diff -u llvm/include/llvm/Analysis/Interval.h:1.19 llvm/include/llvm/Analysis/Interval.h:1.20 --- llvm/include/llvm/Analysis/Interval.h:1.19 Thu Apr 21 11:04:44 2005 +++ llvm/include/llvm/Analysis/Interval.h Thu Apr 21 15:16:31 2005 @@ -1,15 +1,15 @@ //===- llvm/Analysis/Interval.h - Interval Class Declaration ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the declaration of the Interval class, which // represents a set of CFG nodes and is a portion of an interval partition. -// +// // Intervals have some interesting and useful properties, including the // following: // 1. The header node of an interval dominates all of the elements of the @@ -86,9 +86,9 @@ //return find(Successors.begin(), Successors.end(), BB) != Successors.end(); } - /// Equality operator. It is only valid to compare two intervals from the same - /// partition, because of this, all we have to check is the header node for - /// equality. + /// Equality operator. It is only valid to compare two intervals from the + /// same partition, because of this, all we have to check is the header node + /// for equality. /// inline bool operator==(const Interval &I) const { return HeaderNode == I.HeaderNode; @@ -131,7 +131,7 @@ static inline ChildIteratorType child_begin(NodeType *N) { return succ_begin(N); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return succ_end(N); } }; @@ -140,10 +140,10 @@ typedef Interval NodeType; typedef Interval::pred_iterator ChildIteratorType; static NodeType *getEntryNode(Inverse G) { return G.Graph; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return pred_begin(N); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return pred_end(N); } }; Index: llvm/include/llvm/Analysis/IntervalIterator.h diff -u llvm/include/llvm/Analysis/IntervalIterator.h:1.20 llvm/include/llvm/Analysis/IntervalIterator.h:1.21 --- llvm/include/llvm/Analysis/IntervalIterator.h:1.20 Thu Oct 14 09:51:09 2004 +++ llvm/include/llvm/Analysis/IntervalIterator.h Thu Apr 21 15:16:32 2005 @@ -1,16 +1,16 @@ //===- IntervalIterator.h - Interval Iterator Declaration -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines an iterator that enumerates the intervals in a control flow // graph of some sort. This iterator is parametric, allowing iterator over the // following types of graphs: -// +// // 1. A Function* object, composed of BasicBlock nodes. // 2. An IntervalPartition& object, composed of Interval nodes. // @@ -18,9 +18,9 @@ // in depth first order. These intervals are completely filled in except for // the predecessor fields (the successor information is filled in however). // -// By default, the intervals created by this iterator are deleted after they +// By default, the intervals created by this iterator are deleted after they // are no longer any use to the iterator. This behavior can be changed by -// passing a false value into the intervals_begin() function. This causes the +// passing a false value into the intervals_begin() function. This causes the // IOwnMem member to be set, and the intervals to not be deleted. // // It is only safe to use this if all of the intervals are deleted by the caller @@ -42,27 +42,27 @@ namespace llvm { -// getNodeHeader - Given a source graph node and the source graph, return the +// getNodeHeader - Given a source graph node and the source graph, return the // BasicBlock that is the header node. This is the opposite of // getSourceGraphNode. // inline BasicBlock *getNodeHeader(BasicBlock *BB) { return BB; } inline BasicBlock *getNodeHeader(Interval *I) { return I->getHeaderNode(); } -// getSourceGraphNode - Given a BasicBlock and the source graph, return the +// getSourceGraphNode - Given a BasicBlock and the source graph, return the // source graph node that corresponds to the BasicBlock. This is the opposite // of getNodeHeader. // inline BasicBlock *getSourceGraphNode(Function *, BasicBlock *BB) { - return BB; + return BB; } -inline Interval *getSourceGraphNode(IntervalPartition *IP, BasicBlock *BB) { +inline Interval *getSourceGraphNode(IntervalPartition *IP, BasicBlock *BB) { return IP->getBlockInterval(BB); } // addNodeToInterval - This method exists to assist the generic ProcessNode -// with the task of adding a node to the new interval, depending on the -// type of the source node. In the case of a CFG source graph (BasicBlock +// with the task of adding a node to the new interval, depending on the +// type of the source node. In the case of a CFG source graph (BasicBlock // case), the BasicBlock itself is added to the interval. // inline void addNodeToInterval(Interval *Int, BasicBlock *BB) { @@ -70,8 +70,8 @@ } // addNodeToInterval - This method exists to assist the generic ProcessNode -// with the task of adding a node to the new interval, depending on the -// type of the source node. In the case of a CFG source graph (BasicBlock +// with the task of adding a node to the new interval, depending on the +// type of the source node. In the case of a CFG source graph (BasicBlock // case), the BasicBlock itself is added to the interval. In the case of // an IntervalPartition source graph (Interval case), all of the member // BasicBlocks are added to the interval. @@ -96,7 +96,7 @@ public: typedef IntervalIterator _Self; typedef std::forward_iterator_tag iterator_category; - + IntervalIterator() {} // End iterator, empty stack IntervalIterator(Function *M, bool OwnMemory) : IOwnMem(OwnMemory) { OrigContainer = M; @@ -148,14 +148,14 @@ IntStack.pop(); } while (!IntStack.empty()); - return *this; + return *this; } inline _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; + _Self tmp = *this; ++*this; return tmp; } private: - // ProcessInterval - This method is used during the construction of the + // ProcessInterval - This method is used during the construction of the // interval graph. It walks through the source graph, recursively creating // an interval per invokation until the entire graph is covered. This uses // the ProcessNode method to add all of the nodes to the interval. @@ -178,7 +178,7 @@ IntStack.push(std::make_pair(Int, succ_begin(Int))); return true; } - + // ProcessNode - This method is called by ProcessInterval to add nodes to the // interval being constructed, and it is also called recursively as it walks // the source graph. A node is added to the current interval only if all of @@ -191,7 +191,7 @@ void ProcessNode(Interval *Int, NodeTy *Node) { assert(Int && "Null interval == bad!"); assert(Node && "Null Node == bad!"); - + BasicBlock *NodeHeader = getNodeHeader(Node); if (Visited.count(NodeHeader)) { // Node already been visited? @@ -202,7 +202,7 @@ Int->Successors.push_back(NodeHeader); } } else { // Otherwise, not in interval yet - for (typename IGT::ChildIteratorType I = IGT::child_begin(Node), + for (typename IGT::ChildIteratorType I = IGT::child_begin(Node), E = IGT::child_end(Node); I != E; ++I) { if (!Int->contains(*I)) { // If pred not in interval, we can't be if (!Int->isSuccessor(NodeHeader)) // Add only if not already in set @@ -215,14 +215,14 @@ // already. In this case, we must add BB to the interval! addNodeToInterval(Int, Node); Visited.insert(NodeHeader); // The node has now been visited! - + if (Int->isSuccessor(NodeHeader)) { // If we were in the successor list from before... remove from succ list Int->Successors.erase(std::remove(Int->Successors.begin(), - Int->Successors.end(), NodeHeader), + Int->Successors.end(), NodeHeader), Int->Successors.end()); } - + // Now that we have discovered that Node is in the interval, perhaps some // of its successors are as well? for (typename GT::ChildIteratorType It = GT::child_begin(Node), @@ -236,7 +236,7 @@ typedef IntervalIterator interval_part_interval_iterator; -inline function_interval_iterator intervals_begin(Function *F, +inline function_interval_iterator intervals_begin(Function *F, bool DeleteInts = true) { return function_interval_iterator(F, DeleteInts); } @@ -244,7 +244,7 @@ return function_interval_iterator(); } -inline interval_part_interval_iterator +inline interval_part_interval_iterator intervals_begin(IntervalPartition &IP, bool DeleteIntervals = true) { return interval_part_interval_iterator(IP, DeleteIntervals); } Index: llvm/include/llvm/Analysis/IntervalPartition.h diff -u llvm/include/llvm/Analysis/IntervalPartition.h:1.21 llvm/include/llvm/Analysis/IntervalPartition.h:1.22 --- llvm/include/llvm/Analysis/IntervalPartition.h:1.21 Mon Dec 6 22:03:45 2004 +++ llvm/include/llvm/Analysis/IntervalPartition.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //===- IntervalPartition.h - Interval partition Calculation -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the declaration of the IntervalPartition class, which Index: llvm/include/llvm/Analysis/LoadValueNumbering.h diff -u llvm/include/llvm/Analysis/LoadValueNumbering.h:1.4 llvm/include/llvm/Analysis/LoadValueNumbering.h:1.5 --- llvm/include/llvm/Analysis/LoadValueNumbering.h:1.4 Tue Jul 27 12:43:20 2004 +++ llvm/include/llvm/Analysis/LoadValueNumbering.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //===- llvm/Analysis/LoadValueNumbering.h - Value # Load Insts --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a value numbering pass that value #'s load instructions. Index: llvm/include/llvm/Analysis/LoopInfo.h diff -u llvm/include/llvm/Analysis/LoopInfo.h:1.44 llvm/include/llvm/Analysis/LoopInfo.h:1.45 --- llvm/include/llvm/Analysis/LoopInfo.h:1.44 Sun Mar 6 14:55:34 2005 +++ llvm/include/llvm/Analysis/LoopInfo.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //===- llvm/Analysis/LoopInfo.h - Natural Loop Calculator -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the LoopInfo class that is used to identify natural loops @@ -41,8 +41,8 @@ class Instruction; //===----------------------------------------------------------------------===// -/// Loop class - Instances of this class are used to represent loops that are -/// detected in the flow graph +/// Loop class - Instances of this class are used to represent loops that are +/// detected in the flow graph /// class Loop { Loop *ParentLoop; @@ -307,10 +307,10 @@ typedef std::vector::const_iterator ChildIteratorType; static NodeType *getEntryNode(const Loop *L) { return L; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return N->begin(); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return N->end(); } }; @@ -320,10 +320,10 @@ typedef std::vector::const_iterator ChildIteratorType; static NodeType *getEntryNode(Loop *L) { return L; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return N->begin(); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return N->end(); } }; Index: llvm/include/llvm/Analysis/Passes.h diff -u llvm/include/llvm/Analysis/Passes.h:1.5 llvm/include/llvm/Analysis/Passes.h:1.6 --- llvm/include/llvm/Analysis/Passes.h:1.5 Fri Jan 28 01:29:15 2005 +++ llvm/include/llvm/Analysis/Passes.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //===-- llvm/Analysis/Passes.h - Constructors for analyses ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header file defines prototypes for accessor functions that expose passes @@ -47,55 +47,55 @@ // createNoAAPass - This pass implements a "I don't know" alias analysis. // ImmutablePass *createNoAAPass(); - + //===--------------------------------------------------------------------===// // // createBasicAliasAnalysisPass - This pass implements the default alias // analysis. // ImmutablePass *createBasicAliasAnalysisPass(); - + //===--------------------------------------------------------------------===// // // createAndersensPass - This pass implements Andersen's interprocedural alias // analysis. // ModulePass *createAndersensPass(); - + //===--------------------------------------------------------------------===// // // createBasicVNPass - This pass walks SSA def-use chains to trivially // identify lexically identical expressions. // ImmutablePass *createBasicVNPass(); - + //===--------------------------------------------------------------------===// // // createProfileLoaderPass - This pass loads information from a profile dump // file. // ModulePass *createProfileLoaderPass(); - + //===--------------------------------------------------------------------===// // // createNoProfileInfoPass - This pass implements the default "no profile". // ImmutablePass *createNoProfileInfoPass(); - + //===--------------------------------------------------------------------===// // // createDSAAPass - This pass implements simple context sensitive alias // analysis. // ModulePass *createDSAAPass(); - + //===--------------------------------------------------------------------===// // // createDSOptPass - This pass uses DSA to do a series of simple // optimizations. // ModulePass *createDSOptPass(); - + //===--------------------------------------------------------------------===// // // createSteensgaardPass - This pass uses the data structure graphs to do a Index: llvm/include/llvm/Analysis/PostDominators.h diff -u llvm/include/llvm/Analysis/PostDominators.h:1.8 llvm/include/llvm/Analysis/PostDominators.h:1.9 --- llvm/include/llvm/Analysis/PostDominators.h:1.8 Sun Feb 29 17:55:11 2004 +++ llvm/include/llvm/Analysis/PostDominators.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //=- llvm/Analysis/PostDominators.h - Post Dominator Calculation-*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file exposes interfaces to post dominance information. Index: llvm/include/llvm/Analysis/ProfileInfo.h diff -u llvm/include/llvm/Analysis/ProfileInfo.h:1.4 llvm/include/llvm/Analysis/ProfileInfo.h:1.5 --- llvm/include/llvm/Analysis/ProfileInfo.h:1.4 Mon Mar 8 16:03:45 2004 +++ llvm/include/llvm/Analysis/ProfileInfo.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //===- llvm/Analysis/ProfileInfo.h - Profile Info Interface -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the generic ProfileInfo interface, which is used as the @@ -39,7 +39,7 @@ std::map, unsigned> EdgeCounts; public: virtual ~ProfileInfo(); // We want to be subclassed - + //===------------------------------------------------------------------===// /// Profile Information Queries /// Index: llvm/include/llvm/Analysis/ProfileInfoLoader.h diff -u llvm/include/llvm/Analysis/ProfileInfoLoader.h:1.3 llvm/include/llvm/Analysis/ProfileInfoLoader.h:1.4 --- llvm/include/llvm/Analysis/ProfileInfoLoader.h:1.3 Tue May 4 12:11:13 2004 +++ llvm/include/llvm/Analysis/ProfileInfoLoader.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //===- ProfileInfoLoader.h - Load & convert profile information -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // The ProfileInfoLoader class is used to load and represent profiling Index: llvm/include/llvm/Analysis/ProfileInfoTypes.h diff -u llvm/include/llvm/Analysis/ProfileInfoTypes.h:1.1 llvm/include/llvm/Analysis/ProfileInfoTypes.h:1.2 --- llvm/include/llvm/Analysis/ProfileInfoTypes.h:1.1 Tue May 4 11:57:57 2004 +++ llvm/include/llvm/Analysis/ProfileInfoTypes.h Thu Apr 21 15:16:32 2005 @@ -4,9 +4,9 @@ |* |* This file was developed by the LLVM research group and is distributed under |* the University of Illinois Open Source License. See LICENSE.TXT for details. -|* +|* |*===----------------------------------------------------------------------===*| -|* +|* |* This file defines constants shared by the various different profiling |* runtime libraries and the LLVM C++ profile info loader. It must be a |* C header because, at present, the profiling runtimes are written in C. Index: llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h diff -u llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h:1.5 llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h:1.6 --- llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h:1.5 Sat Feb 26 12:40:02 2005 +++ llvm/include/llvm/Analysis/ScalarEvolutionExpressions.h Thu Apr 21 15:16:32 2005 @@ -1,14 +1,14 @@ //===- llvm/Analysis/ScalarEvolutionExpressions.h - SCEV Exprs --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the classes used to represent and build scalar expressions. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_SCALAREVOLUTION_EXPRESSIONS_H @@ -33,7 +33,7 @@ class SCEVConstant : public SCEV { ConstantInt *V; SCEVConstant(ConstantInt *v) : SCEV(scConstant), V(v) {} - + virtual ~SCEVConstant(); public: /// get method - This just gets and returns a new SCEVConstant object. @@ -86,7 +86,7 @@ const SCEVHandle &getOperand() const { return Op; } virtual const Type *getType() const { return Ty; } - + virtual bool isLoopInvariant(const Loop *L) const { return Op->isLoopInvariant(L); } @@ -132,7 +132,7 @@ const SCEVHandle &getOperand() const { return Op; } virtual const Type *getType() const { return Ty; } - + virtual bool isLoopInvariant(const Loop *L) const { return Op->isLoopInvariant(L); } Index: llvm/include/llvm/Analysis/ScalarEvolution.h diff -u llvm/include/llvm/Analysis/ScalarEvolution.h:1.9 llvm/include/llvm/Analysis/ScalarEvolution.h:1.10 --- llvm/include/llvm/Analysis/ScalarEvolution.h:1.9 Tue Mar 8 23:34:23 2005 +++ llvm/include/llvm/Analysis/ScalarEvolution.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //===- llvm/Analysis/ScalarEvolution.h - Scalar Evolution -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // The ScalarEvolution class is an LLVM pass which can be used to analyze and @@ -15,7 +15,7 @@ // // This analysis is primarily useful for induction variable substitution and // strength reduction. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_SCALAREVOLUTION_H @@ -89,7 +89,7 @@ /// the same value, but which uses the concrete value Conc instead of the /// symbolic value. If this SCEV does not use the symbolic value, it /// returns itself. - virtual SCEVHandle + virtual SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym, const SCEVHandle &Conc) const = 0; @@ -102,7 +102,7 @@ /// void dump() const; }; - + inline std::ostream &operator<<(std::ostream &OS, const SCEV &S) { S.print(OS); return OS; @@ -121,7 +121,7 @@ virtual const Type *getType() const; virtual bool hasComputableLoopEvolution(const Loop *L) const; virtual void print(std::ostream &OS) const; - virtual SCEVHandle + virtual SCEVHandle replaceSymbolicValuesWithConcrete(const SCEVHandle &Sym, const SCEVHandle &Conc) const; @@ -141,7 +141,7 @@ S->addRef(); } SCEVHandle(const SCEVHandle &RHS) : S(RHS.S) { - S->addRef(); + S->addRef(); } ~SCEVHandle() { S->dropRef(); } @@ -190,7 +190,7 @@ void *Impl; // ScalarEvolution uses the pimpl pattern public: ScalarEvolution() : Impl(0) {} - + /// getSCEV - Return a SCEV expression handle for the full generality of the /// specified expression. SCEVHandle getSCEV(Value *V) const; Index: llvm/include/llvm/Analysis/Trace.h diff -u llvm/include/llvm/Analysis/Trace.h:1.3 llvm/include/llvm/Analysis/Trace.h:1.4 --- llvm/include/llvm/Analysis/Trace.h:1.3 Mon May 17 16:17:21 2004 +++ llvm/include/llvm/Analysis/Trace.h Thu Apr 21 15:16:32 2005 @@ -22,7 +22,7 @@ #include #include -namespace llvm { +namespace llvm { class BasicBlock; class Function; class Module; Index: llvm/include/llvm/Analysis/ValueNumbering.h diff -u llvm/include/llvm/Analysis/ValueNumbering.h:1.7 llvm/include/llvm/Analysis/ValueNumbering.h:1.8 --- llvm/include/llvm/Analysis/ValueNumbering.h:1.7 Sun May 23 16:11:17 2004 +++ llvm/include/llvm/Analysis/ValueNumbering.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //===- llvm/Analysis/ValueNumbering.h - Value #'ing Interface ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the abstract ValueNumbering interface, which is used as the Index: llvm/include/llvm/Analysis/Verifier.h diff -u llvm/include/llvm/Analysis/Verifier.h:1.13 llvm/include/llvm/Analysis/Verifier.h:1.14 --- llvm/include/llvm/Analysis/Verifier.h:1.13 Fri Apr 2 09:44:33 2004 +++ llvm/include/llvm/Analysis/Verifier.h Thu Apr 21 15:16:32 2005 @@ -1,10 +1,10 @@ //===-- llvm/Analysis/Verifier.h - Module Verifier --------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the function verifier interface, that can be used for some @@ -28,12 +28,12 @@ class Function; /// @brief An enumeration to specify the action to be taken if errors found. -/// +/// /// This enumeration is used in the functions below to indicate what should /// happen if the verifier finds errors. Each of the functions that uses /// this enumeration as an argument provides a default value for it. The /// actions are listed below. -enum VerifierFailureAction { +enum VerifierFailureAction { AbortProcessAction, ///< verifyModule will print to stderr and abort() ThrowExceptionAction, ///< verifyModule will throw errors as std::string PrintMessageAction, ///< verifyModule will print to stderr and return true @@ -45,15 +45,15 @@ /// Check a module or function for validity. When the pass is used, the /// action indicated by the \p action argument will be used if errors are /// found. -FunctionPass *createVerifierPass( +FunctionPass *createVerifierPass( VerifierFailureAction action = AbortProcessAction ///< Action to take ); -/// @brief Check a module for errors. +/// @brief Check a module for errors. /// -/// If there are no errors, the function returns false. If an error is found, +/// If there are no errors, the function returns false. If an error is found, /// the action taken depends on the \p action parameter. -/// This should only be used for debugging, because it plays games with +/// This should only be used for debugging, because it plays games with /// PassManagers and stuff. bool verifyModule( From brukman at cs.uiuc.edu Thu Apr 21 15:18:16 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:18:16 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Analysis/DataStructure/DSGraph.h DSGraphTraits.h DSNode.h DSSupport.h DataStructure.h Message-ID: <200504212018.PAA00554@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Analysis/DataStructure: DSGraph.h updated: 1.108 -> 1.109 DSGraphTraits.h updated: 1.23 -> 1.24 DSNode.h updated: 1.53 -> 1.54 DSSupport.h updated: 1.39 -> 1.40 DataStructure.h updated: 1.93 -> 1.94 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+55 -55) DSGraph.h | 20 +++++++++--------- DSGraphTraits.h | 12 +++++----- DSNode.h | 10 ++++----- DSSupport.h | 6 ++--- DataStructure.h | 62 ++++++++++++++++++++++++++++---------------------------- 5 files changed, 55 insertions(+), 55 deletions(-) Index: llvm/include/llvm/Analysis/DataStructure/DSGraph.h diff -u llvm/include/llvm/Analysis/DataStructure/DSGraph.h:1.108 llvm/include/llvm/Analysis/DataStructure/DSGraph.h:1.109 --- llvm/include/llvm/Analysis/DataStructure/DSGraph.h:1.108 Thu Mar 24 17:45:20 2005 +++ llvm/include/llvm/Analysis/DataStructure/DSGraph.h Thu Apr 21 15:18:05 2005 @@ -1,10 +1,10 @@ //===- DSGraph.h - Represent a collection of data structures ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header defines the data structure graph (DSGraph) and the @@ -25,14 +25,14 @@ class GlobalValue; //===----------------------------------------------------------------------===// -/// DSScalarMap - An instance of this class is used to keep track of all of +/// DSScalarMap - An instance of this class is used to keep track of all of /// which DSNode each scalar in a function points to. This is specialized to -/// keep track of globals with nodes in the function, and to keep track of the +/// keep track of globals with nodes in the function, and to keep track of the /// unique DSNodeHandle being used by the scalar map. /// -/// This class is crucial to the efficiency of DSA with some large SCC's. In +/// This class is crucial to the efficiency of DSA with some large SCC's. In /// these cases, the cost of iterating over the scalar map dominates the cost -/// of DSA. In all of these cases, the DSA phase is really trying to identify +/// of DSA. In all of these cases, the DSA phase is really trying to identify /// globals or unique node handles active in the function. /// class DSScalarMap { @@ -48,7 +48,7 @@ EquivalenceClasses &getGlobalECs() const { return GlobalECs; } - // Compatibility methods: provide an interface compatible with a map of + // Compatibility methods: provide an interface compatible with a map of // Value* to DSNodeHandle's. typedef ValueMapTy::const_iterator const_iterator; typedef ValueMapTy::iterator iterator; @@ -142,11 +142,11 @@ return ValueMap.insert(std::make_pair(V, DSNodeHandle())).first->second; } - void erase(iterator I) { + void erase(iterator I) { assert(I != ValueMap.end() && "Cannot erase end!"); if (GlobalValue *GV = dyn_cast(I->first)) GlobalSet.erase(GV); - ValueMap.erase(I); + ValueMap.erase(I); } void clear() { @@ -555,7 +555,7 @@ if (CloneFlags & DSGraph::StripIncompleteBit) BitsToKeep &= ~DSNode::Incomplete; } - + DSNodeHandle getClonedNH(const DSNodeHandle &SrcNH); void merge(const DSNodeHandle &NH, const DSNodeHandle &SrcNH); Index: llvm/include/llvm/Analysis/DataStructure/DSGraphTraits.h diff -u llvm/include/llvm/Analysis/DataStructure/DSGraphTraits.h:1.23 llvm/include/llvm/Analysis/DataStructure/DSGraphTraits.h:1.24 --- llvm/include/llvm/Analysis/DataStructure/DSGraphTraits.h:1.23 Wed Mar 16 16:42:01 2005 +++ llvm/include/llvm/Analysis/DataStructure/DSGraphTraits.h Thu Apr 21 15:18:05 2005 @@ -1,10 +1,10 @@ //===- DSGraphTraits.h - Provide generic graph interface --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides GraphTraits specializations for the DataStructure graph @@ -28,7 +28,7 @@ friend class DSNode; NodeTy * const Node; unsigned Offset; - + typedef DSNodeIterator _Self; DSNodeIterator(NodeTy *N) : Node(N), Offset(0) {} // begin iterator @@ -56,7 +56,7 @@ Offset = I.Offset; return *this; } - + pointer operator*() const { if (Node->isDeadNode()) return Node->getForwardNode(); @@ -64,13 +64,13 @@ return Node->getLink(Offset).getNode(); } pointer operator->() const { return operator*(); } - + _Self& operator++() { // Preincrement Offset += (1 << DS::PointerShift); return *this; } _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; + _Self tmp = *this; ++*this; return tmp; } unsigned getOffset() const { return Offset; } Index: llvm/include/llvm/Analysis/DataStructure/DSNode.h diff -u llvm/include/llvm/Analysis/DataStructure/DSNode.h:1.53 llvm/include/llvm/Analysis/DataStructure/DSNode.h:1.54 --- llvm/include/llvm/Analysis/DataStructure/DSNode.h:1.53 Sat Mar 19 21:29:39 2005 +++ llvm/include/llvm/Analysis/DataStructure/DSNode.h Thu Apr 21 15:18:05 2005 @@ -1,10 +1,10 @@ //===- DSNode.h - Node definition for datastructure graphs ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Data structure graph nodes and some implementation of DSNodeHandle. @@ -84,7 +84,7 @@ AllocaNode = 1 << 0, // This node was allocated with alloca HeapNode = 1 << 1, // This node was allocated with malloc GlobalNode = 1 << 2, // This node was allocated by a global var decl - UnknownNode = 1 << 3, // This node points to unknown allocated memory + UnknownNode = 1 << 3, // This node points to unknown allocated memory Incomplete = 1 << 4, // This node may not be complete Modified = 1 << 5, // This node is modified in this context @@ -97,7 +97,7 @@ Composition = AllocaNode | HeapNode | GlobalNode | UnknownNode, }; - + /// NodeType - A union of the above bits. "Shadow" nodes do not add any flags /// to the nodes in the data structure graph, so it is possible to have nodes /// with a value of 0 for their NodeType. @@ -105,7 +105,7 @@ private: unsigned short NodeType; public: - + /// DSNode ctor - Create a node of the specified type, inserting it into the /// specified graph. /// Index: llvm/include/llvm/Analysis/DataStructure/DSSupport.h diff -u llvm/include/llvm/Analysis/DataStructure/DSSupport.h:1.39 llvm/include/llvm/Analysis/DataStructure/DSSupport.h:1.40 --- llvm/include/llvm/Analysis/DataStructure/DSSupport.h:1.39 Mon Mar 21 03:38:39 2005 +++ llvm/include/llvm/Analysis/DataStructure/DSSupport.h Thu Apr 21 15:18:05 2005 @@ -1,10 +1,10 @@ //===- DSSupport.h - Support for datastructure graphs -----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Support for graph nodes, call sites, and types. @@ -161,7 +161,7 @@ /// DSCallSite - Representation of a call site via its call instruction, /// the DSNode handle for the callee function (or function pointer), and /// the DSNode handles for the function arguments. -/// +/// class DSCallSite { CallSite Site; // Actual call site Function *CalleeF; // The function called (direct call) Index: llvm/include/llvm/Analysis/DataStructure/DataStructure.h diff -u llvm/include/llvm/Analysis/DataStructure/DataStructure.h:1.93 llvm/include/llvm/Analysis/DataStructure/DataStructure.h:1.94 --- llvm/include/llvm/Analysis/DataStructure/DataStructure.h:1.93 Thu Apr 21 11:08:59 2005 +++ llvm/include/llvm/Analysis/DataStructure/DataStructure.h Thu Apr 21 15:18:05 2005 @@ -1,10 +1,10 @@ //===- DataStructure.h - Build data structure graphs ------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Implement the LLVM data structure analysis library. @@ -82,7 +82,7 @@ /// releaseMemory - if the pass pipeline is done with this pass, we can /// release our memory... - /// + /// virtual void releaseMemory(); /// getAnalysisUsage - This obviously provides a data structure graph. @@ -177,7 +177,7 @@ DSGraph &getOrCreateGraph(Function *F); unsigned calculateGraphs(Function *F, std::vector &Stack, - unsigned &NextID, + unsigned &NextID, hash_map &ValMap); }; @@ -313,7 +313,7 @@ private: unsigned calculateSCCGraphs(DSGraph &FG, std::vector &Stack, - unsigned &NextID, + unsigned &NextID, hash_map &ValMap); DSGraph &getOrCreateGraph(Function &F); void processGraph(DSGraph &G); @@ -327,99 +327,99 @@ /// struct EquivClassGraphs : public ModulePass { CompleteBUDataStructures *CBU; - + DSGraph *GlobalsGraph; - + // DSInfo - one graph for each function. hash_map DSInfo; - + /// ActualCallees - The actual functions callable from indirect call sites. /// std::set > ActualCallees; - + // Equivalence class where functions that can potentially be called via the // same function pointer are in the same class. EquivalenceClasses FuncECs; - + /// OneCalledFunction - For each indirect call, we keep track of one /// target of the call. This is used to find equivalence class called by /// a call site. std::map OneCalledFunction; - + /// GlobalECs - The equivalence classes for each global value that is merged /// with other global values in the DSGraphs. EquivalenceClasses GlobalECs; - + public: /// EquivClassGraphs - Computes the equivalence classes and then the /// folded DS graphs for each class. - /// + /// virtual bool runOnModule(Module &M); - + /// print - Print out the analysis results... /// void print(std::ostream &O, const Module *M) const; - + EquivalenceClasses &getGlobalECs() { return GlobalECs; } - + /// getDSGraph - Return the data structure graph for the specified function. /// This returns the folded graph. The folded graph is the same as the CBU - /// graph iff the function is in a singleton equivalence class AND all its + /// graph iff the function is in a singleton equivalence class AND all its /// callees also have the same folded graph as the CBU graph. - /// + /// DSGraph &getDSGraph(const Function &F) const { hash_map::const_iterator I = DSInfo.find(&F); assert(I != DSInfo.end() && "No graph computed for that function!"); return *I->second; } - + bool hasGraph(const Function &F) const { return DSInfo.find(&F) != DSInfo.end(); } - + /// ContainsDSGraphFor - Return true if we have a graph for the specified /// function. bool ContainsDSGraphFor(const Function &F) const { return DSInfo.find(&F) != DSInfo.end(); } - + /// getSomeCalleeForCallSite - Return any one callee function at /// a call site. - /// + /// Function *getSomeCalleeForCallSite(const CallSite &CS) const; - + DSGraph &getGlobalsGraph() const { return *GlobalsGraph; } - + typedef std::set > ActualCalleesTy; const ActualCalleesTy &getActualCallees() const { return ActualCallees; } - + typedef ActualCalleesTy::const_iterator callee_iterator; callee_iterator callee_begin(Instruction *I) const { return ActualCallees.lower_bound(std::pair(I, 0)); } - + callee_iterator callee_end(Instruction *I) const { I = (Instruction*)((char*)I + 1); return ActualCallees.lower_bound(std::pair(I, 0)); } - + virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); AU.addRequired(); } - + private: void buildIndirectFunctionSets(Module &M); - + unsigned processSCC(DSGraph &FG, std::vector &Stack, - unsigned &NextID, + unsigned &NextID, std::map &ValMap); void processGraph(DSGraph &FG); - + DSGraph &getOrCreateGraph(Function &F); }; From brukman at cs.uiuc.edu Thu Apr 21 15:19:16 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:19:16 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Assembly/AsmAnnotationWriter.h CachedWriter.h Parser.h PrintModulePass.h Writer.h Message-ID: <200504212019.PAA00606@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Assembly: AsmAnnotationWriter.h updated: 1.3 -> 1.4 CachedWriter.h updated: 1.19 -> 1.20 Parser.h updated: 1.9 -> 1.10 PrintModulePass.h updated: 1.17 -> 1.18 Writer.h updated: 1.30 -> 1.31 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+19 -19) AsmAnnotationWriter.h | 6 +++--- CachedWriter.h | 4 ++-- Parser.h | 12 ++++++------ PrintModulePass.h | 10 +++++----- Writer.h | 6 +++--- 5 files changed, 19 insertions(+), 19 deletions(-) Index: llvm/include/llvm/Assembly/AsmAnnotationWriter.h diff -u llvm/include/llvm/Assembly/AsmAnnotationWriter.h:1.3 llvm/include/llvm/Assembly/AsmAnnotationWriter.h:1.4 --- llvm/include/llvm/Assembly/AsmAnnotationWriter.h:1.3 Mon Mar 8 12:51:05 2004 +++ llvm/include/llvm/Assembly/AsmAnnotationWriter.h Thu Apr 21 15:19:05 2005 @@ -1,10 +1,10 @@ //===-- AsmAnnotationWriter.h - Itf for annotation .ll files - --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Clients of the assembly writer can use this interface to add their own @@ -26,7 +26,7 @@ class Instruction; struct AssemblyAnnotationWriter { - + // emitFunctionAnnot - This may be implemented to emit a string right before // the start of a function. virtual void emitFunctionAnnot(const Function *F, std::ostream &OS) {} Index: llvm/include/llvm/Assembly/CachedWriter.h diff -u llvm/include/llvm/Assembly/CachedWriter.h:1.19 llvm/include/llvm/Assembly/CachedWriter.h:1.20 --- llvm/include/llvm/Assembly/CachedWriter.h:1.19 Wed Jul 14 21:51:18 2004 +++ llvm/include/llvm/Assembly/CachedWriter.h Thu Apr 21 15:19:05 2005 @@ -1,10 +1,10 @@ //===-- llvm/Assembly/CachedWriter.h - Printer Accellerator -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a 'CachedWriter' class that is used to accelerate printing Index: llvm/include/llvm/Assembly/Parser.h diff -u llvm/include/llvm/Assembly/Parser.h:1.9 llvm/include/llvm/Assembly/Parser.h:1.10 --- llvm/include/llvm/Assembly/Parser.h:1.9 Sat Jan 1 14:51:41 2005 +++ llvm/include/llvm/Assembly/Parser.h Thu Apr 21 15:19:05 2005 @@ -1,10 +1,10 @@ //===-- llvm/Assembly/Parser.h - Parser for VM assembly files ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // These classes are implemented by the lib/AsmParser library. @@ -38,12 +38,12 @@ // class ParseException { public: - ParseException(const std::string &filename, const std::string &message, + ParseException(const std::string &filename, const std::string &message, int LineNo = -1, int ColNo = -1); ParseException(const ParseException &E); - // getMessage - Return the message passed in at construction time plus extra + // getMessage - Return the message passed in at construction time plus extra // information extracted from the options used to parse with... // const std::string getMessage() const; @@ -57,8 +57,8 @@ } // getErrorLocation - Return the line and column number of the error in the - // input source file. The source filename can be derived from the - // ParserOptions in effect. If positional information is not applicable, + // input source file. The source filename can be derived from the + // ParserOptions in effect. If positional information is not applicable, // these will return a value of -1. // inline const void getErrorLocation(int &Line, int &Column) const { Index: llvm/include/llvm/Assembly/PrintModulePass.h diff -u llvm/include/llvm/Assembly/PrintModulePass.h:1.17 llvm/include/llvm/Assembly/PrintModulePass.h:1.18 --- llvm/include/llvm/Assembly/PrintModulePass.h:1.17 Sun Sep 19 23:42:31 2004 +++ llvm/include/llvm/Assembly/PrintModulePass.h Thu Apr 21 15:19:05 2005 @@ -1,10 +1,10 @@ //===- llvm/Assembly/PrintModulePass.h - Printing Pass ----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines two passes to print out a module. The PrintModulePass pass @@ -36,7 +36,7 @@ ~PrintModulePass() { if (DeleteStream) delete Out; } - + bool runOnModule(Module &M) { (*Out) << M << std::flush; return false; @@ -61,7 +61,7 @@ inline ~PrintFunctionPass() { if (DeleteStream) delete Out; } - + // runOnFunction - This pass just prints a banner followed by the function as // it's processed. // @@ -69,7 +69,7 @@ (*Out) << Banner << (Value&)F; return false; } - + virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } Index: llvm/include/llvm/Assembly/Writer.h diff -u llvm/include/llvm/Assembly/Writer.h:1.30 llvm/include/llvm/Assembly/Writer.h:1.31 --- llvm/include/llvm/Assembly/Writer.h:1.30 Sun Jul 4 05:59:05 2004 +++ llvm/include/llvm/Assembly/Writer.h Thu Apr 21 15:19:05 2005 @@ -1,10 +1,10 @@ //===-- llvm/Assembly/Writer.h - Printer for LLVM assembly files --*- C++ -*-=// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This functionality is implemented by lib/VMCore/AsmWriter.cpp. @@ -34,7 +34,7 @@ // WriteAsOperand - Write the name of the specified value out to the specified // ostream. This can be useful when you just want to print int %reg126, not the // whole instruction that generated it. If you specify a Module for context, -// then even constants get pretty-printed; for example, the type of a null +// then even constants get pretty-printed; for example, the type of a null // pointer is printed symbolically. // std::ostream &WriteAsOperand(std::ostream &, const Value *, bool PrintTy = true, From brukman at cs.uiuc.edu Thu Apr 21 15:34:24 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:34:24 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Bytecode/Analyzer.h Archive.h BytecodeHandler.h Format.h Reader.h WriteBytecodePass.h Writer.h Message-ID: <200504212034.PAA00780@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Bytecode: Analyzer.h updated: 1.10 -> 1.11 Archive.h updated: 1.10 -> 1.11 BytecodeHandler.h updated: 1.7 -> 1.8 Format.h updated: 1.11 -> 1.12 Reader.h updated: 1.23 -> 1.24 WriteBytecodePass.h updated: 1.14 -> 1.15 Writer.h updated: 1.8 -> 1.9 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+132 -132) Analyzer.h | 26 +++++----- Archive.h | 126 ++++++++++++++++++++++++++-------------------------- BytecodeHandler.h | 68 ++++++++++++++-------------- Format.h | 14 ++--- Reader.h | 14 ++--- WriteBytecodePass.h | 10 ++-- Writer.h | 6 +- 7 files changed, 132 insertions(+), 132 deletions(-) Index: llvm/include/llvm/Bytecode/Analyzer.h diff -u llvm/include/llvm/Bytecode/Analyzer.h:1.10 llvm/include/llvm/Bytecode/Analyzer.h:1.11 --- llvm/include/llvm/Bytecode/Analyzer.h:1.10 Sat Jan 15 19:22:18 2005 +++ llvm/include/llvm/Bytecode/Analyzer.h Thu Apr 21 15:34:13 2005 @@ -1,17 +1,17 @@ //===-- llvm/Bytecode/Analyzer.h - Analyzer for Bytecode files --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This functionality is implemented by the lib/Bytecode/Reader library. // It is used to read VM bytecode files from a file or memory buffer -// and print out a diagnostic analysis of the contents of the file. It is -// intended for three uses: (a) understanding the bytecode format, (b) ensuring -// correctness of bytecode format, (c) statistical analysis of generated +// and print out a diagnostic analysis of the contents of the file. It is +// intended for three uses: (a) understanding the bytecode format, (b) ensuring +// correctness of bytecode format, (c) statistical analysis of generated // bytecode files. // //===----------------------------------------------------------------------===// @@ -30,8 +30,8 @@ class Function; class Module; -/// This structure is used to contain the output of the Bytecode Analysis -/// library. It simply contains fields to hold each item of the analysis +/// This structure is used to contain the output of the Bytecode Analysis +/// library. It simply contains fields to hold each item of the analysis /// results. /// @brief Bytecode Analysis results structure struct BytecodeAnalysis { @@ -68,7 +68,7 @@ unsigned vbrCompBytes; ///< Number of vbr bytes (compressed) unsigned vbrExpdBytes; ///< Number of vbr bytes (expanded) - typedef std::map + typedef std::map BlockSizeMap; BlockSizeMap BlockSizes; @@ -91,20 +91,20 @@ unsigned vbrExpdBytes; ///< Number of vbr bytes (expanded) }; - /// A mapping of function slot numbers to the collected information about + /// A mapping of function slot numbers to the collected information about /// the function. - std::map FunctionInfo; + std::map FunctionInfo; /// The content of the progressive verification std::string VerifyInfo; /// Flags for what should be done - bool detailedResults; ///< If true, FunctionInfo has contents + bool detailedResults; ///< If true, FunctionInfo has contents bool progressiveVerify; ///< If true, VerifyInfo has contents }; /// This function is the main entry point into the bytecode analysis library. It -/// allows you to simply provide a \p filename and storage for the \p Results +/// allows you to simply provide a \p filename and storage for the \p Results /// that will be filled in with the analysis results. /// @brief Analyze contents of a bytecode File Module* AnalyzeBytecodeFile( Index: llvm/include/llvm/Bytecode/Archive.h diff -u llvm/include/llvm/Bytecode/Archive.h:1.10 llvm/include/llvm/Bytecode/Archive.h:1.11 --- llvm/include/llvm/Bytecode/Archive.h:1.10 Sat Feb 26 16:00:32 2005 +++ llvm/include/llvm/Bytecode/Archive.h Thu Apr 21 15:34:13 2005 @@ -1,16 +1,16 @@ //===-- llvm/Bytecode/Archive.h - LLVM Bytecode Archive ---------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header file declares the Archive and ArchiveMember classes that provide // manipulation of LLVM Archive files. The implementation is provided by the -// lib/Bytecode/Archive library. This library is used to read and write -// archive (*.a) files that contain LLVM bytecode files (or others). +// lib/Bytecode/Archive library. This library is used to read and write +// archive (*.a) files that contain LLVM bytecode files (or others). // //===----------------------------------------------------------------------===// @@ -26,7 +26,7 @@ namespace llvm { -// Forward declare classes +// Forward declare classes class ModuleProvider; // From VMCore class Module; // From VMCore class Archive; // Declared below @@ -34,9 +34,9 @@ /// This class is the main class manipulated by users of the Archive class. It /// holds information about one member of the Archive. It is also the element -/// stored by the Archive's ilist, the Archive's main abstraction. Because of -/// the special requirements of archive files, users are not permitted to -/// construct ArchiveMember instances. You should obtain them from the methods +/// stored by the Archive's ilist, the Archive's main abstraction. Because of +/// the special requirements of archive files, users are not permitted to +/// construct ArchiveMember instances. You should obtain them from the methods /// of the Archive class instead. /// @brief This class represents a single archive member. class ArchiveMember { @@ -77,19 +77,19 @@ /// @brief Get the user associated with this archive member. unsigned getUser() const { return info.user; } - /// The "group" is the owning group of the file per Unix security. This - /// may not have any applicability on non-Unix systems but is a required + /// The "group" is the owning group of the file per Unix security. This + /// may not have any applicability on non-Unix systems but is a required /// component of the "ar" file format. /// @brief Get the group associated with this archive member. unsigned getGroup() const { return info.group; } - /// The "mode" specifies the access permissions for the file per Unix + /// The "mode" specifies the access permissions for the file per Unix /// security. This may not have any applicabiity on non-Unix systems but is /// a required component of the "ar" file format. /// @brief Get the permission mode associated with this archive member. unsigned getMode() const { return info.mode; } - /// This method returns the time at which the archive member was last + /// This method returns the time at which the archive member was last /// modified when it was not in the archive. /// @brief Get the time of last modification of the archive member. sys::TimeValue getModTime() const { return info.modTime; } @@ -98,7 +98,7 @@ /// @brief Get the size of the archive member. unsigned getSize() const { return info.fileSize; } - /// This method returns the total size of the archive member as it + /// This method returns the total size of the archive member as it /// appears on disk. This includes the file content, the header, the /// long file name if any, and the padding. /// @brief Get total on-disk member size. @@ -106,7 +106,7 @@ /// This method will return a pointer to the in-memory content of the /// archive member, if it is available. If the data has not been loaded - /// into memory, the return value will be null. + /// into memory, the return value will be null. /// @returns a pointer to the member's data. /// @brief Get the data content of the archive member const void* getData() const { return data; } @@ -147,7 +147,7 @@ bool hasPath() const { return flags&HasPathFlag; } /// Long filenames are an artifact of the ar(1) file format which allows - /// up to sixteen characters in its header and doesn't allow a path + /// up to sixteen characters in its header and doesn't allow a path /// separator character (/). To avoid this, a "long format" member name is /// allowed that doesn't have this restriction. This method determines if /// that "long format" is used for this member. @@ -158,7 +158,7 @@ /// This method returns the status info (like Unix stat(2)) for the archive /// member. The status info provides the file's size, permissions, and /// modification time. The contents of the Path::StatusInfo structure, other - /// than the size and modification time, may not have utility on non-Unix + /// than the size and modification time, may not have utility on non-Unix /// systems. /// @returns the status info for the archive member /// @brief Obtain the status info for the archive member @@ -212,14 +212,14 @@ /// @} }; -/// This class defines the interface to LLVM Archive files. The Archive class -/// presents the archive file as an ilist of ArchiveMember objects. The members +/// This class defines the interface to LLVM Archive files. The Archive class +/// presents the archive file as an ilist of ArchiveMember objects. The members /// can be rearranged in any fashion either by directly editing the ilist or by -/// using editing methods on the Archive class (recommended). The Archive -/// class also provides several ways of accessing the archive file for various +/// using editing methods on the Archive class (recommended). The Archive +/// class also provides several ways of accessing the archive file for various /// purposes such as editing and linking. Full symbol table support is provided -/// for loading only those files that resolve symbols. Note that read -/// performance of this library is _crucial_ for performance of JIT type +/// for loading only those files that resolve symbols. Note that read +/// performance of this library is _crucial_ for performance of JIT type /// applications and the linkers. Consequently, the implementation of the class /// is optimized for reading. class Archive { @@ -273,12 +273,12 @@ /// @{ public: /// This method splices a \p src member from an archive (possibly \p this), - /// to a position just before the member given by \p dest in \p this. When + /// to a position just before the member given by \p dest in \p this. When /// the archive is written, \p src will be written in its new location. /// @brief Move a member to a new location inline void splice(iterator dest, Archive& arch, iterator src) { return members.splice(dest,arch.members,src); } - + /// This method erases a \p target member from the archive. When the /// archive is written, it will no longer contain \p target. The associated /// ArchiveMember is deleted. @@ -290,10 +290,10 @@ /// @{ public: /// Create an empty archive file and associate it with the \p Filename. This - /// method does not actually create the archive disk file. It creates an + /// method does not actually create the archive disk file. It creates an /// empty Archive object. If the writeToDisk method is called, the archive - /// file \p Filename will be created at that point, with whatever content - /// the returned Archive object has at that time. + /// file \p Filename will be created at that point, with whatever content + /// the returned Archive object has at that time. /// @returns An Archive* that represents the new archive file. /// @brief Create an empty Archive. static Archive* CreateEmpty( @@ -314,15 +314,15 @@ /// This method opens an existing archive file from \p Filename and reads in /// its symbol table without reading in any of the archive's members. This /// reduces both I/O and cpu time in opening the archive if it is to be used - /// solely for symbol lookup (e.g. during linking). The \p Filename must + /// solely for symbol lookup (e.g. during linking). The \p Filename must /// exist and be an archive file or an exception will be thrown. This form /// of opening the archive is intended for read-only operations that need to /// locate members via the symbol table for link editing. Since the archve /// members are not read by this method, the archive will appear empty upon - /// return. If editing operations are performed on the archive, they will + /// return. If editing operations are performed on the archive, they will /// completely replace the contents of the archive! It is recommended that /// if this form of opening the archive is used that only the symbol table - /// lookup methods (getSymbolTable, findModuleDefiningSymbol, and + /// lookup methods (getSymbolTable, findModuleDefiningSymbol, and /// findModulesDefiningSymbols) be used. /// @throws std::string if an error occurs opening the file /// @returns an Archive* that represents the archive file. @@ -333,11 +333,11 @@ ); /// This destructor cleans up the Archive object, releases all memory, and - /// closes files. It does nothing with the archive file on disk. If you - /// haven't used the writeToDisk method by the time the destructor is + /// closes files. It does nothing with the archive file on disk. If you + /// haven't used the writeToDisk method by the time the destructor is /// called, all changes to the archive will be lost. /// @throws std::string if an error occurs - /// @brief Destruct in-memory archive + /// @brief Destruct in-memory archive ~Archive(); /// @} @@ -355,15 +355,15 @@ /// @brief Get the iplist of the members MembersList& getMembers() { return members; } - /// This method allows direct query of the Archive's symbol table. The + /// This method allows direct query of the Archive's symbol table. The /// symbol table is a std::map of std::string (the symbol) to unsigned (the - /// file offset). Note that for efficiency reasons, the offset stored in + /// file offset). Note that for efficiency reasons, the offset stored in /// the symbol table is not the actual offset. It is the offset from the /// beginning of the first "real" file member (after the symbol table). Use /// the getFirstFileOffset() to obtain that offset and add this value to the - /// offset in the symbol table to obtain the real file offset. Note that - /// there is purposefully no interface provided by Archive to look up - /// members by their offset. Use the findModulesDefiningSymbols and + /// offset in the symbol table to obtain the real file offset. Note that + /// there is purposefully no interface provided by Archive to look up + /// members by their offset. Use the findModulesDefiningSymbols and /// findModuleDefiningSymbol methods instead. /// @returns the Archive's symbol table. /// @brief Get the archive's symbol table @@ -386,15 +386,15 @@ /// @brief Instantiate all the bytecode modules located in the archive bool getAllModules(std::vector& Modules, std::string* ErrMessage); - /// This accessor looks up the \p symbol in the archive's symbol table and + /// This accessor looks up the \p symbol in the archive's symbol table and /// returns the associated module that defines that symbol. This method can - /// be called as many times as necessary. This is handy for linking the + /// be called as many times as necessary. This is handy for linking the /// archive into another module based on unresolved symbols. Note that the /// ModuleProvider returned by this accessor should not be deleted by the - /// caller. It is managed internally by the Archive class. It is possible + /// caller. It is managed internally by the Archive class. It is possible /// that multiple calls to this accessor will return the same ModuleProvider - /// instance because the associated module defines multiple symbols. - /// @returns The ModuleProvider* found or null if the archive does not + /// instance because the associated module defines multiple symbols. + /// @returns The ModuleProvider* found or null if the archive does not /// contain a module that defines the \p symbol. /// @brief Look up a module by symbol name. ModuleProvider* findModuleDefiningSymbol( @@ -402,10 +402,10 @@ ); /// This method is similar to findModuleDefiningSymbol but allows lookup of - /// more than one symbol at a time. If \p symbols contains a list of - /// undefined symbols in some module, then calling this method is like + /// more than one symbol at a time. If \p symbols contains a list of + /// undefined symbols in some module, then calling this method is like /// making one complete pass through the archive to resolve symbols but is - /// more efficient than looking at the individual members. Note that on + /// more efficient than looking at the individual members. Note that on /// exit, the symbols resolved by this method will be removed from \p /// symbols to ensure they are not re-searched on a subsequent call. If /// you need to retain the list of symbols, make a copy. @@ -414,11 +414,11 @@ std::set& symbols, ///< Symbols to be sought std::set& modules ///< The modules matching \p symbols ); - - /// This method determines whether the archive is a properly formed llvm - /// bytecode archive. It first makes sure the symbol table has been loaded - /// and has a non-zero size. If it does, then it is an archive. If not, - /// then it tries to load all the bytecode modules of the archive. Finally, + + /// This method determines whether the archive is a properly formed llvm + /// bytecode archive. It first makes sure the symbol table has been loaded + /// and has a non-zero size. If it does, then it is an archive. If not, + /// then it tries to load all the bytecode modules of the archive. Finally, /// it returns whether it was successfull. /// @returns true if the archive is a proper llvm bytecode archive /// @brief Determine whether the archive is a proper llvm bytecode archive. @@ -428,15 +428,15 @@ /// @name Mutators /// @{ public: - /// This method is the only way to get the archive written to disk. It + /// This method is the only way to get the archive written to disk. It /// creates or overwrites the file specified when \p this was created /// or opened. The arguments provide options for writing the archive. If /// \p CreateSymbolTable is true, the archive is scanned for bytecode files - /// and a symbol table of the externally visible function and global + /// and a symbol table of the externally visible function and global /// variable names is created. If \p TruncateNames is true, the names of the - /// archive members will have their path component stripped and the file - /// name will be truncated at 15 characters. If \p Compress is specified, - /// all archive members will be compressed before being written. If + /// archive members will have their path component stripped and the file + /// name will be truncated at 15 characters. If \p Compress is specified, + /// all archive members will be compressed before being written. If /// \p PrintSymTab is true, the symbol table will be printed to std::cout. /// @throws std::string if an error occurs /// @brief Write (possibly modified) archive contents to disk @@ -449,7 +449,7 @@ /// This method adds a new file to the archive. The \p filename is examined /// to determine just enough information to create an ArchiveMember object /// which is then inserted into the Archive object's ilist at the location - /// given by \p where. + /// given by \p where. /// @throws std::string if an error occurs reading the \p filename. /// @returns nothing /// @brief Add a file to the archive. @@ -459,7 +459,7 @@ /// @name Implementation /// @{ protected: - /// @brief Construct an Archive for \p filename and optionally map it + /// @brief Construct an Archive for \p filename and optionally map it /// into memory. Archive(const sys::Path& filename, bool map = false ); @@ -486,14 +486,14 @@ bool CreateSymbolTable, bool TruncateNames, bool ShouldCompress); /// @brief Fill in an ArchiveMemberHeader from ArchiveMember. - bool fillHeader(const ArchiveMember&mbr, + bool fillHeader(const ArchiveMember&mbr, ArchiveMemberHeader& hdr,int sz, bool TruncateNames) const; - + /// This type is used to keep track of bytecode modules loaded from the /// symbol table. It maps the file offset to a pair that consists of the - /// associated ArchiveMember and the ModuleProvider. + /// associated ArchiveMember and the ModuleProvider. /// @brief Module mapping type - typedef std::map > + typedef std::map > ModuleMap; /// @} Index: llvm/include/llvm/Bytecode/BytecodeHandler.h diff -u llvm/include/llvm/Bytecode/BytecodeHandler.h:1.7 llvm/include/llvm/Bytecode/BytecodeHandler.h:1.8 --- llvm/include/llvm/Bytecode/BytecodeHandler.h:1.7 Sat Aug 21 15:41:12 2004 +++ llvm/include/llvm/Bytecode/BytecodeHandler.h Thu Apr 21 15:34:13 2005 @@ -1,10 +1,10 @@ //===-- BytecodeHandler.h - Handle Bytecode Parsing Events ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header file defines the interface to the Bytecode Handler. The handler @@ -28,11 +28,11 @@ class Module; /// This class provides the interface for handling bytecode events during -/// reading of bytecode. The methods on this interface are invoked by the -/// BytecodeReader as it discovers the content of a bytecode stream. -/// This class provides a a clear separation of concerns between recognizing -/// the semantic units of a bytecode file (the Reader) and deciding what to do -/// with them (the Handler). +/// reading of bytecode. The methods on this interface are invoked by the +/// BytecodeReader as it discovers the content of a bytecode stream. +/// This class provides a a clear separation of concerns between recognizing +/// the semantic units of a bytecode file (the Reader) and deciding what to do +/// with them (the Handler). /// /// The BytecodeReader recognizes the content of the bytecode file and /// calls the BytecodeHandler methods to let it perform additional tasks. This @@ -40,7 +40,7 @@ /// purposes simply by creating a subclass of BytecodeHandler. None of the /// parsing details need to be understood, only the meaning of the calls /// made on this interface. -/// +/// /// @see BytecodeHandler /// @brief Handle Bytecode Parsing Events class BytecodeHandler { @@ -64,8 +64,8 @@ /// This method is called whenever the parser detects an error in the /// bytecode formatting. It gives the handler a chance to do something - /// with the error message before the parser throws an exception to - /// terminate the parsing. + /// with the error message before the parser throws an exception to + /// terminate the parsing. /// @brief Handle parsing errors. virtual void handleError(const std::string& str ) {} @@ -91,8 +91,8 @@ const std::string& moduleId ///< An identifier for the module ) {} - /// This method is called once the version information has been parsed. It - /// provides the information about the version of the bytecode file being + /// This method is called once the version information has been parsed. It + /// provides the information about the version of the bytecode file being /// read. /// @brief Handle the bytecode prolog virtual void handleVersionInfo( @@ -105,10 +105,10 @@ /// contains the global variables and the function placeholders virtual void handleModuleGlobalsBegin() {} - /// This method is called when a non-initialized global variable is + /// This method is called when a non-initialized global variable is /// recognized. Its type, constness, and linkage type are provided. /// @brief Handle a non-initialized global variable - virtual void handleGlobalVariable( + virtual void handleGlobalVariable( const Type* ElemType, ///< The type of the global variable bool isConstant, ///< Whether the GV is constant or not GlobalValue::LinkageTypes,///< The linkage type of the GV @@ -120,20 +120,20 @@ /// provides the number of types that the list contains. The handler /// should expect that number of calls to handleType. /// @brief Handle a type - virtual void handleTypeList( + virtual void handleTypeList( unsigned numEntries ///< The number of entries in the type list ) {} - /// This method is called when a new type is recognized. The type is + /// This method is called when a new type is recognized. The type is /// converted from the bytecode and passed to this method. /// @brief Handle a type - virtual void handleType( + virtual void handleType( const Type* Ty ///< The type that was just recognized ) {} /// This method is called when the function prototype for a function is /// encountered in the module globals block. - virtual void handleFunctionDeclaration( + virtual void handleFunctionDeclaration( Function* Func ///< The function being declared ) {} @@ -146,7 +146,7 @@ /// in the module globals block. virtual void handleDependentLibrary(const std::string& libName) {} - /// This method is called if the module globals has a non-empty target + /// This method is called if the module globals has a non-empty target /// triple virtual void handleTargetTriple(const std::string& triple) {} @@ -159,13 +159,13 @@ virtual void handleCompactionTableBegin() {} /// @brief Handle start of a compaction table plane - virtual void handleCompactionTablePlane( + virtual void handleCompactionTablePlane( unsigned Ty, ///< The type of the plane (slot number) unsigned NumEntries ///< The number of entries in the plane ) {} /// @brief Handle a type entry in the compaction table - virtual void handleCompactionTableType( + virtual void handleCompactionTableType( unsigned i, ///< Index in the plane of this type unsigned TypSlot, ///< Slot number for this type const Type* ///< The type referenced by this slot @@ -182,27 +182,27 @@ virtual void handleCompactionTableEnd() {} /// @brief Handle start of a symbol table - virtual void handleSymbolTableBegin( + virtual void handleSymbolTableBegin( Function* Func, ///< The function to which the ST belongs SymbolTable* ST ///< The symbol table being filled ) {} /// @brief Handle start of a symbol table plane - virtual void handleSymbolTablePlane( + virtual void handleSymbolTablePlane( unsigned TySlot, ///< The slotnum of the type plane unsigned NumEntries, ///< Number of entries in the plane const Type* Typ ///< The type of this type plane ) {} /// @brief Handle a named type in the symbol table - virtual void handleSymbolTableType( + virtual void handleSymbolTableType( unsigned i, ///< The index of the type in this plane unsigned slot, ///< Slot number of the named type const std::string& name ///< Name of the type ) {} /// @brief Handle a named value in the symbol table - virtual void handleSymbolTableValue( + virtual void handleSymbolTableValue( unsigned i, ///< The index of the value in this plane unsigned slot, ///< Slot number of the named value const std::string& name ///< Name of the value. @@ -227,7 +227,7 @@ unsigned blocknum ///< The block number of the block ) {} - /// This method is called for each instruction that is parsed. + /// This method is called for each instruction that is parsed. /// @returns true if the instruction is a block terminating instruction /// @brief Handle an instruction virtual bool handleInstruction( @@ -246,29 +246,29 @@ virtual void handleGlobalConstantsBegin() {} /// @brief Handle a constant expression - virtual void handleConstantExpression( + virtual void handleConstantExpression( unsigned Opcode, ///< Opcode of primary expression operator std::vector ArgVec, ///< expression args Constant* C ///< The constant value ) {} /// @brief Handle a constant array - virtual void handleConstantArray( + virtual void handleConstantArray( const ArrayType* AT, ///< Type of the array std::vector& ElementSlots,///< Slot nums for array values unsigned TypeSlot, ///< Slot # of type Constant* Val ///< The constant value ) {} - /// @brief Handle a constant structure - virtual void handleConstantStruct( + /// @brief Handle a constant structure + virtual void handleConstantStruct( const StructType* ST, ///< Type of the struct std::vector& ElementSlots,///< Slot nums for struct values Constant* Val ///< The constant value ) {} /// @brief Handle a constant packed - virtual void handleConstantPacked( + virtual void handleConstantPacked( const PackedType* PT, ///< Type of the array std::vector& ElementSlots,///< Slot nums for packed values unsigned TypeSlot, ///< Slot # of type @@ -276,7 +276,7 @@ ) {} /// @brief Handle a constant pointer - virtual void handleConstantPointer( + virtual void handleConstantPointer( const PointerType* PT, ///< Type of the pointer unsigned Slot, ///< Slot num of initializer value GlobalValue* GV ///< Referenced global value @@ -288,7 +288,7 @@ ) {} /// @brief Handle a primitive constant value - virtual void handleConstantValue( + virtual void handleConstantValue( Constant * c ///< The constant just defined ) {} Index: llvm/include/llvm/Bytecode/Format.h diff -u llvm/include/llvm/Bytecode/Format.h:1.11 llvm/include/llvm/Bytecode/Format.h:1.12 --- llvm/include/llvm/Bytecode/Format.h:1.11 Sat Aug 21 15:42:28 2004 +++ llvm/include/llvm/Bytecode/Format.h Thu Apr 21 15:34:13 2005 @@ -1,13 +1,13 @@ //===-- llvm/Bytecode/Format.h - VM bytecode file format info ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This header defines intrinsic constants that are useful to libraries that +// This header defines intrinsic constants that are useful to libraries that // need to hack on bytecode files directly, like the reader and writer. // //===----------------------------------------------------------------------===// @@ -51,9 +51,9 @@ }; /// In LLVM 1.3 format, the identifier and the size of the block are - /// encoded into a single vbr_uint32 with 5 bits for the block identifier - /// and 27-bits for block length. This limits blocks to a maximum of - /// 128MBytes of data, and block types to 31 which should be sufficient + /// encoded into a single vbr_uint32 with 5 bits for the block identifier + /// and 27-bits for block length. This limits blocks to a maximum of + /// 128MBytes of data, and block types to 31 which should be sufficient /// for the foreseeable usage. Because the values of block identifiers MUST /// fit within 5 bits (values 1-31), this enumeration is used to ensure /// smaller values are used for 1.3 and subsequent bytecode versions. @@ -80,7 +80,7 @@ // InstructionList - The instructions in the body of a function. This // superceeds the old BasicBlock node used in LLVM 1.0. - InstructionListBlockID = 0x07, ///< 1.3 identifier for insruction list + InstructionListBlockID = 0x07, ///< 1.3 identifier for insruction list // CompactionTable - blocks with this id are used to define local remapping // tables for a function, allowing the indices used within the function to Index: llvm/include/llvm/Bytecode/Reader.h diff -u llvm/include/llvm/Bytecode/Reader.h:1.23 llvm/include/llvm/Bytecode/Reader.h:1.24 --- llvm/include/llvm/Bytecode/Reader.h:1.23 Mon Nov 15 15:27:05 2004 +++ llvm/include/llvm/Bytecode/Reader.h Thu Apr 21 15:34:13 2005 @@ -1,10 +1,10 @@ //===-- llvm/Bytecode/Reader.h - Reader for VM bytecode files ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This functionality is implemented by the lib/Bytecode/Reader library. @@ -60,21 +60,21 @@ /// dependent libraries. /// @returns true on success, false otherwise /// @brief Get the list of dependent libraries from a bytecode file. -bool GetBytecodeDependentLibraries(const std::string &fileName, +bool GetBytecodeDependentLibraries(const std::string &fileName, Module::LibraryListType& deplibs); /// This function will read only the necessary parts of a bytecode file in order /// to obtain a list of externally visible global symbols that the bytecode -/// module defines. This is used for archiving and linking when only the list +/// module defines. This is used for archiving and linking when only the list /// of symbols the module defines is needed. /// @returns true on success, false otherwise /// @brief Get a bytecode file's externally visibile defined global symbols. -bool GetBytecodeSymbols(const sys::Path& fileName, +bool GetBytecodeSymbols(const sys::Path& fileName, std::vector& syms); /// This function will read only the necessary parts of a bytecode buffer in -/// order to obtain a list of externally visible global symbols that the -/// bytecode module defines. This is used for archiving and linking when only +/// order to obtain a list of externally visible global symbols that the +/// bytecode module defines. This is used for archiving and linking when only /// the list of symbols the module defines is needed and the bytecode is /// already in memory. /// @returns the ModuleProvider on success, 0 if the bytecode can't be parsed Index: llvm/include/llvm/Bytecode/WriteBytecodePass.h diff -u llvm/include/llvm/Bytecode/WriteBytecodePass.h:1.14 llvm/include/llvm/Bytecode/WriteBytecodePass.h:1.15 --- llvm/include/llvm/Bytecode/WriteBytecodePass.h:1.14 Mon Nov 8 13:01:03 2004 +++ llvm/include/llvm/Bytecode/WriteBytecodePass.h Thu Apr 21 15:34:13 2005 @@ -1,10 +1,10 @@ //===- llvm/Bytecode/WriteBytecodePass.h - Bytecode Writer Pass -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a simple pass to write the working module to a file after @@ -26,15 +26,15 @@ bool DeleteStream; bool CompressFile; public: - WriteBytecodePass() + WriteBytecodePass() : Out(&std::cout), DeleteStream(false), CompressFile(true) {} - WriteBytecodePass(std::ostream *o, bool DS = false, bool CF = true) + WriteBytecodePass(std::ostream *o, bool DS = false, bool CF = true) : Out(o), DeleteStream(DS), CompressFile(CF) {} inline ~WriteBytecodePass() { if (DeleteStream) delete Out; } - + bool runOnModule(Module &M) { WriteBytecodeToFile(&M, *Out, CompressFile ); return false; Index: llvm/include/llvm/Bytecode/Writer.h diff -u llvm/include/llvm/Bytecode/Writer.h:1.8 llvm/include/llvm/Bytecode/Writer.h:1.9 --- llvm/include/llvm/Bytecode/Writer.h:1.8 Sun Nov 7 12:18:11 2004 +++ llvm/include/llvm/Bytecode/Writer.h Thu Apr 21 15:34:13 2005 @@ -1,10 +1,10 @@ //===-- llvm/Bytecode/Writer.h - Writer for VM bytecode files ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This functionality is implemented by the lib/BytecodeWriter library. @@ -28,7 +28,7 @@ namespace llvm { class Module; - void WriteBytecodeToFile(const Module *M, std::ostream &Out, + void WriteBytecodeToFile(const Module *M, std::ostream &Out, bool compress = true); } // End llvm namespace From brukman at cs.uiuc.edu Thu Apr 21 15:38:11 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:38:11 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/AsmPrinter.h InstrScheduling.h IntrinsicLowering.h LiveVariables.h MachineBasicBlock.h MachineCodeEmitter.h MachineConstantPool.h MachineFrameInfo.h MachineFunction.h MachineFunctionPass.h MachineInstr.h MachineInstrBuilder.h MachineRelocation.h Passes.h SchedGraphCommon.h SelectionDAG.h SelectionDAGISel.h SelectionDAGNodes.h ValueSet.h ValueTypes.h Message-ID: <200504212038.PAA00899@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: AsmPrinter.h updated: 1.12 -> 1.13 InstrScheduling.h updated: 1.14 -> 1.15 IntrinsicLowering.h updated: 1.7 -> 1.8 LiveVariables.h updated: 1.20 -> 1.21 MachineBasicBlock.h updated: 1.43 -> 1.44 MachineCodeEmitter.h updated: 1.25 -> 1.26 MachineConstantPool.h updated: 1.4 -> 1.5 MachineFrameInfo.h updated: 1.11 -> 1.12 MachineFunction.h updated: 1.51 -> 1.52 MachineFunctionPass.h updated: 1.3 -> 1.4 MachineInstr.h updated: 1.160 -> 1.161 MachineInstrBuilder.h updated: 1.27 -> 1.28 MachineRelocation.h updated: 1.4 -> 1.5 Passes.h updated: 1.18 -> 1.19 SchedGraphCommon.h updated: 1.12 -> 1.13 SelectionDAG.h updated: 1.20 -> 1.21 SelectionDAGISel.h updated: 1.3 -> 1.4 SelectionDAGNodes.h updated: 1.32 -> 1.33 ValueSet.h updated: 1.14 -> 1.15 ValueTypes.h updated: 1.10 -> 1.11 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+191 -191) AsmPrinter.h | 6 +-- InstrScheduling.h | 6 +-- IntrinsicLowering.h | 10 ++--- LiveVariables.h | 10 ++--- MachineBasicBlock.h | 30 +++++++-------- MachineCodeEmitter.h | 8 ++-- MachineConstantPool.h | 6 +-- MachineFrameInfo.h | 10 ++--- MachineFunction.h | 26 ++++++------- MachineFunctionPass.h | 4 +- MachineInstr.h | 96 +++++++++++++++++++++++++------------------------- MachineInstrBuilder.h | 6 +-- MachineRelocation.h | 4 +- Passes.h | 12 +++--- SchedGraphCommon.h | 84 +++++++++++++++++++++---------------------- SelectionDAG.h | 10 ++--- SelectionDAGISel.h | 8 ++-- SelectionDAGNodes.h | 36 +++++++++--------- ValueSet.h | 6 +-- ValueTypes.h | 4 +- 20 files changed, 191 insertions(+), 191 deletions(-) Index: llvm/include/llvm/CodeGen/AsmPrinter.h diff -u llvm/include/llvm/CodeGen/AsmPrinter.h:1.12 llvm/include/llvm/CodeGen/AsmPrinter.h:1.13 --- llvm/include/llvm/CodeGen/AsmPrinter.h:1.12 Sun Apr 3 09:57:35 2005 +++ llvm/include/llvm/CodeGen/AsmPrinter.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- llvm/CodeGen/AsmPrinter.h - AsmPrinter Framework --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This class is intended to be used as a base class for target-specific @@ -78,7 +78,7 @@ /// AsciiDirective - This directive allows emission of an ascii string with /// the standard C escape characters embedded into it. const char *AsciiDirective; - + /// DataDirectives - These directives are used to output some unit of /// integer data to the current section. If a data directive is set to /// null, smaller data directives will be used to emit the large sizes. Index: llvm/include/llvm/CodeGen/InstrScheduling.h diff -u llvm/include/llvm/CodeGen/InstrScheduling.h:1.14 llvm/include/llvm/CodeGen/InstrScheduling.h:1.15 --- llvm/include/llvm/CodeGen/InstrScheduling.h:1.14 Tue Nov 11 16:41:31 2003 +++ llvm/include/llvm/CodeGen/InstrScheduling.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- InstrScheduling.h - Interface To Instruction Scheduling -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a minimal, but complete, interface to instruction @@ -22,7 +22,7 @@ //--------------------------------------------------------------------------- // Function: createScheduleInstructionsWithSSAPass(..) -// +// // Purpose: // Entry point for instruction scheduling on SSA form. // Schedules the machine instructions generated by instruction selection. Index: llvm/include/llvm/CodeGen/IntrinsicLowering.h diff -u llvm/include/llvm/CodeGen/IntrinsicLowering.h:1.7 llvm/include/llvm/CodeGen/IntrinsicLowering.h:1.8 --- llvm/include/llvm/CodeGen/IntrinsicLowering.h:1.7 Mon Sep 27 20:59:17 2004 +++ llvm/include/llvm/CodeGen/IntrinsicLowering.h Thu Apr 21 15:38:00 2005 @@ -1,12 +1,12 @@ //===-- IntrinsicLowering.h - Intrinsic Function Lowering -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // This file defines the IntrinsicLowering interface. This interface allows // addition of domain-specific or front-end specific intrinsics to LLVM without // having to modify all of the code generators to support the new intrinsic. @@ -38,7 +38,7 @@ namespace llvm { class CallInst; class Module; - + class IntrinsicLowering { public: virtual ~IntrinsicLowering() {} @@ -67,7 +67,7 @@ /// implementation to allow for future extensibility. struct DefaultIntrinsicLowering : public IntrinsicLowering { virtual void AddPrototypes(Module &M); - virtual void LowerIntrinsicCall(CallInst *CI); + virtual void LowerIntrinsicCall(CallInst *CI); }; } Index: llvm/include/llvm/CodeGen/LiveVariables.h diff -u llvm/include/llvm/CodeGen/LiveVariables.h:1.20 llvm/include/llvm/CodeGen/LiveVariables.h:1.21 --- llvm/include/llvm/CodeGen/LiveVariables.h:1.20 Sat Jan 1 09:58:55 2005 +++ llvm/include/llvm/CodeGen/LiveVariables.h Thu Apr 21 15:38:00 2005 @@ -1,12 +1,12 @@ //===-- llvm/CodeGen/LiveVariables.h - Live Variable Analysis ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // This file implements the LiveVariable analysis pass. For each machine // instruction in the function, this pass calculates the set of registers that // are immediately dead after the instruction (i.e., the instruction calculates @@ -23,7 +23,7 @@ // to resolve physical register lifetimes in each basic block). If a physical // register is not register allocatable, it is not tracked. This is useful for // things like the stack pointer and condition codes. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_LIVEVARIABLES_H @@ -111,7 +111,7 @@ /// killed_iterator - Iterate over registers killed by a machine instruction /// typedef std::multimap::iterator killed_iterator; - + /// killed_begin/end - Get access to the range of registers killed by a /// machine instruction. killed_iterator killed_begin(MachineInstr *MI) { Index: llvm/include/llvm/CodeGen/MachineBasicBlock.h diff -u llvm/include/llvm/CodeGen/MachineBasicBlock.h:1.43 llvm/include/llvm/CodeGen/MachineBasicBlock.h:1.44 --- llvm/include/llvm/CodeGen/MachineBasicBlock.h:1.43 Sat Jan 29 18:13:34 2005 +++ llvm/include/llvm/CodeGen/MachineBasicBlock.h Thu Apr 21 15:38:00 2005 @@ -1,12 +1,12 @@ //===-- llvm/CodeGen/MachineBasicBlock.h ------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // Collect the sequence of machine instructions for a basic block. // //===----------------------------------------------------------------------===// @@ -75,7 +75,7 @@ } ~MachineBasicBlock(); - + /// getBasicBlock - Return the LLVM basic block that this instance /// corresponded to originally. /// @@ -111,7 +111,7 @@ typedef std::vector::const_iterator const_pred_iterator; typedef std::vector::iterator succ_iterator; typedef std::vector::const_iterator const_succ_iterator; - + pred_iterator pred_begin() { return Predecessors.begin (); } const_pred_iterator pred_begin() const { return Predecessors.begin (); } pred_iterator pred_end() { return Predecessors.end (); } @@ -162,7 +162,7 @@ iterator erase(iterator I, iterator E) { return Insts.erase(I, E); } MachineInstr *remove(MachineInstr *I) { return Insts.remove(I); } void clear() { Insts.clear(); } - + /// splice - Take a block of instructions from MBB 'Other' in the range [From, /// To), and insert them into this MBB right before 'where'. void splice(iterator where, MachineBasicBlock *Other, iterator From, @@ -219,10 +219,10 @@ typedef MachineBasicBlock::succ_iterator ChildIteratorType; static NodeType *getEntryNode(MachineBasicBlock *BB) { return BB; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return N->succ_begin(); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return N->succ_end(); } }; @@ -232,10 +232,10 @@ typedef MachineBasicBlock::const_succ_iterator ChildIteratorType; static NodeType *getEntryNode(const MachineBasicBlock *BB) { return BB; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return N->succ_begin(); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return N->succ_end(); } }; @@ -252,10 +252,10 @@ static NodeType *getEntryNode(Inverse G) { return G.Graph; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return N->pred_begin(); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return N->pred_end(); } }; @@ -264,12 +264,12 @@ typedef const MachineBasicBlock NodeType; typedef MachineBasicBlock::const_pred_iterator ChildIteratorType; static NodeType *getEntryNode(Inverse G) { - return G.Graph; + return G.Graph; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return N->pred_begin(); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return N->pred_end(); } }; Index: llvm/include/llvm/CodeGen/MachineCodeEmitter.h diff -u llvm/include/llvm/CodeGen/MachineCodeEmitter.h:1.25 llvm/include/llvm/CodeGen/MachineCodeEmitter.h:1.26 --- llvm/include/llvm/CodeGen/MachineCodeEmitter.h:1.25 Mon Nov 22 15:54:14 2004 +++ llvm/include/llvm/CodeGen/MachineCodeEmitter.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- llvm/CodeGen/MachineCodeEmitter.h - Code emission -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines an abstract interface that is used by the machine code @@ -37,7 +37,7 @@ /// about to be code generated. /// virtual void startFunction(MachineFunction &F) {} - + /// finishFunction - This callback is invoked when the specified function has /// finished code generation. /// @@ -88,7 +88,7 @@ /// addRelocation - Whenever a relocatable address is needed, it should be /// noted with this interface. virtual void addRelocation(const MachineRelocation &MR) = 0; - + // getConstantPoolEntryAddress - Return the address of the 'Index' entry in // the constant pool that was last emitted with the 'emitConstantPool' method. // Index: llvm/include/llvm/CodeGen/MachineConstantPool.h diff -u llvm/include/llvm/CodeGen/MachineConstantPool.h:1.4 llvm/include/llvm/CodeGen/MachineConstantPool.h:1.5 --- llvm/include/llvm/CodeGen/MachineConstantPool.h:1.4 Tue Nov 11 16:41:31 2003 +++ llvm/include/llvm/CodeGen/MachineConstantPool.h Thu Apr 21 15:38:00 2005 @@ -1,12 +1,12 @@ //===-- CodeGen/MachineConstantPool.h - Abstract Constant Pool --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // The MachineConstantPool class keeps track of constants referenced by a // function which must be spilled to memory. This is used for constants which // are unable to be used directly as operands to instructions, which typically Index: llvm/include/llvm/CodeGen/MachineFrameInfo.h diff -u llvm/include/llvm/CodeGen/MachineFrameInfo.h:1.11 llvm/include/llvm/CodeGen/MachineFrameInfo.h:1.12 --- llvm/include/llvm/CodeGen/MachineFrameInfo.h:1.11 Sun Aug 15 17:02:36 2004 +++ llvm/include/llvm/CodeGen/MachineFrameInfo.h Thu Apr 21 15:38:00 2005 @@ -1,12 +1,12 @@ //===-- CodeGen/MachineFrameInfo.h - Abstract Stack Frame Rep. --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // The MachineFrameInfo class represents an abstract stack frame until // prolog/epilog code is inserted. This class is key to allowing stack frame // representation optimizations, such as frame pointer elimination. It also @@ -168,7 +168,7 @@ /// bool hasCalls() const { return HasCalls; } void setHasCalls(bool V) { HasCalls = V; } - + /// getMaxCallFrameSize - Return the maximum size of a call frame that must be /// allocated for an outgoing function call. This is only available if /// CallFrameSetup/Destroy pseudo instructions are used by the target, and @@ -186,7 +186,7 @@ Objects.insert(Objects.begin(), StackObject(Size, 1, SPOffset)); return -++NumFixedObjects; } - + /// CreateStackObject - Create a new statically sized stack object, returning /// a postive identifier to represent it. /// Index: llvm/include/llvm/CodeGen/MachineFunction.h diff -u llvm/include/llvm/CodeGen/MachineFunction.h:1.51 llvm/include/llvm/CodeGen/MachineFunction.h:1.52 --- llvm/include/llvm/CodeGen/MachineFunction.h:1.51 Sat Apr 9 10:22:53 2005 +++ llvm/include/llvm/CodeGen/MachineFunction.h Thu Apr 21 15:38:00 2005 @@ -1,18 +1,18 @@ //===-- llvm/CodeGen/MachineFunction.h --------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // Collect native machine code for a function. This class contains a list of // MachineBasicBlock instances that make up the current compiled function. // // This class also contains pointers to various classes which hold // target-specific information about the generated code. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_MACHINEFUNCTION_H @@ -35,19 +35,19 @@ // this is only set by the MachineFunction owning the ilist friend class MachineFunction; MachineFunction* Parent; - + public: ilist_traits() : Parent(0) { } - + static MachineBasicBlock* getPrev(MachineBasicBlock* N) { return N->Prev; } static MachineBasicBlock* getNext(MachineBasicBlock* N) { return N->Next; } - + static const MachineBasicBlock* getPrev(const MachineBasicBlock* N) { return N->Prev; } - + static const MachineBasicBlock* getNext(const MachineBasicBlock* N) { return N->Next; } - + static void setPrev(MachineBasicBlock* N, MachineBasicBlock* prev) { N->Prev = prev; } @@ -179,7 +179,7 @@ /// is an error to add the same register to the same set more than once. void addLiveIn(unsigned Reg) { LiveIns.push_back(Reg); } void addLiveOut(unsigned Reg) { LiveOuts.push_back(Reg); } - + // Iteration support for live in/out sets. These sets are kept in sorted // order by their register number. typedef std::vector::const_iterator liveinout_iterator; @@ -219,7 +219,7 @@ /// in your path. /// void viewCFG() const; - + /// viewCFGOnly - This function is meant for use from the debugger. It works /// just like viewCFG, but it does not include the contents of basic blocks /// into the nodes, just the label. If you are only interested in the CFG @@ -256,7 +256,7 @@ // Provide accessors for basic blocks... const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; } BasicBlockListType &getBasicBlockList() { return BasicBlocks; } - + //===--------------------------------------------------------------------===// // BasicBlock iterator forwarding functions // @@ -331,7 +331,7 @@ }; -// Provide specializations of GraphTraits to be able to treat a function as a +// Provide specializations of GraphTraits to be able to treat a function as a // graph of basic blocks... and to walk it in inverse order. Inverse order for // a function is considered to be when traversing the predecessor edges of a BB // instead of the successor edges. Index: llvm/include/llvm/CodeGen/MachineFunctionPass.h diff -u llvm/include/llvm/CodeGen/MachineFunctionPass.h:1.3 llvm/include/llvm/CodeGen/MachineFunctionPass.h:1.4 --- llvm/include/llvm/CodeGen/MachineFunctionPass.h:1.3 Tue Nov 11 16:41:31 2003 +++ llvm/include/llvm/CodeGen/MachineFunctionPass.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- MachineFunctionPass.h - Pass for MachineFunctions --------*-C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the MachineFunctionPass class. MachineFunctionPass's are Index: llvm/include/llvm/CodeGen/MachineInstr.h diff -u llvm/include/llvm/CodeGen/MachineInstr.h:1.160 llvm/include/llvm/CodeGen/MachineInstr.h:1.161 --- llvm/include/llvm/CodeGen/MachineInstr.h:1.160 Sun Apr 10 22:38:28 2005 +++ llvm/include/llvm/CodeGen/MachineInstr.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- llvm/CodeGen/MachineInstr.h - MachineInstr class --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the declaration of the MachineInstr class, which is the @@ -35,8 +35,8 @@ typedef short MachineOpCode; //===----------------------------------------------------------------------===// -// class MachineOperand -// +// class MachineOperand +// // Purpose: // Representation of each machine instruction operand. // This class is designed so that you can allocate a vector of operands @@ -45,10 +45,10 @@ // E.g, for this VM instruction: // ptr = alloca type, numElements // we generate 2 machine instructions on the SPARC: -// +// // mul Constant, Numelements -> Reg // add %sp, Reg -> Ptr -// +// // Each instruction has 3 operands, listed above. Of those: // - Reg, NumElements, and Ptr are of operand type MO_Register. // - Constant is of operand type MO_SignExtendedImmed on the SPARC. @@ -57,16 +57,16 @@ // // - Reg will be of virtual register type MO_MInstrVirtualReg. The field // MachineInstr* minstr will point to the instruction that computes reg. -// +// // - %sp will be of virtual register type MO_MachineReg. // The field regNum identifies the machine register. -// +// // - NumElements will be of virtual register type MO_VirtualReg. // The field Value* value identifies the value. -// +// // - Ptr will also be of virtual register type MO_VirtualReg. // Again, the field Value* value identifies the value. -// +// //===----------------------------------------------------------------------===// struct MachineOperand { @@ -108,14 +108,14 @@ MO_ExternalSymbol, // Name of external global symbol MO_GlobalAddress, // Address of a global value }; - + private: union { Value* value; // BasicBlockVal for a label operand. // ConstantVal for a non-address immediate. // Virtual register for an SSA operand, // including hidden operands required for - // the generated machine code. + // the generated machine code. // LLVM global for MO_GlobalAddress. int64_t immedVal; // Constant value for an explicit constant @@ -134,7 +134,7 @@ // valid for MO_GlobalAddress and MO_ExternalSym } extra; - void zeroContents () { + void zeroContents () { memset (&contents, 0, sizeof (contents)); memset (&extra, 0, sizeof (extra)); } @@ -193,9 +193,9 @@ extra = M.extra; } - + ~MachineOperand() {} - + const MachineOperand &operator=(const MachineOperand &MO) { contents = MO.contents; flags = MO.flags; @@ -205,7 +205,7 @@ } /// getType - Returns the MachineOperandType for this operand. - /// + /// MachineOperandType getType() const { return opType; } /// getUseType - Returns the MachineOperandUseType of this operand. @@ -245,7 +245,7 @@ /// has one. This is deprecated and only used by the SPARC v9 backend. /// Value* getVRegValueOrNull() const { - return (opType == MO_VirtualRegister || opType == MO_CCRegister || + return (opType == MO_VirtualRegister || opType == MO_CCRegister || isPCRelativeDisp()) ? contents.value : NULL; } @@ -312,7 +312,7 @@ /// bool hasAllocatedReg() const { return (extra.regNum >= 0 && - (opType == MO_VirtualRegister || opType == MO_CCRegister || + (opType == MO_VirtualRegister || opType == MO_CCRegister || opType == MO_MachineRegister)); } @@ -331,13 +331,13 @@ // code.' It's not clear where the duplication is. assert(hasAllocatedReg() && "This operand cannot have a register number!"); extra.regNum = Reg; - } + } void setValueReg(Value *val) { assert(getVRegValueOrNull() != 0 && "Original operand must of type Value*"); contents.value = val; } - + void setImmedValue(int immVal) { assert(isImmediate() && "Wrong MachineOperand mutator"); contents.immedVal = immVal; @@ -358,35 +358,35 @@ void markLo32() { flags |= LOFLAG32; } void markHi64() { flags |= HIFLAG64; } void markLo64() { flags |= LOFLAG64; } - + private: /// setRegForValue - Replaces the Value with its corresponding physical /// register after register allocation is complete. This is deprecated /// and only used by the SPARC v9 back-end. /// void setRegForValue(int reg) { - assert(opType == MO_VirtualRegister || opType == MO_CCRegister || + assert(opType == MO_VirtualRegister || opType == MO_CCRegister || opType == MO_MachineRegister); extra.regNum = reg; } - + friend class MachineInstr; }; //===----------------------------------------------------------------------===// -// class MachineInstr -// +// class MachineInstr +// // Purpose: // Representation of each machine instruction. -// +// // MachineOpCode must be an enum, defined separately for each target. // E.g., It is defined in SparcInstructionSelection.h for the SPARC. -// +// // There are 2 kinds of operands: -// -// (1) Explicit operands of the machine instruction in vector operands[] -// +// +// (1) Explicit operands of the machine instruction in vector operands[] +// // (2) "Implicit operands" are values implicitly used or defined by the // machine instruction, such as arguments to a CALL, return value of // a CALL (if any), and return value of a RETURN. @@ -426,7 +426,7 @@ /// block. /// MachineInstr(MachineBasicBlock *MBB, short Opcode, unsigned numOps); - + ~MachineInstr(); const MachineBasicBlock* getParent() const { return parent; } @@ -439,7 +439,7 @@ /// Access to explicit operands of the instruction. /// unsigned getNumOperands() const { return operands.size() - numImplicitRefs; } - + const MachineOperand& getOperand(unsigned i) const { assert(i < getNumOperands() && "getOperand() out of range!"); return operands[i]; @@ -454,7 +454,7 @@ // This returns the i'th entry in the operand vector. // That represents the i'th explicit operand or the (i-N)'th implicit operand, // depending on whether i < N or i >= N. - // + // const MachineOperand& getExplOrImplOperand(unsigned i) const { assert(i < operands.size() && "getExplOrImplOperand() out of range!"); return (i < getNumOperands()? getOperand(i) @@ -463,9 +463,9 @@ // // Access to implicit operands of the instruction - // + // unsigned getNumImplicitRefs() const{ return numImplicitRefs; } - + MachineOperand& getImplicitOp(unsigned i) { assert(i < numImplicitRefs && "implicit ref# out of range!"); return operands[i + operands.size() - numImplicitRefs]; @@ -672,7 +672,7 @@ /// replace - Support to rewrite a machine instruction in place: for now, /// simply replace() and then set new operands with Set.*Operand methods /// below. - /// + /// void replace(short Opcode, unsigned numOperands); /// setOpcode - Replace the opcode of the current instruction with a new one. @@ -687,7 +687,7 @@ } // Access to set the operands when building the machine instruction - // + // void SetMachineOperandVal(unsigned i, MachineOperand::MachineOperandType operandType, Value* V); @@ -702,22 +702,22 @@ unsigned substituteValue(const Value* oldVal, Value* newVal, bool defsOnly, bool notDefsAndUses, bool& someArgsWereIgnored); - + // SetRegForOperand - // SetRegForImplicitRef - // Mark an explicit or implicit operand with its allocated physical register. - // + // void SetRegForOperand(unsigned i, int regNum); void SetRegForImplicitRef(unsigned i, int regNum); // // Iterator to enumerate machine operands. - // + // template class ValOpIterator : public forward_iterator { unsigned i; MITy MI; - + void skipToNextVal() { while (i < MI->getNumOperands() && !( (MI->getOperand(i).getType() == MachineOperand::MO_VirtualRegister || @@ -725,14 +725,14 @@ && MI->getOperand(i).getVRegValue() != 0)) ++i; } - + inline ValOpIterator(MITy mi, unsigned I) : i(I), MI(mi) { skipToNextVal(); } - + public: typedef ValOpIterator _Self; - + inline VTy operator*() const { return MI->getOperand(i).getVRegValue(); } @@ -742,16 +742,16 @@ inline VTy operator->() const { return operator*(); } - inline bool isUse() const { return MI->getOperand(i).isUse(); } - inline bool isDef() const { return MI->getOperand(i).isDef(); } + inline bool isUse() const { return MI->getOperand(i).isUse(); } + inline bool isDef() const { return MI->getOperand(i).isDef(); } inline _Self& operator++() { i++; skipToNextVal(); return *this; } inline _Self operator++(int) { _Self tmp = *this; ++*this; return tmp; } - inline bool operator==(const _Self &y) const { + inline bool operator==(const _Self &y) const { return i == y.i; } - inline bool operator!=(const _Self &y) const { + inline bool operator!=(const _Self &y) const { return !operator==(y); } Index: llvm/include/llvm/CodeGen/MachineInstrBuilder.h diff -u llvm/include/llvm/CodeGen/MachineInstrBuilder.h:1.27 llvm/include/llvm/CodeGen/MachineInstrBuilder.h:1.28 --- llvm/include/llvm/CodeGen/MachineInstrBuilder.h:1.27 Mon Apr 11 02:14:41 2005 +++ llvm/include/llvm/CodeGen/MachineInstrBuilder.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file exposes a function named BuildMI, which is useful for dramatically @@ -86,7 +86,7 @@ MI->addMachineRegOperand(Reg, Ty); return *this; } - + /// addImm - Add a new immediate operand. /// const MachineInstrBuilder &addImm(int Val) const { Index: llvm/include/llvm/CodeGen/MachineRelocation.h diff -u llvm/include/llvm/CodeGen/MachineRelocation.h:1.4 llvm/include/llvm/CodeGen/MachineRelocation.h:1.5 --- llvm/include/llvm/CodeGen/MachineRelocation.h:1.4 Sat Nov 20 21:27:13 2004 +++ llvm/include/llvm/CodeGen/MachineRelocation.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- llvm/CodeGen/MachineRelocation.h - Target Relocation ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the MachineRelocation class. Index: llvm/include/llvm/CodeGen/Passes.h diff -u llvm/include/llvm/CodeGen/Passes.h:1.18 llvm/include/llvm/CodeGen/Passes.h:1.19 --- llvm/include/llvm/CodeGen/Passes.h:1.18 Sat Jul 31 04:59:14 2004 +++ llvm/include/llvm/CodeGen/Passes.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- Passes.h - Target independent code generation passes ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines interfaces to access the target independent code generation @@ -31,7 +31,7 @@ /// last LLVM modifying pass to clean up blocks that are not reachable from /// the entry block. FunctionPass *createUnreachableBlockEliminationPass(); - + /// MachineFunctionPrinter pass - This pass prints out the machine function to /// standard error, as a debugging tool. FunctionPass *createMachineFunctionPrinterPass(std::ostream *OS, @@ -62,9 +62,9 @@ /// LocalRegisterAllocation Pass - This pass register allocates the input code /// a basic block at a time, yielding code better than the simple register /// allocator, but not as good as a global allocator. - /// + /// FunctionPass *createLocalRegisterAllocator(); - + /// LinearScanRegisterAllocation Pass - This pass implements the linear scan /// register allocation algorithm, a global register allocator. /// @@ -90,7 +90,7 @@ /// the current function, which should happen after the function has been /// emitted to a .s file or to memory. FunctionPass *createMachineCodeDeleter(); - + /// getRegisterAllocator - This creates an instance of the register allocator /// for the Sparc. FunctionPass *getRegisterAllocator(TargetMachine &T); Index: llvm/include/llvm/CodeGen/SchedGraphCommon.h diff -u llvm/include/llvm/CodeGen/SchedGraphCommon.h:1.12 llvm/include/llvm/CodeGen/SchedGraphCommon.h:1.13 --- llvm/include/llvm/CodeGen/SchedGraphCommon.h:1.12 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/CodeGen/SchedGraphCommon.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- SchedGraphCommon.h - Scheduling Base Graph --------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // A common graph class that is based on the SSA graph. It includes @@ -47,7 +47,7 @@ typedef std::vector::const_iterator const_iterator; typedef std::vector::reverse_iterator reverse_iterator; typedef std::vector::const_reverse_iterator const_reverse_iterator; - + // Accessor methods unsigned getNodeId() const { return ID; } int getLatency() const { return latency; } @@ -60,7 +60,7 @@ iterator endInEdges() { return inEdges.end(); } iterator beginOutEdges() { return outEdges.begin(); } iterator endOutEdges() { return outEdges.end(); } - + const_iterator beginInEdges() const { return inEdges.begin(); } const_iterator endInEdges() const { return inEdges.end(); } const_iterator beginOutEdges() const { return outEdges.begin(); } @@ -70,29 +70,29 @@ // Debugging support virtual void print(std::ostream &os) const = 0; - + protected: friend class SchedGraphCommon; friend class SchedGraphEdge; // give access for adding edges - - + + // disable default constructor and provide a ctor for single-block graphs SchedGraphNodeCommon(); // DO NOT IMPLEMENT - + inline SchedGraphNodeCommon(unsigned Id, int index, int late=0) : ID(Id), latency(late), origIndexInBB(index) {} - + virtual ~SchedGraphNodeCommon(); - + //Functions to add and remove edges inline void addInEdge(SchedGraphEdge* edge) { inEdges.push_back(edge); } inline void addOutEdge(SchedGraphEdge* edge) { outEdges.push_back(edge); } void removeInEdge(const SchedGraphEdge* edge); void removeOutEdge(const SchedGraphEdge* edge); - + }; // ostream << operator for SchedGraphNode class -inline std::ostream &operator<<(std::ostream &os, +inline std::ostream &operator<<(std::ostream &os, const SchedGraphNodeCommon &node) { node.print(os); return os; @@ -112,7 +112,7 @@ enum DataDepOrderType { TrueDep = 0x1, AntiDep=0x2, OutputDep=0x4, NonDataDep=0x8 }; - + protected: SchedGraphNodeCommon* src; SchedGraphNodeCommon* sink; @@ -120,7 +120,7 @@ unsigned int depOrderType; int minDelay; // cached latency (assumes fixed target arch) int iteDiff; - + union { const Value* val; int machineRegNum; @@ -130,30 +130,30 @@ public: // For all constructors, if minDelay is unspecified, minDelay is // set to _src->getLatency(). - + // constructor for CtrlDep or MemoryDep edges, selected by 3rd argument SchedGraphEdge(SchedGraphNodeCommon* _src, SchedGraphNodeCommon* _sink, SchedGraphEdgeDepType _depType, unsigned int _depOrderType, int _minDelay = -1); - + // constructor for explicit value dependence (may be true/anti/output) SchedGraphEdge(SchedGraphNodeCommon* _src, SchedGraphNodeCommon* _sink, const Value* _val, unsigned int _depOrderType, int _minDelay = -1); - + // constructor for machine register dependence SchedGraphEdge(SchedGraphNodeCommon* _src,SchedGraphNodeCommon* _sink, unsigned int _regNum, unsigned int _depOrderType, int _minDelay = -1); - + // constructor for any other machine resource dependences. // DataDepOrderType is always NonDataDep. It it not an argument to // avoid overloading ambiguity with previous constructor. SchedGraphEdge(SchedGraphNodeCommon* _src, SchedGraphNodeCommon* _sink, ResourceId _resourceId, int _minDelay = -1); - + ~SchedGraphEdge() {} - + SchedGraphNodeCommon* getSrc() const { return src; } SchedGraphNodeCommon* getSink() const { return sink; } int getMinDelay() const { return minDelay; } @@ -179,12 +179,12 @@ int getIteDiff() { return iteDiff; } - + public: // Debugging support void print(std::ostream &os) const; void dump(int indent=0) const; - + private: // disable default ctor SchedGraphEdge(); // DO NOT IMPLEMENT @@ -197,7 +197,7 @@ } class SchedGraphCommon { - + protected: SchedGraphNodeCommon* graphRoot; // the root and leaf are not inserted SchedGraphNodeCommon* graphLeaf; // in the hash_map (see getNumNodes()) @@ -207,16 +207,16 @@ // Accessor methods // SchedGraphNodeCommon* getRoot() const { return graphRoot; } - SchedGraphNodeCommon* getLeaf() const { return graphLeaf; } - + SchedGraphNodeCommon* getLeaf() const { return graphLeaf; } + // // Delete nodes or edges from the graph. - // + // void eraseNode(SchedGraphNodeCommon* node); void eraseIncomingEdges(SchedGraphNodeCommon* node, bool addDummyEdges = true); void eraseOutgoingEdges(SchedGraphNodeCommon* node, bool addDummyEdges = true); void eraseIncidentEdges(SchedGraphNodeCommon* node, bool addDummyEdges = true); - + SchedGraphCommon() {} ~SchedGraphCommon(); }; @@ -227,30 +227,30 @@ // Ok to make it a template because it shd get instantiated at most twice: // for and // for . -// +// template class SGPredIterator: public bidirectional_iterator<_NodeType, ptrdiff_t> { protected: _EdgeIter oi; public: typedef SGPredIterator<_NodeType, _EdgeType, _EdgeIter> _Self; - + inline SGPredIterator(_EdgeIter startEdge) : oi(startEdge) {} - + inline bool operator==(const _Self& x) const { return oi == x.oi; } inline bool operator!=(const _Self& x) const { return !operator==(x); } - + // operator*() differs for pred or succ iterator inline _NodeType* operator*() const { return (_NodeType*)(*oi)->getSrc(); } inline _NodeType* operator->() const { return operator*(); } - + inline _EdgeType* getEdge() const { return *(oi); } - + inline _Self &operator++() { ++oi; return *this; } // Preincrement inline _Self operator++(int) { // Postincrement - _Self tmp(*this); ++*this; return tmp; + _Self tmp(*this); ++*this; return tmp; } - + inline _Self &operator--() { --oi; return *this; } // Predecrement inline _Self operator--(int) { // Postdecrement _Self tmp = *this; --*this; return tmp; @@ -263,22 +263,22 @@ _EdgeIter oi; public: typedef SGSuccIterator<_NodeType, _EdgeType, _EdgeIter> _Self; - + inline SGSuccIterator(_EdgeIter startEdge) : oi(startEdge) {} - + inline bool operator==(const _Self& x) const { return oi == x.oi; } inline bool operator!=(const _Self& x) const { return !operator==(x); } - + inline _NodeType* operator*() const { return (_NodeType*)(*oi)->getSink(); } inline _NodeType* operator->() const { return operator*(); } - + inline _EdgeType* getEdge() const { return *(oi); } - + inline _Self &operator++() { ++oi; return *this; } // Preincrement inline _Self operator++(int) { // Postincrement - _Self tmp(*this); ++*this; return tmp; + _Self tmp(*this); ++*this; return tmp; } - + inline _Self &operator--() { --oi; return *this; } // Predecrement inline _Self operator--(int) { // Postdecrement _Self tmp = *this; --*this; return tmp; Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.20 llvm/include/llvm/CodeGen/SelectionDAG.h:1.21 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.20 Tue Apr 12 21:37:19 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Thu Apr 21 15:38:00 2005 @@ -1,15 +1,15 @@ //===-- llvm/CodeGen/SelectionDAG.h - InstSelection DAG ---------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // This file declares the SelectionDAG class, and transitively defines the // SDNode class and subclasses. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_SELECTIONDAG_H @@ -62,7 +62,7 @@ typedef std::vector::const_iterator allnodes_iterator; allnodes_iterator allnodes_begin() const { return AllNodes.begin(); } allnodes_iterator allnodes_end() const { return AllNodes.end(); } - + /// getRoot - Return the root tag of the SelectionDAG. /// const SDOperand &getRoot() const { return Root; } Index: llvm/include/llvm/CodeGen/SelectionDAGISel.h diff -u llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.3 llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.4 --- llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.3 Mon Jan 17 11:14:43 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGISel.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- llvm/CodeGen/SelectionDAGISel.h - Common Base Class------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the SelectionDAGISel class, which is used as the common @@ -49,13 +49,13 @@ unsigned MakeReg(MVT::ValueType VT); virtual void InstructionSelectBasicBlock(SelectionDAG &SD) = 0; - + private: SDOperand CopyValueToVirtualRegister(SelectionDAGLowering &SDL, Value *V, unsigned Reg); void SelectBasicBlock(BasicBlock *BB, MachineFunction &MF, FunctionLoweringInfo &FuncInfo); - + void BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB, std::vector > &PHINodesToUpdate, FunctionLoweringInfo &FuncInfo); Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.32 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.33 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.32 Tue Apr 12 21:36:41 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Thu Apr 21 15:38:00 2005 @@ -1,12 +1,12 @@ //===-- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // This file declares the SDNode class and derived classes, which are used to // represent the nodes and operations present in a SelectionDAG. These nodes // and operations are machine code level operations, with some similarities to @@ -51,7 +51,7 @@ // single token result. This is used to represent the fact that the operand // operators are independent of each other. TokenFactor, - + // Various leaf nodes. Constant, ConstantFP, GlobalAddress, FrameIndex, ConstantPool, BasicBlock, ExternalSymbol, @@ -185,7 +185,7 @@ // integer result type. // ZEXTLOAD loads the integer operand and zero extends it to a larger // integer result type. - // EXTLOAD is used for two things: floating point extending loads, and + // EXTLOAD is used for two things: floating point extending loads, and // integer extending loads where it doesn't matter what the high // bits are set to. The code generator is allowed to codegen this // into whichever operation is more efficient. @@ -205,7 +205,7 @@ DYNAMIC_STACKALLOC, // Control flow instructions. These all have token chains. - + // BR - Unconditional branch. The first operand is the chain // operand, the second is the MBB to branch to. BR, @@ -240,7 +240,7 @@ MEMSET, MEMMOVE, MEMCPY, - + // ADJCALLSTACKDOWN/ADJCALLSTACKUP - These operators mark the beginning and // end of a call sequence and indicate how much the stack pointer needs to // be adjusted for that particular call. The first operand is a chain, the @@ -284,7 +284,7 @@ SETUGT, // 1 0 1 0 True if unordered or greater than SETUGE, // 1 0 1 1 True if unordered, greater than, or equal SETULT, // 1 1 0 0 True if unordered or less than - SETULE, // 1 1 0 1 True if unordered, less than, or equal + SETULE, // 1 1 0 1 True if unordered, less than, or equal SETUNE, // 1 1 1 0 True if unordered or not equal SETTRUE, // 1 1 1 1 Always true (always folded) // Don't care operations: undefined if the input is a nan. @@ -293,7 +293,7 @@ SETGT, // 1 X 0 1 0 True if greater than SETGE, // 1 X 0 1 1 True if greater than or equal SETLT, // 1 X 1 0 0 True if less than - SETLE, // 1 X 1 0 1 True if less than or equal + SETLE, // 1 X 1 0 1 True if less than or equal SETNE, // 1 X 1 1 0 True if not equal SETTRUE2, // 1 X 1 1 1 Always true (always folded) @@ -385,7 +385,7 @@ /// getValueType - Return the ValueType of the referenced return value. /// inline MVT::ValueType getValueType() const; - + // Forwarding methods - These forward to the corresponding methods in SDNode. inline unsigned getOpcode() const; inline unsigned getNodeDepth() const; @@ -806,11 +806,11 @@ static bool classof(const MVTSDNode *) { return true; } static bool classof(const SDNode *N) { - return + return N->getOpcode() == ISD::SIGN_EXTEND_INREG || N->getOpcode() == ISD::FP_ROUND_INREG || N->getOpcode() == ISD::EXTLOAD || - N->getOpcode() == ISD::SEXTLOAD || + N->getOpcode() == ISD::SEXTLOAD || N->getOpcode() == ISD::ZEXTLOAD || N->getOpcode() == ISD::TRUNCSTORE; } @@ -819,7 +819,7 @@ class SDNodeIterator : public forward_iterator { SDNode *Node; unsigned Operand; - + SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {} public: bool operator==(const SDNodeIterator& x) const { @@ -832,18 +832,18 @@ Operand = I.Operand; return *this; } - + pointer operator*() const { return Node->getOperand(Operand).Val; } pointer operator->() const { return operator*(); } - + SDNodeIterator& operator++() { // Preincrement ++Operand; return *this; } SDNodeIterator operator++(int) { // Postincrement - SDNodeIterator tmp = *this; ++*this; return tmp; + SDNodeIterator tmp = *this; ++*this; return tmp; } static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); } @@ -859,10 +859,10 @@ typedef SDNode NodeType; typedef SDNodeIterator ChildIteratorType; static inline NodeType *getEntryNode(SDNode *N) { return N; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return SDNodeIterator::begin(N); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return SDNodeIterator::end(N); } }; Index: llvm/include/llvm/CodeGen/ValueSet.h diff -u llvm/include/llvm/CodeGen/ValueSet.h:1.14 llvm/include/llvm/CodeGen/ValueSet.h:1.15 --- llvm/include/llvm/CodeGen/ValueSet.h:1.14 Tue Nov 11 16:41:31 2003 +++ llvm/include/llvm/CodeGen/ValueSet.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===-- llvm/CodeGen/ValueSet.h ---------------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header is OBSOLETE, do not use it for new code. @@ -22,7 +22,7 @@ class Value; -// RAV - Used to print values in a form used by the register allocator. +// RAV - Used to print values in a form used by the register allocator. // struct RAV { // Register Allocator Value const Value &V; Index: llvm/include/llvm/CodeGen/ValueTypes.h diff -u llvm/include/llvm/CodeGen/ValueTypes.h:1.10 llvm/include/llvm/CodeGen/ValueTypes.h:1.11 --- llvm/include/llvm/CodeGen/ValueTypes.h:1.10 Sat Jan 15 00:52:18 2005 +++ llvm/include/llvm/CodeGen/ValueTypes.h Thu Apr 21 15:38:00 2005 @@ -1,10 +1,10 @@ //===- CodeGen/ValueTypes.h - Low-Level Target independ. types --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the set of low-level target independent types which various From brukman at cs.uiuc.edu Thu Apr 21 15:39:13 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:39:13 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Config/alloca.h Message-ID: <200504212039.PAA00955@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Config: alloca.h updated: 1.9 -> 1.10 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+1 -1) alloca.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/Config/alloca.h diff -u llvm/include/llvm/Config/alloca.h:1.9 llvm/include/llvm/Config/alloca.h:1.10 --- llvm/include/llvm/Config/alloca.h:1.9 Fri Feb 18 21:01:13 2005 +++ llvm/include/llvm/Config/alloca.h Thu Apr 21 15:39:02 2005 @@ -3,7 +3,7 @@ * * This file was developed by the LLVM research group and is distributed under * the University of Illinois Open Source License. See LICENSE.TXT for details. - * + * ****************************************************************************** * * Description: From brukman at cs.uiuc.edu Thu Apr 21 15:39:49 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:39:49 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Debugger/Debugger.h InferiorProcess.h ProgramInfo.h RuntimeInfo.h SourceFile.h SourceLanguage.h Message-ID: <200504212039.PAA01002@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Debugger: Debugger.h updated: 1.2 -> 1.3 InferiorProcess.h updated: 1.1 -> 1.2 ProgramInfo.h updated: 1.3 -> 1.4 RuntimeInfo.h updated: 1.2 -> 1.3 SourceFile.h updated: 1.2 -> 1.3 SourceLanguage.h updated: 1.1 -> 1.2 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+23 -23) Debugger.h | 4 ++-- InferiorProcess.h | 6 +++--- ProgramInfo.h | 12 ++++++------ RuntimeInfo.h | 8 ++++---- SourceFile.h | 12 ++++++------ SourceLanguage.h | 4 ++-- 6 files changed, 23 insertions(+), 23 deletions(-) Index: llvm/include/llvm/Debugger/Debugger.h diff -u llvm/include/llvm/Debugger/Debugger.h:1.2 llvm/include/llvm/Debugger/Debugger.h:1.3 --- llvm/include/llvm/Debugger/Debugger.h:1.2 Mon Jan 5 23:31:57 2004 +++ llvm/include/llvm/Debugger/Debugger.h Thu Apr 21 15:39:38 2005 @@ -1,10 +1,10 @@ //===- Debugger.h - LLVM debugger library interface -------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the LLVM source-level debugger library interface. Index: llvm/include/llvm/Debugger/InferiorProcess.h diff -u llvm/include/llvm/Debugger/InferiorProcess.h:1.1 llvm/include/llvm/Debugger/InferiorProcess.h:1.2 --- llvm/include/llvm/Debugger/InferiorProcess.h:1.1 Sun Jan 4 23:23:38 2004 +++ llvm/include/llvm/Debugger/InferiorProcess.h Thu Apr 21 15:39:38 2005 @@ -1,10 +1,10 @@ //===- InferiorProcess.h - Represent the program being debugged -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the InferiorProcess class, which is used to represent, @@ -59,7 +59,7 @@ static InferiorProcess *create(Module *M, const std::vector &Arguments, const char * const *envp); - + // InferiorProcess destructor - Kill the current process. If something // terrible happens, we throw an exception from the destructor. virtual ~InferiorProcess() {} Index: llvm/include/llvm/Debugger/ProgramInfo.h diff -u llvm/include/llvm/Debugger/ProgramInfo.h:1.3 llvm/include/llvm/Debugger/ProgramInfo.h:1.4 --- llvm/include/llvm/Debugger/ProgramInfo.h:1.3 Mon Dec 13 11:01:53 2004 +++ llvm/include/llvm/Debugger/ProgramInfo.h Thu Apr 21 15:39:38 2005 @@ -1,10 +1,10 @@ //===- ProgramInfo.h - Information about the loaded program -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines various pieces of information about the currently loaded @@ -70,7 +70,7 @@ public: SourceFileInfo(const GlobalVariable *Desc, const SourceLanguage &Lang); ~SourceFileInfo(); - + const std::string &getBaseName() const { return BaseName; } const std::string &getDirectory() const { return Directory; } unsigned getDebugVersion() const { return Version; } @@ -149,7 +149,7 @@ /// with the program, through the getSourceFileFromDesc method. If ALL of /// the source files are needed, the getSourceFiles() method scans the /// entire program looking for them. - /// + /// std::multimap SourceFileIndex; /// SourceFunctions - This map contains entries functions in the source @@ -163,7 +163,7 @@ /// effectively a small map from the languages that are active in the /// program to their caches. This can be accessed by the language by the /// "getLanguageCache" method. - std::vector > LanguageCaches; public: ProgramInfo(Module *m); @@ -172,7 +172,7 @@ /// getProgramTimeStamp - Return the time-stamp of the program when it was /// loaded. sys::TimeValue getProgramTimeStamp() const { return ProgramTimeStamp; } - + //===------------------------------------------------------------------===// // Interfaces to the source code files that make up the program. // Index: llvm/include/llvm/Debugger/RuntimeInfo.h diff -u llvm/include/llvm/Debugger/RuntimeInfo.h:1.2 llvm/include/llvm/Debugger/RuntimeInfo.h:1.3 --- llvm/include/llvm/Debugger/RuntimeInfo.h:1.2 Sun Jan 4 23:45:04 2004 +++ llvm/include/llvm/Debugger/RuntimeInfo.h Thu Apr 21 15:39:38 2005 @@ -1,10 +1,10 @@ //===- RuntimeInfo.h - Information about running program --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines classes that capture various pieces of information about @@ -42,7 +42,7 @@ const SourceFileInfo *SourceInfo; public: StackFrame(RuntimeInfo &RI, void *ParentFrameID); - + StackFrame &operator=(const StackFrame &RHS) { FrameID = RHS.FrameID; FunctionDesc = RHS.FunctionDesc; @@ -80,7 +80,7 @@ /// CallStack - This caches information about the current stack trace of the /// program. This is lazily computed as needed. std::vector CallStack; - + /// CurrentFrame - The user can traverse the stack frame with the /// up/down/frame family of commands. This index indicates the current /// stack frame. Index: llvm/include/llvm/Debugger/SourceFile.h diff -u llvm/include/llvm/Debugger/SourceFile.h:1.2 llvm/include/llvm/Debugger/SourceFile.h:1.3 --- llvm/include/llvm/Debugger/SourceFile.h:1.2 Sun Dec 12 20:58:40 2004 +++ llvm/include/llvm/Debugger/SourceFile.h Thu Apr 21 15:39:38 2005 @@ -1,10 +1,10 @@ //===- SourceFile.h - Class to represent a source code file -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the SourceFile class which is used to represent a single @@ -60,11 +60,11 @@ /// getDescriptor - Return the debugging decriptor for this source file. /// const GlobalVariable *getDescriptor() const { return Descriptor; } - + /// getFilename - Return the fully resolved path that this file was loaded /// from. const std::string &getFilename() const { return Filename.toString(); } - + /// getSourceLine - Given a line number, return the start and end of the /// line in the file. If the line number is invalid, or if the file could /// not be loaded, null pointers are returned for the start and end of the @@ -72,7 +72,7 @@ /// any newlines from the end of the line, to ease formatting of the text. void getSourceLine(unsigned LineNo, const char *&LineStart, const char *&LineEnd) const; - + /// getNumLines - Return the number of lines the source file contains. /// unsigned getNumLines() const { @@ -84,7 +84,7 @@ /// readFile - Load Filename into memory /// void readFile(); - + /// calculateLineOffsets - Compute the LineOffset vector for the current /// file. void calculateLineOffsets() const; Index: llvm/include/llvm/Debugger/SourceLanguage.h diff -u llvm/include/llvm/Debugger/SourceLanguage.h:1.1 llvm/include/llvm/Debugger/SourceLanguage.h:1.2 --- llvm/include/llvm/Debugger/SourceLanguage.h:1.1 Sun Jan 4 23:23:38 2004 +++ llvm/include/llvm/Debugger/SourceLanguage.h Thu Apr 21 15:39:38 2005 @@ -1,10 +1,10 @@ //===- SourceLanguage.h - Interact with source languages --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the abstract SourceLanguage interface, which is used by the From brukman at cs.uiuc.edu Thu Apr 21 15:40:05 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:40:05 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/ExecutionEngine/ExecutionEngine.h GenericValue.h Message-ID: <200504212040.PAA01045@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ExecutionEngine: ExecutionEngine.h updated: 1.31 -> 1.32 GenericValue.h updated: 1.6 -> 1.7 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+6 -6) ExecutionEngine.h | 6 +++--- GenericValue.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/include/llvm/ExecutionEngine/ExecutionEngine.h diff -u llvm/include/llvm/ExecutionEngine/ExecutionEngine.h:1.31 llvm/include/llvm/ExecutionEngine/ExecutionEngine.h:1.32 --- llvm/include/llvm/ExecutionEngine/ExecutionEngine.h:1.31 Mon Dec 13 10:22:32 2004 +++ llvm/include/llvm/ExecutionEngine/ExecutionEngine.h Thu Apr 21 15:39:54 2005 @@ -1,10 +1,10 @@ //===- ExecutionEngine.h - Abstract Execution Engine Interface --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the abstract interface that implements execution support @@ -57,7 +57,7 @@ ExecutionEngine(ModuleProvider *P); ExecutionEngine(Module *M); virtual ~ExecutionEngine(); - + Module &getModule() const { return CurMod; } const TargetData &getTargetData() const { return *TD; } Index: llvm/include/llvm/ExecutionEngine/GenericValue.h diff -u llvm/include/llvm/ExecutionEngine/GenericValue.h:1.6 llvm/include/llvm/ExecutionEngine/GenericValue.h:1.7 --- llvm/include/llvm/ExecutionEngine/GenericValue.h:1.6 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/ExecutionEngine/GenericValue.h Thu Apr 21 15:39:54 2005 @@ -1,12 +1,12 @@ //===-- GenericValue.h - Represent any type of LLVM value -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// -// +// // The GenericValue class is used to represent an LLVM value of arbitrary type. // //===----------------------------------------------------------------------===// From brukman at cs.uiuc.edu Thu Apr 21 15:45:10 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:45:10 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/AIXDataTypesFix.h Annotation.h CFG.h CallSite.h Casting.h CommandLine.h Compressor.h ConstantRange.h DOTGraphTraits.h Debug.h DynamicLinker.h ELF.h FileUtilities.h GetElementPtrTypeIterator.h GraphWriter.h InstIterator.h InstVisitor.h LeakDetector.h Mangler.h MathExtras.h PassNameParser.h PatternMatch.h PluginLoader.h SlowOperationInformer.h StableBasicBlockNumbering.h SystemUtils.h ThreadSupport-NoSupport.h ThreadSupport-PThreads.h Timer.h ToolRunner.h TypeInfo.h type_traits.h Message-ID: <200504212045.PAA01198@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: AIXDataTypesFix.h updated: 1.2 -> 1.3 Annotation.h updated: 1.17 -> 1.18 CFG.h updated: 1.23 -> 1.24 CallSite.h updated: 1.17 -> 1.18 Casting.h updated: 1.13 -> 1.14 CommandLine.h updated: 1.41 -> 1.42 Compressor.h updated: 1.5 -> 1.6 ConstantRange.h updated: 1.8 -> 1.9 DOTGraphTraits.h updated: 1.12 -> 1.13 Debug.h updated: 1.5 -> 1.6 DynamicLinker.h updated: 1.4 -> 1.5 ELF.h updated: 1.5 -> 1.6 FileUtilities.h updated: 1.30 -> 1.31 GetElementPtrTypeIterator.h updated: 1.8 -> 1.9 GraphWriter.h updated: 1.22 -> 1.23 InstIterator.h updated: 1.10 -> 1.11 InstVisitor.h updated: 1.34 -> 1.35 LeakDetector.h updated: 1.5 -> 1.6 Mangler.h updated: 1.12 -> 1.13 MathExtras.h updated: 1.15 -> 1.16 PassNameParser.h updated: 1.10 -> 1.11 PatternMatch.h updated: 1.4 -> 1.5 PluginLoader.h updated: 1.2 -> 1.3 SlowOperationInformer.h updated: 1.4 -> 1.5 StableBasicBlockNumbering.h updated: 1.1 -> 1.2 SystemUtils.h updated: 1.20 -> 1.21 ThreadSupport-NoSupport.h updated: 1.2 -> 1.3 ThreadSupport-PThreads.h updated: 1.4 -> 1.5 Timer.h updated: 1.17 -> 1.18 ToolRunner.h updated: 1.18 -> 1.19 TypeInfo.h updated: 1.7 -> 1.8 type_traits.h updated: 1.2 -> 1.3 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+216 -216) AIXDataTypesFix.h | 4 +- Annotation.h | 12 ++++---- CFG.h | 64 ++++++++++++++++++++++---------------------- CallSite.h | 4 +- Casting.h | 14 ++++----- CommandLine.h | 46 +++++++++++++++---------------- Compressor.h | 42 ++++++++++++++-------------- ConstantRange.h | 16 +++++------ DOTGraphTraits.h | 4 +- Debug.h | 4 +- DynamicLinker.h | 6 ++-- ELF.h | 18 ++++++------ FileUtilities.h | 6 ++-- GetElementPtrTypeIterator.h | 14 ++++----- GraphWriter.h | 24 ++++++++-------- InstIterator.h | 38 +++++++++++++------------- InstVisitor.h | 4 +- LeakDetector.h | 6 ++-- Mangler.h | 6 ++-- MathExtras.h | 4 +- PassNameParser.h | 8 ++--- PatternMatch.h | 12 ++++---- PluginLoader.h | 4 +- SlowOperationInformer.h | 8 ++--- StableBasicBlockNumbering.h | 4 +- SystemUtils.h | 8 ++--- ThreadSupport-NoSupport.h | 4 +- ThreadSupport-PThreads.h | 6 ++-- Timer.h | 6 ++-- ToolRunner.h | 12 ++++---- TypeInfo.h | 10 +++--- type_traits.h | 14 ++++----- 32 files changed, 216 insertions(+), 216 deletions(-) Index: llvm/include/llvm/Support/AIXDataTypesFix.h diff -u llvm/include/llvm/Support/AIXDataTypesFix.h:1.2 llvm/include/llvm/Support/AIXDataTypesFix.h:1.3 --- llvm/include/llvm/Support/AIXDataTypesFix.h:1.2 Tue Oct 26 11:19:57 2004 +++ llvm/include/llvm/Support/AIXDataTypesFix.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/AIXDataTypesFix.h - Fix datatype defs ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file overrides default system-defined types and limits which cannot be Index: llvm/include/llvm/Support/Annotation.h diff -u llvm/include/llvm/Support/Annotation.h:1.17 llvm/include/llvm/Support/Annotation.h:1.18 --- llvm/include/llvm/Support/Annotation.h:1.17 Wed Oct 27 11:14:51 2004 +++ llvm/include/llvm/Support/Annotation.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/Annotation.h - Annotation classes ----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the declarations for two classes: Annotation & Annotable. @@ -81,7 +81,7 @@ //===----------------------------------------------------------------------===// // // Annotable - This class is used as a base class for all objects that would -// like to have annotation capability. One notable subclass is Value, which +// like to have annotation capability. One notable subclass is Value, which // means annotations can be attached to almost everything in LLVM. // // Annotable objects keep their annotation list sorted as annotations are @@ -157,13 +157,13 @@ // one-to-one mapping between string Annotation names and Annotation ID numbers. // // Compared to the rest of the Annotation system, these mapping methods are -// relatively slow, so they should be avoided by locally caching Annotation +// relatively slow, so they should be avoided by locally caching Annotation // ID #'s. These methods are safe to call at any time, even by static ctors, so // they should be used by static ctors most of the time. // // This class also provides support for annotations that are created on demand // by the Annotable::getOrCreateAnnotation method. To get this to work, simply -// register an annotation handler +// register an annotation handler // struct AnnotationManager { typedef Annotation *(*Factory)(AnnotationID, const Annotable *, void*); @@ -183,7 +183,7 @@ // Annotation creation on demand support... // registerAnnotationFactory - This method is used to register a callback - // function used to create an annotation on demand if it is needed by the + // function used to create an annotation on demand if it is needed by the // Annotable::getOrCreateAnnotation method. // static void registerAnnotationFactory(AnnotationID ID, Factory Func, Index: llvm/include/llvm/Support/CFG.h diff -u llvm/include/llvm/Support/CFG.h:1.23 llvm/include/llvm/Support/CFG.h:1.24 --- llvm/include/llvm/Support/CFG.h:1.23 Mon Jan 31 19:22:06 2005 +++ llvm/include/llvm/Support/CFG.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/CFG.h - Process LLVM structures as graphs --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines specializations of GraphTraits that allow Function and @@ -34,40 +34,40 @@ public: typedef PredIterator<_Ptr,_USE_iterator> _Self; typedef typename super::pointer pointer; - + inline void advancePastNonTerminators() { // Loop to ignore non terminator uses (for example PHI nodes)... while (It != BB->use_end() && !isa(*It)) ++It; } - + inline PredIterator(_Ptr *bb) : BB(bb), It(bb->use_begin()) { advancePastNonTerminators(); } inline PredIterator(_Ptr *bb, bool) : BB(bb), It(bb->use_end()) {} - + inline bool operator==(const _Self& x) const { return It == x.It; } inline bool operator!=(const _Self& x) const { return !operator==(x); } - - inline pointer operator*() const { + + inline pointer operator*() const { assert(It != BB->use_end() && "pred_iterator out of range!"); - return cast(*It)->getParent(); + return cast(*It)->getParent(); } inline pointer *operator->() const { return &(operator*()); } - + inline _Self& operator++() { // Preincrement assert(It != BB->use_end() && "pred_iterator out of range!"); ++It; advancePastNonTerminators(); - return *this; + return *this; } - + inline _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; + _Self tmp = *this; ++*this; return tmp; } }; typedef PredIterator pred_iterator; -typedef PredIterator pred_const_iterator; inline pred_iterator pred_begin(BasicBlock *BB) { return pred_iterator(BB); } @@ -94,7 +94,7 @@ typedef SuccIterator _Self; typedef typename super::pointer pointer; // TODO: This can be random access iterator, need operator+ and stuff tho - + inline SuccIterator(Term_ T) : Term(T), idx(0) { // begin iterator assert(T && "getTerminator returned null!"); } @@ -112,18 +112,18 @@ /// getSuccessorIndex - This is used to interface between code that wants to /// operate on terminator instructions directly. unsigned getSuccessorIndex() const { return idx; } - + inline bool operator==(const _Self& x) const { return idx == x.idx; } inline bool operator!=(const _Self& x) const { return !operator==(x); } - + inline pointer operator*() const { return Term->getSuccessor(idx); } inline pointer operator->() const { return operator*(); } - + inline _Self& operator++() { ++idx; return *this; } // Preincrement inline _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; + _Self tmp = *this; ++*this; return tmp; } - + inline _Self& operator--() { --idx; return *this; } // Predecrement inline _Self operator--(int) { // Postdecrement _Self tmp = *this; --*this; return tmp; @@ -153,7 +153,7 @@ // GraphTraits specializations for basic block graphs (CFGs) //===--------------------------------------------------------------------===// -// Provide specializations of GraphTraits to be able to treat a function as a +// Provide specializations of GraphTraits to be able to treat a function as a // graph of basic blocks... template <> struct GraphTraits { @@ -161,10 +161,10 @@ typedef succ_iterator ChildIteratorType; static NodeType *getEntryNode(BasicBlock *BB) { return BB; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return succ_begin(N); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return succ_end(N); } }; @@ -175,15 +175,15 @@ static NodeType *getEntryNode(const BasicBlock *BB) { return BB; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return succ_begin(N); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return succ_end(N); } }; -// Provide specializations of GraphTraits to be able to treat a function as a +// Provide specializations of GraphTraits to be able to treat a function as a // graph of basic blocks... and to walk it in inverse order. Inverse order for // a function is considered to be when traversing the predecessor edges of a BB // instead of the successor edges. @@ -192,10 +192,10 @@ typedef BasicBlock NodeType; typedef pred_iterator ChildIteratorType; static NodeType *getEntryNode(Inverse G) { return G.Graph; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return pred_begin(N); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return pred_end(N); } }; @@ -204,12 +204,12 @@ typedef const BasicBlock NodeType; typedef pred_const_iterator ChildIteratorType; static NodeType *getEntryNode(Inverse G) { - return G.Graph; + return G.Graph; } - static inline ChildIteratorType child_begin(NodeType *N) { + static inline ChildIteratorType child_begin(NodeType *N) { return pred_begin(N); } - static inline ChildIteratorType child_end(NodeType *N) { + static inline ChildIteratorType child_end(NodeType *N) { return pred_end(N); } }; @@ -220,7 +220,7 @@ // GraphTraits specializations for function basic block graphs (CFGs) //===--------------------------------------------------------------------===// -// Provide specializations of GraphTraits to be able to treat a function as a +// Provide specializations of GraphTraits to be able to treat a function as a // graph of basic blocks... these are the same as the basic block iterators, // except that the root node is implicitly the first node of the function. // @@ -243,7 +243,7 @@ }; -// Provide specializations of GraphTraits to be able to treat a function as a +// Provide specializations of GraphTraits to be able to treat a function as a // graph of basic blocks... and to walk it in inverse order. Inverse order for // a function is considered to be when traversing the predecessor edges of a BB // instead of the successor edges. Index: llvm/include/llvm/Support/CallSite.h diff -u llvm/include/llvm/Support/CallSite.h:1.17 llvm/include/llvm/Support/CallSite.h:1.18 --- llvm/include/llvm/Support/CallSite.h:1.17 Thu Nov 18 11:46:57 2004 +++ llvm/include/llvm/Support/CallSite.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/CallSite.h - Abstract Call & Invoke instrs -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the CallSite class, which is a handy wrapper for code that Index: llvm/include/llvm/Support/Casting.h diff -u llvm/include/llvm/Support/Casting.h:1.13 llvm/include/llvm/Support/Casting.h:1.14 --- llvm/include/llvm/Support/Casting.h:1.13 Wed Sep 1 17:55:34 2004 +++ llvm/include/llvm/Support/Casting.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/Casting.h - Allow flexible, checked, casts -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the isa(), cast(), dyn_cast(), cast_or_null(), @@ -48,7 +48,7 @@ // if (isa(myVal)) { ... } // template -inline bool isa_impl(const From &Val) { +inline bool isa_impl(const From &Val) { return To::classof(&Val); } @@ -57,7 +57,7 @@ // When From != SimplifiedType, we can simplify the type some more by using // the simplify_type template. static bool doit(const From &Val) { - return isa_impl_cl::template + return isa_impl_cl::template isa(simplify_type::getSimplifiedValue(Val)); } }; @@ -159,7 +159,7 @@ template struct cast_retty { - typedef typename cast_retty_wrap::SimpleType>::ret_type ret_type; }; @@ -248,7 +248,7 @@ }*/ }; -template <> inline bool isa_impl(const bar &Val) { +template <> inline bool isa_impl(const bar &Val) { cerr << "Classof: " << &Val << "\n"; return true; } @@ -279,7 +279,7 @@ const foo *F12 = cast_or_null(B2); const foo *F13 = cast_or_null(B4); const foo *F14 = cast_or_null(fub()); // Shouldn't print. - + // These lines are errors... //foo *F20 = cast(B2); // Yields const foo* //foo &F21 = cast(B3); // Yields const foo& Index: llvm/include/llvm/Support/CommandLine.h diff -u llvm/include/llvm/Support/CommandLine.h:1.41 llvm/include/llvm/Support/CommandLine.h:1.42 --- llvm/include/llvm/Support/CommandLine.h:1.41 Mon Dec 13 10:28:53 2004 +++ llvm/include/llvm/Support/CommandLine.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/CommandLine.h - Command line handler --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This class implements a command line argument processor that is useful when @@ -126,14 +126,14 @@ // an argument. Should return true if there was an error processing the // argument and the program should exit. // - virtual bool handleOccurrence(unsigned pos, const char *ArgName, + virtual bool handleOccurrence(unsigned pos, const char *ArgName, const std::string &Arg) = 0; - virtual enum NumOccurrences getNumOccurrencesFlagDefault() const { + virtual enum NumOccurrences getNumOccurrencesFlagDefault() const { return Optional; } virtual enum ValueExpected getValueExpectedFlagDefault() const { - return ValueOptional; + return ValueOptional; } virtual enum OptionHidden getOptionHiddenFlagDefault() const { return NotHidden; @@ -216,14 +216,14 @@ // Return the width of the option tag for printing... virtual unsigned getOptionWidth() const = 0; - // printOptionInfo - Print out information about this option. The + // printOptionInfo - Print out information about this option. The // to-be-maintained width is specified. // virtual void printOptionInfo(unsigned GlobalWidth) const = 0; // addOccurrence - Wrapper around handleOccurrence that enforces Flags // - bool addOccurrence(unsigned pos, const char *ArgName, + bool addOccurrence(unsigned pos, const char *ArgName, const std::string &Value); // Prints option name followed by message. Always returns true. @@ -311,7 +311,7 @@ std::vector > > Values; void processValues(va_list Vals); public: - ValuesClass(const char *EnumName, DataType Val, const char *Desc, + ValuesClass(const char *EnumName, DataType Val, const char *Desc, va_list ValueArgs) { // Insert the first value, which is required. Values.push_back(std::make_pair(EnumName, std::make_pair(Val, Desc))); @@ -366,14 +366,14 @@ // getOption - Return option name N. virtual const char *getOption(unsigned N) const = 0; - + // getDescription - Return description N virtual const char *getDescription(unsigned N) const = 0; // Return the width of the option tag for printing... virtual unsigned getOptionWidth(const Option &O) const; - // printOptionInfo - Print out information about this option. The + // printOptionInfo - Print out information about this option. The // to-be-maintained width is specified. // virtual void printOptionInfo(const Option &O, unsigned GlobalWidth) const; @@ -442,7 +442,7 @@ } // parse - Return true on error. - bool parse(Option &O, const char *ArgName, const std::string &Arg, + bool parse(Option &O, const char *ArgName, const std::string &Arg, DataType &V) { std::string ArgVal; if (hasArgStr) @@ -485,12 +485,12 @@ enum ValueExpected getValueExpectedFlagDefault() const { return ValueRequired; } - + void initialize(Option &O) {} - + // Return the width of the option tag for printing... unsigned getOptionWidth(const Option &O) const; - + // printOptionInfo - Print out information about this option. The // to-be-maintained width is specified. // @@ -519,7 +519,7 @@ bool parse(Option &O, const char *ArgName, const std::string &Arg, bool &Val); enum ValueExpected getValueExpectedFlagDefault() const { - return ValueOptional; + return ValueOptional; } // getValueName - Do not print = at all @@ -590,7 +590,7 @@ class parser : public basic_parser { public: // parse - Return true on error. - bool parse(Option &O, const char *AN, const std::string &Arg, + bool parse(Option &O, const char *AN, const std::string &Arg, std::string &Value) { Value = Arg; return false; @@ -727,12 +727,12 @@ // template > -class opt : public Option, +class opt : public Option, public opt_storage::value> { ParserClass Parser; - virtual bool handleOccurrence(unsigned pos, const char *ArgName, + virtual bool handleOccurrence(unsigned pos, const char *ArgName, const std::string &Arg) { typename ParserClass::parser_data_type Val; if (Parser.parse(*this, ArgName, Arg, Val)) @@ -884,14 +884,14 @@ std::vector Positions; ParserClass Parser; - virtual enum NumOccurrences getNumOccurrencesFlagDefault() const { + virtual enum NumOccurrences getNumOccurrencesFlagDefault() const { return ZeroOrMore; } virtual enum ValueExpected getValueExpectedFlagDefault() const { return Parser.getValueExpectedFlagDefault(); } - virtual bool handleOccurrence(unsigned pos, const char *ArgName, + virtual bool handleOccurrence(unsigned pos, const char *ArgName, const std::string &Arg) { typename ParserClass::parser_data_type Val; if (Parser.parse(*this, ArgName, Arg, Val)) @@ -915,9 +915,9 @@ public: ParserClass &getParser() { return Parser; } - unsigned getPosition(unsigned optnum) const { + unsigned getPosition(unsigned optnum) const { assert(optnum < this->size() && "Invalid option index"); - return Positions[optnum]; + return Positions[optnum]; } // One option... @@ -987,7 +987,7 @@ class alias : public Option { Option *AliasFor; - virtual bool handleOccurrence(unsigned pos, const char *ArgName, + virtual bool handleOccurrence(unsigned pos, const char *ArgName, const std::string &Arg) { return AliasFor->handleOccurrence(pos, AliasFor->ArgStr, Arg); } Index: llvm/include/llvm/Support/Compressor.h diff -u llvm/include/llvm/Support/Compressor.h:1.5 llvm/include/llvm/Support/Compressor.h:1.6 --- llvm/include/llvm/Support/Compressor.h:1.5 Sat Jan 29 11:16:07 2005 +++ llvm/include/llvm/Support/Compressor.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/Compressor.h --------------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file declares the llvm::Compressor class. @@ -23,15 +23,15 @@ /// a block of memory. The algorithm used here is currently bzip2 but that /// may change without notice. Should newer algorithms prove to compress /// bytecode better than bzip2, that newer algorithm will be added, but won't - /// replace bzip2. This interface allows us to abstract the notion of - /// compression and deal with alternate compression schemes over time. - /// The type of compression used can be determined by inspecting the - /// first byte of the compressed output. Currently value '0' means no + /// replace bzip2. This interface allows us to abstract the notion of + /// compression and deal with alternate compression schemes over time. + /// The type of compression used can be determined by inspecting the + /// first byte of the compressed output. Currently value '0' means no /// compression was used (for very small files) and value '2' means bzip2 - /// compression was used. The Compressor is intended for use with memory + /// compression was used. The Compressor is intended for use with memory /// mapped files where the entire data block to be compressed or decompressed /// is available in memory. However, output can be gathered in repeated calls - /// to a callback. Utilities for sending compressed or decompressed output + /// to a callback. Utilities for sending compressed or decompressed output /// to a stream or directly to a memory block are also provided. /// @since 1.4 /// @brief An abstraction for memory to memory data (de)compression @@ -39,8 +39,8 @@ /// @name High Level Interface /// @{ public: - /// This method compresses a block of memory pointed to by \p in with - /// size \p size to a block of memory, \p out, that is allocated with + /// This method compresses a block of memory pointed to by \p in with + /// size \p size to a block of memory, \p out, that is allocated with /// malloc. It is the caller's responsibility to free \p out. The \p hint /// indicates which type of compression the caller would *prefer*. /// @throws std::string explaining error if a compression error occurs @@ -52,10 +52,10 @@ char*&out ///< The returned output buffer ); - /// This method compresses a block of memory pointed to by \p in with + /// This method compresses a block of memory pointed to by \p in with /// size \p size to a stream. The stream \p out must be open and ready for /// writing when this method is called. The stream will not be closed by - /// this method. The \p hint argument indicates which type of + /// this method. The \p hint argument indicates which type of /// compression the caller would *prefer*. /// @returns The amount of data written to \p out. /// @brief Compress memory to a file. @@ -65,9 +65,9 @@ std::ostream& out ///< The output stream to write data on ); - /// This method decompresses a block of memory pointed to by \p in with + /// This method decompresses a block of memory pointed to by \p in with /// size \p size to a new block of memory, \p out, \p that was allocated - /// by malloc. It is the caller's responsibility to free \p out. + /// by malloc. It is the caller's responsibility to free \p out. /// @returns The size of the output buffer \p out. /// @brief Decompress memory to a new memory buffer. static size_t decompressToNewBuffer( @@ -76,10 +76,10 @@ char*&out ///< The returned output buffer ); - /// This method decompresses a block of memory pointed to by \p in with + /// This method decompresses a block of memory pointed to by \p in with /// size \p size to a stream. The stream \p out must be open and ready for /// writing when this method is called. The stream will not be closed by - /// this method. + /// this method. /// @returns The amount of data written to \p out. /// @brief Decompress memory to a stream. static size_t decompressToStream( @@ -93,10 +93,10 @@ /// @{ public: /// A callback function type used by the Compressor's low level interface - /// to get the next chunk of data to which (de)compressed output will be - /// written. This callback completely abstracts the notion of how to + /// to get the next chunk of data to which (de)compressed output will be + /// written. This callback completely abstracts the notion of how to /// handle the output data of compression or decompression. The callback - /// is responsible for determining both the storage location and the size + /// is responsible for determining both the storage location and the size /// of the output. The callback may also do other things with the data /// such as write it, transmit it, etc. Note that providing very small /// values for \p size will make the compression run very inefficiently. @@ -138,7 +138,7 @@ /// Note that the callback function will be called as many times as /// necessary to complete the compression of the \p in block but that the /// total size will generally be greater than \p size. It is a good idea - /// to provide as large a value to the callback's \p size parameter as + /// to provide as large a value to the callback's \p size parameter as /// possible so that fewer calls to the callback are made. /// @throws std::string if an error occurs /// @returns the total size of the decompressed data Index: llvm/include/llvm/Support/ConstantRange.h diff -u llvm/include/llvm/Support/ConstantRange.h:1.8 llvm/include/llvm/Support/ConstantRange.h:1.9 --- llvm/include/llvm/Support/ConstantRange.h:1.8 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/ConstantRange.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/ConstantRange.h - Represent a range --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Represent a range of possible values that may occur when the program is run @@ -39,7 +39,7 @@ /// Initialize a full (the default) or empty set for the specified type. /// ConstantRange(const Type *Ty, bool isFullSet = true); - + /// Initialize a range to hold the single specified value. /// ConstantRange(Constant *Value); @@ -49,7 +49,7 @@ /// have different types, or if the constant are not integral values. /// ConstantRange(Constant *Lower, Constant *Upper); - + /// Initialize a set of values that all satisfy the condition with C. /// ConstantRange(unsigned SetCCOpcode, ConstantIntegral *C); @@ -65,12 +65,12 @@ /// getType - Return the LLVM data type of this range. /// const Type *getType() const; - + /// isFullSet - Return true if this set contains all of the elements possible /// for this data-type /// bool isFullSet() const; - + /// isEmptySet - Return true if this set contains no members. /// bool isEmptySet() const; @@ -83,12 +83,12 @@ /// contains - Return true if the specified value is in the set. /// bool contains(ConstantInt *Val) const; - + /// getSingleElement - If this set contains a single element, return it, /// otherwise return null. /// ConstantIntegral *getSingleElement() const; - + /// isSingleElement - Return true if this set contains exactly one member. /// bool isSingleElement() const { return getSingleElement() != 0; } Index: llvm/include/llvm/Support/DOTGraphTraits.h diff -u llvm/include/llvm/Support/DOTGraphTraits.h:1.12 llvm/include/llvm/Support/DOTGraphTraits.h:1.13 --- llvm/include/llvm/Support/DOTGraphTraits.h:1.12 Mon Jan 10 18:24:59 2005 +++ llvm/include/llvm/Support/DOTGraphTraits.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/DotGraphTraits.h - Customize .dot output ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a template class that can be used to customize dot output Index: llvm/include/llvm/Support/Debug.h diff -u llvm/include/llvm/Support/Debug.h:1.5 llvm/include/llvm/Support/Debug.h:1.6 --- llvm/include/llvm/Support/Debug.h:1.5 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/Debug.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/Debug.h - Easy way to add debug output ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements a handle way of adding debugging information to your Index: llvm/include/llvm/Support/DynamicLinker.h diff -u llvm/include/llvm/Support/DynamicLinker.h:1.4 llvm/include/llvm/Support/DynamicLinker.h:1.5 --- llvm/include/llvm/Support/DynamicLinker.h:1.4 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/DynamicLinker.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/DynamicLinker.h - Portable Dynamic Linker --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Lightweight interface to dynamic library linking and loading, and dynamic @@ -31,7 +31,7 @@ /// the currently running process, as reported by the dynamic linker, /// or NULL if the symbol does not exist or some other error has /// occurred. -/// +/// void *GetAddressOfSymbol (const char *symbolName); void *GetAddressOfSymbol (const std::string &symbolName); Index: llvm/include/llvm/Support/ELF.h diff -u llvm/include/llvm/Support/ELF.h:1.5 llvm/include/llvm/Support/ELF.h:1.6 --- llvm/include/llvm/Support/ELF.h:1.5 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/ELF.h Thu Apr 21 15:44:59 2005 @@ -1,15 +1,15 @@ //===-- llvm/Support/ELF.h - ELF constants and data structures --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header contains common, non-processor-specific data structures and // constants for the ELF file format. -// +// // The details of the ELF32 bits in this file are largely based on // the Tool Interface Standard (TIS) Executable and Linking Format // (ELF) Specification Version 1.2, May 1995. The ELF64 stuff is not @@ -137,7 +137,7 @@ Elf32_Addr sh_addr; // Address where section is to be loaded Elf32_Off sh_offset; // File offset of section data, in bytes Elf32_Word sh_size; // Size of section, in bytes - Elf32_Word sh_link; // Section type-specific header table index link + Elf32_Word sh_link; // Section type-specific header table index link Elf32_Word sh_info; // Section type-specific extra information Elf32_Word sh_addralign; // Section address alignment Elf32_Word sh_entsize; // Size of records contained within the section @@ -204,7 +204,7 @@ unsigned char st_info; // Symbol's type and binding attributes unsigned char st_other; // Must be zero; reserved Elf32_Half st_shndx; // Which section (header table index) it's defined in - + // These accessors and mutators correspond to the ELF32_ST_BIND, // ELF32_ST_TYPE, and ELF32_ST_INFO macros defined in the ELF specification: unsigned char getBinding () const { return st_info >> 4; } @@ -238,9 +238,9 @@ // Relocation entry, without explicit addend. struct Elf32_Rel { - Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) + Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) Elf32_Word r_info; // Symbol table index and type of relocation to apply - + // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE, // and ELF32_R_INFO macros defined in the ELF specification: Elf32_Word getSymbol () const { return (r_info >> 8); } @@ -254,10 +254,10 @@ // Relocation entry with explicit addend. struct Elf32_Rela { - Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) + Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) Elf32_Word r_info; // Symbol table index and type of relocation to apply Elf32_Sword r_addend; // Compute value for relocatable field by adding this - + // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE, // and ELF32_R_INFO macros defined in the ELF specification: Elf32_Word getSymbol () const { return (r_info >> 8); } Index: llvm/include/llvm/Support/FileUtilities.h diff -u llvm/include/llvm/Support/FileUtilities.h:1.30 llvm/include/llvm/Support/FileUtilities.h:1.31 --- llvm/include/llvm/Support/FileUtilities.h:1.30 Sat Jan 22 21:30:39 2005 +++ llvm/include/llvm/Support/FileUtilities.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/FileUtilities.h - File System Utilities -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a family of utility functions which are useful for doing @@ -41,7 +41,7 @@ public: FileRemover(const sys::Path &filename, bool deleteIt = true) : Filename(filename), DeleteIt(deleteIt) {} - + ~FileRemover() { if (DeleteIt) try { Index: llvm/include/llvm/Support/GetElementPtrTypeIterator.h diff -u llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.8 llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.9 --- llvm/include/llvm/Support/GetElementPtrTypeIterator.h:1.8 Thu Jan 13 17:26:28 2005 +++ llvm/include/llvm/Support/GetElementPtrTypeIterator.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/GetElementPtrTypeIterator.h -----------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements an iterator for walking through the types indexed by @@ -42,14 +42,14 @@ return I; } - bool operator==(const generic_gep_type_iterator& x) const { + bool operator==(const generic_gep_type_iterator& x) const { return OpIt == x.OpIt; } bool operator!=(const generic_gep_type_iterator& x) const { return !operator==(x); } - const Type *operator*() const { + const Type *operator*() const { return CurTy; } @@ -61,7 +61,7 @@ // This is a non-standard operator->. It allows you to call methods on the // current type directly. const Type *operator->() const { return operator*(); } - + Value *getOperand() const { return *OpIt; } generic_gep_type_iterator& operator++() { // Preincrement @@ -71,11 +71,11 @@ CurTy = 0; } ++OpIt; - return *this; + return *this; } generic_gep_type_iterator operator++(int) { // Postincrement - generic_gep_type_iterator tmp = *this; ++*this; return tmp; + generic_gep_type_iterator tmp = *this; ++*this; return tmp; } }; Index: llvm/include/llvm/Support/GraphWriter.h diff -u llvm/include/llvm/Support/GraphWriter.h:1.22 llvm/include/llvm/Support/GraphWriter.h:1.23 --- llvm/include/llvm/Support/GraphWriter.h:1.22 Mon Jan 10 18:24:59 2005 +++ llvm/include/llvm/Support/GraphWriter.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/GraphWriter.h - Write graph to a .dot file -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a simple interface that can be used to print out generic @@ -99,33 +99,33 @@ I != E; ++I) writeNode(&*I); } - + void writeNode(NodeType *const *Node) { writeNode(*Node); } - + void writeNode(NodeType *Node) { std::string NodeAttributes = DOTTraits::getNodeAttributes(Node); - + O << "\tNode" << reinterpret_cast(Node) << " [shape=record,"; if (!NodeAttributes.empty()) O << NodeAttributes << ","; O << "label=\"{"; if (!DOTTraits::renderGraphFromBottomUp()) O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G)); - + // Print out the fields of the current node... child_iterator EI = GTraits::child_begin(Node); child_iterator EE = GTraits::child_end(Node); if (EI != EE) { if (!DOTTraits::renderGraphFromBottomUp()) O << "|"; O << "{"; - + for (unsigned i = 0; EI != EE && i != 64; ++EI, ++i) { if (i) O << "|"; O << "" << DOTTraits::getEdgeSourceLabel(Node, EI); } - + if (EI != EE) O << "|truncated..."; O << "}"; @@ -133,9 +133,9 @@ } if (DOTTraits::renderGraphFromBottomUp()) O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G)); - + O << "}\"];\n"; // Finish printing the "node" line - + // Output all of the edges now EI = GTraits::child_begin(Node); for (unsigned i = 0; EI != EE && i != 64; ++EI, ++i) @@ -174,7 +174,7 @@ O << DOT::EscapeString(Label); if (NumEdgeSources) { O << "|{"; - + for (unsigned i = 0; i != NumEdgeSources; ++i) { if (i) O << "|"; O << ""; @@ -197,7 +197,7 @@ O << ":g" << SrcNodePort; O << " -> Node" << reinterpret_cast(DestNodeID); if (DestNodePort >= 0) - O << ":g" << DestNodePort; + O << ":g" << DestNodePort; if (!Attrs.empty()) O << "[" << Attrs << "]"; Index: llvm/include/llvm/Support/InstIterator.h diff -u llvm/include/llvm/Support/InstIterator.h:1.10 llvm/include/llvm/Support/InstIterator.h:1.11 --- llvm/include/llvm/Support/InstIterator.h:1.10 Tue Apr 27 10:11:58 2004 +++ llvm/include/llvm/Support/InstIterator.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/InstIterator.h - Classes for inst iteration -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains definitions of two iterators for iterating over the @@ -54,8 +54,8 @@ template InstIterator(InstIterator &II) : BBs(II.BBs), BB(II.BB), BI(II.BI) {} - - template InstIterator(M &m) + + template InstIterator(M &m) : BBs(&m.getBasicBlockList()), BB(BBs->begin()) { // begin ctor if (BB != BBs->end()) { BI = BB->begin(); @@ -63,43 +63,43 @@ } } - template InstIterator(M &m, bool) + template InstIterator(M &m, bool) : BBs(&m.getBasicBlockList()), BB(BBs->end()) { // end ctor } // Accessors to get at the underlying iterators... inline BBIty &getBasicBlockIterator() { return BB; } inline BIty &getInstructionIterator() { return BI; } - + inline reference operator*() const { return *BI; } inline pointer operator->() const { return &operator*(); } - - inline bool operator==(const InstIterator &y) const { + + inline bool operator==(const InstIterator &y) const { return BB == y.BB && (BB == BBs->end() || BI == y.BI); } - inline bool operator!=(const InstIterator& y) const { + inline bool operator!=(const InstIterator& y) const { return !operator==(y); } - InstIterator& operator++() { + InstIterator& operator++() { ++BI; advanceToNextBB(); - return *this; + return *this; } - inline InstIterator operator++(int) { - InstIterator tmp = *this; ++*this; return tmp; + inline InstIterator operator++(int) { + InstIterator tmp = *this; ++*this; return tmp; } - - InstIterator& operator--() { + + InstIterator& operator--() { while (BB == BBs->end() || BI == BB->begin()) { --BB; BI = BB->end(); } --BI; - return *this; + return *this; } - inline InstIterator operator--(int) { - InstIterator tmp = *this; --*this; return tmp; + inline InstIterator operator--(int) { + InstIterator tmp = *this; --*this; return tmp; } inline bool atEnd() const { return BB == BBs->end(); } @@ -121,7 +121,7 @@ Function::iterator, BasicBlock::iterator, Instruction> inst_iterator; typedef InstIterator, - Function::const_iterator, + Function::const_iterator, BasicBlock::const_iterator, const Instruction> const_inst_iterator; Index: llvm/include/llvm/Support/InstVisitor.h diff -u llvm/include/llvm/Support/InstVisitor.h:1.34 llvm/include/llvm/Support/InstVisitor.h:1.35 --- llvm/include/llvm/Support/InstVisitor.h:1.34 Tue Mar 8 23:35:16 2005 +++ llvm/include/llvm/Support/InstVisitor.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/InstVisitor.h - Define instruction visitors -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This template class is used to define instruction visitors in a typesafe Index: llvm/include/llvm/Support/LeakDetector.h diff -u llvm/include/llvm/Support/LeakDetector.h:1.5 llvm/include/llvm/Support/LeakDetector.h:1.6 --- llvm/include/llvm/Support/LeakDetector.h:1.5 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/LeakDetector.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/LeakDetector.h - Provide leak detection ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a class that can be used to provide very simple memory leak @@ -48,7 +48,7 @@ removeGarbageObjectImpl(Object); #endif } - + /// checkForGarbage - Traverse the internal representation of garbage /// pointers. If there are any pointers that have been add'ed, but not /// remove'd, big obnoxious warnings about memory leaks are issued. Index: llvm/include/llvm/Support/Mangler.h diff -u llvm/include/llvm/Support/Mangler.h:1.12 llvm/include/llvm/Support/Mangler.h:1.13 --- llvm/include/llvm/Support/Mangler.h:1.12 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/Mangler.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/Mangler.h - Self-contained name mangler ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Unified name mangler for various backends. @@ -63,7 +63,7 @@ /// doesn't guarantee unique names for values. getValueName already /// does this for you, so there's no point calling it on the result /// from getValueName. - /// + /// static std::string makeNameProper(const std::string &x); }; Index: llvm/include/llvm/Support/MathExtras.h diff -u llvm/include/llvm/Support/MathExtras.h:1.15 llvm/include/llvm/Support/MathExtras.h:1.16 --- llvm/include/llvm/Support/MathExtras.h:1.15 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/MathExtras.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/MathExtras.h - Useful math functions -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains some functions that are useful for math stuff. Index: llvm/include/llvm/Support/PassNameParser.h diff -u llvm/include/llvm/Support/PassNameParser.h:1.10 llvm/include/llvm/Support/PassNameParser.h:1.11 --- llvm/include/llvm/Support/PassNameParser.h:1.10 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/PassNameParser.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/PassNameParser.h ----------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file the PassNameParser and FilteredPassNameParser<> classes, which are @@ -34,12 +34,12 @@ // PassNameParser class - Make use of the pass registration mechanism to // automatically add a command line argument to opt for each pass. // -class PassNameParser : public PassRegistrationListener, +class PassNameParser : public PassRegistrationListener, public cl::parser { cl::Option *Opt; public: PassNameParser() : Opt(0) {} - + void initialize(cl::Option &O) { Opt = &O; cl::parser::initialize(O); Index: llvm/include/llvm/Support/PatternMatch.h diff -u llvm/include/llvm/Support/PatternMatch.h:1.4 llvm/include/llvm/Support/PatternMatch.h:1.5 --- llvm/include/llvm/Support/PatternMatch.h:1.4 Sat Nov 13 13:32:45 2004 +++ llvm/include/llvm/Support/PatternMatch.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/PatternMatch.h - Match on the LLVM IR ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides a simple and efficient mechanism for performing general @@ -33,7 +33,7 @@ #include "llvm/Instructions.h" namespace llvm { -namespace PatternMatch { +namespace PatternMatch { template bool match(Val *V, const Pattern &P) { @@ -88,7 +88,7 @@ R.match(CE->getOperand(1)); return false; } -}; +}; template inline BinaryOp_match m_Add(const LHS &L, @@ -178,7 +178,7 @@ #endif return false; } -}; +}; template inline BinaryOpClass_match @@ -216,7 +216,7 @@ else return LHS == ConstantFP::get(LHS->getType(), -0.0) && L.match(RHS); } -}; +}; template inline neg_match m_Neg(const LHS &L) { return L; } Index: llvm/include/llvm/Support/PluginLoader.h diff -u llvm/include/llvm/Support/PluginLoader.h:1.2 llvm/include/llvm/Support/PluginLoader.h:1.3 --- llvm/include/llvm/Support/PluginLoader.h:1.2 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/PluginLoader.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/PluginLoader.h - Plugin Loader for Tools ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // A tool can #include this file to get a -load option that allows the user to Index: llvm/include/llvm/Support/SlowOperationInformer.h diff -u llvm/include/llvm/Support/SlowOperationInformer.h:1.4 llvm/include/llvm/Support/SlowOperationInformer.h:1.5 --- llvm/include/llvm/Support/SlowOperationInformer.h:1.4 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/SlowOperationInformer.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/SlowOperationInformer.h - Keep user informed *- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a simple object which can be used to let the user know what @@ -38,13 +38,13 @@ class SlowOperationInformer { std::string OperationName; unsigned LastPrintAmount; - + SlowOperationInformer(const SlowOperationInformer&); // DO NOT IMPLEMENT void operator=(const SlowOperationInformer&); // DO NOT IMPLEMENT public: SlowOperationInformer(const std::string &Name); ~SlowOperationInformer(); - + /// progress - Clients should periodically call this method when they are in /// an exception-safe state. The Amount variable should indicate how far /// along the operation is, given in 1/10ths of a percent (in other words, Index: llvm/include/llvm/Support/StableBasicBlockNumbering.h diff -u llvm/include/llvm/Support/StableBasicBlockNumbering.h:1.1 llvm/include/llvm/Support/StableBasicBlockNumbering.h:1.2 --- llvm/include/llvm/Support/StableBasicBlockNumbering.h:1.1 Sat Jun 19 03:41:59 2004 +++ llvm/include/llvm/Support/StableBasicBlockNumbering.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- StableBasicBlockNumbering.h - Provide BB identifiers -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This class provides a *stable* numbering of basic blocks that does not depend Index: llvm/include/llvm/Support/SystemUtils.h diff -u llvm/include/llvm/Support/SystemUtils.h:1.20 llvm/include/llvm/Support/SystemUtils.h:1.21 --- llvm/include/llvm/Support/SystemUtils.h:1.20 Sun Feb 13 17:14:06 2005 +++ llvm/include/llvm/Support/SystemUtils.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- SystemUtils.h - Utilities to do low-level system stuff ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains functions used to do a variety of low-level, often @@ -19,8 +19,8 @@ namespace llvm { -/// Determine if the ostream provided is connected to the std::cout and -/// displayed or not (to a console window). If so, generate a warning message +/// Determine if the ostream provided is connected to the std::cout and +/// displayed or not (to a console window). If so, generate a warning message /// advising against display of bytecode and return true. Otherwise just return /// false /// @brief Check for output written to a console Index: llvm/include/llvm/Support/ThreadSupport-NoSupport.h diff -u llvm/include/llvm/Support/ThreadSupport-NoSupport.h:1.2 llvm/include/llvm/Support/ThreadSupport-NoSupport.h:1.3 --- llvm/include/llvm/Support/ThreadSupport-NoSupport.h:1.2 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/ThreadSupport-NoSupport.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/ThreadSupport-NoSupport.h - Generic Impl ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a generic ThreadSupport implementation used when there is Index: llvm/include/llvm/Support/ThreadSupport-PThreads.h diff -u llvm/include/llvm/Support/ThreadSupport-PThreads.h:1.4 llvm/include/llvm/Support/ThreadSupport-PThreads.h:1.5 --- llvm/include/llvm/Support/ThreadSupport-PThreads.h:1.4 Sun Feb 27 13:07:36 2005 +++ llvm/include/llvm/Support/ThreadSupport-PThreads.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/ThreadSupport-PThreads.h - PThreads support *- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines pthreads implementations of the generic threading @@ -39,7 +39,7 @@ errorcode = pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE); assert(errorcode == 0); - + errorcode = pthread_mutex_init(&mutex, &Attr); assert(errorcode == 0); Index: llvm/include/llvm/Support/Timer.h diff -u llvm/include/llvm/Support/Timer.h:1.17 llvm/include/llvm/Support/Timer.h:1.18 --- llvm/include/llvm/Support/Timer.h:1.17 Sat Jan 29 00:29:45 2005 +++ llvm/include/llvm/Support/Timer.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/Timer.h - Interval Timing Support ----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines three classes: Timer, TimeRegion, and TimerGroup, @@ -74,7 +74,7 @@ return Elapsed < T.Elapsed; } bool operator>(const Timer &T) const { return T.operator<(*this); } - + /// startTimer - Start the timer running. Time between calls to /// startTimer/stopTimer is counted by the Timer class. Note that these calls /// must be correctly paired. Index: llvm/include/llvm/Support/ToolRunner.h diff -u llvm/include/llvm/Support/ToolRunner.h:1.18 llvm/include/llvm/Support/ToolRunner.h:1.19 --- llvm/include/llvm/Support/ToolRunner.h:1.18 Sat Jan 22 10:30:16 2005 +++ llvm/include/llvm/Support/ToolRunner.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===-- llvm/Support/ToolRunner.h -------------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file exposes an abstraction around a platform C compiler, used to @@ -63,7 +63,7 @@ FileType fileType, const std::string &InputFile, const std::string &OutputFile, - const std::vector &SharedLibs = + const std::vector &SharedLibs = std::vector(), unsigned Timeout = 0); /// MakeSharedObject - This compiles the specified file (which is either a .c @@ -110,7 +110,7 @@ const std::vector &Args, const std::string &InputFile, const std::string &OutputFile, - const std::vector &SharedLibs = + const std::vector &SharedLibs = std::vector(), unsigned Timeout = 0) = 0; }; @@ -140,7 +140,7 @@ const std::vector &Args, const std::string &InputFile, const std::string &OutputFile, - const std::vector &SharedLibs = + const std::vector &SharedLibs = std::vector(), unsigned Timeout = 0); @@ -177,7 +177,7 @@ const std::vector &Args, const std::string &InputFile, const std::string &OutputFile, - const std::vector &SharedLibs = + const std::vector &SharedLibs = std::vector(), unsigned Timeout = 0); Index: llvm/include/llvm/Support/TypeInfo.h diff -u llvm/include/llvm/Support/TypeInfo.h:1.7 llvm/include/llvm/Support/TypeInfo.h:1.8 --- llvm/include/llvm/Support/TypeInfo.h:1.7 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/TypeInfo.h Thu Apr 21 15:44:59 2005 @@ -1,10 +1,10 @@ //===- llvm/Support/TypeInfo.h - Support for type_info objects -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This class makes std::type_info objects behave like first class objects that @@ -45,7 +45,7 @@ private: const std::type_info *Info; }; - + // Comparison operators inline bool operator==(const TypeInfo &lhs, const TypeInfo &rhs) { return lhs.get() == rhs.get(); @@ -62,11 +62,11 @@ inline bool operator>(const TypeInfo &lhs, const TypeInfo &rhs) { return rhs < lhs; } - + inline bool operator<=(const TypeInfo &lhs, const TypeInfo &rhs) { return !(lhs > rhs); } - + inline bool operator>=(const TypeInfo &lhs, const TypeInfo &rhs) { return !(lhs < rhs); } Index: llvm/include/llvm/Support/type_traits.h diff -u llvm/include/llvm/Support/type_traits.h:1.2 llvm/include/llvm/Support/type_traits.h:1.3 --- llvm/include/llvm/Support/type_traits.h:1.2 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Support/type_traits.h Thu Apr 21 15:44:59 2005 @@ -1,16 +1,16 @@ //===- llvm/Support/type_traits.h - Simplfied type traits -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides a template class that determines if a type is a class or // not. The basic mechanism, based on using the pointer to member function of -// a zero argument to a function was "boosted" from the boost type_traits -// library. See http://www.boost.org/ for all the gory details. +// a zero argument to a function was "boosted" from the boost type_traits +// library. See http://www.boost.org/ for all the gory details. // //===----------------------------------------------------------------------===// @@ -27,13 +27,13 @@ namespace dont_use { // These two functions should never be used. They are helpers to - // the is_class template below. They cannot be located inside + // the is_class template below. They cannot be located inside // is_class because doing so causes at least GCC to think that // the value of the "value" enumerator is not constant. Placing - // them out here (for some strange reason) allows the sizeof + // them out here (for some strange reason) allows the sizeof // operator against them to magically be constant. This is // important to make the is_class::value idiom zero cost. it - // evaluates to a constant 1 or 0 depending on whether the + // evaluates to a constant 1 or 0 depending on whether the // parameter T is a class or not (respectively). template char is_class_helper(void(T::*)(void)); template double is_class_helper(...); From lattner at cs.uiuc.edu Thu Apr 21 15:48:24 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 15:48:24 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/BurgBadRegAlloc.ll Message-ID: <200504212048.j3LKmO9E009104@apoc.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Generic: BurgBadRegAlloc.ll updated: 1.4 -> 1.5 --- Log message: this passes on darwin --- Diffs of the changes: (+0 -1) BurgBadRegAlloc.ll | 1 - 1 files changed, 1 deletion(-) Index: llvm/test/Regression/CodeGen/Generic/BurgBadRegAlloc.ll diff -u llvm/test/Regression/CodeGen/Generic/BurgBadRegAlloc.ll:1.4 llvm/test/Regression/CodeGen/Generic/BurgBadRegAlloc.ll:1.5 --- llvm/test/Regression/CodeGen/Generic/BurgBadRegAlloc.ll:1.4 Sat Nov 6 17:05:53 2004 +++ llvm/test/Regression/CodeGen/Generic/BurgBadRegAlloc.ll Thu Apr 21 15:48:08 2005 @@ -8,7 +8,6 @@ ;; -- outgoing args of some function calls have to be swapped, causing ;; another write/read from stack to do the exchange (use -dregalloc=y). ;; -;; XFAIL: darwin %Arity = type %struct.arity* %Binding = type %struct.binding* %DeltaCost = type [4 x short] From brukman at cs.uiuc.edu Thu Apr 21 15:48:26 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:48:26 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/System/DynamicLibrary.h MappedFile.h Memory.h Path.h Process.h Program.h Signals.h TimeValue.h Message-ID: <200504212048.PAA01266@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/System: DynamicLibrary.h updated: 1.3 -> 1.4 MappedFile.h updated: 1.6 -> 1.7 Memory.h updated: 1.3 -> 1.4 Path.h updated: 1.20 -> 1.21 Process.h updated: 1.6 -> 1.7 Program.h updated: 1.5 -> 1.6 Signals.h updated: 1.13 -> 1.14 TimeValue.h updated: 1.11 -> 1.12 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+160 -160) DynamicLibrary.h | 16 +++--- MappedFile.h | 24 ++++----- Memory.h | 10 +-- Path.h | 146 +++++++++++++++++++++++++++---------------------------- Process.h | 34 ++++++------ Program.h | 36 ++++++------- Signals.h | 8 +-- TimeValue.h | 46 ++++++++--------- 8 files changed, 160 insertions(+), 160 deletions(-) Index: llvm/include/llvm/System/DynamicLibrary.h diff -u llvm/include/llvm/System/DynamicLibrary.h:1.3 llvm/include/llvm/System/DynamicLibrary.h:1.4 --- llvm/include/llvm/System/DynamicLibrary.h:1.3 Mon Nov 29 07:27:56 2004 +++ llvm/include/llvm/System/DynamicLibrary.h Thu Apr 21 15:48:15 2005 @@ -1,10 +1,10 @@ //===-- llvm/System/DynamicLibrary.h - Portable Dynamic Library -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file declares the sys::DynamicLibrary class. @@ -21,10 +21,10 @@ namespace sys { /// This class provides a portable interface to dynamic libraries which also - /// might be known as shared libraries, shared objects, dynamic shared + /// might be known as shared libraries, shared objects, dynamic shared /// objects, or dynamic link libraries. Regardless of the terminology or the /// operating system interface, this class provides a portable interface that - /// allows dynamic libraries to be loaded and and searched for externally + /// allows dynamic libraries to be loaded and and searched for externally /// defined symbols. This is typically used to provide "plug-in" support. /// @since 1.4 /// @brief Portable dynamic library abstraction. @@ -34,7 +34,7 @@ public: /// Construct a DynamicLibrary that represents the currently executing /// program. The program must have been linked with -export-dynamic or - /// -dlopen self for this to work. Any symbols retrieved with the + /// -dlopen self for this to work. Any symbols retrieved with the /// GetAddressOfSymbol function will refer to the program not to any /// library. /// @throws std::string indicating why the program couldn't be opened. @@ -49,8 +49,8 @@ /// After destruction, the symbols of the library will no longer be /// available to the program. It is important to make sure the lifespan - /// of a DynamicLibrary exceeds the lifetime of the pointers returned - /// by the GetAddressOfSymbol otherwise the program may walk off into + /// of a DynamicLibrary exceeds the lifetime of the pointers returned + /// by the GetAddressOfSymbol otherwise the program may walk off into /// uncharted territory. /// @see GetAddressOfSymbol. /// @brief Closes the DynamicLibrary Index: llvm/include/llvm/System/MappedFile.h diff -u llvm/include/llvm/System/MappedFile.h:1.6 llvm/include/llvm/System/MappedFile.h:1.7 --- llvm/include/llvm/System/MappedFile.h:1.6 Fri Jan 28 10:08:23 2005 +++ llvm/include/llvm/System/MappedFile.h Thu Apr 21 15:48:15 2005 @@ -1,10 +1,10 @@ //===- llvm/System/MappedFile.h - MappedFile OS Concept ---------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file declares the llvm::sys::MappedFile class. @@ -20,14 +20,14 @@ namespace sys { /// Forward declare a class used for holding platform specific information - /// that needs to be + /// that needs to be struct MappedFileInfo; - /// This class provides an abstraction for a memory mapped file in the + /// This class provides an abstraction for a memory mapped file in the /// operating system's filesystem. It provides platform independent operations /// for mapping a file into memory for both read and write access. This class /// does not provide facilities for finding the file or operating on paths to - /// files. The sys::Path class is used for that. + /// files. The sys::Path class is used for that. /// @since 1.4 /// @brief An abstraction for memory mapped files. class MappedFile { @@ -85,14 +85,14 @@ char* charBase() const { return reinterpret_cast(base_); } /// This function returns a reference to the sys::Path object kept by the - /// MappedFile object. This contains the path to the file that is or + /// MappedFile object. This contains the path to the file that is or /// will be mapped. /// @returns sys::Path containing the path name. /// @brief Returns the mapped file's path as a sys::Path /// @throws nothing const sys::Path& path() const { return path_; } - /// This function returns the number of bytes in the file. + /// This function returns the number of bytes in the file. /// @throws std::string if an error occurs size_t size() const; @@ -106,15 +106,15 @@ /// @brief Remove the file mapping from memory. void unmap(); - /// The mapped file is put into memory. + /// The mapped file is put into memory. /// @returns The base memory address of the mapped file. /// @brief Map the file into memory. void* map(); /// This method causes the size of the file, and consequently the size - /// of the mapping to be set. This is logically the same as unmap(), - /// adjust size of the file, map(). Consequently, when calling this - /// function, the caller should not rely on previous results of the + /// of the mapping to be set. This is logically the same as unmap(), + /// adjust size of the file, map(). Consequently, when calling this + /// function, the caller should not rely on previous results of the /// map(), base(), or baseChar() members as they may point to invalid /// areas of memory after this call. /// @throws std::string if an error occurs Index: llvm/include/llvm/System/Memory.h diff -u llvm/include/llvm/System/Memory.h:1.3 llvm/include/llvm/System/Memory.h:1.4 --- llvm/include/llvm/System/Memory.h:1.3 Sun Dec 19 18:58:41 2004 +++ llvm/include/llvm/System/Memory.h Thu Apr 21 15:48:15 2005 @@ -1,10 +1,10 @@ //===- llvm/System/Memory.h - Memory Support --------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file declares the llvm::sys::Memory class. @@ -42,13 +42,13 @@ public: /// This method allocates a block of Read/Write/Execute memory that is /// suitable for executing dynamically generated code (e.g. JIT). An - /// attempt to allocate \p NumBytes bytes of virtual memory is made. + /// attempt to allocate \p NumBytes bytes of virtual memory is made. /// @throws std::string if an error occurred. /// @brief Allocate Read/Write/Execute memory. static MemoryBlock AllocateRWX(unsigned NumBytes); /// This method releases a block of Read/Write/Execute memory that was - /// allocated with the AllocateRWX method. It should not be used to + /// allocated with the AllocateRWX method. It should not be used to /// release any memory block allocated any other way. /// @throws std::string if an error occurred. /// @brief Release Read/Write/Execute memory. Index: llvm/include/llvm/System/Path.h diff -u llvm/include/llvm/System/Path.h:1.20 llvm/include/llvm/System/Path.h:1.21 --- llvm/include/llvm/System/Path.h:1.20 Fri Dec 17 18:14:24 2004 +++ llvm/include/llvm/System/Path.h Thu Apr 21 15:48:15 2005 @@ -1,10 +1,10 @@ //===- llvm/System/Path.h - Path Operating System Concept -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file declares the llvm::sys::Path class. @@ -23,24 +23,24 @@ namespace llvm { namespace sys { - /// This class provides an abstraction for the path to a file or directory + /// This class provides an abstraction for the path to a file or directory /// in the operating system's filesystem and provides various basic operations /// on it. Note that this class only represents the name of a path to a file - /// or directory which may or may not be valid for a given machine's file + /// or directory which may or may not be valid for a given machine's file /// system. A Path ensures that the name it encapsulates is syntactical valid /// for the operating system it is running on but does not ensure correctness - /// for any particular file system. A Path either references a file or a + /// for any particular file system. A Path either references a file or a /// directory and the distinction is consistently maintained. Most operations /// on the class have invariants that require the Path object to be either a - /// file path or a directory path, but not both. Those operations will also - /// leave the object as either a file path or object path. There is exactly + /// file path or a directory path, but not both. Those operations will also + /// leave the object as either a file path or object path. There is exactly /// one invalid Path which is the empty path. The class should never allow any /// other syntactically invalid non-empty path name to be assigned. Empty /// paths are required in order to indicate an error result. If the path is /// empty, the isValid operation will return false. All operations will fail - /// if isValid is false. Operations that change the path will either return - /// false if it would cause a syntactically invalid path name (in which case - /// the Path object is left unchanged) or throw an std::string exception + /// if isValid is false. Operations that change the path will either return + /// false if it would cause a syntactically invalid path name (in which case + /// the Path object is left unchanged) or throw an std::string exception /// indicating the error. /// @since 1.4 /// @brief An abstraction for operating system paths. @@ -54,11 +54,11 @@ /// However, to support llvm-ar, the mode, user, and group fields are /// retained. These pertain to unix security and may not have a meaningful /// value on non-Unix platforms. However, the fileSize and modTime fields - /// should always be applicabe on all platforms. The structure is + /// should always be applicabe on all platforms. The structure is /// filled in by the getStatusInfo method. /// @brief File status structure struct StatusInfo { - StatusInfo() : fileSize(0), modTime(0,0), mode(0777), user(999), + StatusInfo() : fileSize(0), modTime(0,0), mode(0777), user(999), group(999), isDir(false) { } size_t fileSize; ///< Size of the file in bytes TimeValue modTime; ///< Time of file's modification @@ -73,7 +73,7 @@ /// @{ public: /// Construct a path to the root directory of the file system. The root - /// directory is a top level directory above which there are no more + /// directory is a top level directory above which there are no more /// directories. For example, on UNIX, the root directory is /. On Windows /// it is C:\. Other operating systems may have different notions of /// what the root directory is. @@ -81,8 +81,8 @@ static Path GetRootDirectory(); /// Construct a path to a unique temporary directory that is created in - /// a "standard" place for the operating system. The directory is - /// guaranteed to be created on exit from this function. If the directory + /// a "standard" place for the operating system. The directory is + /// guaranteed to be created on exit from this function. If the directory /// cannot be created, the function will throw an exception. /// @throws std::string indicating why the directory could not be created. /// @brief Constrct a path to an new, unique, existing temporary @@ -100,7 +100,7 @@ /// Construct a vector of sys::Path that contains the "standard" bytecode /// library paths suitable for linking into an llvm program. This function /// *must* return the value of LLVM_LIB_SEARCH_PATH as well as the value - /// of LLVM_LIBDIR. It also must provide the System library paths as + /// of LLVM_LIBDIR. It also must provide the System library paths as /// returned by GetSystemLibraryPaths. /// @see GetSystemLibraryPaths /// @brief Construct a list of directories in which bytecode could be @@ -112,9 +112,9 @@ /// @brief Find a library. static Path FindLibrary(std::string& short_name); - /// Construct a path to the default LLVM configuration directory. The + /// Construct a path to the default LLVM configuration directory. The /// implementation must ensure that this is a well-known (same on many - /// systems) directory in which llvm configuration files exist. For + /// systems) directory in which llvm configuration files exist. For /// example, on Unix, the /etc/llvm directory has been selected. /// @throws nothing /// @brief Construct a path to the default LLVM configuration directory @@ -130,8 +130,8 @@ /// Construct a path to the current user's home directory. The /// implementation must use an operating system specific mechanism for - /// determining the user's home directory. For example, the environment - /// variable "HOME" could be used on Unix. If a given operating system + /// determining the user's home directory. For example, the environment + /// variable "HOME" could be used on Unix. If a given operating system /// does not have the concept of a user's home directory, this static /// constructor must provide the same result as GetRootDirectory. /// @throws nothing @@ -139,9 +139,9 @@ static Path GetUserHomeDirectory(); /// Return the suffix commonly used on file names that contain a shared - /// object, shared archive, or dynamic link library. Such files are - /// linked at runtime into a process and their code images are shared - /// between processes. + /// object, shared archive, or dynamic link library. Such files are + /// linked at runtime into a process and their code images are shared + /// between processes. /// @returns The dynamic link library suffix for the current platform. /// @brief Return the dynamic link library suffix. static std::string GetDLLSuffix(); @@ -201,8 +201,8 @@ /// @returns true if \p this path is lexicographically less than \p that. /// @throws nothing /// @brief Less Than Operator - bool operator< (const Path& that) const { - return 0 > path.compare( that.path ); + bool operator< (const Path& that) const { + return 0 > path.compare( that.path ); } /// @} @@ -213,8 +213,8 @@ /// determine if the current value of \p this is a syntactically valid /// path name for the operating system. The path name does not need to /// exist, validity is simply syntactical. Empty paths are always invalid. - /// @returns true iff the path name is syntactically legal for the - /// host operating system. + /// @returns true iff the path name is syntactically legal for the + /// host operating system. /// @brief Determine if a path is syntactically valid or not. bool isValid() const; @@ -244,12 +244,12 @@ /// This function determines if the path name in this object references /// the root (top level directory) of the file system. The details of what /// is considered the "root" may vary from system to system so this method - /// will do the necessary checking. + /// will do the necessary checking. /// @returns true iff the path name references the root directory. /// @brief Determines if the path references the root directory. bool isRootDirectory() const; - /// This function opens the file associated with the path name provided by + /// This function opens the file associated with the path name provided by /// the Path object and reads its magic number. If the magic number at the /// start of the file matches \p magic, true is returned. In all other /// cases (file not found, file not accessible, etc.) it returns false. @@ -274,7 +274,7 @@ /// This function determines if the path name in the object references an /// LLVM Bytecode file by looking at its magic number. - /// @returns true if the file starts with the magic number for LLVM + /// @returns true if the file starts with the magic number for LLVM /// bytecode files. /// @brief Determine if the path references a bytecode file. bool isBytecodeFile() const; @@ -282,7 +282,7 @@ /// This function determines if the path name in the object references a /// native Dynamic Library (shared library, shared object) by looking at /// the file's magic number. The Path object must reference a file, not a - /// directory. + /// directory. /// @return strue if the file starts with the magid number for a native /// shared library. /// @brief Determine if the path reference a dynamic library. @@ -297,7 +297,7 @@ bool exists() const; /// This function determines if the path name references a readable file - /// or directory in the file system. Unlike isFile and isDirectory, this + /// or directory in the file system. Unlike isFile and isDirectory, this /// function actually checks for the existence and readability (by the /// current program) of the file or directory. /// @returns true if the pathname references a readable file. @@ -306,7 +306,7 @@ bool readable() const; /// This function determines if the path name references a writable file - /// or directory in the file system. Unlike isFile and isDirectory, this + /// or directory in the file system. Unlike isFile and isDirectory, this /// function actually checks for the existence and writability (by the /// current program) of the file or directory. /// @returns true if the pathname references a writable file. @@ -314,12 +314,12 @@ /// in the file system. bool writable() const; - /// This function determines if the path name references an executable - /// file in the file system. Unlike isFile and isDirectory, this - /// function actually checks for the existence and executability (by + /// This function determines if the path name references an executable + /// file in the file system. Unlike isFile and isDirectory, this + /// function actually checks for the existence and executability (by /// the current program) of the file. /// @returns true if the pathname references an executable file. - /// @brief Determines if the path is an executable file in the file + /// @brief Determines if the path is an executable file in the file /// system. bool executable() const; @@ -353,26 +353,26 @@ /// @brief Build a list of directory's contents. bool getDirectoryContents(std::set& paths) const; - /// This method attempts to destroy the directory named by the last in - /// the Path name. If \p remove_contents is false, an attempt will be - /// made to remove just the directory that this Path object refers to + /// This method attempts to destroy the directory named by the last in + /// the Path name. If \p remove_contents is false, an attempt will be + /// made to remove just the directory that this Path object refers to /// (the final Path component). If \p remove_contents is true, an attempt - /// will be made to remove the entire contents of the directory, - /// recursively. + /// will be made to remove the entire contents of the directory, + /// recursively. /// @param destroy_contents Indicates whether the contents of a destroyed - /// directory should also be destroyed (recursively). - /// @returns false if the Path does not refer to a directory, true + /// directory should also be destroyed (recursively). + /// @returns false if the Path does not refer to a directory, true /// otherwise. /// @throws std::string if there is an error. /// @brief Removes the file or directory from the filesystem. bool destroyDirectory( bool destroy_contents = false ) const; /// This method attempts to destroy the file named by the last item in the - /// Path name. + /// Path name. /// @returns false if the Path does not refer to a file, true otherwise. /// @throws std::string if there is an error. /// @brief Destroy the file this Path refers to. - bool destroyFile() const; + bool destroyFile() const; /// Obtain a 'C' string for the path name. /// @returns a 'C' string containing the path name. @@ -385,20 +385,20 @@ public: /// The path name is cleared and becomes empty. This is an invalid /// path name but is the *only* invalid path name. This is provided - /// so that path objects can be used to indicate the lack of a + /// so that path objects can be used to indicate the lack of a /// valid path being found. void clear() { path.clear(); } /// This function returns status information about the file. The type of - /// path (file or directory) is updated to reflect the actual contents - /// of the file system. If the file does not exist, false is returned. + /// path (file or directory) is updated to reflect the actual contents + /// of the file system. If the file does not exist, false is returned. /// For other (hard I/O) errors, a std::string is throwing indicating the /// problem. /// @throws std::string if an error occurs. /// @brief Get file status. void getStatusInfo(StatusInfo& info) const; - /// This function returns the last modified time stamp for the file + /// This function returns the last modified time stamp for the file /// referenced by this path. The Path may reference a file or a directory. /// If the file does not exist, a ZeroTime timestamp is returned. /// @returns last modified timestamp of the file/directory or ZeroTime @@ -407,7 +407,7 @@ StatusInfo info; getStatusInfo(info); return info.modTime; } - /// This function returns the size of the file referenced by this path. + /// This function returns the size of the file referenced by this path. /// @brief Get file size. inline size_t getSize() const { StatusInfo info; getStatusInfo(info); return info.fileSize; @@ -424,14 +424,14 @@ void makeWriteable(); /// This method attempts to make the file referenced by the Path object - /// available for execution so that the executable() method will return + /// available for execution so that the executable() method will return /// true. /// @brief Make the file readable; void makeExecutable(); /// This method attempts to set the Path object to \p unverified_path - /// and interpret the name as a directory name. The \p unverified_path - /// is verified. If verification succeeds then \p unverified_path + /// and interpret the name as a directory name. The \p unverified_path + /// is verified. If verification succeeds then \p unverified_path /// is accepted as a directory and true is returned. Otherwise, /// the Path object remains unchanged and false is returned. /// @returns true if the path was set, false otherwise. @@ -441,8 +441,8 @@ bool setDirectory(const std::string& unverified_path); /// This method attempts to set the Path object to \p unverified_path - /// and interpret the name as a file name. The \p unverified_path - /// is verified. If verification succeeds then \p unverified_path + /// and interpret the name as a file name. The \p unverified_path + /// is verified. If verification succeeds then \p unverified_path /// is accepted as a file name and true is returned. Otherwise, /// the Path object remains unchanged and false is returned. /// @returns true if the path was set, false otherwise. @@ -452,7 +452,7 @@ bool setFile(const std::string& unverified_path); /// The \p dirname is added to the end of the Path if it is a legal - /// directory name for the operating system. The precondition for this + /// directory name for the operating system. The precondition for this /// function is that the Path must reference a directory name (i.e. /// isDirectory() returns true). /// @param dirname A string providing the directory name to @@ -464,7 +464,7 @@ /// One directory component is removed from the Path name. The Path must /// refer to a non-root directory name (i.e. isDirectory() returns true - /// but isRootDirectory() returns false). Upon exit, the Path will + /// but isRootDirectory() returns false). Upon exit, the Path will /// refer to the directory above it. /// @throws nothing /// @returns false if the directory name could not be removed. @@ -473,7 +473,7 @@ /// The \p filename is added to the end of the Path if it is a legal /// directory name for the operating system. The precondition for this - /// function is that the Path reference a directory name (i.e. + /// function is that the Path reference a directory name (i.e. /// isDirectory() returns true). /// @throws nothing /// @returns false if the file name could not be added. @@ -481,7 +481,7 @@ bool appendFile( const std::string& filename ); /// One file component is removed from the Path name. The Path must - /// refer to a file (i.e. isFile() returns true). Upon exit, + /// refer to a file (i.e. isFile() returns true). Upon exit, /// the Path will refer to the directory above it. /// @throws nothing /// @returns false if the file name could not be removed @@ -490,19 +490,19 @@ /// A period and the \p suffix are appended to the end of the pathname. /// The precondition for this function is that the Path reference a file - /// name (i.e. isFile() returns true). If the Path is not a file, no + /// name (i.e. isFile() returns true). If the Path is not a file, no /// action is taken and the function returns false. If the path would /// become invalid for the host operating system, false is returned. /// @returns false if the suffix could not be added, true if it was. /// @throws nothing - /// @brief Adds a period and the \p suffix to the end of the pathname. + /// @brief Adds a period and the \p suffix to the end of the pathname. bool appendSuffix(const std::string& suffix); /// The suffix of the filename is removed. The suffix begins with and /// includes the last . character in the filename after the last directory /// separator and extends until the end of the name. If no . character is /// after the last directory separator, then the file name is left - /// unchanged (i.e. it was already without a suffix) but the function + /// unchanged (i.e. it was already without a suffix) but the function /// returns false. /// @returns false if there was no suffix to remove, true otherwise. /// @throws nothing @@ -510,9 +510,9 @@ bool elideSuffix(); /// The current Path name is made unique in the file system. Upon return, - /// the Path will have been changed to make a unique file in the file + /// the Path will have been changed to make a unique file in the file /// system or it will not have been changed if the current path name is - /// already unique. + /// already unique. /// @throws std::string if an unrecoverable error occurs. /// @brief Make the current path name unique in the file system. void makeUnique( bool reuse_current = true ); @@ -522,9 +522,9 @@ /// whether intermediate directories are created or not. if \p /// create_parents is true, then an attempt will be made to create all /// intermediate directories. If \p create_parents is false, then only the - /// final directory component of the Path name will be created. The - /// created directory will have no entries. - /// @returns false if the Path does not reference a directory, true + /// final directory component of the Path name will be created. The + /// created directory will have no entries. + /// @returns false if the Path does not reference a directory, true /// otherwise. /// @param create_parents Determines whether non-existent directory /// components other than the last one (the "parents") are created or not. @@ -534,7 +534,7 @@ /// This method attempts to create a file in the file system with the same /// name as the Path object. The intermediate directories must all exist - /// at the time this method is called. Use createDirectories to + /// at the time this method is called. Use createDirectories to /// accomplish that. The created file will be empty upon return from this /// function. /// @returns false if the Path does not reference a file, true otherwise. @@ -542,8 +542,8 @@ /// @brief Create the file this Path refers to. bool createFile(); - /// This is like createFile except that it creates a temporary file. A - /// unique temporary file name is generated based on the contents of + /// This is like createFile except that it creates a temporary file. A + /// unique temporary file name is generated based on the contents of /// \p this before the call. The new name is assigned to \p this and the /// file is created. Note that this will both change the Path object /// *and* create the corresponding file. This function will ensure that @@ -561,7 +561,7 @@ bool renameFile(const Path& newName); /// This method sets the access time, modification time, and permission - /// mode of the file associated with \p this as given by \p si. + /// mode of the file associated with \p this as given by \p si. /// @returns false if the Path does not refer to a file, true otherwise. /// @throws std::string if the file could not be modified /// @brief Set file times and mode. Index: llvm/include/llvm/System/Process.h diff -u llvm/include/llvm/System/Process.h:1.6 llvm/include/llvm/System/Process.h:1.7 --- llvm/include/llvm/System/Process.h:1.6 Thu Apr 21 11:12:04 2005 +++ llvm/include/llvm/System/Process.h Thu Apr 21 15:48:15 2005 @@ -1,10 +1,10 @@ //===- llvm/System/Process.h ------------------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file declares the llvm::sys::Process class. @@ -20,7 +20,7 @@ namespace sys { /// This class provides an abstraction for getting information about the - /// currently executing process. + /// currently executing process. /// @since 1.4 /// @brief An abstraction for operating system processes. class Process { @@ -36,20 +36,20 @@ /// This static function will return the total amount of memory allocated /// by the process. This only counts the memory allocated via the malloc, - /// calloc and realloc functions and includes any "free" holes in the - /// allocated space. + /// calloc and realloc functions and includes any "free" holes in the + /// allocated space. /// @throws nothing /// @brief Return process memory usage. static size_t GetMallocUsage(); - /// This static function will return the total memory usage of the + /// This static function will return the total memory usage of the /// process. This includes code, data, stack and mapped pages usage. Notei /// that the value returned here is not necessarily the Running Set Size, /// it is the total virtual memory usage, regardless of mapped state of /// that memory. static size_t GetTotalMemoryUsage(); - /// This static function will set \p user_time to the amount of CPU time + /// This static function will set \p user_time to the amount of CPU time /// spent in user (non-kernel) mode and \p sys_time to the amount of CPU /// time spent in system (kernel) mode. If the operating system does not /// support collection of these metrics, a zero TimeValue will be for both @@ -57,24 +57,24 @@ static void GetTimeUsage( TimeValue& elapsed, ///< Returns the TimeValue::now() giving current time - TimeValue& user_time, + TimeValue& user_time, ///< Returns the current amount of user time for the process TimeValue& sys_time ///< Returns the current amount of system time for the process ); /// This static function will return the process' current user id number. - /// Not all operating systems support this feature. Where it is not - /// supported, the function should return 65536 as the value. + /// Not all operating systems support this feature. Where it is not + /// supported, the function should return 65536 as the value. static int GetCurrentUserId(); /// This static function will return the process' current group id number. - /// Not all operating systems support this feature. Where it is not - /// supported, the function should return 65536 as the value. + /// Not all operating systems support this feature. Where it is not + /// supported, the function should return 65536 as the value. static int GetCurrentGroupId(); - /// This function makes the necessary calls to the operating system to - /// prevent core files or any other kind of large memory dumps that can + /// This function makes the necessary calls to the operating system to + /// prevent core files or any other kind of large memory dumps that can /// occur when a program fails. /// @brief Prevent core file generation. static void PreventCoreFiles(); @@ -84,12 +84,12 @@ /// or pipe. static bool StandardInIsUserInput(); - /// This function determines if the standard output is connected to a + /// This function determines if the standard output is connected to a /// "tty" or "console" window. That is, the output would be displayed to /// the user rather than being put on a pipe or stored in a file. static bool StandardOutIsDisplayed(); - /// This function determines if the standard error is connected to a + /// This function determines if the standard error is connected to a /// "tty" or "console" window. That is, the output would be displayed to /// the user rather than being put on a pipe or stored in a file. static bool StandardErrIsDisplayed(); Index: llvm/include/llvm/System/Program.h diff -u llvm/include/llvm/System/Program.h:1.5 llvm/include/llvm/System/Program.h:1.6 --- llvm/include/llvm/System/Program.h:1.5 Tue Jan 11 00:37:27 2005 +++ llvm/include/llvm/System/Program.h Thu Apr 21 15:48:15 2005 @@ -1,10 +1,10 @@ //===- llvm/System/Program.h ------------------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file declares the llvm::sys::Program class. @@ -31,8 +31,8 @@ /// @{ public: /// This static constructor (factory) will attempt to locate a program in - /// the operating system's file system using some pre-determined set of - /// locations to search (e.g. the PATH on Unix). + /// the operating system's file system using some pre-determined set of + /// locations to search (e.g. the PATH on Unix). /// @returns A Path object initialized to the path of the program or a /// Path object that is empty (invalid) if the program could not be found. /// @throws nothing @@ -41,11 +41,11 @@ /// This function executes the program using the \p arguments provided and /// waits for the program to exit. This function will block the current - /// program until the invoked program exits. The invoked program will + /// program until the invoked program exits. The invoked program will /// inherit the stdin, stdout, and stderr file descriptors, the /// environment and other configuration settings of the invoking program. /// If Path::executable() does not return true when this function is - /// called then a std::string is thrown. + /// called then a std::string is thrown. /// @param path A sys::Path object providing the path of the program to be /// executed. It is presumed this is the result of the FindProgramByName /// method. @@ -56,21 +56,21 @@ /// @brief Executes the program with the given set of \p args. static int ExecuteAndWait( const Path& path, ///< The path to the program to execute - const char** args, ///< A vector of strings that are passed to the - ///< program. The first element should be the name of the program. + const char** args, ///< A vector of strings that are passed to the + ///< program. The first element should be the name of the program. ///< The list *must* be terminated by a null char* entry. - const char ** env = 0, ///< An optional vector of strings to use for + const char ** env = 0, ///< An optional vector of strings to use for ///< the program's environment. If not provided, the current program's ///< environment will be used. - const sys::Path** redirects = 0, ///< An optional array of pointers to - ///< Paths. If the array is null, no redirection is done. The array + const sys::Path** redirects = 0, ///< An optional array of pointers to + ///< Paths. If the array is null, no redirection is done. The array ///< should have a size of at least three. If the pointer in the array - ///< are not null, then the inferior process's stdin(0), stdout(1), - ///< and stderr(2) will be redirected to the corresponding Paths. - unsigned secondsToWait = 0 ///< If non-zero, this specifies the amount - ///< of time to wait for the child process to exit. If the time - ///< expires, the child is killed and this call returns. If zero, - ///< this function will wait until the child finishes or forever if + ///< are not null, then the inferior process's stdin(0), stdout(1), + ///< and stderr(2) will be redirected to the corresponding Paths. + unsigned secondsToWait = 0 ///< If non-zero, this specifies the amount + ///< of time to wait for the child process to exit. If the time + ///< expires, the child is killed and this call returns. If zero, + ///< this function will wait until the child finishes or forever if ///< it doesn't. ); }; Index: llvm/include/llvm/System/Signals.h diff -u llvm/include/llvm/System/Signals.h:1.13 llvm/include/llvm/System/Signals.h:1.14 --- llvm/include/llvm/System/Signals.h:1.13 Sun Nov 14 15:53:09 2004 +++ llvm/include/llvm/System/Signals.h Thu Apr 21 15:48:15 2005 @@ -1,10 +1,10 @@ //===- llvm/System/Signals.h - Signal Handling support ----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines some helpful functions for dealing with the possibility of @@ -20,7 +20,7 @@ namespace llvm { namespace sys { - /// This function registers signal handlers to ensure that if a signal gets + /// This function registers signal handlers to ensure that if a signal gets /// delivered that the named file is removed. /// @brief Remove a file if a fatal signal occurs. void RemoveFileOnSignal(const Path &Filename); @@ -31,7 +31,7 @@ /// @brief Remove a directory if a fatal signal occurs. void RemoveDirectoryOnSignal(const Path& path); - /// When an error signal (such as SIBABRT or SIGSEGV) is delivered to the + /// When an error signal (such as SIBABRT or SIGSEGV) is delivered to the /// process, print a stack trace and then exit. /// @brief Print a stack trace if a fatal signal occurs. void PrintStackTraceOnErrorSignal(); Index: llvm/include/llvm/System/TimeValue.h diff -u llvm/include/llvm/System/TimeValue.h:1.11 llvm/include/llvm/System/TimeValue.h:1.12 --- llvm/include/llvm/System/TimeValue.h:1.11 Sat Jan 1 12:58:23 2005 +++ llvm/include/llvm/System/TimeValue.h Thu Apr 21 15:48:15 2005 @@ -1,10 +1,10 @@ //===-- TimeValue.h - Declare OS TimeValue Concept --------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header file declares the operating system TimeValue concept. @@ -19,12 +19,12 @@ namespace llvm { namespace sys { - /// This class is used where a precise fixed point in time is required. The - /// range of TimeValue spans many hundreds of billions of years both past and - /// present. The precision of TimeValue is to the nanosecond. However, the - /// actual precision of its values will be determined by the resolution of - /// the system clock. The TimeValue class is used in conjunction with several - /// other lib/System interfaces to specify the time at which a call should + /// This class is used where a precise fixed point in time is required. The + /// range of TimeValue spans many hundreds of billions of years both past and + /// present. The precision of TimeValue is to the nanosecond. However, the + /// actual precision of its values will be determined by the resolution of + /// the system clock. The TimeValue class is used in conjunction with several + /// other lib/System interfaces to specify the time at which a call should /// timeout, etc. /// @since 1.4 /// @brief Provides an abstraction for a fixed point in time. @@ -82,9 +82,9 @@ /// @name Constructors /// @{ public: - /// Caller provides the exact value in seconds and nanoseconds. The + /// Caller provides the exact value in seconds and nanoseconds. The /// \p nanos argument defaults to zero for convenience. - /// @brief Explicit constructor + /// @brief Explicit constructor explicit TimeValue (SecondsType seconds, NanoSecondsType nanos = 0) : seconds_( seconds ), nanos_( nanos ) { this->normalize(); } @@ -92,10 +92,10 @@ /// fractional part representing nanoseconds. /// @brief Double Constructor. explicit TimeValue( double new_time ) - : seconds_( 0 ) , nanos_ ( 0 ) { + : seconds_( 0 ) , nanos_ ( 0 ) { SecondsType integer_part = static_cast( new_time ); seconds_ = integer_part; - nanos_ = static_cast( (new_time - + nanos_ = static_cast( (new_time - static_cast(integer_part)) * NANOSECONDS_PER_SECOND ); this->normalize(); } @@ -167,7 +167,7 @@ /// @brief True iff *this == that. /// @brief True if this == that. int operator == (const TimeValue &that) const { - return (this->seconds_ == that.seconds_) && + return (this->seconds_ == that.seconds_) && (this->nanos_ == that.nanos_); } @@ -198,14 +198,14 @@ SecondsType seconds() const { return seconds_; } /// Returns only the nanoseconds component of the TimeValue. The seconds - /// portion is ignored. + /// portion is ignored. /// @brief Retrieve the nanoseconds component. NanoSecondsType nanoseconds() const { return nanos_; } /// Returns only the fractional portion of the TimeValue rounded down to the /// nearest microsecond (divide by one thousand). /// @brief Retrieve the fractional part as microseconds; - uint32_t microseconds() const { + uint32_t microseconds() const { return nanos_ / NANOSECONDS_PER_MICROSECOND; } @@ -222,17 +222,17 @@ /// systems and is therefore provided. /// @brief Convert to a number of microseconds (can overflow) uint64_t usec() const { - return seconds_ * MICROSECONDS_PER_SECOND + + return seconds_ * MICROSECONDS_PER_SECOND + ( nanos_ / NANOSECONDS_PER_MICROSECOND ); } /// Returns the TimeValue as a number of milliseconds. Note that the value - /// returned can overflow because the range of a uint64_t is smaller than + /// returned can overflow because the range of a uint64_t is smaller than /// the range of a TimeValue. Nevertheless, this is useful on some operating /// systems and is therefore provided. /// @brief Convert to a number of milliseconds (can overflow) uint64_t msec() const { - return seconds_ * MILLISECONDS_PER_SECOND + + return seconds_ * MILLISECONDS_PER_SECOND + ( nanos_ / NANOSECONDS_PER_MILLISECOND ); } @@ -245,8 +245,8 @@ return result; } - /// Converts the TimeValue into the corresponding number of seconds - /// since the epoch (00:00:00 Jan 1,1970). + /// Converts the TimeValue into the corresponding number of seconds + /// since the epoch (00:00:00 Jan 1,1970). uint64_t toEpochTime() const { return seconds_ - PosixZeroTime.seconds_; } @@ -314,7 +314,7 @@ /// @brief Converts from microsecond format to TimeValue format void usec( int64_t microseconds ) { this->seconds_ = microseconds / MICROSECONDS_PER_SECOND; - this->nanos_ = NanoSecondsType(microseconds % MICROSECONDS_PER_SECOND) * + this->nanos_ = NanoSecondsType(microseconds % MICROSECONDS_PER_SECOND) * NANOSECONDS_PER_MICROSECOND; this->normalize(); } @@ -322,7 +322,7 @@ /// @brief Converts from millisecond format to TimeValue format void msec( int64_t milliseconds ) { this->seconds_ = milliseconds / MILLISECONDS_PER_SECOND; - this->nanos_ = NanoSecondsType(milliseconds % MILLISECONDS_PER_SECOND) * + this->nanos_ = NanoSecondsType(milliseconds % MILLISECONDS_PER_SECOND) * NANOSECONDS_PER_MILLISECOND; this->normalize(); } From brukman at cs.uiuc.edu Thu Apr 21 15:53:55 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:53:55 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/MRegisterInfo.h TargetData.h TargetFrameInfo.h TargetInstrInfo.h TargetJITInfo.h TargetLowering.h TargetMachine.h TargetMachineRegistry.h TargetOptions.h TargetSchedInfo.h Message-ID: <200504212053.PAA01375@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: MRegisterInfo.h updated: 1.55 -> 1.56 TargetData.h updated: 1.29 -> 1.30 TargetFrameInfo.h updated: 1.17 -> 1.18 TargetInstrInfo.h updated: 1.75 -> 1.76 TargetJITInfo.h updated: 1.5 -> 1.6 TargetLowering.h updated: 1.9 -> 1.10 TargetMachine.h updated: 1.50 -> 1.51 TargetMachineRegistry.h updated: 1.4 -> 1.5 TargetOptions.h updated: 1.3 -> 1.4 TargetSchedInfo.h updated: 1.33 -> 1.34 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+114 -114) MRegisterInfo.h | 8 ++-- TargetData.h | 14 +++---- TargetFrameInfo.h | 12 +++--- TargetInstrInfo.h | 34 +++++++++--------- TargetJITInfo.h | 10 ++--- TargetLowering.h | 32 ++++++++--------- TargetMachine.h | 16 ++++---- TargetMachineRegistry.h | 8 ++-- TargetOptions.h | 4 +- TargetSchedInfo.h | 90 ++++++++++++++++++++++++------------------------ 10 files changed, 114 insertions(+), 114 deletions(-) Index: llvm/include/llvm/Target/MRegisterInfo.h diff -u llvm/include/llvm/Target/MRegisterInfo.h:1.55 llvm/include/llvm/Target/MRegisterInfo.h:1.56 --- llvm/include/llvm/Target/MRegisterInfo.h:1.55 Wed Oct 27 01:00:53 2004 +++ llvm/include/llvm/Target/MRegisterInfo.h Thu Apr 21 15:53:44 2005 @@ -1,10 +1,10 @@ //===- Target/MRegisterInfo.h - Target Register Information -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file describes an abstract interface used to get information about a @@ -92,7 +92,7 @@ virtual iterator allocation_order_end(MachineFunction &MF) const { return end(); } - + /// getSize - Return the size of the register in bytes, which is also the size @@ -280,7 +280,7 @@ /// instructions. This method need only be implemented if using call frame /// setup/destroy pseudo instructions. /// - virtual void + virtual void eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const { Index: llvm/include/llvm/Target/TargetData.h diff -u llvm/include/llvm/Target/TargetData.h:1.29 llvm/include/llvm/Target/TargetData.h:1.30 --- llvm/include/llvm/Target/TargetData.h:1.29 Sun Mar 13 13:04:04 2005 +++ llvm/include/llvm/Target/TargetData.h Thu Apr 21 15:53:44 2005 @@ -1,14 +1,14 @@ //===-- llvm/Target/TargetData.h - Data size & alignment info ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines target properties related to datatype size/offset/alignment -// information. It uses lazy annotations to cache information about how +// information. It uses lazy annotations to cache information about how // structure types are laid out and used. // // This structure should be created once, filled in if the defaults are not @@ -49,7 +49,7 @@ bool LittleEndian = false, unsigned char PtrSize = 8, unsigned char PtrAl = 8, unsigned char DoubleAl = 8, - unsigned char FloatAl = 4, unsigned char LongAl = 8, + unsigned char FloatAl = 4, unsigned char LongAl = 8, unsigned char IntAl = 4, unsigned char ShortAl = 2, unsigned char ByteAl = 1, unsigned char BoolAl = 1); @@ -67,7 +67,7 @@ PointerSize(TD.getPointerSize()), PointerAlignment(TD.getPointerAlignment()) { } - + TargetData(const std::string &ToolName, const Module *M); ~TargetData(); // Not virtual, do not subclass this class @@ -105,9 +105,9 @@ /// getIndexOffset - return the offset from the beginning of the type for the /// specified indices. This is used to implement getelementptr. /// - uint64_t getIndexedOffset(const Type *Ty, + uint64_t getIndexedOffset(const Type *Ty, const std::vector &Indices) const; - + const StructLayout *getStructLayout(const StructType *Ty) const; }; Index: llvm/include/llvm/Target/TargetFrameInfo.h diff -u llvm/include/llvm/Target/TargetFrameInfo.h:1.17 llvm/include/llvm/Target/TargetFrameInfo.h:1.18 --- llvm/include/llvm/Target/TargetFrameInfo.h:1.17 Wed Oct 27 11:14:51 2004 +++ llvm/include/llvm/Target/TargetFrameInfo.h Thu Apr 21 15:53:44 2005 @@ -1,10 +1,10 @@ //===-- llvm/Target/TargetFrameInfo.h ---------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Interface to describe the layout of a stack frame on the target machine. @@ -67,13 +67,13 @@ /// fixed offset from the incoming stack pointer that each register should be /// spilled at. If a register is not listed here, the code generator is /// allowed to spill it anywhere it chooses. - /// + /// virtual const std::pair * getCalleeSaveSpillSlots(unsigned &NumEntries) const { NumEntries = 0; return 0; } - + //===--------------------------------------------------------------------===// // These methods provide details of the stack frame used by Sparc, thus they // are Sparc specific. @@ -87,12 +87,12 @@ // function. The frame contents are obtained from the MachineFunction object // for the given function. The rest must be implemented by the // machine-specific subclass. - // + // virtual int getIncomingArgOffset (MachineFunction& mcInfo, unsigned argNum) const; virtual int getOutgoingArgOffset (MachineFunction& mcInfo, unsigned argNum) const; - + virtual int getFirstAutomaticVarOffset (MachineFunction& mcInfo, bool& growUp) const; virtual int getRegSpillAreaOffset (MachineFunction& mcInfo, Index: llvm/include/llvm/Target/TargetInstrInfo.h diff -u llvm/include/llvm/Target/TargetInstrInfo.h:1.75 llvm/include/llvm/Target/TargetInstrInfo.h:1.76 --- llvm/include/llvm/Target/TargetInstrInfo.h:1.75 Wed Jan 19 00:53:02 2005 +++ llvm/include/llvm/Target/TargetInstrInfo.h Thu Apr 21 15:53:44 2005 @@ -1,10 +1,10 @@ //===-- llvm/Target/TargetInstrInfo.h - Instruction Info --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file describes the target machine instructions to the code generator. @@ -91,14 +91,14 @@ //--------------------------------------------------------------------------- -/// +/// /// TargetInstrInfo - Interface to description of machine instructions -/// +/// class TargetInstrInfo { const TargetInstrDescriptor* desc; // raw array to allow static init'n unsigned NumOpcodes; // number of entries in the desc array unsigned numRealOpCodes; // number of non-dummy op codes - + TargetInstrInfo(const TargetInstrInfo &); // DO NOT IMPLEMENT void operator=(const TargetInstrInfo &); // DO NOT IMPLEMENT public: @@ -107,9 +107,9 @@ // Invariant: All instruction sets use opcode #0 as the PHI instruction enum { PHI = 0 }; - + unsigned getNumOpcodes() const { return NumOpcodes; } - + /// get - Return the machine instruction descriptor that corresponds to the /// specified instruction opcode. /// @@ -121,7 +121,7 @@ const char *getName(MachineOpCode Opcode) const { return get(Opcode).Name; } - + int getNumOperands(MachineOpCode Opcode) const { return get(Opcode).numOperands; } @@ -143,7 +143,7 @@ // // Query instruction class flags according to the machine-independent // flags listed above. - // + // bool isReturn(MachineOpCode Opcode) const { return get(Opcode).Flags & M_RET_FLAG; } @@ -253,36 +253,36 @@ return true; } - // + // // Latencies for individual instructions and instruction pairs - // + // virtual int minLatency(MachineOpCode Opcode) const { return get(Opcode).latency; } - + virtual int maxLatency(MachineOpCode Opcode) const { return get(Opcode).latency; } // // Which operand holds an immediate constant? Returns -1 if none - // + // virtual int getImmedConstantPos(MachineOpCode Opcode) const { return -1; // immediate position is machine specific, so say -1 == "none" } - + // Check if the specified constant fits in the immediate field // of this machine instruction - // + // virtual bool constantFitsInImmedField(MachineOpCode Opcode, int64_t intValue) const; - + // Return the largest positive constant that can be held in the IMMED field // of this machine instruction. // isSignExtended is set to true if the value is sign-extended before use // (this is true for all immediate fields in SPARC instructions). // Return 0 if the instruction has no IMMED field. - // + // virtual uint64_t maxImmedConstant(MachineOpCode Opcode, bool &isSignExtended) const { isSignExtended = get(Opcode).immedIsSignExtended; Index: llvm/include/llvm/Target/TargetJITInfo.h diff -u llvm/include/llvm/Target/TargetJITInfo.h:1.5 llvm/include/llvm/Target/TargetJITInfo.h:1.6 --- llvm/include/llvm/Target/TargetJITInfo.h:1.5 Sat Nov 20 22:42:32 2004 +++ llvm/include/llvm/Target/TargetJITInfo.h Thu Apr 21 15:53:44 2005 @@ -1,10 +1,10 @@ //===- Target/TargetJITInfo.h - Target Information for JIT ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file exposes an abstract interface used by the Just-In-Time code @@ -30,19 +30,19 @@ class TargetJITInfo { public: virtual ~TargetJITInfo() {} - + /// addPassesToJITCompile - Add passes to the specified pass manager to /// implement a fast code generator for this target. /// virtual void addPassesToJITCompile(FunctionPassManager &PM) = 0; - + /// replaceMachineCodeForFunction - Make it so that calling the function /// whose machine code is at OLD turns into a call to NEW, perhaps by /// overwriting OLD with a branch to NEW. This is used for self-modifying /// code. /// virtual void replaceMachineCodeForFunction(void *Old, void *New) = 0; - + /// emitFunctionStub - Use the specified MachineCodeEmitter object to emit a /// small native function that simply calls the function at the specified /// address. Return the address of the resultant function. Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.9 llvm/include/llvm/Target/TargetLowering.h:1.10 --- llvm/include/llvm/Target/TargetLowering.h:1.9 Thu Apr 7 14:41:18 2005 +++ llvm/include/llvm/Target/TargetLowering.h Thu Apr 21 15:53:44 2005 @@ -1,10 +1,10 @@ //===-- llvm/Target/TargetLowering.h - Target Lowering Info -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file describes how to lower LLVM code to machine code. This has two @@ -70,7 +70,7 @@ TargetMachine &getTargetMachine() const { return TM; } const TargetData &getTargetData() const { return TD; } - + bool isLittleEndian() const { return IsLittleEndian; } MVT::ValueType getPointerTy() const { return PointerTy; } MVT::ValueType getShiftAmountTy() const { return ShiftAmountTy; } @@ -92,7 +92,7 @@ assert(RC && "This value type is not natively supported!"); return RC; } - + /// hasNativeSupportFor - Return true if the target has native support for the /// specified value type. This means that it has a register that directly /// holds it without promotions or expansions. @@ -117,7 +117,7 @@ MVT::ValueType getTypeToTransformTo(MVT::ValueType VT) const { return TransformToType[VT]; } - + typedef std::vector::const_iterator legal_fpimm_iterator; legal_fpimm_iterator legal_fpimm_begin() const { return LegalFPImmediates.begin(); @@ -126,11 +126,11 @@ return LegalFPImmediates.end(); } - /// getOperationAction - Return how this operation should be + /// getOperationAction - Return how this operation should be LegalizeAction getOperationAction(unsigned Op, MVT::ValueType VT) const { - return (LegalizeAction)((OpActions[Op] >> (2*VT)) & 3); + return (LegalizeAction)((OpActions[Op] >> (2*VT)) & 3); } - + /// hasNativeSupportForOperation - Return true if this operation is legal for /// this type. /// @@ -173,7 +173,7 @@ case Type::PointerTyID: return PointerTy; } } - + /// getNumElements - Return the number of registers that this ValueType will /// eventually require. This is always one for all non-integer types, is /// one for any types promoted to live in larger registers, but may be more @@ -206,7 +206,7 @@ void setShiftAmountFlavor(OutOfRangeShiftAmount OORSA) { ShiftAmtHandling = OORSA; } - + /// addRegisterClass - Add the specified register class as an available /// regclass for the specified value type. This indicates the selector can /// handle values of that class natively. @@ -218,7 +218,7 @@ /// computeRegisterProperties - Once all of the register classes are added, /// this allows us to compute derived properties we expose. void computeRegisterProperties(); - + /// setOperationAction - Indicate that the specified operation does not work /// with the specified type and indicate what to do about it. void setOperationAction(unsigned Op, MVT::ValueType VT, @@ -291,7 +291,7 @@ /// implement this. The default implementation of this aborts. virtual SDOperand LowerOperation(SDOperand Op); - + private: TargetMachine &TM; const TargetData &TD; @@ -299,7 +299,7 @@ /// IsLittleEndian - True if this is a little endian target. /// bool IsLittleEndian; - + /// PointerTy - The type to use for pointers, usually i32 or i64. /// MVT::ValueType PointerTy; @@ -327,7 +327,7 @@ /// value type, where the two bits correspond to the LegalizeAction enum. /// This can be queried with "getTypeAction(VT)". unsigned ValueTypeActions; - + /// TransformToType - For any value types we are promoting or expanding, this /// contains the value type that we are changing to. For Expanded types, this /// contains one step of the expand (e.g. i64 -> i32), even if there are @@ -341,9 +341,9 @@ /// operations that are not should be described. Note that operations on /// non-legal value types are not described here. unsigned OpActions[128]; - + std::vector LegalFPImmediates; - + std::vector > AvailableRegClasses; }; Index: llvm/include/llvm/Target/TargetMachine.h diff -u llvm/include/llvm/Target/TargetMachine.h:1.50 llvm/include/llvm/Target/TargetMachine.h:1.51 --- llvm/include/llvm/Target/TargetMachine.h:1.50 Tue Aug 10 18:10:21 2004 +++ llvm/include/llvm/Target/TargetMachine.h Thu Apr 21 15:53:44 2005 @@ -1,10 +1,10 @@ //===-- llvm/Target/TargetMachine.h - Target Information --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file describes the general parts of a Target machine. @@ -37,16 +37,16 @@ /// TargetMachine - Primary interface to the complete machine description for /// the target machine. All target-specific information should be accessible /// through this interface. -/// +/// class TargetMachine { const std::string Name; const TargetData DataLayout; // Calculates type size & alignment IntrinsicLowering *IL; // Specifies how to lower intrinsic calls - + TargetMachine(const TargetMachine&); // DO NOT IMPLEMENT void operator=(const TargetMachine&); // DO NOT IMPLEMENT protected: // Can only create subclasses... - TargetMachine(const std::string &name, IntrinsicLowering *IL, + TargetMachine(const std::string &name, IntrinsicLowering *IL, bool LittleEndian = false, unsigned char PtrSize = 8, unsigned char PtrAl = 8, unsigned char DoubleAl = 8, unsigned char FloatAl = 4, @@ -54,7 +54,7 @@ unsigned char ShortAl = 2, unsigned char ByteAl = 1, unsigned char BoolAl = 1); - TargetMachine(const std::string &name, IntrinsicLowering *IL, + TargetMachine(const std::string &name, IntrinsicLowering *IL, const TargetData &TD); /// This constructor is used for targets that support arbitrary TargetData @@ -87,12 +87,12 @@ /// lower unknown intrinsic functions to the equivalent LLVM expansion. /// IntrinsicLowering &getIntrinsicLowering() const { return *IL; } - + // Interfaces to the major aspects of target machine information: // -- Instruction opcode and operand information // -- Pipelines and scheduling information // -- Stack frame information - // + // virtual const TargetInstrInfo *getInstrInfo() const { return 0; } virtual const TargetFrameInfo *getFrameInfo() const { return 0; } const TargetData &getTargetData() const { return DataLayout; } Index: llvm/include/llvm/Target/TargetMachineRegistry.h diff -u llvm/include/llvm/Target/TargetMachineRegistry.h:1.4 llvm/include/llvm/Target/TargetMachineRegistry.h:1.5 --- llvm/include/llvm/Target/TargetMachineRegistry.h:1.4 Wed Sep 1 17:55:35 2004 +++ llvm/include/llvm/Target/TargetMachineRegistry.h Thu Apr 21 15:53:44 2005 @@ -1,10 +1,10 @@ //===-- Target/TargetMachineRegistry.h - Target Registration ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file exposes two classes: the TargetMachineRegistry class, which allows @@ -74,7 +74,7 @@ /// TargetMachine comments.. template struct RegisterTarget : public TargetMachineRegistry::Entry { - RegisterTarget(const char *Name, const char *ShortDesc) : + RegisterTarget(const char *Name, const char *ShortDesc) : TargetMachineRegistry::Entry(Name, ShortDesc, &Allocator, &TargetMachineImpl::getModuleMatchQuality, &TargetMachineImpl::getJITMatchQuality) { @@ -94,7 +94,7 @@ virtual ~TargetRegistrationListener(); TargetRegistrationListener *getNext() const { return Next; } - + virtual void targetRegistered(const TargetMachineRegistry::Entry *E) = 0; }; Index: llvm/include/llvm/Target/TargetOptions.h diff -u llvm/include/llvm/Target/TargetOptions.h:1.3 llvm/include/llvm/Target/TargetOptions.h:1.4 --- llvm/include/llvm/Target/TargetOptions.h:1.3 Fri Apr 15 17:12:15 2005 +++ llvm/include/llvm/Target/TargetOptions.h Thu Apr 21 15:53:44 2005 @@ -1,10 +1,10 @@ //===-- llvm/Target/TargetOptions.h - Target Options ------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines command line option flags that are shared across various Index: llvm/include/llvm/Target/TargetSchedInfo.h diff -u llvm/include/llvm/Target/TargetSchedInfo.h:1.33 llvm/include/llvm/Target/TargetSchedInfo.h:1.34 --- llvm/include/llvm/Target/TargetSchedInfo.h:1.33 Sat Jan 15 19:26:31 2005 +++ llvm/include/llvm/Target/TargetSchedInfo.h Thu Apr 21 15:53:44 2005 @@ -1,10 +1,10 @@ //===- Target/TargetSchedInfo.h - Target Instruction Sched Info -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file describes the target machine to the instruction scheduler. @@ -22,14 +22,14 @@ namespace llvm { -typedef long long CycleCount_t; +typedef long long CycleCount_t; static const CycleCount_t HUGE_LATENCY = ~((long long) 1 << (sizeof(CycleCount_t)-2)); -static const CycleCount_t INVALID_LATENCY = -HUGE_LATENCY; +static const CycleCount_t INVALID_LATENCY = -HUGE_LATENCY; //--------------------------------------------------------------------------- -// class MachineResource +// class MachineResource // class CPUResource -// +// // Purpose: // Representation of a single machine resource used in specifying // resource usages of machine instructions for scheduling. @@ -42,7 +42,7 @@ const std::string rname; resourceId_t rid; int maxNumUsers; // MAXINT if no restriction - + CPUResource(const std::string& resourceName, int maxUsers); static CPUResource* getCPUResource(resourceId_t id); private: @@ -52,17 +52,17 @@ //--------------------------------------------------------------------------- // struct InstrClassRUsage -// struct InstrRUsageDelta -// struct InstrIssueDelta -// struct InstrRUsage -// +// struct InstrRUsageDelta +// struct InstrIssueDelta +// struct InstrRUsage +// // Purpose: -// The first three are structures used to specify machine resource +// The first three are structures used to specify machine resource // usages for each instruction in a machine description file: // InstrClassRUsage : resource usages common to all instrs. in a class -// InstrRUsageDelta : add/delete resource usage for individual instrs. -// InstrIssueDelta : add/delete instr. issue info for individual instrs -// +// InstrRUsageDelta : add/delete resource usage for individual instrs. +// InstrIssueDelta : add/delete instr. issue info for individual instrs +// // The last one (InstrRUsage) is the internal representation of // instruction resource usage constructed from the above three. //--------------------------------------------------------------------------- @@ -73,18 +73,18 @@ struct InstrClassRUsage { InstrSchedClass schedClass; int totCycles; - + // Issue restrictions common to instructions in this class unsigned maxNumIssue; bool isSingleIssue; bool breaksGroup; CycleCount_t numBubbles; - + // Feasible slots to use for instructions in this class. // The size of vector S[] is `numSlots'. unsigned numSlots; unsigned feasibleSlots[MAX_NUM_SLOTS]; - + // Resource usages common to instructions in this class. // The size of vector V[] is `numRUEntries'. unsigned numRUEntries; @@ -104,7 +104,7 @@ // Specify instruction issue restrictions for individual instructions // that differ from the common rules for the class. -// +// struct InstrIssueDelta { MachineOpCode opCode; bool isSingleIssue; @@ -115,19 +115,19 @@ struct InstrRUsage { bool sameAsClass; - + // Issue restrictions for this instruction bool isSingleIssue; bool breaksGroup; CycleCount_t numBubbles; - + // Feasible slots to use for this instruction. std::vector feasibleSlots; - + // Resource usages for this instruction, with one resource vector per cycle. CycleCount_t numCycles; std::vector > resourcesByCycle; - + private: // Conveniences for initializing this structure void setTo(const InstrClassRUsage& classRU); @@ -143,22 +143,22 @@ void setMaxSlots (int maxNumSlots) { feasibleSlots.resize(maxNumSlots); } - + friend class TargetSchedInfo; // give access to these functions }; //--------------------------------------------------------------------------- -/// TargetSchedInfo - Common interface to machine information for +/// TargetSchedInfo - Common interface to machine information for /// instruction scheduling /// class TargetSchedInfo { public: const TargetMachine& target; - + unsigned maxNumIssueTotal; int longestIssueConflict; - + protected: inline const InstrRUsage& getInstrRUsage(MachineOpCode opCode) const { assert(opCode >= 0 && opCode < (int) instrRUsages.size()); @@ -181,19 +181,19 @@ unsigned _numUsageDeltas, unsigned _numIssueDeltas); /*dtor*/ virtual ~TargetSchedInfo() {} - + inline const TargetInstrInfo& getInstrInfo() const { return *mii; } - + inline int getNumSchedClasses() const { return numSchedClasses; - } - + } + inline unsigned getMaxNumIssueTotal() const { return maxNumIssueTotal; } - + inline unsigned getMaxIssueForClass(const InstrSchedClass& sc) const { assert(sc < numSchedClasses); return classRUsages[sc].maxNumIssue; @@ -201,14 +201,14 @@ inline InstrSchedClass getSchedClass (MachineOpCode opCode) const { return getInstrInfo().getSchedClass(opCode); - } - + } + inline bool instrCanUseSlot (MachineOpCode opCode, unsigned s) const { assert(s < getInstrRUsage(opCode).feasibleSlots.size() && "Invalid slot!"); return getInstrRUsage(opCode).feasibleSlots[s]; } - + inline int getLongestIssueConflict () const { return longestIssueConflict; } @@ -229,15 +229,15 @@ inline bool isSingleIssue (MachineOpCode opCode) const { return getInstrRUsage(opCode).isSingleIssue; } - + inline bool breaksIssueGroup (MachineOpCode opCode) const { return getInstrRUsage(opCode).breaksGroup; } - + inline unsigned numBubblesAfter (MachineOpCode opCode) const { return getInstrRUsage(opCode).numBubbles; } - + inline unsigned getCPUResourceNum(int rd)const{ for(unsigned i=0;i& instrRUForClasses); void computeIssueGaps(const std::vector& instrRUForClasses); - + void setGap(int gap, MachineOpCode fromOp, MachineOpCode toOp) { std::vector& toGaps = issueGaps[fromOp]; if (toOp >= (int) toGaps.size()) toGaps.resize(toOp+1); toGaps[toOp] = gap; } - + public: std::vector > resourceNumVector; - + protected: unsigned numSchedClasses; const TargetInstrInfo* mii; @@ -272,7 +272,7 @@ const InstrIssueDelta* issueDeltas; // raw array [1:numIssueDeltas] unsigned numUsageDeltas; unsigned numIssueDeltas; - + std::vector instrRUsages; // indexed by opcode std::vector > issueGaps; // indexed by [opcode1][opcode2] std::vector > @@ -281,7 +281,7 @@ friend class ModuloSchedulingPass; friend class MSSchedule; - + }; } // End llvm namespace From brukman at cs.uiuc.edu Thu Apr 21 15:57:43 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:57:43 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Transforms/Instrumentation.h IPO.h LinkAllPasses.h Scalar.h Message-ID: <200504212057.PAA01430@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Transforms: Instrumentation.h updated: 1.7 -> 1.8 IPO.h updated: 1.41 -> 1.42 LinkAllPasses.h updated: 1.17 -> 1.18 Scalar.h updated: 1.55 -> 1.56 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+11 -11) IPO.h | 6 +++--- Instrumentation.h | 4 ++-- LinkAllPasses.h | 4 ++-- Scalar.h | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) Index: llvm/include/llvm/Transforms/Instrumentation.h diff -u llvm/include/llvm/Transforms/Instrumentation.h:1.7 llvm/include/llvm/Transforms/Instrumentation.h:1.8 --- llvm/include/llvm/Transforms/Instrumentation.h:1.7 Fri Jan 7 00:57:28 2005 +++ llvm/include/llvm/Transforms/Instrumentation.h Thu Apr 21 15:57:32 2005 @@ -1,10 +1,10 @@ //===- Transforms/Instrumentation.h - Instrumentation passes ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This files defines constructor functions for instrumentation passes. Index: llvm/include/llvm/Transforms/IPO.h diff -u llvm/include/llvm/Transforms/IPO.h:1.41 llvm/include/llvm/Transforms/IPO.h:1.42 --- llvm/include/llvm/Transforms/IPO.h:1.41 Sun Jan 9 22:23:32 2005 +++ llvm/include/llvm/Transforms/IPO.h Thu Apr 21 15:57:32 2005 @@ -1,10 +1,10 @@ //===- llvm/Transforms/IPO.h - Interprocedural Transformations --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header file defines prototypes for accessor functions that expose passes @@ -77,7 +77,7 @@ //===----------------------------------------------------------------------===// -/// createFunctionExtractionPass - If deleteFn is true, this pass deletes as +/// createFunctionExtractionPass - If deleteFn is true, this pass deletes as /// the specified function. Otherwise, it deletes as much of the module as /// possible, except for the function specified. /// Index: llvm/include/llvm/Transforms/LinkAllPasses.h diff -u llvm/include/llvm/Transforms/LinkAllPasses.h:1.17 llvm/include/llvm/Transforms/LinkAllPasses.h:1.18 --- llvm/include/llvm/Transforms/LinkAllPasses.h:1.17 Fri Apr 15 16:13:16 2005 +++ llvm/include/llvm/Transforms/LinkAllPasses.h Thu Apr 21 15:57:32 2005 @@ -1,10 +1,10 @@ //===- llvm/Transforms/LinkAllPasses.h - Reference All Passes ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by Jeff Cohen and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header file is required for building with Microsoft's VC++, as it has Index: llvm/include/llvm/Transforms/Scalar.h diff -u llvm/include/llvm/Transforms/Scalar.h:1.55 llvm/include/llvm/Transforms/Scalar.h:1.56 --- llvm/include/llvm/Transforms/Scalar.h:1.55 Fri Apr 15 14:24:49 2005 +++ llvm/include/llvm/Transforms/Scalar.h Thu Apr 21 15:57:32 2005 @@ -1,10 +1,10 @@ //===-- Scalar.h - Scalar Transformations -----------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This header file defines prototypes for accessor functions that expose passes @@ -231,7 +231,7 @@ extern const PassInfo *LoopSimplifyID; //===----------------------------------------------------------------------===// -// +// // This pass eliminates call instructions to the current function which occur // immediately before return instructions. // @@ -274,7 +274,7 @@ FunctionPass *createLowerInvokePass(); extern const PassInfo *LowerInvokePassID; - + //===----------------------------------------------------------------------===// /// createLowerGCPass - This function returns an instance of the "lowergc" /// pass, which lowers garbage collection intrinsics to normal LLVM code. From brukman at cs.uiuc.edu Thu Apr 21 15:59:16 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 15:59:16 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h Cloning.h FunctionUtils.h Local.h PromoteMemToReg.h UnifyFunctionExitNodes.h Message-ID: <200504212059.PAA01490@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Transforms/Utils: BasicBlockUtils.h updated: 1.8 -> 1.9 Cloning.h updated: 1.15 -> 1.16 FunctionUtils.h updated: 1.7 -> 1.8 Local.h updated: 1.17 -> 1.18 PromoteMemToReg.h updated: 1.7 -> 1.8 UnifyFunctionExitNodes.h updated: 1.18 -> 1.19 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+17 -17) BasicBlockUtils.h | 4 ++-- Cloning.h | 12 ++++++------ FunctionUtils.h | 6 +++--- Local.h | 4 ++-- PromoteMemToReg.h | 4 ++-- UnifyFunctionExitNodes.h | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) Index: llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h diff -u llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h:1.8 llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h:1.9 --- llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h:1.8 Tue Nov 11 16:41:31 2003 +++ llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h Thu Apr 21 15:59:05 2005 @@ -1,10 +1,10 @@ //===-- Transform/Utils/BasicBlockUtils.h - BasicBlock Utils ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This family of functions perform manipulations on basic blocks, and Index: llvm/include/llvm/Transforms/Utils/Cloning.h diff -u llvm/include/llvm/Transforms/Utils/Cloning.h:1.15 llvm/include/llvm/Transforms/Utils/Cloning.h:1.16 --- llvm/include/llvm/Transforms/Utils/Cloning.h:1.15 Wed May 19 14:17:48 2004 +++ llvm/include/llvm/Transforms/Utils/Cloning.h Thu Apr 21 15:59:05 2005 @@ -1,10 +1,10 @@ //===- Cloning.h - Clone various parts of LLVM programs ---------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines various functions that are used to clone chunks of LLVM @@ -108,7 +108,7 @@ /// this call. The program is still in a well defined state if this occurs /// though. /// -/// Note that this only does one level of inlining. For example, if the +/// Note that this only does one level of inlining. For example, if the /// instruction 'call B' is inlined, and 'B' calls 'C', then the call to 'C' now /// exists in the instruction stream. Similiarly this will inline a recursive /// function by one level. @@ -117,9 +117,9 @@ bool InlineFunction(InvokeInst *II); bool InlineFunction(CallSite CS); -/// CloneTrace - Returns a copy of the specified trace. -/// It takes a vector of basic blocks clones the basic blocks, removes internal -/// phi nodes, adds it to the same function as the original (although there is +/// CloneTrace - Returns a copy of the specified trace. +/// It takes a vector of basic blocks clones the basic blocks, removes internal +/// phi nodes, adds it to the same function as the original (although there is /// no jump to it) and returns the new vector of basic blocks. std::vector CloneTrace(const std::vector &origTrace); Index: llvm/include/llvm/Transforms/Utils/FunctionUtils.h diff -u llvm/include/llvm/Transforms/Utils/FunctionUtils.h:1.7 llvm/include/llvm/Transforms/Utils/FunctionUtils.h:1.8 --- llvm/include/llvm/Transforms/Utils/FunctionUtils.h:1.7 Wed Oct 27 11:14:51 2004 +++ llvm/include/llvm/Transforms/Utils/FunctionUtils.h Thu Apr 21 15:59:05 2005 @@ -1,10 +1,10 @@ //===-- Transform/Utils/FunctionUtils.h - Function Utils --------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This family of transformations manipulate LLVM functions. @@ -21,7 +21,7 @@ struct DominatorSet; class Function; class Loop; - + /// ExtractCodeRegion - rip out a sequence of basic blocks into a new function /// Function* ExtractCodeRegion(DominatorSet &DS, Index: llvm/include/llvm/Transforms/Utils/Local.h diff -u llvm/include/llvm/Transforms/Utils/Local.h:1.17 llvm/include/llvm/Transforms/Utils/Local.h:1.18 --- llvm/include/llvm/Transforms/Utils/Local.h:1.17 Tue Apr 13 14:28:32 2004 +++ llvm/include/llvm/Transforms/Utils/Local.h Thu Apr 21 15:59:05 2005 @@ -1,10 +1,10 @@ //===-- Local.h - Functions to perform local transformations ----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This family of functions perform various local transformations to the Index: llvm/include/llvm/Transforms/Utils/PromoteMemToReg.h diff -u llvm/include/llvm/Transforms/Utils/PromoteMemToReg.h:1.7 llvm/include/llvm/Transforms/Utils/PromoteMemToReg.h:1.8 --- llvm/include/llvm/Transforms/Utils/PromoteMemToReg.h:1.7 Wed Oct 27 11:14:51 2004 +++ llvm/include/llvm/Transforms/Utils/PromoteMemToReg.h Thu Apr 21 15:59:05 2005 @@ -1,10 +1,10 @@ //===- PromoteMemToReg.h - Promote Allocas to Scalars -----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file exposes an interface to promote alloca instructions to SSA Index: llvm/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h diff -u llvm/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h:1.18 llvm/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h:1.19 --- llvm/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h:1.18 Sat Oct 16 13:06:43 2004 +++ llvm/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h Thu Apr 21 15:59:05 2005 @@ -1,10 +1,10 @@ //===-- UnifyFunctionExitNodes.h - Ensure fn's have one return --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This pass is used to ensure that functions have at most one return and one From brukman at cs.uiuc.edu Thu Apr 21 16:05:10 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 16:05:10 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/AliasAnalysisCounter.cpp AliasAnalysis.cpp AliasAnalysisEvaluator.cpp AliasSetTracker.cpp BasicAliasAnalysis.cpp CFGPrinter.cpp Expressions.cpp InstCount.cpp Interval.cpp IntervalPartition.cpp LoadValueNumbering.cpp LoopInfo.cpp PostDominators.cpp ProfileInfo.cpp ProfileInfoLoader.cpp ProfileInfoLoaderPass.cpp ScalarEvolution.cpp ValueNumbering.cpp Message-ID: <200504212105.QAA03108@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: AliasAnalysisCounter.cpp updated: 1.12 -> 1.13 AliasAnalysis.cpp updated: 1.25 -> 1.26 AliasAnalysisEvaluator.cpp updated: 1.26 -> 1.27 AliasSetTracker.cpp updated: 1.35 -> 1.36 BasicAliasAnalysis.cpp updated: 1.65 -> 1.66 CFGPrinter.cpp updated: 1.11 -> 1.12 Expressions.cpp updated: 1.43 -> 1.44 InstCount.cpp updated: 1.11 -> 1.12 Interval.cpp updated: 1.16 -> 1.17 IntervalPartition.cpp updated: 1.28 -> 1.29 LoadValueNumbering.cpp updated: 1.30 -> 1.31 LoopInfo.cpp updated: 1.61 -> 1.62 PostDominators.cpp updated: 1.50 -> 1.51 ProfileInfo.cpp updated: 1.6 -> 1.7 ProfileInfoLoader.cpp updated: 1.7 -> 1.8 ProfileInfoLoaderPass.cpp updated: 1.11 -> 1.12 ScalarEvolution.cpp updated: 1.37 -> 1.38 ValueNumbering.cpp updated: 1.14 -> 1.15 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+203 -203) AliasAnalysis.cpp | 4 - AliasAnalysisCounter.cpp | 16 +++---- AliasAnalysisEvaluator.cpp | 34 ++++++++-------- AliasSetTracker.cpp | 10 ++-- BasicAliasAnalysis.cpp | 70 +++++++++++++++++----------------- CFGPrinter.cpp | 12 ++--- Expressions.cpp | 22 +++++----- InstCount.cpp | 10 ++-- Interval.cpp | 6 +- IntervalPartition.cpp | 6 +- LoadValueNumbering.cpp | 28 ++++++------- LoopInfo.cpp | 26 ++++++------ PostDominators.cpp | 16 +++---- ProfileInfo.cpp | 6 +- ProfileInfoLoader.cpp | 22 +++++----- ProfileInfoLoaderPass.cpp | 8 +-- ScalarEvolution.cpp | 92 ++++++++++++++++++++++----------------------- ValueNumbering.cpp | 18 ++++---- 18 files changed, 203 insertions(+), 203 deletions(-) Index: llvm/lib/Analysis/AliasAnalysisCounter.cpp diff -u llvm/lib/Analysis/AliasAnalysisCounter.cpp:1.12 llvm/lib/Analysis/AliasAnalysisCounter.cpp:1.13 --- llvm/lib/Analysis/AliasAnalysisCounter.cpp:1.12 Wed Mar 23 15:59:07 2005 +++ llvm/lib/Analysis/AliasAnalysisCounter.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- AliasAnalysisCounter.cpp - Alias Analysis Query Counter ------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements a pass which can be used to count how many alias queries @@ -67,7 +67,7 @@ printLine("mod/ref", MR, MRSum); std::cerr << " Mod/Ref Analysis Counter Summary: " << NoMR*100/MRSum<< "%/" - << JustRef*100/MRSum << "%/" << JustMod*100/MRSum << "%/" + << JustRef*100/MRSum << "%/" << JustMod*100/MRSum << "%/" << MR*100/MRSum <<"%\n\n"; } } @@ -96,8 +96,8 @@ bool onlyReadsMemory(Function *F) { return getAnalysis().onlyReadsMemory(F); } - - + + // Forwarding functions: just delegate to a real AA implementation, counting // the number of responses... AliasResult alias(const Value *V1, unsigned V1Size, @@ -118,11 +118,11 @@ return new AliasAnalysisCounter(); } -AliasAnalysis::AliasResult +AliasAnalysis::AliasResult AliasAnalysisCounter::alias(const Value *V1, unsigned V1Size, const Value *V2, unsigned V2Size) { AliasResult R = getAnalysis().alias(V1, V1Size, V2, V2Size); - + const char *AliasString; switch (R) { default: assert(0 && "Unknown alias type!"); @@ -142,7 +142,7 @@ return R; } -AliasAnalysis::ModRefResult +AliasAnalysis::ModRefResult AliasAnalysisCounter::getModRefInfo(CallSite CS, Value *P, unsigned Size) { ModRefResult R = getAnalysis().getModRefInfo(CS, P, Size); Index: llvm/lib/Analysis/AliasAnalysis.cpp diff -u llvm/lib/Analysis/AliasAnalysis.cpp:1.25 llvm/lib/Analysis/AliasAnalysis.cpp:1.26 --- llvm/lib/Analysis/AliasAnalysis.cpp:1.25 Wed Mar 23 17:26:58 2005 +++ llvm/lib/Analysis/AliasAnalysis.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- AliasAnalysis.cpp - Generic Alias Analysis Interface Implementation -==// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the generic AliasAnalysis interface which is used as the Index: llvm/lib/Analysis/AliasAnalysisEvaluator.cpp diff -u llvm/lib/Analysis/AliasAnalysisEvaluator.cpp:1.26 llvm/lib/Analysis/AliasAnalysisEvaluator.cpp:1.27 --- llvm/lib/Analysis/AliasAnalysisEvaluator.cpp:1.26 Tue Mar 29 11:44:52 2005 +++ llvm/lib/Analysis/AliasAnalysisEvaluator.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- AliasAnalysisEvaluator.cpp - Alias Analysis Accuracy Evaluator -----===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements a simple N^2 alias analysis accuracy evaluator. @@ -54,16 +54,16 @@ AU.addRequired(); AU.setPreservesAll(); } - - bool doInitialization(Module &M) { - NoAlias = MayAlias = MustAlias = 0; + + bool doInitialization(Module &M) { + NoAlias = MayAlias = MustAlias = 0; NoModRef = Mod = Ref = ModRef = 0; if (PrintAll) { PrintNoAlias = PrintMayAlias = PrintMustAlias = true; PrintNoModRef = PrintMod = PrintRef = PrintModRef = true; } - return false; + return false; } bool runOnFunction(Function &F); @@ -85,7 +85,7 @@ } } -static inline void +static inline void PrintModRefResults(const char *Msg, bool P, Instruction *I, Value *Ptr, Module *M) { if (P) { @@ -99,7 +99,7 @@ AliasAnalysis &AA = getAnalysis(); const TargetData &TD = AA.getTargetData(); - + std::set Pointers; std::set CallSites; @@ -157,16 +157,16 @@ } // Mod/ref alias analysis: compare all pairs of calls and values - for (std::set::iterator C = CallSites.begin(), + for (std::set::iterator C = CallSites.begin(), Ce = CallSites.end(); C != Ce; ++C) { Instruction *I = C->getInstruction(); - + for (std::set::iterator V = Pointers.begin(), Ve = Pointers.end(); V != Ve; ++V) { unsigned Size = 0; const Type *ElTy = cast((*V)->getType())->getElementType(); if (ElTy->isSized()) Size = TD.getTypeSize(ElTy); - + switch (AA.getModRefInfo(*C, *V, Size)) { case AliasAnalysis::NoModRef: PrintModRefResults("NoModRef", PrintNoModRef, I, *V, F.getParent()); @@ -185,7 +185,7 @@ } } } - + return false; } @@ -199,7 +199,7 @@ std::cerr << "===== Alias Analysis Evaluator Report =====\n"; if (AliasSum == 0) { std::cerr << " Alias Analysis Evaluator Summary: No pointers!\n"; - } else { + } else { std::cerr << " " << AliasSum << " Total Alias Queries Performed\n"; std::cerr << " " << NoAlias << " no alias responses "; PrintPercent(NoAlias, AliasSum); @@ -207,8 +207,8 @@ PrintPercent(MayAlias, AliasSum); std::cerr << " " << MustAlias << " must alias responses "; PrintPercent(MustAlias, AliasSum); - std::cerr << " Alias Analysis Evaluator Pointer Alias Summary: " - << NoAlias*100/AliasSum << "%/" << MayAlias*100/AliasSum << "%/" + std::cerr << " Alias Analysis Evaluator Pointer Alias Summary: " + << NoAlias*100/AliasSum << "%/" << MayAlias*100/AliasSum << "%/" << MustAlias*100/AliasSum << "%\n"; } @@ -226,8 +226,8 @@ PrintPercent(Ref, ModRefSum); std::cerr << " " << ModRef << " mod & ref responses "; PrintPercent(ModRef, ModRefSum); - std::cerr << " Alias Analysis Evaluator Mod/Ref Summary: " - << NoModRef*100/ModRefSum << "%/" << Mod*100/ModRefSum << "%/" + std::cerr << " Alias Analysis Evaluator Mod/Ref Summary: " + << NoModRef*100/ModRefSum << "%/" << Mod*100/ModRefSum << "%/" << Ref*100/ModRefSum << "%/" << ModRef*100/ModRefSum << "%\n"; } Index: llvm/lib/Analysis/AliasSetTracker.cpp diff -u llvm/lib/Analysis/AliasSetTracker.cpp:1.35 llvm/lib/Analysis/AliasSetTracker.cpp:1.36 --- llvm/lib/Analysis/AliasSetTracker.cpp:1.35 Thu Mar 24 23:49:37 2005 +++ llvm/lib/Analysis/AliasSetTracker.cpp Thu Apr 21 16:04:58 2005 @@ -1,14 +1,14 @@ //===- AliasSetTracker.cpp - Alias Sets Tracker implementation-------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the AliasSetTracker and AliasSet classes. -// +// //===----------------------------------------------------------------------===// #include "llvm/Analysis/AliasSetTracker.h" @@ -53,7 +53,7 @@ CallSites.insert(CallSites.end(), AS.CallSites.begin(), AS.CallSites.end()); AS.CallSites.clear(); } - + AS.Forward = this; // Forward across AS now... addRef(); // AS is now pointing to us... @@ -506,7 +506,7 @@ for (unsigned i = 0, e = CallSites.size(); i != e; ++i) { if (i) OS << ", "; WriteAsOperand(OS, CallSites[i].getCalledValue()); - } + } } OS << "\n"; } Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp diff -u llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.65 llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.66 --- llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.65 Wed Mar 9 10:29:52 2005 +++ llvm/lib/Analysis/BasicAliasAnalysis.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- BasicAliasAnalysis.cpp - Local Alias Analysis Impl -----------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the default implementation of the Alias Analysis interface @@ -39,7 +39,7 @@ virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); } - + virtual void initializePass() { TD = &getAnalysis(); } @@ -53,7 +53,7 @@ std::vector *Info) { return UnknownModRefBehavior; } - + virtual void getArgumentAccesses(Function *F, CallSite CS, std::vector &Info) { assert(0 && "This method may not be called on this function!"); @@ -72,7 +72,7 @@ virtual void deleteValue(Value *V) {} virtual void copyValue(Value *From, Value *To) {} }; - + // Register this pass... RegisterOpt U("no-aa", "No Alias Analysis (always returns 'may' alias)"); @@ -106,7 +106,7 @@ virtual ModRefBehavior getModRefBehavior(Function *F, CallSite CS, std::vector *Info); - + private: // CheckGEPInstructions - Check two GEP instructions with known // must-aliasing base pointers. This checks to see if the index expressions @@ -117,7 +117,7 @@ const Type *BasePtr2Ty, std::vector &GEP2Ops, unsigned G2Size); }; - + // Register this pass... RegisterOpt X("basicaa", "Basic Alias Analysis (default AA impl)"); @@ -144,7 +144,7 @@ // If we are at some type of object... return it. if (hasUniqueAddress(V) || isa(V)) return V; - + // Traverse through different addressing mechanisms... if (const Instruction *I = dyn_cast(V)) { if (isa(I) || isa(I)) @@ -307,7 +307,7 @@ if (!isa(O1) && isa(V2)) return NoAlias; // Unique values don't alias null - if (isa(O1) || + if (isa(O1) || (isa(O1) && !cast(O1)->isArrayAllocation())) if (cast(O1->getType())->getElementType()->isSized()) { @@ -351,12 +351,12 @@ do { BasePtr1 = cast(BasePtr1)->getOperand(0); } while (isGEP(BasePtr1) && - cast(BasePtr1)->getOperand(1) == + cast(BasePtr1)->getOperand(1) == Constant::getNullValue(cast(BasePtr1)->getOperand(1)->getType())); do { BasePtr2 = cast(BasePtr2)->getOperand(0); } while (isGEP(BasePtr2) && - cast(BasePtr2)->getOperand(1) == + cast(BasePtr2)->getOperand(1) == Constant::getNullValue(cast(BasePtr2)->getOperand(1)->getType())); // Do the base pointers alias? @@ -423,7 +423,7 @@ if (ConstantFound) { if (V2Size <= 1 && V1Size <= 1) // Just pointer check? return NoAlias; - + // Otherwise we have to check to see that the distance is more than // the size of the argument... build an index vector that is equal to // the arguments provided, except substitute 0's for any variable @@ -443,7 +443,7 @@ } } } - + return MayAlias; } @@ -503,7 +503,7 @@ // If so, return mustalias. if (UnequalOper == MinOperands) { if (GEP1Ops.size() < GEP2Ops.size()) std::swap(GEP1Ops, GEP2Ops); - + bool AllAreZeros = true; for (unsigned i = UnequalOper; i != MaxOperands; ++i) if (!isa(GEP1Ops[i]) || @@ -514,7 +514,7 @@ if (AllAreZeros) return MustAlias; } - + // So now we know that the indexes derived from the base pointers, // which are known to alias, are different. We can still determine a // no-alias result if there are differing constant pairs in the index @@ -530,7 +530,7 @@ for (; FirstConstantOper != MinOperands; ++FirstConstantOper) { const Value *G1Oper = GEP1Ops[FirstConstantOper]; const Value *G2Oper = GEP2Ops[FirstConstantOper]; - + if (G1Oper != G2Oper) // Found non-equal constant indexes... if (Constant *G1OC = dyn_cast(const_cast(G1Oper))) if (Constant *G2OC = dyn_cast(const_cast(G2Oper))){ @@ -555,7 +555,7 @@ } BasePtr1Ty = cast(BasePtr1Ty)->getTypeAtIndex(G1Oper); } - + // No shared constant operands, and we ran out of common operands. At this // point, the GEP instructions have run through all of their operands, and we // haven't found evidence that there are any deltas between the GEP's. @@ -585,13 +585,13 @@ // Now crop off any constants from the end... GEP1Ops.resize(MinOperands); int64_t Offset2 = TD.getIndexedOffset(GEPPointerTy, GEP1Ops); - + // If the tail provided a bit enough offset, return noalias! if ((uint64_t)(Offset2-Offset1) >= SizeMax) return NoAlias; } } - + // Couldn't find anything useful. return MayAlias; } @@ -604,7 +604,7 @@ // Advance BasePtr[12]Ty over this first differing constant operand. BasePtr2Ty = cast(BasePtr1Ty)->getTypeAtIndex(GEP2Ops[FirstConstantOper]); BasePtr1Ty = cast(BasePtr1Ty)->getTypeAtIndex(GEP1Ops[FirstConstantOper]); - + // We are going to be using TargetData::getIndexedOffset to determine the // offset that each of the GEP's is reaching. To do this, we have to convert // all variable references to constant references. To do this, we convert the @@ -614,7 +614,7 @@ GEP1Ops[i] = GEP2Ops[i] = Constant::getNullValue(Type::UIntTy); // We know that GEP1Ops[FirstConstantOper] & GEP2Ops[FirstConstantOper] are ok - + // Loop over the rest of the operands... for (unsigned i = FirstConstantOper+1; i != MaxOperands; ++i) { const Value *Op1 = i < GEP1Ops.size() ? GEP1Ops[i] : 0; @@ -631,7 +631,7 @@ if (const ArrayType *AT = dyn_cast(BasePtr1Ty)) if (Op1C->getRawValue() >= AT->getNumElements()) return MayAlias; // Be conservative with out-of-range accesses - + } else { // GEP1 is known to produce a value less than GEP2. To be // conservatively correct, we must assume the largest possible @@ -647,7 +647,7 @@ GEP1Ops[i] = ConstantSInt::get(Type::LongTy,AT->getNumElements()-1); } } - + if (Op2) { if (const ConstantInt *Op2C = dyn_cast(Op2)) { // If this is an array index, make sure the array element is in range. @@ -674,14 +674,14 @@ BasePtr2Ty = 0; } } - + if (GEPPointerTy->getElementType()->isSized()) { int64_t Offset1 = getTargetData().getIndexedOffset(GEPPointerTy, GEP1Ops); int64_t Offset2 = getTargetData().getIndexedOffset(GEPPointerTy, GEP2Ops); assert(Offset1= SizeMax) { - //std::cerr << "Determined that these two GEP's don't alias [" + //std::cerr << "Determined that these two GEP's don't alias [" // << SizeMax << " bytes]: \n" << *GEP1 << *GEP2; return NoAlias; } @@ -706,11 +706,11 @@ "abs", "labs", "llabs", "imaxabs", "fabs", "fabsf", "fabsl", "trunc", "truncf", "truncl", "ldexp", - + "atan", "atanf", "atanl", "atan2", "atan2f", "atan2l", "cbrt", "cos", "cosf", "cosl", "cosh", "coshf", "coshl", - "exp", "expf", "expl", + "exp", "expf", "expl", "hypot", "sin", "sinf", "sinl", "sinh", "sinhf", "sinhl", "tan", "tanf", "tanl", "tanh", "tanhf", "tanhl", @@ -723,9 +723,9 @@ "iswalnum", "iswalpha", "iswcntrl", "iswdigit", "iswgraph", "iswlower", "iswprint", "iswpunct", "iswspace", "iswupper", "iswxdigit", - "iswctype", "towctrans", "towlower", "towupper", + "iswctype", "towctrans", "towlower", "towupper", - "btowc", "wctob", + "btowc", "wctob", "isinf", "isnan", "finite", @@ -744,16 +744,16 @@ static const char *OnlyReadsMemoryTable[] = { "atoi", "atol", "atof", "atoll", "atoq", "a64l", - "bcmp", "memcmp", "memchr", "memrchr", "wmemcmp", "wmemchr", + "bcmp", "memcmp", "memchr", "memrchr", "wmemcmp", "wmemchr", // Strings "strcmp", "strcasecmp", "strcoll", "strncmp", "strncasecmp", - "strchr", "strcspn", "strlen", "strpbrk", "strrchr", "strspn", "strstr", + "strchr", "strcspn", "strlen", "strpbrk", "strrchr", "strspn", "strstr", "index", "rindex", // Wide char strings "wcschr", "wcscmp", "wcscoll", "wcscspn", "wcslen", "wcsncmp", "wcspbrk", - "wcsrchr", "wcsspn", "wcsstr", + "wcsrchr", "wcsspn", "wcsstr", // glibc "alphasort", "alphasort64", "versionsort", "versionsort64", @@ -768,8 +768,8 @@ static const unsigned ORMTableSize = sizeof(OnlyReadsMemoryTable)/sizeof(OnlyReadsMemoryTable[0]); - -AliasAnalysis::ModRefBehavior + +AliasAnalysis::ModRefBehavior BasicAliasAnalysis::getModRefBehavior(Function *F, CallSite CS, std::vector *Info) { if (!F->isExternal()) return UnknownModRefBehavior; @@ -789,7 +789,7 @@ F->getName().c_str(), StringCompare()); if (Ptr != DoesntAccessMemoryTable+DAMTableSize && *Ptr == F->getName()) return DoesNotAccessMemory; - + Ptr = std::lower_bound(OnlyReadsMemoryTable, OnlyReadsMemoryTable+ORMTableSize, F->getName().c_str(), StringCompare()); Index: llvm/lib/Analysis/CFGPrinter.cpp diff -u llvm/lib/Analysis/CFGPrinter.cpp:1.11 llvm/lib/Analysis/CFGPrinter.cpp:1.12 --- llvm/lib/Analysis/CFGPrinter.cpp:1.11 Mon Dec 6 22:03:45 2004 +++ llvm/lib/Analysis/CFGPrinter.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- CFGPrinter.cpp - DOT printer for the control flow graph ------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a '-print-cfg' analysis pass, which emits the @@ -92,7 +92,7 @@ std::string Filename = "cfg." + F.getName() + ".dot"; std::cerr << "Writing '" << Filename << "'..."; std::ofstream File(Filename.c_str()); - + if (File.good()) WriteGraph(File, (const Function*)&F); else @@ -102,7 +102,7 @@ } void print(std::ostream &OS, const Module* = 0) const {} - + virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } @@ -120,7 +120,7 @@ return false; } void print(std::ostream &OS, const Module* = 0) const {} - + virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } @@ -140,7 +140,7 @@ std::string Filename = "/tmp/cfg." + getName() + ".dot"; std::cerr << "Writing '" << Filename << "'... "; std::ofstream F(Filename.c_str()); - + if (!F.good()) { std::cerr << " error opening file for writing!\n"; return; Index: llvm/lib/Analysis/Expressions.cpp diff -u llvm/lib/Analysis/Expressions.cpp:1.43 llvm/lib/Analysis/Expressions.cpp:1.44 --- llvm/lib/Analysis/Expressions.cpp:1.43 Sun Jul 4 07:19:55 2004 +++ llvm/lib/Analysis/Expressions.cpp Thu Apr 21 16:04:58 2005 @@ -1,16 +1,16 @@ //===- Expressions.cpp - Expression Analysis Utilities --------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a package of expression analysis utilties: // // ClassifyExpression: Analyze an expression to determine the complexity of the -// expression, and which other variables it depends on. +// expression, and which other variables it depends on. // //===----------------------------------------------------------------------===// @@ -23,7 +23,7 @@ using namespace llvm; ExprType::ExprType(Value *Val) { - if (Val) + if (Val) if (ConstantInt *CPI = dyn_cast(Val)) { Offset = CPI; Var = 0; @@ -37,7 +37,7 @@ Scale = 0; } -ExprType::ExprType(const ConstantInt *scale, Value *var, +ExprType::ExprType(const ConstantInt *scale, Value *var, const ConstantInt *offset) { Scale = var ? scale : 0; Var = var; Offset = offset; ExprTy = Scale ? ScaledLinear : (Var ? Linear : Constant); @@ -67,12 +67,12 @@ inline operator const ConstantInt * () const { return Val; } inline const ConstantInt *operator->() const { return Val; } }; - + struct DefZero : public DefVal { inline DefZero(const ConstantInt *val, const Type *ty) : DefVal(val, ty) {} inline DefZero(const ConstantInt *val) : DefVal(val, val->getType()) {} }; - + struct DefOne : public DefVal { inline DefOne(const ConstantInt *val, const Type *ty) : DefVal(val, ty) {} }; @@ -160,7 +160,7 @@ // 3. If DefOne is true, a null return value indicates a value of 1, if DefOne // is false, a null return value indicates a value of 0. // -static inline const ConstantInt *Mul(const ConstantInt *Arg1, +static inline const ConstantInt *Mul(const ConstantInt *Arg1, const ConstantInt *Arg2, bool DefOne) { assert(Arg1 && Arg2 && "No null arguments should exist now!"); assert(Arg1->getType() == Arg2->getType() && "Types must be compatible!"); @@ -168,7 +168,7 @@ // Actually perform the computation now! Constant *Result = ConstantExpr::get(Instruction::Mul, (Constant*)Arg1, (Constant*)Arg2); - assert(Result && Result->getType() == Arg1->getType() && + assert(Result && Result->getType() == Arg1->getType() && "Couldn't perform multiplication!"); ConstantInt *ResultI = cast(Result); @@ -257,7 +257,7 @@ return Expr; } - + Instruction *I = cast(Expr); const Type *Ty = I->getType(); @@ -277,7 +277,7 @@ return handleAddition(Left, RightNeg, I); } // end case Instruction::Sub - case Instruction::Shl: { + case Instruction::Shl: { ExprType Right(ClassifyExpr(I->getOperand(1))); if (Right.ExprTy != ExprType::Constant) break; ExprType Left(ClassifyExpr(I->getOperand(0))); Index: llvm/lib/Analysis/InstCount.cpp diff -u llvm/lib/Analysis/InstCount.cpp:1.11 llvm/lib/Analysis/InstCount.cpp:1.12 --- llvm/lib/Analysis/InstCount.cpp:1.11 Mon Mar 21 21:55:10 2005 +++ llvm/lib/Analysis/InstCount.cpp Thu Apr 21 16:04:58 2005 @@ -1,13 +1,13 @@ //===-- InstCount.cpp - Collects the count of all instructions ------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This pass collects the count of all instructions and reports them +// This pass collects the count of all instructions and reports them // //===----------------------------------------------------------------------===// @@ -62,11 +62,11 @@ // bool InstCount::runOnFunction(Function &F) { unsigned StartMemInsts = - NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst + + NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst + NumInvokeInst + NumAllocaInst + NumMallocInst + NumFreeInst; visit(F); unsigned EndMemInsts = - NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst + + NumGetElementPtrInst + NumLoadInst + NumStoreInst + NumCallInst + NumInvokeInst + NumAllocaInst + NumMallocInst + NumFreeInst; TotalMemInst += EndMemInsts-StartMemInsts; return false; Index: llvm/lib/Analysis/Interval.cpp diff -u llvm/lib/Analysis/Interval.cpp:1.16 llvm/lib/Analysis/Interval.cpp:1.17 --- llvm/lib/Analysis/Interval.cpp:1.16 Wed Jul 14 21:31:42 2004 +++ llvm/lib/Analysis/Interval.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- Interval.cpp - Interval class code ---------------------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the definition of the Interval class, which represents a @@ -39,7 +39,7 @@ void Interval::print(std::ostream &o) const { o << "-------------------------------------------------------------\n" << "Interval Contents:\n"; - + // Print out all of the basic blocks in the interval... for (std::vector::const_iterator I = Nodes.begin(), E = Nodes.end(); I != E; ++I) Index: llvm/lib/Analysis/IntervalPartition.cpp diff -u llvm/lib/Analysis/IntervalPartition.cpp:1.28 llvm/lib/Analysis/IntervalPartition.cpp:1.29 --- llvm/lib/Analysis/IntervalPartition.cpp:1.28 Tue Feb 22 17:27:21 2005 +++ llvm/lib/Analysis/IntervalPartition.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- IntervalPartition.cpp - Interval Partition module code -------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the definition of the IntervalPartition class, which @@ -55,7 +55,7 @@ // void IntervalPartition::updatePredecessors(Interval *Int) { BasicBlock *Header = Int->getHeaderNode(); - for (Interval::succ_iterator I = Int->Successors.begin(), + for (Interval::succ_iterator I = Int->Successors.begin(), E = Int->Successors.end(); I != E; ++I) getBlockInterval(*I)->Predecessors.push_back(Header); } Index: llvm/lib/Analysis/LoadValueNumbering.cpp diff -u llvm/lib/Analysis/LoadValueNumbering.cpp:1.30 llvm/lib/Analysis/LoadValueNumbering.cpp:1.31 --- llvm/lib/Analysis/LoadValueNumbering.cpp:1.30 Sat Jan 29 01:04:10 2005 +++ llvm/lib/Analysis/LoadValueNumbering.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- LoadValueNumbering.cpp - Load Value #'ing Implementation -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements a value numbering pass that value numbers load and call @@ -39,16 +39,16 @@ namespace { // FIXME: This should not be a FunctionPass. struct LoadVN : public FunctionPass, public ValueNumbering { - + /// Pass Implementation stuff. This doesn't do any analysis. /// bool runOnFunction(Function &) { return false; } - + /// getAnalysisUsage - Does not modify anything. It uses Value Numbering /// and Alias Analysis. /// virtual void getAnalysisUsage(AnalysisUsage &AU) const; - + /// getEqualNumberNodes - Return nodes with the same value number as the /// specified Value. This fills in the argument vector with any equal /// values. @@ -63,7 +63,7 @@ virtual void deleteValue(Value *V) { getAnalysis().deleteValue(V); } - + /// copyValue - This method should be used whenever a preexisting value in /// the program is copied or cloned, introducing a new value. Note that /// analysis implementations should tolerate clients that use this method to @@ -109,7 +109,7 @@ // stop searching, returning success. if (CurBlock == Dom || !Visited.insert(CurBlock).second) return true; - + // Check whether this block is known transparent or not. std::map::iterator TBI = TransparentBlocks.lower_bound(CurBlock); @@ -125,7 +125,7 @@ } else if (!TBI->second) // This block is known non-transparent, so that path can't be either. return false; - + // The current block is known to be transparent. The entire path is // transparent if all of the predecessors paths to the parent is also // transparent to the memory location. @@ -180,7 +180,7 @@ if (AllOperandsEqual) IdenticalCalls.push_back(C); } - + if (IdenticalCalls.empty()) return; // Eliminate duplicates, which could occur if we chose a value that is passed @@ -212,7 +212,7 @@ Instruction *First = CI, *Second = C; if (!DomSetInfo.dominates(CI, C)) std::swap(First, Second); - + // Scan the instructions between the calls, checking for stores or // calls to dangerous functions. BasicBlock::iterator I = First; @@ -283,7 +283,7 @@ LoadInst *LI = cast(V); if (LI->isVolatile()) return getAnalysis().getEqualNumberNodes(V, RetVals); - + Value *LoadPtr = LI->getOperand(0); BasicBlock *LoadBB = LI->getParent(); Function *F = LoadBB->getParent(); @@ -351,14 +351,14 @@ // no need to do any global analysis at all. if (LoadInvalidatedInBBBefore && LoadInvalidatedInBBAfter) return; - + // Now that we know the value is not neccesarily killed on entry or exit to // the BB, find out how many load and store instructions (to this location) // live in each BB in the function. // std::map CandidateLoads; std::set CandidateStores; - + for (Value::use_iterator UI = LoadPtr->use_begin(), UE = LoadPtr->use_end(); UI != UE; ++UI) if (LoadInst *Cand = dyn_cast(*UI)) {// Is a load of source? @@ -476,7 +476,7 @@ // Stores in the load-bb are handled above. CandidateStores.erase(LoadBB); - + for (std::set::iterator I = CandidateStores.begin(), E = CandidateStores.end(); I != E; ++I) if (DomSetInfo.dominates(*I, LoadBB)) { Index: llvm/lib/Analysis/LoopInfo.cpp diff -u llvm/lib/Analysis/LoopInfo.cpp:1.61 llvm/lib/Analysis/LoopInfo.cpp:1.62 --- llvm/lib/Analysis/LoopInfo.cpp:1.61 Mon Dec 6 22:03:45 2004 +++ llvm/lib/Analysis/LoopInfo.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- LoopInfo.cpp - Natural Loop Calculator -----------------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines the LoopInfo class that is used to identify natural loops @@ -175,7 +175,7 @@ std::find(SLP->SubLoops.begin(), SLP->SubLoops.end(), SubLoop); assert(I != SLP->SubLoops.end() && "SubLoop not a child of parent?"); SLP->SubLoops.erase(I); // Remove from parent... - + // Add the subloop to THIS loop... SubLoop->ParentLoop = L; L->SubLoops.push_back(SubLoop); @@ -183,7 +183,7 @@ // Normal case, add the block to our loop... L->Blocks.push_back(X); - + // Add all of the predecessors of X to the end of the work stack... TodoStack.insert(TodoStack.end(), pred_begin(X), pred_end(X)); } @@ -243,7 +243,7 @@ --i; // We just shrunk the SubLoops list. } } - } + } } } @@ -263,8 +263,8 @@ assert(I != OldParent->SubLoops.end() && "Parent fields incorrect??"); OldParent->SubLoops.erase(I); // Remove from parent's subloops list NewChild->ParentLoop = 0; - - InsertLoopInto(NewChild, NewParent); + + InsertLoopInto(NewChild, NewParent); } /// InsertLoopInto - This inserts loop L into the specified parent loop. If the @@ -273,13 +273,13 @@ void LoopInfo::InsertLoopInto(Loop *L, Loop *Parent) { BasicBlock *LHeader = L->getHeader(); assert(Parent->contains(LHeader) && "This loop should not be inserted here!"); - + // Check to see if it belongs in a child loop... for (unsigned i = 0, e = Parent->SubLoops.size(); i != e; ++i) if (Parent->SubLoops[i]->contains(LHeader)) { InsertLoopInto(L, Parent->SubLoops[i]); return; - } + } // If not, insert it here! Parent->SubLoops.push_back(L); @@ -325,7 +325,7 @@ if (I != BBMap.end()) { for (Loop *L = I->second; L; L = L->getParentLoop()) L->removeBlockFromLoop(BB); - + BBMap.erase(I); } } @@ -367,7 +367,7 @@ return 0; // Multiple predecessors outside the loop Out = *PI; } - + // Make sure there is only one exit out of the preheader... succ_iterator SI = succ_begin(Out); ++SI; @@ -439,7 +439,7 @@ Instruction *Inc = getCanonicalInductionVariableIncrement(); if (Inc == 0) return 0; PHINode *IV = cast(Inc->getOperand(0)); - + BasicBlock *BackedgeBlock = IV->getIncomingBlock(contains(IV->getIncomingBlock(1))); @@ -453,7 +453,7 @@ } else if (SCI->getOpcode() == Instruction::SetEQ) { return SCI->getOperand(1); } - + return 0; } Index: llvm/lib/Analysis/PostDominators.cpp diff -u llvm/lib/Analysis/PostDominators.cpp:1.50 llvm/lib/Analysis/PostDominators.cpp:1.51 --- llvm/lib/Analysis/PostDominators.cpp:1.50 Sat Oct 16 13:15:15 2004 +++ llvm/lib/Analysis/PostDominators.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- PostDominators.cpp - Post-Dominator Calculation --------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the post-dominator construction algorithms. @@ -73,7 +73,7 @@ // while (Doms[*SI].size() == 0) ++SI; WorkingSet = Doms[*SI]; - + for (++SI; SI != SE; ++SI) { // Intersect all of the successor sets DomSetType &SuccSet = Doms[*SI]; if (SuccSet.size()) @@ -115,7 +115,7 @@ // Loop over all of the nodes that have dominators... figuring out the IDOM // for each node... // - for (DominatorSet::const_iterator DI = DS.begin(), DEnd = DS.end(); + for (DominatorSet::const_iterator DI = DS.begin(), DEnd = DS.end(); DI != DEnd; ++DI) { BasicBlock *BB = DI->first; const DominatorSet::DomSetType &Dominators = DI->second; @@ -133,7 +133,7 @@ for (; I != End; ++I) { // Iterate over dominators... // All of our dominators should form a chain, where the number of elements // in the dominator set indicates what level the node is at in the chain. - // We want the node immediately above us, so it will have an identical + // We want the node immediately above us, so it will have an identical // dominator set, except that BB will not dominate it... therefore it's // dominator set size will be one less than BB's... // @@ -191,12 +191,12 @@ // dominator set size will be one less than BB's... // if (DS.getDominators(*I).size() == DomSetSize - 1) { - // We know that the immediate dominator should already have a node, + // We know that the immediate dominator should already have a node, // because we are traversing the CFG in depth first order! // Node *IDomNode = Nodes[*I]; assert(IDomNode && "No node for IDOM?"); - + // Add a new tree node for this BasicBlock, and link it as a child of // IDomNode Nodes[BB] = IDomNode->addChild(new Node(BB, IDomNode)); @@ -214,7 +214,7 @@ H("postdomfrontier", "Post-Dominance Frontier Construction", true); const DominanceFrontier::DomSetType & -PostDominanceFrontier::calculate(const PostDominatorTree &DT, +PostDominanceFrontier::calculate(const PostDominatorTree &DT, const DominatorTree::Node *Node) { // Loop over CFG successors to calculate DFlocal[Node] BasicBlock *BB = Node->getBlock(); Index: llvm/lib/Analysis/ProfileInfo.cpp diff -u llvm/lib/Analysis/ProfileInfo.cpp:1.6 llvm/lib/Analysis/ProfileInfo.cpp:1.7 --- llvm/lib/Analysis/ProfileInfo.cpp:1.6 Sat Jan 8 16:01:16 2005 +++ llvm/lib/Analysis/ProfileInfo.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- ProfileInfo.cpp - Profile Info Interface ---------------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the abstract ProfileInfo interface, and the default @@ -83,7 +83,7 @@ namespace { struct NoProfileInfo : public ImmutablePass, public ProfileInfo {}; - + // Register this pass... RegisterOpt X("no-profile", "No Profile Information"); Index: llvm/lib/Analysis/ProfileInfoLoader.cpp diff -u llvm/lib/Analysis/ProfileInfoLoader.cpp:1.7 llvm/lib/Analysis/ProfileInfoLoader.cpp:1.8 --- llvm/lib/Analysis/ProfileInfoLoader.cpp:1.7 Sun Jul 4 07:19:55 2004 +++ llvm/lib/Analysis/ProfileInfoLoader.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- ProfileInfoLoad.cpp - Load profile information from disk -----------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // The ProfileInfoLoader class is used to load and represent profiling @@ -26,9 +26,9 @@ // static inline unsigned ByteSwap(unsigned Var, bool Really) { if (!Really) return Var; - return ((Var & (255<< 0)) << 24) | - ((Var & (255<< 8)) << 8) | - ((Var & (255<<16)) >> 8) | + return ((Var & (255<< 0)) << 24) | + ((Var & (255<< 8)) << 8) | + ((Var & (255<<16)) >> 8) | ((Var & (255<<24)) >> 24); } @@ -57,7 +57,7 @@ // Make sure we have enough space... if (Data.size() < NumEntries) Data.resize(NumEntries); - + // Accumulate the data we just read into the data. if (!ShouldByteSwap) { for (unsigned i = 0; i != NumEntries; ++i) @@ -112,11 +112,11 @@ CommandLines.push_back(std::string(&Chars[0], &Chars[ArgLength])); break; } - + case FunctionInfo: ReadProfilingBlock(ToolName, F, ShouldByteSwap, FunctionCounts); break; - + case BlockInfo: ReadProfilingBlock(ToolName, F, ShouldByteSwap, BlockCounts); break; @@ -134,7 +134,7 @@ exit(1); } } - + fclose(F); } @@ -151,7 +151,7 @@ // their entry blocks were executed. std::vector > BlockCounts; getBlockCounts(BlockCounts); - + for (unsigned i = 0, e = BlockCounts.size(); i != e; ++i) if (&BlockCounts[i].first->getParent()->front() == BlockCounts[i].first) Counts.push_back(std::make_pair(BlockCounts[i].first->getParent(), @@ -161,7 +161,7 @@ } return; } - + unsigned Counter = 0; for (Module::iterator I = M.begin(), E = M.end(); I != E && Counter != FunctionCounts.size(); ++I) Index: llvm/lib/Analysis/ProfileInfoLoaderPass.cpp diff -u llvm/lib/Analysis/ProfileInfoLoaderPass.cpp:1.11 llvm/lib/Analysis/ProfileInfoLoaderPass.cpp:1.12 --- llvm/lib/Analysis/ProfileInfoLoaderPass.cpp:1.11 Thu Mar 17 23:27:57 2005 +++ llvm/lib/Analysis/ProfileInfoLoaderPass.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- ProfileInfoLoaderPass.cpp - LLVM Pass to load profile info ---------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements a concrete implementation of profiling information that @@ -48,7 +48,7 @@ /// run - Load the profile information from the specified file. virtual bool runOnModule(Module &M); }; - + RegisterPass X("profile-loader", "Load profile information from llvmprof.out", PassInfo::Analysis|PassInfo::Optimization); @@ -69,7 +69,7 @@ ProfileInfoLoader PIL("profile-loader", Filename, M); EdgeCounts.clear(); bool PrintedWarning = false; - + std::vector > ECs; PIL.getEdgeCounts(ECs); for (unsigned i = 0, e = ECs.size(); i != e; ++i) { Index: llvm/lib/Analysis/ScalarEvolution.cpp diff -u llvm/lib/Analysis/ScalarEvolution.cpp:1.37 llvm/lib/Analysis/ScalarEvolution.cpp:1.38 --- llvm/lib/Analysis/ScalarEvolution.cpp:1.37 Wed Apr 6 16:45:00 2005 +++ llvm/lib/Analysis/ScalarEvolution.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- ScalarEvolution.cpp - Scalar Evolution Analysis ----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the implementation of the scalar evolution analysis @@ -28,7 +28,7 @@ // have folders that are used to build the *canonical* representation for a // particular expression. These folders are capable of using a variety of // rewrite rules to simplify the expressions. -// +// // Once the folders are defined, we can implement the more interesting // higher-level code, such as the code that recognizes PHI nodes of various // types, computes the execution count of a loop, etc. @@ -163,7 +163,7 @@ // particular value. Don't use a SCEVHandle here, or else the object will // never be deleted! static std::map SCEVConstants; - + SCEVConstant::~SCEVConstant() { SCEVConstants.erase(V); @@ -175,7 +175,7 @@ const Type *NewTy = V->getType()->getUnsignedVersion(); V = cast(ConstantExpr::getCast(V, NewTy)); } - + SCEVConstant *&R = SCEVConstants[V]; if (R == 0) R = new SCEVConstant(V); return R; @@ -337,7 +337,7 @@ for (++i; i != e; ++i) NewOps.push_back(getOperand(i)-> replaceSymbolicValuesWithConcrete(Sym, Conc)); - + return get(NewOps, L); } } @@ -451,7 +451,7 @@ /// specified signed integer value and return a SCEV for the constant. SCEVHandle SCEVUnknown::getIntegerSCEV(int Val, const Type *Ty) { Constant *C; - if (Val == 0) + if (Val == 0) C = Constant::getNullValue(Ty); else if (Ty->isFloatingPoint()) C = ConstantFP::get(Ty, Val); @@ -483,7 +483,7 @@ SCEVHandle SCEV::getNegativeSCEV(const SCEVHandle &V) { if (SCEVConstant *VC = dyn_cast(V)) return SCEVUnknown::get(ConstantExpr::getNeg(VC->getValue())); - + return SCEVMulExpr::get(V, SCEVUnknown::getIntegerSCEV(-1, V->getType())); } @@ -511,7 +511,7 @@ const Type *Ty = V->getType(); if (NumSteps == 0) return SCEVUnknown::getIntegerSCEV(1, Ty); - + SCEVHandle Result = V; for (unsigned i = 1; i != NumSteps; ++i) Result = SCEVMulExpr::get(Result, SCEV::getMinusSCEV(V, @@ -623,7 +623,7 @@ } if (Ops.size() == 1) return Ops[0]; - + // Okay, check to see if the same value occurs in the operand list twice. If // so, merge them together into an multiply expression. Since we sorted the // list, these values are required to be adjacent. @@ -696,7 +696,7 @@ Ops.push_back(OuterMul); return SCEVAddExpr::get(Ops); } - + // Check this multiply against other multiplies being added together. for (unsigned OtherMulIdx = Idx+1; OtherMulIdx < Ops.size() && isa(Ops[OtherMulIdx]); @@ -868,7 +868,7 @@ if (Ops.size() == 1) return Ops[0]; - + // If there are mul operands inline them all into this expression. if (Idx < Ops.size()) { bool DeletedMul = false; @@ -1086,7 +1086,7 @@ /// properties. An instruction maps to null if we are unable to compute its /// exit value. std::map ConstantEvolutionLoopExitValue; - + public: ScalarEvolutionsImpl(Function &f, LoopInfo &li) : F(f), LI(li), UnknownValue(new SCEVCouldNotCompute()) {} @@ -1230,7 +1230,7 @@ // from outside the loop, and one from inside. unsigned IncomingEdge = L->contains(PN->getIncomingBlock(0)); unsigned BackEdge = IncomingEdge^1; - + // While we are analyzing this PHI node, handle its value symbolically. SCEVHandle SymbolicName = SCEVUnknown::get(PN); assert(Scalars.find(PN) == Scalars.end() && @@ -1286,7 +1286,7 @@ return SymbolicName; } - + // If it's not a loop phi, we can't handle it yet. return SCEVUnknown::get(PN); } @@ -1296,11 +1296,11 @@ SCEVHandle ScalarEvolutionsImpl::createNodeForCast(CastInst *CI) { const Type *SrcTy = CI->getOperand(0)->getType(); const Type *DestTy = CI->getType(); - + // If this is a noop cast (ie, conversion from int to uint), ignore it. if (SrcTy->isLosslesslyConvertibleTo(DestTy)) return getSCEV(CI->getOperand(0)); - + if (SrcTy->isInteger() && DestTy->isInteger()) { // Otherwise, if this is a truncating integer cast, we can represent this // cast. @@ -1486,7 +1486,7 @@ if (CompVal) { // Form the constant range. ConstantRange CompRange(Cond, CompVal); - + // Now that we have it, if it's signed, convert it to an unsigned // range. if (CompRange.getLower()->getType()->isSigned()) { @@ -1495,12 +1495,12 @@ Constant *NewU = ConstantExpr::getCast(CompRange.getUpper(), NewTy); CompRange = ConstantRange(NewL, NewU); } - + SCEVHandle Ret = AddRec->getNumIterationsInRange(CompRange); if (!isa(Ret)) return Ret; } } - + switch (Cond) { case Instruction::SetNE: // while (X != Y) // Convert to: while (X-Y != 0) @@ -1545,7 +1545,7 @@ /// the addressed element of the initializer or null if the index expression is /// invalid. static Constant * -GetAddressedElementFromGlobal(GlobalVariable *GV, +GetAddressedElementFromGlobal(GlobalVariable *GV, const std::vector &Indices) { Constant *Init = GV->getInitializer(); for (unsigned i = 0, e = Indices.size(); i != e; ++i) { @@ -1577,7 +1577,7 @@ /// ComputeLoadConstantCompareIterationCount - Given an exit condition of /// 'setcc load X, cst', try to se if we can compute the trip count. SCEVHandle ScalarEvolutionsImpl:: -ComputeLoadConstantCompareIterationCount(LoadInst *LI, Constant *RHS, +ComputeLoadConstantCompareIterationCount(LoadInst *LI, Constant *RHS, const Loop *L, unsigned SetCCOpcode) { if (LI->isVolatile()) return UnknownValue; @@ -1656,7 +1656,7 @@ if (isa(I) || isa(I) || isa(I) || isa(I) || isa(I)) return true; - + if (const CallInst *CI = dyn_cast(I)) if (const Function *F = CI->getCalledFunction()) return canConstantFoldCallTo((Function*)F); // FIXME: elim cast @@ -1713,7 +1713,7 @@ // If we won't be able to constant fold this expression even if the operands // are constants, return early. if (!CanConstantFold(I)) return 0; - + // Otherwise, we can evaluate this instruction if all of its operands are // constant or derived from a PHI node themselves. PHINode *PHI = 0; @@ -1765,7 +1765,7 @@ if (I != ConstantEvolutionLoopExitValue.end()) return I->second; - if (Its > MaxBruteForceIterations) + if (Its > MaxBruteForceIterations) return ConstantEvolutionLoopExitValue[PN] = 0; // Not going to evaluate it. Constant *&RetVal = ConstantEvolutionLoopExitValue[PN]; @@ -1842,7 +1842,7 @@ ++NumBruteForceTripCountsComputed; return SCEVConstant::get(ConstantUInt::get(Type::UIntTy, IterationNum)); } - + // Compute the value of the PHI node for the next iteration. Constant *NextPHI = EvaluateExpression(BEValue, PHIVal); if (NextPHI == 0 || NextPHI == PHIVal) @@ -1861,7 +1861,7 @@ // FIXME: this should be turned into a virtual method on SCEV! if (isa(V)) return V; - + // If this instruction is evolves from a constant-evolving PHI, compute the // exit value from the loop without using SCEVs. if (SCEVUnknown *SU = dyn_cast(V)) { @@ -1966,7 +1966,7 @@ if (IterationCount == UnknownValue) return UnknownValue; IterationCount = getTruncateOrZeroExtend(IterationCount, AddRec->getType()); - + // If the value is affine, simplify the expression evaluation to just // Start + Step*IterationCount. if (AddRec->isAffine()) @@ -1995,7 +1995,7 @@ SCEVConstant *L = dyn_cast(AddRec->getOperand(0)); SCEVConstant *M = dyn_cast(AddRec->getOperand(1)); SCEVConstant *N = dyn_cast(AddRec->getOperand(2)); - + // We currently can only solve this if the coefficients are constants. if (!L || !M || !N) { SCEV *CNC = new SCEVCouldNotCompute(); @@ -2003,7 +2003,7 @@ } Constant *Two = ConstantInt::get(L->getValue()->getType(), 2); - + // Convert from chrec coefficients to polynomial coefficients AX^2+BX+C Constant *C = L->getValue(); // The B coefficient is M-N/2 @@ -2012,7 +2012,7 @@ Two)); // The A coefficient is N/2 Constant *A = ConstantExpr::getDiv(N->getValue(), Two); - + // Compute the B^2-4ac term. Constant *SqrtTerm = ConstantExpr::getMul(ConstantInt::get(C->getType(), 4), @@ -2035,16 +2035,16 @@ SqrtVal = ConstantUInt::get(Type::ULongTy, SqrtValV2); SqrtTerm = ConstantExpr::getCast(SqrtVal, SqrtTerm->getType()); - + Constant *NegB = ConstantExpr::getNeg(B); Constant *TwoA = ConstantExpr::getMul(A, Two); - + // The divisions must be performed as signed divisions. const Type *SignedTy = NegB->getType()->getSignedVersion(); NegB = ConstantExpr::getCast(NegB, SignedTy); TwoA = ConstantExpr::getCast(TwoA, SignedTy); SqrtTerm = ConstantExpr::getCast(SqrtTerm, SignedTy); - + Constant *Solution1 = ConstantExpr::getDiv(ConstantExpr::getAdd(NegB, SqrtTerm), TwoA); Constant *Solution2 = @@ -2117,7 +2117,7 @@ R2->getValue()))) { if (CB != ConstantBool::True) std::swap(R1, R2); // R1 is the minimum root now. - + // We can only use this value if the chrec ends up with an exact zero // value at this index. When solving for "X*X != 5", for example, we // should not accept a root of 2. @@ -2128,7 +2128,7 @@ } } } - + return UnknownValue; } @@ -2139,7 +2139,7 @@ // Loops that look like: while (X == 0) are very strange indeed. We don't // handle them yet except for the trivial case. This could be expanded in the // future as needed. - + // If the value is a constant, check to see if it is known to be non-zero // already. If so, the backedge will execute zero times. if (SCEVConstant *C = dyn_cast(V)) { @@ -2149,7 +2149,7 @@ return getSCEV(Zero); return UnknownValue; // Otherwise it will loop infinitely. } - + // We could implement others, but I really doubt anyone writes loops like // this, and if they did, they would already be constant folded. return UnknownValue; @@ -2191,7 +2191,7 @@ // iteration exits. ConstantInt *Zero = ConstantInt::get(getType(), 0); if (!Range.contains(Zero)) return SCEVConstant::get(Zero); - + if (isAffine()) { // If this is an affine expression then we have this situation: // Solve {0,+,A} in Range === Ax in Range @@ -2246,7 +2246,7 @@ R2->getValue()))) { if (CB != ConstantBool::True) std::swap(R1, R2); // R1 is the minimum root now. - + // Make sure the root is not off by one. The returned iteration should // not be in the range, but the previous one should be. When solving // for "X*X < 5", for example, we should not return a root of 2. @@ -2257,13 +2257,13 @@ Constant *NextVal = ConstantExpr::getAdd(R1->getValue(), ConstantInt::get(R1->getType(), 1)); - + R1Val = EvaluateConstantChrecAtConstant(this, NextVal); if (!Range.contains(R1Val)) return SCEVUnknown::get(NextVal); return new SCEVCouldNotCompute(); // Something strange happened } - + // If R1 was not in the range, then it is a good return value. Make // sure that R1-1 WAS in the range though, just in case. Constant *NextVal = @@ -2298,7 +2298,7 @@ // Increment to test the next index. TestVal = cast(ConstantExpr::getAdd(TestVal, One)); } while (TestVal != EndVal); - + return new SCEVCouldNotCompute(); } @@ -2343,12 +2343,12 @@ return ((ScalarEvolutionsImpl*)Impl)->deleteInstructionFromRecords(I); } -static void PrintLoopInfo(std::ostream &OS, const ScalarEvolution *SE, +static void PrintLoopInfo(std::ostream &OS, const ScalarEvolution *SE, const Loop *L) { // Print all inner loops first for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I) PrintLoopInfo(OS, SE, *I); - + std::cerr << "Loop " << L->getHeader()->getName() << ": "; std::vector ExitBlocks; @@ -2377,7 +2377,7 @@ SCEVHandle SV = getSCEV(&*I); SV->print(OS); OS << "\t\t"; - + if ((*I).getType()->isIntegral()) { ConstantRange Bounds = SV->getValueRange(); if (!Bounds.isFullSet()) Index: llvm/lib/Analysis/ValueNumbering.cpp diff -u llvm/lib/Analysis/ValueNumbering.cpp:1.14 llvm/lib/Analysis/ValueNumbering.cpp:1.15 --- llvm/lib/Analysis/ValueNumbering.cpp:1.14 Sat Jan 8 16:01:16 2005 +++ llvm/lib/Analysis/ValueNumbering.cpp Thu Apr 21 16:04:58 2005 @@ -1,10 +1,10 @@ //===- ValueNumbering.cpp - Value #'ing Implementation ----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the non-abstract Value Numbering methods as well as a @@ -103,7 +103,7 @@ Instruction &I = (Instruction&)CI; Value *Op = I.getOperand(0); Function *F = I.getParent()->getParent(); - + for (Value::use_iterator UI = Op->use_begin(), UE = Op->use_end(); UI != UE; ++UI) if (CastInst *Other = dyn_cast(*UI)) @@ -130,12 +130,12 @@ if (I1.getOpcode() != I2->getOpcode() || I1.getParent()->getParent() != I2->getParent()->getParent()) return false; - + // They are identical if both operands are the same! if (I1.getOperand(0) == I2->getOperand(0) && I1.getOperand(1) == I2->getOperand(1)) return true; - + // If the instruction is commutative, the instruction can match if the // operands are swapped! // @@ -149,12 +149,12 @@ void BVNImpl::handleBinaryInst(Instruction &I) { Value *LHS = I.getOperand(0); - + for (Value::use_iterator UI = LHS->use_begin(), UE = LHS->use_end(); UI != UE; ++UI) if (Instruction *Other = dyn_cast(*UI)) // Check to see if this new binary operator is not I, but same operand... - if (Other != &I && isIdenticalBinaryInst(I, Other)) { + if (Other != &I && isIdenticalBinaryInst(I, Other)) { // These instructions are identical. Handle the situation. RetVals.push_back(Other); } @@ -164,7 +164,7 @@ // using a brute force comparison. This is useful for instructions with an // arbitrary number of arguments. // -static inline bool IdenticalComplexInst(const Instruction *I1, +static inline bool IdenticalComplexInst(const Instruction *I1, const Instruction *I2) { assert(I1->getOpcode() == I2->getOpcode()); // Equal if they are in the same function... @@ -187,7 +187,7 @@ Op = I.getOperand(i); break; } - + for (Value::use_iterator UI = Op->use_begin(), UE = Op->use_end(); UI != UE; ++UI) if (GetElementPtrInst *Other = dyn_cast(*UI)) From brukman at cs.uiuc.edu Thu Apr 21 16:07:39 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 16:07:39 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp CompleteBottomUp.cpp DataStructure.cpp DataStructureAA.cpp DataStructureOpt.cpp DataStructureStats.cpp EquivClassGraphs.cpp GraphChecker.cpp Local.cpp Printer.cpp Steensgaard.cpp TopDownClosure.cpp Message-ID: <200504212107.QAA03228@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/DataStructure: BottomUpClosure.cpp updated: 1.113 -> 1.114 CompleteBottomUp.cpp updated: 1.31 -> 1.32 DataStructure.cpp updated: 1.238 -> 1.239 DataStructureAA.cpp updated: 1.37 -> 1.38 DataStructureOpt.cpp updated: 1.11 -> 1.12 DataStructureStats.cpp updated: 1.17 -> 1.18 EquivClassGraphs.cpp updated: 1.43 -> 1.44 GraphChecker.cpp updated: 1.17 -> 1.18 Local.cpp updated: 1.132 -> 1.133 Printer.cpp updated: 1.82 -> 1.83 Steensgaard.cpp updated: 1.60 -> 1.61 TopDownClosure.cpp updated: 1.88 -> 1.89 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+183 -183) BottomUpClosure.cpp | 36 +++++++-------- CompleteBottomUp.cpp | 22 ++++----- DataStructure.cpp | 116 ++++++++++++++++++++++++------------------------- DataStructureAA.cpp | 18 +++---- DataStructureOpt.cpp | 6 +- DataStructureStats.cpp | 10 ++-- EquivClassGraphs.cpp | 52 ++++++++++----------- GraphChecker.cpp | 14 ++--- Local.cpp | 44 +++++++++--------- Printer.cpp | 16 +++--- Steensgaard.cpp | 16 +++--- TopDownClosure.cpp | 16 +++--- 12 files changed, 183 insertions(+), 183 deletions(-) Index: llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp diff -u llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.113 llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.114 --- llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.113 Thu Apr 21 11:09:43 2005 +++ llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- BottomUpClosure.cpp - Compute bottom-up interprocedural closure ----===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the BUDataStructures class, which represents the @@ -26,7 +26,7 @@ Statistic<> MaxSCC("budatastructure", "Maximum SCC Size in Call Graph"); Statistic<> NumBUInlines("budatastructures", "Number of graphs inlined"); Statistic<> NumCallEdges("budatastructures", "Number of 'actual' call edges"); - + RegisterAnalysis X("budatastructure", "Bottom-up Data Structure Analysis"); } @@ -48,23 +48,23 @@ GlobalValue *First = GVs[0]; for (unsigned i = 1, e = GVs.size(); i != e; ++i) GlobalECs.unionSets(First, GVs[i]); - + // Next, get the leader element. assert(First == GlobalECs.getLeaderValue(First) && "First did not end up being the leader?"); - + // Next, remove all globals from the scalar map that are not the leader. assert(GVs[0] == First && "First had to be at the front!"); for (unsigned i = 1, e = GVs.size(); i != e; ++i) { ECGlobals.insert(GVs[i]); SM.erase(SM.find(GVs[i])); } - + // Finally, change the global node to only contain the leader. I->clearGlobals(); I->addGlobal(First); } - + DEBUG(GG.AssertGraphOK()); } @@ -161,7 +161,7 @@ // nothing! In particular, externally visible globals and unresolvable call // nodes at the end of the BU phase should make things that they point to // incomplete in the globals graph. - // + // GlobalsGraph->removeTriviallyDeadNodes(); GlobalsGraph->maskIncompleteMarkers(); @@ -186,7 +186,7 @@ if (MainFunc && !MainFunc->isExternal()) { DSGraph &MainGraph = getOrCreateGraph(MainFunc); const DSGraph &GG = *MainGraph.getGlobalsGraph(); - ReachabilityCloner RC(MainGraph, GG, + ReachabilityCloner RC(MainGraph, GG, DSGraph::DontCloneCallNodes | DSGraph::DontCloneAuxCallNodes); @@ -197,7 +197,7 @@ RC.getClonedNH(GG.getNodeForValue(*I)); MainGraph.maskIncompleteMarkers(); - MainGraph.markIncompleteNodes(DSGraph::MarkFormalArgs | + MainGraph.markIncompleteNodes(DSGraph::MarkFormalArgs | DSGraph::IgnoreGlobals); } @@ -210,7 +210,7 @@ if (Graph) return *Graph; DSGraph &LocGraph = getAnalysis().getDSGraph(*F); - + // Steal the local graph. Graph = new DSGraph(GlobalECs, LocGraph.getTargetData()); Graph->spliceFrom(LocGraph); @@ -235,7 +235,7 @@ return !callee->isExternal() || isVAHackFn(callee); } -static void GetAllCallees(const DSCallSite &CS, +static void GetAllCallees(const DSCallSite &CS, std::vector &Callees) { if (CS.isDirectCall()) { if (isResolvableFunc(CS.getCalleeFunc())) @@ -244,7 +244,7 @@ // Get all callees. unsigned OldSize = Callees.size(); CS.getCalleeNode()->addFullFunctionList(Callees); - + // If any of the callees are unresolvable, remove the whole batch! for (unsigned i = OldSize, e = Callees.size(); i != e; ++i) if (!isResolvableFunc(Callees[i])) { @@ -265,7 +265,7 @@ unsigned BUDataStructures::calculateGraphs(Function *F, std::vector &Stack, - unsigned &NextID, + unsigned &NextID, hash_map &ValMap) { assert(!ValMap.count(F) && "Shouldn't revisit functions!"); unsigned Min = NextID++, MyID = Min; @@ -488,7 +488,7 @@ if (!Printed) std::cerr << "In Fns: " << Graph.getFunctionNames() << "\n"; std::cerr << " calls " << CalledFuncs.size() - << " fns from site: " << CS.getCallSite().getInstruction() + << " fns from site: " << CS.getCallSite().getInstruction() << " " << *CS.getCallSite().getInstruction(); std::cerr << " Fns ="; unsigned NumPrinted = 0; @@ -510,7 +510,7 @@ if (IndCallGraph.first == 0) { std::vector::iterator I = CalledFuncs.begin(), E = CalledFuncs.end(); - + // Start with a copy of the first graph. GI = IndCallGraph.first = new DSGraph(getDSGraph(**I), GlobalECs); GI->setGlobalsGraph(Graph.getGlobalsGraph()); @@ -539,7 +539,7 @@ for (e = NextArgs.size(); i != e; ++i) Args.push_back(NextArgs[i]); } - + // Clean up the final graph! GI->removeDeadNodes(DSGraph::KeepUnreachableGlobals); } else { @@ -580,7 +580,7 @@ // Clone everything reachable from globals in the function graph into the // globals graph. for (DSScalarMap::global_iterator I = MainSM.global_begin(), - E = MainSM.global_end(); I != E; ++I) + E = MainSM.global_end(); I != E; ++I) RC.getClonedNH(MainSM[*I]); //Graph.writeGraphToFile(std::cerr, "bu_" + F.getName()); Index: llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp diff -u llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp:1.31 llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp:1.32 --- llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp:1.31 Sat Apr 2 14:02:41 2005 +++ llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- CompleteBottomUp.cpp - Complete Bottom-Up Data Structure Graphs ----===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This is the exact same as the bottom-up graphs, but we use take a completed @@ -52,7 +52,7 @@ } else { std::cerr << "CBU-DSA: No 'main' function found!\n"; } - + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) if (!I->isExternal() && !DSInfo.count(I)) calculateSCCGraphs(getOrCreateGraph(*I), Stack, NextID, ValMap); @@ -66,7 +66,7 @@ if (MainFunc && !MainFunc->isExternal()) { DSGraph &MainGraph = getOrCreateGraph(*MainFunc); const DSGraph &GG = *MainGraph.getGlobalsGraph(); - ReachabilityCloner RC(MainGraph, GG, + ReachabilityCloner RC(MainGraph, GG, DSGraph::DontCloneCallNodes | DSGraph::DontCloneAuxCallNodes); @@ -77,7 +77,7 @@ RC.getClonedNH(GG.getNodeForValue(*I)); MainGraph.maskIncompleteMarkers(); - MainGraph.markIncompleteNodes(DSGraph::MarkFormalArgs | + MainGraph.markIncompleteNodes(DSGraph::MarkFormalArgs | DSGraph::IgnoreGlobals); } @@ -107,7 +107,7 @@ unsigned CompleteBUDataStructures::calculateSCCGraphs(DSGraph &FG, std::vector &Stack, - unsigned &NextID, + unsigned &NextID, hash_map &ValMap) { assert(!ValMap.count(&FG) && "Shouldn't revisit functions!"); unsigned Min = NextID++, MyID = Min; @@ -157,7 +157,7 @@ // Remove NG from the ValMap since the pointer may get recycled. ValMap.erase(NG); delete NG; - + Stack.pop_back(); IsMultiNodeSCC = true; } @@ -165,7 +165,7 @@ // Clean up the graph before we start inlining a bunch again... if (IsMultiNodeSCC) FG.removeTriviallyDeadNodes(); - + Stack.pop_back(); processGraph(FG); ValMap[&FG] = ~0U; @@ -187,7 +187,7 @@ assert(calls.insert(TheCall).second && "Call instruction occurs multiple times in graph??"); - + // Fast path for noop calls. Note that we don't care about merging globals // in the callee with nodes in the caller here. if (CS.getRetVal().isNull() && CS.getNumPtrArgs() == 0) @@ -196,7 +196,7 @@ // Loop over all of the potentially called functions... // Inline direct calls as well as indirect calls because the direct // callee may have indirect callees and so may have changed. - // + // callee_iterator I = callee_begin(TheCall),E = callee_end(TheCall); unsigned TNum = 0, Num = 0; DEBUG(Num = std::distance(I, E)); @@ -208,7 +208,7 @@ // calls or for self recursion within an SCC. DSGraph &GI = getOrCreateGraph(*CalleeFunc); ++NumCBUInlines; - G.mergeInGraph(CS, *CalleeFunc, GI, + G.mergeInGraph(CS, *CalleeFunc, GI, DSGraph::StripAllocaBit | DSGraph::DontCloneCallNodes | DSGraph::DontCloneAuxCallNodes); DEBUG(std::cerr << " Inlining graph [" << i << "/" Index: llvm/lib/Analysis/DataStructure/DataStructure.cpp diff -u llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.238 llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.239 --- llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.238 Mon Apr 11 22:59:27 2005 +++ llvm/lib/Analysis/DataStructure/DataStructure.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- DataStructure.cpp - Implement the core data structure analysis -----===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the core data structure functionality. @@ -95,7 +95,7 @@ return I->second; } } - + // Okay, this is either not an equivalenced global or it is the leader, it // will be inserted into the scalar map now. GlobalSet.insert(GV); @@ -163,7 +163,7 @@ Ty = Type::VoidTy; // Remove this node from the parent graph's Nodes list. - ParentGraph->unlinkNode(this); + ParentGraph->unlinkNode(this); ParentGraph = 0; } @@ -221,16 +221,16 @@ DestNode->Ty = Type::VoidTy; DestNode->Size = 1; DestNode->Globals.swap(Globals); - + // Start forwarding to the destination node... forwardNode(DestNode, 0); - + if (!Links.empty()) { DestNode->Links.reserve(1); - + DSNodeHandle NH(DestNode); DestNode->Links.push_back(Links[0]); - + // If we have links, merge all of our outgoing links together... for (unsigned i = Links.size()-1; i != 0; --i) NH.getNode()->Links[0].mergeWith(Links[i]); @@ -328,7 +328,7 @@ ++SS.Idx; if (SS.Idx != ST->getNumElements()) { const StructLayout *SL = TD.getStructLayout(ST); - SS.Offset += + SS.Offset += unsigned(SL->MemberOffsets[SS.Idx]-SL->MemberOffsets[SS.Idx-1]); return; } @@ -388,7 +388,7 @@ static bool ElementTypesAreCompatible(const Type *T1, const Type *T2, bool AllowLargerT1, const TargetData &TD){ TypeElementWalker T1W(T1, TD), T2W(T2, TD); - + while (!T1W.isDone() && !T2W.isDone()) { if (T1W.getCurrentOffset() != T2W.getCurrentOffset()) return false; @@ -397,11 +397,11 @@ const Type *T2 = T2W.getCurrentType(); if (T1 != T2 && !T1->isLosslesslyConvertibleTo(T2)) return false; - + T1W.StepToNextType(); T2W.StepToNextType(); } - + return AllowLargerT1 || T1W.isDone(); } @@ -573,13 +573,13 @@ if (isa(SubType) && isa(NewTy)) return false; - unsigned SubTypeSize = SubType->isSized() ? + unsigned SubTypeSize = SubType->isSized() ? (unsigned)TD.getTypeSize(SubType) : 0; // Ok, we are getting desperate now. Check for physical subtyping, where we // just require each element in the node to be compatible. if (NewTySize <= SubTypeSize && NewTySize && NewTySize < 256 && - SubTypeSize && SubTypeSize < 256 && + SubTypeSize && SubTypeSize < 256 && ElementTypesAreCompatible(NewTy, SubType, !isArray(), TD)) return false; @@ -611,7 +611,7 @@ NextPadSize = NextSubTypeSize; break; default: ; - // fall out + // fall out } if (NextSubType == 0) @@ -707,14 +707,14 @@ } else { // Make a copy to the side of Dest... std::vector Old(Dest); - + // Make space for all of the type entries now... Dest.resize(Dest.size()+Src.size()); - + // Merge the two sorted ranges together... into Dest. std::merge(Old.begin(), Old.end(), Src.begin(), Src.end(), Dest.begin()); - - // Now erase any duplicate entries that may have accumulated into the + + // Now erase any duplicate entries that may have accumulated into the // vectors (because they were in both of the input sets) Dest.erase(std::unique(Dest.begin(), Dest.end()), Dest.end()); } @@ -728,7 +728,7 @@ // This function does the hard work of merging two nodes, CurNodeH // and NH after filtering out trivial cases and making sure that // CurNodeH.offset >= NH.offset. -// +// // ***WARNING*** // Since merging may cause either node to go away, we must always // use the node-handles to refer to the nodes. These node handles are @@ -761,7 +761,7 @@ #endif } - // Merge the type entries of the two nodes together... + // Merge the type entries of the two nodes together... if (NH.getNode()->Ty != Type::VoidTy) CurNodeH.getNode()->mergeTypeInfo(NH.getNode()->Ty, NOffset); assert(!CurNodeH.getNode()->isDeadNode()); @@ -916,7 +916,7 @@ DSNode *DN = new DSNode(*SN, &Dest, true /* Null out all links */); DN->maskNodeTypes(BitsToKeep); NH = DN; - + // Next, recursively clone all outgoing links as necessary. Note that // adding these links can cause the node to collapse itself at any time, and // the current node may be merged with arbitrary other nodes. For this @@ -939,7 +939,7 @@ CN->addEdgeTo(MergeOffset, DestEdge); } } - + // If this node contains any globals, make sure they end up in the scalar // map with the correct offset. for (DSNode::globals_iterator I = SN->globals_begin(), E = SN->globals_end(); @@ -977,7 +977,7 @@ SCNH.getOffset()+SrcNH.getOffset())); return; // Nothing to do! } - + // Okay, so the source node has not already been cloned. Instead of creating // a new DSNode, only to merge it into the one we already have, try to perform // the merge in-place. The only case we cannot handle here is when the offset @@ -1006,8 +1006,8 @@ } #endif } - - // Merge the type entries of the two nodes together... + + // Merge the type entries of the two nodes together... if (SN->getType() != Type::VoidTy && !DN->isNodeCompletelyFolded()) { DN->mergeTypeInfo(SN->getType(), NH.getOffset()-SrcNH.getOffset()); DN = NH.getNode(); @@ -1015,7 +1015,7 @@ } assert(!DN->isDeadNode()); - + // Merge the NodeType information. DN->mergeNodeFlags(SN->getNodeFlags() & BitsToKeep); @@ -1060,7 +1060,7 @@ // sure it is known that this is the representative node for the src node. SCNH = DSNodeHandle(NH.getNode(), NH.getOffset()-SrcNH.getOffset()); - // If the source node contained any globals, make sure to create entries + // If the source node contained any globals, make sure to create entries // in the scalar map for them! for (DSNode::globals_iterator I = SN->globals_begin(), E = SN->globals_end(); I != E; ++I) { @@ -1092,7 +1092,7 @@ DSNode *CN = SCNH.getNode(); unsigned MergeOffset = ((i << DS::PointerShift)+SCNH.getOffset()) % CN->getSize(); - + DSNodeHandle Tmp = CN->getLink(MergeOffset); if (!Tmp.isNull()) { // Perform the recursive merging. Make sure to create a temporary NH, @@ -1120,7 +1120,7 @@ merge(DestCS.getRetVal(), SrcCS.getRetVal()); unsigned MinArgs = DestCS.getNumPtrArgs(); if (SrcCS.getNumPtrArgs() < MinArgs) MinArgs = SrcCS.getNumPtrArgs(); - + for (unsigned a = 0; a != MinArgs; ++a) merge(DestCS.getPtrArg(a), SrcCS.getPtrArg(a)); @@ -1253,11 +1253,11 @@ New->maskNodeTypes(~BitsToClear); OldNodeMap[I] = New; } - + #ifndef NDEBUG Timer::addPeakMemoryMeasurement(); #endif - + // Rewrite the links in the new nodes to point into the current graph now. // Note that we don't loop over the node's list to do this. The problem is // that remaping links can cause recursive merging to happen, which means @@ -1314,7 +1314,7 @@ I->setParentGraph(this); // Take all of the nodes. Nodes.splice(Nodes.end(), RHS.Nodes); - + // Take all of the calls. FunctionCalls.splice(FunctionCalls.end(), RHS.FunctionCalls); AuxFunctionCalls.splice(AuxFunctionCalls.end(), RHS.AuxFunctionCalls); @@ -1376,7 +1376,7 @@ unsigned CurNodeId; std::vector SCCStack; std::map > NodeInfo; - + HackedGraphSCCFinder(ReachabilityCloner &rc) : RC(rc), CurNodeId(1) { // Remove null pointer as a special case. NodeInfo[0] = std::make_pair(0, false); @@ -1473,7 +1473,7 @@ /// call site (in this graph) with the bindings specified by the vector in G2. /// The two DSGraphs must be different. /// -void DSGraph::mergeInGraph(const DSCallSite &CS, +void DSGraph::mergeInGraph(const DSCallSite &CS, std::vector &Args, const DSGraph &Graph, unsigned CloneFlags) { TIME_REGION(X, "mergeInGraph"); @@ -1485,12 +1485,12 @@ if (&Graph == this) { // Merge the return value with the return value of the context. Args[0].mergeWith(CS.getRetVal()); - + // Resolve all of the function arguments. for (unsigned i = 0, e = CS.getNumPtrArgs(); i != e; ++i) { if (i == Args.size()-1) break; - + // Add the link from the argument scalar to the provided value. Args[i+1].mergeWith(CS.getPtrArg(i)); } @@ -1501,7 +1501,7 @@ // scalars in the old graph _used_ to point, and of the new nodes matching // nodes of the old graph. ReachabilityCloner RC(*this, Graph, CloneFlags); - + // Map the return node pointer over. if (!CS.getRetVal().isNull()) RC.merge(CS.getRetVal(), Args[0]); @@ -1510,11 +1510,11 @@ for (unsigned i = 0, e = CS.getNumPtrArgs(); i != e; ++i) { if (i == Args.size()-1) break; - + // Add the link from the argument scalar to the provided value. RC.merge(CS.getPtrArg(i), Args[i+1]); } - + // We generally don't want to copy global nodes or aux calls from the callee // graph to the caller graph. However, we have to copy them if there is a // path from the node to a node we have already copied which does not go @@ -1548,7 +1548,7 @@ // Copy aux calls that are needed. for (unsigned i = 0, e = AuxCallToCopy.size(); i != e; ++i) AuxFunctionCalls.push_back(DSCallSite(*AuxCallToCopy[i], RC)); - + // Copy globals that are needed. for (unsigned i = 0, e = GlobalsToCopy.size(); i != e; ++i) RC.getClonedNH(Graph.getNodeForValue(GlobalsToCopy[i])); @@ -1759,7 +1759,7 @@ killIfUselessEdge(CS.getRetVal()); for (unsigned a = 0, e = CS.getNumPtrArgs(); a != e; ++a) killIfUselessEdge(CS.getPtrArg(a)); - + #if 0 // If this call site calls the same function as the last call site, and if // the function pointer contains an external function, this node will @@ -1776,7 +1776,7 @@ else LastCalleeContainsExternalFunction = LastCalleeFunc->isExternal(); } - + // It is not clear why, but enabling this code makes DSA really // sensitive to node forwarding. Basically, with this enabled, DSA // performs different number of inlinings based on which nodes are @@ -1791,11 +1791,11 @@ NumDuplicateCalls > 20 #endif ) { - + std::list::iterator PrevIt = OldIt; --PrevIt; PrevIt->mergeWith(CS); - + // No need to keep this call anymore. Calls.erase(OldIt); ++NumDeleted; @@ -1957,7 +1957,7 @@ void DSCallSite::markReachableNodes(hash_set &Nodes) const { getRetVal().getNode()->markReachableNodes(Nodes); if (isIndirectCall()) getCalleeNode()->markReachableNodes(Nodes); - + for (unsigned i = 0, e = getNumPtrArgs(); i != e; ++i) getPtrArg(i).getNode()->markReachableNodes(Nodes); } @@ -2055,7 +2055,7 @@ // Make sure that all globals are cloned over as roots. if (!(Flags & DSGraph::RemoveUnreachableGlobals) && GlobalsGraph) { - DSGraph::ScalarMapTy::iterator SMI = + DSGraph::ScalarMapTy::iterator SMI = GlobalsGraph->getScalarMap().find(I->first); if (SMI != GlobalsGraph->getScalarMap().end()) GGCloner.merge(SMI->second, I->second); @@ -2079,7 +2079,7 @@ // Now find globals and aux call nodes that are already live or reach a live // value (which makes them live in turn), and continue till no more are found. - // + // bool Iterate; hash_set Visited; hash_set AuxFCallsAlive; @@ -2092,7 +2092,7 @@ Iterate = false; if (!(Flags & DSGraph::RemoveUnreachableGlobals)) for (unsigned i = 0; i != GlobalNodes.size(); ++i) - if (CanReachAliveNodes(GlobalNodes[i].second, Alive, Visited, + if (CanReachAliveNodes(GlobalNodes[i].second, Alive, Visited, Flags & DSGraph::RemoveUnreachableGlobals)) { std::swap(GlobalNodes[i--], GlobalNodes.back()); // Move to end to... GlobalNodes.pop_back(); // erase efficiently @@ -2124,7 +2124,7 @@ // Copy and merge global nodes and dead aux call nodes into the // GlobalsGraph, and all nodes reachable from those nodes. Update their // target pointers using the GGCloner. - // + // if (!(Flags & DSGraph::RemoveUnreachableGlobals)) GlobalsGraph->AuxFunctionCalls.push_back(DSCallSite(*CI, GGCloner)); @@ -2180,7 +2180,7 @@ #if 0 if (CS.getNumPtrArgs() && CS.getCalleeNode() == CS.getPtrArg(0).getNode() && CS.getCalleeNode() && CS.getCalleeNode()->getGlobals().empty()) - std::cerr << "WARNING: WEIRD CALL SITE FOUND!\n"; + std::cerr << "WARNING: WEIRD CALL SITE FOUND!\n"; #endif } AssertNodeInGraph(CS.getRetVal().getNode()); @@ -2250,7 +2250,7 @@ } return; } - + Entry.setTo(N2, NH2.getOffset()-NH1.getOffset()); // Loop over all of the fields that N1 and N2 have in common, recursively @@ -2284,7 +2284,7 @@ E = SM.global_end(); I != E; ++I) DSGraph::computeNodeMapping(SM[*I], GG.getNodeForValue(*I), NodeMap); } - + /// computeGGToGMapping - Compute the mapping of nodes in the global graph to /// nodes in this graph. Note that any uses of this method are probably bugs, /// unless it is known that the globals graph has been merged into this graph! @@ -2298,7 +2298,7 @@ NodeMap.erase(NodeMap.begin()); } } - + /// computeCalleeCallerMapping - Given a call from a function in the current /// graph to the 'Callee' function (which lives in 'CalleeGraph'), compute the @@ -2309,7 +2309,7 @@ DSCallSite CalleeArgs = CalleeGraph.getCallSiteForArguments(const_cast(Callee)); - + computeNodeMapping(CalleeArgs.getRetVal(), CS.getRetVal(), NodeMap); unsigned NumArgs = CS.getNumPtrArgs(); @@ -2318,18 +2318,18 @@ for (unsigned i = 0; i != NumArgs; ++i) computeNodeMapping(CalleeArgs.getPtrArg(i), CS.getPtrArg(i), NodeMap); - + // Map the nodes that are pointed to by globals. DSScalarMap &CalleeSM = CalleeGraph.getScalarMap(); DSScalarMap &CallerSM = getScalarMap(); if (CalleeSM.global_size() >= CallerSM.global_size()) { - for (DSScalarMap::global_iterator GI = CallerSM.global_begin(), + for (DSScalarMap::global_iterator GI = CallerSM.global_begin(), E = CallerSM.global_end(); GI != E; ++GI) if (CalleeSM.global_count(*GI)) computeNodeMapping(CalleeSM[*GI], CallerSM[*GI], NodeMap); } else { - for (DSScalarMap::global_iterator GI = CalleeSM.global_begin(), + for (DSScalarMap::global_iterator GI = CalleeSM.global_begin(), E = CalleeSM.global_end(); GI != E; ++GI) if (CallerSM.global_count(*GI)) computeNodeMapping(CalleeSM[*GI], CallerSM[*GI], NodeMap); Index: llvm/lib/Analysis/DataStructure/DataStructureAA.cpp diff -u llvm/lib/Analysis/DataStructure/DataStructureAA.cpp:1.37 llvm/lib/Analysis/DataStructure/DataStructureAA.cpp:1.38 --- llvm/lib/Analysis/DataStructure/DataStructureAA.cpp:1.37 Sun Mar 27 15:57:09 2005 +++ llvm/lib/Analysis/DataStructure/DataStructureAA.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- DataStructureAA.cpp - Data Structure Based Alias Analysis ----------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This pass uses the top-down data structure graphs to implement a simple @@ -68,7 +68,7 @@ //------------------------------------------------ // Implement the AliasAnalysis API - // + // AliasResult alias(const Value *V1, unsigned V1Size, const Value *V2, unsigned V2Size); @@ -124,14 +124,14 @@ DSGraph *G1 = getGraphForValue(V1); DSGraph *G2 = getGraphForValue(V2); assert((!G1 || !G2 || G1 == G2) && "Alias query for 2 different functions?"); - + // Get the graph to use... DSGraph &G = *(G1 ? G1 : (G2 ? G2 : &TD->getGlobalsGraph())); const DSGraph::ScalarMapTy &GSM = G.getScalarMap(); DSGraph::ScalarMapTy::const_iterator I = GSM.find((Value*)V1); if (I == GSM.end()) return NoAlias; - + DSGraph::ScalarMapTy::const_iterator J = GSM.find((Value*)V2); if (J == GSM.end()) return NoAlias; @@ -188,10 +188,10 @@ HaveMappingInfo: assert(N && "Null pointer in scalar map??"); - + typedef std::multimap::iterator NodeMapIt; std::pair Range = CallerCalleeMap.equal_range(N); - + // Loop over all of the nodes in the callee that correspond to "N", keeping // track of aggregate mod/ref info. bool NeverReads = true, NeverWrites = true; @@ -203,13 +203,13 @@ if (NeverReads == false && NeverWrites == false) return AliasAnalysis::getModRefInfo(CS, P, Size); } - + ModRefResult Result = ModRef; if (NeverWrites) // We proved it was not modified. Result = ModRefResult(Result & ~Mod); if (NeverReads) // We proved it was not read. Result = ModRefResult(Result & ~Ref); - + return ModRefResult(Result & AliasAnalysis::getModRefInfo(CS, P, Size)); } Index: llvm/lib/Analysis/DataStructure/DataStructureOpt.cpp diff -u llvm/lib/Analysis/DataStructure/DataStructureOpt.cpp:1.11 llvm/lib/Analysis/DataStructure/DataStructureOpt.cpp:1.12 --- llvm/lib/Analysis/DataStructure/DataStructureOpt.cpp:1.11 Thu Mar 17 09:36:21 2005 +++ llvm/lib/Analysis/DataStructure/DataStructureOpt.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- DataStructureOpt.cpp - Data Structure Analysis Based Optimizations -===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This pass uses DSA to a series of simple optimizations, like marking @@ -66,7 +66,7 @@ DSNode *GNode = 0; DSGraph::ScalarMapTy::const_iterator SMI = SM.find(I); if (SMI != SM.end()) GNode = SMI->second.getNode(); - + if (GNode == 0 && I->hasInternalLinkage()) { // If there is no entry in the scalar map for this global, it was never // referenced in the program. If it has internal linkage, that means we Index: llvm/lib/Analysis/DataStructure/DataStructureStats.cpp diff -u llvm/lib/Analysis/DataStructure/DataStructureStats.cpp:1.17 llvm/lib/Analysis/DataStructure/DataStructureStats.cpp:1.18 --- llvm/lib/Analysis/DataStructure/DataStructureStats.cpp:1.17 Sat Mar 19 20:40:27 2005 +++ llvm/lib/Analysis/DataStructure/DataStructureStats.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- DataStructureStats.cpp - Various statistics for DS Graphs ----------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a little pass that prints out statistics for DS Graphs. @@ -76,7 +76,7 @@ unsigned numIndirectCalls = 0, totalNumCallees = 0; for (DSGraph::fc_iterator I = TDGraph->fc_begin(), E = TDGraph->fc_end(); - I != E; ++I) + I != E; ++I) if (isIndirectCallee(I->getCallSite().getCalledValue())) { // This is an indirect function call std::vector Callees; @@ -90,10 +90,10 @@ << "' at call: \n" << *I->getCallSite().getInstruction(); } - + TotalNumCallees += totalNumCallees; NumIndirectCalls += numIndirectCalls; - + if (numIndirectCalls) std::cout << " In function " << F.getName() << ": " << (totalNumCallees / (double) numIndirectCalls) Index: llvm/lib/Analysis/DataStructure/EquivClassGraphs.cpp diff -u llvm/lib/Analysis/DataStructure/EquivClassGraphs.cpp:1.43 llvm/lib/Analysis/DataStructure/EquivClassGraphs.cpp:1.44 --- llvm/lib/Analysis/DataStructure/EquivClassGraphs.cpp:1.43 Sat Apr 2 14:08:17 2005 +++ llvm/lib/Analysis/DataStructure/EquivClassGraphs.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- EquivClassGraphs.cpp - Merge equiv-class graphs & inline bottom-up -===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This pass is the same as the complete bottom-up graphs, but @@ -50,12 +50,12 @@ DSGraph::NodeMapTy GlobalsGraphNodeMapping; G.computeGToGGMapping(GlobalsGraphNodeMapping); - } + } } #endif // getSomeCalleeForCallSite - Return any one callee function at a call site. -// +// Function *EquivClassGraphs::getSomeCalleeForCallSite(const CallSite &CS) const{ Function *thisFunc = CS.getCaller(); assert(thisFunc && "getSomeCalleeForCallSite(): Not a valid call site?"); @@ -94,7 +94,7 @@ } else { std::cerr << "Fold Graphs: No 'main' function found!\n"; } - + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) if (!I->isExternal()) processSCC(getOrCreateGraph(*I), Stack, NextID, ValMap); @@ -110,7 +110,7 @@ if (MainFunc && !MainFunc->isExternal()) { DSGraph &MainGraph = getOrCreateGraph(*MainFunc); const DSGraph &GG = *MainGraph.getGlobalsGraph(); - ReachabilityCloner RC(MainGraph, GG, + ReachabilityCloner RC(MainGraph, GG, DSGraph::DontCloneCallNodes | DSGraph::DontCloneAuxCallNodes); @@ -121,7 +121,7 @@ RC.getClonedNH(GG.getNodeForValue(*I)); MainGraph.maskIncompleteMarkers(); - MainGraph.markIncompleteNodes(DSGraph::MarkFormalArgs | + MainGraph.markIncompleteNodes(DSGraph::MarkFormalArgs | DSGraph::IgnoreGlobals); } @@ -158,7 +158,7 @@ // void EquivClassGraphs::buildIndirectFunctionSets(Module &M) { const ActualCalleesTy& AC = CBU->getActualCallees(); - + // Loop over all of the indirect calls in the program. If a call site can // call multiple different functions, we need to unify all of the callees into // the same equivalence class. @@ -204,7 +204,7 @@ // equivalence class. More precisely, if F is in the class, and G(F) is // its graph, then we include all other functions that are also in G(F). // Currently, that is just the functions in the same call-graph-SCC as F. - // + // DSGraph& funcDSGraph = CBU->getDSGraph(*I->second); for (DSGraph::retnodes_iterator RI = funcDSGraph.retnodes_begin(), RE = funcDSGraph.retnodes_end(); RI != RE; ++RI) @@ -242,24 +242,24 @@ DSGraph &MergedG = getOrCreateGraph(*LF); // Record the argument nodes for use in merging later below. - std::vector ArgNodes; + std::vector ArgNodes; for (Function::arg_iterator AI = LF->arg_begin(), E = LF->arg_end(); AI != E; ++AI) if (DS::isPointerType(AI->getType())) ArgNodes.push_back(MergedG.getNodeForValue(AI)); - + // Merge in the graphs of all other functions in this equiv. class. Note // that two or more functions may have the same graph, and it only needs // to be merged in once. std::set GraphsMerged; GraphsMerged.insert(&CBU->getDSGraph(*LF)); - + for (++SI; SI != FuncECs.member_end(); ++SI) { Function *F = *SI; DSGraph *&FG = DSInfo[F]; - - DSGraph &CBUGraph = CBU->getDSGraph(*F); + + DSGraph &CBUGraph = CBU->getDSGraph(*F); if (GraphsMerged.insert(&CBUGraph).second) { // Record the "folded" graph for the function. for (DSGraph::retnodes_iterator I = CBUGraph.retnodes_begin(), @@ -267,14 +267,14 @@ assert(DSInfo[I->first] == 0 && "Graph already exists for Fn!"); DSInfo[I->first] = &MergedG; } - + // Clone this member of the equivalence class into MergedG. MergedG.cloneInto(CBUGraph); } - + // Merge the return nodes of all functions together. MergedG.getReturnNodes()[LF].mergeWith(MergedG.getReturnNodes()[F]); - + // Merge the function arguments with all argument nodes found so far. // If there are extra function args, add them to the vector of argNodes Function::arg_iterator AI2 = F->arg_begin(), AI2end = F->arg_end(); @@ -282,7 +282,7 @@ arg != numArgs && AI2 != AI2end; ++AI2, ++arg) if (DS::isPointerType(AI2->getType())) ArgNodes[arg].mergeWith(MergedG.getNodeForValue(AI2)); - + for ( ; AI2 != AI2end; ++AI2) if (DS::isPointerType(AI2->getType())) ArgNodes.push_back(MergedG.getNodeForValue(AI2)); @@ -319,7 +319,7 @@ unsigned EquivClassGraphs:: -processSCC(DSGraph &FG, std::vector &Stack, unsigned &NextID, +processSCC(DSGraph &FG, std::vector &Stack, unsigned &NextID, std::map &ValMap) { std::map::iterator It = ValMap.lower_bound(&FG); if (It != ValMap.end() && It->first == &FG) @@ -366,7 +366,7 @@ for (DSGraph::retnodes_iterator I = NG->retnodes_begin(); I != NG->retnodes_end(); ++I) DSInfo[I->first] = &FG; - + // Remove NG from the ValMap since the pointer may get recycled. ValMap.erase(NG); delete NG; @@ -404,14 +404,14 @@ assert(calls.insert(TheCall).second && "Call instruction occurs multiple times in graph??"); - + if (CS.getRetVal().isNull() && CS.getNumPtrArgs() == 0) continue; // Inline the common callee graph into the current graph, if the callee // graph has not changed. Note that all callees should have the same // graph so we only need to do this once. - // + // DSGraph* CalleeGraph = NULL; callee_iterator I = callee_begin(TheCall), E = callee_end(TheCall); unsigned TNum, Num; @@ -424,12 +424,12 @@ // Now check if the graph has changed and if so, clone and inline it. if (I != E) { Function *CalleeFunc = I->second; - + // Merge the callee's graph into this graph, if not already the same. // Callees in the same equivalence class (which subsumes those // in the same SCCs) have the same graph. Note that all recursion // including self-recursion have been folded in the equiv classes. - // + // CalleeGraph = &getOrCreateGraph(*CalleeFunc); if (CalleeGraph != &G) { ++NumFoldGraphInlines; @@ -463,7 +463,7 @@ // Recompute the Incomplete markers. G.maskIncompleteMarkers(); G.markIncompleteNodes(DSGraph::MarkFormalArgs); - + // Delete dead nodes. Treat globals that are unreachable but that can // reach live nodes as live. G.removeDeadNodes(DSGraph::KeepUnreachableGlobals); @@ -476,7 +476,7 @@ // globals graph. DSScalarMap &MainSM = G.getScalarMap(); for (DSScalarMap::global_iterator I = MainSM.global_begin(), - E = MainSM.global_end(); I != E; ++I) + E = MainSM.global_end(); I != E; ++I) RC.getClonedNH(MainSM[*I]); DEBUG(std::cerr << " -- DONE ProcessGraph for function " Index: llvm/lib/Analysis/DataStructure/GraphChecker.cpp diff -u llvm/lib/Analysis/DataStructure/GraphChecker.cpp:1.17 llvm/lib/Analysis/DataStructure/GraphChecker.cpp:1.18 --- llvm/lib/Analysis/DataStructure/GraphChecker.cpp:1.17 Wed Mar 16 16:42:19 2005 +++ llvm/lib/Analysis/DataStructure/GraphChecker.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- GraphChecker.cpp - Assert that various graph properties hold -------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This pass is used to test DSA with regression tests. It can be used to check @@ -39,7 +39,7 @@ cl::desc("Specify which DSA pass the -datastructure-gc pass should use"), cl::values(clEnumVal(local, "Local pass"), clEnumVal(bu, "Bottom-up pass"), - clEnumVal(td, "Top-down pass"), + clEnumVal(td, "Top-down pass"), clEnumValEnd), cl::init(local)); cl::opt @@ -133,7 +133,7 @@ std::set AbortIfMergedS(AbortIfMerged.begin(), AbortIfMerged.end()); std::map CheckFlagsM; - + for (cl::list::iterator I = CheckFlags.begin(), E = CheckFlags.end(); I != E; ++I) { std::string::size_type ColonPos = I->rfind(':'); @@ -158,18 +158,18 @@ } CheckFlagsM[std::string(I->begin(), I->begin()+ColonPos)] = Flags; } - + // Now we loop over all of the scalars, checking to see if any are collapsed // that are not supposed to be, or if any are merged together. const DSGraph::ScalarMapTy &SM = G.getScalarMap(); std::map AbortIfMergedNodes; - + for (DSGraph::ScalarMapTy::const_iterator I = SM.begin(), E = SM.end(); I != E; ++I) if (I->first->hasName() && I->second.getNode()) { const std::string &Name = I->first->getName(); DSNode *N = I->second.getNode(); - + // Verify it is not collapsed if it is not supposed to be... if (N->isNodeCompletelyFolded() && AbortIfCollapsedS.count(Name)) { std::cerr << "Node for value '%" << Name << "' is collapsed: "; Index: llvm/lib/Analysis/DataStructure/Local.cpp diff -u llvm/lib/Analysis/DataStructure/Local.cpp:1.132 llvm/lib/Analysis/DataStructure/Local.cpp:1.133 --- llvm/lib/Analysis/DataStructure/Local.cpp:1.132 Mon Mar 21 20:45:13 2005 +++ llvm/lib/Analysis/DataStructure/Local.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- Local.cpp - Compute a local data structure graph for a function ----===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Compute the local version of the data structure graph for a function. The @@ -76,7 +76,7 @@ std::list *FunctionCalls; public: - GraphBuilder(Function &f, DSGraph &g, DSNodeHandle &retNode, + GraphBuilder(Function &f, DSGraph &g, DSNodeHandle &retNode, std::list &fc) : G(g), RetNode(&retNode), ScalarMap(G.getScalarMap()), FunctionCalls(&fc) { @@ -148,7 +148,7 @@ /// void setDestTo(Value &V, const DSNodeHandle &NH); - /// getValueDest - Return the DSNode that the actual value points to. + /// getValueDest - Return the DSNode that the actual value points to. /// DSNodeHandle getValueDest(Value &V); @@ -182,7 +182,7 @@ // initializers into the local graph from the globals graph. if (ScalarMap.global_begin() != ScalarMap.global_end()) { ReachabilityCloner RC(*this, *GG, 0); - + for (DSScalarMap::global_iterator I = ScalarMap.global_begin(); I != ScalarMap.global_end(); ++I) if (GlobalVariable *GV = dyn_cast(*I)) @@ -313,7 +313,7 @@ void GraphBuilder::visitSelectInst(SelectInst &SI) { if (!isPointerType(SI.getType())) return; // Only pointer Selects - + DSNodeHandle &Dest = ScalarMap[&SI]; Dest.mergeWith(getValueDest(*SI.getOperand(1))); Dest.mergeWith(getValueDest(*SI.getOperand(2))); @@ -573,7 +573,7 @@ AI != E; ++AI) { if (isPointerType((*AI)->getType())) if (DSNode *N = getValueDest(**AI).getNode()) - N->setReadMarker(); + N->setReadMarker(); } return; } else if (F->getName() == "read" || F->getName() == "pipe" || @@ -583,7 +583,7 @@ AI != E; ++AI) { if (isPointerType((*AI)->getType())) if (DSNode *N = getValueDest(**AI).getNode()) - N->setModifiedMarker(); + N->setModifiedMarker(); } return; } else if (F->getName() == "stat" || F->getName() == "fstat" || @@ -630,7 +630,7 @@ if (isPointerType((*AI)->getType())) if (DSNode *N = getValueDest(**AI).getNode()) N->setReadMarker(); - + // fopen allocates in an unknown way and writes to the file // descriptor. Also, merge the allocated type into the node. DSNodeHandle Result = getValueDest(*CS.getInstruction()); @@ -661,7 +661,7 @@ N->mergeTypeInfo(PTy->getElementType(), H.getOffset()); } return; - } else if (CS.arg_end()-CS.arg_begin() == 1 && + } else if (CS.arg_end()-CS.arg_begin() == 1 && (F->getName() == "fflush" || F->getName() == "feof" || F->getName() == "fileno" || F->getName() == "clearerr" || F->getName() == "rewind" || F->getName() == "ftell" || @@ -672,13 +672,13 @@ DSNodeHandle H = getValueDest(**CS.arg_begin()); if (DSNode *N = H.getNode()) { N->setReadMarker()->setModifiedMarker(); - + const Type *ArgTy = F->getFunctionType()->getParamType(0); if (const PointerType *PTy = dyn_cast(ArgTy)) N->mergeTypeInfo(PTy->getElementType(), H.getOffset()); } return; - } else if (CS.arg_end()-CS.arg_begin() == 4 && + } else if (CS.arg_end()-CS.arg_begin() == 4 && (F->getName() == "fwrite" || F->getName() == "fread")) { // fread writes the first operand, fwrite reads it. They both // read/write the FILE descriptor, and merges the FILE type. @@ -739,7 +739,7 @@ AI != E; ++AI) if (isPointerType((*AI)->getType())) if (DSNode *N = getValueDest(**AI).getNode()) - N->setReadMarker(); + N->setReadMarker(); return; } else if (F->getName() == "fseek" || F->getName() == "fgetpos" || F->getName() == "fsetpos") { @@ -789,7 +789,7 @@ // printf reads all pointer arguments. if (isPointerType((*AI)->getType())) if (DSNode *N = getValueDest(**AI).getNode()) - N->setReadMarker(); + N->setReadMarker(); } return; } else if (F->getName() == "vprintf" || F->getName() == "vfprintf" || @@ -825,7 +825,7 @@ N->setReadMarker(); ++AI; } - + // Read the valist, and the pointed-to objects. if (AI != E && isPointerType((*AI)->getType())) { const DSNodeHandle &VAList = getValueDest(**AI); @@ -869,7 +869,7 @@ // scanf writes all pointer arguments. if (isPointerType((*AI)->getType())) if (DSNode *N = getValueDest(**AI).getNode()) - N->setModifiedMarker(); + N->setModifiedMarker(); } return; } else if (F->getName() == "strtok") { @@ -905,7 +905,7 @@ if (isPointerType((*AI)->getType())) if (DSNode *N = getValueDest(**AI).getNode()) N->setReadMarker(); - + if (DSNode *N = H.getNode()) N->setReadMarker(); return; @@ -1079,23 +1079,23 @@ GlobalValue *First = GVs[0]; for (unsigned i = 1, e = GVs.size(); i != e; ++i) GlobalECs.unionSets(First, GVs[i]); - + // Next, get the leader element. assert(First == GlobalECs.getLeaderValue(First) && "First did not end up being the leader?"); - + // Next, remove all globals from the scalar map that are not the leader. assert(GVs[0] == First && "First had to be at the front!"); for (unsigned i = 1, e = GVs.size(); i != e; ++i) { ECGlobals.insert(GVs[i]); SM.erase(SM.find(GVs[i])); } - + // Finally, change the global node to only contain the leader. I->clearGlobals(); I->addGlobal(First); } - + DEBUG(GG.AssertGraphOK()); } @@ -1151,7 +1151,7 @@ GlobalsGraph = new DSGraph(GlobalECs, TD); { GraphBuilder GGB(*GlobalsGraph); - + // Add initializers for all of the globals to the globals graph. for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) Index: llvm/lib/Analysis/DataStructure/Printer.cpp diff -u llvm/lib/Analysis/DataStructure/Printer.cpp:1.82 llvm/lib/Analysis/DataStructure/Printer.cpp:1.83 --- llvm/lib/Analysis/DataStructure/Printer.cpp:1.82 Sat Apr 2 14:08:17 2005 +++ llvm/lib/Analysis/DataStructure/Printer.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- Printer.cpp - Code for printing data structure graphs nicely -------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the 'dot' graph printer. @@ -76,7 +76,7 @@ EquivalenceClasses *GlobalECs = 0; if (G) GlobalECs = &G->getGlobalECs(); - + for (unsigned i = 0, e = N->getGlobalsList().size(); i != e; ++i) { WriteAsOperand(OS, N->getGlobalsList()[i], false, true, M); @@ -85,7 +85,7 @@ EquivalenceClasses::iterator I = GlobalECs->findValue(N->getGlobalsList()[i]); if (I != GlobalECs->end()) { - unsigned NumMembers = + unsigned NumMembers = std::distance(GlobalECs->member_begin(I), GlobalECs->member_end()); if (NumMembers != 1) OS << " + " << (NumMembers-1) << " EC"; } @@ -132,7 +132,7 @@ return R; } - + /// addCustomGraphFeatures - Use this graph writing hook to emit call nodes /// and the return node. /// @@ -156,7 +156,7 @@ std::stringstream OS; WriteAsOperand(OS, I->first, false, true, CurMod); GW.emitSimpleNode(I->first, "", OS.str()); - + // Add edge from return node to real destination DSNode *DestNode = I->second.getNode(); int EdgeDest = I->second.getOffset() >> DS::PointerShift; @@ -241,7 +241,7 @@ std::string Filename = GraphName + ".dot"; O << "Writing '" << Filename << "'..."; std::ofstream F(Filename.c_str()); - + if (F.good()) { print(F); unsigned NumCalls = shouldPrintAuxCalls() ? @@ -329,7 +329,7 @@ << GG.getGraphSize() << "+" << GG.getFunctionCalls().size() << "]\n"; } - O << "\nGraphs contain [" << TotalNumNodes << "+" << TotalCallNodes + O << "\nGraphs contain [" << TotalNumNodes << "+" << TotalCallNodes << "] nodes total" << std::endl; } Index: llvm/lib/Analysis/DataStructure/Steensgaard.cpp diff -u llvm/lib/Analysis/DataStructure/Steensgaard.cpp:1.60 llvm/lib/Analysis/DataStructure/Steensgaard.cpp:1.61 --- llvm/lib/Analysis/DataStructure/Steensgaard.cpp:1.60 Sat Apr 2 13:17:18 2005 +++ llvm/lib/Analysis/DataStructure/Steensgaard.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- Steensgaard.cpp - Context Insensitive Alias Analysis ---------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This pass uses the data structure graphs to implement a simple context @@ -59,7 +59,7 @@ //------------------------------------------------ // Implement the AliasAnalysis API - // + // AliasResult alias(const Value *V1, unsigned V1Size, const Value *V2, unsigned V2Size); @@ -140,12 +140,12 @@ for (std::list::iterator CI = Calls.begin(), E = Calls.end(); CI != E;) { DSCallSite &CurCall = *CI++; - + // Loop over the called functions, eliminating as many as possible... std::vector CallTargets; if (CurCall.isDirectCall()) CallTargets.push_back(CurCall.getCalleeFunc()); - else + else CurCall.getCalleeNode()->addFullFunctionList(CallTargets); for (unsigned c = 0; c != CallTargets.size(); ) { @@ -239,11 +239,11 @@ AliasAnalysis::ModRefResult Steens::getModRefInfo(CallSite CS, Value *P, unsigned Size) { AliasAnalysis::ModRefResult Result = ModRef; - + // Find the node in question. DSGraph::ScalarMapTy &GSM = ResultGraph->getScalarMap(); DSGraph::ScalarMapTy::iterator I = GSM.find(P); - + if (I != GSM.end() && !I->second.isNull()) { DSNode *N = I->second.getNode(); if (N->isComplete()) { @@ -253,7 +253,7 @@ if (Function *F = CS.getCalledFunction()) if (F->isExternal()) return NoModRef; - + // Otherwise, if the node is complete, but it is only M or R, return this. // This can be useful for globals that should be marked const but are not. if (!N->isModified()) Index: llvm/lib/Analysis/DataStructure/TopDownClosure.cpp diff -u llvm/lib/Analysis/DataStructure/TopDownClosure.cpp:1.88 llvm/lib/Analysis/DataStructure/TopDownClosure.cpp:1.89 --- llvm/lib/Analysis/DataStructure/TopDownClosure.cpp:1.88 Sat Apr 2 14:17:09 2005 +++ llvm/lib/Analysis/DataStructure/TopDownClosure.cpp Thu Apr 21 16:07:28 2005 @@ -1,10 +1,10 @@ //===- TopDownClosure.cpp - Compute the top-down interprocedure closure ---===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the TDDataStructures class, which represents the @@ -135,7 +135,7 @@ delete IndCallMap.begin()->second; IndCallMap.erase(IndCallMap.begin()); } - + ArgsRemainIncomplete.clear(); GlobalsGraph->removeTriviallyDeadNodes(); @@ -170,7 +170,7 @@ DSGraph &G = getOrCreateDSGraph(F); if (Visited.count(&G)) return; Visited.insert(&G); - + // Recursively traverse all of the callee graphs. for (DSGraph::fc_iterator CI = G.fc_begin(), CE = G.fc_end(); CI != CE; ++CI){ Instruction *CallI = CI->getCallSite().getInstruction(); @@ -214,12 +214,12 @@ // sites that call into this graph. std::vector EdgesFromCaller; std::map >::iterator - CEI = CallerEdges.find(&DSG); + CEI = CallerEdges.find(&DSG); if (CEI != CallerEdges.end()) { std::swap(CEI->second, EdgesFromCaller); CallerEdges.erase(CEI); } - + // Sort the caller sites to provide a by-caller-graph ordering. std::sort(EdgesFromCaller.begin(), EdgesFromCaller.end()); @@ -267,7 +267,7 @@ getParent()->getParent()->getName() << "'"); DEBUG(std::cerr << ": " << CF.getFunctionType()->getNumParams() << " args\n"); - + // Get the formal argument and return nodes for the called function and // merge them with the cloned subgraph. DSCallSite T1 = DSG.getCallSiteForArguments(CF); @@ -356,7 +356,7 @@ // so we build up a new, private, graph that represents the calls of all // calls to this set of functions. std::vector Callees; - for (BUDataStructures::ActualCalleesTy::const_iterator I = + for (BUDataStructures::ActualCalleesTy::const_iterator I = BUInfo->callee_begin(CallI), E = BUInfo->callee_end(CallI); I != E; ++I) if (!I->second->isExternal()) From brukman at cs.uiuc.edu Thu Apr 21 16:08:55 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 16:08:55 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/IPA/Andersens.cpp CallGraph.cpp CallGraphSCCPass.cpp FindUnsafePointerTypes.cpp FindUsedTypes.cpp GlobalsModRef.cpp PrintSCC.cpp Message-ID: <200504212108.QAA03327@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/IPA: Andersens.cpp updated: 1.23 -> 1.24 CallGraph.cpp updated: 1.47 -> 1.48 CallGraphSCCPass.cpp updated: 1.9 -> 1.10 FindUnsafePointerTypes.cpp updated: 1.27 -> 1.28 FindUsedTypes.cpp updated: 1.31 -> 1.32 GlobalsModRef.cpp updated: 1.15 -> 1.16 PrintSCC.cpp updated: 1.13 -> 1.14 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+53 -53) Andersens.cpp | 32 ++++++++++++++++---------------- CallGraph.cpp | 10 +++++----- CallGraphSCCPass.cpp | 4 ++-- FindUnsafePointerTypes.cpp | 14 +++++++------- FindUsedTypes.cpp | 16 ++++++++-------- GlobalsModRef.cpp | 22 +++++++++++----------- PrintSCC.cpp | 8 ++++---- 7 files changed, 53 insertions(+), 53 deletions(-) Index: llvm/lib/Analysis/IPA/Andersens.cpp diff -u llvm/lib/Analysis/IPA/Andersens.cpp:1.23 llvm/lib/Analysis/IPA/Andersens.cpp:1.24 --- llvm/lib/Analysis/IPA/Andersens.cpp:1.23 Mon Apr 4 20:12:03 2005 +++ llvm/lib/Analysis/IPA/Andersens.cpp Thu Apr 21 16:08:44 2005 @@ -1,10 +1,10 @@ //===- Andersens.cpp - Andersen's Interprocedural Alias Analysis ----------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines a very simple implementation of Andersen's interprocedural @@ -43,8 +43,8 @@ // // Future Improvements: // This implementation of Andersen's algorithm is extremely slow. To make it -// scale reasonably well, the inclusion constraints could be sorted (easy), -// offline variable substitution would be a huge win (straight-forward), and +// scale reasonably well, the inclusion constraints could be sorted (easy), +// offline variable substitution would be a huge win (straight-forward), and // online cycle elimination (trickier) might help as well. // //===----------------------------------------------------------------------===// @@ -137,7 +137,7 @@ std::map ValueNodes; /// ObjectNodes - This map contains entries for each memory object in the - /// program: globals, alloca's and mallocs. + /// program: globals, alloca's and mallocs. std::map ObjectNodes; /// ReturnNodes - This map contains an entry for each function in the @@ -161,7 +161,7 @@ Constraint(ConstraintType Ty, Node *D, Node *S) : Type(Ty), Dest(D), Src(S) {} }; - + /// Constraints - This vector contains a list of all of the constraints /// identified by the program. std::vector Constraints; @@ -193,7 +193,7 @@ NullPtr = 1, NullObject = 2, }; - + public: bool runOnModule(Module &M) { InitializeAliasAnalysis(this); @@ -209,7 +209,7 @@ ReturnNodes.clear(); VarargNodes.clear(); EscapingInternalFunctions.clear(); - std::vector().swap(Constraints); + std::vector().swap(Constraints); return false; } @@ -232,7 +232,7 @@ //------------------------------------------------ // Implement the AliasAnalysis API - // + // AliasResult alias(const Value *V1, unsigned V1Size, const Value *V2, unsigned V2Size); ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size); @@ -265,7 +265,7 @@ } return &GraphNodes[I->second]; } - + /// getObject - Return the node corresponding to the memory object for the /// specified global or allocation instruction. Node *getObject(Value *V) { @@ -415,7 +415,7 @@ } } } - + AliasAnalysis::getMustAliases(P, RetVals); } @@ -572,7 +572,7 @@ if (C->getType()->isFirstClassType()) { if (isa(C->getType())) N->copyFrom(getNodeForConstantPointer(C)); - + } else if (C->isNullValue()) { N->addPointerTo(&GraphNodes[NullObject]); return; @@ -607,7 +607,7 @@ F->getName() == "atol" || F->getName() == "atoll" || F->getName() == "remove" || F->getName() == "unlink" || F->getName() == "rename" || F->getName() == "memcmp" || - F->getName() == "llvm.memset" || + F->getName() == "llvm.memset" || F->getName() == "strcmp" || F->getName() == "strncmp" || F->getName() == "execl" || F->getName() == "execlp" || F->getName() == "execle" || F->getName() == "execv" || @@ -703,7 +703,7 @@ &GraphNodes[UniversalSet])); } } - + for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) { // Make the function address point to the function object. getNodeValue(*F)->addPointerTo(getObject(F)->setValue(F)); @@ -902,7 +902,7 @@ &GraphNodes[UniversalSet], getReturnNode(F))); } - + Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end(); CallSite::arg_iterator ArgI = CS.arg_begin(), ArgE = CS.arg_end(); for (; AI != AE && ArgI != ArgE; ++AI, ++ArgI) @@ -920,7 +920,7 @@ &GraphNodes[UniversalSet], getNode(*ArgI))); } - + // Copy all pointers passed through the varargs section to the varargs node. if (F->getFunctionType()->isVarArg()) for (; ArgI != ArgE; ++ArgI) Index: llvm/lib/Analysis/IPA/CallGraph.cpp diff -u llvm/lib/Analysis/IPA/CallGraph.cpp:1.47 llvm/lib/Analysis/IPA/CallGraph.cpp:1.48 --- llvm/lib/Analysis/IPA/CallGraph.cpp:1.47 Fri Nov 19 10:22:24 2004 +++ llvm/lib/Analysis/IPA/CallGraph.cpp Thu Apr 21 16:08:44 2005 @@ -1,10 +1,10 @@ //===- CallGraph.cpp - Build a Module's call graph ------------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the CallGraph class. @@ -57,7 +57,7 @@ Root = Node; // Found a main, keep track of it! } } - + // If this function is not defined in this translation unit, it could call // anything. if (F->isExternal() && !F->getIntrinsicID()) @@ -113,7 +113,7 @@ // If we didn't find a main function, use the external call graph node if (Root == 0) Root = ExternalCallingNode; - + return false; } @@ -148,7 +148,7 @@ OS << F->getName() << "\n"; else OS << "<>\n"; - + for (CallGraph::const_iterator I = begin(), E = end(); I != E; ++I) I->second->print(OS); } Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.9 llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.10 --- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.9 Sun Sep 19 23:45:09 2004 +++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp Thu Apr 21 16:08:44 2005 @@ -1,10 +1,10 @@ //===- CallGraphSCCPass.cpp - Pass that operates BU on call graph ---------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the CallGraphSCCPass class, which is used for passes Index: llvm/lib/Analysis/IPA/FindUnsafePointerTypes.cpp diff -u llvm/lib/Analysis/IPA/FindUnsafePointerTypes.cpp:1.27 llvm/lib/Analysis/IPA/FindUnsafePointerTypes.cpp:1.28 --- llvm/lib/Analysis/IPA/FindUnsafePointerTypes.cpp:1.27 Sun Sep 19 23:45:09 2004 +++ llvm/lib/Analysis/IPA/FindUnsafePointerTypes.cpp Thu Apr 21 16:08:44 2005 @@ -1,13 +1,13 @@ //===- FindUnsafePointerTypes.cpp - Check pointer usage safety ------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This file defines a pass that can be used to determine, interprocedurally, +// This file defines a pass that can be used to determine, interprocedurally, // which pointer types are accessed unsafely in a program. If there is an // "unsafe" access to a specific pointer type, transformations that depend on // type safety cannot be permitted. @@ -20,7 +20,7 @@ // // Currently, the only allowed operations on pointer types are: // alloca, malloc, free, getelementptr, load, and store -// +// //===----------------------------------------------------------------------===// #include "llvm/Analysis/FindUnsafePointerTypes.h" @@ -37,7 +37,7 @@ // Provide a command line option to turn on printing of which instructions cause // a type to become invalid // -static cl::opt +static cl::opt PrintFailures("printunsafeptrinst", cl::Hidden, cl::desc("Print Unsafe Pointer Access Instructions")); @@ -96,9 +96,9 @@ o << "SafePointerAccess Analysis: Found these unsafe types:\n"; unsigned Counter = 1; - for (std::set::const_iterator I = getUnsafeTypes().begin(), + for (std::set::const_iterator I = getUnsafeTypes().begin(), E = getUnsafeTypes().end(); I != E; ++I, ++Counter) { - + o << " #" << Counter << ". "; CW << **I << "\n"; } Index: llvm/lib/Analysis/IPA/FindUsedTypes.cpp diff -u llvm/lib/Analysis/IPA/FindUsedTypes.cpp:1.31 llvm/lib/Analysis/IPA/FindUsedTypes.cpp:1.32 --- llvm/lib/Analysis/IPA/FindUsedTypes.cpp:1.31 Mon Mar 14 22:54:18 2005 +++ llvm/lib/Analysis/IPA/FindUsedTypes.cpp Thu Apr 21 16:08:44 2005 @@ -1,10 +1,10 @@ //===- FindUsedTypes.cpp - Find all Types used by a module ----------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This pass is used to seek out all of the types in use by the program. Note @@ -32,10 +32,10 @@ // collection of used types. // void FindUsedTypes::IncorporateType(const Type *Ty) { - // If ty doesn't already exist in the used types map, add it now, otherwise + // If ty doesn't already exist in the used types map, add it now, otherwise // return. if (!UsedTypes.insert(Ty).second) return; // Already contain Ty. - + // Make sure to add any types this type references now. // for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end(); @@ -45,7 +45,7 @@ void FindUsedTypes::IncorporateValue(const Value *V) { IncorporateType(V->getType()); - + // If this is a constant, it could be using other types... if (const Constant *C = dyn_cast(V)) { if (!isa(C)) @@ -71,21 +71,21 @@ for (Module::iterator MI = m.begin(), ME = m.end(); MI != ME; ++MI) { IncorporateType(MI->getType()); const Function &F = *MI; - + // Loop over all of the instructions in the function, adding their return // type as well as the types of their operands. // for (const_inst_iterator II = inst_begin(F), IE = inst_end(F); II != IE; ++II) { const Instruction &I = *II; - + IncorporateType(I.getType()); // Incorporate the type of the instruction for (User::const_op_iterator OI = I.op_begin(), OE = I.op_end(); OI != OE; ++OI) IncorporateValue(*OI); // Insert inst operand types as well } } - + return false; } Index: llvm/lib/Analysis/IPA/GlobalsModRef.cpp diff -u llvm/lib/Analysis/IPA/GlobalsModRef.cpp:1.15 llvm/lib/Analysis/IPA/GlobalsModRef.cpp:1.16 --- llvm/lib/Analysis/IPA/GlobalsModRef.cpp:1.15 Wed Mar 23 20:41:19 2005 +++ llvm/lib/Analysis/IPA/GlobalsModRef.cpp Thu Apr 21 16:08:44 2005 @@ -1,10 +1,10 @@ //===- GlobalsModRef.cpp - Simple Mod/Ref Analysis for Globals ------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This simple pass provides alias and mod/ref information for global values @@ -58,7 +58,7 @@ return I->second; return 0; } - + /// FunctionEffect - Capture whether or not this function reads or writes to /// ANY memory. If not, we can do a lot of aggressive analysis on it. unsigned FunctionEffect; @@ -92,7 +92,7 @@ //------------------------------------------------ // Implement the AliasAnalysis API - // + // AliasResult alias(const Value *V1, unsigned V1Size, const Value *V2, unsigned V2Size); ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size); @@ -111,7 +111,7 @@ return DoesNotAccessMemory; else if ((FR->FunctionEffect & Mod) == 0) return OnlyReadsMemory; - return AliasAnalysis::getModRefBehavior(F, CS, Info); + return AliasAnalysis::getModRefBehavior(F, CS, Info); } virtual void deleteValue(Value *V); @@ -134,7 +134,7 @@ bool AnalyzeUsesOfGlobal(Value *V, std::vector &Readers, std::vector &Writers); }; - + RegisterOpt X("globalsmodref-aa", "Simple mod/ref analysis for globals"); RegisterAnalysisGroup Y; @@ -211,7 +211,7 @@ return true; } else { return true; - } + } } else if (GlobalValue *GV = dyn_cast(*UI)) { if (AnalyzeUsesOfGlobal(GV, Readers, Writers)) return true; } else { @@ -223,7 +223,7 @@ /// AnalyzeCallGraph - At this point, we know the functions where globals are /// immediately stored to and read from. Propagate this information up the call /// graph to all callers and compute the mod/ref info for all memory for each -/// function. +/// function. void GlobalsModRef::AnalyzeCallGraph(CallGraph &CG, Module &M) { // We do a bottom-up SCC traversal of the call graph. In other words, we // visit all callees before callers (leaf-first). @@ -298,13 +298,13 @@ FunctionInfo.erase(SCC[i]->getFunction()); return; } - + // Otherwise, unless we already know that this function mod/refs memory, scan // the function bodies to see if there are any explicit loads or stores. if (FunctionEffect != ModRef) { for (unsigned i = 0, e = SCC.size(); i != e && FunctionEffect != ModRef;++i) for (inst_iterator II = inst_begin(SCC[i]->getFunction()), - E = inst_end(SCC[i]->getFunction()); + E = inst_end(SCC[i]->getFunction()); II != E && FunctionEffect != ModRef; ++II) if (isa(*II)) FunctionEffect |= Ref; @@ -334,7 +334,7 @@ // If we are at some type of object... return it. if (const GlobalValue *GV = dyn_cast(V)) return GV; - + // Traverse through different addressing mechanisms... if (const Instruction *I = dyn_cast(V)) { if (isa(I) || isa(I)) Index: llvm/lib/Analysis/IPA/PrintSCC.cpp diff -u llvm/lib/Analysis/IPA/PrintSCC.cpp:1.13 llvm/lib/Analysis/IPA/PrintSCC.cpp:1.14 --- llvm/lib/Analysis/IPA/PrintSCC.cpp:1.13 Mon Dec 6 22:03:45 2004 +++ llvm/lib/Analysis/IPA/PrintSCC.cpp Thu Apr 21 16:08:44 2005 @@ -1,10 +1,10 @@ //===- PrintSCC.cpp - Enumerate SCCs in some key graphs -------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides passes to print out SCCs in a CFG or a CallGraph. @@ -17,10 +17,10 @@ // analyze -cfgscc to print the SCCs in each CFG of a module. // analyze -cfgscc -stats to print the #SCCs and the maximum SCC size. // analyze -cfgscc -debug > /dev/null to watch the algorithm in action. -// +// // and similarly: // analyze -callscc [-stats] [-debug] to print SCCs in the CallGraph -// +// // (3) To test the scc_iterator. // //===----------------------------------------------------------------------===// From lattner at cs.uiuc.edu Thu Apr 21 16:09:28 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 16:09:28 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Message-ID: <200504212109.j3LL9Sg4009465@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelPattern.cpp updated: 1.75 -> 1.76 --- Log message: Match another form of eqv --- Diffs of the changes: (+6 -1) PPC32ISelPattern.cpp | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.75 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.76 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.75 Mon Apr 18 02:48:09 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Thu Apr 21 16:09:11 2005 @@ -1899,7 +1899,7 @@ BuildMI(BB, PPC::EQV, 2, Result).addReg(Tmp1).addReg(Tmp2); return Result; } - // Check for NOT, NOR, and NAND: xor (copy, or, and), -1 + // Check for NOT, NOR, EQV, and NAND: xor (copy, or, xor, and), -1 if (N.getOperand(1).getOpcode() == ISD::Constant && cast(N.getOperand(1))->isAllOnesValue()) { switch(N.getOperand(0).getOpcode()) { @@ -1913,6 +1913,11 @@ Tmp2 = SelectExpr(N.getOperand(0).getOperand(1)); BuildMI(BB, PPC::NAND, 2, Result).addReg(Tmp1).addReg(Tmp2); break; + case ISD::XOR: + Tmp1 = SelectExpr(N.getOperand(0).getOperand(0)); + Tmp2 = SelectExpr(N.getOperand(0).getOperand(1)); + BuildMI(BB, PPC::EQV, 2, Result).addReg(Tmp1).addReg(Tmp2); + break; default: Tmp1 = SelectExpr(N.getOperand(0)); BuildMI(BB, PPC::NOR, 2, Result).addReg(Tmp1).addReg(Tmp1); From brukman at cs.uiuc.edu Thu Apr 21 16:10:22 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 16:10:22 -0500 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/Parser.cpp ParserInternals.h Message-ID: <200504212110.QAA03470@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: Parser.cpp updated: 1.14 -> 1.15 ParserInternals.h updated: 1.39 -> 1.40 --- Log message: * Remove trailing whitespace * Convert tabs to spaces --- Diffs of the changes: (+15 -15) Parser.cpp | 16 ++++++++-------- ParserInternals.h | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) Index: llvm/lib/AsmParser/Parser.cpp diff -u llvm/lib/AsmParser/Parser.cpp:1.14 llvm/lib/AsmParser/Parser.cpp:1.15 --- llvm/lib/AsmParser/Parser.cpp:1.14 Tue Jul 13 03:42:12 2004 +++ llvm/lib/AsmParser/Parser.cpp Thu Apr 21 16:10:11 2005 @@ -1,10 +1,10 @@ //===- Parser.cpp - Main dispatch module for the Parser library -------------=== -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This library implements the functionality defined in llvm/assembly/parser.h @@ -49,24 +49,24 @@ ParseException::ParseException(const std::string &filename, - const std::string &message, - int lineNo, int colNo) + const std::string &message, + int lineNo, int colNo) : Filename(filename), Message(message) { LineNo = lineNo; ColumnNo = colNo; } -ParseException::ParseException(const ParseException &E) +ParseException::ParseException(const ParseException &E) : Filename(E.Filename), Message(E.Message) { LineNo = E.LineNo; ColumnNo = E.ColumnNo; } // Includes info from options -const std::string ParseException::getMessage() const { +const std::string ParseException::getMessage() const { std::string Result; char Buffer[10]; - if (Filename == "-") + if (Filename == "-") Result += ""; else Result += Filename; @@ -79,6 +79,6 @@ Result += std::string(",") + Buffer; } } - + return Result + ": " + Message; } Index: llvm/lib/AsmParser/ParserInternals.h diff -u llvm/lib/AsmParser/ParserInternals.h:1.39 llvm/lib/AsmParser/ParserInternals.h:1.40 --- llvm/lib/AsmParser/ParserInternals.h:1.39 Sat Oct 16 13:17:13 2004 +++ llvm/lib/AsmParser/ParserInternals.h Thu Apr 21 16:10:11 2005 @@ -1,13 +1,13 @@ //===-- ParserInternals.h - Definitions internal to the parser --*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This header file defines the various variables that are shared among the +// This header file defines the various variables that are shared among the // different components of the parser... // //===----------------------------------------------------------------------===// @@ -52,21 +52,21 @@ // ThrowException - Wrapper around the ParseException class that automatically // fills in file line number and column number and options info. // -// This also helps me because I keep typing 'throw new ParseException' instead +// This also helps me because I keep typing 'throw new ParseException' instead // of just 'throw ParseException'... sigh... // static inline void ThrowException(const std::string &message, - int LineNo = -1) { + int LineNo = -1) { if (LineNo == -1) LineNo = llvmAsmlineno; // TODO: column number in exception throw ParseException(CurFilename, message, LineNo); } // ValID - Represents a reference of a definition of some sort. This may either -// be a numeric reference or a symbolic (%var) reference. This is just a +// be a numeric reference or a symbolic (%var) reference. This is just a // discriminated union. // -// Note that I can't implement this class in a straight forward manner with +// Note that I can't implement this class in a straight forward manner with // constructors and stuff because it goes in a union. // struct ValID { From lattner at cs.uiuc.edu Thu Apr 21 16:10:23 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 21 Apr 2005 16:10:23 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/PowerPC/eqv.ll Message-ID: <200504212110.j3LLANmV009496@apoc.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/PowerPC: eqv.ll added (r1.1) --- Log message: Check for eqv matching --- Diffs of the changes: (+13 -0) eqv.ll | 13 +++++++++++++ 1 files changed, 13 insertions(+) Index: llvm/test/Regression/CodeGen/PowerPC/eqv.ll diff -c /dev/null llvm/test/Regression/CodeGen/PowerPC/eqv.ll:1.1 *** /dev/null Thu Apr 21 16:10:17 2005 --- llvm/test/Regression/CodeGen/PowerPC/eqv.ll Thu Apr 21 16:10:07 2005 *************** *** 0 **** --- 1,13 ---- + ; RUN: llvm-as < %s | llc -march=ppc32 | grep eqv | wc -l | grep 2 + + int %test1(int %X, int %Y) { + %A = xor int %X, %Y + %B = xor int %A, -1 + ret int %B + } + + int %test2(int %X, int %Y) { + %A = xor int %X, %Y + %B = xor int %A, -1 + ret int %B + } From brukman at cs.uiuc.edu Thu Apr 21 16:13:29 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 16:13:29 -0500 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Archive/Archive.cpp ArchiveInternals.h ArchiveReader.cpp ArchiveWriter.cpp Message-ID: <200504212113.QAA03539@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Archive: Archive.cpp updated: 1.7 -> 1.8 ArchiveInternals.h updated: 1.4 -> 1.5 ArchiveReader.cpp updated: 1.39 -> 1.40 ArchiveWriter.cpp updated: 1.17 -> 1.18 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+93 -93) Archive.cpp | 26 +++++++++--------- ArchiveInternals.h | 18 ++++++------ ArchiveReader.cpp | 76 ++++++++++++++++++++++++++--------------------------- ArchiveWriter.cpp | 66 +++++++++++++++++++++++----------------------- 4 files changed, 93 insertions(+), 93 deletions(-) Index: llvm/lib/Bytecode/Archive/Archive.cpp diff -u llvm/lib/Bytecode/Archive/Archive.cpp:1.7 llvm/lib/Bytecode/Archive/Archive.cpp:1.8 --- llvm/lib/Bytecode/Archive/Archive.cpp:1.7 Thu Apr 21 12:49:57 2005 +++ llvm/lib/Bytecode/Archive/Archive.cpp Thu Apr 21 16:13:18 2005 @@ -1,10 +1,10 @@ //===-- Archive.cpp - Generic LLVM archive functions ------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains the implementation of the Archive and ArchiveMember @@ -30,7 +30,7 @@ result += path.toString().length() + 1; // If its now odd lengthed, include the padding byte - if (result % 2 != 0 ) + if (result % 2 != 0 ) result++; return result; @@ -38,27 +38,27 @@ // This default constructor is only use by the ilist when it creates its // sentry node. We give it specific static values to make it stand out a bit. -ArchiveMember::ArchiveMember() +ArchiveMember::ArchiveMember() : next(0), prev(0), parent(0), path(""), flags(0), data(0) { info.user = sys::Process::GetCurrentUserId(); - info.group = sys::Process::GetCurrentGroupId(); - info.mode = 0777; - info.fileSize = 0; + info.group = sys::Process::GetCurrentGroupId(); + info.mode = 0777; + info.fileSize = 0; info.modTime = sys::TimeValue::now(); } // This is the constructor that the Archive class uses when it is building or // reading an archive. It just defaults a few things and ensures the parent is -// set for the iplist. The Archive class fills in the ArchiveMember's data. -// This is required because correctly setting the data may depend on other +// set for the iplist. The Archive class fills in the ArchiveMember's data. +// This is required because correctly setting the data may depend on other // things in the Archive. ArchiveMember::ArchiveMember(Archive* PAR) : next(0), prev(0), parent(PAR), path(), flags(0), data(0) { } -// This method allows an ArchiveMember to be replaced with the data for a +// This method allows an ArchiveMember to be replaced with the data for a // different file, presumably as an update to the member. It also makes sure // the flags are reset correctly. void ArchiveMember::replaceWith(const sys::Path& newFile) { @@ -128,9 +128,9 @@ } // Archive constructor - this is the only constructor that gets used for the -// Archive class. Everything else (default,copy) is deprecated. This just +// Archive class. Everything else (default,copy) is deprecated. This just // initializes and maps the file into memory, if requested. -Archive::Archive(const sys::Path& filename, bool map ) +Archive::Archive(const sys::Path& filename, bool map ) : archPath(filename), members(), mapfile(0), base(0), symTab(), strtab(), symTabSize(0), firstFileOffset(0), modules(), foreignST(0) { Index: llvm/lib/Bytecode/Archive/ArchiveInternals.h diff -u llvm/lib/Bytecode/Archive/ArchiveInternals.h:1.4 llvm/lib/Bytecode/Archive/ArchiveInternals.h:1.5 --- llvm/lib/Bytecode/Archive/ArchiveInternals.h:1.4 Tue Apr 19 22:52:59 2005 +++ llvm/lib/Bytecode/Archive/ArchiveInternals.h Thu Apr 21 16:13:18 2005 @@ -1,10 +1,10 @@ //===-- lib/Bytecode/ArchiveInternals.h -------------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Internal implementation header for LLVM Archive files. @@ -18,8 +18,8 @@ #include "llvm/System/TimeValue.h" #include "llvm/ADT/StringExtras.h" -#define ARFILE_MAGIC "!\n" ///< magic string -#define ARFILE_MAGIC_LEN (sizeof(ARFILE_MAGIC)-1) ///< length of magic string +#define ARFILE_MAGIC "!\n" ///< magic string +#define ARFILE_MAGIC_LEN (sizeof(ARFILE_MAGIC)-1) ///< length of magic string #define ARFILE_SVR4_SYMTAB_NAME "/ " ///< SVR4 symtab entry name #define ARFILE_LLVM_SYMTAB_NAME "#_LLVM_SYM_TAB_#" ///< LLVM symtab entry name #define ARFILE_BSD4_SYMTAB_NAME "__.SYMDEF SORTED" ///< BSD4 symtab entry name @@ -29,9 +29,9 @@ namespace llvm { - /// The ArchiveMemberHeader structure is used internally for bytecode - /// archives. - /// The header precedes each file member in the archive. This structure is + /// The ArchiveMemberHeader structure is used internally for bytecode + /// archives. + /// The header precedes each file member in the archive. This structure is /// defined using character arrays for direct and correct interpretation /// regardless of the endianess of the machine that produced it. /// @brief Archive File Member Header @@ -39,7 +39,7 @@ /// @name Data /// @{ public: - char name[16]; ///< Name of the file member. + char name[16]; ///< Name of the file member. char date[12]; ///< File date, decimal seconds since Epoch char uid[6]; ///< user id in ASCII decimal char gid[6]; ///< group id in ASCII decimal Index: llvm/lib/Bytecode/Archive/ArchiveReader.cpp diff -u llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.39 llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.40 --- llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.39 Sat Feb 26 16:00:32 2005 +++ llvm/lib/Bytecode/Archive/ArchiveReader.cpp Thu Apr 21 16:13:18 2005 @@ -1,10 +1,10 @@ //===-- ArchiveReader.cpp - Read LLVM archive files -------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Builds up standard unix archive files (.a) containing LLVM bytecode. @@ -20,9 +20,9 @@ inline unsigned readInteger(const char*&At, const char*End) { unsigned Shift = 0; unsigned Result = 0; - + do { - if (At == End) + if (At == End) throw std::string("Ran out of data reading vbr_uint!"); Result |= (unsigned)((*At++) & 0x7F) << Shift; Shift += 7; @@ -49,7 +49,7 @@ // This member parses an ArchiveMemberHeader that is presumed to be pointed to // by At. The At pointer is updated to the byte just after the header, which -// can be variable in size. +// can be variable in size. ArchiveMember* Archive::parseMemberHeader(const char*& At, const char* End) { assert(At + sizeof(ArchiveMemberHeader) < End && "Not enough data"); @@ -61,7 +61,7 @@ // Instantiate the ArchiveMember to be filled ArchiveMember* member = new ArchiveMember(this); - // Extract the size and determine if the file is + // Extract the size and determine if the file is // compressed or not (negative length). int flags = 0; int MemberSize = atoi(Hdr->size); @@ -79,14 +79,14 @@ throw std::string("invalid file member signature"); // Convert and check the member name - // The empty name ( '/' and 15 blanks) is for a foreign (non-LLVM) symbol - // table. The special name "//" and 14 blanks is for a string table, used + // The empty name ( '/' and 15 blanks) is for a foreign (non-LLVM) symbol + // table. The special name "//" and 14 blanks is for a string table, used // for long file names. This library doesn't generate either of those but - // it will accept them. If the name starts with #1/ and the remainder is - // digits, then those digits specify the length of the name that is - // stored immediately following the header. The special name - // __LLVM_SYM_TAB__ identifies the symbol table for LLVM bytecode. - // Anything else is a regular, short filename that is terminated with + // it will accept them. If the name starts with #1/ and the remainder is + // digits, then those digits specify the length of the name that is + // stored immediately following the header. The special name + // __LLVM_SYM_TAB__ identifies the symbol table for LLVM bytecode. + // Anything else is a regular, short filename that is terminated with // a '/' and blanks. std::string pathname; @@ -101,7 +101,7 @@ flags |= ArchiveMember::HasLongFilenameFlag; } else throw std::string("invalid long filename"); - } else if (Hdr->name[1] == '_' && + } else if (Hdr->name[1] == '_' && (0 == memcmp(Hdr->name, ARFILE_LLVM_SYMTAB_NAME, 16))) { // The member is using a long file name (>15 chars) format. // This format is standard for 4.4BSD and Mac OSX operating @@ -152,7 +152,7 @@ } break; case '_': - if (Hdr->name[1] == '_' && + if (Hdr->name[1] == '_' && (0 == memcmp(Hdr->name, ARFILE_BSD4_SYMTAB_NAME, 16))) { pathname.assign(ARFILE_BSD4_SYMTAB_NAME); flags |= ArchiveMember::BSD4SymbolTableFlag; @@ -208,7 +208,7 @@ throw std::string("invalid signature for an archive file"); } -// This function loads the entire archive and fully populates its ilist with +// This function loads the entire archive and fully populates its ilist with // the members of the archive file. This is typically used in preparation for // editing the contents of the archive. void @@ -226,7 +226,7 @@ bool seenSymbolTable = false; bool foundFirstFile = false; while (At < End) { - // parse the member header + // parse the member header const char* Save = At; ArchiveMember* mbr = parseMemberHeader(At, End); @@ -253,7 +253,7 @@ if ((intptr_t(At) & 1) == 1) At++; delete mbr; - } else if (mbr->isLLVMSymbolTable()) { + } else if (mbr->isLLVMSymbolTable()) { // This is the LLVM symbol table for the archive. If we've seen it // already, its an error. Otherwise, parse the symbol table and move on. if (seenSymbolTable) @@ -300,9 +300,9 @@ for (iterator I=begin(), E=end(); I != E; ++I) { if (I->isBytecode() || I->isCompressedBytecode()) { - std::string FullMemberName = archPath.toString() + + std::string FullMemberName = archPath.toString() + "(" + I->getPath().toString() + ")"; - Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(), + Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(), I->getSize(), FullMemberName, ErrMessage); if (!M) return true; @@ -365,8 +365,8 @@ FirstFile = At; } else { // There's no symbol table in the file. We have to rebuild it from scratch - // because the intent of this method is to get the symbol table loaded so - // it can be searched efficiently. + // because the intent of this method is to get the symbol table loaded so + // it can be searched efficiently. // Add the member to the members list members.push_back(mbr); } @@ -391,19 +391,19 @@ // Look up one symbol in the symbol table and return a ModuleProvider for the // module that defines that symbol. -ModuleProvider* +ModuleProvider* Archive::findModuleDefiningSymbol(const std::string& symbol) { SymTabType::iterator SI = symTab.find(symbol); if (SI == symTab.end()) return 0; - // The symbol table was previously constructed assuming that the members were + // The symbol table was previously constructed assuming that the members were // written without the symbol table header. Because VBR encoding is used, the // values could not be adjusted to account for the offset of the symbol table // because that could affect the size of the symbol table due to VBR encoding. - // We now have to account for this by adjusting the offset by the size of the + // We now have to account for this by adjusting the offset by the size of the // symbol table and its header. - unsigned fileOffset = + unsigned fileOffset = SI->second + // offset in symbol-table-less file firstFileOffset; // add offset to first "real" file in archive @@ -417,10 +417,10 @@ ArchiveMember* mbr = parseMemberHeader(modptr, base + mapfile->size()); // Now, load the bytecode module to get the ModuleProvider - std::string FullMemberName = archPath.toString() + "(" + + std::string FullMemberName = archPath.toString() + "(" + mbr->getPath().toString() + ")"; ModuleProvider* mp = getBytecodeBufferModuleProvider( - (const unsigned char*) mbr->getData(), mbr->getSize(), + (const unsigned char*) mbr->getData(), mbr->getSize(), FullMemberName, 0); modules.insert(std::make_pair(fileOffset, std::make_pair(mp, mbr))); @@ -428,7 +428,7 @@ return mp; } -// Look up multiple symbols in the symbol table and return a set of +// Look up multiple symbols in the symbol table and return a set of // ModuleProviders that define those symbols. void Archive::findModulesDefiningSymbols(std::set& symbols, @@ -454,16 +454,16 @@ // If it contains symbols if (mbr->isBytecode() || mbr->isCompressedBytecode()) { - // Get the symbols + // Get the symbols std::vector symbols; - std::string FullMemberName = archPath.toString() + "(" + + std::string FullMemberName = archPath.toString() + "(" + mbr->getPath().toString() + ")"; ModuleProvider* MP = GetBytecodeSymbols((const unsigned char*)At, mbr->getSize(), FullMemberName, symbols); if (MP) { // Insert the module's symbols into the symbol table - for (std::vector::iterator I = symbols.begin(), + for (std::vector::iterator I = symbols.begin(), E=symbols.end(); I != E; ++I ) { symTab.insert(std::make_pair(*I, offset)); } @@ -483,10 +483,10 @@ } } - // At this point we have a valid symbol table (one way or another) so we + // At this point we have a valid symbol table (one way or another) so we // just use it to quickly find the symbols requested. - for (std::set::iterator I=symbols.begin(), + for (std::set::iterator I=symbols.begin(), E=symbols.end(); I != E;) { // See if this symbol exists ModuleProvider* mp = findModuleDefiningSymbol(*I); @@ -495,7 +495,7 @@ // duplicates wil be ignored result.insert(mp); - // Remove the symbol now that its been resolved, being careful to + // Remove the symbol now that its been resolved, being careful to // post-increment the iterator. symbols.erase(I++); } else { @@ -509,13 +509,13 @@ { //Make sure the symTab has been loaded... //in most cases this should have been done - //when the archive was constructed, but still, + //when the archive was constructed, but still, //this is just in case. if ( !symTab.size() ) loadSymbolTable(); //Now that we know it's been loaded, return true - //if it has a size + //if it has a size if ( symTab.size() ) return true; //We still can't be sure it isn't a bytecode archive Index: llvm/lib/Bytecode/Archive/ArchiveWriter.cpp diff -u llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.17 llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.18 --- llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.17 Thu Apr 21 11:15:19 2005 +++ llvm/lib/Bytecode/Archive/ArchiveWriter.cpp Thu Apr 21 16:13:18 2005 @@ -1,10 +1,10 @@ //===-- ArchiveWriter.cpp - Write LLVM archive files ----------------------===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Builds up an LLVM archive file (.a) containing LLVM bytecode. @@ -30,7 +30,7 @@ ARFile << (unsigned char)num; return; } - + // Nope, we are bigger than a character, output the next 7 bits and set the // high bit to say that there is more coming... ARFile << (unsigned char)(0x80 | ((unsigned char)num & 0x7F)); @@ -44,9 +44,9 @@ // Note that the following nested ifs are somewhat equivalent to a binary // search. We split it in half by comparing against 2^14 first. This allows - // most reasonable values to be done in 2 comparisons instead of 1 for + // most reasonable values to be done in 2 comparisons instead of 1 for // small ones and four for large ones. We expect this to access file offsets - // in the 2^10 to 2^24 range and symbol lengths in the 2^0 to 2^8 range, + // in the 2^10 to 2^24 range and symbol lengths in the 2^0 to 2^8 range, // so this approach is reasonable. if (num < 1<<14) if (num < 1<<7) @@ -62,17 +62,17 @@ } // Create an empty archive. -Archive* +Archive* Archive::CreateEmpty(const sys::Path& FilePath ) { Archive* result = new Archive(FilePath,false); return result; } -// Fill the ArchiveMemberHeader with the information from a member. If +// Fill the ArchiveMemberHeader with the information from a member. If // TruncateNames is true, names are flattened to 15 chars or less. The sz field -// is provided here instead of coming from the mbr because the member might be -// stored compressed and the compressed size is not the ArchiveMember's size. -// Furthermore compressed files have negative size fields to identify them as +// is provided here instead of coming from the mbr because the member might be +// stored compressed and the compressed size is not the ArchiveMember's size. +// Furthermore compressed files have negative size fields to identify them as // compressed. bool Archive::fillHeader(const ArchiveMember &mbr, ArchiveMemberHeader& hdr, @@ -119,7 +119,7 @@ nm += slashpos + 1; len -= slashpos +1; } - if (len > 15) + if (len > 15) len = 15; memcpy(hdr.name,nm,len); hdr.name[len] = '/'; @@ -190,7 +190,7 @@ std::ofstream& ARFile, bool CreateSymbolTable, bool TruncateNames, - bool ShouldCompress + bool ShouldCompress ) { unsigned filepos = ARFile.tellp(); @@ -205,45 +205,45 @@ mFile = new sys::MappedFile(member.getPath()); data = (const char*) mFile->map(); fSize = mFile->size(); - } + } - // Now that we have the data in memory, update the + // Now that we have the data in memory, update the // symbol table if its a bytecode file. - if (CreateSymbolTable && + if (CreateSymbolTable && (member.isBytecode() || member.isCompressedBytecode())) { std::vector symbols; - std::string FullMemberName = archPath.toString() + "(" + - member.getPath().toString() + std::string FullMemberName = archPath.toString() + "(" + + member.getPath().toString() + ")"; ModuleProvider* MP = GetBytecodeSymbols( (const unsigned char*)data,fSize,FullMemberName, symbols); // If the bytecode parsed successfully if ( MP ) { - for (std::vector::iterator SI = symbols.begin(), + for (std::vector::iterator SI = symbols.begin(), SE = symbols.end(); SI != SE; ++SI) { - std::pair Res = + std::pair Res = symTab.insert(std::make_pair(*SI,filepos)); if (Res.second) { - symTabSize += SI->length() + - numVbrBytes(SI->length()) + + symTabSize += SI->length() + + numVbrBytes(SI->length()) + numVbrBytes(filepos); } } // We don't need this module any more. delete MP; } else { - throw std::string("Can't parse bytecode member: ") + + throw std::string("Can't parse bytecode member: ") + member.getPath().toString(); } } // Determine if we actually should compress this member - bool willCompress = - (ShouldCompress && - !member.isCompressed() && + bool willCompress = + (ShouldCompress && + !member.isCompressed() && !member.isCompressedBytecode() && !member.isLLVMSymbolTable() && !member.isSVR4SymbolTable() && @@ -266,7 +266,7 @@ fSize = Compressor::compressToNewBuffer(data,fSize,output); data = output; if (member.isBytecode()) - hdrSize = -fSize-4; + hdrSize = -fSize-4; else hdrSize = -fSize; } else { @@ -361,15 +361,15 @@ } // Write the entire archive to the file specified when the archive was created. -// This writes to a temporary file first. Options are for creating a symbol -// table, flattening the file names (no directories, 15 chars max) and +// This writes to a temporary file first. Options are for creating a symbol +// table, flattening the file names (no directories, 15 chars max) and // compressing each archive member. void Archive::writeToDisk(bool CreateSymbolTable, bool TruncateNames, bool Compress){ - + // Make sure they haven't opened up the file, not loaded it, // but are now trying to write it which would wipe out the file. - assert(!(members.empty() && mapfile->size() > 8) && + assert(!(members.empty() && mapfile->size() > 8) && "Can't write an archive not opened for writing"); // Create a temporary file to store the archive in @@ -385,7 +385,7 @@ std::ios::openmode io_mode = std::ios::out | std::ios::trunc | std::ios::binary; std::ofstream ArchiveFile(TmpArchive.c_str(), io_mode); - + // Check for errors opening or creating archive file. if ( !ArchiveFile.is_open() || ArchiveFile.bad() ) { throw std::string("Error opening archive file: ") + archPath.toString(); @@ -444,7 +444,7 @@ // Copy the temporary file contents being sure to skip the file's magic // number. - FinalFile.write(base + sizeof(ARFILE_MAGIC)-1, + FinalFile.write(base + sizeof(ARFILE_MAGIC)-1, arch.size()-sizeof(ARFILE_MAGIC)+1); // Close up shop From brukman at cs.uiuc.edu Thu Apr 21 16:44:52 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 16:44:52 -0500 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Analyzer.cpp Reader.cpp Reader.h ReaderWrappers.cpp Message-ID: <200504212144.QAA03950@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Analyzer.cpp updated: 1.18 -> 1.19 Reader.cpp updated: 1.156 -> 1.157 Reader.h updated: 1.21 -> 1.22 ReaderWrappers.cpp updated: 1.44 -> 1.45 --- Log message: Remove trailing whitespace --- Diffs of the changes: (+241 -241) Analyzer.cpp | 168 +++++++++++++++++++-------------------- Reader.cpp | 228 ++++++++++++++++++++++++++--------------------------- Reader.h | 56 ++++++------- ReaderWrappers.cpp | 30 +++--- 4 files changed, 241 insertions(+), 241 deletions(-) Index: llvm/lib/Bytecode/Reader/Analyzer.cpp diff -u llvm/lib/Bytecode/Reader/Analyzer.cpp:1.18 llvm/lib/Bytecode/Reader/Analyzer.cpp:1.19 --- llvm/lib/Bytecode/Reader/Analyzer.cpp:1.18 Fri Oct 15 14:40:31 2004 +++ llvm/lib/Bytecode/Reader/Analyzer.cpp Thu Apr 21 16:44:41 2005 @@ -1,10 +1,10 @@ //===-- Analyzer.cpp - Analysis and Dumping of Bytecode 000000---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the AnalyzerHandler class and PrintBytecodeAnalysis @@ -35,7 +35,7 @@ BytecodeAnalysis& bca; ///< The structure in which data is recorded std::ostream* os; ///< A convenience for osing data. /// @brief Keeps track of current function - BytecodeAnalysis::BytecodeFunctionInfo* currFunc; + BytecodeAnalysis::BytecodeFunctionInfo* currFunc; Module* M; ///< Keeps track of current module /// @name Constructor @@ -44,8 +44,8 @@ /// The only way to construct an AnalyzerHandler. All that is needed is a /// reference to the BytecodeAnalysis structure where the output will be /// placed. - AnalyzerHandler(BytecodeAnalysis& TheBca, std::ostream* output) - : bca(TheBca) + AnalyzerHandler(BytecodeAnalysis& TheBca, std::ostream* output) + : bca(TheBca) , os(output) , currFunc(0) { } @@ -54,7 +54,7 @@ /// @name BytecodeHandler Implementations /// @{ public: - virtual void handleError(const std::string& str ) { + virtual void handleError(const std::string& str ) { if (os) *os << "ERROR: " << str << "\n"; } @@ -104,16 +104,16 @@ virtual void handleFinish() { if (os) - *os << "} End Bytecode\n"; + *os << "} End Bytecode\n"; bca.fileDensity = double(bca.byteSize) / double( bca.numTypes + bca.numValues ); double globalSize = 0.0; globalSize += double(bca.BlockSizes[BytecodeFormat::ConstantPoolBlockID]); globalSize += double(bca.BlockSizes[BytecodeFormat::ModuleGlobalInfoBlockID]); globalSize += double(bca.BlockSizes[BytecodeFormat::GlobalTypePlaneBlockID]); - bca.globalsDensity = globalSize / double( bca.numTypes + bca.numConstants + + bca.globalsDensity = globalSize / double( bca.numTypes + bca.numConstants + bca.numGlobalVars ); - bca.functionDensity = double(bca.BlockSizes[BytecodeFormat::FunctionBlockID]) / + bca.functionDensity = double(bca.BlockSizes[BytecodeFormat::FunctionBlockID]) / double(bca.numFunctions); if ( bca.progressiveVerify ) { @@ -131,7 +131,7 @@ bca.ModuleId = id; } - virtual void handleModuleEnd(const std::string& id) { + virtual void handleModuleEnd(const std::string& id) { if (os) *os << " } End Module " << id << "\n"; if ( bca.progressiveVerify ) { @@ -147,22 +147,22 @@ unsigned char RevisionNum, ///< Byte code revision number Module::Endianness Endianness, ///< Endianness indicator Module::PointerSize PointerSize ///< PointerSize indicator - ) { + ) { if (os) - *os << " RevisionNum: " << int(RevisionNum) + *os << " RevisionNum: " << int(RevisionNum) << " Endianness: " << Endianness << " PointerSize: " << PointerSize << "\n"; bca.version = RevisionNum; } - virtual void handleModuleGlobalsBegin() { + virtual void handleModuleGlobalsBegin() { if (os) *os << " BLOCK: ModuleGlobalInfo {\n"; } - virtual void handleGlobalVariable( - const Type* ElemType, - bool isConstant, + virtual void handleGlobalVariable( + const Type* ElemType, + bool isConstant, GlobalValue::LinkageTypes Linkage, unsigned SlotNum, unsigned initSlot @@ -173,7 +173,7 @@ << ( isConstant? "Constant, " : "Variable, ") << " Linkage=" << Linkage << " Type="; WriteTypeSymbolic(*os, ElemType, M); - *os << " Slot=" << SlotNum << " InitSlot=" << initSlot + *os << " Slot=" << SlotNum << " InitSlot=" << initSlot << "\n"; } @@ -190,8 +190,8 @@ bca.maxTypeSlot = numEntries - 1; } - virtual void handleType( const Type* Ty ) { - bca.numTypes++; + virtual void handleType( const Type* Ty ) { + bca.numTypes++; if (os) { *os << " Type: "; WriteTypeSymbolic(*os,Ty,M); @@ -199,7 +199,7 @@ } } - virtual void handleFunctionDeclaration( + virtual void handleFunctionDeclaration( Function* Func ///< The function ) { bca.numFunctions++; @@ -228,7 +228,7 @@ *os << " Library: '" << libName << "'\n"; } - virtual void handleModuleGlobalsEnd() { + virtual void handleModuleGlobalsEnd() { if (os) *os << " } END BLOCK: ModuleGlobalInfo\n"; if ( bca.progressiveVerify ) { @@ -240,7 +240,7 @@ } } - virtual void handleCompactionTableBegin() { + virtual void handleCompactionTableBegin() { if (os) *os << " BLOCK: CompactionTable {\n"; bca.numCmpctnTables++; @@ -251,53 +251,53 @@ *os << " Plane: Ty=" << Ty << " Size=" << NumEntries << "\n"; } - virtual void handleCompactionTableType( unsigned i, unsigned TypSlot, + virtual void handleCompactionTableType( unsigned i, unsigned TypSlot, const Type* Ty ) { if (os) { *os << " Type: " << i << " Slot:" << TypSlot << " is "; WriteTypeSymbolic(*os,Ty,M); - *os << "\n"; + *os << "\n"; } } virtual void handleCompactionTableValue(unsigned i, unsigned TypSlot, - unsigned ValSlot) { + unsigned ValSlot) { if (os) - *os << " Value: " << i << " TypSlot: " << TypSlot + *os << " Value: " << i << " TypSlot: " << TypSlot << " ValSlot:" << ValSlot << "\n"; if (ValSlot > bca.maxValueSlot) bca.maxValueSlot = ValSlot; } - virtual void handleCompactionTableEnd() { + virtual void handleCompactionTableEnd() { if (os) *os << " } END BLOCK: CompactionTable\n"; } - virtual void handleSymbolTableBegin(Function* CF, SymbolTable* ST) { - bca.numSymTab++; + virtual void handleSymbolTableBegin(Function* CF, SymbolTable* ST) { + bca.numSymTab++; if (os) *os << " BLOCK: SymbolTable {\n"; } - virtual void handleSymbolTablePlane(unsigned Ty, unsigned NumEntries, - const Type* Typ) { + virtual void handleSymbolTablePlane(unsigned Ty, unsigned NumEntries, + const Type* Typ) { if (os) { *os << " Plane: Ty=" << Ty << " Size=" << NumEntries << " Type: "; WriteTypeSymbolic(*os,Typ,M); - *os << "\n"; + *os << "\n"; } } - virtual void handleSymbolTableType(unsigned i, unsigned TypSlot, - const std::string& name ) { + virtual void handleSymbolTableType(unsigned i, unsigned TypSlot, + const std::string& name ) { if (os) *os << " Type " << i << " Slot=" << TypSlot - << " Name: " << name << "\n"; + << " Name: " << name << "\n"; } - virtual void handleSymbolTableValue(unsigned i, unsigned ValSlot, - const std::string& name ) { + virtual void handleSymbolTableValue(unsigned i, unsigned ValSlot, + const std::string& name ) { if (os) *os << " Value " << i << " Slot=" << ValSlot << " Name: " << name << "\n"; @@ -305,7 +305,7 @@ bca.maxValueSlot = ValSlot; } - virtual void handleSymbolTableEnd() { + virtual void handleSymbolTableEnd() { if (os) *os << " } END BLOCK: SymbolTable\n"; } @@ -314,7 +314,7 @@ if (os) { *os << " BLOCK: Function {\n" << " Linkage: " << Func->getLinkage() << "\n" - << " Type: "; + << " Type: "; WriteTypeSymbolic(*os,Func->getType(),M); *os << "\n"; } @@ -362,14 +362,14 @@ if ( currFunc ) currFunc->numBasicBlocks++; } - virtual bool handleInstruction( unsigned Opcode, const Type* iType, + virtual bool handleInstruction( unsigned Opcode, const Type* iType, std::vector& Operands, unsigned Size){ if (os) { - *os << " INST: OpCode=" + *os << " INST: OpCode=" << Instruction::getOpcodeName(Opcode) << " Type=\""; WriteTypeSymbolic(*os,iType,M); *os << "\""; - for ( unsigned i = 0; i < Operands.size(); ++i ) + for ( unsigned i = 0; i < Operands.size(); ++i ) *os << " Op(" << i << ")=Slot(" << Operands[i] << ")"; *os << "\n"; } @@ -388,25 +388,25 @@ if (Size > 4 ) currFunc->longInstructions++; if ( Opcode == Instruction::PHI ) currFunc->numPhis++; } - return Instruction::isTerminator(Opcode); + return Instruction::isTerminator(Opcode); } - virtual void handleBasicBlockEnd(unsigned blocknum) { + virtual void handleBasicBlockEnd(unsigned blocknum) { if (os) *os << " } END BLOCK: BasicBlock #" << blocknum << "{\n"; } - virtual void handleGlobalConstantsBegin() { + virtual void handleGlobalConstantsBegin() { if (os) *os << " BLOCK: GlobalConstants {\n"; } - virtual void handleConstantExpression( unsigned Opcode, + virtual void handleConstantExpression( unsigned Opcode, std::vector ArgVec, Constant* C ) { if (os) { *os << " EXPR: " << Instruction::getOpcodeName(Opcode) << "\n"; for ( unsigned i = 0; i < ArgVec.size(); ++i ) { - *os << " Arg#" << i << " "; ArgVec[i]->print(*os); + *os << " Arg#" << i << " "; ArgVec[i]->print(*os); *os << "\n"; } *os << " Value="; @@ -427,13 +427,13 @@ bca.numValues++; } - virtual void handleConstantArray( const ArrayType* AT, + virtual void handleConstantArray( const ArrayType* AT, std::vector& Elements, unsigned TypeSlot, Constant* ArrayVal ) { if (os) { *os << " ARRAY: "; - WriteTypeSymbolic(*os,AT,M); + WriteTypeSymbolic(*os,AT,M); *os << " TypeSlot=" << TypeSlot << "\n"; for ( unsigned i = 0; i < Elements.size(); ++i ) { *os << " #" << i; @@ -459,7 +459,7 @@ WriteTypeSymbolic(*os,ST,M); *os << "\n"; for ( unsigned i = 0; i < Elements.size(); ++i ) { - *os << " #" << i << " "; Elements[i]->print(*os); + *os << " #" << i << " "; Elements[i]->print(*os); *os << "\n"; } *os << " Value="; @@ -470,11 +470,11 @@ bca.numValues++; } - virtual void handleConstantPacked( - const PackedType* PT, + virtual void handleConstantPacked( + const PackedType* PT, std::vector& Elements, - unsigned TypeSlot, - Constant* PackedVal) + unsigned TypeSlot, + Constant* PackedVal) { if (os) { *os << " PACKD: "; @@ -494,7 +494,7 @@ bca.numValues++; } - virtual void handleConstantPointer( const PointerType* PT, + virtual void handleConstantPointer( const PointerType* PT, unsigned Slot, GlobalValue* GV ) { if (os) { *os << " PNTR: "; @@ -510,14 +510,14 @@ virtual void handleConstantString( const ConstantArray* CA ) { if (os) { *os << " STRNG: "; - CA->print(*os); + CA->print(*os); *os << "\n"; } bca.numConstants++; bca.numValues++; } - virtual void handleGlobalConstantsEnd() { + virtual void handleGlobalConstantsEnd() { if (os) *os << " } END BLOCK: GlobalConstants\n"; @@ -574,38 +574,38 @@ /// @brief Utility for printing a titled unsigned value with /// an aligned colon. -inline static void print(std::ostream& Out, const char*title, +inline static void print(std::ostream& Out, const char*title, unsigned val, bool nl = true ) { - Out << std::setw(30) << std::right << title + Out << std::setw(30) << std::right << title << std::setw(0) << ": " << std::setw(9) << val << "\n"; } /// @brief Utility for printing a titled double value with an /// aligned colon -inline static void print(std::ostream&Out, const char*title, +inline static void print(std::ostream&Out, const char*title, double val ) { - Out << std::setw(30) << std::right << title + Out << std::setw(30) << std::right << title << std::setw(0) << ": " << std::setw(9) << std::setprecision(6) << val << "\n" ; } /// @brief Utility for printing a titled double value with a /// percentage and aligned colon. -inline static void print(std::ostream&Out, const char*title, +inline static void print(std::ostream&Out, const char*title, double top, double bot ) { - Out << std::setw(30) << std::right << title + Out << std::setw(30) << std::right << title << std::setw(0) << ": " - << std::setw(9) << std::setprecision(6) << top - << " (" << std::left << std::setw(0) << std::setprecision(4) + << std::setw(9) << std::setprecision(6) << top + << " (" << std::left << std::setw(0) << std::setprecision(4) << (top/bot)*100.0 << "%)\n"; } /// @brief Utility for printing a titled string value with /// an aligned colon. -inline static void print(std::ostream&Out, const char*title, +inline static void print(std::ostream&Out, const char*title, std::string val, bool nl = true) { - Out << std::setw(30) << std::right << title + Out << std::setw(30) << std::right << title << std::setw(0) << ": " << std::left << val << (nl ? "\n" : ""); } @@ -626,33 +626,33 @@ print(Out, "Module Bytes", double(bca.BlockSizes[BytecodeFormat::ModuleBlockID]), double(bca.byteSize)); - print(Out, "Function Bytes", + print(Out, "Function Bytes", double(bca.BlockSizes[BytecodeFormat::FunctionBlockID]), double(bca.byteSize)); - print(Out, "Global Types Bytes", + print(Out, "Global Types Bytes", double(bca.BlockSizes[BytecodeFormat::GlobalTypePlaneBlockID]), double(bca.byteSize)); - print(Out, "Constant Pool Bytes", + print(Out, "Constant Pool Bytes", double(bca.BlockSizes[BytecodeFormat::ConstantPoolBlockID]), double(bca.byteSize)); - print(Out, "Module Globals Bytes", + print(Out, "Module Globals Bytes", double(bca.BlockSizes[BytecodeFormat::ModuleGlobalInfoBlockID]), double(bca.byteSize)); - print(Out, "Instruction List Bytes", + print(Out, "Instruction List Bytes", double(bca.BlockSizes[BytecodeFormat::InstructionListBlockID]), double(bca.byteSize)); - print(Out, "Compaction Table Bytes", + print(Out, "Compaction Table Bytes", double(bca.BlockSizes[BytecodeFormat::CompactionTableBlockID]), double(bca.byteSize)); - print(Out, "Symbol Table Bytes", + print(Out, "Symbol Table Bytes", double(bca.BlockSizes[BytecodeFormat::SymbolTableBlockID]), double(bca.byteSize)); - print(Out, "Alignment Bytes", + print(Out, "Alignment Bytes", double(bca.numAlignment), double(bca.byteSize)); - print(Out, "Block Header Bytes", + print(Out, "Block Header Bytes", double(bca.BlockSizes[BytecodeFormat::Reserved_DoNotUse]), double(bca.byteSize)); - print(Out, "Dependent Libraries Bytes", double(bca.libSize), + print(Out, "Dependent Libraries Bytes", double(bca.libSize), double(bca.byteSize)); print(Out, "Number Of Bytecode Blocks", bca.numBlocks); print(Out, "Number Of Functions", bca.numFunctions); @@ -668,7 +668,7 @@ print(Out, "Number Of Symbol Tables", bca.numSymTab); print(Out, "Number Of Dependent Libs", bca.numLibraries); print(Out, "Total Instruction Size", bca.instructionSize); - print(Out, "Average Instruction Size", + print(Out, "Average Instruction Size", double(bca.instructionSize)/double(bca.numInstructions)); print(Out, "Maximum Type Slot Number", bca.maxTypeSlot); @@ -680,16 +680,16 @@ print(Out, "# of VBR 64-bit Integers", bca.vbrCount64); print(Out, "# of VBR Compressed Bytes", bca.vbrCompBytes); print(Out, "# of VBR Expanded Bytes", bca.vbrExpdBytes); - print(Out, "Bytes Saved With VBR", + print(Out, "Bytes Saved With VBR", double(bca.vbrExpdBytes)-double(bca.vbrCompBytes), double(bca.vbrExpdBytes)); if (bca.detailedResults) { Out << "\nDetailed Analysis Of " << bca.ModuleId << " Functions:\n"; - std::map::iterator I = + std::map::iterator I = bca.FunctionInfo.begin(); - std::map::iterator E = + std::map::iterator E = bca.FunctionInfo.end(); while ( I != E ) { @@ -704,14 +704,14 @@ print(Out, "Long Instructions", I->second.longInstructions); print(Out, "Operands", I->second.numOperands); print(Out, "Instruction Size", I->second.instructionSize); - print(Out, "Average Instruction Size", + print(Out, "Average Instruction Size", double(I->second.instructionSize) / I->second.numInstructions); print(Out, "Bytes Per Instruction", I->second.density); print(Out, "# of VBR 32-bit Integers", I->second.vbrCount32); print(Out, "# of VBR 64-bit Integers", I->second.vbrCount64); print(Out, "# of VBR Compressed Bytes", I->second.vbrCompBytes); print(Out, "# of VBR Expanded Bytes", I->second.vbrExpdBytes); - print(Out, "Bytes Saved With VBR", + print(Out, "Bytes Saved With VBR", double(I->second.vbrExpdBytes) - I->second.vbrCompBytes), double(I->second.vbrExpdBytes); } Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.156 llvm/lib/Bytecode/Reader/Reader.cpp:1.157 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.156 Mon Mar 14 22:54:18 2005 +++ llvm/lib/Bytecode/Reader/Reader.cpp Thu Apr 21 16:44:41 2005 @@ -1,15 +1,15 @@ //===- Reader.cpp - Code to read bytecode files ---------------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This library implements the functionality defined in llvm/Bytecode/Reader.h // -// Note that this library should be as fast as possible, reentrant, and +// Note that this library should be as fast as possible, reentrant, and // threadsafe!! // // TODO: Allow passing in an option to ignore the symbol table @@ -39,7 +39,7 @@ void operator=(const ConstantPlaceHolder &); // DO NOT IMPLEMENT public: Use Op; - ConstantPlaceHolder(const Type *Ty) + ConstantPlaceHolder(const Type *Ty) : ConstantExpr(Ty, Instruction::UserOp1, &Op, 1), Op(UndefValue::get(Type::IntTy), this) { } @@ -77,16 +77,16 @@ if (hasAlignment) { BufPtr Save = At; At = (const unsigned char *)((unsigned long)(At+3) & (~3UL)); - if (At > Save) + if (At > Save) if (Handler) Handler->handleAlignment(At - Save); - if (At > BlockEnd) + if (At > BlockEnd) error("Ran out of data while aligning!"); } } /// Read a whole unsigned integer inline unsigned BytecodeReader::read_uint() { - if (At+4 > BlockEnd) + if (At+4 > BlockEnd) error("Ran out of data reading uint!"); At += 4; return At[-4] | (At[-3] << 8) | (At[-2] << 16) | (At[-1] << 24); @@ -97,9 +97,9 @@ unsigned Shift = 0; unsigned Result = 0; BufPtr Save = At; - + do { - if (At == BlockEnd) + if (At == BlockEnd) error("Ran out of data reading vbr_uint!"); Result |= (unsigned)((*At++) & 0x7F) << Shift; Shift += 7; @@ -113,9 +113,9 @@ unsigned Shift = 0; uint64_t Result = 0; BufPtr Save = At; - + do { - if (At == BlockEnd) + if (At == BlockEnd) error("Ran out of data reading vbr_uint64!"); Result |= (uint64_t)((*At++) & 0x7F) << Shift; Shift += 7; @@ -151,7 +151,7 @@ inline void BytecodeReader::read_data(void *Ptr, void *End) { unsigned char *Start = (unsigned char *)Ptr; unsigned Amount = (unsigned char *)End - Start; - if (At+Amount > BlockEnd) + if (At+Amount > BlockEnd) error("Ran out of data!"); std::copy(At, At+Amount, Start); At += Amount; @@ -178,9 +178,9 @@ double d; uint64_t i; } DoubleUnion; - DoubleUnion.i = (uint64_t(At[0]) << 0) | (uint64_t(At[1]) << 8) | + DoubleUnion.i = (uint64_t(At[0]) << 0) | (uint64_t(At[1]) << 8) | (uint64_t(At[2]) << 16) | (uint64_t(At[3]) << 24) | - (uint64_t(At[4]) << 32) | (uint64_t(At[5]) << 40) | + (uint64_t(At[4]) << 32) | (uint64_t(At[5]) << 40) | (uint64_t(At[6]) << 48) | (uint64_t(At[7]) << 56); At+=sizeof(uint64_t); DoubleVal = DoubleUnion.d; @@ -192,10 +192,10 @@ Type = read_uint(); Size = read_uint(); switch (Type) { - case BytecodeFormat::Reserved_DoNotUse : + case BytecodeFormat::Reserved_DoNotUse : error("Reserved_DoNotUse used as Module Type?"); Type = BytecodeFormat::ModuleBlockID; break; - case BytecodeFormat::Module: + case BytecodeFormat::Module: Type = BytecodeFormat::ModuleBlockID; break; case BytecodeFormat::Function: Type = BytecodeFormat::FunctionBlockID; break; @@ -238,8 +238,8 @@ /// 1.3 this changed so that Type does not derive from Value. Consequently, /// the BytecodeReader's containers for Values can't contain Types because /// there's no inheritance relationship. This means that the "Type Type" -/// plane is defunct along with the Type::TypeTyID TypeID. In LLVM 1.3 -/// whenever a bytecode construct must have both types and values together, +/// plane is defunct along with the Type::TypeTyID TypeID. In LLVM 1.3 +/// whenever a bytecode construct must have both types and values together, /// the types are always read/written first and then the Values. Furthermore /// since Type::TypeTyID no longer exists, its value (12) now corresponds to /// Type::LabelTyID. In order to overcome this we must "sanitize" all the @@ -249,7 +249,7 @@ /// larger than 12 (Type::LabelTyID). If the value is exactly 12, then this /// function returns true, otherwise false. This helps detect situations /// where the pre 1.3 bytecode is indicating that what follows is a type. -/// @returns true iff type id corresponds to pre 1.3 "type type" +/// @returns true iff type id corresponds to pre 1.3 "type type" inline bool BytecodeReader::sanitizeTypeId(unsigned &TypeId) { if (hasTypeDerivedFromValue) { /// do nothing if 1.3 or later if (TypeId == Type::LabelTyID) { @@ -342,7 +342,7 @@ if (!CompactionTypes.empty()) { for (unsigned i = 0, e = CompactionTypes.size(); i != e; ++i) if (CompactionTypes[i].first == Ty) - return Type::FirstDerivedTyID + i; + return Type::FirstDerivedTyID + i; error("Couldn't find type specified in compaction table!"); } @@ -352,7 +352,7 @@ FunctionTypes.end(), Ty); if (I != FunctionTypes.end()) - return Type::FirstDerivedTyID + ModuleTypes.size() + + return Type::FirstDerivedTyID + ModuleTypes.size() + (&*I - &FunctionTypes[0]); // Check the module level types now... @@ -390,8 +390,8 @@ return Type::FirstDerivedTyID + (&*I - &ModuleTypes[0]); } -/// Retrieve a value of a given type and slot number, possibly creating -/// it if it doesn't already exist. +/// Retrieve a value of a given type and slot number, possibly creating +/// it if it doesn't already exist. Value * BytecodeReader::getValue(unsigned type, unsigned oNum, bool Create) { assert(type != Type::LabelTyID && "getValue() cannot get blocks!"); unsigned Num = oNum; @@ -424,8 +424,8 @@ } } - if (FunctionValues.size() > type && - FunctionValues[type] && + if (FunctionValues.size() > type && + FunctionValues[type] && Num < FunctionValues[type]->size()) return FunctionValues[type]->getOperand(Num); @@ -447,8 +447,8 @@ throw "Can't create placeholder for value of type slot #" + utostr(type); } -/// This is just like getValue, but when a compaction table is in use, it -/// is ignored. Also, no forward references or other fancy features are +/// This is just like getValue, but when a compaction table is in use, it +/// is ignored. Also, no forward references or other fancy features are /// supported. Value* BytecodeReader::getGlobalTableValue(unsigned TyID, unsigned SlotNo) { if (SlotNo == 0) @@ -467,11 +467,11 @@ SlotNo >= ModuleValues[TyID]->size()) { if (TyID >= ModuleValues.size() || ModuleValues[TyID] == 0) error("Corrupt compaction table entry!" - + utostr(TyID) + ", " + utostr(SlotNo) + ": " + + utostr(TyID) + ", " + utostr(SlotNo) + ": " + utostr(ModuleValues.size())); - else + else error("Corrupt compaction table entry!" - + utostr(TyID) + ", " + utostr(SlotNo) + ": " + + utostr(TyID) + ", " + utostr(SlotNo) + ": " + utostr(ModuleValues.size()) + ", " + utohexstr(reinterpret_cast(((void*)ModuleValues[TyID]))) + ", " @@ -483,14 +483,14 @@ /// Just like getValue, except that it returns a null pointer /// only on error. It always returns a constant (meaning that if the value is /// defined, but is not a constant, that is an error). If the specified -/// constant hasn't been parsed yet, a placeholder is defined and used. +/// constant hasn't been parsed yet, a placeholder is defined and used. /// Later, after the real value is parsed, the placeholder is eliminated. Constant* BytecodeReader::getConstantValue(unsigned TypeSlot, unsigned Slot) { if (Value *V = getValue(TypeSlot, Slot, false)) if (Constant *C = dyn_cast(V)) return C; // If we already have the value parsed, just return it else - error("Value for slot " + utostr(Slot) + + error("Value for slot " + utostr(Slot) + " is expected to be a constant!"); std::pair Key(TypeSlot, Slot); @@ -502,7 +502,7 @@ // Create a placeholder for the constant reference and // keep track of the fact that we have a forward ref to recycle it Constant *C = new ConstantPlaceHolder(getType(TypeSlot)); - + // Keep track of the fact that we have a forward ref to recycle it ConstantFwdRefs.insert(I, std::make_pair(Key, C)); return C; @@ -516,7 +516,7 @@ /// As values are created, they are inserted into the appropriate place /// with this method. The ValueTable argument must be one of ModuleValues /// or FunctionValues data members of this class. -unsigned BytecodeReader::insertValue(Value *Val, unsigned type, +unsigned BytecodeReader::insertValue(Value *Val, unsigned type, ValueTable &ValueTab) { assert((!isa(Val) || !cast(Val)->isNullValue()) || !hasImplicitNull(type) && @@ -584,7 +584,7 @@ // -------------------------- // 15-08: Resulting type plane // 23-16: Operand #1 - // 31-24: Operand #2 + // 31-24: Operand #2 // iType = (Op >> 8) & 255; Oprnds[0] = (Op >> 16) & 255; @@ -646,20 +646,20 @@ getValue(iType, Oprnds[1])); switch (Opcode) { - default: - if (Result == 0) + default: + if (Result == 0) error("Illegal instruction read!"); break; case Instruction::VAArg: - Result = new VAArgInst(getValue(iType, Oprnds[0]), + Result = new VAArgInst(getValue(iType, Oprnds[0]), getSanitizedType(Oprnds[1])); break; case Instruction::VANext: - Result = new VANextInst(getValue(iType, Oprnds[0]), + Result = new VANextInst(getValue(iType, Oprnds[0]), getSanitizedType(Oprnds[1])); break; case Instruction::Cast: - Result = new CastInst(getValue(iType, Oprnds[0]), + Result = new CastInst(getValue(iType, Oprnds[0]), getSanitizedType(Oprnds[1])); break; case Instruction::Select: @@ -698,7 +698,7 @@ if (Oprnds.size() == 1) Result = new BranchInst(getBasicBlock(Oprnds[0])); else if (Oprnds.size() == 3) - Result = new BranchInst(getBasicBlock(Oprnds[0]), + Result = new BranchInst(getBasicBlock(Oprnds[0]), getBasicBlock(Oprnds[1]), getValue(Type::BoolTyID , Oprnds[2])); else error("Invalid number of operands for a 'br' instruction!"); @@ -750,13 +750,13 @@ // Read all of the fixed arguments for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) Params.push_back(getValue(getTypeSlot(FTy->getParamType(i)),Oprnds[i])); - + FirstVariableOperand = FTy->getNumParams(); - if ((Oprnds.size()-FirstVariableOperand) & 1) + if ((Oprnds.size()-FirstVariableOperand) & 1) error("Invalid call instruction!"); // Must be pairs of type/value - - for (unsigned i = FirstVariableOperand, e = Oprnds.size(); + + for (unsigned i = FirstVariableOperand, e = Oprnds.size(); i != e; i += 2) Params.push_back(getValue(Oprnds[i], Oprnds[i+1])); } @@ -765,16 +765,16 @@ break; } case Instruction::Invoke: { - if (Oprnds.size() < 3) + if (Oprnds.size() < 3) error("Invalid invoke instruction!"); Value *F = getValue(iType, Oprnds[0]); // Check to make sure we have a pointer to function type const PointerType *PTy = dyn_cast(F->getType()); - if (PTy == 0) + if (PTy == 0) error("Invoke to non function pointer value!"); const FunctionType *FTy = dyn_cast(PTy->getElementType()); - if (FTy == 0) + if (FTy == 0) error("Invoke to non function pointer value!"); std::vector Params; @@ -797,12 +797,12 @@ Normal = getBasicBlock(Oprnds[0]); Except = getBasicBlock(Oprnds[1]); - + unsigned FirstVariableArgument = FTy->getNumParams()+2; for (unsigned i = 2; i != FirstVariableArgument; ++i) Params.push_back(getValue(getTypeSlot(FTy->getParamType(i-2)), Oprnds[i])); - + if (Oprnds.size()-FirstVariableArgument & 1) // Must be type/value pairs error("Invalid invoke instruction!"); @@ -814,7 +814,7 @@ break; } case Instruction::Malloc: - if (Oprnds.size() > 2) + if (Oprnds.size() > 2) error("Invalid malloc instruction!"); if (!isa(InstTy)) error("Invalid malloc instruction!"); @@ -825,13 +825,13 @@ break; case Instruction::Alloca: - if (Oprnds.size() > 2) + if (Oprnds.size() > 2) error("Invalid alloca instruction!"); if (!isa(InstTy)) error("Invalid alloca instruction!"); Result = new AllocaInst(cast(InstTy)->getElementType(), - Oprnds.size() ? getValue(Type::UIntTyID, + Oprnds.size() ? getValue(Type::UIntTyID, Oprnds[0]) :0); break; case Instruction::Free: @@ -848,8 +848,8 @@ const Type *NextTy = InstTy; for (unsigned i = 1, e = Oprnds.size(); i != e; ++i) { const CompositeType *TopTy = dyn_cast_or_null(NextTy); - if (!TopTy) - error("Invalid getelementptr instruction!"); + if (!TopTy) + error("Invalid getelementptr instruction!"); unsigned ValIdx = Oprnds[i]; unsigned IdxTy = 0; @@ -894,7 +894,7 @@ Result = new LoadInst(getValue(iType, Oprnds[0]), "", Opcode == 62); break; - case 63: // volatile store + case 63: // volatile store case Instruction::Store: { if (!isa(InstTy) || Oprnds.size() != 2) error("Invalid store instruction!"); @@ -913,7 +913,7 @@ if (Oprnds.size() != 0) error("Invalid unreachable instruction!"); Result = new UnreachableInst(); break; - } // end switch(Opcode) + } // end switch(Opcode) unsigned TypeSlot; if (Result->getType() == InstTy) @@ -945,7 +945,7 @@ return ParsedBasicBlocks[ID] = new BasicBlock(); } -/// In LLVM 1.0 bytecode files, we used to output one basicblock at a time. +/// In LLVM 1.0 bytecode files, we used to output one basicblock at a time. /// This method reads in one of the basicblock packets. This method is not used /// for bytecode files after LLVM 1.0 /// @returns The basic block constructed. @@ -970,7 +970,7 @@ } /// Parse all of the BasicBlock's & Instruction's in the body of a function. -/// In post 1.0 bytecode files, we no longer emit basic block individually, +/// In post 1.0 bytecode files, we no longer emit basic block individually, /// in order to avoid per-basic-block overhead. /// @returns Rhe number of basic blocks encountered. unsigned BytecodeReader::ParseInstructionList(Function* F) { @@ -1071,7 +1071,7 @@ if (Handler) Handler->handleSymbolTableEnd(); } -/// Read in the types portion of a compaction table. +/// Read in the types portion of a compaction table. void BytecodeReader::ParseCompactionTypes(unsigned NumEntries) { for (unsigned i = 0; i != NumEntries; ++i) { unsigned TypeSlot = 0; @@ -1089,7 +1089,7 @@ // Notify handler that we're beginning a compaction table. if (Handler) Handler->handleCompactionTableBegin(); - // In LLVM 1.3 Type no longer derives from Value. So, + // In LLVM 1.3 Type no longer derives from Value. So, // we always write them first in the compaction table // because they can't occupy a "type plane" where the // Values reside. @@ -1155,10 +1155,10 @@ // Notify handler that the compaction table is done. if (Handler) Handler->handleCompactionTableEnd(); } - + // Parse a single type. The typeid is read in first. If its a primitive type // then nothing else needs to be read, we know how to instantiate it. If its -// a derived type, then additional data is read to fill out the type +// a derived type, then additional data is read to fill out the type // definition. const Type *BytecodeReader::ParseType() { unsigned PrimType = 0; @@ -1168,7 +1168,7 @@ const Type *Result = 0; if ((Result = Type::getPrimitiveType((Type::TypeID)PrimType))) return Result; - + switch (PrimType) { case Type::FunctionTyID: { const Type *RetType = readSanitizedType(); @@ -1176,7 +1176,7 @@ unsigned NumParams = read_vbr_uint(); std::vector Params; - while (NumParams--) + while (NumParams--) Params.push_back(readSanitizedType()); bool isVarArg = Params.size() && Params.back() == Type::VoidTy; @@ -1248,7 +1248,7 @@ for (unsigned i = 0; i != NumEntries; ++i) Tab.push_back(OpaqueType::get()); - if (Handler) + if (Handler) Handler->handleTypeList(NumEntries); // Loop through reading all of the types. Forward types will make use of the @@ -1257,10 +1257,10 @@ for (unsigned i = 0; i != NumEntries; ++i) { const Type* NewTy = ParseType(); const Type* OldTy = Tab[i].get(); - if (NewTy == 0) + if (NewTy == 0) error("Couldn't parse type!"); - // Don't directly push the new type on the Tab. Instead we want to replace + // Don't directly push the new type on the Tab. Instead we want to replace // the opaque type we previously inserted with the new concrete value. This // approach helps with forward references to types. The refinement from the // abstract (opaque) type to the new type causes all uses of the abstract @@ -1279,7 +1279,7 @@ Constant *BytecodeReader::ParseConstantValue(unsigned TypeID) { // We must check for a ConstantExpr before switching by type because // a ConstantExpr can be of any type, and has no explicit value. - // + // // 0 if not expr; numArgs if is expr unsigned isExprNumArgs = read_vbr_uint(); @@ -1288,7 +1288,7 @@ if (!hasNoUndefValue) if (--isExprNumArgs == 0) return UndefValue::get(getType(TypeID)); - + // FIXME: Encoding of constant exprs could be much more compact! std::vector ArgVec; ArgVec.reserve(isExprNumArgs); @@ -1296,18 +1296,18 @@ // Bytecode files before LLVM 1.4 need have a missing terminator inst. if (hasNoUnreachableInst) Opcode++; - + // Read the slot number and types of each of the arguments for (unsigned i = 0; i != isExprNumArgs; ++i) { unsigned ArgValSlot = read_vbr_uint(); unsigned ArgTypeSlot = 0; if (read_typeid(ArgTypeSlot)) error("Invalid argument type (type type) for constant value"); - + // Get the arg value from its slot if it exists, otherwise a placeholder ArgVec.push_back(getConstantValue(ArgTypeSlot, ArgValSlot)); } - + // Construct a ConstantExpr of the appropriate kind if (isExprNumArgs == 1) { // All one-operand expressions if (Opcode != Instruction::Cast) @@ -1338,7 +1338,7 @@ } else if (Opcode == Instruction::Select) { if (ArgVec.size() != 3) error("Select instruction must have three arguments."); - Constant* Result = ConstantExpr::getSelect(ArgVec[0], ArgVec[1], + Constant* Result = ConstantExpr::getSelect(ArgVec[0], ArgVec[1], ArgVec[2]); if (Handler) Handler->handleConstantExpression(Opcode, ArgVec, Result); return Result; @@ -1348,13 +1348,13 @@ return Result; } } - + // Ok, not an ConstantExpr. We now know how to read the given type... const Type *Ty = getType(TypeID); switch (Ty->getTypeID()) { case Type::BoolTyID: { unsigned Val = read_vbr_uint(); - if (Val != 0 && Val != 1) + if (Val != 0 && Val != 1) error("Invalid boolean value read."); Constant* Result = ConstantBool::get(Val == 1); if (Handler) Handler->handleConstantValue(Result); @@ -1365,7 +1365,7 @@ case Type::UShortTyID: case Type::UIntTyID: { unsigned Val = read_vbr_uint(); - if (!ConstantUInt::isValueValidForType(Ty, Val)) + if (!ConstantUInt::isValueValidForType(Ty, Val)) error("Invalid unsigned byte/short/int read."); Constant* Result = ConstantUInt::get(Ty, Val); if (Handler) Handler->handleConstantValue(Result); @@ -1383,7 +1383,7 @@ case Type::IntTyID: { case Type::LongTyID: int64_t Val = read_vbr_int64(); - if (!ConstantSInt::isValueValidForType(Ty, Val)) + if (!ConstantSInt::isValueValidForType(Ty, Val)) error("Invalid signed byte/short/int/long read."); Constant* Result = ConstantSInt::get(Ty, Val); if (Handler) Handler->handleConstantValue(Result); @@ -1432,7 +1432,7 @@ Constant* Result = ConstantStruct::get(ST, Elements); if (Handler) Handler->handleConstantStruct(ST, Elements, Result); return Result; - } + } case Type::PackedTyID: { const PackedType *PT = cast(Ty); @@ -1451,7 +1451,7 @@ case Type::PointerTyID: { // ConstantPointerRef value (backwards compat). const PointerType *PT = cast(Ty); unsigned Slot = read_vbr_uint(); - + // Check to see if we have already read this global variable... Value *Val = getValue(TypeID, Slot, false); if (Val) { @@ -1472,8 +1472,8 @@ return 0; } -/// Resolve references for constants. This function resolves the forward -/// referenced constants in the ConstantFwdRefs map. It uses the +/// Resolve references for constants. This function resolves the forward +/// referenced constants in the ConstantFwdRefs map. It uses the /// replaceAllUsesWith method of Value class to substitute the placeholder /// instance with the actual instance. void BytecodeReader::ResolveReferencesToConstant(Constant *NewV, unsigned Typ, @@ -1497,14 +1497,14 @@ const Type *Ty = getType(Typ); if (!isa(Ty)) error("String constant data invalid!"); - + const ArrayType *ATy = cast(Ty); if (ATy->getElementType() != Type::SByteTy && ATy->getElementType() != Type::UByteTy) error("String constant data invalid!"); - + // Read character data. The type tells us how long the string is. - char *Data = reinterpret_cast(alloca(ATy->getNumElements())); + char *Data = reinterpret_cast(alloca(ATy->getNumElements())); read_data(Data, Data+ATy->getNumElements()); std::vector Elements(ATy->getNumElements()); @@ -1524,7 +1524,7 @@ } /// Parse the constant pool. -void BytecodeReader::ParseConstantPool(ValueTable &Tab, +void BytecodeReader::ParseConstantPool(ValueTable &Tab, TypeListTy &TypeTab, bool isFunction) { if (Handler) Handler->handleGlobalConstantsBegin(); @@ -1574,9 +1574,9 @@ if (!ConstantFwdRefs.empty()) { ConstantRefsType::const_iterator I = ConstantFwdRefs.begin(); Constant* missingConst = I->second; - error(utostr(ConstantFwdRefs.size()) + - " unresolved constant reference exist. First one is '" + - missingConst->getName() + "' of type '" + + error(utostr(ConstantFwdRefs.size()) + + " unresolved constant reference exist. First one is '" + + missingConst->getName() + "' of type '" + missingConst->getType()->getDescription() + "'."); } @@ -1658,7 +1658,7 @@ InsertedArguments = true; } - if (BlockNum) + if (BlockNum) error("Already parsed basic blocks!"); BlockNum = ParseInstructionList(F); break; @@ -1670,7 +1670,7 @@ default: At += Size; - if (OldAt > At) + if (OldAt > At) error("Wrapped around reading bytecode."); break; } @@ -1709,7 +1709,7 @@ /// This function parses LLVM functions lazily. It obtains the type of the /// function and records where the body of the function is in the bytecode -/// buffer. The caller can then use the ParseNextFunction and +/// buffer. The caller can then use the ParseNextFunction and /// ParseAllFunctionBodies to get handler events for the functions. void BytecodeReader::ParseFunctionLazily() { if (FunctionSignatureList.empty()) @@ -1729,9 +1729,9 @@ At = BlockEnd; } -/// The ParserFunction method lazily parses one function. Use this method to -/// casue the parser to parse a specific function in the module. Note that -/// this will remove the function from what is to be included by +/// The ParserFunction method lazily parses one function. Use this method to +/// casue the parser to parse a specific function in the module. Note that +/// this will remove the function from what is to be included by /// ParseAllFunctionBodies. /// @see ParseAllFunctionBodies /// @see ParseBytecode @@ -1811,7 +1811,7 @@ case 2: Linkage = GlobalValue::AppendingLinkage; break; case 3: Linkage = GlobalValue::InternalLinkage; break; case 4: Linkage = GlobalValue::LinkOnceLinkage; break; - default: + default: error("Unknown linkage type: " + utostr(LinkageID)); Linkage = GlobalValue::InternalLinkage; break; @@ -1834,7 +1834,7 @@ insertValue(GV, SlotNo, ModuleValues); unsigned initSlot = 0; - if (hasInitializer) { + if (hasInitializer) { initSlot = read_vbr_uint(); GlobalInits.push_back(std::make_pair(GV, initSlot)); } @@ -1858,17 +1858,17 @@ const Type *Ty = getType(FnSignature >> 5); if (!isa(Ty) || !isa(cast(Ty)->getElementType())) { - error("Function not a pointer to function type! Ty = " + + error("Function not a pointer to function type! Ty = " + Ty->getDescription()); } // We create functions by passing the underlying FunctionType to create... - const FunctionType* FTy = + const FunctionType* FTy = cast(cast(Ty)->getElementType()); // Insert the place holder. - Function* Func = new Function(FTy, GlobalValue::ExternalLinkage, + Function* Func = new Function(FTy, GlobalValue::ExternalLinkage, "", TheModule); insertValue(Func, FnSignature >> 5, ModuleValues); @@ -1889,7 +1889,7 @@ FnSignature = (FnSignature << 5) + 1; } - // Now that the function signature list is set up, reverse it so that we can + // Now that the function signature list is set up, reverse it so that we can // remove elements efficiently from the back of the vector. std::reverse(FunctionSignatureList.begin(), FunctionSignatureList.end()); @@ -1937,7 +1937,7 @@ bool hasNoEndianness = Version & 4; bool hasNoPointerSize = Version & 8; - + RevisionNum = Version >> 4; // Default values for the current bytecode version @@ -1977,12 +1977,12 @@ // LLVM 1.2 and before had the Type class derive from Value class. This // changed in release 1.3 and consequently LLVM 1.3 bytecode files are - // written differently because Types can no longer be part of the + // written differently because Types can no longer be part of the // type planes for Values. hasTypeDerivedFromValue = true; // FALL THROUGH - + case 2: // 1.2.5 (Not Released) // LLVM 1.2 and earlier had two-word block headers. This is a bit wasteful, @@ -1999,7 +1999,7 @@ // in various places and to ensure consistency. has32BitTypes = true; - // LLVM 1.2 and earlier did not provide a target triple nor a list of + // LLVM 1.2 and earlier did not provide a target triple nor a list of // libraries on which the bytecode is dependent. LLVM 1.3 provides these // features, for use in future versions of LLVM. hasNoDependentLibraries = true; @@ -2008,13 +2008,13 @@ case 3: // LLVM 1.3 (Released) // LLVM 1.3 and earlier caused alignment bytes to be written on some block - // boundaries and at the end of some strings. In extreme cases (e.g. lots + // boundaries and at the end of some strings. In extreme cases (e.g. lots // of GEP references to a constant array), this can increase the file size // by 30% or more. In version 1.4 alignment is done away with completely. hasAlignment = true; // FALL THROUGH - + case 4: // 1.3.1 (Not Released) // In version 4, we did not support the 'undef' constant. hasNoUndefValue = true; @@ -2034,8 +2034,8 @@ break; // FIXME: NONE of this is implemented yet! - // In version 5, basic blocks have a minimum index of 0 whereas all the - // other primitives have a minimum index of 1 (because 0 is the "null" + // In version 5, basic blocks have a minimum index of 0 whereas all the + // other primitives have a minimum index of 1 (because 0 is the "null" // value. In version 5, we made this consistent. hasInconsistentBBSlotNums = true; @@ -2090,7 +2090,7 @@ SeenGlobalTypePlane = true; break; - case BytecodeFormat::ModuleGlobalInfoBlockID: + case BytecodeFormat::ModuleGlobalInfoBlockID: if (SeenModuleGlobalInfo) error("Two ModuleGlobalInfo Blocks Encountered!"); ParseModuleGlobalInfo(); @@ -2133,7 +2133,7 @@ const llvm::PointerType* GVType = GV->getType(); unsigned TypeSlot = getTypeSlot(GVType->getElementType()); if (Constant *CV = getConstantValue(TypeSlot, Slot)) { - if (GV->hasInitializer()) + if (GV->hasInitializer()) error("Global *already* has an initializer?!"); if (Handler) Handler->handleGlobalInitializer(GV,CV); GV->setInitializer(CV); @@ -2149,7 +2149,7 @@ /// This function completely parses a bytecode buffer given by the \p Buf /// and \p Length parameters. -void BytecodeReader::ParseBytecode(BufPtr Buf, unsigned Length, +void BytecodeReader::ParseBytecode(BufPtr Buf, unsigned Length, const std::string &ModuleID) { try { @@ -2198,7 +2198,7 @@ Type = read_uint(); Size = read_uint(); if (Type != BytecodeFormat::ModuleBlockID) { - error("Expected Module Block! Type:" + utostr(Type) + ", Size:" + error("Expected Module Block! Type:" + utostr(Type) + ", Size:" + utostr(Size)); } @@ -2220,7 +2220,7 @@ error("Function expected, but bytecode stream ended!"); // Tell the handler we're done with the module - if (Handler) + if (Handler) Handler->handleModuleEnd(ModuleID); // Tell the handler we're finished the parse Index: llvm/lib/Bytecode/Reader/Reader.h diff -u llvm/lib/Bytecode/Reader/Reader.h:1.21 llvm/lib/Bytecode/Reader/Reader.h:1.22 --- llvm/lib/Bytecode/Reader/Reader.h:1.21 Fri Jan 28 18:36:19 2005 +++ llvm/lib/Bytecode/Reader/Reader.h Thu Apr 21 16:44:41 2005 @@ -1,13 +1,13 @@ //===-- Reader.h - Interface To Bytecode Reading ----------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// This file was developed by Reid Spencer and is distributed under the // University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // -// This header file defines the interface to the Bytecode Reader which is +// This header file defines the interface to the Bytecode Reader which is // responsible for correctly interpreting bytecode files (backwards compatible) // and materializing a module from the bytecode read. // @@ -32,8 +32,8 @@ /// This class defines the interface for parsing a buffer of bytecode. The /// parser itself takes no action except to call the various functions of /// the handler interface. The parser's sole responsibility is the correct -/// interpretation of the bytecode buffer. The handler is responsible for -/// instantiating and keeping track of all values. As a convenience, the parser +/// interpretation of the bytecode buffer. The handler is responsible for +/// instantiating and keeping track of all values. As a convenience, the parser /// is responsible for materializing types and will pass them through the /// handler interface as necessary. /// @see BytecodeHandler @@ -44,13 +44,13 @@ /// @{ public: /// @brief Default constructor. By default, no handler is used. - BytecodeReader(BytecodeHandler* h = 0) { + BytecodeReader(BytecodeHandler* h = 0) { decompressedBlock = 0; Handler = h; } - ~BytecodeReader() { - freeState(); + ~BytecodeReader() { + freeState(); if (decompressedBlock) { ::free(decompressedBlock); decompressedBlock = 0; @@ -104,7 +104,7 @@ /// @brief A 2 dimensional table of values typedef std::vector ValueTable; - /// This map is needed so that forward references to constants can be looked + /// This map is needed so that forward references to constants can be looked /// up by Type and slot number when resolving those references. /// @brief A mapping of a Type/slot pair to a Constant*. typedef std::map, Constant*> ConstantRefsType; @@ -112,7 +112,7 @@ /// For lazy read-in of functions, we need to save the location in the /// data stream where the function is located. This structure provides that /// information. Lazy read-in is used mostly by the JIT which only wants to - /// resolve functions as it needs them. + /// resolve functions as it needs them. /// @brief Keeps pointers to function contents for later use. struct LazyFunctionInfo { const unsigned char *Buf, *EndBuf; @@ -160,7 +160,7 @@ } /// This method is abstract in the parent ModuleProvider class. Its - /// implementation is identical to ParseAllFunctionBodies. + /// implementation is identical to ParseAllFunctionBodies. /// @see ParseAllFunctionBodies /// @brief Make the whole module materialize virtual Module* materializeModule() { @@ -218,7 +218,7 @@ unsigned ParseInstructionList( Function* F ///< The function into which BBs will be inserted ); - + /// @brief Parse a single instruction. void ParseInstruction( std::vector& Args, ///< The arguments to be filled in @@ -226,7 +226,7 @@ ); /// @brief Parse the whole constant pool - void ParseConstantPool(ValueTable& Values, TypeListTy& Types, + void ParseConstantPool(ValueTable& Values, TypeListTy& Types, bool isFunction); /// @brief Parse a single constant value @@ -245,7 +245,7 @@ /// @name Data /// @{ private: - char* decompressedBlock; ///< Result of decompression + char* decompressedBlock; ///< Result of decompression BufPtr MemStart; ///< Start of the memory buffer BufPtr MemEnd; ///< End of the memory buffer BufPtr BlockStart; ///< Start of current block being parsed @@ -291,14 +291,14 @@ bool hasLongBlockHeaders; /// LLVM 1.2 and earlier wrote type slot numbers as vbr_uint32. In LLVM 1.3 - /// this has been reduced to vbr_uint24. It shouldn't make much difference + /// this has been reduced to vbr_uint24. It shouldn't make much difference /// since we haven't run into a module with > 24 million types, but for safety /// the 24-bit restriction has been enforced in 1.3 to free some bits in /// various places and to ensure consistency. In particular, global vars are /// restricted to 24-bits. bool has32BitTypes; - /// LLVM 1.2 and earlier did not provide a target triple nor a list of + /// LLVM 1.2 and earlier did not provide a target triple nor a list of /// libraries on which the bytecode is dependent. LLVM 1.3 provides these /// features, for use in future versions of LLVM. bool hasNoDependentLibraries; @@ -321,8 +321,8 @@ // unreachable instruction. bool hasNoUnreachableInst; - // In version 5, basic blocks have a minimum index of 0 whereas all the - // other primitives have a minimum index of 1 (because 0 is the "null" + // In version 5, basic blocks have a minimum index of 0 whereas all the + // other primitives have a minimum index of 1 (because 0 is the "null" // value. In version 5, we made this consistent. bool hasInconsistentBBSlotNums; @@ -388,11 +388,11 @@ // and its FunctionSlot. LazyFunctionMap LazyFunctionLoadMap; - /// This stores the parser's handler which is used for handling tasks other - /// just than reading bytecode into the IR. If this is non-null, calls on - /// the (polymorphic) BytecodeHandler interface (see llvm/Bytecode/Handler.h) - /// will be made to report the logical structure of the bytecode file. What - /// the handler does with the events it receives is completely orthogonal to + /// This stores the parser's handler which is used for handling tasks other + /// just than reading bytecode into the IR. If this is non-null, calls on + /// the (polymorphic) BytecodeHandler interface (see llvm/Bytecode/Handler.h) + /// will be made to report the logical structure of the bytecode file. What + /// the handler does with the events it receives is completely orthogonal to /// the business of parsing the bytecode and building the IR. This is used, /// for example, by the llvm-abcd tool for analysis of byte code. /// @brief Handler for parsing events. @@ -428,9 +428,9 @@ const Type *getGlobalTableType(unsigned TypeId); /// This is just like getTypeSlot, but when a compaction table is in use, - /// it is ignored. + /// it is ignored. unsigned getGlobalTableTypeSlot(const Type *Ty); - + /// @brief Get a value from its typeid and slot number Value* getValue(unsigned TypeID, unsigned num, bool Create = true); @@ -456,7 +456,7 @@ /// @brief Insert the arguments of a function. void insertArguments(Function* F ); - /// @brief Resolve all references to the placeholder (if any) for the + /// @brief Resolve all references to the placeholder (if any) for the /// given constant. void ResolveReferencesToConstant(Constant *C, unsigned Typ, unsigned Slot); @@ -534,7 +534,7 @@ /// @brief A function for creating a BytecodeAnalzer as a handler /// for the Bytecode reader. -BytecodeHandler* createBytecodeAnalyzerHandler(BytecodeAnalysis& bca, +BytecodeHandler* createBytecodeAnalyzerHandler(BytecodeAnalysis& bca, std::ostream* output ); Index: llvm/lib/Bytecode/Reader/ReaderWrappers.cpp diff -u llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.44 llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.45 --- llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.44 Mon Mar 14 22:54:18 2005 +++ llvm/lib/Bytecode/Reader/ReaderWrappers.cpp Thu Apr 21 16:44:41 2005 @@ -1,10 +1,10 @@ //===- ReaderWrappers.cpp - Parse bytecode from file or buffer -----------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements loading and parsing a bytecode file and parsing a @@ -43,7 +43,7 @@ } BytecodeFileReader::BytecodeFileReader(const std::string &Filename, - llvm::BytecodeHandler* H ) + llvm::BytecodeHandler* H ) : BytecodeReader(H) , mapFile( sys::Path(Filename)) { @@ -113,7 +113,7 @@ namespace { /// BytecodeStdinReader - parses a bytecode file from stdin - /// + /// class BytecodeStdinReader : public BytecodeReader { private: std::vector FileData; @@ -127,7 +127,7 @@ }; } -BytecodeStdinReader::BytecodeStdinReader( BytecodeHandler* H ) +BytecodeStdinReader::BytecodeStdinReader( BytecodeHandler* H ) : BytecodeReader(H) { char Buffer[4096*4]; @@ -156,7 +156,7 @@ // new style varargs for backwards compatibility. static ModuleProvider *CheckVarargs(ModuleProvider *MP) { Module *M = MP->getModule(); - + // Check to see if va_start takes arguments... Function *F = M->getNamedFunction("llvm.va_start"); if (F == 0) return MP; // No varargs use, just return. @@ -172,11 +172,11 @@ // the user. if (Function *F = M->getNamedFunction("llvm.va_start")) { assert(F->arg_size() == 1 && "Obsolete va_start takes 1 argument!"); - + const Type *RetTy = F->getFunctionType()->getParamType(0); RetTy = cast(RetTy)->getElementType(); Function *NF = M->getOrInsertFunction("llvm.va_start", RetTy, 0); - + for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ) if (CallInst *CI = dyn_cast(*I++)) { Value *V = new CallInst(NF, "", CI); @@ -192,7 +192,7 @@ ArgTy = cast(ArgTy)->getElementType(); Function *NF = M->getOrInsertFunction("llvm.va_end", Type::VoidTy, ArgTy, 0); - + for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ) if (CallInst *CI = dyn_cast(*I++)) { Value *V = new LoadInst(CI->getOperand(1), "", CI); @@ -201,14 +201,14 @@ } F->setName(""); } - + if (Function *F = M->getNamedFunction("llvm.va_copy")) { assert(F->arg_size() == 2 && "Obsolete va_copy takes 2 argument!"); const Type *ArgTy = F->getFunctionType()->getParamType(0); ArgTy = cast(ArgTy)->getElementType(); Function *NF = M->getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, 0); - + for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ) if (CallInst *CI = dyn_cast(*I++)) { Value *V = new CallInst(NF, CI->getOperand(2), "", CI); @@ -226,7 +226,7 @@ /// getBytecodeBufferModuleProvider - lazy function-at-a-time loading from a /// buffer -ModuleProvider* +ModuleProvider* llvm::getBytecodeBufferModuleProvider(const unsigned char *Buffer, unsigned Length, const std::string &ModuleID, @@ -313,7 +313,7 @@ } } -bool llvm::GetBytecodeDependentLibraries(const std::string &fname, +bool llvm::GetBytecodeDependentLibraries(const std::string &fname, Module::LibraryListType& deplibs) { try { std::auto_ptr AMP( getBytecodeModuleProvider(fname)); @@ -346,7 +346,7 @@ bool llvm::GetBytecodeSymbols(const sys::Path& fName, std::vector& symbols) { try { - std::auto_ptr AMP( + std::auto_ptr AMP( getBytecodeModuleProvider(fName.toString())); // Get the module from the provider @@ -363,7 +363,7 @@ } } -ModuleProvider* +ModuleProvider* llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length, const std::string& ModuleID, std::vector& symbols) { From brukman at cs.uiuc.edu Thu Apr 21 16:48:57 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Thu, 21 Apr 2005 16:48:57 -0500 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Writer/SlotCalculator.cpp SlotCalculator.h SlotTable.h Writer.cpp WriterInternals.h Message-ID: <200504212148.QAA04018@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Writer: SlotCalculator.cpp updated: 1.67 -> 1.68 SlotCalculator.h updated: 1.21 -> 1.22 SlotTable.h updated: 1.4 -> 1.5 Writer.cpp updated: 1.96 -> 1.97 WriterInternals.h updated: 1.24 -> 1.25 --- Log message: * Remove trailing whitespace * Convert tabs to spaces --- Diffs of the changes: (+135 -135) SlotCalculator.cpp | 62 ++++++++++++------------- SlotCalculator.h | 12 ++-- SlotTable.h | 26 +++++----- Writer.cpp | 130 ++++++++++++++++++++++++++--------------------------- WriterInternals.h | 40 ++++++++-------- 5 files changed, 135 insertions(+), 135 deletions(-) Index: llvm/lib/Bytecode/Writer/SlotCalculator.cpp diff -u llvm/lib/Bytecode/Writer/SlotCalculator.cpp:1.67 llvm/lib/Bytecode/Writer/SlotCalculator.cpp:1.68 --- llvm/lib/Bytecode/Writer/SlotCalculator.cpp:1.67 Mon Mar 14 22:54:19 2005 +++ llvm/lib/Bytecode/Writer/SlotCalculator.cpp Thu Apr 21 16:48:46 2005 @@ -1,10 +1,10 @@ //===-- SlotCalculator.cpp - Calculate what slots values land in ----------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements a useful analysis step to figure out what numbered slots @@ -150,7 +150,7 @@ TypePlane &Plane = Table[plane]; unsigned FirstNonStringID = 0; for (unsigned i = 0, e = Plane.size(); i != e; ++i) - if (isa(Plane[i]) || + if (isa(Plane[i]) || (isa(Plane[i]) && cast(Plane[i])->isString())) { // Check to see if we have to shuffle this string around. If not, @@ -158,7 +158,7 @@ if (i != FirstNonStringID) { // Swap the plane entries.... std::swap(Plane[i], Plane[FirstNonStringID]); - + // Keep the NodeMap up to date. NodeMap[Plane[i]] = i; NodeMap[Plane[FirstNonStringID]] = FirstNonStringID; @@ -167,14 +167,14 @@ } } } - - // Scan all of the functions for their constants, which allows us to emit - // more compact modules. This is optional, and is just used to compactify + + // Scan all of the functions for their constants, which allows us to emit + // more compact modules. This is optional, and is just used to compactify // the constants used by different functions together. // - // This functionality tends to produce smaller bytecode files. This should - // not be used in the future by clients that want to, for example, build and - // emit functions on the fly. For now, however, it is unconditionally + // This functionality tends to produce smaller bytecode files. This should + // not be used in the future by clients that want to, for example, build and + // emit functions on the fly. For now, however, it is unconditionally // enabled. ModuleContainsAllFunctionConstants = true; @@ -183,7 +183,7 @@ F != E; ++F) { for (const_inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I){ for (unsigned op = 0, e = I->getNumOperands(); op != e; ++op) - if (isa(I->getOperand(op)) && + if (isa(I->getOperand(op)) && !isa(I->getOperand(op))) getOrCreateSlot(I->getOperand(op)); getOrCreateSlot(I->getType()); @@ -244,7 +244,7 @@ getOrCreateSlot(TI->second); // Now do the values. - for (SymbolTable::plane_const_iterator PI = ST->plane_begin(), + for (SymbolTable::plane_const_iterator PI = ST->plane_begin(), PE = ST->plane_end(); PI != PE; ++PI) for (SymbolTable::value_const_iterator VI = PI->second.begin(), VE = PI->second.end(); VI != VE; ++VI) @@ -258,7 +258,7 @@ getOrCreateSlot(TI->second); // Now do the constant values in all planes - for (SymbolTable::plane_const_iterator PI = ST->plane_begin(), + for (SymbolTable::plane_const_iterator PI = ST->plane_begin(), PE = ST->plane_end(); PI != PE; ++PI) for (SymbolTable::value_const_iterator VI = PI->second.begin(), VE = PI->second.end(); VI != VE; ++VI) @@ -294,7 +294,7 @@ // before any nonconstant values. This will be turned into the constant // pool for the bytecode writer. // - + // Emit all of the constants that are being used by the instructions in // the function... constant_iterator CI = constant_begin(F); @@ -303,10 +303,10 @@ this->getOrCreateSlot(*CI); ++CI; } - + // If there is a symbol table, it is possible that the user has names for // constants that are not being used. In this case, we will have problems - // if we don't emit the constants now, because otherwise we will get + // if we don't emit the constants now, because otherwise we will get // symbol table references to constants not in the output. Scan for these // constants now. // @@ -380,7 +380,7 @@ NodeMap.erase(Plane.back()); // Erase from nodemap Plane.pop_back(); // Shrink plane } - + Table.pop_back(); // Nuke the plane, we don't like it. } } @@ -482,7 +482,7 @@ getOrCreateCompactionTableSlot(TI->second); // Now do the constants and global values - for (SymbolTable::plane_const_iterator PI = ST.plane_begin(), + for (SymbolTable::plane_const_iterator PI = ST.plane_begin(), PE = ST.plane_end(); PI != PE; ++PI) for (SymbolTable::value_const_iterator VI = PI->second.begin(), VE = PI->second.end(); VI != VE; ++VI) @@ -503,14 +503,14 @@ assert(Ty->getTypeID() != Type::LabelTyID); getOrCreateCompactionTableSlot(Constant::getNullValue(Ty)); } - + // Okay, now at this point, we have a legal compaction table. Since we want // to emit the smallest possible binaries, do not compactify the type plane if // it will not save us anything. Because we have not yet incorporated the // function body itself yet, we don't know whether or not it's a good idea to // compactify other planes. We will defer this decision until later. TypeList &GlobalTypes = Types; - + // All of the values types will be scrunched to the start of the types plane // of the global table. Figure out just how many there are. assert(!GlobalTypes.empty() && "No global types???"); @@ -530,7 +530,7 @@ std::swap(CompactionTable, TmpCompactionTable); TypeList TmpTypes; std::swap(TmpTypes, CompactionTypes); - + // Move each plane back over to the uncompactified plane while (!TmpTypes.empty()) { const Type *Ty = TmpTypes.back(); @@ -540,7 +540,7 @@ // Find the global slot number for this type. int TySlot = getSlot(Ty); assert(TySlot != -1 && "Type doesn't exist in global table?"); - + // Now we know where to put the compaction table plane. if (CompactionTable.size() <= unsigned(TySlot)) CompactionTable.resize(TySlot+1); @@ -575,7 +575,7 @@ if (GlobalSlot >= Table.size()) Table.resize(GlobalSlot+1); TypePlane &GPlane = Table[GlobalSlot]; - + unsigned ModLevel = getModuleLevel(ctp); unsigned NumFunctionObjs = CPlane.size()-ModLevel; @@ -624,7 +624,7 @@ } /// Determine if the compaction table is actually empty. Because the -/// compaction table always includes the primitive type planes, we +/// compaction table always includes the primitive type planes, we /// can't just check getCompactionTable().size() because it will never /// be zero. Furthermore, the ModuleLevel factors into whether a given /// plane is empty or not. This function does the necessary computation @@ -640,7 +640,7 @@ // If the module level is non-zero then at least the // first element of the plane is valid and therefore not empty. unsigned End = getModuleLevel(i); - if (End != 0) + if (End != 0) return false; } } @@ -699,8 +699,8 @@ assert(CompactionNodeMap.empty() && "All needed constants should be in the compaction map already!"); - // Do not index the characters that make up constant strings. We emit - // constant strings as special entities that don't require their + // Do not index the characters that make up constant strings. We emit + // constant strings as special entities that don't require their // individual characters to be emitted. if (!isa(C) || !cast(C)->isString()) { // This makes sure that if a constant has uses (for example an array of @@ -746,7 +746,7 @@ return getOrCreateCompactionTableSlot(D); } - // If this node does not contribute to a plane, or if the node has a + // If this node does not contribute to a plane, or if the node has a // name and we don't want names, then ignore the silly node... Note that types // do need slot numbers so that we can keep track of where other values land. // @@ -823,7 +823,7 @@ } else { Ty = Typ->getTypeID(); } - + if (Table.size() <= Ty) // Make sure we have the type plane allocated... Table.resize(Ty+1, TypePlane()); @@ -843,10 +843,10 @@ unsigned DestSlot = NodeMap[D] = Table[Ty].size(); Table[Ty].push_back(D); - SC_DEBUG(" Inserting value [" << Ty << "] = " << D << " slot=" << + SC_DEBUG(" Inserting value [" << Ty << "] = " << D << " slot=" << DestSlot << " ["); // G = Global, C = Constant, T = Type, F = Function, o = other - SC_DEBUG((isa(D) ? "G" : (isa(D) ? "C" : + SC_DEBUG((isa(D) ? "G" : (isa(D) ? "C" : (isa(D) ? "F" : "o")))); SC_DEBUG("]\n"); return (int)DestSlot; Index: llvm/lib/Bytecode/Writer/SlotCalculator.h diff -u llvm/lib/Bytecode/Writer/SlotCalculator.h:1.21 llvm/lib/Bytecode/Writer/SlotCalculator.h:1.22 --- llvm/lib/Bytecode/Writer/SlotCalculator.h:1.21 Thu Aug 26 17:32:00 2004 +++ llvm/lib/Bytecode/Writer/SlotCalculator.h Thu Apr 21 16:48:46 2005 @@ -1,10 +1,10 @@ //===-- Analysis/SlotCalculator.h - Calculate value slots -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This class calculates the slots that values will land in. This is useful for @@ -77,7 +77,7 @@ SlotCalculator(const Module *M ); // Start out in incorp state SlotCalculator(const Function *F ); - + /// getSlot - Return the slot number of the specified value in it's type /// plane. This returns < 0 on error! /// @@ -103,8 +103,8 @@ return CompactionTypes.size(); } - inline unsigned getModuleLevel(unsigned Plane) const { - return Plane < ModuleLevel.size() ? ModuleLevel[Plane] : 0; + inline unsigned getModuleLevel(unsigned Plane) const { + return Plane < ModuleLevel.size() ? ModuleLevel[Plane] : 0; } /// Returns the number of types in the type list that are at module level @@ -113,7 +113,7 @@ } TypePlane &getPlane(unsigned Plane); - TypeList& getTypes() { + TypeList& getTypes() { if (!CompactionTypes.empty()) return CompactionTypes; return Types; Index: llvm/lib/Bytecode/Writer/SlotTable.h diff -u llvm/lib/Bytecode/Writer/SlotTable.h:1.4 llvm/lib/Bytecode/Writer/SlotTable.h:1.5 --- llvm/lib/Bytecode/Writer/SlotTable.h:1.4 Sat Mar 5 20:32:00 2005 +++ llvm/lib/Bytecode/Writer/SlotTable.h Thu Apr 21 16:48:46 2005 @@ -1,14 +1,14 @@ //===-- Internal/SlotTable.h - Type/Value Slot Holder -----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by Reid Spencer and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file declares the SlotTable class for type plane numbering. -// +// //===----------------------------------------------------------------------===// #ifndef LLVM_INTERNAL_SLOTTABLE_H @@ -28,10 +28,10 @@ class ConstantArray; /// This class is the common abstract data type for both the SlotMachine and -/// the SlotCalculator.