Paje-1.98/0000755000175000017500000000000011674062034012253 5ustar schnorrschnorrPaje-1.98/StatViewer/0000775000175000017500000000000011674062007014352 5ustar schnorrschnorrPaje-1.98/StatViewer/GNUmakefile0000664000175000017500000000134311674062007016425 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make BUNDLE_NAME = StatViewer StatViewer_PRINCIPAL_CLASS = StatViewer ADDITIONAL_INCLUDE_DIRS = -I../General ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else StatViewer_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif StatViewer_RESOURCE_FILES = \ StatViewer.gorm \ StatViewer.nib StatViewer_OBJC_FILES = \ StatViewer.m \ PieCell.m \ StatArray.m StatViewer_HEADER_FILES = \ StatViewer.h \ PieCell.h \ StatArray.h -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/StatViewer/StatViewer.m0000664000175000017500000002107711674062007016634 0ustar schnorrschnorr/* Copyright (c) 1997-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "StatViewer.h" #include "../General/Macros.h" #include "StatArray.h" @implementation StatViewer - initWithController:(PajeTraceController *)c { self = [super initWithController:c]; if (self != nil) { if (![NSBundle loadNibNamed:@"StatViewer" owner:self]) NSRunAlertPanel(@"StatViewer", @"Couldn't load interface file", nil, nil, nil); } return self; } - (void)awakeFromNib { PieCell *cell; NSSize cellSize = NSZeroSize; NSString *cellSizeString; [window setFrameAutosaveName:NSStringFromClass([self class])]; cellSizeString = [[NSUserDefaults standardUserDefaults] stringForKey:@"StatViewerCellSize"]; if (cellSizeString != nil) { cellSize = NSSizeFromString(cellSizeString); } if (!NSEqualSizes(cellSize, NSZeroSize)) { [matrix setCellSize:cellSize]; } cell = [[PieCell alloc] initImageCell:nil]; [cell setRepresentedObject:nil]; [cell setDataProvider:self]; [matrix setPrototype:cell]; [matrix putCell:cell atRow:0 column:0]; [matrix setIntercellSpacing:NSMakeSize(0, 0)]; [cell release]; // notify that we are a Tool [self registerTool:self]; } - (void)dealloc { Assign(startTime, nil); Assign(endTime, nil); [entityTypeSelector removeAllItems]; [[matrix cells] makeObjectsPerformSelector:@selector(setRepresentedObject:) withObject:nil]; [matrix removeFromSuperview]; [window release]; [super dealloc]; } - (NSString *)toolName { return @"Stat Viewer"; } - (void)activateTool:(id)sender { [window makeKeyAndOrderFront:self]; } - (void)hierarchyChanged { [self invalidateValues]; } - (void)dataChangedForEntityType:(PajeEntityType *)entityType { if ([entityType isEqual:[self selectedEntityType]]) { [self invalidateValues]; } } - (void)colorChangedForEntityType:(PajeEntityType *)entityType { if ([entityType isEqual:[self selectedEntityType]]) { [self invalidateCellCaches]; } } - (void)setStartTime:(NSDate *)time { Assign(startTime, time); } - (void)setEndTime:(NSDate *)time { Assign(endTime, time); } - (void)timeSelectionChanged { [self setStartTime:[self selectionStartTime]]; [self setEndTime:[self selectionEndTime]]; [durationField setStringValue:[NSString stringWithFormat:@"%.6f s", [endTime timeIntervalSinceDate:startTime]]]; [self invalidateValues]; } - (PajeEntityType *)selectedEntityType { return [[entityTypeSelector selectedItem] representedObject]; } - (PajeEntityType *)selectedContainerType { return [self containerTypeForType:[self selectedEntityType]]; } - (void)fillEntityTypeSelector { PajeEntityType *entityType; PajeEntityType *selectedEntityType; NSEnumerator *typeEnum; selectedEntityType = [self selectedEntityType]; [entityTypeSelector removeAllItems]; typeEnum = [[self allEntityTypes] objectEnumerator]; while ((entityType = [typeEnum nextObject]) != nil) { PajeDrawingType drawingType; drawingType = [self drawingTypeForEntityType:entityType]; if (drawingType == PajeStateDrawingType || drawingType == PajeEventDrawingType) { NSString *entityTypeDescription; entityTypeDescription = [self descriptionForEntityType:entityType]; [entityTypeSelector addItemWithTitle:entityTypeDescription]; [[entityTypeSelector lastItem] setRepresentedObject:entityType]; if ([entityType isEqual:selectedEntityType]) { [entityTypeSelector selectItemAtIndex: [entityTypeSelector numberOfItems] - 1]; } } } } - (void)invalidateValues { int i=0; NSEnumerator *nn; id container; PieCell *cell; [self fillEntityTypeSelector]; nn = [self enumeratorOfContainersTyped:[self selectedContainerType] inContainer:[self rootInstance]]; while ((container = [nn nextObject]) != nil) { [matrix renewRows:i+1 columns:1]; cell = [matrix cellAtRow:i column:0]; [cell setRepresentedObject:container]; [cell setData:nil]; [cell setDataProvider:self]; i++; } [matrix setIntercellSpacing:NSMakeSize(0, 0)]; [matrix sizeToCells]; [matrix setNeedsDisplay]; } - (void)invalidateCellCaches { [[matrix cells] makeObjectsPerformSelector:@selector(discardCache)]; [matrix setNeedsDisplay]; } - (BOOL)isEntity:(PajeEntity *)internalEntity inEntity:(PajeEntity *)externalEntity { if ([self imbricationLevelForEntity:internalEntity] <= [self imbricationLevelForEntity:externalEntity]) { return NO; } if ([[self startTimeForEntity:internalEntity] isEarlierThanDate:[self startTimeForEntity:externalEntity]]) { return NO; } if ([[self endTimeForEntity:internalEntity] isLaterThanDate:[self endTimeForEntity:externalEntity]]) { return NO; } return YES; } - (void)provideDataForCell:(PieCell *)cell { NSEnumerator *enumerator; id array; PajeContainer *container; double minDuration; if (startTime == nil) { [self setStartTime:[super startTime]]; } if (endTime == nil) { [self setEndTime:[super endTime]]; } container = [cell representedObject]; //NSAssert(container, @"Invalid container in StatViewer cell"); if (container == nil) return; minDuration = [endTime timeIntervalSinceDate:startTime]/500; enumerator = [self enumeratorOfEntitiesTyped:[self selectedEntityType] inContainer:container fromTime:startTime toTime:endTime minDuration:minDuration]; array = [[StatArray stateArrayWithName:[container name] type:[self selectedEntityType] startTime:startTime endTime:endTime filter:self entityEnumerator:enumerator] retain]; [cell setData:array]; [cell setGraphType:[[graphTypeSelector selectedItem] tag]]; [array release]; } - (IBAction)entityTypeSelectorChanged:(id)sender { [self invalidateValues]; } - (IBAction)graphTypeSelectorChanged:(id)sender { NSInteger rows, cols; PieCell *cell; int i; [matrix getNumberOfRows:&rows columns:&cols]; for (i=0; i?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FOGHIJKLMN .@Pm(QRSTUV0]NSDestinationWNSLabelXNSSource ,-YZ[\]^__abcde_NSNextResponder[NSSuperviewWNSFrameYNSEnabledXNSvFlagsVNSCell  + gY[h.jkZNSSubviewss_{{93, 350}, {237, 26}}nopqrstuvwxyz{|}~bTb_NSAlternateImage[NSCellFlags^NSButtonFlags2]NSButtonFlagsVNSMenuZNSMenuItem_NSAlternateContents_NSPreferredEdge_NSPeriodicDelay\NSCellFlags2]NSAltersState]NSControlView_NSKeyEquivalentYNSSupport_NSUsesItemFromMenu_NSPeriodicInterval_NSArrowPositionA@@*  KVNSSizeVNSNameXNSfFlags"AP\LucidaGrande78;VNSFontPYNS.string78;_NSMutableStringXNSStringre]NSMnemonicLoc_NSKeyEquivModMaskWNSStateWNSTitleYNSOnImageZNSKeyEquivXNSTarget\NSMixedImageXNSAction [NSMenuItems )!UItem12^NSResourceNameWNSImage_NSMenuCheckmark78ˣ;_NSCustomResource_%NSCustomResource2ƀ_NSMenuMixedState__popUpItemAction:78ss;ZOtherViews>O܀"%(re# $UItem2re& 'UItem378;^NSMutableArrayWNSArray78rr;78^;_NSPopUpButtonCell^NSMenuItemCell\NSButtonCell]%NSButtonCell\NSActionCell78;]NSPopUpButtonXNSButtonYNSControlVNSView[NSResponder_entityTypeSelector78   ;_NSNibOutletConnector^NSNibConnectorQRS  V0/?-YZ[\]^__bcd 0 +1_{{93, 320}, {237, 26}}nopqrstuvwxyz{|}~b  b43* /2 r'-4516/17)8YPie chart>6O8939<(r=C4:1;_Horizontal Bar chartrGM4=1>_Vertical Bar chart_graphTypeSelectorQRSQRV0AO-YZ[\]^__XbcZ[ B NC_{{141, 292}, {89, 22}}^_{`yowabdQfgh_NSBackgroundColor[NSTextColorZNSContentsEJDAM@Q0klmnopqrsWNSColor[NSColorName\NSColorSpace]NSCatalogNameHGFIVSystem\controlColorwmxsWNSWhiteK0.66666669I78{kk;klmn}~qrsLKFI_controlTextColorwmsB0I78^;_NSTextFieldCell78;[NSTextField\%NSTextField]durationFieldQRSV0Ql-[Y\Z^]ba[NSCellClassYNSNumRowsZNSCellSizeYNSNumColsWNSCells[NSProtoCell^NSSelectedCell_NSCellBackgroundColor]NSMatrixFlags_NSIntercellSpacingSfdTR gRUkjeEgYZ[]aXNSBounds]NSNextKeyViewYNSDocViewYNSBGColorYNScvFlagsQQE_{{0, -1}, {290, 190}}>OU(z{`yp}qvotwq]NSNormalImagebWVQ@cbURadiokVNSReps\NSImageFlagsX`aY V{1, 1}>O߀Z(>[\__NSTIFFRepresentation]^OMM* RS78;_NSBitmapImageRepZNSImageRep78;wmsD0 0I78ǣ;X%NSImage78^;Z{290, 190}V{0, 0}z{`}pqvotwqЀWh@ciwmsB1I78    ;XNSMatrixY%NSMatrixVmatrixQRSV0n- !"#$%&_()*_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClasspqo pxr_{{128, 312}, {349, 394}}-VWindow0XNSWindow3TView>6O 89T<=Q/t| A(YZ[\]^__CbEFG u  {v_{{236, 291}, {93, 21}}JK{`yLMNOPQowRST8VWRXRVZ_NSTickMarkPosition]NSAltIncValue_NSNumberOfTickMarks_NSAllowsTickMarkValuesOnlyZNSMaxValueWNSValueZNSMinValueZNSVertical#xwt#@vz^_"A@yYHelvetica78cdd^;\NSSliderCell78fgg;XNSSliderYZ[\]^__kbmZo }  N~_{{17, 295}, {119, 17}}^_{`yowabu9fhEJ|M_Selection duration gYZ[z]{|}~__[NSHScrollerXNSsFlags[NSVScroller]NSContentView R2R>OR(>OQ(_{{1, 1}, {292, 247}}_{{0, -1}, {292, 247}}78;ZNSClipViewYZ[]ZNSCurValue"? p_{{293, 1}, {15, 247}}\_doScroller:78;ZNSScrollerYZ[]{YNSPercent"?}e_{{1, 248}, {292, 15}}_{{20, 20}, {309, 264}}78;\NSScrollViewYZ[\]^__bmZ N_{{17, 356}, {74, 17}}^_{`yowab<fÀEJM@\Entity type YZ[\]^__bmZˀ N_{{17, 326}, {74, 17}}^_{`yowab=fÀEJM_Graph type type _{{1, 9}, {349, 394}}78;_{{0, 0}, {1280, 938}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78ݢ;_NSWindowTemplateVwindowQRS0T _entityTypeSelectorChanged78 ;_NSNibControlConnectorQRS0 /_graphTypeSelectorChangedQRS08t_changeInitialAngle>8_9TQ<9= 839"n QU<% 4A|/t_> T0_ _______44 nQ4 / _>#08T9Q<9= 839"nQ% <4A|/t_>89:;<=>?@ABCDEFGHIJ_\File's Owner[NSMenuItem1YPopUpListYNSMatrix1[NSMenuItem2]NSTextField21]NSTextField22\NSTextField2^NSTextField221^NSPopUpButton1YNSSlider2>X堀_>[堀_>^ 8GHL98JKQMI90_N=T<3Q/n"%9 .|tPmA4@< U _>~€ÀĀŀƀǀȀɀʀˀ̀̀΀πЀрҀӀԀՀր׀؀ـڀۀ_     $ "!>O(>堀_>堀_78;^NSIBObjectData#,1:LQVdf)/z"0>Lfr &/:;=FMZ`iz|~!#%'(+-/@KMOQSl-?LZhz "/8=DUWY[\eoqz&/16;=?ACEGIVbdfhn{   $ ) 2 = ? H O Q S U W   " 6 E R ` m v       8 : < > ? A C \       ' ) 2 9 ; = ? A j l n p r t v x z    ) + - / 0 2 4 M n  (46?DY[]_atKWalv~$-;EOY[]_acegiknp #*79;=?DKTWY[dikmoxBKRepy~ !#035>KT^evxz|~,6BDFHJLNPRTY[]xWlz&/8ENYb"+7EGIKMOQSUWYbikmoqz}   %2;FQv !BDFHJLNS`} +HQVip/8cegikmoqsuwy{}!#%')+-/13579;=?AJqsuwy{}!*+-679B   !#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmvwyPaje-1.98/StatViewer/StatViewer.nib/info.nib0000664000175000017500000000070311674062007020643 0ustar schnorrschnorr IBDocumentLocation 99 88 356 240 0 0 1280 938 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/StatViewer/StatViewer.nib/classes.nib0000664000175000017500000000152311674062007021346 0ustar schnorrschnorr{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeComponent; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeFilter; LANGUAGE = ObjC; SUPERCLASS = PajeComponent; }, { ACTIONS = { changeInitialAngle = id; entityTypeSelectorChanged = id; graphTypeSelectorChanged = id; print = id; }; CLASS = StatViewer; LANGUAGE = ObjC; OUTLETS = { durationField = id; entityTypeSelector = NSPopUpButton; graphTypeSelector = NSPopUpButton; matrix = id; window = id; }; SUPERCLASS = PajeFilter; } ); IBVersion = 1; }Paje-1.98/StatViewer/StatArray.h0000664000175000017500000000347111674062007016442 0ustar schnorrschnorr/* Copyright (c) 1997-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _StatArray_h_ #define _StatArray_h_ /* StatArray.h created by benhur on Fri 26-Sep-1997 */ #include #include "../General/PajeType.h" #include "../General/PajeFilter.h" #include "../General/CondensedEntitiesArray.h" @interface StatArray : NSObject { NSString *name; PajeEntityType *entityType; PajeFilter *filter; } + (StatArray *)stateArrayWithName:(NSString *)theName type:(PajeEntityType *)type startTime:(NSDate *)start endTime:(NSDate *)end filter:(PajeFilter *)f entityEnumerator:(NSEnumerator *)en; - (id)initWithName:(NSString *)theName type:(PajeEntityType *)type filter:(PajeFilter *)f; - (NSString *)name; - (double)totalValue; - (double)maxValue; - (double)minValue; - (unsigned)subCount; - (id)subValueAtIndex:(unsigned)index; - (NSColor *)subColorAtIndex:(unsigned)index; - (double)subDoubleValueAtIndex:(unsigned)index; @end #endif Paje-1.98/StatViewer/StatViewer.h0000664000175000017500000000324111674062007016620 0ustar schnorrschnorr/* Copyright (c) 1997-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _StatViewer_h_ #define _StatViewer_h_ #include #include "PieCell.h" #include "StatArray.h" #include "../General/PajeFilter.h" @interface StatViewer: PajeFilter { id matrix; id window; NSDate *startTime; NSDate *endTime; IBOutlet NSPopUpButton *entityTypeSelector; IBOutlet NSPopUpButton *graphTypeSelector; id durationField; } - (void)awakeFromNib; - (void)setStartTime:(NSDate *)time; - (void)setEndTime:(NSDate *)time; - (void)timeSelectionChanged; - (void)changeInitialAngle:(id)sender; - (IBAction)graphTypeSelectorChanged:(id)sender; - (IBAction)entityTypeSelectorChanged:(id)sender; - (PajeEntityType *)selectedEntityType; - (void)invalidateValues; - (void)invalidateCellCaches; - (void)provideDataForCell:(PieCell *)cell; - (void)windowDidResize:(NSNotification *)notification; - (void)print:(id)sender; @end #endif Paje-1.98/StatViewer/PieCell.m0000664000175000017500000006057611674062007016063 0ustar schnorrschnorr/* Copyright (c) 1997-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* PieCell.m created by benhur on Wed 24-Sep-1997 */ #include "PieCell.h" #include "StatViewer.h" #include "../General/Macros.h" #include "../General/NSColor+Additions.h" #include "../General/NSString+Additions.h" #include @interface PieSlice : NSObject { float initialAngle; float finalAngle; NSColor *color; NSBezierPath *path; NSString *name; NSString *complement; NSMutableString *label; NSPoint labelAnchorPosition; NSPoint labelPosition; BOOL rightSide; PieCell *cell; } + (PieSlice *)sliceWithInitialAngle:(float)a1 finalAngle:(float)a2 color:(NSColor *)col name:(NSString *)n complement:(NSString *)n2 cell:(PieCell *)c; - (id)initWithInitialAngle:(float)a1 finalAngle:(float)a2 color:(NSColor *)col name:(NSString *)n complement:(NSString *)n2 cell:(PieCell *)c; - (void)makePath; - (void)makeLabelPosition; - (NSPoint)labelPosition; - (void)setLabelPosition:(NSPoint)position width:(float)width; - (BOOL)rightSide; - (float)midAngle; - (void)draw; - (void)drawLabel; - (void)appendLabelLinesToPath:(NSBezierPath *)incompletePath; - (void)appendDivisionLinesToPath:(NSBezierPath *)incompletePath; - (BOOL)containsPoint:(NSPoint)point; @end @implementation PieSlice + (PieSlice *)sliceWithInitialAngle:(float)a1 finalAngle:(float)a2 color:(NSColor *)col name:(NSString *)n complement:(NSString *)n2 cell:(PieCell *)c { return [[[self alloc] initWithInitialAngle:a1 finalAngle:a2 color:col name:n complement:n2 cell:c] autorelease]; } - (id)initWithInitialAngle:(float)a1 finalAngle:(float)a2 color:(NSColor *)col name:(NSString *)n complement:(NSString *)n2 cell:(PieCell *)c { self = [super init]; if (self != nil) { cell = c; initialAngle = a1; finalAngle = a2; Assign(color, col); Assign(name, n); Assign(complement, n2); label = [name mutableCopy]; [self makePath]; [self makeLabelPosition]; } return self; } - (void)dealloc { cell = nil; Assign(color, nil); Assign(path, nil); Assign(name, nil); Assign(complement, nil); Assign(label, nil); [super dealloc]; } - (void)makePath { NSPoint center = [cell center]; float radius = [cell radius]; Assign(path, [NSBezierPath bezierPath]); [path setLineWidth:2]; [path setLineJoinStyle:NSRoundLineJoinStyle]; [path appendBezierPathWithArcWithCenter:center radius:radius startAngle:initialAngle endAngle:finalAngle]; [path appendBezierPathWithArcWithCenter:center radius:radius * .3 startAngle:finalAngle endAngle:initialAngle clockwise:YES]; } - (void)makeLabelPosition { double radianAngle; float cosine; float sine; float r; NSPoint center = [cell center]; float radius = [cell radius]; radianAngle = [self midAngle] * M_PI / 180; cosine = cos(radianAngle); sine = sin(radianAngle); rightSide = (cosine >= 0); r = radius * .85; labelAnchorPosition = NSMakePoint(center.x + r * cosine, center.y + r * sine); r = radius + 6 + 4 * fabs(sine); if (rightSide) { labelPosition = NSMakePoint(center.x + r * cosine + 6, center.y + r * sine); } else { labelPosition = NSMakePoint(center.x + r * cosine - 6, center.y + r * sine); } } - (NSPoint)labelPosition { return labelPosition; } - (void)setLabelPosition:(NSPoint)position width:(float)width { labelPosition = position; NSDictionary *labelAttributes = [cell labelAttributes]; if (label != nil) [label release]; label = [name mutableCopy]; NSString *elipsis = [NSString stringWithCharacter:0x2026]; while ([label sizeWithAttributes:labelAttributes].width > width) { int middle; middle = [label length] / 2; [label replaceCharactersInRange:NSMakeRange(middle, 2) withString:elipsis]; } } - (BOOL)rightSide { return rightSide; } - (float)midAngle { return (initialAngle + finalAngle) / 2; } - (void)draw { [color set]; [path fill]; } - (void)drawLabel { NSPoint lpoint; NSPoint cpoint; NSDictionary *labelAttributes = [cell labelAttributes]; NSDictionary *complementAttributes = [cell complementAttributes]; if (rightSide) { lpoint = NSMakePoint(labelPosition.x + 2, labelPosition.y - 3); cpoint = NSMakePoint(labelPosition.x + 2, labelPosition.y + 5); [label drawAtLCPoint:lpoint withAttributes:labelAttributes]; [complement drawAtLCPoint:cpoint withAttributes:complementAttributes]; } else { lpoint = NSMakePoint(labelPosition.x - 2, labelPosition.y - 3); cpoint = NSMakePoint(labelPosition.x - 2, labelPosition.y + 5); [label drawAtRCPoint:lpoint withAttributes:labelAttributes]; [complement drawAtRCPoint:cpoint withAttributes:complementAttributes]; } } - (void)appendLabelLinesToPath:(NSBezierPath *)incompletePath { [incompletePath moveToPoint:labelPosition]; [incompletePath relativeMoveToPoint:NSMakePoint(0, 8)]; [incompletePath relativeLineToPoint:NSMakePoint(0, -15)]; [incompletePath moveToPoint:labelPosition]; if (rightSide) { [incompletePath relativeLineToPoint:NSMakePoint(-6, 0)]; } else { [incompletePath relativeLineToPoint:NSMakePoint(6, 0)]; } [incompletePath lineToPoint:labelAnchorPosition]; [incompletePath appendBezierPathWithArcWithCenter:labelAnchorPosition radius:1.0 startAngle:0 endAngle:360]; } - (void)appendDivisionLinesToPath:(NSBezierPath *)incompletePath { NSPoint center = [cell center]; float radius = [cell radius]; if (finalAngle - initialAngle < 359.99) { double radianAngle; radianAngle = initialAngle * M_PI / 180; [incompletePath moveToPoint: NSMakePoint(center.x+radius*.3*cos(radianAngle), center.y+radius*.3*sin(radianAngle))]; [incompletePath lineToPoint: NSMakePoint(center.x+radius*cos(radianAngle), center.y+radius*sin(radianAngle))]; } } - (BOOL)containsPoint:(NSPoint)point { return [path containsPoint:point]; } @end @implementation PieCell - (void)_init { data = nil; slices = nil; divisionsPath = nil; labelLinesPath = nil; // set atributes for slice labels and complement labelAttributes = [[NSDictionary alloc] initWithObjectsAndKeys: [NSFont systemFontOfSize:10], NSFontAttributeName, [NSColor blackColor], NSForegroundColorAttributeName, nil]; complementAttributes = [[NSDictionary alloc] initWithObjectsAndKeys: [NSFont systemFontOfSize:8], NSFontAttributeName, [NSColor colorWithCalibratedWhite:0.1 alpha:1.0], NSForegroundColorAttributeName, nil]; } - (id)copyWithZone:(NSZone *)z { self = [super copyWithZone:z]; [self _init]; return self; } - (id)initImageCell:(NSImage *)image { self = [super initImageCell:image]; [self _init]; return self; } - (id)initTextCell:(NSString *)text { self = [super initTextCell:text]; [self _init]; return self; } - (void)dealloc { dataProvider = nil; Assign(data, nil); Assign(slices, nil); Assign(divisionsPath, nil); Assign(labelLinesPath, nil); Assign(labelAttributes, nil); Assign(complementAttributes, nil); [super dealloc]; } // The data provider retains the cells, so they cannot retain it. - (void)setDataProvider:(id)provider { dataProvider = provider; } - (void)setData:(StatArray *)d { Assign(data, d); [self discardCache]; } - (void)discardCache { Assign(slices, nil); Assign(divisionsPath, nil); Assign(labelLinesPath, nil); } - (void)setInitialAngle:(NSNumber *)angle { initialAngle = angle; } - (NSPoint)center { return center; } - (float)radius { return radius; } - (NSDictionary *)labelAttributes { return labelAttributes; } - (NSDictionary *)complementAttributes { return complementAttributes; } - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { [[NSColor lightGrayColor] set]; NSRectFill(cellFrame); [[NSColor blackColor] set]; NSFrameRect(cellFrame); [super drawWithFrame:cellFrame inView:controlView]; } - (void)drawTitleWithFrame:(NSRect)cellFrame { NSDictionary *attributes; if (nil == data) { [dataProvider provideDataForCell:self]; if (nil == data) return; } attributes = [[NSDictionary alloc] initWithObjectsAndKeys: [NSFont boldSystemFontOfSize:12], NSFontAttributeName, [NSColor blackColor], NSForegroundColorAttributeName, nil]; [[data name] drawAtCTPoint:NSMakePoint(NSMidX(cellFrame), NSMinY(cellFrame)) withAttributes:attributes]; } - (void)drawInteriorWithFrameVBar:(NSRect)cellFrame inView:(NSView *)controlView { #ifdef VBARSUPPORT float x, y, h, hmax, w, wmax; float val, total, max, min, cnt; float fontHeight = 0; NSFont *font = nil; NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; if (nil == data) { [dataProvider provideDataForCell:self]; if (nil == data) return; } // take totalizers total = [data totalValue]; max = total;//[data maxValue]; min = 0;//[data minValue]; cnt = [data subCount]; if (cnt>10) cnt=10; PSsetlinewidth(1); if (!simple) { // calculate sizes, with space for title and names hmax = NSHeight(cellFrame) - 4 - 35; if (initialAngle != nil) { hmax = NSHeight(cellFrame) * [initialAngle floatValue] / 380; } wmax = NSWidth(cellFrame) - 4 - 35; y = NSMinY(cellFrame)+20+hmax;//NSMaxY(cellFrame) - 2 - 35; w = wmax / cnt; x = NSMaxX(cellFrame) - 2 - wmax; font = [NSFont systemFontOfSize:10]; [attributes setObject:font forKey:NSFontAttributeName]; [attributes setObject:[NSColor blackColor] forKey:NSForegroundColorAttributeName]; fontHeight = [font ascender] - [font descender]; // draw scale PSmoveto(x-2, y); //PSrlineto(-3, 0); PSrlineto(2, 0); PSrlineto(wmax, 0); PSmoveto(x-2, y-hmax/2); PSrlineto(2, 0); PSrlineto(wmax, 0); PSmoveto(x-2, y-hmax); //PSrlineto(-3, 0); PSrlineto(2, 0); PSrlineto(wmax, 0); [[NSColor darkGrayColor] set]; PSgsave(); float dash[] = {1, 2}; PSsetdash(dash, 2, 0); PSstroke(); PSgrestore(); //[@"0" drawAtRCPoint:NSMakePoint(x - 7, y) withAttributes:attributes]; [[NSString stringWithFormattedNumber:min] drawAtRCPoint:NSMakePoint(x - 7, y) withAttributes:attributes]; [[NSString stringWithFormattedNumber:max] drawAtRCPoint:NSMakePoint(x - 7, y - hmax) withAttributes:attributes]; } else { // calculate sizes, without space for title and names hmax = NSHeight(cellFrame) - 4; wmax = NSWidth(cellFrame) - 4; y = NSMaxY(cellFrame) - 2; w = wmax / cnt; x = NSMaxX(cellFrame) - 2 - wmax; } unsigned index; unsigned count = [data subCount]; for (index = 0; index < count && index < 10; index++) { val = [data subDoubleValueAtIndex:index]; // draw bar [[data subColorAtIndex:index] set]; h = hmax * val / max; PSrectfill(x, y, w, -h); [[NSColor blackColor] set]; PSrectstroke(x, y, w, -h); if (!simple) { NSString *valueString; NSString *percentString; // draw name under bar PSgsave(); if (w > fontHeight) { double angle; angle = atan(fontHeight / sqrt(w*w + fontHeight*fontHeight)); PStranslate(x + 0.9*w - fontHeight * sin(angle), y); PSrotate(-angle * 180 / M_PI); } else { PStranslate(x + w/2 - fontHeight/2, y); PSrotate(-90); } [attributes setObject:[NSColor blackColor] forKey:NSForegroundColorAttributeName]; [[data subValueAtIndex:index] drawAtRTPoint:NSMakePoint(0, 0) withAttributes:attributes]; PSgrestore(); // draw value over bar valueString = [NSString stringWithFormattedNumber:val]; percentString = [NSString stringWithFormat:@"%.1f%%", 100 * val / total]; if ((hmax - h) >= fontHeight && h >= fontHeight) { [valueString drawAtCBPoint:NSMakePoint(x+w/2, y-h) withAttributes:attributes]; [attributes setObject:[[data subColorAtIndex:index] contrastingWhiteOrBlackColor] forKey:NSForegroundColorAttributeName]; [percentString drawAtCTPoint:NSMakePoint(x+w/2, y-h) withAttributes:attributes]; } else if ((hmax - h) >= fontHeight * 1.9) { [valueString drawAtCBPoint:NSMakePoint(x+w/2, y-h - .9*fontHeight) withAttributes:attributes]; [percentString drawAtCBPoint:NSMakePoint(x+w/2, y-h) withAttributes:attributes]; } else if (h >= fontHeight * 1.9) { [attributes setObject:[[data subColorAtIndex:index] contrastingWhiteOrBlackColor] forKey:NSForegroundColorAttributeName]; [valueString drawAtCTPoint:NSMakePoint(x+w/2, y-h) withAttributes:attributes]; [percentString drawAtCTPoint:NSMakePoint(x+w/2, y-h + .9*fontHeight) withAttributes:attributes]; } else if ((hmax - h) >= fontHeight) { [valueString drawAtCBPoint:NSMakePoint(x+w/2, y-h) withAttributes:attributes]; } else if (h >= fontHeight) { [attributes setObject:[[data subColorAtIndex:index] contrastingWhiteOrBlackColor] forKey:NSForegroundColorAttributeName]; [valueString drawAtCTPoint:NSMakePoint(x+w/2, y-h) withAttributes:attributes]; } } x += w; } #endif } - (void)addPieSliceWithName:(NSString *)sliceName initialAngle:(float)angle1 color:(NSColor *)color value:(float)val totalValue:(float)total { float angle2; float midangle; float fraction; PieSlice *slice; NSString *complement; fraction = val / total; angle2 = angle1 + 360 * fraction; midangle = (angle1 + angle2) / 2; complement = [NSString stringWithFormat:@"%@s, %.1f%%", [NSString stringWithFormattedNumber:val], 100 * fraction]; slice = [PieSlice sliceWithInitialAngle:angle1 finalAngle:angle2 color:color name:sliceName complement:complement cell:self]; [slices addObject:slice]; } - (NSArray *)slicesFromAngle:(float)a1 toAngle:(float)a2 { unsigned index; unsigned count; float midAngle; float lastAngle; PieSlice *slice; NSMutableArray *selectedSlices; BOOL firstPass; unsigned secondPassIndex; lastAngle = -HUGE_VAL; firstPass = YES; secondPassIndex = 0; selectedSlices = [NSMutableArray array]; count = [slices count]; for (index = 0; index < count; index++) { slice = [slices objectAtIndex:index]; midAngle = [slice midAngle]; if (midAngle >= 360) midAngle -= 360; if (midAngle >= a2) continue; if (midAngle < a1) continue; if (firstPass && (midAngle < lastAngle)) { firstPass = NO; } if (firstPass) { [selectedSlices addObject:slice]; lastAngle = midAngle; } else { [selectedSlices insertObject:slice atIndex:secondPassIndex++]; } } return selectedSlices; } // Adjust the positions of labels so that they do not intersect. // can be made better, with a left adjusting and a right adjusting function, // and by allowing labels to use more vertical space, maybe passing // multiple times by the slices. - (void)adjustSlicesFromAngle:(float)a1 toAngle:(float)a2 quadrant:(int)quadrant xRef:(float)xref { float ypos; NSEnumerator *eachSlice; PieSlice *slice; float vsignal; float hsignal; float midAngle; NSPoint pos; NSArray *selectedSlices; selectedSlices = [self slicesFromAngle:a1 toAngle:a2]; if (quadrant == 1 || quadrant == 3) { eachSlice = [selectedSlices reverseObjectEnumerator]; } else { eachSlice = [selectedSlices objectEnumerator]; } if (quadrant == 1 || quadrant == 2) { vsignal = -1; } else { vsignal = 1; } if (quadrant == 1 || quadrant == 4) { hsignal = 1; } else { hsignal = -1; } ypos = -HUGE_VAL * vsignal; while ((slice = [eachSlice nextObject]) != nil) { midAngle = [slice midAngle]; pos = [slice labelPosition]; ypos += vsignal * 17; if (vsignal * (pos.y - ypos) >= 0) { ypos = pos.y; } else { pos.x += hsignal * sin(midAngle*M_PI/180) * (pos.y - ypos); pos.y = ypos; } [slice setLabelPosition:pos width:xref - hsignal * pos.x]; } } - (void)adjustLabelPositionsInFrame:(NSRect)cellFrame { float minX; float maxX; minX = -5; maxX = NSMaxX(cellFrame) - 5; [self adjustSlicesFromAngle:0 toAngle:90 quadrant:1 xRef:maxX]; [self adjustSlicesFromAngle:90 toAngle:150 quadrant:2 xRef:minX]; [self adjustSlicesFromAngle:150 toAngle:270 quadrant:3 xRef:minX]; [self adjustSlicesFromAngle:270 toAngle:360 quadrant:4 xRef:maxX]; } - (void)makeLabelLinesPath { Assign(labelLinesPath, [NSBezierPath bezierPath]); [labelLinesPath setLineWidth:1]; [labelLinesPath setLineJoinStyle:NSRoundLineJoinStyle]; [slices makeObjectsPerformSelector:@selector(appendLabelLinesToPath:) withObject:labelLinesPath]; } - (void)makeDivisionsPath { Assign(divisionsPath, [NSBezierPath bezierPath]); [divisionsPath setLineWidth:2]; [divisionsPath setLineJoinStyle:NSRoundLineJoinStyle]; [divisionsPath appendBezierPathWithArcWithCenter:center radius:radius startAngle:0 endAngle:360]; [divisionsPath moveToPoint:NSMakePoint(center.x + radius * .3, center.y)]; [divisionsPath appendBezierPathWithArcWithCenter:center radius:radius * .3 startAngle:0 endAngle:360]; [slices makeObjectsPerformSelector:@selector(appendDivisionLinesToPath:) withObject:divisionsPath]; } - (void)makeSlicesWithFrame:(NSRect)cellFrame { int index; int count; float angle0; float angle; float val; float total; float others = 0; int nothers = 0; Assign(slices, [NSMutableArray array]); // take totalizers total = [data totalValue]; if (total == 0) return; // calculate center, radius of pie circle center = NSMakePoint(NSMidX(cellFrame), NSMidY(cellFrame) - 3); radius = MIN(NSWidth(cellFrame) * .5 - 20, NSHeight(cellFrame) * .5 - 17); // Make pie slices angle0 = (initialAngle != nil) ? [initialAngle floatValue] : 0; angle = angle0; count = [data subCount]; for (index = 0; index < count; index++) { val = [data subDoubleValueAtIndex:index]; if ((val/total) < .05 && (nothers > 0 || index < (count-1))) { others += val; nothers++; continue; } [self addPieSliceWithName:[data subValueAtIndex:index] initialAngle:angle color:[data subColorAtIndex:index] value:val totalValue:total]; // next segment starts where this one ends angle += 360 * val / total; } if (nothers > 0) { NSString *sliceName; sliceName = [NSString stringWithFormat:@"%d Others", nothers]; [self addPieSliceWithName:sliceName initialAngle:angle color:[NSColor controlColor] value:others totalValue:total]; angle += 360 * others / total; } float unusedAngle; unusedAngle = angle0+360 - angle; if (unusedAngle > .1) { val = unusedAngle/360 * total; [self addPieSliceWithName:@"None" initialAngle:angle color:[NSColor controlColor] value:val totalValue:total]; } [self adjustLabelPositionsInFrame:cellFrame]; [self makeLabelLinesPath]; [self makeDivisionsPath]; } - (void)drawInteriorWithFramePie:(NSRect)cellFrame inView:(NSView *)controlView { if (nil == data) { [dataProvider provideDataForCell:self]; if (nil == data) return; } if (nil == slices) { [self makeSlicesWithFrame:cellFrame]; } [slices makeObjectsPerformSelector:@selector(draw)]; [slices makeObjectsPerformSelector:@selector(drawLabel)]; [[NSColor blackColor] set]; [divisionsPath stroke]; [labelLinesPath stroke]; } - (void)setGraphType:(int)t { type = t; } - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { [self drawTitleWithFrame:cellFrame]; cellFrame.origin.y += 15; cellFrame.size.height -= 15; switch(type) { case 0: [self drawInteriorWithFramePie:cellFrame inView:controlView]; break; case 1: [self drawInteriorWithFrameVBar:cellFrame inView:controlView]; break; case 2: [self drawInteriorWithFrameVBar:cellFrame inView:controlView]; break; } } @end Paje-1.98/StatViewer/PieCell.h0000664000175000017500000000357011674062007016045 0ustar schnorrschnorr/* Copyright (c) 1997-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PieCell_h_ #define _PieCell_h_ /* PieCell.h created by benhur on Wed 24-Sep-1997 */ /* Cell that shows a pie-chart. The values of the pie are in "representedObject", that is an NSArray of NSDictionaries, each with a "Value", "Color", and "Name" fields. */ #include #include "StatArray.h" @interface PieCell : NSCell { id dataProvider; StatArray *data; NSNumber *initialAngle; BOOL simple; // true if undecorated display int type; NSPoint center; float radius; NSMutableArray *slices; NSBezierPath *divisionsPath; NSBezierPath *labelLinesPath; NSDictionary *labelAttributes; NSDictionary *complementAttributes; } - (void)setDataProvider:(id)provider; - (void)setData:(StatArray *)d; - (void)discardCache; - (NSPoint)center; - (float)radius; - (NSDictionary *)labelAttributes; - (NSDictionary *)complementAttributes; // overrides from NSCell: - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView; - (void)setInitialAngle:(NSNumber *)angle; - (void)setGraphType:(int)t; @end #endif Paje-1.98/StatViewer/StatArray.m0000664000175000017500000002022011674062007016436 0ustar schnorrschnorr/* Copyright (c) 1997-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* StatArray.m created by benhur on Fri 26-Sep-1997 */ #include "StatArray.h" #include "../General/Macros.h" @interface StatStateArray : StatArray { CondensedEntitiesArray *condensedArray; NSDate *startTime; NSDate *endTime; } - (id)initWithName:(NSString *)theName type:(PajeEntityType *)type startTime:(NSDate *)start endTime:(NSDate *)end filter:(PajeFilter *)f entityEnumerator:(NSEnumerator *)en; - (void)addEntitiesFromEnumerator:(NSEnumerator *)enumerator; @end @implementation StatArray + (StatArray *)stateArrayWithName:(NSString *)theName type:(PajeEntityType *)type startTime:(NSDate *)start endTime:(NSDate *)end filter:(PajeFilter *)f entityEnumerator:(NSEnumerator *)en { return [[[StatStateArray alloc] initWithName:theName type:type startTime:start endTime:end filter:f entityEnumerator:en] autorelease]; } - (id)initWithName:(NSString *)theName type:(PajeEntityType *)type filter:(PajeFilter *)f { self = [super init]; if (self != nil) { Assign(name, theName); Assign(entityType, type); filter = f; } return self; } - (void)dealloc { Assign(name, nil); Assign(entityType, nil); [super dealloc]; } - (NSString *)name { return name; } - (double)totalValue { [self _subclassResponsibility:_cmd]; return 0; } - (double)maxValue { [self _subclassResponsibility:_cmd]; return 0; } - (double)minValue { [self _subclassResponsibility:_cmd]; return 0; } - (unsigned)subCount { [self _subclassResponsibility:_cmd]; return 0; } - (id)subValueAtIndex:(unsigned)index { [self _subclassResponsibility:_cmd]; return nil; } - (NSColor *)subColorAtIndex:(unsigned)index { [self _subclassResponsibility:_cmd]; return nil; } - (double)subDoubleValueAtIndex:(unsigned)index { [self _subclassResponsibility:_cmd]; return 0; } @end @implementation StatStateArray - (id)initWithName:(NSString *)theName type:(PajeEntityType *)type startTime:(NSDate *)start endTime:(NSDate *)end filter:(PajeFilter *)f entityEnumerator:(NSEnumerator *)en { self = [super initWithName:theName type:type filter:f]; if (self != nil) { Assign(startTime, start); Assign(endTime, end); condensedArray = [[CondensedEntitiesArray alloc] init]; [self addEntitiesFromEnumerator:en]; } return self; } - (void)dealloc { Assign(condensedArray, nil); Assign(startTime, nil); Assign(endTime, nil); [super dealloc]; } - (void)addEntitiesFromEnumerator:(NSEnumerator *)enumerator { PajeEntity *entity; int top = -1; BOOL incomplete[100]; NSDate *start[100]; NSString *names[100]; double duration[100]; while ((entity = [enumerator nextObject]) != nil) { NSDate *entityStart; NSDate *entityEnd; BOOL entityIsAggregate; BOOL entityIsIncomplete; double entityDuration; double entityDurationInSelection; entityStart = [filter startTimeForEntity:entity]; entityEnd = [filter endTimeForEntity:entity]; if ([entityStart isLaterThanDate:endTime] || [entityEnd isEarlierThanDate:startTime]) { continue; } //entityDuration = [filter durationForEntity:entity]; entityDuration = [entity duration]; entityIsAggregate = [filter isAggregateEntity:entity]; while (top >= 0 && [entityEnd isEarlierThanDate:start[top]]) { if (incomplete[top] && duration[top] > 0) { [condensedArray addValue:names[top] duration:duration[top]]; } top--; } entityIsIncomplete = NO; entityDurationInSelection = entityDuration; if ([entityStart isEarlierThanDate:startTime]) { entityIsIncomplete = YES; entityDurationInSelection -= [startTime timeIntervalSinceDate:entityStart]; } if ([entityEnd isLaterThanDate:endTime]) { entityIsIncomplete = YES; entityDurationInSelection -= [entityEnd timeIntervalSinceDate:endTime]; } if (!entityIsAggregate) { id entityValue; entityValue = [filter valueForEntity:entity]; if (top >= 0 && incomplete[top]) { duration[top] -= entityDurationInSelection; } top++; incomplete[top] = entityIsIncomplete; start[top] = entityStart; if (entityIsIncomplete) { names[top] = entityValue; duration[top] = entityDurationInSelection; } else { double entityExclusiveDuration; //entityExclusiveDuration = [filter exclusiveDurationForEntity:entity]; entityExclusiveDuration = [entity exclusiveDuration]; [condensedArray addValue:entityValue duration:entityExclusiveDuration]; } //condensedEntitiesCount ++; } else { double correctionFactor; double correctedDuration; double entityExclusiveDuration; //entityExclusiveDuration = [filter exclusiveDurationForEntity:entity]; entityExclusiveDuration = [entity exclusiveDuration]; correctionFactor = entityDurationInSelection / entityDuration; correctedDuration = (entityDuration - entityExclusiveDuration) * correctionFactor; if (correctedDuration > entityDurationInSelection) { correctedDuration = entityDurationInSelection; } if (top >= 0 && incomplete[top]) { duration[top] -= correctedDuration; } // BUG: should be corrected by correctionFactor [condensedArray addArray:[entity condensedEntities]]; //[condensedArray addArray:[filter condensedEntitiesForEntity:entity]]; //condensedEntitiesCount += [entity condensedEntitiesCount]; } } while (top >= 0) { if (incomplete[top] && duration[top]/[endTime timeIntervalSinceDate:startTime] > 1e-5) { [condensedArray addValue:names[top] duration:duration[top]]; } top--; } } - (double)totalValue { return [endTime timeIntervalSinceDate:startTime]; } - (double)maxValue { return [self subDoubleValueAtIndex:0]; } - (double)minValue { return [self subDoubleValueAtIndex:[self subCount] - 1]; } - (unsigned)subCount { return [condensedArray count]; } - (id)subValueAtIndex:(unsigned)i { return [condensedArray valueAtIndex:i]; } - (NSColor *)subColorAtIndex:(unsigned)i { return [filter colorForValue:[condensedArray valueAtIndex:i] ofEntityType:entityType]; } - (double)subDoubleValueAtIndex:(unsigned)i { return [condensedArray durationAtIndex:i]; } @end Paje-1.98/StatViewer/StatViewer.gorm/0000775000175000017500000000000011674062007017412 5ustar schnorrschnorrPaje-1.98/StatViewer/StatViewer.gorm/data.info0000664000175000017500000000027311674062007021202 0ustar schnorrschnorrGNUstep archive00002b5d:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%GNUstep gui-0.9.30& % Typed StreamPaje-1.98/StatViewer/StatViewer.gorm/data.classes0000664000175000017500000000106211674062007021701 0ustar schnorrschnorr{ "## Comment" = "Do NOT change this file, Gorm maintains it"; PajeComponent = { Actions = ( "inputEntity:", "outputEntity:" ); Outlets = ( ); Super = NSObject; }; PajeFilter = { Actions = ( ); Outlets = ( ); Super = PajeComponent; }; StatViewer = { Actions = ( "changeInitialAngle:", "graphTypeSelectorChanged:", "entityTypeSelectorChanged:", "print:" ); Outlets = ( matrix, window, entityTypeSelector, graphTypeSelector, durationField ); Super = PajeFilter; }; }Paje-1.98/StatViewer/StatViewer.gorm/objects.gorm0000664000175000017500000003522411674062007021737 0ustar schnorrschnorrGNUstep archive00002b5d:0000002a:00000085:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary& 01NSString&%NSOwner0& %  StatViewer0&%GSCustomClassMap0&0& % PopUpButton01 NSPopUpButton1NSButton1 NSControl1 NSView1 NSResponder% A0 C C A  C A& 0 1 NSMutableArray1 NSArray&%0 1 NSPopUpButtonCell1NSMenuItemCell1 NSButtonCell1 NSActionCell1NSCell0 &0 1NSFont%&&&&&&&&0 1NSMenu0&0 &01 NSMenuItem0& % Node Activity0&&&%01NSImage0& % common_Nibble%%0&0&&&& %%%%%0& % TextField01 NSTextField% B C C Ap  C Ap& 0 &%01NSTextFieldCell0%0& % Helvetica A@A@&&&&&&&&0%01NSColor0&%NSCalibratedRGBColorSpace ? ? ? ? ?0 ?0 &%MenuItem0!0"& % Pie Chart&&%%0#&%Slider0$1NSSlider% C( C B A  B A& 0% &%0&1 NSSliderCell0'&%0 0(1NSNumber1NSValued &&&&&&&&% C %0)0*& &&&&&&&&0%0+0,&%NSNamedColorSpace0-&%System0.&%textBackgroundColor0/,-00&%controlTextColor0102&0304&%common_SliderHoriz &&&&&&&&%%05& % GormNSWindow061NSWindow%  C CȀ&% B D07 %  C CȀ  C CȀ&08 &09% A0 C C A  C A& 0: &%0; &&&&&&&&0<0= &!0>0?& % VBar Chart&&%%0@0A& % HBar Chart&&%%%&&&!<%%%%%0B1 NSScrollView% @ @ C C  C C&0C1 NSClipView% A @ C C  C C&0D1 NSMatrix%  C B  C B&C0E &%0F0G&%Button&&&&&&&&%&&&% C B @ 0H ?* ?* ?* ?* ?H0I& % NSButtonCell0J0K&%Button&&&&&&&&%&&&%%0L &FFB0M &H0N &C0O% A @ C C  C C&0P &DH0Q1! NSScroller% A C C A  C A&0R &%0S0T& &&&&&&&&&B2 _doScroll:v12@0:4@80U!% @ @ A C  A C&0V &%0WT &&&&&&&&&BO% A A A A QU0X% A C B Ap  B Ap& 0Y &%0Z0[&%Selection duration:0\%0]&%Helvetica-Bold A@A@&&&&&&&&0%$H0^& % Statistics^ ? ? F@ F@%0_ 0`0a&%NSCalibratedWhiteColorSpace 0b &0c1"NSBitmapImageRep1# NSImageRep0d&%NSDeviceRGBColorSpace B@ B@%%0%00e1$ NSDataMalloc1% NSDataStatic1&NSData&$$II*$[=T8J2R-!k[=U:K3xB-H'R-!k[=S7J2xB-H'/ ?[=S7I2xB-H'/ ?[=S7H0xB-H'/ ?[=R7I2xB-H'/ ?[=S7I0xB-H'/ ?[=R7I2xB-H'/ ?[=R7H0xB-H'/ ?[>X/!j:)H'/ ?D49  ?hft{y<;D ?hft}<;D ?<;D ?43:""""43:zzzzͱ""""EEEEEEEEEEEE43:555222t43:0?55hhhiiiyyyVVV777?43:~=0rdxxxUUU444?/17?43:5?0\Mzz{]]]QQQmmm_bn:9@5?0I>e]xxwvtsqpo}66<5?2A3QFA4H:|zzywutrqpbao++05?2@2@2A3B3C4E6}}|zxxwutrqpn}VT_=,, 5@2@3A3A3JdbqihvFEOQ-)Y)!W)`/$k3'q6*n4)l3'i2'f0&c/$`-$Y*!)5C4C4D4E6F7H7Ʀkkk)))LJRkjxihvhgu::B\/&[-$Y-$c/&l3'o4)l3'j2'g2&d0$a/$^-#X*!)5@2D4E6F7H7I8{{{[[[322QPZ^]jjhwhguQP[K33\-&W)_/$j3'm3'm4)j3'h2&d0&b/$_-#],#X*!)P'~>>ddd>>?87?4$$E)&_-#`0'_0&]/&^/&`/&`/&c0&j2'n3'k3'h2&d0$a/$^-#\,!Z,!X*!U)T))ttttttzzz;;;rqyjhwPPZ43:C@?w9,c2)b2)^,#_0&d2'g2'h2'k3)l3)l3)l3'l3'i2'f0&c/$_-#],#Z,!X*!W)T)S))rrr```FFF000mmm\[a<;CA)'^3,I::76v8,_-$b2'g2'l4)r7*s7*s7*w8,t7,q6*n4)k3'g2&d0$`-$],#[,!X*!W)U)S'S')YYY777XWcKJS|||SSS\2,KDD4I:I;A?>~>0b2)f2'p6*x:-y:-{;-x:-v9,s7*o4)l3'i2&f0&c/$_-#\,#Y*!W)T)S'R'S')TR^|z@?Gↄ\Zg<;CJJJm4)D4E6J;UIPEvI@q:/l4)m4)x:,};/{:-y:-w9,t7*q6*m4)j3'h2&c0&a/$]-#[,!X*!V)T)R'R'R')0/5?_^kCBJ43:?QQQ ^-#I:O>SBP?H7?2p6*s7*0|;/y:-p6*f0&d0&c/&`/$_-$]-#\,#T)!T)!T)!T)!T)!T)!T)!)))) ?h3'z;/T)!T)!T)!`/$`/$))))) ? 00$$R0f&%MatrixD0g& %  MenuItem1>0h& %  PopUpButton190i& %  MenuItem2@0j &  0k1'NSNibOutletConnector1(NSNibConnector0l&%NSOwner50m&%window0n'lf0o&%matrix0p'lh0q&%graphTypeSelector0r'l0s& % durationField0t'5l0u&%delegate0v( 0w(g0x(i0y'l0z&% entityTypeSelector0{1)NSNibControlConnectorl0|&% entityTypeSelectorChanged:0})hl0~&% graphTypeSelectorChanged:0(#0)#l01*NSMutableString&% changeInitialAngle:Paje-1.98/OrderFilter/0000775000175000017500000000000011674062007014476 5ustar schnorrschnorrPaje-1.98/OrderFilter/GNUmakefile0000664000175000017500000000120111674062007016542 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make OrderFilter_PRINCIPAL_CLASS = Order BUNDLE_NAME = OrderFilter ADDITIONAL_INCLUDE_DIRS = -I../General.bproj ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else OrderFilter_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif OrderFilter_RESOURCE_FILES = \ Order.gorm \ Order.nib OrderFilter_OBJC_FILES = Order.m OrderKey.m OrderFilter_HEADER_FILES = Order.h Order.h -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/OrderFilter/Order.m0000664000175000017500000002627111674062007015737 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* Order.m created by benhur on 20-mar-2001 */ /* * A Paje filter to change the order of containers */ #include "Order.h" #include "OrderKey.h" @implementation Order - (id)initWithController:(PajeTraceController *)c { NSWindow *win; self = [super initWithController:c]; if (self != nil) { containers = [[NSMutableDictionary alloc] init]; if (![NSBundle loadNibNamed:@"Order" owner:self]) { NSRunAlertPanel(@"Order", @"Couldn't load interface file", nil, nil, nil); return self; } win = [view window]; // view is an NSBox. we need its contents. view = [[(NSBox *)view contentView] retain]; hierarchyBrowser = [[HierarchyBrowser alloc] initWithFilter:self]; [hierarchyBrowser setContainersOnly:YES]; [[hierarchyBrowser view] setFrame:[browserBox frame]]; [[browserBox superview] replaceSubview:browserBox with:[hierarchyBrowser view]]; [self registerFilter:self]; #ifndef GNUSTEP [win release]; #endif } return self; } - (void)dealloc { [containers release]; [hierarchyBrowser release]; #ifndef __APPLE__ [view release]; #endif [super dealloc]; } - (NSView *)filterView { return view; } - (NSString *)filterName { return @"Order"; } - (id)filterDelegate { return self; } - (NSArray *)defaultsForKey:(OrderKey *)key { NSString *defaultKey; defaultKey = [NSString stringWithFormat:@"%@ in %@ Order", [key entityType], [key container]]; return [[NSUserDefaults standardUserDefaults] arrayForKey:defaultKey]; } - (void)registerDefaultsForKey:(OrderKey *)key { NSString *defaultKey; NSMutableArray *containerNames; NSEnumerator *containerEnum; PajeContainer *container; containerNames = [NSMutableArray array]; containerEnum = [[containers objectForKey:key] objectEnumerator]; while ((container = [containerEnum nextObject]) != nil) { [containerNames addObject:[container name]]; } defaultKey = [NSString stringWithFormat:@"%@ in %@ Order", [key entityType], [key container]]; [[NSUserDefaults standardUserDefaults] setObject:containerNames forKey:defaultKey]; } // // Notifications sent by other filters // - (PajeContainer *)removeContainerNamed:(NSString *)containerName fromArray:(NSMutableArray *)array { PajeContainer *container; int index; index = [array count]; while (index > 0) { container = [array objectAtIndex:--index]; if ([[container name] isEqual:containerName]) { [array removeObjectAtIndex:index]; return container; } } return nil; } - (void)synchronizeKey:(OrderKey *)key toOrderedNames:(NSArray *)containerNames { NSMutableArray *orderedContainers; NSMutableArray *allContainers; NSEnumerator *containerNamesEnum; NSString *containerName; orderedContainers = [NSMutableArray array]; allContainers = [[[super enumeratorOfContainersTyped:[key entityType] inContainer:[key container]] allObjects] mutableCopy]; containerNamesEnum = [containerNames objectEnumerator]; while ((containerName = [containerNamesEnum nextObject]) != nil) { PajeContainer *container; container = [self removeContainerNamed:containerName fromArray:allContainers]; if (container != nil) { [orderedContainers addObject:container]; } } [orderedContainers addObjectsFromArray:allContainers]; [containers setObject:orderedContainers forKey:key]; [allContainers release]; //[self registerDefaultsForKey:key]; } - (void)synchronizeKey:(OrderKey *)key { NSArray *orderFromDefaults; orderFromDefaults = [self defaultsForKey:key]; if (orderFromDefaults == nil) { return; } [self synchronizeKey:key toOrderedNames:orderFromDefaults]; } - (void)dataChangedForEntityType:(PajeEntityType *)entityType { if ([entityType isContainer]) { NSEnumerator *keyEnum; OrderKey *key; keyEnum = [containers keyEnumerator]; while ((key = [keyEnum nextObject]) != nil) { if ([[key entityType] isEqual:entityType]) { [self synchronizeKey:key]; } } } [super dataChangedForEntityType:entityType]; } - (void)hierarchyChanged { [containers removeAllObjects]; [hierarchyBrowser refreshLastColumn]; [super hierarchyChanged]; } // // Handle interface messages // - (void)moveSelectedContainersBy:(int)moveAmount { PajeEntityType *containerType; PajeContainer *container; OrderKey *key; NSMutableArray *containerArray; NSArray *selectedContainers; PajeContainer *firstSelectedContainer; NSUInteger index, maxIndex; selectedContainers = [[self selectedContainers] allObjects]; if ((selectedContainers == nil) || ([selectedContainers count] == 0)) { NSBeep(); return; } firstSelectedContainer = [selectedContainers objectAtIndex:0]; containerType = [super entityTypeForEntity:firstSelectedContainer]; container = [super containerForEntity:firstSelectedContainer]; key = [OrderKey keyWithEntityType:containerType container:container]; containerArray = [containers objectForKey:key]; // if not being filtered, initialize a filter for them. if (containerArray == nil) { NSEnumerator *unfilteredEnum; unfilteredEnum = [super enumeratorOfContainersTyped:containerType inContainer:container]; containerArray = [NSMutableArray arrayWithArray:[unfilteredEnum allObjects]]; [containers setObject:containerArray forKey:key]; } index = [containerArray indexOfObjectIdenticalTo:firstSelectedContainer]; if (index == NSNotFound) { [NSException raise:@"Order: Internal Inconsistency" format:@"Container Not Found: %@", firstSelectedContainer]; } index += moveAmount; maxIndex = [containerArray count] - [selectedContainers count]; if (index > maxIndex) { index = maxIndex; } [containerArray removeObjectsInArray:selectedContainers]; [containerArray replaceObjectsInRange:NSMakeRange(index, 0) withObjectsFromArray:selectedContainers]; [self setOrder:containerArray ofContainersTyped:containerType inContainer:container]; } - (void)setOrder:(NSArray *)containerOrder ofContainersTyped:(PajeEntityType *)containerType inContainer:(PajeContainer *)container { OrderKey *key; key = [OrderKey keyWithEntityType:containerType container:container]; [containers setObject:containerOrder forKey:key]; [self registerDefaultsForKey:key]; [hierarchyBrowser refreshLastColumn]; [hierarchyBrowser selectContainers:[[self selectedContainers] allObjects]]; [super orderChangedForContainerType:containerType]; } - (void)containerSelectionChanged { // TODO make last column the one that contains the selected containers [hierarchyBrowser refreshLastColumn]; [hierarchyBrowser selectContainers:[[self selectedContainers] allObjects]]; [super containerSelectionChanged]; } - (void)hierarchyBrowserContainerSelected:(HierarchyBrowser *)browser { [super setSelectedContainers:[NSSet setWithArray:[browser selectedContainers]]]; } - (IBAction)moveUp:(id)sender { [self moveSelectedContainersBy:-1]; } - (IBAction)moveDown:(id)sender { [self moveSelectedContainersBy:1]; } /* - (void)entityTypeSelected:(id)sender { [self synchronizeMatrix]; } - (void)synchronizeMatrix { [hierarchyBrowser setFilter:self]; } */ // // interact with interface // /* - (void)viewWillBeSelected:(NSView *)selectedView // message sent by PajeController when a view will be selected for display { [self synchronizeMatrix]; } */ // // Queries that are filtered // - (NSEnumerator *)enumeratorOfContainersTyped:(PajeContainerType *)entityType inContainer:(PajeContainer *)container { OrderKey *key; NSArray *containerArray; if (container == nil) { return [super enumeratorOfContainersTyped:entityType inContainer:container]; } key = [OrderKey keyWithEntityType:entityType container:container]; containerArray = [containers objectForKey:key]; if (containerArray == nil) { [self synchronizeKey:key]; containerArray = [containers objectForKey:key]; } if (containerArray == nil) { return [super enumeratorOfContainersTyped:entityType inContainer:container]; } else { return [containerArray objectEnumerator]; } } - (id)configuration { return containers; } - (OrderKey *)keyFromDescription:(NSString *)description { NSArray *keyAsArray; PajeEntityType *entityType; PajeContainer *container; NS_DURING keyAsArray = [description propertyList]; NS_HANDLER NS_VALUERETURN(nil, id); NS_ENDHANDLER if (![keyAsArray isKindOfClass:[NSArray class]] || [keyAsArray count] != 2) { return nil; } entityType = [self entityTypeWithName:[keyAsArray objectAtIndex:0]]; if (entityType == nil) { return nil; } container = [self containerWithName:[keyAsArray objectAtIndex:1] type:[self containerTypeForType:entityType]]; if (container == nil) { return nil; } return [OrderKey keyWithEntityType:entityType container:container]; } - (void)setConfiguration:(id)cfg { NSEnumerator *keyDescriptionEnumerator; NSString *keyDescription; OrderKey *key; NSDictionary *config; config = cfg; if (![config isKindOfClass:[NSDictionary class]]) { return; } keyDescriptionEnumerator = [config keyEnumerator]; while ((keyDescription = [keyDescriptionEnumerator nextObject]) != nil) { key = [self keyFromDescription:keyDescription]; if (key != nil) { [self synchronizeKey:key toOrderedNames:[config objectForKey:keyDescription]]; } } [hierarchyBrowser refreshLastColumn]; [super hierarchyChanged]; } @end Paje-1.98/OrderFilter/Order.gorm/0000775000175000017500000000000011674062007016514 5ustar schnorrschnorrPaje-1.98/OrderFilter/Order.gorm/data.classes0000664000175000017500000000715211674062007021011 0ustar schnorrschnorr{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:" ); Super = NSObject; }; Order = { Actions = ( "moveUp:", "moveDown:" ); Outlets = ( view, browserBox ); Super = PajeFilter; }; PajeComponent = { Actions = ( "inputEntity:", "outputEntity:" ); Outlets = ( ); Super = NSObject; }; PajeFilter = { Actions = ( ); Outlets = ( ); Super = PajeComponent; }; }Paje-1.98/OrderFilter/Order.gorm/objects.gorm0000664000175000017500000000664511674062007021046 0ustar schnorrschnorrGNUstep archive00002a96:0000001c:00000043:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%NSOwner0&%Order0&%GSCustomClassMap0&0&% Button101NSButton1 NSControl1NSView1 NSResponder% CF  Bp A  Bp A&!0 1 NSMutableArray1 NSArray&%0 1 NSButtonCell1 NSActionCell1NSCell0 &%Down0 1NSImage A A0 1NSColor0&%NSCalibratedWhiteColorSpace 0 &01NSBitmapImageRep1 NSImageRep0&%NSDeviceRGBColorSpace A A%% % 01 NSDataMalloc1 NSDataStatic1NSData&llII*   dR01NSFont%0& % Helvetica A@A@&&&&&&&&%0&&&&0& % GormNSPanel01NSPanel1NSWindow% ? A C C& % Cڀ D0% ? A C C  C C&0 &01NSBox% A@ @ C C  C C&0 &0%  C C  C C&0 &0% C  Bp A  Bp A&!0 &%0 0!&%Up0" A A 0# &0$ A A%% % 0%&llII*   dR&&&&&&&&%&&&0&% A C C  C C&0' &0(% @ @ Cx C  Cx C&0) &0*0+&%Box&&&&&&&& @ @%%0,0-&%Title&&&&&&&& %%0.0/&%NSCalibratedRGBColorSpace ?* ?* ?* ?* ?00&%Panel0 ? ? F@ F@%0102&%NSApplicationIcon03&%Box04&% Box1&05&%Button06 &071NSNibControlConnector1NSNibConnector508&%NSOwner09&%moveUp:0:80;& % moveDown:0<1NSNibOutletConnector830=&%view0>840?& % browserBoxPaje-1.98/OrderFilter/Order.nib/0000775000175000017500000000000011674062007016320 5ustar schnorrschnorrPaje-1.98/OrderFilter/Order.nib/keyedobjects.nib0000664000175000017500000001116211674062007021466 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdatak 156<=AELTmrv}   !%*+0149:E\]aehkopqrsvx_U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRootMgWXNViYjO?h234[NSClassNameUOrder789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FKGHIJ 8:=MNOPQR0]NSDestinationWNSLabelXNSSource 67UVWXYZ[\]^_`abbddefghijklZNSSubviews_NSNextResponder[NSSuperview\NSBorderType_NSTitlePosition[NSTitleCellWNSFrameYNSOffsetsXNSvFlags]NSTransparent]NSContentViewYNSBoxType 312 #UV[n.pqFG>sKj UVwWxPzPq[NSFrameSize 0 >~K$,UVWXYZ[\]^_`jjddhikl #>KwVWqZ{266, 300}78;VNSView[NSResponder78;^NSMutableArrayWNSArray_{{16, 40}, {266, 300}}V{0, 0}d_NSBackgroundColor[NSTextColorYNSSupportZNSContents[NSCellFlags\NSCellFlags2!"SBoxVNSSizeVNSNameXNSfFlags"A0 \LucidaGrande78;VNSFontWNSColor[NSColorName\NSColorSpace]NSCatalogName VSystem_textBackgroundColorkWNSWhiteB1 78;kM0 0.80000001 78Ҥ;_NSTextFieldCell\NSActionCellVNSCell78פ;UNSBoxVW[]jjYNSEnabled % !+&_{{163, 15}, {60, 20}}_NSKeyEquivalent_NSAlternateImage]NSControlView^NSButtonFlags2_NSPeriodicInterval]NSButtonFlags_NSPeriodicDelay_NSAlternateContents)('$"K@*)a%P78;\NSButtonCell]%NSButtonCell78;XNSButtonYNSControlVW[]jj - +._{{222, 15}, {60, 20}})(/,*)a%Z{298, 356}_{{35, 13}, {298, 356}}d54"kĀ Tview78"##$;_NSNibOutletConnector^NSNibConnectorMNO'R097ZbrowserBoxMNO0-.;<$WmoveUp:78233$;_NSNibControlConnectorMNO06.><,YmoveDown:>;DP>bj$ @ , LFGHIJKLMNOPkQRSTUVWbYZ[_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClassIBDAHJ pxKE_{{204, 276}, {359, 375}}^_`YNS.stringUPanelC78bccd;_NSMutableStringXNSString^f`WNSPanelC^i`TViewC>lKP _{{1, 1}, {359, 375}}_{{0, 0}, {1280, 1002}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78tuu;_NSWindowTemplate78w;>yDjb0>jPj @  L>DPj0> @L>DPQRSTUL\File's Owner>DL>DL>D0HjbPIG>J8 $ , : @=L>DZ[\]^_`abcdefL     >K>DL>DL78Ң;^NSIBObjectData#,1:LQVdf?E18FTb| $7@KLNW^kqz#0BNV`iw  GIKMOQSTVXadfhy{}'3=HTacegikpt5BJMOX]jxzL^q      + 8 F O Z c m  4 6 8 : < > K M R [ b y     ! 2 4 6 8 : < > @ B D u          ! < E O U W ` g y   . 7 < E V X Z \ ^ ` b d f h q ~    9;=?ACEGIKMOQSUWY[]_acegiktuwPaje-1.98/OrderFilter/Order.nib/info.nib0000664000175000017500000000070611674062007017750 0ustar schnorrschnorr IBDocumentLocation 213 134 356 240 0 0 1280 1002 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/OrderFilter/Order.nib/classes.nib0000664000175000017500000000100211674062007020440 0ustar schnorrschnorr{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {moveDown = id; moveUp = id; }; CLASS = Order; LANGUAGE = ObjC; OUTLETS = {browserBox = NSView; view = NSView; }; SUPERCLASS = PajeFilter; }, {CLASS = PajeComponent; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeFilter; LANGUAGE = ObjC; SUPERCLASS = PajeComponent; } ); IBVersion = 1; }Paje-1.98/OrderFilter/Order.h0000664000175000017500000000314211674062007015722 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _Order_h_ #define _Order_h_ /* Order.h created by benhur on 20-mar-2001 */ #include #include "../General/FilteredEnumerator.h" #include "../General/Protocols.h" #include "../General/PajeFilter.h" #include "../General/HierarchyBrowser.h" @interface Order : PajeFilter { NSMutableDictionary *containers; IBOutlet NSView *view; IBOutlet NSView *browserBox; HierarchyBrowser *hierarchyBrowser; } - (id)initWithController:(PajeTraceController *)c; - (void)dealloc; // // Handle interface messages // - (IBAction)moveUp:(id)sender; - (IBAction)moveDown:(id)sender; // // Queries that are filtered // - (NSEnumerator *)enumeratorOfContainersTyped:(PajeContainerType *)entityType inContainer:(PajeContainer *)container; @end #endif Paje-1.98/OrderFilter/OrderKey.h0000664000175000017500000000250011674062007016370 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _OrderKey_h_ #define _OrderKey_h_ /* * OrderKey.h * ---------- * Key for an ordered array of containers * contains the entityType and the container */ // 20-mar-2001 BS created #include @interface OrderKey : NSObject { id entityType; id container; } + (OrderKey *)keyWithEntityType:(id)e container:(id)c; - (id)initWithEntityType:(id)e container:(id)c; - (void)dealloc; - (id)container; - (id)entityType; - (BOOL)isEqual:(id)other; - (NSUInteger)hash; @end #endif Paje-1.98/OrderFilter/OrderKey.m0000664000175000017500000000401511674062007016400 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* * OrderKey.m * ---------- * Key for an ordered array of containers * contains the entityType and the container */ // 20-mar-2001 BS created #include #include "../General/Macros.h" #include @implementation OrderKey + (OrderKey *)keyWithEntityType:(id)e container:(id)c { return [[[self alloc] initWithEntityType:e container:c] autorelease]; } - (id)initWithEntityType:(id)e container:(id)c { self = [super init]; if (self) { Assign(entityType, e); Assign(container, c); } return self; } - (void)dealloc { Assign(entityType, nil); Assign(container, nil); [super dealloc]; } - (id)container { return container; } - (id)entityType { return entityType; } - (BOOL)isEqual:(id)other { if (![other isKindOfClass:[OrderKey class]]) return NO; return [entityType isEqual:[(OrderKey *)other entityType]] && [container isEqual:[(OrderKey *)other container]]; } - (NSUInteger)hash { return [entityType hash] ^ [container hash]; } - (id)copyWithZone:(NSZone *)zone { return [self retain]; } - (NSString *)description { return [[NSArray arrayWithObjects:entityType, container, nil] description]; } @end Paje-1.98/GNUmakefile0000664000175000017500000000102611674062007014326 0ustar schnorrschnorrinclude $(GNUSTEP_MAKEFILES)/common.make PACKAGE_NAME = Paje VERSION = 1.98 AGGREGATE_NAME = Paje SUBPROJECTS = \ General \ Paje \ FileReader \ PajeEventDecoder \ PajeSimulator \ StorageController \ EntityTypeFilter \ FieldFilter \ ContainerFilter \ OrderFilter \ ReductionFilter \ ImbricationFilter \ SpaceTimeViewer \ StatViewer \ AggregatingFilter OTHERSRCS = Makefile.preamble Makefile Makefile.postamble -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/aggregate.make -include GNUmakefile.postamble Paje-1.98/TODO0000664000175000017500000000103311674062007012742 0ustar schnorrschnorr- make memory cache work again (encapsulator) - done - make focus (on time and/or on containers) - individualize sizes by container in drawview (or have 2 sizes) - limit drawview size when zooming in - done - make statview work again - done - make grouping of containers work again - reuse vertical space for containers (layout in spacetime) - implement searching - implement time markers - source browser - undo/redo support - save/reload filter configuration - filter configuration editor - user manual - trace manual - developer manual Paje-1.98/SpaceTimeViewer/0000775000175000017500000000000011674062007015311 5ustar schnorrschnorrPaje-1.98/SpaceTimeViewer/GNUmakefile0000664000175000017500000000242511674062007017366 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make BUNDLE_NAME = SpaceTimeViewer SpaceTimeViewer_PRINCIPAL_CLASS = STController ADDITIONAL_INCLUDE_DIRS = -I../General ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else SpaceTimeViewer_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif SpaceTimeViewer_RESOURCE_FILES = \ STEntityTypeLayout.gorm \ STEntityTypeLayout.nib \ SpaceTime.gorm \ SpaceTime.nib \ crosscursor.tiff \ distant.tiff \ near.tiff \ toselection.tiff SpaceTimeViewer_OBJC_FILES = \ DrawView.m \ DrawView+Mouse.m \ DrawView+Finding.m \ DrawView+Positioning.m \ DrawView+Drawing.m \ STController.m \ HierarchyRuler.m \ Shape.m \ STEntityTypeLayout.m \ STEntityTypeLayoutController.m \ STLayoutEditor.m SpaceTimeViewer_HEADER_FILES = \ DrawView.h \ STController.h \ HierarchyRuler.h \ Shape.h \ STEntityTypeLayout.h \ STEntityTypeLayoutController.h \ STLayoutEditor.h -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/SpaceTimeViewer/STEntityTypeLayout.h0000664000175000017500000001513011674062007021245 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _STEntityTypeLayout_h_ #define _STEntityTypeLayout_h_ // Paje // ---- // STEntityTypeLayout.h // holds the layout of an entity type, with information // on how and where to draw one entity of this type. // 25.aug.2004 BS creation #include #include "../General/Protocols.h" #include "../General/PajeContainer.h" #include "Shape.h" @class STContainerTypeLayout; @class STController; @interface STEntityTypeLayout : NSObject { PajeEntityType *entityType; // pointer to function that creates a path of the entity representation. ShapeFunction *shapeFunction; // pointer to function that draws a path created by pathFunction. DrawFunction *drawFunction; float height; float offset; // from start of container // alternatively, could be rectincontainer (like container) BOOL drawsName; STContainerTypeLayout *containerDescriptor; NSMutableDictionary *rectInContainer; } + (STEntityTypeLayout *)descriptorWithEntityType:(PajeEntityType *)etype drawingType:(PajeDrawingType)dtype containerDescriptor:(STContainerTypeLayout *)cDesc controller:(STController *)controller; - (id)initWithEntityType:(PajeEntityType *)etype containerDescriptor:(STContainerTypeLayout *)cDesc controller:(STController *)controller; - (void)registerDefaultsWithController:(STController *)controller; - (NSString *)defaultKeyForKey:(NSString*)key; - (float)defaultFloatForKey:(NSString *)key; - (void)setDefaultFloat:(float)val forKey:(NSString *)key; - (BOOL)defaultBoolForKey:(NSString *)key; - (void)setDefaultBool:(BOOL)value forKey:(NSString *)key; // accessor methods - (PajeEntityType *)entityType; - (void)setShapeFunction:(ShapeFunction *)f; - (void)setDrawFunction:(DrawFunction *)f; - (ShapeFunction *)shapeFunction; - (DrawFunction *)drawFunction; - (void)setHeight:(float)newHeight; - (float)height; - (void)setDrawsName:(BOOL)draws; - (BOOL)drawsName; - (void)setOffset:(float)val; - (float)offset; - (float)yInContainer:(id)container; - (void)setRect:(NSRect)rect inContainer:(id)container; - (NSRect)rectInContainer:(id)container; - (BOOL)intersectsRect:(NSRect)rect inContainer:(id)container; - (BOOL)isPoint:(NSPoint)point inContainer:(id)container; - (void)reset; // methods to be implemented by subclasses - (PajeDrawingType)drawingType; - (BOOL)isContainer; // from NSObject protocol - (unsigned int)hash; - (BOOL)isEqual:(id)other; - (NSString *)description; @end @interface STEventTypeLayout : STEntityTypeLayout { float width; } - (void)setWidth:(float)val; - (float)width; - (BOOL)isSupEvent; @end @interface STStateTypeLayout : STEntityTypeLayout { float inset; // Number of points one entity should be shorter than // another when imbricated. } // Number of points one entity should be shorter than another when imbricated. - (void)setInsetAmount:(float)newInsetAmount; - (float)insetAmount; @end @interface STLinkTypeLayout : STEntityTypeLayout { // sourceOffset is offset of superclass // float sourceOffset; // from start of container float destOffset; float lineWidth; } - (void)setLineWidth:(float)val; - (float)lineWidth; - (void)setSourceOffset:(float)val; - (float)sourceOffset; - (void)setDestOffset:(float)val; - (float)destOffset; @end @interface STVariableTypeLayout : STEntityTypeLayout { float lineWidth; float minValue; float maxValue; BOOL showMinMax; NSMutableArray *hashMarkValues; NSString *hashValueFormat; } - (void)setLineWidth:(float)val; - (float)lineWidth; - (void)setShowMinMax:(BOOL)flag; - (BOOL)showMinMax; - (void)setMinValue:(float)val; - (float)minValue; - (void)setMaxValue:(float)val; - (float)maxValue; - (NSArray *)hashMarkValues; - (NSString *)hashValueFormat; @end @interface STContainerTypeLayout : STEntityTypeLayout { float supEventsOffset; // base of superior events float infEventsOffset; // base of inferior events float subcontainersOffset; // start of subcontainers float variablesOffset; float heightForVariables; float siblingSeparation; // separation from other containers of same type // in same container float subtypeSeparation; // separation between two subtypes NSMutableDictionary *rectsOfInstances; // Subtypes: NSMutableArray *eventSubtypes; NSMutableArray *supEventSubtypes; NSMutableArray *stateSubtypes; NSMutableArray *infEventSubtypes; NSMutableArray *variableSubtypes; NSMutableArray *linkSubtypes; NSMutableArray *containerSubtypes; float minValue; float maxValue; NSMutableArray *hashMarkValues; NSString *hashValueFormat; } - (void)setSiblingSeparation:(float)val; - (float)siblingSeparation; - (void)setSubtypeSeparation:(float)val; - (float)subtypeSeparation; - (void)setSupEventsOffset:(float)val; - (float)supEventsOffset; - (void)setInfEventsOffset:(float)val; - (float)infEventsOffset; - (void)setSubcontainersOffset:(float)val; - (float)subcontainersOffset; - (void)setHeightForVariables:(float)val; - (float)heightForVariables; - (float)variablesOffset; - (float)linkOffset; // rect of each instance of this type - (void)setRect:(NSRect)rect ofInstance:(id)entity; - (NSRect)rectOfInstance:(id)entity; - (BOOL)isInstance:(id)entity inRect:(NSRect)rect; - (BOOL)isPoint:(NSPoint)point inInstance:(id)entity; - (id)instanceWithPoint:(NSPoint)point; - (NSEnumerator *)instanceEnumerator; - (void)addSubtype:(STEntityTypeLayout *)subtype; - (NSArray *)subtypes; - (void)setOffsets; - (void)setMinValue:(float)val; - (float)minValue; - (void)setMaxValue:(float)val; - (float)maxValue; - (NSArray *)hashMarkValues; - (NSString *)hashValueFormat; @end #endif Paje-1.98/SpaceTimeViewer/DrawView+Positioning.m0000664000175000017500000001032611674062007021517 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // DrawView+Positioning // -------------- // methods for finding positions of entities in DrawView. #include "STController.h" @implementation STController (Positioning) - (NSRect)calcRectOfInstance:(id)entity ofLayoutDescriptor:(STContainerTypeLayout *)layoutDescriptor minY:(float)minY { NSEnumerator *sublayoutEnum; STEntityTypeLayout *sublayout; NSRect rect = NSZeroRect; float containerStartX; float containerEndX; containerStartX = [drawView timeToX:[self startTimeForEntity:entity]]; containerEndX = [drawView timeToX:[self endTimeForEntity:entity]]; rect.origin.x = containerStartX; rect.size.width = containerEndX - containerStartX; sublayoutEnum = [[layoutDescriptor subtypes] objectEnumerator]; while ((sublayout = [sublayoutEnum nextObject]) != nil) { if ([sublayout isContainer]) { continue; } rect.origin.y = minY + [sublayout offset]; rect.size.height = [sublayout height]; [sublayout setRect:rect inContainer:entity]; } float separation = 0; rect.origin.y = minY; rect.size.height = [layoutDescriptor subcontainersOffset]; sublayoutEnum = [[layoutDescriptor subtypes] objectEnumerator]; while ((sublayout = [sublayoutEnum nextObject]) != nil) { NSRect r; float subtypeOffset; STContainerTypeLayout *layout; if (![sublayout isContainer]) { continue; } layout = (STContainerTypeLayout *)sublayout; subtypeOffset = NSMaxY(rect) + separation; r = [self calcRectOfAllInstancesOfLayoutDescriptor:layout inContainer:entity minY:subtypeOffset]; if (!NSIsEmptyRect(r)) { rect = NSUnionRect(rect, r); separation = [layoutDescriptor subtypeSeparation]; } } [layoutDescriptor setRect:rect ofInstance:entity]; return rect; } - (NSRect)calcRectOfAllInstancesOfLayoutDescriptor:(STContainerTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container minY:(float)minY { NSRect rect = NSZeroRect; float containerStartX; float containerEndX; NSEnumerator *ienum; id instance; float separation = 0; containerStartX = [drawView timeToX:[self startTimeForEntity:container]]; containerEndX = [drawView timeToX:[self endTimeForEntity:container]]; rect.origin.x = containerStartX; rect.size.width = containerEndX - containerStartX; rect.origin.y = minY; rect.size.height = 0; // check all instances on this hierarchy ienum = [self enumeratorOfContainersTyped:[layoutDescriptor entityType] inContainer:container]; while ((instance = [ienum nextObject]) != nil) { NSRect r; r = [self calcRectOfInstance:instance ofLayoutDescriptor:layoutDescriptor minY:NSMaxY(rect) + separation]; if (!NSIsEmptyRect(r)) { if (NSIsEmptyRect(rect)) { rect = r; separation = [layoutDescriptor siblingSeparation]; } else { rect = NSUnionRect(rect, r); } } } [layoutDescriptor setRect:rect inContainer:container]; return rect; } @end Paje-1.98/SpaceTimeViewer/SpaceTime.gorm/0000775000175000017500000000000011674062007020126 5ustar schnorrschnorrPaje-1.98/SpaceTimeViewer/SpaceTime.gorm/data.classes0000664000175000017500000000172611674062007022424 0ustar schnorrschnorr{ "## Comment" = "Do NOT change this file, Gorm maintains it"; DrawView = { Actions = ( "doubleTimeScale:", "halveTimeScale:", "zoomToSelection:" ); Outlets = ( zoomToSelectionButton, doubleTimeScaleButton, zoomButtonsMatrix, entityNameField, cursorTimeField, controller ); Super = NSView; }; FirstResponder = { Actions = ( "doubleTimeScale:", "halveTimeScale:", "zoomToSelection:", "redisplay:", "displaySelectionChanged:" ); Super = NSObject; }; PajeComponent = { Actions = ( "inputEntity:", "outputEntity:" ); Outlets = ( ); Super = NSObject; }; PajeFilter = { Actions = ( ); Outlets = ( ); Super = PajeComponent; }; STController = { Actions = ( "print:" ); Outlets = ( scrollView, buttonsTimeScale, buttonsThreadScale, undisplayButton, window, drawView, timeRuler ); Super = PajeFilter; }; }Paje-1.98/SpaceTimeViewer/SpaceTime.gorm/objects.gorm0000664000175000017500000005243411674062007022455 0ustar schnorrschnorrGNUstep archive00002c88:00000027:0000008b:00000001:01GSNibContainer1NSObject01 GSMutableSet1 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&%NSWindow1 NSWindow1 NSResponder% ? A D% C&% C| D,01 NSView% ? A D% C  D% C&01 NSMutableArray1 NSArray&01 NSScrollView%  D% C  D% C&0 &0 1 NSClipView% A ? D C B D C&0 &0 1 GSCustomView1 GSNibItem0 &%DrawView B C C7&0 1NSColor0&%NSCalibratedWhiteColorSpace >~ ?01 NSScroller1 NSControl% A C D A  D A&0 &%01NSCell0&01NSFont%&&&&&&&&&2 _doScroll:v12@0:4@80% ? ? A C  A C&0 &%0&&&&&&&&& % A A A A 01 NSTextField% C C D A  D A& 0 &%01NSTextFieldCell1 NSActionCell0&%0.0&&&&&&&&0%00&%NSNamedColorSpace0&%System0&%textBackgroundColor0 > ?0 % C C D A  D A& 0! &%0"0#&&&&&&&&&0%0$0%&%System0&&%textBackgroundColor0' > ?0(1NSBox% A C B B   B B & 0) &0* %  B B   B B &0+ &0,1NSButton%  B B   B B &0- &%0.1 NSButtonCell0/&%Button001NSImage B B01 02 &031NSBitmapImageRep1 NSImageRep04&%NSDeviceRGBColorSpace B B%%%%%051 NSDataMalloc1! NSDataStatic1"NSData&II*lTTTTTTTTTTTT %%dR&&&&&&&&%06&07&&&&08% B  B B   B B &09 &%0:0;&%Button0< B B10= &0>4 B B%%%%%0? &II*lTTTTTT@@@TTTTTT %%dR&&&&&&&&%0@&0A&&&&0B% B  B B   B B &0C &%0D0E&%Button0F B B0G 0H &0I4 B B%%%%%0J &II*lTTTTTT@@@@TTTTTT %%dR&&&&&&&&%0K&0L&&&&0M0N&&&&&&&&& %%0O0P&%System0Q&%windowBackgroundColor0R&%Window0S&%Space Time DiagramS ? B F@ F@%0T0U&%NSApplicationIcon&  D D@0V &0W &0X1#NSMutableDictionary1$ NSDictionary& 0Y&%NSOwner0Z& % STController0[&%GormCustomView 0\&%Button1B0]&%Button280^&%Box(0_& % ScrollView0`& % TextField0a&%Button,0b& % GormNSWindow0c& % TextField2 0d &0e1%NSNibConnectorb0f&%NSOwner0g%[0h%_0i%a0j%`0k%c0l%\f0m%]f0n1&NSNibOutletConnectorf[0o&%drawView0p&f_0q& % scrollView0r&fb0s&%window0t&[a0u&%zoomToSelectionButton0v&[]0w&%doubleTimeScaleButton0x1'NSNibControlConnectora[0y&%zoomToSelection:0z'][0{&%doubleTimeScale:0|'\[0}&%halveTimeScale:0~&[`0&%cursorTimeField0&[c0&%entityNameField0%^0&[f0& % controller0#&Paje-1.98/SpaceTimeViewer/SpaceTime.gorm/toselection.tiff0000664000175000017500000001303611674062007023333 0ustar schnorrschnorrMM*lTTTTTTTTTTTT %%udRSPaje-1.98/SpaceTimeViewer/SpaceTime.gorm/near.tiff0000664000175000017500000001303611674062007021730 0ustar schnorrschnorrMM*lTTTTTT@@@@TTTTTT %%udRSPaje-1.98/SpaceTimeViewer/SpaceTime.gorm/distant.tiff0000664000175000017500000001303611674062007022451 0ustar schnorrschnorrMM*lTTTTTT@@@TTTTTT %%udRSPaje-1.98/SpaceTimeViewer/thick.tiff0000664000175000017500000001304611674062007017271 0ustar schnorrschnorrII*lTTTTTTTTTTTT %%d(R ' 'Paje-1.98/SpaceTimeViewer/HierarchyRuler.h0000664000175000017500000000272211674062007020415 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _HierarchyRuler_h_ #define _HierarchyRuler_h_ #include #include "DrawView.h" @class STController; typedef enum { hierarchyRulerNone, hierarchyRulerVerticalDivider, hierarchyRulerHorizontalDivider, hierarchyRulerBox } hierarchyRulerPart; @interface HierarchyRuler : NSRulerView { NSMutableArray *thicknesses; NSCell *cell; NSCell *vcell; id containerBeingDragged; int maxLevel; STController *controller; } - (id)initWithScrollView:(NSScrollView *)scrollView controller:(STController *)c; - (void)drawHashMarksAndLabelsInRect:(NSRect)drawRect; - (void)refreshSizes; @end #endif Paje-1.98/SpaceTimeViewer/Shape.h0000664000175000017500000000507111674062007016525 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _Shape_h_ #define _Shape_h_ // Paje // ---- // Shape.h // shape drawing functions and classes. // 19.ago.2004 BS creation #include #include "../General/Protocols.h" typedef void (shapefunction)(NSBezierPath *path, NSRect rect); typedef void (drawfunction)(NSBezierPath *path, NSColor *color); @interface ShapeFunction : NSObject { shapefunction *function; NSString *name; float topExtension; float rightExtension; } + (ShapeFunction *)shapeFunctionWithName:(NSString *)name; + (NSArray *)shapeFunctionsForDrawingType:(PajeDrawingType)drawingType; + (ShapeFunction *)shapeFunctionWithFunction:(shapefunction *)f name:(NSString *)n; + (ShapeFunction *)shapeFunctionWithFunction:(shapefunction *)f name:(NSString *)n topExtension:(float)top rightExtension:(float)right; - (id)initWithShapeFunction:(shapefunction *)f name:(NSString *)n topExtension:(float)top rightExtension:(float)right; - (shapefunction *)function; - (NSString *)name; - (float)topExtension; - (float)rightExtension; @end @interface DrawFunction : NSObject { drawfunction *function; NSString *name; BOOL fillsPath; } + (DrawFunction *)drawFunctionWithName:(NSString *)name; + (NSArray *)drawFunctions; + (DrawFunction *)drawFunctionWithFunction:(drawfunction *)f name:(NSString *)n fillsPath:(BOOL)fills; - (id)initWithDrawFunction:(drawfunction *)f name:(NSString *)n fillsPath:(BOOL)fills; - (drawfunction *)function; - (NSString *)name; - (BOOL)fillsPath; @end #endif Paje-1.98/SpaceTimeViewer/thin.tiff0000664000175000017500000001304611674062007017131 0ustar schnorrschnorrII*lTTTTTTTTTTTT %%d(R ' 'Paje-1.98/SpaceTimeViewer/STLayoutEditor.h0000664000175000017500000001012311674062007020352 0ustar schnorrschnorr/* Copyright (c) 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _STLayoutEditor_h_ #define _STLayoutEditor_h_ // STLayoutEditor // Controllers for editing many STEntityTypeLayouts #include @class STEntityTypeLayoutController; @class ShapeImageRep; @interface STLayoutEditor : NSObject { IBOutlet NSBox *box; IBOutlet STEntityTypeLayoutController *controller; } - (void)awakeFromNib; - (void)dealloc; - (NSView *)view; - (void)setController:(STEntityTypeLayoutController *)c; - (void)setLayoutDescriptor:(STEntityTypeLayout *)descriptor; - (STEntityTypeLayout *)layoutDescriptor; @end // Private subclasses @interface STContainerLayoutEditor : STLayoutEditor { STContainerTypeLayout *layoutDescriptor; IBOutlet NSTextField *siblingSeparationField; IBOutlet NSStepper *siblingSeparationStepper; IBOutlet NSTextField *subtypeSeparationField; IBOutlet NSStepper *subtypeSeparationStepper; IBOutlet NSTextField *heightForVariablesField; IBOutlet NSStepper *heightForVariablesStepper; } - (void)setLayoutDescriptor:(STEntityTypeLayout *)descriptor; - (IBAction)siblingSeparationChanged:(id)sender; - (IBAction)subtypeSeparationChanged:(id)sender; - (IBAction)heightForVariablesChanged:(id)sender; @end @interface STShapedLayoutEditor : STLayoutEditor { IBOutlet NSMatrix *shapeMatrix; IBOutlet NSMatrix *drawMatrix; } - (NSRect)rectForImageOfSize:(NSSize)size; - (ShapeFunction *)selectedShapeFunction; - (DrawFunction *)selectedDrawFunction; - (void)setupShapeMatrix; - (void)setupDrawMatrices; - (void)drawShape:(ShapeImageRep *)image; - (void)drawDraw:(ShapeImageRep *)image; - (void)recacheAll; - (IBAction)drawFunctionSelected:(id)sender; - (IBAction)shapeSelected:(id)sender; @end @interface STLinkLayoutEditor : STShapedLayoutEditor { STLinkTypeLayout *layoutDescriptor; IBOutlet NSTextField *lineWidthField; IBOutlet NSStepper *lineWidthStepper; } - (void)setLayoutDescriptor:(STEntityTypeLayout *)descriptor; - (IBAction)lineWidthChanged:(id)sender; @end @interface STEventLayoutEditor : STShapedLayoutEditor { STEventTypeLayout *layoutDescriptor; IBOutlet NSButton *displayValueSwitch; IBOutlet NSTextField *heightField; IBOutlet NSStepper *heightStepper; IBOutlet NSTextField *widthField; IBOutlet NSStepper *widthStepper; } - (void)setLayoutDescriptor:(STEntityTypeLayout *)descriptor; - (IBAction)heightChanged:(id)sender; - (IBAction)widthChanged:(id)sender; - (IBAction)displayValueChanged:(id)sender; @end @interface STStateLayoutEditor : STShapedLayoutEditor { STStateTypeLayout *layoutDescriptor; IBOutlet NSButton *displayValueSwitch; IBOutlet NSTextField *heightField; IBOutlet NSStepper *heightStepper; IBOutlet NSTextField *insetAmountField; IBOutlet NSStepper *insetAmountStepper; } - (void)setLayoutDescriptor:(STEntityTypeLayout *)descriptor; - (IBAction)heightChanged:(id)sender; - (IBAction)insetAmountChanged:(id)sender; - (IBAction)displayValueChanged:(id)sender; @end @interface STVariableLayoutEditor : STShapedLayoutEditor { STVariableTypeLayout *layoutDescriptor; IBOutlet NSTextField *lineWidthField; IBOutlet NSStepper *lineWidthStepper; IBOutlet NSButton *showMinMaxSwitch; } - (void)setLayoutDescriptor:(STEntityTypeLayout *)descriptor; - (IBAction)lineWidthChanged:(id)sender; - (IBAction)showMinMaxChanged:(id)sender; @end #endif Paje-1.98/SpaceTimeViewer/DrawView.m0000664000175000017500000005533011674062007017225 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* * DrawView.m * * a View that draws lines * * 19960115 BS creation * 19960212 BS clean-up */ #include "DrawView.h" #include "STController.h" #include "../General/NSUserDefaults+Additions.h" #include "../General/Macros.h" #include "../General/EntityChunk.h" #include #define DefaultsPrefix NSStringFromClass([self class]) #define DefaultsKey(name) [DefaultsPrefix stringByAppendingString:name] @implementation DrawView - (void)dealloc { Assign(startTime, nil); Assign(endTime, nil); Assign(backgroundColor, nil); Assign(selectedBackgroundColor, nil); Assign(highlightColor, nil); Assign(entityNameAttributes, nil); Assign(cursorTimeFormat, nil); [super dealloc]; } - (NSColor *)backgroundColor { return backgroundColor; } - (NSColor *)selectedBackgroundColor { return selectedBackgroundColor; } - (void)setBackgroundColor:(NSColor *)color { Assign(backgroundColor, color); [[NSUserDefaults standardUserDefaults] setColor:backgroundColor forKey:DefaultsKey(@"BackgroundColor")]; [self setNeedsDisplay:YES]; } - (void)setSelectedBackgroundColor:(NSColor *)color { Assign(selectedBackgroundColor, color); [[NSUserDefaults standardUserDefaults] setColor:selectedBackgroundColor forKey:DefaultsKey(@"SelectedBackgroundColor")]; [self setNeedsDisplay:YES]; } - (void)setFilter:(PajeFilter *)newFilter { filter = newFilter; } - (PajeFilter *)filter { return filter; } - (void)setController:(STController *)c { controller = c; } - (void)hierarchyChanged { Assign(startTime, [filter startTime]); Assign(endTime, [filter endTime]); NSDebugMLLog(@"tim", @"Hier changed. times=[%@ %@]", startTime, endTime); if (startTime != nil && endTime != nil) { [self adjustSize]; } } - (void)dataChangedForEntityType:(PajeEntityType *)entityType { [self adjustSize]; } - (void)colorChangedForEntityType:(PajeEntityType *)entityType { [self setNeedsDisplay:YES]; } - (void)orderChangedForContainerType:(PajeContainerType *)containerType { [self adjustSize]; } - (void)awakeFromNib { NSCursor *cursor; NSImage *cursorImage; NSString *cursorPath; // initialize instance variables pointsPerSecond = [[NSUserDefaults standardUserDefaults] doubleForKey:DefaultsKey(@"PointsPerSecond")]; if (pointsPerSecond == 0) { pointsPerSecond = 10000; } [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: @"30", DefaultsKey(@"SmallEntityWidth"), nil]]; smallEntityWidth = [[NSUserDefaults standardUserDefaults] integerForKey:DefaultsKey(@"SmallEntityWidth")]; hasZoomed = NO; filter = nil; //trackingRectTag = 0; timeUnitDivisor = 1; Assign(cursorTimeFormat, @"%.6f s"); [zoomToSelectionButton setEnabled:NO]; // [[self window] setBackingType:NSBackingStoreNonretained]; // get background color from defaults Assign(backgroundColor, [[NSUserDefaults standardUserDefaults] colorForKey:DefaultsKey(@"BackgroundColor")]); if (backgroundColor == nil) { Assign(backgroundColor, [NSColor controlBackgroundColor]); } Assign(selectedBackgroundColor, [[NSUserDefaults standardUserDefaults] colorForKey:DefaultsKey(@"SelectedBackgroundColor")]); if (selectedBackgroundColor == nil) { Assign(selectedBackgroundColor, [NSColor controlLightHighlightColor]); } Assign(highlightColor, [[NSUserDefaults standardUserDefaults] colorForKey:DefaultsKey(@"HighlightColor")]); if (highlightColor == nil) { Assign(highlightColor, [NSColor colorWithCalibratedRed:1 green:0.4 blue:0 alpha:0.4]); } // initialize the cursor cursorPath = [[NSBundle bundleForClass:[self class]] pathForImageResource:@"crosscursor"]; cursorImage = [[NSImage alloc] initWithContentsOfFile:cursorPath]; cursor = [[NSCursor alloc] initWithImage:cursorImage hotSpot:NSMakePoint(7,9)]; [cursorImage release]; if (cursor != nil) { [[self enclosingScrollView] setDocumentCursor:cursor]; [cursor release]; } #ifdef GNUSTEP [[cursorTimeField window] performSelector:@selector(makeKeyAndOrderFront:) withObject:self afterDelay:0]; #endif // register to receive color drag-and-drops [self registerForDraggedTypes:[NSArray arrayWithObject:NSColorPboardType]]; // [[EntityTypeInspector alloc] initWithDelegate:self]; [[self enclosingScrollView] setHasHorizontalRuler:YES]; [[[self enclosingScrollView] horizontalRulerView] setReservedThicknessForMarkers:0.0]; [[self enclosingScrollView] setBackgroundColor:[self backgroundColor]/*[NSColor whiteColor]*/]; [[self enclosingScrollView] setDrawsBackground:YES/*NO*/]; entityNameAttributes = [[NSDictionary alloc] initWithObjectsAndKeys: [NSFont systemFontOfSize:8], @"NSFontAttributeName", nil]; //TODO: should register as tool } - (NSRect)adjustScroll:(NSRect)newVisible { if (hasZoomed) { float lastX = TIMEtoX(endTime); float newX = TIMEtoX(oldMiddleTime) - NSWidth(newVisible) / 2; if ( (newX + NSWidth(newVisible)) > lastX ) newX = lastX - NSWidth(newVisible); if (newX < 0) newX = 0; newVisible.origin.x = newX; hasZoomed = NO; Assign(oldMiddleTime, nil); } newVisible.origin.x = (int)newVisible.origin.x; return newVisible; } - (void)windowDidResize:(NSNotification *)aNotification { [self adjustSize]; } - (void)setRulerUnit { NSString *unitName; NSString *unitAbbreviation; NSRulerView *ruler; double logUnitsToPoints; if (pointsPerSecond > 300000000) { timeUnitDivisor = 1000000000; unitName = @"nanoseconds"; unitAbbreviation = @"ns"; } else if (pointsPerSecond > 300000) { timeUnitDivisor = 1000000; unitName = @"microseconds"; unitAbbreviation = @"Mus"; } else if (pointsPerSecond > 300) { timeUnitDivisor = 1000; unitName = @"milliseconds"; unitAbbreviation = @"ms"; } else if (pointsPerSecond > 0.1) { timeUnitDivisor = 1; unitName = @"seconds"; unitAbbreviation = @"s"; } else if (pointsPerSecond > .001) { timeUnitDivisor = 1.0/3600.0; unitName = @"hours"; unitAbbreviation = @"h"; } else { timeUnitDivisor = 1.0/3600.0/24.0; unitName = @"days"; unitAbbreviation = @"d"; } logUnitsToPoints = log10(timeUnitDivisor/pointsPerSecond); int decimals; if (logUnitsToPoints > 0) { decimals = 0; } else { decimals = -logUnitsToPoints + 0.8; } NSString *format; format = [NSString stringWithFormat:@"%%.%df %@", decimals, unitAbbreviation]; Assign(cursorTimeFormat, format); ruler = [[self enclosingScrollView] horizontalRulerView]; if (ruler) { // sets ruler scale NSArray *upArray; NSArray *downArray; upArray = [NSArray arrayWithObjects: [NSNumber numberWithFloat:5.0], [NSNumber numberWithFloat:2.0], nil]; downArray = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.5], [NSNumber numberWithFloat:0.2], nil]; [NSRulerView registerUnitWithName:unitName abbreviation:unitAbbreviation unitToPointsConversionFactor:pointsPerSecond/timeUnitDivisor stepUpCycle:upArray stepDownCycle:downArray]; [ruler setMeasurementUnits:unitName]; } } - (void)removeFromSuperview { if (trackingRectTag != 0) { [self removeTrackingRect:trackingRectTag]; trackingRectTag = 0; } [super removeFromSuperview]; } // set tracking rect to visible rectangle of view. should be called any time // the view frame is changed - (void)resetTrackingRect { if ([self window] == nil) { return; } if (trackingRectTag != 0) { [self removeTrackingRect:trackingRectTag]; } trackingRectTag = [self addTrackingRect:[self visibleRect] owner:self userData:NULL assumeInside:NO]; } - (void)adjustSize { NSRect newBounds; NSScrollView *scrollView = [self enclosingScrollView]; NSRulerView *ruler = [scrollView horizontalRulerView]; id rootInstance = [filter rootInstance]; [self setRulerUnit]; [self performSelector:@selector(verifyTimes:) withObject:self afterDelay:0.0]; if (rootInstance != nil) { newBounds = [[controller rootLayout] rectOfInstance:rootInstance]; newBounds.origin.x = TIMEtoX(startTime); newBounds.size.width = TIMEtoX(endTime) - newBounds.origin.x + 3; newBounds.size.height += 1; [self setBoundsOrigin:newBounds.origin]; [self setFrameSize:newBounds.size]; [ruler setOriginOffset: TIMEtoX([NSDate dateWithTimeIntervalSinceReferenceDate:0])]; [scrollView tile]; [self resetTrackingRect]; } #ifdef __APPLE__ [self setNeedsDisplay:YES]; #endif } - (void)verifyTimes:sender { //FIXME: shouldn't be necessary; encapsulator should be more intelligent NSScrollView *scrollView = [self enclosingScrollView]; [filter verifyStartTime:/*startTime*/XtoTIME(NSMinX([self convertRect:[scrollView frame] fromView:scrollView])) endTime:XtoTIME(NSMaxX([self convertRect:[scrollView frame] fromView:scrollView]))]; } - (void)setFrame:(NSRect)frame { [super setFrame:frame]; [self resetTrackingRect]; } - (void)setBounds:(NSRect)bounds { [super setBounds:bounds]; [self resetTrackingRect]; } - (void)viewWillMoveToWindow:(NSWindow *)newWindow { if ([self window] != nil && trackingRectTag != 0) { [self removeTrackingRect:trackingRectTag]; trackingRectTag = 0; } [super viewWillMoveToWindow:newWindow]; [self resetTrackingRect]; } /* * Changing scales * ------------------------------------------------------------------------ */ - (void)adjustTimeLimits { NSDate *startTimeLimit; NSDate *endTimeLimit; NSDate *traceStartTime; NSDate *traceEndTime; traceStartTime = [controller startTime]; traceEndTime = [controller endTime]; if (oldMiddleTime != nil) { startTimeLimit = XtoTIME(TIMEtoX(oldMiddleTime) - 20000); } else { startTimeLimit = traceStartTime; } if ([startTimeLimit isEarlierThanDate:traceStartTime]) { startTimeLimit = traceStartTime; endTimeLimit = XtoTIME(TIMEtoX(startTimeLimit) + 40000); if ([endTimeLimit isLaterThanDate:traceEndTime]) { endTimeLimit = traceEndTime; } } else { endTimeLimit = XtoTIME(TIMEtoX(startTimeLimit) + 40000); if ([endTimeLimit isLaterThanDate:traceEndTime]) { endTimeLimit = traceEndTime; startTimeLimit = XtoTIME(TIMEtoX(endTimeLimit) - 40000); if ([startTimeLimit isEarlierThanDate:traceStartTime]) { startTimeLimit = traceStartTime; } } } Assign(startTime, startTimeLimit); Assign(endTime, endTimeLimit); NSDebugMLLog(@"tim", @"times=[%@ %@] trace=[%@ %@]", startTime, endTime, traceStartTime, traceEndTime); } - (void)setPointsPerSecond:(double)pps { pointsPerSecond = pps; [[NSUserDefaults standardUserDefaults] setDouble:pointsPerSecond forKey:DefaultsKey(@"PointsPerSecond")]; hasZoomed = YES; [self adjustTimeLimits]; [controller changedTimeScale]; } - (void)saveMiddleTime { if (startTime != nil) { Assign(oldMiddleTime, XtoTIME(NSMidX([self visibleRect]))); } } - (void)getPointsPerSecondFrom:(id)source { Assign(oldMiddleTime, XtoTIME(NSMidX([self visibleRect]))); [self setPointsPerSecond:[source doubleValue]]; } - (void)doubleTimeScale:sender { Assign(oldMiddleTime, XtoTIME(NSMidX([self visibleRect]))); [self setPointsPerSecond:pointsPerSecond * 2]; //[self performSelector:@selector(getPointsPerSecondFrom:) withObject:[NSNumber numberWithDouble:pointsPerSecond*1.1] afterDelay:0.1]; //[self performSelector:@selector(getPointsPerSecondFrom:) withObject:[NSNumber numberWithDouble:pointsPerSecond*1.5] afterDelay:0.2]; //[self performSelector:@selector(getPointsPerSecondFrom:) withObject:[NSNumber numberWithDouble:pointsPerSecond*2.0] afterDelay:0.3]; } - (void)halveTimeScale:sender { Assign(oldMiddleTime, XtoTIME(NSMidX([self visibleRect]))); [self setPointsPerSecond:pointsPerSecond / 2]; //[self performSelector:@selector(getPointsPerSecondFrom:) withObject:[NSNumber numberWithDouble:pointsPerSecond/1.1] afterDelay:0.1]; //[self performSelector:@selector(getPointsPerSecondFrom:) withObject:[NSNumber numberWithDouble:pointsPerSecond/1.5] afterDelay:0.2]; //[self performSelector:@selector(getPointsPerSecondFrom:) withObject:[NSNumber numberWithDouble:pointsPerSecond/2.0] afterDelay:0.3]; } - (void)zoomToSelection:sender { NSRect visible; if (!selectionExists) { return; } visible = [[self superview] frame]; Assign(oldMiddleTime, XtoTIME((TIMEtoX(selectionStartTime) + TIMEtoX(selectionEndTime)) / 2)); [self setPointsPerSecond: NSWidth(visible) / [selectionEndTime timeIntervalSinceDate:selectionStartTime]]; } - (IBAction)getSmallEntityWidthFrom:sender { smallEntityWidth = [sender intValue]; [self setNeedsDisplay:YES]; } - (double)pointsPerSecond { return pointsPerSecond; } - (NSDate *)startTime { return startTime; } - (double)timeToX:(NSDate *)t { if (startTime == nil) return 0; return TIMEtoX(t); } /* * Drawing * ------------------------------------------------------------------------ */ - (BOOL)isFlipped // y-axis is inverted (y-coords augment from top to bottom) { return YES; } - (BOOL)isOpaque // this view draws every pixel it owns { return YES; } - (void)redrawEntities:(NSArray *)entities { id eEnum, entity; if (entities != nil) { eEnum = [entities objectEnumerator]; while ((entity = [eEnum nextObject]) != nil) { [self setNeedsDisplayInRect:[self highlightRectForEntity:entity]]; } } } - (NSArray *)highlightedEntities { return highlightedEntities; } - (void)setHighlightedEntities:(NSArray *)entities // highlights entities, taking care of unhighlighting previous { if (highlightedEntities != nil) { [self redrawEntities:highlightedEntities]; } Assign(highlightedEntities, entities); if (highlightedEntities != nil) { [self redrawEntities:highlightedEntities]; } } - (void)setCursorEntity:(PajeEntity *)entity // highlights entity (and related entities), taking care of unhighlighting previous { if (entity == cursorEntity) { return; } Assign(cursorEntity, entity); if (cursorEntity != nil) { NSArray *related = [filter relatedEntitiesForEntity:cursorEntity]; [self setHighlightedEntities:[related arrayByAddingObject:cursorEntity]]; [entityNameField setStringValue:[filter descriptionForEntity:cursorEntity]]; } else { [self setHighlightedEntities:nil]; [entityNameField setStringValue:@""]; } } - (void)drawBackgroundInRect:(NSRect)rect // draws the background { // draw background [backgroundColor set]; NSRectFill(rect); // draw selection background if (selectionExists) { float selectionStart = TIMEtoX(selectionStartTime); float selectionWidth = TIMEtoX(selectionEndTime) - selectionStart; NSRect selectionRect = NSMakeRect(selectionStart, NSMinY(rect), selectionWidth, NSMaxY(rect)); #ifdef GNUSTEP // GNUstep can't draw big rects. selectionRect = NSIntersectionRect(selectionRect, cutRect); #endif [selectedBackgroundColor set]; NSRectFill(selectionRect); } } - (void)drawRect:(NSRect)rect { if ([self window] == nil) return; if (startTime == nil) return; [self verifyTimes:self]; rect = NSInsetRect(rect, -10, -10); #ifdef GNUSTEP // Big rectangles are not drawn by GNUstep. Cut them with cutRect. cutRect = NSInsetRect([self visibleRect], -200, -200); #endif NS_DURING // set blackground [self drawBackgroundInRect:rect]; [self drawInstance:[controller rootInstance] ofDescriptor:[controller rootLayout] inRect:rect]; [self drawHighlight]; NS_HANDLER NSLog(@"Ignoring exception caught inside drawRect: %@", localException); NS_ENDHANDLER //FIXME: put this in controller [EntityChunk emptyLeastRecentlyUsedChunks]; } /* * Selection control * ------------------------------------------------------------------------ */ - (BOOL)isPointInSelection:(NSPoint)point { NSDate *pointInTime; if (!selectionExists) { return NO; } pointInTime = XtoTIME(point.x); return [pointInTime isLaterThanDate:selectionStartTime] && [pointInTime isEarlierThanDate:selectionEndTime]; } - (void)timeSelectionChanged { NSRect redisplayRect; NSDate *newSelectionStartTime; NSDate *newSelectionEndTime; double ox1, ox2, nx1, nx2; newSelectionStartTime = [controller selectionStartTime]; newSelectionEndTime = [controller selectionEndTime]; ox1 = TIMEtoX(selectionStartTime); ox2 = TIMEtoX(selectionEndTime); nx1 = TIMEtoX(newSelectionStartTime); nx2 = TIMEtoX(newSelectionEndTime); if (newSelectionStartTime == nil || nx1 >= nx2) { if (selectionExists) { [self setNeedsDisplayFromX:ox1 toX:ox2]; Assign(selectionStartTime, nil); Assign(selectionEndTime, nil); selectionExists = NO; [zoomToSelectionButton setEnabled:NO]; } return; } if (!selectionExists) { Assign(selectionStartTime, newSelectionStartTime); Assign(selectionEndTime, newSelectionEndTime); selectionExists = YES; [zoomToSelectionButton setEnabled:YES]; [self setNeedsDisplayFromX:nx1 toX:nx2]; return; } if (ox2 < nx1 || nx2 < ox1) { [self setNeedsDisplayFromX:ox1 toX:ox2]; Assign(selectionStartTime, newSelectionStartTime); Assign(selectionEndTime, newSelectionEndTime); [self setNeedsDisplayFromX:nx1 toX:nx2]; return; } redisplayRect = [self visibleRect]; if (nx1 != ox1) { [self setNeedsDisplayFromX:MIN(nx1, ox1) toX:MAX(nx1, ox1)]; } if (nx2 != ox2) { [self setNeedsDisplayFromX:MIN(nx2, ox2) toX:MAX(nx2, ox2)]; } Assign(selectionStartTime, newSelectionStartTime); Assign(selectionEndTime, newSelectionEndTime); } - (void)changeSelectionWithPoint:(NSPoint)point { NSDate *cursorTime; NSRect frameRect = [self frame]; if (point.x < NSMinX(frameRect)) point.x = NSMinX(frameRect); if (point.x > NSMaxX(frameRect)) point.x = NSMaxX(frameRect); cursorTime = XtoTIME(point.x); [self setCursorTime:cursorTime]; if ([cursorTime isEarlierThanDate:selectionAnchorTime]) { [controller setSelectionStartTime:cursorTime endTime:selectionAnchorTime]; } else { [controller setSelectionStartTime:selectionAnchorTime endTime:cursorTime]; } // scroll point to visible NSRect visibleRect; visibleRect = [self visibleRect]; visibleRect.origin.x = point.x; visibleRect.size.width = 1; [self scrollRectToVisible:visibleRect]; } - (void)setNeedsDisplayFromX:(double)x1 toX:(double)x2 { NSRect redisplayRect = [self visibleRect]; redisplayRect.origin.x = x1; redisplayRect.size.width = x2 - x1; redisplayRect = NSIntegralRect(redisplayRect); [self setNeedsDisplayInRect:redisplayRect]; } - (void)selectAll:(id)sender { [controller setSelectionStartTime:startTime endTime:endTime]; } /* * Dragging control (NSDraggingDestination protocol) * ------------------------------------------------------------------------ */ - (NSDragOperation)draggingUpdated:(id )sender { NSPoint point = [self convertPoint:[sender draggingLocation] fromView:nil]; [self setCursorEntity:[self findEntityAtPoint:point]]; #ifdef GNUSTEP return NSDragOperationCopy; #else // if (cursorEntity) return NSDragOperationAll; // else // return NSDragOperationNone; #endif } #ifdef GNUSTEP // this shouldn't be needed (should be the default behaviour of NSView) - (BOOL) prepareForDragOperation: (id )sender { return YES; } #endif - (BOOL)performDragOperation:(id )sender { NSColor *draggedColor; NSPoint point = [self convertPoint:[sender draggingLocation] fromView:nil]; draggedColor = [NSColor colorFromPasteboard:[sender draggingPasteboard]]; if (draggedColor == nil) { return NO; } // if some entity is under the cursor, the color has been dropped over it. if (cursorEntity != nil) { [filter setColor:draggedColor forEntity:cursorEntity]; [self setCursorEntity:nil]; } else { // didn't drop on an entity, change background color if ([self isPointInSelection:point]) { [self setSelectedBackgroundColor:draggedColor]; } else { [self setBackgroundColor:draggedColor]; } } return YES; } /* * Printing * ------------------------------------------------------------------------ */ - (void)endPrologue /* * Spit out the custom PostScript defs. */ { [super endPrologue]; } @end Paje-1.98/SpaceTimeViewer/STController.h0000664000175000017500000000405411674062007020057 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _STController_h_ #define _STController_h_ #include #include "HierarchyRuler.h" @class DrawView; @class HierarchyRuler; @class STEntityTypeLayoutController; @interface STController: PajeFilter { IBOutlet NSScrollView *scrollView; IBOutlet NSWindow *window; IBOutlet DrawView *drawView; NSRulerView *timeRuler; HierarchyRuler *hierarchyRuler; STEntityTypeLayoutController *layoutController; NSMutableDictionary *layoutDescriptors; // STEntityTypeLayout[entity type] } - (id)initWithController:(PajeTraceController *)c; - (void)adjustInterface; - (void)print:(id)sender; - (NSArray *)layoutDescriptors; - (STEntityTypeLayout *)descriptorForEntityType:(PajeEntityType *)entityType; - (STContainerTypeLayout *)rootLayout; - (void)changedTimeScale; @end @interface STController (Positioning) - (NSRect)calcRectOfInstance:(id)entity ofLayoutDescriptor:(STContainerTypeLayout *)layoutDescriptor minY:(float)minY; - (NSRect)calcRectOfAllInstancesOfLayoutDescriptor:(STContainerTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container minY:(float)minY; @end #endif Paje-1.98/SpaceTimeViewer/drawline.psw0000664000175000017500000001253711674062007017661 0ustar schnorrschnorrdefineps PSInit() /l { % w h x y moveto rlineto } def /arrow { % x1 y1 r x2 y2 2 copy 5 index sub exch 6 index sub % stack= x1 y1 r x2 y2 y2-y1 x2-x1 2 copy 0 eq exch 0 eq and { pop pop pop pop pop pop pop } % do nothing if points are equal { atan % stack= x1 y1 r x2 y2 angle 3 1 roll newpath moveto % stack= x1 y1 r angle (currpt= x2 y2) % newpath 2 copy moveto % 3 index sub exch 4 index sub atan dup rotate % draw the triangle -7 2.5 rlineto 0 -2.5 rlineto currentpoint % save the point in the middle of the base 0 -2.5 rlineto closepath gsave 0 setlinejoin stroke grestore fill % stack= x1 y1 r angle xm ym moveto % the middle of the base dup neg rotate dup 360 add arc gsave stroke grestore fill % draw a dot at base of arrow } ifelse } def /a { % w h x y moveto 2 copy dup mul exch dup mul add sqrt % stack = w h length dup 0 eq { pop pop pop } { 3 1 roll % stack = l w h exch atan % stack = l angle rotate currentpoint % stack = l x y 3 -1 roll % stack = x y l 7 sub 0 rmoveto % stack = x y ; curr = base of triangle 0 2.5 rlineto % up 7 -2.5 rlineto % to arrow tip -7 -2.5 rlineto closepath % back down and to line 1.5 0 360 arc % main line and dot at start } ifelse } def /r { % w h x y r - makes the path of a rectangle moveto % w h dup 0 exch rlineto % w h exch 0 rlineto % h neg 0 exch rlineto closepath } def /rect { % x y w h 4 copy rectfill gsave 0 0 0 setrgbcolor rectstroke grestore } def /rectcolor { % x y w h r g b setrgbcolor 4 copy rectfill gsave 0 0 0 setrgbcolor rectstroke grestore } def /hrect { % x y w h 4 copy 4 copy rectfill rectstroke gsave % 0 0 0 setrgbcolor % [2 3] 0 setdash 1 1 1 setrgbcolor rectstroke grestore } def /t { % w h x y newpath moveto exch dup 2 div % stack= h w w/2 dup 0 rmoveto neg % stack= h w -w/2 3 -1 roll % stack= w -w/2 h rlineto 0 rlineto closepath } def % draws a pin /p { % w h x y newpath exch 4 -1 roll % h y x w 2 div dup dup 4 -1 roll % h y w/2 w/2 w/2 x add dup 4 index % h y w/2 w/2 x+w/2 x+w/2 y moveto % h y w/2 w/2 x+w/2 5 2 roll % w/2 x+w/2 h y w/2 sub add 3 -1 roll % x+w/2 y+h-w/2 w/2 -90 270 arc } def /triangle { % w h x y newpath moveto exch dup 2 div % stack= h w w/2 dup 0 rmoveto neg % stack= h w -w/2 3 -1 roll % stack= w -w/2 h rlineto 0 rlineto closepath gsave fill grestore gsave 0 0 0 setrgbcolor stroke grestore } def /htriangle { % w h x y newpath moveto exch dup 2 div neg % stack= h w -w/2 3 -1 roll % stack= w -w/2 h rlineto 0 rlineto closepath gsave fill grestore % 0.4 0.4 0.4 setrgbcolor 0.7 0.7 0.7 setrgbcolor stroke } def endps defineps PSLine(float x, y, w, h) w h x y l endps defineps PSStrokeLine(float x, y, w, h) w h x y l stroke endps defineps PSLineHit(float px, py, x1, y1, x2, y2 | boolean *hit) px py { x1 y1 x2 y2 setbbox x1 y1 moveto x2 y2 lineto } inustroke hit endps defineps PSoldArrow(float x1, y1, x2, y2) % [2 1] 0 setdash x1 y1 1.5 x2 y2 arrow endps defineps PSArrow(float x, y, w, h) % [2 1] 0 setdash w h x y a endps defineps PSRectcol(float r, g, b, x, y, w, h) x y w h r g b rectcolor endps defineps PSRect(float x, y, w, h) w h x y r endps defineps PSHRect(float x, y, w, h) x y w h hrect endps defineps PSRect2(float x, y, w, h) currentrgbcolor 0 0 0 setrgbcolor x y w h rectstroke setrgbcolor x y w h rectfill endps defineps PSPin(float x, y, w, h) w h x y p endps defineps PSTriangle(float x, y, w, h) w h x y t endps defineps PSHTriangle(float x, y, w, h) w h x y htriangle endps defineps PSUTriangle(float xl, xc, xr, yl, yu) { ucache xl yl xr yu setbbox xc yl moveto xl yu lineto xr yu lineto closepath } cvlit endps defineps PSDrawUserObject(userobject o; float x, y, w, h) gsave % w h scale x y translate o ufill 0 setgray o ustroke grestore endps defineps PSTriangleHit(float px, py, x, y, w, h | boolean *hit) px py % { % x y x w add y h add setbbox newpath x y moveto w 2 div neg h rlineto w 0 rlineto closepath % } infill hit endps defineps PSFillAndFrameBlack() gsave fill grestore 0 setgray stroke endps defineps PSFillAndFrameWhite() gsave fill grestore 1 setgray stroke endps defineps PSFrameWhite() 1 setgray stroke endps defineps PSFillAndDashedStrokeBlack() gsave fill grestore 0 setgray 2 setlinewidth [6 3 3 3 1 6] 0 setdash stroke endps defineps PSDashedStroke() [6 3 3 3 1 6] 0 setdash 2 setlinewidth stroke endps Paje-1.98/SpaceTimeViewer/SpaceTime.nib/0000775000175000017500000000000011674062007017732 5ustar schnorrschnorrPaje-1.98/SpaceTimeViewer/SpaceTime.nib/keyedobjects.nib0000664000175000017500000013237211674062007023107 0ustar schnorrschnorr $archiver NSKeyedArchiver $objects $null $class CF$UID 173 NSAccessibilityConnectors CF$UID 170 NSAccessibilityOidsKeys CF$UID 171 NSAccessibilityOidsValues CF$UID 172 NSClassesKeys CF$UID 143 NSClassesValues CF$UID 144 NSConnections CF$UID 8 NSFontManager CF$UID 0 NSFramework CF$UID 5 NSNamesKeys CF$UID 136 NSNamesValues CF$UID 137 NSNextOid 66 NSObjectsKeys CF$UID 133 NSObjectsValues CF$UID 135 NSOidsKeys CF$UID 145 NSOidsValues CF$UID 146 NSRoot CF$UID 2 NSVisibleWindows CF$UID 6 $class CF$UID 4 NSClassName CF$UID 3 STController $classes NSCustomObject NSObject $classname NSCustomObject IBCocoaFramework $class CF$UID 7 NS.objects $classes NSMutableArray NSArray NSObject $classname NSMutableArray $class CF$UID 7 NS.objects CF$UID 9 CF$UID 34 CF$UID 41 CF$UID 43 CF$UID 118 CF$UID 120 CF$UID 122 CF$UID 125 CF$UID 127 CF$UID 129 CF$UID 131 $class CF$UID 33 NSDestination CF$UID 16 NSLabel CF$UID 32 NSSource CF$UID 10 $class CF$UID 15 NSClassName CF$UID 13 NSExtension CF$UID 14 NSFrameSize CF$UID 12 NSNextResponder CF$UID 11 NSSuperview CF$UID 11 $class CF$UID 58 NSBGColor CF$UID 55 NSDocView CF$UID 10 NSFrame CF$UID 71 NSNextKeyView CF$UID 10 NSNextResponder CF$UID 68 NSSubviews CF$UID 70 NSSuperview CF$UID 68 NScvFlags 4 NSvFlags 2048 {1047, 148} DrawView NSView $classes NSCustomView NSView NSResponder NSObject $classname NSCustomView $class CF$UID 31 NSCell CF$UID 19 NSEnabled NSFrame CF$UID 18 NSNextResponder CF$UID 17 NSSuperview CF$UID 17 NSvFlags 268 $class CF$UID 104 NSFrame CF$UID 112 NSNextResponder CF$UID 0 NSSubviews CF$UID 50 {{174, 320}, {99, 21}} $class CF$UID 30 NSBackgroundColor CF$UID 24 NSCellFlags -2078277631 NSCellFlags2 0 NSContents CF$UID 20 NSControlView CF$UID 16 NSSupport CF$UID 21 NSTextColor CF$UID 29 0.0 $class CF$UID 23 NSName CF$UID 22 NSSize 11 NSfFlags 3100 LucidaGrande $classes NSFont NSObject $classname NSFont $class CF$UID 28 NSCatalogName CF$UID 25 NSColor CF$UID 27 NSColorName CF$UID 26 NSColorSpace 6 System textBackgroundColor $class CF$UID 28 NSColorSpace 3 NSWhite MQA= $classes NSColor NSObject $classname NSColor $class CF$UID 28 NSColorSpace 3 NSWhite MC4zMzMzMzI5OQA= $classes NSTextFieldCell NSActionCell NSCell NSObject $classname NSTextFieldCell $classes NSTextField %NSTextField NSControl NSView NSResponder NSObject $classname NSTextField cursorTimeField $classes NSNibOutletConnector NSNibConnector NSObject $classname NSNibOutletConnector $class CF$UID 33 NSDestination CF$UID 35 NSLabel CF$UID 40 NSSource CF$UID 10 $class CF$UID 31 NSCell CF$UID 37 NSEnabled NSFrame CF$UID 36 NSNextResponder CF$UID 17 NSSuperview CF$UID 17 NSvFlags 266 {{174, 301}, {599, 21}} $class CF$UID 30 NSBackgroundColor CF$UID 24 NSCellFlags -2078277631 NSCellFlags2 0 NSContents CF$UID 38 NSControlView CF$UID 35 NSSupport CF$UID 21 NSTextColor CF$UID 39 $class CF$UID 28 NSColorSpace 3 NSWhite MC4zMzMzMzI5OQA= entityNameField $class CF$UID 33 NSDestination CF$UID 2 NSLabel CF$UID 42 NSSource CF$UID 10 controller $class CF$UID 33 NSDestination CF$UID 44 NSLabel CF$UID 117 NSSource CF$UID 2 $class CF$UID 116 NSMaxSize CF$UID 115 NSMinSize CF$UID 114 NSScreenRect CF$UID 113 NSViewClass CF$UID 49 NSWTFlags 1886912512 NSWindowBacking 2 NSWindowClass CF$UID 48 NSWindowRect CF$UID 45 NSWindowStyleMask 14 NSWindowTitle CF$UID 46 NSWindowView CF$UID 17 {{84, 205}, {790, 358}} $class CF$UID 47 NS.string Window $classes NSMutableString NSString NSObject $classname NSMutableString $class CF$UID 47 NS.string NSWindow $class CF$UID 47 NS.string View $class CF$UID 7 NS.objects CF$UID 35 CF$UID 51 CF$UID 68 CF$UID 79 CF$UID 16 $class CF$UID 67 NSContentView CF$UID 53 NSFrameSize CF$UID 66 NSHScroller CF$UID 63 NSNextKeyView CF$UID 53 NSNextResponder CF$UID 17 NSSubviews CF$UID 52 NSSuperview CF$UID 17 NSVScroller CF$UID 59 NSsFlags 242 NSvFlags 256 $class CF$UID 7 NS.objects CF$UID 53 CF$UID 59 CF$UID 63 $class CF$UID 58 NSBGColor CF$UID 55 NSFrame CF$UID 54 NSNextResponder CF$UID 51 NSSuperview CF$UID 51 NScvFlags 4 NSvFlags 2048 {{1, 1}, {0, 0}} $class CF$UID 28 NSCatalogName CF$UID 25 NSColor CF$UID 57 NSColorName CF$UID 56 NSColorSpace 6 controlColor $class CF$UID 28 NSColorSpace 3 NSWhite MC42NjY2NjY2OQA= $classes NSClipView NSView NSResponder NSObject $classname NSClipView $class CF$UID 62 NSAction CF$UID 61 NSCurValue 1 NSEnabled NSFrame CF$UID 60 NSNextResponder CF$UID 51 NSSuperview CF$UID 51 NSTarget CF$UID 51 NSvFlags 256 {{1, 1}, {0, -15}} _doScroller: $classes NSScroller NSControl NSView NSResponder NSObject $classname NSScroller $class CF$UID 62 NSAction CF$UID 65 NSEnabled NSFrame CF$UID 64 NSNextResponder CF$UID 51 NSSuperview CF$UID 51 NSTarget CF$UID 51 NSsFlags 1 NSvFlags 256 {{1, 1}, {0, 0}} _doScroller: {0, 0} $classes NSScrollView NSView NSResponder NSObject $classname NSScrollView $class CF$UID 67 NSContentView CF$UID 11 NSFrameSize CF$UID 78 NSHScroller CF$UID 75 NSNextKeyView CF$UID 11 NSNextResponder CF$UID 17 NSSubviews CF$UID 69 NSSuperview CF$UID 17 NSVScroller CF$UID 72 NSsFlags 178 NSvFlags 274 $class CF$UID 7 NS.objects CF$UID 11 CF$UID 72 CF$UID 75 $class CF$UID 7 NS.objects CF$UID 10 {{1, 1}, {773, 268}} $class CF$UID 62 NSAction CF$UID 74 NSCurValue 0.68918919563293457 NSFrame CF$UID 73 NSNextResponder CF$UID 68 NSSuperview CF$UID 68 NSTarget CF$UID 68 NSvFlags 256 {{774, 1}, {15, 268}} _doScroller: $class CF$UID 62 NSAction CF$UID 77 NSEnabled NSFrame CF$UID 76 NSNextResponder CF$UID 68 NSPercent 0.7382999062538147 NSSuperview CF$UID 68 NSTarget CF$UID 68 NSsFlags 1 NSvFlags 256 {{1, 269}, {773, 15}} _doScroller: {790, 285} $class CF$UID 111 NSBorderType 0 NSBoxType 3 NSContentView CF$UID 81 NSFrame CF$UID 105 NSNextResponder CF$UID 17 NSOffsets CF$UID 106 NSSubviews CF$UID 80 NSSuperview CF$UID 17 NSTitleCell CF$UID 107 NSTitlePosition 0 NSTransparent NSvFlags 12 $class CF$UID 7 NS.objects CF$UID 81 $class CF$UID 104 NSFrameSize CF$UID 103 NSNextResponder CF$UID 79 NSSubviews CF$UID 82 NSSuperview CF$UID 79 $class CF$UID 7 NS.objects CF$UID 83 CF$UID 93 CF$UID 98 $class CF$UID 92 NSCell CF$UID 85 NSEnabled NSFrame CF$UID 84 NSNextResponder CF$UID 81 NSSuperview CF$UID 81 NSvFlags 256 {{0, -2}, {58, 56}} $class CF$UID 91 NSButtonFlags -2037628673 NSButtonFlags2 2 NSCellFlags 67239424 NSCellFlags2 134217728 NSContents CF$UID 38 NSControlView CF$UID 83 NSKeyEquivalent CF$UID 38 NSNormalImage CF$UID 87 NSPeriodicDelay 400 NSPeriodicInterval 75 NSSupport CF$UID 86 $class CF$UID 23 NSName CF$UID 22 NSSize 10 NSfFlags 16 $class CF$UID 90 NSClassName CF$UID 88 NSResourceName CF$UID 89 NSImage toselection $classes NSCustomResource %NSCustomResource NSObject $classname NSCustomResource $classes NSButtonCell %NSButtonCell NSActionCell NSCell NSObject $classname NSButtonCell $classes NSButton NSControl NSView NSResponder NSObject $classname NSButton $class CF$UID 92 NSCell CF$UID 95 NSEnabled NSFrame CF$UID 94 NSNextResponder CF$UID 81 NSSuperview CF$UID 81 NSvFlags 256 {{108, -2}, {58, 56}} $class CF$UID 91 NSButtonFlags -2037628673 NSButtonFlags2 2 NSCellFlags 67239424 NSCellFlags2 134217728 NSContents CF$UID 38 NSControlView CF$UID 93 NSKeyEquivalent CF$UID 38 NSNormalImage CF$UID 96 NSPeriodicDelay 400 NSPeriodicInterval 75 NSSupport CF$UID 86 $class CF$UID 90 NSClassName CF$UID 88 NSResourceName CF$UID 97 near $class CF$UID 92 NSCell CF$UID 100 NSEnabled NSFrame CF$UID 99 NSNextResponder CF$UID 81 NSSuperview CF$UID 81 NSvFlags 256 {{54, -2}, {58, 56}} $class CF$UID 91 NSButtonFlags -2037628673 NSButtonFlags2 2 NSCellFlags 67239424 NSCellFlags2 134217728 NSContents CF$UID 38 NSControlView CF$UID 98 NSKeyEquivalent CF$UID 38 NSNormalImage CF$UID 101 NSPeriodicDelay 400 NSPeriodicInterval 75 NSSupport CF$UID 86 $class CF$UID 90 NSClassName CF$UID 88 NSResourceName CF$UID 102 distant {166, 54} $classes NSView NSResponder NSObject $classname NSView {{8, 295}, {166, 54}} {0, 0} $class CF$UID 30 NSBackgroundColor CF$UID 24 NSCellFlags 67239424 NSCellFlags2 0 NSContents CF$UID 108 NSSupport CF$UID 109 NSTextColor CF$UID 110 Title $class CF$UID 23 NSName CF$UID 22 NSSize 11 NSfFlags 16 $class CF$UID 28 NSColorSpace 3 NSWhite MCAwLjgwMDAwMDAxAA== $classes NSBox NSView NSResponder NSObject $classname NSBox {{1, 9}, {790, 358}} {{0, 0}, {1280, 1002}} {213, 129} {3.40282e+38, 3.40282e+38} $classes NSWindowTemplate NSObject $classname NSWindowTemplate window $class CF$UID 33 NSDestination CF$UID 10 NSLabel CF$UID 119 NSSource CF$UID 2 drawView $class CF$UID 33 NSDestination CF$UID 68 NSLabel CF$UID 121 NSSource CF$UID 2 scrollView $class CF$UID 124 NSDestination CF$UID 10 NSLabel CF$UID 123 NSSource CF$UID 93 halveTimeScale: $classes NSNibControlConnector NSNibConnector NSObject $classname NSNibControlConnector $class CF$UID 124 NSDestination CF$UID 10 NSLabel CF$UID 126 NSSource CF$UID 98 doubleTimeScale: $class CF$UID 124 NSDestination CF$UID 10 NSLabel CF$UID 128 NSSource CF$UID 83 zoomToSelection: $class CF$UID 33 NSDestination CF$UID 83 NSLabel CF$UID 130 NSSource CF$UID 10 zoomToSelectionButton $class CF$UID 33 NSDestination CF$UID 98 NSLabel CF$UID 132 NSSource CF$UID 10 doubleTimeScaleButton $class CF$UID 134 NS.objects CF$UID 98 CF$UID 68 CF$UID 83 CF$UID 79 CF$UID 10 CF$UID 81 CF$UID 35 CF$UID 44 CF$UID 17 CF$UID 16 CF$UID 93 $classes NSArray NSObject $classname NSArray $class CF$UID 134 NS.objects CF$UID 81 CF$UID 17 CF$UID 81 CF$UID 17 CF$UID 68 CF$UID 79 CF$UID 17 CF$UID 2 CF$UID 44 CF$UID 17 CF$UID 81 $class CF$UID 134 NS.objects CF$UID 16 CF$UID 10 CF$UID 2 CF$UID 35 CF$UID 44 $class CF$UID 134 NS.objects CF$UID 138 CF$UID 139 CF$UID 140 CF$UID 141 CF$UID 142 TextField(0) View File's Owner TextField(2) Window $class CF$UID 134 NS.objects $class CF$UID 134 NS.objects $class CF$UID 134 NS.objects CF$UID 81 CF$UID 79 CF$UID 93 CF$UID 2 CF$UID 118 CF$UID 9 CF$UID 83 CF$UID 43 CF$UID 16 CF$UID 129 CF$UID 125 CF$UID 41 CF$UID 98 CF$UID 17 CF$UID 122 CF$UID 120 CF$UID 131 CF$UID 68 CF$UID 35 CF$UID 44 CF$UID 34 CF$UID 10 CF$UID 127 $class CF$UID 134 NS.objects CF$UID 147 CF$UID 148 CF$UID 149 CF$UID 150 CF$UID 151 CF$UID 152 CF$UID 153 CF$UID 154 CF$UID 155 CF$UID 156 CF$UID 157 CF$UID 158 CF$UID 159 CF$UID 160 CF$UID 161 CF$UID 162 CF$UID 163 CF$UID 164 CF$UID 165 CF$UID 166 CF$UID 167 CF$UID 168 CF$UID 169 63 62 56 1 50 40 54 49 37 60 58 45 55 32 57 53 61 52 39 31 42 33 59 $class CF$UID 7 NS.objects $class CF$UID 134 NS.objects $class CF$UID 134 NS.objects $classes NSIBObjectData NSObject $classname NSIBObjectData $top IB.objectdata CF$UID 1 $version 100000 Paje-1.98/SpaceTimeViewer/SpaceTime.nib/toselection.tiff0000664000175000017500000001303611674062007023137 0ustar schnorrschnorrMM*lTTTTTTTTTTTT %%udRSPaje-1.98/SpaceTimeViewer/SpaceTime.nib/near.tiff0000664000175000017500000001303611674062007021534 0ustar schnorrschnorrMM*lTTTTTT@@@@TTTTTT %%udRSPaje-1.98/SpaceTimeViewer/SpaceTime.nib/info.nib0000664000175000017500000000102211674062007021352 0ustar schnorrschnorr IBDocumentLocation 521 383 359 310 0 0 1280 1002 IBFramework Version 446.1 IBOpenItems IBOpenObjects 31 IBSystem Version 8P135 IBUsesTextArchiving Paje-1.98/SpaceTimeViewer/SpaceTime.nib/classes.nib0000664000175000017500000000341311674062007022062 0ustar schnorrschnorr{ IBClasses = ( { ACTIONS = { doubleTimeScale = id; getSmallEntityWidthFrom = id; halveTimeScale = id; zoomToSelection = id; }; CLASS = DrawView; LANGUAGE = ObjC; OUTLETS = { controller = id; cursorTimeField = id; doubleTimeScaleButton = id; entityNameField = id; oldMiddleTime = id; smallEntityWidth = id; timeUnitField = id; zoomButtonsMatrix = id; zoomToSelectionButton = id; }; SUPERCLASS = NSView; }, { ACTIONS = { doubleTimeScale = id; getSmallEntityWidthFrom = id; halveTimeScale = id; inputEntity = id; outputEntity = id; setConfiguration = id; zoomToSelection = id; }; CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {inputEntity = id; outputEntity = id; }; CLASS = PajeComponent; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {setConfiguration = id; }; CLASS = PajeFilter; LANGUAGE = ObjC; SUPERCLASS = PajeComponent; }, { ACTIONS = {print = id; }; CLASS = STController; LANGUAGE = ObjC; OUTLETS = {drawView = id; scrollView = id; window = id; }; SUPERCLASS = PajeFilter; } ); IBVersion = 1; }Paje-1.98/SpaceTimeViewer/SpaceTime.nib/distant.tiff0000664000175000017500000001303611674062007022255 0ustar schnorrschnorrMM*lTTTTTT@@@TTTTTT %%udRSPaje-1.98/SpaceTimeViewer/STController.m0000664000175000017500000002154711674062007020072 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* */ #include "STController.h" #include "DrawView.h" #include "STEntityTypeLayoutController.h" #include "../Paje/PajeTraceController.h" #include "../General/Macros.h" @implementation STController - (id)initWithController:(PajeTraceController *)c { self = [super initWithController:c]; if (self != nil) { if (![NSBundle loadNibNamed:@"SpaceTime" owner:self]) { NSRunAlertPanel(@"SpaceTime", @"Couldn't load interface file", @"Abort", nil, nil); //[self release]; //return nil; //} else { } [self adjustInterface]; //} layoutDescriptors = [[NSMutableDictionary alloc] init]; layoutController = [[STEntityTypeLayoutController alloc] initWithDelegate:self]; // register the tools with the controller [self registerTool:self]; [self registerTool:layoutController]; } return self; } - (void)dealloc { // super's implementation will grant disconnection #ifdef GNUSTEP // workaround GNUstep bug #13382 { int rc; rc = [drawView retainCount]; [drawView retain]; [hierarchyRuler release]; if ([drawView retainCount] > rc) { [drawView release]; } } #else [hierarchyRuler release]; #endif [super dealloc]; } - (void)disconnectComponent { Assign(layoutDescriptors, nil); Assign(layoutController, nil); [super disconnectComponent]; } // set some things that weren't set when main nib file was loaded - (void)adjustInterface { // set rulers [scrollView setHasVerticalRuler:YES]; hierarchyRuler = [[HierarchyRuler alloc] initWithScrollView:scrollView controller:self]; [scrollView setVerticalRulerView:hierarchyRuler]; [hierarchyRuler setClientView:drawView]; [scrollView setHasHorizontalRuler:YES]; [[scrollView horizontalRulerView] setClientView:drawView]; [[scrollView horizontalRulerView] setReservedThicknessForMarkers:0.0]; [scrollView setRulersVisible:NO/*YES*/]; [window setDelegate:self]; [window setFrameAutosaveName:@"SpaceTime"]; [window makeKeyAndOrderFront:self]; } - (void)windowDidBecomeKey:(NSNotification *)notification { // tell controller that we are key (to change filter menus) // TODO: find a cleaner way of doing this [controller windowIsKey]; } - (void)windowWillClose:(NSNotification *)notification { [controller removeComponent:self]; } - (void)windowDidResize:(NSNotification *)notification { [drawView windowDidResize:notification]; } - (NSString *)toolName { return @"Space Time Diagram"; } - (void)setInputComponent:(PajeFilter *)filter { [super setInputComponent:filter]; [drawView setFilter:self/*(PajeFilter *)filter*/]; } - (STEntityTypeLayout *)descriptorForEntityType:(PajeEntityType *)entityType { return [layoutDescriptors objectForKey:entityType]; } - (STEntityTypeLayout *)createDescriptorForEntityType:(PajeEntityType *)eType containerDescriptor:(STContainerTypeLayout *)cDesc { STEntityTypeLayout *layoutDescriptor; PajeDrawingType drawingType; NSEnumerator *subtypeEnum; PajeEntityType *subtype; drawingType = [self drawingTypeForEntityType:eType]; layoutDescriptor = [STEntityTypeLayout descriptorWithEntityType:eType drawingType:drawingType containerDescriptor:cDesc controller:self]; if (drawingType == PajeVariableDrawingType) { [(STVariableTypeLayout*)layoutDescriptor setMinValue:[self minValueForEntityType:eType]]; [(STVariableTypeLayout*)layoutDescriptor setMaxValue:[self maxValueForEntityType:eType]]; } [layoutDescriptors setObject:layoutDescriptor forKey:eType]; subtypeEnum = [[self containedTypesForContainerType:eType] objectEnumerator]; while ((subtype = [subtypeEnum nextObject]) != nil) { STEntityTypeLayout *subdescriptor; subdescriptor = [self createDescriptorForEntityType:subtype containerDescriptor:(STContainerTypeLayout *)layoutDescriptor]; } return layoutDescriptor; } - (STContainerTypeLayout *)rootLayout { id rootInstance; PajeEntityType *rootEntityType; STEntityTypeLayout *rootLayout; rootInstance = [self rootInstance]; rootEntityType = [self entityTypeForEntity:rootInstance]; rootLayout = [self descriptorForEntityType:rootEntityType]; return (STContainerTypeLayout *)rootLayout; } - (void)renewLayoutDescriptors { id rootInstance; PajeEntityType *rootEntityType; STContainerTypeLayout *rootLayout; [layoutDescriptors removeAllObjects]; rootInstance = [self rootInstance]; rootEntityType = [self entityTypeForEntity:rootInstance]; rootLayout = (STContainerTypeLayout *) [self createDescriptorForEntityType:rootEntityType containerDescriptor:nil]; [rootLayout setOffsets]; [self calcRectOfInstance:rootInstance ofLayoutDescriptor:rootLayout minY:0]; } - (NSArray *)layoutDescriptors { return [layoutDescriptors allValues]; } - (void)timeLimitsChanged { [self hierarchyChanged]; } - (void)hierarchyChanged { [window setTitleWithRepresentedFilename:[self nameForContainer:[self rootInstance]]]; if ([self startTime] == nil) return; [drawView saveMiddleTime]; [drawView adjustTimeLimits]; [self renewLayoutDescriptors]; [drawView adjustSize]; [hierarchyRuler refreshSizes]; [scrollView setRulersVisible:YES]; [drawView doubleTimeScale:self]; [drawView halveTimeScale:self]; [layoutController reset]; } - (void)dataChangedForEntityType:(PajeEntityType *)entityType { //FIXME // [self hierarchyChanged]; // return; [drawView saveMiddleTime]; [drawView adjustTimeLimits]; [[self rootLayout] setOffsets]; [self calcRectOfInstance:[self rootInstance] ofLayoutDescriptor:[self rootLayout] minY:0]; [drawView adjustSize]; [hierarchyRuler refreshSizes]; //[scrollView setNeedsDisplay:YES]; } - (void)limitsChangedForEntityType:(PajeEntityType *)entityType { STEntityTypeLayout *layoutDescriptor; layoutDescriptor = [layoutDescriptors objectForKey:entityType]; if (layoutDescriptor != nil && [layoutDescriptor drawingType] == PajeVariableDrawingType) { [(STVariableTypeLayout*)layoutDescriptor setMinValue:[self minValueForEntityType:entityType]]; [(STVariableTypeLayout*)layoutDescriptor setMaxValue:[self maxValueForEntityType:entityType]]; } // FIXME: redrawing could be limeted to rects of this entityType. [drawView setNeedsDisplay:YES]; } - (void)changedTimeScale { [self calcRectOfInstance:[self rootInstance] ofLayoutDescriptor:[self rootLayout] minY:0]; [drawView adjustSize]; } - (void)colorChangedForEntityType:(PajeEntityType *)entityType { [drawView setNeedsDisplay:YES]; } - (void)orderChangedForContainerType:(PajeEntityType *)containerType; { //FIXME [self hierarchyChanged]; } - (void)timeSelectionChanged { [drawView timeSelectionChanged]; } - (void)containerSelectionChanged { [drawView setNeedsDisplay:YES]; [hierarchyRuler setNeedsDisplay:YES]; } - (void)activateTool:(id)sender /* sent by PajeController when the user selects this Tool */ { [window makeKeyAndOrderFront:self]; } - (void)print:(id)sender { // [[NSPrintOperation printOperationWithView:[window contentView]] runOperation]; [window print:sender]; } - (BOOL)isSelectedEntity:(id)entity { id highlightedEntities; highlightedEntities = [drawView highlightedEntities]; if (highlightedEntities != nil) { if ([highlightedEntities containsObject:entity]) { return YES; } } return [super isSelectedEntity:entity]; } @end Paje-1.98/SpaceTimeViewer/DrawView+Finding.m0000664000175000017500000003540411674062007020577 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // DrawView+Finding // -------------- // methods for finding entities in DrawView. #include "DrawView.h" #include // returns a rectangle that is the same as rect but has positive height and width static NSRect positiveRect(NSRect rect) { if (rect.size.height < 0) { rect.origin.y += rect.size.height; rect.size.height *= -1; } if (rect.size.width < 0) { rect.origin.x += rect.size.width; rect.size.width *= -1; } return rect; } @implementation DrawView (Finding) /* * Finding Entities * ------------------------------------------------------------------------ */ BOOL line_hit(double px, double py, double x1, double y1, double x2, double y2) // returns YES if (px,py) lies over the line from (x1,y1) to (x2,y2) { double dx = px - x1; double dy = py - y1; double w = x2 - x1; double h = y2 - y1; if (fabs(w) > fabs(h)) { // horizontal line double ny; if (((dx * w) < 0) || (fabs(dx) > fabs(w))) return NO; ny = dx / w * h; if (fabs(ny - dy) <= 1) return YES; } else { // vertical line double nx; if (((dy * h) < 0) || (fabs(dy) > fabs(h))) return NO; nx = dy / h * w; if (fabs(nx - dx) <= 1) return YES; } return NO; } - (BOOL)isPoint:(NSPoint)p insideEntity:(PajeEntity *)entity // return YES if the pixel at point "p" would be painted by drawing "entity". { NSRect r; int hit; #ifndef GNUSTEP #ifndef __APPLE__ shapefunction *path; STEntityTypeLayout *entityDescriptor; #endif #endif if (![entity isKindOfClass:[PajeEntity class]]) return YES; // couldn't make PSinfill work with an arrow... switch ([filter drawingTypeForEntity:entity]) { case PajeLinkDrawingType: r = [self rectForEntity:entity]; hit = line_hit(p.x, p.y, NSMinX(r), NSMinY(r), NSMaxX(r), NSMaxY(r)); break; case PajeVariableDrawingType: r = [self rectForEntity:entity]; //hit = NSPointInRect(p, r); hit = p.x >= NSMinX(r) && p.x <= NSMaxX(r) && p.y >= NSMinY(r) && p.y <= NSMaxY(r); break; default: r = [self rectForEntity:entity]; #if defined(GNUSTEP) || defined(__APPLE__) // REVER ISSO hit = NSPointInRect(p, r); #else // test insideness with x=y=0, because PostScript has a problem with // insideness testing in big coordinates (>~10000) entityDescriptor = [self descriptorForEntityType: [filter entityTypeForEntity:entity]]; path = [[entityDescriptor shapeFunction] function]; PSgsave(); path(0, 0, NSWidth(r), NSHeight(r)); PSinfill(p.x - NSMinX(r), p.y - NSMinY(r), &hit); PSgrestore(); #endif } return hit; } - (PajeEntity *)findEntityAtPoint:(NSPoint)point // returns the entity that is drawn at "point", or nil if there isn't any. // if there is more than one entity, returns the one that is on top (the // last one to be drawn. { id rootInstance; STContainerTypeLayout *rootLayout; rootInstance = [filter rootInstance]; rootLayout = [controller rootLayout]; return [self entityAtPoint:point inInstance:rootInstance ofLayoutDescriptor:rootLayout]; } - (PajeEntity *)entityAtPoint:(NSPoint)point inEntityDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container { id findStartTime; id findEndTime; NSEnumerator *enumerator; // float closestDistance = MAXFLOAT; PajeEntity *closestEntity = nil; PajeEntity *entity; if ([layoutDescriptor drawingType] == PajeVariableDrawingType) { // return nil; } if (![layoutDescriptor isPoint:point inContainer:container]) { return nil; } float width; if ([layoutDescriptor drawingType] == PajeEventDrawingType) { width = [(STEventTypeLayout *)layoutDescriptor width]; } else { width = 1; } findStartTime = XtoTIME(point.x - width); findEndTime = XtoTIME(point.x + width); enumerator = [filter enumeratorOfEntitiesTyped:[layoutDescriptor entityType] inContainer:container fromTime:findStartTime toTime:findEndTime minDuration:SMALL_ENTITY_DURATION]; while ((entity = [enumerator nextObject]) != nil) { if ([self isPoint:point insideEntity:entity]) { closestEntity = entity; } } return closestEntity; } - (PajeEntity *)entityAtPoint:(NSPoint)point inInstance:(id)instance ofLayoutDescriptor:(STContainerTypeLayout *)layoutDescriptor { NSEnumerator *sublayoutEnum; STEntityTypeLayout *sublayout; PajeEntity *entity; // search instances of each subhierarchy // (in reverse order, to find what's been drawn on top first) sublayoutEnum = [[layoutDescriptor subtypes] reverseObjectEnumerator]; while ((sublayout = [sublayoutEnum nextObject]) != nil) { entity = [self entityAtPoint:point layoutDescriptor:sublayout inContainer:instance]; if (entity != nil) { break; } } return entity; } - (PajeEntity *)entityAtPoint:(NSPoint)point layoutDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container { PajeEntity *entity = nil; if (![layoutDescriptor isPoint:point inContainer:container]) { return nil; } if (![layoutDescriptor isContainer]) { entity = [self entityAtPoint:point inEntityDescriptor:layoutDescriptor inContainer:container]; } else { id instance; STContainerTypeLayout *layout; layout = (STContainerTypeLayout *)layoutDescriptor; instance = [layout instanceWithPoint:point]; if (instance != nil) { entity = [self entityAtPoint:point inInstance:instance ofLayoutDescriptor:layout]; } } return entity; } - (NSArray *)findEntitiesAtPoint:(NSPoint)point // returns the entities that are drawn at "point", or nil if there isn't any. { id rootInstance; STContainerTypeLayout *rootLayout; rootInstance = [filter rootInstance]; rootLayout = [controller rootLayout]; return [self entitiesAtPoint:point inInstance:rootInstance ofLayoutDescriptor:rootLayout]; } - (NSArray *)entitiesAtPoint:(NSPoint)point inEntityDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container { NSDate *findStartTime; NSDate *findEndTime; NSEnumerator *enumerator; PajeEntity *entity; NSMutableArray *array; // if ([layoutDescriptor drawingType] == PajeVariableDrawingType) { // return nil; // } if (![layoutDescriptor isPoint:point inContainer:container]) { return nil; } array = [NSMutableArray array]; float width; if ([layoutDescriptor drawingType] == PajeEventDrawingType) { width = [(STEventTypeLayout *)layoutDescriptor width]; } else { width = 0; } findStartTime = XtoTIME(point.x - width); findEndTime = XtoTIME(point.x + width); enumerator = [filter enumeratorOfEntitiesTyped:[layoutDescriptor entityType] inContainer:container fromTime:findStartTime toTime:findEndTime minDuration:SMALL_ENTITY_DURATION]; while ((entity = [enumerator nextObject]) != nil) { if ([self isPoint:point insideEntity:entity]) { [array addObject:entity]; } } return array; } - (NSArray *)entitiesAtPoint:(NSPoint)point inInstance:(id)instance ofLayoutDescriptor:(STContainerTypeLayout *)layoutDescriptor { NSEnumerator *sublayoutEnum; STEntityTypeLayout *sublayout; NSArray *entities; NSMutableArray *array; array = [NSMutableArray array]; // search instances of each subhierarchy // (in reverse order, to find what's been drawn on top first) sublayoutEnum = [[layoutDescriptor subtypes] reverseObjectEnumerator]; while ((sublayout = [sublayoutEnum nextObject]) != nil) { entities = [self entitiesAtPoint:point layoutDescriptor:sublayout inContainer:instance]; if (entities != nil) { [array addObjectsFromArray:entities]; } } return array; } - (NSArray *)entitiesAtPoint:(NSPoint)point layoutDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container { NSArray *entities = nil; if (![layoutDescriptor isPoint:point inContainer:container]) { return nil; } if (![layoutDescriptor isContainer]) { entities = [self entitiesAtPoint:point inEntityDescriptor:layoutDescriptor inContainer:container]; } else { id instance; STContainerTypeLayout *layout; layout = (STContainerTypeLayout *)layoutDescriptor; instance = [layout instanceWithPoint:point]; if (instance != nil) { entities = [self entitiesAtPoint:point inInstance:instance ofLayoutDescriptor:layout]; } } return entities; } - (NSRect)rectForEntity:(PajeEntity *)entity { float x1, x2, y1, y2, min, max, scale, offset; NSRect rect, rect1, rect2; id entityType; int imbricationLevel; float newHeight; STEntityTypeLayout *layoutDescriptor; id link; PajeContainer *sourceContainer; PajeContainer *destContainer; STContainerTypeLayout *containerDescriptor; if (entity == nil) return NSZeroRect; entityType = [filter entityTypeForEntity:entity]; layoutDescriptor = [controller descriptorForEntityType:entityType]; switch ([layoutDescriptor drawingType]) { case PajeEventDrawingType: rect = [layoutDescriptor rectInContainer: [filter containerForEntity:entity]]; rect.origin.x = TIMEtoX([filter timeForEntity:entity]); //rect.size.height = [layoutDescriptor height]; rect.size.width = [(STEventTypeLayout *)layoutDescriptor width]; rect.origin.x -= rect.size.width * (1 - [[layoutDescriptor shapeFunction] rightExtension]); //rect.origin.y -= rect.size.height // * ([[layoutDescriptor shapeFunction] topExtension]); break; case PajeStateDrawingType: rect.origin.y = [layoutDescriptor yInContainer:[filter containerForEntity:entity]]; rect.size.height = [layoutDescriptor height]; x1 = TIMEtoX([filter startTimeForEntity:entity]); x2 = TIMEtoX([filter endTimeForEntity:entity]); rect.origin.x = x1; rect.size.width = (x2 - x1); imbricationLevel = [filter imbricationLevelForEntity:entity]; newHeight = rect.size.height - [(STStateTypeLayout *)layoutDescriptor insetAmount] * imbricationLevel; if (newHeight < 2) newHeight = 2; if (newHeight < rect.size.height) rect.size.height = newHeight; break; case PajeVariableDrawingType: x1 = TIMEtoX([filter startTimeForEntity:entity]); x2 = TIMEtoX([filter endTimeForEntity:entity]); min = [filter minValueForEntityType:entityType]; max = [filter maxValueForEntityType:entityType]; if (min != max) { scale = -([layoutDescriptor height] - 4) / (max - min); } else { scale = 1; } offset = [layoutDescriptor yInContainer:[filter containerForEntity:entity]] + 2 - max * scale; y1 = max/*[filter doubleValueForEntity:entity]*/ * scale + offset; y2 = min * scale + offset; rect.origin.x = x1; rect.size.width = (x2 - x1); rect.origin.y = y1; rect.size.height = y2 - y1; break; case PajeLinkDrawingType: link = (id )entity; sourceContainer = [filter sourceContainerForEntity:link]; destContainer = [filter destContainerForEntity:link]; containerDescriptor = (STContainerTypeLayout *)[controller descriptorForEntityType:[filter sourceEntityTypeForEntity:link]]; rect1 = [containerDescriptor rectOfInstance:sourceContainer]; x1 = TIMEtoX([filter startTimeForEntity:link]); y1 = NSMinY(rect1) + [containerDescriptor linkOffset]; containerDescriptor = (STContainerTypeLayout *)[controller descriptorForEntityType:[filter destEntityTypeForEntity:link]]; rect2 = [containerDescriptor rectOfInstance:destContainer]; x2 = TIMEtoX([filter endTimeForEntity:link]); y2 = NSMinY(rect2) + [containerDescriptor linkOffset]; rect.origin.x = x1; rect.size.width = (x2 - x1); rect.origin.y = y1; rect.size.height = (y2 - y1); break; default: rect = NSZeroRect; } return rect; } - (NSRect)drawRectForEntity:(PajeEntity *)entity { NSRect rect; rect = positiveRect([self rectForEntity:entity]); return rect; } - (NSRect)highlightRectForEntity:(PajeEntity *)entity { NSRect rect; rect = positiveRect([self rectForEntity:entity]); rect = NSInsetRect(rect, -13, -13); // should be 10+lineWidth return rect; } @end Paje-1.98/SpaceTimeViewer/crosscursor.tiff0000664000175000017500000000250611674062007020555 0ustar schnorrschnorrII* 2 @6>(R/home/benhur/Paje/SpaceTime.bproj/crosscursor.tifCreated with The GIMPHHPaje-1.98/SpaceTimeViewer/STEntityTypeLayoutController.m0000664000175000017500000000762711674062007023332 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "STEntityTypeLayoutController.h" #include "STEntityTypeLayout.h" #include "DrawView.h" #include "../General/Macros.h" @implementation STEntityTypeLayoutController - (id)initWithDelegate:(id)del { self = [super init]; if (self) { delegate = del; } return self; } - (void)dealloc { [super dealloc]; } - (NSString *)toolName { return @"Shapes & sizes"; } - (void)activateTool:(id)sender /* sent by PajeController when the user selects this Tool */ { if (entityTypePopUp == nil) { if (![NSBundle loadNibNamed:@"STEntityTypeLayout" owner:self]) { NSRunAlertPanel(@"EntityTypeLayoutController", @"Couldn't load interface file", nil, nil, nil); return; } [self reset]; } [[entityTypePopUp window] orderFront:self]; } - (void)reset { NSEnumerator *enumerator; STEntityTypeLayout *item; [entityTypePopUp removeAllItems]; enumerator = [[delegate layoutDescriptors] objectEnumerator]; while ((item = [enumerator nextObject]) != nil) { if ([item isContainer]) continue; [entityTypePopUp addItemWithTitle:[item description]]; [[entityTypePopUp lastItem] setRepresentedObject:item]; } enumerator = [[delegate layoutDescriptors] objectEnumerator]; while ((item = [enumerator nextObject]) != nil) { if (![item isContainer]) continue; [entityTypePopUp addItemWithTitle:[item description]]; [[entityTypePopUp lastItem] setRepresentedObject:item]; } [entityTypePopUp selectItemAtIndex:0]; [self entityTypeSelected:self]; } - (STEntityTypeLayout *)selectedLayoutDescriptor { return [[entityTypePopUp selectedItem] representedObject]; } - (void)layoutEdited { STEntityTypeLayout *layoutDescriptor; layoutDescriptor = [self selectedLayoutDescriptor]; [delegate dataChangedForEntityType:[layoutDescriptor entityType]]; } - (void)setView:(NSView *)view { if (currentView == view) { return; } [currentView removeFromSuperview]; currentView = view; [[entityTypePopUp superview] addSubview:currentView]; } - (void)entityTypeSelected:(id)sender { STEntityTypeLayout *layoutDescriptor; PajeDrawingType drawingType; STLayoutEditor *layoutEditor; layoutDescriptor = [self selectedLayoutDescriptor]; drawingType = [layoutDescriptor drawingType]; switch (drawingType) { case PajeEventDrawingType : layoutEditor = eventEditor; break; case PajeStateDrawingType : layoutEditor = stateEditor; break; case PajeLinkDrawingType : layoutEditor = linkEditor; break; case PajeVariableDrawingType : layoutEditor = variableEditor; break; case PajeContainerDrawingType : layoutEditor = containerEditor; break; default: NSAssert1(0, @"Invalid drawing type %d", drawingType); } [self setView:[layoutEditor view]]; [layoutEditor setLayoutDescriptor:layoutDescriptor]; } @end Paje-1.98/SpaceTimeViewer/STLayoutEditor.m0000664000175000017500000004140411674062007020365 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "STEntityTypeLayoutController.h" #include "STEntityTypeLayout.h" #include "DrawView.h" #include "../General/Macros.h" @interface ShapeImageRep : NSCustomImageRep { id function; } - (id)function; - (void)setFunction:(id)f; @end @implementation ShapeImageRep - (void)dealloc { Assign(function, nil); [super dealloc]; } - (id)function { return function; } - (void)setFunction:(id)f { Assign(function, f); } @end @implementation STLayoutEditor - (void)awakeFromNib { [box retain]; } - (void)dealloc { [box release]; [super dealloc]; } - (NSView *)view { return box; } - (void)setController:(STEntityTypeLayoutController *)c { controller = c; } - (void)setLayoutDescriptor:(STEntityTypeLayout *)d { [self _subclassResponsibility:_cmd]; } - (STEntityTypeLayout *)layoutDescriptor { [self _subclassResponsibility:_cmd]; return nil; } @end @implementation STContainerLayoutEditor - (void)setLayoutDescriptor:(STEntityTypeLayout *)descriptor { NSParameterAssert([descriptor isKindOfClass:[STContainerTypeLayout class]]); layoutDescriptor = (STContainerTypeLayout *)descriptor; [siblingSeparationField setFloatValue:[layoutDescriptor siblingSeparation]]; [siblingSeparationStepper setFloatValue:[layoutDescriptor siblingSeparation]]; [subtypeSeparationField setFloatValue:[layoutDescriptor subtypeSeparation]]; [subtypeSeparationStepper setFloatValue:[layoutDescriptor subtypeSeparation]]; [heightForVariablesField setFloatValue:[layoutDescriptor heightForVariables]]; [heightForVariablesStepper setFloatValue:[layoutDescriptor heightForVariables]]; } - (IBAction)siblingSeparationChanged:(id)sender { [layoutDescriptor setSiblingSeparation:[sender floatValue]]; [siblingSeparationField setFloatValue:[layoutDescriptor siblingSeparation]]; [siblingSeparationStepper setFloatValue:[layoutDescriptor siblingSeparation]]; [controller layoutEdited]; } - (IBAction)subtypeSeparationChanged:(id)sender { [layoutDescriptor setSubtypeSeparation:[sender floatValue]]; [subtypeSeparationField setFloatValue:[layoutDescriptor subtypeSeparation]]; [subtypeSeparationStepper setFloatValue:[layoutDescriptor subtypeSeparation]]; [controller layoutEdited]; } - (IBAction)heightForVariablesChanged:(id)sender { [layoutDescriptor setHeightForVariables:[sender floatValue]]; [heightForVariablesField setFloatValue:[layoutDescriptor heightForVariables]]; [heightForVariablesStepper setFloatValue:[layoutDescriptor heightForVariables]]; [controller layoutEdited]; } @end @implementation STVariableLayoutEditor - (STEntityTypeLayout *)layoutDescriptor { return layoutDescriptor; } - (void)setLayoutDescriptor:(STEntityTypeLayout *)descriptor { NSParameterAssert([descriptor isKindOfClass:[STVariableTypeLayout class]]); layoutDescriptor = (STVariableTypeLayout *)descriptor; [self setupShapeMatrix]; [self setupDrawMatrices]; [lineWidthField setFloatValue:[layoutDescriptor lineWidth]]; [lineWidthStepper setFloatValue:[layoutDescriptor lineWidth]]; [showMinMaxSwitch setState:[layoutDescriptor showMinMax]]; } - (IBAction)lineWidthChanged:(id)sender { [layoutDescriptor setLineWidth:[sender floatValue]]; [lineWidthField setFloatValue:[layoutDescriptor lineWidth]]; [lineWidthStepper setFloatValue:[layoutDescriptor lineWidth]]; [controller layoutEdited]; } - (IBAction)showMinMaxChanged:(id)sender { [layoutDescriptor setShowMinMax:[sender state]]; [controller layoutEdited]; } - (NSRect)rectForImageOfSize:(NSSize)size { return NSMakeRect(0, 0, size.width, size.height); } - (void)drawShape:(ShapeImageRep *)image { shapefunction *pathFunction; drawfunction *drawFunction; NSRect rect; NSBezierPath *path; pathFunction = [(ShapeFunction *)[image function] function]; drawFunction = [[self selectedDrawFunction] function]; if (drawFunction == NULL) { drawFunction = [[DrawFunction drawFunctionWithName:@"PSFillAndFrameBlack"] function]; } rect = [self rectForImageOfSize:[image size]]; path = [NSBezierPath bezierPath]; //pathFunction(path, rect); [path moveToPoint:NSMakePoint(NSMaxX(rect)+5, NSMidY(rect))]; pathFunction(path, NSMakeRect(40, 15, 10, 0)); pathFunction(path, NSMakeRect(30, 15, 10, 0)); pathFunction(path, NSMakeRect(20, 10, 10, 0)); pathFunction(path, NSMakeRect(15, 30, 5, 0)); pathFunction(path, NSMakeRect(3, 10, 12, 0)); pathFunction(path, NSMakeRect(-10, 10, 13, 0)); //[path moveToPoint:NSMakePoint(0,0)]; //[path lineToPoint:NSMakePoint(10,20)]; //[self flipPath:path height:[image size].height]; drawFunction(path, [NSColor brownColor]); } - (void)drawDraw:(ShapeImageRep *)image { shapefunction *pathFunction; drawfunction *drawFunction; NSRect rect; NSBezierPath *path; pathFunction = [[self selectedShapeFunction] function]; drawFunction = [(DrawFunction *)[image function] function]; if (pathFunction == NULL) { pathFunction = [[ShapeFunction shapeFunctionWithName:@"PSRect"] function]; } rect = [self rectForImageOfSize:[image size]]; path = [NSBezierPath bezierPath]; //pathFunction(path, rect); [path moveToPoint:NSMakePoint(NSMaxX(rect), NSMidY(rect))]; pathFunction(path, NSMakeRect(40, 15, 10, 0)); pathFunction(path, NSMakeRect(30, 15, 10, 0)); pathFunction(path, NSMakeRect(20, 10, 10, 0)); pathFunction(path, NSMakeRect(15, 30, 5, 0)); pathFunction(path, NSMakeRect(3, 10, 12, 0)); pathFunction(path, NSMakeRect(-10, 10, 13, 0)); //[path moveToPoint:NSMakePoint(0,0)]; //[path lineToPoint:NSMakePoint(10,20)]; //[self flipPath:path height:[image size].height]; drawFunction(path, [[NSColor brownColor] highlightWithLevel:.2]); } @end @implementation STShapedLayoutEditor - (NSRect)rectForImageOfSize:(NSSize)size { [self _subclassResponsibility:_cmd]; return NSZeroRect; } - (ShapeFunction *)selectedShapeFunction { return [(NSCell *)[shapeMatrix selectedCell] representedObject]; } - (DrawFunction *)selectedDrawFunction { return [(NSCell *)[drawMatrix selectedCell] representedObject]; } - (void)setupShapeMatrix { ShapeImageRep *imageRep; NSImage *image; NSSize size = [shapeMatrix cellSize]; int col = 0; STEntityTypeLayout *layoutDescriptor; NSEnumerator *shapeFunctionsEnumerator; ShapeFunction *shapeFunction; ShapeFunction *selectedShapeFunction; NSArray *shapeFunctions; layoutDescriptor = [self layoutDescriptor]; selectedShapeFunction = [layoutDescriptor shapeFunction]; shapeFunctions = [ShapeFunction shapeFunctionsForDrawingType: [layoutDescriptor drawingType]]; [shapeMatrix renewRows:1 columns:[shapeFunctions count]]; shapeFunctionsEnumerator = [shapeFunctions objectEnumerator]; while ((shapeFunction = [shapeFunctionsEnumerator nextObject]) != nil) { NSButtonCell *cell; imageRep = [[[ShapeImageRep alloc] initWithDrawSelector:@selector(drawShape:) delegate:self] autorelease]; [imageRep setFunction:shapeFunction]; image = [[[NSImage allocWithZone:[self zone]] initWithSize:size] autorelease]; #ifdef GNUSTEP [imageRep setSize:size]; #endif [image addRepresentation:imageRep]; [image setBackgroundColor:[NSColor clearColor]]; cell = [shapeMatrix cellAtRow:0 column:col]; [cell setImage:image]; [cell setRepresentedObject:shapeFunction]; [cell setButtonType:NSOnOffButton]; if (selectedShapeFunction == shapeFunction) { [shapeMatrix selectCellAtRow:0 column:col]; } col++; } [shapeMatrix sizeToCells]; #ifdef GNUSTEP // GNUSTEP BUG: when a view becomes smaller, superview is not redisplayed [shapeMatrix setNeedsDisplay:YES]; #endif } - (void)setupDrawMatrices { ShapeImageRep *imageRep; NSImage *image; NSSize size = [drawMatrix cellSize]; STEntityTypeLayout *layoutDescriptor; NSArray *drawFunctions; NSEnumerator *drawFunctionsEnumerator; DrawFunction *drawFunction; DrawFunction *selectedDrawFunction; int col = 0; layoutDescriptor = [self layoutDescriptor]; selectedDrawFunction = [layoutDescriptor drawFunction]; drawFunctions = [DrawFunction drawFunctions]; [drawMatrix renewRows:1 columns:[drawFunctions count]]; drawFunctionsEnumerator = [drawFunctions objectEnumerator]; while ((drawFunction = [drawFunctionsEnumerator nextObject]) != nil) { NSButtonCell *drawCell; imageRep = [[[ShapeImageRep alloc] initWithDrawSelector:@selector(drawDraw:) delegate:self] autorelease]; [imageRep setFunction:drawFunction]; image = [NSImage allocWithZone:[self zone]]; [[image initWithSize:size] autorelease]; #ifdef GNUSTEP [imageRep setSize:size]; #endif [image addRepresentation:imageRep]; [image setBackgroundColor:[NSColor clearColor]]; drawCell = [drawMatrix cellAtRow:0 column:col]; [drawCell setImage:image]; [drawCell setRepresentedObject:drawFunction]; [drawCell setButtonType:NSOnOffButton]; if (selectedDrawFunction == drawFunction) { [drawMatrix selectCellAtRow:0 column:col]; } col++; } [drawMatrix sizeToCells]; #ifdef GNUSTEP [drawMatrix setNeedsDisplay:YES]; #endif } - (void)flipPath:(NSBezierPath *)path height:(float)height { NSAffineTransform *transform; transform = [NSAffineTransform transform]; [transform translateXBy:0 yBy:height]; [transform scaleXBy:1 yBy:-1]; [path transformUsingAffineTransform:transform]; } - (void)drawShape:(ShapeImageRep *)image { STEntityTypeLayout *layoutDescriptor; shapefunction *pathFunction; drawfunction *drawFunction; NSRect rect; NSBezierPath *path; layoutDescriptor = [self layoutDescriptor]; pathFunction = [(ShapeFunction *)[image function] function]; drawFunction = [[self selectedDrawFunction] function]; if (drawFunction == NULL) { drawFunction = [[DrawFunction drawFunctionWithName:@"PSFillAndFrameBlack"] function]; } rect = [self rectForImageOfSize:[image size]]; path = [NSBezierPath bezierPath]; pathFunction(path, rect); [self flipPath:path height:[image size].height]; drawFunction(path, [NSColor brownColor]); } - (void)drawDraw:(ShapeImageRep *)image { STEntityTypeLayout *layoutDescriptor; shapefunction *pathFunction; drawfunction *drawFunction; NSRect rect; NSBezierPath *path; layoutDescriptor = [self layoutDescriptor]; pathFunction = [[self selectedShapeFunction] function]; drawFunction = [(DrawFunction *)[image function] function]; if (pathFunction == NULL) { pathFunction = [[ShapeFunction shapeFunctionWithName:@"PSRect"] function]; } rect = [self rectForImageOfSize:[image size]]; path = [NSBezierPath bezierPath]; pathFunction(path, rect); [self flipPath:path height:[image size].height]; drawFunction(path, [[NSColor brownColor] highlightWithLevel:.2]); } - (void)recacheAll { NSInteger i, count, x; [shapeMatrix getNumberOfRows:&x columns:&count]; for (i=0; i size.height - 10) { h = size.height - 10; } y = size.height / 2 - h / 2; return NSMakeRect(x, y, w, h); } - (void)setLayoutDescriptor:(STEntityTypeLayout *)descriptor { NSParameterAssert([descriptor isKindOfClass:[STStateTypeLayout class]]); layoutDescriptor = (STStateTypeLayout *)descriptor; [self setupShapeMatrix]; [self setupDrawMatrices]; [heightField setFloatValue:[layoutDescriptor height]]; [heightStepper setFloatValue:[layoutDescriptor height]]; [insetAmountField setFloatValue:[layoutDescriptor insetAmount]]; [insetAmountStepper setFloatValue:[layoutDescriptor insetAmount]]; [displayValueSwitch setState:[layoutDescriptor drawsName]]; } - (IBAction)heightChanged:(id)sender { [layoutDescriptor setHeight:[sender floatValue]]; [heightField setFloatValue:[layoutDescriptor height]]; [heightStepper setFloatValue:[layoutDescriptor height]]; [self recacheAll]; } - (IBAction)insetAmountChanged:(id)sender { [layoutDescriptor setInsetAmount:[sender floatValue]]; [insetAmountField setFloatValue:[layoutDescriptor insetAmount]]; [insetAmountStepper setFloatValue:[layoutDescriptor insetAmount]]; [self recacheAll]; } - (IBAction)displayValueChanged:(id)sender { [layoutDescriptor setDrawsName:[sender state]]; [self recacheAll]; } @end Paje-1.98/SpaceTimeViewer/toselection.tiff0000664000175000017500000001303611674062007020516 0ustar schnorrschnorrMM*lTTTTTTTTTTTT %%udRSPaje-1.98/SpaceTimeViewer/near.tiff0000664000175000017500000001303611674062007017113 0ustar schnorrschnorrMM*lTTTTTT@@@@TTTTTT %%udRSPaje-1.98/SpaceTimeViewer/DrawView.h0000664000175000017500000001671311674062007017222 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _DrawView_h_ #define _DrawView_h_ /* * DrawView.h * * a View that knows how to draw lines * * 19960120 BS creation * 19960212 BS clean-up * 19980418 BS major change in internal organization * added description of entities, to ease the addition of * new entity types. */ #include #include "STEntityTypeLayout.h" #include "../General/Protocols.h" #include "../General/PajeFilter.h" #include "STController.h" @class STController; @interface DrawView: NSView { IBOutlet NSTextField *cursorTimeField; // TextField to show the time where the cursor is NSString *cursorTimeFormat; IBOutlet NSTextField *entityNameField; // TextField for the name of the entity under cursor IBOutlet NSButton *doubleTimeScaleButton; IBOutlet NSButton *zoomToSelectionButton; PajeFilter *filter; // The filter component connected to us IBOutlet STController *controller; double pointsPerSecond; // current time scale double timeUnitDivisor; // conversion between seconds and current time unit BOOL hasZoomed; // used internally during a time zoom NSDate *startTime; // time where trace starts NSDate *endTime; // time where trace ends NSDate *oldMiddleTime; // time at the middle of the scale before the zoom NSArray *highlightedEntities; // entities highlighted by cursor position PajeEntity *cursorEntity; // the entity under the cursor NSTrackingRectTag trackingRectTag; // the tag of the tracking rect (adjustSize) NSColor *backgroundColor; NSColor *selectedBackgroundColor; NSDate *selectionAnchorTime; NSDate *selectionStartTime; NSDate *selectionEndTime; BOOL isMakingSelection; BOOL selectionExists; int smallEntityWidth; #ifdef GNUSTEP // GNUstep doesn't draw rectangles that are too big. They are intersected with this. NSRect cutRect; #endif NSDictionary *entityNameAttributes; NSImage *highlightImage; NSImage *highlightMask; NSAffineTransform *highlightTransform; NSColor *highlightColor; } /* instance methods */ - (void)setFilter:(PajeFilter *)newFilter; - (IBAction)doubleTimeScale:sender; - (IBAction)halveTimeScale:sender; - (IBAction)zoomToSelection:sender; - (IBAction)getSmallEntityWidthFrom:sender; - (void)awakeFromNib; - (void)adjustSize; - (void)adjustTimeLimits; - (void)saveMiddleTime; - (void)setPointsPerSecond:(double)pps; - (double)pointsPerSecond; - (NSDate *)startTime; - (NSColor *)backgroundColor; - (void)setBackgroundColor:(NSColor *)color; - (void)drawRect:(NSRect)rect; - (void)setCursorEntity:(PajeEntity *)entity; - (void)setHighlightedEntities:(NSArray *)entities; - (NSArray *)highlightedEntities; - (void)changeSelectionWithPoint:(NSPoint)point; - (void)setNeedsDisplayFromX:(double)x1 toX:(double)x2; - (void)timeSelectionChanged; - (PajeFilter *)filter; - (double)timeToX:(NSDate *)t; @end @interface DrawView (Mouse) - (BOOL)becomeFirstResponder; - (BOOL)acceptsFirstMouse:(NSEvent *)event; - (void)mouseEntered:(NSEvent *)event; - (void)mouseExited:(NSEvent *)event; - (void)mouseMoved:(NSEvent *)event; - (void)mouseDown:(NSEvent *)event; - (void)mouseDragged:(NSEvent *)event; - (void)mouseUp:(NSEvent *)event; - (void)setCursorTime:(NSDate *)time; @end @interface DrawView (Drawing) - (void)drawHighlight; - (void)drawInstance:(id)entity ofDescriptor:(STContainerTypeLayout *)layoutDescriptor inRect:(NSRect)drawRect; /* private methods */ - (void)drawAllInstancesOfDescriptor:(STContainerTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container inRect:(NSRect)drawRect; - (void)drawEntitiesWithDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container insideRect:(NSRect)drawRect; - (void)drawEntitiesWithDescriptor:(STEntityTypeLayout *)layout inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator; - (void)drawEventsWithDescriptor:(STEventTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator; - (void)drawStatesWithDescriptor:(STStateTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator; - (void)drawLinksWithDescriptor:(STLinkTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator; - (void)drawValuesWithDescriptor:(STVariableTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator; @end @interface DrawView (Finding) BOOL line_hit(double px, double py, double x1, double y1, double x2, double y2); - (BOOL)isPoint:(NSPoint)p insideEntity:(PajeEntity *)entity; - (PajeEntity *)findEntityAtPoint:(NSPoint)point; - (NSArray *)findEntitiesAtPoint:(NSPoint)point; /* private methods */ - (PajeEntity *)entityAtPoint:(NSPoint)point inEntityDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container; - (PajeEntity *)entityAtPoint:(NSPoint)point inInstance:(id)instance ofLayoutDescriptor:(STContainerTypeLayout *)layoutDescriptor; - (PajeEntity *)entityAtPoint:(NSPoint)point layoutDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container; - (NSArray *)entitiesAtPoint:(NSPoint)point inEntityDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container; - (NSArray *)entitiesAtPoint:(NSPoint)point inInstance:(id)instance ofLayoutDescriptor:(STContainerTypeLayout *)layoutDescriptor; - (NSArray *)entitiesAtPoint:(NSPoint)point layoutDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container; - (NSRect)rectForEntity:(PajeEntity *)entity; - (NSRect)drawRectForEntity:(PajeEntity *)entity; - (NSRect)highlightRectForEntity:(PajeEntity *)entity; @end #define TIMEtoX(time) (startTime?[time timeIntervalSinceDate:startTime] * pointsPerSecond:0) #define XtoTIME(x) [startTime addTimeInterval:(x) / pointsPerSecond] //#define TIMEtoX(time) ([time timeIntervalSinceReferenceDate] * pointsPerSecond) //#define XtoTIME(x) [NSDate dateWithTimeIntervalSinceReferenceDate:(x) / pointsPerSecond] #define SMALL_ENTITY_DURATION (smallEntityWidth / pointsPerSecond) #endif Paje-1.98/SpaceTimeViewer/distant.tiff0000664000175000017500000001303611674062007017634 0ustar schnorrschnorrMM*lTTTTTT@@@TTTTTT %%udRSPaje-1.98/SpaceTimeViewer/DrawView+Drawing.m0000664000175000017500000006665411674062007020627 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // DrawView+Drawing // ---------------- // methods for drawing entities in DrawView. #include "DrawView.h" #ifdef GNUSTEP #include #endif #ifndef MAXFLOAT #define MAXFLOAT 3.402823466e+38F #endif #include "../General/Association.h" #include "../General/Macros.h" @implementation DrawView (Drawing) - (void)addToHighlightPath:(NSBezierPath *)path fillPath:(BOOL)fill { if ([path isEmpty]) return; if (highlightImage == nil) { // allocate two images, one for the highlighting and another one // to make a transparent cut in it to show the highlighted path. NSRect vr = [self visibleRect]; highlightImage = [[NSImage alloc] initWithSize:vr.size]; highlightMask = [[NSImage alloc] initWithSize:vr.size]; // transform view coordinates to image coordinates Assign(highlightTransform, [NSAffineTransform transform]); [highlightTransform translateXBy:-vr.origin.x yBy:vr.origin.y+vr.size.height]; [highlightTransform scaleXBy:1 yBy:-1]; } NSBezierPath *hp = [highlightTransform transformBezierPath:path]; // draw the opaque path in highlightMask [highlightMask lockFocus]; [[NSColor blackColor] set]; [hp stroke]; if (fill) { [hp fill]; } [highlightMask unlockFocus]; // stroke the path in various widths and transparencies in highlightImage float lw = [hp lineWidth]; [highlightImage lockFocus]; [highlightColor set]; [hp setLineWidth:lw+4]; [hp stroke]; [hp setLineWidth:lw+10]; [hp stroke]; [highlightImage unlockFocus]; } - (void)drawHighlight { if (highlightImage == nil) { return; } NSRect vr = [self visibleRect]; // make the highlightMask transparent in highlightImage [highlightImage lockFocus]; [highlightMask compositeToPoint:NSMakePoint(0, 0) operation:NSCompositeDestinationOut]; [highlightImage unlockFocus]; // composite the result to the screen [highlightImage compositeToPoint:NSMakePoint(vr.origin.x,NSMaxY(vr)) operation:NSCompositeSourceOver]; // get rid of the highlight images Assign(highlightImage, nil); Assign(highlightMask, nil); Assign(highlightTransform, nil); } - (void)drawEventsWithDescriptor:(STEventTypeLayout *)layout inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator { shapefunction *pathFunction; drawfunction *drawFunction; NSBezierPath *path; NSColor *color; id entity; float x, y, w, h; BOOL drawNames; BOOL sup; NSMutableAttributedString *name; drawNames = [layout drawsName]; if (drawNames) { name = [[NSMutableAttributedString alloc] initWithString:@"" attributes:entityNameAttributes]; } sup = [layout isSupEvent]; y = [layout yInContainer:container]; w = [layout width]; h = [layout height]; pathFunction = [[layout shapeFunction] function]; drawFunction = [[layout drawFunction] function]; path = [NSBezierPath bezierPath]; while ((entity = [enumerator nextObject]) != nil) { x = TIMEtoX([filter timeForEntity:entity]); [path removeAllPoints]; if ([filter isAggregateEntity:entity]) { float x2 = TIMEtoX([filter endTimeForEntity:entity]); int condensedEntitiesCount; unsigned i; unsigned count; float xi = x; float dx; condensedEntitiesCount = [entity condensedEntitiesCount]; count = [filter subCountForEntity:entity]; for (i = 0; i < count; i++) { [[filter subColorAtIndex:i forEntity:entity] set]; dx = (x2-x) * [filter subCountAtIndex:i forEntity:entity] / condensedEntitiesCount; if (sup) { NSRectFill(NSMakeRect(xi, y-(h-9), dx, 3)); } else { NSRectFill(NSMakeRect(xi, y+(h-11), dx, 3)); } xi += dx; } if (sup) { [[NSString stringWithFormat:@"%d", condensedEntitiesCount] drawAtPoint:NSMakePoint(x-5, y-(h-8)-9) withAttributes:entityNameAttributes]; [path moveToPoint:NSMakePoint(x2, y+2)]; [path lineToPoint:NSMakePoint(x2, y-(h-8))]; [path lineToPoint:NSMakePoint(x, y-(h-8))]; [path lineToPoint:NSMakePoint(x, y+2)]; } else { [[NSString stringWithFormat:@"%d", condensedEntitiesCount] drawAtPoint:NSMakePoint(x-5, y+(h-8)) withAttributes:entityNameAttributes]; [path moveToPoint:NSMakePoint(x, y-2)]; [path lineToPoint:NSMakePoint(x, y+(h-8))]; [path lineToPoint:NSMakePoint(x2, y+(h-8))]; [path lineToPoint:NSMakePoint(x2, y-2)]; } if ([filter isSelectedEntity:entity]) { [self addToHighlightPath:path fillPath:[[layout drawFunction] fillsPath]]; } [[NSColor blackColor] set]; [path stroke]; } else { // not aggregate color = [filter colorForEntity:entity]; pathFunction(path, NSMakeRect(x, y, w, h)); if ([filter isSelectedEntity:entity]) { [self addToHighlightPath:path fillPath:[[layout drawFunction] fillsPath]]; } drawFunction(path, color); if (drawNames) { float yt; [name replaceCharactersInRange:NSMakeRange(0, [name length]) withString:[[filter valueForEntity:entity] stringValue]]; if (sup) { yt = y - (h - 2 - w/2 + 5); } else { yt = y + (h - 2 - w/2 + 5) - 9; } //NSRectFill(NSMakeRect(x - w, yt, w * 2, 12)); if ([[color colorUsingColorSpaceName:NSCalibratedWhiteColorSpace device:nil] whiteComponent] > 0.5) { [[NSColor blackColor] set]; } else { [[NSColor whiteColor] set]; } [name drawInRect:NSMakeRect(x - w, yt, w * 2, 12)]; } } } if (drawNames) { [name release]; } } #define drawBlackRect(x1, x2, r) \ do { \ [[NSColor darkGrayColor] set]; \ NSFrameRect(NSMakeRect(x1, NSMinY(r) + NSHeight(r) / 4, \ x2 - x1 + 1, NSHeight(r) / 2)); \ } while (0) - (void)drawStatesWithDescriptor:(STStateTypeLayout *)layout inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator { shapefunction *pathFunction; drawfunction *drawFunction; float insetBy; NSColor *color; NSBezierPath *path = [NSBezierPath bezierPath]; id entity; float firstUndrawnX = MAXFLOAT; float lastUndrawnX = MAXFLOAT; float undrawnHeight = 0; float x, y, w, h; BOOL drawNames; NSMutableAttributedString *name; drawNames = [layout drawsName]; if (drawNames) { name = [[NSMutableAttributedString alloc] initWithString:@"" attributes:entityNameAttributes]; } y = [layout yInContainer:container]; h = [layout height]; insetBy = [layout insetAmount]; [path setLineWidth:1.0]; pathFunction = [[layout shapeFunction] function]; drawFunction = [[layout drawFunction] function]; while ((entity = [enumerator nextObject]) != nil) { int imbricationLevel; float newHeight; float x2; float ox, ow; x = TIMEtoX([filter startTimeForEntity:entity]); x2 = TIMEtoX([filter endTimeForEntity:entity]); ox = x; ow = x2 - x; #ifdef GNUSTEP // Very big rectangles are not drawn in GNUstep if (x < NSMinX(cutRect)) x = NSMinX(cutRect); if (x2 > NSMaxX(cutRect)) x2 = NSMaxX(cutRect); #endif w = x2 - x; imbricationLevel = [filter imbricationLevelForEntity:entity]; newHeight = h - insetBy * imbricationLevel; if (newHeight < 2) { newHeight = 2; } if (newHeight > h) { newHeight = h; } if (w < 2) { if ((lastUndrawnX != MAXFLOAT) && (x2 < firstUndrawnX)) { drawBlackRect(firstUndrawnX, lastUndrawnX, NSMakeRect(x, y, w, undrawnHeight)); undrawnHeight = 0; lastUndrawnX = x2; } if (lastUndrawnX == MAXFLOAT) { lastUndrawnX = x2; } if (firstUndrawnX > x) { firstUndrawnX = x; } if (newHeight > undrawnHeight) { undrawnHeight = newHeight; } continue; } if (firstUndrawnX != MAXFLOAT) { drawBlackRect(firstUndrawnX, lastUndrawnX, NSMakeRect(x, y, w, undrawnHeight)); firstUndrawnX = lastUndrawnX = MAXFLOAT; undrawnHeight = 0; } NSRect rect; rect = NSMakeRect(x, y, w, newHeight); [path removeAllPoints]; pathFunction(path, rect); if ([filter isAggregateEntity:entity]) { if ([filter isSelectedEntity:entity]) { [self addToHighlightPath:path fillPath:[[layout drawFunction] fillsPath]]; } [path moveToPoint:NSMakePoint(x, y)]; [path lineToPoint:NSMakePoint(x+w, y+newHeight)]; unsigned i; unsigned count = [filter subCountForEntity:entity]; for (i = 0; i < count; i++) { float dx; [[filter subColorAtIndex:i forEntity:entity] set]; dx = [filter subDurationAtIndex:i forEntity:entity] * pointsPerSecond; rect.size.width = dx; NSRectFill(rect); rect.origin.x += dx; } if (rect.origin.x <= (x + w - 1)) { [path moveToPoint:NSMakePoint(rect.origin.x, y+newHeight)]; [path lineToPoint:NSMakePoint(x+w, y)]; } drawFunction(path, nil);// REVER } else { // !aggregate if ([filter isSelectedEntity:entity]) { [self addToHighlightPath:path fillPath:[[layout drawFunction] fillsPath]]; } color = [filter colorForEntity:entity]; drawFunction(path, color); if (drawNames && ow > smallEntityWidth && newHeight > 8) { [name replaceCharactersInRange:NSMakeRange(0, [name length]) withString:[[filter valueForEntity:entity] stringValue]]; [name drawInRect:NSMakeRect(ox+2, y + newHeight - 10, ow, 10)]; } } } if (firstUndrawnX != MAXFLOAT) { drawBlackRect(firstUndrawnX, lastUndrawnX, NSMakeRect(x, y, w, undrawnHeight)); } if (drawNames) { [name release]; } } // helper function for drawing variables. // adds min max traits to a path. static void addToMinMaxPath(NSBezierPath *path, float xMin, float xMax, float yAvg, float yMin, float yMax) { if (yMax == yMin) { // return; } float xAvg = (xMin + xMax) / 2; //[path moveToPoint:NSMakePoint(xMin, yAvg)]; //[path lineToPoint:NSMakePoint(xMax, yAvg)]; //[path moveToPoint:NSMakePoint(xAvg, yMin)]; //[path lineToPoint:NSMakePoint(xAvg, yMax)]; [path moveToPoint:NSMakePoint(xAvg-5, yMin)]; [path lineToPoint:NSMakePoint(xAvg+5, yMin)]; [path moveToPoint:NSMakePoint(xAvg-5, yMax)]; [path lineToPoint:NSMakePoint(xAvg+5, yMax)]; } - (void)drawValuesWithDescriptor:(STVariableTypeLayout *)layout inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator { shapefunction *pathFunction; drawfunction *drawFunction; NSBezierPath *valuePath; NSBezierPath *selectedPath; NSBezierPath *minMaxPath; NSBezierPath *minPath; NSBezierPath *maxPath; BOOL showMinMax; NSColor *color; id entity; float yMin; float yMax; float yScale; float yOffset; float yOld; float yvMin; float yvMax; BOOL first = YES; BOOL hasHighlight = NO; PajeEntityType *entityType; entityType = [layout entityType]; yMin = [layout minValue]; yMax = [layout maxValue]; if (yMax <= yMin) { yMin = [filter minValueForEntityType:entityType]; yMax = [filter maxValueForEntityType:entityType]; } pathFunction = [[layout shapeFunction] function]; drawFunction = [[layout drawFunction] function]; if (yMin != yMax) { yScale = -([layout height] - 4) / (yMax - yMin); } else { yScale = 1; } yOffset = [layout yInContainer:container] + 2 - (yMax * yScale); valuePath = [[NSBezierPath alloc] init]; [valuePath setLineJoinStyle: NSBevelLineJoinStyle]; selectedPath = [[NSBezierPath alloc] init]; [selectedPath setLineJoinStyle: NSBevelLineJoinStyle]; showMinMax = [layout showMinMax]; if (showMinMax) { minMaxPath = [[NSBezierPath alloc] init]; minPath = [[NSBezierPath alloc] init]; maxPath = [[NSBezierPath alloc] init]; } while ((entity = [enumerator nextObject]) != nil) { float xStart; float xEnd; float y; xStart = TIMEtoX([filter startTimeForEntity:entity]); xEnd = TIMEtoX([filter endTimeForEntity:entity]); y = [filter doubleValueForEntity:entity] * yScale + yOffset; yvMin = [filter minValueForEntity:entity] * yScale + yOffset; yvMax = [filter maxValueForEntity:entity] * yScale + yOffset; if (first) { yOld = y; [valuePath moveToPoint:NSMakePoint(xEnd, y)]; if (showMinMax) { [minPath moveToPoint:NSMakePoint(xEnd, y)]; [maxPath moveToPoint:NSMakePoint(xEnd, y)]; } first = NO; } //else { pathFunction(valuePath, NSMakeRect(xStart, y, xEnd-xStart, 0)); //} if ([filter isSelectedEntity:entity]) { [selectedPath moveToPoint:NSMakePoint(xEnd, yOld)]; pathFunction(selectedPath, NSMakeRect(xStart, y, xEnd-xStart, 0)); hasHighlight = YES; } yOld = y; if (showMinMax) { addToMinMaxPath(minMaxPath, xStart, xEnd, y, yvMin, yvMax); pathFunction(minPath, NSMakeRect(xStart, yvMin, xEnd-xStart, 0)); pathFunction(maxPath, NSMakeRect(xStart, yvMax, xEnd-xStart, 0)); } } if (showMinMax) { //[[NSColor blackColor] set]; //[minMaxPath stroke]; color = [filter colorForEntityType:entityType]; [color set]; [minMaxPath release]; [minPath stroke]; [minPath release]; [maxPath stroke]; [maxPath release]; } if (hasHighlight) { [selectedPath setLineWidth:[layout lineWidth]]; [self addToHighlightPath:selectedPath fillPath:[[layout drawFunction] fillsPath]]; } color = [filter colorForEntityType:entityType]; [valuePath setLineWidth:[layout lineWidth]]; drawFunction(valuePath, color); [valuePath release]; [selectedPath release]; } - (void)drawLinksWithDescriptor:(STLinkTypeLayout *)layout inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator { shapefunction *pathFunction; drawfunction *drawFunction; shapefunction *sourcelessPathFunction; shapefunction *destlessPathFunction; NSColor *color; id entity; float x1, x2, y1, y2; NSBezierPath *path; pathFunction = [[layout shapeFunction] function]; drawFunction = [[layout drawFunction] function]; sourcelessPathFunction = [[ShapeFunction shapeFunctionWithName:@"PSIn"] function]; destlessPathFunction = [[ShapeFunction shapeFunctionWithName:@"PSOut"] function]; path = [NSBezierPath bezierPath]; [path setLineWidth:[layout lineWidth]]; while ((entity = [enumerator nextObject]) != nil) { PajeContainer *sourceContainer; PajeContainer *destContainer; sourceContainer = [filter sourceContainerForEntity:entity]; if (sourceContainer != nil) { PajeEntityType *eType; STContainerTypeLayout *cDesc; NSRect rect; eType = [filter sourceEntityTypeForEntity:entity]; cDesc = (STContainerTypeLayout *)[controller descriptorForEntityType:eType]; rect = [cDesc rectOfInstance:sourceContainer]; y1 = NSMinY(rect) + [cDesc linkOffset]; x1 = TIMEtoX([filter startTimeForEntity:entity]); } destContainer = [filter destContainerForEntity:entity]; if (destContainer != nil) { PajeEntityType *eType; STContainerTypeLayout *cDesc; NSRect rect; eType = [filter destEntityTypeForEntity:entity]; cDesc = (STContainerTypeLayout *)[controller descriptorForEntityType:eType]; rect = [cDesc rectOfInstance:destContainer]; y2 = NSMinY(rect) + [cDesc linkOffset]; x2 = TIMEtoX([filter endTimeForEntity:entity]); } [path removeAllPoints]; color = [filter colorForEntity:entity]; //if (sourceContainer && destContainer) { if (sourceContainer == nil) { sourcelessPathFunction(path, NSMakeRect(x2, y2, 8, 8)); } else if (destContainer == nil) { destlessPathFunction(path, NSMakeRect(x1, y1, 8, 8)); } else { pathFunction(path, NSMakeRect(x1, y1, x2-x1, y2-y1)); } if ([filter isSelectedEntity:entity]) { [self addToHighlightPath:path fillPath:[[layout drawFunction] fillsPath]]; } drawFunction(path, color); } } - (void)drawBackgroundForContainer:(PajeContainer *)container descriptor:(STContainerTypeLayout *)layout insideRect:(NSRect)drawRect { if ([[filter selectedContainers] containsObject:container]) { [[NSColor whiteColor] set]; NSRectFill([layout rectOfInstance:container]); } float yScale; float yOffset; float yMin; float yMax; yMin = [layout minValue]; yMax = [layout maxValue]; if (yMin >= yMax) { return; } yScale = -([layout heightForVariables] - 4) / (yMax - yMin); yOffset = NSMinY([layout rectOfInstance:container]) + [layout variablesOffset] + 2 - (yMax * yScale); NSBezierPath *hashMarkPath; hashMarkPath = [[NSBezierPath alloc] init]; NSEnumerator *en = [[layout hashMarkValues] objectEnumerator]; NSNumber *n; while ((n = [en nextObject]) != nil) { float v = [n floatValue]; float y = v * yScale + yOffset; [hashMarkPath moveToPoint:NSMakePoint(NSMinX(drawRect), y)]; [hashMarkPath lineToPoint:NSMakePoint(NSMaxX(drawRect), y)]; } [[NSColor gridColor] set]; [hashMarkPath stroke]; [hashMarkPath release]; double dt; // calculate dv, delta time for at least 70 px between hash marks dt = 70 / pointsPerSecond; int i = 0; while (dt < .5) { dt *= 10; i--; } while (dt >= 5) { dt /= 10; i++; } if (dt > 2) dt = 5; else if (dt > 1) dt = 2; else dt = 1; while (i > 0) { dt *= 10; i--; } while (i < 0) { dt /= 10; i++; } hashMarkPath = [[NSBezierPath alloc] init]; double t; double minT; double maxT; minT = [XtoTIME(NSMinX(drawRect)) timeIntervalSinceReferenceDate]; maxT = [XtoTIME(NSMaxX(drawRect)) timeIntervalSinceReferenceDate]; for (t = (int)(minT/dt) * dt; t <= maxT; t += dt) { float x = TIMEtoX([NSDate dateWithTimeIntervalSinceReferenceDate:t]); [hashMarkPath moveToPoint:NSMakePoint(x, yMin * yScale + yOffset)]; [hashMarkPath lineToPoint:NSMakePoint(x, yMax * yScale + yOffset)]; } //[[NSColor whiteColor] set]; [hashMarkPath stroke]; [hashMarkPath release]; } - (void)drawEntitiesWithDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container fromEnumerator:(NSEnumerator *)enumerator { switch ([layoutDescriptor drawingType]) { case PajeEventDrawingType: [self drawEventsWithDescriptor:(STEventTypeLayout *)layoutDescriptor inContainer:container fromEnumerator:enumerator]; break; case PajeStateDrawingType: [self drawStatesWithDescriptor:(STStateTypeLayout *)layoutDescriptor inContainer:container fromEnumerator:enumerator]; break; case PajeLinkDrawingType: [self drawLinksWithDescriptor:(STLinkTypeLayout *)layoutDescriptor inContainer:container fromEnumerator:enumerator]; break; case PajeVariableDrawingType: [self drawValuesWithDescriptor:(STVariableTypeLayout *)layoutDescriptor inContainer:container fromEnumerator:enumerator]; break; case PajeContainerDrawingType: break; default: NSAssert1(0, @"Invalid drawing type %d", [layoutDescriptor drawingType]); } } - (void)drawEntitiesWithDescriptor:(STEntityTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container insideRect:(NSRect)drawRect { NSDate *drawStartTime; NSDate *drawEndTime; NSEnumerator *enumerator; NSRect rect; PajeEntityType *entityType; PajeDrawingType drawingType; rect = [layoutDescriptor rectInContainer:container]; if (![layoutDescriptor intersectsRect:drawRect inContainer:container]) { return; } drawingType = [layoutDescriptor drawingType]; entityType = [layoutDescriptor entityType]; float width; if (drawingType == PajeEventDrawingType) { width = [(STEventTypeLayout *)layoutDescriptor width]; } else { width = 1; } drawStartTime = XtoTIME(NSMinX(drawRect) - width); drawEndTime = XtoTIME(NSMaxX(drawRect) + width); if (drawingType == PajeVariableDrawingType) { // make sure that mid x point of first and last values are inside rect // (some ways of drawing variables do not draw after/before mid point PajeEntity *entity; enumerator = [filter enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:drawEndTime toTime:drawEndTime minDuration:1/pointsPerSecond/*SMALL_ENTITY_DURATION*/]; entity = [enumerator nextObject]; if (entity != nil) { NSDate *entityEndTime; entityEndTime = [filter endTimeForEntity:entity]; if ([entityEndTime isLaterThanDate:drawEndTime]) { drawEndTime = XtoTIME(TIMEtoX(entityEndTime)+1); } } enumerator = [filter enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:drawStartTime toTime:drawStartTime minDuration:1/pointsPerSecond/*SMALL_ENTITY_DURATION*/]; ali: entity = [enumerator nextObject]; if (entity != nil) { NSDate *entityStartTime; entityStartTime = [filter startTimeForEntity:entity]; if ([entityStartTime isEarlierThanDate:drawStartTime]) { drawStartTime = XtoTIME(TIMEtoX(entityStartTime)-1); } else { goto ali; } } } enumerator = [filter enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:drawStartTime toTime:drawEndTime minDuration:SMALL_ENTITY_DURATION]; [self drawEntitiesWithDescriptor:layoutDescriptor inContainer:container fromEnumerator:enumerator]; } - (void)drawInstance:(id)entity ofDescriptor:(STContainerTypeLayout *)layoutDescriptor inRect:(NSRect)drawRect { NSEnumerator *sublayoutEnum; STEntityTypeLayout *sublayout; if (![layoutDescriptor isInstance:entity inRect:drawRect]) { return; } // draw background of container [self drawBackgroundForContainer:entity descriptor:layoutDescriptor insideRect:drawRect]; // draw all subtypes in this container sublayoutEnum = [[layoutDescriptor subtypes] objectEnumerator]; while ((sublayout = [sublayoutEnum nextObject]) != nil) { if (![sublayout isContainer]) { [self drawEntitiesWithDescriptor:sublayout inContainer:entity insideRect:drawRect]; } else { STContainerTypeLayout *subcontainerLayout; subcontainerLayout = (STContainerTypeLayout *)sublayout; [self drawAllInstancesOfDescriptor:subcontainerLayout inContainer:entity inRect:drawRect]; } } } - (void)drawAllInstancesOfDescriptor:(STContainerTypeLayout *)layoutDescriptor inContainer:(PajeContainer *)container inRect:(NSRect)drawRect { if (/*container == nil || */[layoutDescriptor intersectsRect:drawRect inContainer:container]) { NSEnumerator *ienum; id instance; PajeEntityType *entityType; NSAutoreleasePool *pool; pool = [NSAutoreleasePool new]; entityType = [layoutDescriptor entityType]; ienum = [filter enumeratorOfContainersTyped:entityType inContainer:container]; while ((instance = [ienum nextObject]) != nil) { [self drawInstance:instance ofDescriptor:layoutDescriptor inRect:drawRect]; } [pool release]; } } @end Paje-1.98/SpaceTimeViewer/HierarchyRuler.m0000664000175000017500000007302111674062007020422 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "HierarchyRuler.h" #include "../General/Macros.h" #define SHOW_TYPES #define CEIL(f) (1000-((int)(1000-(f)))) #define CEIL2(f) (1000-((int)(999.5-(f)))) @interface VCell : NSCell @end @implementation VCell - (void) _drawAttributedText: (NSAttributedString*)aString inFrame: (NSRect)aRect { NSSize titleSize; NSRect newRect; if (aString == nil || NSWidth(aRect) < 5 || NSHeight(aRect) < 5) { return; } titleSize = [aString size]; #if defined __MINGW32__ if (YES) { #else if (NSWidth(aRect) > NSHeight(aRect)) { #endif if (titleSize.width < aRect.size.width) { newRect.origin.x = NSMidX(aRect) - titleSize.width/2; newRect.origin.y = NSMidY(aRect) - titleSize.height/2; newRect.size = titleSize; //newRect.size.width = aRect.size.height; } else { newRect.origin.x = NSMinX(aRect); newRect.size.width = aRect.size.width + 1; newRect.size.height = titleSize.height * CEIL(titleSize.width / newRect.size.width); if (newRect.size.height > aRect.size.height) { newRect.size.height = aRect.size.height; } newRect.origin.y = NSMidY(aRect) - newRect.size.height/2; } [aString drawInRect: newRect]; } else { if (titleSize.width < aRect.size.height) { newRect.origin.x = NSMidX(aRect) - titleSize.height/2; newRect.origin.y = NSMidY(aRect) + titleSize.width/2; newRect.size = titleSize; newRect.size.width += 6; } else { newRect.origin.y = NSMaxY(aRect); newRect.size.width = aRect.size.height + 1; newRect.size.height = titleSize.height * CEIL2(titleSize.width / newRect.size.width); if (newRect.size.height > aRect.size.width) { newRect.size.height = aRect.size.width; } newRect.origin.x = NSMidX(aRect) - newRect.size.height/2; } NSAffineTransform *transf; transf = [NSAffineTransform transform]; [transf translateXBy: newRect.origin.x yBy: newRect.origin.y]; [transf rotateByDegrees:-90]; [transf concat]; newRect.origin = NSMakePoint(0, 0); [aString drawInRect: newRect]; [transf invert]; [transf concat]; } } - (void) drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView*)controlView { if ([controlView window] == nil) { return; } cellFrame = [self drawingRectForBounds: cellFrame]; [self _drawAttributedText: [self attributedStringValue] inFrame: cellFrame]; } @end @interface HierarchyRuler(Private) - (id)instanceAtPoint:(NSPoint)point ofType:(PajeContainerType *)containerType inContainer:(PajeContainer *)container level:(int)level; - (id)instanceAtPoint:(NSPoint)point inInstance:(id)instance ofType:(PajeContainerType *)containerType level:(int)level; - (id)instanceAtPoint:(NSPoint)point; - (void)drawContainer:(PajeContainer *)container layout:(STContainerTypeLayout *)layout inRect:(NSRect)drawRect level:(int)level offset:(float)offset; - (void)drawContainerLayout:(STContainerTypeLayout *)layout inContainer:(PajeContainer *)container inRect:(NSRect)drawRect level:(int)level offset:(float)offset; @end @implementation HierarchyRuler - (id)initWithScrollView:(NSScrollView *)scrollView controller:(STController *)c; { int i; self = [super initWithScrollView:scrollView orientation:NSVerticalRuler]; if (self == nil) return self; controller = c; thicknesses = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"HierarchyRulerThicknesses"] mutableCopy]; if (thicknesses == nil) { thicknesses = [[NSMutableArray arrayWithObjects: [NSNumber numberWithFloat:0.], [NSNumber numberWithFloat:40.], [NSNumber numberWithFloat:60.], nil] retain]; } for (i = 0; i < [thicknesses count]; i++) { id obj; obj = [thicknesses objectAtIndex:i]; if (![obj isKindOfClass:[NSNumber class]]) { obj = [NSNumber numberWithFloat:[obj floatValue]]; [thicknesses replaceObjectAtIndex:i withObject:obj]; } } cell = [[VCell alloc] initTextCell:@""]; [cell setWraps:YES]; [cell setBordered:YES]; [cell setFont:[NSFont systemFontOfSize:10.0]]; vcell = [[VCell alloc] initTextCell:@""]; [vcell setWraps:YES]; [vcell setBordered:YES]; [vcell setFont:[NSFont systemFontOfSize:10.0]]; return self; } - (void)dealloc { [thicknesses release]; [cell release]; [super dealloc]; } - (void)setWidth:(float)width forLevel:(int)level { if (width < 0.0) width = 0.0; while (level > [thicknesses count]-1) { [thicknesses addObject:[NSNumber numberWithFloat:50.0]]; } [thicknesses replaceObjectAtIndex:level withObject:[NSNumber numberWithFloat:width]]; [[NSUserDefaults standardUserDefaults] setObject:thicknesses forKey:@"HierarchyRulerThicknesses"]; } - (float)widthForLevel:(int)level { if (level > maxLevel) maxLevel = level; if (level >= [thicknesses count]) { [self setWidth:50 forLevel:level]; } return [[thicknesses objectAtIndex:level] floatValue]; } - (float)positionForLevel:(int)level { int i; float pos = 0.0; for (i=0; i pos-2 && position < pos+2) { index = i; } } while (pos < position+3); return index; } - (int)levelForPosition:(float)position { int i = 0; float pos = 0.0; do { pos += [self widthForLevel:i]; i = i + 1; } while (pos < position); return i-1; } - (hierarchyRulerPart)hitPart:(NSPoint)position { int i = 0; float pos = 0.0; do { pos += [self widthForLevel:i]; i = i + 1; if (position.x > pos-2 && position.x < pos+2) { return hierarchyRulerVerticalDivider; } if (position.x < pos) { return hierarchyRulerBox; } } while (pos < position.x+3); return hierarchyRulerNone; } - (void)refreshSizes { if (maxLevel == 0) maxLevel = 1; [self setRuleThickness:[self positionForLevel:maxLevel+1]];//[thicknesses count]/* - 1*/]]; [[self enclosingScrollView] tile]; } - (void)drawHashMarksAndLabelsInRect:(NSRect)drawRect forVariableLayout:(STVariableTypeLayout *)layout { float vMin; float vMax; float yScale; float yOffset; PajeEntityType *entityType; entityType = [layout entityType]; vMin = [layout minValue]; vMax = [layout maxValue]; if (vMax <= vMin) { vMin = [controller minValueForEntityType:entityType]; vMax = [controller maxValueForEntityType:entityType]; } if (vMin != vMax) { yScale = -([layout height] - 4) / (vMax - vMin); } else { yScale = 1; } yOffset = NSMinY(drawRect) + 2 - (vMax * yScale); //y = [filter valueForEntity:entity] * yScale + yOffset; [[NSColor controlColor] set]; //NSRectFill(drawRect); NSBezierPath *path; path = [NSBezierPath bezierPath]; [path moveToPoint:NSMakePoint(NSMaxX(drawRect), NSMinY(drawRect) + 2)]; [path lineToPoint:NSMakePoint(NSMaxX(drawRect), NSMaxY(drawRect) - 2)]; NSFont *font = [NSFont systemFontOfSize: [NSFont smallSystemFontSize]]; NSDictionary *attr = [[NSDictionary alloc] initWithObjectsAndKeys: font, NSFontAttributeName, [NSColor blackColor], NSForegroundColorAttributeName, nil]; NSEnumerator *en = [[layout hashMarkValues] objectEnumerator]; NSNumber *n; while ((n = [en nextObject]) != nil) { NSSize size; NSString *str; NSString *hashValueFormat = [layout hashValueFormat]; float v = [n floatValue]; float y = v * yScale + yOffset; float x; [path moveToPoint:NSMakePoint(NSMaxX(drawRect) - 4, y)]; [path lineToPoint:NSMakePoint(NSMaxX(drawRect), y)]; str = [NSString stringWithFormat:hashValueFormat, v]; size = [str sizeWithAttributes:attr]; x = NSMaxX(drawRect) - size.width; if (y > NSMinY(drawRect) + size.height + 1) { [str drawAtPoint:NSMakePoint(x, y - size.height + 2) withAttributes:attr]; } else { [str drawAtPoint:NSMakePoint(x, y + 1) withAttributes:attr]; } } [[NSColor blackColor] set]; [path stroke]; [attr release]; } - (void)drawHashMarksAndLabelsInRect:(NSRect)drawRect forContainerLayout:(STContainerTypeLayout *)layout { float vMin; float vMax; float yScale; float yOffset; PajeEntityType *entityType; entityType = [layout entityType]; vMin = [layout minValue]; vMax = [layout maxValue]; if (vMax <= vMin) { return; } yScale = -([layout heightForVariables] - 4) / (vMax - vMin); yOffset = NSMinY(drawRect) + 2 - (vMax * yScale) + [layout variablesOffset] ; //y = [filter valueForEntity:entity] * yScale + yOffset; [[NSColor controlColor] set]; //NSRectFill(drawRect); NSBezierPath *path; path = [NSBezierPath bezierPath]; [path moveToPoint:NSMakePoint(NSMaxX(drawRect), NSMinY(drawRect) + 2)]; [path lineToPoint:NSMakePoint(NSMaxX(drawRect), NSMaxY(drawRect) - 2)]; NSFont *font = [NSFont systemFontOfSize: [NSFont smallSystemFontSize]]; NSDictionary *attr = [[NSDictionary alloc] initWithObjectsAndKeys: font, NSFontAttributeName, [NSColor blackColor], NSForegroundColorAttributeName, nil]; NSEnumerator *en = [[layout hashMarkValues] objectEnumerator]; NSNumber *n; while ((n = [en nextObject]) != nil) { NSSize size; NSString *str; NSString *hashValueFormat = [layout hashValueFormat]; float v = [n floatValue]; float y = v * yScale + yOffset; float x; [path moveToPoint:NSMakePoint(NSMaxX(drawRect) - 4, y)]; [path lineToPoint:NSMakePoint(NSMaxX(drawRect), y)]; str = [NSString stringWithFormat:hashValueFormat, v]; size = [str sizeWithAttributes:attr]; x = NSMaxX(drawRect) - size.width; if (y > NSMinY(drawRect) + size.height + 1) { [str drawAtPoint:NSMakePoint(x, y - size.height + 2) withAttributes:attr]; } else { [str drawAtPoint:NSMakePoint(x, y + 1) withAttributes:attr]; } } [[NSColor blackColor] set]; [path stroke]; [attr release]; } - (void)drawHashMarksAndLabelsInRect:(NSRect)drawRect { int x; x = maxLevel;//[thicknesses count]; maxLevel = 0; [self drawContainer:[controller rootInstance] layout:[controller rootLayout] inRect:drawRect level:0 offset:NSMinY([[self clientView] visibleRect])]; if (x != maxLevel/*[thicknesses count]*/) { [self performSelector:@selector(refreshSizes) withObject:nil afterDelay:0.0]; } } - (void)drawContainer:(PajeContainer *)container layout:(STContainerTypeLayout *)layout inRect:(NSRect)drawRect level:(int)level offset:(float)offset { NSEnumerator *sublayoutEnum; STContainerTypeLayout *sublayout; if ([layout heightForVariables] > 10) { NSRect r = [layout rectOfInstance:container]; r.origin.x = NSMinX(drawRect); r.origin.y -= offset; r.size.width = NSMaxX([self bounds]) - r.origin.x - 1; [self drawHashMarksAndLabelsInRect:r forContainerLayout:layout]; } sublayoutEnum = [[layout subtypes] objectEnumerator]; while ((sublayout = [sublayoutEnum nextObject]) != nil) { [self drawContainerLayout:sublayout inContainer:container inRect:drawRect level:level offset:offset]; } } - (void)drawContainerLayout:(STContainerTypeLayout *)layout inContainer:(PajeContainer *)container inRect:(NSRect)drawRect level:(int)level offset:(float)offset { NSRect r; #ifndef SHOW_TYPES if (![layout isContainer]) { return; } #endif r = [layout rectInContainer:container]; r.origin.y -= offset; //r.size.height += 1; r.origin.x = drawRect.origin.x; r.size.width = drawRect.size.width; if (!NSIsEmptyRect(r /*NSIntersectionRect(r, drawRect)*/)) { NSEnumerator *ienum; id instance; #ifdef SHOW_TYPES if (r.size.width > 2 && [layout drawingType] != PajeLinkDrawingType && [layout drawingType] != PajeVariableDrawingType) { [vcell setStringValue:[layout description]]; r.origin.x = [self positionForLevel:level] - 1; if ([layout isContainer]) { r.size.width = [self widthForLevel:level] /*+ 1*/; } else { [self widthForLevel:level]; r.size.width = NSMaxX([self bounds]) - r.origin.x - 1; } [vcell drawWithFrame:NSInsetRect(r, -.5, -.5) inView:self]; } if (r.size.width > 2 && [layout drawingType] == PajeVariableDrawingType) { [self widthForLevel:level]; //r.size.width = NSMaxX([self bounds]) - r.origin.x - 1; //[self drawHashMarksAndLabelsInRect:r forVariableLayout:layout]; } if (![layout isContainer]) return; level++; #endif // check all instances on this hierarchy ienum = [controller enumeratorOfContainersTyped:[layout entityType] inContainer:container]; while ((instance = [ienum nextObject]) != nil) { r = [layout rectOfInstance:instance]; r.origin.y -= offset; //r.size.height += 1; r.origin.x = [self positionForLevel:level] - 1; r.size.width = [self widthForLevel:level] /*+ 1*/; if (!NSIsEmptyRect(r /*NSIntersectionRect(r, drawRect)*/)) { if (r.size.width > 2) { if (containerBeingDragged != nil && [instance isEqual:containerBeingDragged]) { NSDrawWhiteBezel(NSInsetRect(r, -.5, -.5), NSInsetRect(r, -.5, -.5)); } else if ([[controller selectedContainers] containsObject:instance]) { [[NSColor whiteColor] set]; NSRectFill(r); } [cell setStringValue:[instance name/*description*/]]; [cell drawWithFrame:NSInsetRect(r, -.5, -.5) inView:self]; } } [self drawContainer:instance layout:layout inRect:drawRect level:level+1 offset:offset]; } } } - (id)instanceAtPoint:(NSPoint)point ofType:(PajeContainerType *)containerType inContainer:(PajeContainer *)container level:(int)level { STEntityTypeLayout *layoutDescriptor; NSRect r; float position = [self positionForLevel:level]; float width = [self widthForLevel:level]; if (point.x < position) { return nil; } layoutDescriptor = [controller descriptorForEntityType:containerType]; if (![layoutDescriptor isContainer]) { return nil; } r = [layoutDescriptor rectInContainer:container]; if (point.y >= NSMinY(r) && point.y <= NSMaxY(r)) { NSEnumerator *ienum; id instance; // check all instances on this hierarchy ienum = [controller enumeratorOfContainersTyped:containerType inContainer:container]; while ((instance = [ienum nextObject]) != nil) { if (point.x < position+width) { r = [(STContainerTypeLayout *)layoutDescriptor rectOfInstance:instance]; //r.size.height += 1; r.origin.x = position - 1; r.size.width = width /*+ 1*/; if (NSMouseInRect(point, r, [self isFlipped])) { return instance; } } else { id subinstance; subinstance = [self instanceAtPoint:point inInstance:instance ofType:containerType level:level+1]; if (subinstance != nil) return subinstance; } } } return nil; } - (id)instanceAtPoint:(NSPoint)point inInstance:(id)instance ofType:(PajeContainerType *)containerType level:(int)level { NSArray *subtypes; NSEnumerator *subtypeEnum; PajeContainerType *subtype; id foundInstance = nil; subtypes = [controller containedTypesForContainerType:containerType]; subtypeEnum = [subtypes objectEnumerator]; while ((subtype = [subtypeEnum nextObject]) != nil) { foundInstance = [self instanceAtPoint:point ofType:subtype inContainer:instance #ifdef SHOW_TYPES level:level+1]; #else level:level]; #endif if (foundInstance != nil) { break; } } return foundInstance; } - (id)instanceAtPoint:(NSPoint)point { float offset; PajeContainer *root; PajeContainerType *rootType; offset = NSMinY([[self clientView] visibleRect]); point.y += offset; root = [controller rootInstance]; rootType = (PajeContainerType *)[controller entityTypeForEntity:root]; return [self instanceAtPoint:point inInstance:root ofType:rootType level:0]; } - (void)trackVerticalDivider:(NSEvent *)event { NSPoint mouseDownLocation; NSPoint currentMouseLocation; int mask = NSLeftMouseUpMask | NSLeftMouseDraggedMask; int indexBeingDragged; int deltaPosition; int originalWidth; int currentWidth; mouseDownLocation = [self convertPoint:[event locationInWindow] fromView:nil]; indexBeingDragged = [self indexForPosition:mouseDownLocation.x]; if (indexBeingDragged == -1) { return; } originalWidth = [self widthForLevel:indexBeingDragged - 1]; [self lockFocus]; do { event = [NSApp nextEventMatchingMask: mask untilDate: [NSDate distantFuture] inMode: NSEventTrackingRunLoopMode dequeue: YES]; currentMouseLocation = [self convertPoint:[event locationInWindow] fromView:nil]; deltaPosition = currentMouseLocation.x - mouseDownLocation.x; currentWidth = originalWidth + deltaPosition; if (currentWidth < 0) currentWidth = 0; [self setWidth:currentWidth forLevel:indexBeingDragged - 1]; [self refreshSizes]; } while ([event type] != NSLeftMouseUp); [self unlockFocus]; } - (void)trackHorizontalDivider:(NSEvent *)event { } /** scroll client view if necessary, to make r visible. * r has x coordinates in ruler, y in client view. * return YES if scroll was made, NO if rect was already visible */ - (BOOL)_makeRectVisible:(NSRect) r { id drawView = [self clientView]; NSRect visible = [drawView visibleRect]; r.origin.x = NSMinX(visible); r.size.width = 1; if (!NSEqualRects(visible, NSUnionRect(visible, r))) { [drawView scrollRectToVisible:r]; [self displayIfNeeded]; return YES; } return NO; } - (NSImage *)_getImageInRect:(NSRect)rect { NSCachedImageRep *imageRep; NSImage *image; NSRect imageRect; NSRect windowRect; imageRect.origin = NSZeroPoint; imageRect.size = rect.size; imageRep = [[NSCachedImageRep alloc] initWithWindow:nil rect:imageRect]; [[[imageRep window] contentView] lockFocus]; windowRect = rect; windowRect.origin.y -= NSMinY([[self clientView] visibleRect]); windowRect = [self convertRect:windowRect toView:nil]; NSCopyBits([[self window] gState], windowRect, NSZeroPoint); [[[imageRep window] contentView] unlockFocus]; image = [[NSImage alloc] initWithSize:rect.size]; [image lockFocus]; [imageRep draw]; [image unlockFocus]; [imageRep release]; return [image autorelease]; } - (void)trackBox:(NSEvent *)event { NSPoint mouseDownLocation; float mouseDownYInView; float currentMouseYInView; NSRect limitRect; NSRect instanceRect; NSRect currentRect; STEntityTypeLayout *layoutDescriptor; DrawView *drawView; //PajeFilter *filter; PajeEntityType *entityType; PajeContainer *container; float minX; float width; float minY; float maxY; int indexBeingDragged; id clickedContainer; PajeContainer *droppedInstance; NSImage *dragImage; /* coordinate conversion here is a bit hard: * y ruler coordinates start from 0 independent of view position. * must always convert to view coordinates to know where we are. */ mouseDownLocation = [self convertPoint:[event locationInWindow] fromView:nil]; clickedContainer = [self instanceAtPoint:mouseDownLocation]; if (clickedContainer == nil || ![clickedContainer isContainer]) { return; } drawView = (DrawView *)[self clientView]; //filter = [drawView filter]; entityType = [controller entityTypeForEntity:clickedContainer]; layoutDescriptor = [controller descriptorForEntityType:entityType]; container = [controller containerForEntity:clickedContainer]; limitRect = [layoutDescriptor rectInContainer:container]; instanceRect = [(STContainerTypeLayout *)layoutDescriptor rectOfInstance:clickedContainer]; instanceRect.size.height += 1; instanceRect.size.width += 1; minY = NSMinY(limitRect); maxY = NSMaxY(limitRect) - NSHeight(instanceRect) + 1; indexBeingDragged = [self levelForPosition:mouseDownLocation.x]; if (indexBeingDragged == -1) { return; } minX = [self positionForLevel:indexBeingDragged]; width = [self widthForLevel:indexBeingDragged]; limitRect.origin.x = instanceRect.origin.x = minX - 1; limitRect.size.width = instanceRect.size.width = width + 1; [self _makeRectVisible:instanceRect]; mouseDownYInView = [drawView convertPoint:[event locationInWindow] fromView:nil].y; currentMouseYInView = mouseDownYInView; Assign(containerBeingDragged, clickedContainer); dragImage = [[self _getImageInRect:instanceRect] retain]; [self lockFocus]; [[self window] disableFlushWindow]; currentRect = instanceRect; currentRect.origin.y -= NSMinY([drawView visibleRect]); [self setNeedsDisplayInRect:currentRect]; [self displayIfNeeded]; [[self window] cacheImageInRect:[self convertRect:currentRect toView:nil]]; [dragImage dissolveToPoint:NSMakePoint(NSMinX(currentRect), NSMaxY(currentRect)) fraction:(float)0.7]; [[self window] enableFlushWindow]; [[self window] flushWindow]; do { float newYInView; float deltaY; int mask = NSLeftMouseUpMask | NSLeftMouseDraggedMask; event = [NSApp nextEventMatchingMask: mask untilDate: [NSDate distantFuture] inMode: NSEventTrackingRunLoopMode dequeue: YES]; newYInView = [drawView convertPoint:[[self window] mouseLocationOutsideOfEventStream] fromView:nil].y; if (newYInView == currentMouseYInView) continue; currentMouseYInView = newYInView; deltaY = currentMouseYInView - mouseDownYInView; currentRect.origin.y = instanceRect.origin.y + deltaY; if (currentRect.origin.y < minY) currentRect.origin.y = minY; if (currentRect.origin.y > maxY) currentRect.origin.y = maxY; [[self window] disableFlushWindow]; if ([self _makeRectVisible:currentRect]) { [[self window] discardCachedImage]; } else { [[self window] restoreCachedImage]; } currentRect.origin.y -= NSMinY([drawView visibleRect]); [[self window] cacheImageInRect:[self convertRect:currentRect toView:nil]]; [dragImage dissolveToPoint:NSMakePoint(NSMinX(currentRect), NSMaxY(currentRect)) fraction:(float)0.7]; [[self window] enableFlushWindow]; [[self window] flushWindow]; } while ([event type] != NSLeftMouseUp); [self unlockFocus]; [[self window] discardCachedImage]; [dragImage release]; droppedInstance = [self instanceAtPoint:NSMakePoint(NSMidX(currentRect), NSMidY(currentRect))]; if ([droppedInstance isEqual:containerBeingDragged]) { NSMutableSet *containers; containers = [[controller selectedContainers] mutableCopy]; if ([containers containsObject:containerBeingDragged]) { [containers removeObject:containerBeingDragged]; } else { [containers addObject:containerBeingDragged]; } [controller setSelectedContainers:containers]; [containers release]; } else if (droppedInstance != nil) { NSMutableArray *order; NSEnumerator *contEnum; PajeContainer *orgContainer; BOOL before; float droppedCenter = NSMidY([(STContainerTypeLayout *)layoutDescriptor rectOfInstance:droppedInstance]); float currentCenter = NSMidY(currentRect) - 0.5 + NSMinY([drawView visibleRect]) - 0.5; before = (currentCenter < droppedCenter) || ((currentCenter == droppedCenter) && (currentMouseYInView < mouseDownYInView)); order = [NSMutableArray array]; contEnum = [controller enumeratorOfContainersTyped:entityType inContainer:container]; while ((orgContainer = [contEnum nextObject]) != nil) { if ([orgContainer isEqual:containerBeingDragged]) { continue; } else if ([orgContainer isEqual:droppedInstance]) { if (!before) [order addObject:orgContainer]; [order addObject:containerBeingDragged]; if (before) [order addObject:orgContainer]; } else { [order addObject:orgContainer]; } } [controller setOrder:order ofContainersTyped:entityType inContainer:container]; } else { [self setNeedsDisplay:YES]; } Assign(containerBeingDragged, nil); } - (void)mouseDown:(NSEvent *)event { NSPoint mouseDownLocation; hierarchyRulerPart hitPart; mouseDownLocation = [self convertPoint:[event locationInWindow] fromView:nil]; hitPart = [self hitPart:mouseDownLocation]; switch (hitPart) { case hierarchyRulerVerticalDivider: [self trackVerticalDivider:event]; break; case hierarchyRulerHorizontalDivider: [self trackHorizontalDivider:event]; break; case hierarchyRulerBox: [self trackBox:event]; break; case hierarchyRulerNone: break; default: NSAssert(NO, @"Invalid hit part in HierarchyRuler"); } } @end Paje-1.98/SpaceTimeViewer/STEntityTypeLayout.nib/0000775000175000017500000000000011674062007021643 5ustar schnorrschnorrPaje-1.98/SpaceTimeViewer/STEntityTypeLayout.nib/keyedobjects.nib0000664000175000017500000010664711674062007025026 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 156<=AE  "#+,1DIMTXdht|}  !"'(-0127:;<ADEFKNOPU\ab  $*3=AGPWX`ghlst{| 45;EJQWXYcklp<uyz~4WXk   #%*+0167<=BCHMNSXY^_dijopuv{|Wgs{  ()07>EOU^b4pv|WXky4WXky !&^+0*50:?@EFKBPUZ[`Xejoty4WXky"4WX 'k,05y8=GLPV^hlry     " ' + 1 : D H N T" [ c j n u |   4 WX k y     & *4 8 > D JWX P Wk \ ` ey h p w x       B X Y Z ] ` d e f g h k u v w y { d e f g    d e f g d d e f g d e f g e f g o  Y   v                                # $    g %  & ) ,       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP`QRSTUVWXYZ[\]^_`abcd efgh@ijklmnop?rqrstuvwxyz{~U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRoot;<:=234[NSClassName_STEntityTypeLayoutController789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FKGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ %*_acegimquy%')+-/023578:<>@ÁāŁƁ؁ށ,./012O]NSDestinationWNSLabelXNSSource  23 _STContainerLayoutEditor_NSNextResponder[NSSuperviewWNSFrameYNSEnabledXNSvFlagsVNSCell   ZNSSubviews200PQ_{{142, 61}, {55, 19}}_NSBackgroundColor[NSTextColorYNSSupportZNSContents]NSControlView_NSDrawsBackground[NSCellFlags\NSCellFlags2 aABPVNSSizeVNSNameXNSfFlags"A0 \LucidaGrande78Ӣ;VNSFontWNSColor[NSColorName\NSColorSpace]NSCatalogNameVSystem_textBackgroundColorWNSWhiteB178բ;݀YtextColorB078;_NSTextFieldCell\NSActionCell78;[NSTextField\%NSTextFieldYNSControlVNSView[NSResponder_siblingSeparationField78;_NSNibOutletConnector^NSNibConnector!$  " #_{{142, 36}, {55, 19}}ƀ! _subtypeSeparationField&) ! ' (_{{142, 11}, {55, 19}}ƀ& _heightForVariablesField-.+^ 23456789::<<=>?@ABC\NSBorderType_NSTitlePosition[NSTitleCellYNSOffsets]NSTransparent]NSContentViewYNSBoxType-,,[YZ.WE.GQ>JB.ONO-Q-[NSFrameSize/+X+Q>U0O2345678YBB\]^_`A<C1..TRS  W>e O>iklnoqr 38!AD&HKOwyz{ 4  75_{{203, 59}, {15, 22}}~k\NSAutorepeatZNSMaxValue[NSIncrement 3#@@6 #?78;]NSStepperCell78;YNSStepper 9  :_{{8, 63}, {129, 14}}l=\controlColorK0.66666669݀@_controlTextColoryz B 7C_{{203, 34}, {15, 22}}~n A6€ E F_{{8, 38}, {129, 14}}o0rt23Cs_STVariableLayoutEditor^variableEditorGH0vx23Mw_STStateLayoutEditor[stateEditorQR0zVVXZ[{{| }]._ˀQ_{{17, 384}, {236, 22}}cdefghijklmnopqrstuwxyQ|r_NSAlternateImage^NSButtonFlags2]NSButtonFlagsVNSMenuZNSMenuItem_NSAlternateContents_NSPreferredEdge_NSPeriodicDelay]NSAltersState_NSKeyEquivalent_NSUsesItemFromMenu_NSPeriodicInterval_NSArrowPosition~A@@ z KYNS.string78;_NSMutableStringXNSStringftr[]NSMnemonicLoc_NSKeyEquivModMaskWNSStateWNSTitleYNSOnImageZNSKeyEquivXNSTarget\NSMixedImageXNSAction}[NSMenuItemsUItem12^NSResourceNameWNSImage_NSMenuCheckmark78;_NSCustomResource_%NSCustomResource2_NSMenuMixedState__popUpItemAction:78gg;ZOtherViews>uOft[ɀ}UItem2ft[Ӏ}UItem378ff;78٧;_NSPopUpButtonCell^NSMenuItemCell\NSButtonCell]%NSButtonCell78ߦ;]NSPopUpButtonXNSButton_entityTypePopUp0Qz_entityTypeSelected78;_NSNibControlConnector _siblingSeparationChangedk 3 !_subtypeSeparationChangedn A &_heightForVariablesChangedq H .)^j2345678<<@AC" !W.Q>!ON% ' Q>+,-./01ȀрՀـO23456784\789`A;<CŀÀW>>;OB,,E€Q>HIJKLMNO;;SV _{{142, 34}, {55, 19}}Iƀ ;;cyzf 7_{{203, 32}, {15, 22}}~J 6;;or _{{8, 36}, {129, 14}}xKۀO    00YNSBGColorYNSDocViewYNScvFlags܀ــ݀<>݀ON !"#$%&r*+,./012_NSCellBackgroundColorYNSNumRows]NSMatrixFlagsYNSNumCols^NSSelectedCell_NSIntercellSpacingWNSCells[NSCellClass[NSProtoCellZNSCellSizeހۀۀ<D ߀6+89Odnejh<?@wBD"@FI"A  jdneKhw<?@rDUNSTag݀πjdneKhw<?@\D݀πX{39, 39}W{-1, 0}ljZndeKhw\<?_aD]NSNormalImage@defghijVNSReps\NSImageFlags V{1, 1}>mnO>qtrsvwx_NSTIFFRepresentationOMM*  RS78{||};_NSBitmapImageRepZNSImageRep78;D0 078;X%NSImage78;XNSMatrixY%NSMatrix_{{1, 1}, {228, 37}}78;ZNSClipView000YNSPercentـــ "?r._{{-100, -100}, {15, 37}}\_doScroller:78;ZNSScroller000rZNSCurValueـ"<մPـ_{{1, 38}, {228, 15}}_{{3, 101}, {230, 54}}78;\NSScrollView7>O   11XNSBounds<>ON !"#$%r*0<  <>܁  Odnejh?@wBDρ FIjdneKhw?@rDρ jdneKhw?@\Dρ ljZndeKhw?_aDρ deghj>O>trv xOMM* RS_{{0, 2}, {228, 37}}111 111r_{{3, 179}, {230, 54}}!<$#݀I')&j[heightFieldJ-)(j]heightStepperM3)*j\widthStepperL9),jZwidthField)?Ij.]heightChanged)?Jj.)JMj1\widthChanged)JLj1)U-j4_displayValueChanged-[)ȁ6j_displayValueSwitch0)bjf)9j[shapeMatrixl)݁;jZdrawMatrix)rj=]shapeSelected)xj?_drawFunctionSelected}.GA^v2345678<<@ACCBBDW.πЀQ>DON}}EAAQ>FdhlpO2345678\`A<CGDDa_`HW>HOIFF^Q>JMPTWZOƁHHK LƀJ yzՁHHN 7O~ M6HHQ RPILKrO   VYY\sppt<t>_YtON !"#$%cIIr*ghjk0mnurr<w{ v|}z<>qgstwxyOdnejh<Y?@wBDtπjdneKhw<Y?@rDtπjdneKhw<Y?@\DtπljZndeKhw<?_aD~πdeghj>O>trvxppp rppp7DD>O   <>ÁON !"#$%r*0< <>ށOdnejh<?@wBDπjdneKhw<?@rDπjdneKhw<?@\DπljZndeKhw<?_aDπdeghj>O>trvx r<݀0Gbv(GdvYlGt;v2GJv7GMv<GTv_insetAmountFieldBGWv_insetAmountStepperfG9vGMvJGMvMGWvW_insetAmountChangedGWvTGbv€dGrÀv=GxYv?t03bnul3ǁ;nN !"#$%z{{r*~0ɁȁȀ<ˁ ʁЀс΀<   uuǀ<ǁ>~ˁ́̀Odnejh<u?@wBDǀπjdneKhw<u?@rDǀπjdneKhw<u?@\DǀπljZndeKhw<?_aDҀπdeghjӀ>ՀO>trրvx׀3ف݀nˁځځ Qƀ ^lineWidthField3߁nyzځځ 7~ ߀6_lineWidthStepperf39nN !"#$%r*0< <   <>   Odnejh<?@wBDπjdneKhw<?@rDπjdneKhw<?@\DπljZndeKhw"<?_aDπde(gh+j>-.O>1tr3v6x9.3^n2345678>??<<ABC@AEC)'(WH.Jր׀Q>MEONQ9S9&Q>WYZ O2345678_EE\bcd`A<CڀW>iƁڀO>mpف߁Ouxځځ }p{ȁO>uǀOā rˁ_{{3, 142}, {230, 54}}7EE%">Ӂ"O>O !r#$_{{3, 220}, {230, 54}}<+*݀3n-_lineWidthChanged3܀n-3xun?3rn=0=br .=3^r2345678   <<   @A C5446W #. %Q> ( 6ON ,  . 733Q> 2 3 4 5 6 7 88LPTpO2345678 ; \ > ? @`A B<C966IGH:W> E B:O I 3 3 L;88FQ> O P Q R<?BO B B W Z::= > Pƀ<  B B fyz i::@ 7A~ Q ?6 B B q t::C D y R VilO    6 6   WTTX<Xh> XON !"#$% r* 0 YVV<[_ Z`a^<> с[\]Odnejh< ?@wBDXπjdneKhw< ?@rDXπjdneKhw< ?@\DXπljZndeKhw <?_aDbπde gh jcd> eO> tr fv xg 6 6 6  TTTj k 6 6 6 r TTTmn_{{3, 120}, {230, 54}}7      q66rr>    rO     7 7 ! ! $sppt<t> ' !tON !"#$% +  r* / 0 2 30 5 6urr<w{ v|}z<> 9 / ; <wxyOdnejh< !?@wBDtπjdneKhw< !?@rDtπjdneKhw< !?@\DtπljZndeKhw R<?_aD~πde Xgh [j> ] ^O> atr cv fx 7 7 7 l oppp  7 7 7 tr vppp_{{3, 198}, {230, 54}} { ~66 Ё_{{0, 275}, {235, 18}}lcdnejh 8\̀π_Show min&max values <݀ l=X;r P =<r Q =?r !f=t9r 8 =r_showMinMaxSwitch=  Pr<=  Qr?=  8r_showMinMaxChanged=x r?X=r !r=t> tz  4 1G ! 3K Bs8- 6t /M 0 BgIV op Pl Q ;)u~Nt R 7r ZY9 3 8LJ 5k ;q:=,/}Y <.?+u-9 Q En Ѐ݀0X]L[! vt83.Zx ȁTylw4فÁ:فWwpD{TBрDP<̀8F?xjǀˀBpKہ h ߀nJ P3H,rՁdAMtyс+H6zڀ& Á\ C D E F G H I J K L M`\ N O P Q R S U V W_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClassx_{{546, 328}, {270, 413}}UEvent [WNSPanel ^TView> a O_{{1, 1}, {270, 413}}_{{0, 0}, {1280, 1002}}Z{213, 213}\{1000, 1022}78 i j j;_NSWindowTemplate C D E F G H I J K L M`\ l m n o p q  U V t4_{{578, 268}, {270, 413}}XVariable [ ^> | 3O C D E F G H I J K L M \ V U V ́́΀{_{{379, 470}, {270, 413}}^Shapes & Sizes [ ^> Q zO234568 VV< AC\€{{ǁŁW> ÀO   ĀQ_{{2, 2}, {125, 1}}_{{0, 376}, {270, 5}} <ʁɁȀ "AP݀> }AO C D E F G H I J K L M`\ ? U V ÁفӁԁҁ؁ځ_{{586, 288}, {270, 413}}TLink [ ^> 9O C D E F G H I J K L M`\ : U V ׁ݁ށ܁,_{{502, 352}, {270, 413}}YContainer [ ^> -+O C D E F G H I J K L M`\  U V B_{{566, 308}, {270, 413}}UState [ ^> tz0B 60  000 7 ; -Y Y !;0   3Y;}  0t Bu B !0 u;Q B 0EE?tE00 ;; V , 0 ! Et:1 V9uE ـ.TX6X p64+Ht݀6tDt8ځHtDAH Hځ:ǀ D:tǀz:6 D ڀH066 { ۀDBHptс݀,F݁3{D  ǁX> ptN 4 G 3 KB-M 0 B I  P Qopl)Nt Rr ZY9 3 8 5LJk ;q=,/}.u- Q En0L!v 83.Zȁl:ÁفWсDT<?DP8FjBKہ h ߀nJ P3HrՁdMAр+H6zڀ&A> tN M / 9 C          w      ko "#$%&'()s*+,-./0123456789\NSTextField1\NSTextField2]NSTextField11YNSButton4]NSCustomView1TMain\File's Owner\NSCustomView[NSMenuItem1YPopUpList]NSTextField12[NSMenuItem2 !78 ! ! ";VNSNullW%NSNullVNSBox1]NSCustomView2\NSTextField3> 't> *t> -tn {|[O ;Nu]TM3 7:g 4hV,cX PoioGSqU-MHId}e  lwK Gt8}^Y 5\. _Rj;u / 8 RlJn~ 3EY q)? Q Yasbx`szB +pVv-tLL uJN=r Q tZfy/ P I ! <Q1 m9W9~ k 6pKr0 g0Z BkāTŀgxPBǁ%y〻n Áp,wL8HF0J!0> t       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁9-Dw[2F] |h4>Q6q$13J+\%'RSv@nxL{I_M0r?(z! = 7O~PNp }B*:G, /8TkZ.yHmu5o)<Ut;s>|O>t>t78;^NSIBObjectData#,1:LQVdfz  " 0 L Y l s        ' ) + J S \ g l { s u w y { }           # & ) , / 2 5 8 ; > @ Q _ g p r t v x      * , . 0 2 4 L q %*,.1>GLShp|!*3ER[ht#%')*,.Fkmoqsuvx6GIKMO  4@BDFHJSVXZ  'DQ\hiktv{ *,.0246;@Ynprtv+,.0MOQSTVXo024679;Rsuwy{}"$&(*,7DRT]flw  .0246Qbdfhj$&(=HY[]_ajln0358:S(:Odvx&4HPXbmv*>KMOQdx "$&(*,2;@IXl{ +<>@BD_prtvx    $ & ( * , a c e g j m p q s u !!!!!!!#!%!&!(!*!3!6!8!:!O!Q!S!U!W!Y!b!o!q!s!u!w!y!{!}!!!!!!!!!!!!!!!!" """""""/"L"M"O"Q"n"p"r"t"u"w"y""""""""""""""""##)#+#-#/#1#3#4#6#S#U#W#Y#Z#\#^#u#################$$$ $ $8$U$W$Y$[$]$_$l$n$$$$$$$$$$$$$$$$$$$%%%(%*%,%5%>%C%Y%b%m%v%%%%%%%%%%%%%%%%%%&&&&&&&!&9&Z&\&^&`&b&d&f&k&&&&&&&&&&&&&&&&&&&&&&'')'3'='?'A'C'E'G'I'K'M'P'R'['^'`'b''''''(((('(2(4(6(8(:(?(A(C(D(F(H(J(L(N(P(Z(c(j(l(n(p(r((((((((((((((())))))) )Q)S)U)W)Y)[)d)l)))))))))))))))))** *****#*(***,*.*7*N*P*R++ ++$+/+8+=+J+O+Q+Z+a+j+s++++++++++++++,,,,",/,8,C,N,s,~,,,,,,,,,,,,- - ------- -"-+-2-5-8-;-=-j-s-v-x-{-}---------------------... ......L.O.R.U.W.Z.k.m.o............/ /"/%/(/*/,///D/G/I/K/N/W/Z/]/_/h/m/o/r/t/}//010G0p0r0t0v0y0z0|00000000000000011111111(191;1>1@1B1P1a1c1f1h1j1w111111111111111111111122222220222527292O2`2b2e2g2i2~22222222222222222222223 333"3$3&3=3N3Q3S3U3W333333333333333333333333334 4 4444444R4U4X4[4^4a4d4e4h4j4s4v4y4{444444444444444444444455555!5$5%5'5D5G5J5M5N5P5S5p5q5t5v5555555555555555555556"6$6&6(6*6-6.606M6P6S6V6W6Y6\6y6z6}666666666666666677777 7 77797<7?7B7C7E7H7}777777777777777777777888!8$8'8(8*8-8N8P8R8T8W8Z8\888888888888888888888888899 9 99U9X9[9^9`9c9f9g9j9m9o9r9u9w999999999999999::::7:9:;:>:@:B:w:y:|:~::::::::::::::::::::::;;;; ; ;;3;6;9;<;?;A;D;q;t;w;z;};;;;;;;;;;;;;;;;;;;;;;;;<=<@>>!>$>'>)>,>I>K>N>P>S>U>b>d>u>w>y>{>}>>>>>>>>>>>>>>>>>>>>>>?????(?+?.?0?2?G?X?[?^?`?b?s?u?x?z?}?????????????????????@@@@@@*@,@/@1@4@E@G@I@K@M@^@a@d@f@h@@@@@@@@@@@@@@@@AAAAA AAAA A#A&A)A+AXAZA\A_AaAcAAAAAAAAAAAABBBBBBBB2B5B7B9BFGFJFMFOFdFgFjFmFpFrF{FFFFFFFFFFFFFFFFFFFFFFGGG GGG-G0G3G6G7G9GN@N]N`NcNfNgNiNlNNNNNNNNNNNNNNNNOOOOO!O$O&OSOVOYO\O_ObOeOhOkOmOvO}OOOOOOOOOOOOOOOOOPP"P%P(P*P-P0P1P4P7P9Pb@bCbEbHbKbNbQbTbVbYb[b^babcbfbhbkbnbqbsbubwbzb|b~bbbbbbbbbbbbbbbbbbbbcScVcYc\c_cbcdcfciclcocrcucxc{c~cccccccccccccccccccccccccccccccccccccccccccddddd ddddddd d#d&d)d,d/d2d5d8d:dGdTdbdldzddddddddddddddeeeeee'e(e*e3fffffffffffffffffffffffgggg g gggggggg"g%g'g*g,g.g1g3g6g9gg@gCgFgHgKgNgPgRgTgWgZg]g_gagdgggjgmgpgsgugxgzg}gggggggggggggggggggggggggggggggggggggggggggggggghhhh h hhhhhhhh"h$h'h)h+h.h0h2h4h6h9hlAlDlGlJlMlPlSlVlYl\l_lblelhlklnlqltlwlzl}llllllllllllllllllllllllllllllllllllllllllllllllllllllmmmmmm m mmmmmmmmmm m"m$m&m(m*m,m.m0m2m4m6m8m:mm@mBmDmFmHmJmLmNmPmRmTmVmXmZm\m^m`mbmdmfmhmjmlmnmpmrmtmvmxmzm|m~mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnnnn n nnnnnnnnnn n"n$n&n(n*n,n.n0n2n4n6n8nAnBnDnMnNnPnYnZn\nenjnyPaje-1.98/SpaceTimeViewer/STEntityTypeLayout.nib/info.nib0000664000175000017500000000110111674062007023261 0ustar schnorrschnorr IBDocumentLocation 45 680 356 240 0 0 1280 1002 IBFramework Version 446.1 IBOpenObjects 58 194 10 159 12 118 IBSystem Version 8P135 Paje-1.98/SpaceTimeViewer/STEntityTypeLayout.nib/classes.nib0000664000175000017500000000705611674062007024002 0ustar schnorrschnorr{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = NSDatePicker; LANGUAGE = ObjC; SUPERCLASS = NSControl; }, { ACTIONS = { heightForVariablesChanged = id; siblingSeparationChanged = id; subtypeSeparationChanged = id; }; CLASS = STContainerLayoutEditor; LANGUAGE = ObjC; OUTLETS = { heightForVariablesField = NSTextField; heightForVariablesStepper = NSStepper; siblingSeparationField = NSTextField; siblingSeparationStepper = NSStepper; subtypeSeparationField = NSTextField; subtypeSeparationStepper = NSStepper; }; SUPERCLASS = STLayoutEditor; }, { ACTIONS = {entityTypeSelected = id; }; CLASS = STEntityTypeLayoutController; LANGUAGE = ObjC; OUTLETS = { containerEditor = STContainerLayoutEditor; entityTypePopUp = NSPopUpButton; eventEditor = STEventLayoutEditor; linkEditor = STLinkLayoutEditor; stateEditor = STStateLayoutEditor; variableEditor = STVariableLayoutEditor; }; SUPERCLASS = NSObject; }, { ACTIONS = {displayValueChanged = id; heightChanged = id; widthChanged = id; }; CLASS = STEventLayoutEditor; LANGUAGE = ObjC; OUTLETS = { displayValueSwitch = NSButton; heightField = NSTextField; heightStepper = NSStepper; widthField = NSTextField; widthStepper = NSStepper; }; SUPERCLASS = STShapedLayoutEditor; }, { CLASS = STLayoutEditor; LANGUAGE = ObjC; OUTLETS = {box = NSBox; controller = STEntityTypeLayoutController; }; SUPERCLASS = NSObject; }, { ACTIONS = {lineWidthChanged = id; }; CLASS = STLinkLayoutEditor; LANGUAGE = ObjC; OUTLETS = {lineWidthField = NSTextField; lineWidthStepper = NSStepper; }; SUPERCLASS = STShapedLayoutEditor; }, { ACTIONS = {drawFunctionSelected = id; shapeSelected = id; }; CLASS = STShapedLayoutEditor; LANGUAGE = ObjC; OUTLETS = {drawMatrix = NSMatrix; shapeMatrix = NSMatrix; }; SUPERCLASS = STLayoutEditor; }, { ACTIONS = {displayValueChanged = id; heightChanged = id; insetAmountChanged = id; }; CLASS = STStateLayoutEditor; LANGUAGE = ObjC; OUTLETS = { displayValueSwitch = NSButton; heightField = NSTextField; heightStepper = NSStepper; insetAmountField = NSTextField; insetAmountStepper = NSStepper; }; SUPERCLASS = STShapedLayoutEditor; }, { ACTIONS = {lineWidthChanged = id; showMinMaxChanged = id; }; CLASS = STVariableLayoutEditor; LANGUAGE = ObjC; OUTLETS = { lineWidthField = NSTextField; lineWidthStepper = NSStepper; showMinMaxSwitch = NSButton; }; SUPERCLASS = STShapedLayoutEditor; } ); IBVersion = 1; }Paje-1.98/SpaceTimeViewer/STEntityTypeLayout.gorm/0000775000175000017500000000000011674062007022037 5ustar schnorrschnorrPaje-1.98/SpaceTimeViewer/STEntityTypeLayout.gorm/data.info0000664000175000017500000000027011674062007023624 0ustar schnorrschnorrGNUstep archive00002c88:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed StreamPaje-1.98/SpaceTimeViewer/STEntityTypeLayout.gorm/data.classes0000664000175000017500000000460211674062007024331 0ustar schnorrschnorr{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "displayValueChanged:", "drawFunctionSelected:", "entityTypeSelected:", "heightChanged:", "heightForVariablesChanged:", "initWithDelegate:", "insetAmountChanged:", "lineWidthChanged:", "maxValueChanged:", "minValueChanged:", "shapeSelected:", "siblingSeparationChanged:", "subtypeSeparationChanged:", "showMinMaxChanged:", "widthChanged:" ); Super = NSObject; }; STContainerLayoutEditor = { Actions = ( "siblingSeparationChanged:", "subtypeSeparationChanged:", "heightForVariablesChanged:" ); Outlets = ( siblingSeparationField, subtypeSeparationField, heightForVariablesField, subtypeSeparationStepper, siblingSeparationStepper, heightForVariablesStepper ); Super = STLayoutEditor; }; STEntityTypeLayoutController = { Actions = ( "initWithDelegate:", "entityTypeSelected:" ); Outlets = ( entityTypePopUp, containerEditor, variableEditor, linkEditor, eventEditor, stateEditor ); Super = NSObject; }; STEventLayoutEditor = { Actions = ( "heightChanged:", "widthChanged:", "displayValueChanged:" ); Outlets = ( displayValueSwitch, heightField, widthField, widthStepper, heightStepper ); Super = STShapedLayoutEditor; }; STLayoutEditor = { Actions = ( ); Outlets = ( box, controller ); Super = NSObject; }; STLinkLayoutEditor = { Actions = ( "lineWidthChanged:" ); Outlets = ( lineWidthField, lineWidthStepper ); Super = STShapedLayoutEditor; }; STShapedLayoutEditor = { Actions = ( "drawFunctionSelected:", "shapeSelected:" ); Outlets = ( shapeMatrix, drawMatrix ); Super = STLayoutEditor; }; STStateLayoutEditor = { Actions = ( "heightChanged:", "insetAmountChanged:", "displayValueChanged:" ); Outlets = ( displayValueSwitch, heightField, insetAmountField, heightStepper, insetAmountStepper ); Super = STShapedLayoutEditor; }; STVariableLayoutEditor = { Actions = ( "lineWidthChanged:", "showMinMaxChanged:" ); Outlets = ( lineWidthField, showMinMaxSwitch, lineWidthStepper ); Super = STShapedLayoutEditor; }; }Paje-1.98/SpaceTimeViewer/STEntityTypeLayout.gorm/objects.gorm0000664000175000017500000013106311674062007024362 0ustar schnorrschnorrGNUstep archive00002c88:0000002d:0000044a:00000000:01GSNibContainer1NSObject01 GSMutableSet1 NSMutableSet1NSSet& 01GSWindowTemplate1GSClassSwapper01NSString&%NSPanel1 NSPanel1 NSWindow1 NSResponder% ? A C C& % D@ C01 NSView% ? A C C  C C&01 NSMutableArray1NSArray&01NSBox% A A  Cz C  Cz C&0 &0 %  Cz C  Cz C&0 &0 % C Cz BD  Cz BD& 0 &0 % @ @ Cv A  Cv A&0 &01 NSTextField1 NSControl% B A B` A  B` A&0 &%01NSTextFieldCell1 NSActionCell1NSCell0&01NSFont%&&&&&&&&0&&&&&&%01NSColor0&%NSNamedColorSpace0&%System0&%textBackgroundColor00& % textColor0% B A B A  B A&0 &%00& % Line width:0% A@&&&&&&&&0&&&&&&%00 &%System0!&%textBackgroundColor0" 0#& % textColor0$1 NSStepper% C7 A A A  A A&0% &%0&1 NSStepperCell0'&%00(1NSNumber1NSValuei%&&&&&&&&&&&&&&% @@ ?%%0)0*& % Dimensions*&&&&&&&&&&&&&& %%0+% C B A  B A& 0, &%0-0.&%Shape:0/% A0.&&&&&&&&0&&&&&&%0001&%System02&%textBackgroundColor0304&%NSCalibratedWhiteColorSpace > ?05% C8 B A  B A& 06 &%0708&%Draw:/8&&&&&&&&0&&&&&&%090:&%System0;&%textBackgroundColor0<4 > ?0=1 NSScrollView% CL Cz Bt  Cz Bt& 0> &0?1 NSClipView% @ @ Cv B  Cv B&0@ &0A1NSMatrix%  Cj B  Cj B&0B &%0C0D&&&&&&&&&&&&&&&%% B B 0E0F&%System0G&%controlBackgroundColorE0H& % NSButtonCell0I1 NSButtonCell0J&%Button&&&&&&&&&&&&&&%0K&0L&&&& &&%%0M &0NJ&&&&&&&&&&&&&&%K0O&&&& &&0PJ&&&&&&&&&&&&&&%K0Q&&&& &&0RJ&&&&&&&&&&&&&&%K0S&&&& &&0TJ&&&&&&&&&&&&&&%K0U&&&& &&0VJ&&&&&&&&&&&&&&%K0W&&&& &&0XJ&&&&&&&&&&&&&&%K0Y&&&& &&NE0Z1 NSScroller% @ B$ Cv A  Cv A&0[ &%0\0]&&&&&&&&&&&&&&&&?% A A A A Z0^% B Cz Bt  Cz Bt& 0_ &0`% @ @ Cv B  Cv B&0a &0b%  B B  B B&0c &%0d0e&&&&&&&&&&&&&&&%% B B 0f0g&%System0h&%controlBackgroundColorf0i& % NSButtonCell0j0k&%Button&&&&&&&&&&&&&&%0l&0m&&&& &&%%0n &0ok&&&&&&&&&&&&&&%l0p&&&& &&0qk&&&&&&&&&&&&&&%l0r&&&& &&0sk&&&&&&&&&&&&&&%l0t&&&& &&of0u% @ B$ Cv A  Cv A&0v &%0w]&&&&&&&&&&&&&&&`% A A A A u0x0y&%Box&&&&&&&&&&&&&& %%0z0{&%System0|&%windowBackgroundColor0}&%Window0~&%Panel~ @@ B F@ F@%&   D D@01 GSNibItem0&%STVariableLayoutEditor  &0 0&%STStateLayoutEditor  &0 0&%STLinkLayoutEditor  &0 % ? A C C& % D D0 % ? A C C  C C&0 &0% A A  Cz C  Cz C&0 &0 %  Cz C  Cz C&0 &0% C Cz B@  Cz B@& 0 &0 % @ @ Cl A  Cl A&0 &0% C ? B` A  B` A& 0 &%00&&&&&&&&&0&&&&&&%00&%System0&%textBackgroundColor00& % textColor0% ? C A  C A& 0 &%00& % Line width:&&&&&&&&0&&&&&&%00&%System0&%textBackgroundColor00& % textColor0% CA ? A A  A A& 0 &%00&%0(&&&&&&&&&&&&&&% @@ ?%%00& % Dimensions&&&&&&&&&&&&&& @ @%%01!NSButton% C Cz A  Cz A& 0 &%00&%Show min&max values01"NSImage01#NSMutableString&%common_SwitchOff&&&&&&&&&&&&&&%0&0&0"0#&%common_SwitchOn&&& &&0% Cl B A  B A& 0 &%00&%Shape:/&&&&&&&&0&&&&&&%00&%System0&%textBackgroundColor04 > ?0% C B A  B A& 0 &%00&%Draw:/&&&&&&&&0&&&&&&%00&%System0&%textBackgroundColor04 > ?0±% C/ Cz Bt  Cz Bt& 0ñ &0ı% @ @ Cv B  Cv B&0ű &0Ʊ%  Cj B  Cj B&0DZ &%0ȱ0ɱ&&&&&&&&&&&&&&&%% B B 0ʱ0˱&%System0̱&%controlBackgroundColor0ͱ& % NSButtonCell0α0ϱ&%Button&&&&&&&&&&&&&&%0б&0ѱ&&&& &&%%0ұ &0ӱϐ&&&&&&&&&&&&&&%А0Ա&&&& &&0ձϐ&&&&&&&&&&&&&&%А0ֱ&&&& &&0ױϐ&&&&&&&&&&&&&&%А0ر&&&& &&0ٱϐ&&&&&&&&&&&&&&%А0ڱ&&&& &&0۱ϐ&&&&&&&&&&&&&&%А0ܱ&&&& &&0ݱϐ&&&&&&&&&&&&&&%А0ޱ&&&& &&Ӱ0߱% @ B$ Cv A  Cv A&0 &%00&&&&&&&&&&&&&&&&% A A A A 0% B Cz Bt  Cz Bt& 0 &0% @ @ Cv B  Cv B&0 &0%  B B  B B&0 &%00&&&&&&&&&&&&&&&%% B B 00&%System0&%controlBackgroundColor0& % NSButtonCell00&%Button&&&&&&&&&&&&&&%0&0&&&& &&%%0 &0&&&&&&&&&&&&&&%0&&&& &&0&&&&&&&&&&&&&&%0&&&& &&0&&&&&&&&&&&&&&%0&&&& &&0% @ B$ Cv A  Cv A&0 &%0␰&&&&&&&&&&&&&&&% A A A A 00&%Box&&&&&&&&&&&&&& %%z}~~ @@ B F@ F@%&   D D@0 % ? A C C& % C D%P % ? A C C  C C&P &P1$ NSPopUpButton% A C Cx A  Cx A& P &%P1%NSPopUpButtonCell1&NSMenuItemCellP&&&&&&&&&P1'NSMenuP&P &P 1( NSMenuItemP &%Item 1&&%%P (P &%Item 2&&%%P (P&%Item 3&&%%&&&&&&%P&&&& &&%%%%%PP&%SystemP&%windowBackgroundColorP&%WindowP&%Panel @@ B F@ F@%&   D D@P % ? A C C&% D) D:P % ? A C C  C C&P &P% A A  Cz C  Cz C&P &P %  Cz C  Cz C&P &P!% C Cz A  Cz A&P &%PP&%Display value on event&&&&&&&&&&&&&&%P &P!&&&& &&P"% Cq Cz B  Cz B& P# &P$ % @ @ Cv BD  Cv BD&P% &P&% B A B` A  B` A&P' &%P(P)&)&&&&&&&&0&&&&&&%P*P+&%SystemP,&%textBackgroundColorP-+P.& % textColorP/% B @@ B` A  B` A&P0 &%P1P2&2&&&&&&&&0&&&&&&%P3P4&%SystemP5&%textBackgroundColorP64P7& % textColorP8% B A B A  B A&P9 &%P:P;&%Height:;&&&&&&&&0&&&&&&%P<P=&%SystemP>&%textBackgroundColorP?=P@& % textColorPA% B @@ B A  B A&PB &%PCPD&%Width:D&&&&&&&&0&&&&&&%PEPF&%SystemPG&%textBackgroundColorPHFPI& % textColorPJ% C7 A A A  A A& PK &%PLPM&%0(&&&&&&&&&&&&&&% @@ ?%%PN% C7 @@ A A  A A& PO &%PPPQ&%0(&&&&&&&&&&&&&&% @@ ?%%PRPS& % DimensionsS&&&&&&&&&&&&&& %%PT% C_ B A  B A& PU &%PVPW&%Shape:/W&&&&&&&&0&&&&&&%PXPY&%SystemPZ&%textBackgroundColorP[4 > ?P\% C B A  B A& P] &%P^P_&%Draw:/_&&&&&&&&0&&&&&&%P`Pa&%SystemPb&%textBackgroundColorPc4 > ?Pd% C" Cz Bt  Cz Bt& Pe &Pf% @ @ Cv B  Cv B&Pg &Ph%  Cj B  Cj B&Pi &%PjPk&&&&&&&&&&&&&&&%% B B PlPm&%SystemPn&%controlBackgroundColorlPo& % NSButtonCellPpPq&%Button&&&&&&&&&&&&&&%Pr&Ps&&&& &&%%Pt &Puq&&&&&&&&&&&&&&%rPv&&&& &&Pwq&&&&&&&&&&&&&&%rPx&&&& &&Pyq&&&&&&&&&&&&&&%rPz&&&& &&P{q&&&&&&&&&&&&&&%rP|&&&& &&P}q&&&&&&&&&&&&&&%rP~&&&& &&Pq&&&&&&&&&&&&&&%rP&&&& &&ulP% @ B$ Cv A  Cv A&P &%PP&&&&&&&&&&&&&&&&f% A A A A P% B Cz Bt  Cz Bt& P &P% @ @ Cv B  Cv B&P &P%  B B  B B&P &%PP&&&&&&&&&&&&&&&%% B B PP&%SystemP&%controlBackgroundColorP& % NSButtonCellPP&%Button&&&&&&&&&&&&&&%P&P&&&& &&%%P &P&&&&&&&&&&&&&&%P&&&& &&P&&&&&&&&&&&&&&%P&&&& &&P&&&&&&&&&&&&&&%P&&&& &&P% @ B$ Cv A  Cv A&P &%P&&&&&&&&&&&&&&&% A A A A PP&%Box&&&&&&&&&&&&&& %% @@ B F@ F@%&   D D@P P&%STContainerLayoutEditor  &P P&%STEventLayoutEditor  &P % ? A C C& % D# CP % ? A C C  C C&P &P% A A  Cz C  Cz C&P &P %  Cz C  Cz C&P &P% Ci Cz B  Cz B& P &P % @ @ Cl B  Cl B&P &  P% C BP B` A  B` A& P &%PP&&&&&&&&&0&&&&&&%PP&%SystemP&%textBackgroundColorPP& % textColorP% C A B` A  B` A& P &%PP&&&&&&&&&0&&&&&&%PP&%SystemP&%textBackgroundColorPP& % textColorP±% C  B` A  B` A& Pñ &%PıPű&&&&&&&&&0&&&&&&%PƱPDZ&%SystemPȱ&%textBackgroundColorPɱPʱ& % textColorP˱% @ BP C A  C A& P̱ &%PͱPα&%Container Separation:&&&&&&&&0&&&&&&%PϱPб&%SystemPѱ&%textBackgroundColorPұPӱ& % textColorPԱ% @ A C A  C A& Pձ &%PֱPױ&%Subtype Separation:&&&&&&&&0&&&&&&%PرPٱ&%SystemPڱ&%textBackgroundColorP۱Pܱ& % textColorPݱ% @  C A  C A& Pޱ &%P߱P&%Height for Variables:&&&&&&&&0&&&&&&%PP&%SystemP&%textBackgroundColorPP& % textColorP% CQ BP A A  A A& P &%PP&%0(&&&&&&&&&&&&&&% @@ ?%%P% CQ A A A  A A& P &%PP&%0(&&&&&&&&&&&&&&% @@ ?%%P% CQ  A A  A A& P &%PP&%0(&&&&&&&&&&&&&&% @@ ?%%PP& % Dimensions&&&&&&&&&&&&&& @ @%%PP&&&&&&&&&&&&&&& %%z}~~ @@ B F@ F@%&   D D@P % ? A C C& % D@ CP % ? A C C  C C&P &P% A A  Cz C  Cz C&P &P %  Cz C  Cz C&P &P!% C Cz A  Cz A&P &%PP&%Display value on state&&&&&&&&&&&&&&%P&P&&&& &&P% Cq Cz B  Cz B& P &P % @ @ Cv BD  Cv BD&P &P% B A B` A  B` A&P &%P P & &&&&&&&&0&&&&&&%P P &%SystemP &%textBackgroundColorP P& % textColorP% B @@ B` A  B` A&P &%PP&&&&&&&&&0&&&&&&%PP&%SystemP&%textBackgroundColorPP& % textColorP% B A B A  B A&P &%PP&%Height:&&&&&&&&0&&&&&&%PP&%SystemP&%textBackgroundColorP P!& % textColorP"% B @@ B A  B A&P# &%P$P%& % Inset by:%&&&&&&&&0&&&&&&%P&P'&%SystemP(&%textBackgroundColorP)'P*& % textColorP+% C7 A A A  A A& P, &%P-P.&%0(&&&&&&&&&&&&&&% @@ ?%%P/% C7 @@ A A  A A&P0 &%P1P2&%0(&&&&&&&&&&&&&&% @@ ?%%P3P4& % Dimensions4&&&&&&&&&&&&&& %%P5% C_ B A  B A& P6 &%P7P8&%Shape:/8&&&&&&&&0&&&&&&%P9P:&%SystemP;&%textBackgroundColorP<4 > ?P=% C B A  B A& P> &%P?P@&%Draw:/@&&&&&&&&0&&&&&&%PAPB&%SystemPC&%textBackgroundColorPD4 > ?PE% C" Cz Bt  Cz Bt& PF &PG% @ @ Cv B  Cv B&PH &PI%  Cj B  Cj B&PJ &%PKPL&&&&&&&&&&&&&&&%% B B PMPN&%SystemPO&%controlBackgroundColorMPP& % NSButtonCellPQPR&%Button&&&&&&&&&&&&&&%PS&PT&&&& &&%%PU &PVR&&&&&&&&&&&&&&%SPW&&&& &&PXR&&&&&&&&&&&&&&%SPY&&&& &&PZR&&&&&&&&&&&&&&%SP[&&&& &&P\R&&&&&&&&&&&&&&%SP]&&&& &&P^R&&&&&&&&&&&&&&%SP_&&&& &&P`R&&&&&&&&&&&&&&%SPa&&&& &&VMPb% @ B$ Cv A  Cv A&Pc &%Pd]&&&&&&&&&&&&&&&G% A A A A bPe% B Cz Bt  Cz Bt& Pf &Pg% @ @ Cv B  Cv B&Ph &Pi%  B B  B B&Pj &%PkPl&&&&&&&&&&&&&&&%% B B PmPn&%SystemPo&%controlBackgroundColormPp& % NSButtonCellPqPr&%Button&&&&&&&&&&&&&&%Ps&Pt&&&& &&%%Pu &Pvr&&&&&&&&&&&&&&%sPw&&&& &&Pxr&&&&&&&&&&&&&&%sPy&&&& &&Pzr&&&&&&&&&&&&&&%sP{&&&& &&vmP|% @ B$ Cv A  Cv A&P} &%P~]&&&&&&&&&&&&&&&g% A A A A |PP&%Box&&&&&&&&&&&&&& %%z}~~ @@ B F@ F@%&   D D@P &P &P1)NSMutableDictionary1* NSDictionary&xP& % Matrix(6)AP&%View(12)P&%Box(1)"P&%Panel(0)P& % Scroller(15)P% @ @ A Bd  A Bd&P &%P]&&&&&&&&&&&&&&&P& % TextField(5)8P&%View(3)P& % TextField(29)P& % Button(0)P& % ClipView(4)gP& % Scroller(6)bP& % Stepper(6)P& % TextField(17)P& % TextField(1)\P&%STLinkLayoutEditor(0)P&%Box(6)P&%NSOwnerP&%STEntityTypeLayoutControllerP& % ClipView(0)fP& % Stepper(2)P& % ScrollView(1)P&%Panel(5)P& % MenuItem(1) P&%View(8) P& % ClipView(9)P& % Matrix(7)bP&%Box(2)P& % TextField(21)P&%View(13)P&%Panel(1)P& % TextField(6)AP&%View(4)P& % Scroller(16)P% @ @ A Bd  A Bd&P &%P]&&&&&&&&&&&&&&&P& % Button(1)P& % Stepper(7)P& % ScrollView(6)=P& % Scroller(7)|P& % Matrix(3)IP& % TextField(18)+P& % Scroller(12)ZP&%View(0)P&%Box(7)P& % ClipView(1)P& % Scroller(3)P% @ @ A BH  A BH&P &%P&&&&&&&&&&&&&&&P& % Stepper(3)$P& % TextField(14)P& % MenuItem(2) P&%View(9) P& % Scroller(20)P& % TextField(22)P&%View(14)P&%Box(3)P&%Panel(2)P±& % TextField(10)"Pñ& % TextField(7)Pı&%View(5)Pű&%STEventLayoutEditor(0)PƱ& % TextField(30)PDZ& % Button(2)Pȱ& % ClipView(6)?Pɱ&%PopUpButton(0)Pʱ& % Stepper(8)P˱& % Matrix(11)P̱& % ScrollView(7)^Pͱ& % Matrix(4)iPα& % TextField(19)5Pϱ&%View(10)Pб& % TextField(3)&Pѱ&%View(1)Pұ& % Scroller(13)uPӱ&%Box(8)PԱ& % TextField(27)Pձ&%STVariableLayoutEditor(0)Pֱ& % ScrollView(3)EPױ& % Scroller(4)Pر% @ @ A BX  A BX&Pٱ &%Pڱ&&&&&&&&&&&&&&&P۱& % Stepper(4)JPܱ&%STStateLayoutEditor(0)Pݱ& % Matrix(0)hPޱ& % TextField(15)P߱& % Scroller(21)P% @ @ A Bd  A Bd&P &%P␰&&&&&&&&&&&&&&&P& % Matrix(9)P&%View(15)P&%Box(4)P&%ScrollView(11)P& % Scroller(0)P& % Stepper(0)+P&%Panel(3)P& % TextField(11)5P& % Scroller(18)P& % TextField(8)P&%View(6)P& % TextField(31)P& % ClipView(7)`P& % Scroller(9)P% @ @ A Bd  A Bd&P &%P]&&&&&&&&&&&&&&&P&%View(11)P&%Box(0)P& % TextField(4)/P&%View(2)$P&%Box(9)P& % TextField(28)P& % ClipView(3)GP& % Stepper(5)NP& % ScrollView(4)eP& % Matrix(1)P& % TextField(16)P& % Scroller(22)P% @ @ A Bd  A Bd&P &%P␰&&&&&&&&&&&&&&&P& % TextField(0)TP& % Scroller(10)P% @ @ A B   A B &P &%P]&&&&&&&&&&&&&&&P&%Box(5) P & % ScrollView(0)dP & % Scroller(1)P & % Stepper(1)/P &%Panel(4)P & % TextField(12)=P& % TextField(9)P& % MenuItem(0) P&%View(7)P& % ClipView(11)P& % TextField(32)P&%STContainerLayoutEditor(0)P& % ScrollView(9)P &P1+NSNibConnectorP+P+P+P+ѐP+ѐP+P+ѐP+ѐP+P 1,NSNibOutletConnectorP!& % eventEditorP",P#& % controllerP$,P%&%boxP&,P'&%displayValueSwitchP(+P)+P*+P++P,,P-& % heightFieldP.,P/& % widthFieldP01-NSNibControlConnectorP1&%displayValueChanged:P2-P3&%heightChanged:P4-P5& % widthChanged:P6+P7+P8+P9+ɐP:+ɐP;+ɐP<,P=&%entityTypePopUpP>-P?&%entityTypeSelected:P@+ѐPA+ ѐPB+ PC+ PD- PE& % _doScroll:PF+ PG- PH& % _doScroll:PI,PJ& % shapeMatrixPK-PL&%shapeSelected:PM+ѐPN+ѐPO+PP+ PQ- PR& % _doScroll:PS+PT-PU& % _doScroll:PV-PW&%drawFunctionSelected:PX,PY& % drawMatrixPZ+P[+P\+P]+P^+P_+ĐP`+ĐPa+Pb+Pc+Pd+Pe+Pf+ĐPg+ ĐPh-Pi#&%displayValueChanged:Pj,Pk#&%insetAmountFieldPl,Pm#& % heightFieldPn,Po#& % controllerPp,Pq#&%boxPr,Ps#&%displayValueSwitchPt-Pu#&%insetAmountChanged:Pv-Pw#&%heightChanged:Px,Py#& % stateEditorPz+ĐP{+ĐP|+֐P}+֐P~-P& % _doScroll:P+֐P-P& % _doScroll:P+ĐP+ĐP+P+P-P& % _doScroll:P+P-P& % _doScroll:P,P#& % shapeMatrixP,P#& % drawMatrixP-P#&%shapeSelected:P-P#&%drawFunctionSelected:P+P+P+P+P+P+P+P+P+P+P+P+P+P+P-P& % _doScroll:P+P-P& % _doScroll:P+P+P+̐P+̐P-P& % _doScroll:P+̐P-P& % _doScroll:P+P,P#& % linkEditorP,oP,qP,P,P#&%lineWidthFieldP,P-P#&%lineWidthChanged:P-P-P+ P+ P+ϐP+P+P±+Pñ+Pı+Pű+PƱ+PDZ+Pȱ+Pɱ,oPʱ,P˱#&%containerEditorP̱+Pͱ+ӐPα+Pϱ+Pб+Pѱ+Pұ+Pӱ+PԱ+Pձ+Pֱ,qPױ,Pر#&%heightForVariablesFieldPٱ,Pڱ#&%siblingSeparationFieldP۱,Pܱ#&%subtypeSeparationFieldPݱ-Pޱ#&%siblingSeparationChanged:P߱-P#&%subtypeSeparationChanged:P-P#&%heightForVariablesChanged:P,P#& % controllerP,P#&%variableEditorP,P#&%boxP,P&%lineWidthFieldP-P&%lineWidthChanged:P+P+P+P+P+P+P-P& % _doScroll:P+P-P& % _doScroll:P,P#& % shapeMatrixP-P#&%shapeSelected:P+P+P+P+P-P& % _doScroll:P+P-P& % _doScroll:P,P#& % drawMatrixP-P#&%drawFunctionSelected:P ,P &%showMinMaxSwitchP -P &%showMinMaxChanged:P +P-P#&%heightChanged:P+ P- P#&%insetAmountChanged:P,P& % heightStepperP, P&%insetAmountStepperP+P-P#&%lineWidthChanged:P,P&%lineWidthStepperP+P-P#&%lineWidthChanged:P,P &%lineWidthStepperP!+P"+P#-P$#&%heightChanged:P%-P&#& % widthChanged:P',P(& % heightStepperP),P*& % widthStepperP++P,+P-+P.,P/&%siblingSeparationStepperP0,P1&%subtypeSeparationStepperP2,P3&%heightForVariablesStepperP4-P5#&%siblingSeparationChanged:P6-P7#&%subtypeSeparationChanged:P8-P9#&%heightForVariablesChanged:P:)&Paje-1.98/SpaceTimeViewer/Shape.m0000664000175000017500000006123411674062007016535 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "Shape.h" #include // 19.ago.2004 BS creation static void PSNoShape(NSBezierPath *path, NSRect rect) {} // // Shape Functions // // these functions should only make a path to be drawn later // functions for PajeState entities' shapes static void PSRect(NSBezierPath *path, NSRect rect) { [path appendBezierPathWithRect:rect]; } // functions for PajeEvent entities' shapes // x, y is the main point; w, h are the size of the shape static void PSTriangle(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)+2)]; [path relativeLineToPoint:NSMakePoint(-NSWidth(rect)/2, -NSHeight(rect))]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect), 0)]; [path closePath]; } static void PSFTriangle(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)-2)]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect)/2, NSHeight(rect))]; [path relativeLineToPoint:NSMakePoint(-NSWidth(rect), 0)]; [path closePath]; } static void PSPin(NSBezierPath *path, NSRect rect) { float radius = NSWidth(rect) / 2; float yCenter = NSMinY(rect) - (NSHeight(rect) - radius - 2); [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)+2)]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), yCenter) radius:radius startAngle:90.0 endAngle:450.0]; [path closePath]; } static void PSFPin(NSBezierPath *path, NSRect rect) { float radius = NSWidth(rect) / 2; float yCenter = NSMinY(rect) + (NSHeight(rect) - radius - 2); [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)-2)]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), yCenter) radius:radius startAngle:-90.0 endAngle:270.0]; [path closePath]; } static void PSFlag(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)+2)]; [path relativeLineToPoint:NSMakePoint(0, -(NSHeight(rect) - NSWidth(rect)))]; [path relativeLineToPoint:NSMakePoint(-NSWidth(rect), 0)]; [path relativeLineToPoint:NSMakePoint(0, -NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect), 0)]; [path closePath]; } static void PSFFlag(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)-2)]; [path relativeLineToPoint:NSMakePoint(0, NSHeight(rect))]; [path relativeLineToPoint:NSMakePoint(-NSWidth(rect), 0)]; [path relativeLineToPoint:NSMakePoint(0, -NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect), 0)]; [path closePath]; } static void PSRFlag(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)+2)]; [path relativeLineToPoint:NSMakePoint(0, -NSHeight(rect))]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect), 0)]; [path relativeLineToPoint:NSMakePoint(0, NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(-NSWidth(rect), 0)]; [path closePath]; } static void PSFRFlag(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)-2)]; [path relativeLineToPoint:NSMakePoint(0, NSHeight(rect) - NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect), 0)]; [path relativeLineToPoint:NSMakePoint(0, NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(-NSWidth(rect), 0)]; [path closePath]; } static void PSSquare(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)+2)]; [path relativeLineToPoint:NSMakePoint(0, -(NSHeight(rect)-NSWidth(rect)))]; [path relativeLineToPoint:NSMakePoint(-NSWidth(rect)/2, 0)]; [path relativeLineToPoint:NSMakePoint(0, -NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect), 0)]; [path relativeLineToPoint:NSMakePoint(0, NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(-NSWidth(rect)/2, 0)]; [path closePath]; } static void PSFSquare(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect)-2)]; [path relativeLineToPoint:NSMakePoint(0, NSHeight(rect) - NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect)/2, 0)]; [path relativeLineToPoint:NSMakePoint(0, NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(-NSWidth(rect), 0)]; [path relativeLineToPoint:NSMakePoint(0, -NSWidth(rect))]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect)/2, 0)]; [path closePath]; } static void PSOut(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMaxX(rect), NSMinY(rect))]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:NSWidth(rect) startAngle:0 endAngle:360]; [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect))]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:1 startAngle:0 endAngle:360]; } static void PSIn(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMaxX(rect), NSMinY(rect))]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:NSWidth(rect) startAngle:0 endAngle:360]; [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect) - NSWidth(rect)/2)]; [path relativeLineToPoint:NSMakePoint(0, NSWidth(rect))]; [path moveToPoint:NSMakePoint(NSMinX(rect) - NSWidth(rect)/2, NSMinY(rect))]; [path relativeLineToPoint:NSMakePoint(NSWidth(rect), 0)]; } // functions for PajeLink entities' shapes // x, y is the starting point; x+w, y+h is the ending point // functions should not change line width static void PSLine(NSBezierPath *path, NSRect rect) { [path moveToPoint:NSMakePoint(NSMinX(rect), NSMinY(rect))]; [path lineToPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect))]; } static void PSArrow(NSBezierPath *path, NSRect rect) { float len; float ang; len = sqrt(NSWidth(rect)*NSWidth(rect) + NSHeight(rect)*NSHeight(rect)); if (len > 0) { NSBezierPath *arrow; arrow = [NSBezierPath bezierPath]; [arrow moveToPoint:NSMakePoint(-7, 0)]; [arrow lineToPoint:NSMakePoint(-7, 2.5)]; [arrow lineToPoint:NSMakePoint(0, 0)]; [arrow lineToPoint:NSMakePoint(-7, -2.5)]; [arrow lineToPoint:NSMakePoint(-7, 0)]; ang = atan2(NSHeight(rect), NSWidth(rect)) * 180 / M_PI; NSAffineTransform *transform; transform = [NSAffineTransform transform]; [transform translateXBy:NSMaxX(rect) yBy:NSMaxY(rect)]; [transform rotateByDegrees:ang]; [arrow transformUsingAffineTransform:transform]; [path appendBezierPath:arrow]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:1.5 startAngle:ang endAngle:ang+360]; } } static void PSOpenArrow(NSBezierPath *path, NSRect rect) { float len; float ang; len = sqrt(NSWidth(rect)*NSWidth(rect) + NSHeight(rect)*NSHeight(rect)); if (len > 0) { NSBezierPath *arrow; arrow = [NSBezierPath bezierPath]; [arrow moveToPoint:NSMakePoint(-7, 3)]; [arrow lineToPoint:NSMakePoint(0, 0)]; [arrow lineToPoint:NSMakePoint(-7, -3)]; [arrow moveToPoint:NSMakePoint(0, 0)]; ang = atan2(NSHeight(rect), NSWidth(rect)) * 180 / M_PI; NSAffineTransform *transform; transform = [NSAffineTransform transform]; [transform translateXBy:NSMaxX(rect) yBy:NSMaxY(rect)]; [transform rotateByDegrees:ang]; [arrow transformUsingAffineTransform:transform]; [path appendBezierPath:arrow]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:1.5 startAngle:ang endAngle:ang+360]; } } static void PSDoubleArrow(NSBezierPath *path, NSRect rect) { float len; float ang; len = sqrt(NSWidth(rect)*NSWidth(rect) + NSHeight(rect)*NSHeight(rect)); if (len <= 0) { return; } NSBezierPath *arrow; arrow = [NSBezierPath bezierPath]; [arrow moveToPoint:NSMakePoint(-12, 0)]; [arrow lineToPoint:NSMakePoint(-12, 2.5)]; [arrow lineToPoint:NSMakePoint(-7, 2.5*2/7)]; [arrow lineToPoint:NSMakePoint(-7, 2.5)]; [arrow lineToPoint:NSMakePoint(0, 0)]; [arrow lineToPoint:NSMakePoint(-7, -2.5)]; [arrow lineToPoint:NSMakePoint(-7, -2.5*2/7)]; [arrow lineToPoint:NSMakePoint(-12, -2.5)]; [arrow lineToPoint:NSMakePoint(-12, 0)]; ang = atan2(NSHeight(rect), NSWidth(rect)) * 180 / M_PI; NSAffineTransform *transform; transform = [NSAffineTransform transform]; [transform translateXBy:NSMaxX(rect) yBy:NSMaxY(rect)]; [transform rotateByDegrees:ang]; [arrow transformUsingAffineTransform:transform]; [path appendBezierPath:arrow]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:1.5 startAngle:ang endAngle:ang+360]; } static void PSDiamondArrow(NSBezierPath *path, NSRect rect) { float len; float ang; len = sqrt(NSWidth(rect)*NSWidth(rect) + NSHeight(rect)*NSHeight(rect)); if (len <= 0) { return; } NSBezierPath *arrow; arrow = [NSBezierPath bezierPath]; [arrow moveToPoint:NSMakePoint(-14, 0)]; [arrow lineToPoint:NSMakePoint(-7, 2.5)]; [arrow lineToPoint:NSMakePoint(0, 0)]; [arrow lineToPoint:NSMakePoint(-7, -2.5)]; [arrow lineToPoint:NSMakePoint(-14, 0)]; ang = atan2(NSHeight(rect), NSWidth(rect)) * 180 / M_PI; NSAffineTransform *transform; transform = [NSAffineTransform transform]; [transform translateXBy:NSMaxX(rect) yBy:NSMaxY(rect)]; [transform rotateByDegrees:ang]; [arrow transformUsingAffineTransform:transform]; [path appendBezierPath:arrow]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:1.5 startAngle:ang endAngle:ang+360]; } // functions for PajeVariable entities' shapes void PSCurveAvg(NSBezierPath *path, NSRect rect) { float xMax = NSMaxX(rect); float xAvg = NSMidX(rect); float yAvg = NSMidY(rect); float yCur = [path currentPoint].y; [path curveToPoint:NSMakePoint(xAvg, yAvg) controlPoint1:NSMakePoint(xMax, yCur) controlPoint2:NSMakePoint(xMax, yAvg)]; } void PSCurve(NSBezierPath *path, NSRect rect) { float xMin = NSMinX(rect); float xMax = NSMaxX(rect); float x1 = xMin+2./3*(xMax-xMin); float x2 = xMin+1./3*(xMax-xMin); float yAvg = NSMidY(rect); float yCur = [path currentPoint].y; [path curveToPoint:NSMakePoint(xMin, yAvg) controlPoint1:NSMakePoint(x1, yCur) controlPoint2:NSMakePoint(x2, yAvg)]; } void PSCurveMin2(NSBezierPath *path, NSRect rect) { float xMin = NSMinX(rect); float xMax = NSMaxX(rect); float xAvg = NSMidX(rect); float yAvg = NSMidY(rect); [path curveToPoint:NSMakePoint(xMin, yAvg) controlPoint1:NSMakePoint(xMax, yAvg) controlPoint2:NSMakePoint(xAvg, yAvg)]; } void PSCurveMin(NSBezierPath *path, NSRect rect) { float xMin = NSMinX(rect); float xAvg = NSMidX(rect); float yAvg = NSMidY(rect); float yCur = [path currentPoint].y; [path curveToPoint:NSMakePoint(xMin, yAvg) controlPoint1:NSMakePoint(xAvg, yCur) controlPoint2:NSMakePoint(xAvg, yAvg)]; } void PSBuilding(NSBezierPath *path, NSRect rect) { float xMin = NSMinX(rect); float xMax = NSMaxX(rect); float yAvg = NSMidY(rect); [path lineToPoint:NSMakePoint(xMax, yAvg)]; [path lineToPoint:NSMakePoint(xMin, yAvg)]; } void PSMountain(NSBezierPath *path, NSRect rect) { float xMin = NSMinX(rect); float yAvg = NSMidY(rect); [path lineToPoint:NSMakePoint(xMin, yAvg)]; } void PSTimes(NSBezierPath *path, NSRect rect) { float xMin = NSMinX(rect); float yAvg = NSMidY(rect); [path moveToPoint:NSMakePoint(xMin-3, yAvg-3)]; [path lineToPoint:NSMakePoint(xMin+3, yAvg+3)]; [path moveToPoint:NSMakePoint(xMin+3, yAvg-3)]; [path lineToPoint:NSMakePoint(xMin-3, yAvg+3)]; } void PSCrosses(NSBezierPath *path, NSRect rect) { float xMin = NSMinX(rect); float yAvg = NSMidY(rect); [path moveToPoint:NSMakePoint(xMin, yAvg-3)]; [path lineToPoint:NSMakePoint(xMin, yAvg+3)]; [path moveToPoint:NSMakePoint(xMin+3, yAvg)]; [path lineToPoint:NSMakePoint(xMin-3, yAvg)]; } void PSDots(NSBezierPath *path, NSRect rect) { float xMin = NSMinX(rect); float yAvg = NSMidY(rect); [path appendBezierPathWithOvalInRect:NSMakeRect(xMin-1.5, yAvg-1.5, 3, 3)]; } // functions for PajeContainer entities' shapes /* none */ // // Draw Functions // // these functions should draw an already made shape path // using the current color static void PSFill(NSBezierPath *path, NSColor *color) { if (color != nil){ [color set]; [path fill]; } } static void PSFrame(NSBezierPath *path, NSColor *color) { if (color != nil){ [color set]; } else { [[NSColor blackColor] set]; } [path stroke]; } static void PSFillAndFrame(NSBezierPath *path, NSColor *color) { if (color != nil){ [color set]; [path fill]; } else { [[NSColor blackColor] set]; } [path stroke]; } static void PSDashedStroke(NSBezierPath *path, NSColor *color) { CGFloat dash[] = {5, 3}; [path setLineDash:dash count:2 phase:0]; if (color == nil){ color = [NSColor blackColor]; } [color set]; [path stroke]; } static void PSFillAndFrameBlack(NSBezierPath *path, NSColor *color) { if (color != nil){ [color set]; [path fill]; } [[NSColor blackColor] set]; [path stroke]; } static void PSFillAndFrameGray(NSBezierPath *path, NSColor *color) { if (color != nil){ [color set]; [path fill]; } [[NSColor grayColor] set]; [path stroke]; } static void PSFillAndFrameWhite(NSBezierPath *path, NSColor *color) { if (color != nil){ [color set]; [path fill]; } [[NSColor whiteColor] set]; [path stroke]; } static void PSFrameWhite(NSBezierPath *path, NSColor *color) { [[NSColor whiteColor] set]; [path stroke]; } static void PSFillAndDashedStrokeBlack(NSBezierPath *path, NSColor *color) { CGFloat dash[] = {5, 3}; [path setLineDash:dash count:2 phase:0]; if (color != nil) { [color set]; [path fill]; } [[NSColor blackColor] set]; [path stroke]; } static void PS3DStroke(NSBezierPath *path, NSColor *color) { float lineWidth; lineWidth = [path lineWidth]; if (lineWidth < 2) { lineWidth = 2; } if (color == nil) { color = [NSColor blackColor]; } [color set]; [path stroke]; NSAffineTransform *transform = [NSAffineTransform transform]; [path setLineWidth:lineWidth + 4]; [[NSColor colorWithCalibratedWhite:0.2 alpha:0.1] set]; [transform translateXBy: 4.0 yBy: 6.0]; [path transformUsingAffineTransform: transform]; [path stroke]; [path setLineWidth:lineWidth]; [path stroke]; //[path setLineWidth:lineWidth - 2]; //[path stroke]; [transform translateXBy: -8.0 yBy: -12.0]; [path transformUsingAffineTransform: transform]; [transform translateXBy: 4.0 yBy: 6.0]; [path setLineWidth:lineWidth - 2]; [transform translateXBy: 1.0 yBy: 1.0]; // move +1,+1 [path transformUsingAffineTransform: transform]; // at +1,+1 [[color shadowWithLevel:0.3] set]; [path stroke]; [transform translateXBy: -3.0 yBy: -3.0]; // move -2,-2 [path transformUsingAffineTransform: transform]; // at -1,-1 [[color highlightWithLevel:0.3] set]; [path stroke]; [transform translateXBy: 3.0 yBy: 3.0]; // move +1,+1 [path transformUsingAffineTransform: transform]; // at 0,0 [color set]; [path stroke]; } static void PS3DFill(NSBezierPath *path, NSColor *color) { float lineWidth; lineWidth = [path lineWidth]; if (lineWidth < 2) { lineWidth = 2; } if (color == nil) { color = [NSColor blackColor]; } [color set]; [path fill]; NSAffineTransform *transform = [NSAffineTransform transform]; [path setLineWidth:lineWidth + 4]; [[NSColor colorWithCalibratedWhite:0.2 alpha:0.1] set]; [transform translateXBy: 4.0 yBy: 6.0]; [path transformUsingAffineTransform: transform]; [path fill]; [path setLineWidth:lineWidth]; [path fill]; //[path setLineWidth:lineWidth - 2]; //[path stroke]; [transform translateXBy: -8.0 yBy: -12.0]; [path transformUsingAffineTransform: transform]; [transform translateXBy: 4.0 yBy: 6.0]; [path setLineWidth:lineWidth - 2]; [transform translateXBy: 1.0 yBy: 1.0]; // move +1,+1 [path transformUsingAffineTransform: transform]; // at +1,+1 [[color shadowWithLevel:0.3] set]; [path fill]; [transform translateXBy: -3.0 yBy: -3.0]; // move -2,-2 [path transformUsingAffineTransform: transform]; // at -1,-1 [[color highlightWithLevel:0.3] set]; [path fill]; [transform translateXBy: 3.0 yBy: 3.0]; // move +1,+1 [path transformUsingAffineTransform: transform]; // at 0,0 [color set]; [path fill]; } @implementation ShapeFunction static NSDictionary *stateShapeFunctionsDictionary; static NSDictionary *eventShapeFunctionsDictionary; static NSDictionary *linkShapeFunctionsDictionary; static NSDictionary *variableShapeFunctionsDictionary; static NSDictionary *containerShapeFunctionsDictionary; + (void)initialize { #define FUNCTION(n) [self shapeFunctionWithFunction:n name:@#n], @#n #define EFUNCTION(n, a, b) [self shapeFunctionWithFunction:n \ name:@#n \ topExtension:a \ rightExtension:b], \ @#n stateShapeFunctionsDictionary = [[NSDictionary dictionaryWithObjectsAndKeys: FUNCTION(PSRect), nil] retain]; eventShapeFunctionsDictionary = [[NSDictionary dictionaryWithObjectsAndKeys: EFUNCTION(PSTriangle, 1, 0.5), EFUNCTION(PSFTriangle, 0, 0.5), EFUNCTION(PSPin, 1, 0.5), EFUNCTION(PSFPin, 0, 0.5), EFUNCTION(PSSquare, 1, 0.5), EFUNCTION(PSFSquare, 0, 0.5), EFUNCTION(PSFlag, 1, 0), EFUNCTION(PSFFlag, 0, 0), EFUNCTION(PSRFlag, 1, 1), EFUNCTION(PSFRFlag, 0, 1), EFUNCTION(PSOut, 0.5, 0.5), EFUNCTION(PSIn, 0.5, 0.5), nil] retain]; linkShapeFunctionsDictionary = [[NSDictionary dictionaryWithObjectsAndKeys: FUNCTION(PSArrow), FUNCTION(PSOpenArrow), FUNCTION(PSDoubleArrow), FUNCTION(PSDiamondArrow), FUNCTION(PSLine), nil] retain]; variableShapeFunctionsDictionary = [[NSDictionary dictionaryWithObjectsAndKeys: FUNCTION(PSCurveAvg), FUNCTION(PSCurve), FUNCTION(PSCurveMin), FUNCTION(PSCurveMin2), FUNCTION(PSBuilding), FUNCTION(PSMountain), FUNCTION(PSTimes), FUNCTION(PSCrosses), FUNCTION(PSDots), nil] retain]; containerShapeFunctionsDictionary = [[NSDictionary dictionaryWithObjectsAndKeys: FUNCTION(PSNoShape), FUNCTION(PSRect), nil] retain]; #undef FUNCTION } + (ShapeFunction *)shapeFunctionWithName:(NSString *)n { ShapeFunction *f; f = [stateShapeFunctionsDictionary objectForKey:n]; if (f != nil) return f; f = [eventShapeFunctionsDictionary objectForKey:n]; if (f != nil) return f; f = [linkShapeFunctionsDictionary objectForKey:n]; if (f != nil) return f; f = [variableShapeFunctionsDictionary objectForKey:n]; if (f != nil) return f; f = [containerShapeFunctionsDictionary objectForKey:n]; if (f != nil) return f; return [self shapeFunctionWithName:@"PSNoShape"]; } + (NSArray *)shapeFunctionsForDrawingType:(PajeDrawingType)drawingType { switch (drawingType) { case PajeStateDrawingType: return [stateShapeFunctionsDictionary allValues]; case PajeEventDrawingType: return [eventShapeFunctionsDictionary allValues]; case PajeLinkDrawingType: return [linkShapeFunctionsDictionary allValues]; case PajeVariableDrawingType: return [variableShapeFunctionsDictionary allValues]; case PajeContainerDrawingType: return [containerShapeFunctionsDictionary allValues]; default: return [NSArray array]; } return [NSArray array]; } + (ShapeFunction *)shapeFunctionWithFunction:(shapefunction *)f name:(NSString *)n { return [self shapeFunctionWithFunction:f name:n topExtension:0 rightExtension:0]; } + (ShapeFunction *)shapeFunctionWithFunction:(shapefunction *)f name:(NSString *)n topExtension:(float)top rightExtension:(float)right { return [[[self alloc] initWithShapeFunction:f name:n topExtension:top rightExtension:right] autorelease]; } - (id)initWithShapeFunction:(shapefunction *)f name:(NSString *)n topExtension:(float)top rightExtension:(float)right { self = [super init]; function = f; name = [n retain]; topExtension = top; rightExtension = right; return self; } - (shapefunction *)function { return function; } - (NSString *)name { return name; } - (float)topExtension; { return topExtension; } - (float)rightExtension; { return rightExtension; } @end @implementation DrawFunction NSDictionary *drawFunctionsDictionary; + (void)initialize { #define FUNCTION(n, f) [self drawFunctionWithFunction:n name:@#n fillsPath:f], @#n drawFunctionsDictionary = [[NSDictionary dictionaryWithObjectsAndKeys: FUNCTION(PSFill, YES), FUNCTION(PSFrame, NO), FUNCTION(PSFillAndFrame, YES), FUNCTION(PSDashedStroke, NO), FUNCTION(PSFillAndFrameBlack, YES), FUNCTION(PSFillAndFrameGray, YES), FUNCTION(PSFillAndFrameWhite, YES), FUNCTION(PSFrameWhite, NO), FUNCTION(PSFillAndDashedStrokeBlack, YES), FUNCTION(PS3DStroke, NO), FUNCTION(PS3DFill, YES), nil] retain]; #undef FUNCTION } + (DrawFunction *)drawFunctionWithName:(NSString *)n { DrawFunction *function; function = [drawFunctionsDictionary objectForKey:n]; if (function == nil) { function = [drawFunctionsDictionary objectForKey:@"PSFill"]; } return function; } + (NSArray *)drawFunctions { return [drawFunctionsDictionary allValues]; } + (DrawFunction *)drawFunctionWithFunction:(drawfunction *)f name:(NSString *)n fillsPath:(BOOL)fills { return [[[self alloc] initWithDrawFunction:f name:n fillsPath:fills] autorelease]; } - (id)initWithDrawFunction:(drawfunction *)f name:(NSString *)n fillsPath:(BOOL)fills { self = [super init]; function = f; name = [n retain]; fillsPath = fills; return self; } - (drawfunction *)function; { return function; } - (NSString *)name { return name; } - (BOOL)fillsPath { return fillsPath; } @end Paje-1.98/SpaceTimeViewer/DrawView+Mouse.m0000664000175000017500000001616011674062007020307 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // DrawView+Mouse // -------------- // mouse-related methods in DrawView. // all these methods are overriding methods defined in NSView. #include "DrawView.h" #include "../General/Macros.h" @implementation DrawView (Mouse) /* * Mouse control * ------------------------------------------------------------------------ */ #ifdef GNUSTEP - (BOOL)acceptsFirstResponder { return YES; } #endif - (BOOL)becomeFirstResponder { [[self window] setAcceptsMouseMovedEvents: YES]; return YES; } // when the user clicks over this view, we want it to react, even // if the window wasn't selected - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent { return YES; } - (void)mouseEntered:(NSEvent *)event { [[self window] setAcceptsMouseMovedEvents: YES]; [[self window] makeFirstResponder:self]; } - (void)mouseExited:(NSEvent *)event { [[self window] setAcceptsMouseMovedEvents:NO]; [[self window] discardEventsMatchingMask:NSMouseMovedMask beforeEvent:event]; // [cursorTimeField setStringValue:@""]; [self setCursorEntity:nil]; [[self window] discardCachedImage]; } - (void)mouseMoved:(NSEvent *)event { NSPoint point; PajeEntity *entityUnderCursor; point = [[self window] mouseLocationOutsideOfEventStream]; point = [self convertPoint:[event locationInWindow] fromView:nil]; if (!NSMouseInRect(point, [self visibleRect], [self isFlipped])) { return; } if ([event modifierFlags] & NSShiftKeyMask) { [self setCursorEntity:nil]; [self setHighlightedEntities:[self findEntitiesAtPoint:point]]; } else { entityUnderCursor = [self findEntityAtPoint:point]; [self setCursorEntity:entityUnderCursor]; } [self setCursorTime:XtoTIME(point.x)]; } - (void)setCursorTime:(NSDate *)time { [cursorTimeField setStringValue:[NSString stringWithFormat:cursorTimeFormat, [time timeIntervalSinceReferenceDate] * timeUnitDivisor]]; } - (void)mouseDown:(NSEvent *)event { NSPoint cursorPoint; NSDate *cursorTime; if (cursorEntity && ![cursorEntity isContainer]) { return; } [self setCursorEntity:nil]; cursorPoint = [self convertPoint:[event locationInWindow] fromView:nil]; cursorTime = XtoTIME(cursorPoint.x); isMakingSelection = YES; // if there is a selection and the shift key is pressed, the // previous selection is changed. if (selectionExists && ([event modifierFlags] & NSShiftKeyMask)) { // Move the selection anchor to the side most distant from the cursor. double selectionStartX; double selectionEndX; selectionStartX = TIMEtoX(selectionStartTime); selectionEndX = TIMEtoX(selectionEndTime); if (ABS([cursorTime timeIntervalSinceDate:selectionEndTime]) > ABS([cursorTime timeIntervalSinceDate:selectionStartTime])) { Assign(selectionAnchorTime, selectionEndTime); } else { Assign(selectionAnchorTime, selectionStartTime); } } else { // current selection will be forgotten; start new selection Assign(selectionAnchorTime, cursorTime); } [self changeSelectionWithPoint:cursorPoint]; } - (void)mouseDragged:(NSEvent *)event { NSPoint cursorPoint; if (!isMakingSelection) return [self mouseMoved:event]; cursorPoint = [self convertPoint:[event locationInWindow] fromView:nil]; [self changeSelectionWithPoint:cursorPoint]; } - (void)mouseUp:(NSEvent *)event { if (cursorEntity != nil) { [filter inspectEntity:cursorEntity]; } isMakingSelection = NO; } - (void)keyDown:(NSEvent *)event { int up; NSArray *entities; NSEnumerator *entitiesEnum; id entity; int imbricationLevel; if ([[event characters] isEqualToString:@"l"]) { NSPoint p; p = [(NSClipView *)[self superview] documentVisibleRect].origin; p.x -= 50; [self scrollPoint:p]; // [[self enclosingScrollView] reflectScrolledClipView:[self superview]]; return; } if ([[event characters] isEqualToString:@"r"]) { NSPoint p; p = [(NSClipView *)[self superview] documentVisibleRect].origin; p.x += 50; [self scrollPoint:p]; //[[self enclosingScrollView] reflectScrolledClipView:[self superview]]; return; } if (cursorEntity == nil) return; if ([[event characters] isEqualToString:@"c"]) { [filter inspectEntity:cursorEntity]; return; } if (![cursorEntity respondsToSelector:@selector(imbricationLevel)]) return; if ([[event characters] isEqualToString:[NSString stringWithCharacter:0xf701]] || [[event characters] isEqualToString:@"d"]) up = 1; else if ([[event characters] isEqualToString:[NSString stringWithCharacter:0xf700]] || [[event characters] isEqualToString:@"u"]) up = -1; else return; imbricationLevel = [cursorEntity imbricationLevel] - up; entities = [self findEntitiesAtPoint:[self convertPoint:[[self window] mouseLocationOutsideOfEventStream] fromView:nil]]; entitiesEnum = [entities objectEnumerator]; while ((entity = [entitiesEnum nextObject]) != nil) { if ([entity respondsToSelector:@selector(imbricationLevel)] && [entity imbricationLevel] == imbricationLevel) { [self setCursorEntity:entity]; return; } } } - (CGFloat) rulerView: (NSRulerView *)aRulerView willMoveMarker:(NSRulerMarker *)marker toLocation: (CGFloat)location { NSLog(@"moving marker %@ to location %f", marker, location); return ((int)location/5) * 5; } - (void) rulerView: (NSRulerView *)aRulerView handleMouseDown: (NSEvent *)theEvent { NSPoint cursorPoint; NSRulerMarker *newMarker; cursorPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil]; if ([aRulerView orientation] == NSHorizontalRuler) newMarker = [[NSRulerMarker alloc] initWithRulerView:aRulerView markerLocation: cursorPoint.x image:[NSImage imageNamed:@"GNUstep"] imageOrigin:NSMakePoint(5, 10)]; else newMarker = [[NSRulerMarker alloc] initWithRulerView:aRulerView markerLocation: cursorPoint.y image:[NSImage imageNamed:@"GNUstep"] imageOrigin:NSMakePoint(5, 10)]; [newMarker setRemovable:YES]; [newMarker autorelease]; [aRulerView trackMarker:newMarker withMouseEvent:theEvent]; } @end Paje-1.98/SpaceTimeViewer/STEntityTypeLayout.m0000664000175000017500000006430611674062007021263 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "STEntityTypeLayout.h" #include "../General/NSUserDefaults+Additions.h" #include "../General/Macros.h" #include "STController.h" #include // 25.aug.2004 BS creation @implementation STEntityTypeLayout + (Class)classForDrawingType:(PajeDrawingType)dtype { switch (dtype) { case PajeEventDrawingType: return [STEventTypeLayout class]; case PajeStateDrawingType: return [STStateTypeLayout class]; case PajeLinkDrawingType: return [STLinkTypeLayout class]; case PajeVariableDrawingType: return [STVariableTypeLayout class]; case PajeContainerDrawingType: return [STContainerTypeLayout class]; default: NSAssert1(0, @"Invalid drawing type %d", dtype); } return Nil; } + (STEntityTypeLayout *)descriptorWithEntityType:(PajeEntityType *)etype drawingType:(PajeDrawingType)dtype containerDescriptor:(STContainerTypeLayout *)cDesc controller:(STController *)controller { return [[[[self classForDrawingType:dtype] alloc] initWithEntityType:etype containerDescriptor:cDesc controller:controller] autorelease]; } - (NSString *)defaultKeyForKey:(NSString *)key { return [[entityType description] stringByAppendingString:key]; } - (void)registerDefaultsWithController:(STController *)controller { id tHeight; id tShape; tHeight = [controller valueOfFieldNamed:@"Height" forEntityType:entityType]; if (tHeight == nil) { tHeight = [NSNumber numberWithInt:6]; } tShape = [controller valueOfFieldNamed:@"Shape" forEntityType:entityType]; if (tShape == nil) { tShape = @"PSNoShape"; } [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: tHeight, [self defaultKeyForKey:@"Height"], tShape, [self defaultKeyForKey:@" Path Function"], @"PSFillAndFrameBlack", [self defaultKeyForKey:@" Draw Function"], @"NO", [self defaultKeyForKey:@"DrawsName"], nil]]; } - (float)defaultFloatForKey:(NSString *)key { return [[NSUserDefaults standardUserDefaults] floatForKey:[self defaultKeyForKey:key]]; } - (void)setDefaultFloat:(float)value forKey:(NSString *)key { return [[NSUserDefaults standardUserDefaults] setFloat:value forKey:[self defaultKeyForKey:key]]; } - (NSString *)defaultStringForKey:(NSString *)key { return [[NSUserDefaults standardUserDefaults] stringForKey:[self defaultKeyForKey:key]]; } - (void)setDefaultString:(NSString *)value forKey:(NSString *)key { [[NSUserDefaults standardUserDefaults] setObject:value forKey:[self defaultKeyForKey:key]]; } - (BOOL)defaultBoolForKey:(NSString *)key { return [[NSUserDefaults standardUserDefaults] boolForKey:[self defaultKeyForKey:key]]; } - (void)setDefaultBool:(BOOL)value forKey:(NSString *)key { return [[NSUserDefaults standardUserDefaults] setBool:value forKey:[self defaultKeyForKey:key]]; } - (id)initWithEntityType:(PajeEntityType *)etype containerDescriptor:(STContainerTypeLayout *)cDesc controller:(STController *)controller { self = [super init]; if (self != nil) { NSString *name; Assign(entityType, etype); rectInContainer = [[NSMutableDictionary alloc] init]; [self registerDefaultsWithController:controller]; height = [self defaultFloatForKey:@"Height"]; drawsName = [self defaultBoolForKey:@"DrawsName"]; name = [self defaultStringForKey:@" Path Function"]; Assign(shapeFunction, [ShapeFunction shapeFunctionWithName:name]); name = [self defaultStringForKey:@" Draw Function"]; Assign(drawFunction, [DrawFunction drawFunctionWithName:name]); containerDescriptor = cDesc; [containerDescriptor addSubtype:self]; } return self; } - (void)removeContainerDescriptor { containerDescriptor = nil; } - (void)dealloc { Assign(entityType, nil); Assign(shapeFunction, nil); Assign(drawFunction, nil); Assign(rectInContainer, nil); [super dealloc]; } // accessor methods - (PajeEntityType *)entityType { return entityType; } - (void)setShapeFunction:(ShapeFunction *)f { Assign(shapeFunction, f); [self setDefaultString:[f name] forKey:@" Path Function"]; } - (void)setDrawFunction:(DrawFunction *)f { Assign(drawFunction, f); [self setDefaultString:[f name] forKey:@" Draw Function"]; } - (ShapeFunction *)shapeFunction { return shapeFunction; } - (DrawFunction *)drawFunction { return drawFunction; } - (void)setHeight:(float)val { height = val; [self setDefaultFloat:height forKey:@"Height"]; } - (float)height { return height; } - (void)setOffset:(float)val { offset = val; } - (float)offset { return offset; } - (void)setDrawsName:(BOOL)draws { drawsName = draws; [self setDefaultBool:draws forKey:@"DrawsName"]; } - (BOOL)drawsName { return drawsName; } - (float)yInContainer:(id)container { if (containerDescriptor != nil) { return NSMinY([containerDescriptor rectOfInstance:container]) + offset; } else { return offset; } } - (void)setRect:(NSRect)rect inContainer:(id)container { [rectInContainer setObject:[NSValue valueWithRect:rect] forKey:container]; } - (NSRect)rectInContainer:(id)container; { NSValue *value = [rectInContainer objectForKey:container]; if (value != nil) return [value rectValue]; else return NSZeroRect; } - (BOOL)intersectsRect:(NSRect)rect inContainer:(id)container { return !NSIsEmptyRect(NSIntersectionRect(rect, [self rectInContainer:container])); } - (BOOL)isPoint:(NSPoint)point inContainer:(id)container { return NSPointInRect(point, [self rectInContainer:container]); } - (void)reset { [rectInContainer removeAllObjects]; } // methods to be implemented by subclasses - (PajeDrawingType)drawingType { [self _subclassResponsibility:_cmd]; return PajeNonDrawingType; } - (BOOL)isContainer { return NO; } // from NSObject protocol - (unsigned int)hash { return [entityType hash]; } - (BOOL)isEqual:(id)other { if (other == self || other == entityType) { return YES; } return [[entityType description] isEqual:[other description]]; } - (NSString *)description { return [entityType description]; } @end @implementation STEventTypeLayout - (void)registerDefaultsWithController:(STController *)controller { id tHeight; id tWidth; id tShape; [super registerDefaultsWithController:controller]; tHeight = [controller valueOfFieldNamed:@"Height" forEntityType:entityType]; if (tHeight == nil) { tHeight = [NSNumber numberWithInt:10]; } tWidth = [controller valueOfFieldNamed:@"Width" forEntityType:entityType]; if (tWidth == nil) { tWidth = [NSNumber numberWithInt:6]; } tShape = [controller valueOfFieldNamed:@"Shape" forEntityType:entityType]; if (tShape == nil) { tShape = @"PSPin"; } [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: tHeight, [self defaultKeyForKey:@"Height"], tWidth, [self defaultKeyForKey:@"Width"], tShape, [self defaultKeyForKey:@" Path Function"], @"PSFillAndFrameBlack", [self defaultKeyForKey:@" Draw Function"], nil]]; } - (id)initWithEntityType:(PajeEntityType *)etype containerDescriptor:(STContainerTypeLayout *)cDesc controller:(STController *)controller { self = [super initWithEntityType:etype containerDescriptor:cDesc controller:controller]; if (self != nil) { width = [self defaultFloatForKey:@"Width"]; } return self; } - (PajeDrawingType)drawingType { return PajeEventDrawingType; } - (void)setWidth:(float)val { width = val; [self setDefaultFloat:width forKey:@"Width"]; } - (float)width { return width; } - (BOOL)isSupEvent { return ([[self shapeFunction] topExtension] >= 0.5); } - (void)setRect:(NSRect)rect inContainer:(id)container { if ([self isSupEvent]) { rect.origin.y -= rect.size.height; } rect.origin.x -= width * (1 - [shapeFunction rightExtension]); rect.size.width += width; [super setRect:rect inContainer:container]; } @end @implementation STStateTypeLayout - (void)registerDefaultsWithController:(STController *)controller { id tHeight; id tInset; id tShape; [super registerDefaultsWithController:controller]; tHeight = [controller valueOfFieldNamed:@"Height" forEntityType:entityType]; if (tHeight == nil) { tHeight = [NSNumber numberWithInt:16]; } tInset = [controller valueOfFieldNamed:@"Inset" forEntityType:entityType]; if (tInset == nil) { tInset = [NSNumber numberWithInt:4]; } tShape = [controller valueOfFieldNamed:@"Shape" forEntityType:entityType]; if (tShape == nil) { tShape = @"PSRect"; } [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: tHeight, [self defaultKeyForKey:@"Height"], tInset, [self defaultKeyForKey:@"Inset"], tShape, [self defaultKeyForKey:@" Path Function"], @"PSFillAndFrameBlack", [self defaultKeyForKey:@" Draw Function"], nil]]; } - (id)initWithEntityType:(PajeEntityType *)etype containerDescriptor:(STContainerTypeLayout *)cDesc controller:(STController *)controller { self = [super initWithEntityType:etype containerDescriptor:cDesc controller:controller]; if (self != nil) { inset = [self defaultFloatForKey:@"Inset"]; } return self; } - (PajeDrawingType)drawingType { return PajeStateDrawingType; } - (void)setInsetAmount:(float)newInsetAmount { inset = newInsetAmount; [self setDefaultFloat:inset forKey:@"Inset"]; } - (float)insetAmount { return inset; } @end @implementation STLinkTypeLayout - (void)registerDefaultsWithController:(STController *)controller { id tLineWidth; id tShape; [super registerDefaultsWithController:controller]; tLineWidth = [controller valueOfFieldNamed:@"LineWidth" forEntityType:entityType]; if (tLineWidth == nil) { tLineWidth = [NSNumber numberWithInt:1]; } tShape = [controller valueOfFieldNamed:@"Shape" forEntityType:entityType]; if (tShape == nil) { tShape = @"PSArrow"; } [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: tLineWidth, [self defaultKeyForKey:@"LineWidth"], tShape, [self defaultKeyForKey:@" Path Function"], @"PSstroke", [self defaultKeyForKey:@" Draw Function"], nil]]; } - (id)initWithEntityType:(PajeEntityType *)etype containerDescriptor:(STContainerTypeLayout *)cDesc controller:(STController *)controller { self = [super initWithEntityType:etype containerDescriptor:cDesc controller:controller]; if (self != nil) { lineWidth = [self defaultFloatForKey:@"LineWidth"]; } return self; } - (PajeDrawingType)drawingType { return PajeLinkDrawingType; } - (void)setLineWidth:(float)val { lineWidth = val; [self setDefaultFloat:lineWidth forKey:@"LineWidth"]; } - (float)lineWidth { return lineWidth; } - (void)setSourceOffset:(float)val { offset = val; } - (float)sourceOffset { return offset; } - (void)setDestOffset:(float)val { destOffset = val; } - (float)destOffset { return destOffset; } @end @implementation STVariableTypeLayout - (void)registerDefaultsWithController:(STController *)controller { id tLineWidth; [super registerDefaultsWithController:controller]; tLineWidth = [controller valueOfFieldNamed:@"LineWidth" forEntityType:entityType]; if (tLineWidth == nil) { tLineWidth = [NSNumber numberWithInt:1]; } [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: tLineWidth, [self defaultKeyForKey:@"LineWidth"], @"NO", [self defaultKeyForKey:@"ShowMinMax"], @"PSBuilding", [self defaultKeyForKey:@" Path Function"], @"PS3DStroke", [self defaultKeyForKey:@" Draw Function"], nil]]; } - (id)initWithEntityType:(PajeEntityType *)etype containerDescriptor:(STContainerTypeLayout *)cDesc controller:(STController *)controller { self = [super initWithEntityType:etype containerDescriptor:cDesc controller:controller]; if (self != nil) { lineWidth = [self defaultFloatForKey:@"LineWidth"]; showMinMax = [self defaultBoolForKey:@"ShowMinMax"]; } return self; } - (void)dealloc { Assign(hashMarkValues, nil); Assign(hashValueFormat, nil); [super dealloc]; } - (PajeDrawingType)drawingType { return PajeVariableDrawingType; } - (void)setLineWidth:(float)val { lineWidth = val; [self setDefaultFloat:lineWidth forKey:@"LineWidth"]; } - (float)lineWidth { return lineWidth; } - (void)setShowMinMax:(BOOL)flag { showMinMax = flag; [self setDefaultBool:showMinMax forKey:@"ShowMinMax"]; } - (BOOL)showMinMax { return showMinMax; } - (void)setMinValue:(float)val { Assign(hashMarkValues, nil); minValue = val; [containerDescriptor setMinValue:val]; } - (float)minValue { return [containerDescriptor minValue]; return minValue; } - (void)setMaxValue:(float)val { Assign(hashMarkValues, nil); maxValue = val; [containerDescriptor setMaxValue:val]; } - (float)maxValue { return [containerDescriptor maxValue]; return maxValue; } - (NSArray *)hashMarkValues { return [containerDescriptor hashMarkValues]; if (hashMarkValues == nil) { hashMarkValues = [[NSMutableArray alloc] init]; float v; float dv; dv = ([self maxValue] - [self minValue]) / ([self height] / 30); if (dv == 0) goto done; int i = 0; while (dv < .5) { dv *= 10; i--; } while (dv >= 5) { dv /= 10; i++; } if (i < 0) { Assign(hashValueFormat, ([NSString stringWithFormat:@"%%1.%df", -i])); } else { Assign(hashValueFormat, @"%1.f"); } if (dv > 2) dv = 5; else if (dv > 1) dv = 2; else dv = 1; while (i > 0) { dv *= 10; i--; } while (i < 0) { dv /= 10; i++; } for (v = (int)([self minValue]/dv) * dv; v <= [self maxValue]; v += dv) { if (v >= [self minValue] && v <= [self maxValue]) { [hashMarkValues addObject:[NSNumber numberWithFloat:v]]; } } } done: return hashMarkValues; } - (NSString *)hashValueFormat { return [containerDescriptor hashValueFormat]; return hashValueFormat; } - (float)height { return [containerDescriptor heightForVariables]; } - (void)setHeight:(float)val { [containerDescriptor setHeightForVariables:val]; Assign(hashMarkValues, nil); } @end @implementation STContainerTypeLayout - (void)registerDefaultsWithController:(STController *)controller { [super registerDefaultsWithController:controller]; [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: @"1", [self defaultKeyForKey:@"SiblingSeparation"], @"1", [self defaultKeyForKey:@"TypeSeparation"], @"60", [self defaultKeyForKey:@"HeightForVariables"], nil]]; } - (id)initWithEntityType:(PajeEntityType *)etype containerDescriptor:(STContainerTypeLayout *)cDesc controller:(STController *)controller { self = [super initWithEntityType:etype containerDescriptor:cDesc controller:controller]; if (self != nil) { rectsOfInstances = [[NSMutableDictionary alloc] init]; eventSubtypes = [[NSMutableArray alloc] init]; supEventSubtypes = [[NSMutableArray alloc] init]; stateSubtypes = [[NSMutableArray alloc] init]; infEventSubtypes = [[NSMutableArray alloc] init]; variableSubtypes = [[NSMutableArray alloc] init]; linkSubtypes = [[NSMutableArray alloc] init]; containerSubtypes = [[NSMutableArray alloc] init]; siblingSeparation = [self defaultFloatForKey:@"SiblingSeparation"]; subtypeSeparation = [self defaultFloatForKey:@"SubtypeSeparation"]; heightForVariables = [self defaultFloatForKey:@"HeightForVariables"]; minValue = HUGE_VAL; maxValue = -HUGE_VAL; } return self; } - (void)dealloc { [[self subtypes] makeObjectsPerformSelector:@selector(removeContainerDescriptor)]; [rectsOfInstances release]; [eventSubtypes release]; [supEventSubtypes release]; [stateSubtypes release]; [infEventSubtypes release]; [variableSubtypes release]; [linkSubtypes release]; [containerSubtypes release]; [hashMarkValues release]; [hashValueFormat release]; [super dealloc]; } - (PajeDrawingType)drawingType { return PajeContainerDrawingType; } - (BOOL)isContainer { return YES; } - (void)setSiblingSeparation:(float)val { siblingSeparation = val; [self setDefaultFloat:siblingSeparation forKey:@"SiblingSeparation"]; } - (float)siblingSeparation { return siblingSeparation; } - (void)setSubtypeSeparation:(float)val; { subtypeSeparation = val; [self setDefaultFloat:subtypeSeparation forKey:@"SubtypeSeparation"]; } - (float)subtypeSeparation { return subtypeSeparation; } - (void)setHeightForVariables:(float)val { heightForVariables = val; [self setDefaultFloat:heightForVariables forKey:@"HeightForVariables"]; } - (float)heightForVariables { return heightForVariables; } - (void)setSupEventsOffset:(float)val; { supEventsOffset = val; } - (float)supEventsOffset { return supEventsOffset; } - (void)setInfEventsOffset:(float)val; { infEventsOffset = val; } - (float)infEventsOffset { return infEventsOffset; } - (void)setSubcontainersOffset:(float)val; { subcontainersOffset = val; } - (float)subcontainersOffset { return subcontainersOffset; } - (float)linkOffset { return (supEventsOffset + infEventsOffset) / 2; } - (void)reset { [super reset]; [rectsOfInstances removeAllObjects]; } - (void)setRect:(NSRect)rect ofInstance:(id)entity { NSEnumerator *subtypeEnum; STEntityTypeLayout *subtype; [rectsOfInstances setObject:[NSValue valueWithRect:rect] forKey:entity]; /* set rects of links to be the container's */ subtypeEnum = [linkSubtypes objectEnumerator]; while ((subtype = [subtypeEnum nextObject]) != nil) { [subtype setRect:rect inContainer:entity]; } } - (NSRect)rectOfInstance:(id)entity { NSValue *value = [rectsOfInstances objectForKey:entity]; if (value != nil) return [value rectValue]; else return NSZeroRect; } - (BOOL)isInstance:(id)entity inRect:(NSRect)rect { return !NSIsEmptyRect(NSIntersectionRect(rect, [self rectOfInstance:entity])); } - (BOOL)isPoint:(NSPoint)point inInstance:(id)entity; { return NSPointInRect(point, [self rectOfInstance:entity]); } - (NSEnumerator *)instanceEnumerator { return [rectsOfInstances keyEnumerator]; } - (id)instanceWithPoint:(NSPoint)point { NSEnumerator *ienum; id instance; ienum = [self instanceEnumerator]; while ((instance = [ienum nextObject]) != nil) { if ([self isPoint:point inInstance:instance]) { break; } } return instance; } - (void)addSubtype:(STEntityTypeLayout *)subtype { switch ([subtype drawingType]) { case PajeEventDrawingType: [eventSubtypes addObject:subtype]; break; case PajeStateDrawingType: [stateSubtypes addObject:subtype]; break; case PajeLinkDrawingType: [linkSubtypes addObject:subtype]; break; case PajeVariableDrawingType: [variableSubtypes addObject:subtype]; break; case PajeContainerDrawingType: [containerSubtypes addObject:subtype]; break; default: NSAssert2(0, @"Invalid drawing type %d of %@", [subtype drawingType], subtype); } } - (NSArray *)subtypes { NSMutableArray *array; array = [NSMutableArray array]; [array addObjectsFromArray:stateSubtypes]; [array addObjectsFromArray:variableSubtypes]; [array addObjectsFromArray:supEventSubtypes]; [array addObjectsFromArray:infEventSubtypes]; [array addObjectsFromArray:containerSubtypes]; [array addObjectsFromArray:linkSubtypes]; return array; } - (float)getMaxHeight:(NSArray *)array { NSEnumerator *subtypeEnum; STEntityTypeLayout *subtype; float max = 0; subtypeEnum = [array objectEnumerator]; while ((subtype = [subtypeEnum nextObject]) != nil) { float h = [subtype height]; if (h > max) { max = h; } } return max; } - (void)setOffset:(float)val ofSubtypes:(NSArray *)subtypes { NSEnumerator *subtypeEnum; STEntityTypeLayout *subtype; subtypeEnum = [subtypes objectEnumerator]; while ((subtype = [subtypeEnum nextObject]) != nil) { [subtype setOffset:val]; } } - (void)setSupEventsOffset { STEventTypeLayout *subtype; NSEnumerator *subtypeEnum; [supEventSubtypes removeAllObjects]; [infEventSubtypes removeAllObjects]; subtypeEnum = [eventSubtypes objectEnumerator]; while ((subtype = [subtypeEnum nextObject]) != nil) { if ([subtype isSupEvent] >= 0.5) { [supEventSubtypes addObject:subtype]; } else { [infEventSubtypes addObject:subtype]; } } supEventsOffset = [self getMaxHeight:supEventSubtypes]; [self setOffset:supEventsOffset ofSubtypes:supEventSubtypes]; } - (void)setStatesOffset { NSEnumerator *subtypeEnum; STEntityTypeLayout *subtype; infEventsOffset = supEventsOffset; subtypeEnum = [stateSubtypes objectEnumerator]; while ((subtype = [subtypeEnum nextObject]) != nil) { if (infEventsOffset != supEventsOffset) { infEventsOffset += subtypeSeparation; } [subtype setOffset:infEventsOffset]; infEventsOffset += [subtype height]; } } - (void)setInfEventsOffset { [self setOffset:infEventsOffset ofSubtypes:infEventSubtypes]; subcontainersOffset = infEventsOffset + [self getMaxHeight:infEventSubtypes]; } - (void)setVariablesOffset { if ([variableSubtypes count] != 0) { if (subcontainersOffset != 0) { subcontainersOffset += subtypeSeparation; } variablesOffset = subcontainersOffset; [self setOffset:variablesOffset ofSubtypes:variableSubtypes]; subcontainersOffset += [self heightForVariables]; } else { variablesOffset = subcontainersOffset; } if (([containerSubtypes count] != 0) && (subcontainersOffset != 0)) { subcontainersOffset += subtypeSeparation; } } - (float)variablesOffset { return variablesOffset; } - (void)setOffsets { [self setSupEventsOffset]; [self setStatesOffset]; [self setInfEventsOffset]; [self setVariablesOffset]; [containerSubtypes makeObjectsPerformSelector:_cmd]; } - (void)setMinValue:(float)val { if (val < minValue) { minValue = val; Assign(hashMarkValues, nil); } } - (float)minValue { return minValue; } - (void)setMaxValue:(float)val { if (val > maxValue) { maxValue = val; Assign(hashMarkValues, nil); } } - (float)maxValue { return maxValue; } - (NSArray *)hashMarkValues { if (hashMarkValues == nil) { hashMarkValues = [[NSMutableArray alloc] init]; float v; float dv; // calculate dv, delta value for at least 30 px between hash marks dv = ([self maxValue] - [self minValue]) / ([self heightForVariables] / 30); if (dv == 0) goto done; int i = 0; while (dv < .5) { dv *= 10; i--; } while (dv >= 5) { dv /= 10; i++; } if (i < 0) { Assign(hashValueFormat, ([NSString stringWithFormat:@"%%1.%df", -i])); } else { Assign(hashValueFormat, @"%1.f"); } if (dv > 2) dv = 5; else if (dv > 1) dv = 2; else dv = 1; while (i > 0) { dv *= 10; i--; } while (i < 0) { dv /= 10; i++; } for (v = (int)([self minValue]/dv) * dv; v <= [self maxValue]; v += dv) { if (v >= [self minValue] && v <= [self maxValue]) { [hashMarkValues addObject:[NSNumber numberWithFloat:v]]; } } } done: return hashMarkValues; } - (NSString *)hashValueFormat { return hashValueFormat; } @end Paje-1.98/SpaceTimeViewer/STEntityTypeLayoutController.h0000664000175000017500000000317211674062007023314 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _STEntityTypeLayoutController_h_ #define _STEntityTypeLayoutController_h_ // STEntityTypeLayoutController // Controls the iteraction between the EntityTypeLayout GUI and // EntityTypeLayout objects #include #include "STController.h" #include "STLayoutEditor.h" @interface STEntityTypeLayoutController : NSObject { IBOutlet NSPopUpButton *entityTypePopUp; IBOutlet STContainerLayoutEditor *containerEditor; IBOutlet STVariableLayoutEditor *variableEditor; IBOutlet STLinkLayoutEditor *linkEditor; IBOutlet STEventLayoutEditor *eventEditor; IBOutlet STStateLayoutEditor *stateEditor; STController *delegate; NSView *currentView; } - (id)initWithDelegate:(id)del; - (IBAction)entityTypeSelected:(id)sender; - (void)reset; - (void)layoutEdited; @end #endif Paje-1.98/SpaceTimeViewer/Timing.h0000664000175000017500000000157711674062007016723 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // @protocol Timing - (double) startTime; - (double) endTime; @end Paje-1.98/FieldFilter/0000775000175000017500000000000011674062007014446 5ustar schnorrschnorrPaje-1.98/FieldFilter/FieldFilter.gorm/0000775000175000017500000000000011674062007017602 5ustar schnorrschnorrPaje-1.98/FieldFilter/FieldFilter.gorm/data.info0000664000175000017500000000027311674062007021372 0ustar schnorrschnorrGNUstep archive00002af9:00000003:00000003:00000000:01GormFilePrefsManager1NSObject% 01NSString&%GNUstep gui-0.9.30& % Typed StreamPaje-1.98/FieldFilter/FieldFilter.gorm/data.classes0000664000175000017500000000131511674062007022072 0ustar schnorrschnorr{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FieldFilter = { Actions = ( "valueChanged:", "comparisionPopUpChanged:", "entityTypePopUpChanged:", "fieldNamePopUpChanged:" ); Outlets = ( view, comparisionPopUp, entityTypePopUp, fieldNamePopUp, valueField, actionMatrix ); Super = PajeFilter; }; FirstResponder = { Actions = ( "comparisionPopUpChanged:", "entityTypePopUpChanged:" ); Super = NSObject; }; PajeComponent = { Actions = ( "inputEntity:", "outputEntity:" ); Outlets = ( ); Super = NSObject; }; PajeFilter = { Actions = ( ); Outlets = ( ); Super = PajeComponent; }; }Paje-1.98/FieldFilter/FieldFilter.gorm/objects.gorm0000664000175000017500000001470111674062007022124 0ustar schnorrschnorrGNUstep archive00002af9:00000020:000000c2:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%NSOwner0& %  FieldFilter0& % GormNSPanel01NSPanel1NSWindow1 NSResponder% ? A C C& % D/ Cڀ01 NSView% ? A C C  C C&01 NSMutableArray1 NSArray&0 1 NSBox% A A` C C  C C&0 &0 %  C C  C C&0 &0 1 NSPopUpButton1NSButton1 NSControl% B C CA A  CA A& 0 &%01NSPopUpButtonCell1NSMenuItemCell1 NSButtonCell1 NSActionCell1NSCell0&01NSFont%&&&&&&&&01NSMenu0&0 &01 NSMenuItem0&%Item 10&&&%01NSImage0& % common_Nibble%00&%Item 2&&%%00&%Item 3&&%%%0&0&&&&%%%%%0 1 NSTextField% C B A  B A& 0! &%0"1NSTextFieldCell0#& % Entity type:0$% A0&&&&&&&&0%0%1NSColor0&&%NSNamedColorSpace0'&%System0(&%textBackgroundColor0)&'0*& % textColor0+% Cy B A  B A&0, &%0-0.& % Field Name:0/% A@&&&&&&&&0%00&01&%System02&%textBackgroundColor03&104& % textColor05 % B Cy C* A  C* A&06 &%0708&&&&&&&&&090:&0; &0<0=&%Item 10>&&&%%0?0@&%Item 2>&&%%0A0B&%Item 3>&&%%%0C&0D&&&&<9%%%%%0E % A CU B A  B A&0F &%0G0H&&&&&&&&&0I0J&0K &0L0M&%is0N&&&%%0O0P&%is greater thanN&&%%0Q0R& % is less thanN&&%%%0S&0T&&&&LI%%%%%0U% C CU B A  B A&0V &%0W0X&%Text&&&&&&&&0%0Y&0Z&%System0[&%textBackgroundColor0\&Z0]& % textColor0^1NSMatrix% B A B B@  B B@&0_ &%0`0a&&&&&&&&&%% B A 0b&0c&%System0d&%controlBackgroundColorb0e& % NSButtonCell0f0g&%Radio0h0i1NSMutableString&% common_RadioOff&&&&&&&&%0j&0k&0l0m&% common_RadioOn&&&%%0n &0o0p& % Highlighth&&&&&&&&%j0q&l&&&0r0s& % Filter outh&&&&&&&&%j0t&l&&&o0u% B B A  B A&0v &%0w0x&%Filter Action:/&&&&&&&&0%0y&0z&%System0{&%textBackgroundColor0|&z0}& % textColor0~0&%Box&&&&&&&& %%0&0&%System0&%windowBackgroundColor0&%Window0&%Panel ? B F@ F@%00&%NSApplicationIcon0& %  MenuItem1O0& % TextField 0& %  MenuItem2Q0& %  MenuItem3<0& %  MenuItem4?0& %  MenuItem5A0&%MenuItemL0&%GSCustomClassMap0&0&%Box 0&% GormNSPopUpButton150& %  TextField1+0&%Matrix^0&% GormNSPopUpButton2E0& %  TextField2U0& %  TextField3u0&%GormNSPopUpButton 0 &01NSNibConnector0&%NSOwner0001NSNibOutletConnector0&%entityTypePopUp00&%view0000000000000&%fieldNamePopUp00&%comparisionPopUp00& % valueField01 NSNibControlConnector0&% fieldNamePopUpChanged:0 0&% comparisionPopUpChanged:0 0& %  valueChanged:0 0&% entityTypePopUpChanged:00&%Matrix00 0& %  valueChanged:00& %  actionMatrixPaje-1.98/FieldFilter/GNUmakefile0000664000175000017500000000134311674062007016521 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make BUNDLE_NAME = FieldFilter FieldFilter_PRINCIPAL_CLASS = FieldFilter ADDITIONAL_INCLUDE_DIRS = -I../General.bproj ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else FieldFilter_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif FieldFilter_RESOURCE_FILES = \ FieldFilter.gorm \ FieldFilter.nib FieldFilter_OBJC_FILES = \ FieldFilter.m \ FieldFilterDescriptor.m FieldFilter_HEADER_FILES = \ FieldFilter.h \ FieldFilterDescriptor.h -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/FieldFilter/FieldFilter.nib/0000775000175000017500000000000011674062007017406 5ustar schnorrschnorrPaje-1.98/FieldFilter/FieldFilter.nib/keyedobjects.nib0000664000175000017500000002743111674062007022562 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 156<=AERZhpq  ')268>GPQV^_kmvz{} !")*12NOTcdhihmprt}~1258;<=>A^yw3ww     \U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRootԀՀӀր2234[NSClassName[FieldFilter789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FQGHIJKLMNOP .@Ra(STUVWX0]NSDestinationWNSLabelXNSSource ,-[\]^_`aacdefg_NSNextResponder[NSSuperviewWNSFrameYNSEnabledXNSvFlagsVNSCell  + i[j\klmloZNSSubviews[NSFrameSizeebb_{{79, 319}, {206, 22}}rstuvwxyz{|}~dVd_NSAlternateImage[NSCellFlags^NSButtonFlags2]NSButtonFlagsVNSMenuZNSMenuItem_NSAlternateContents_NSPreferredEdge_NSPeriodicDelay\NSCellFlags2]NSAltersState]NSControlView_NSKeyEquivalentYNSSupport_NSUsesItemFromMenu_NSPeriodicInterval_NSArrowPositionA@@*  KVNSSizeVNSNameXNSfFlags"A0 \LucidaGrande78;VNSFontPYNS.string78;_NSMutableStringXNSStringvg]NSMnemonicLoc_NSKeyEquivModMaskWNSStateWNSTitleYNSOnImageZNSKeyEquivXNSTarget\NSMixedImageXNSAction [NSMenuItems )!UItem12^NSResourceNameWNSImage_NSMenuCheckmark78ϣ;_NSCustomResource_%NSCustomResource2ʀ_NSMenuMixedState__popUpItemAction:78ww;ZOtherViews>Q"%(vg# $UItem2vg& 'UItem378;^NSMutableArrayWNSArray78vv;78`;_NSPopUpButtonCell^NSMenuItemCell\NSButtonCell]%NSButtonCell\NSActionCell78 ;]NSPopUpButtonXNSButtonYNSControlVNSView[NSResponder_entityTypePopUp78   ;_NSNibOutletConnector^NSNibConnectorSTUX0/?-[\]^_`aadef 0 +1_{{79, 294}, {206, 22}}rstuvwxyz{|}~d$d43* /2 v+14516357)8>9Q;<39<(v@F4:1;vIO4=1>^fieldNamePopUpSTURSX0AQ-[\]^_`aaYd[f] B  +C_{{34, 269}, {120, 22}}rstuvw`xyz{|}~bcdRhd_NSSelectedIndexFE* AD vbo]uFGCHwyI)J_is greater than>~QcKEN(vb]FLCMRisvb]FOCP\is less than_comparisionPopUpSTUX0S`-[\]^_`aade T _U_{{159, 272}, {123, 19}}}s{d_NSBackgroundColor[NSTextColorZNSContents_NSDrawsBackgroundV[S ^qABWNSColor[NSColorName\NSColorSpace]NSCatalogNameYXWZVSystem_textBackgroundColorWNSWhiteB1Z78;]\WZYtextColorB0Z78Ф`;_NSTextFieldCell78Ӧ ;[NSTextField\%NSTextFieldZvalueFieldSTUlX0b-i[\]a\NSBorderType_NSTitlePosition[NSTitleCellYNSOffsets]NSTransparent]NSContentViewYNSBoxTypedcc i[].o>Qa (>QVRf o/ASs([\]^_`aad[ g _h_{{13, 324}, {64, 14}}}s{   jmif^@[Entity typelkWZ\controlColorK0.66666669Z]nWZ_controlTextColor[\]^_`aa%d[( p _q_{{13, 299}, {64, 14}}}s{  .jmro^ZField name]34567[^8\9:;<_=>?@AadDaFGIJK M[NSCellClassYNSNumRowsZNSCellSizeYNSNumColsWNSCells[NSProtoCell^NSSelectedCell_NSCellBackgroundColor]NSMatrixFlags_NSIntercellSpacingtu vYD(j$_{{86, 15}, {148, 17}}>PQFRv(~rU}tuzsx{VWXZ@\]^_`Vb]NSNormalImage}zxwsHQ(>_NSTIFFRepresentationO.MM*P! v'''+++555###v!8>>>¡III8*GGGȲWWW* 666BBB !yyy~~~!66@@>>-~~~zzz-'''&&&9@@@@@@9G...000G 88 '55' $HRSs  applmntrRGB XYZ 5acspAPPL-applo]4Q$\A rXYZ gXYZ4bXYZHwtpt\chadp,rTRCgTRCbTRCvcgt0ndin8desc4cprt-mmod(XYZ oT:xXYZ ^=XYZ (PXYZ ihsf32_ d?7curvcurvcurvvcgtndin0WJ@@%HL@:::descSDM-X72 CalibratedSDM-X72 CalibratedSDM-X72 CalibratedtextCopyright Apple Computer, Inc., 2003mmodMp78;_NSBitmapImageRepZNSImageRep78;D0 0Z78ˣ;X%NSImageX{72, 17}V{4, 2}~rtuzsx{W^|bzH8Q~URadio"AP78 ;XNSMatrixY%NSMatrix[\]^_`aadM __{{13, 16}, {70, 14}}}s{  jm^^Filter action Z{298, 356}78 ;_{{60, 39}, {298, 356}}V{0, 0}s{V^SBoxM0 0.80000001Z78֤ ;UNSBoxTviewSTUX0s-\actionMatrixSTU0V _entityTypePopUpChanged78;_NSNibControlConnectorSTU0/_fieldNamePopUpChangedSTU0RA_comparisionPopUpChangedSTU0S\valueChanged><;blaRVRF c3sQlb(_{{1, 1}, {420, 439}} !"#$%&@'()*+,./0_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClasscpx_{{394, 250}, {420, 439}}3UPanel6WNSPanel9TView_{{0, 0}, {1280, 1002}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78?@@;_NSWindowTemplate>Ba Ralaaaab0Vabab4 44A cb s s F F F/>_0<;blaVR c3s<9FS"b f AN/EoK4%>z{|}~€ÀĀŀƀǀȀɀʀˀ̀̀΀πЀрҀYNSMatrix1\File's Owner[NSMenuItem2[NSMenuItem1YPopUpList\NSTextField1_NSPopUpButton11]NSTextField12^NSPopUpButton1]NSTextField11>>>%RJVHblOPRaFGIKc M<0N;LSsR% .FbA Nvf @a/E"K34<co9>%׀؀ـڀۀ܀݀ހ߀ '!+)01&(*,.$/->Q(>>78  ;^NSIBObjectData#,1:LQVdfjp <I\cq  $-8=LUhq|}  +=IQ[dkmoqruwy&2AOVaw ').02469;@ACEGHJ[birwy{~%3GOWalu    ) = J L N P c w    ! # % ' ) + 1 : A P X a f o ~   % . 5 L [ l n p r t          J L N P R T V X Z g i k m v x   " $ & ( * G I K M N Q S U n !#%')68:<NWYbikmoq<>@BCEGa $&(*,.5KX`cens !#Tas   468:;=?Wxz|~,.02357Oprtvxz| 8F[]_aceghjlnprwy{} $1357ENZ\^gl  "$&+4=@BDMRTVXaxz| 'XZ\^`egio!0;DKdk   ( 1 8 P a c e g i !!!! !"!$!&!(!*!,!.!0!2!4!6!8!:!!@!B!D!F!H!J!L!N!P!Y!\!^!`!w!!!!!!""""%"/";"="?"A"C"E"G"I"N"P"R"m"v"|"~"""""""""""## #C#E#G#I#K#M#O#Q#S#U#W#Y#[#]#_#a#c#e#g#i#k#m#o#q#s#u#w#y############################$#$%$'$)$+$-$/$1$3$5$7$9$;$=$?$A$C$E$G$I$K$M$O$Q$S$U$_$l$x$$$$$$$$$$$$$$%F%H%J%L%N%P%R%T%V%X%Z%\%^%`%b%d%f%h%j%l%n%p%r%t%v%x%z%|%~%%%%%%%%%%%%%%%%%%%%%%%&&&&&& & &&&&&&&&&& &"&$&&&(&*&,&.&0&2&4&6&8&:&<&>&@&B&D&F&H&J&L&N&P&R&T&V&X&Z&\&^&`&b&d&f&h&j&l&n&p&r&t&v&&&&&&&&&&&!&Paje-1.98/FieldFilter/FieldFilter.nib/info.nib0000664000175000017500000000070611674062007021036 0ustar schnorrschnorr IBDocumentLocation 106 104 356 240 0 0 1280 1002 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/FieldFilter/FieldFilter.nib/classes.nib0000664000175000017500000000163311674062007021540 0ustar schnorrschnorr{ IBClasses = ( { ACTIONS = { comparisionPopUpChanged = id; entityTypePopUpChanged = id; fieldNamePopUpChanged = id; valueChanged = id; }; CLASS = FieldFilter; LANGUAGE = ObjC; OUTLETS = { actionMatrix = NSMatrix; comparisionPopUp = NSPopUpButton; entityTypePopUp = NSPopUpButton; fieldNamePopUp = NSPopUpButton; valueField = NSTextField; view = NSView; }; SUPERCLASS = PajeFilter; }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeComponent; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeFilter; LANGUAGE = ObjC; SUPERCLASS = PajeComponent; } ); IBVersion = 1; }Paje-1.98/FieldFilter/FieldFilter.h0000664000175000017500000000421011674062007017005 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FieldFilter_h_ #define _FieldFilter_h_ /* FieldFilter.h created by benhur on Sun 26-Dec-2004 */ #include #include "../General/FilteredEnumerator.h" #include "../General/Protocols.h" #include "../General/PajeFilter.h" @interface FieldFilter : PajeFilter { NSMutableDictionary *filterDescriptors; IBOutlet NSView *view; IBOutlet NSPopUpButton *entityTypePopUp; IBOutlet NSPopUpButton *fieldNamePopUp; IBOutlet NSPopUpButton *comparisionPopUp; IBOutlet NSTextField *valueField; IBOutlet NSMatrix *actionMatrix; } - (id)initWithController:(PajeTraceController *)c; - (void)dealloc; - (PajeEntityType *)selectedEntityType; // // Handle interface messages // - (IBAction)entityTypePopUpChanged:(id)sender; - (IBAction)fieldNamePopUpChanged:(id)sender; - (IBAction)comparisionPopUpChanged:(id)sender; - (IBAction)valueChanged:(id)sender; // // interact with interface // - (void)viewWillBeSelected:(NSView *)view; // // PajeFilter messages that are filtered // - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration; @end #endif Paje-1.98/FieldFilter/FieldFilterDescriptor.h0000664000175000017500000000320411674062007021046 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004, 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FieldFilterDescriptor_h_ #define _FieldFilterDescriptor_h_ /* FieldFilterDescriptor.h created by benhur on Sun 2-Jan-2005 */ #include #define NOFILTER @"None" typedef enum { HIGHLIGHT, FILTEROUT, OTHERSOUT } fieldFilterAction; @interface FieldFilterDescriptor : NSEnumerator { NSString *fieldName; int comparision; id value; fieldFilterAction action; } + (FieldFilterDescriptor *)descriptorWithFieldName:(NSString *)fn comparision:(int)c value:(id)v; - (id)initWithFieldName:(NSString *)fn comparision:(int)c value:(id)v; - (NSString *)fieldName; - (int)comparision; - (id)value; - (void)setAction:(fieldFilterAction)a; - (fieldFilterAction)action; @end #endif Paje-1.98/FieldFilter/FieldFilter.m0000664000175000017500000002305711674062007017024 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* FieldFilter.m created by benhur on Sun 26-Dec-2004 */ #include "FieldFilter.h" #include "FieldFilterDescriptor.h" #include "../General/Macros.h" @interface FieldFilter (Private) - (PajeEntityType *)selectedEntityType; - (void)setFilterDescriptor:(FieldFilterDescriptor *)fdesc forEntityType:(PajeEntityType *)entityType; - (FieldFilterDescriptor *)filterDescriptorFromGUI; - (void)setFilterFromGUI; - (void)setGUIFromSelectedEntityType; @end @implementation FieldFilter - (id)initWithController:(PajeTraceController *)c { NSWindow *win; [super initWithController:c]; filterDescriptors = [[NSMutableDictionary alloc] init]; if (![NSBundle loadNibNamed:@"FieldFilter" owner:self]) { NSRunAlertPanel(@"FieldFilter", @"Couldn't load interface file", nil, nil, nil); return self; } win = [view window]; // view is an NSBox. we need its contents. view = [[(NSBox *)view contentView] retain]; [entityTypePopUp removeAllItems]; [self registerFilter:self]; #ifndef GNUSTEP [win release]; #endif return self; } - (void)dealloc { [entityTypePopUp removeAllItems]; [filterDescriptors release]; [view release]; [super dealloc]; } // // Methods for TraceController // - (NSView *)filterView { return view; } - (NSString *)filterName { return @"Field Filter"; } - (id)filterDelegate { return self; } - (void)viewWillBeSelected:(NSView *)selectedView // message sent by PajeController when a view will be selected for display { [self setGUIFromSelectedEntityType]; } // // Notifications sent by other filters // - (void)hierarchyChanged { PajeEntityType *entityType; NSEnumerator *typeEnum; [entityTypePopUp removeAllItems]; typeEnum = [[self allEntityTypes] objectEnumerator]; while ((entityType = [typeEnum nextObject]) != nil) { if (![self isContainerEntityType:entityType]) { [entityTypePopUp addItemWithTitle:[self descriptionForEntityType:entityType]]; [[entityTypePopUp lastItem] setRepresentedObject:entityType]; } } [entityTypePopUp selectItemAtIndex:0]; [self setGUIFromSelectedEntityType]; [super hierarchyChanged]; } // // helper methods // - (PajeEntityType *)selectedEntityType { if ([entityTypePopUp selectedItem] == nil) { [entityTypePopUp selectItemAtIndex:0]; } return [[entityTypePopUp selectedItem] representedObject]; } - (void)setFilterDescriptor:(FieldFilterDescriptor *)fdesc forEntityType:(PajeEntityType *)entityType { if (fdesc == nil) { [filterDescriptors removeObjectForKey:entityType]; } else { [filterDescriptors setObject:fdesc forKey:entityType]; } // register in defaults } - (FieldFilterDescriptor *)filterDescriptorFromGUI { FieldFilterDescriptor *fdesc = nil; NSString *fieldName; int comparision; id value; fieldName = [[fieldNamePopUp selectedItem] title]; if (![fieldName isEqual:NOFILTER]) { comparision = [[comparisionPopUp selectedItem] tag]; value = [valueField stringValue]; fdesc = [FieldFilterDescriptor descriptorWithFieldName:fieldName comparision:comparision value:value]; [fdesc setAction:[[actionMatrix selectedCell] tag]]; } return fdesc; } - (void)setFilterFromGUI { PajeEntityType *entityType; FieldFilterDescriptor *fdesc; entityType = [self selectedEntityType]; if (entityType == nil) { return; } fdesc = [self filterDescriptorFromGUI]; [self setFilterDescriptor:fdesc forEntityType:entityType]; [super dataChangedForEntityType:entityType]; } - (void)setGUIFromSelectedEntityType { id entityType = [self selectedEntityType]; NSEnumerator *names; id fieldName; FieldFilterDescriptor *fdesc; if (entityType == nil) { return; } fdesc = [filterDescriptors objectForKey:entityType]; [fieldNamePopUp removeAllItems]; [fieldNamePopUp addItemWithTitle:NOFILTER]; names = [[self fieldNamesForEntityType:entityType] objectEnumerator]; while ((fieldName = [names nextObject]) != nil) { [fieldNamePopUp addItemWithTitle:fieldName]; } if (fdesc == nil) { [fieldNamePopUp selectItemAtIndex:0]; } else { [fieldNamePopUp selectItemWithTitle:[fdesc fieldName]]; [comparisionPopUp selectItemAtIndex:[fdesc comparision]]; [valueField setStringValue:[fdesc value]]; [actionMatrix selectCellWithTag:[fdesc action]]; } } // // Handle interface messages // - (IBAction)entityTypePopUpChanged:(id)sender { [self setGUIFromSelectedEntityType]; } - (IBAction)fieldNamePopUpChanged:(id)sender { [self setFilterFromGUI]; } - (IBAction)comparisionPopUpChanged:(id)sender { [self setFilterFromGUI]; } - (IBAction)valueChanged:(id)sender { [self setFilterFromGUI]; } // // method called for each entity during enumeration. // returns YES if entity should be filtered (not shown) // - (id)filterEntity:(PajeEntity *)entity withFilterDescriptor:(FieldFilterDescriptor *)fdesc { id entityValue; id filterValue; BOOL result = NO; entityValue = [self valueOfFieldNamed:[fdesc fieldName] forEntity:entity]; entityValue = [entityValue description]; filterValue = [fdesc value]; switch ([fdesc comparision]) { case 0: result = [entityValue isEqual:filterValue]; break; case 1: result = [entityValue floatValue] > [filterValue floatValue]; break; case 2: result = [entityValue floatValue] < [filterValue floatValue]; break; } if (result) { return nil; } else { return entity; } } // // PajeFilter messages that are filtered // - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { NSEnumerator *origEnum; FieldFilterDescriptor *fdesc; origEnum = [inputComponent enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; fdesc = [filterDescriptors objectForKey:entityType]; if (fdesc != nil && [fdesc action] == FILTEROUT) { SEL filterSelector = @selector(filterEntity:withFilterDescriptor:); return [[[FilteredEnumerator alloc] initWithEnumerator:origEnum filter:self selector:filterSelector context:fdesc] autorelease]; } else { return origEnum; } } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { NSEnumerator *origEnum; FieldFilterDescriptor *fdesc; origEnum = [super enumeratorOfCompleteEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; fdesc = [filterDescriptors objectForKey:entityType]; if (fdesc != nil && [fdesc action] == FILTEROUT) { SEL filterSelector = @selector(filterEntity:withFilterDescriptor:); return [[[FilteredEnumerator alloc] initWithEnumerator:origEnum filter:self selector:filterSelector context:fdesc] autorelease]; } else { return origEnum; } } - (BOOL)isSelectedEntity:(id)entity { FieldFilterDescriptor *fdesc; fdesc = [filterDescriptors objectForKey:[self entityTypeForEntity:entity]]; if (fdesc != NULL && [fdesc action] == HIGHLIGHT) { return [self filterEntity:(PajeEntity *)entity withFilterDescriptor:fdesc] == nil; } return [super isSelectedEntity:entity]; } @end Paje-1.98/FieldFilter/FieldFilterDescriptor.m0000664000175000017500000000362511674062007021062 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* FieldFilterDescriptor.m created by benhur on Sun 03-Jan-2005 */ #include "FieldFilterDescriptor.h" #include "../General/Macros.h" @implementation FieldFilterDescriptor + (FieldFilterDescriptor *)descriptorWithFieldName:(NSString *)fn comparision:(int)c value:(id)v { return [[[self alloc] initWithFieldName:fn comparision:c value:v] autorelease]; } - (id)initWithFieldName:(NSString *)fn comparision:(int)c value:(id)v { self = [super init]; if (self != nil) { Assign(fieldName, fn); comparision = c; Assign(value, v); } return self; } - (void)dealloc { Assign(fieldName, nil); Assign(value, nil); [super dealloc]; } - (NSString *)fieldName { return fieldName; } - (int)comparision { return comparision; } - (id)value { return value; } - (void)setAction:(fieldFilterAction)a { action = a; } - (fieldFilterAction)action { return action; } @end Paje-1.98/README0000664000175000017500000000155411674062007013142 0ustar schnorrschnorrThis is Paje, a program to visualize the execution of parallel programs. Paje is released under the GNU Lesser General Public License How to install: On Linux (and other platforms where GNUstep works): - First, install GNUstep (www.gnustep.org) There is a good installation manual on www.made-it.com - Be sure to source the GNUstep environment setting script (source /path-to-gnustep/System/Library/Makefiles/GNUstep.[c]sh - Then cd to Paje's directory and type make make install - It should now be possible to execute Paje with: openapp Paje.app On MacOS-X (you must have development tools installed) Like on Linux, except the first step, where instead of installing the whole GNUstep package, only GNUstep's "make" package is needed. There are some example trace files in the Traces directory. Any problems, questions, etc, mailto:benhur@inf.ufsm.br Paje-1.98/PajeSimulator/0000775000175000017500000000000011674062007015034 5ustar schnorrschnorrPaje-1.98/PajeSimulator/SimulChunk.h0000664000175000017500000000537211674062007017276 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SimulChunk_h_ #define _SimulChunk_h_ #include "../General/EntityChunk.h" #include "../General/MultiEnumerator.h" #include "UserState.h" #include "UserLink.h" #include "UserValue.h" @interface SimulChunk : EntityChunk { BOOL lastChunk; } + (SimulChunk *)chunkWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc; - (id)initWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc; // Simulation - (void)stopWithEvent:(PajeEvent *)event; - (void)setPreviousChunkIncompleteEntities:(NSArray *)array; // for events - (void)newEventEvent:(PajeEvent *)event value:(id)value; // for states - (void)setStateEvent:(PajeEvent *)event value:(id)value; - (void)pushStateEvent:(PajeEvent *)event value:(id)value; - (void)popStateEvent:(PajeEvent *)event; // for links - (void)startLinkEvent:(PajeEvent *)event value:(id)value sourceContainer:(PajeContainer *)cont key:(id)key; - (void)endLinkEvent:(PajeEvent *)event value:(id)value destContainer:(PajeContainer *)cont key:(id)key; // for variables - (void)setVariableEvent:(PajeEvent *)event doubleValue:(double)value; - (void)addVariableEvent:(PajeEvent *)event doubleValue:(double)value; - (void)subVariableEvent:(PajeEvent *)event doubleValue:(double)value; // true if chunk is last of container - (BOOL)isLastChunk; // sent to an active chunk to finish it - (void)endOfChunkWithTime:(NSDate *)time; @end @interface EventChunk : SimulChunk @end @interface StateChunk : SimulChunk { NSMutableArray *simulationStack; int resimulationStackLevel; } @end @interface LinkChunk : SimulChunk { NSMutableArray *pendingLinks; } @end @interface VariableChunk : SimulChunk { NSDate *currentTime; double currentValue; double maxValue; double minValue; double sumValue; } @end #endif Paje-1.98/PajeSimulator/GNUmakefile0000664000175000017500000000256311674062007017114 0ustar schnorrschnorr# # GNUmakefile - Generated by ProjectCenter # Written by Philippe C.D. Robert # # NOTE: Do NOT change this file -- ProjectCenter maintains it! # # Put all of your customisations in GNUmakefile.preamble and # GNUmakefile.postamble # include $(GNUSTEP_MAKEFILES)/common.make # # Subprojects # # # Bundle # PACKAGE_NAME=PajeSimulator BUNDLE_NAME=PajeSimulator BUNDLE_EXTENSION=.bundle BUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje PajeSimulator_PRINCIPAL_CLASS=PajeSimul # # Additional libraries # ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else PajeSimulator_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif # # Resource files # PajeSimulator_RESOURCE_FILES= # # Header files # PajeSimulator_HEADERS= \ PajeSimul.h \ EventNames.h \ SimulContainer.h \ UserEvent.h \ UserLink.h \ UserState.h \ UserValue.h \ SimulChunk.h # # Class files # PajeSimulator_OBJC_FILES= \ PajeSimul.m \ PajeSimul+Events.m \ SimulContainer.m \ UserEvent.m \ UserLink.m \ UserState.m \ UserValue.m \ SimulChunk.m # # C files # PajeSimulator_C_FILES= -include GNUmakefile.preamble -include GNUmakefile.local include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/PajeSimulator/PajeSimul.h0000664000175000017500000000701211674062007017076 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeSimul_h_ #define _PajeSimul_h_ /* * PajeSimul.h * * Interface of simulator for Paje traces. * * 20021107 BS creation (from A0bSimul) */ #include #include "../General/PajeFilter.h" #include "../General/PajeEvent.h" @class SimulContainer; @interface PajeSimul : PajeComponent { SimulContainer *rootContainer; IMP invocationTable[PajeEventIdCount]; /* PajeContainerType's and PajeEntityTypes's mapped by name and alias */ NSMapTable *userTypes; /* PajeContainers mapped by name and alias (used only when containerType is not known, like in old PajeDestroyContainer events */ //NSMutableDictionary *userNumberToContainer; NSDate *startTime; NSDate *endTime; NSDate *currentTime; int eventCount; /* arrays of entities related to a key */ NSMutableDictionary *relatedEntities; NSMutableArray *chunkInfo; unsigned currentChunkNumber; BOOL replaying; BOOL lastChunkSeen; } - (id)initWithController:(PajeTraceController *)c; - (PajeContainerType *)rootContainerType; - (PajeContainer *)rootContainer; - (void)error:(NSString *)format, ...; - (void)error:(NSString *)str inEvent:(PajeEvent *)event; - (void)inputEntity:(PajeEvent *)event; - (NSDate *)startTime; - (NSDate *)endTime; - (NSDate *)currentTime; - (PajeEntityType *)entityTypeWithName:(NSString *)name; - (id)typeForId:(const char *)typeId; - (void)setType:(id)type forId:(const char *)typeId; - (int)eventCount; - (void)endOfChunkLast:(BOOL)last; - (void)outputChunk:(id)entity; - (id)chunkState; - (void)setChunkState:(id)state; - (int)currentChunkNumber; - (void)getChunksUntilTime:(NSDate *)time; - (void)notifyMissingChunk:(int)chunkNumber; - (BOOL)isReplaying; @end @interface PajeSimul (UserEvents) // // User defined entities // - (void)pajeStartTrace:(PajeEvent *)event; - (void)pajeDefineContainerType:(PajeEvent *)event; - (void)pajeDefineLinkType:(PajeEvent *)event; - (void)pajeDefineEventType:(PajeEvent *)event; - (void)pajeDefineStateType:(PajeEvent *)event; - (void)pajeDefineVariableType:(PajeEvent *)event; - (void)pajeDefineEntityValue:(PajeEvent *)event; - (void)pajeCreateContainer:(PajeEvent *)event; - (void)pajeDestroyContainer:(PajeEvent *)event; - (void)pajeNewEvent:(PajeEvent *)event; - (void)pajeSetState:(PajeEvent *)event; - (void)pajePushState:(PajeEvent *)event; - (void)pajePopState:(PajeEvent *)event; - (void)pajeSetVariable:(PajeEvent *)event; - (void)pajeAddVariable:(PajeEvent *)event; - (void)pajeSubVariable:(PajeEvent *)event; - (void)pajeStartLink:(PajeEvent *)event; - (void)pajeEndLink:(PajeEvent *)event; - (id)containerForId:(const char *)containerId type:(PajeContainerType *)containerType; @end #endif Paje-1.98/PajeSimulator/UserEvent.h0000664000175000017500000000303411674062007017125 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _UserEvent_h_ #define _UserEvent_h_ // // UserEvent // // holds a user-definable event // #include "../General/PajeEvent.h" #include "../General/PajeEntity.h" #include "../General/PajeEntityInspector.h" #include "../General/PajeType.h" @interface UserEvent : PajeEntity { NSDictionary *extraFields; NSDate *time; } + (UserEvent *)eventWithType:(PajeEntityType *)type name:(id)n container:(PajeContainer *)c event:(PajeEvent *)e; - (id)initWithType:(PajeEntityType *)type name:(id)n container:(PajeContainer *)c event:(PajeEvent *)e; - (void)dealloc; - (void)setEvent:(PajeEvent *)e; - (NSDate *)time; @end #endif Paje-1.98/PajeSimulator/SimulContainer.h0000664000175000017500000001011711674062007020141 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SimulContainer_h_ #define _SimulContainer_h_ // // PajeContainer // // superclass for containers // #include #include "../General/PajeContainer.h" #include "../General/PajeEvent.h" #include "SimulChunk.h" @class PajeSimul; @interface SimulContainer : PajeContainer { NSDate *creationTime; NSDate *lastTime; PajeSimul *simulator; NSString *alias; NSMutableDictionary *userEntities; // key = entityType NSMutableDictionary *minValues; // key = entityType NSMutableDictionary *maxValues; // key = entityType NSDictionary *extraFields; int logicalTime; BOOL isActive; } + (SimulContainer *)containerWithType:(PajeEntityType *)type name:(NSString *)n alias:(NSString *)a container:(PajeContainer *)newcontainer creationTime:(NSDate *)time event:(PajeEvent *)event simulator:(id)simul; - (id)initWithType:(PajeEntityType *)type name:(NSString *)n alias:(NSString *)a container:(PajeContainer *)c creationTime:(NSDate *)time event:(PajeEvent *)event simulator:(id)simul; - (NSString *)alias; - (NSDate *)startTime; - (NSDate *)endTime; - (void)stopWithEvent:(PajeEvent*)event; - (BOOL)isStopped; - (BOOL)isActive; - (void)setLastTime:(NSDate *)time; - (SimulChunk *)chunkOfType:(id)type; - (SimulChunk *)previousChunkOfType:(id)type; - (void)newEventWithType:(id)type value:(id)value withEvent:(PajeEvent *)event; - (void)setUserStateOfType:(PajeEntityType *)entityType toValue:(id)value withEvent:(PajeEvent *)event; - (void)pushUserStateOfType:(PajeEntityType *)entityType value:(id)value withEvent:(PajeEvent *)event; - (void)popUserStateOfType:(PajeEntityType *)entityType withEvent:(PajeEvent *)event; - (void)setUserVariableOfType:(PajeVariableType *)entityType toDoubleValue:(double)value withEvent:(PajeEvent *)event; - (void)addUserVariableOfType:(PajeVariableType *)entityType doubleValue:(double)value withEvent:(PajeEvent *)event; - (void)subUserVariableOfType:(PajeVariableType *)entityType doubleValue:(double)value withEvent:(PajeEvent *)event; - (void)startUserLinkOfType:(PajeEntityType *)entityType value:(id)entityName sourceContainer:(PajeContainer *)sourceContainer key:(id)key withEvent:(PajeEvent *)event; - (void)endUserLinkOfType:(PajeEntityType *)entityType value:(id)entityName destContainer:(PajeContainer *)destContainer key:(id)key withEvent:(PajeEvent*)event; - (double)minValueForEntityType:(PajeEntityType *)entityType; - (double)maxValueForEntityType:(PajeEntityType *)entityType; - (int)logicalTime; - (void)setLogicalTime:(int)lt; - (void)startChunk; - (void)endOfChunkLast:(BOOL)last; - (void)emptyChunk:(int)chunkNumber; - (void)reset; - (id)chunkState; - (void)setChunkState:(id)state; @end #endif Paje-1.98/PajeSimulator/SimulContainer.m0000664000175000017500000003721711674062007020160 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // // PajeContainer // // superclass for containers // #include "SimulContainer.h" #include "SimulChunk.h" #include "../General/ChunkArray.h" #include "UserState.h" #include "UserLink.h" #include "../General/Macros.h" #include "PajeSimul.h" #include "../General/UniqueString.h" // auxiliary class to contain the internal state of a container @interface SimulContainerState : NSObject { NSDate *time; int logicalTime; } + (SimulContainerState *)stateWithTime:(NSDate *)t logicalTime:(int)l; - (NSDate *)time; - (int)logicalTime; @end @implementation SimulContainerState - (id)initWithTime:(NSDate *)t logicalTime:(int)l { self = [super init]; if (self != nil) { Assign(time, t); logicalTime = l; } return self; } - (void)dealloc { Assign(time, nil); [super dealloc]; } + (SimulContainerState *)stateWithTime:(NSDate *)t logicalTime:(int)l { return [[[self alloc] initWithTime:t logicalTime:l] autorelease]; } - (NSDate *)time { return time; } - (int)logicalTime { return logicalTime; } @end @implementation SimulContainer + (SimulContainer *)containerWithType:(PajeEntityType *)type name:(NSString *)n alias:(NSString *)a container:(PajeContainer *)c creationTime:(NSDate *)time event:(PajeEvent *)event simulator:(id)simul { return [[[self alloc] initWithType:type name:n alias:a container:c creationTime:time event:event simulator:simul] autorelease]; } - (id)initWithType:(PajeEntityType *)type name:(NSString *)n alias:(NSString *)a container:(PajeContainer *)c creationTime:(NSDate *)time event:(PajeEvent *)event simulator:(id)simul { self = [super initWithType:type name:n container:c]; if (self != nil) { Assign(creationTime, time); simulator = simul; Assign(alias, a); Assign(userEntities, [NSMutableDictionary dictionary]); Assign(minValues, [NSMutableDictionary dictionary]); Assign(maxValues, [NSMutableDictionary dictionary]); Assign(extraFields, [event extraFields]); } return self; } - (void)dealloc { Assign(creationTime, nil); Assign(alias, nil); Assign(lastTime, nil); Assign(userEntities, nil); Assign(minValues, nil); Assign(maxValues, nil); Assign(extraFields, nil); [super dealloc]; } - (NSString *)alias { return alias; } - (NSDate *)startTime { return creationTime; } - (NSDate *)time { return creationTime; } - (NSDate *)endTime { if (lastTime != nil) { return lastTime; } if (container != nil) { return [container endTime]; } return [simulator endTime]; } - (void)setLastTime:(NSDate *)time { Assign(lastTime, time); } - (id)copyWithZone:(NSZone *)zone { return [self retain]; } - (void)stopWithEvent:(PajeEvent *)event { NSDate *stopTime; if (event != nil) { stopTime = [event time]; } else { stopTime = [simulator currentTime]; } if (lastTime == nil) { [self setLastTime:stopTime]; } NSEnumerator *typeEnumerator; id type; typeEnumerator = [userEntities keyEnumerator]; while ((type = [typeEnumerator nextObject]) != nil) { SimulChunk *chunk; chunk = [self chunkOfType:type]; if ([chunk isActive]) { [chunk stopWithEvent:event]; [chunk endOfChunkWithTime:stopTime]; [simulator outputChunk:chunk]; } } //[userEntities removeAllObjects]; NSEnumerator *subEnum; SimulContainer *subContainer; subEnum = [subContainers objectEnumerator]; while ((subContainer = [subEnum nextObject]) != nil) { [subContainer stopWithEvent:event]; } isActive = NO; } - (BOOL)isStopped { return lastTime != nil; } - (BOOL)isActive { return isActive; } - (void)startChunk { NSEnumerator *typeEnumerator; id type; isActive = ![simulator isReplaying]; typeEnumerator = [userEntities keyEnumerator]; while ((type = [typeEnumerator nextObject]) != nil) { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (chunk != nil && [chunk isZombie]) { SimulChunk *previousChunk; NSArray *stack; previousChunk = [self previousChunkOfType:type]; if (previousChunk != nil) { stack = [previousChunk incompleteEntities]; } else { stack = [NSArray array]; } [chunk activate]; [chunk setPreviousChunkIncompleteEntities:stack]; } if ([chunk isActive]) { isActive = YES; } } } - (void)endOfChunkLast:(BOOL)last { NSEnumerator *typeEnumerator; id type; if (![self isActive]) { return; } if (last) { [self stopWithEvent:nil]; return; } NSDate *chunkEndTime = [simulator currentTime]; typeEnumerator = [userEntities keyEnumerator]; while ((type = [typeEnumerator nextObject]) != nil) { SimulChunk *chunk; chunk = [self chunkOfType:type]; if ([chunk isActive]) { [chunk endOfChunkWithTime:chunkEndTime]; [simulator outputChunk:chunk]; } } } - (void)emptyChunk:(int)chunkNumber { ChunkArray *chunkArray; NSEnumerator *chunkArrayEnumerator; chunkArrayEnumerator = [userEntities objectEnumerator]; while ((chunkArray = [chunkArrayEnumerator nextObject]) != nil) { [[chunkArray chunkAtIndex:chunkNumber] empty]; } } - (SimulChunk *)previousChunkOfType:(id)type { ChunkArray *chunkArray; SimulChunk *chunk; int currentChunkNumber; currentChunkNumber = [simulator currentChunkNumber]; chunkArray = [userEntities objectForKey:type]; chunk = (SimulChunk *)[chunkArray chunkAtIndex:currentChunkNumber - 1]; return chunk; } - (SimulChunk *)chunkOfType:(id)type { ChunkArray *chunkArray; SimulChunk *chunk; int currentChunkNumber; currentChunkNumber = [simulator currentChunkNumber]; chunkArray = [userEntities objectForKey:type]; if (chunkArray == nil) { chunkArray = [[ChunkArray alloc] init]; [chunkArray setFirstIndex:currentChunkNumber]; [userEntities setObject:chunkArray forKey:type]; chunk = [SimulChunk chunkWithEntityType:type container:self]; [chunk setStartTime:[simulator currentTime]]; [chunk setPreviousChunkIncompleteEntities:[NSArray array]]; [chunkArray addChunk:chunk]; [chunkArray release]; isActive = YES; } else { chunk = (SimulChunk *)[chunkArray chunkAtIndex:currentChunkNumber]; if (chunk == nil) { SimulChunk *previousChunk; previousChunk = (SimulChunk *) [chunkArray chunkAtIndex:currentChunkNumber - 1]; if (previousChunk == nil || [previousChunk isLastChunk]) { return nil; } chunk = [SimulChunk chunkWithEntityType:type container:self]; [chunk setStartTime:[previousChunk endTime]]; [chunk setPreviousChunkIncompleteEntities: [previousChunk incompleteEntities]]; [chunkArray addChunk:chunk]; isActive = YES; } } return chunk; } - (void)newEventWithType:(id)type value:(id)value withEvent:(PajeEvent *)event { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (![chunk isActive]) return; [chunk newEventEvent:event value:value]; } - (void)setUserStateOfType:(PajeEntityType *)type toValue:(id)value withEvent:(PajeEvent *)event { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (![chunk isActive]) return; [chunk setStateEvent:event value:value]; } - (void)pushUserStateOfType:(PajeEntityType *)type value:(id)value withEvent:(PajeEvent *)event { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (![chunk isActive]) return; [chunk pushStateEvent:event value:value]; } - (void)popUserStateOfType:(PajeEntityType *)type withEvent:(PajeEvent *)event { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (![chunk isActive]) return; [chunk popStateEvent:event]; } - (void)verifyMinMaxOfEntityType:(PajeEntityType *)t withValue:(double)value { NSNumber *oldMin; NSNumber *oldMax; id type = t; oldMin = [minValues objectForKey:type]; oldMax = [maxValues objectForKey:type]; if ((oldMin == nil) || (value < [oldMin doubleValue])) { [minValues setObject:[NSNumber numberWithDouble:value] forKey:type]; [type possibleNewMinValue:value]; } if ((oldMax == nil) || (value > [oldMax doubleValue])) { [maxValues setObject:[NSNumber numberWithDouble:value] forKey:type]; [type possibleNewMaxValue:value]; } } - (void)setUserVariableOfType:(PajeVariableType *)type toDoubleValue:(double)value withEvent:(PajeEvent *)event { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (![chunk isActive]) return; [chunk setVariableEvent:event doubleValue:value]; } - (void)addUserVariableOfType:(PajeVariableType *)type doubleValue:(double)value withEvent:(PajeEvent *)event { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (![chunk isActive]) return; [chunk addVariableEvent:event doubleValue:value]; } - (void)subUserVariableOfType:(PajeVariableType *)type doubleValue:(double)value withEvent:(PajeEvent *)event { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (![chunk isActive]) return; [chunk subVariableEvent:event doubleValue:value]; } - (double)minValueForEntityType:(PajeEntityType *)type { return [[minValues objectForKey:type] doubleValue]; } - (double)maxValueForEntityType:(PajeEntityType *)type { return [[maxValues objectForKey:type] doubleValue]; } - (void)startUserLinkOfType:(PajeEntityType *)type value:(id)value sourceContainer:(PajeContainer *)cont key:(id)key withEvent:(PajeEvent *)event { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (![chunk isActive]) return; [chunk startLinkEvent:event value:value sourceContainer:cont key:key]; } - (void)endUserLinkOfType:(PajeEntityType *)type value:(id)value destContainer:(PajeContainer *)cont key:(id)key withEvent:(PajeEvent *)event { SimulChunk *chunk; chunk = [self chunkOfType:type]; if (![chunk isActive]) return; [chunk endLinkEvent:event value:value destContainer:cont key:key]; } - (int)logicalTime { return logicalTime; } - (void)setLogicalTime:(int)lt { logicalTime = lt; } - (void)reset { //[userEntities removeAllObjects]; } - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)type fromTime:(NSDate *)start toTime:(NSDate *)end { ChunkArray *chunkArray; NSEnumerator *enumerator; chunkArray = [userEntities objectForKey:type]; BOOL foundAllData; foundAllData = NO; while (!foundAllData) { NS_DURING if (![self isStopped] && [end isLaterThanDate:[self endTime]]) { [simulator getChunksUntilTime:end]; } enumerator = [chunkArray enumeratorOfEntitiesFromTime:start toTime:end]; foundAllData = YES; NS_HANDLER NSString *exceptionName; exceptionName = [localException name]; if ([exceptionName isEqual:@"PajeMissingChunkException"]) { int chunkNo; chunkNo = [[[localException userInfo] objectForKey:@"ChunkNumber"] intValue]; [simulator notifyMissingChunk:chunkNo]; } else { [localException raise]; } NS_ENDHANDLER } //[SimulChunk emptyLeastRecentlyUsedChunks]; return enumerator; } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)type fromTime:(NSDate *)start toTime:(NSDate *)end { ChunkArray *chunkArray; NSEnumerator *enumerator; chunkArray = [userEntities objectForKey:type]; BOOL foundAllData; foundAllData = NO; while (!foundAllData) { NS_DURING if (![self isStopped] && [end isLaterThanDate:[self endTime]]) { [simulator getChunksUntilTime:end]; } enumerator = [chunkArray enumeratorOfCompleteEntitiesFromTime:start untilTime:end]; foundAllData = YES; NS_HANDLER NSString *exceptionName; exceptionName = [localException name]; if ([exceptionName isEqual:@"PajeMissingChunkException"]) { int chunkNo; chunkNo = [[[localException userInfo] objectForKey:@"ChunkNumber"] intValue]; [simulator notifyMissingChunk:chunkNo]; } else { [localException raise]; } NS_ENDHANDLER } //[SimulChunk emptyLeastRecentlyUsedChunks]; return enumerator; } - (id)chunkState { return [SimulContainerState stateWithTime:lastTime logicalTime:logicalTime]; } - (void)setChunkState:(id)obj { SimulContainerState *state = (SimulContainerState *)obj; [self setLastTime:[state time]]; [self setLogicalTime:[state logicalTime]]; } - (void)encodeWithCoder:(NSCoder *)coder { [NSException raise:@"SimulContainer should not be encoded" format:nil]; } - (NSArray *)fieldNames { NSArray *fieldNames; fieldNames = [super fieldNames]; if (extraFields != nil) { fieldNames = [fieldNames arrayByAddingObjectsFromArray:[extraFields allKeys]]; } return fieldNames; } - (id)valueOfFieldNamed:(NSString *)fieldName { id value = nil; if (extraFields != nil) { value = [extraFields objectForKey:fieldName]; } if (value == nil) { value = [super valueOfFieldNamed:fieldName]; } return value; } @end Paje-1.98/PajeSimulator/UserLink.h0000664000175000017500000000475611674062007016755 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _UserLink_h_ #define _UserLink_h_ // // UserEvent // // holds a user-definable link // #include "UserState.h" @interface UserLink : UserState { id key; PajeContainer *sourceContainer; // not retained PajeContainer *destContainer; // not retained int startLogicalTime; int endLogicalTime; } + (UserLink *)linkOfType:(PajeEntityType *)type value:(id)v key:(id)k container:(PajeContainer *)c sourceContainer:(PajeContainer *)sc sourceEvent:(PajeEvent *)e; + (UserLink *)linkOfType:(PajeEntityType *)type value:(id)v key:(id)k container:(PajeContainer *)c destContainer:(PajeContainer *)dc destEvent:(PajeEvent *)e; - (id)initWithType:(PajeEntityType *)type value:(id)v key:(id)k container:(PajeContainer *)c sourceContainer:(PajeContainer *)sc sourceEvent:(PajeEvent *)e; - (id)initWithType:(PajeEntityType *)type value:(id)v key:(id)k container:(PajeContainer *)c destContainer:(PajeContainer *)dc destEvent:(PajeEvent *)e; - (void)dealloc; - (void)setSourceContainer:(PajeContainer *)sc sourceEvent:(PajeEvent *)e; - (void)setDestContainer:(PajeContainer *)dc destEvent:(PajeEvent *)e; - (BOOL)canBeEndedWithValue:(id)v key:(id)k; - (BOOL)canBeStartedWithValue:(id)v key:(id)k; - (PajeContainer *)sourceContainer; - (PajeContainer *)destContainer; - (void)setStartLogicalTime:(int)t; - (void)setEndLogicalTime:(int)t; - (int)startLogicalTime; - (int)endLogicalTime; - (id) key; @end #endif Paje-1.98/PajeSimulator/SimulChunk.m0000664000175000017500000004703011674062007017300 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004, 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "SimulChunk.h" #include "../General/Macros.h" #include @implementation SimulChunk + (SimulChunk *)chunkWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc { Class class; switch ([type drawingType]) { case PajeEventDrawingType: class = [EventChunk class]; break; case PajeStateDrawingType: class = [StateChunk class]; break; case PajeLinkDrawingType: class = [LinkChunk class]; break; case PajeVariableDrawingType: class = [VariableChunk class]; break; default: NSWarnMLog(@"No support for creating chunk of type %@", type); class = nil; } return [[[class alloc] initWithEntityType:type container:pc] autorelease]; } - (id)initWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc { self = [super initWithEntityType:type container:pc]; if (self != nil) { lastChunk = NO; } return self; } // Simulation - (void)setPreviousChunkIncompleteEntities:(NSArray *)array { NSAssert([array count] == 0, @""); } - (BOOL)isLastChunk { return lastChunk; } - (void)stopWithEvent:(PajeEvent *)event { [self setEndTime:[event time]]; lastChunk = YES; } - (void)endOfChunkWithTime:(NSDate *)time { [super freeze]; // make arrays immutable? if (!lastChunk) [self setEndTime:time]; } // for events - (void)newEventEvent:(PajeEvent *)event value:(id)value { NSLog(@"Ignoring 'newEvent' event for non event entity type. Event: %@", event); } // for states - (void)setStateEvent:(PajeEvent *)event value:(id)value { NSLog(@"Ignoring 'setState' event for non state entity type. Event: %@", event); } - (void)pushStateEvent:(PajeEvent *)event value:(id)value { NSLog(@"Ignoring 'pushState' event for non state entity type. Event: %@", event); } - (void)popStateEvent:(PajeEvent *)event { NSLog(@"Ignoring 'popState' event for non state entity type. Event: %@", event); } // for links - (void)startLinkEvent:(PajeEvent *)event value:(id)value sourceContainer:(PajeContainer *)cont key:(id)key; { NSLog(@"Ignoring 'startLink' event for non link entity type. Event: %@", event); } - (void)endLinkEvent:(PajeEvent *)event value:(id)value destContainer:(PajeContainer *)cont key:(id)key { NSLog(@"Ignoring 'endLink' event for non link entity type. Event: %@", event); } // for variables - (void)setVariableEvent:(PajeEvent *)event doubleValue:(double)value { NSLog(@"Ignoring 'setVariable' event for non variable entity type." " Event: %@", event); } - (void)addVariableEvent:(PajeEvent *)event doubleValue:(double)value { NSLog(@"Ignoring 'addVariable' event for non variable entity type." " Event: %@", event); } - (void)subVariableEvent:(PajeEvent *)event doubleValue:(double)value { NSLog(@"Ignoring 'subVariable' event for non variable entity type." " Event: %@", event); } @end @implementation EventChunk - (void)newEventEvent:(PajeEvent *)event value:(id)value { UserEvent *newEvent; newEvent = [UserEvent eventWithType:entityType name:value container:container event:event]; [self addEntity:newEvent]; } @end @implementation StateChunk - (id)initWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc { self = [super initWithEntityType:type container:pc]; if (self != nil) { // [self setPreviousChunkIncompleteEntities:[NSArray array]]; } return self; } - (void)dealloc { Assign(simulationStack, nil); [super dealloc]; } - (void)setStateEvent:(PajeEvent *)event value:(id)value { if ([simulationStack count] > 0) { [self popStateEvent:event]; } [self pushStateEvent:event value:value]; } - (void)pushStateEvent:(PajeEvent *)event value:(id)value { UserState *state = nil; int imbricationLevel; imbricationLevel = [simulationStack count]; // if this chunk is being resimulated and the new state already // exists as an incomplete state, reuse it; else create a new one. if (imbricationLevel == resimulationStackLevel && imbricationLevel < [incompleteEntities count]) { state = [incompleteEntities objectAtIndex:imbricationLevel]; if ([[state startTime] isEqualToDate:[event time]] && [[state value] isEqual:value]) { resimulationStackLevel++; } else { state = nil; } } if (state == nil) { state = [UserState stateOfType:entityType value:value container:container startEvent:event]; [state setImbricationLevel:imbricationLevel]; } [simulationStack addObject:state]; } - (void)popStateEvent:(PajeEvent *)event { UserState *poppedState; UserState *newTopState; poppedState = (UserState *)[simulationStack lastObject]; if (poppedState != nil) { [poppedState setEndEvent:event]; [self addEntity:poppedState]; [simulationStack removeLastObject]; newTopState = (UserState *)[simulationStack lastObject]; if (newTopState != nil) { int stackLevel = [simulationStack count]; if (stackLevel > resimulationStackLevel) { [newTopState addInnerState:poppedState]; } else if (stackLevel < resimulationStackLevel) { resimulationStackLevel = stackLevel; } } } else { NSWarnMLog(@"No user state to pop with event %@", event); } } - (void)setPreviousChunkIncompleteEntities:(NSArray *)newStack { if (simulationStack != nil) { [simulationStack release]; simulationStack = nil; } if (newStack != nil) { simulationStack = [newStack mutableCopy]; if (incompleteEntities != nil) { // resimulating resimulationStackLevel = [simulationStack count]; } else { resimulationStackLevel = -1; } } } - (void)stopWithEvent:(PajeEvent *)event { while ([simulationStack count] > 0) { [self popStateEvent:event]; } [super stopWithEvent:event]; } - (void)activate { [super activate]; // someone must setPreviousChunkIncompleteEntities, or won't work } - (void)endOfChunkWithTime:(NSDate *)time { // if incompleteEntities is already set, entities in simulationStack can be ignored // (it is a resimulation, and they should be equal to incompleteEntities) if (incompleteEntities == nil) { [self setIncompleteEntities:simulationStack]; } Assign(simulationStack, nil);; [super endOfChunkWithTime:time]; } @end #include "SimulContainer.h" @implementation LinkChunk - (void)startLinkEvent:(PajeEvent *)event value:(id)value sourceContainer:(PajeContainer *)cont key:(id)key { UserLink *link = nil; unsigned index = 0; BOOL found = NO; int sourceLogicalTime; SimulContainer *sourceContainer = (SimulContainer *)cont; SimulContainer *destContainer; sourceLogicalTime = [sourceContainer logicalTime]; sourceLogicalTime++; [sourceContainer setLogicalTime:sourceLogicalTime]; unsigned count = [pendingLinks count]; for (index = 0; index < count; index++) { link = [pendingLinks objectAtIndex:index]; if ([link canBeStartedWithValue:value key:key]) { found = YES; break; } } if (found) { [link setSourceContainer:sourceContainer sourceEvent:event]; [link setStartLogicalTime:sourceLogicalTime]; destContainer = (SimulContainer *)[link destContainer]; if ([destContainer logicalTime] < sourceLogicalTime + 1) { [destContainer setLogicalTime:sourceLogicalTime + 1]; [link setEndLogicalTime:sourceLogicalTime + 1]; } [self addEntity:link]; [pendingLinks removeObjectAtIndex:index]; } else { link = [UserLink linkOfType:entityType value:value key:key container:container sourceContainer:sourceContainer sourceEvent:event]; [pendingLinks addObject:link]; [link setStartLogicalTime:sourceLogicalTime]; } } - (void)endLinkEvent:(PajeEvent *)event value:(id)value destContainer:(PajeContainer *)cont key:(id)key { UserLink *link = nil; unsigned index = 0; BOOL found = NO; int destLogicalTime; SimulContainer *destContainer = (SimulContainer *)cont; destLogicalTime = [destContainer logicalTime]; destLogicalTime++; [destContainer setLogicalTime:destLogicalTime]; unsigned count = [pendingLinks count]; for (index = 0; index < count; index++) { link = [pendingLinks objectAtIndex:index]; if ([link canBeEndedWithValue:value key:key]) { found = YES; break; } } if (found) { int lt = [link startLogicalTime] + 1; if (lt > destLogicalTime) { destLogicalTime = lt; [destContainer setLogicalTime:lt]; } [link setEndLogicalTime:destLogicalTime]; [link setDestContainer:destContainer destEvent:event]; [self addEntity:link]; [pendingLinks removeObjectAtIndex:index]; } else { link = [UserLink linkOfType:entityType value:value key:key container:container destContainer:destContainer destEvent:event]; [link setEndLogicalTime:destLogicalTime]; [pendingLinks addObject:link]; } } - (void)setPreviousChunkIncompleteEntities:(NSArray *)array { if (pendingLinks != nil) { [pendingLinks release]; pendingLinks = nil; } if (array != nil) { pendingLinks = [array mutableCopy]; } } - (void)stopWithEvent:(PajeEvent *)event { if ([pendingLinks count] > 0) { NSLog(@"incomplete links at end of container: %@", pendingLinks); } [super stopWithEvent:event]; } - (void)activate { [super activate]; // someone must setPreviousChunkIncompleteEntities, or won't work } - (void)endOfChunkWithTime:(NSDate *)time { // if incompleteEntities is already set, entities in pendingLinks can be ignored // (it is a resimulation, and they should be equal to incompleteEntities) if (incompleteEntities == nil) { [self setIncompleteEntities:pendingLinks]; } Assign(pendingLinks, nil);; [super endOfChunkWithTime:time]; } @end #include "../General/Association.h" @implementation VariableChunk - (id)initWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc { self = [super initWithEntityType:type container:pc]; if (self != nil) { //[entities setSelector:@selector(objectValue)]; [entities setSelector:@selector(time)]; currentValue = HUGE_VAL; } return self; } - (void)activate { [super activate]; //[entities setSelector:@selector(objectValue)]; [entities setSelector:@selector(time)]; } - (id)topEntity { return [entities lastObject]; } - (void)setPreviousChunkIncompleteEntities:(NSArray *)newIncompleteEntities { NSAssert([entities count] == 0, @"Internal inconsistency"); // if (incompleteEntities != nil && [incompleteEntities count] != 0) { // NSAssert([newIncompleteEntities count] == 1, @"Internal inconsistency"); //NSLog(@"previnc count=%d", [newIncompleteEntities count]); if ([newIncompleteEntities count] == 1) [self addEntity:[newIncompleteEntities lastObject]]; // } currentValue = HUGE_VAL; } - (void)setValue:(double)value time:(NSDate *)time { if (value != HUGE_VAL && currentValue == value) return; if (currentValue != HUGE_VAL) { sumValue += currentValue * [time timeIntervalSinceDate:currentTime]; [self addEntity:[UserValue valueWithType:entityType doubleValue:currentValue container:container startTime:currentTime endTime:time]]; } else { UserValue *valueFromPreviousChunk; valueFromPreviousChunk = [self topEntity]; if (valueFromPreviousChunk != nil) { if ([valueFromPreviousChunk doubleValue] == value) return; [valueFromPreviousChunk setEndTime:time]; } } currentValue = value; currentTime = time; if (currentValue != HUGE_VAL) { if (currentValue > maxValue) maxValue = currentValue; if (currentValue < minValue) minValue = currentValue; [container verifyMinMaxOfEntityType:entityType withValue:value]; } } - (void)setVariableEvent:(PajeEvent *)event doubleValue:(double)value { [self setValue:value time:[event time]]; } - (void)addVariableEvent:(PajeEvent *)event doubleValue:(double)value { [self setValue:currentValue + value time:[event time]]; } - (void)subVariableEvent:(PajeEvent *)event doubleValue:(double)value { [self setValue:currentValue - value time:[event time]]; } - (void)stopWithEvent:(PajeEvent *)event { [self setValue:HUGE_VAL time:[event time]]; } - (void)endOfChunkWithTime:(NSDate *)time { if (incompleteEntities == nil) { UserValue *incomplete; if (currentValue != HUGE_VAL) { incomplete = [UserValue valueWithType:entityType doubleValue:currentValue container:container startTime:currentTime endTime:time]; Assign(incompleteEntities, [NSArray arrayWithObject:incomplete]); } else if ([entities count] == 1) { incomplete = [entities lastObject]; [incomplete setEndTime:time]; Assign(incompleteEntities, [NSArray arrayWithObject:incomplete]); [entities removeLastObject]; } } [super endOfChunkWithTime:time]; } - (void)xsetEndTime:(NSDate *)time { [self setValue:currentValue time:time]; [super setEndTime:time]; } - (NSEnumerator *)enumeratorOfEntitiesFromTime:(NSDate *)sliceStartTime toTime:(NSDate *)sliceEndTime { NSEnumerator *incEnum = nil; NSEnumerator *compEnum = nil; NSEnumerator *en; NSUInteger firstIndex; NSUInteger lastIndex; NSRange range; NSUInteger count; BOOL mayHaveIncomplete = YES; [EntityChunk touch:self]; count = [entities count]; if (count > 0) { firstIndex = [entities indexOfLastObjectBeforeValue:sliceStartTime]; if (firstIndex == NSNotFound) { firstIndex = 0; } if (firstIndex == count - 1) { lastIndex = firstIndex; if ([[[entities objectAtIndex:firstIndex] endTime] isEarlierThanDate:sliceStartTime]) { firstIndex++; // no complete entities! } } else { lastIndex = [entities indexOfLastObjectBeforeValue:sliceEndTime]; if (lastIndex == NSNotFound) { lastIndex = -1; } if (lastIndex != count - 1) { mayHaveIncomplete = NO; } } int numEntities = lastIndex - firstIndex + 1; if (numEntities > 0) { range = NSMakeRange(firstIndex, numEntities); compEnum = [entities reverseObjectEnumeratorWithRange:range]; } } if (mayHaveIncomplete) { PajeEntity *incomplete; incomplete = [incompleteEntities lastObject]; if (incomplete != nil) { NSDate *incompleteStartTime; incompleteStartTime = [incomplete startTime]; if ([incompleteStartTime isEarlierThanDate:sliceEndTime]) { incEnum = [incompleteEntities objectEnumerator]; } } } if (incEnum != nil && compEnum != nil) { en = [MultiEnumerator enumeratorWithEnumeratorArray: [NSArray arrayWithObjects:incEnum, compEnum, nil]]; } else if (compEnum != nil) { en = compEnum; } else { en = incEnum; } return en; } - (NSEnumerator *)enumeratorOfEntitiesBeforeTime:(NSDate *)time { // variables are sorted by startTime, default enumerator does not work. // Variables do not overlap in a chunk. optimize the default enumerator // a bit by not filtering. NSEnumerator *incEnum = nil; NSEnumerator *compEnum = nil; NSEnumerator *en; int count; BOOL mayHaveIncomplete = YES; [EntityChunk touch:self]; count = [entities count]; if (count > 0) { NSUInteger lastIndex = [entities indexOfLastObjectBeforeValue:time]; if (lastIndex != NSNotFound) { unsigned firstIndex = 0; if (lastIndex != count - 1) { mayHaveIncomplete = NO; } NSUInteger numEntities = lastIndex - firstIndex + 1; if (numEntities > 0) { NSRange range; range = NSMakeRange(firstIndex, numEntities); compEnum = [entities reverseObjectEnumeratorWithRange:range]; } } } if (mayHaveIncomplete) { PajeEntity *incomplete; incomplete = [incompleteEntities lastObject]; if (incomplete != nil) { NSDate *incompleteStartTime; incompleteStartTime = [incomplete startTime]; if ([incompleteStartTime isEarlierThanDate:time]) { incEnum = [incompleteEntities objectEnumerator]; } } } if (incEnum != nil && compEnum != nil) { en = [MultiEnumerator enumeratorWithEnumeratorArray: [NSArray arrayWithObjects:incEnum, compEnum, nil]]; } else if (compEnum != nil) { en = compEnum; } else { en = incEnum; } return en; } - (NSEnumerator *)xxenumeratorOfAllCompleteEntities { NSEnumerator *compEnum; NSRange range; NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); [EntityChunk touch:self]; range = NSMakeRange(0, [entities count]/* - 1*/); compEnum = [entities reverseObjectEnumeratorWithRange:range]; return compEnum; } @end Paje-1.98/PajeSimulator/UserState.h0000664000175000017500000000370311674062007017127 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _UserState_h_ #define _UserState_h_ // // UserState // // holds a user-definable state // #include "UserEvent.h" #include "../General/CondensedEntitiesArray.h" @interface UserState : UserEvent { NSDate *endTime; int imbricationLevel; double innerDuration; CondensedEntitiesArray *innerStates; unsigned condensedEntitiesCount; } + (UserState *)stateOfType:(PajeEntityType *)type value:(id)v container:(PajeContainer *)c startEvent:(PajeEvent *)e; - (id)initWithType:(PajeEntityType *)type value:(id)v container:(PajeContainer *)c startEvent:(PajeEvent *)e; - (void)dealloc; - (void)setEndEvent:(PajeEvent *)event; - (NSDate *)endTime; - (void)setImbricationLevel:(int)level; - (int)imbricationLevel; - (double)exclusiveDuration; - (double)inclusiveDuration; - (void)addInnerState:(UserState *)innerState; - (CondensedEntitiesArray *)condensedEntities; - (unsigned)condensedEntitiesCount; - (unsigned)subCount; - (id)subValueAtIndex:(unsigned)i; - (double)subDurationAtIndex:(unsigned)i; - (NSColor *)subColorAtIndex:(unsigned)i; @end #endif Paje-1.98/PajeSimulator/PajeSimul+Events.m0000664000175000017500000005010511674062007020344 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* PajeSimul+Events.m created by benhur on 12-nov-2002 (from A0bSimul) */ #include "PajeSimul.h" #include "SimulContainer.h" #include "../General/PajeType.h" #include "UserEvent.h" #include "../General/Macros.h" @implementation PajeSimul (UserEvents) // // User defined entities // - (id)containerForId:(const char *)containerId type:(PajeContainerType *)containerType { if (containerType == nil) { // Unknown type, search in all types. NSEnumerator *types; types = [NSAllMapTableValues(userTypes) objectEnumerator]; while ((containerType = [types nextObject]) != nil) { if (![containerType isKindOfClass:[PajeContainerType class]]) { continue; } id container = [containerType instanceWithId:containerId]; if (container != nil) { return container; } } return nil; } //if (![containerType isKindOfClass:[PajeContainerType class]]) { // return nil; //} return [containerType instanceWithId:containerId]; } - (void)pajeStartTrace:(PajeEvent *)event { //OLDEVENT Assign(startTime, [event objectForKey:@"StartTime"]); //OLDEVENT Assign(endTime, [event objectForKey:@"EndTime"]); } - (void)pajeDefineContainerType:(PajeEvent *)event { const char *containerTypeId; const char *newContainerTypeName; const char *newContainerTypeAlias; const char *newContainerTypeId; PajeContainerType *containerType; PajeContainerType *newContainerType; if (replaying) return; // get fields from event newContainerTypeName = [event cStringForFieldId:PajeNameFieldId]; newContainerTypeAlias = [event cStringForFieldId:PajeAliasFieldId]; containerTypeId = [event cStringForFieldId:PajeTypeFieldId]; // verify presence of obligatory fields if (newContainerTypeName == NULL) { [self error:@"Missing \"Name\" field" inEvent:event]; } if (containerTypeId == NULL) { [self error:@"Missing \"ContainerType\" field" inEvent:event]; } containerType = [self typeForId:containerTypeId]; if (containerType == nil) { [self error:@"Unknown container type" inEvent:event]; } // if there is no alias, new type will be referenced by name if (newContainerTypeAlias != NULL) { newContainerTypeId = newContainerTypeAlias; } else { newContainerTypeId = newContainerTypeName; } // new type should not exist (but may, if replaying) if ([self typeForId:newContainerTypeId] != nil) { NSWarnLog(@"Redefining container type '%s' with event %@", newContainerTypeId, event); return; } // create the new container type NSString *newContainerTypeNameO, *newContainerTypeIdO; newContainerTypeNameO = [NSString stringWithCString:newContainerTypeName]; newContainerTypeIdO = [NSString stringWithCString:newContainerTypeId]; newContainerType = [PajeContainerType typeWithId:newContainerTypeIdO description:newContainerTypeNameO containerType:containerType event:event]; [self setType:newContainerType forId:newContainerTypeId]; [(PajeFilter *)outputComponent hierarchyChanged]; } - (void)pajeDefineLinkType:(PajeEvent *)event { const char *containerTypeId; const char *sourceContainerTypeId; const char *destContainerTypeId; const char *newEntityTypeName; const char *newEntityTypeAlias; const char *newEntityTypeId; PajeContainerType *containerType; PajeContainerType *sourceContainerType; PajeContainerType *destContainerType; PajeEntityType *newEntityType; if (replaying) return; // get fields from event newEntityTypeName = [event cStringForFieldId:PajeNameFieldId]; newEntityTypeAlias = [event cStringForFieldId:PajeAliasFieldId]; containerTypeId = [event cStringForFieldId:PajeTypeFieldId]; sourceContainerTypeId = [event cStringForFieldId:PajeStartContainerTypeFieldId]; destContainerTypeId = [event cStringForFieldId:PajeEndContainerTypeFieldId]; containerType = [self typeForId:containerTypeId]; if (containerType == nil) { [self error:@"Unknown container type" inEvent:event]; } sourceContainerType = [self typeForId:sourceContainerTypeId]; if (sourceContainerType == nil) { [self error:@"Unknown source container type" inEvent:event]; } destContainerType = [self typeForId:destContainerTypeId]; if (destContainerType == nil) { [self error:@"Unknown dest container type" inEvent:event]; } // if there is no alias, new type will be referenced by name if (newEntityTypeAlias != NULL) { newEntityTypeId = newEntityTypeAlias; } else { newEntityTypeId = newEntityTypeName; } // new type should not exist if ([self typeForId:newEntityTypeId] != nil) { NSWarnLog(@"Redefining entity type id '%s' with event %@", newEntityTypeId, event); return; } NSString *newEntityTypeNameO, *newEntityTypeIdO; newEntityTypeNameO = [NSString stringWithCString:newEntityTypeName]; newEntityTypeIdO = [NSString stringWithCString:newEntityTypeId]; newEntityType = [PajeLinkType typeWithId:newEntityTypeIdO description:newEntityTypeNameO containerType:containerType sourceContainerType:sourceContainerType destContainerType:destContainerType event:event]; [self setType:newEntityType forId:newEntityTypeId]; [(PajeFilter *)outputComponent hierarchyChanged]; } - (void)_defineUserEntityType:(PajeEvent *)event drawingType:(PajeDrawingType)drawingType { const char *containerTypeId; const char *newEntityTypeName; const char *newEntityTypeAlias; const char *newEntityTypeId; PajeContainerType *containerType = nil; PajeEntityType *newEntityType = nil; if (replaying) return; // get fields from event newEntityTypeName = [event cStringForFieldId:PajeNameFieldId]; newEntityTypeAlias = [event cStringForFieldId:PajeAliasFieldId]; containerTypeId = [event cStringForFieldId:PajeTypeFieldId]; // if there is no alias, new type will be referenced by name if (newEntityTypeAlias != NULL) { newEntityTypeId = newEntityTypeAlias; } else { newEntityTypeId = newEntityTypeName; } // new type should not exist if ([self typeForId:newEntityTypeId] != nil) { NSWarnLog(@"Redefining entity type id '%s' with event %@", newEntityTypeId, event); return; } containerType = [self typeForId:containerTypeId]; if (containerType == nil) { [self error:@"Unknown container type" inEvent:event]; } NSString *newEntityTypeNameO, *newEntityTypeIdO; newEntityTypeNameO = [NSString stringWithCString:newEntityTypeName]; newEntityTypeIdO = [NSString stringWithCString:newEntityTypeId]; switch (drawingType) { case PajeEventDrawingType: newEntityType = [PajeEventType typeWithId:newEntityTypeIdO description:newEntityTypeNameO containerType:containerType event:event]; break; case PajeStateDrawingType: newEntityType = [PajeStateType typeWithId:newEntityTypeIdO description:newEntityTypeNameO containerType:containerType event:event]; break; case PajeVariableDrawingType: newEntityType = [PajeVariableType typeWithId:newEntityTypeIdO description:newEntityTypeNameO containerType:containerType event:event]; break; default: [self error:@"Internal simulator error: unknown drawing type" inEvent:event]; } [self setType:newEntityType forId:newEntityTypeId]; [(PajeFilter *)outputComponent hierarchyChanged]; } - (void)pajeDefineEventType:(PajeEvent *)event { [self _defineUserEntityType:event drawingType:PajeEventDrawingType]; } - (void)pajeDefineStateType:(PajeEvent *)event { [self _defineUserEntityType:event drawingType:PajeStateDrawingType]; } - (void)pajeDefineVariableType:(PajeEvent *)event { [self _defineUserEntityType:event drawingType:PajeVariableDrawingType]; } - (void)pajeDefineEntityValue:(PajeEvent *)event { const char *newEntityValueAlias; NSString *newEntityValueName; const char *entityTypeId; NSColor *color; PajeEntityType *entityType; if (replaying) return; // get fields from event newEntityValueName = [event stringForFieldId:PajeNameFieldId]; newEntityValueAlias = [event cStringForFieldId:PajeAliasFieldId]; entityTypeId = [event cStringForFieldId:PajeTypeFieldId]; color = [event colorForFieldId:PajeColorFieldId]; entityType = [self typeForId:entityTypeId]; if (entityType == nil) { [self error:@"Unknown entity type" inEvent:event]; } if ([entityType drawingType] == PajeVariableDrawingType) { NSWarnLog(@"Values of variables cannot be named in event %@", event); return; } if (color != nil) { [(PajeEventType *)entityType setValue:newEntityValueName alias:newEntityValueAlias color:color]; } else { [(PajeEventType *)entityType setValue:newEntityValueName alias:newEntityValueAlias]; } } - (void)pajeCreateContainer:(PajeEvent *)event { const char *newContainerTypeId; const char *containerId; const char *newContainerName; const char *newContainerAlias; const char *newContainerId; PajeContainerType *typeOfNewContainer; PajeContainer *container; PajeContainer *newContainer; if (replaying) return; // get fields from event newContainerName = [event cStringForFieldId:PajeNameFieldId]; newContainerAlias = [event cStringForFieldId:PajeAliasFieldId]; newContainerTypeId = [event cStringForFieldId:PajeTypeFieldId]; containerId = [event cStringForFieldId:PajeContainerFieldId]; if (newContainerName == NULL) { [self error:@"Missing \"Name\" field" inEvent:event]; } if (newContainerTypeId == NULL) { [self error:@"Missing \"Type\" field" inEvent:event]; } if (containerId == NULL) { [self error:@"Missing \"Container\" field" inEvent:event]; } typeOfNewContainer = [self typeForId:newContainerTypeId]; if (!typeOfNewContainer) { [self error:@"Unknown container type" inEvent:event]; } if (newContainerAlias != NULL) { newContainerId = newContainerAlias; } else { newContainerId = newContainerName; } if ([self containerForId:newContainerId type:typeOfNewContainer] != nil) { NSWarnLog(@"Redefining container id '%s' in event %@", newContainerId, event); return; } container = [self containerForId:containerId type:[typeOfNewContainer containerType]]; if (container == nil) { [self error:@"Unknown container" inEvent:event]; } newContainer = [SimulContainer containerWithType:typeOfNewContainer name:[NSString stringWithCString:newContainerName] alias:[NSString stringWithCString:newContainerAlias] container:container creationTime:[event time] event: event simulator:self]; [container addSubContainer:newContainer]; [typeOfNewContainer addInstance:newContainer id1:newContainerId id2:NULL]; [(PajeFilter *)outputComponent hierarchyChanged]; } - (void)pajeDestroyContainer:(PajeEvent *)event { const char *containerId; const char *containerTypeId; PajeContainerType *containerType; SimulContainer *container; // if (replaying) return; // get fields from event containerId = [event cStringForFieldId:PajeNameFieldId]; if (containerId == NULL) { containerId = [event cStringForFieldId:PajeContainerFieldId]; } containerTypeId = [event cStringForFieldId:PajeTypeFieldId]; containerType = [self typeForId:containerTypeId]; if (containerType == nil) { NSWarnLog(@"Unknown container type in event %@", event); //[self error:@"Unknown container type" inEvent:event]; } container = [self containerForId:containerId type:containerType]; if (container == nil) { [self error:@"Unknown container" inEvent:event]; return; } [container stopWithEvent:event]; } - (void)_getEntityType:(PajeEntityType **)entityType value:(id *)entityValue container:(PajeContainer **)container fromEvent:(PajeEvent *)event { const char *entityTypeId; const char *containerId; if (entityType != NULL) { entityTypeId = [event cStringForFieldId:PajeTypeFieldId]; *entityType = [self typeForId:entityTypeId]; if (*entityType == nil) { [self error:@"Unknown entity type" inEvent:event]; } } if (entityType != NULL && container != NULL) { containerId = [event cStringForFieldId:PajeContainerFieldId]; *container = [self containerForId:containerId type:[*entityType containerType]]; if (*container == nil) { [self error:@"Unknown container" inEvent:event]; } } if (entityValue != NULL) { const char *csvalue; id value; csvalue = [event cStringForFieldId:PajeValueFieldId]; if (entityType != NULL && [*entityType isKindOfClass:[PajeCategorizedEntityType class]]) { PajeCategorizedEntityType *type = (id)*entityType; value = [type valueForAlias:csvalue]; } else { value = [NSString stringWithCString:csvalue]; } *entityValue = value; } } - (void)pajeNewEvent:(PajeEvent *)event { PajeEventType *entityType; SimulContainer *container; id entityValue; [self _getEntityType:&entityType value:&entityValue container:&container fromEvent:event]; [container newEventWithType:entityType value:entityValue withEvent:event]; } - (void)pajeSetState:(PajeEvent *)event { PajeStateType *entityType; SimulContainer *container; id entityValue; [self _getEntityType:&entityType value:&entityValue container:&container fromEvent:event]; [container setUserStateOfType:entityType toValue:entityValue withEvent:event]; } - (void)pajePushState:(PajeEvent *)event { PajeStateType *entityType; SimulContainer *container; id entityValue; [self _getEntityType:&entityType value:&entityValue container:&container fromEvent:event]; [container pushUserStateOfType:entityType value:entityValue withEvent:event]; } - (void)pajePopState:(PajeEvent *)event { PajeStateType *entityType; SimulContainer *container; [self _getEntityType:&entityType value:NULL container:&container fromEvent:event]; [container popUserStateOfType:entityType withEvent:event]; } - (void)pajeSetVariable:(PajeEvent *)event { PajeVariableType *entityType; SimulContainer *container; double entityValue; [self _getEntityType:&entityType value:NULL container:&container fromEvent:event]; entityValue = [event doubleForFieldId:PajeValueFieldId]; [container setUserVariableOfType:entityType toDoubleValue:entityValue withEvent:event]; } - (void)pajeAddVariable:(PajeEvent *)event { PajeVariableType *entityType; SimulContainer *container; double entityValue; [self _getEntityType:&entityType value:NULL container:&container fromEvent:event]; entityValue = [event doubleForFieldId:PajeValueFieldId]; [container addUserVariableOfType:entityType doubleValue:entityValue withEvent:event]; } - (void)pajeSubVariable:(PajeEvent *)event { PajeVariableType *entityType; SimulContainer *container; double entityValue; [self _getEntityType:&entityType value:NULL container:&container fromEvent:event]; entityValue = [event doubleForFieldId:PajeValueFieldId]; [container subUserVariableOfType:entityType doubleValue:entityValue withEvent:event]; } - (void)pajeStartLink:(PajeEvent *)event { const char *sourceContainerId; PajeLinkType *entityType; SimulContainer *container; PajeContainer *sourceContainer; id entityValue; id key; [self _getEntityType:&entityType value:&entityValue container:&container fromEvent:event]; sourceContainerId = [event cStringForFieldId:PajeStartContainerFieldId]; key = [event stringForFieldId:PajeKeyFieldId]; sourceContainer = [self containerForId:sourceContainerId type:[entityType sourceContainerType]]; if (sourceContainer == nil) { [self error:@"Unknown source container" inEvent:event]; return; } [container startUserLinkOfType:entityType value:entityValue sourceContainer:sourceContainer key:key withEvent:event]; } - (void)pajeEndLink:(PajeEvent *)event { const char *destContainerNumber; PajeLinkType *entityType; SimulContainer *container; PajeContainer *destContainer; id entityValue; id key; [self _getEntityType:&entityType value:&entityValue container:&container fromEvent:event]; destContainerNumber = [event cStringForFieldId:PajeEndContainerFieldId]; key = [event stringForFieldId:PajeKeyFieldId]; destContainer = [self containerForId:destContainerNumber type:[entityType destContainerType]]; if (destContainer == nil) { [self error:@"Unknown destination container" inEvent:event]; return; } [container endUserLinkOfType:entityType value:entityValue destContainer:destContainer key:key withEvent:event]; } @end Paje-1.98/PajeSimulator/UserLink.m0000664000175000017500000001273611674062007016757 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // // UserEvent // // holds a user-definable link // #include "UserLink.h" #include "../General/Macros.h" #include "../General/PajeContainer.h" @implementation UserLink + (UserLink *)linkOfType:(PajeEntityType *)type value:(id)v key:(id)k container:(PajeContainer *)c sourceContainer:(PajeContainer *)sc sourceEvent:(PajeEvent *)e { return [[[self alloc] initWithType:type value:v key:k container:c sourceContainer:sc sourceEvent:e] autorelease]; } + (UserLink *)linkOfType:(PajeEntityType *)type value:(id)v key:(id)k container:(PajeContainer *)c destContainer:(PajeContainer *)dc destEvent:(PajeEvent *)e; { return [[[self alloc] initWithType:type value:v key:k container:c destContainer:dc destEvent:e] autorelease]; } - (id)initWithType:(PajeEntityType *)type value:(id)v key:(id)k container:(PajeContainer *)c sourceContainer:(PajeContainer *)sc sourceEvent:(PajeEvent *)e { self = [super initWithType:type value:v container:c startEvent:e]; if (self != nil) { Assign(key, k); sourceContainer = sc; // not retained } return self; } - (id)initWithType:(PajeEntityType *)type value:(id)v key:(id)k container:(PajeContainer *)c destContainer:(PajeContainer *)dc destEvent:(PajeEvent *)e { self = [super initWithType:type value:v container:c startEvent:nil]; if (self != nil) { [self setEndEvent:e]; Assign(key, k); destContainer = dc; // not retained } return self; } - (void)dealloc { Assign(key, nil); [super dealloc]; } - (void)setSourceContainer:(PajeContainer *)sc sourceEvent:(PajeEvent *)e { sourceContainer = sc; // not retained [self setEvent:e]; } - (void)setDestContainer:(PajeContainer *)dc destEvent:(PajeEvent *)e { destContainer = dc; // not retained [self setEndEvent:e]; } - (BOOL)canBeEndedWithValue:(id)v key:(id)k { return (/*(destContainer == nil) && */[[self value] isEqual:v] && [key isEqual:k]); } - (BOOL)canBeStartedWithValue:(id)v key:(id)k { return (/*(sourceContainer == nil) && */[[self value] isEqual:v] && [key isEqual:k]); } - (PajeContainer *)container { return container; } - (PajeContainer *)sourceContainer { return sourceContainer; } - (PajeContainer *)destContainer { return destContainer; } - (PajeEntityType *)sourceEntityType { return [sourceContainer entityType]; } - (PajeEntityType *)destEntityType { return [destContainer entityType]; } - (NSArray *)fieldNames { NSArray *localFields; localFields = [NSArray arrayWithObjects: @"SourceContainer", @"DestContainer", @"Key", @"StartLogical", @"EndLogical", nil]; return [[super fieldNames] arrayByAddingObjectsFromArray:localFields]; } - (id)valueOfFieldNamed:(NSString *)fieldName { id value; if ([fieldName isEqual:@"SourceContainer"]) return [self sourceContainer]; else if ([fieldName isEqual:@"DestContainer"]) return [self destContainer]; else if ([fieldName isEqual:@"Key"]) return key; else if ([fieldName isEqual:@"StartLogical"]) return [NSString stringWithFormat:@"%d", [self startLogicalTime]]; else if ([fieldName isEqual:@"EndLogical"]) return [NSString stringWithFormat:@"%d", [self endLogicalTime]]; else value = [super valueOfFieldNamed:fieldName]; return value; } - (NSDate *)xendTime { // if (endLogicalTime != nil) // return endLogicalTime; return [super endTime]; } - (NSDate *)startTime { //if (startLogicalTime != nil) // return startLogicalTime; if (time != nil) { return [super startTime]; } else if (sourceContainer != nil) { return [sourceContainer endTime]; } else { return [self endTime]; } } - (void)setStartLogicalTime:(int)t { startLogicalTime = t; } - (void)setEndLogicalTime:(int)t { endLogicalTime = t; } - (int)startLogicalTime { return startLogicalTime; } - (int)endLogicalTime { return endLogicalTime; } - (id) key { return key; } @end Paje-1.98/PajeSimulator/UserValue.m0000664000175000017500000000622711674062007017134 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // // UserValue // // Holds a generic user-generated event. // #include "UserValue.h" #include "../General/Macros.h" @implementation UserValue + (UserValue *)valueWithType:(PajeEntityType *)type doubleValue:(double)v container:(PajeContainer *)c startTime:(NSDate *)t1 endTime:(NSDate *)t2 { return [[[self alloc] initWithType:type doubleValue:v container:c startTime:t1 endTime:t2] autorelease]; } - (id)initWithType:(PajeEntityType *)type doubleValue:(double)v container:(PajeContainer *)c startTime:(NSDate *)t1 endTime:(NSDate *)t2 { self = [super initWithType:type name:@"" container:c]; if (self != nil) { Assign(startTime, t1); Assign(endTime, t2); value = v; } return self; } - (void)dealloc { Assign(startTime, nil); Assign(endTime, nil); [super dealloc]; } - (NSDate *)startTime { return startTime; } - (NSDate *)endTime { if (endTime != nil) { return endTime; } return [container endTime]; } - (NSDate *)time { return startTime; } - (void)setEndTime:(NSDate *)time { Assign(endTime, time); } - (double)doubleValue { return value; } - (id)value { return [NSNumber numberWithDouble:value]; } - (double)minValue { return value; } - (double)maxValue { return value; } - (NSUInteger)condensedEntitiesCount { return 1; } - (NSArray *)fieldNames { return [[super fieldNames] arrayByAddingObject: @"Value"]; } - (id)valueOfFieldNamed:(NSString *)fieldName { id val; if ([fieldName isEqualToString:@"Value"]) { val = [NSNumber numberWithDouble:value]; } else { val = [super valueOfFieldNamed:fieldName]; } return val; } - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:[NSNumber numberWithDouble:value]]; [coder encodeObject:startTime]; [coder encodeObject:endTime]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; value = [(NSNumber *)[coder decodeObject] doubleValue]; Assign(startTime, [coder decodeObject]); Assign(endTime, [coder decodeObject]); return self; } @end Paje-1.98/PajeSimulator/UserValue.h0000664000175000017500000000311111674062007017114 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _UserValue_h_ #define _UserValue_h_ // // UserValue // // holds a user-definable value // #include "../General/PajeEvent.h" #include "../General/PajeEntity.h" #include "../General/PajeEntityInspector.h" #include "../General/PajeType.h" @interface UserValue : PajeEntity { double value; NSDate *startTime; NSDate *endTime; } + (UserValue *)valueWithType:(PajeEntityType *)type doubleValue:(double)v container:(PajeContainer *)c startTime:(NSDate *)t1 endTime:(NSDate *)t2; - (id)initWithType:(PajeEntityType *)type doubleValue:(double)v container:(PajeContainer *)c startTime:(NSDate *)t1 endTime:(NSDate *)t2; - (void)dealloc; - (void)setEndTime:(NSDate *)time; @end #endif Paje-1.98/PajeSimulator/UserEvent.m0000664000175000017500000000605611674062007017141 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // // UserEvent // // Holds a generic user-generated event. // #include "UserEvent.h" #include "../General/Macros.h" @implementation UserEvent + (UserEvent *)eventWithType:(PajeEntityType *)type name:(id)n container:(PajeContainer *)c event:(PajeEvent *)e { return [[[self alloc] initWithType:type name:n container:c event:e] autorelease]; } - (id)initWithType:(PajeEntityType *)type name:(id)n container:(PajeContainer *)c event:(PajeEvent *)e { self = [super initWithType:type name:n container:c]; if (self != nil) { if (e != nil) { [self setEvent:e]; } } return self; } - (void)dealloc { Assign(extraFields, nil); Assign(time, nil); [super dealloc]; } - (void)setEvent:(PajeEvent *)e { Assign(extraFields, [e extraFields]); if (![entityType isKnownEventType:[e cStringForFieldId:PajeEventIdFieldId]]) { [entityType addFieldNames:[e fieldNames]]; [entityType addFieldNames:[self fieldNames]]; } Assign(time, [e time]); } - (NSDate *)time { return time; } - (NSArray *)fieldNames { NSArray *fieldNames; fieldNames = [super fieldNames]; //fieldNames = [fieldNames arrayByAddingObject:@"Time"]; if (extraFields != nil) { fieldNames = [fieldNames arrayByAddingObjectsFromArray:[extraFields allKeys]]; } return fieldNames; } - (id)valueOfFieldNamed:(NSString *)fieldName { id value = nil; if ([fieldName isEqualToString:@"Time"]) { value = time; } else if (extraFields != nil) { value = [extraFields objectForKey:fieldName]; } if (value == nil) { value = [super valueOfFieldNamed:fieldName]; } return value; } - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:extraFields]; [coder encodeObject:time]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; Assign(extraFields, [coder decodeObject]); Assign(time, [coder decodeObject]); return self; } @end Paje-1.98/PajeSimulator/PajeSimul.m0000664000175000017500000003346111674062007017112 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* * PajeSimul.m * * Simulator for Paje traces. * * 20021107 BS creation (from A0bSimul) */ #include "PajeSimul.h" #include "SimulContainer.h" #include "../General/UniqueString.h" #include "../General/SourceCodeReference.h" #include "../General/NSDictionary+Additions.h" #include "../General/Macros.h" #include "../General/CStringCallBacks.h" #include "../Paje/PajeTraceController.h" #define DEFINE_STRINGS #include "EventNames.h" #undef DEFINE_STRINGS @implementation PajeSimul + (void)initialize { if (self == [PajeSimul class]) { #define INIT_STRINGS #include "EventNames.h" #undef INIT_STRINGS } } - (void)error:(NSString *)format, ... { va_list args; va_start(args, format); [NSException raise:@"PajeSimulException" format:format arguments:args]; va_end(args); } - (void)error:(NSString *)str inEvent:(PajeEvent *)event { #ifdef OLDEVENT PajeEvent *eventCopy; NSDate *evTime; evTime = [event valueOfFieldNamed:@"Time"]; if (evTime != nil) { id n; eventCopy = [event mutableCopy]; n = [NSNumber numberWithDouble:[evTime timeIntervalSinceReferenceDate]]; [eventCopy setValue:n ofFieldNamed:@"Time"]; } else { eventCopy = [event retain]; } [self error:@"%@ in event %@", str, [eventCopy descriptionWithLocale:[NSDictionary dictionary] indent:0]]; [eventCopy release]; #else [self error:@"%@ in event %@", str, event]; #endif } - (PajeContainer *)rootInstance { return [self rootContainer]; } - (PajeContainer *)rootContainer { if (rootContainer == nil) { PajeContainerType *rootContainerType; NSString *rootContainerName; rootContainerName = [inputComponent traceDescription]; if (rootContainerName == nil) { return nil; } rootContainerType = [PajeContainerType typeWithId:@"File" description:@"File" containerType:nil event:nil]; rootContainer = [[SimulContainer alloc] initWithType:rootContainerType name:rootContainerName alias:@"0" container:nil creationTime:[NSDate dateWithTimeIntervalSinceReferenceDate:0] event:nil simulator:self]; [rootContainerType addInstance:rootContainer id1:"0" id2:"/"]; [self setType:rootContainerType forId:"0"]; [self setType:rootContainerType forId:"/"]; [self setType:rootContainerType forId:"File"]; } return rootContainer; } - (PajeContainerType *)rootContainerType { return (PajeContainerType *)[[self rootContainer] entityType]; } - (NSString *)delete_name { return NSStringFromClass([self class]); } #define ADD_INVOCATION(name) invocationTable[Paje##name##EventId] = \ [self methodForSelector:@selector(paje##name:)] - (void)_initInvocationTable { ADD_INVOCATION(StartTrace); ADD_INVOCATION(DefineContainerType); ADD_INVOCATION(DefineEventType); ADD_INVOCATION(DefineStateType); ADD_INVOCATION(DefineVariableType); ADD_INVOCATION(DefineLinkType); ADD_INVOCATION(DefineEntityValue); ADD_INVOCATION(CreateContainer); ADD_INVOCATION(DestroyContainer); ADD_INVOCATION(NewEvent); ADD_INVOCATION(SetState); ADD_INVOCATION(PushState); ADD_INVOCATION(PopState); ADD_INVOCATION(SetVariable); ADD_INVOCATION(AddVariable); ADD_INVOCATION(SubVariable); ADD_INVOCATION(StartLink); ADD_INVOCATION(EndLink); } - (id)initWithController:(PajeTraceController *)c { self = [super initWithController:c]; if (self != nil) { userTypes = NSCreateMapTable(CStringMapKeyCallBacks, NSObjectMapValueCallBacks, 50); relatedEntities = [[NSMutableDictionary alloc] init]; [self _initInvocationTable]; chunkInfo = [[NSMutableArray alloc] init]; currentChunkNumber = 0; currentTime = [[NSDate distantPast] retain]; } return self; } - (void)dealloc { [rootContainer release]; NSFreeMapTable(userTypes); [relatedEntities release]; [startTime release]; [endTime release]; [currentTime release]; [chunkInfo release]; [super dealloc]; } - (NSDate *)startTime { return startTime; } - (NSDate *)endTime { return endTime; } - (void)setCurrentTime:(NSDate *)time { Assign(currentTime, time); if (startTime == nil) { Assign(startTime, time); } } - (NSDate *)currentTime { return currentTime; } - (int)eventCount { return eventCount; } - (PajeEntityType *)entityTypeWithName:(NSString *)name { return NSMapGet(userTypes, [name cString]); } - (id)typeForId:(const char *)typeId { if (typeId == NULL) return nil; return NSMapGet(userTypes, typeId); } - (void)setType:(id)type forId:(const char *)typeId { NSMapInsert(userTypes, strdup(typeId), type); } - (void)inputEntity:(PajeEvent *)event { id time; [self rootContainer]; #ifdef SUPPORT_FOR_SOURCE_REFERENCES // set event's filename -- not supported NSString *filename; filename = [event stringForFieldId:PajeFileFieldId]; if (filename != nil) { int lineNumber; SourceCodeReference *sourceRef; lineNumber = [event intForFieldId:PajeLineFieldId]; sourceRef = [SourceCodeReference referenceToFilename:filename lineNumber:lineNumber]; } #endif // set the current time, if event has one time = [event time]; if (time != nil) { [self setCurrentTime:time]; } // invoke the method that simulates this event int eventId; eventId = [event pajeEventId]; IMP f = NULL; if (eventId >= 0 && eventId < (sizeof invocationTable / sizeof(invocationTable[0]))) { f = invocationTable[eventId]; } if (f != NULL) { f(self, 0, event); } else { NSLog(@"Unknown event \"%@\"", event); } eventCount++; } - (BOOL)canEndChunkBefore:(PajeEvent *)event { id time; time = [event time]; if (time != nil && [currentTime isLaterThanDate:[NSDate distantPast]] && [currentTime isLaterThanDate:[NSDate dateWithTimeIntervalSinceReferenceDate:0]] && [time isLaterThanDate:currentTime]) { return YES; } [self inputEntity:event]; return NO; } - (void)_resetContainers { //[[userNumberToContainer allValues] // makeObjectsPerformSelector:@selector(reset)]; } - (void)addRelatedEntity:(id)entity toKey:(id)key { NSMutableArray *entities; entities = [relatedEntities objectForKey:key]; if (entities == nil) { entities = [NSMutableArray arrayWithObject:entity]; [relatedEntities setObject:entities forKey:key]; } else { [entities addObject:entity]; } } - (NSArray *)relatedEntitiesForEntity:(id)entity { id key; key = [entity valueOfFieldNamed:@"RelationKey"]; if (key != nil) { return [relatedEntities objectForKey:key]; } else { return [entity relatedEntities]; } } - (void)outputEntity:(id)entity { id key; key = [(id)entity valueOfFieldNamed:@"RelationKey"]; if (key != nil) { [self addRelatedEntity:entity toKey:key]; } [super outputEntity:entity]; } - (void)outputChunk:(id)entity { if (replaying) { return; } [super outputEntity:entity]; } - (void)startChunkInContainer:(SimulContainer *)container { NSEnumerator *subContainerEnumerator; SimulContainer *subContainer; [container startChunk]; subContainerEnumerator = [[container subContainers] objectEnumerator]; while ((subContainer = [subContainerEnumerator nextObject]) != nil) { [self startChunkInContainer:subContainer]; } } - (void)endOfChunkInContainer:(SimulContainer *)container last:(BOOL)last { NSEnumerator *subContainerEnumerator; SimulContainer *subContainer; [container endOfChunkLast:last]; if (endTime == nil || [endTime isEarlierThanDate:currentTime]) { Assign(endTime, currentTime); } subContainerEnumerator = [[container subContainers] objectEnumerator]; while ((subContainer = [subContainerEnumerator nextObject]) != nil) { [self endOfChunkInContainer:subContainer last:last]; } } - (void)emptyChunk:(int)chunkNumber inContainer:(SimulContainer *)container { NSEnumerator *subContainerEnumerator; SimulContainer *subContainer; [container emptyChunk:chunkNumber]; subContainerEnumerator = [[container subContainers] objectEnumerator]; while ((subContainer = [subContainerEnumerator nextObject]) != nil) { [self emptyChunk:chunkNumber inContainer:subContainer]; } } - (void)addStateOfContainer:(SimulContainer *)container toDict:(NSMutableDictionary *)dict { NSEnumerator *subContainerEnumerator; SimulContainer *subContainer; [dict setObject:[container chunkState] forKey:[container alias]]; subContainerEnumerator = [[container subContainers] objectEnumerator]; while ((subContainer = [subContainerEnumerator nextObject]) != nil) { [self addStateOfContainer:subContainer toDict:dict]; } } - (id)chunkState { //NSEnumerator *containerEnum; //SimulContainer *container; NSMutableDictionary *state; state = [NSMutableDictionary dictionary]; [state setObject:currentTime forKey:@"_currentTime"]; [state setObject:[NSNumber numberWithInt:eventCount] forKey:@"_eventCount"]; // FIXME: should be saved by type //containerEnum = [[userNumberToContainer allValues] objectEnumerator]; //while ((container = [containerEnum nextObject]) != nil) { // id key = [container alias]; // if (nil == [state objectForKey:key]) { // [state setObject:[container chunkState] forKey:key]; // } //} [self addStateOfContainer:(SimulContainer *)[self rootContainer] toDict:state]; return state; } - (void)setChunkState:(id)obj { NSDictionary *state = (NSDictionary *)obj; [self setCurrentTime:[state objectForKey:@"_currentTime"]]; eventCount = [[state objectForKey:@"_eventCount"] intValue]; [self _resetContainers]; NSEnumerator *keyEnum; id key; keyEnum = [state keyEnumerator]; while ((key = [keyEnum nextObject]) != nil) { SimulContainer *container; //container = [userNumberToContainer objectForKey:key]; container = [self containerForId:[key cString] type:nil]; if (container == nil) { if (![key isEqual:@"_currentTime"] && ![key isEqual:@"_eventCount"]) { [self error:@"Decoding unknown container '%@'", key]; } } else { [container setChunkState:[state objectForKey:key]]; } } } - (int)currentChunkNumber { return currentChunkNumber; } - (void)startChunk:(int)chunkNumber { if (chunkNumber != currentChunkNumber) { if (chunkNumber >= [chunkInfo count]) { // cannot position in an unread place [self error:@"Cannot start unknown chunk"]; } [self setChunkState:[chunkInfo objectAtIndex:chunkNumber]]; currentChunkNumber = chunkNumber; } else { // let's register the first chunk position if ([chunkInfo count] == 0) { [chunkInfo addObject:[self chunkState]]; } } if (!lastChunkSeen && currentChunkNumber == [chunkInfo count] - 1) { replaying = NO; } else { replaying = YES; } [self startChunkInContainer:rootContainer]; // keep the ball rolling (tell other components) [super startChunk:chunkNumber]; } - (BOOL)isReplaying { return replaying; } - (void)endOfChunkLast:(BOOL)last { [self endOfChunkInContainer:rootContainer last:last]; if (!last) { currentChunkNumber++; // if we're at the end of the known world, let's register its position if (currentChunkNumber == [chunkInfo count]) { [chunkInfo addObject:[self chunkState]]; } } else { lastChunkSeen = YES; } [super endOfChunkLast:(BOOL)last]; } - (void)emptyChunk:(int)chunkNumber { [self emptyChunk:chunkNumber inContainer:rootContainer]; } - (void)notifyMissingChunk:(int)chunkNumber { [controller missingChunk:chunkNumber]; } - (void)getChunksUntilTime:(NSDate *)time { while ([currentTime isEarlierThanDate:time]) { int chunkNumber = [chunkInfo count] - 1; [self notifyMissingChunk:chunkNumber]; // if no chunk has been read, give up if ([chunkInfo count] - 1 == chunkNumber) { break; } } } - (id)copyWithZone:(NSZone *)zone { return [self retain]; } @end Paje-1.98/PajeSimulator/EventNames.h0000664000175000017500000000514011674062007017252 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // EventNames.h // // declaration of event names. // include this file with the following symbol #defined: // nothing - declaration of variables as extern // DEFINE_STRINGS - declaration of variables not extern // INIT_STRINGS - initialization of variables #if defined(INIT_STRINGS) # define CONSTANT_STRING(str, init) str##EventName = (NSString*)[UniqueString stringWithString:init] #else # if defined(DEFINE_STRINGS) # define CONSTANT_STRING(str, init) NSString *str##EventName # else // declare strings # define CONSTANT_STRING(str, init) extern NSString *str##EventName # endif #endif CONSTANT_STRING(PajeStartTrace, @"PajeStartTrace"); CONSTANT_STRING(PajeDefineContainerType, @"PajeDefineContainerType"); CONSTANT_STRING(PajeDefineEventType, @"PajeDefineEventType"); CONSTANT_STRING(PajeDefineStateType, @"PajeDefineStateType"); CONSTANT_STRING(PajeDefineVariableType, @"PajeDefineVariableType"); CONSTANT_STRING(PajeDefineLinkType, @"PajeDefineLinkType"); CONSTANT_STRING(PajeDefineEntityValue, @"PajeDefineEntityValue"); CONSTANT_STRING(PajeCreateContainer, @"PajeCreateContainer"); CONSTANT_STRING(PajeDestroyContainer, @"PajeDestroyContainer"); CONSTANT_STRING(PajeNewEvent, @"PajeNewEvent"); CONSTANT_STRING(PajeSetState, @"PajeSetState"); CONSTANT_STRING(PajePushState, @"PajePushState"); CONSTANT_STRING(PajePopState, @"PajePopState"); CONSTANT_STRING(PajeSetVariable, @"PajeSetVariable"); CONSTANT_STRING(PajeAddVariable, @"PajeAddVariable"); CONSTANT_STRING(PajeSubVariable, @"PajeSubVariable"); CONSTANT_STRING(PajeStartLink, @"PajeStartLink"); CONSTANT_STRING(PajeEndLink, @"PajeEndLink"); #undef CONSTANT_STRING Paje-1.98/PajeSimulator/UserState.m0000664000175000017500000001045511674062007017136 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "UserState.h" #include "../General/Macros.h" @implementation UserState + (UserState *)stateOfType:(PajeEntityType *)type value:(id)v container:(PajeContainer *)c startEvent:(PajeEvent *)e { return [[[self alloc] initWithType:type value:v container:c startEvent:e] autorelease]; } - (id)initWithType:(PajeEntityType *)type value:(id)v container:(PajeContainer *)c startEvent:(PajeEvent *)e { self = [super initWithType:type name:v container:c event:e]; if (self != nil) { endTime = nil; imbricationLevel = 0; innerStates = nil; innerDuration = 0; } return self; } - (void)dealloc { Assign(endTime, nil); Assign(innerStates, nil); [super dealloc]; } - (void)setEndEvent:(PajeEvent *)e { // should get extra fields? Assign(endTime, [e time]); } - (NSDate *)endTime { if (endTime != nil) { return endTime; } return [container endTime]; } - (void)setImbricationLevel:(int)level { imbricationLevel = level; } - (int)imbricationLevel { return imbricationLevel; } - (double)exclusiveDuration { return [self duration] - innerDuration; } - (double)inclusiveDuration { return [self duration]; } - (unsigned)condensedEntitiesCount { return condensedEntitiesCount; } - (void)addInnerState:(UserState *)innerState { innerDuration += [innerState duration]; if (innerStates == nil) { innerStates = [[CondensedEntitiesArray alloc] init]; } [innerStates addArray:[innerState condensedEntities]]; [innerStates addValue:[innerState value] duration:[innerState exclusiveDuration]]; condensedEntitiesCount += [innerState condensedEntitiesCount] + 1; } - (CondensedEntitiesArray *)condensedEntities { return innerStates; } - (unsigned)subCount { return [innerStates count]; } - (id)subValueAtIndex:(unsigned)i { return [innerStates valueAtIndex:i]; } - (NSColor *)subColorAtIndex:(unsigned)i { return [entityType colorForValue:[innerStates valueAtIndex:i]]; } - (double)subDurationAtIndex:(unsigned)i { return [innerStates durationAtIndex:i]; } - (NSArray *)fieldNames { NSMutableArray *localFields; localFields = [NSMutableArray arrayWithObjects: @"Imbrication Level", @"Exclusive Duration", nil]; [localFields addObjectsFromArray:[super fieldNames]]; return localFields; } - (id)valueOfFieldNamed:(NSString *)fieldName { id value; if ([fieldName isEqual:@"Imbrication Level"]) { return [NSNumber numberWithInt:[self imbricationLevel]]; } else if ([fieldName isEqual:@"Exclusive Duration"]) { return [NSNumber numberWithDouble:[self exclusiveDuration]]; } value = [super valueOfFieldNamed:fieldName]; return value; } - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeValuesOfObjCTypes:"@id@i", &endTime, &imbricationLevel, &innerDuration, &innerStates, &condensedEntitiesCount]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; [coder decodeValuesOfObjCTypes:"@id@i", &endTime, &imbricationLevel, &innerDuration, &innerStates, &condensedEntitiesCount]; return self; } @end Paje-1.98/FileReader/0000775000175000017500000000000011674062007014257 5ustar schnorrschnorrPaje-1.98/FileReader/GNUmakefile0000664000175000017500000000205511674062007016333 0ustar schnorrschnorr# # GNUmakefile - Generated by ProjectCenter # Written by Philippe C.D. Robert # # NOTE: Do NOT change this file -- ProjectCenter maintains it! # # Put all of your customisations in GNUmakefile.preamble and # GNUmakefile.postamble # include $(GNUSTEP_MAKEFILES)/common.make # # Subprojects # # # Bundle # PACKAGE_NAME=FileReader BUNDLE_NAME=FileReader BUNDLE_EXTENSION=.bundle BUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje FileReader_PRINCIPAL_CLASS=PajeFileReader # # Additional libraries # ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else FileReader_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif # # Resource files # FileReader_RESOURCE_FILES= # # Header files # FileReader_HEADERS= \ PajeFileReader.h # # Class files # FileReader_OBJC_FILES= \ PajeFileReader.m # # C files # FileReader_C_FILES= -include GNUmakefile.preamble -include GNUmakefile.local include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/FileReader/PajeFileReader.m0000664000175000017500000001774211674062007017252 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "PajeFileReader.h" #include "../General/FoundationAdditions.h" #include "../General/UniqueString.h" #include "../General/Macros.h" #define LINE_SIZE 512 @implementation FileReader - (id)initWithController:(PajeTraceController *)c { self = [super initWithController:c]; if (self != nil) { chunkInfo = [[NSMutableArray alloc] init]; currentChunk = 0; hasMoreData = NO; userChunkSize = CHUNK_SIZE; } return self; } - (void)dealloc { [inputFilename release]; [inputFile release]; [chunkInfo release]; [super dealloc]; } - (NSString *)traceDescription { return [inputFilename stringByAbbreviatingWithTildeInPath]; } // A new chunk will start. // Position the file in the good position, if not yet there. - (void)startChunk:(int)chunkNumber { if (chunkNumber != currentChunk) { if (chunkNumber >= [chunkInfo count]) { // cannot position in an unread place NSLog(@"Chunk after end: %d (%lu)", chunkNumber, [chunkInfo count]); [self raise:@"Cannot start unknown chunk"]; } unsigned long /*long*/ position; position = [[chunkInfo objectAtIndex:chunkNumber] longLongValue]; if (1||[inputFile seekToEndOfFile] > position) { [inputFile seekToFileOffset:position]; hasMoreData = YES; } else { hasMoreData = NO; } currentChunk = chunkNumber; } else { // let's register the first chunk position if ([chunkInfo count] == 0) { unsigned long /*long*/ position; position = [inputFile offsetInFile]; [chunkInfo addObject:[NSNumber numberWithLongLong:position]]; } } // keep the ball rolling (tell other components) [super startChunk:chunkNumber]; } // The current chunk has ended. - (void)endOfChunkLast:(BOOL)last { currentChunk++; if (!last) { // if we're at the end of the known world, let's register its position if (currentChunk == [chunkInfo count]) { unsigned long /*long*/ position; position = [inputFile offsetInFile]; [chunkInfo addObject:[NSNumber numberWithLongLong:position]]; } } [super endOfChunkLast:last]; } - (void)raise:(NSString *)reason { NSDebugLog(@"PajeFileReader: '%@' in file '%@', bytes read %lld", reason, inputFilename, [inputFile offsetInFile]); [[NSException exceptionWithName:@"PajeReadFileException" reason:reason userInfo: [NSDictionary dictionaryWithObjectsAndKeys: inputFilename, @"File Name", [NSNumber numberWithUnsignedLongLong:[inputFile offsetInFile]], @"BytesRead", nil] ] raise]; } - (NSString *)inputFilename { return inputFilename; } - (NSNumber *) readingPorcentage { double size = (double)sizeOfFile; double current = (double)[inputFile offsetInFile]; double porcentage = current/size; return [NSNumber numberWithDouble: porcentage]; } - (void)setInputFilename:(NSString *)filename { if (inputFilename != nil) { [self raise:@"Already has an open file"]; } Assign(inputFilename, filename); Assign(inputFile, [NSFileHandle fileHandleForReadingAtPath:filename]); //defining the size of the file sizeOfFile = [inputFile seekToEndOfFile]; [inputFile seekToFileOffset: 0]; if (inputFile == nil) { [self raise:@"Couldn't open file"]; } if ([[NSUserDefaults standardUserDefaults] boolForKey:@"UseCompression"]) { #ifdef GNUSTEP [inputFile useCompression]; #endif } hasMoreData = YES; } - (void)inputEntity:(id)entity { [self raise:@"Configuration error:" " PajeFileReader should be first component"]; } - (BOOL)canEndChunk { NSMutableData *data; unsigned int length; unsigned long /*long*/ offsetInFile; if (![self hasMoreData]) { return YES; } offsetInFile = [inputFile offsetInFile]; // need to create a NSMutableData from a NSData NSData *dataRead = [inputFile readDataOfLength:LINE_SIZE]; data = [NSMutableData dataWithData: dataRead]; length = [data length]; if (length < LINE_SIZE) { hasMoreData = NO; } const char *bytes; char *eol; bytes = [data bytes]; eol = memchr(bytes, '\n', length); if (eol != NULL) { unsigned int newlength; newlength = eol - bytes + 1; if (newlength != length) { length = newlength; hasMoreData = YES; [inputFile seekToFileOffset:offsetInFile + length]; [data setLength:length]; } } NSDebugMLLog(@"tim", @"data: %@\nchunk length: %u has more:%d", [data class], [data length], hasMoreData); if (length > 0) { if ([super canEndChunkBefore:data]) { [inputFile seekToFileOffset:offsetInFile]; return YES; } else { [inputFile seekToFileOffset:offsetInFile + length]; return NO; } } else { return YES; } } - (void)readNextChunk { NSMutableData *data; unsigned int length; if (![self hasMoreData]) { return; } int nextChunk = currentChunk +1; if (nextChunk < [chunkInfo count]) { // this chunk has already been read, we should know its size unsigned long /*long*/ nextChunkPosition; nextChunkPosition = [[chunkInfo objectAtIndex:nextChunk] longLongValue]; unsigned long /*long*/ chunkSize; chunkSize = nextChunkPosition - [inputFile offsetInFile]; // need to create a NSMutableData from a NSData NSData *dataRead = [inputFile readDataOfLength:chunkSize]; data = [NSMutableData dataWithData: dataRead]; length = [data length]; if (length != chunkSize) { [self raise:@"Cannot reread chunk! Has file been altered?"]; } [self outputEntity:data]; } else { // first time reading this chunk. // must determine its correct size (must end in a line boundary // and in a date-changing event). // need to create a NSMutableData from a NSData NSData *dataRead = [inputFile readDataOfLength:userChunkSize]; data = [NSMutableData dataWithData: dataRead]; length = [data length]; if (length < userChunkSize) { hasMoreData = NO; } else { char *bytes; int i; int offset = 0; bytes = (char *)[data bytes]; for (i = length-1; i >= 0 && bytes[i] != '\n'; i--) { offset++; } if ((i >= 0) && (offset > 0)) { [inputFile seekToFileOffset:[inputFile offsetInFile] - offset]; length -= offset; [data setLength:length]; } } NSDebugMLLog(@"tim", @"data: %@\nchunk length: %u has more:%d", [data class], [data length], hasMoreData); if (length > 0) { [self outputEntity:data]; while (![self canEndChunk]) { ; } } } } - (BOOL)hasMoreData { return hasMoreData; } - (void) setUserChunkSize: (unsigned long long)cs { userChunkSize = cs; } @end Paje-1.98/FileReader/PajeFileReader.h0000664000175000017500000000315511674062007017236 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeFileReader_h_ #define _PajeFileReader_h_ #include #include #include "../General/PajeFilter.h" #define CHUNK_SIZE 1500000 @interface FileReader: PajeComponent { NSFileHandle *inputFile; NSString *inputFilename; BOOL hasMoreData; NSMutableArray *chunkInfo; unsigned currentChunk; unsigned long long sizeOfFile; unsigned long long userChunkSize; } - (id)initWithController:(PajeTraceController *)c; - (void)setInputFilename:(NSString *)filename; - (NSString *)inputFilename; - (void)readNextChunk; - (BOOL)hasMoreData; - (void)startChunk:(int)chunkNumber; - (void)endOfChunkLast:(BOOL)last; - (void)raise:(NSString *)reason; - (NSNumber*) readingPorcentage; - (void) setUserChunkSize: (unsigned long long)cs; @end #endif Paje-1.98/AggregatingFilter/0000775000175000017500000000000011674062007015642 5ustar schnorrschnorrPaje-1.98/AggregatingFilter/AggregateLink.m0000664000175000017500000000363711674062007020535 0ustar schnorrschnorr#include "AggregateLink.h" #include "../General/Macros.h" @implementation AggregateLink + (PajeEntity *)entityWithEntities:(NSArray *)entities { return [[[self alloc] initWithEntities:entities] autorelease]; } - (id)initWithEntities:(NSArray *)entities { NSEnumerator *entityEnum; PajeEntity *entity; entityEnum = [entities reverseObjectEnumerator]; entity = [entityEnum nextObject]; NSParameterAssert(entity != nil); self = [super initWithType:[entity entityType] name:@"AggregateLink" container:[entity container]]; if (self != nil) { sourceContainer = [entity sourceContainer]; destContainer = [entity destContainer]; condensedArray = [[CondensedEntitiesArray alloc] init]; startTime = [entity startTime]; endTime = [entity endTime]; do { [condensedArray addArray:[entity condensedEntities]]; condensedEntitiesCount += [entity condensedEntitiesCount]; if (![entity isAggregate]) { [condensedArray addValue:[entity value] duration:[entity doubleValue]]; condensedEntitiesCount ++; } startTime = [startTime earlierDate:[entity startTime]]; endTime = [endTime laterDate:[entity endTime]]; } while ((entity = [entityEnum nextObject]) != nil); [startTime retain]; [endTime retain]; } return self; } - (double)subDurationAtIndex:(unsigned)i { return [condensedArray durationAtIndex:i]; } - (PajeContainer *)sourceContainer { return sourceContainer; } - (PajeContainer *)destContainer { return destContainer; } - (PajeEntityType *)sourceEntityType { return [sourceContainer entityType]; } - (PajeEntityType *)destEntityType { return [destContainer entityType]; } - (NSColor *)color { return [NSColor blueColor]; } @end Paje-1.98/AggregatingFilter/GNUmakefile0000664000175000017500000000211311674062007017711 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make AggregatingFilter_PRINCIPAL_CLASS = AggregatingFilter BUNDLE_NAME = AggregatingFilter ADDITIONAL_INCLUDE_DIRS = -I../General ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else AggregatingFilter_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif AggregatingFilter_OBJC_FILES = \ AggregatingFilter.m \ AggregateEvent.m \ AggregateState.m \ AggregateValue.m \ AggregateLink.m \ EntityAggregator.m \ AggregatingChunk.m \ AggregatingChunkArray.m AggregatingFilter_HEADER_FILES = \ AggregatingFilter.h \ AggregateEvent.h \ AggregateState.h \ AggregateValue.h \ AggregateLink.h \ EntityAggregator.h \ AggregatingChunk.h \ AggregatingChunkArray.h OTHERSRCS = Makefile.preamble Makefile Makefile.postamble m.template \ h.template -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/AggregatingFilter/AggregatingChunkArray.h0000664000175000017500000000457411674062007022234 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _AggregatingChunkArray_h_ #define _AggregatingChunkArray_h_ // // AggregatingChunkArray // // contains an array of chunks, containing entities of a container. // Those states are aggregated into one when many are within a certain // time interval. // // Author: Benhur Stein // #include "ChunkArray.h" #include "PajeFilter.h" #include "EntityAggregator.h" #include "AggregatingChunk.h" @interface AggregatingChunkArray : ChunkArray { PajeEntityType *entityType; PajeContainer *container; PajeFilter *dataSource; double aggregationDuration; BOOL finished; } + (id)arrayWithEntityType:(PajeEntityType *)eType container:(PajeContainer *)c dataSource:(PajeFilter *)source aggregatingDuration:(double)duration; - (id)initWithEntityType:(PajeEntityType *)eType container:(PajeContainer *)c dataSource:(PajeFilter *)source aggregatingDuration:(double)duration; // returns YES if all entities of this container/type have been aggregated once. - (BOOL)aggregationFinished; - (NSEnumerator *)originalEnumeratorFromTime:(NSDate *)t1 toTime:(NSDate *)t2 minDuration:(double)duration; - (NSEnumerator *)originalCompleteEnumeratorFromTime:(NSDate *)t1 toTime:(NSDate *)t2 minDuration:(double)duration; - (AggregatingChunk *)lastChunk; // to be implemented by subclasses - (void)aggregateEntitiesUntilTime:(NSDate *)time; - (void)refillChunkAtIndex:(int)chunkIndex; @end #endif Paje-1.98/AggregatingFilter/EntityAggregator.m0000664000175000017500000003605611674062007021311 0ustar schnorrschnorr#include "EntityAggregator.h" #include "../General/Macros.h" @interface EventAggregator : EntityAggregator @end @interface StateAggregator : EntityAggregator { int imbricationLevel; } - (BOOL)addEntity:(PajeEntity *)entity; - (PajeEntity *)aggregate; @end @interface VariableAggregator : EntityAggregator @end @interface OneLinkAggregator : EntityAggregator { NSDate *earliestEndTime; // not retained NSDate *latestStartTime; // not retained } - (BOOL)addEntity:(PajeEntity *)entity; - (PajeEntity *)aggregateBefore:(NSDate *)limit; @end @interface LinkAggregator : EntityAggregator { // need one aggregator for each souce/dest container pair NSMutableDictionary *aggregators; } - (BOOL)addEntity:(PajeEntity *)entity; - (PajeEntity *)aggregate; - (PajeEntity *)aggregateBefore:(NSDate *)limit; @end #include "AggregateEvent.h" @implementation EventAggregator + (Class)aggregatedEntityClass { return [AggregateEvent class]; } @end #include "AggregateState.h" @implementation StateAggregator + (Class)aggregatedEntityClass { return [AggregateState class]; } /* Try to aggregate one more state. Returns YES if state can be aggregated, NO if it cannot. States must be entered in endTime order; states with the same endTime must be entered in reverse imbricationLevel order. */ - (BOOL)addEntity:(PajeEntity *)entity { int entityImbricationLevel; double newDuration; // cannot aggregate a too wide entity if ([entity duration] > aggregationDuration) { return NO; } // if there are no other entities, just add the new one if (earliestStartTime == nil) { earliestStartTime = [entity startTime]; imbricationLevel = [entity imbricationLevel]; [entities addObject:entity]; return YES; } // if adding the new entity would make this too wide, it cannot yet be // added -> must aggregate some and try again newDuration = [[entity endTime] timeIntervalSinceDate:earliestStartTime]; if (newDuration > aggregationDuration) { return NO; } entityImbricationLevel = [entity imbricationLevel]; if (entityImbricationLevel < imbricationLevel) { NSDate *entityStartTime = [entity startTime]; PajeEntity *lastObject; // remove states that are inside new one (may happen when refilling) while ((lastObject = [entities lastObject]) != nil) { int lastImbricationLevel = [lastObject imbricationLevel]; NSDate *lastStartTime = [lastObject startTime]; if (lastImbricationLevel > entityImbricationLevel || (lastImbricationLevel == entityImbricationLevel && ![lastStartTime isEarlierThanDate:entityStartTime])) { [entities removeLastObject]; } else { break; } } if ([entities count] == 0) { // new state will be first earliestStartTime = entityStartTime; } imbricationLevel = entityImbricationLevel; [entities addObject:entity]; return YES; } if (entityImbricationLevel > imbricationLevel) { imbricationLevel = entityImbricationLevel; [entities addObject:entity]; return YES; } // same imbrication level if ([entity isAggregate]) { // special case: reaggregating already aggregated state // (when refilling emptied chunk) NSDate *entityStartTime = [entity startTime]; PajeEntity *lastObject; while ((lastObject = [entities lastObject]) != nil && ![[lastObject startTime] isEarlierThanDate:entityStartTime]) { [entities removeLastObject]; } if ([entities count] == 0) { // new state will be first earliestStartTime = entityStartTime; } } [entities addObject:entity]; return YES; } - (PajeEntity *)aggregate { PajeEntity *entity = nil; unsigned count; if (earliestStartTime == nil) { return nil; } count = [entities count]; if (count == 1) { entity = [entities objectAtIndex:0]; if ([entity subCount] > 0) { entity = [AggregateState entityWithEntities:entities]; } [entities removeAllObjects]; earliestStartTime = nil; return entity; } int firstImbricationLevel; int lastIndex; firstImbricationLevel = [[entities objectAtIndex:0] imbricationLevel]; if (firstImbricationLevel == imbricationLevel) { lastIndex = count - 1; } else { lastIndex = 0; while (lastIndex < count - 1) { entity = [entities objectAtIndex:lastIndex + 1]; if ([entity imbricationLevel] != firstImbricationLevel) { break; } lastIndex++; } } if (lastIndex == count - 1) { entity = [AggregateState entityWithEntities:entities]; [entities removeAllObjects]; earliestStartTime = nil; } else { NSRange r = NSMakeRange(0, lastIndex + 1); earliestStartTime = [entity startTime]; entity = [AggregateState entityWithEntities:[entities subarrayWithRange:r]]; [entities removeObjectsInRange:r]; } return entity; } - (id)copyWithZone:(NSZone *)z { StateAggregator *new; new = [super copyWithZone:z]; new->imbricationLevel = imbricationLevel; return new; } @end #include "AggregateValue.h" @implementation VariableAggregator + (Class)aggregatedEntityClass { return [AggregateValue class]; } @end #include #include "AggregateLink.h" @implementation OneLinkAggregator + (Class)aggregatedEntityClass { return [AggregateLink class]; } - (void)dealloc { Assign(latestStartTime, nil); Assign(earliestEndTime, nil); [super dealloc]; } - (BOOL)addEntity:(PajeEntity *)entity { double newDuration; NSDate *entityStartTime; NSDate *entityEndTime; entityStartTime = [entity startTime]; entityEndTime = [entity endTime]; // if there are no other entities, just add the new one if (earliestStartTime == nil) { earliestStartTime = entityStartTime; Assign(latestStartTime, entityStartTime); Assign(earliestEndTime, entityEndTime); [entities addObject:entity]; return YES; } // cannot aggregate if endTimes would span more than aggregationDuration newDuration = [entityEndTime timeIntervalSinceDate:earliestEndTime]; if (newDuration > aggregationDuration) { return NO; } // cannot aggregate if startTimes would span more than aggregationDuration // entities are ordered by endTime, so startTime can come in any order newDuration = [entityStartTime timeIntervalSinceDate:earliestStartTime]; if (fabs(newDuration) > aggregationDuration) { return NO; } newDuration = [entityStartTime timeIntervalSinceDate:latestStartTime]; if (fabs(newDuration) > aggregationDuration) { return NO; } earliestStartTime = [earliestStartTime earlierDate:entityStartTime]; Assign(latestStartTime, [latestStartTime laterDate:entityStartTime]); [entities addObject:entity]; return YES; } - (PajeEntity *)aggregateBefore:(NSDate *)limit { if (earliestStartTime == nil) { return nil; } if ([limit timeIntervalSinceDate:earliestEndTime] < aggregationDuration) { return nil; } return [self aggregate]; } - (id)copyWithZone:(NSZone *)z { OneLinkAggregator *new; new = [super copyWithZone:z]; new->latestStartTime = [latestStartTime retain]; new->earliestEndTime = [earliestEndTime retain]; return new; } @end @implementation LinkAggregator + (Class)aggregatedEntityClass { return [AggregateLink class]; } - (id)initWithAggregationDuration:(double)duration { self = [super initWithAggregationDuration:duration]; if (self != nil) { aggregators = [[NSMutableDictionary alloc] init]; } return self; } - (NSArray *)allAggregators { NSMutableArray *array; array = [NSMutableArray array]; NSEnumerator *dictEnum; NSDictionary *dict; dictEnum = [aggregators objectEnumerator]; while ((dict = [dictEnum nextObject]) != nil) { [array addObjectsFromArray:[dict allValues]]; } return array; } - (EntityAggregator *)aggregatorForEntity:(PajeEntity *)entity inDictionary:(NSMutableDictionary *)aggDict { PajeContainer *sourceContainer; PajeContainer *destContainer; EntityAggregator *agg; NSMutableDictionary *dict; sourceContainer = [entity sourceContainer]; destContainer = [entity destContainer]; dict = [aggDict objectForKey:sourceContainer]; if (dict == nil) { dict = [NSMutableDictionary dictionary]; [aggDict setObject:dict forKey:sourceContainer]; } agg = [dict objectForKey:destContainer]; if (agg == nil) { agg = [[OneLinkAggregator alloc] initWithAggregationDuration:aggregationDuration]; [dict setObject:agg forKey:destContainer]; [agg release]; } return agg; } - (EntityAggregator *)aggregatorForEntity:(PajeEntity *)entity { return [self aggregatorForEntity:entity inDictionary:aggregators]; } - (BOOL)addEntity:(PajeEntity *)entity { EntityAggregator *aggregator; aggregator = [self aggregatorForEntity:entity]; return [aggregator addEntity:entity]; } - (PajeEntity *)aggregate { NSEnumerator *aggEnum; EntityAggregator *aggregator; PajeEntity *entity = nil; aggEnum = [[self allAggregators] objectEnumerator]; while ((aggregator = [aggEnum nextObject]) != nil) { if ((entity = [aggregator aggregate]) != nil) { break; } } return entity; } - (PajeEntity *)aggregateEntity:(PajeEntity *)entity { EntityAggregator *aggregator; PajeEntity *aggregate; aggregator = [self aggregatorForEntity:entity]; if (![aggregator addEntity:entity]) { aggregate = [aggregator aggregate]; if (aggregate != nil) { return aggregate; } else { return entity; } } return nil; } - (PajeEntity *)aggregateBefore:(NSDate *)limit { NSEnumerator *aggEnum; EntityAggregator *aggregator; PajeEntity *entity = nil; aggEnum = [[self allAggregators] objectEnumerator]; while ((aggregator = [aggEnum nextObject]) != nil) { if ((entity = [aggregator aggregateBefore:limit]) != nil) { break; } } return entity; } - (int)entityCount { int entityCount; NSEnumerator *aggEnum; EntityAggregator *agg; entityCount = 0; aggEnum = [[self allAggregators] objectEnumerator]; while ((agg = [aggEnum nextObject]) != nil) { entityCount += [agg entityCount]; } return entityCount; } - (id)copyWithZone:(NSZone *)z { LinkAggregator *new; new = [super copyWithZone:z]; new->aggregators = [NSMutableDictionary dictionary]; id k1; NSEnumerator *k1en; k1en = [aggregators keyEnumerator]; while ((k1 = [k1en nextObject]) != nil) { NSMutableDictionary *dict; NSMutableDictionary *newdict; dict = [aggregators objectForKey:k1]; newdict = [NSMutableDictionary dictionary]; [new->aggregators setObject:newdict forKey:k1]; NSEnumerator *k2en; id k2; k2en = [dict keyEnumerator]; while ((k2 = [k2en nextObject]) != nil) { id newagg; newagg = [[dict objectForKey:k2] copyWithZone:z]; [newdict setObject:newagg forKey:k2]; [newagg release]; } } return new; } @end @implementation EntityAggregator + (EntityAggregator *)aggregatorForEntityType:(PajeEntityType *)entityType aggregationDuration:(double)duration; { Class subclass; switch ([entityType drawingType]) { case PajeEventDrawingType: subclass = [EventAggregator class]; break; case PajeStateDrawingType: subclass = [StateAggregator class]; break; case PajeVariableDrawingType: subclass = [VariableAggregator class]; break; case PajeLinkDrawingType: subclass = [LinkAggregator class]; break; default: NSWarnMLog(@"No support for creating aggregator of type %@", entityType); subclass = Nil; } return [[[subclass alloc] initWithAggregationDuration:duration] autorelease]; } - (id)initWithAggregationDuration:(double)duration { self = [super init]; if (self != nil) { entities = [[NSMutableArray alloc] init]; aggregationDuration = duration; aggregatedEntityClass = [[self class] aggregatedEntityClass]; } return self; } + (Class)aggregatedEntityClass { [self _subclassResponsibility:_cmd]; return Nil; } - (double)aggregationDuration { return aggregationDuration; } - (void)dealloc { Assign(entities, nil); [super dealloc]; } - (BOOL)addEntity:(PajeEntity *)entity { double newDuration; // cannot aggregate a too wide entity if ([entity duration] > aggregationDuration) { return NO; } // if there are no other entities, just add the new one if (earliestStartTime == nil) { earliestStartTime = [entity startTime]; [entities addObject:entity]; return YES; } // if adding the new entity would make this too wide, it cannot yet be // added -> must aggregate some and try again newDuration = [[entity endTime] timeIntervalSinceDate:earliestStartTime]; if (newDuration > aggregationDuration) { return NO; } [entities addObject:entity]; return YES; } - (PajeEntity *)aggregate { PajeEntity *entity; unsigned count; if (earliestStartTime == nil) { return nil; } count = [entities count]; NSAssert(count != 0, NSInternalInconsistencyException); if (count > 1) { entity = [aggregatedEntityClass entityWithEntities:entities]; } else { // FIXME: is this garanteed to be retained elsewhere? entity = [entities objectAtIndex:0]; [[entity retain] autorelease]; } [entities removeAllObjects]; earliestStartTime = nil; return entity; } - (PajeEntity *)aggregateEntity:(PajeEntity *)entity { PajeEntity *aggregate; if (![self addEntity:entity]) { aggregate = [self aggregate]; if (aggregate != nil) { return aggregate; } else { return entity; } } return nil; } - (PajeEntity *)aggregateBefore:(NSDate *)limit { if (earliestStartTime == nil) { return nil; } if ([limit timeIntervalSinceDate:earliestStartTime] < aggregationDuration) { return nil; } return [self aggregate]; } - (NSArray *)entities { return entities; } - (int)entityCount { return [entities count]; } - (id)copyWithZone:(NSZone *)z { EntityAggregator *new; new = [[[self class] allocWithZone:z] init]; new->entities = [entities mutableCopyWithZone:z]; new->earliestStartTime = earliestStartTime; new->aggregationDuration = aggregationDuration; return new; } @end Paje-1.98/AggregatingFilter/AggregatingFilter.h0000664000175000017500000000240111674062007021375 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _AggregatingFilter_h_ #define _AggregatingFilter_h_ // #include "../General/PajeFilter.h" #include "../General/Protocols.h" #include "../General/ChunkArray.h" @interface AggregatingFilter : PajeFilter { NSMutableDictionary *entityLists; // dictionary (by entity type) of // dictionaries (by container) of // ChunkArrays } - (id)initWithController:(PajeTraceController *)c; @end #endif Paje-1.98/AggregatingFilter/AggregateState.h0000664000175000017500000000125711674062007020707 0ustar schnorrschnorr#ifndef _AggregateState_h_ #define _AggregateState_h_ #include "AggregateEvent.h" /** AggregateState * Aggregates many smaller states. * Keeps condensed data of them, in cummulated duration of each state name. */ @interface AggregateState : AggregateEvent { int imbricationLevel; } /** returns a newly created aggregate state made from the entities array. * entities must contain entities ordered by decreasing time, and they * cannot overlap. All must have the same imbricationLevel. */ + (PajeEntity *)entityWithEntities:(NSArray *)entities; - (id)initWithEntities:(NSArray *)entities; - (double)subDurationAtIndex:(unsigned)i; - (int)imbricationLevel; @end #endif Paje-1.98/AggregatingFilter/EntityAggregator.h0000664000175000017500000000137011674062007021273 0ustar schnorrschnorr#ifndef _EntityAggregator_h_ #define _EntityAggregator_h_ #include #include "../General/PajeEntity.h" @interface EntityAggregator : NSObject { NSMutableArray *entities; NSDate *earliestStartTime; // not retained double aggregationDuration; Class aggregatedEntityClass; } + (EntityAggregator *)aggregatorForEntityType:(PajeEntityType *)entityType aggregationDuration:(double)duration; - (id)initWithAggregationDuration:(double)duration; - (BOOL)addEntity:(PajeEntity *)entity; - (PajeEntity *)aggregateEntity:(PajeEntity *)entity; - (PajeEntity *)aggregate; - (PajeEntity *)aggregateBefore:(NSDate *)limit; - (int)entityCount; - (double)aggregationDuration; @end #endif Paje-1.98/AggregatingFilter/AggregateValue.h0000664000175000017500000000105211674062007020674 0ustar schnorrschnorr#ifndef _AggregateValue_h_ #define _AggregateValue_h_ /* AggregateValue * A value that aggregates other values */ #include "../PajeSimulator/UserValue.h" @interface AggregateValue : PajeEntity { // From UserValue double value; NSDate *startTime; NSDate *endTime; double minValue; double maxValue; int condensedEntitiesCount; } + (PajeEntity *)entityWithEntities:(NSArray *)entities; - (id)initWithEntities:(NSArray *)entities; - (BOOL)isAggregate; - (unsigned)condensedEntitiesCount; //- (NSColor *)color; @end #endif Paje-1.98/AggregatingFilter/AggregateEvent.h0000664000175000017500000000161211674062007020703 0ustar schnorrschnorr#ifndef _AggregateEvent_h_ #define _AggregateEvent_h_ /* AggregateEvent * An event that aggregates other events */ #include "../General/PajeEntity.h" #include "../General/PajeContainer.h" #include "../General/CondensedEntitiesArray.h" @interface AggregateEvent : PajeEntity { CondensedEntitiesArray *condensedArray; unsigned condensedEntitiesCount; NSDate *startTime; NSDate *endTime; } + (PajeEntity *)entityWithEntities:(NSArray *)entities; - (id)initWithEntities:(NSArray *)entities; - (BOOL)isAggregate; - (NSDate *)startTime; - (NSDate *)endTime; - (double)exclusiveDuration; - (unsigned)condensedEntitiesCount; - (unsigned)subCount; - (id)subValueAtIndex:(unsigned)i; - (NSColor *)subColorAtIndex:(unsigned)i; - (unsigned)subCountAtIndex:(unsigned)i; - (double)subDurationAtIndex:(unsigned)i; - (CondensedEntitiesArray *)condensedEntities; - (NSColor *)color; @end #endif Paje-1.98/AggregatingFilter/AggregatingChunk.h0000664000175000017500000000321611674062007021225 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _AggregatingChunk_h_ #define _AggregatingChunk_h_ #include "../General/EntityChunk.h" #include "EntityAggregator.h" #include "../PajeSimulator/SimulChunk.h" @interface AggregatingChunk : EntityChunk { EntityAggregator *aggregator; NSDate *latestTime; PajeEntity *lastEntity; double aggregationDuration; } + (AggregatingChunk *)chunkWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc aggregationDuration:(double)duration; - (id)initWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc aggregationDuration:(double)duration; - (PajeEntity *)firstIncomplete; - (BOOL)canFinishBeforeEntity:(PajeEntity *)entity; //- (NSDate *)lastTime; - (void)setLatestTime:(NSDate *)time; - (NSDate *)latestTime; - (NSDate *)continuationTime; @end #endif Paje-1.98/AggregatingFilter/AggregateEvent.m0000664000175000017500000000442611674062007020716 0ustar schnorrschnorr#include "AggregateEvent.h" #include "../General/Macros.h" @implementation AggregateEvent + (PajeEntity *)entityWithEntities:(NSArray *)entities; { return [[[self alloc] initWithEntities:entities] autorelease]; } - (id)initWithEntities:(NSArray *)entities { NSEnumerator *entityEnum; PajeEntity *entity; PajeEntity *lastEntity; entityEnum = [entities objectEnumerator]; entity = [entityEnum nextObject]; NSParameterAssert(entity != nil); self = [super initWithType:[entity entityType] name:@"AggregateEvent" container:[entity container]]; if (self != nil) { condensedArray = [[CondensedEntitiesArray alloc] init]; Assign(endTime, [entity endTime]); do { [condensedArray addArray:[entity condensedEntities]]; condensedEntitiesCount += [entity condensedEntitiesCount]; if (![entity isAggregate]) { [condensedArray addValue:[entity value] count:1]; condensedEntitiesCount ++; } lastEntity = entity; } while ((entity = [entityEnum nextObject]) != nil); Assign(startTime, [lastEntity startTime]); } return self; } - (void)dealloc { Assign(condensedArray, nil); Assign(startTime, nil); Assign(endTime, nil); [super dealloc]; } - (BOOL)isAggregate { return YES; } - (NSDate *)startTime { return startTime; } - (NSDate *)time { return startTime; } - (NSDate *)endTime { return endTime; } - (double)exclusiveDuration { return 0.0; } - (unsigned)condensedEntitiesCount { return condensedEntitiesCount; } - (CondensedEntitiesArray *)condensedEntities { return condensedArray; } - (unsigned)subCount { return [condensedArray count]; } - (id)subValueAtIndex:(unsigned)i { return [condensedArray valueAtIndex:i]; } - (NSColor *)subColorAtIndex:(unsigned)i { return [entityType colorForValue:[condensedArray valueAtIndex:i]]; } - (unsigned)subCountAtIndex:(unsigned)i { return [condensedArray countAtIndex:i]; } - (double)subDurationAtIndex:(unsigned)i { return [self duration] * [condensedArray countAtIndex:i] / condensedEntitiesCount; } - (NSColor *)color { return [NSColor whiteColor]; } @end Paje-1.98/AggregatingFilter/AggregateLink.h0000664000175000017500000000107311674062007020520 0ustar schnorrschnorr#ifndef _AggregateLink_h_ #define _AggregateLink_h_ #include "AggregateEvent.h" /** AggregateLink * Aggregates many smaller links, between specific pair of org-dest containers. */ @interface AggregateLink : AggregateEvent { PajeContainer *sourceContainer; // not retained PajeContainer *destContainer; // not retained } /** returns a newly created aggregate link made from the entities array. */ + (PajeEntity *)entityWithEntities:(NSArray *)entities; - (id)initWithEntities:(NSArray *)entities; - (double)subDurationAtIndex:(unsigned)i; @end #endif Paje-1.98/AggregatingFilter/AggregateState.m0000664000175000017500000000311611674062007020710 0ustar schnorrschnorr#include "AggregateState.h" #include "../General/Macros.h" @implementation AggregateState + (PajeEntity *)entityWithEntities:(NSArray *)entities { return [[[self alloc] initWithEntities:entities] autorelease]; } - (id)initWithEntities:(NSArray *)entities { NSEnumerator *entityEnum; PajeEntity *entity; PajeEntity *lastEntity; entityEnum = [entities reverseObjectEnumerator]; entity = [entityEnum nextObject]; NSParameterAssert(entity != nil); self = [super initWithType:[entity entityType] name:@"AggregateState" container:[entity container]]; if (self != nil) { condensedArray = [[CondensedEntitiesArray alloc] init]; imbricationLevel = [entity imbricationLevel]; Assign(endTime, [entity endTime]); do { [condensedArray addArray:[entity condensedEntities]]; condensedEntitiesCount += [entity condensedEntitiesCount]; if (![entity isAggregate]) { [condensedArray addValue:[entity value] duration:[entity exclusiveDuration]]; condensedEntitiesCount ++; } lastEntity = entity; } while ((entity = [entityEnum nextObject]) != nil); Assign(startTime, [lastEntity startTime]); } return self; } - (double)subDurationAtIndex:(unsigned)i { return [condensedArray durationAtIndex:i]; } - (double)exclusiveDuration { return [self duration] - [condensedArray totalDuration]; } - (int)imbricationLevel { return imbricationLevel; } @end Paje-1.98/AggregatingFilter/AggregatingChunkArray.m0000664000175000017500000002733711674062007022243 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "AggregatingChunkArray.h" #include "AggregatingChunk.h" #include "../General/Macros.h" #include "../PajeSimulator/SimulContainer.h" #define ENTITIES_IN_AGGREGATED_CHUNK 1000 @interface AggregatingVariableChunkArray : AggregatingChunkArray @end @implementation AggregatingVariableChunkArray - (void)finishChunk { EntityChunk *chunk; chunk = [self lastChunk]; [chunk freeze]; } @end @implementation AggregatingChunkArray + (id)arrayWithEntityType:(PajeEntityType *)eType container:(PajeContainer *)c dataSource:(PajeFilter *)source aggregatingDuration:(double)duration { Class arrayClass; switch ([eType drawingType]) { case PajeEventDrawingType: arrayClass = self; break; case PajeStateDrawingType: arrayClass = self; break; case PajeVariableDrawingType: arrayClass = [AggregatingVariableChunkArray class]; break; case PajeLinkDrawingType: arrayClass = self; break; default: NSLog(@"Don't know how to aggregate %@", eType); return nil; } return [[[arrayClass alloc] initWithEntityType:eType container:c dataSource:source aggregatingDuration:duration] autorelease]; } - (id)initWithEntityType:(PajeEntityType *)eType container:(PajeContainer *)c dataSource:(PajeFilter *)source aggregatingDuration:(double)duration { self = [super init]; if (self != nil) { dataSource = source; // not retained entityType = [eType retain]; container = [c retain]; aggregationDuration = duration; } return self; } - (void)dealloc { Assign(entityType, nil); Assign(container, nil); dataSource = nil; [super dealloc]; } - (NSEnumerator *)originalEnumeratorFromTime:(NSDate *)t1 toTime:(NSDate *)t2 minDuration:(double)duration { return [dataSource enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:t1 toTime:t2 minDuration:duration]; } - (NSEnumerator *)originalCompleteEnumeratorFromTime:(NSDate *)t1 toTime:(NSDate *)t2 minDuration:(double)duration { return [dataSource enumeratorOfCompleteEntitiesTyped:entityType inContainer:container fromTime:t1 toTime:t2 minDuration:duration]; } - (BOOL)aggregationFinished { return finished; } - (NSEnumerator *)enumeratorOfEntitiesFromTime:(NSDate *)startTime toTime:(NSDate *)endTime { NSUInteger startIndex; NSUInteger endIndex; NSUInteger index; MultiEnumerator *multiEnum; EntityChunk *chunk; int chunkCount; NSDate *lastTime; lastTime = [(AggregatingChunk *)[self lastChunk] latestTime]; // if not yet aggregated until endTime, continue aggregation if (![self aggregationFinished] && (lastTime == nil || [endTime isLaterThanDate:lastTime])) { [self aggregateEntitiesUntilTime: [endTime addTimeInterval:2*aggregationDuration]]; } chunkCount = [chunks count]; if (chunkCount == 0) { return nil; } // chunks are indexed by startTime endIndex = [chunks indexOfLastObjectBeforeValue:endTime]; if (endIndex == NSNotFound) { // no chunk starts before endTime return nil; } startIndex = [chunks indexOfLastObjectNotAfterValue:startTime]; if (startIndex == NSNotFound) { // all chunks start after startTime startIndex = 0; } if (startIndex > endIndex) { startIndex = endIndex; } chunk = [chunks objectAtIndex:endIndex]; if ([chunk isZombie]) { [self refillChunkAtIndex:endIndex]; } // if only one chunk involved, it can enumerate for us. if (startIndex == endIndex) { return [chunk enumeratorOfEntitiesFromTime:startTime toTime:endTime]; } // there are multiple chunks involved -- get complete and incomplete // entities from last chunk, all complete from intermediary chunks and some // complete entities from first chunk. multiEnum = [MultiEnumerator enumerator]; [multiEnum addEnumerator:[chunk enumeratorOfEntitiesBeforeTime:endTime]]; for (index = endIndex - 1; index > startIndex; index--) { chunk = [chunks objectAtIndex:index]; if ([chunk isZombie]) { [self refillChunkAtIndex:index]; } [multiEnum addEnumerator:[chunk enumeratorOfAllCompleteEntities]]; } chunk = [chunks objectAtIndex:startIndex]; if ([chunk isZombie]) { [self refillChunkAtIndex:startIndex]; } [multiEnum addEnumerator: [chunk enumeratorOfCompleteEntitiesFromTime:startTime]]; return multiEnum; } - (NSEnumerator *)enumeratorOfCompleteEntitiesFromTime:(NSDate *)startTime untilTime:(NSDate *)endTime { NSUInteger startIndex; NSUInteger endIndex; NSUInteger index; MultiEnumerator *multiEnum; EntityChunk *chunk; int chunkCount; [self aggregateEntitiesUntilTime:endTime]; chunkCount = [chunks count]; if (chunkCount == 0) { return nil; } // chunks are indexed by startTime endIndex = [chunks indexOfLastObjectBeforeValue:endTime]; if (endIndex == NSNotFound) { // no chunk starts before endTime return nil; } startIndex = [chunks indexOfLastObjectNotAfterValue:startTime]; if (startIndex == NSNotFound) { // all chunks start after startTime startIndex = 0; } if (startIndex > endIndex) { startIndex = endIndex; } chunk = [chunks objectAtIndex:startIndex]; if ([chunk isZombie]) { [self refillChunkAtIndex:startIndex]; } // one chunk: it can enumerate if (startIndex == endIndex) { return [chunk fwEnumeratorOfCompleteEntitiesFromTime:startTime untilTime:endTime]; } // multiple chunks: get some entities from first chunk, // all from intermediary chunks and some from last chunk multiEnum = [MultiEnumerator enumerator]; [multiEnum addEnumerator: [chunk fwEnumeratorOfCompleteEntitiesFromTime:startTime]]; for (index = startIndex + 1; index < endIndex; index++) { chunk = [chunks objectAtIndex:index]; if ([chunk isZombie]) { [self refillChunkAtIndex:index]; } [multiEnum addEnumerator:[chunk fwEnumeratorOfAllCompleteEntities]]; } chunk = [chunks objectAtIndex:endIndex]; if ([chunk isZombie]) { [self refillChunkAtIndex:endIndex]; } [multiEnum addEnumerator: [chunk fwEnumeratorOfCompleteEntitiesUntilTime:endTime]]; return multiEnum; } - (void)createChunk { EntityChunk *chunk; chunk = [AggregatingChunk chunkWithEntityType:entityType container:container aggregationDuration:aggregationDuration]; if ([chunks count] > 0) { EntityChunk *previousChunk; previousChunk = [chunks lastObject]; [chunk setStartTime:[previousChunk endTime]]; } else { [chunk setStartTime:[container startTime]]; } [chunks addObject:chunk]; } - (AggregatingChunk *)lastChunk { if ([chunks count] == 0) { [self createChunk]; } return [chunks lastObject]; } // reached end of last chunk in this entityType/container - (void)finishAggregation { EntityChunk *chunk; if ([self aggregationFinished]) { return; } chunk = [self lastChunk]; [chunk setIncompleteEntities:nil]; [chunk setEndTime:[container endTime]]; [chunk freeze]; finished = YES; } - (void)finishChunk { AggregatingChunk *chunk; NSDate *chunkEndTime; // set end time to that of last entity chunk = [self lastChunk]; chunkEndTime = [chunk continuationTime]; // set incomplete entities as those that cross endtime in lower // aggregation level. NSEnumerator *en; NSArray *incomplete; [chunkEndTime retain]; // sometimes there is a "missing chunk" exception below en = [self originalEnumeratorFromTime:chunkEndTime toTime:chunkEndTime minDuration:aggregationDuration/2]; [chunkEndTime release]; incomplete = [en allObjects]; [chunk setIncompleteEntities:incomplete]; // chunk aggregator should be empty for this to work [chunk freeze]; } - (void)aggregateEntitiesUntilTime:(NSDate *)time { PajeEntity *entity; NSEnumerator *en; AggregatingChunk *chunk; if ([self aggregationFinished]) { return; } chunk = [self lastChunk]; if ([time isEarlierThanDate:[chunk latestTime]]) { return; } if ([(SimulContainer *)container isStopped] && [time isLaterThanDate:[container endTime]]) { time = [container endTime]; } NSDate *ct = [chunk continuationTime]; [ct retain]; // sometimes the method below releases ct (missing chunk except) en = [self originalCompleteEnumeratorFromTime:ct//[chunk continuationTime] toTime:time minDuration:aggregationDuration/2]; [ct release]; while ((entity = [en nextObject]) != nil) { if ([chunk canFinishBeforeEntity:entity]) { [self finishChunk]; [self createChunk]; chunk = [self lastChunk]; } [chunk addEntity:entity]; } if ([(SimulContainer *)container isStopped] && ![time isEarlierThanDate:[container endTime]]) { [self finishAggregation]; } else { [chunk setLatestTime:time]; en = [self originalEnumeratorFromTime:time toTime:time minDuration:aggregationDuration/2]; [chunk setIncompleteEntities:[en allObjects]]; } } - (void)refillChunkAtIndex:(int)chunkIndex { EntityChunk *chunk; chunk = [self chunkAtIndex:chunkIndex]; [chunk activate]; PajeEntity *entity; NSEnumerator *en; NSAutoreleasePool *pool = [NSAutoreleasePool new]; en = [self originalCompleteEnumeratorFromTime:[chunk startTime] toTime:[chunk endTime] minDuration:aggregationDuration/2]; while ((entity = [en nextObject]) != nil) { [chunk addEntity:entity]; } [chunk freeze]; [pool release]; } @end Paje-1.98/AggregatingFilter/AggregatingFilter.m0000664000175000017500000001773511674062007021422 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* * AggregatingFilter.m * * Component that aggregates individual entities that are too small to * display into AggregatedEntities. * * 19970423 BS creation */ #include "AggregatingFilter.h" #include "../General/MultiEnumerator.h" #include "../General/PajeEntity.h" #include "../General/Macros.h" #include "../General/NSDate+Additions.h" #include "AggregatingChunkArray.h" #include double log2(double); double pow(double, double); #define DURtoSLOT(dur) (log2(dur) + 15) #define SLOTtoDUR(slot) pow(2.0, (slot) - 15.0) @implementation AggregatingFilter - (id)initWithController:(PajeTraceController *)c { self = [super initWithController:c]; if (self != nil) { entityLists = [[NSMutableDictionary alloc] init]; } return self; } - (void)dealloc { [entityLists release]; [super dealloc]; } - (NSString *)filterName { return @"AggregatingFilter"; } - (NSDictionary *)configuration { return nil; } - (void)setConfiguration:(NSDictionary *)config { } - (void)dataChangedForEntityType:(PajeEntityType *)entityType { [entityLists removeObjectForKey:entityType]; [super dataChangedForEntityType:entityType]; } - (void)hierarchyChanged { [entityLists removeAllObjects]; [super hierarchyChanged]; } - (ChunkArray *)chunkArrayForEntityType:(PajeEntityType *)entityType container:(PajeContainer *)container minDuration:(double)minDuration { NSMutableDictionary *dict; dict = [entityLists objectForKey:entityType]; if (dict == nil) { dict = [NSMutableDictionary dictionary]; [entityLists setObject:dict forKey:entityType]; } NSMutableArray *array; array = [dict objectForKey:container]; if (array == nil) { array = [NSMutableArray array]; [dict setObject:array forKey:container]; } ChunkArray *chunks; int index = DURtoSLOT(minDuration); while (index >= [array count]) { chunks = [AggregatingChunkArray arrayWithEntityType:entityType container:container dataSource:self aggregatingDuration:SLOTtoDUR([array count])]; [array addObject:chunks]; } chunks = [array objectAtIndex:index]; return chunks; } - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { // if container does not contain entityType's directly, // try containers in-between. // FIXME: shouldn't this be in PajeFilter? if (![[self containerTypeForType:entityType] isEqual:[self entityTypeForEntity:container]]) { NSEnumerator *subcontainerEnum; id subcontainer; MultiEnumerator *multiEnum; PajeEntityType *parentType; parentType = [entityType containerType]; subcontainerEnum = [self enumeratorOfContainersTyped:parentType inContainer:container]; multiEnum = [MultiEnumerator enumerator]; while ((subcontainer = [subcontainerEnum nextObject]) != nil) { NSEnumerator *en; en = [self enumeratorOfEntitiesTyped:entityType inContainer:subcontainer fromTime:start toTime:end minDuration:minDuration]; if (en != nil) { [multiEnum addEnumerator:en]; } } return multiEnum; } PajeDrawingType drawingType; drawingType = [self drawingTypeForEntityType:entityType]; if (( drawingType != PajeStateDrawingType && drawingType != PajeEventDrawingType && drawingType != PajeVariableDrawingType && drawingType != PajeLinkDrawingType) || DURtoSLOT(minDuration) < 0) { return [super enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; } ChunkArray *chunks; chunks = [self chunkArrayForEntityType:entityType container:container minDuration:minDuration]; if (chunks != nil) { return [chunks enumeratorOfEntitiesFromTime:start toTime:end]; } return nil; } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { // if container does not contain entityType's directly, // try containers in-between. // FIXME: shouldn't this be in PajeFilter? if (![[self containerTypeForType:entityType] isEqual:[self entityTypeForEntity:container]]) { NSEnumerator *subcontainerEnum; id subcontainer; MultiEnumerator *multiEnum; PajeEntityType *parentType; parentType = [entityType containerType]; subcontainerEnum = [self enumeratorOfContainersTyped:parentType inContainer:container]; multiEnum = [MultiEnumerator enumerator]; while ((subcontainer = [subcontainerEnum nextObject]) != nil) { NSEnumerator *en; en = [self enumeratorOfCompleteEntitiesTyped:entityType inContainer:subcontainer fromTime:start toTime:end minDuration:minDuration]; if (en != nil) { [multiEnum addEnumerator:en]; } } return multiEnum; } PajeDrawingType drawingType; drawingType = [self drawingTypeForEntityType:entityType]; if (( drawingType != PajeStateDrawingType && drawingType != PajeEventDrawingType && drawingType != PajeVariableDrawingType && drawingType != PajeLinkDrawingType) || DURtoSLOT(minDuration) < 0) { return [super enumeratorOfCompleteEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; } ChunkArray *chunks; chunks = [self chunkArrayForEntityType:entityType container:container minDuration:minDuration]; if (chunks != nil) { return [chunks enumeratorOfCompleteEntitiesFromTime:start untilTime:end]; } return nil; } @end Paje-1.98/AggregatingFilter/AggregatingChunk.m0000664000175000017500000001556611674062007021245 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "AggregatingChunk.h" #include "../General/Macros.h" //#define ENTITIES_IN_AGGREGATED_CHUNK 1 #define ENTITIES_IN_AGGREGATED_CHUNK 1000 @interface AggregateStateChunk : AggregatingChunk - (PajeEntity *)firstIncomplete; @end @interface AggregateVariableChunk : AggregateStateChunk @end @interface AggregateLinkChunk : AggregateStateChunk @end @implementation AggregatingChunk + (AggregatingChunk *)chunkWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc aggregationDuration:(double)duration { Class class; switch ([type drawingType]) { case PajeEventDrawingType: class = [AggregateStateChunk class]; break; case PajeStateDrawingType: class = [AggregateStateChunk class]; break; case PajeLinkDrawingType: class = [AggregateLinkChunk class]; break; case PajeVariableDrawingType: class = [AggregateVariableChunk class]; break; default: NSWarnMLog(@"No support for creating chunk of type %@", type); class = nil; } return [[[class alloc] initWithEntityType:type container:pc aggregationDuration:duration] autorelease]; } - (id)initWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc aggregationDuration:(double)duration { self = [super initWithEntityType:type container:pc]; if (self != nil) { aggregationDuration = duration; Assign(aggregator, [EntityAggregator aggregatorForEntityType:type aggregationDuration:duration]); } return self; } - (void)dealloc { Assign(aggregator, nil); Assign(lastEntity, nil); Assign(latestTime, nil); [super dealloc]; } - (PajeEntity *)firstIncomplete { return nil; } - (BOOL)canFinishBeforeEntity:(PajeEntity *)entity { //[aggregator willEmptyBeforeEntity:entity] if ([self entityCount] >= ENTITIES_IN_AGGREGATED_CHUNK && [[entity endTime] isLaterThanDate:[lastEntity endTime]] && ([aggregator entityCount] == 0 || [entity duration] > [aggregator aggregationDuration])) { return YES; } return NO; } - (void)addEntity:(PajeEntity *)entity { PajeEntity *aggregate; while ((aggregate = [aggregator aggregateEntity:entity]) != nil) { [super addEntity:aggregate]; if (aggregate == entity) { break; } } //if (endTime == nil) { Assign(lastEntity, entity); //} } - (void)aggregateUntilTime:(NSDate *)time { PajeEntity *entity; while ((entity = [aggregator aggregateBefore:time]) != nil) { [super addEntity:entity]; } } - (void)setEndTime:(NSDate *)time { //NSLog(@"\n\n\nDONT CALL THIS (setEndTime)!!!\n\n\n"); // [self setLastTime:time]; [super setEndTime:time]; } - (NSDate *)endTime { NSDate *time; time = [super endTime]; if (time != nil) { return time; } return [self latestTime]; } - (NSDate *)continuationTime { if (lastEntity != nil) { return [lastEntity endTime]; } else { return [self startTime]; } } - (NSDate *)latestTime { return latestTime; } - (void)setLatestTime:(NSDate *)time { [self aggregateUntilTime:[self continuationTime]]; Assign(latestTime, time); } - (PajeEntity *)lastEntity { NSLog(@"\n\nSOMEONE IS CALLING lastEntity!!!\n\n"); return lastEntity; } - (void)freeze { [self aggregateUntilTime:[NSDate distantFuture]]; Assign(aggregator, nil); if (endTime == nil) { Assign(endTime, [self continuationTime]); } //NSLog(@"freeze %f e%@ l%@", [aggregator aggregationDuration], endTime, lastTime); Assign(latestTime, nil); Assign(lastEntity, nil); [super freeze]; } - (void)activate { [super activate]; Assign(aggregator, [EntityAggregator aggregatorForEntityType:entityType aggregationDuration:aggregationDuration]); } - (void)setIncompleteEntities:(NSArray *)array { if ([aggregator entityCount] > 0) { NSMutableArray *notYetAggregated; EntityAggregator *newAggregator; PajeEntity *entity; notYetAggregated = [NSMutableArray array]; newAggregator = [aggregator copy]; while ((entity = [newAggregator aggregate]) != nil) { [notYetAggregated addObject:entity]; } [newAggregator release]; array = [array arrayByAddingObjectsFromArray: [[notYetAggregated reverseObjectEnumerator] allObjects]]; } [super setIncompleteEntities:array]; } @end @implementation AggregateStateChunk - (BOOL)canEnumerate { return chunkState != empty; } - (BOOL)canInsert { return chunkState != empty; } - (void)empty { if (chunkState == frozen) { [super empty]; } } - (PajeEntity *)firstIncomplete { return [[self incompleteEntities] lastObject]; } - (void)setEntityCount:(int)newCount { int n; PSortedArray *array; array = [self completeEntities]; n = [array count] - newCount; if (n > 0) { [array removeObjectsInRange:NSMakeRange(newCount, n)]; } } @end @implementation AggregateVariableChunk - (void)setIncompleteEntities:(NSArray *)array { if (incompleteEntities != nil) { [incompleteEntities release]; incompleteEntities = nil; } if (array != nil) { NSEnumerator *en = [array objectEnumerator]; NSDate *d = [self latestTime]; PajeEntity *e; while ((e = [en nextObject]) != nil) { if (d == nil || [[e endTime] isLaterThanDate:d]) { Assign(incompleteEntities, [NSArray arrayWithObject:e]); } } } } @end @implementation AggregateLinkChunk - (BOOL)canFinishBeforeEntity:(PajeEntity *)entity { if ([self entityCount] >= ENTITIES_IN_AGGREGATED_CHUNK && [[entity endTime] isLaterThanDate:[lastEntity endTime]] && [aggregator entityCount] == 0) { //FIXME: there can be lots of aggregators, possibly never all empty. return YES; } return NO; } @end Paje-1.98/AggregatingFilter/AggregateValue.m0000664000175000017500000000472611674062007020714 0ustar schnorrschnorr#include "AggregateValue.h" #include "../General/Macros.h" #include @implementation AggregateValue + (PajeEntity *)entityWithEntities:(NSArray *)entities { return [[[self alloc] initWithEntities:entities] autorelease]; } - (id)initWithEntities:(NSArray *)entities { NSEnumerator *entityEnum; PajeEntity *entity; PajeEntity *lastEntity; NSDate *t1; NSDate *t2; double sum = 0; double min = HUGE_VAL; double max = -HUGE_VAL; int ct = 0; entityEnum = [entities objectEnumerator]; entity = [entityEnum nextObject]; NSParameterAssert(entity != nil); t1 = [entity startTime]; do { double v; v = [entity minValue]; if (v < min) min = v; v = [entity maxValue]; if (v > max) max = v; v = [entity doubleValue]; sum += v * [entity duration]; lastEntity = entity; ct += [entity condensedEntitiesCount]; } while ((entity = [entityEnum nextObject]) != nil); t2 = [lastEntity endTime]; self = [super initWithType:[lastEntity entityType] name:@"" container:[lastEntity container]]; if (self != nil) { Assign(startTime, t1); Assign(endTime, t2); value = sum / [t2 timeIntervalSinceDate:t1]; minValue = min; maxValue = max; condensedEntitiesCount = ct; } return self; } - (void)dealloc { Assign(startTime, nil); Assign(endTime, nil); [super dealloc]; } - (NSDate *)startTime { return startTime; } - (NSDate *)endTime { if (endTime != nil) { return endTime; } return [container endTime]; } - (NSDate *)time { return startTime; } - (void)setEndTime:(NSDate *)time { Assign(endTime, time); } - (double)doubleValue { return value; } - (id)value { return [NSNumber numberWithDouble:value]; } - (NSArray *)fieldNames { return [[super fieldNames] arrayByAddingObject: @"Value"]; } - (id)valueOfFieldNamed:(NSString *)fieldName { id val; if ([fieldName isEqualToString:@"Value"]) { val = [NSNumber numberWithDouble:value]; } else { val = [super valueOfFieldNamed:fieldName]; } return val; } - (double)maxValue { return maxValue; } - (double)minValue { return minValue; } - (BOOL)isAggregate { return YES; } - (unsigned)condensedEntitiesCount { return condensedEntitiesCount; } - (NSColor *)xcolor { return [NSColor whiteColor]; } @end Paje-1.98/General/0000775000175000017500000000000011674062007013632 5ustar schnorrschnorrPaje-1.98/General/HierarchyBrowser.h0000664000175000017500000000373511674062007017275 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _HierarchyBrowser_h_ #define _HierarchyBrowser_h_ #include #include "PajeFilter.h" @interface HierarchyBrowser : NSObject { PajeFilter *filter; // not retained IBOutlet NSBrowser *containerTypesBrowser; IBOutlet NSBrowser *containersBrowser; IBOutlet NSSplitView *splitView; BOOL containersOnly; } - (id)initWithFilter:(PajeFilter *)f; - (NSView *)view; - (void)setFilter:(PajeFilter *)f; - (void)setContainersOnly:(BOOL)flag; - (PajeEntityType *)selectedEntityType; - (NSArray *)selectedContainers; - (NSArray *)selectedNames; - (PajeContainer *)selectedParentContainer; - (void)refreshLastColumn; - (void)selectContainers:(NSArray *)containers; // NSBrowser actions - (IBAction)containerTypeSelected:(NSBrowser *)sender; - (IBAction)containerSelected:(NSBrowser *)sender; // NSBrowser delegate - (void)browser:(NSBrowser *)sender createRowsForColumn:(int)column inMatrix:(NSMatrix *)matrix; - (void)containerTypesBrowser:(NSBrowser *)sender createRowsForColumn:(int)column inMatrix:(NSMatrix *)matrix; - (void)containersBrowser:(NSBrowser *)sender createRowsForColumn:(int)column inMatrix:(NSMatrix *)matrix; @end #endif Paje-1.98/General/PajeEntityInspector.h0000664000175000017500000000533011674062007017747 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeEntityInspector_h_ #define _PajeEntityInspector_h_ #include #include "PajeEntity.h" #include "PajeContainer.h" #include "PajeFilter.h" @interface PajeEntityInspector : NSObject { PajeEntity *inspectedEntity; PajeFilter *filter; IBOutlet NSWindow *inspectionWindow; IBOutlet NSTextField *nameField; IBOutlet NSColorWell *colorField; IBOutlet NSButton *reuseButton; IBOutlet NSButton *filterButton; IBOutlet NSBox *fieldBox; IBOutlet NSTextField *titleField; IBOutlet NSTextField *valueField; IBOutlet NSButton *showFileButton; NSData *archivedBox; NSData *archivedTitleField; NSData *archivedValueField; IBOutlet NSBox *scriptBox; IBOutlet NSTextField *scriptPathField; IBOutlet NSTextField *scriptFieldNameField; IBOutlet NSMatrix *scriptFieldSourceMatrix; IBOutlet NSBox *relatedEntitiesBox; IBOutlet NSMatrix *relatedEntitiesMatrix; NSMutableSet *nonDisplayedFields; NSRect boundingBox; } + (PajeEntityInspector *)inspector; - (id)init; - (void)dealloc; - (void)addSubview:(NSView *)view; - (void)addLastSubview:(NSView *)view; - (NSBox *)boxWithTitle:(NSString *)boxTitle fieldTitles:(NSArray *)titles fieldValues:(NSArray *)values; - (NSBox *)boxWithTitle:(NSString *)boxTitle fieldTitles:(NSArray *)titles fieldNames:(NSArray *)names; - (void)addLocalFields; - (void)addBoxForContainer:(PajeContainer *)container upToContainer:(PajeContainer *)upto withTitle:(NSString *)title; - (BOOL)isReusable; - (void)setReusable:(BOOL)reuse; - (void)inspectEntity:(id)entity withFilter:(PajeFilter *)filter; - (IBAction)colorChanged:(id)sender; - (IBAction)entityClicked:(id)sender; - (IBAction)showSource:(id)sender; - (IBAction)executeScript:(id)sender; - (IBAction)filterEntityName:(id)sender; @end #endif Paje-1.98/General/GNUmakefile0000664000175000017500000000451311674062007015707 0ustar schnorrschnorr#BUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make FRAMEWORK_NAME = General LIBRARIES_DEPEND_UPON += $(FND_LIBS) $(GUI_LIBS) $(OBJC_LIBS) General_OBJC_FILES = \ Comparing.m \ FilteredEnumerator.m \ PSortedArray.m \ TranslationTable.m \ PTime.m \ NSUserDefaults+Additions.m \ NSColor+Additions.m \ ColoredSwitchButtonCell.m \ NSString+Additions.m \ NSMatrix+Additions.m \ NSObject+Additions.m \ NSArray+Additions.m \ UniqueString.m \ NSDate+Additions.m \ MultiEnumerator.m \ SourceCodeReference.m \ NSDictionary+Additions.m \ PajeFilter.m \ HierarchyBrowser.m \ PajeType.m \ PajeContainer.m \ PajeEntity.m \ PajeEntityInspector.m \ GNUstep+Additions.m \ DataScanner.m \ PajeEvent.m \ SourceTextController.m \ Association.m \ CondensedEntitiesArray.m \ EntityChunk.m \ ChunkArray.m \ CStringCallBacks.m General_HEADER_FILES = \ Comparing.h \ FilteredEnumerator.h \ Protocols.h \ PSortedArray.h \ TranslationTable.h \ PTime.h \ NSUserDefaults+Additions.h \ NSColor+Additions.h \ ColoredSwitchButtonCell.h \ NSString+Additions.h \ NSMatrix+Additions.h \ NSObject+Additions.h \ NSArray+Additions.h \ UniqueString.h \ FoundationAdditions.h \ NSDate+Additions.h \ MultiEnumerator.h \ Macros.h \ SourceCodeReference.h \ NSDictionary+Additions.h \ PajeFilter.h \ HierarchyBrowser.h \ PajeType.h \ PajeContainer.h \ PajeEntity.h \ PajeEntityInspector.h \ DataScanner.h \ PajeEvent.h \ SourceTextController.h \ Association.h \ CondensedEntitiesArray.h \ EntityChunk.h \ ChunkArray.h\ CStringCallBacks.h General_RESOURCE_FILES = \ HierarchyBrowser.gorm \ HierarchyBrowser.nib \ PajeEntityInspector.gorm \ PajeEntityInspector.nib \ SourceTextViewer.gorm \ SourceTextViewer.nib PROJECT_HEADERS = \ Protocols.h \ PSortedArray.h \ FilteredEnumerator.h \ TranslationTable.h \ PTime.h \ NSUserDefaults+Colors.h \ ColoredButtonCell.h \ UniqueString.h \ FoundationAdditions.h \ MultiEnumerator.h \ Macros.h \ EntityDescriptor.h \ SourceCodeReference.h \ NSDictionary+Additions.h \ NSString+Additions.h \ NSArray+Additions.h \ PajeFilter.h \ CondensedEntitiesArray.h \ EntityChunk.h \ ChunkArray.h\ CStringCallBacks.h -include GNUmakefile.preamble #include $(GNUSTEP_MAKEFILES)/bundle.make include $(GNUSTEP_MAKEFILES)/framework.make -include GNUmakefile.postamble Paje-1.98/General/MultiEnumerator.m0000664000175000017500000000432211674062007017145 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "MultiEnumerator.h" #ifdef GNUSTEP @implementation NSEnumerator (Additions) - (NSArray *)allObjects { NSMutableArray *a = [NSMutableArray array]; id obj; while ((obj = [self nextObject]) != nil) { [a addObject:obj]; } return a; } @end #endif @implementation MultiEnumerator + (MultiEnumerator *)enumeratorWithEnumerator:(NSEnumerator *)en { return [[[self alloc] initWithEnumeratorArray:[NSArray arrayWithObject:en]] autorelease]; } + (MultiEnumerator *)enumeratorWithEnumeratorArray:(NSArray *)array { return [[[self alloc] initWithEnumeratorArray:array] autorelease]; } + (MultiEnumerator *)enumerator { return [[[self alloc] initWithEnumeratorArray:[NSMutableArray array]] autorelease]; } - (id)initWithEnumeratorArray:(NSArray *)array; { self = [super init]; if (self != nil) { origEnums = [array mutableCopy]; } return self; } - (void)dealloc { [origEnums release]; [super dealloc]; } - (void)addEnumerator:(NSEnumerator *)enumerator { if (enumerator != nil) { [origEnums addObject:enumerator]; } } - (id)nextObject; { id obj = nil; while (obj == nil) { if ([origEnums count] == 0) return nil; obj = [[origEnums objectAtIndex:0] nextObject]; if (obj) return obj; [origEnums removeObjectAtIndex:0]; } return nil; // shuts up compiler } @end Paje-1.98/General/TranslationTable.m0000664000175000017500000000450011674062007017255 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "TranslationTable.h" /* * Very dirty implementation. * should be changed to use a hash table to make the value->index translation. * and a more normal array to the index->value translation. */ @implementation TranslationTable - (id)init { table = [[NSMutableArray array] retain]; map = [[NSMutableDictionary dictionary] retain]; return self; } - (void)dealloc { [table release]; [map release]; [super dealloc]; } + (TranslationTable *)translationTable { return [[[self alloc] init] autorelease]; } /* * Querying */ - (NSUInteger) count { return [table count]; } - (NSUInteger)indexOfValue:(id)value { id obj = [map objectForKey:value]; if (obj) return [obj intValue]; else return NSNotFound; } - (id)valueAtIndex:(NSUInteger)index { return [table objectAtIndex:index]; } /* * Adding Elements */ - (NSUInteger)addValue:(id)value { NSUInteger index; index = [self indexOfValue:value]; if (index == NSNotFound) { [table addObject:value]; index = [table count] - 1; [map setObject: [NSNumber numberWithInt:index] forKey:value]; } return index; } // NSCoding Protocol - (void)encodeWithCoder:(NSCoder *)coder { // [super encodeWithCoder:coder]; [coder encodeObject:table]; [coder encodeObject:map]; } - (id)initWithCoder:(NSCoder *)coder { self = [super init];//WithCoder:coder]; table = [[coder decodeObject] retain]; map = [[coder decodeObject] retain]; return self; } @end Paje-1.98/General/EntityChunk.m0000664000175000017500000002705511674062007016266 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "EntityChunk.h" #include "Macros.h" #include "MultiEnumerator.h" #include "FilteredEnumerator.h" #define CHUNKS_TO_KEEP 3000 @implementation EntityChunk // LRU list of all chunks static EntityChunk *first; static EntityChunk *last; static int count; // + (void)emptyLeastRecentlyUsedChunks { int i; EntityChunk *chunk; chunk = last; for (i = 0; chunk != nil && i < count - CHUNKS_TO_KEEP; i++) { [chunk empty]; chunk = chunk->prev; } } + (void)remove:(EntityChunk *)chunk { if (chunk->prev != nil) chunk->prev->next = chunk->next; if (chunk->next != nil) chunk->next->prev = chunk->prev; if (last == chunk) last = chunk->prev; if (first == chunk) first = chunk->next; chunk->prev = chunk->next = nil; } + (void)touch:(EntityChunk *)chunk { if (first == chunk) return; if (first == nil) { first = last = chunk; return; } if (chunk->prev != nil) chunk->prev->next = chunk->next; if (chunk->next != nil) chunk->next->prev = chunk->prev; if (last == chunk && chunk->prev != nil) last = chunk->prev; chunk->prev = nil; chunk->next = first; first->prev = chunk; first = chunk; } - (id)initWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc { self = [super init]; if (self != nil) { entityType = type; // not retained container = pc; // not retained entities = [[PSortedArray alloc] initWithSelector:@selector(endTime)]; count++; [EntityChunk touch:self]; } return self; } - (void)dealloc { container = nil; entityType = nil; Assign(startTime, nil); Assign(endTime, nil); Assign(entities, nil); Assign(incompleteEntities, nil); [EntityChunk remove:self]; count--; [super dealloc]; } - (NSString *)description { return [NSString stringWithFormat:@"chunk of %@ in %@ from %@ to %@ complete:%@ incomplete:%@", entityType, container, startTime, endTime, [self completeEntities], [self incompleteEntities]]; } - (PajeContainer *)container { return container; } - (PajeEntityType *)entityType { return entityType; } - (NSDate *)startTime { return startTime; } - (void)setStartTime:(NSDate *)time { Assign(startTime, time); } - (NSDate *)endTime { return endTime; } - (void)setEndTime:(NSDate *)time { Assign(endTime, time); } - (BOOL)isActive { return chunkState == loading || chunkState == reloading; } - (BOOL)isFull { return chunkState == frozen; } - (BOOL)isZombie { return chunkState == empty; } - (BOOL)canEnumerate { return chunkState == frozen || chunkState == loading; } - (BOOL)canInsert { return [self isActive]; } // sent to a zombie to refill it - (void)activate { NSAssert([self isZombie], @"trying to activate a non-zombie chunk"); chunkState = reloading; entities = [[PSortedArray alloc] initWithSelector:@selector(endTime)]; } // sent to an active chunk to make it full - (void)freeze { NSAssert([self isActive], @"trying to freeze a non-active chunk"); chunkState = frozen; } // sent to a full chunk to empty it (make a zombie) - (void)empty { if ([self isZombie]) { return; } NSAssert(![self isActive], @"trying to empty an active chunk"); // do not empty it nothing would be released if ([entities count] == 0) { return; } chunkState = empty; Assign(entities, nil); } - (id)filterEntity:(PajeEntity *)entity notStartingBefore:(NSDate *)time { if ([[entity startTime] isEarlierThanDate:time]) { return entity; } else { return nil; } } - (id)filterEntity:(PajeEntity *)entity startingBefore:(NSDate *)time { if ([[entity startTime] isEarlierThanDate:time]) { return nil; } else { return entity; } } - (id)filterEntity:(PajeEntity *)entity startingLaterThan:(NSDate *)time { if ([[entity startTime] isLaterThanDate:time]) { return nil; } else { return entity; } } - (id)filterEntity:(PajeEntity *)entity endingLaterThan:(NSDate *)time { if ([[entity endTime] isLaterThanDate:time]) { return nil; } else { return entity; } } - (id)filterEntity:(PajeEntity *)entity notEndingBefore:(NSDate *)time { if ([[entity endTime] isEarlierThanDate:time]) { return entity; } else { return nil; } } - (PSortedArray *)completeEntities { return entities; } - (void)setIncompleteEntities:(NSArray *)array { if (incompleteEntities != nil) { [incompleteEntities release]; incompleteEntities = nil; } if (array != nil) { incompleteEntities = [array copy]; } } - (NSArray *)incompleteEntities { if (incompleteEntities == nil) { return [NSArray array]; } return incompleteEntities; } - (NSEnumerator *)enumeratorOfAllCompleteEntities { NSEnumerator *compEnum; NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); [EntityChunk touch:self]; compEnum = [[self completeEntities] reverseObjectEnumerator]; return compEnum; } - (NSEnumerator *)enumeratorOfCompleteEntitiesAfterTime:(NSDate *)time { NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); [isa touch:self]; // return all entities that finish after time (those that finish // exactly at time are not returned) return [[self completeEntities] reverseObjectEnumeratorAfterValue:(id)time]; } - (NSEnumerator *)enumeratorOfCompleteEntitiesFromTime:(NSDate *)time { NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); [isa touch:self]; // return all entities that finish after time (those that finish // exactly at time are not returned) return [[self completeEntities] // reverseObjectEnumeratorNotBeforeValue:(id)time]; reverseObjectEnumeratorAfterValue:(id)time]; } - (NSEnumerator *)fwEnumeratorOfAllCompleteEntities { NSEnumerator *compEnum; NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); // [EntityChunk touch:self]; compEnum = [[self completeEntities] objectEnumerator]; return compEnum; } - (NSEnumerator *)fwEnumeratorOfCompleteEntitiesFromTime:(NSDate *)time { NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); // [isa touch:self]; return [[self completeEntities] objectEnumeratorAfterValue:(id)time]; } - (NSEnumerator *)fwEnumeratorOfCompleteEntitiesUntilTime:(NSDate *)time { NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); // [isa touch:self]; return [[self completeEntities] objectEnumeratorNotAfterValue:(id)time]; } - (NSEnumerator *)fwEnumeratorOfCompleteEntitiesFromTime:(NSDate *)start untilTime:(NSDate *)end { NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); // [isa touch:self]; return [[self completeEntities] objectEnumeratorAfterValue:(id)start notAfterValue:(id)end]; NSEnumerator *compEnum; SEL filterSelector = @selector(filterEntity:startingBefore:); NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); // [EntityChunk touch:self]; compEnum = [self fwEnumeratorOfCompleteEntitiesUntilTime:end]; return [FilteredEnumerator enumeratorWithEnumerator:compEnum filter:self selector:filterSelector context:start]; } - (NSEnumerator *)enumeratorOfAllEntities { NSEnumerator *incEnum; NSEnumerator *compEnum; NSEnumerator *en; NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); [EntityChunk touch:self]; incEnum = [[self incompleteEntities] objectEnumerator]; compEnum = [[self completeEntities] reverseObjectEnumerator]; if (incEnum != nil && compEnum != nil) { en = [MultiEnumerator enumeratorWithEnumeratorArray: [NSArray arrayWithObjects:incEnum, compEnum, nil]]; } else if (compEnum != nil) { en = compEnum; } else { en = incEnum; } return en; } - (NSEnumerator *)enumeratorOfEntitiesBeforeTime:(NSDate *)time { NSEnumerator *enAll; SEL filterSelector = @selector(filterEntity:notStartingBefore:); enAll = [self enumeratorOfAllEntities]; return [FilteredEnumerator enumeratorWithEnumerator:enAll filter:self selector:filterSelector context:time]; } - (NSEnumerator *)xxfwEnumeratorOfCompleteEntitiesUntilTime:(NSDate *)time { NSEnumerator *enAll; SEL filterSelector = @selector(filterEntity:endingAfterTime:); enAll = [self fwEnumeratorOfAllCompleteEntities]; return [FilteredEnumerator enumeratorWithEnumerator:enAll filter:self selector:filterSelector context:time]; } - (NSEnumerator *)enumeratorOfEntitiesFromTime:(NSDate *)sliceStartTime toTime:(NSDate *)sliceEndTime { NSEnumerator *incEnum; NSEnumerator *compEnum; NSEnumerator *en; SEL filterSelector = @selector(filterEntity:notStartingBefore:); NSAssert([self canEnumerate], @"enumerating non-enumerable chunk"); [EntityChunk touch:self]; incEnum = [[self incompleteEntities] objectEnumerator]; compEnum = [self enumeratorOfCompleteEntitiesFromTime:sliceStartTime]; if (incEnum != nil && compEnum != nil) { en = [MultiEnumerator enumeratorWithEnumeratorArray: [NSArray arrayWithObjects:incEnum, compEnum, nil]]; } else if (compEnum != nil) { en = compEnum; } else { en = incEnum; } return [FilteredEnumerator enumeratorWithEnumerator:en filter:self selector:filterSelector context:sliceEndTime]; } - (id)xxxcopyWithZone:(NSZone *)z { EntityChunk *copy; copy = [[[self class] alloc] initWithEntityType:entityType container:container]; [copy setStartTime:startTime]; [copy setEndTime:endTime]; return copy; } - (int)entityCount { return [[self completeEntities] count]; } - (id)lastEntity { return [[self completeEntities] lastObject]; } - (void)addEntity:(PajeEntity *)entity { NSAssert([self canInsert], @"adding entities to inactive chunk"); [entities addObject:entity]; } @end Paje-1.98/General/UniqueString.m0000664000175000017500000001103211674062007016442 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "UniqueString.h" #include #include #include #include @implementation UniqueString NSMutableSet *TheUniqueStringsSet; + (void)initialize { if (!TheUniqueStringsSet) { #ifdef GNUSTEP TheUniqueStringsSet = [[NSMutableSet alloc] init]; #else TheUniqueStringsSet = [[NSMutableSet allocWithZone:NSCreateZone(0, NSPageSize(), NO)] init]; #endif } } + (UniqueString *)stringWithString:(NSString *)s; { UniqueString *uniquestring = [TheUniqueStringsSet member:s]; if (!uniquestring) { uniquestring = (id)s;//[[UniqueString allocWithZone:[TheUniqueStringsSet zone]] initWithString:s]; [TheUniqueStringsSet addObject:uniquestring]; //[uniquestring autorelease]; } return uniquestring; } - (id)initWithString:(NSString *)s { //#ifndef GNUSTEP self = [super init]; //#endif if (self) { string = [s copyWithZone:[self zone]]; } return self; } // primitive methods //- (unsigned int)length; //{ // return [string length]; //} #ifdef GNUSTEP // GNUstep expects cStringLength to be defined //- (unsigned int)cStringLength //{ // return [string cStringLength]; //} #endif //- (unichar)characterAtIndex:(unsigned)index; //{ // return [string characterAtIndex:index]; //} int C1, C2, C3, C4; + (void)printCs { NSLog(@"%d %d %d %d", C1, C2, C3, C4); } - (NSString *)description { return [string description]; } // NSObject protocol - (BOOL)isEqual:(id)object; { C1++; if (self == object) return YES; C2++; if ([object class] == [UniqueString class]) return NO; C3++; return [string isEqual:object]; } - (unsigned)hash; { return [string hash]; } // UniqueStrings are unique and are never released - (id)retain { return self; } - (oneway void)release { } - (id)autorelease { return self; } - (NSUInteger)retainCount { return 1; } - (id)copyWithZone:(NSZone *)z { C4++; return self; } // NSCoding Protocol - (Class)classForCoder { return [UniqueString class]; } - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:string]; } - (id)initWithCoder:(NSCoder *)coder { NSString *s; UniqueString *uniquestring; s = [coder decodeObject]; uniquestring = [UniqueString stringWithString:s]; [super release]; return uniquestring; } // // Forwards other messages to uniqued object // - (BOOL)respondsToSelector:(SEL)aSelector { return [string respondsToSelector:aSelector]; } - (void)forwardInvocation:(NSInvocation *)invocation { [invocation invokeWithTarget:string]; } - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel { return [string methodSignatureForSelector:sel]; } @end @implementation NSString (UnifyStrings) - (id)unifyStrings { //NSLog(@"Str %@", self); return U(self); } @end @implementation NSArray (UnifyStrings) - (id)unifyStrings { NSMutableArray *unified; int i; int count; //NSLog(@"Arr"); count = [self count]; unified = [NSMutableArray arrayWithCapacity:count]; for (i = 0; i < count; i++) { // NSLog(@" %d %@", i, [self objectAtIndex:i]); [unified addObject:[[self objectAtIndex:i] unifyStrings]]; } return unified; } @end @implementation NSDictionary (UnifyStrings) - (id)unifyStrings { NSMutableDictionary *unified; NSEnumerator *keyEnum; id key; id value; // NSLog(@"Dic"); unified = [NSMutableDictionary dictionaryWithCapacity:[self count]]; keyEnum = [self keyEnumerator]; while ((key = [keyEnum nextObject]) != nil) { value = [self objectForKey:key]; // NSLog(@" %@ -> %@", key, value); [unified setObject:[value unifyStrings] forKey:[key unifyStrings]]; } return unified; } @end Paje-1.98/General/DataScanner.m0000664000175000017500000001063311674062007016176 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "DataScanner.h" @implementation DataScanner + (DataScanner *)scannerWithData:(NSData *)_data { return [[[self alloc] initWithData:_data] autorelease]; } - (id)initWithData:(NSData *)_data { if ((self = [super init])) { Assign(data, _data); position = 0; } return self; } - (void)dealloc { Assign(data, nil); [super dealloc]; } - (NSData *)data { return data; } - (unsigned)position { return position; } - (void)setPosition:(unsigned)_position { if (_position <= [data length]) position = _position; } #define DECLS char *bytes = (char *)[data bytes]; \ unsigned length = [data length]; \ int c; #define NEXTCHAR ((position < length) ? bytes[position++] : -1) #define SKIPWHITE do { c = NEXTCHAR; } while (c==' ' /*|| c=='\n'*/ || c=='\t' || c=='\r') #define SKIPNONWHITE do { c = NEXTCHAR; } while (c!=' ' && c!='\n' && c!='\t' && c!=-1) - (int)readChar { DECLS; SKIPWHITE; if (c == '\\') { c = NEXTCHAR; if (c == 'n') { c = '\n'; } } return c; } - (NSNumber *)readIntNumber { int value = 0; int signal = 1; DECLS; SKIPWHITE; if (c == '-') { signal = -1; c = NEXTCHAR; } if (c<'0' || c>'9') { if (c != -1) position--; return nil; } while (c >= '0' && c <= '9') { value = value * 10 + c - '0'; c = NEXTCHAR; } if (c != -1) position--; return [NSNumber numberWithInt:value*signal]; } - (NSNumber *)readDoubleNumber { double value=0; int signal = 1; DECLS; return [NSNumber numberWithDouble:[self readDouble]]; SKIPWHITE; if (c == '-') { signal = -1; c = NEXTCHAR; } if (c < '0' || c > '9') { if (c != -1) position--; return nil; } while (c >= '0' && c <= '9') { value = value * 10 + c - '0'; c = NEXTCHAR; } if (c == '.') { double m=.1; c = NEXTCHAR; while (c >= '0' && c <= '9') { value = value + (c - '0') * m; m /= 10; c = NEXTCHAR; } } if (c != -1) position--; return [NSNumber numberWithDouble:value*signal]; } - (double)readDouble { double value=0; int signal = 1; DECLS; SKIPWHITE; value = atof(&bytes[position-1]); SKIPNONWHITE; if (c != -1) position--; return value; if (c == '-') { signal = -1; c = NEXTCHAR; } if (c < '0' || c > '9') { if (c != -1) position--; return 0; } while (c >= '0' && c <= '9') { value = value * 10 + c - '0'; c = NEXTCHAR; } if (c == '.') { double m=.1; c = NEXTCHAR; while (c >= '0' && c <= '9') { value = value + (c - '0') * m; m /= 10; c = NEXTCHAR; } } if (c != -1) position--; return value*signal; } - (NSString *)readString { char value[500]; int bi=0; BOOL f=NO; DECLS; SKIPWHITE; if (c=='"') { f=YES; c = NEXTCHAR; } do { if (c == '\\') { c = NEXTCHAR; if (c == 'n') { c = '\n'; } } value[bi++] = c; c = NEXTCHAR; } while ((c != -1) && ((f && c!='"') || (!f && !(c==' ' || c=='\n' || c=='\t')))); if (f && (c == '"')) position++; if (c != -1) position--; return [NSString stringWithCString:value length:bi]; } - (BOOL)isAtEnd { DECLS; SKIPWHITE; if (c == -1) return YES; position--; return NO; } @end Paje-1.98/General/PajeEntityInspector.gorm/0000775000175000017500000000000011674062007020540 5ustar schnorrschnorrPaje-1.98/General/PajeEntityInspector.gorm/data.info0000664000175000017500000000027011674062007022325 0ustar schnorrschnorrGNUstep archive00002c24:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed StreamPaje-1.98/General/PajeEntityInspector.gorm/data.classes0000664000175000017500000000123411674062007023030 0ustar schnorrschnorr{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "filterEntityName:", "executeScript:", "showSource:" ); Super = NSObject; }; PajeEntityInspector = { Actions = ( "showSource:", "filterEntityName:", "executeScript:" ); Outlets = ( inspectionWindow, nameField, colorField, reuseButton, filterButton, fieldBox, relatedEntitiesBox, relatedEntitiesMatrix, titleField, showFileButton, valueField, scriptBox, scriptPathField, scriptFieldNameField, scriptFieldSourceMatrix ); Super = NSObject; }; }Paje-1.98/General/PajeEntityInspector.gorm/objects.gorm0000664000175000017500000004655411674062007023075 0ustar schnorrschnorrGNUstep archive00002c24:00000029:00000129:00000000:01GSNibContainer1NSObject01 GSMutableSet1 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&%NSPanel1 NSPanel1 NSWindow1 NSResponder%  C C& % C D@01 NSView%  C C  C C&01 NSMutableArray1NSArray&01 NSColorWell1 NSControl% A C B B  B B& 0 &%0 1NSCell0 &0 1NSFont%&&&&&&&&0 1NSColor0 &%NSCalibratedWhiteColorSpace ?01 NSTextField% BL C CO A  CO A& 0 &%01NSTextFieldCell1 NSActionCell0& % Entity Name0%0&%Helvetica-Bold A`A`&&&&&&&&0%00&%NSCalibratedRGBColorSpace ?* ?* ?* ?* ?0 ?01NSBox% A A@ Cx B  Cx B&0 &0 % @/ @/ Co] Br  Co] Br&0 &01 NSScrollView%  Cp Br  Cp Br&01 NSClipView% A ? Cc B`  Cc B`&01NSMatrix%  Cb B   Cb B & 0 &%00 & &&&&&&&&%% Cb A 0! ? ? ? ? ?0" ?* ?* ?* ?* ?0#& % NSButtonCell0$1 NSButtonCell0%&%Button0&%0'& % Helvetica A@A@&&&&&&&&%0(&&(&&&%%0) &0*0+&%Button&&&&&&&&&%(&(&&&0,0-&%Button&&&&&&&&&%(&(&&&*0. &"0/ &00% A ? C_ Bj  C_ Bj&01 &!021 NSScroller% ? ? A` Bj  A` Bj&03 &%04 &&&&&&&&&0% A A A A 20506&%Related Entities&&&&&&&&& @_ @_%%071NSButton% BL C B A  B A& 08 &%090:&%Show0;1NSImage0<1NSMutableString&%common_SwitchOff &&&&&&&&%0=&0>&0?0@&%common_SwitchOn&&&0A% C C B A  B A& 0B &%0C0D& % Reuse window; &&&&&&&&%0E&0F&?&&&0G% A C Cx B8  Cx B8& 0H &0I % @ @ Cj A  Cj A&0J &0K%  Bh A  Bh A&0L &%0M0N&%Text &&&&&&&&0%0O0P&%NSNamedColorSpace0Q&%System0R&%textBackgroundColor0SPQ0T& % textColor0U% B|  C A  C A&0V &%0W0X&%Text &&&&&&&&0%0YP0Z&%System0[&%textBackgroundColor0\PZ0]& % textColor0^% CG  B A  B A&0_ &%0`0a&%View &&&&&&&&%0b&0c&&&&0d0e&%Box &&&&&&&& @ @%%0f% A CX Cx B  Cx B& 0g &0h % @ @ Cj Bt  Cj Bt&0i &0j% @ B( B| A  B| A& 0k &%0l0m& % Script Path &&&&&&&&0%0nP0o&%System0p&%textBackgroundColor0qPo0r& % textColor0s% B B( B A  B A& 0t &%0u0v&%Text &&&&&&&&0%0wP0x&%System0y&%textBackgroundColor0zPx0{& % textColor0|% CG A B B$  B B$&0} &%0~0&%Exec &&&&&&&&%0&0&&&&0% @ A B| A  B| A& 0 &%00& % Field Name &&&&&&&&0%0P0&%System0&%textBackgroundColor0P0& % textColor0% B A B A  B A& 0 &%00&%Text &&&&&&&&0%0P0&%System0&%textBackgroundColor0P0& % textColor0% B  B A  B A& 0 &%00& &&&&&&&&%% Bt A 0P0&%System0&%controlBackgroundColor0& % NSButtonCell00&%Radio00&%common_RadioOff &&&&&&&&%0&0&00&%common_RadioOn&&&%%0 &00&%Self &&&&&&&&%0&&&&00&%Related &&&&&&&&%0&&&&0% @  B| A  B| A& 0 &%00&%From &&&&&&&&0%0P0&%System0&%textBackgroundColor0P0& % textColor00&%Execute Script &&&&&&&& @ @%%0P0&%System0&%windowBackgroundColor0&%Window0&%Panel CH CH F@ F@%0 0 0 &01 NSBitmapImageRep1! NSImageRep0&%NSDeviceRGBColorSpace B@ B@%%0%001" NSDataMalloc1# NSDataStatic1$NSData&$$II*$[=T8J2R-!k[=U:K3xB-H'R-!k[=S7J2xB-H'/ ?[=S7I2xB-H'/ ?[=S7H0xB-H'/ ?[=R7I2xB-H'/ ?[=S7I0xB-H'/ ?[=R7I2xB-H'/ ?[=R7H0xB-H'/ ?[>X/!j:)H'/ ?D49  ?hft{y<;D ?hft}<;D ?<;D ?43:""""43:zzzzͱ""""EEEEEEEEEEEE43:555222t43:0?55hhhiiiyyyVVV777?43:~=0rdxxxUUU444?/17?43:5?0\Mzz{]]]QQQmmm_bn:9@5?0I>e]xxwvtsqpo}66<5?2A3QFA4H:|zzywutrqpbao++05?2@2@2A3B3C4E6}}|zxxwutrqpn}VT_=,, 5@2@3A3A3JdbqihvFEOQ-)Y)!W)`/$k3'q6*n4)l3'i2'f0&c/$`-$Y*!)5C4C4D4E6F7H7Ʀkkk)))LJRkjxihvhgu::B\/&[-$Y-$c/&l3'o4)l3'j2'g2&d0$a/$^-#X*!)5@2D4E6F7H7I8{{{[[[322QPZ^]jjhwhguQP[K33\-&W)_/$j3'm3'm4)j3'h2&d0&b/$_-#],#X*!)P'~>>ddd>>?87?4$$E)&_-#`0'_0&]/&^/&`/&`/&c0&j2'n3'k3'h2&d0$a/$^-#\,!Z,!X*!U)T))ttttttzzz;;;rqyjhwPPZ43:C@?w9,c2)b2)^,#_0&d2'g2'h2'k3)l3)l3)l3'l3'i2'f0&c/$_-#],#Z,!X*!W)T)S))rrr```FFF000mmm\[a<;CA)'^3,I::76v8,_-$b2'g2'l4)r7*s7*s7*w8,t7,q6*n4)k3'g2&d0$`-$],#[,!X*!W)U)S'S')YYY777XWcKJS|||SSS\2,KDD4I:I;A?>~>0b2)f2'p6*x:-y:-{;-x:-v9,s7*o4)l3'i2&f0&c/$_-#\,#Y*!W)T)S'R'S')TR^|z@?Gↄ\Zg<;CJJJm4)D4E6J;UIPEvI@q:/l4)m4)x:,};/{:-y:-w9,t7*q6*m4)j3'h2&c0&a/$]-#[,!X*!V)T)R'R'R')0/5?_^kCBJ43:?QQQ ^-#I:O>SBP?H7?2p6*s7*0|;/y:-p6*f0&d0&c/&`/$_-$]-#\,#T)!T)!T)!T)!T)!T)!T)!)))) ?h3'z;/T)!T)!T)!`/$`/$))))) ? 00$$R&   D D@0 &0± &01%NSMutableDictionary1& NSDictionary&0ı& % GormNSPanel0ű& % TextField70Ʊ&%Box3G0DZ&%NSOwner0ȱ&%PajeEntityInspector0ɱ& % TextField0ʱ&%Button^0˱&%ClipView0̱&%Scroller20ͱ& % ScrollView0α& % ColorWell0ϱ& % ClipView100б&%Boxf0ѱ&%Matrix10ұ& % TextField1j0ӱ&%Matrix0Ա& % TextField2s0ձ& % TextField30ֱ&%Button1|0ױ&%View20ر& % TextField40ٱ&%Button2A0ڱ& % TextField5K0۱&%Button370ܱ&%Box20ݱ& % TextField6U0ޱ&%Viewh0߱ &..01'NSNibConnector0&%NSOwner0'ΐ0'ɰ0'ܰ0'װ0'Ͱ0'˰0'ϰ0'Ӱ0'̰01(NSNibControlConnector̰0& % _doScroll:01)NSNibOutletConnector0& % colorField0)0& % nameField0)0&%inspectionWindow0)İ0)0&%relatedEntitiesBox0)0&%relatedEntitiesMatrix0'ې0(۰0&%filterEntityName:0)0& % filterButton0'ِ0)0& % reuseButtonP)İP&%delegateP'ƐP'ڐP'ݐP)P& % titleFieldP)P& % valueFieldP )P &%fieldBoxP 'ʐP (ʰP & % showSource:P)P&%showFileButtonP'АP'ްАP'ҰސP'԰ސP'ְސP'հސP'ذސP'ѐP'ŰސP)P& % scriptBoxP)P&%scriptPathFieldP)P&%scriptFieldNameFieldP)P &%scriptFieldSourceMatrixP!(ְP"&%executeScript:P#%&Paje-1.98/General/SourceTextController.m0000664000175000017500000000700711674062007020165 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "SourceTextController.h" #include "NSString+Additions.h" #include "Macros.h" @implementation SourceTextController static NSMutableDictionary *filenameToInstance; + (SourceTextController *)controllerForFilename:(NSString *)name { SourceTextController *controller; if (filenameToInstance == nil) { filenameToInstance = [NSMutableDictionary new]; } controller = [filenameToInstance objectForKey:name]; if (controller == nil) { controller = [[[super alloc] initWithFilename:name] autorelease]; if (controller != nil) { [filenameToInstance setObject:controller forKey:name]; } } return controller; } - (id)initWithFilename:(NSString*)name { NSString *fileContents; fileContents = [NSString stringWithContentsOfFile:name]; if (fileContents == nil) { return nil; } self = [super init]; if (self) { Assign(filename, name); if (![NSBundle loadNibNamed:@"SourceTextViewer" owner:self]) NSRunAlertPanel(@"SourceTextController", @"Couldn't load interface file", nil, nil, nil); [textView setString:fileContents]; [textView sizeToFit]; [[textView window] setTitleWithRepresentedFilename:name]; [[textView window] makeKeyAndOrderFront:self]; } return self; } - (void)dealloc { [filename release]; // [textView release]; // [lineNumberField release]; [super dealloc]; } - (IBAction)lineNumberChanged:(id)sender { [self selectLineNumber:[sender intValue]]; } - (void)selectLineNumber:(unsigned)lineNumber { NSString *string = [textView string]; NSRange selRange; selRange = [string rangeForLineNumber:lineNumber]; [textView setSelectedRange:selRange]; [textView scrollRangeToVisible:selRange]; [[textView window] orderFront:self]; } // This delegate method is called when the selection is about to change // (and whenever the textView is clicked on). - (NSRange)textView:(NSTextView *)aTextView willChangeSelectionFromCharacterRange:(NSRange)oldRange toCharacterRange:(NSRange)newRange { NSString *string = [textView string]; unsigned lineNumber; NSRange selRange; // expand the range to the whole line selRange = [string lineRangeForRange:NSMakeRange(newRange.location, 0)]; lineNumber = [string lineNumberAtIndex:selRange.location]; [lineNumberField setIntValue:lineNumber]; // highlight related entities // [[NSClassFromString(@"A0bSimul") onlyInstance] selectLine:lineNumber inFile:filename]; return selRange; } // Delegate method from window - (void)windowWillClose:(NSNotification *)aNotification { [filenameToInstance removeObjectForKey:filename]; } @end Paje-1.98/General/Association.h0000664000175000017500000000253011674062007016257 0ustar schnorrschnorr/* Copyright (c) 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _Association_h_ #define _Association_h_ /* Association * ----------- * Store an association of an object and a double */ #include @interface Association : NSObject { id object; double value; } + (Association *)associationWithObject:(id)obj double:(double)d; - (id)initWithObject:(id)obj double:(double)d; - (id)objectValue; - (double)doubleValue; - (void)addDouble:(double)d; - (NSComparisonResult)inverseDoubleValueComparison:(Association *)other; - (NSUInteger)hash; - (BOOL)isEqual:(id)anObj; @end #endif Paje-1.98/General/NSArray+Additions.h0000664000175000017500000000223111674062007017232 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _NSArray_Additions_h_ #define _NSArray_Additions_h_ // // NSArray+Additions // // a category with additions to NSArray // // Author: Edmar Pessoa Arajo Neto // #include @interface NSArray (PajeAdditions) - (NSEnumerator *)objectEnumeratorWithRange:(NSRange)range; - (NSEnumerator *)reverseObjectEnumeratorWithRange:(NSRange)range; @end #endif Paje-1.98/General/UniqueString.h0000664000175000017500000000315311674062007016442 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _UniqueString_h_ #define _UniqueString_h_ // UniqueString.h // // Strings of this class are uniqued, all equal instances are the same object. // #include #include #include #include #define U(s) [UniqueString stringWithString:s] @interface UniqueString : NSObject { NSObject *string; } + (UniqueString *)stringWithString:(NSString *)s; // primitive methods //- (unsigned int)length; //- (unichar)characterAtIndex:(unsigned)index; // NSObject protocol - (BOOL)isEqual:(id)object; - (unsigned)hash; @end @interface NSString (UnifyStrings) - (id)unifyStrings; @end @interface NSArray (UnifyStrings) - (id)unifyStrings; @end @interface NSDictionary (UnifyStrings) - (id)unifyStrings; @end #endif Paje-1.98/General/HackedMatrix.m0000664000175000017500000000433011674062007016354 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* I've taken this from http://jeremy.hksys.com/openstep/index.html NSMatrix within a NSScrollView by Jeremy Bettis (Updated Feb 6, 1998) _ When a NSMatrix (such as a NSForm) is positioned inside of a NSScrollView, pulling the scrollbar down and clicking on a text cell selects the wrong cell. Here is a fix. */ #include // ==================================================================== // A NSForm inside of a NSScrollView does not handle mouse clicks // correctly. This subclass fixes that. It scrolls the old selected // cell to visible while activating the new one. // ==================================================================== static int dontscroll = 0; @interface HackedMatrix : NSMatrix - (void) scrollCellToVisibleAtRow:(int)r column:(int)c; - (void) textDidEndEditing:(NSNotification *)notify; @end @implementation HackedMatrix + (void) load { // id pool = [NSAutoreleasePool new]; // [self poseAsClass:[NSMatrix class]]; // [pool release]; } - (void) scrollCellToVisibleAtRow:(int)r column:(int)c { if (dontscroll <= 0) { [super scrollCellToVisibleAtRow:r column:c]; } dontscroll = 0; } - (void) textDidEndEditing:(NSNotification *)notify { dontscroll=1; NS_DURING [super textDidEndEditing:notify]; NS_HANDLER dontscroll = 0; [localException raise]; NS_ENDHANDLER dontscroll = 0; } @end Paje-1.98/General/PajeEntity.h0000664000175000017500000000466511674062007016072 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeEntity_h_ #define _PajeEntity_h_ // // PajeEntity // // Generic entities for Paje // #include "PajeType.h" #include "CondensedEntitiesArray.h" @class PajeContainer; @interface PajeEntity : NSObject { PajeEntityType *entityType; // not retained NSString *name; PajeContainer *container; // not retained } - (id)initWithType:(PajeEntityType *)type name:(NSString *)n container:(PajeContainer *)c; - (void)dealloc; - (BOOL)isContainer; - (NSString *)name; - (id)value; - (PajeEntityType *)entityType; - (void)setContainer:(PajeContainer *)c; - (PajeContainer *)container; - (PajeContainer *)sourceContainer; - (PajeContainer *)destContainer; - (BOOL)isContainedBy:(PajeContainer *)cont; - (double)doubleValue; - (double)minValue; - (double)maxValue; - (NSString *)description; - (NSDate *)time; - (NSDate *)startTime; - (NSDate *)endTime; - (NSDate *)firstTime; - (NSDate *)lastTime; - (double)duration; - (double)exclusiveDuration; - (NSColor *)color; - (void)setColor:(NSColor *)c; - (void)takeColorFrom:(id)sender; // for when there is one state inside another. // only states can have this; others should return 0. - (int)imbricationLevel; // When the entity has subentities - (BOOL)isAggregate; - (NSUInteger)subCount; - (id)subValueAtIndex:(NSUInteger)index; - (NSColor *)subColorAtIndex:(NSUInteger)index; - (double)subDurationAtIndex:(NSUInteger)index; - (NSUInteger)subCountAtIndex:(unsigned)index; - (CondensedEntitiesArray *)condensedEntities; - (NSUInteger)condensedEntitiesCount; - (NSArray *)fieldNames; - (id)valueOfFieldNamed:(NSString *)fieldName; @end #endif Paje-1.98/General/NSDate+Additions.m0000664000175000017500000000276111674062007017046 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "NSDate+Additions.h" @implementation NSDate (Comparision) - (BOOL)isEarlierThanDate:(NSDate *)otherDate { return [self timeIntervalSinceReferenceDate] < [otherDate timeIntervalSinceReferenceDate]; } - (BOOL)isLaterThanDate:(NSDate *)otherDate { return [self timeIntervalSinceReferenceDate] > [otherDate timeIntervalSinceReferenceDate]; } @end @implementation NSDate (AltDescription) - (NSString *)description { return [NSString stringWithFormat:@"%.6f", [self timeIntervalSinceReferenceDate]]; } - (NSString *)descriptionWithLocale:(NSDictionary *)locale { return [NSString stringWithFormat:@"%.6f", [self timeIntervalSinceReferenceDate]]; } @end Paje-1.98/General/PSortedArray.m0000664000175000017500000003011311674062007016365 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* PSortedArray.m created by benhur on Mon 07-Apr-1997 */ #include "PSortedArray.h" #include "NSArray+Additions.h" @implementation PSortedArray + (PSortedArray *)sortedArrayWithSelector:(SEL)sel { return [[[self alloc] initWithSelector:sel] autorelease]; } - (id)initWithSelector:(SEL)sel { [super init]; if (self != nil) { array = [[NSMutableArray array] retain]; valueSelector = sel; } return self; } - (void)setSelector:(SEL)sel { valueSelector = sel; [array sortUsingSelector:sel]; } - (void)dealloc { [array release]; [super dealloc]; } - (NSUInteger)count { return [array count]; } - (id)objectAtIndex:(NSUInteger)index { return [array objectAtIndex:index]; } - (id)lastObject { return [array lastObject]; } - (void)removeLastObject { [array removeLastObject]; } - (void)removeObjectAtIndex:(NSUInteger)index { [array removeObjectAtIndex:index]; } - (void) removeObjectsInRange: (NSRange)aRange { [array removeObjectsInRange:aRange]; } - (void)removeObject:(id)obj { id value = [obj performSelector:valueSelector]; unsigned index = [self indexOfFirstObjectNotBeforeValue:value]; while (index < [array count] && [[[array objectAtIndex:index] performSelector:valueSelector] isEqual:value]) [array removeObjectAtIndex:index]; } - (void)removeObjectIdenticalTo:(id)obj { id value = [obj performSelector:valueSelector]; unsigned index = [self indexOfFirstObjectNotBeforeValue:value]; while (index < [array count]) { id testobj = [array objectAtIndex:index]; if (testobj == obj) { [array removeObjectAtIndex:index]; } else { if ([[testobj performSelector:valueSelector] isEqual:value]) index++; else break; } } } - (void)removeObjectsBeforeValue:(id)value { unsigned index = [self indexOfFirstObjectNotBeforeValue:value]; if (index > 0) [array removeObjectsInRange:NSMakeRange(0, index)]; } - (void)removeAllObjects { [array removeAllObjects]; } - (void)addObject:(id)obj withValue:(id)objValue left:(int)left right:(int)right pivot:(int)pivot { int size = right-left; if (size == 0){ [array insertObject:obj atIndex:pivot]; return; } id pivotValue = [[array objectAtIndex:pivot] performSelector: valueSelector]; NSComparisonResult comp = [pivotValue compare:objValue]; //check if size is 1 if (size == 1){ if (comp == NSOrderedDescending){ [array insertObject:obj atIndex:pivot]; }else{ [array insertObject:obj atIndex:pivot+1]; } return; } //recurse normally if (comp == NSOrderedAscending){ [self addObject:obj withValue:objValue left:pivot right:right pivot:pivot+(right-pivot)/2]; }else if(comp == NSOrderedDescending){ [self addObject:obj withValue:objValue left:left right:pivot pivot:left+(pivot-left)/2]; }else{ [array insertObject:obj atIndex:pivot+1]; } } - (void)addObject:(id)obj { id value = [obj performSelector:valueSelector]; int pos = [array count]; // if anObject should be the last in array, just add it. if (pos == 0 || [value compare:[[array lastObject] performSelector:valueSelector]] != NSOrderedAscending) { // obj >= array[last] [array addObject:obj]; } else { // find the place to insert int left = 0, right = [array count]; int pivot = [array count]/2; [self addObject:obj withValue:value left:left right:right pivot:pivot]; } } - (void)verifyPositionOfObjectIdenticalTo:(id)obj { id value; BOOL found = NO; int count = [array count]; int pos, newpos; // find object (should be near end) pos = count; while (!found && pos > 0) { pos--; if (obj == [array objectAtIndex:pos]) found = YES; } if (!found) { NSLog(@"object %@ not found while verifying its position in list", obj); return; } value = [obj performSelector:valueSelector]; newpos = pos; // try to see if it should be moved to the end of the array while ((newpos+1 < count) && [value compare: [[array objectAtIndex:newpos+1] performSelector:valueSelector]] == NSOrderedDescending) { // obj > array[newpos+1] newpos = newpos+1; } // if not to the end, try to the beginning if (newpos == pos) { while ((newpos-1 >= 0) && [value compare: [[array objectAtIndex:newpos-1] performSelector:valueSelector]] == NSOrderedAscending) { // obj < array[newpos-1] newpos = newpos - 1; } } // if a new position has been found, move it! if (newpos != pos) { [array insertObject:obj atIndex:newpos]; if (pos > newpos) pos++; [array removeObjectAtIndex:pos]; } } int delta_d_ctr; int delta_d_tctr; double delta_d_time; double delta_d_time0; NSDate *delta_d_t0; - (NSUInteger)indexOfFirstObjectNotBeforeValue:(id)value { int lo, hi, pivot, cnt; lo = 0; pivot = -1; // to force the final test if the while doesn't execute cnt = [array count]; hi = cnt - 1; // delta_d_t0 = [NSDate new]; while (hi > lo) { pivot = (hi + lo) / 2; if ([value compare:[[array objectAtIndex:pivot] performSelector:valueSelector]] == NSOrderedDescending) // value > array[pivot] lo = pivot+1; else hi = pivot; // delta_d_ctr++; } // delta_d_time -= [delta_d_t0 timeIntervalSinceNow]; // [delta_d_t0 release]; // delta_d_tctr++; // if ((delta_d_tctr%1000)==999) // NSLog(@"DELTA_D %d %d %f %f", delta_d_tctr, delta_d_ctr, delta_d_time, delta_d_time0); if (lo != pivot && lo < cnt && [value compare:[[array objectAtIndex:lo] performSelector:valueSelector]] == NSOrderedDescending) // v>a[lo] return lo+1; else return lo; } - (NSUInteger)indexOfFirstObjectAfterValue:(id)value { if (value == nil) { return 0; } unsigned index = [self indexOfFirstObjectNotBeforeValue:value]; while (index < [array count]) { id arrValue; arrValue = [[array objectAtIndex:index] performSelector:valueSelector]; if ([value compare:arrValue] == NSOrderedAscending) { // v)value; { if (value == nil) { return 0; } int index = [self indexOfFirstObjectNotBeforeValue:value]; while (index >= 0) { id arrValue; if (index == 0) { return NSNotFound; } index --; arrValue = [[array objectAtIndex:index] performSelector:valueSelector]; if ([value compare:arrValue] == NSOrderedDescending) { // v>a[i] break; } } return index; } - (NSUInteger)indexOfLastObjectNotAfterValue:(id)value { int index = [self indexOfFirstObjectAfterValue:value]; if (index == 0) { return NSNotFound; } return index - 1; } - (NSUInteger)indexOfObjectWithValue:(id)value { unsigned index = [self indexOfFirstObjectNotBeforeValue:value]; if (index < [array count]) { id arrValue; arrValue = [[array objectAtIndex:index] performSelector:valueSelector]; if ([value compare:arrValue] == NSOrderedSame) { return index; } } return NSNotFound; } - (NSUInteger)indexOfObject:(id)anObject { return [self indexOfObjectWithValue:[anObject performSelector:valueSelector]]; } - (NSEnumerator *)reverseObjectEnumeratorWithRange:(NSRange)range { return [array reverseObjectEnumeratorWithRange:range]; } - (NSEnumerator *)objectEnumerator { return [array objectEnumerator]; } - (NSEnumerator *)reverseObjectEnumerator { return [array reverseObjectEnumerator]; } - (NSEnumerator *)objectEnumeratorAfterValue:(id)value { unsigned firstIndex; NSRange range; firstIndex = [self indexOfFirstObjectAfterValue:value]; range = NSMakeRange(firstIndex, [array count] - firstIndex); return [array objectEnumeratorWithRange:range]; } - (NSEnumerator *)objectEnumeratorNotAfterValue:(id)value { unsigned lastIndex; NSRange range; lastIndex = [self indexOfFirstObjectAfterValue:value]; range = NSMakeRange(0, lastIndex); return [array objectEnumeratorWithRange:range]; } - (NSEnumerator *)objectEnumeratorNotBeforeValue:(id)value { unsigned firstIndex; NSRange range; firstIndex = [self indexOfFirstObjectNotBeforeValue:value]; range = NSMakeRange(firstIndex, [array count] - firstIndex); return [array objectEnumeratorWithRange:range]; } - (NSEnumerator *)objectEnumeratorNotBeforeValue:(id)value1 notAfterValue:(id)value2 { NSUInteger firstIndex; NSUInteger lastIndex; NSRange range; lastIndex = [self indexOfLastObjectNotAfterValue:value2]; if (lastIndex == NSNotFound) { return nil; } firstIndex = [self indexOfFirstObjectNotBeforeValue:value1]; range = NSMakeRange(firstIndex, lastIndex - firstIndex + 1); return [array objectEnumeratorWithRange:range]; } - (NSEnumerator *)objectEnumeratorAfterValue:(id)value1 notAfterValue:(id)value2 { NSUInteger firstIndex; NSUInteger lastIndex; NSRange range; lastIndex = [self indexOfLastObjectNotAfterValue:value2]; if (lastIndex == NSNotFound) { return nil; } firstIndex = [self indexOfFirstObjectAfterValue:value1]; range = NSMakeRange(firstIndex, lastIndex - firstIndex + 1); return [array objectEnumeratorWithRange:range]; } - (NSEnumerator *)reverseObjectEnumeratorAfterValue:(id)value { unsigned firstIndex; NSRange range; firstIndex = [self indexOfFirstObjectAfterValue:value]; range = NSMakeRange(firstIndex, [array count] - firstIndex); return [array reverseObjectEnumeratorWithRange:range]; } - (NSEnumerator *)reverseObjectEnumeratorNotBeforeValue:(id)value { unsigned firstIndex; NSRange range; firstIndex = [self indexOfFirstObjectNotBeforeValue:value]; range = NSMakeRange(firstIndex, [array count] - firstIndex); return [array reverseObjectEnumeratorWithRange:range]; } // NSCoding Protocol - (void)encodeWithCoder:(NSCoder *)coder { // [super encodeWithCoder:coder]; [coder encodeObject:array]; [coder encodeValueOfObjCType:@encode(SEL) at:&valueSelector]; } - (id)initWithCoder:(NSCoder *)coder { self = [super init];//WithCoder:coder]; array = [[coder decodeObject] retain]; [coder decodeValueOfObjCType:@encode(SEL) at:&valueSelector]; return self; } // NSCopying Protocol - (id)copyWithZone:(NSZone *)zone { PSortedArray *copy; copy = [[[self class] alloc] init]; if (copy != nil) { copy->valueSelector = valueSelector; copy->array = [array copy]; } return copy; } - (NSString *)description { return [array description]; } @end Paje-1.98/General/SourceTextViewer.nib/0000775000175000017500000000000011674062007017670 5ustar schnorrschnorrPaje-1.98/General/SourceTextViewer.nib/keyedobjects.nib0000664000175000017500000001356711674062007023051 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 156<=AEKSi|}(0149:?@DIJOPS\rsvy|tF   !e./01234569<?U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRootjtuksvlC234[NSClassName_SourceTextController789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FJGHI 0@LMNOPQ0]NSDestinationWNSLabelXNSSource ./TUVWXYZ[\]^__abc.efgh[NSFrameSize_NSNextResponder[NSSuperviewXNSMinize\NSSharedDataYNSMaxSizeZNSDelegateYNSTVFlagsXNSvFlags_NSTextContainer ,+ - jUVklmnop\qrrOuOwxyz{ZNSSubviews]NSNextKeyViewYNSBGColorYNSDocViewYNScvFlagsXNSCursorWNSFrameTRR  VU YY{463, 14}~OWNSWidthZNSTextView_NSLayoutManagerYNSTCFlags"C Ze.]NSTextStorageYNSLMFlags_NSTextContainersZ.XNSStringYNS.stringP78;_NSMutableString78;_NSMutableAttributedString_NSAttributedString>Jh 78;^NSMutableArrayWNSArray78;78]];..u_NSSelectedAttributesWNSFlags_NSDefaultParagraphStyle_NSInsertionColor_NSLinkAttributes_NSMarkedAttributes_NSBackgroundColor+e%*WNSWhite\NSColorSpaceB178â;WNSColorB0>WNS.keysˀ"΀$e[NSColorName]NSCatalogName! VSystem_selectedTextBackgroundColorK0.66666669e#_selectedTextColor78;\NSDictionary>Ϣ()&'$[NSUnderlineUNSRGBF0 0 178;_NSTextViewSharedData\{468, 1e+07}X{114, 0}78;[%NSTextViewVNSTextVNSView[NSResponderXtextView78;_NSNibOutletConnector^NSNibConnectorLMNQ01?/UVp\     YNSEnabledVNSCell223  >4jUp.Icd_{{423, 330}, {50, 22}} !" %&'[NSTextColorYNSSupportZNSContents]NSControlView_NSDrawsBackground[NSCellFlags\NSCellFlags29;651 =qA@)*+,-./VNSSizeVNSNameXNSfFlags"AP78\LucidaGrande78233;VNSFontu6e:_textBackgroundColor<e<YtextColor78ABBC ;_NSTextFieldCell\NSActionCell78EFFGH;[NSTextField\%NSTextFieldYNSControl_lineNumberFieldLMN0LMAB1_lineNumberChanged78QRR;_NSNibControlConnector>T[U rOZD21R Ji]^_`abcYdef/ghijklm opq_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRect\NSWindowViewYNSWTFlags[NSViewClassfFGEeg2pxhH_{{361, 264}, {480, 360}}tVWindowwXNSWindowzTView>}JZrJ1RUVp\    22K >L_{{388, 332}, {30, 17}}!Z%NP6MJ=@TLinee!O\controlColoreQ_controlTextColorjUTVk\  __[NSHScrollerXNSsFlags[NSVScroller]NSContentViewS2a2 ^Z b>J_ Z^>JO _{{1, 1}, {463, 320}}YNSHotSpot\NSCursorTypeWXW{4, -5}78oo;78Ť;ZNSClipViewUVp\rrrZNSCurValueXNSTargetXNSActionRR"?R[]\_{{464, 1}, {15, 306}}\_doScroller:78֥H;ZNSScrollerUVp\rrrYNSPercentRRR_]"?rC`_{{-100, -100}, {87, 18}}Z{480, 322}78;\NSScrollView_{{1, 9}, {480, 360}}78;_{{0, 0}, {1280, 938}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78;_NSWindowTemplate78;>[0U  r D22R2i>[UrO0ZD1R Ji>[ mnopqri]NSScrollView2\File's Owner\NSTextField2>[i>[i>[ GZ0UOrHI21 JD R0@i>"[#$%&()*+,wxyz({|}~i     >7J>:[i>=[i78@AA;^NSIBObjectData#,1:LQVdfqw 'CPcjx-6?JO^gz1=O[dq{&/79;=?ACEGILNXmu    !#,3ENWs5H[p   $0>@BDFMkx    $ ) @ M V _ l x         " $ & 7 9 ; = ? X }    ! # % ( 5 > C J _ a c e g }   1 3 5 7 9 M V ] u ~   # 0 = G S U W Y [ ] _ a c h j l 79;=?ACHMRgikmo|  (/1357@CEG^ku  #09DOx"?HM`inw  #8:<>@BDFHJLNWlnprtvxz|~BPaje-1.98/General/SourceTextViewer.nib/info.nib0000664000175000017500000000070311674062007021315 0ustar schnorrschnorr IBDocumentLocation 69 62 356 240 0 0 1280 938 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/General/SourceTextViewer.nib/classes.nib0000664000175000017500000000060311674062007022016 0ustar schnorrschnorr{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {lineNumberChanged = id; }; CLASS = SourceTextController; LANGUAGE = ObjC; OUTLETS = {lineNumberField = NSTextField; textView = NSTextView; }; SUPERCLASS = NSObject; } ); IBVersion = 1; }Paje-1.98/General/Comparing.m0000664000175000017500000000256011674062007015732 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* Comparing.m created by benhur on Thu 21-Aug-1997 */ #include "Comparing.h" @implementation NSNumber (Comparing) - (BOOL)isDifferent:(id)obj { return ([self compare:obj] != NSOrderedSame); } - (BOOL)isGreaterThan:(id)obj { return ([self compare:obj] == NSOrderedDescending); } - (BOOL)isLessThan:(id)obj { return ([self compare:obj] == NSOrderedAscending); } - (BOOL)isGreaterOrEqual:(id)obj { return ([self compare:obj] != NSOrderedAscending); } - (BOOL)isLessOrEqual:(id)obj { return ([self compare:obj] != NSOrderedDescending); } @end Paje-1.98/General/NSColor+Additions.m0000664000175000017500000000344011674062007017242 0ustar schnorrschnorr/* Copyright (c) 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "NSColor+Additions.h" @implementation NSColor (Additions1) - (NSColor *)contrastingWhiteOrBlackColor { NSColor *bw; float wc; NSColor *ret; bw = [self colorUsingColorSpaceName:NSCalibratedWhiteColorSpace]; wc = [bw whiteComponent]; if (wc > .5) { //ret = [NSColor blackColor]; ret = [NSColor colorWithCalibratedWhite:0.15 alpha:1.0]; } else { //ret = [NSColor whiteColor]; ret = [NSColor colorWithCalibratedWhite:0.85 alpha:1.0]; } return ret; } @end #ifndef GNUSTEP @implementation NSColor (Additions2) + (NSColor *)colorFromString:(NSString *)value { if ([value isKindOfClass:[NSString class]]) { NSScanner *scanner = [NSScanner scannerWithString:value]; float r, g, b; if ([scanner scanFloat: &r] && [scanner scanFloat: &g] && [scanner scanFloat: &b]){ return [NSColor colorWithDeviceRed:r green:g blue:b alpha:1]; } } NSLog (@"input=%@ output=%@", value, nil); return nil; } @end #endif Paje-1.98/General/SourceTextController.h0000664000175000017500000000332211674062007020154 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SourceTextController_h_ #define _SourceTextController_h_ // // SourceTextController // // Shows a source file; can select lines and highlights events // caused by a line when it is selected. // controller and delegate of the textView that shows the source file // #include @interface SourceTextController : NSObject { IBOutlet NSTextView *textView; IBOutlet NSTextField *lineNumberField; NSString *filename; } + (SourceTextController *)controllerForFilename:(NSString *)name; - (id)initWithFilename:(NSString*)name; - (void)selectLineNumber:(unsigned)lineNumber; - (IBAction)lineNumberChanged:(id)sender; // This delegate method is called when the selection is about to change // (and whenever the textView is clicked on). - (NSRange)textView:(NSTextView *)aTextView willChangeSelectionFromCharacterRange:(NSRange)oldRange toCharacterRange:(NSRange)newRange; @end #endif Paje-1.98/General/TranslationTable.h0000664000175000017500000000360711674062007017257 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _TranslationTable_h_ #define _TranslationTable_h_ // TranslationTable // // has elements of type , both integers. // index is sequential, starting at 0. it's the order of insertion // in the table. // value is any number. // has methods to return a value, given an index (like an array) // and to return the index of a given value. #include #include @interface TranslationTable: NSObject { NSMutableArray *table; // to map from indexes to values NSMutableDictionary *map; // to map from values to indexes // change to NSMapTable when it exists. } // Initializing + (TranslationTable *)translationTable; - (id)init; // Querying - (NSUInteger)count; - (NSUInteger)indexOfValue:(id)value; - (id)valueAtIndex:(NSUInteger)index; // Adding Elements - (NSUInteger)addValue:(id)value; // returns index of element // doesn't insert if already exists // NSCoding Protocol - (void)encodeWithCoder:(NSCoder *)coder; - (id)initWithCoder:(NSCoder *)coder; @end #endif Paje-1.98/General/CondensedEntitiesArray.m0000664000175000017500000001021411674062007020414 0ustar schnorrschnorr/* Copyright (c) 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "CondensedEntitiesArray.h" #include "Association.h" #include "Macros.h" @implementation CondensedEntitiesArray + (CondensedEntitiesArray *)array { return [[[self alloc] init] autorelease]; } - (id)init { self = [super init]; if (self != nil) { array = [[NSMutableArray alloc] init]; sorted = YES; totalDuration = 0; } return self; } - (void)dealloc { Assign(array, nil); [super dealloc]; } - (unsigned)count { return [array count]; } - (void)sort { [array sortUsingSelector:@selector(inverseDoubleValueComparison:)]; sorted = YES; } - (id)valueAtIndex:(unsigned)index { if (!sorted) { [self sort]; } return [(Association *)[array objectAtIndex:index] objectValue]; } - (Association *)associationWithValue:(id)value inRange:(NSRange)range { unsigned index; unsigned last; last = NSMaxRange(range); for (index = range.location; index < last; index++) { Association *association; association = [array objectAtIndex:index]; if ([[association objectValue] isEqual:value]) { return association; } } return nil; } // for states - (void)addValue:(id)value duration:(double)duration { Association *association; NSRange range; if (duration == 0) { return; } range = NSMakeRange(0, [array count]); association = [self associationWithValue:value inRange:range]; if (association != nil) { [association addDouble:duration]; } else { association = [Association associationWithObject:value double:duration]; [array addObject:association]; } totalDuration += duration; sorted = NO; } - (double)durationAtIndex:(unsigned)index { if (!sorted) { [self sort]; } return [(Association *)[array objectAtIndex:index] doubleValue]; } // for events - (void)addValue:(id)value count:(unsigned)count { [self addValue:value duration:count]; } - (unsigned)countAtIndex:(unsigned)index { return [self durationAtIndex:index]; } - (void)addArray:(CondensedEntitiesArray *)other { unsigned count; unsigned i; NSRange range; if (other == nil) { return; } range = NSMakeRange(0, [array count]); count = [other count]; for (i = 0; i < count; i++) { id value; double duration; Association *association; value = [other valueAtIndex:i]; duration = [other durationAtIndex:i]; association = [self associationWithValue:value inRange:range]; if (association != nil) { [association addDouble:duration]; } else { association = [Association associationWithObject:value double:duration]; [array addObject:association]; } } totalDuration += [other totalDuration]; sorted = NO; } - (double)totalDuration { return totalDuration; } // NSCoding Protocol - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeValuesOfObjCTypes:"@d", &array, &totalDuration]; } - (id)initWithCoder:(NSCoder *)coder { self = [super init]; if (self != nil) { [coder decodeValuesOfObjCTypes:"@d", &array, &totalDuration]; sorted = NO; } return self; } @end Paje-1.98/General/EntityChunk.h0000664000175000017500000000733011674062007016253 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _EntityChunk_h_ #define _EntityChunk_h_ // // EntityChunk // // contains entities of a type in a container in a slice of time // (this is an abstract class, concrete subclasses are in PajeSimulator) // // Author: Edmar Pessoa Arajo Neto // #include #include "PajeEntity.h" #include "PajeType.h" #include "PajeContainer.h" #include "PSortedArray.h" @interface EntityChunk : NSObject // { PajeContainer *container; PajeEntityType *entityType; NSDate *startTime; NSDate *endTime; enum { loading, frozen, empty, reloading } chunkState; PSortedArray *entities; NSArray *incompleteEntities; // for LRU list of chunks EntityChunk *prev; EntityChunk *next; } // chunk has been touched -- move it to head of list + (void)touch:(EntityChunk *)chunk; + (void)emptyLeastRecentlyUsedChunks; - (id)initWithEntityType:(PajeEntityType *)type container:(PajeContainer *)pc; - (void)dealloc; /* * Accessors */ - (PajeContainer *)container; - (PajeEntityType *)entityType; - (void)setStartTime:(NSDate *)time; - (NSDate *)startTime; - (void)setEndTime:(NSDate *)time; - (NSDate *)endTime; /* * Accessing chunk state */ // can receive more entities - (BOOL)isActive; // cannot receive more entities; can be enumerated - (BOOL)isFull; // chunk with entities removed - (BOOL)isZombie; - (BOOL)canEnumerate; - (BOOL)canInsert; /* * Changing chunk state */ // sent to a zombie to refill it - (void)activate; // sent to an active chunk to make it full - (void)freeze; // sent to a full chunk to empty it (make a zombie) - (void)empty; /* * entity enumerators (must be in reverse [-endTime] order) */ // auxiliary methods used when creating enumerators - (PSortedArray *)completeEntities; - (NSArray *)incompleteEntities; - (void)setIncompleteEntities:(NSArray *)array; // only entities that finish inside the chunk's time boundaries - (NSEnumerator *)enumeratorOfAllCompleteEntities; //- (NSEnumerator *)enumeratorOfCompleteEntitiesAfterTime:(NSDate *)time; - (NSEnumerator *)enumeratorOfCompleteEntitiesFromTime:(NSDate *)time; // all entities, including those that finish after the chunk's endTime - (NSEnumerator *)enumeratorOfAllEntities; - (NSEnumerator *)enumeratorOfEntitiesBeforeTime:(NSDate *)time; - (NSEnumerator *)enumeratorOfEntitiesFromTime:(NSDate *)sliceStartTime toTime:(NSDate *)sliceEndTime; // only completed entities, in non-reverse order // include entities that end on those times. - (NSEnumerator *)fwEnumeratorOfAllCompleteEntities; - (NSEnumerator *)fwEnumeratorOfCompleteEntitiesFromTime:(NSDate *)time; - (NSEnumerator *)fwEnumeratorOfCompleteEntitiesUntilTime:(NSDate *)time; - (NSEnumerator *)fwEnumeratorOfCompleteEntitiesFromTime:(NSDate *)start untilTime:(NSDate *)end; - (int)entityCount; - (id)lastEntity; - (void)addEntity:(PajeEntity *)entity; @end #endif Paje-1.98/General/FilteredEnumerator.m0000664000175000017500000000423711674062007017616 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* FilteredEnumerator.m created by benhur on Sat 14-Jun-1997 */ #include "FilteredEnumerator.h" @implementation FilteredEnumerator + (FilteredEnumerator *)enumeratorWithEnumerator:(NSEnumerator *)orgEnum filter:(id)f selector:(SEL)sel context:(id)c; { return [[[self alloc] initWithEnumerator:orgEnum filter:f selector:sel context:c] autorelease]; } - (id)initWithEnumerator:(NSEnumerator *)orgEnum filter:(id)f selector:(SEL)sel context:(id)c { self = [super init]; if (self) { originalEnumerator = [orgEnum retain]; filter = [f retain]; selector = sel; context = [c retain]; } return self; } - (void)dealloc { [originalEnumerator release]; [filter release]; [context release]; [super dealloc]; } - (id)nextObject { id obj; while (YES) { obj = [originalEnumerator nextObject]; if (obj == nil) break; obj = [filter performSelector:selector withObject:obj withObject:context]; if (obj != nil) break; } return obj; } @end Paje-1.98/General/MultiEnumerator.h0000664000175000017500000000256711674062007017151 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _MultiEnumerator_h_ #define _MultiEnumerator_h_ // // MultiEnumerator // // an enumerator that enumerates the objects of many enumerators, serially // #include @interface MultiEnumerator : NSEnumerator { NSMutableArray *origEnums; } + (MultiEnumerator *)enumeratorWithEnumeratorArray:(NSArray *)array; + (MultiEnumerator *)enumeratorWithEnumerator:(NSEnumerator *)en; + (MultiEnumerator *)enumerator; - (id)initWithEnumeratorArray:(NSArray *)array; - (void)addEnumerator:(NSEnumerator *)enumerator; - (id)nextObject; @end #endif Paje-1.98/General/NSMatrix+Additions.m0000664000175000017500000000574511674062007017442 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "NSMatrix+Additions.h" @implementation NSMatrix (NSDraggingDestination) - (NSDragOperation)draggingEntered:(id )sender { id del = [self delegate]; SEL sel = @selector(matrix:draggingEntered:); if (del && [del respondsToSelector:sel]) return [del matrix:self draggingEntered:sender]; else return NSDragOperationNone;//[super draggingEntered:sender]; } - (NSDragOperation)draggingUpdated:(id )sender { id del = [self delegate]; SEL sel = @selector(matrix:draggingUpdated:); if (del && [del respondsToSelector:sel]) return [del matrix:self draggingUpdated:sender]; else return NSDragOperationNone;//[super draggingUpdated:sender]; } - (void)draggingExited:(id )sender { id del = [self delegate]; SEL sel = @selector(matrix:draggingExited:); if (del && [del respondsToSelector:sel]) [del matrix:self draggingExited:sender]; else return;//[super draggingExited:sender]; } - (BOOL)prepareForDragOperation:(id )sender { id del = [self delegate]; SEL sel = @selector(matrix:prepareForDragOperation:); if (del && [del respondsToSelector:sel]) return [del matrix:self prepareForDragOperation:sender]; else return NO;//[super prepareForDragOperation:sender]; } - (BOOL)performDragOperation:(id )sender { id del = [self delegate]; SEL sel = @selector(matrix:performDragOperation:); if (del && [del respondsToSelector:sel]) return [del matrix:self performDragOperation:sender]; else return NO;//[super performDragOperation:sender]; } - (void)concludeDragOperation:(id )sender { id del = [self delegate]; SEL sel = @selector(matrix:concludeDragOperation:); if (del && [del respondsToSelector:sel]) [del matrix:self concludeDragOperation:sender]; else return;//[super concludeDragOperation:sender]; } @end @implementation NSMatrix (Additions) - (id)cellAtPoint:(NSPoint)p { NSInteger row, column; if ([self getRow:&row column:&column forPoint:p]) return [self cellAtRow:row column:column]; return nil; } @end Paje-1.98/General/CStringCallBacks.h0000664000175000017500000000201711674062007017114 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _CStringCallbacks_h_ #define _CStringCallbacks_h_ #include #include extern NSMapTableKeyCallBacks CStringMapKeyCallBacks; extern NSHashTableCallBacks CStringHashCallBacks; #endif Paje-1.98/General/CondensedEntitiesArray.h0000664000175000017500000000311111674062007020405 0ustar schnorrschnorr/* Copyright (c) 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _CondensedEntitiesArray_h_ #define _CondensedEntitiesArray_h_ /* CondensedEntitiesArray * ---------------------- * Store an array of names and durations sorted by decreasing duration */ #include @interface CondensedEntitiesArray : NSObject { NSMutableArray *array; double totalDuration; BOOL sorted; } + (CondensedEntitiesArray *)array; - (id)init; - (void)dealloc; - (unsigned)count; - (id)valueAtIndex:(unsigned)index; // for states - (void)addValue:(id)value duration:(double)duration; - (double)durationAtIndex:(unsigned)index; // for events - (void)addValue:(id)value count:(unsigned)count; - (unsigned)countAtIndex:(unsigned)index; - (double)totalDuration; - (void)addArray:(CondensedEntitiesArray *)other; @end #endif Paje-1.98/General/NSDate+Additions.h0000664000175000017500000000245711674062007017043 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _NSDate_Additions_h_ #define _NSDate_Additions_h_ // NSDate+Additions.h // some utility methods for comparing NSDates. // change description of dates to only show seconds, #include #include "Comparing.h" @interface NSDate (Comparision) - (BOOL)isEarlierThanDate:(NSDate *)otherDate; - (BOOL)isLaterThanDate:(NSDate *)otherDate; @end @interface NSDate (AltDescription) - (NSString *)description; - (NSString *)descriptionWithLocale:(NSDictionary *)locale; @end #endif Paje-1.98/General/ChunkArray.h0000664000175000017500000000342311674062007016054 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _ChunkArray_h_ #define _ChunkArray_h_ // // ChunkArray // // contains an array of EntityChunks, sorted by time // can enumerate entities that lay in a time interval // // Author: Edmar Pessoa Arajo Neto // #include "PSortedArray.h" #include "EntityChunk.h" @interface ChunkArray : NSObject { PSortedArray *chunks; int firstIndex; } - (id)init; - (void)dealloc; // enumerate all entities that end after startTime and start before endTime, // in reverse endTime order. - (NSEnumerator *)enumeratorOfEntitiesFromTime:(NSDate *)startTime toTime:(NSDate *)endTime; // enumerate all entities that end after startTime and not after endTime, // in increasing endTime order. - (NSEnumerator *)enumeratorOfCompleteEntitiesFromTime:(NSDate *)startTime untilTime:(NSDate *)endTime; - (void)addChunk:(EntityChunk *)chunk; - (EntityChunk *)chunkAtIndex:(int)index; - (void)setFirstIndex:(int)index; @end #endif Paje-1.98/General/PajeType.h0000664000175000017500000001103611674062007015525 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeType_h_ #define _PajeType_h_ // // PajeType // // represents the type of (user created) entities and containers // #include #include "Protocols.h" #include "PajeEvent.h" @class PajeContainerType; @interface PajeEntityType : NSObject { NSString *ident; /* unique identification of this type */ NSString *description; /* description of the type, usually the name */ PajeContainerType *containerType; NSColor *color; NSMutableSet *fieldNames; NSHashTable *knownEventTypes; } + (PajeEntityType *)typeWithId:(NSString *)i description:(NSString *)d containerType:(PajeContainerType *)type event:(PajeEvent *)e; - (id)initWithId:(NSString *)i description:(NSString *)d containerType:(PajeContainerType *)type event:(PajeEvent *)e; - (BOOL)isContainer; - (NSString *)ident; - (PajeContainerType *)containerType; - (PajeDrawingType)drawingType; - (NSColor *)colorForValue:(id)value; - (void)setColor:(NSColor*)color forValue:(id)value; - (NSColor *)color; - (void)setColor:(NSColor*)color; - (NSArray *)allValues; - (double)minValue; - (double)maxValue; - (id)valueOfFieldNamed:(NSString *)n; - (BOOL)isKnownEventType:(const char *)type; - (void)addFieldNames:(NSArray *)names; - (NSArray *)fieldNames; - (NSComparisonResult)compare:(id)other; @end @interface PajeContainerType : PajeEntityType { NSMutableArray *allInstances; NSMapTable *idToInstance; NSMutableArray *containedTypes; } + (PajeContainerType *)typeWithId:(NSString *)i description:(NSString *)d containerType:(PajeContainerType *)type event:(PajeEvent *)e; - (void)addInstance:(PajeContainer *)container id1:(const char *)id1 id2:(const char *)id2; - (PajeContainer *)instanceWithId:(const char *)containerId; - (NSArray *)allInstances; - (void)addContainedType:(PajeEntityType *)type; - (NSArray *)containedTypes; @end @interface PajeCategorizedEntityType : PajeEntityType { NSMapTable *aliasToValue; NSMutableDictionary *valueToColor; } - (void)setValue:(id)value alias:(const char *)alias; - (void)setValue:(id)value alias:(const char *)alias color:(id)c; - (id)valueForAlias:(const char *)alias; - (NSArray *)allValues; - (NSColor *)colorForValue:(id)value; - (void)setColor:(NSColor*)color forValue:(id)value; - (void)readDefaultColors; @end @interface PajeEventType : PajeCategorizedEntityType - (PajeDrawingType)drawingType; @end @interface PajeStateType : PajeCategorizedEntityType - (PajeDrawingType)drawingType; @end @interface PajeVariableType : PajeEntityType { double minValue; double maxValue; } - (PajeDrawingType)drawingType; - (void)possibleNewMinValue:(double)value; - (void)possibleNewMaxValue:(double)value; - (double)minValue; - (double)maxValue; @end @interface PajeLinkType : PajeCategorizedEntityType { PajeContainerType *sourceContainerType; // not retained PajeContainerType *destContainerType; // not retained } + (PajeLinkType *)typeWithId:(id)i description:(id)d containerType:(PajeContainerType *)type sourceContainerType:(PajeContainerType *)sourceType destContainerType:(PajeContainerType *)destType event:(PajeEvent *)e; - (id)initWithId:(id)i description:(id)d containerType:(PajeContainerType *)type sourceContainerType:(PajeContainerType *)sourceType destContainerType:(PajeContainerType *)destType event:(PajeEvent *)e; - (PajeContainerType *)sourceContainerType; - (PajeContainerType *)destContainerType; - (PajeDrawingType)drawingType; @end #endif Paje-1.98/General/NSDictionary+Additions.m0000664000175000017500000000253711674062007020277 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "NSDictionary+Additions.h" #include @implementation NSMutableDictionary (PajeAdditions) - (void)addObject:(id)object forKey:(id)key { NSMutableArray *array = [self objectForKey:key]; if (!array) { [self setObject:[NSMutableArray arrayWithObject:object] forKey:key]; } else if (![array isKindOfClass:[NSMutableArray class]]) { [self setObject:[NSMutableArray arrayWithObjects:array, object, nil] forKey:key]; } else { [array addObject:object]; } } @end Paje-1.98/General/PajeContainer.h0000664000175000017500000000371411674062007016532 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeContainer_h_ #define _PajeContainer_h_ // // PajeContainer // // superclass for containers // #include #include "PajeEntity.h" @interface PajeContainer : PajeEntity { NSMutableArray *subContainers; } + (PajeContainer *)containerWithType:(id)type name:(NSString *)n container:(PajeContainer *)newcontainer; - (BOOL)isContainer; - (NSString *)alias; - (void)addSubContainer:(PajeContainer *)subcontainer; - (NSArray *)subContainers; - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)type fromTime:(NSDate *)start toTime:(NSDate *)end; - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)type fromTime:(NSDate *)start toTime:(NSDate *)end; - (double)minValueForEntityType:(PajeEntityType *)type; - (double)maxValueForEntityType:(PajeEntityType *)type; - (void)verifyMinMaxOfEntityType:(PajeEntityType *)type withValue:(double)value; @end #endif Paje-1.98/General/ChunkArray.m0000664000175000017500000001561111674062007016063 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "ChunkArray.h" #include "MultiEnumerator.h" #include "Macros.h" #include "PajeEntity.h" @implementation ChunkArray - (id)init { self = [super init]; if (self != nil) { chunks = [[PSortedArray alloc] initWithSelector:@selector(startTime)]; } return self; } - (void)dealloc { Assign(chunks, nil); [super dealloc]; } - (void)raiseMissingChunk:(int)chunkNumber { NSDictionary *userInfo; userInfo = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:chunkNumber+firstIndex] forKey:@"ChunkNumber"]; [[NSException exceptionWithName:@"PajeMissingChunkException" reason:nil userInfo:userInfo] raise]; // [[NSNotificationCenter defaultCenter] postNotificationName:@"PajeChunkNotInMemoryNotification" object:self userInfo:userInfo]; } // enumerate all entities that end after startTime and start before endTime, // in reverse endTime order. - (NSEnumerator *)enumeratorOfEntitiesFromTime:(NSDate *)startTime toTime:(NSDate *)endTime { NSUInteger startIndex; NSUInteger endIndex; int index; MultiEnumerator *multiEnum; EntityChunk *chunk; int chunkCount; chunkCount = [chunks count]; if (chunkCount == 0) { return nil; } // chunks are ordered by startTime, and each contains all entities that // end inside its time boundaries (after its startTime and not after // its endTime (plus incomplete entities, that cross its endTime border)). // startIndex and endIndex are the indexes of the first and last chunks // that may contain the entities we are interested in. endIndex = [chunks indexOfLastObjectBeforeValue:endTime]; if (endIndex == NSNotFound) { // no chunk starts before endTime return nil; } startIndex = [chunks indexOfLastObjectNotAfterValue:startTime]; if (startIndex == NSNotFound) { // all chunks start after startTime startIndex = 0; } if (startIndex > endIndex) { startIndex = endIndex; } chunk = [chunks objectAtIndex:endIndex]; if (![chunk isFull]) { [self raiseMissingChunk:endIndex]; } if (startIndex == endIndex) { // all entities are in one chunk. return [chunk enumeratorOfEntitiesFromTime:startTime toTime:endTime]; } // there are multiple chunks involved -- // get complete and incomplete entities from last chunk, // all complete entities from intermediary chunks // and some (those that end after startTime) complete entities // from first chunk. multiEnum = [MultiEnumerator enumerator]; [multiEnum addEnumerator:[chunk enumeratorOfEntitiesBeforeTime:endTime]]; for (index = endIndex - 1; index > startIndex; index--) { chunk = [chunks objectAtIndex:index]; if (![chunk isFull]) { [self raiseMissingChunk:index]; } [multiEnum addEnumerator:[chunk enumeratorOfAllCompleteEntities]]; } chunk = [chunks objectAtIndex:startIndex]; if (![chunk isFull]) { [self raiseMissingChunk:startIndex]; } [multiEnum addEnumerator: [chunk enumeratorOfCompleteEntitiesFromTime:startTime]]; return multiEnum; } // enumerate all entities that end after startTime and not after endTime, // in increasing endTime order. - (NSEnumerator *)enumeratorOfCompleteEntitiesFromTime:(NSDate *)startTime untilTime:(NSDate *)endTime { NSUInteger startIndex; NSUInteger endIndex; int index; MultiEnumerator *multiEnum; EntityChunk *chunk; int chunkCount; chunkCount = [chunks count]; if (chunkCount == 0) { return nil; } // chunks are in startTime order endIndex = [chunks indexOfLastObjectBeforeValue:endTime]; if (endIndex == NSNotFound) { // no chunk starts before endTime return nil; } startIndex = [chunks indexOfLastObjectNotAfterValue:startTime]; if (startIndex == NSNotFound) { // all chunks start after startTime startIndex = 0; } if (startIndex > endIndex) { startIndex = endIndex; } chunk = [chunks objectAtIndex:startIndex]; if (![chunk isFull]) { [self raiseMissingChunk:startIndex]; } if (startIndex == endIndex) { // all entities are in one chunk. return [chunk fwEnumeratorOfCompleteEntitiesFromTime:startTime untilTime:endTime]; } // there are multiple chunks involved -- get complete and incomplete // entities from last chunk, all complete from intermediary chunks and some // complete entities from first chunk. // there are multiple chunks involved -- // get some (those that end after startTime) complete entities // from first chunk, // all complete entities from intermediary chunks // and entities that end up to endTime from last chunk. multiEnum = [MultiEnumerator enumerator]; [multiEnum addEnumerator: [chunk fwEnumeratorOfCompleteEntitiesFromTime:startTime]]; for (index = startIndex + 1; index < endIndex; index++) { chunk = [chunks objectAtIndex:index]; if (![chunk isFull]) { [self raiseMissingChunk:index]; } [multiEnum addEnumerator:[chunk fwEnumeratorOfAllCompleteEntities]]; } chunk = [chunks objectAtIndex:endIndex]; if (![chunk isFull]) { [self raiseMissingChunk:endIndex]; } [multiEnum addEnumerator: [chunk fwEnumeratorOfCompleteEntitiesUntilTime:endTime]]; return multiEnum; } - (void)addChunk:(EntityChunk *)chunk { [chunks addObject:chunk]; } - (void)setFirstIndex:(int)index { firstIndex = index; } - (EntityChunk *)chunkAtIndex:(int)index { int indexInArray = index - firstIndex; if (indexInArray < 0 || indexInArray >= [chunks count]) { return nil; } return [chunks objectAtIndex:indexInArray]; } @end Paje-1.98/General/NSString+Additions.m0000664000175000017500000001561111674062007017435 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "NSString+Additions.h" @implementation NSString (Additions) + (NSString *)stringWithCharacter:(unichar)c { return [NSString stringWithCharacters:&c length:1]; } + (NSString *)stringWithFormattedNumber:(double)n { static char *p = "TGMk m\xb5np"; int i = 4; BOOL neg = (n < 0); if (neg) n = -n; if (n < 1e-12) return neg ? @"-0" : @"0"; if (n > 999e12) return neg ? @"-Inf" : @"Inf"; while (n < 1) { n *= 1000; i++; } while (n > 1000) { n /= 1000; i--; } if (n < 10) return [NSString stringWithFormat:@"%s%.1f%c", neg?"-":"", n, p[i]]; return [NSString stringWithFormat:@"%s%d%c", neg?"-":"", (int)n, p[i]]; } #define UNICHAR_BUFF_SIZE 1024 // Adapted from Mike Ferris' TextExtras - (NSRange)rangeForLineNumber:(unsigned)lineNumber { NSUInteger curLineNum = 1; NSUInteger startCharIndex = NSNotFound; unichar buff[UNICHAR_BUFF_SIZE]; unsigned i = 0, buffCount = 0; NSRange searchRange = NSMakeRange(0, [self length]); // Returned range should start at beginning of lineNumber // and end at beginning of lineNumber+1. if (lineNumber < 1) lineNumber = 1; if (lineNumber == 1) startCharIndex = 0; while (searchRange.length > 0) { buffCount = MIN(searchRange.length, UNICHAR_BUFF_SIZE); [self getCharacters:buff range:NSMakeRange(searchRange.location, buffCount)]; // We're counting paragraph separators here. We want to notice when // we hit lineNum and remember where the starting char index is. We // also want to notice when we reach lineNum+1 and return the result. for (i=0; i < buffCount; i++) { if (buff[i] == '\n') { curLineNum++; if (curLineNum == lineNumber) startCharIndex = searchRange.location + i + 1; else if (curLineNum == (lineNumber + 1)) { unsigned charIndex = (searchRange.location + i + 1); return NSMakeRange(startCharIndex, charIndex - startCharIndex); } } } // Skip the search range past the part we just did. searchRange.location += buffCount; searchRange.length -= buffCount; } // If we're here, we didn't find the end of the line number range. // searchRange.location == [string length] at this point. if (startCharIndex == NSNotFound) { // We didn't find the start of the line number range either, so return {EOT, 0}. return NSMakeRange(searchRange.location, 0); } else { // We found the start, so return from there to the end of the text. return NSMakeRange(startCharIndex, searchRange.location - startCharIndex); } } // Adapted from Mike Ferris' TextExtras - (unsigned)lineNumberAtIndex:(unsigned)index { unsigned lineNumber = 1; unichar buff[1024]; unsigned i, buffCount; NSRange searchRange = NSMakeRange(0, MIN(index, [self length])); while (searchRange.length > 0) { buffCount = MIN(searchRange.length, UNICHAR_BUFF_SIZE); [self getCharacters:buff range:NSMakeRange(searchRange.location, buffCount)]; for (i=0; i < buffCount; i++) { if (buff[i] == '\n') lineNumber++; }; // Skip the search range past the part we just did. searchRange.location += buffCount; searchRange.length -= buffCount; }; return lineNumber; } - (NSRange)rangeValue { return NSRangeFromString(self); } + (NSString *)stringWithRange:(NSRange)range { return NSStringFromRange(range); } - (NSString *)stringValue { return self; } @end @implementation NSString (PajeNSStringPositionDrawing) - (void)drawAtLTPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes { [self drawAtPoint:aPoint withAttributes:attributes]; } - (void)drawAtLCPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes { NSSize size = [self sizeWithAttributes:attributes]; NSPoint newPoint = NSMakePoint(aPoint.x, aPoint.y - size.height/2); [self drawAtPoint:newPoint withAttributes:attributes]; } - (void)drawAtLBPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes { NSSize size = [self sizeWithAttributes:attributes]; NSPoint newPoint = NSMakePoint(aPoint.x, aPoint.y - size.height); [self drawAtPoint:newPoint withAttributes:attributes]; } - (void)drawAtCTPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes { NSSize size = [self sizeWithAttributes:attributes]; NSPoint newPoint = NSMakePoint(aPoint.x - size.width/2, aPoint.y); [self drawAtPoint:newPoint withAttributes:attributes]; } - (void)drawAtCCPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes { NSSize size = [self sizeWithAttributes:attributes]; NSPoint newPoint = NSMakePoint(aPoint.x - size.width/2, aPoint.y - size.height/2); [self drawAtPoint:newPoint withAttributes:attributes]; } - (void)drawAtCBPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes { NSSize size = [self sizeWithAttributes:attributes]; NSPoint newPoint = NSMakePoint(aPoint.x - size.width/2, aPoint.y - size.height); [self drawAtPoint:newPoint withAttributes:attributes]; } - (void)drawAtRTPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes { NSSize size = [self sizeWithAttributes:attributes]; NSPoint newPoint = NSMakePoint(aPoint.x - size.width, aPoint.y); [self drawAtPoint:newPoint withAttributes:attributes]; } - (void)drawAtRCPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes { NSSize size = [self sizeWithAttributes:attributes]; NSPoint newPoint = NSMakePoint(aPoint.x - size.width, aPoint.y - size.height/2); [self drawAtPoint:newPoint withAttributes:attributes]; } - (void)drawAtRBPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes { NSSize size = [self sizeWithAttributes:attributes]; NSPoint newPoint = NSMakePoint(aPoint.x - size.width, aPoint.y - size.height); [self drawAtPoint:newPoint withAttributes:attributes]; } @end Paje-1.98/General/EntityDescriptor.h0000664000175000017500000000277311674062007017327 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _EntityDescriptor_h_ #define _EntityDescriptor_h_ // EntityDescriptor // // holds a small description of an entityType // #include #include "Protocols.h" #include "Macros.h" @interface EntityDescriptor : NSObject { NSString *entityType; PajeDrawingType drawingType; } // // Initialisation // + (EntityDescriptor *)descriptorWithEntityType:(NSString *)type drawingType:(PajeDrawingType)drawType; - (id)initWithEntityType:(NSString *)type drawingType:(PajeDrawingType)drawType; - (void)dealloc; // // Accessors // - (NSString *)entityType; - (PajeDrawingType)drawingType; - (NSArray *)allValues; @end #endif Paje-1.98/General/NSColor+Additions.h0000664000175000017500000000213611674062007017236 0ustar schnorrschnorr/* Copyright (c) 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _NSColor_Additions_h_ #define _NSColor_Additions_h_ #include @interface NSColor (Additions1) - (NSColor *)contrastingWhiteOrBlackColor; @end @interface NSColor (Additions2) // GNUstep implements this but does not declares publically + (NSColor *)colorFromString:(NSString *)value; @end #endif Paje-1.98/General/DataScanner.h0000664000175000017500000000254111674062007016170 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _DataScanner_h_ #define _DataScanner_h_ // // DataScanner // // scans an NSData // #include #include "Macros.h" @interface DataScanner : NSObject { NSData *data; int position; } + (DataScanner *)scannerWithData:(NSData *)_data; - (id)initWithData:(NSData *)_data; - (NSData *)data; - (unsigned)position; - (void)setPosition:(unsigned)_position; - (int)readChar; - (NSNumber *)readIntNumber; - (NSNumber *)readDoubleNumber; - (double)readDouble; - (NSString *)readString; - (BOOL)isAtEnd; @end #endif Paje-1.98/General/CStringCallBacks.m0000664000175000017500000000315611674062007017126 0ustar schnorrschnorr#include "CStringCallBacks.h" #include #include // for strcmp #include // for free static NSUInteger cstring_hash(NSMapTable *t, const void *p) { const char *s = p; unsigned h = 0; int c; while ((c = *s++) != 0) { h = (h << 27) ^ c ^ (h >> 5); } return h; } static BOOL cstring_isEqual(NSMapTable *t, const void *p1, const void *p2) { const char *s1 = p1; const char *s2 = p2; return strcmp(s1, s2) == 0; } static void cstring_retain(NSMapTable *t, const void *p) { } static void cstring_release(NSMapTable *t, void *p) { free(p); } static NSString *cstring_describe(NSMapTable *t, const void *p) { const char *s = p; return [NSString stringWithCString:s]; } static NSUInteger cstring_hash2 (NSHashTable *t, const void *p) { return cstring_hash ((NSMapTable*)t, p); } static BOOL cstring_isEqual2(NSHashTable *t, const void *p1, const void *p2) { return cstring_isEqual((NSMapTable*)t, p1, p2); } static void cstring_retain2(NSHashTable *t, const void *p) { cstring_retain((NSMapTable*)t, p); } static void cstring_release2(NSHashTable *t, void *p) { cstring_release((NSMapTable*)t, p); } static NSString *cstring_describe2(NSHashTable *t, const void *p) { return cstring_describe((NSMapTable*)t, p); } NSMapTableKeyCallBacks CStringMapKeyCallBacks = { cstring_hash, cstring_isEqual, cstring_retain, cstring_release, cstring_describe }; NSHashTableCallBacks CStringHashCallBacks = { cstring_hash2, cstring_isEqual2, cstring_retain2, cstring_release2, cstring_describe2 }; Paje-1.98/General/SourceCodeReference.m0000664000175000017500000000532311674062007017665 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // // SourceCodeReference // // Contains a reference to a source line in a file. // #include "SourceCodeReference.h" #include "Macros.h" @implementation SourceCodeReference NSMutableSet *allReferences; + (void)initialize { allReferences = [[NSMutableSet alloc] init]; // never released! } + (SourceCodeReference *)referenceToFilename:(NSString *)name lineNumber:(int)line { return [[[self alloc] initWithFilename:name lineNumber:line] autorelease]; } - (id)initWithFilename:(NSString *)name lineNumber:(int)line { self = [super init]; if (self != nil) { id obj; Assign(filename, name); lineNumber = line; obj = [allReferences member:self]; if (obj == nil) { [allReferences addObject:self]; } else { Assign(self, obj); } } return self; } - (void)dealloc { Assign(filename, nil); [super dealloc]; } // // accessors // - (NSString *)filename { return filename; } - (NSInteger)lineNumber { return lineNumber; } - (NSString *)description { return [NSString stringWithFormat:@"%@:%d", filename, lineNumber]; } // // it can be hashed (NSObject protocol) // - (unsigned)hash { return lineNumber; } - (BOOL)isEqual:(id)object { if ((self == object) || ([object isKindOfClass:[SourceCodeReference class]] && lineNumber == [object lineNumber] && [filename isEqual:[object filename]])) return YES; return NO; } - (id)copyWithZone:(NSZone *)zone { return [self retain]; } // NSCoding Protocol - (void)encodeWithCoder:(NSCoder *)coder { // [super encodeWithCoder:coder]; [coder encodeValuesOfObjCTypes:"@i", &filename, &lineNumber]; } - (id)initWithCoder:(NSCoder *)coder { self = [super init];//WithCoder:coder]; [coder decodeValuesOfObjCTypes:"@i", &filename, &lineNumber]; return self; } @end Paje-1.98/General/Comparing.h0000664000175000017500000000250011674062007015717 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _COMPARING_H_ #define _COMPARING_H_ /* Comparing.h created by benhur on Thu 21-Aug-1997 */ #include @protocol Comparing - (NSComparisonResult)compare:other; @end @interface NSDate (C) @end @interface NSNumber(Comparing) - (BOOL) isDifferent:(id) obj; - (BOOL) isGreaterThan:(id) obj; - (BOOL) isLessThan:(id) obj; - (BOOL) isGreaterOrEqual:(id) obj; - (BOOL) isLessOrEqual:(id) obj; @end #endif // Comparing.h created by benhur on Thu 21-Aug-1997 */ Paje-1.98/General/NSObject+Additions.m0000664000175000017500000000264711674062007017402 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "NSObject+Additions.h" @implementation NSObject (PajeAdditions) + (void)_subclassResponsibility:(SEL)selector { [NSException raise:@"Internal bug" format:@"class %@ should implement method +%@", NSStringFromClass([self class]), NSStringFromSelector(selector)]; } - (void)_subclassResponsibility:(SEL)selector { [NSException raise:@"Internal bug" format:@"class %@ should implement method -%@", NSStringFromClass([self class]), NSStringFromSelector(selector)]; } -(float)length { NSLog(@"[%@ length] called!!!!", [self class]); return 0; } @end Paje-1.98/General/PTime.m0000664000175000017500000000423211674062007015027 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* PTime.m * * see PTime.h */ /* 19980213 BS creation */ #include "PTime.h" PTime *initialTime; @implementation PTime + (void)setInitialTime:(PTime *)time { [initialTime release]; initialTime = [time retain]; } // there's a bug in NSDate, it's classForCoder and classForArchiver return NSDate - (Class)classForCoder { return [self class]; } - (Class)classForArchiver { return [self class]; } - (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds { #ifndef GNUSTEP self = [super init]; #endif secondsSinceReferenceDate = seconds; return self; } - (NSTimeInterval)timeIntervalSinceReferenceDate { return secondsSinceReferenceDate; } - (NSString *)description { return [NSString stringWithFormat:@"%.6f", initialTime ? [self timeIntervalSinceDate:initialTime] : [self timeIntervalSinceReferenceDate]]; } - (NSString *)stringValue { return [self description]; } - (id)copyWithZone:(NSZone *)zone { return [self retain]; } // NSCoding Protocol - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeValueOfObjCType:@encode(NSTimeInterval) at:&secondsSinceReferenceDate]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; [coder decodeValueOfObjCType:@encode(NSTimeInterval) at:&secondsSinceReferenceDate]; return self; } @end Paje-1.98/General/NSString+Additions.h0000664000175000017500000000472511674062007017434 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _NSString_Additions_h_ #define _NSString_Additions_h_ #include @interface NSString (Additions) + (NSString *)stringWithCharacter:(unichar)c; + (NSString *)stringWithFormattedNumber:(double)n; - (NSRange)rangeForLineNumber:(unsigned)lineNumber; - (unsigned)lineNumberAtIndex:(unsigned)index; - (NSRange)rangeValue; + (NSString *)stringWithRange:(NSRange)range; - (NSString *)stringValue; @end #include @interface NSString (PajeNSStringPositionDrawing) // additions to NSString to support drawing them in many positions // relative to a given point. Uses NSStringAdditions methods to do this. // Should not be called if the focus is not locked to some view. // All methods are of the form: drawAtXYPoint: ..., // where X can be L, C or R, meaning that the x coordinate of aPoint // should be at the left, center or right of the string, and // Y can be B, C or T (bottom, center or top) - (void)drawAtLTPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes; - (void)drawAtLCPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes; - (void)drawAtLBPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes; - (void)drawAtCTPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes; - (void)drawAtCCPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes; - (void)drawAtCBPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes; - (void)drawAtRTPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes; - (void)drawAtRCPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes; - (void)drawAtRBPoint:(NSPoint)aPoint withAttributes:(NSDictionary *)attributes; @end #endif Paje-1.98/General/EntityDescriptor.m0000664000175000017500000000317411674062007017330 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "EntityDescriptor.h" @implementation EntityDescriptor : NSObject // // Initialisation // + (EntityDescriptor *)descriptorWithEntityType:(NSString *)type drawingType:(PajeDrawingType)drawType { return [[[self alloc] initWithEntityType:type drawingType:drawType] autorelease]; } - (id)initWithEntityType:(NSString *)type drawingType:(PajeDrawingType)drawType { self = [super init]; if (self) { Assign(entityType, type); drawingType = drawType; } return self; } - (void)dealloc { Assign(entityType, nil); [super dealloc]; } // // Accessors // - (NSString *)entityType { return entityType; } - (PajeDrawingType)drawingType { return drawingType; } - (NSArray *)allValues { return nil; } @end Paje-1.98/General/PSortedArray.h0000664000175000017500000000635011674062007016366 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PSortedArray_h_ #define _PSortedArray_h_ /* PSortedArray.h created by benhur on Mon 07-Apr-1997 */ #include #include "Comparing.h" @interface PSortedArray : NSObject { NSMutableArray *array; SEL valueSelector; } + (PSortedArray *)sortedArrayWithSelector:(SEL)sel; - (id)initWithSelector:(SEL)sel; - (void)setSelector:(SEL)sel; - (NSUInteger)count; - (id)objectAtIndex:(NSUInteger)index; - (void)addObject:(id)obj withValue:(id)objValue left:(int)left right:(int)right pivot:(int)pivot; - (void)addObject:(id)obj; - (id)lastObject; - (void)removeObjectAtIndex:(NSUInteger)index; - (void)removeObjectsInRange:(NSRange)aRange; - (void)removeObject:(id)obj; - (void)removeObjectIdenticalTo:(id)obj; - (void)removeObjectsBeforeValue:(id)value; - (void)removeAllObjects; - (void)removeLastObject; - (void)verifyPositionOfObjectIdenticalTo:(id)obj; - (NSEnumerator *)objectEnumerator; - (NSEnumerator *)objectEnumeratorAfterValue:(id)value; - (NSEnumerator *)objectEnumeratorNotAfterValue:(id)value; - (NSEnumerator *)objectEnumeratorNotBeforeValue:(id)value; - (NSEnumerator *)objectEnumeratorNotBeforeValue:(id)value1 notAfterValue:(id)value2; - (NSEnumerator *)objectEnumeratorAfterValue:(id)value1 notAfterValue:(id)value2; - (NSEnumerator *)reverseObjectEnumerator; - (NSEnumerator *)reverseObjectEnumeratorAfterValue:(id)value; - (NSEnumerator *)reverseObjectEnumeratorNotBeforeValue:(id)value; - (NSUInteger)indexOfFirstObjectNotBeforeValue:(id)value; // 0--count - (NSUInteger)indexOfFirstObjectAfterValue:(id)value; // 0--count - (NSUInteger)indexOfLastObjectNotAfterValue:(id)value; // 0--count-1 may return NSNotFound - (NSUInteger)indexOfLastObjectBeforeValue:(id)value; // 0--count-1 may return NSNotFound - (NSUInteger)indexOfObjectWithValue:(id)value; // 0--count-1 may return NSNotFound - (NSUInteger)indexOfObject:(id)obj; // 0--count-1 may return NSNotFound - (NSEnumerator *)reverseObjectEnumeratorWithRange:(NSRange)range; // NSCoding Protocol - (void)encodeWithCoder:(NSCoder *)coder; - (id)initWithCoder:(NSCoder *)coder; // NSCopying Protocol - (id)copyWithZone:(NSZone *)zone; @end #endif Paje-1.98/General/SourceTextViewer.gorm/0000775000175000017500000000000011674062007020064 5ustar schnorrschnorrPaje-1.98/General/SourceTextViewer.gorm/data.classes0000664000175000017500000000046711674062007022363 0ustar schnorrschnorr{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "lineNumberChanged:" ); Super = NSObject; }; SourceTextController = { Actions = ( "lineNumberChanged:" ); Outlets = ( textView, lineNumberField ); Super = NSObject; }; }Paje-1.98/General/SourceTextViewer.gorm/objects.gorm0000664000175000017500000000564011674062007022410 0ustar schnorrschnorrGNUstep archive00002af9:0000001d:0000004b:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString& %  ScrollView101 NSScrollView1NSView1 NSResponder%  C Cj  C Cj&01 NSMutableArray1 NSArray&01 NSClipView% A ? C Ch A @ C Ch&0 &01 NSTextView1 NSText% A @ C Ch  C Ch&0 &0 1NSColor0 &%NSNamedColorSpace0 &%System0 &%textBackgroundColor  K K0 0& % textColor C K 01 NSScroller1 NSControl% ? ? A Ch  A Ch&0 &%01NSCell0&01NSFont%&&&&&&&&&2 _doScroll:v12@0:4@8% A A A A 0&%NSOwner0&%SourceTextController0& %  TextField201 NSTextField% C Co B` A  B` A& 0 &%01NSTextFieldCell1 NSActionCell0&&&&&&&&&0%0 0&%System0&%textBackgroundColor0 0 & % textColor0!& %  TextField30"% C Co B A  B A& 0# &%0$0%&%Line:0&% A@&&&&&&&&0%0' 0(&%System0)&%textBackgroundColor0* (0+& % textColor0,&%TextView0-& %  GormNSWindow10.1NSWindow% ? A C C&% CO D0/% ? A C C  C C&00 &"01 02&%System03&%windowBackgroundColor04&%Window05&%Window06&%Window @@ B F@ F@%07&%GSCustomClassMap08&09 &  0:1NSNibConnector-0;&%NSOwner0<0=0>&%TextView0?0@!0A1NSNibOutletConnector;>0B1NSMutableString&% textView0C;0D&% lineNumberField0E1NSNibControlConnector;0F&% lineNumberChanged:0G>;0H&% delegate0I-;0J&% delegate0K1 GSMutableSet1 NSMutableSet1NSSet&.Paje-1.98/General/FilteredEnumerator.h0000664000175000017500000000303311674062007017602 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FilteredEnumerator_h_ #define _FilteredEnumerator_h_ /* FilteredEnumerator.h created by benhur on Sat 14-Jun-1997 */ #include @interface FilteredEnumerator : NSEnumerator { NSEnumerator *originalEnumerator; id filter; SEL selector; id context; } + (FilteredEnumerator *)enumeratorWithEnumerator:(NSEnumerator *)orgEnum filter:(id)f selector:(SEL)sel context:(id)c; - (id)initWithEnumerator:(NSEnumerator *)orgEnum filter:(id)f selector:(SEL)sel context:(id)c; - (void)dealloc; - (id)nextObject; @end #endif Paje-1.98/General/SourceCodeReference.h0000664000175000017500000000270011674062007017654 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SourceCodeReference_h_ #define _SourceCodeReference_h_ // // SourceCodeReference // // Contains a reference to a source line in a file. // #include @interface SourceCodeReference : NSObject { NSString *filename; int lineNumber; } + (SourceCodeReference *)referenceToFilename:(NSString *)name lineNumber:(int)line; - (id)initWithFilename:(NSString *)name lineNumber:(int)line; // // accessors // - (NSString *)filename; - (NSInteger)lineNumber; // // it can be hashed (NSObject protocol) // - (unsigned)hash; - (BOOL)isEqual:(id)object; @end #endif Paje-1.98/General/PajeContainer.m0000664000175000017500000000632211674062007016535 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // // PajeContainer // // superclass for containers // #include "PajeContainer.h" #include "Macros.h" #include "UniqueString.h" #include "PTime.h" @implementation PajeContainer + (PajeContainer *)containerWithType:(id)type name:(NSString *)n container:(PajeContainer *)c { return [[[self alloc] initWithType:type name:n container:c] autorelease]; } - (id)initWithType:(PajeEntityType *)type name:(NSString *)n container:(PajeContainer *)c { self = [super initWithType:type name:n container:c]; if (self) { Assign(subContainers, [NSMutableArray array]); } return self; } - (void)dealloc { Assign(subContainers, nil); [super dealloc]; } - (void)addSubContainer:(PajeContainer *)subcontainer { [subContainers addObject:subcontainer]; } - (NSArray *)subContainers { return subContainers; } - (BOOL)isContainer { return YES; } - (NSDate *)time { return [NSDate/*PTime*/ dateWithTimeIntervalSinceReferenceDate:0.0]; } - (NSDate *)endTime { return [NSDate/*PTime*/ dateWithTimeIntervalSinceReferenceDate:200.0]; } - (id)copyWithZone:(NSZone *)zone { return [self retain]; } - (NSString *)alias { return nil; } - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)type fromTime:(NSDate *)start toTime:(NSDate *)end { [self _subclassResponsibility:_cmd]; return nil; } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)type fromTime:(NSDate *)start toTime:(NSDate *)end { [self _subclassResponsibility:_cmd]; return nil; } // NSCoding protocol - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:subContainers]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; Assign(subContainers, [coder decodeObject]); return self; } - (double)minValueForEntityType:(PajeEntityType *)type { return 0.0; } - (double)maxValueForEntityType:(PajeEntityType *)type { return 0.0; } - (void)verifyMinMaxOfEntityType:(PajeEntityType *)type withValue:(double)value { return; } @end Paje-1.98/General/ColoredSwitchButtonCell.h0000664000175000017500000000217011674062007020550 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _ColoredSwitchButtonCell_h_ #define _ColoredSwitchButtonCell_h_ #include @interface ColoredSwitchButtonCell : NSButtonCell { NSColor *color; } - (void)setColor:(NSColor *)c; - (void)drawInteriorWithFrame:(NSRect)frame inView:(NSView *)controlView; @end #endif Paje-1.98/General/NSObject+Additions.h0000664000175000017500000000205411674062007017365 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _NSObject_Additions_h_ #define _NSObject_Additions_h_ #include @interface NSObject (PajeAdditions) + (void)_subclassResponsibility:(SEL)selector; - (void)_subclassResponsibility:(SEL)selector; @end #endif Paje-1.98/General/PajeEntityInspector.nib/0000775000175000017500000000000011674062007020344 5ustar schnorrschnorrPaje-1.98/General/PajeEntityInspector.nib/keyedobjects.nib0000664000175000017500000003010411674062007023507 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata7 156<=AE]e}~  *.4:BCPQYZ[_dehkowx  &'./7RSXbchijniqs{|} %&'./2>?@CL?MNQRSYZ\]^_`cdhmnstyz#:QmRSmTUVTWX~YZ[\]`cqVU$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRoot3564X234[NSClassName_PajeEntityInspector789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>F\GHIJKLMNOPQRSTUVWXYZ[ ĀƀȀʀ̀΀ЀҀԀր؀ڀ܀ހI^_`abc0]NSDestinationWNSLabelXNSSource fghijklmnopqrstuvwxyz{|_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClass  x_{{345, 138}, {322, 431}}UPanelYNS.stringWNSPanel78;_NSMutableStringXNSStringTView.ZNSSubviews_NSNextResponderWNSFrameK>\&*RWIyy[NSSuperview\NSIsBorderedWNSColorYNSEnabledXNSvFlags[NSDragTypes   >@_NSColor pasteboard type_{{20, 373}, {39, 38}}UNSRGB\NSColorSpaceO0.058130499 0.055541899 178;78;[NSColorWellYNSControlVNSView[NSResponderyyVNSCell  %_{{64, 373}, {107, 18}}r_NSKeyEquivalent_NSAlternateImageYNSSupportZNSContents]NSControlView^NSButtonFlags2_NSPeriodicInterval]NSButtonFlags_NSPeriodicDelay[NSCellFlags_NSAlternateContents\NSCellFlags2# H+\',I/2-**JK>5\678.;@I''=?@A,,/ ":0_{{98, 10}, {124, 18}}DEFGHJ6MNO_NSBackgroundColor[NSTextColor_NSDrawsBackground261. 9ABUTextpRSTUVW[NSColorName]NSCatalogName543VSystem_textBackgroundColor\]"WNSWhiteB1RS`aVW873YtextColor\f"B078ijj;_NSTextFieldCell78lmmn;[NSTextField\%NSTextField''rtv,,< !%=_{{230, 9}, {38, 20}}z|7~#?>;"K@$#''@,,A $:B_{{13, 12}, {80, 14}}DE8MDGC@91BUText RSVWFE3\controlColor\"K0.66666669RS`VW8H3_controlTextColor78;^NSMutableArrayWNSArray_{{2, 2}, {284, 36}}78;_{{17, 314}, {288, 53}}V{0, 0}DEGM(2PO9SBox\"M0 0.8000000178;UNSBoxyy@ǀS :T_{{64, 394}, {241, 17}}DEMЀDGVUR9@[Entity Name"APyy"rq&()XYQ>\߀YIZWWK>\[_cgkI@YY\ :]_{{13, 46}, {70, 17}}DEMDG^[9WScript @ YY` :a_{{88, 47}, {134, 19}}DEFGHMO26b_ 9qATText@YYd :e_{{13, 28}, {70, 14}}DE#MDGfc9UField*@-YYh :i_{{88, 26}, {134, 19}}DEFGH3MO26jg 989:;<=>?@ADBCDrEHJKTMNQ[NSCellClassYNSNumRowsZNSCellSizeYNSNumColsWNSCells[NSProtoCell^NSSelectedCell_NSCellBackgroundColor]NSMatrixFlags_NSIntercellSpacingl{ymY |Yn5D(zVD_{{86, 4}, {124, 21}}>T\JVnwIYZ[\^rZ]NSNormalImagevtpok$vTSelfd2efg^NSResourceNamersqWNSImage]NSRadioButton78kllm;_NSCustomResource_%NSCustomResourceou"Y[\wrtpxk$#WRelatedX{62, 21}[(#t}H8Q$~URadio78;XNSMatrixY%NSMatrix@YY :_{{3, 4}, {80, 17}}DEMDG9UFrom YY %_{{230, 25}, {40, 42}}~#V$#TExec_{{2, 2}, {284, 73}}_{{17, 220}, {288, 90}}DEGM(29^Execute Script\"yy"r&()Q>\ĀIK>\ҀIQ]NSNextKeyView[NSHScrollerXNSsFlags[NSVScroller>\ހIYNSBGColorYNSDocViewYNScvFlagsD>\I8:9;<=?@ADrK   Q]NSSelectedCol]NSSelectedRow[NSFrameSize DDX{95, 37}>\Iz~#?$#VButtonz!~UNSTag#?$#X{95, 20}X{-1, -3}z+~#?$#_{{1, 1}, {250, 66}}78011;ZNSClipView3459:;<=XNSTargetYNSPercentXNSAction"?r)_{{-30, 1}, {15, 66}}\_doScroller:78ABB;ZNSScrollerD35GIQ;KZNSCurValue">.LA_{{-100, -100}, {235, 15}}_{{16, 11}, {252, 68}}78OPP;\NSScrollView_{{2, 2}, {284, 90}}_{{17, 16}, {288, 107}}DEGUWM(29_Related Entities\"_{{1, 1}, {322, 431}}_{{0, 0}, {1280, 1002}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78abb;_NSWindowTemplate_inspectionWindow78effg;_NSNibOutletConnector^NSNibConnector^_`jc0ZcolorField^_`pc0RYnameField^_`vc0&[reuseButton^_`0|}€À_filterEntityName:78g;_NSNibControlConnector^_`c0ŀ\filterButton^_`c0ǀ_relatedEntitiesBox^_`c0WɀYscriptBox^_`c0*ˀXfieldBox^_`8c0@̀ZtitleField^_`6c0.πZvalueField^_`7c0;р^showFileButton^_`c0_Ӏ_scriptPathField^_`c0gՀ_scriptFieldNameField^_`c0k׀_scriptFieldSourceMatrix^_`0}7ـÀ;[showSource:^_`0}ۀÀ^executeScript:^_`0}݀À]colorChanged:^_`0ca߀ Xdelegate^_`c0်_relatedEntitiesMatrix^_`0}À]entityClicked>'J7V68ay,nc_;w*Y.Rk@[ g&W78;>'yy'yy'y0ayy*YkYY,kW,Y,Y YY>$'068a,c_*Y.Rk@[ g&W>;<=>?@ABCDEFGHIJKLMNO^NSTextField211\File's OwnerVNSBox2\NSTextField2YNSMatrix1Q2YNSButton4]NSTextField21_NSTextField2111\NSTextField1ZNSButton41VNSBox1>^>a>d28WTH06RYSGIP[UK'NVVQXayLJZOMJ7*@ڀԀR.&ЀހҀg ̀kր,Ȁ؀wcW΀܀ ĀʀYƀn_;[>2ˁ      !"#$%&'()*+,-./012 B?1( =D>*S;+W@ 9A0)$<TCRVU:%7/&'>\I>>78;^NSIBObjectData#,1:LQVdf);Wit!/9@BEGIKMPSUXZ\^acegir~ (UWY[]_acegikmoqsuwy{}(6CPZgq}&1CKMOQS\kmoqsuwy{ $&>KQ^{}  J \ o y         ! & + < C J S X Z \ _ l u z   ! > @ B D E G I c   % / = K U W Y [ ] _ a c d f h j s v x z  - 9 M O Q S U W X Z c h n  );DQ]j8:<>?BDF]~.6LU\u|>@BDFHJO[lqsux   24689;=Tuwy{} &(*,-/1Hikmoqsu{8DNYckw   HVXZ\^`bdfkx')+-/135=Fwy{}!'DFHJKNPRj "1>@uwy{}#%')+-/2468AHJLNPy#/13<>@ACEGIRTVXajoqsu  SUWY[]_u~ !,Q\^`egikm )68Ohs  /1357ARTVXZfwy{} "$&(2CEGIKTegikmx      0 2 4 6 8 R c e g i k w !!!*!,!.!0!2!@!I!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""" """$"&"("*","."0"2"4"6"8":"<">"@"B"D"F"H"J"S"~""""""""""""""""""""""""""""""""""""""""######"#)#6#@#B#L#Z#l#y#########$$$$$$$$!$#$%$'$)$+$-$/$1$3$5$7$9$;$=$?$A$C$E$G$I$K$M$O$Q$S$U$W$Y$[$]$_$a$c$e$g$i$k$m$o$q$s$u$w$y$$$$$$$$$%%%% % %%%%%%%"%%%(%+%.%1%4%7%:%=%@%C%F%I%L%O%R%U%X%[%^%a%d%g%j%m%p%s%v%y%|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&& &Paje-1.98/General/PajeEntityInspector.nib/info.nib0000664000175000017500000000070511674062007021773 0ustar schnorrschnorr IBDocumentLocation 49 119 356 240 0 0 1280 1002 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/General/PajeEntityInspector.nib/classes.nib0000664000175000017500000000223711674062007022477 0ustar schnorrschnorr{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = { colorChanged = id; entityClicked = id; executeScript = id; filterEntityName = id; showSource = id; }; CLASS = PajeEntityInspector; LANGUAGE = ObjC; OUTLETS = { colorField = NSColorWell; fieldBox = NSBox; filterButton = NSButton; inspectionWindow = NSWindow; nameField = NSTextField; relatedEntitiesBox = NSBox; relatedEntitiesMatrix = NSMatrix; reuseButton = NSButton; scriptBox = NSBox; scriptFieldNameField = NSTextField; scriptFieldSourceMatrix = NSMatrix; scriptPathField = NSTextField; showFileButton = NSButton; titleField = NSTextField; valueField = NSTextField; }; SUPERCLASS = NSObject; } ); IBVersion = 1; }Paje-1.98/General/NSMatrix+Additions.h0000664000175000017500000000460511674062007017427 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _NSMatrix_Additions_h_ #define _NSMatrix_Additions_h_ // NSMatrix+Additions.h // // NSMatrix (NSDraggingDestination) // Category to NSMatrix that allows it's delegate to receive // dragging destination messages. // To receive draggingEntered: messages, the delegate has to implement // -matrix:(NSMatrix *)m draggingEntered:(id )sender // messages, and so on (see NSDraggingDestination protocol). // // NSMatrix (Additions) // defines a method that returns the cell in a point, or nil #include @protocol MatrixDraggingDelegate - (NSDragOperation)matrix:(NSMatrix *)matrix draggingEntered:(id )sender; - (NSDragOperation)matrix:(NSMatrix *)matrix draggingUpdated:(id )sender; - (void)matrix:(NSMatrix *)matrix draggingExited:(id )sender; - (BOOL)matrix:(NSMatrix *)matrix prepareForDragOperation:(id )sender; - (BOOL)matrix:(NSMatrix *)matrix performDragOperation:(id )sender; - (void)matrix:(NSMatrix *)matrix concludeDragOperation:(id )sender; @end @interface NSMatrix (NSDraggingDestination) - (NSDragOperation)draggingEntered:(id )sender; - (NSDragOperation)draggingUpdated:(id )sender; - (void)draggingExited:(id )sender; - (BOOL)prepareForDragOperation:(id )sender; - (BOOL)performDragOperation:(id )sender; - (void)concludeDragOperation:(id )sender; @end @interface NSMatrix (Additions) - (id)cellAtPoint:(NSPoint)p; @end #endif Paje-1.98/General/HierarchyBrowser.gorm/0000775000175000017500000000000011674062007020057 5ustar schnorrschnorrPaje-1.98/General/HierarchyBrowser.gorm/data.classes0000664000175000017500000000703511674062007022354 0ustar schnorrschnorr{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "containerSelected:", "containerTypeSelected:" ); Super = NSObject; }; HierarchyBrowser = { Actions = ( "containerSelected:", "containerTypeSelected:" ); Outlets = ( containerTypesBrowser, containersBrowser, splitView ); Super = NSObject; }; }Paje-1.98/General/HierarchyBrowser.gorm/objects.gorm0000664000175000017500000001574311674062007022410 0ustar schnorrschnorrGNUstep archive00002a96:0000001c:000000b3:00000005:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&% GormNSBrowser101 NSBrowser1 NSControl1NSView1 NSResponder% B C C  C C&01 NSMutableArray1 NSArray&01 NSScrollView% @ C3 B  C3 B&0 &01 NSClipView% A @ C B  C B&0 &0 1NSMatrix%  C B  C B&0 &%0 1 NSActionCell1NSCell0 &01NSFont%&&&&&&&&%% C B 01NSColor0&%NSNamedColorSpace0&%System0&%controlBackgroundColor0& % NSBrowserCell01 NSBrowserCell0&0%&&&&&&&&%%0 &2doClick:2doDoubleClick:00&%System0&%controlBackgroundColor01 NSScroller% @ @ A B  A B&0 &%0&&&&&&&&&% A A A A 0 % C7 @ C4 B  C4 B&0 &0 % A @ C B  C B&0! &0"0#& % controlColor0$% @ @ A B  A B&0% &%0&&&&&&&&&& % A A A A $%0'&&&&&&&&0(&%NSMatrix0)&%/% A0*% @ ? C A  C A&0+ &%0,&&&&&&&&&2 scrollViaScroller:v12@0:4@8   C3 B0- &0.1NSBrowserColumn %)0/%%%00& %  ClipView3 01&%NSOwner02&%HierarchyBrowser03& %  ScrollView204& % GormNSBrowser05%  C B  C B&06 &07% @ ? C A  C A&08 &%090:&&&&&&&&&&50; % A C3 B  C3 B&0< &0= % A @ C B  C B&0> &0?%  C B  C B&0@ &%0A &&&&&&&&%% C B 0B& % NSBrowserCell0C:&&&&&&&&%%0D &50E0F&%System0G&%controlBackgroundColor0H% @ @ A B  A B&0I &%0J:&&&&&&&&&;2 _doScroll:v12@0:4@8=% A A A A H0K % C7 A C4 B  C4 B&0L &0M % A @ C B  C B&0N &0O0P&%System0Q& % controlColor0R% @ @ A B  A B&0S &%0T0U&&&&&&&&&&KM% A A A A R%0V:&&&&&&&&C0W&%NSMatrix0X&%/% B7 @ ? C A C3 B0Y &0Z;?%X0[K%%%0\& %  ScrollView30]& %  Scroller40^& %  Scroller5$0_&%GSCustomClassMap0`&0a&% Matrix10b%  C B  C B&0c &%0d&&&&&&&&%% C B 0e& % NSBrowserCell%%0f &2 doDoubleClick:v12@0:4@80g& % GormNSPanel0h1NSPanel1NSWindow% ? A C C& % D C0i% ? A C C  C C&0j &0k1 NSSplitView% A A C Cd  C Cd&0l &50m1NSImage0n&%common_Dimple.tiff0oP0p&%controlBackgroundColor0qP0r&%controlShadowColor%A0s0t&%System0u&%windowBackgroundColor0v&%Window0w&%Panelw ? B F@ F@%0x0y&%NSApplicationIcon0z& % SplitViewk0{&%Matrix0|%  C B  C B&0} &%0~&&&&&&&&%% C B 0& % NSBrowserCell0&&&&&&&&%%0 &0&%Scroller0% @ ? C A  C A&0 &%0&&&&&&&&&0& %  ClipView20 &01NSNibConnectorg0&%NSOwner00{0z0300a01NSNibControlConnectora0&%doClick:0]0]30& % _doScroll:0\000^0^\0& % _doScroll:01NSNibOutletConnector0&%containersBrowser00&% containerSelected:00&%delegate04z0z0z0& % splitView040&%containerTypesBrowser040&%containerTypeSelected:040&%delegatePaje-1.98/General/PajeEvent.h0000664000175000017500000001042111674062007015662 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeEvent_h_ #define _PajeEvent_h_ /* PajeEvent.h * * * 20021112 BS creation (from A0Event) */ #include #include #include "Protocols.h" #define PE_MAX_NFIELDS 20 typedef struct { char *word[PE_MAX_NFIELDS]; int word_count; } line; typedef enum { PajeStartTraceEventId, PajeDefineContainerTypeEventId, PajeDefineEventTypeEventId, PajeDefineStateTypeEventId, PajeDefineVariableTypeEventId, PajeDefineLinkTypeEventId, PajeDefineEntityValueEventId, PajeCreateContainerEventId, PajeDestroyContainerEventId, PajeNewEventEventId, PajeSetStateEventId, PajePushStateEventId, PajePopStateEventId, PajeSetVariableEventId, PajeAddVariableEventId, PajeSubVariableEventId, PajeStartLinkEventId, PajeEndLinkEventId, PajeEventIdCount, PajeUnknownEventId = -1 } PajeEventId; typedef enum { PajeIntFieldType, PajeHexFieldType, PajeDateFieldType, PajeDoubleFieldType, PajeStringFieldType, PajeColorFieldType, PajeUnknownFieldType } PajeFieldType; typedef enum { PajeEventIdFieldId, PajeTimeFieldId, PajeNameFieldId, PajeAliasFieldId, //PajeContainerTypeFieldId, //PajeEntityTypeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeStartContainerTypeFieldId, PajeEndContainerTypeFieldId, PajeStartContainerFieldId, PajeEndContainerFieldId, PajeColorFieldId, PajeValueFieldId, PajeKeyFieldId, PajeFileFieldId, PajeLineFieldId, PajeFieldIdCount } PajeFieldId; PajeEventId pajeEventIdFromName(const char *name); PajeFieldId pajeFieldIdFromName(const char *name); PajeFieldType pajeFieldTypeFromName(const char *name); @interface PajeEventDefinition : NSObject { @public char *eventId; PajeEventId pajeEventId; PajeFieldType fieldTypes[PE_MAX_NFIELDS]; // fieldType of each field PajeFieldId fieldIds[PE_MAX_NFIELDS]; // fieldId of each field short fieldCount; // number of fields for events with this definition NSArray *fieldNames; short fieldIndexes[PajeFieldIdCount]; // index in fieldIds for known PjFiId PajeFieldId extraFieldIds[PE_MAX_NFIELDS]; // non-obligatory fieldIds in ev short extraFieldCount; NSArray *extraFieldNames; } + (PajeEventDefinition *)definitionWithPajeEventId:(PajeEventId)anId internalId:(const char *)internalId; - (id)initWithPajeEventId:(PajeEventId)anId internalId:(const char *)internalId; - (void)addFieldId:(PajeFieldId)fieldId fieldType:(PajeFieldType)fieldType; - (int)fieldCount; @end @interface PajeEvent : NSObject { //char *fieldValues[PE_MAX_NFIELDS]; line *valueLine; PajeEventDefinition *pajeEventDefinition; } + (PajeEvent *)eventWithDefinition:(PajeEventDefinition *)definition line:(line *)line; - (id)initWithDefinition:(PajeEventDefinition *)definition line:(line *)line; - (id)valueForFieldId:(PajeFieldId)fieldId; - (NSColor *)colorForFieldId:(PajeFieldId)fieldId; - (NSString *)stringForFieldId:(PajeFieldId)fieldId; - (const char *)cStringForFieldId:(PajeFieldId)fieldId; - (int)intForFieldId:(PajeFieldId)fieldId; - (double)doubleForFieldId:(PajeFieldId)fieldId; - (NSDate *)timeForFieldId:(PajeFieldId)fieldId; - (NSDate *)time; - (PajeEventId)pajeEventId; - (NSArray *)fieldNames; - (id)valueOfFieldNamed:(NSString *)fieldName; - (NSDictionary *)extraFields; @end #endif Paje-1.98/General/NSDictionary+Additions.h0000664000175000017500000000220511674062007020262 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _NSDictionary_Additions_h_ #define _NSDictionary_Additions_h_ // // NSDictionary+Additions // // a category with additions to NSDictionary // #include @interface NSMutableDictionary (PajeAdditions) // adds object to an array in key - (void)addObject:(id)object forKey:(id)key; @end #endif Paje-1.98/General/GNUstep+Additions.m0000664000175000017500000000423611674062007017254 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* * GNUstep+Additions * * Some missing methods in GNUstep */ #ifdef GNUSTEP #include @implementation NSAttributedString (Additions) - (NSComparisonResult)compare:(id)other { if ([other isKindOfClass:[NSAttributedString class]]) { return [[self string] compare:[(NSAttributedString *)other string]]; } else if ([other isKindOfClass:[NSString class]]) { return [[self string] compare:(NSString *)other]; } return [super compare:other]; } @end @implementation NSClipView (Additions) - (void) viewFrameChanged: (NSNotification*)aNotification { NSRect proposedVisibleRect; NSRect newVisibleRect; NSRect newBounds; // give documentView a chance to adjust its visible rectangle proposedVisibleRect = [self convertRect: _bounds toView: _documentView]; newVisibleRect = [_documentView adjustScroll: proposedVisibleRect]; newBounds = [self convertRect: newVisibleRect fromView: _documentView]; newBounds.origin = [self constrainScrollPoint: newBounds.origin]; [self setBounds: newBounds]; /* If document frame does not completely cover _bounds */ if (NSContainsRect([_documentView frame], _bounds) == NO) { /* * fill the area not covered by documentView with background color */ [self setNeedsDisplay: YES]; } [_super_view reflectScrolledClipView: self]; } @end #endif Paje-1.98/General/HierarchyBrowser.nib/0000775000175000017500000000000011674062007017663 5ustar schnorrschnorrPaje-1.98/General/HierarchyBrowser.nib/keyedobjects.nib0000664000175000017500000000752611674062007023042 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdataY 156<=AEOWqyz !"#&(07>?@ADGWghijklhmnopqrux{U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRoot=UEF>DWGX?/V234[NSClassName_HierarchyBrowser789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FNGHIJKLM "$+-'PQR0TUV]NSDestinationWNSLabelXNSSource XYZ[\]^_`abcdeeghijklmnop[NSFrameSize_NSNextResponder[NSSuperview_NSPreferedColumnWidth_NSColumnResizingType_NSCellPrototypeYNSBrFlagsYNSEnabled_NSNumberOfVisibleColumnsXNSvFlags_NSPathSeparator_NSMinColumnWidth "B @ drYZsatuuwmxZNSSubviewsWNSFrame&%%()Z{241, 107}{|}~YNSSupportZNSContents[NSCellFlags\NSCellFlags2@Q VNSSizeVNSNameXNSfFlags"A@\LucidaGrande78;VNSFont78;]NSBrowserCellVNSCellYNS.stringQ/78;_NSMutableStringXNSString78;YNSBrowserYNSControlVNSView[NSResponder_containerTypeSelected:78;_NSNibControlConnector^NSNibConnectorPQR0UYZ[\]^s_`abceeghklmop @ _{{0, 116}, {241, 108}}{|}~_containerSelected:PQR0 !Xdelegate78ƣ;_NSNibOutletConnectorPQR0V#! PQRe0 *!rYs.Հ567>NV '78ݣ;^NSMutableArrayWNSArray_{{67, 51}, {241, 224}}78;[NSSplitViewYsplitViewPQRV0 ,!_containerTypesBrowserPQR0.!_containersBrowser>eVu 0 %<l  u  _NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClass92318:%px;4_{{309, 119}, {380, 295}}UPanelWNSPanelTView>Ne '_{{1, 1}, {380, 295}}78;_{{0, 0}, {1280, 1002}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78$%%;_NSWindowTemplate78'ޢ;>)u0ee% 0 <>10V0 <>89:;<@ABC<\File's OwnerZNSBrowser1[NSBrowser11>B<>E<>HVLGJKM0IueH + "$-% 0<>XYZ[\]^_`abcdeHIJKLMNOPQRST<     >sN'>v<>y<78|}};^NSIBObjectData#,1:LQVdf!l~ "0>Xdr|  )457@GTZcrtvxz|~ 1HZdn   1;FR_acejmo "+4?ISZf 3HJLNWYn &5=V_ht~ - A S ] k y      ! & ( 1 4 6 8 O X _ x        ! # % ' 4 ? K T U W ` a c l          & +~ :Paje-1.98/General/HierarchyBrowser.nib/info.nib0000664000175000017500000000070511674062007021312 0ustar schnorrschnorr IBDocumentLocation 100 83 356 240 0 0 1280 1002 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/General/HierarchyBrowser.nib/classes.nib0000664000175000017500000000100011674062007022001 0ustar schnorrschnorr{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {containerSelected = id; containerTypeSelected = id; }; CLASS = HierarchyBrowser; LANGUAGE = ObjC; OUTLETS = { containerTypesBrowser = NSBrowser; containersBrowser = NSBrowser; splitView = NSSplitView; }; SUPERCLASS = NSObject; } ); IBVersion = 1; }Paje-1.98/General/NSUserDefaults+Additions.m0000664000175000017500000000662011674062007020575 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "NSUserDefaults+Additions.h" #include "NSColor+Additions.h" #include "UniqueString.h" @implementation NSUserDefaults (Additions) - (void)setColor:(NSColor *)color forKey:(NSString *)key { [self setObject:[color description] forKey:[key description]]; } - (NSColor *)colorForKey:(NSString *)key { return [NSColor colorFromString:[self objectForKey:key]]; } - (void)setColorDictionary:(NSDictionary *)dict forKey:(NSString *)key { NSMutableDictionary *newdict = [NSMutableDictionary dictionary]; NSEnumerator *en = [dict keyEnumerator]; id colorKey; while ((colorKey = [en nextObject]) != nil) { NSColor *c = [dict objectForKey:colorKey]; if ([c isKindOfClass:[NSColor class]]) { [newdict setObject:[c description] forKey:[colorKey description]]; } } [self setObject:newdict forKey:[key description]]; } - (NSDictionary *)colorDictionaryForKey:(NSString *)key { NSDictionary *dict = [self dictionaryForKey:key]; if (dict != nil) { NSEnumerator *en = [dict keyEnumerator]; id key; NSColor *c; NSMutableDictionary *newdict = [NSMutableDictionary dictionary]; while ((key = [en nextObject]) != nil) { c = [NSColor colorFromString:[dict objectForKey:key]]; if (c != nil) { [newdict setObject:c forKey:U(key)]; } } dict = newdict; } return dict; } - (void)setRect:(NSRect)rect forKey:(NSString *)key { [self setObject:NSStringFromRect(rect) forKey:key]; } - (NSRect)rectForKey:(NSString *)key { NSString *s = [self stringForKey:key]; if (s != nil) { return NSRectFromString(s); } else { return NSZeroRect; } } - (void)setDouble:(double)value forKey:(NSString *)key { [self setObject:[NSNumber numberWithDouble:value] forKey:key]; } - (double)doubleForKey:(NSString *)key { id obj; obj = [self objectForKey:key]; if (obj != nil && ([obj isKindOfClass:[NSString class]] || [obj isKindOfClass:[NSNumber class]])) { return [obj doubleValue]; } return 0; } - (void)setArchivedObject:(id)anObject forKey:(NSString *)aKey { NSData *archivedObject; archivedObject = [NSArchiver archivedDataWithRootObject:anObject]; [self setObject:archivedObject forKey:aKey]; } - (id)unarchiveObjectForKey:(NSString *)aKey { NSData *archivedObject; archivedObject = [self objectForKey:aKey]; if ([archivedObject isKindOfClass:[NSData class]]) { return [NSUnarchiver unarchiveObjectWithData:archivedObject]; } else { return archivedObject; } } @end Paje-1.98/General/PajeType.m0000664000175000017500000003267311674062007015544 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // // PajeType // // represents the type of (user created) entities and containers // #include #include "PajeType.h" #include "Macros.h" #include "NSUserDefaults+Additions.h" #include "PajeContainer.h" #include "CStringCallBacks.h" @implementation PajeEntityType + (PajeEntityType *)typeWithId:(NSString *)i description:(NSString *)d containerType:(PajeContainerType *)type event:(PajeEvent *)e { return [[[self alloc] initWithId:i description:d containerType:type event:e] autorelease]; } - (id)initWithId:(NSString *)i description:(NSString *)d containerType:(PajeContainerType *)type event:(PajeEvent *)e { if (self == [super init]) { NSColor *c; Assign(ident, i); Assign(description, d); containerType = type; [containerType addContainedType:self]; c = [[NSUserDefaults standardUserDefaults] colorForKey:[description stringByAppendingString:@" Color"]]; if (c == nil) { c = [e colorForFieldId:PajeColorFieldId]; } if (c == nil) { c = [NSColor whiteColor]; } Assign(color, c); //FIXME: should get other fields from event (e.g. layout) fieldNames = [[NSMutableSet alloc] init]; knownEventTypes = NSCreateHashTable(CStringHashCallBacks, 50); } return self; } - (void)dealloc { Assign(ident, nil); Assign(description, nil); containerType = nil; Assign(color, nil); Assign(fieldNames, nil); NSFreeHashTable(knownEventTypes); [super dealloc]; } - (BOOL)isContainer { return NO; } - (NSArray *)allValues { return [NSArray array]; } - (NSString *)ident { return ident; } - (PajeContainerType *)containerType { if (containerType == nil) return (id)self; //HACK return containerType; } - (PajeDrawingType)drawingType { [self _subclassResponsibility:_cmd]; return PajeNonDrawingType; } - (id)copyWithZone:(NSZone *)zone { return [self retain]; } - (NSString *)description { return description; } - (NSColor *)colorForValue:(id)value { return [self color]; } - (void)setColor:(NSColor*)c forValue:(id)value { [self setColor:c]; } - (NSColor *)color { return color; } - (void)setColor:(NSColor*)c { Assign(color, c); [[NSUserDefaults standardUserDefaults] setColor:color forKey:[description stringByAppendingString:@" Color"]]; } - (id)valueOfFieldNamed:(NSString *)n { // FIXME: may have fields on event that created type return nil; } - (void)addFieldNames:(NSArray *)names { [fieldNames addObjectsFromArray:names]; } - (NSArray *)fieldNames { return [fieldNames allObjects]; } - (double)minValue { return 0.0; } - (double)maxValue { return 0.0; } - (BOOL)isKnownEventType:(const char *)type { if (NSHashGet(knownEventTypes, type) != NULL) { return YES; } NSHashInsert(knownEventTypes, strdup(type)); return NO; } - (NSUInteger)hash { return [ident hash]; } - (BOOL)isEqual:(id)other { if ([other isKindOfClass:[PajeEntityType class]]) { return [ident isEqualToString: [(PajeEntityType *)other ident]]; }else{ return NO; } } - (NSComparisonResult)compare:(id)other { if ([other isKindOfClass:[PajeEntityType class]]) { return [ident compare: [(PajeEntityType *)other ident]]; }else{ return NSOrderedSame; } } // NSCoding protocol - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:ident]; [coder encodeObject:description]; [coder encodeObject:containerType]; [coder encodeObject:fieldNames]; // FIXME: save other fields (from creation event, see -init) } - (id)initWithCoder:(NSCoder *)coder { id o1; id o2; id o3; o1 = [coder decodeObject]; o2 = [coder decodeObject]; o3 = [coder decodeObject]; self = [self initWithId:o1 description:o2 containerType:o3 event:nil]; Assign(fieldNames, [coder decodeObject]); return self; } @end @implementation PajeContainerType + (PajeContainerType *)typeWithId:(NSString *)i description:(NSString *)d containerType:(PajeContainerType *)type event:(PajeEvent *)e { return [[[self alloc] initWithId:i description:d containerType:type event:e] autorelease]; } - (id)initWithId:(NSString *)i description:(NSString *)d containerType:(PajeContainerType *)type event:(PajeEvent *)e { self = [super initWithId:i description: d containerType:type event:e]; if (self != nil) { allInstances = [[NSMutableArray alloc] init]; idToInstance = NSCreateMapTable(CStringMapKeyCallBacks, NSObjectMapValueCallBacks, 50); containedTypes = [[NSMutableArray alloc] init]; } return self; } - (void)dealloc { Assign(allInstances, nil); NSFreeMapTable(idToInstance); Assign(containedTypes, nil); [super dealloc]; } - (BOOL)isContainer { return YES; } - (PajeDrawingType)drawingType { return PajeContainerDrawingType; } - (void)addInstance:(PajeContainer *)container id1:(const char *)id1 id2:(const char *)id2 { [allInstances addObject:container]; if (id1 != NULL) { NSMapInsert(idToInstance, strdup(id1), container); } if (id2 != NULL && strcmp(id1, id2) != 0) { NSMapInsert(idToInstance, strdup(id2), container); } } - (PajeContainer *)instanceWithId:(const char *)containerId { if (containerId != NULL) { return NSMapGet(idToInstance, containerId); } return nil; } - (NSArray *)allInstances { return allInstances; } - (void)addContainedType:(PajeEntityType *)type { [containedTypes addObject:type]; } - (NSArray *)containedTypes { return containedTypes; } // NSCoding protocol - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:allInstances]; //FIXME -- how to encode this? -- probably types should not leave memory // [coder encodeObject:idToInstance]; [coder encodeObject:containedTypes]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; Assign(allInstances, [coder decodeObject]); //FIXME // Assign(idToInstance, [coder decodeObject]); Assign(containedTypes, [coder decodeObject]); return self; } @end @implementation PajeCategorizedEntityType - (id)initWithId:(NSString *)i description:(NSString *)d containerType:(PajeContainerType *)type event:(PajeEvent *)e { self = [super initWithId:i description:d containerType:type event:e]; if (self != nil) { aliasToValue = NSCreateMapTable(CStringMapKeyCallBacks, NSObjectMapValueCallBacks, 50); [self readDefaultColors]; } return self; } - (void)dealloc { NSFreeMapTable(aliasToValue); Assign(valueToColor, nil); [super dealloc]; } - (void)setValue:(id)value alias:(const char *)alias { if (alias != NULL) { NSMapInsert(aliasToValue, strdup(alias), value); } } - (void)setValue:(id)value alias:(const char *)alias color:(id)c { if (alias != NULL) { NSMapInsert(aliasToValue, strdup(alias), value); } [self setColor:c forValue:value]; } - (id)valueForAlias:(const char *)alias { id value; value = NSMapGet(aliasToValue, alias); if (value == nil) { value = [NSString stringWithCString:alias]; NSMapInsert(aliasToValue, strdup(alias), value); } return value; } - (NSArray *)allValues { return NSAllMapTableValues(aliasToValue); } - (NSColor *)colorForValue:(id)value { NSAssert([value isKindOfClass: [NSString class]], @"key must be of NSString class"); NSString *key = [value stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; NSColor *colorForValue; colorForValue = [valueToColor objectForKey:key]; if (colorForValue == nil) { colorForValue = [NSColor whiteColor]; } return colorForValue; } - (void)setColor:(NSColor*)colorForValue forValue:(id)value { NSAssert([value isKindOfClass: [NSString class]], @"key must be of NSString class"); NSString *key = [value stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; [valueToColor setObject:colorForValue forKey:key]; [[NSUserDefaults standardUserDefaults] setColorDictionary:valueToColor forKey:[description stringByAppendingString:@" Colors"]]; } - (void)readDefaultColors { id defaultColors; NSMutableDictionary *dict; defaultColors = [[NSUserDefaults standardUserDefaults] colorDictionaryForKey:[description stringByAppendingString:@" Colors"]]; if (defaultColors != nil) { dict = [[defaultColors mutableCopy] autorelease]; } else { dict = [NSMutableDictionary dictionary]; } Assign(valueToColor, dict); } // NSCoding protocol - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; //FIXME [coder encodeObject:aliasToValue]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; //FIXME Assign(aliasToValue, [coder decodeObject]); [self readDefaultColors]; return self; } @end @implementation PajeEventType - (PajeDrawingType)drawingType { return PajeEventDrawingType; } @end @implementation PajeStateType - (PajeDrawingType)drawingType { return PajeStateDrawingType; } @end #include @implementation PajeVariableType - (id)initWithId:(NSString *)i description:(NSString *)d containerType:(PajeContainerType *)type event:(PajeEvent *)e { self = [super initWithId:i description:d containerType:type event:e]; if (self != nil) { minValue = HUGE_VAL; maxValue = -HUGE_VAL; } return self; } + (NSArray *)allValues { return [NSArray array]; } - (void)dealloc { [super dealloc]; } - (PajeDrawingType)drawingType { return PajeVariableDrawingType; } - (void)possibleNewMinValue:(double)value { if (value < minValue) { minValue = value; } } - (void)possibleNewMaxValue:(double)value { if (value > maxValue) { maxValue = value; } } - (double)minValue { return minValue; } - (double)maxValue { return maxValue; } // NSCoding protocol - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:[NSNumber numberWithDouble:minValue]]; [coder encodeObject:[NSNumber numberWithDouble:maxValue]]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; minValue = [[coder decodeObject] doubleValue]; maxValue = [[coder decodeObject] doubleValue]; return self; } @end @implementation PajeLinkType + (PajeLinkType *)typeWithId:(id)i description:(id)d containerType:(PajeContainerType *)type sourceContainerType:(PajeContainerType *)sourceType destContainerType:(PajeContainerType *)destType event:(PajeEvent *)e { return [[[self alloc] initWithId:i description:d containerType:type sourceContainerType:sourceType destContainerType:destType event:e] autorelease]; } - (id)initWithId:(id)i description:(id)d containerType:(PajeContainerType *)type sourceContainerType:(PajeContainerType *)sourceType destContainerType:(PajeContainerType *)destType event:(PajeEvent *)e { self = [super initWithId:i description:d containerType:type event:e]; sourceContainerType = sourceType; destContainerType = destType; return self; } - (PajeContainerType *)sourceContainerType { return sourceContainerType; } - (PajeContainerType *)destContainerType { return destContainerType; } - (PajeDrawingType)drawingType { return PajeLinkDrawingType; } // NSCoding protocol - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:sourceContainerType]; [coder encodeObject:destContainerType]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; Assign(sourceContainerType, [coder decodeObject]); Assign(destContainerType, [coder decodeObject]); return self; } @end Paje-1.98/General/NSArray+Additions.m0000664000175000017500000000536411674062007017251 0ustar schnorrschnorr/* Copyright (c) 2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "NSArray+Additions.h" #include "Macros.h" #include // Enumerator of objects in a range of indexes of an array @interface ArrayRangeEnumerator : NSEnumerator { NSArray *array; NSRange range; unsigned nextIndex; } @end @implementation ArrayRangeEnumerator - (id)initWithArray:(NSArray *)anArray range:(NSRange)aRange { self = [super init]; if (self != nil) { Assign(array, anArray); range = aRange; nextIndex = range.location; int count = [array count]; if (NSMaxRange(range) >= count) { range.length = count - range.location; } } return self; } - (void)dealloc { Assign(array, nil); [super dealloc]; } - (id)nextObject { id nextObject; if (NSLocationInRange(nextIndex, range)) { nextObject = [array objectAtIndex:nextIndex]; nextIndex++; } else { nextObject = nil; } return nextObject; } @end // Reverse enumerator of objects in a range of indexes of an array @interface ReverseArrayRangeEnumerator : ArrayRangeEnumerator @end @implementation ReverseArrayRangeEnumerator - (id)initWithArray:(NSArray *)anArray range:(NSRange)aRange { self = [super initWithArray:anArray range:aRange]; if (self != nil) { nextIndex = NSMaxRange(range) - 1; } return self; } - (id)nextObject { id nextObject; if (NSLocationInRange(nextIndex, range)) { nextObject = [array objectAtIndex:nextIndex]; nextIndex--; } else { nextObject = nil; } return nextObject; } @end @implementation NSArray (PajeAdditions) - (NSEnumerator *)objectEnumeratorWithRange:(NSRange)range { return [[[ArrayRangeEnumerator alloc] initWithArray:self range:range] autorelease]; } - (NSEnumerator *)reverseObjectEnumeratorWithRange:(NSRange)range { return [[[ReverseArrayRangeEnumerator alloc] initWithArray:self range:range] autorelease]; } @end Paje-1.98/General/Protocols.h0000664000175000017500000001063211674062007015771 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _Protocols_h_ #define _Protocols_h_ /* Protocols.h * * Defines the protocols used in the Paje environment. * * 19970421 BS creation */ #include "FoundationAdditions.h" @class NSColor, NSNumber, NSArray, NSDate, PajeEntityType, PajeContainer; // drawing types of entities typedef enum { PajeEventDrawingType, // when there is only one time and one container PajeStateDrawingType, // when there are two times and one container PajeLinkDrawingType, // when there are two times and two containers PajeVariableDrawingType, // when there is a value associated between 2 times 1 ctr PajeContainerDrawingType, PajeNonDrawingType, } PajeDrawingType; @protocol PajeTiming // the time an entity starts, ends - (NSDate *)startTime; - (NSDate *)endTime; // the only time of an entity (an event), or it's startTime - (NSDate *)time; // like startTime and endTime, but firstTime is always before lastTime // (for cases in which clocks are not synchronized and a message arrives // before beeing sent). - (NSDate *)firstTime; - (NSDate *)lastTime; - (double)duration; @end @protocol PajeEntity //- (NSString *)name; - (NSString *)description; - (id)value; - (PajeEntityType *)entityType; - (NSArray *)relatedEntities; - (NSColor *)color; //- (id)node; - (void)setColor:(NSColor *)color; - (PajeDrawingType)drawingType; //- (id)hierarchy; - (PajeContainer *)container; - (int)imbricationLevel; - (NSArray *)fieldNames; - (id)valueOfFieldNamed:(NSString *)fieldName; // When the entity has subentities - (BOOL)isAggregate; - (unsigned)subCount; - (NSColor *)subColorAtIndex:(unsigned)index; - (id)subValueAtIndex:(unsigned)index; - (double)subDurationAtIndex:(unsigned)index; - (unsigned)subCountAtIndex:(unsigned)index; @end @protocol PajeEntityType - (NSArray *)allValues; - (NSColor *)colorForValue:(id)value; - (void)setColor:(NSColor*)color forValue:(id)value; @end @protocol PajeEvent //- (id)thread; @end @protocol PajeState @end @protocol PajeComm //- (id)sourceNode; //- (id)destNode; //- (id)sourceThread; //- (id)destThread; @end @protocol PajeVariable - (double)doubleValue; @end @protocol PajeLink - (PajeEntityType *)sourceEntityType; - (PajeEntityType *)destEntityType; - (PajeContainer *)sourceContainer; - (PajeContainer *)destContainer; @end @protocol PajeComponent //- (void)setOutputComponent:(id)comp; - (void)encodeCheckPointWithCoder:(NSCoder *)coder; - (void)decodeCheckPointWithCoder:(NSCoder *)coder; @end @protocol PajeTool - (NSString *)toolName; - (void)activateTool:(id)sender; @end /* @protocol PajeReader - (BOOL)readNextEvent; - (NSDictionary *)setInputFilename:(NSString *)filename; - (NSString *)inputFilename; - (NSDate *)currentTime; - (id )readEvent; @end */ /* Reader - (void)readEvent; - (void)readNextEvent; - (void)readUntilTime:(NSDate *)t - (void)decodeCheckPointWithCoder:(NSCoder *)c - (void)encodeCheckPointWithCoder:(NSCoder *)c - (void)setInputFileName:(NSString *)filename Trace - (void)removeObjectsBeforeTime:(NSDate *)t */ @protocol PajeReader - (void)setInputFilename:(NSString *)filename; - (NSString *)inputFilename; - (void)startChunk:(int)chunkNumber; - (void)readNextChunk; - (void)endOfChunkLast:(BOOL)last; - (BOOL)hasMoreData; - (void)setUserChunkSize:(unsigned long long)cs; @end @protocol PajeSimulator - (int)eventCount; - (NSDate *)currentTime; - (void)endOfChunkLast:(BOOL)last; @end @protocol PajeInspector //+ (id )inspector; - (void)inspect:(id)sender; @end #endif Paje-1.98/General/PTime.h0000664000175000017500000000252011674062007015020 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PTime_h_ #define _PTime_h_ /* PTime.h * * A subclass of NSDate that shows times as seconds. */ #include @interface PTime : NSDate { NSTimeInterval secondsSinceReferenceDate; } + (void)setInitialTime:(PTime *)time; - (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds; - (NSTimeInterval)timeIntervalSinceReferenceDate; - (NSString *)description; // NSCoding protocol - (void)encodeWithCoder:(NSCoder *)coder; - (id)initWithCoder:(NSCoder *)coder; @end #endif Paje-1.98/General/HierarchyBrowser.m0000664000175000017500000002234411674062007017277 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // #include "HierarchyBrowser.h" #include "Macros.h" @interface NSObject (HierarchyBrowserDelegate) - (void)hierarchyBrowserContainerSelected:(HierarchyBrowser *)sender; @end @implementation HierarchyBrowser - (id)initWithFilter:(PajeFilter *)f { self = [super init]; if (self) { filter = f; // not retained if (![NSBundle loadNibNamed:@"HierarchyBrowser" owner:self]) NSRunAlertPanel(@"HierarchyBrowser", @"Couldn't load interface file", nil, nil, nil); } return self; } - (void)dealloc { // filter is not retained, do not release it. Assign(containerTypesBrowser, nil); Assign(containersBrowser, nil); Assign(splitView, nil); containersOnly = NO; [super dealloc]; } - (void)awakeFromNib { NSWindow *window; window = [splitView window]; [splitView retain]; [splitView removeFromSuperview]; #ifndef GNUSTEP [window release]; #endif } - (void)refresh { [containersBrowser loadColumnZero]; [containerTypesBrowser loadColumnZero]; //if (selection) // [self select:selection]; } - (void)refreshLastColumn { // FIXME: this is wrong. sometimes it should be lastcolumn-1 [containersBrowser reloadColumn:[containersBrowser /*selected*/lastColumn]]; } - (void)setFilter:(PajeFilter *)f { filter = f; // not retained [self refresh]; } - (void)setContainersOnly:(BOOL)flag { containersOnly = flag; } - (NSView *)view { return splitView; } - (PajeEntityType *)selectedEntityType { NSCell *selectedCell; PajeEntity *selectedEntity; selectedCell = [containersBrowser selectedCell]; selectedEntity = [selectedCell representedObject]; return [selectedEntity entityType]; } - (NSArray *)selectedContainers { NSMutableArray *array = [NSMutableArray array]; NSEnumerator *cellEnum = [[containersBrowser selectedCells] objectEnumerator]; NSCell *cell; while ((cell = [cellEnum nextObject]) != nil) { [array addObject:[cell representedObject]]; } return array; } - (void)selectContainers:(NSArray *)containers { // FIXME: this is wrong. sometimes it should be lastcolumn-1 NSMatrix *matrix = [containersBrowser matrixInColumn:[containersBrowser lastColumn]]; NSCell *cell; int row = 0; //NSLog(@"matrix=%@ [%@]", matrix, [[matrix cellAtRow:row column:0] representedObject]); while ((cell = [matrix cellAtRow:row column:0]) != nil) { //NSLog(@"select? %@", [cell representedObject]); if ([containers indexOfObjectIdenticalTo:[cell representedObject]] != NSNotFound) { [matrix selectCellAtRow:row column:0]; } row++; } } - (NSArray *)selectedNames { NSMutableArray *array = [NSMutableArray array]; NSEnumerator *cellEnum = [[containersBrowser selectedCells] objectEnumerator]; NSCell *cell; while ((cell = [cellEnum nextObject]) != nil) { [array addObject:[cell stringValue]]; } return array; } - (PajeContainer *)selectedParentContainer { return [[(NSCell *)[containersBrowser selectedCell] representedObject] container]; } - (void)_syncBottom:(id)sender // Make visible columns in bottom browser same as top one { int first = [containerTypesBrowser firstVisibleColumn]; int last = [containerTypesBrowser lastVisibleColumn]; while ([containersBrowser lastColumn] < last) [containersBrowser addColumn]; if ([containersBrowser firstVisibleColumn] > first) [containersBrowser scrollColumnToVisible:first]; if ([containersBrowser lastVisibleColumn] < last) [containersBrowser scrollColumnToVisible:last]; } - (void)_syncTop:(id)sender // Make visible columns in top browser same as bottom one { int first = [containersBrowser firstVisibleColumn]; int last = [containersBrowser lastVisibleColumn]; // return; if ([containerTypesBrowser firstVisibleColumn] > first) [containerTypesBrowser scrollColumnToVisible:first]; if ([containerTypesBrowser lastVisibleColumn] < last) [containerTypesBrowser scrollColumnToVisible:last]; } // NSBrowser actions - (IBAction)containerTypeSelected:(NSBrowser *)sender { if ([sender selectedColumn] != 0) { if ([containersBrowser selectedCellInColumn:[sender selectedColumn]-1] == nil) { [containersBrowser selectRow:0 inColumn:[sender selectedColumn]-1]; } } [containersBrowser reloadColumn:[sender selectedColumn]]; //[containersBrowser reloadColumn:[sender selectedColumn] + 1]; } - (IBAction)containerSelected:(NSBrowser *)sender { if ([filter respondsToSelector:@selector(hierarchyBrowserContainerSelected:)]) { [filter hierarchyBrowserContainerSelected:self]; } } // NSBrowser delegate - (void)browser:(NSBrowser *)sender createRowsForColumn:(int)column inMatrix:(NSMatrix *)matrix { if (sender == containerTypesBrowser) [self containerTypesBrowser:sender createRowsForColumn:column inMatrix:matrix]; else if (sender == containersBrowser) [self containersBrowser:sender createRowsForColumn:column inMatrix:matrix]; else NSDebugLog(@"Unknown browser in HierarchyBrowser"); } - (void)containersBrowser:(NSBrowser *)sender createRowsForColumn:(int)column inMatrix:(NSMatrix *)matrix { id upperContainer; NSEnumerator *containerEnum; PajeContainer *container; id containerType; int row; NSBrowserCell *cell; BOOL isContainer; if (column == 0) { upperContainer = [filter rootInstance]; } else { NSCell *selectedCell; selectedCell = [sender selectedCellInColumn:column-1]; upperContainer = [selectedCell representedObject]; } cell = [containerTypesBrowser selectedCellInColumn:column]; containerType = [cell representedObject]; if (containerType == nil) { return; } isContainer = ![cell isLeaf]; if (isContainer || containersOnly) { containerEnum = [filter enumeratorOfContainersTyped:containerType inContainer:upperContainer]; } else { containerEnum = [[filter allValuesForEntityType:containerType] objectEnumerator]; } for (row = 0; (container = [containerEnum nextObject]) != nil; row++) { NSBrowserCell *cell; [matrix renewRows:row+1 columns:1]; cell = [matrix cellAtRow:row column:0]; [cell setRepresentedObject:container]; [cell setStringValue:[container name]]; [cell setLeaf:!isContainer]; } if ([containerTypesBrowser lastColumn] < column) { // NSLog(@"antesB: %d, %d", [containerTypesBrowser lastColumn], column); [containerTypesBrowser addColumn]; // NSLog(@"depoisB: %d, %d", [containerTypesBrowser lastColumn], column); } } - (void)containerTypesBrowser:(NSBrowser *)sender createRowsForColumn:(int)column inMatrix:(NSMatrix *)matrix { int rows; NSEnumerator *typeEnum; PajeEntityType *containerType; PajeEntityType *entityType; if (column == 0) { containerType = [filter rootEntityType]; } else { containerType = [(NSCell *)[sender selectedCellInColumn:column-1] representedObject]; } rows=0; typeEnum = [[filter containedTypesForContainerType:containerType] objectEnumerator]; while ((entityType = [typeEnum nextObject]) != nil) { NSBrowserCell *cell; BOOL isContainer = [filter isContainerEntityType:entityType]; if (containersOnly && !isContainer) { continue; } rows++; [matrix renewRows:rows columns:1]; cell = [matrix cellAtRow:rows-1 column:0]; [cell setRepresentedObject:entityType]; [cell setStringValue:[entityType description]]; // FIXME: if containersOnly, containers that do not contain containers // should be leaves [cell setLeaf:!isContainer]; } } - (void)browserDidScroll:(NSBrowser *)sender { // one browser scrolled. sync the other one. // do delayed performing because visibleColumns are not yet updated when this method is called (at least in OS4.2). if (sender == containerTypesBrowser) [self _syncBottom:self];//[self performSelector:@selector(_syncBottom:) withObject:self afterDelay:1.0]; else [self _syncTop:self];//[self performSelector:@selector(_syncTop:) withObject:self afterDelay:1.0]; } @end Paje-1.98/General/PajeFilter.m0000664000175000017500000004454111674062007016045 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ //#define COMPATIBILITY #include "PajeFilter.h" #include "Macros.h" #include "../Paje/PajeTraceController.h" @implementation PajeComponent + (PajeComponent *)componentWithController:(PajeTraceController *)c { return [[[self alloc] initWithController:c] autorelease]; } - (id)initWithController:(PajeTraceController *)c { self = [super init]; controller = c; outputSelector = @selector(inputEntity:); return self; } - (id)init { NSLog(@"Shouldn't call init in a PajeComponent [%@]", self); NSAssert(0, @"Bye"); self = [super init]; NSLog(@"%@ no init", self); outputSelector = @selector(inputEntity:); return self; } - (void)dealloc { [self disconnectComponent]; [super dealloc]; } - (void)disconnectComponent { [self setInputComponent:nil]; [self setOutputComponent:nil]; } - (void)setInputComponent:(PajeFilter *)component { inputComponent = component; } - (void)setOutputComponent:(PajeFilter *)component { if (component == nil) { Assign(outputComponent, component); return; } if (outputComponent != nil) { // HACK if ([outputComponent isKindOfClass: [NSMutableArray class]]) { [(NSMutableArray *)outputComponent addObject:component]; } else { [outputComponent release]; outputComponent = [[NSMutableArray arrayWithObjects:outputComponent, component, nil] retain]; } } else { outputComponent = [component retain]; } } - (void)inputEntity:(id)entity { NSAssert(0, @"should be implemented in subclass!"); } - (void)outputEntity:(id)entity { if ([outputComponent isKindOfClass:[NSArray class]]) // HACK [(NSArray*)outputComponent makeObjectsPerformSelector:outputSelector withObject:entity]; else [outputComponent performSelector:outputSelector withObject:entity]; } - (BOOL)canEndChunkBefore:(id)entity { return [outputComponent canEndChunkBefore:entity]; } /* only for use by simulator */ - (NSString *)traceDescription { return [inputComponent traceDescription]; } - (void)registerFilter:(PajeFilter *)filter { [controller registerFilter:filter]; } - (NSString *)filterName { return NSStringFromClass([self class]); } - (NSString *)toolName { return [self filterName]; } - (NSView *)filterView { return nil; } - (NSString *)filterKeyEquivalent { return @""; } - (id)filterDelegate { return nil; } - (void)registerTool:(id)filter { [controller registerTool:filter]; } - (void)startChunk:(int)chunkNumber { if ([outputComponent isKindOfClass:[NSArray class]]) {// HACK [NSException raise:@"Unimplemented" format:@"[-startChunk:]" " not implemented for group of components\n" "Simplify your component graph"]; } else { [outputComponent startChunk:chunkNumber]; } } - (void)endOfChunkLast:(BOOL)last { if ([outputComponent isKindOfClass:[NSArray class]]) {// HACK [NSException raise:@"Unimplemented" format:@"[-endOfChunkLast:]" " not implemented for group of components\n" "Simplify your component graph"]; } else { [outputComponent endOfChunkLast:last]; } } @end @implementation PajeFilter // // Deal with notifications // - (void)timeLimitsChanged { if ([outputComponent isKindOfClass:[NSArray class]]) { [(NSArray*)outputComponent makeObjectsPerformSelector:_cmd]; } else { [outputComponent timeLimitsChanged]; } } - (void)dataChangedForEntityType:(PajeEntityType *)entityType { if ([outputComponent isKindOfClass:[NSArray class]]) { [(NSArray *)outputComponent makeObjectsPerformSelector:_cmd withObject:entityType]; } else { [outputComponent dataChangedForEntityType:entityType]; } } - (void)limitsChangedForEntityType:(PajeEntityType *)entityType { if ([outputComponent isKindOfClass:[NSArray class]]) { [(NSArray *)outputComponent makeObjectsPerformSelector:_cmd withObject:entityType]; } else { [outputComponent limitsChangedForEntityType:entityType]; } } - (void)colorChangedForEntityType:(PajeEntityType *)entityType { if ([outputComponent isKindOfClass:[NSArray class]]) { [(NSArray *)outputComponent makeObjectsPerformSelector:_cmd withObject:entityType]; } else { [outputComponent colorChangedForEntityType:entityType]; } } - (void)orderChangedForContainerType:(PajeEntityType *)containerType; { if ([outputComponent isKindOfClass:[NSArray class]]) { [(NSArray *)outputComponent makeObjectsPerformSelector:_cmd withObject:containerType]; } else { [outputComponent orderChangedForContainerType:containerType]; } } - (void)hierarchyChanged { if ([outputComponent isKindOfClass:[NSArray class]]) { [(NSArray*)outputComponent makeObjectsPerformSelector:_cmd]; } else { [outputComponent hierarchyChanged]; } } - (void)containerSelectionChanged { if ([outputComponent isKindOfClass:[NSArray class]]) { [(NSArray*)outputComponent makeObjectsPerformSelector:_cmd]; } else { [outputComponent containerSelectionChanged]; } } - (void)timeSelectionChanged { if ([outputComponent isKindOfClass:[NSArray class]]) { [(NSArray*)outputComponent makeObjectsPerformSelector:_cmd]; } else { [outputComponent timeSelectionChanged]; } } - (void)entitySelectionChanged { if ([outputComponent isKindOfClass:[NSArray class]]) { [(NSArray*)outputComponent makeObjectsPerformSelector:_cmd]; } else { [outputComponent entitySelectionChanged]; } } // // Filter commands // - (void)hideEntityType:(PajeEntityType *)entityType { [inputComponent hideEntityType:entityType]; } - (void)hideSelectedContainers { [inputComponent hideSelectedContainers]; } - (void)setSelectedContainers:(NSSet *)containers { [inputComponent setSelectedContainers:containers]; } - (void)setOrder:(NSArray *)containers ofContainersTyped:(PajeEntityType *)containerType inContainer:(PajeContainer *)container { [inputComponent setOrder:containers ofContainersTyped:containerType inContainer:container]; } - (void)setSelectionStartTime:(NSDate *)from endTime:(NSDate *)to { [inputComponent setSelectionStartTime:from endTime:to]; } - (void)setColor:(NSColor *)color forValue:(id)value ofEntityType:(PajeEntityType *)entityType { [inputComponent setColor:color forValue:value ofEntityType:entityType]; } - (void)setColor:(NSColor *)color forEntityType:(PajeEntityType *)entityType { [inputComponent setColor:color forEntityType:entityType]; } - (void)setColor:(NSColor *)color forEntity:(id)entity; { [inputComponent setColor:color forEntity:entity]; } - (void)verifyStartTime:(NSDate *)start endTime:(NSDate *)end { [inputComponent verifyStartTime:start endTime:end]; } // // Inspecting an entity // - (void)inspectEntity:(id)entity { [inputComponent inspectEntity:entity]; } // // Deal with queries // // // Accessing entities // - (NSDate *)startTime { return [inputComponent startTime]; } - (NSDate *)endTime { return [inputComponent endTime]; } - (PajeContainer *)rootInstance { return [inputComponent rootInstance]; } - (NSDate *)selectionStartTime { return [inputComponent selectionStartTime]; } - (NSDate *)selectionEndTime { return [inputComponent selectionEndTime]; } - (NSSet *)selectedContainers { return [inputComponent selectedContainers]; } - (NSArray *)containedTypesForContainerType:(PajeEntityType *)containerType { return [inputComponent containedTypesForContainerType:containerType]; } - (PajeContainerType *)containerTypeForType:(PajeEntityType *)entityType { return [inputComponent containerTypeForType:entityType]; } - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { return [inputComponent enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { return [inputComponent enumeratorOfCompleteEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; } - (NSEnumerator *)enumeratorOfContainersTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container { return [inputComponent enumeratorOfContainersTyped:entityType inContainer:container]; } - (NSArray *)allValuesForEntityType:(PajeEntityType *)entityType { return [inputComponent allValuesForEntityType:entityType]; } - (NSString *)descriptionForEntityType:(PajeEntityType *)entityType { return [inputComponent descriptionForEntityType:entityType]; } - (double)minValueForEntityType:(PajeEntityType *)entityType { return [inputComponent minValueForEntityType:entityType]; } - (double)maxValueForEntityType:(PajeEntityType *)entityType { return [inputComponent maxValueForEntityType:entityType]; } - (double)minValueForEntityType:(PajeEntityType *)entityType inContainer:(PajeContainer *)container { return [inputComponent minValueForEntityType:entityType inContainer:container]; } - (double)maxValueForEntityType:(PajeEntityType *)entityType inContainer:(PajeContainer *)container { return [inputComponent maxValueForEntityType:entityType inContainer:container]; } - (BOOL)isHiddenEntityType:(PajeEntityType *)entityType { return [inputComponent isHiddenEntityType:entityType]; } - (PajeDrawingType)drawingTypeForEntityType:(PajeEntityType *)entityType { return [inputComponent drawingTypeForEntityType:entityType]; } - (NSArray *)fieldNamesForEntityType:(PajeEntityType *)entityType { return [inputComponent fieldNamesForEntityType:entityType]; } - (NSArray *)fieldNamesForEntityType:(PajeEntityType *)entityType name:(NSString *)name { return [inputComponent fieldNamesForEntityType:entityType name:name]; } - (id)valueOfFieldNamed:(NSString *)fieldName forEntityType:(PajeEntityType *)entityType { return [inputComponent valueOfFieldNamed:fieldName forEntityType:entityType]; } - (NSColor *)colorForValue:(id)value ofEntityType:(PajeEntityType *)entityType { return [inputComponent colorForValue:value ofEntityType:entityType]; } - (NSColor *)colorForEntityType:(PajeEntityType *)entityType { return [inputComponent colorForEntityType:entityType]; } // // Getting info from entity // - (NSArray *)fieldNamesForEntity:(id)entity { return [inputComponent fieldNamesForEntity:entity]; } - (id)valueOfFieldNamed:(NSString *)fieldName forEntity:(id)entity { return [inputComponent valueOfFieldNamed:fieldName forEntity:entity]; } - (PajeContainer *)containerForEntity:(id)entity { return [inputComponent containerForEntity:entity]; } - (PajeEntityType *)entityTypeForEntity:(id)entity { return [inputComponent entityTypeForEntity:entity]; } - (PajeContainer *)sourceContainerForEntity:(id)entity { return [inputComponent sourceContainerForEntity:entity]; } - (PajeEntityType *)sourceEntityTypeForEntity:(id)entity { return [inputComponent sourceEntityTypeForEntity:entity]; } - (PajeContainer *)destContainerForEntity:(id)entity { return [inputComponent destContainerForEntity:entity]; } - (PajeEntityType *)destEntityTypeForEntity:(id)entity { return [inputComponent destEntityTypeForEntity:entity]; } - (NSArray *)relatedEntitiesForEntity:(id)entity { return [inputComponent relatedEntitiesForEntity:entity]; } - (NSColor *)colorForEntity:(id)entity { return [inputComponent colorForEntity:entity]; } - (NSDate *)startTimeForEntity:(id)entity { return [inputComponent startTimeForEntity:entity]; } - (NSDate *)endTimeForEntity:(id)entity { return [inputComponent endTimeForEntity:entity]; } - (NSDate *)timeForEntity:(id)entity { return [inputComponent timeForEntity:entity]; } - (double)durationForEntity:(id)entity { return [inputComponent durationForEntity:entity]; } - (PajeDrawingType)drawingTypeForEntity:(id)entity { return [inputComponent drawingTypeForEntity:entity]; } - (id)valueForEntity:(id)entity { return [inputComponent valueForEntity:entity]; } - (double)doubleValueForEntity:(id)entity // for variables { return [inputComponent doubleValueForEntity:entity]; } - (double)minValueForEntity:(id)entity // for variables { return [inputComponent minValueForEntity:entity]; } - (double)maxValueForEntity:(id)entity // for variables { return [inputComponent maxValueForEntity:entity]; } - (NSString *)descriptionForEntity:(id)entity { return [inputComponent descriptionForEntity:entity]; } - (int)imbricationLevelForEntity:(id)entity { return [inputComponent imbricationLevelForEntity:entity]; } - (BOOL)isAggregateEntity:(id)entity { return [inputComponent isAggregateEntity:entity]; } - (unsigned)subCountForEntity:(id)entity { return [inputComponent subCountForEntity:entity]; } - (NSColor *)subColorAtIndex:(unsigned)index forEntity:(id)entity { return [inputComponent subColorAtIndex:index forEntity:entity]; } - (id)subValueAtIndex:(unsigned)index forEntity:(id)entity { return [inputComponent subValueAtIndex:index forEntity:entity]; } - (double)subDurationAtIndex:(unsigned)index forEntity:(id)entity { return [inputComponent subDurationAtIndex:index forEntity:entity]; } - (unsigned)subCountAtIndex:(unsigned)index forEntity:(id)entity { return [inputComponent subCountAtIndex:index forEntity:entity]; } - (BOOL)canHighlightEntity:(id)entity { return [inputComponent canHighlightEntity:entity]; } - (BOOL)isSelectedEntity:(id)entity { return [inputComponent isSelectedEntity:entity]; } // configure filter - (id)configuration { return nil; } - (void)setConfiguration:(id)config { } @end @implementation PajeFilter(AuxiliaryMethods) - (PajeEntityType *)rootEntityType { return [self entityTypeForEntity:[self rootInstance]]; } - (NSArray *)allEntityTypes { NSMutableArray *allEntityTypes; int index; id rootEntityType = [self rootEntityType]; if (rootEntityType == nil) { return [NSArray array]; } allEntityTypes = [NSMutableArray arrayWithObject:rootEntityType]; index = 0; while (index < [allEntityTypes count]) { [allEntityTypes addObjectsFromArray:[self containedTypesForContainerType:[allEntityTypes objectAtIndex:index]]]; index++; } return allEntityTypes; } - (BOOL)isContainerEntityType:(PajeEntityType *)entityType { return [self drawingTypeForEntityType:entityType] == PajeContainerDrawingType; } - (PajeEntityType *)entityTypeWithName:(NSString *)n { NSEnumerator *entityTypeEnum; PajeEntityType *entityType; entityTypeEnum = [[self allEntityTypes] objectEnumerator]; while ((entityType = [entityTypeEnum nextObject]) != nil) { if ([n isEqual:[self descriptionForEntityType:entityType]]) { break; } } return entityType; } - (PajeContainer *)containerWithName:(NSString *)n type:(PajeEntityType *)t { NSEnumerator *containerEnum; PajeContainer *container; containerEnum = [self enumeratorOfContainersTyped:t inContainer:[self rootInstance]]; while ((container = [containerEnum nextObject]) != nil) { if ([n isEqual:[self nameForContainer:container]]) { break; } } return container; } - (NSString *)nameForContainer:(PajeContainer *)container { return [container name]; } @end Paje-1.98/General/PajeEvent.m0000664000175000017500000003710211674062007015674 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* PajeEvent.m * * * 20021112 BS creation (from A0Event) */ #include "PajeEvent.h" #include "NSUserDefaults+Additions.h" #include "NSColor+Additions.h" #include "UniqueString.h" #include "Protocols.h" #include "PajeType.h" #include "Macros.h" // must follow PajeEventId definition char *PajeEventNames[] = { "PajeStartTrace", "PajeDefineContainerType", "PajeDefineEventType", "PajeDefineStateType", "PajeDefineVariableType", "PajeDefineLinkType", "PajeDefineEntityValue", "PajeCreateContainer", "PajeDestroyContainer", "PajeNewEvent", "PajeSetState", "PajePushState", "PajePopState", "PajeSetVariable", "PajeAddVariable", "PajeSubVariable", "PajeStartLink", "PajeEndLink" }; // must follow PajeFieldId definition NSString *PajeFieldNames[] = { @"EventId", @"Time", @"Name", @"Alias", //"ContainerType", //"EntityType", @"Type", @"Container", @"StartContainerType", @"EndContainerType", @"StartContainer", @"EndContainer", @"Color", @"Value", @"Key", @"File", @"Line" }; NSString *PajeOldFieldNames[] = { @"", @"", @"NewName", // Container @"NewType", // NewValue, NewContainer //"", //"Type", @"NewContainerType", @"", @"SourceContainerType", @"DestContainerType", @"SourceContainer", @"DestContainer", @"", @"", @"", @"FileName", @"LineNumber" }; NSString *PajeOld1FieldNames[] = { @"", @"", @"", // Container @"NewValue", // NewContainer //"", //"", @"ContainerType", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"" }; NSString *PajeOld2FieldNames[] = { @"", @"", @"", // Container @"NewContainer", // NewContainer //"", //"", @"EntityType", @"", @"", @"", @"", @"", @"", @"", @"", @"", @"" }; NSArray *PajeExtraFieldNames; PajeFieldId obligatoryFieldIds[][10] = { /*PajeStartTrace */{ -1 }, /*PajeDefineContainerType*/{ PajeNameFieldId, PajeTypeFieldId, -1 }, /*PajeDefineEventType */{ PajeNameFieldId, PajeTypeFieldId, -1 }, /*PajeDefineStateType */{ PajeNameFieldId, PajeTypeFieldId, -1 }, /*PajeDefineVariableType */{ PajeNameFieldId, PajeTypeFieldId, -1 }, /*PajeDefineLinkType */{ PajeNameFieldId, PajeTypeFieldId, PajeStartContainerTypeFieldId, PajeEndContainerTypeFieldId, -1 }, /*PajeDefineEntityValue */{ PajeNameFieldId, PajeTypeFieldId, -1 }, /*PajeCreateContainer */{ PajeTimeFieldId, PajeNameFieldId, PajeTypeFieldId, PajeContainerFieldId, -1 }, /*PajeDestroyContainer */{ PajeTimeFieldId, PajeNameFieldId, PajeTypeFieldId, -1 }, /*PajeNewEvent */{ PajeTimeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeValueFieldId, -1 }, /*PajeSetState */{ PajeTimeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeValueFieldId, -1 }, /*PajePushState */{ PajeTimeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeValueFieldId, -1 }, /*PajePopState */{ PajeTimeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeValueFieldId, -1 }, /*PajeSetVariable */{ PajeTimeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeValueFieldId, -1 }, /*PajeAddVariable */{ PajeTimeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeValueFieldId, -1 }, /*PajeSubVariable */{ PajeTimeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeValueFieldId, -1 }, /*PajeStartLink */{ PajeTimeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeValueFieldId, PajeStartContainerFieldId, PajeKeyFieldId, -1 }, /*PajeEndLink */{ PajeTimeFieldId, PajeTypeFieldId, PajeContainerFieldId, PajeValueFieldId, PajeEndContainerFieldId, PajeKeyFieldId, -1 } }; PajeFieldId optionalFieldIds[][5] = { /*PajeStartTrace */{ -1 }, /*PajeDefineContainerType*/{ PajeAliasFieldId, -1 }, /*PajeDefineEventType */{ PajeAliasFieldId, -1 }, /*PajeDefineStateType */{ PajeAliasFieldId, -1 }, /*PajeDefineVariableType */{ PajeAliasFieldId, -1 }, /*PajeDefineLinkType */{ PajeAliasFieldId, -1 }, /*PajeDefineEntityValue */{ PajeAliasFieldId, PajeColorFieldId, -1 }, /*PajeCreateContainer */{ PajeAliasFieldId, -1 }, /*PajeDestroyContainer */{ -1 }, /*PajeNewEvent */{ PajeFileFieldId, PajeLineFieldId, -1 }, /*PajeSetState */{ PajeFileFieldId, PajeLineFieldId, -1 }, /*PajePushState */{ PajeFileFieldId, PajeLineFieldId, -1 }, /*PajePopState */{ PajeFileFieldId, PajeLineFieldId, -1 }, /*PajeSetVariable */{ -1 }, /*PajeAddVariable */{ -1 }, /*PajeSubVariable */{ -1 }, /*PajeStartLink */{ PajeFileFieldId, PajeLineFieldId, -1 }, /*PajeEndLink */{ PajeFileFieldId, PajeLineFieldId, -1 } }; NSMutableArray *PajeUserFieldNames; PajeEventId pajeEventIdFromName(const char *name) { PajeEventId i; for (i = 0; i < PajeEventIdCount; i++) { if (strcmp(name, PajeEventNames[i]) == 0) { return i; } } return -1; } PajeFieldId pajeFieldIdFromName(const char *name) { PajeEventId i; for (i = 0; i < PajeFieldIdCount; i++) { if (strcmp(name, [PajeFieldNames[i] cString]) == 0) { return i; } } for (i = 0; i < PajeFieldIdCount; i++) { if (strcmp(name, [PajeOldFieldNames[i] cString]) == 0 || strcmp(name, [PajeOld1FieldNames[i] cString]) == 0 || strcmp(name, [PajeOld2FieldNames[i] cString]) == 0) { return i; } } for (i = 0; i < [PajeUserFieldNames count]; i++) { if (strcmp(name, [[PajeUserFieldNames objectAtIndex:i] cString]) == 0) { return i + PajeFieldIdCount; } } [PajeUserFieldNames addObject:[NSString stringWithCString:name]]; return i + PajeFieldIdCount; } NSString *pajeFieldNameFromId(PajeFieldId fieldId) { if (fieldId < PajeFieldIdCount) { return PajeFieldNames[fieldId]; } else { return [PajeUserFieldNames objectAtIndex:fieldId - PajeFieldIdCount]; } } PajeFieldType pajeFieldTypeFromName(const char *name) { if (strcmp(name, "int") == 0) return PajeIntFieldType; if (strcmp(name, "hex") == 0) return PajeHexFieldType; if (strcmp(name, "date") == 0) return PajeDateFieldType; if (strcmp(name, "double") == 0) return PajeDoubleFieldType; if (strcmp(name, "string") == 0) return PajeStringFieldType; if (strcmp(name, "color") == 0) return PajeColorFieldType; return PajeUnknownFieldType; } @implementation PajeEventDefinition + (void)initialize { PajeUserFieldNames = [[NSMutableArray alloc] init]; } + (PajeEventDefinition *)definitionWithPajeEventId:(PajeEventId)anId internalId:(const char *)internalId { return [[[self alloc] initWithPajeEventId:anId internalId:internalId] autorelease]; } - (id)initWithPajeEventId:(PajeEventId)anId internalId:(const char *)internalId { self = [super init]; if (self != nil) { eventId = strdup(internalId); pajeEventId = anId; fieldTypes[0] = PajeIntFieldType; fieldIds[0] = PajeEventIdFieldId; fieldCount = 1; extraFieldCount = 0; int i; for (i = 0; i < PajeFieldIdCount; i++) { fieldIndexes[i] = -1; } fieldIndexes[PajeEventIdFieldId] = 0; } return self; } - (void)dealloc { free(eventId); [fieldNames release]; [extraFieldNames release]; [super dealloc]; } - (int)indexForFieldId:(PajeFieldId)fieldId { if (fieldId < PajeFieldIdCount) { return fieldIndexes[fieldId]; } else { int i; for (i = 0; i < fieldCount; i++) { if (fieldIds[i] == fieldId) { return i; } } return -1; } } - (BOOL)isObligatoryOrOptionalFieldId:(PajeFieldId)aFieldId { int i; PajeFieldId fieldId; for (i = 0; ; i++) { fieldId = obligatoryFieldIds[pajeEventId][i]; if (fieldId == -1) break; if (fieldId == aFieldId) { return YES; } } for (i = 0; ; i++) { fieldId = optionalFieldIds[pajeEventId][i]; if (fieldId == -1) break; if (fieldId == aFieldId) { return YES; } } return NO; } - (void)addFieldId:(PajeFieldId)fieldId fieldType:(PajeFieldType)fieldType { if (fieldCount >= PE_MAX_NFIELDS) { NSLog(@"Too many fields in event definition '%s'.", eventId); return; } fieldTypes[fieldCount] = fieldType; fieldIds[fieldCount] = fieldId; if ([self indexForFieldId:fieldId] != -1) { NSLog(@"Repeated field named '%@' in event definition %s.", pajeFieldNameFromId(fieldId), eventId); } else if (fieldId < PajeFieldIdCount) { fieldIndexes[fieldId] = fieldCount; } if (![self isObligatoryOrOptionalFieldId:fieldId]) { extraFieldIds[extraFieldCount++] = fieldId; } fieldCount++; } - (int)fieldCount { return fieldCount; } - (NSArray *)fieldNames { if (fieldNames == nil) { NSString *names[fieldCount]; fieldNames = [NSMutableArray array]; int i; for (i = 0; i < fieldCount; i++) { names[i] = pajeFieldNameFromId(fieldIds[i]); } fieldNames = [[NSArray alloc] initWithObjects:names count:fieldCount]; } return fieldNames; } - (NSArray *)extraFieldNames { if (extraFieldCount == 0) { return nil; } if (extraFieldNames == nil) { NSString *names[extraFieldCount]; int i; for (i = 0; i < extraFieldCount; i++) { names[i] = pajeFieldNameFromId(extraFieldIds[i]); } extraFieldNames = [[NSArray alloc] initWithObjects:names count:extraFieldCount]; } return extraFieldNames; } @end @implementation PajeEvent + (PajeEvent *)eventWithDefinition:(PajeEventDefinition *)definition line:(line *)line { return [[[self alloc] initWithDefinition:definition line:line] autorelease]; } - (id)initWithDefinition:(PajeEventDefinition *)definition line:(line *)line { if (line->word_count != [definition fieldCount]) { NSLog(@"Field count (%d) does not match definition (%d)", line->word_count, [definition fieldCount]); return nil; } self = [super init]; if (self != nil) { Assign(pajeEventDefinition, definition); valueLine = line; } return self; } - (PajeEventId)pajeEventId { return pajeEventDefinition->pajeEventId; } - (id)valueForFieldId:(PajeFieldId)fieldId { int fieldIndex; fieldIndex = [pajeEventDefinition indexForFieldId:fieldId]; if (fieldIndex < 0) { return nil; } char *fieldValue; fieldValue = valueLine->word[fieldIndex]; PajeFieldType fieldType; fieldType = pajeEventDefinition->fieldTypes[fieldIndex]; switch (fieldType) { case PajeIntFieldType: return [NSNumber numberWithInt:atoi(fieldValue)]; case PajeHexFieldType: return [NSNumber numberWithInt:strtol(fieldValue, (char **)NULL, 16)]; case PajeDateFieldType: return [NSDate dateWithTimeIntervalSinceReferenceDate:atof(fieldValue)]; case PajeDoubleFieldType: return [NSNumber numberWithDouble:atof(fieldValue)]; case PajeStringFieldType: return [NSString stringWithCString:fieldValue]; case PajeColorFieldType: return [NSColor colorFromString:[NSString stringWithCString:fieldValue]]; default: return nil; } } - (const char *)cStringForFieldId:(PajeFieldId)fieldId { int fieldIndex; fieldIndex = [pajeEventDefinition indexForFieldId:fieldId]; if (fieldIndex < 0) { return NULL; } return valueLine->word[fieldIndex]; } - (NSColor *)colorForFieldId:(PajeFieldId)fieldId { const char *fieldValue; fieldValue = [self cStringForFieldId:fieldId]; if (fieldValue == NULL) { return nil; } return [NSColor colorFromString:[NSString stringWithCString:fieldValue]]; } - (NSString *)stringForFieldId:(PajeFieldId)fieldId { const char *fieldValue; fieldValue = [self cStringForFieldId:fieldId]; if (fieldValue == NULL) { //NSLog(@"string %d %@:nil", fieldId, PajeFieldNames[fieldId]); return nil; } //NSLog(@"string %d %@:%s", fieldId, PajeFieldNames[fieldId], fieldValue); return [NSString stringWithCString:fieldValue]; } - (int)intForFieldId:(PajeFieldId)fieldId { const char *fieldValue; fieldValue = [self cStringForFieldId:fieldId]; if (fieldValue == NULL) { return 0; } return atoi(fieldValue); } - (double)doubleForFieldId:(PajeFieldId)fieldId { const char *fieldValue; fieldValue = [self cStringForFieldId:fieldId]; if (fieldValue == NULL) { return 0; } return atof(fieldValue); } - (NSDate *)timeForFieldId:(PajeFieldId)fieldId { const char *fieldValue; fieldValue = [self cStringForFieldId:fieldId]; if (fieldValue == NULL) { return nil; } return [NSDate dateWithTimeIntervalSinceReferenceDate:atof(fieldValue)]; } - (NSDate *)time { return [self timeForFieldId:PajeTimeFieldId]; } - (NSString *)description { // FIXME NSString *description; description = @"event ["; int i; for (i = 0; i < valueLine->word_count; i ++) { description = [description stringByAppendingString:[NSString stringWithFormat:@"%s ", valueLine->word[i]]]; } description = [description stringByAppendingString:@"]"]; //description = [NSString stringWithFormat:@"event description not implemented [%s %s]", valueLine->word[0], valueLine->word[1]]; return description; } - (NSArray *)fieldNames { return [pajeEventDefinition fieldNames]; } - (id)valueOfFieldNamed:(NSString *)fieldName { return [self valueForFieldId:pajeFieldIdFromName([fieldName cString])]; } - (NSArray *)extraFieldValues { NSMutableArray *fieldValues; if (pajeEventDefinition->extraFieldCount == 0) { return nil; } fieldValues = [NSMutableArray array]; int i; for (i = 0; i < pajeEventDefinition->extraFieldCount; i++) { PajeFieldId fieldId; id fieldValue; fieldId = pajeEventDefinition->extraFieldIds[i]; fieldValue = [self valueForFieldId:fieldId]; [fieldValues addObject:fieldValue]; } return fieldValues; } - (NSDictionary *)extraFields { NSArray *fieldNames; NSArray *fieldValues; fieldNames = [pajeEventDefinition extraFieldNames]; if (fieldNames == nil) { return nil; } fieldValues = [self extraFieldValues]; return [NSDictionary dictionaryWithObjects:fieldValues forKeys:fieldNames]; } @end Paje-1.98/General/FoundationAdditions.h0000664000175000017500000000254311674062007017754 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FoundationAdditions_h_ #define _FoundationAdditions_h_ // // FoundationAdditions.h // // Some methods that are not declared or that are added as categories // to some foundation classes. // #include #include "NSObject+Additions.h" #include "NSString+Additions.h" #include "NSMatrix+Additions.h" #include "NSDate+Additions.h" #include "NSArray+Additions.h" @interface NSBundle (UndeclaredMethods) // this method is defined in Openstep/Rhapsody, it exists in OS4.1, but // is not declared - (void)load; @end #endif Paje-1.98/General/ColoredSwitchButtonCell.m0000664000175000017500000000316311674062007020560 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "ColoredSwitchButtonCell.h" #include "Macros.h" @implementation ColoredSwitchButtonCell - (id)init { self = [super init]; [self setButtonType:NSSwitchButton]; return self; } - (void) dealloc { Assign(color, nil); [super dealloc]; } - (void)setColor:(NSColor *)c { Assign(color, c); } - (void)drawInteriorWithFrame:(NSRect)frame inView:(NSView *)controlView { NSRect r = frame; r.size.width = r.size.height; r = NSInsetRect(r, 3, 3); [color set]; NSRectFill(r); r = NSOffsetRect(frame, NSHeight(frame), 0); r.size.width -= NSHeight(frame); [super drawInteriorWithFrame:r inView:controlView]; } - (NSComparisonResult) compare: (id)otherCell { return [[self stringValue] compare: [(NSCell*)otherCell stringValue]]; } @end Paje-1.98/General/PajeEntity.m0000664000175000017500000001435711674062007016076 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // // PajeEntity // // Generic entities for Paje // #include "PajeEntity.h" #include "PajeContainer.h" #include "PajeEntityInspector.h" #include "Macros.h" #include "UniqueString.h" @implementation PajeEntity - (id)initWithType:(PajeEntityType *)type name:(NSString *)n container:(PajeContainer *)c { self = [super init]; if (self != nil) { entityType = type; // not retained Assign(name, U(n)); container = c; // not retained } return self; } - (void)dealloc { // container and entityType are not retained Assign(name, nil); [super dealloc]; } - (BOOL)isContainer { return NO; } - (PajeDrawingType)drawingType { return [entityType drawingType]; } - (NSString *)name { return name; } - (id)value { return name; } - (PajeEntityType *)entityType { return entityType; } - (PajeContainer *)container { return container; } - (PajeContainer *)sourceContainer { return [self container]; } - (PajeContainer *)destContainer { return [self container]; } - (void)setContainer:(PajeContainer *)c { container = c; } - (void)setEntityType:(PajeEntityType *)type { entityType = type; } - (BOOL)isContainedBy:(PajeContainer *)cont { if (container == nil) { return NO; } if ([cont isEqual:container]) { return YES; } if ([[cont entityType] isEqual:[container entityType]]) { return NO; } return [container isContainedBy:cont]; } - (NSString *)description { return [NSString stringWithFormat:@"%@ [%@ in %@-%@]", [self valueOfFieldNamed:@"Value"], [self entityType], [self startTime], [self endTime]]; return [NSString stringWithFormat:@"%@ [%@ in %@ %@]", [self name], [self entityType], [[self container] entityType], [self container]]; return [name description]; // return [[NSDictionary dictionaryWithObjectsAndKeys:entityType, @"Type", // name, @"Name", container, @"Container", nil] description]; } - (NSDate *)time { [self _subclassResponsibility:_cmd]; return nil; } - (NSDate *)startTime { return [self time]; } - (NSDate *)endTime { return [self time]; } - (NSDate *)firstTime { return [[self startTime] earlierDate:[self endTime]]; } - (NSDate *)lastTime { return [[self startTime] laterDate:[self endTime]]; } - (double)duration { return [[self endTime] timeIntervalSinceDate:[self startTime]]; } - (double)exclusiveDuration { return [self duration]; } - (BOOL)isAggregate { return NO; } - (NSUInteger)subCount { return 0; } - (id)subValueAtIndex:(NSUInteger)index { return [self value]; } - (NSColor *)subColorAtIndex:(NSUInteger)index { return [self color]; } - (double)subDurationAtIndex:(NSUInteger)index { return [self duration]; } - (NSUInteger)subCountAtIndex:(unsigned)index { return 1; } - (CondensedEntitiesArray *)condensedEntities { return nil; } - (NSUInteger)condensedEntitiesCount { return 0; } - (NSColor *)color { id value = [self value]; NSColor *c = [entityType colorForValue:value]; if (!c) { c = [NSColor yellowColor]; [entityType setColor:c forValue:value]; } return c; } - (void)setColor:(NSColor *)c { [entityType setColor:c forValue:[self value]]; } - (void)takeColorFrom:(id)sender { [self setColor:[sender color]]; } - (NSArray *)relatedEntities { return [NSArray array]; } - (int)imbricationLevel { return 0; } - (double)doubleValue { return 0.0; } - (double)minValue { return 0.0; } - (double)maxValue { return 0.0; } - (NSArray *)fieldNames { return [NSMutableArray arrayWithObjects: @"EntityType", /*@"Name",*/ @"Value", @"Container", @"StartTime", @"EndTime", @"Duration", nil]; } - (id)valueOfFieldNamed:(NSString *)fieldName { if ([fieldName isEqualToString:@"EntityType"]) { return [self entityType]; //} else if ([fieldName isEqualToString:@"Name"]) { // return [self name]; } else if ([fieldName isEqualToString:@"Value"]) { return [self value]; } else if ([fieldName isEqualToString:@"Container"]) { return [self container]; } else if ([fieldName isEqualToString:@"StartTime"]) { return [self startTime]; } else if ([fieldName isEqualToString:@"EndTime"]) { return [self endTime]; } else if ([fieldName isEqualToString:@"Duration"]) { return [NSNumber numberWithDouble:[self duration]]; } else { return nil; } } - (NSComparisonResult)compare:(id)other { return [[self name] compare:[(PajeEntity *)other name]]; } - (NSUInteger)hash { return [name hash]; } - (BOOL)isEqual:(id)other { if (other == self) return YES; if (![other isKindOfClass:[PajeEntity class]]) return NO; return [entityType isEqual:[(PajeEntity *)other entityType]] && [name isEqual:[(PajeEntity *)other name]] && [container isEqual:[(PajeEntity *)other container]] && [[self startTime] isEqual:[(PajeEntity *)other startTime]] && [[self endTime] isEqual:[(PajeEntity *)other endTime]]; } // NSCoding protocol - (void)encodeWithCoder:(NSCoder *)coder { // entityType and container are not encoded. They must be set explicity // after decoding [coder encodeObject:name]; } - (id)initWithCoder:(NSCoder *)coder { id n; n = [coder decodeObject]; return [self initWithType:nil name:n container:nil]; } @end Paje-1.98/General/Macros.h0000664000175000017500000000272011674062007015230 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _Macros_h_ #define _Macros_h_ // // Macros.h // // some useful macros // #define Assign(variable, value) \ do { \ id newvalue = (value); \ if (variable != newvalue) { \ if (variable) [variable release]; \ variable = newvalue; \ if (variable) [variable retain]; \ } \ } while (0) #endif #if defined(__APPLE__) #define NSWarnLog(...) #define NSWarnMLog(...) #define NSDebugLog(...) #define NSDebugMLog(...) #define NSDebugMLLog(...) #endif Paje-1.98/General/PajeEntityInspector.m0000664000175000017500000006464011674062007017765 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "PajeEntityInspector.h" #include "SourceCodeReference.h" #include "SourceTextController.h" #include "PajeType.h" #include "Macros.h" #define SUBVIEW_SEPARATION 2 #define BOTTOM_MARGIN 10 @interface InnerStatesCell : NSCell @end @implementation InnerStatesCell - (void)drawInteriorWithFrame:(NSRect)frame inView:(NSView *)controlView { PajeEntity *entity; unsigned count; unsigned i; double duration; float x0; float x; float h; entity = [self representedObject]; [[entity color] set]; NSRectFill(frame); duration = [entity duration]; x = x0 = NSMinX(frame); h = NSHeight(frame) * 2 / 3 - 1; count = [entity subCount]; for (i = 0; i < count; i++) { double subDuration; float w; [[entity subColorAtIndex:i] set]; subDuration = [entity subDurationAtIndex:i]; w = subDuration / duration * NSWidth(frame); NSRectFill(NSMakeRect(x, NSMinY(frame), w, h)); x += w; } [[NSColor blackColor] set]; NSFrameRect(NSMakeRect(x0, NSMinY(frame), x - x0, h + 1)); NSFrameRect(frame); } @end @implementation PajeEntityInspector static NSMutableArray *allInstances; + (PajeEntityInspector *)inspector { NSEnumerator *instEnum; PajeEntityInspector *inspector; if (allInstances == nil) { allInstances = [[NSMutableArray alloc] init]; } instEnum = [allInstances objectEnumerator]; while ((inspector = [instEnum nextObject]) != nil) { if ([inspector isReusable]) { return inspector; } } inspector = [[self alloc] init]; [allInstances addObject:inspector]; [inspector release]; return inspector; } - (void)windowWillClose:(NSNotification *)notification { if ([notification object] == inspectionWindow) { [allInstances removeObjectIdenticalTo:self]; } } - (id)init { Class class = [self class]; BOOL loaded = NO; NSDictionary *nameTable = [NSDictionary dictionaryWithObjectsAndKeys: self, @"NSOwner", nil]; while (!loaded && (class != [class superclass])) { NSBundle *bundle = [NSBundle bundleForClass:class]; NSString *filename = @"PajeEntityInspector"; loaded = [bundle loadNibFile:filename externalNameTable:nameTable withZone:[self zone]]; class = [class superclass]; } if (!loaded) { NSRunAlertPanel(@"Can't find file", @"Interface description file '%@' not found", nil, nil, nil, @"PajeEntityInspector"); [self release]; return nil; } [[showFileButton retain] removeFromSuperview]; archivedTitleField = [NSArchiver archivedDataWithRootObject:titleField]; archivedValueField = [NSArchiver archivedDataWithRootObject:valueField]; [archivedTitleField retain]; [archivedValueField retain]; [titleField removeFromSuperview]; [valueField removeFromSuperview]; [fieldBox setContentViewMargins:NSMakeSize(2, 2)]; archivedBox= [[NSArchiver archivedDataWithRootObject:fieldBox] retain]; [fieldBox removeFromSuperview]; [relatedEntitiesBox retain]; [relatedEntitiesBox setContentViewMargins:NSMakeSize(2, 2)]; [relatedEntitiesBox removeFromSuperview]; [nameField retain]; [colorField retain]; [reuseButton retain]; [filterButton retain]; return self; } - (void)dealloc { Assign(inspectedEntity, nil); Assign(filter, nil); Assign(relatedEntitiesBox, nil); Assign(archivedBox, nil); Assign(archivedTitleField, nil); Assign(archivedValueField, nil); Assign(nameField, nil); Assign(colorField, nil); Assign(reuseButton, nil); Assign(filterButton, nil); [super dealloc]; } - (void)reset { // remove everything from the panel [[[inspectionWindow contentView] subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; // add the top widgets [[inspectionWindow contentView] addSubview:nameField]; [[inspectionWindow contentView] addSubview:colorField]; [[inspectionWindow contentView] addSubview:reuseButton]; [[inspectionWindow contentView] addSubview:filterButton]; // initialize bounding box boundingBox = NSUnionRect([colorField frame], [nameField frame]); } - (void)addSubview:(NSView *)view { NSRect frame; if (view == nil) { return; } // add view bellow other views frame = [view frame]; frame.origin.y = NSMinY(boundingBox) - NSHeight(frame) - SUBVIEW_SEPARATION; frame.origin.x = NSMinX(boundingBox); frame.size.width = NSWidth(boundingBox); [view setFrame:frame]; [[inspectionWindow contentView] addSubview:view]; // update bounding box to reflect new view boundingBox = NSUnionRect(boundingBox, frame); } - (void)addLastSubview:(NSView *)view { NSRect frame; if (view == nil) return; // the last view can autosize if window changes size. resize window // before adding it, if necessary frame = [view frame]; int dif = NSMinY(boundingBox) - SUBVIEW_SEPARATION - NSHeight(frame) - BOTTOM_MARGIN; if (dif != 0) { NSSize windowSize = [inspectionWindow frame].size; windowSize.height -= dif; [inspectionWindow setContentSize:windowSize]; } // bottom is now at window margin frame.origin.y = BOTTOM_MARGIN; frame.origin.x = NSMinX(boundingBox); frame.size.width = NSWidth(boundingBox); // the size of the window may have changed -- boundingBox is no longer valid boundingBox = NSUnionRect([colorField frame], frame); [view setFrame:frame]; [[inspectionWindow contentView] addSubview:view]; } - (IBAction)filterEntityName:(id)sender { PajeEntityType *entityType; id entityValue; entityType = [inspectedEntity entityType]; entityValue = [inspectedEntity value]; if (entityType != nil && entityValue != nil) { NSString *filtering; NSDictionary *userInfo; filtering = [sender state] ? @"YES" : @"NO"; userInfo = [NSDictionary dictionaryWithObjectsAndKeys: entityType, @"EntityType", entityValue, @"EntityValue", filtering, @"Show", nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"PajeFilterEntityValueNotification" object:self userInfo:userInfo]; } } - (NSBox *)boxWithTitle:(NSString *)boxTitle fieldTitles:(NSArray *)titles fieldValues:(NSArray *)values { NSBox *box; int index; float curY; float titleWidth = 0; float leftMargin; float deltaHeight; NSTextField *field1; NSRect boxFrame; NSAssert([titles count] == [values count], @"count of fields and values do not match"); // I don't know a better way of copying a box... box = [NSUnarchiver unarchiveObjectWithData:archivedBox]; field1 = [NSUnarchiver unarchiveObjectWithData:archivedTitleField]; leftMargin = NSMinX([field1 frame]); curY = NSMinY([field1 frame]); #ifdef __APPLE__ curY -= 4; #endif deltaHeight = NSHeight([box frame]) - NSMaxY([field1 frame]); [box setTitle:boxTitle]; for (index = 0; index < [titles count]; index++) { float w; NSString *title = [[titles objectAtIndex:index] description]; [field1 setStringValue:title]; w = [[field1 cell] cellSize].width; if (w > titleWidth) titleWidth = w; } for (index = [titles count] - 1; index >= 0; index--) { float height; NSString *title = [[titles objectAtIndex:index] description]; NSString *value = [[values objectAtIndex:index] description]; NSTextField *tField; NSTextField *vField; tField = [NSUnarchiver unarchiveObjectWithData:archivedTitleField]; vField = [NSUnarchiver unarchiveObjectWithData:archivedValueField]; [tField setStringValue:title]; [vField setStringValue:value]; height = MAX([[tField cell] cellSize].height, [[vField cell] cellSize].height); if ([value isEqual:@"**AQUI**"]) { NSCell *cell = [[InnerStatesCell alloc] init]; [cell setRepresentedObject:inspectedEntity]; [vField setCell:cell]; [cell release]; } [tField setFrame:NSMakeRect(leftMargin, curY, titleWidth, height)]; [vField setFrame:NSMakeRect(leftMargin + titleWidth + 2, curY, 10, height)]; [box addSubview:tField]; [box addSubview:vField]; curY += height+2; } boxFrame = [box frame]; boxFrame.size.height = curY - 2 + deltaHeight; boxFrame.size.width = leftMargin + titleWidth + 2 + 10 + leftMargin; [box setFrame:boxFrame]; //[box sizeToFit]; return box; } - (void)addSourceReference { SourceCodeReference *sourceRef; NSBox *box; NSArray *values; NSRect buttonFrame; NSRect contentFrame; // source code reference sourceRef = [filter valueOfFieldNamed:@"FileReference" forEntity:inspectedEntity]; if (sourceRef == nil) { return; } values = [NSArray arrayWithObjects: [sourceRef filename], [NSString stringWithFormat:@"%d", [sourceRef lineNumber]], nil]; box = [self boxWithTitle:@"Source File" fieldTitles:[NSArray arrayWithObjects:@"File", @"Line", nil] fieldValues:values]; [box sizeToFit]; contentFrame = [[box contentView] frame]; [showFileButton sizeToFit]; buttonFrame = [showFileButton frame]; [showFileButton setFrame:NSMakeRect(NSMaxX(contentFrame) + 2, 0, NSWidth(buttonFrame), NSHeight(contentFrame))]; [box addSubview:showFileButton]; [box sizeToFit]; [self addSubview:box]; } - (NSBox *)boxWithTitle:(NSString *)boxTitle fieldObjects:(NSArray *)objects fieldTitles:(NSArray *)titles fieldValues:(NSArray *)values { return [self boxWithTitle:boxTitle fieldTitles:titles fieldValues:values]; } - (NSBox *)boxWithTitle:(NSString *)boxTitle fieldTitles:(NSArray *)titles fieldNames:(NSArray *)names { NSString *fieldName; NSEnumerator *fieldNameEnum = [names objectEnumerator]; NSMutableArray *fieldValues = [NSMutableArray array]; while ((fieldName = [fieldNameEnum nextObject]) != nil) { id fieldValue = [inspectedEntity valueOfFieldNamed:fieldName]; if (fieldValue == nil) fieldValue = @""; [fieldValues addObject:[fieldValue description]]; [nonDisplayedFields removeObject:fieldName]; } return [self boxWithTitle:boxTitle fieldTitles:titles fieldValues:fieldValues]; } - (void)addBoxForContainer:(PajeContainer *)container upToContainer:(PajeContainer *)upto withTitle:(NSString *)title { NSBox *box; NSMutableArray *fieldTitles; NSMutableArray *fieldValues; NSMutableArray *fieldObjects; if (container == nil) { return; } fieldTitles = [NSMutableArray array]; fieldValues = [NSMutableArray array]; fieldObjects = [NSMutableArray array]; while ([container container] != nil && ![container isEqual:upto]) { [fieldTitles insertObject:[[container entityType] description] atIndex:0]; [fieldValues insertObject:[container name] atIndex:0]; [fieldObjects insertObject:container atIndex:0]; container = [container container]; } box = [self boxWithTitle:title fieldObjects:fieldObjects fieldTitles:fieldTitles fieldValues:fieldValues]; [self addSubview:box]; } - (void)addLocalFields { PajeContainer *container; PajeContainer *sourceContainer; PajeContainer *destContainer; NSBox *box; NSMutableArray *fieldTitles; NSMutableArray *fieldValues; NSDate *startTime; NSDate *endTime; double duration; double exclusiveDuration; id startLogical; id endLogical; // container information container = [inspectedEntity container]; [self addBoxForContainer:container upToContainer:nil withTitle:@"Container"]; [nonDisplayedFields removeObject:@"Container"]; sourceContainer = [inspectedEntity valueOfFieldNamed:@"SourceContainer"]; if (sourceContainer != nil) { [self addBoxForContainer:sourceContainer upToContainer:container withTitle:@"Source Container"]; [nonDisplayedFields removeObject:@"SourceContainer"]; } destContainer = [inspectedEntity valueOfFieldNamed:@"DestContainer"]; if (destContainer != nil) { [self addBoxForContainer:destContainer upToContainer:container withTitle:@"Dest Container"]; [nonDisplayedFields removeObject:@"DestContainer"]; } // timing information fieldTitles = [NSMutableArray array]; fieldValues = [NSMutableArray array]; startTime = [inspectedEntity startTime]; endTime = [inspectedEntity endTime]; duration = [inspectedEntity duration]; if (duration == 0) { [fieldTitles addObject:@"Time"]; [fieldValues addObject:[startTime description]]; } else { [fieldTitles addObject:@"Start Time"]; [fieldValues addObject:[startTime description]]; [fieldTitles addObject:@"End Time"]; [fieldValues addObject:[endTime description]]; [fieldTitles addObject:@"Duration"]; [fieldValues addObject:[NSString stringWithFormat:@"%.6f", duration]]; } if (![inspectedEntity isAggregate] && [inspectedEntity drawingType] == PajeStateDrawingType) { exclusiveDuration = [inspectedEntity exclusiveDuration]; if (exclusiveDuration != duration) { [fieldTitles addObject:@"Exclusive Duration"]; [fieldValues addObject:[NSString stringWithFormat:@"%.6f (%.1f%%)", exclusiveDuration, exclusiveDuration/duration*100]]; } } startLogical = [inspectedEntity valueOfFieldNamed:@"StartLogical"]; if (startLogical != nil) { [fieldTitles addObject:@"Start Logical"]; [fieldValues addObject:[startLogical description]]; [nonDisplayedFields removeObject:@"StartLogical"]; } endLogical = [inspectedEntity valueOfFieldNamed:@"EndLogical"]; if (endLogical != nil) { [fieldTitles addObject:@"End Logical"]; [fieldValues addObject:[endLogical description]]; [nonDisplayedFields removeObject:@"EndLogical"]; } [nonDisplayedFields removeObject:@"Time"]; [nonDisplayedFields removeObject:@"StartTime"]; [nonDisplayedFields removeObject:@"EndTime"]; [nonDisplayedFields removeObject:@"Duration"]; [nonDisplayedFields removeObject:@"Exclusive Duration"]; box = [self boxWithTitle:@"Timing" fieldTitles:fieldTitles fieldValues:fieldValues]; [self addSubview:box]; /* Inner Entities */ unsigned innerCount; innerCount = [inspectedEntity condensedEntitiesCount]; if (innerCount > 0) { [fieldTitles removeAllObjects]; [fieldValues removeAllObjects]; [fieldTitles addObject:@"Count"]; [fieldValues addObject:[NSString stringWithFormat:@"%d", innerCount]]; [fieldTitles addObject:@"Values"]; [fieldValues addObject:@"**AQUI**"]; int i; int subCount; int count; double value; double total; if ([inspectedEntity drawingType] == PajeStateDrawingType) { total = duration; } else { total = innerCount; } subCount = [inspectedEntity subCount]; if (subCount <= 5) count = subCount; else count = 4; for (i = 0; i < count; i++) { [fieldTitles addObject:[inspectedEntity subValueAtIndex:i]]; if ([inspectedEntity drawingType] == PajeStateDrawingType) { value = [inspectedEntity subDurationAtIndex:i]; [fieldValues addObject: [NSString stringWithFormat:@"%.6f (%.1f%%)", value, value/total*100]]; } else { value = [inspectedEntity subCountAtIndex:i]; [fieldValues addObject: [NSString stringWithFormat:@"%d (%.1f%%)", (int)value, value/total*100]]; } } if (count < subCount) { value = 0; for (; i < subCount; i++) { if ([inspectedEntity drawingType] == PajeStateDrawingType) { value += [inspectedEntity subDurationAtIndex:i]; } else { value += [inspectedEntity subCountAtIndex:i]; } } [fieldTitles addObject:[NSString stringWithFormat:@"Other %d", i - count]]; if ([inspectedEntity drawingType] == PajeStateDrawingType) { [fieldValues addObject: [NSString stringWithFormat:@"%.6f (%.1f%%)", value, value/total*100]]; } else { [fieldValues addObject: [NSString stringWithFormat:@"%d (%.1f%%)", (int)value, value/total*100]]; } } box = [self boxWithTitle:@"Inner Entities" fieldTitles:fieldTitles fieldValues:fieldValues]; [self addSubview:box]; } } - (void)addGlobalFields { // global fields [nameField setStringValue:[[filter valueForEntity:inspectedEntity] stringValue]]; [colorField setTarget:nil]; [colorField setColor:[filter colorForEntity:inspectedEntity]]; [colorField setAction:@selector(colorChanged:)]; [colorField setTarget:self]; [inspectionWindow setTitle:[filter descriptionForEntityType: [filter entityTypeForEntity:inspectedEntity]]]; [nonDisplayedFields removeObject:@"PajeEventName"]; //[nonDisplayedFields removeObject:@"Value"]; [nonDisplayedFields removeObject:@"Color"]; [nonDisplayedFields removeObject:@"EntityType"]; [nonDisplayedFields removeObject:@"Value"]; } - (void)addOtherFields { // other fields if ([nonDisplayedFields count] > 0) { NSBox *box; NSArray *fieldTitles = [nonDisplayedFields allObjects]; box = [self boxWithTitle:@"Other values" fieldTitles:fieldTitles fieldNames:fieldTitles]; [self addSubview:box]; } } - (BOOL)isReusable { return [reuseButton state]; } - (void)setReusable:(BOOL)reuse { [reuseButton setState:reuse]; } - (IBAction)entityClicked:(id)sender { NSCell *cell; if ([sender isKindOfClass:[NSMatrix class]]) { cell = [sender selectedCell]; } else { cell = sender; } [self inspectEntity:[cell representedObject] withFilter:filter]; } - (IBAction)colorChanged:(id)sender { [filter setColor:[sender color] forEntity:inspectedEntity]; } - (void)addScriptBox { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *scriptPath; NSString *scriptFieldName; scriptPath = [defaults objectForKey:@"EntityInspectorScriptPath"]; scriptFieldName = [defaults objectForKey:@"EntityInspectorScriptFieldName"]; if (scriptPath == nil) scriptPath = @""; if (scriptFieldName == nil) scriptFieldName = @""; [scriptPathField setStringValue:scriptPath]; [scriptFieldNameField setStringValue:scriptFieldName]; if ([[filter relatedEntitiesForEntity:inspectedEntity] count] == 0) { [scriptFieldSourceMatrix selectCellWithTag:0]; } [[scriptBox retain] autorelease]; [scriptBox removeFromSuperview]; [self addSubview:scriptBox]; } - (void)addRelatedEntities { NSArray *relatedEntities; relatedEntities = [filter relatedEntitiesForEntity:inspectedEntity]; if ([relatedEntities count] > 0) { NSEnumerator *relatedEnum; int row; PajeEntity *related; [relatedEntitiesMatrix renewRows:[relatedEntities count] columns:1]; row = 0; relatedEnum = [relatedEntities objectEnumerator]; while ((related = [relatedEnum nextObject]) != nil) { NSButtonCell *cell; cell = [relatedEntitiesMatrix cellAtRow:row++ column:0]; [cell setTitle:[[filter valueForEntity:related] stringValue]]; [cell setRepresentedObject:related]; [cell setTarget:self]; [cell setAction:@selector(entityClicked:)]; } [relatedEntitiesMatrix sizeToCells]; NSScrollView *sv = [relatedEntitiesMatrix enclosingScrollView]; NSSize svSize = [sv frame].size; svSize.height = MIN(NSHeight([relatedEntitiesMatrix frame]) + 1, 105); [sv setFrameSize:svSize]; [relatedEntitiesBox sizeToFit]; [self addLastSubview:relatedEntitiesBox]; } } - (void)inspectEntity:(id)entity withFilter:(PajeFilter *)f { Assign(inspectedEntity, entity); Assign(filter, f); nonDisplayedFields = [[NSMutableSet alloc] initWithArray:[filter fieldNamesForEntity:entity]]; [self reset]; [self addGlobalFields]; [self addLocalFields]; [nonDisplayedFields removeObject:@"RelatedEntities"]; [nonDisplayedFields removeObject:@"FileReference"]; [self addOtherFields]; [self addSourceReference]; // script execution [self addScriptBox]; // Related entities [self addRelatedEntities]; int dif = NSMinY(boundingBox) - 10; if (dif != 0) { NSRect frame = [inspectionWindow frame]; frame.origin.y += dif; frame.size.height -= dif; [inspectionWindow setContentSize:frame.size]; } Assign(nonDisplayedFields, nil); // lastWindowPosition = [inspectionWindow cascadeTopLeftFromPoint:lastWindowPosition]; // [inspectionWindow display]; [inspectionWindow orderFront:self]; } - (void)showSource:(id)sender { SourceCodeReference *FileReference; NSString *filename; int lineNumber; NSArray *sourcePaths; FileReference = [inspectedEntity valueOfFieldNamed:@"FileReference"]; if (!FileReference) { NSBeep(); return; } sourcePaths = [[NSUserDefaults standardUserDefaults] arrayForKey:@"PajeSourcePaths"]; filename = [FileReference filename]; lineNumber = [FileReference lineNumber]; if (sourcePaths && ([sourcePaths count] > 0)) { NSEnumerator *sourcePathEnum = [sourcePaths objectEnumerator]; NSString *fullPath; while ((fullPath = [sourcePathEnum nextObject]) != nil) { fullPath = [fullPath stringByAppendingPathComponent:filename]; if ([[NSFileManager defaultManager] isReadableFileAtPath:fullPath]) { [[SourceTextController controllerForFilename:fullPath] selectLineNumber:lineNumber]; return; } } } NSRunAlertPanel(@"File Not Found", @"File '%@' has not been found or is not readable.\n" @"Verify the value of the defaults variable" @" \"PajeSourcePaths\" in the Info/Preferences... panel.\n" @"Currently, it is set to '%@'", @"Ok", nil, nil, filename, sourcePaths); } - (IBAction)executeScript:(id)sender { NSArray *entities; NSEnumerator *entitiesEnum; PajeEntity *entity; NSMutableArray *arguments; NSString *fieldName; NSString *scriptPath; NSTask *task; if ([[scriptFieldSourceMatrix selectedCell] tag] == 0) { entities = [NSArray arrayWithObject:inspectedEntity]; } else { entities = [inspectedEntity relatedEntities]; if ([entities count] < 1) { NSRunAlertPanel(@"Entity Inspector", @"No related entities!", nil, nil, nil); return; } } fieldName = [scriptFieldNameField stringValue]; if ((fieldName == nil) || ([fieldName isEqual:@""])) { NSRunAlertPanel(@"Entity Inspector", @"Field name not defined!", nil, nil, nil); return; } [[NSUserDefaults standardUserDefaults] setObject:fieldName forKey:@"EntityInspectorScriptFieldName"]; scriptPath = [scriptPathField stringValue]; if ((scriptPath == nil) || ([scriptPath isEqual:@""])) { NSRunAlertPanel(@"EntityInspector", @"Program path not defined!", nil, nil, nil); return; } [[NSUserDefaults standardUserDefaults] setObject:scriptPath forKey:@"EntityInspectorScriptPath"]; if (![[NSFileManager defaultManager] isExecutableFileAtPath:scriptPath]) { NSRunAlertPanel(@"EntityInspector", @"File '%@' does not exist or is not executable!", nil, nil, nil, scriptPath); return; } arguments = [NSMutableArray array]; entitiesEnum = [entities objectEnumerator]; while ((entity = [entitiesEnum nextObject]) != nil) { id argument; argument = [[entity valueOfFieldNamed:fieldName] description]; if (argument == nil) argument = @"--nil--"; [arguments addObject:argument]; } task = [NSTask launchedTaskWithLaunchPath:scriptPath arguments:arguments]; } @end Paje-1.98/General/Association.m0000664000175000017500000000567511674062007016301 0ustar schnorrschnorr/* Copyright (c) 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "Association.h" #include "Macros.h" @implementation Association + (Association *)associationWithObject:(id)obj double:(double)d { return [[[self alloc] initWithObject:obj double:d] autorelease]; } - (id)initWithObject:(id)obj double:(double)d { self = [super init]; if (self != nil) { Assign(object, obj); value = d; } return self; } - (void)dealloc { Assign(object, nil); [super dealloc]; } - (id)objectValue { return object; } - (double)doubleValue { return value; } - (void)addDouble:(double)d { value += d; } - (NSComparisonResult)inverseDoubleValueComparison:(Association *)other { double dif; dif = value - [other doubleValue]; if (dif < 0) return NSOrderedDescending; if (dif > 0) return NSOrderedAscending; return NSOrderedSame; } - (NSComparisonResult)objectValueComparison:(Association *)other { return [(NSNumber *)object compare:[other objectValue]]; } - (NSUInteger)hash { return [object hash]; } - (BOOL)xisEqual:(id)anObj { if (self == anObj) { return YES; } if ([[anObj class] isEqual:[Association class]]) { return [object isEqual:[(Association *)anObj objectValue]]; } else { return [object isEqual:anObj]; } } - (BOOL)isEqual:(id)anObj { BOOL r; r = [self xisEqual:anObj]; NSLog(@"%@ == %@ : %s", object, anObj, r?"YES":"NO"); return r; } - (NSString *)xdescription { return [object description]; } - (NSString *)description { return [NSString stringWithFormat:@"<%@, %f>", object, value]; } // NSCoding Protocol - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:object]; [coder encodeValueOfObjCType:@encode(double) at:&value]; } - (id)initWithCoder:(NSCoder *)coder { self = [super init]; if (self != nil) { object = [[coder decodeObject] retain]; [coder decodeValueOfObjCType:@encode(double) at:&value]; } return self; } - (id)startTime { return [(NSDate *)object addTimeInterval:-100.0]; } - (id)name { return object; } - (id)container { return nil; } - (id)valueOfFieldNamed:(id)x { return nil; } - (id)relatedEntities { return nil; } @end Paje-1.98/General/PajeFilter.h0000664000175000017500000002765011674062007016042 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeFilter_h_ #define _PajeFilter_h_ /* * PajeFilter.h * * Base class of Paje filters. * Keeps the graph of filters; * forwards all notifications to following component; * forwards all queries to preceeding component. * * created by benhur on 11 may 1999 */ #include #include "Protocols.h" #include "PajeContainer.h" //#include "../Paje/PajeTraceController.h" @class PajeTraceController; @class PajeFilter; @interface PajeComponent : NSObject { PajeFilter *outputComponent; PajeFilter *inputComponent; SEL outputSelector; PajeTraceController *controller; } + (PajeComponent *)componentWithController:(PajeTraceController *)c; - (id)initWithController:(PajeTraceController *)c; - (void)setInputComponent:(PajeFilter *)component; - (void)setOutputComponent:(PajeFilter *)component; - (void)disconnectComponent; - (void)inputEntity:(id)entity; - (void)outputEntity:(id)entity; - (BOOL)canEndChunkBefore:(id)entity; - (NSString *)traceDescription; /* only for use by simulator */ - (void)registerFilter:(PajeFilter *)filter; - (void)registerTool:(id)filter; - (NSString *)toolName; - (NSString *)filterName; - (NSView *)filterView; - (NSString *)filterKeyEquivalent; - (id)filterDelegate; - (void)startChunk:(int)chunkNumber; - (void)endOfChunkLast:(BOOL)last; @end @interface PajeFilter : PajeComponent { } // // Notifications // ----------------------------------------------------------------- // Messages sent by a filter to the filter after it in the filter chain. // They are used to inform the filters (and visualisation modules) that // something has changed. Default implementation just forwards the message. // Filters can intercept a message if the change affects it and act accordingly. // Viewers can intercept a message if the change means that something needs // redrawing. // // Message sent when startTime or endTime of the whole visible trace changed - (void)timeLimitsChanged; // Generic message. Used when something not specified in the other messages // has changed. entityType can be nil if not only one entityType is affected. - (void)dataChangedForEntityType:(PajeEntityType *)entityType; // Message sent when the numeric limits of some variable entity type changed. - (void)limitsChangedForEntityType:(PajeEntityType *)entityType; // Message sent when the color of something of entityType has changed. - (void)colorChangedForEntityType:(PajeEntityType *)entityType; // Message sent when the order of the containers of some type has changed. - (void)orderChangedForContainerType:(PajeEntityType *)containerType; // Message sent when the hierarchy of types and/or containers has changed. - (void)hierarchyChanged; // Message sent when containers have been (de)selected. - (void)containerSelectionChanged; // Message sent when the selected time slice has changed (or deselected). - (void)timeSelectionChanged; // Message sent when the selected entities have changed - (void)entitySelectionChanged; // // Commands // ----------------------------------------------------------------- // Messages sent from a viewer or a filter to the preceeding filter. // Generally used to cause some filter to change its configuration. // Default implementation just forwards the message to the preceeding filter. // First filter (StorageController for the time being) overrides the // default implementation to ignore the message, generally. // // Command a filter to remove entityType from the type hierarchy. - (void)hideEntityType:(PajeEntityType *)entityType; // Command a filter to remove the selected containers from hierarchy - (void)hideSelectedContainers; // Command a filter to change the containers that are selected to the given set. - (void)setSelectedContainers:(NSSet *)containers; // Command a filter to change the selected time slice - (void)setSelectionStartTime:(NSDate *)from endTime:(NSDate *)to; // Command a filter to change the order of the given containers to that of // the given array. - (void)setOrder:(NSArray *)containers ofContainersTyped:(PajeEntityType *)containerType inContainer:(PajeContainer *)container; // Command a filter to change the color of the given entity. - (void)setColor:(NSColor *)color forEntity:(id)entity; // Command a filter to change the color of a given value of an entity type. - (void)setColor:(NSColor *)color forValue:(id)value ofEntityType:(PajeEntityType *)entityType; // Command a filter to change the color for all entities of a given type // (used for "variable" entity types). - (void)setColor:(NSColor *)color forEntityType:(PajeEntityType *)entityType; // Command a filter (StorageController) to verify that all entities on // given time period are accessible. - (void)verifyStartTime:(NSDate *)start endTime:(NSDate *)end; // Command a filter to open an inspection window to inspect given entity. - (void)inspectEntity:(id)entity; // // Queries // ----------------------------------------------------------------- // Messages sent by viewers or filters to the filter preceeding it. // These messages ask for some information about the loaded trace. // // The time period of the trace - (NSDate *)startTime; - (NSDate *)endTime; // The group of containers that are selected - (NSSet *)selectedContainers; // The time selection - (NSDate *)selectionStartTime; - (NSDate *)selectionEndTime; // // Accessing entities // // The entity at the root of the hierarchy - (PajeContainer *)rootInstance; // Array of types that are directly under given type in hierarchy - (NSArray *)containedTypesForContainerType:(PajeEntityType *)containerType; // The container type that contains the given type - (PajeContainerType *)containerTypeForType:(PajeEntityType *)entityType; // All entities of a given type that are in a container in a certain // time interval. minDuration is a hint to the minimum duration of an // entity of interest -- shorter entities could be condensed if possible. // Container must be of a type ancestral of entityType in the hierarchy. // Entities are sorted by reverse endTime. - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration; // All entities of a given type that are in a container and end in a certain // time interval. minDuration is a hint to the minimum duration of an // entity of interest -- shorter entities could be condensed if possible. // Container must be of a type ancestral of entityType in the hierarchy. // Entities are sorted by endTime - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration; // All containers of a given type contained by container. Container must be // of a type ancestral of entityType in the hierarchy. - (NSEnumerator *)enumeratorOfContainersTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container; // All values an entity of given type can have. - (NSArray *)allValuesForEntityType:(PajeEntityType *)entityType; // Textual description of an entity type. - (NSString *)descriptionForEntityType:(PajeEntityType *)entityType; // Minimum and maximum value of a "variable" entity type, globally or inside // a container. - (double)minValueForEntityType:(PajeEntityType *)entityType; - (double)maxValueForEntityType:(PajeEntityType *)entityType; - (double)minValueForEntityType:(PajeEntityType *)entityType inContainer:(PajeContainer *)container; - (double)maxValueForEntityType:(PajeEntityType *)entityType inContainer:(PajeContainer *)container; //- (BOOL)isHiddenEntityType:(PajeEntityType *)entityType; // The drawing type of an entityType. - (PajeDrawingType)drawingTypeForEntityType:(PajeEntityType *)entityType; // Names of fields an entity of given type can have. - (NSArray *)fieldNamesForEntityType:(PajeEntityType *)entityType; // Names of fields an entity of given value and type can have. - (NSArray *)fieldNamesForEntityType:(PajeEntityType *)entityType name:(NSString *)name; // The value of the given named field for an entity type. - (id)valueOfFieldNamed:(NSString *)fieldName forEntityType:(PajeEntityType *)entityType; // Color of given value of entity type - (NSColor *)colorForValue:(id)value ofEntityType:(PajeEntityType *)entityType; // Color for all entities of given type (used for "variable" entity type). - (NSColor *)colorForEntityType:(PajeEntityType *)entityType; // // Getting info from entity // - (NSArray *)fieldNamesForEntity:(id)entity; - (id)valueOfFieldNamed:(NSString *)fieldName forEntity:(id)entity; - (PajeContainer *)containerForEntity:(id)entity; - (PajeEntityType *)entityTypeForEntity:(id)entity; - (PajeContainer *)sourceContainerForEntity:(id)entity; - (PajeEntityType *)sourceEntityTypeForEntity:(id)entity; - (PajeContainer *)destContainerForEntity:(id)entity; - (PajeEntityType *)destEntityTypeForEntity:(id)entity; - (NSArray *)relatedEntitiesForEntity:(id)entity; - (NSColor *)colorForEntity:(id)entity; - (NSDate *)startTimeForEntity:(id)entity; - (NSDate *)endTimeForEntity:(id)entity; - (NSDate *)timeForEntity:(id)entity; - (double)durationForEntity:(id)entity; - (PajeDrawingType)drawingTypeForEntity:(id)entity; - (id)valueForEntity:(id)entity; - (double)doubleValueForEntity:(id)entity; // for variables - (double)minValueForEntity:(id)entity; // for variables - (double)maxValueForEntity:(id)entity; // for variables - (NSString *)descriptionForEntity:(id)entity; - (int)imbricationLevelForEntity:(id)entity; - (BOOL)isAggregateEntity:(id)entity; - (unsigned)subCountForEntity:(id)entity; - (NSColor *)subColorAtIndex:(unsigned)index forEntity:(id)entity; - (id)subValueAtIndex:(unsigned)index forEntity:(id)entity; - (double)subDurationAtIndex:(unsigned)index forEntity:(id)entity; - (unsigned)subCountAtIndex:(unsigned)index forEntity:(id)entity; - (BOOL)canHighlightEntity:(id)entity; - (BOOL)isSelectedEntity:(id)entity; // configure filter - (id)configuration; - (void)setConfiguration:(id)config; @end @interface PajeFilter(AuxiliaryMethods) - (PajeEntityType *)rootEntityType; - (NSArray *)allEntityTypes; - (BOOL)isContainerEntityType:(PajeEntityType *)entityType; - (PajeEntityType *)entityTypeWithName:(NSString *)n; - (PajeContainer *)containerWithName:(NSString *)n type:(PajeEntityType *)t; - (NSString *)nameForContainer:(PajeContainer *)container; @end #endif Paje-1.98/General/NSUserDefaults+Additions.h0000664000175000017500000000271211674062007020566 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _NSUserDefaults_Additions_h_ #define _NSUserDefaults_Additions_h_ #include @interface NSUserDefaults (Additions) - (void)setColor:(NSColor *)color forKey:(NSString *)key; - (NSColor *)colorForKey:(NSString *)key; - (void)setColorDictionary:(NSDictionary *)dict forKey:(NSString *)key; - (NSDictionary *)colorDictionaryForKey:(NSString *)key; - (void)setRect:(NSRect)rect forKey:(NSString *)key; - (NSRect)rectForKey:(NSString *)key; - (void)setDouble:(double)value forKey:(NSString *)key; - (double)doubleForKey:(NSString *)key; - (void)setArchivedObject:(id)anObject forKey:(NSString *)aKey; - (id)unarchiveObjectForKey:(NSString *)aKey; @end #endif Paje-1.98/Tracers/0000775000175000017500000000000011674062007013660 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/0000775000175000017500000000000011674062007015244 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/include/0000775000175000017500000000000011674062007016667 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/include/JRastro_events.h0000664000175000017500000000566711674062007022026 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _JRASTRO_EVENTS_H_ #define _JRASTRO_EVENTS_H_ void JNICALL jrst_monitor_contended_enter(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object); void JNICALL jrst_monitor_contended_entered(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object); void JNICALL jrst_monitor_wait(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object, jlong timeout); void JNICALL jrst_monitor_waited(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object, jboolean timed_out); void JNICALL jrst_event_VMObject_alloc(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object, jclass object_klass, jlong size); void JNICALL jrst_event_object_free(jvmtiEnv *jvmtiLocate, jlong tag); void JNICALL jrst_event_garbage_collection_start(jvmtiEnv *jvmtiLocate); void JNICALL jrst_event_garbage_collection_finish(jvmtiEnv *jvmtiLocate); void JNICALL jrst_class_load(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jclass klass); void JNICALL jrst_event_exception(jvmtiEnv *jvmtiEnv, JNIEnv* jniEnv, jthread thread, jmethodID method, jlocation location, jobject exception, jmethodID catch_method, jlocation catch_location); void JNICALL jrst_event_exception_catch(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jmethodID method, jlocation location, jobject exception); void JNICALL jrst_event_frame_pop(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jmethodID method, jboolean was_popped_by_exception); void JNICALL jrst_event_method_load(jvmtiEnv *jvmtiLocate, jmethodID method, jint code_size, const void* code_addr, jint map_length, const jvmtiAddrLocationMap* map, const void* compile_info); void JNICALL jrst_event_method_entry(jvmtiEnv *jvmtiEnv, JNIEnv* jniEnv, jthread thread, jmethodID method); void JNICALL jrst_event_method_exit(jvmtiEnv *jvmtiEnv, JNIEnv* jniEnv, jthread thread, jmethodID method, jboolean was_popped_by_exception, jvalue return_value); #endif /*_JRASTRO_EVENTS_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro_traces.h0000664000175000017500000000543211674062007021771 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _JRASTRO_TRACES_H_ #define _JRASTRO_TRACES_H_ /*Defines*/ //#define METHOD_EXIT 66 #define METHOD_LOAD 555 #define CLASS_LOAD 554 #define INITIALIZE 999 #define FINALIZE 998 #define METHOD_ENTRY 997 #define METHOD_EXIT_EXCEPTION 996 #define MONITOR_ENTER 995 #define MONITOR_ENTERED 994 #define METHOD_EXCEPTION 993 #define EVENT_METHOD_ENTRY_ALLOC 992 #define MONITOR_WAIT 991 #define MONITOR_WAITED 990 void trace_initialize(jvmtiEnv *jvmtiLocate, jthread thread, char *name); void trace_finalize(jvmtiEnv *jvmtiLocate, jthread thread); //void trace_event_object_alloc(jvmtiEnv *jvmtiLocate, jthread thread, jobject object); void trace_event_object_alloc(jthread thread, jobject object, char *nameClass); void trace_event_object_alloc_new_array(jthread thread, jobject object, char *nameClass); void trace_event_object_free(jlong tag); void trace_event_gc_start(); void trace_event_gc_finish(); void trace_event_method_entry_obj_init(jthread thread, jobject object, int method, char *nameClass); void trace_event_method_entry_obj(jthread thread, int object, int method); void trace_event_method_entry(jthread thread, int method); void trace_event_method_exit(jthread thread); void trace_event_exception(jthread thread, int exception); void trace_event_method_exit_exception(jthread thread); void trace_event_method_load(int method, char *name, unsigned access_flags, int klass); void trace_event_class_load(int klass, char *name); void trace_event_monitor_contended_enter(jvmtiEnv *jvmtiLocate, jthread thread, int object); void trace_event_monitor_contended_entered(jvmtiEnv *jvmtiLocate, jthread thread, int object); void trace_event_monitor_wait(jvmtiEnv *jvmtiLocate, jthread thread, int object); void trace_event_monitor_waited(jvmtiEnv *jvmtiLocate, jthread thread, int object); #endif /*_JRASTRO_TRACES_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro_paje.h0000664000175000017500000000406311674062007021426 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _JRASTRO_PAJE_H_ #define _JRASTRO_PAJE_H_ void paje_set_limits(FILE *file); void paje_define_container_type(FILE *file); void paje_define_event_type(FILE *file); void paje_define_state_type(FILE *file); void paje_define_variable_type(FILE *file); void paje_define_link_type(FILE *file); void paje_define_entity_value(FILE *file); void paje_define_entity_value666(FILE *file); void paje_create_container(FILE *file); void paje_create_container777(FILE *file); void paje_destroy_container(FILE *file); void paje_new_event(FILE *file); void paje_set_state(FILE *file); void paje_push_state(FILE *file); void paje_push_state111(FILE *file); void paje_pop_state(FILE *file); void paje_set_variable(FILE *file); void paje_add_variable(FILE *file); void paje_sub_variable(FILE *file); void paje_start_link(FILE *file); void paje_end_link(FILE *file); void paje_start_link18(FILE *file); void paje_end_link19(FILE *file); void paje_new_event112(FILE *file); void paje_new_event113(FILE *file); void paje_new_event114(FILE *file); void paje_header(FILE *file); #endif /*_JRASTRO_PAJE_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro.h0000664000175000017500000000511311674062007020424 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _JRASTRO_H_ #define _JRASTRO_H_ #include #include #include #include #include #include #include "hash.h" #include "list.h" #include "JRastro_rastros.h" #include "JRastro_basic.h" #include "JRastro_traces.h" #include "JRastro_events.h" #include "JRastro_thread.h" #include "JRastro_hash_func.h" #include "JRastro_list_func.h" #include "JRastro_options.h" #include "JRastro_paje.h" #include "JRastro_java_crw_demo.h" #include "JRastro_classfile_constants.h" #define CLASS_NAME "org/lsc/JRastro/Instru" #define CLASS_SIG "Lorg/lsc/JRastro/Instru;" //#define CLASS_NAME "sun/tools/hprof/Tracker" //#define CLASS_SIG "Lsun/tools/hprof/Tracker;" #define CALL_NAME "CallSite" #define CALL_SIG "(Ljava/lang/Object;I)V" #define CALL_STATIC_NAME "CallStaticSite" #define CALL_STATIC_SIG "(I)V" #define RETURN_NAME "ReturnSite" #define RETURN_SIG "()V" //#define RETURN_SIG "(I)V" #define RETURN_MAIN_NAME "ReturnSite" //#define RETURN_MAIN_NAME "ReturnMain" #define RETURN_MAIN_SIG "()V" //#define RETURN_MAIN_SIG "(I)V" /*Caso necessite rastrear OBJECT_INIT comente o NULL, e * * coloque as outras linhas */ //#define OBJECT_INIT_NAME NULL //#define OBJECT_INIT_SIG NULL #define OBJECT_INIT_NAME "ObjectInit" #define OBJECT_INIT_SIG "(Ljava/lang/Object;)V" /*Caso necessite rastrear NEWARRAY comente o NULL, e * * coloque as outras linhas */ //#define NEWARRAY_NAME NULL //#define NEWARRAY_SIG NULL #define NEWARRAY_NAME "NewArray" #define NEWARRAY_SIG "(Ljava/lang/Object;)V" #endif /*_JRASTRO_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro_classfile_constants.h0000664000175000017500000003146311674062007024554 0ustar schnorrschnorr/* * @(#)classfile_constants.h 1.3 05/01/04 * * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */ /* This file is a modified version of the file "classfile_constants.h" contained * in "jdk-1_5_0_04-linux-i586.bin" from Sun Microsystems. * * Modification written by: Geovani Ricardo Wiedenhoft */ #ifndef _JRASTRO_CLASSFILE_CONSTANTS_H_ #define _JRASTRO_CLASSFILE_CONSTANTS_H_ /* Flags */ #define JVM_ACC_PUBLIC 0x0001 #define JVM_ACC_PRIVATE 0x0002 #define JVM_ACC_PROTECTED 0x0004 #define JVM_ACC_STATIC 0x0008 #define JVM_ACC_FINAL 0x0010 #define JVM_ACC_SYNCHRONIZED 0x0020 #define JVM_ACC_SUPER 0x0020 #define JVM_ACC_VOLATILE 0x0040 #define JVM_ACC_TRANSIENT 0x0080 #define JVM_ACC_VARARGS 0x0080 #define JVM_ACC_NATIVE 0x0100 #define JVM_ACC_INTERFACE 0x0200 #define JVM_ACC_ABSTRACT 0x0400 #define JVM_ACC_STRICT 0x0800 #define JVM_ACC_SYNTHETIC 0x1000 #define JVM_ACC_ANNOTATION 0x2000 #define JVM_ACC_ENUM 0x4000 enum { JVM_CONSTANT_Utf8 = 1, JVM_CONSTANT_Unicode = 2, /* unused */ JVM_CONSTANT_Integer = 3, JVM_CONSTANT_Float = 4, JVM_CONSTANT_Long = 5, JVM_CONSTANT_Double = 6, JVM_CONSTANT_Class = 7, JVM_CONSTANT_String = 8, JVM_CONSTANT_Fieldref = 9, JVM_CONSTANT_Methodref = 10, JVM_CONSTANT_InterfaceMethodref = 11, JVM_CONSTANT_NameAndType = 12 }; /* Type signatures */ #define JVM_SIGNATURE_ARRAY '[' #define JVM_SIGNATURE_BYTE 'B' #define JVM_SIGNATURE_CHAR 'C' #define JVM_SIGNATURE_CLASS 'L' #define JVM_SIGNATURE_ENDCLASS ';' #define JVM_SIGNATURE_ENUM 'E' #define JVM_SIGNATURE_FLOAT 'F' #define JVM_SIGNATURE_DOUBLE 'D' #define JVM_SIGNATURE_FUNC '(' #define JVM_SIGNATURE_ENDFUNC ')' #define JVM_SIGNATURE_INT 'I' #define JVM_SIGNATURE_LONG 'J' #define JVM_SIGNATURE_SHORT 'S' #define JVM_SIGNATURE_VOID 'V' #define JVM_SIGNATURE_BOOLEAN 'Z' /* Opcodes */ enum { opc_nop = 0, opc_aconst_null = 1, opc_iconst_m1 = 2, opc_iconst_0 = 3, opc_iconst_1 = 4, opc_iconst_2 = 5, opc_iconst_3 = 6, opc_iconst_4 = 7, opc_iconst_5 = 8, opc_lconst_0 = 9, opc_lconst_1 = 10, opc_fconst_0 = 11, opc_fconst_1 = 12, opc_fconst_2 = 13, opc_dconst_0 = 14, opc_dconst_1 = 15, opc_bipush = 16, opc_sipush = 17, opc_ldc = 18, opc_ldc_w = 19, opc_ldc2_w = 20, opc_iload = 21, opc_lload = 22, opc_fload = 23, opc_dload = 24, opc_aload = 25, opc_iload_0 = 26, opc_iload_1 = 27, opc_iload_2 = 28, opc_iload_3 = 29, opc_lload_0 = 30, opc_lload_1 = 31, opc_lload_2 = 32, opc_lload_3 = 33, opc_fload_0 = 34, opc_fload_1 = 35, opc_fload_2 = 36, opc_fload_3 = 37, opc_dload_0 = 38, opc_dload_1 = 39, opc_dload_2 = 40, opc_dload_3 = 41, opc_aload_0 = 42, opc_aload_1 = 43, opc_aload_2 = 44, opc_aload_3 = 45, opc_iaload = 46, opc_laload = 47, opc_faload = 48, opc_daload = 49, opc_aaload = 50, opc_baload = 51, opc_caload = 52, opc_saload = 53, opc_istore = 54, opc_lstore = 55, opc_fstore = 56, opc_dstore = 57, opc_astore = 58, opc_istore_0 = 59, opc_istore_1 = 60, opc_istore_2 = 61, opc_istore_3 = 62, opc_lstore_0 = 63, opc_lstore_1 = 64, opc_lstore_2 = 65, opc_lstore_3 = 66, opc_fstore_0 = 67, opc_fstore_1 = 68, opc_fstore_2 = 69, opc_fstore_3 = 70, opc_dstore_0 = 71, opc_dstore_1 = 72, opc_dstore_2 = 73, opc_dstore_3 = 74, opc_astore_0 = 75, opc_astore_1 = 76, opc_astore_2 = 77, opc_astore_3 = 78, opc_iastore = 79, opc_lastore = 80, opc_fastore = 81, opc_dastore = 82, opc_aastore = 83, opc_bastore = 84, opc_castore = 85, opc_sastore = 86, opc_pop = 87, opc_pop2 = 88, opc_dup = 89, opc_dup_x1 = 90, opc_dup_x2 = 91, opc_dup2 = 92, opc_dup2_x1 = 93, opc_dup2_x2 = 94, opc_swap = 95, opc_iadd = 96, opc_ladd = 97, opc_fadd = 98, opc_dadd = 99, opc_isub = 100, opc_lsub = 101, opc_fsub = 102, opc_dsub = 103, opc_imul = 104, opc_lmul = 105, opc_fmul = 106, opc_dmul = 107, opc_idiv = 108, opc_ldiv = 109, opc_fdiv = 110, opc_ddiv = 111, opc_irem = 112, opc_lrem = 113, opc_frem = 114, opc_drem = 115, opc_ineg = 116, opc_lneg = 117, opc_fneg = 118, opc_dneg = 119, opc_ishl = 120, opc_lshl = 121, opc_ishr = 122, opc_lshr = 123, opc_iushr = 124, opc_lushr = 125, opc_iand = 126, opc_land = 127, opc_ior = 128, opc_lor = 129, opc_ixor = 130, opc_lxor = 131, opc_iinc = 132, opc_i2l = 133, opc_i2f = 134, opc_i2d = 135, opc_l2i = 136, opc_l2f = 137, opc_l2d = 138, opc_f2i = 139, opc_f2l = 140, opc_f2d = 141, opc_d2i = 142, opc_d2l = 143, opc_d2f = 144, opc_i2b = 145, opc_i2c = 146, opc_i2s = 147, opc_lcmp = 148, opc_fcmpl = 149, opc_fcmpg = 150, opc_dcmpl = 151, opc_dcmpg = 152, opc_ifeq = 153, opc_ifne = 154, opc_iflt = 155, opc_ifge = 156, opc_ifgt = 157, opc_ifle = 158, opc_if_icmpeq = 159, opc_if_icmpne = 160, opc_if_icmplt = 161, opc_if_icmpge = 162, opc_if_icmpgt = 163, opc_if_icmple = 164, opc_if_acmpeq = 165, opc_if_acmpne = 166, opc_goto = 167, opc_jsr = 168, opc_ret = 169, opc_tableswitch = 170, opc_lookupswitch = 171, opc_ireturn = 172, opc_lreturn = 173, opc_freturn = 174, opc_dreturn = 175, opc_areturn = 176, opc_return = 177, opc_getstatic = 178, opc_putstatic = 179, opc_getfield = 180, opc_putfield = 181, opc_invokevirtual = 182, opc_invokespecial = 183, opc_invokestatic = 184, opc_invokeinterface = 185, opc_xxxunusedxxx = 186, opc_new = 187, opc_newarray = 188, opc_anewarray = 189, opc_arraylength = 190, opc_athrow = 191, opc_checkcast = 192, opc_instanceof = 193, opc_monitorenter = 194, opc_monitorexit = 195, opc_wide = 196, opc_multianewarray = 197, opc_ifnull = 198, opc_ifnonnull = 199, opc_goto_w = 200, opc_jsr_w = 201, opc_MAX = 201 }; /* Opcode length initializer, use with something like: * unsigned char opcode_length[opc_MAX+1] = JVM_OPCODE_LENGTH_INITIALIZER; */ #define JVM_OPCODE_LENGTH_INITIALIZER { \ 1, /* nop */ \ 1, /* aconst_null */ \ 1, /* iconst_m1 */ \ 1, /* iconst_0 */ \ 1, /* iconst_1 */ \ 1, /* iconst_2 */ \ 1, /* iconst_3 */ \ 1, /* iconst_4 */ \ 1, /* iconst_5 */ \ 1, /* lconst_0 */ \ 1, /* lconst_1 */ \ 1, /* fconst_0 */ \ 1, /* fconst_1 */ \ 1, /* fconst_2 */ \ 1, /* dconst_0 */ \ 1, /* dconst_1 */ \ 2, /* bipush */ \ 3, /* sipush */ \ 2, /* ldc */ \ 3, /* ldc_w */ \ 3, /* ldc2_w */ \ 2, /* iload */ \ 2, /* lload */ \ 2, /* fload */ \ 2, /* dload */ \ 2, /* aload */ \ 1, /* iload_0 */ \ 1, /* iload_1 */ \ 1, /* iload_2 */ \ 1, /* iload_3 */ \ 1, /* lload_0 */ \ 1, /* lload_1 */ \ 1, /* lload_2 */ \ 1, /* lload_3 */ \ 1, /* fload_0 */ \ 1, /* fload_1 */ \ 1, /* fload_2 */ \ 1, /* fload_3 */ \ 1, /* dload_0 */ \ 1, /* dload_1 */ \ 1, /* dload_2 */ \ 1, /* dload_3 */ \ 1, /* aload_0 */ \ 1, /* aload_1 */ \ 1, /* aload_2 */ \ 1, /* aload_3 */ \ 1, /* iaload */ \ 1, /* laload */ \ 1, /* faload */ \ 1, /* daload */ \ 1, /* aaload */ \ 1, /* baload */ \ 1, /* caload */ \ 1, /* saload */ \ 2, /* istore */ \ 2, /* lstore */ \ 2, /* fstore */ \ 2, /* dstore */ \ 2, /* astore */ \ 1, /* istore_0 */ \ 1, /* istore_1 */ \ 1, /* istore_2 */ \ 1, /* istore_3 */ \ 1, /* lstore_0 */ \ 1, /* lstore_1 */ \ 1, /* lstore_2 */ \ 1, /* lstore_3 */ \ 1, /* fstore_0 */ \ 1, /* fstore_1 */ \ 1, /* fstore_2 */ \ 1, /* fstore_3 */ \ 1, /* dstore_0 */ \ 1, /* dstore_1 */ \ 1, /* dstore_2 */ \ 1, /* dstore_3 */ \ 1, /* astore_0 */ \ 1, /* astore_1 */ \ 1, /* astore_2 */ \ 1, /* astore_3 */ \ 1, /* iastore */ \ 1, /* lastore */ \ 1, /* fastore */ \ 1, /* dastore */ \ 1, /* aastore */ \ 1, /* bastore */ \ 1, /* castore */ \ 1, /* sastore */ \ 1, /* pop */ \ 1, /* pop2 */ \ 1, /* dup */ \ 1, /* dup_x1 */ \ 1, /* dup_x2 */ \ 1, /* dup2 */ \ 1, /* dup2_x1 */ \ 1, /* dup2_x2 */ \ 1, /* swap */ \ 1, /* iadd */ \ 1, /* ladd */ \ 1, /* fadd */ \ 1, /* dadd */ \ 1, /* isub */ \ 1, /* lsub */ \ 1, /* fsub */ \ 1, /* dsub */ \ 1, /* imul */ \ 1, /* lmul */ \ 1, /* fmul */ \ 1, /* dmul */ \ 1, /* idiv */ \ 1, /* ldiv */ \ 1, /* fdiv */ \ 1, /* ddiv */ \ 1, /* irem */ \ 1, /* lrem */ \ 1, /* frem */ \ 1, /* drem */ \ 1, /* ineg */ \ 1, /* lneg */ \ 1, /* fneg */ \ 1, /* dneg */ \ 1, /* ishl */ \ 1, /* lshl */ \ 1, /* ishr */ \ 1, /* lshr */ \ 1, /* iushr */ \ 1, /* lushr */ \ 1, /* iand */ \ 1, /* land */ \ 1, /* ior */ \ 1, /* lor */ \ 1, /* ixor */ \ 1, /* lxor */ \ 3, /* iinc */ \ 1, /* i2l */ \ 1, /* i2f */ \ 1, /* i2d */ \ 1, /* l2i */ \ 1, /* l2f */ \ 1, /* l2d */ \ 1, /* f2i */ \ 1, /* f2l */ \ 1, /* f2d */ \ 1, /* d2i */ \ 1, /* d2l */ \ 1, /* d2f */ \ 1, /* i2b */ \ 1, /* i2c */ \ 1, /* i2s */ \ 1, /* lcmp */ \ 1, /* fcmpl */ \ 1, /* fcmpg */ \ 1, /* dcmpl */ \ 1, /* dcmpg */ \ 3, /* ifeq */ \ 3, /* ifne */ \ 3, /* iflt */ \ 3, /* ifge */ \ 3, /* ifgt */ \ 3, /* ifle */ \ 3, /* if_icmpeq */ \ 3, /* if_icmpne */ \ 3, /* if_icmplt */ \ 3, /* if_icmpge */ \ 3, /* if_icmpgt */ \ 3, /* if_icmple */ \ 3, /* if_acmpeq */ \ 3, /* if_acmpne */ \ 3, /* goto */ \ 3, /* jsr */ \ 2, /* ret */ \ 99, /* tableswitch */ \ 99, /* lookupswitch */ \ 1, /* ireturn */ \ 1, /* lreturn */ \ 1, /* freturn */ \ 1, /* dreturn */ \ 1, /* areturn */ \ 1, /* return */ \ 3, /* getstatic */ \ 3, /* putstatic */ \ 3, /* getfield */ \ 3, /* putfield */ \ 3, /* invokevirtual */ \ 3, /* invokespecial */ \ 3, /* invokestatic */ \ 5, /* invokeinterface */ \ 0, /* xxxunusedxxx */ \ 3, /* new */ \ 2, /* newarray */ \ 3, /* anewarray */ \ 1, /* arraylength */ \ 1, /* athrow */ \ 3, /* checkcast */ \ 3, /* instanceof */ \ 1, /* monitorenter */ \ 1, /* monitorexit */ \ 0, /* wide */ \ 4, /* multianewarray */ \ 3, /* ifnull */ \ 3, /* ifnonnull */ \ 5, /* goto_w */ \ 5 /* jsr_w */ \ } #endif /*_JRASTRO_CLASSFILE_CONSTANTS_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro_basic.h0000664000175000017500000000445311674062007021573 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _JRASTRO_BASIC_H_ #define _JRASTRO_BASIC_H_ #define THREAD_LOADER 1234 #define THREAD_MONITOR 4321 #define THREAD_NEW_ARRAY 5678 #define MAX_NAME_THREAD 70 //#define OBJECT_ID(object) (*(int *)object) #define GET_JVMTI() (gagent->jvmti) typedef struct { jvmtiEnv *jvmti; jrawMonitorID monitor; jrawMonitorID monitor_thread; jrawMonitorID monitor_buffer; jrawMonitorID monitor_new_array; jrawMonitorID monitor_tag; }globalAgent; extern globalAgent *gagent; extern jvmtiCapabilities capabilities; extern jvmtiEventCallbacks callbacks; extern hash_t h_options; //extern hash_t h; extern bool traces; extern bool tracesAll; extern bool methodsTrace; extern bool memoryTrace; extern bool initialized; extern rst_buffer_t *ptr_loader; extern rst_buffer_t *ptr_monitor; extern rst_buffer_t *ptr_new_array; void jrst_describe_error(jvmtiEnv *jvmtiEnv, jvmtiError error); void jrst_check_error(jvmtiEnv *jvmtiEnv, jvmtiError error, const char *frase); void jrst_enter_critical_section(jvmtiEnv *jvmtiEnv, jrawMonitorID monitor); void jrst_exit_critical_section(jvmtiEnv *jvmtiEnv, jrawMonitorID monitor); void jrst_get_thread_name(jvmtiEnv *jvmtiLocate, jthread thread, char *name, int numMax); bool jrst_trace_class(char *className); bool jrst_trace_methods(); //bool jrst_trace(void *key); #endif /*_JRASTRO_BASIC_H_*/ Paje-1.98/Tracers/JRastro/include/hash.h0000664000175000017500000000523511674062007017770 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _HASH_H_ #define _HASH_H_ #define MAX_HASH 100 typedef void* hash_data_t; typedef void* hash_key_t; typedef struct hash_element_t_{ hash_key_t key; hash_data_t data; struct hash_element_t_ *next; }hash_element_t; typedef int(*hash_func_t)(hash_key_t); typedef void(*hash_func_copy_t)(hash_element_t*, hash_key_t, hash_data_t); typedef bool(*hash_func_compare_t)(hash_key_t, hash_key_t); typedef void(*hash_func_destroy_t)(hash_element_t*); typedef struct { hash_element_t hash[MAX_HASH]; hash_func_t hash_func; hash_func_copy_t hash_copy; hash_func_compare_t hash_compare; hash_func_destroy_t hash_destroy; }hash_t; int hash_value(hash_key_t key); int hash_value_string(hash_key_t key); int hash_value_int(hash_key_t key); void hash_null(void *p); void hash_initialize(hash_t *h, hash_func_t func, hash_func_copy_t copy, hash_func_compare_t compare, hash_func_destroy_t destroy); void hash_finalize(hash_t *h); void hash_destroy(hash_element_t *element); void hash_destroy_string(hash_element_t *element); void hash_destroy_int(hash_element_t *element); bool hash_key_cmp(hash_key_t key, hash_key_t key2); bool hash_key_cmp_string(hash_key_t key, hash_key_t key2); bool hash_key_cmp_int(hash_key_t key, hash_key_t key2); void hash_copy (hash_element_t *element, hash_key_t key, hash_data_t data); void hash_copy_string (hash_element_t *element, hash_key_t key, hash_data_t data); void hash_copy_int (hash_element_t *element, hash_key_t key, hash_data_t data); hash_data_t *hash_locate(hash_t *h, hash_key_t key); bool hash_find(hash_t *h, hash_key_t key); void hash_insert(hash_t *h, hash_key_t key, hash_data_t data); void hash_remove(hash_t *h, hash_key_t key); #endif /*_HASH_H_*/ Paje-1.98/Tracers/JRastro/include/org_lsc_JRastro_Instru.h0000664000175000017500000000251611674062007023504 0ustar schnorrschnorr/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class org_lsc_JRastro_Instru */ #ifndef _Included_org_lsc_JRastro_Instru #define _Included_org_lsc_JRastro_Instru #ifdef __cplusplus extern "C" { #endif /* * Class: org_lsc_JRastro_Instru * Method: func_init * Signature: (Ljava/lang/Object;Ljava/lang/Thread;)V */ JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func_1init (JNIEnv *, jclass, jobject, jobject); /* * Class: org_lsc_JRastro_Instru * Method: func_newArray * Signature: (Ljava/lang/Object;Ljava/lang/Thread;)V */ JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func_1newArray (JNIEnv *, jclass, jobject, jobject); /* * Class: org_lsc_JRastro_Instru * Method: func * Signature: (Ljava/lang/Object;Ljava/lang/Thread;I)V */ JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func (JNIEnv *, jclass, jobject, jobject, jint); /* * Class: org_lsc_JRastro_Instru * Method: func_entry * Signature: (Ljava/lang/Thread;I)V */ JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func_1entry (JNIEnv *, jclass, jobject, jint); /* * Class: org_lsc_JRastro_Instru * Method: func_exit * Signature: (Ljava/lang/Thread;)V */ JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func_1exit (JNIEnv *, jclass, jobject); #ifdef __cplusplus } #endif #endif Paje-1.98/Tracers/JRastro/include/JRastro_thread.h0000664000175000017500000000237011674062007021755 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _JRASTRO_THREAD_H_ #define _JRASTRO_THREAD_H_ void JNICALL jrst_event_thread_start(jvmtiEnv *jvmtiEnv, JNIEnv* jniEnv, jthread thread); void JNICALL jrst_event_thread_end(jvmtiEnv *jvmtiEnv, JNIEnv* jniEnv, jthread thread); #endif /*_JRASTRO_THREAD_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro_list_func.h0000664000175000017500000000301211674062007022466 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _JRASTRO_LIST_FUNC_H_ #define _JRASTRO_LIST_FUNC_H_ typedef struct { int idObject; long jvm; }list_object_t; typedef struct { char *className; long jvm; }list_class_t; void list_copy_object(list_element_t *element, list_data_t data); void list_copy_string_class(list_element_t *element, list_data_t data); bool list_cmp_object(list_data_t data, list_data_t data2); bool list_cmp_string_class(list_data_t data, list_data_t data2); void list_destroy_string_class(position_t pos); #endif /*_JRASTRO_LIST_FUNC_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro_hash_func.h0000664000175000017500000000271511674062007022447 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _JRASTRO_HASH_FUNC_H_ #define _JRASTRO_HASH_FUNC_H_ void hash_copy_string_data (hash_element_t *element, hash_key_t key, hash_data_t data); void hash_destroy_string_data(hash_element_t *element); void hash_destroy_string_list(hash_element_t *element); void hash_destroy_new(hash_element_t *element); void hash_copy_new(hash_element_t *element, hash_key_t key, hash_data_t data); void hash_destroy_new_thread(hash_element_t *element); #endif /*_JRASTRO_HASH_FUNC_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro_options.h0000664000175000017500000000275611674062007022211 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #ifndef _JRASTRO_OPTIONS_H_ #define _JRASTRO_OPTIONS_H_ #define MAX_NAME_OPTIONS 50 #define MAX_LINE_EVENTS 80 #define MAX_LINE 120 extern char eventsOptionName[MAX_NAME_OPTIONS]; extern char methodsOptionName[MAX_NAME_OPTIONS]; //extern bool teste; void jrst_enable_all(jvmtiEnv *jvmtiLocate); void jrst_threads(jvmtiEnv *jvmtiLocate); void jrst_read_events_enable(jvmtiEnv *jvmtiLocate); void jrst_read_class_methods_enable(); void jrst_read_names_options(char *options); #endif /*_JRASTRO_OPTIONS_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro_java_crw_demo.h0000664000175000017500000001474611674062007023320 0ustar schnorrschnorr/* * @(#)java_crw_demo.h 1.16 05/01/04 * * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */ /* This file is a modified version of the file "java_crw_demo.h" contained * in "jdk-1_5_0_04-linux-i586.bin" from Sun Microsystems. * * Modification written by: Geovani Ricardo Wiedenhoft */ #ifndef _JRASTRO_JAVA_CRW_DEMO_H_ #define _JRASTRO_JAVA_CRW_DEMO_H_ /* This callback is used to return the method information for a class. * Since the information was already read here, it was useful to * return it here, with no JVMTI phase restrictions. * If the class file does represent a "class" and it has methods, then * this callback will be called with the class number and pointers to * the array of names, array of signatures, and the count of methods. */ //typedef void (*MethodNumberRegister)(unsigned, const char**, const char**, int); typedef bool (*MethodTraceOptions)(); /* Class file reader/writer interface. Basic input is a classfile image * and details about what to inject. The output is a new classfile image * that was allocated with malloc(), and should be freed by the caller. */ /* Names of external symbols to look for. These are the names that we * try and lookup in the shared library. On Windows 2000, the naming * convention is to prefix a "_" and suffix a "@N" where N is 4 times * the number or arguments supplied.It has 19 args, so 76 = 19*4. * On Windows 2003, Linux, and Solaris, the first name will be * found, on Windows 2000 a second try should find the second name. * * WARNING: If You change the JavaCrwDemo typedef, you MUST change * multiple things in this file, including this name. */ #define JAVA_CRW_DEMO_SYMBOLS { "java_crw_demo", "_java_crw_demo@76" } /* Typedef needed for type casting in dynamic access situations. */ typedef void (JNICALL *JavaCrwDemo)( unsigned class_number, const char *name, const unsigned char *file_image, long file_len, int system_class, unsigned char **pnew_file_image, long *pnew_file_len, MethodTraceOptions trace_options ); /* Function export (should match typedef above) */ JNIEXPORT void JNICALL java_crw_demo( unsigned class_number, /* Caller assigned class number for class */ const char *name, /* Internal class name, e.g. java/lang/Object */ /* (Do not use "java.lang.Object" format) */ const unsigned char *file_image, /* Pointer to classfile image for this class */ long file_len, /* Length of the classfile in bytes */ int system_class, /* Set to 1 if this is a system class */ /* (prevents injections into empty */ /* , finalize, and methods) */ // char* tclass_name, /* Class that has methods we will call at */ /* the injection sites (tclass) */ // char* tclass_sig, /* Signature of tclass */ /* (Must be "L" + tclass_name + ";") */ // char* call_name, /* Method name in tclass to call at offset 0 */ /* for every method */ // char* call_sig, /* Signature of this call_name method */ /* (Must be "(II)V") */ // char* return_name, /* Method name in tclass to call at all */ /* return opcodes in every method */ // char* return_sig, /* Signature of this return_name method */ /* (Must be "(II)V") */ // char* obj_init_name, /* Method name in tclass to call first thing */ /* when injecting java.lang.Object. */ // char* obj_init_sig, /* Signature of this obj_init_name method */ /* (Must be "(Ljava/lang/Object;)V") */ // char* newarray_name, /* Method name in tclass to call after every */ /* newarray opcode in every method */ // char* newarray_sig, /* Signature of this method */ /* (Must be "(Ljava/lang/Object;II)V") */ unsigned char **pnew_file_image, /* Returns a pointer to new classfile image */ long *pnew_file_len, /* Returns the length of the new image */ // MethodNumberRegister // mnum_callback, /* Pointer to function that gets called */ /* with all details on methods in this */ /* class. NULL means skip this call. */ MethodTraceOptions trace_options ); /* External to read the class name out of a class file . * * WARNING: If You change the typedef, you MUST change * multiple things in this file, including this name. */ #define JAVA_CRW_DEMO_CLASSNAME_SYMBOLS \ { "java_crw_demo_classname", "_java_crw_demo_classname@12" } /* Typedef needed for type casting in dynamic access situations. */ typedef char * (JNICALL *JavaCrwDemoClassname)( const unsigned char *file_image, long file_len); JNIEXPORT char * JNICALL java_crw_demo_classname( const unsigned char *file_image, long file_len); #endif /*_JRASTRO_JAVA_CRW_DEMO_H_*/ Paje-1.98/Tracers/JRastro/include/JRastro_rastros.h0000664000175000017500000000436411674062007022210 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ /* Do not edit. File generated by rastro_generate. */ #ifndef _RASTRO_JRastro_rastros_H_ #define _RASTRO_JRastro_rastros_H_ #include "rastro_public.h" #include "rastro_private.h" void rst_event_i_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0); #define rst_event_i(type, i0) rst_event_i_ptr(RST_PTR, type, i0) void rst_event_ii_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0, u_int32_t i1); #define rst_event_ii(type, i0, i1) rst_event_ii_ptr(RST_PTR, type, i0, i1) void rst_event_is_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0, u_int8_t *s0); #define rst_event_is(type, i0, s0) rst_event_is_ptr(RST_PTR, type, i0, s0) void rst_event_isii_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0, u_int8_t *s0, u_int32_t i1, u_int32_t i2); #define rst_event_isii(type, i0, s0, i1, i2) rst_event_isii_ptr(RST_PTR, type, i0, s0, i1, i2) void rst_event_isiii_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0, u_int8_t *s0, u_int32_t i1, u_int32_t i2, u_int32_t i3); #define rst_event_isiii(type, i0, s0, i1, i2, i3) rst_event_isiii_ptr(RST_PTR, type, i0, s0, i1, i2, i3) void rst_event_liis_ptr(rst_buffer_t *ptr, u_int16_t type, u_int64_t l0, u_int32_t i0, u_int32_t i1, u_int8_t *s0); #define rst_event_liis(type, l0, i0, i1, s0) rst_event_liis_ptr(RST_PTR, type, l0, i0, i1, s0) void rst_event_lis_ptr(rst_buffer_t *ptr, u_int16_t type, u_int64_t l0, u_int32_t i0, u_int8_t *s0); #define rst_event_lis(type, l0, i0, s0) rst_event_lis_ptr(RST_PTR, type, l0, i0, s0) #endif Paje-1.98/Tracers/JRastro/libRastro/0000775000175000017500000000000011674062007017205 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/libRastro/Makefile.am0000664000175000017500000000012111674062007021233 0ustar schnorrschnorrAUTOMAKE_OPTIONS = foreign SUBDIRS = src scripts examples ACLOCAL_AMFLAGS=-I m4 Paje-1.98/Tracers/JRastro/libRastro/src/0000775000175000017500000000000011674062007017774 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/libRastro/src/Makefile.am0000664000175000017500000000310611674062007022030 0ustar schnorrschnorrAM_CPPFLAGS = $(all_includes) #LIBRARY_VERSION= 0:0:0 # | | | # +------+ | +---+ # | | | # current:revision:age # | | | # | | +- Increment if interfaces have been added # | | Set to zero if interfaces have been removed or # | | changed # | +- Increment if source code has changed # | Set to zero if current is incremented # +- Increment if interfaces have been added, removed or changed LIBRARY_VERSION= 0:0:0 RASTRO_TIMESYNC_SRC = rastro_timesync.c rastro_timesync_f.c RASTRO_GENERATE_SRC = rastro_generate.c LIB_RASTRO_SRC = list.c rastro_read.c rastro_write.c rastro_write_functions.c include_HEADERS = rastro_public.h rastro_private.h lib_LTLIBRARIES=librastro.la bin_PROGRAMS=rastro_timesync rastro_generate librastro_la_SOURCES = $(LIB_RASTRO_SRC) librastro_la_LDFLAGS = -no-undefined -version-info $(LIBRARY_VERSION) rastro_timesync_SOURCES = $(RASTRO_TIMESYNC_SRC) rastro_timesync_LDADD = librastro.la rastro_generate_SOURCES = $(RASTRO_GENERATE_SRC) rastro_generate_LDADD = librastro.la # what flags you want to pass to the C compiler & linker #CFLAGS = --pedantic -Wall -std=c99 -O2 #LDFLAGS = # ## this lists the binaries to produce, the (non-PHONY, binary) targets in ## the previous manual Makefile #bin_PROGRAMS = targetbinary1 targetbinary2 [...] targetbinaryN #targetbinary1_SOURCES = targetbinary1.c myheader.h [...] #targetbinary2_SOURCES = targetbinary2.c #targetbinaryN_SOURCES = targetbinaryN.c # Paje-1.98/Tracers/JRastro/libRastro/src/rastro_timesync_f.h0000664000175000017500000000030211674062007023672 0ustar schnorrschnorr/* Do not edit. File generated by rastro_generate. */ #ifndef _RASTRO_rastro_timesync_f_H_ #define _RASTRO_rastro_timesync_f_H_ #include "rastro_public.h" #include "rastro_private.h" #endif Paje-1.98/Tracers/JRastro/libRastro/src/rastro_generate.c0000664000175000017500000002143511674062007023331 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include "rastro_public.h" #include "rastro_private.h" #include #include #include #include int validate_argtypes(char *linha) { return strspn(linha, XSTR(LETRA_DOUBLE) XSTR(LETRA_UINT64) XSTR(LETRA_FLOAT) XSTR(LETRA_UINT32) XSTR(LETRA_UINT16) XSTR(LETRA_UINT8) XSTR(LETRA_STRING)) == strlen(linha); } void break_types(char *argtypes, char *arglist, char *varlist, counters_t *ct) { char *s = argtypes; char c; int na, nv; ct->n_uint16 = ct->n_uint8 = ct->n_uint64 = ct->n_uint32 = 0; ct->n_float = ct->n_double = ct->n_string = 0; na = sprintf(arglist, "u_int16_t type"); nv = sprintf(varlist, "type"); while ((c = *s++) != '\0') { switch (c) { case LETRA_UINT32_ASPA: na += sprintf(arglist+na, ", u_int32_t " XSTR(LETRA_UINT32) "%d", ct->n_uint32); nv += sprintf(varlist+nv, ", " XSTR(LETRA_UINT32) "%d", ct->n_uint32); ct->n_uint32++; break; case LETRA_UINT16_ASPA: na += sprintf(arglist+na, ", u_int16_t " XSTR(LETRA_UINT16) "%d", ct->n_uint16); nv += sprintf(varlist+nv, ", " XSTR(LETRA_UINT16) "%d", ct->n_uint16); ct->n_uint16++; break; case LETRA_UINT8_ASPA: na += sprintf(arglist+na, ", u_int8_t " XSTR(LETRA_UINT8) "%d", ct->n_uint8); nv += sprintf(varlist+nv, ", " XSTR(LETRA_UINT8) "%d", ct->n_uint8); ct->n_uint8++; break; case LETRA_FLOAT_ASPA: na += sprintf(arglist+na, ", float " XSTR(LETRA_FLOAT) "%d", ct->n_float); nv += sprintf(varlist+nv, ", " XSTR(LETRA_FLOAT) "%d", ct->n_float); ct->n_float++; break; case LETRA_DOUBLE_ASPA: na += sprintf(arglist+na, ", double " XSTR(LETRA_DOUBLE) "%d", ct->n_double); nv += sprintf(varlist+nv, ", " XSTR(LETRA_DOUBLE) "%d", ct->n_double); ct->n_double++; break; case LETRA_UINT64_ASPA: na += sprintf(arglist+na, ", u_int64_t " XSTR(LETRA_UINT64) "%d", ct->n_uint64); nv += sprintf(varlist+nv, ", " XSTR(LETRA_UINT64) "%d", ct->n_uint64); ct->n_uint64++; break; case LETRA_STRING_ASPA: na += sprintf(arglist+na, ", char *" XSTR(LETRA_STRING) "%d", ct->n_string); nv += sprintf(varlist+nv, ", " XSTR(LETRA_STRING) "%d", ct->n_string); ct->n_string++; break; } } } void generate_header(char *argtypes, char *arglist, char *varlist, FILE *hfile) { fprintf(hfile, "void rst_event_%s_ptr(rst_buffer_t *ptr, %s);\n", argtypes, arglist); fprintf(hfile, "#define rst_event_%s(%s) rst_event_%s_ptr(RST_PTR, %s)\n", argtypes, varlist, argtypes, varlist); } void generate_function_start(counters_t *ct, FILE *cfile) { int bits; int done; int res; counters_t ct_done = {0}; bits = 16; done = 0; fprintf(cfile, "\trst_startevent(ptr, type<<18|"); for (;;) { int remaining_bits = bits; res = 0; while (done < RST_TYPE_CTR && remaining_bits > 0) { int nibble_type = 0; switch (done) { #define CASE(n, ctr, type) \ case n: \ if (ct_done.ctr < ct->ctr && nibble_type == 0) { \ nibble_type = type; \ ct_done.ctr++; \ } \ if (ct_done.ctr < ct->ctr) \ break; \ done++ CASE(0, n_double, RST_DOUBLE_TYPE); CASE(1, n_uint64, RST_LONG_TYPE); CASE(2, n_float, RST_FLOAT_TYPE); CASE(3, n_uint32, RST_INT_TYPE); CASE(4, n_uint16, RST_SHORT_TYPE); CASE(5, n_uint8, RST_CHAR_TYPE); CASE(6, n_string, RST_STRING_TYPE); #undef CASE } if (nibble_type != 0) { res = res << 4 | nibble_type; remaining_bits -= 4; } } if (done < RST_TYPE_CTR) { fprintf(cfile, "0x%x);\n", res); //Verificar // fprintf(cfile, "\tRST_PUT(ptr, u_int64_t, "); fprintf(cfile, "\tRST_PUT(ptr, u_int32_t, "); bits = 28; } else { fprintf(cfile, "0x%x);\n", RST_LAST<n_double; i++) fprintf(cfile, "\tRST_PUT(ptr, double, " XSTR(LETRA_DOUBLE) "%d);\n", i); for (i = 0; i < ct->n_uint64; i++) fprintf(cfile, "\tRST_PUT(ptr, u_int64_t, " XSTR(LETRA_UINT64) "%d);\n", i); for (i = 0; i < ct->n_float; i++) fprintf(cfile, "\tRST_PUT(ptr, float, " XSTR(LETRA_FLOAT) "%d);\n", i); for (i = 0; i < ct->n_uint32; i++) fprintf(cfile, "\tRST_PUT(ptr, u_int32_t, " XSTR(LETRA_UINT32) "%d);\n", i); for (i = 0; i < ct->n_uint16; i++) fprintf(cfile, "\tRST_PUT(ptr, u_int16_t, " XSTR(LETRA_UINT16) "%d);\n", i); for (i = 0; i < ct->n_uint8; i++) fprintf(cfile, "\tRST_PUT(ptr, u_int8_t, " XSTR(LETRA_UINT8) "%d);\n", i); for (i = 0; i < ct->n_string; i++) fprintf(cfile, "\tRST_PUT_STR(ptr, " XSTR(LETRA_STRING) "%d);\n", i); fprintf(cfile, "\trst_endevent(ptr);\n"); fprintf(cfile, "}\n\n"); } void generate_function(char *argtypes, FILE *hfile, FILE *cfile) { char arglist[1000], varlist[1000]; counters_t ct; break_types(argtypes, arglist, varlist, &ct); generate_header(argtypes, arglist, varlist, hfile); generate_body(argtypes, arglist, &ct, cfile); } void generate_hfile_start(FILE *hfile, char *hfilename) { int n; char *dot; dot = strchr(hfilename, '.'); if (dot != NULL) { n = dot - hfilename; } else { n = strlen(hfilename); } fprintf(hfile, "/* Do not edit. File generated by rastro_generate. */\n\n"); fprintf(hfile, "#ifndef _RASTRO_%.*s_H_\n", n, hfilename); fprintf(hfile, "#define _RASTRO_%.*s_H_\n\n", n, hfilename); fprintf(hfile, "#include \"rastro_public.h\"\n"); fprintf(hfile, "#include \"rastro_private.h\"\n\n"); } void generate_hfile_end(FILE *hfile) { fprintf(hfile, "\n#endif\n"); } void generate_cfile_start(FILE *cfile, char *hfilename) { fprintf(cfile, "/* Do not edit. File generated by rastro_generate. */\n\n"); fprintf(cfile, "#include \"%s\"\n\n", hfilename); } FILE *openfile(char *name, char *mode) { FILE *f; f = fopen(name, mode); if (f == NULL) { fprintf(stderr, "Error opening file %s: %s\n", name, strerror(errno)); exit(1); } return f; } /** Inicio do programa * @version 0.2 * @author Gabriela e Lucas * @param argv[1] arquivo de entrada * @param argv[2] arquivo de saida_pthreads * @param argv[3] arquivo de saida_ptr */ int main(int argc, char **argv) { char *hfilename; char *cfilename; FILE *entrada; FILE *hfile; FILE *cfile; char argtypes[1000]; if ( argc != 4 ) { printf("rastro_generate functions name.c name.h\n"); exit(0); } cfilename = argv[2]; hfilename = argv[3]; entrada = openfile(argv[1], "r"); cfile = openfile(cfilename, "w"); hfile = openfile(hfilename, "w"); generate_hfile_start(hfile, hfilename); generate_cfile_start(cfile, hfilename); while (fscanf(entrada, "%s", argtypes) == 1) { if (!validate_argtypes(argtypes)) { fprintf(stderr, "Invalid event types \"%s\" ignored.\n", argtypes); continue; } generate_function(argtypes, hfile, cfile); } generate_hfile_end(hfile); fclose(entrada); fclose(cfile); fclose(hfile); return 0; } Paje-1.98/Tracers/JRastro/libRastro/src/list.h0000664000175000017500000000733511674062007021130 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// /* Estrutura de dados Lista duplamente encadeada .h */ #ifndef _LIST_H_ #define _LIST_H_ #include #include #include /**Dado da lista**/ typedef void * list_data_t; typedef struct _list_element{ list_data_t data; struct _list_element *prev; struct _list_element *next; } list_element_t; typedef list_element_t * position_t; typedef void(*list_func_copy_t)(list_element_t*, list_data_t); typedef bool(*list_func_compare_t)(list_data_t, list_data_t); typedef void(*list_func_destroy_t)(position_t); typedef struct{ list_element_t *sent; list_func_copy_t list_copy; list_func_compare_t list_compare; list_func_destroy_t list_destroy; } list_t; void list_null(void *p); void list_initialize (list_t * list, list_func_copy_t copy, list_func_compare_t compare, list_func_destroy_t destroy); void list_finalize(list_t * list); void list_destroy (position_t pos); void list_destroy_int (position_t pos); void list_destroy_string (position_t pos); position_t list_locate(list_t *list, list_data_t data); bool list_find(list_t *list, list_data_t data); bool list_cmp(list_data_t, list_data_t); bool list_cmp_int(list_data_t, list_data_t); bool list_cmp_string(list_data_t, list_data_t); void list_copy(list_element_t *element, list_data_t data); void list_copy_int(list_element_t *element, list_data_t data); void list_copy_string(list_element_t *element, list_data_t data); /* retorna a posicao do primeiro elemento da lista ou NULL se lista vazia */ position_t list_inicio (list_t * list); /* retorna a posicao do ultimo elemento da lista ou NULL se lista vazia */ position_t list_final (list_t * list); /* insere dado apos pos (se pos for NULL, insere no inicio da lista) */ void list_insert_after (list_t * list, position_t pos, list_data_t data); /* insere dado antes de pos (se pos for NULL, insere no final da lista) */ void list_insert_before (list_t * list, position_t pos, list_data_t data); void list_remove(list_t *list, list_data_t data); /* remove o elemento na position pos */ /*(se pos igual a NULL remove o primeiro elemento da lista)*/ void list_rem_position (list_t * list, position_t pos); /* retorna o dado contido na posicao pos */ list_data_t list_dado_position (list_t * list, position_t pos); /* retorna a posicao do elemento que segue o elemento na posicao pos (ou NULL, se pos representa o ultimo elemento ou se pos for NULL) */ position_t list_avanca_position (list_t * list, position_t pos); /* retorna a posicao do elemento que antecede o elemento na posicao pos (ou NULL, se pos representa o primeiro elemento ou se pos for NULL) */ position_t list_recua_position (list_t * list, position_t pos); /* retorna o numero de elementos da lista */ int list_quantity (list_t * list); #endif //_LIST_H_ Paje-1.98/Tracers/JRastro/libRastro/src/rastro_read.c0000664000175000017500000003502711674062007022454 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include #include #include #include #include #include #include #include #include #include /* for MAXHOSTNAMELEN */ #include "rastro_public.h" #include "rastro_private.h" /************************FUNCOES INTERNAS DA BIBLIOTECA*****************************/ // Le um evento do buffer static char *trd_event(timestamp_t *hora_global, rst_event_t *evento, char *ptr) { u_int32_t header; char field_types[100]; int field_ctr = 0; int i; int fields_in_header; header = RST_GET(ptr, u_int32_t); evento->type = header >> 18; evento->ct.n_uint64 = evento->ct.n_uint16 = evento->ct.n_double = evento->ct.n_uint32 = 0; evento->ct.n_float = evento->ct.n_string = evento->ct.n_uint8 = 0; if (header & RST_TIME_SET) { long long x; x = (long long) RST_GET(ptr, u_int32_t); *hora_global = x * RST_CLOCK_RESOLUTION; } evento->timestamp = (long long) RST_GET(ptr, u_int32_t); evento->timestamp += *hora_global; fields_in_header = RST_FIELDS_IN_FIRST; for (;;) { for (i = 0; i < fields_in_header; i++) { char type; int bits_to_shift = RST_BITS_PER_FIELD * (fields_in_header - i - 1); type = (header>>bits_to_shift) & RST_FIELD_MASK; if (type == RST_NO_TYPE) { break; } field_types[field_ctr++] = type; } if (!((header >> (fields_in_header * RST_BITS_PER_FIELD)) & RST_LAST)) { // there are more headers -- process next one header = RST_GET(ptr, u_int32_t); fields_in_header = RST_FIELDS_IN_OTHERS; } else { // it was last header -- stop break; } } for (i = 0; i < field_ctr; i++) { switch (field_types[i]) { case RST_STRING_TYPE: RST_GET_STR(ptr, evento->v_string[evento->ct.n_string++]); break; case RST_DOUBLE_TYPE: evento->v_double[evento->ct.n_double++] = RST_GET(ptr, double); break; case RST_LONG_TYPE: evento->v_uint64[evento->ct.n_uint64++] = RST_GET(ptr, u_int64_t); break; case RST_FLOAT_TYPE: evento->v_float[evento->ct.n_float++] = RST_GET(ptr, float); break; case RST_INT_TYPE: evento->v_uint32[evento->ct.n_uint32++] = RST_GET(ptr, u_int32_t); break; case RST_SHORT_TYPE: evento->v_uint16[evento->ct.n_uint16++] = RST_GET(ptr, u_int16_t); break; case RST_CHAR_TYPE: evento->v_uint8[evento->ct.n_uint8++] = RST_GET(ptr, u_int8_t); break; } } ptr = ALIGN_PTR(ptr); return ptr; } // Corrige tempo t a partir da estrutura de correcao static timestamp_t rst_correct_time(timestamp_t remote, ct_t *ct) { timestamp_t local; local = (timestamp_t)(ct->a * (double)(remote - ct->loc0)) + ct->ref0; return local; } static void find_timesync_data(char *filename, rst_one_file_t *of_data) { FILE *ct_file; char refhost[MAXHOSTNAMELEN+1]; char host[MAXHOSTNAMELEN+1]; timestamp_t time; timestamp_t reftime; int first = 1; of_data->sync_time.a = 1; of_data->sync_time.loc0 = 0; of_data->sync_time.ref0 = 0; if (filename == NULL) { return; } ct_file = fopen(filename, "r"); if ( ct_file == NULL ) { return; } while ( !feof(ct_file) ) { fscanf(ct_file, "%s %lld %s %lld", refhost, &reftime, host, &time); if (strcmp(refhost, of_data->hostname) == 0) { // this is the reference host of_data->sync_time.ref0 = reftime; of_data->sync_time.loc0 = reftime; break; } if (strcmp(host, of_data->hostname) == 0) { if (first) { of_data->sync_time.ref0 = reftime; of_data->sync_time.loc0 = time; first = 0; } else { of_data->sync_time.a = (double)(reftime - of_data->sync_time.ref0) / (double)(time - of_data->sync_time.loc0); } } } fclose(ct_file); } void rst_fill_buffer(rst_one_file_t *of_data) { int bytes_processed; int bytes_remaining; int bytes_free; int bytes_read; bytes_processed = of_data->rst_buffer_ptr - of_data->rst_buffer; bytes_remaining = of_data->rst_buffer_used - bytes_processed; if (bytes_remaining >= RST_MAX_EVENT_SIZE) { return; } bytes_free = of_data->rst_buffer_size - of_data->rst_buffer_used; if (bytes_free < RST_MAX_EVENT_SIZE) { memmove(of_data->rst_buffer, of_data->rst_buffer_ptr, bytes_remaining); of_data->rst_buffer_used = bytes_remaining; of_data->rst_buffer_ptr = of_data->rst_buffer; bytes_free += bytes_processed; } bytes_read = read(of_data->fd, of_data->rst_buffer + of_data->rst_buffer_used, bytes_free); if (bytes_read > 0) { of_data->rst_buffer_used += bytes_read; } } /*FUNCOES RELATIVAS A LEITURA DE UM UNICO ARQUIVO DE RASTRO*/ //Abre um arquivo de rastro int rst_open_one_file(char *f_name, rst_one_file_t *of_data, char *syncfilename, int buffer_size) { of_data->fd = open(f_name, O_RDONLY); if (of_data->fd == -1) { fprintf(stderr, "[rastro] cannot open file %s: %s\n", f_name, strerror(errno)); return RST_NOK; } of_data->sync_time.a = 1.0; of_data->sync_time.ref0 = 0; of_data->sync_time.loc0 = 0; if (buffer_size < 2*RST_MAX_EVENT_SIZE) { buffer_size = 2*RST_MAX_EVENT_SIZE; } of_data->rst_buffer_size = buffer_size; of_data->rst_buffer = (char *)malloc(of_data->rst_buffer_size); if (of_data->rst_buffer == NULL) { fprintf(stderr, "[rastro] cannot allocate buffer memory"); close(of_data->fd); of_data->fd = -1; return RST_NOK; } of_data->rst_buffer_ptr = of_data->rst_buffer; of_data->rst_buffer_used = 0; if (!rst_decode_one_event(of_data, &of_data->event) || of_data->event.type != RST_EVENT_INIT || of_data->event.ct.n_uint64 != 2 || of_data->event.ct.n_string != 1) { fprintf(stderr, "[rastro] invalid rastro file %s\n", f_name); close(of_data->fd); of_data->fd = -1; free(of_data->rst_buffer); of_data->rst_buffer = NULL; return RST_NOK; } of_data->id1 = of_data->event.v_uint64[0]; of_data->id2 = of_data->event.v_uint64[1]; of_data->hostname = strdup(of_data->event.v_string[0]); of_data->event.id1 = of_data->id1; of_data->event.id2 = of_data->id2; find_timesync_data(syncfilename, of_data); /*Sincroniza o primeiro evento*/ of_data->event.timestamp = rst_correct_time(of_data->event.timestamp, &of_data->sync_time); return RST_OK; } //Finaliza um arquivo de rastro void rst_close_one_file(rst_one_file_t *of_data) { close(of_data->fd); of_data->fd = -1; free(of_data->rst_buffer); of_data->rst_buffer = NULL; free(of_data->hostname); of_data->hostname = NULL; } // Le buffer e decodifica um evento int rst_decode_one_event(rst_one_file_t *of_data, rst_event_t *event) { int bytes_remaining, bytes_processed; rst_fill_buffer(of_data); bytes_processed = of_data->rst_buffer_ptr - of_data->rst_buffer; bytes_remaining = of_data->rst_buffer_used - bytes_processed; if (bytes_remaining <= 0) { return RST_NOK; } of_data->rst_buffer_ptr = trd_event(&of_data->hora_global, event, of_data->rst_buffer_ptr); event->timestamp = rst_correct_time(event->timestamp, &of_data->sync_time); event->id1 = of_data->id1; event->id2 = of_data->id2; if (event->type == RST_EVENT_STOP) { return RST_NOK; } return RST_OK; } /*FIM*/ /*FUNCOES DE AUXLIO A LEITURA DE MULTIPLOS ARQUIVOS*/ //Reorganiza a fila de traz pra frente void reorganize_bottom_up (rst_file_t *f_data, int son) { int dead; dead = son/2; if (dead == 0) return; smallest_first (f_data, dead, son); reorganize_bottom_up (f_data, dead); } //Reorganiza a fila do primeiro pra traz void reorganize_top_down (rst_file_t *f_data, int dead) { int son1, son2; son1 = dead * 2; son2 = (dead * 2) + 1; //fila vazia if (dead > f_data->quantity) return; //filho1 nao pertence a fila if (son1 > f_data->quantity) return; //filho2 nao pertence a fila if (son2 > f_data->quantity) smallest_first (f_data, dead, son1); //ambos filhos pertencem a fila else { if (f_data->of_data[son1 - 1]->event.timestamp < f_data->of_data[son2 - 1]->event.timestamp) { smallest_first (f_data, dead, son1); reorganize_top_down (f_data, son1); } else { smallest_first (f_data, dead, son2); reorganize_top_down (f_data, son2); } } } //Se o filho for menor que o pai, troca os dois void smallest_first (rst_file_t *f_data, int dead, int son) { rst_one_file_t *aux; if (f_data->of_data[dead - 1]->event.timestamp > f_data->of_data[son - 1]->event.timestamp){ aux = f_data->of_data[dead - 1]; f_data->of_data[dead - 1] = f_data->of_data[son - 1]; f_data->of_data[son - 1] = aux; } } /*FIM*/ /*********************************FUNCOES DISPONIVEIS AO USUARIO************************************************/ /*FUNCOES RELATIVAS A LEITURA DE MULTIPLOS CODIGOS*/ //Adiciona um arquivo de rastro na fila de prioridades 'f_data' int rst_open_file(char *f_name, rst_file_t *f_data, char *syncfilename, int buffer_size) { if (f_data->initialized != FDATAINITIALIZED){ f_data->of_data = (rst_one_file_t **) malloc (sizeof( *f_data->of_data )); f_data->quantity = 0; f_data->initialized = FDATAINITIALIZED; } else { f_data->of_data = (rst_one_file_t **) realloc (f_data->of_data, sizeof( *f_data->of_data ) * (f_data->quantity + 1)); } if (f_data->of_data == NULL) { fprintf(stderr, "[rastro] cannot allocate memory"); return RST_NOK; } f_data->of_data[f_data->quantity] = (rst_one_file_t *) malloc (sizeof( rst_one_file_t )); if (f_data->of_data[f_data->quantity] == NULL) { fprintf(stderr, "[rastro] cannot allocate memory"); return RST_NOK; } if (rst_open_one_file(f_name, f_data->of_data[f_data->quantity], syncfilename, buffer_size)){ if ( !rst_decode_one_event (f_data->of_data[f_data->quantity], &f_data->of_data[f_data->quantity]->event) ) { rst_close_one_file(f_data->of_data[f_data->quantity]); free(f_data->of_data[f_data->quantity]); } else { f_data->quantity++; reorganize_bottom_up (f_data, f_data->quantity); } return RST_OK; }else return RST_NOK; } //Finaliza fila de prioridades void rst_close_file (rst_file_t *f_data) { free(f_data->of_data); f_data->quantity = 0; } //Le proximo evento do espaco temporal int rst_decode_event (rst_file_t *f_data, rst_event_t *event) { rst_one_file_t *aux; //nao tem nada na fila if (f_data->quantity < 1) return RST_NOK; else { *event = f_data->of_data[0]->event; f_data->quantity--; //troca o ultimo pelo primeiro(removido) aux = f_data->of_data[0]; f_data->of_data[0] = f_data->of_data[f_data->quantity]; f_data->of_data[f_data->quantity] = aux; //reorganiza a fila reorganize_top_down (f_data, 1); if ( !rst_decode_one_event (f_data->of_data[f_data->quantity], &f_data->of_data[f_data->quantity]->event) ) { rst_close_one_file(f_data->of_data[f_data->quantity]); free(f_data->of_data[f_data->quantity]); } else { f_data->quantity++; //reorganiza a fila reorganize_bottom_up (f_data, f_data->quantity); } return RST_OK; } } /*FIM*/ //Imprime um evento void rst_print_event(rst_event_t *event) { int i; fprintf (stderr, "type: %d ts: %lld\n", event->type, event->timestamp); if (event->ct.n_uint64 > 0) { fprintf (stderr, "\tu_int64_ts-> "); for (i = 0; i < event->ct.n_uint64; i++) { fprintf (stderr, "(%"PRIu64") ", event->v_uint64[i]); } fprintf (stderr, "\n"); } if (event->ct.n_string>0) { fprintf (stderr, "\tstrings-> "); for (i = 0; i < event->ct.n_string; i++) { fprintf (stderr, "(%s) ", event->v_string[i]); } fprintf (stderr, "\n"); } if (event->ct.n_float > 0) { fprintf (stderr, "\tfloats-> "); for (i = 0; i < event->ct.n_float; i++) { fprintf (stderr, "(%f) ", event->v_float[i]); } fprintf (stderr, "\n"); } if (event->ct.n_uint32 > 0) { fprintf (stderr, "\tu_int32_ts-> "); for (i = 0; i < event->ct.n_uint32; i++) { fprintf (stderr, "(%d) ", event->v_uint32[i]); } fprintf (stderr, "\n"); } if (event->ct.n_uint16 > 0) { fprintf (stderr, "\tu_int16_ts-> "); for (i = 0; i < event->ct.n_uint16; i++) { fprintf (stderr, "(%d) ", event->v_uint16[i]); } fprintf (stderr, "\n"); } if (event->ct.n_uint8 > 0) { fprintf (stderr, "\tu_int8_ts-> "); for (i = 0; i < event->ct.n_uint8; i++) { fprintf (stderr, "(%c) ", event->v_uint8[i]); } fprintf (stderr, "\n"); } if (event->ct.n_double > 0) { fprintf (stderr, "\tdoubles-> "); for (i = 0; i < event->ct.n_double; i++) { fprintf (stderr, "(%f) ", event->v_double[i]); } fprintf (stderr, "\n"); } } Paje-1.98/Tracers/JRastro/libRastro/src/rastro_write_functions.c0000664000175000017500000000052011674062007024751 0ustar schnorrschnorr/* Do not edit. File generated by rastro_generate. */ #include "rastro_write_functions.h" void rst_event_lls_ptr(rst_buffer_t *ptr, u_int16_t type, u_int64_t l0, u_int64_t l1, char *s0) { rst_startevent(ptr, type<<18|0x24410); RST_PUT(ptr, u_int64_t, l0); RST_PUT(ptr, u_int64_t, l1); RST_PUT_STR(ptr, s0); rst_endevent(ptr); } Paje-1.98/Tracers/JRastro/libRastro/src/rastro_write_functions.h0000664000175000017500000000031411674062007024757 0ustar schnorrschnorr/* Do not edit. File generated by rastro_generate. */ #ifndef _RASTRO_rastro_write_functions_H_ #define _RASTRO_rastro_write_functions_H_ #include "rastro_public.h" #include "rastro_private.h" #endif Paje-1.98/Tracers/JRastro/libRastro/src/list.c0000664000175000017500000001615111674062007021117 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// /* Estrutura de dados Lista duplamente encadeada .c */ #include #include "list.h" void list_null(void *p) { if(p == NULL){ printf("LIST_ERROR: Pointer is NULL\n"); exit(1); } } void list_initialize (list_t * list, list_func_copy_t copy, list_func_compare_t compare, list_func_destroy_t destroy) { list_null(list); list->sent=(list_element_t *)malloc(sizeof(* list->sent)); if(list->sent==NULL){ printf("LIST_ERROR: Cannot alloc memory\n"); exit(1); } list->sent->next = list->sent->prev =list->sent; list->list_copy = copy; list->list_compare = compare; list->list_destroy = destroy; } void list_finalize (list_t * list) { position_t p; list_null(list); p=list->sent->next; while(p != list->sent){ position_t vitima; vitima=p; p=p->next; list->list_destroy(vitima); free(vitima); } free(list->sent); list->sent=NULL; } void list_destroy(position_t pos) { list_null(pos); pos->data=NULL; pos->next=NULL; pos->prev=NULL; } void list_destroy_int(position_t pos) { list_null(pos); free(pos->data); pos->data=NULL; pos->next=NULL; pos->prev=NULL; } void list_destroy_string(position_t pos) { list_null(pos); free(pos->data); pos->data=NULL; pos->next=NULL; pos->prev=NULL; } position_t list_locate(list_t *list, list_data_t data) { list_null(list); list_null(data); position_t element; for(element=list->sent->next; element != list->sent; element=element->next){ if(list->list_compare(element->data, data)){ return element; } } return NULL; } bool list_find(list_t *list, list_data_t data) { list_null(list); list_null(data); position_t element; element=list_locate(list, data); if(element != NULL){ return true; } return false; } bool list_cmp(list_data_t data, list_data_t data2) { list_null(data); list_null(data2); if(data == data2){ return true; } return false; } bool list_cmp_int(list_data_t data, list_data_t data2) { list_null(data); list_null(data2); if(!memcmp(data, data2, sizeof(int))){ return true; } return false; } bool list_cmp_string(list_data_t data, list_data_t data2) { list_null(data); list_null(data2); if(!strcmp(data, data2)){ return true; } return false; } void list_copy(list_element_t *element, list_data_t data) { list_null(element); list_null(data); element->data = (void *)data; } void list_copy_int(list_element_t *element, list_data_t data) { list_null(element); list_null(data); element->data = (void *)malloc(sizeof(int)); element->data = memcpy(element->data, data, sizeof(int)); } void list_copy_string(list_element_t *element, list_data_t data) { list_null(element); list_null(data); element->data = (void *)malloc((sizeof(char) * strlen((char *)data)) + 1); element->data = strcpy(element->data, data); } /* retorna a position do primeiro elemento da list ou NULL se list vazia */ position_t list_inicio (list_t * list) { list_null(list); if(list->sent->next != list->sent){ return list->sent->next; }else { return NULL; } } /* retorna a position do ultimo elemento da list ou NULL se list vazia */ position_t list_final (list_t * list) { list_null(list); if(list->sent->prev != list->sent){ return list->sent->prev; }else { return NULL; } } /* insere dado apos pos (se pos for NULL, insere no inicio da list) */ void list_insert_after (list_t * list, position_t pos, list_data_t data) { list_element_t *new; list_null(list); list_null(data); new=(list_element_t *)malloc(sizeof(* new)); if(new == NULL){ printf("LIST_ERROR: Cannot alloc memory\n"); exit(1); } list->list_copy(new, data); //new->data=data; if(pos == NULL){ new->prev=list->sent; new->next=list->sent->next; list->sent->next->prev=new; list->sent->next=new; }else { new->prev=pos; new->next=pos->next; pos->next->prev=new; pos->next=new; } } /* insere dado antes de pos (se pos for NULL, insere no final da list) */ void list_insert_before (list_t * list, position_t pos,list_data_t data) { list_element_t *new; list_null(list); list_null(data); new=(list_element_t *)malloc(sizeof(*new)); if(new == NULL){ printf("LIST_ERROR: Cannot alloc memory\n"); exit(1); } list->list_copy(new, data); //new->data=data; if(pos == NULL){ new->next=list->sent; new->prev=list->sent->prev; list->sent->prev->next=new; list->sent->prev=new; } else { new->prev=pos->prev; new->next=pos; pos->prev->next=new; pos->prev=new; } } void list_remove(list_t *list, list_data_t data) { position_t pos; list_null(list); list_null(data); pos= list_locate(list, data); if(pos == NULL){ printf("LIST_ERROR: Cannot remove List element\n"); exit(1); } list_rem_position(list, pos); } /* remove o elemento na position pos */ /*(se pos igual a NULL remove o primeiro elemento da lista)*/ void list_rem_position (list_t * list, position_t pos) { list_null(list); if(list_quantity(list) == 0){ return; } if(pos == NULL){ position_t tmp; tmp=list->sent->next; tmp->next->prev = list->sent; list->sent->next=tmp->next; list->list_destroy(tmp); return; }else{ pos->prev->next=pos->next; pos->next->prev=pos->prev; list->list_destroy(pos); } } /* retorna o dado contido na position pos */ list_data_t list_data_position (list_t * list, position_t pos) { list_null(list); list_null(pos); return pos->data; } /* retorna a position do elemento que segue o elemento na position pos (ou NULL, se pos representa o ultimo elemento ou se pos for NULL) */ position_t list_avanca_position (list_t * list, position_t pos) { list_null(list); if(pos==NULL || pos->next==list->sent){ return NULL; } return pos->next; } /* retorna a position do elemento que antecede o elemento na position pos (ou NULL, se pos representa o primeiro elemento ou se pos for NULL) */ position_t list_recua_position (list_t * list, position_t pos) { list_null(list); if(pos==NULL || pos->prev==list->sent){ return NULL; } return pos->prev; } /* retorna o numero de elementos da list */ int list_quantity(list_t * list) { int i=0; position_t element; list_null(list); list_null(list->sent); for(element=list->sent->next;element!=list->sent;element=element->next){ i++; } return i; } Paje-1.98/Tracers/JRastro/libRastro/src/config.h.in0000664000175000017500000001044511674062007022023 0ustar schnorrschnorr/* src/config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strspn' function. */ #undef HAVE_STRSPN /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `int' if does not define. */ #undef pid_t /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to `unsigned int' if does not define. */ #undef size_t /* Define as `fork' if `vfork' does not work. */ #undef vfork Paje-1.98/Tracers/JRastro/libRastro/src/rastro_timesync_f.c0000664000175000017500000000012711674062007023672 0ustar schnorrschnorr/* Do not edit. File generated by rastro_generate. */ #include "rastro_timesync_f.h" Paje-1.98/Tracers/JRastro/libRastro/src/rastro_write.c0000664000175000017500000001416411674062007022672 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ //#include "rastro_public.h" //#include "rastro_private.h" #include "rastro_write_functions.h" #include #include #include #include #include #include #include #include #include #include #include /* for MAXHOSTNAMELEN */ #include "list.h" list_t list; bool list_init=false; #ifndef THREADED rst_buffer_t *rst_global_buffer; #else int rst_key_initialized = 0; pthread_key_t rst_key; #endif int rst_debug_mask = 0; char rst_dirname[FILENAME_MAX]; void rst_destroy_buffer(void *p) { rst_buffer_t *ptr = (rst_buffer_t *) p; if (ptr != NULL) { int fd; rst_event_ptr(ptr, RST_EVENT_STOP); rst_flush(ptr); free(ptr->rst_buffer); fd = RST_FD(ptr); close(fd); //free(ptr); } } // Extrai argumentos para a biblioteca void extract_arguments(int *argcp, char ***argvp) { char **argv; int argc; int arg, used, unused; char **p1, **p2, **plast; char *cepar; argv = *argvp; argc = *argcp; arg = used = unused = 1; bzero(rst_dirname, sizeof rst_dirname); while (arg < argc) { if ( strncmp(argv[arg], "-rst-", 5) == 0 ) { cepar = argv[arg] + 5; if ( !strcmp(cepar, "dir") ) { strcpy(rst_dirname, argv[++arg]); if (opendir(rst_dirname) == NULL ) { printf("Diretorio invalido\n"); exit(0); } if ( (rst_dirname[strlen(rst_dirname) - 1] != '/') ) rst_dirname[strlen(rst_dirname)] = '/'; } if ( !strcmp(cepar, "dm") ) { rst_debug_mask = atoi(argv[++arg]); } unused = ++arg; } else { if (unused > used ) { p1 = argv + used; p2 = argv + unused; plast = argv + argc; argc -= (unused - used); while ( p2 < plast ) *p1++ = *p2++; unused = used; } arg = ++used; } } if ( unused > used) argc = used; *argcp = argc; argv[argc] = NULL; } // Inicializa biblioteca em um nodo void rst_initialize(u_int64_t id1, u_int64_t id2, int *argc, char ***argv) { if ( argv != NULL ) extract_arguments(argc, argv); rst_init(id1, id2); } // Inicializa a biblioteca em uma thread void rst_init(u_int64_t id1, u_int64_t id2) { rst_buffer_t *ptr; ptr = (rst_buffer_t *) malloc(sizeof(rst_buffer_t)); rst_init_ptr(ptr, id1, id2); } // Inicializacao com buffer pre-alocado void rst_init_ptr(rst_buffer_t *ptr, u_int64_t id1, u_int64_t id2) { int fd; char fname[30]; char hostname[MAXHOSTNAMELEN+1]; if ( ptr == NULL ) { fprintf(stderr, "[rastro] error inicializing - invalid pointer\n"); return; } #ifdef THREADED if (!rst_key_initialized) { pthread_key_create(&rst_key, rst_destroy_buffer); rst_key_initialized = 1; } #endif if(!list_init){ list_initialize(&list, list_copy, list_cmp, list_destroy); list_init=true; } RST_SET_PTR(ptr); ptr->rst_buffer_size = 100000; ptr->rst_buffer = malloc(ptr->rst_buffer_size); RST_RESET(ptr); sprintf(fname, "rastro-%"PRIu64"-%"PRIu64".rst",/* dirname,*/ id1, id2); fd = open(fname, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (fd == -1) { fprintf(stderr, "[rastro] cannot open file %s: %s\n", fname, strerror(errno)); return; } list_insert_after(&list, NULL, (void *)ptr ); RST_SET_FD(ptr, fd); // this will force first event to register sync time RST_SET_T0(ptr, 0); gethostname(hostname, sizeof(hostname)); XCAT(rst_event_,LETRA_UINT64,LETRA_STRING,_ptr)(ptr, RST_EVENT_INIT, id1, id2, hostname); } // Grava buffer no arquivo de traco void rst_flush(rst_buffer_t * ptr) { size_t nbytes; size_t n; nbytes = RST_BUF_COUNT(ptr); n = write(RST_FD(ptr), RST_BUF_DATA(ptr), nbytes); if (n != nbytes) { fprintf(stderr, "[rastro] error writing rastro file\n"); } RST_RESET(ptr); } // Termina biblioteca em nodo ou thread void rst_finalize(void) { rst_buffer_t *ptr = RST_PTR; list_remove(&list, (void *)ptr); rst_destroy_buffer(ptr); free(ptr); } // Termina biblioteca em nodo ou thread com ptr void rst_finalize_ptr(rst_buffer_t *ptr) { list_remove(&list, (void *)ptr); rst_destroy_buffer(ptr); } void rst_flush_all(void) { position_t pos; rst_buffer_t *ptr; for(pos=list.sent->next; pos != list.sent; pos=pos->next ){ ptr= (rst_buffer_t *)pos->data; rst_flush(ptr); } //list_finalize(&list); } // Registra evento somente com tipo void rst_event(u_int16_t type) { rst_buffer_t *ptr = RST_PTR; /*...2 para finalizar esse rastro que so tem o tipo...*/ rst_startevent(ptr, type << 18 | 0x20000); rst_endevent(ptr); } // Registra evento somente com tipo com ptr void rst_event_ptr(rst_buffer_t *ptr, u_int16_t type) { if ( ptr == NULL ) { printf("[rastro] ptr invalido\n"); return; } /*...2 para finalizar esse rastro que so tem o tipo...*/ rst_startevent(ptr, type << 18 | 0x20000); rst_endevent(ptr); } Paje-1.98/Tracers/JRastro/libRastro/src/rastro_private.h0000664000175000017500000000763511674062007023224 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef _RASTRO_PRIVATE_H_ #define _RASTRO_PRIVATE_H_ #include #include #include // Aligns pointer p to 4-byte-aligned address #define ALIGN_PTR(p) ((void *)(((intptr_t)(p)+(4-1))&(~(4-1)))) #define RST_MAX_EVENT_SIZE 1000 #define RST_RESET(ptr) (ptr->rst_buffer_ptr = ptr->rst_buffer) #define RST_FD(ptr) (ptr->rst_fd) #define RST_SET_FD(ptr, fd) (ptr->rst_fd = fd) #define RST_T0(ptr) (ptr->rst_t0) #define RST_SET_T0(ptr, t) (ptr->rst_t0 = t) #define RST_BUF_COUNT(ptr) (ptr->rst_buffer_ptr - ptr->rst_buffer) #define RST_BUF_DATA(ptr) (ptr->rst_buffer) #define RST_BUF_SIZE(ptr) (ptr->rst_buffer_size) #ifndef THREADED extern rst_buffer_t *rst_global_buffer; #define RST_PTR (rst_global_buffer) #define RST_SET_PTR(ptr) (rst_global_buffer = ptr) #else extern int rst_key_initialized; extern pthread_key_t rst_key; #define RST_PTR ((rst_buffer_t *) pthread_getspecific(rst_key)) #define RST_SET_PTR(ptr) pthread_setspecific(rst_key, (void *) ptr) #endif #define RST_PUT(ptr, type, val) \ do { \ type *p = (type *)ptr->rst_buffer_ptr; \ *p++ = (type)(val); \ ptr->rst_buffer_ptr = (char *)p; \ } while (0) #define RST_PUT_STR(ptr, str) \ do { \ char *__s1 = (char *)ptr->rst_buffer_ptr; \ char *__s2 = str; \ while ((*__s1++ = *__s2++) != '\0') \ ; \ ptr->rst_buffer_ptr = ALIGN_PTR(__s1); \ } while(0) //#define RST_GET(ptr, type) (*((type *)(ptr))++) #define RST_GET(ptr, type) ((ptr += sizeof(type)), \ (*(type *)(ptr - sizeof(type)))) #define RST_GET_STR(ptr, str) \ do { \ char *__s1 = ptr; \ char *__s2 = str; \ while ((*__s2++ = *__s1++) != '\0') \ ; \ ptr = ALIGN_PTR(__s1); \ } while(0) //#endif #define RST_NO_TYPE 0 #define RST_STRING_TYPE 1 #define RST_DOUBLE_TYPE 2 #define RST_FLOAT_TYPE 3 #define RST_LONG_TYPE 4 #define RST_SHORT_TYPE 5 #define RST_CHAR_TYPE 6 #define RST_INT_TYPE 7 #define RST_TYPE_CTR 7 #define RST_TIME_SET 0x10000 #define RST_LAST 0x2 #define RST_BITS_PER_FIELD 4 #define RST_FIELD_MASK 0xf #define RST_FIELDS_IN_FIRST 4 #define RST_FIELDS_IN_OTHERS 7 void rst_flush(rst_buffer_t * ptr); // Termina um evento static inline void rst_endevent(rst_buffer_t * ptr) { ptr->rst_buffer_ptr = ALIGN_PTR(ptr->rst_buffer_ptr); if (RST_BUF_COUNT(ptr) > (RST_BUF_SIZE(ptr) - RST_MAX_EVENT_SIZE)) { rst_flush(ptr); } } // Inicia um evento static inline void rst_startevent(rst_buffer_t *ptr, u_int32_t header) { struct timeval tp; u_int32_t deltasec; gettimeofday(&tp, NULL); deltasec = tp.tv_sec - RST_T0(ptr); if (deltasec > 3600) { RST_SET_T0(ptr, tp.tv_sec); deltasec = 0; RST_PUT(ptr, u_int32_t, header | RST_TIME_SET); RST_PUT(ptr, u_int32_t, tp.tv_sec); } else { RST_PUT(ptr, u_int32_t, header); } RST_PUT(ptr, u_int32_t, deltasec * RST_CLOCK_RESOLUTION + tp.tv_usec); } #endif /* _RASTRO_PRIVATE_H_ */ Paje-1.98/Tracers/JRastro/libRastro/src/rastro_public.h0000664000175000017500000001111311674062007023012 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef _RASTRO_PUBLIC_H_ #define _RASTRO_PUBLIC_H_ #define RST_CLOCK_RESOLUTION 1000000 #define RST_EVENT_TYPE_MASK 0x3fff /* 14 bits */ #define RST_EVENT_INIT (-1 & RST_EVENT_TYPE_MASK) #define RST_EVENT_STOP (-2 & RST_EVENT_TYPE_MASK) #include #include /*Se for mudar alguma letra deve-se mudar tambem no script*/ /* ./bin/.rastro_names.sh tirando a letra mudada e colocando a nova*/ #define LETRA_UINT8 c #define LETRA_UINT16 w #define LETRA_UINT32 i #define LETRA_UINT64 l #define LETRA_FLOAT f #define LETRA_DOUBLE d #define LETRA_STRING s #define LETRA_UINT8_ASPA 'c' #define LETRA_UINT16_ASPA 'w' #define LETRA_UINT32_ASPA 'i' #define LETRA_UINT64_ASPA 'l' #define LETRA_FLOAT_ASPA 'f' #define LETRA_DOUBLE_ASPA 'd' #define LETRA_STRING_ASPA 's' /*CAT concatena a funcao rst_event_+LETRA_UINT64+LETRA_UINT64+LETRA_STRING+_ptr */ #define CAT(x,y,z,w) x##y##y##z##w #define XCAT(x,y,z,w) CAT(x,y,z,w) #define STR(x) #x #define XSTR(x) STR(x) /* defines utilizado para a inicializacao de uma estrutura do tipo rst_file_t */ #define FDATAINITIALIZED -239847237 typedef u_int16_t type_t; typedef long long timestamp_t; typedef struct { int n_uint8; int n_uint16; int n_uint32; int n_uint64; int n_float; int n_double; int n_string; } counters_t; #define RST_MAX_FIELDS_PER_TYPE 15 #define RST_MAX_STRLEN 100 typedef struct { counters_t ct; char v_string[RST_MAX_FIELDS_PER_TYPE][RST_MAX_STRLEN]; u_int8_t v_uint8[RST_MAX_FIELDS_PER_TYPE]; u_int16_t v_uint16[RST_MAX_FIELDS_PER_TYPE]; u_int32_t v_uint32[RST_MAX_FIELDS_PER_TYPE]; u_int64_t v_uint64[RST_MAX_FIELDS_PER_TYPE]; float v_float[RST_MAX_FIELDS_PER_TYPE]; double v_double[RST_MAX_FIELDS_PER_TYPE]; type_t type; u_int64_t id1; u_int64_t id2; timestamp_t timestamp; } rst_event_t; typedef struct { double a; timestamp_t loc0; timestamp_t ref0; } ct_t; typedef struct { int fd; ct_t sync_time; char *rst_buffer_ptr; char *rst_buffer; int rst_buffer_size; int rst_buffer_used; char *hostname; u_int64_t id1; u_int64_t id2; timestamp_t hora_global; rst_event_t event; } rst_one_file_t; typedef struct { rst_one_file_t **of_data; int quantity; int initialized; } rst_file_t; typedef struct { long rst_t0; int rst_fd; char *rst_buffer_ptr; char *rst_buffer; int rst_buffer_size; } rst_buffer_t; extern int rst_debug_mask; #define RST_OK (1==1) #define RST_NOK (0==1) /*****************FUNCOES DE GERACAO DE RASTRO********************/ /*Funcoes de inicializacao*/ void rst_initialize(u_int64_t id1, u_int64_t id2, int *argc, char ***argv); void rst_init(u_int64_t id1, u_int64_t id2); void rst_init_ptr(rst_buffer_t *ptr, u_int64_t id1, u_int64_t id2); void rst_finalize(void); void rst_finalize_ptr(rst_buffer_t *ptr); void rst_flush_all(void); void rst_event(u_int16_t type); void rst_event_ptr(rst_buffer_t *ptr, u_int16_t type); /****************FUNCOES DE LEITURA DE RASTRO*******************/ /*Funcoes para leitura de multiplos arquivos de rastro*/ int rst_open_file(char *f_name, rst_file_t *f_data, char *syncfilename, int buffer_size); void rst_close_file(rst_file_t *f_data); int rst_decode_event(rst_file_t *f_data, rst_event_t *event); /*Funcoes para leitura de um unico arquivo de rastro*/ int rst_open_one_file(char *f_name, rst_one_file_t *of_data, char *syncfilename, int buffer_size); void rst_close_one_file(rst_one_file_t *of_data); int rst_decode_one_event(rst_one_file_t *of_data, rst_event_t *event); /*Imprime um evento*/ void rst_print_event(rst_event_t *event); /*Funcoes internas*/ void reorganize_bottom_up (rst_file_t *f_data, int son); void reorganize_top_down (rst_file_t *f_data, int dead); void smallest_first (rst_file_t *f_data, int dead, int son); #endif //_RASTRO_PUBLIC_H_ Paje-1.98/Tracers/JRastro/libRastro/src/rastro_timesync.c0000664000175000017500000001615111674062007023371 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* for MAXHOSTNAMELEN */ #define MAX_HOSTS 256 #define PORT 3000 #define SZ_SAMPLE 1000 char hosttable[MAX_HOSTS][MAXHOSTNAMELEN]; int num_hosts; FILE *hostfile, *rastro; char *myname; /* return current time */ long long getCurrentTime(void) { struct timeval tv; gettimeofday(&tv, NULL); return (long long) tv.tv_sec * 1000000 + (long long) tv.tv_usec; } long long timerabs(struct timeval a) { return (long long)a.tv_sec * 1000000 + a.tv_usec; } long timerdiff(struct timeval a, struct timeval b) { return (a.tv_sec - b.tv_sec) * 1000000 + (a.tv_usec - b.tv_usec); } void recebe_mesmo(int socket, char *buffer, int tamanho) { int recebidos = 0; while (recebidos != tamanho){ recebidos = recv(socket, (void *) buffer, tamanho, 0); if (recebidos < tamanho){ fprintf(stdout, "received less...\n"); buffer += recebidos; tamanho -= recebidos; recebidos = 0; } } } void ping1(int socket, long long *local, long long *remote, long *delta) { struct timeval t0, t1, tremote; int teste; gettimeofday(&t0, NULL); teste = send(socket, (void *) &t0, sizeof(t0), 0); if (teste == -1) { fprintf(stderr, "[ping]: send failed at socket %d!\n", socket); exit(1); } recebe_mesmo(socket, (char *) &tremote, sizeof(tremote)); gettimeofday(&t1, NULL); *delta = timerdiff(t1, t0); *local = timerabs(t0) + *delta / 2; *remote = timerabs(tremote); } void ping(int socket, long long *mlocal, long long *mremote, char *remotename) { long delta; long long local, remote; long mdelta = 1e9; int i; struct timeval t0 = {0, 0}; int remotenamelen; recebe_mesmo(socket, (char *) &remotenamelen, sizeof(remotenamelen)); recebe_mesmo(socket, remotename, remotenamelen); remotename[remotenamelen] = '\0'; for (i = 0; i < SZ_SAMPLE; i++) { ping1(socket, &local, &remote, &delta); if (delta <= mdelta) { mdelta = delta; *mlocal = local; *mremote = remote; } } send(socket, (void *) &t0, sizeof(t0), 0); } void pong(int socket) { struct timeval tvi, tvo; int teste; int namesize; char hostname[MAXHOSTNAMELEN]; gethostname(hostname, sizeof(hostname)); namesize = strlen(hostname); send(socket, (char *)&namesize, sizeof(namesize), 0); send(socket, hostname, namesize, 0); do { recebe_mesmo(socket, (char *) &tvi, sizeof(tvi)); gettimeofday(&tvo, NULL); teste = send(socket, (void *) &tvo, sizeof(tvo), 0); if (teste == -1) { fprintf(stderr, "[pong]: send failed at socket %d!\n", socket); exit(1); } } while (tvi.tv_sec != 0); } int abre_conexao(int *pporta) { struct sockaddr_in connection; int sock, resultado; int porta = 1024; sock = socket(AF_INET, SOCK_STREAM, 0); do { porta++; connection.sin_family = AF_INET; connection.sin_port = htons(porta); connection.sin_addr.s_addr = htons(INADDR_ANY); bzero(connection.sin_zero, 8); resultado = bind(sock, (struct sockaddr *) &connection, sizeof(connection)); } while (resultado != 0); listen(sock, 2); *pporta = porta; return sock; } int wait_connection(int sock) { struct sockaddr_in connection; int new_socket; socklen_t size; size = sizeof(connection); new_socket = accept(sock, (struct sockaddr *) &connection, &size); return new_socket; } int establish_connection(char *host, int porta) { struct hostent *h; struct sockaddr_in connection; int new_socket; h = gethostbyname(host); // deveria ser o nome do mestre, recebido como parametro new_socket = socket(AF_INET, SOCK_STREAM, 0); connection.sin_family = AF_INET; connection.sin_port = htons(porta); memcpy(&connection.sin_addr.s_addr, h->h_addr, 4); bzero(connection.sin_zero, 8); while ( (connect(new_socket, (struct sockaddr *) &connection,sizeof(connection)) ) != 0); return new_socket; } void create_slave(char *remotehost, char *localhost, int port) { char sport[10]; char *arg[] = { "rsh", remotehost, myname, "slave", localhost, sport, NULL }; sprintf(sport, "%d", port); if ( fork() == 0 ) { //fprintf(stdout, "Launching process at %s... ", remotehost); //fprintf(stdout, "Passed!\n"); if ( execvp(arg[0], arg) == -1 ) { fprintf(stderr, "ERROR: %s\n", strerror(errno)); exit(-1); } } } // Leitura de arquivo de hosts void read_hostfile(char *fn) { char buffer[MAXHOSTNAMELEN]; num_hosts = 0; hostfile = fopen(fn, "r"); while ( !feof(hostfile) ) { bzero(buffer, MAXHOSTNAMELEN); if ( fgets(buffer, MAXHOSTNAMELEN, hostfile) != NULL ) { buffer[strlen(buffer) - 1] = '\0'; strcpy(hosttable[num_hosts++], buffer); } } fclose(hostfile); } void sincroniza(char *localhost, char *remotehost) { long long local; long long remote; int porta; int com_socket; int new_socket; char localname[MAXHOSTNAMELEN]; char remotename[MAXHOSTNAMELEN]; gethostname(localname, sizeof(localname)); com_socket = abre_conexao(&porta); create_slave(remotehost, localhost, porta); new_socket = wait_connection(com_socket); ping(new_socket, &local, &remote, remotename); printf("%s %lld %s %lld\n", localname, local, remotename, remote); close(new_socket); close(com_socket); } void slave(char *mastername, char *sport) { int com_socket; int port; port = atoi(sport); com_socket = establish_connection(mastername, port); pong(com_socket); close(com_socket); } int main(int argc, char *argv[]) { myname = argv[0]; if (argc < 3) { fprintf(stdout, "%s localhostname remotehostname ...\n", argv[0]); return -1; } if (strcmp(argv[1], "slave") == 0 ) { slave(argv[2], argv[3]); } else { int i; for (i = 2; i < argc; i++) { sincroniza(argv[1], argv[i]); } } exit(0); } Paje-1.98/Tracers/JRastro/libRastro/README0000664000175000017500000000664411674062007020077 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// Manual de utilizao 1) Para gerao e leitura de rastros de execuo, primeiramente o usurio dever instrumentar o programa com funes que podero ser criadas. Nessas funes iro ser gravados informaes relevantes ao usurio. Alm das funes existentes possvel gerar novas de acordo com as necessidades. Por exemplo: rst_event(u_int16_t type) -> armazena o tipo do rastro rst_event_?... ? - pode ser: c - 8 bits w - 16 bits i - 32 bits l - 64 bits f - float d - double s - string ... - indica que pode ter mais elementos "?" iguais ou diferentes, no importa a ordem que aparecem exemplo: rst_event_iicilf(...) rst_event_siicicffll(...) 2) necessrio aps a instrumentao do programa gerar as funes que no existem na biblioteca atravs do programa: rastro_get_names.sh -> gera as funes para o usurio automaticamente passando os arquivos que contenham as novas funes e apenas o nome do arquivo de sada. Ex: #rastro_get_names.sh rastro_get_names.sh rastro_write_example.c saida Programas que so utilizados por ele: rastro_names.sh -> Programa que pega da entrada padro o arquivo pr-compilado e busca por novas funes que no existem na biblioteca e coloca na sada padro s os nomes das novas funes. rastro_function.sh -> Programa que recebe da entrada padro os nomes das novas funes e as gera. ou manualmente #gcc -E rastro_write_example.c outroArquivo.c ...c | rastro_names.sh | rastro_function.sh OBS: Desse modo manual ser gerado os arquivos rastro.c e rastro.h que possuem as novas funes que no existem na biblioteca. 3) Feito as tarefas anteriores sero gerados dois arquivos um .c e outro .h com as funes que no existem na biblioteca. necessrio que seja includo o arquivo gerado .h no arquivo do usurio. 4) Prximo passo eh compilar o programa do usurio. Ex: gcc -o exe rastro_write_example.c .c -I/usr/local/libRastro/include -L/usr/local/libRastro/lib -lrastro Agora basta executar. Ex: ./exe 5) Para fazer a leitura dos rastros de execuo gerados necessrio criar um programa para fazer a decodificao. Ex: gcc -o dec rastro_read_example.c -I/usr/local/libRastro/include -L/usr/local/libRastro/lib -lrastro Agora execute. Ex: ./dec PS: O Arquivo timesync pode ser null (passe um arquivo inexistente) se estiveres executando na mesma mquina. Paje-1.98/Tracers/JRastro/libRastro/examples/0000775000175000017500000000000011674062007021023 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/libRastro/examples/Makefile.am0000664000175000017500000000036111674062007023057 0ustar schnorrschnorrINCLUDES=-I$(top_srcdir)/src/ AM_FLAGS=-g noinst_PROGRAMS=read write read_SOURCES=rastro_read_example.c read_LDADD=$(top_builddir)/src/librastro.la write_SOURCES=rastro_write_example.c saida.c write_LDADD=$(top_builddir)/src/librastro.la Paje-1.98/Tracers/JRastro/libRastro/examples/saida.h0000664000175000017500000000326011674062007022256 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ /* Do not edit. File generated by rastro_generate. */ #ifndef _RASTRO_saida_H_ #define _RASTRO_saida_H_ #include "rastro_public.h" #include "rastro_private.h" void rst_event_iwlsifcd_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0, u_int16_t w0, u_int64_t l0, u_int8_t *s0, u_int32_t i1, float f0, u_int8_t c0, double d0); #define rst_event_iwlsifcd(type, i0, w0, l0, s0, i1, f0, c0, d0) rst_event_iwlsifcd_ptr(RST_PTR, type, i0, w0, l0, s0, i1, f0, c0, d0) void rst_event_lws_ptr(rst_buffer_t *ptr, u_int16_t type, u_int64_t l0, u_int16_t w0, u_int8_t *s0); #define rst_event_lws(type, l0, w0, s0) rst_event_lws_ptr(RST_PTR, type, l0, w0, s0) void rst_event_wlsfcd_ptr(rst_buffer_t *ptr, u_int16_t type, u_int16_t w0, u_int64_t l0, u_int8_t *s0, float f0, u_int8_t c0, double d0); #define rst_event_wlsfcd(type, w0, l0, s0, f0, c0, d0) rst_event_wlsfcd_ptr(RST_PTR, type, w0, l0, s0, f0, c0, d0) #endif Paje-1.98/Tracers/JRastro/libRastro/examples/rastro_read_example.c0000664000175000017500000000262111674062007025210 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "rastro_public.h" #include int main(int argc, char *argv[]) { rst_file_t data; rst_event_t ev; int i; for (i=2; i .tmp.rastro ./bin/rastro_generate .tmp.rastro rastro.c rastro.h rm -f .tmp.rastro Paje-1.98/Tracers/JRastro/libRastro/scripts/Makefile.am0000664000175000017500000000010311674062007022722 0ustar schnorrschnorrbin_SCRIPTS=rastro_function.sh rastro_get_names.sh rastro_names.sh Paje-1.98/Tracers/JRastro/libRastro/scripts/rastro_get_names.sh0000664000175000017500000000334711674062007024573 0ustar schnorrschnorr#!/bin/sh #/* # Copyright (c) 1998--2006 Benhur Stein # # This file is part of Paj. # # Paj is free software; you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # Paj is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with Paj; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. #*/ # # #////////////////////////////////////////////////// #/* Author: Geovani Ricardo Wiedenhoft */ #/* Email: grw@inf.ufsm.br */ #////////////////////////////////////////////////// # Script que gera de modo pratico os arquivos de saida com as #funcoes necessarias utilizadas e passadas para ele if [ "$CC" == "" ] then CC="gcc" fi SRCS="" NENTRADA=$# I=1 if [ 2 -gt $NENTRADA ] then echo "ERRO: Parametros invalidos." echo " USO: $0 " echo " PS: Se quiser setar flags, sete a varialvel \"CFLAGS\" " exit fi while [ $I -lt $NENTRADA ] do SRCS="$SRCS $1" shift I=$((I+1)) done if [ -e $1 ] then echo "ERRO: Arquivo $1 ja existente" exit fi $CC -E $CFLAGS $SRCS -I./include/ 2>/dev/null | ./bin/rastro_names.sh > $1 ./bin/rastro_generate $1 $1.c $1.h rm -f $1 echo "Inclua nos arquivos \"$SRCS\" a linha abaixo." echo "#include \"$1.h\"" Paje-1.98/Tracers/JRastro/libRastro/scripts/rastro_names.sh0000664000175000017500000000213711674062007023730 0ustar schnorrschnorr#!/bin/sh #/* # Copyright (c) 1998--2006 Benhur Stein # # This file is part of Paj. # # Paj is free software; you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # Paj is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with Paj; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. #*/ # # #////////////////////////////////////////////////// #/* Author: Geovani Ricardo Wiedenhoft */ #/* Email: grw@inf.ufsm.br */ #////////////////////////////////////////////////// grep rst_event_ | sed -e 's/.*rst_event_\([wisclfd]*\).*/\1/' | sort | uniq Paje-1.98/Tracers/JRastro/libRastro/configure.ac0000664000175000017500000000152411674062007021475 0ustar schnorrschnorrAC_PREREQ([2.59]) AC_INIT([libRastro], [0.1], [benhur@inf.ufsm.br]) AM_INIT_AUTOMAKE AC_PROG_LIBTOOL AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([src/config.h]) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_INSTALL # Checks for libraries. AC_CHECK_LIB([pthread], [pthread_key_create]) # Checks for header files. AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h netdb.h netinet/in.h stdlib.h string.h sys/file.h sys/param.h sys/socket.h sys/time.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_SIZE_T # Checks for library functions. AC_FUNC_FORK AC_FUNC_MALLOC AC_FUNC_REALLOC AC_CHECK_FUNCS([bzero gethostbyname gethostname gettimeofday memmove socket strchr strdup strerror strspn]) AC_CONFIG_FILES([Makefile src/Makefile scripts/Makefile examples/Makefile]) AC_OUTPUT Paje-1.98/Tracers/JRastro/libRastro/INSTALL0000664000175000017500000000341411674062007020240 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// Biblioteca libRastro biblioteca de gerao e leitura de rastros de execuo desenvolvida no Laboratrio de Sistemas de Computao com o intuito de proporcionar ao programador o rastreamento e leitura de uma forma genrica e com baixa intrusividade no cdigo a ser rastreado. Manual de Instalao Como root Para compilar digite: #make Para indicar o Diretrio que a biblioteca ser instalada, abra o arquivo Makefile e edite o diretrio. "RASTRO_DIR=/usr/local/libRastro" Para instalar digite: #make install Como usurio normal Sete em seu PATH o diretrio dos arquivos binrios. "RASTRO_DIR_BIN=$(RASTRO_DIR)/bin" DICA: Abra o seu arquivo .bashrc e coloque a linha abaixo com o diretrio que voc instalou os binrios da biblioteca. export PATH=$PATH:/usr/local/libRastro/bin Paje-1.98/Tracers/JRastro/libRastro/bootstrap0000775000175000017500000000013111674062007021143 0ustar schnorrschnorr#! /bin/sh aclocal libtoolize autoreconf -v -i -s automake --gnu --add-missing autoconf Paje-1.98/Tracers/JRastro/src/0000775000175000017500000000000011674062007016033 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/src/JRastro.c0000664000175000017500000003652211674062007017573 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" /*Global agente, contem a JVMTI, monitores, ...*/ globalAgent *gagent; /*Identifica as capacidades da JVM*/ jvmtiCapabilities capabilities; /*Seta as funcoes para retorno dos eventos*/ jvmtiEventCallbacks callbacks; /*Identificador(contador) das threads*/ long threadId = 1; /*Identificador da thread main == Identificador da JVM*/ long jrst_mainThread; /*Somador aleatorio, obtido pelo tempo*/ long adder; /*Nome do arquivo com as opcoes dos eventos a serem selecionados*/ char eventsOptionName[MAX_NAME_OPTIONS]; /*Nome do arquivo com as opcoes das classes e metodos a serem selecionados*/ char methodsOptionName[MAX_NAME_OPTIONS]; /*Variavel para indicar se sera rastreados os eventos monitorados*/ bool traces = true; /*Variavel para setar se todos as classes e metodos serao rastreados*/ bool tracesAll = false; /*Variavel para indicar se os metodos serao rastreados*/ bool methodsTrace = false; /*Variavel para indicar se a alocacao e liberacao de memoria sera rastreado*/ bool memoryTrace = false; /*Indica se ja ocorreu a inicializacao da JVM*/ bool initialized = false; /*Hash com as classes a serem redefinidas*/ hash_t h_class; /*Hash com as opcoes, classes e metodos*/ hash_t h_options; /*Buffers*/ rst_buffer_t *ptr_loader = NULL; rst_buffer_t *ptr_monitor = NULL; rst_buffer_t *ptr_new_array = NULL; /*-------------------------------------------------- * void JNICALL jrst_event_VMStart(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv) * { * //jrst_enter_critical_section(GET_JVMTI()); * * //jrst_exit_critical_section(GET_JVMTI()); * } *--------------------------------------------------*/ /*-------------------------------------------------- * ////////////////////////////////////////////////////////////////////////////// * / *const jniNativeInterface *original_jni_Functions; * const jniNativeInterface *redirected_jni_Functions; * int my_global_ref_count = 0; * * jobject MyNewGlobalRef(JNIEnv *jniEnv, jobject obj) * { * ++my_global_ref_count; * printf("count=[%d] aqui...\n",my_global_ref_count); * return original_jni_Functions->NewGlobalRef(jniEnv, obj); * } * * ////////////////////////////////////////////////////////////////////////////// * void jrst_JNI_function_interception(void) * { * jvmtiError err; * printf("aqui...\n"); * err = (*GET_JVMTI())->GetJNIFunctionTable(GET_JVMTI(), &original_jni_Functions); * if (err != JVMTI_ERROR_NONE) { * exit(1); * //die(); * } * err = (*GET_JVMTI())->GetJNIFunctionTable(GET_JVMTI(), &redirected_jni_Functions); * if (err != JVMTI_ERROR_NONE) { * exit(1); * //die(); * } * redirected_jni_Functions->NewGlobalRef = MyNewGlobalRef; * err = (*GET_JVMTI())->SetJNIFunctionTable(GET_JVMTI(), redirected_jni_Functions); * if (err != JVMTI_ERROR_NONE) { * exit(1); * //die(); * } * } * * / * * ////////////////////////////////////////////////////////////////////////////// *--------------------------------------------------*/ //unsigned class_number=0; static int class_number = 0; void JNICALL jrst_event_ClassFileLoadHook(jvmtiEnv *jvmtiLocate, JNIEnv *jniEnv, jclass class_being_redefined, jobject loader, const char* name, jobject protection_domain, jint class_data_len, const unsigned char* class_data, jint* new_class_data_len, unsigned char** new_class_data) { jrst_enter_critical_section(jvmtiLocate, gagent->monitor); if(initialized == false){ //if(jrst_trace_class((char *)name) == false || strcmp(name, "java/lang/ClassLoader") == 0 || strcmp(name, "java/util/Vector") == 0 || strcmp(name, "java/lang/CharacterDataLatin1") == 0 || strcmp(name, "java/lang/System") == 0 || strcmp(name, "java/lang/Character") == 0 || strcmp(name, "java/util/HashMap") == 0){ if(jrst_trace_class((char *)name) == false){ class_number++; jrst_exit_critical_section(jvmtiLocate, gagent->monitor); return; } jvmtiClassDefinition definition; definition.class_byte_count = class_data_len; definition.class_bytes = class_data; hash_insert(&h_class, (hash_key_t)name, (hash_data_t)&definition); jrst_exit_critical_section(jvmtiLocate, gagent->monitor); return; } jvmtiError err; int system_class = 0; unsigned char *new_file_image = NULL; long new_file_len = 0; if(class_being_redefined == NULL){ //if(jrst_trace_class((char *)name) == false || strcmp(name,"org/lsc/JRastro/Instru") == 0 || strcmp(name,"sun/misc/GC") == 0 || strcmp(name, "java/lang/Math") == 0){ if(jrst_trace_class((char *)name) == false || strcmp(name,"org/lsc/JRastro/Instru") == 0){ class_number++; jrst_exit_critical_section(jvmtiLocate, gagent->monitor); return; } }else{ system_class = 1; } //Registro do identificador e nome da classe trace_event_class_load(class_number, (char*)name); // printf("Classe name=[%s] class_number=[%d]\n",name,class_number); // if(!methodsTrace){ // jrst_exit_critical_section(jvmtiLocate, gagent->monitor); // return; // } java_crw_demo(class_number, name, class_data, class_data_len, system_class, &new_file_image, &new_file_len, &jrst_trace_methods ); if(new_file_len > 0){ unsigned char *jvmti_space; err = (*jvmtiLocate)->Allocate(jvmtiLocate,(jlong)new_file_len, &jvmti_space); jrst_check_error(jvmtiLocate, err, "Cannot Allocate memory"); (void)memcpy((void*)jvmti_space, (void *)new_file_image, (int)new_file_len); *new_class_data_len = (jint)new_file_len; *new_class_data = jvmti_space; } class_number++; jrst_exit_critical_section(jvmtiLocate, gagent->monitor); } ////////////////////////////////////////////////////////////////////////////// /*Evento de inicializacao da JVM*/ void JNICALL jrst_event_VMInit(jvmtiEnv *jvmtiLocate, JNIEnv *jniEnv, jthread thread) { jrst_enter_critical_section(jvmtiLocate, gagent->monitor); char name[MAX_NAME_THREAD]; /*------------------------------------------------*/ /*Obtencao do numero aleatorio para somar com os threadId*/ struct timeval rt; gettimeofday(&rt,NULL); adder = (long)rt.tv_usec; /*------------------------------------------------*/ jrst_mainThread = threadId + adder; /*-------------------------------------------------- * if(name != NULL){ * printf("VMInit thread name=[%s]\n",name); * } *--------------------------------------------------*/ /*Funcao que abilita as opcoes dos eventos*/ jrst_read_events_enable(jvmtiLocate); jvmtiError error; jint class_count_ptr; jclass *classes_ptr; jvmtiClassDefinition definitions[300]; hash_data_t *class = NULL; int count=0; int i; error = (*jvmtiLocate)->GetLoadedClasses(jvmtiLocate, &class_count_ptr, &classes_ptr); jrst_check_error(jvmtiLocate, error, "Cannot Get Loaded Classes"); for(i=0; i < class_count_ptr; i++){ char *signature_ptr; char *generic_ptr; int size = 0; char *tmp; error = (*jvmtiLocate)->GetClassSignature(jvmtiLocate, classes_ptr[i], &signature_ptr, &generic_ptr); jrst_check_error(jvmtiLocate, error, "Cannot Get Class Signature"); /*Tirar da signature o caracter 'L'*/ tmp = (char *)signature_ptr + 1; /* -1 Pois comeca em 0 o vetor*/ size = strlen(tmp) - 1; /*Tira da signature o caracter ';'*/ tmp[size] = '\0'; class = hash_locate(&h_class, (hash_key_t)tmp); if(class != NULL){ definitions[count] = **(jvmtiClassDefinition **)class; definitions[count].klass = classes_ptr[i]; count++; } error=(*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char*)signature_ptr); jrst_check_error(jvmtiLocate, error, "Cannot deallocate memory"); error=(*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char*)generic_ptr); jrst_check_error(jvmtiLocate, error, "Cannot deallocate memory"); } initialized = true; error=(*jvmtiLocate)->RedefineClasses(jvmtiLocate, count, definitions); jrst_check_error(jvmtiLocate, error, "Redefine Classes"); error=(*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char*)classes_ptr); jrst_check_error(jvmtiLocate, error, "Cannot deallocate memory"); jrst_get_thread_name(jvmtiLocate, thread, name, MAX_NAME_THREAD); trace_initialize(jvmtiLocate, thread, name); if(traces){ jrst_threads(jvmtiLocate); } jrst_exit_critical_section(jvmtiLocate, gagent->monitor); } ////////////////////////////////////////////////////////////////////////////// /*-------------------------------------------------- * void JNICALL jrst_event_VMDeath(jvmtiEnv *jvmtiLocate, JNIEnv *jniEnv) * { * jrst_enter_critical_section(jvmtiLocate); * * printf("VM Death event\n"); * * jrst_exit_critical_section(jvmtiLocate); * } *--------------------------------------------------*/ ////////////////////////////////////////////////////////////////////////////// void jrst_set_capabilities() { jvmtiError error; (void)memset(&capabilities, 0, sizeof(capabilities)); /*Abilitar as abilidades que se deseja monitorar*/ error = (*GET_JVMTI())->GetPotentialCapabilities(GET_JVMTI(), &capabilities); jrst_check_error(GET_JVMTI(), error, "Cannot Get Potential Capabilities"); /*Verificacao de capacidades*/ if(capabilities.can_signal_thread != 1 || capabilities.can_get_owned_monitor_info != 1 || capabilities.can_generate_exception_events != 1 || capabilities.can_generate_frame_pop_events != 1 || capabilities.can_generate_method_entry_events != 1 || capabilities.can_generate_method_exit_events != 1 || capabilities.can_generate_vm_object_alloc_events != 1 || capabilities.can_generate_object_free_events != 1 || capabilities.can_get_current_thread_cpu_time != 1 || capabilities.can_get_thread_cpu_time != 1 || capabilities.can_access_local_variables != 1 || capabilities.can_generate_compiled_method_load_events != 1 || capabilities.can_maintain_original_method_order != 1 || capabilities.can_generate_monitor_events != 1 || capabilities.can_generate_garbage_collection_events != 1 || capabilities.can_generate_all_class_hook_events != 1){ printf("JVMTI_ERROR: Cannot get capabilities\n"); exit(1); } error=(*GET_JVMTI())->AddCapabilities(GET_JVMTI(), &capabilities); jrst_check_error(GET_JVMTI(), error, "Cannot Enable JVMTI capabilities"); } void jrst_set_funcs() { jvmtiError error; (void)memset(&callbacks, 0, sizeof(callbacks)); /*Abilitar as funcoes que serao chamadas*/ callbacks.VMInit = &jrst_event_VMInit; callbacks.ClassFileLoadHook = &jrst_event_ClassFileLoadHook; callbacks.ThreadStart = &jrst_event_thread_start; callbacks.ThreadEnd = &jrst_event_thread_end; /*callbacks.VMObjectAlloc = &jrst_event_VMObject_alloc;*/ callbacks.ObjectFree = &jrst_event_object_free; callbacks.GarbageCollectionStart = &jrst_event_garbage_collection_start; callbacks.GarbageCollectionFinish = &jrst_event_garbage_collection_finish; callbacks.Exception = &jrst_event_exception; /*callbacks.ExceptionCatch = &jrst_event_exception_catch;*/ callbacks.FramePop = &jrst_event_frame_pop; callbacks.MonitorContendedEnter = &jrst_monitor_contended_enter; callbacks.MonitorContendedEntered = &jrst_monitor_contended_entered; callbacks.MonitorWait = &jrst_monitor_wait; callbacks.MonitorWaited = &jrst_monitor_waited; /*callbacks.VMStart = &jrst_event_VMStart;*/ /*callbacks.VMDeath = &jrst_event_VMDeath;*/ error=(*GET_JVMTI())->SetEventCallbacks(GET_JVMTI(), &callbacks,(jint)sizeof(callbacks)); jrst_check_error(GET_JVMTI(), error, "Cannot set JVMTI callbacks"); } void jrst_init() { jvmtiError error; /*Abilita as funcoes JVMTI_EVENT_CLASS_FILE_LOAD_HOOK e JVMTI_EVENT_VM_INIT*/ error=(*GET_JVMTI())->SetEventNotificationMode(GET_JVMTI(), JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, (jthread)NULL); jrst_check_error(GET_JVMTI(), error, "Cannot set event notification "); error=(*GET_JVMTI())->SetEventNotificationMode(GET_JVMTI(), JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, (jthread)NULL); jrst_check_error(GET_JVMTI(), error, "Cannot set event notification "); /* error=(*GET_JVMTI())->SetEventNotificationMode(GET_JVMTI(), JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, (jthread)NULL); jrst_check_error(GET_JVMTI(), error, "Cannot set event notification "); error=(*GET_JVMTI())->SetEventNotificationMode(GET_JVMTI(), JVMTI_ENABLE, JVMTI_EVENT_VM_START, (jthread)NULL); jrst_check_error(GET_JVMTI(), error, "Cannot set event notification "); */ } void jrst_create_monitor() { jvmtiError error; /*Criacao dos monitores*/ error=(*GET_JVMTI())->CreateRawMonitor(GET_JVMTI(), "agent", &(gagent->monitor)); jrst_check_error(GET_JVMTI(), error, "Cannot create raw monitor"); error=(*GET_JVMTI())->CreateRawMonitor(GET_JVMTI(), "thread", &(gagent->monitor_thread)); jrst_check_error(GET_JVMTI(), error, "Cannot create raw monitor"); error=(*GET_JVMTI())->CreateRawMonitor(GET_JVMTI(), "buffer", &(gagent->monitor_buffer)); jrst_check_error(GET_JVMTI(), error, "Cannot create raw monitor"); error=(*GET_JVMTI())->CreateRawMonitor(GET_JVMTI(), "newArray", &(gagent->monitor_new_array)); jrst_check_error(GET_JVMTI(), error, "Cannot create raw monitor"); error=(*GET_JVMTI())->CreateRawMonitor(GET_JVMTI(), "tag", &(gagent->monitor_tag)); jrst_check_error(GET_JVMTI(), error, "Cannot create raw monitor"); } JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) { jint ret; printf("[JRastro] Loading Agent_Onload...\n"); hash_initialize(&h_options, hash_value_string, hash_copy_string, hash_key_cmp_string, hash_destroy_string_list); hash_initialize(&h_class, hash_value_string, hash_copy_string_data, hash_key_cmp_string, hash_destroy_string_data); gagent = (globalAgent *) malloc(sizeof(globalAgent)); ret=(*jvm)->GetEnv(jvm, (void **)&gagent->jvmti, JVMTI_VERSION_1_0); if(ret != JNI_OK || gagent->jvmti == NULL){ printf("ERROR: Unable to access JVMTI Version 1 (0x%x)," " is your J2SE a 1.5 or newer version?" " JNIEnv's GetEnv() returned %d\n", JVMTI_VERSION_1, ret); exit(1); } /*Le nomes dos arquivos "opcoes"*/ jrst_read_names_options(options); /*Funcao que abilita os methodos a serem rastreados*/ jrst_read_class_methods_enable(); jrst_set_capabilities(); jrst_set_funcs(); jrst_init(); jrst_create_monitor(); return JNI_OK; } ////////////////////////////////////////////////////////////////////////////// JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm) { //printf("Loading Agent_OnUnload ........"); //extern int count; hash_finalize(&h_options); hash_finalize(&h_class); if(traces){ rst_flush_all(); } printf("[JRastro] ................OK\n"); } Paje-1.98/Tracers/JRastro/src/JRastro_traces.c0000664000175000017500000003470511674062007021135 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include"JRastro.h" /*Identificador(contador) das threads, variavel declarada em JRastro.c*/ extern long threadId; /*Identificador da thread main == Identificador da JVM, declarada em JRastro.c*/ extern long jrst_mainThread; /*Somador aleatorio, obtido pelo tempo, declarada em JRastro.c*/ extern long adder; //rst_buffer_t * get_buffer(jvmtiEnv *jvmtiLocate, jthread thread) //{ // rst_buffer_t *ptr; // jvmtiError error; // // error = (*jvmtiLocate)->GetThreadLocalStorage(jvmtiLocate, thread, (void**)&ptr); // if (ptr == NULL || error!= JVMTI_ERROR_NONE){ // char name[MAX_NAME_THREAD]; // jvmtiError err; // // jrst_get_thread_name(jvmtiLocate, thread, name, MAX_NAME_THREAD); // if(name == NULL){ // (void)strcpy(name,"Unknown"); // } // printf("getbuffer thread name=[%s]\n",name); // return NULL; // trace_initialize(jvmtiLocate, thread, name); // // err = (*jvmtiLocate)->GetThreadLocalStorage(jvmtiLocate, thread, (void**)&ptr); // jrst_check_error(jvmtiLocate, err, "Cannot Get Thread Local Storage"); // // } // return ptr; // //} void trace_initialize(jvmtiEnv *jvmtiLocate, jthread thread, char *name) { if(traces){ rst_buffer_t *ptr; jvmtiThreadInfo infoThread; jvmtiError error; ptr = (rst_buffer_t *) malloc(sizeof(rst_buffer_t)); jrst_enter_critical_section(jvmtiLocate, gagent->monitor_thread); error=(*jvmtiLocate)->GetThreadInfo(jvmtiLocate, thread, &infoThread); jrst_check_error(jvmtiLocate, error, "Cannot get Thread Info"); rst_init_ptr(ptr, (u_int64_t)jrst_mainThread, (u_int64_t)(threadId + adder)); rst_event_isiii_ptr(ptr, INITIALIZE, (int)threadId, name, (int)infoThread.priority, (int)infoThread.is_daemon, (int)infoThread.thread_group); threadId ++; error = (*jvmtiLocate)->SetThreadLocalStorage(jvmtiLocate, thread, (void*)ptr); jrst_check_error(jvmtiLocate, error, "Cannot Set Thread Local Storage"); jrst_exit_critical_section(jvmtiLocate, gagent->monitor_thread); error=(*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)infoThread.name); jrst_check_error(jvmtiLocate, error,"Cannot deallocate memory"); } } void trace_finalize(jvmtiEnv *jvmtiLocate, jthread thread) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(jvmtiLocate, gagent->monitor_thread); //ptr = get_buffer(jvmtiLocate, thread); error = (*jvmtiLocate)->GetThreadLocalStorage(jvmtiLocate, thread, (void**)&ptr); if (ptr == NULL){ jrst_exit_critical_section(jvmtiLocate, gagent->monitor_thread); return; } rst_event_ptr(ptr, FINALIZE); rst_finalize_ptr(ptr); error = (*jvmtiLocate)->SetThreadLocalStorage(jvmtiLocate, thread, NULL); jrst_check_error(jvmtiLocate, error, "Cannot Set Thread Local Storage"); jrst_exit_critical_section(jvmtiLocate, gagent->monitor_thread); } } static int tag = 0; void trace_event_object_alloc(jthread thread, jobject object, char *nameClass) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jlong size; int id = 0; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL){ jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } error = (*GET_JVMTI())->GetObjectSize(GET_JVMTI(), object, &size); jrst_check_error(GET_JVMTI(), error, "Cannot Set Thread Local Storage"); jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_tag); tag++; id = tag; // printf("alloc=[%x] thread=[%s] size=[%ld]\n", id, name, (long)size); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_tag); rst_event_lis_ptr(ptr, JVMTI_EVENT_VM_OBJECT_ALLOC, size, id, nameClass); error = (*GET_JVMTI())->SetTag(GET_JVMTI(), object, (jlong)id); jrst_check_error(GET_JVMTI(), error, "Cannot Set Tag"); /*if(tag == 500){ error = (*GET_JVMTI())->ForceGarbageCollection(GET_JVMTI()); jrst_check_error(GET_JVMTI(), error, "Cannot Force Garbage Collection"); }*/ jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_object_alloc_new_array(jthread thread, jobject object, char *nameClass) { if(traces){ jvmtiError error; jlong size; int id = 0; // jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_new_array); if(ptr_new_array == NULL){ ptr_new_array = (rst_buffer_t *)malloc(sizeof(rst_buffer_t)); rst_init_ptr(ptr_new_array, (u_int64_t)jrst_mainThread, (u_int64_t)THREAD_NEW_ARRAY); } error = (*GET_JVMTI())->GetObjectSize(GET_JVMTI(), object, &size); jrst_check_error(GET_JVMTI(), error, "Cannot Set Thread Local Storage"); jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_tag); tag++; id = tag; // printf("new array=[%x]\n", id); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_tag); rst_event_lis_ptr(ptr_new_array, JVMTI_EVENT_VM_OBJECT_ALLOC, size, id, nameClass); error = (*GET_JVMTI())->SetTag(GET_JVMTI(), object, (jlong)id); jrst_check_error(GET_JVMTI(), error, "Cannot Set Tag"); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_new_array); // jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_object_free(jlong tag) { if(traces){ jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_buffer); if(ptr_monitor == NULL){ ptr_monitor = (rst_buffer_t *)malloc(sizeof(rst_buffer_t)); rst_init_ptr(ptr_monitor, (u_int64_t)jrst_mainThread, (u_int64_t)THREAD_MONITOR); } // printf("free=[%x]\n", (int)tag); rst_event_i_ptr(ptr_monitor, JVMTI_EVENT_OBJECT_FREE, (int)tag); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_buffer); } } void trace_event_gc_start() { if(traces){ jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_buffer); if(ptr_monitor == NULL){ ptr_monitor = (rst_buffer_t *)malloc(sizeof(rst_buffer_t)); rst_init_ptr(ptr_monitor, (u_int64_t)jrst_mainThread, (u_int64_t)THREAD_MONITOR); } rst_event_ptr(ptr_monitor, JVMTI_EVENT_GARBAGE_COLLECTION_START); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_buffer); } } void trace_event_gc_finish() { if(traces){ jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_buffer); rst_event_ptr(ptr_monitor, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_buffer); } } void trace_event_method_entry_obj_init(jthread thread, jobject object, int method, char *nameClass) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jlong id = 0; jlong size = 0; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); //ptr = get_buffer(GET_JVMTI(), thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL || error!= JVMTI_ERROR_NONE){ // printf("trace_event_method_entry_objc thread method=[%x]\n",method); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } error = (*GET_JVMTI())->GetObjectSize(GET_JVMTI(), object, &size); jrst_check_error(GET_JVMTI(), error, "Cannot Set Thread Local Storage"); jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_tag); tag++; id = (jlong)tag; //printf("enter =[%d]\n", (int)id); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_tag); rst_event_liis_ptr(ptr, EVENT_METHOD_ENTRY_ALLOC, size, (int)id, method, nameClass); error = (*GET_JVMTI())->SetTag(GET_JVMTI(), object, id); jrst_check_error(GET_JVMTI(), error, "Cannot Set Tag"); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_method_entry_obj(jthread thread, int object, int method) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); //ptr = get_buffer(GET_JVMTI(), thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL || error!= JVMTI_ERROR_NONE){ // printf("trace_event_method_entry_objc thread method=[%x]\n",method); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } rst_event_ii_ptr(ptr, JVMTI_EVENT_METHOD_ENTRY, object, method); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_method_entry(jthread thread, int method) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); //ptr = get_buffer(GET_JVMTI(), thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL || error!= JVMTI_ERROR_NONE){ // printf("trace_event_method_entry thread method=[%d]\n",method); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } rst_event_i_ptr(ptr, METHOD_ENTRY, method); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_method_exit(jthread thread) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); // ptr = get_buffer(GET_JVMTI(), thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL || error!= JVMTI_ERROR_NONE){ // printf("trace_event_method_saida thread \n"); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } rst_event_ptr(ptr, JVMTI_EVENT_METHOD_EXIT); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_exception(jthread thread, int exception) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); // ptr = get_buffer(GET_JVMTI(), thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL || error!= JVMTI_ERROR_NONE){ // printf("trace_event_method_saida thread \n"); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } rst_event_i_ptr(ptr, METHOD_EXCEPTION, exception); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_method_exit_exception(jthread thread) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); // ptr = get_buffer(GET_JVMTI(), thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL || error!= JVMTI_ERROR_NONE){ // printf("trace_event_method_saida thread \n"); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } rst_event_ptr(ptr, METHOD_EXIT_EXCEPTION); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_method_load(int method, char *name, unsigned access_flags, int klass) { if(traces){ rst_event_isii_ptr(ptr_loader, METHOD_LOAD, method, name, klass, access_flags); } } void trace_event_class_load(int klass, char *name) { if(traces){ if(ptr_loader == NULL){ ptr_loader = (rst_buffer_t *)malloc(sizeof(rst_buffer_t)); rst_init_ptr(ptr_loader, (u_int64_t)jrst_mainThread, (u_int64_t)THREAD_LOADER); } rst_event_is_ptr(ptr_loader, CLASS_LOAD, klass, name); } } void trace_event_monitor_contended_enter(jvmtiEnv *jvmtiLocate, jthread thread, int object) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL){ //printf("trace_event_method_saida thread \n"); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } rst_event_i_ptr(ptr, MONITOR_ENTER, object); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_monitor_contended_entered(jvmtiEnv *jvmtiLocate, jthread thread, int object) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL){ // printf("trace_event_method_saida thread \n"); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } rst_event_i_ptr(ptr, MONITOR_ENTERED, object); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_monitor_wait(jvmtiEnv *jvmtiLocate, jthread thread, int object) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL){ //printf("trace_event_method_saida thread \n"); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } rst_event_i_ptr(ptr, MONITOR_WAIT, object); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } void trace_event_monitor_waited(jvmtiEnv *jvmtiLocate, jthread thread, int object) { if(traces){ rst_buffer_t *ptr; jvmtiError error; jrst_enter_critical_section(GET_JVMTI(), gagent->monitor_thread); error = (*GET_JVMTI())->GetThreadLocalStorage(GET_JVMTI(), thread, (void**)&ptr); if (ptr == NULL){ // printf("trace_event_method_saida thread \n"); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); return; } rst_event_i_ptr(ptr, MONITOR_WAITED, object); jrst_exit_critical_section(GET_JVMTI(), gagent->monitor_thread); } } Paje-1.98/Tracers/JRastro/src/JRastro_options.c0000664000175000017500000002520111674062007021336 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" void jrst_enable_all(jvmtiEnv *jvmtiLocate) { jvmtiError error; /*Method && Exception*/ methodsTrace = true; error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_FRAME_POP, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); /*MemoryAllocation*/ memoryTrace = true; error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_OBJECT_FREE, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_START, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); /*Monitor*/ error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTER, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAIT, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAITED, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); } void jrst_threads(jvmtiEnv *jvmtiLocate) { jvmtiError error; error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_THREAD_END, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); } void jrst_read_events_enable(jvmtiEnv *jvmtiLocate) { FILE *file; jvmtiError error; char line[MAX_LINE_EVENTS]; char buffer[MAX_LINE_EVENTS]; int i, j; if(eventsOptionName[0] == '\0'){ return; } file=fopen(eventsOptionName, "r"); if(file == NULL){ printf("\nCannot open the file\n"); exit(2); } bzero(buffer, MAX_LINE_EVENTS); bzero(line, MAX_LINE_EVENTS); fgets(line, MAX_LINE_EVENTS, file); while(!feof(file)){ line[strlen(line) - 1]='\0'; for(i=0; line[i] == ' ' || line[i] == '\t'; i++); if(line[i] != '\0' && line[i] != '#'){ for(j=0 ; line[i] != '\0' && line[i] != ' ' && line[i] != '\t'; i++, j++){ buffer[j]=line[i]; } buffer[j]='\0'; if(!strcmp(buffer,"all")){ printf("[JRastro] Enable All Traces\n"); jrst_enable_all(jvmtiLocate); fclose(file); return; }else if(!strcmp(buffer,"NoTraces")){ printf("[JRastro] No Enable Traces\n"); traces=false; fclose(file); return; }else if(!strcmp(buffer,"Method")){ methodsTrace = true; /*Comentei para ficar apenas o Method*/ //}else if(!strcmp(buffer,"Exception")){ // methodsTrace = true; error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); // error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION_CATCH, (jthread)NULL); // jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_FRAME_POP, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); }else if(!strcmp(buffer,"MemoryAllocation")){ memoryTrace = true; /*error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification ");*/ error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_OBJECT_FREE, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_START, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); }else if(!strcmp(buffer,"Monitor")){ error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTER, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAIT, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); error=(*jvmtiLocate)->SetEventNotificationMode(jvmtiLocate, JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAITED, (jthread)NULL); jrst_check_error(jvmtiLocate, error, "Cannot set event notification "); } } bzero(line, MAX_LINE_EVENTS); bzero(buffer, MAX_LINE_EVENTS); fgets(line, MAX_LINE_EVENTS, file); } fclose(file); } void jrst_read_class_methods_enable() { FILE *file; char line[MAX_LINE]; char class[MAX_LINE]; char method[MAX_LINE]; char type; int i = 0, j = 0; list_t *new_list = NULL; bool all = true; if(methodsOptionName[0] == '\0'){ return; } file=fopen(methodsOptionName, "r"); if(file == NULL){ printf("\nCannot open the file\n"); exit(2); } strcpy(class, "*"); strcpy(method, "*"); bzero(line, MAX_LINE); fgets(line, MAX_LINE, file); while(!feof(file)){ line[strlen(line) - 1]='\0'; for(i=0; line[i] == ' ' || line[i] == '\t'; i++); while(line[i] != '\0' && line[i] != '#'){ type = line[i]; i++; if(type == 'C' || type == 'c'){ if(new_list != NULL){ hash_insert(&h_options, (hash_key_t)class, (hash_data_t)new_list); } all = false; new_list = NULL; new_list = (list_t *) malloc(sizeof(list_t)); if(new_list == NULL){ printf("[JRastro ERROR]: Cannot malloc list\n"); exit(3); } list_initialize(new_list, list_copy_string, list_cmp_string, list_destroy_string); bzero(class, MAX_LINE); for(; line[i] == ' ' || line[i] == '\t'; i++); for(j=0 ; line[i] != '\0' && line[i] != ' ' && line[i] != '\t'; i++, j++){ class[j]=line[i]; } class[j]='\0'; if(strcmp(class, "*") == 0){ all = true; } for(; line[i] == ' ' || line[i] == '\t'; i++); }else if(type == 'M' || type == 'm'){ bzero(method, MAX_LINE); for(; line[i] == ' ' || line[i] == '\t'; i++); for(j=0 ; line[i] != '\0' && line[i] != ' ' && line[i] != '\t'; i++, j++){ method[j]=line[i]; } method[j]='\0'; if(all){ if(strcmp(method, "*") == 0){ printf("[JRastro] Enable All Classes and Methods\n"); tracesAll=true; fclose(file); return; } } if(new_list == NULL){ new_list = (list_t *) malloc(sizeof(list_t)); if(new_list == NULL){ printf("[JRastro ERROR]: Cannot malloc list\n"); exit(3); } list_initialize(new_list, list_copy_string, list_cmp_string, list_destroy_string); } list_insert_after(new_list, NULL, (list_data_t)method); for(; line[i] == ' ' || line[i] == '\t'; i++); }else{ printf("\n[JRastro ERROR]:Type desconhecido\n"); exit(2); } } bzero(line, MAX_LINE); fgets(line, MAX_LINE, file); } if(new_list != NULL){ hash_insert(&h_options, (hash_key_t)class, (hash_data_t)new_list); } fclose(file); } /*funcao que le as opcoes recebidas pela funcao "Agent_OnLoad"*/ void jrst_read_names_options(char *options) { int count=0, count2=0; if(options == NULL){ eventsOptionName[0] = '\0'; methodsOptionName[0] = '\0'; return; } bzero(eventsOptionName, MAX_NAME_OPTIONS); bzero(methodsOptionName, MAX_NAME_OPTIONS); for(count=0;options[count] != ',' && options[count] != '\0';count++){ eventsOptionName[count]=options[count]; } eventsOptionName[count]='\0'; if(options[count] != '\0'){ count++; for(count2 = 0; options[count] != '\0';count++,count2++){ methodsOptionName[count2]=options[count]; } methodsOptionName[count2]='\0'; }else{ methodsOptionName[0]='\0'; } } Paje-1.98/Tracers/JRastro/src/JRastro_hash_func.c0000664000175000017500000000472211674062007021606 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" void hash_copy_string_data (hash_element_t *element, hash_key_t key, hash_data_t data) { hash_null(element); hash_null(key); hash_null(data); element->key = (void *) malloc(sizeof(char) * (strlen((char *)key) + 1)); element->key = memcpy(element->key, key, sizeof(char) * (strlen((char *)key) + 1)); element->data = (void *) malloc(sizeof(jvmtiClassDefinition)); element->data = memcpy(element->data, data, sizeof(jvmtiClassDefinition)); } void hash_destroy_string_data(hash_element_t *element) { hash_null(element); free(element->key); element->key=NULL; free(element->data); element->data=NULL; } void hash_destroy_string_list(hash_element_t *element) { hash_null(element); free(element->key); element->key=NULL; list_t *tmp = (list_t *)element->data; list_finalize(tmp); free(element->data); element->data=NULL; } void hash_destroy_new(hash_element_t *element) { hash_null(element); element->key = NULL; element->data = NULL; } void hash_copy_new(hash_element_t *element, hash_key_t key, hash_data_t data) { hash_null(element); hash_null(key); hash_null(data); element->key = (void *)key; element->data = (void *)data; } void hash_destroy_new_thread(hash_element_t *element) { hash_null(element); element->key = NULL; free(element->data); element->data = NULL; } Paje-1.98/Tracers/JRastro/src/JRastro_read_objects.c0000664000175000017500000004200211674062007022265 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" FILE *file; list_t list; hash_t h_class; hash_t h_method; hash_t h_thread; hash_t h_mem; hash_data_t *class_name; hash_data_t *class_number; hash_data_t *data_list; hash_data_t *data_mem; rst_file_t data; rst_event_t ev; static bool read=false; timestamp_t first; void jrst_constant(FILE *file) { fprintf(file,"1\tPJ\t0\t\"Program Java\"\n"); fprintf(file,"1\tJVM\tPJ\t\"Java Virtual Machine\"\n"); fprintf(file,"1\tO\tJVM\t\"Object\"\n"); fprintf(file,"2\tEX\tO\t\"ExceptionE\"\n"); fprintf(file,"3\tJS\tJVM\t\"JVM State\"\n"); fprintf(file,"3\tS\tO\t\"Metodo\"\n"); fprintf(file,"3\tMS\tO\t\"Monitor State\"\n"); fprintf(file,"4\tMEM\tJVM\t\"Memory Allocation\"\n"); fprintf(file,"6\texe\tJS\t\"Executing\"\n"); fprintf(file,"6\tgc\tJS\t\"Garbage Collection\"\n"); fprintf(file,"6\tlock\tMS\t\"Monitor locked\"\n"); fprintf(file,"6\tex\tEX\t\"Start Exception\"\n"); fprintf(file,"6\texpop\tEX\t\"Frame pop by Exception\"\n"); fprintf(file,"7\t0.0\tpj\tPJ\t0\t\"Programa Java\"\n"); } void jrst_access_flags(FILE *file, unsigned int flags) { if(flags & JVM_ACC_PUBLIC){ fprintf(file," PUBLIC"); } if(flags & JVM_ACC_PRIVATE){ fprintf(file," PRIVATE"); } if(flags & JVM_ACC_PROTECTED){ fprintf(file," PROTECTED"); } if(flags & JVM_ACC_STATIC){ fprintf(file," STATIC"); } if(flags & JVM_ACC_FINAL){ fprintf(file," FINAL"); } if(flags & JVM_ACC_SYNCHRONIZED){ fprintf(file," SYNCHRONIZED"); } if(flags & JVM_ACC_NATIVE){ fprintf(file," NATIVE"); } if(flags & JVM_ACC_INTERFACE){ fprintf(file," INTERFACE"); } if(flags & JVM_ACC_ABSTRACT){ fprintf(file," ABSTRACT"); } if(flags & JVM_ACC_STRICT){ fprintf(file," STRICT"); } } void jrst_initialize() { if(!read){ first=ev.timestamp; read=true; } if(ev.id1 == ev.id2){ fprintf(file,"7\t%.6f\tj-%lld\tJVM\tpj\t\"JVM-%lld\"\n",(((double)(ev.timestamp - first))/ 1000000.0),ev.id1,ev.id1); fprintf(file,"11\t%.6f\tJS\tj-%lld\texe\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1); fprintf(file,"13\t%.6f\tMEM\tj-%lld\t0.0\n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1); } list_t *new_list; new_list = (list_t *) malloc(sizeof(list_t)); if(new_list == NULL){ printf("ERROR: Cannot malloc list\n"); exit(3); } list_initialize(new_list, list_copy, list_cmp, list_destroy); hash_insert(&h_thread, (hash_key_t)(long)ev.id2, (hash_data_t)new_list); } void jrst_finalize() { data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; position_t pos; for(pos = list_inicio(tmp); pos != NULL ; pos = list_inicio(tmp)){ fprintf(file,"12\t%.6f\tS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, (int)pos->data); //fprintf(file,"8\t%.6f\to-%x\tO\n",(((double)(ev.timestamp - first)) / 1000000), (int)pos->data); list_rem_position (tmp, pos); } list_finalize(tmp); //hash_remove(&h_thread, (hash_key_t)(long)ev.id2); } void jrst_event_class() { hash_insert(&h_class, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1), (hash_data_t)ev.v_string[0]); } void jrst_event_method() { class_name = hash_locate(&h_class, (hash_key_t)(ev.v_uint32[1]+(int)ev.id1)); if(class_name == NULL){ printf("ERROR: Cannot Method load\n"); exit(1); } if(ev.v_uint32[2] == 0){ fprintf(file,"666\te-%lld.%x\tS\t\"%s.%s\"\t%lld.%x\n", ev.id1, ev.v_uint32[0], *(char **)class_name, ev.v_string[0], ev.id1, ev.v_uint32[1]); }else{ fprintf(file,"6666\te-%lld.%x\tS\t\"%s.%s\"\t%lld.%x\t\"F=", ev.id1, ev.v_uint32[0], *(char **)class_name, ev.v_string[0], ev.id1, ev.v_uint32[1]); jrst_access_flags(file, ev.v_uint32[2]); fprintf(file,"\"\n"); } hash_insert(&h_method, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1), (hash_data_t) (ev.v_uint32[1]+(int)ev.id1)); } void jrst_event_method_entry_alloc() { //Coloquei essa parte para inicializar os objetos list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(!list_find(&list, (void *)&obj)){ if(strcmp(ev.v_string[0], "") == 0){ int n_class = 0; class_number = hash_locate(&h_method, (hash_key_t)(ev.v_uint32[1]+(int)ev.id1)); if(class_number == NULL){ printf("ERROR: Cannot Method Class\n"); exit(2); } n_class = *((int*)class_number) - (int)ev.id1; class_name = hash_locate(&h_class, (hash_key_t)(n_class+(int)ev.id1)); if(class_name == NULL){ printf("ERROR: Cannot Method load\n"); exit(1); } //printf("obj=[%x] method=[%x] class=[%x] name=[%s]\n", ev.v_uint32[0] ,ev.v_uint32[1], n_class, *(char **)class_name); //Aqui para colocar o nome do objeto fprintf(file,"7\t%.6f\to-%lld.%x\tO\tj-%lld\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.id1, *(char **)class_name, ev.v_uint32[0]); }else{ fprintf(file,"7\t%.6f\to-%lld.%x\tO\tj-%lld\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.id1, ev.v_string[0], ev.v_uint32[0]); } list_insert_after(&list, NULL, (void *)&obj); } ////////////////////////////////////////////////////// fprintf(file,"14\t%.6f\tMEM\tj-%lld\t%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, ev.v_uint64[0]); hash_insert(&h_mem, (hash_key_t)(ev.v_uint32[0] + (int)ev.id1), (hash_data_t)((long)ev.v_uint64[0])); data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; list_insert_after(tmp, NULL, (list_data_t)ev.v_uint32[0]); //printf("obj=[%x] method=[%x] class=[] name=[]\n",ev.v_uint32[0], ev.v_uint32[1]); fprintf(file,"11\t%.6f\tS\to-%lld.%x\te-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0], ev.id1, ev.v_uint32[1]); } void jrst_jvmti_event_method_entry() { list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(!list_find(&list, (void *)&obj)){ int n_class = 0; class_number = hash_locate(&h_method, (hash_key_t)(ev.v_uint32[1]+(int)ev.id1)); if(class_number == NULL){ printf("ERROR: Cannot Method Class\n"); exit(2); } n_class = *((int*)class_number) - (int)ev.id1; class_name = hash_locate(&h_class, (hash_key_t)(n_class+(int)ev.id1)); if(class_name == NULL){ printf("ERROR: Cannot Method load\n"); exit(1); } //printf("obj=[%x] method=[%x] class=[%x] name=[%s]\n", ev.v_uint32[0] ,ev.v_uint32[1], n_class, *(char **)class_name); //Aqui para colocar o nome do objeto fprintf(file,"7\t%.6f\to-%lld.%x\tO\tj-%lld\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.id1, *(char **)class_name, ev.v_uint32[0]); list_insert_after(&list, NULL, (void *)&obj); } data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; list_insert_after(tmp, NULL, (list_data_t)ev.v_uint32[0]); //printf("obj=[%x] method=[%x] class=[] name=[]\n",ev.v_uint32[0], ev.v_uint32[1]); fprintf(file,"11\t%.6f\tS\to-%lld.%x\te-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0], ev.id1, ev.v_uint32[1]); } void jrst_method_entry() { int obj_class = 0; class_number = hash_locate(&h_method, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1)); if(class_number == NULL){ printf("ERROR: Cannot Method Class\n"); exit(2); } obj_class = *((int*)class_number) - (int)ev.id1; //printf("method=[%x] class=[%x]\n",ev.v_uint32[0], obj_class); list_object_t obj; obj.jvm = ev.id1; obj.idObject = obj_class; if(!list_find(&list, (void *)&obj)){ class_name = hash_locate(&h_class, (hash_key_t)(obj_class+(int)ev.id1)); if(class_name == NULL){ printf("ERROR: Cannot Method load\n"); exit(1); } fprintf(file,"7\t%.6f\to-%lld.%x\tO\tj-%lld\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, obj_class, ev.id1, ev.id1, *(char **)class_name, obj_class); list_insert_after(&list, NULL, (void *)&obj); } data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; list_insert_after(tmp, NULL, (list_data_t)obj_class); fprintf(file,"11\t%.6f\tS\to-%lld.%x\te-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, obj_class, ev.id1, ev.v_uint32[0]); } void jrst_jvmti_event_method_exit() { data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; position_t pos; pos = list_inicio(tmp); if(pos == NULL){ printf("ERROR: Cannot get data list\n"); exit(2); } fprintf(file,"12\t%.6f\tS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, (int)pos->data); list_rem_position (tmp, NULL); } void jrst_method_exception() { data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; position_t pos; pos = list_inicio(tmp); if(pos == NULL){ printf("ERROR: Cannot get data list\n"); exit(2); } fprintf(file,"9999\t%.6f\tEX\to-%lld.%x\tex\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, (int)pos->data, ev.id1, ev.v_uint32[0]); } void jrst_method_exit_exception() { data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; position_t pos; pos = list_inicio(tmp); if(pos == NULL){ printf("ERROR: Cannot get data list\n"); exit(2); } fprintf(file,"12\t%.6f\tS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, (int)pos->data); fprintf(file,"9\t%.6f\tEX\to-%lld.%x\texpop\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, (int)pos->data); list_rem_position (tmp, NULL); } void jrst_jvmti_event_vm_object_alloc() { //Coloquei essa parte para inicializar os objetos list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(!list_find(&list, (void *)&obj)){ // printf("init alloc=[%s]\n", ev.v_string[0]); if(strcmp(ev.v_string[0], "") == 0){ fprintf(file,"7\t%.6f\to-%lld.%x\tO\tj-%lld\t\"o-%lld.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.id1, ev.v_uint32[0]); }else{ fprintf(file,"7\t%.6f\to-%lld.%x\tO\tj-%lld\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.id1, ev.v_string[0], ev.v_uint32[0]); } list_insert_after(&list, NULL, (void *)&obj); } ////////////////////////////////////////////////////// fprintf(file,"14\t%.6f\tMEM\tj-%lld\t%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, ev.v_uint64[0]); hash_insert(&h_mem, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1), (hash_data_t)((long)ev.v_uint64[0])); } void jrst_jvmti_event_object_free() { data_mem = hash_locate(&h_mem, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1)); if(data_mem == NULL){ printf("ERROR: Cannot JVMTI_EVENT_OBJECT_FREE \n"); printf("\tObjeto=[%x] nao achado para liberar\n",ev.v_uint32[0]); return; //continue; //exit(2); } fprintf(file,"15\t%.6f\tMEM\tj-%lld\t%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, (long long)*(long*)data_mem); list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(list_find(&list, (void *)&obj)){ fprintf(file,"8\t%.6f\to-%lld.%x\tO\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } } void jrst_jvmti_event_garbage_collection_start() { fprintf(file,"11\t%.6f\tJS\tj-%lld\tgc\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1); } void jrst_jvmti_event_garbage_collection_finish() { fprintf(file,"12\t%.6f\tJS\tj-%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1); } void jrst_event_monitor_enter() { fprintf(file,"11\t%.6f\tMS\to-%lld.%x\tlock\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } void jrst_event_monitor_entered() { fprintf(file,"12\t%.6f\tMS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } void jrst_event_monitor_wait() { fprintf(file,"11\t%.6f\tMS\to-%lld.%x\tlock\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } void jrst_event_monitor_waited() { fprintf(file,"12\t%.6f\tMS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } void jrst_event_select() { if(ev.type == INITIALIZE){ jrst_initialize(); }else if(ev.type == FINALIZE){ jrst_finalize(); }else if(ev.type == CLASS_LOAD){ jrst_event_class(); }else if(ev.type == METHOD_LOAD){ jrst_event_method(); }else if(ev.type == EVENT_METHOD_ENTRY_ALLOC){ jrst_event_method_entry_alloc(); }else if(ev.type == JVMTI_EVENT_METHOD_ENTRY){ jrst_jvmti_event_method_entry(); }else if(ev.type == METHOD_ENTRY){ //Sem o objeto jrst_method_entry(); }else if(ev.type == JVMTI_EVENT_METHOD_EXIT){ jrst_jvmti_event_method_exit(); }else if(ev.type == METHOD_EXCEPTION){ jrst_method_exception(); }else if(ev.type == METHOD_EXIT_EXCEPTION){ jrst_method_exit_exception(); }else if(ev.type == JVMTI_EVENT_VM_OBJECT_ALLOC){ jrst_jvmti_event_vm_object_alloc(); }else if(ev.type == JVMTI_EVENT_OBJECT_FREE){ jrst_jvmti_event_object_free(); }else if(ev.type == JVMTI_EVENT_GARBAGE_COLLECTION_START){ jrst_jvmti_event_garbage_collection_start(); }else if(ev.type == JVMTI_EVENT_GARBAGE_COLLECTION_FINISH){ jrst_jvmti_event_garbage_collection_finish(); }else if(ev.type == MONITOR_ENTER){ jrst_event_monitor_enter(); }else if(ev.type == MONITOR_ENTERED){ jrst_event_monitor_entered(); }else if(ev.type == MONITOR_WAIT){ jrst_event_monitor_wait(); }else if(ev.type == MONITOR_WAITED){ jrst_event_monitor_waited(); } } int main(int argc, char *argv[]) { int i; if(argc < 3){ printf("ERROR: Cannot read args\n"); printf("\t%s \n",argv[0]); exit(1); } file=fopen("rastrosObj.trace","w"); paje_header(file); jrst_constant(file); list_initialize(&list, list_copy_object, list_cmp_object, list_destroy_int); hash_initialize(&h_class, hash_value, hash_copy, hash_key_cmp, hash_destroy); hash_initialize(&h_method, hash_value, hash_copy_new, hash_key_cmp, hash_destroy_new); hash_initialize(&h_thread, hash_value, hash_copy_new, hash_key_cmp, hash_destroy_new_thread); hash_initialize(&h_mem, hash_value, hash_copy_new, hash_key_cmp, hash_destroy_new); for (i=2; idata; fprintf(file,"8\t%.6f\to-%lld.%x\tO\n",(((double)(ev.timestamp - first)) / 1000000), (long long)obj->jvm, obj->idObject); list_rem_position (&list, pos); } fprintf(file,"12\t%.6f\tJS\tj-%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1); fprintf(file,"8\t%.6f\tj-%lld\tJVM\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1); fprintf(file,"8\t%.6f\tpj\tPJ\n",(((double)(ev.timestamp - first)) / 1000000)); list_finalize(&list); hash_finalize(&h_class); hash_finalize(&h_method); hash_finalize(&h_thread); hash_finalize(&h_mem); fclose(file); return 0; } Paje-1.98/Tracers/JRastro/src/JRastro_rastros.c0000664000175000017500000000516111674062007021343 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ /* Do not edit. File generated by rastro_generate. */ #include "JRastro_rastros.h" void rst_event_i_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0) { rst_startevent(ptr, type<<18|0x27000); RST_PUT(ptr, u_int32_t, i0); rst_endevent(ptr); } void rst_event_ii_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0, u_int32_t i1) { rst_startevent(ptr, type<<18|0x27700); RST_PUT(ptr, u_int32_t, i0); RST_PUT(ptr, u_int32_t, i1); rst_endevent(ptr); } void rst_event_is_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0, u_int8_t *s0) { rst_startevent(ptr, type<<18|0x27100); RST_PUT(ptr, u_int32_t, i0); RST_PUT_STR(ptr, s0); rst_endevent(ptr); } void rst_event_isii_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0, u_int8_t *s0, u_int32_t i1, u_int32_t i2) { rst_startevent(ptr, type<<18|0x27771); RST_PUT(ptr, u_int32_t, i0); RST_PUT(ptr, u_int32_t, i1); RST_PUT(ptr, u_int32_t, i2); RST_PUT_STR(ptr, s0); rst_endevent(ptr); } void rst_event_isiii_ptr(rst_buffer_t *ptr, u_int16_t type, u_int32_t i0, u_int8_t *s0, u_int32_t i1, u_int32_t i2, u_int32_t i3) { rst_startevent(ptr, type<<18|0x7777); RST_PUT(ptr, u_int32_t, 0x21000000); RST_PUT(ptr, u_int32_t, i0); RST_PUT(ptr, u_int32_t, i1); RST_PUT(ptr, u_int32_t, i2); RST_PUT(ptr, u_int32_t, i3); RST_PUT_STR(ptr, s0); rst_endevent(ptr); } void rst_event_liis_ptr(rst_buffer_t *ptr, u_int16_t type, u_int64_t l0, u_int32_t i0, u_int32_t i1, u_int8_t *s0) { rst_startevent(ptr, type<<18|0x24771); RST_PUT(ptr, u_int64_t, l0); RST_PUT(ptr, u_int32_t, i0); RST_PUT(ptr, u_int32_t, i1); RST_PUT_STR(ptr, s0); rst_endevent(ptr); } void rst_event_lis_ptr(rst_buffer_t *ptr, u_int16_t type, u_int64_t l0, u_int32_t i0, u_int8_t *s0) { rst_startevent(ptr, type<<18|0x24710); RST_PUT(ptr, u_int64_t, l0); RST_PUT(ptr, u_int32_t, i0); RST_PUT_STR(ptr, s0); rst_endevent(ptr); } Paje-1.98/Tracers/JRastro/src/JRastro_java_crw_demo.c0000664000175000017500000021247611674062007022457 0ustar schnorrschnorr/* * @(#)java_crw_demo.c 1.25 05/01/04 * * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */ /* Class reader writer (java_crw_demo) for instrumenting bytecodes */ /* This file is a modified version of the file "java_crw_demo.c" contained * in "jdk-1_5_0_04-linux-i586.bin" from Sun Microsystems. * * Modification written by: Geovani Ricardo Wiedenhoft */ /* * As long as the callbacks allow for it and the class number is unique, * this code is completely re-entrant and any number of classfile * injections can happen at the same time. * * The current logic requires a unique number for this class instance * or (jclass,jobject loader) pair, this is done via the ClassIndex * in hprof, which is passed in as the 'unsigned cnum' to java_crw_demo(). * It's up to the user of this interface if it wants to use this * feature. * * Example Usage: See file test_crw.c. * */ /* Get Java and class file and bytecode information. */ /* Include our own interface for cross check */ #include "JRastro.h" list_t *allMethods; list_t *methods; bool all; /* Macros over error functions to capture line numbers */ #define CRW_FATAL(ci, message) fatal_error(ci, message, __FILE__, __LINE__) #if defined(DEBUG) || !defined(NDEBUG) #define CRW_ASSERT(ci, cond) \ ((cond)?(void)0:assert_error(ci, #cond, __FILE__, __LINE__)) #else #define CRW_ASSERT(ci, cond) #endif #define CRW_ASSERT_MI(mi) CRW_ASSERT((mi)?(mi)->ci:NULL,(mi)!=NULL) #define CRW_ASSERT_CI(ci) CRW_ASSERT(ci, ( (ci) != NULL && \ (ci)->input_position <= (ci)->input_len && \ (ci)->output_position <= (ci)->output_len) ) /* Typedefs for various integral numbers, just for code clarity */ typedef unsigned ClassOpcode; /* One opcode */ typedef unsigned char ByteCode; /* One byte from bytecodes */ typedef int ByteOffset; /* Byte offset */ typedef int ClassConstant; /* Constant pool kind */ typedef long CrwPosition; /* Position in class image */ typedef unsigned short CrwCpoolIndex; /* Index into constant pool */ /* Misc support macros */ /* Given the position of an opcode, find the next 4byte boundary position */ #define NEXT_4BYTE_BOUNDARY(opcode_pos) (((opcode_pos)+4) & (~3)) #define LARGEST_INJECTION (12*3) /* 3 injections at same site */ #define MAXIMUM_NEW_CPOOL_ENTRIES 64 /* don't add more than 32 entries */ /* Constant Pool Entry (internal table that mirrors pool in file image) */ typedef struct { const char * ptr; /* Pointer to any string */ unsigned short len; /* Length of string */ unsigned int index1; /* 1st 16 bit index or 32bit value. */ unsigned int index2; /* 2nd 16 bit index or 32bit value. */ ClassConstant tag; /* Tag or kind of entry. */ } CrwConstantPoolEntry; struct MethodImage; /* Class file image storage structure */ typedef struct CrwClassImage { /* Unique class number for this class */ unsigned number; /* Name of class, given or gotten out of class image */ const char * name; /* Input and Output class images tracking */ const unsigned char * input; unsigned char * output; CrwPosition input_len; CrwPosition output_len; CrwPosition input_position; CrwPosition output_position; /* Mirrored constant pool */ CrwConstantPoolEntry * cpool; CrwCpoolIndex cpool_max_elements; /* Max count */ CrwCpoolIndex cpool_count_plus_one; /* Input flags about class (e.g. is it a system class) */ int system_class; /* Class access flags gotten from file. */ unsigned access_flags; /*####################################################################*/ /* Names of classes and methods. */ char* tclass_name; /* Name of class that has tracker methods. */ char* tclass_sig; /* Signature of class */ /*####################################################################*/ char* call_name; /* Method name to call at offset 0 */ char* call_sig; /* Signature of this method */ /*####################################################################*/ char* call_static_name; /* Method name to call at offset 0 */ char* call_static_sig; /* Signature of this method */ /*####################################################################*/ char* return_name; /* Method name to call before any return */ char* return_sig; /* Signature of this method */ /*####################################################################*/ char* return_main_name; /* Method Main name to call before any return */ char* return_main_sig; /* Signature of this method Main*/ /*####################################################################*/ char* obj_init_name; /* Method name to call in Object */ char* obj_init_sig; /* Signature of this method */ /*####################################################################*/ char* newarray_name; /* Method name to call after newarray opcodes */ char* newarray_sig; /* Signature of this method */ /*####################################################################*/ /* Constant pool index values for new entries */ CrwCpoolIndex tracker_class_index; CrwCpoolIndex object_init_tracker_index; CrwCpoolIndex newarray_tracker_index; CrwCpoolIndex call_tracker_index; CrwCpoolIndex call_static_tracker_index; CrwCpoolIndex return_tracker_index; CrwCpoolIndex return_main_tracker_index; CrwCpoolIndex class_number_index; /* Class number in pool */ /* Count of injections made into this class */ int injection_count; /* This class must be the java.lang.Object class */ jboolean is_object_class; /* This class must be the java.lang.Thread class */ jboolean is_thread_class; /* Callback functions */ MethodTraceOptions trace_options; /* Table of method names and descr's */ int method_count; const char ** method_name; const char ** method_descr; struct MethodImage * current_mi; } CrwClassImage; /* Injection bytecodes (holds injected bytecodes for each code position) */ typedef struct { ByteCode * code; ByteOffset len; } Injection; /* Method transformation data (allocated/freed as each method is processed) */ typedef struct MethodImage { /* Back reference to Class image data. */ CrwClassImage * ci; /* Unique method number for this class. */ unsigned number; /* Method name and descr */ const char * name; const char * descr; /* Map of input bytecode offsets to output bytecode offsets */ ByteOffset * map; /* Bytecode injections for each input bytecode offset */ Injection * injections; /* Widening setting for each input bytecode offset */ signed char * widening; /* Length of original input bytecodes. */ ByteOffset code_len; /* Location in input where bytecodes are located. */ CrwPosition start_of_input_bytecodes; /* Original max_stack and new max stack */ unsigned max_stack; unsigned new_max_stack; jboolean object_init_method; jboolean skip_call_return_sites; /* Method access flags gotten from file. */ unsigned access_flags; } MethodImage; /* ----------------------------------------------------------------- */ /* General support functions (memory and error handling) */ static void fatal_error(CrwClassImage *ci, const char *message, const char *file, int line) { (void)fprintf(stderr, "ERROR: %s [%s:%d]\n", message, file, line); exit(2); } #if defined(DEBUG) || !defined(NDEBUG) static void assert_error(CrwClassImage *ci, const char *condition, const char *file, int line) { char buf[512]; MethodImage *mi; ByteOffset byte_code_offset; mi = ci->current_mi; if ( mi != NULL ) { byte_code_offset = (ByteOffset)(mi->ci->input_position - mi->start_of_input_bytecodes); } else { byte_code_offset=-1; } (void)sprintf(buf, "CRW ASSERTION FAILURE: %s (%s:%s:%d)", condition, ci->name==0?"?":ci->name, mi->name==0?"?":mi->name, byte_code_offset); fatal_error(ci, buf, file, line); } #endif static void * allocate(CrwClassImage *ci, int nbytes) { void * ptr; ptr = malloc(nbytes); if ( ptr == NULL ) { CRW_FATAL(ci, "Ran out of malloc memory"); } return ptr; } static void * reallocate(CrwClassImage *ci, void *optr, int nbytes) { void * ptr; ptr = realloc(optr, nbytes); if ( ptr == NULL ) { CRW_FATAL(ci, "Ran out of malloc memory"); } return ptr; } static void * allocate_clean(CrwClassImage *ci, int nbytes) { void * ptr; ptr = calloc(nbytes, 1); if ( ptr == NULL ) { CRW_FATAL(ci, "Ran out of malloc memory"); } return ptr; } static const char * duplicate(CrwClassImage *ci, const char *str, int len) { char *copy; copy = (char*)allocate(ci, len+1); (void)memcpy(copy, str, len); copy[len] = 0; return (const char *)copy; } static void deallocate(CrwClassImage *ci, void *ptr) { (void)free(ptr); } /* ----------------------------------------------------------------- */ /* Functions for reading/writing bytes to/from the class images */ static unsigned readU1(CrwClassImage *ci) { CRW_ASSERT_CI(ci); return ((unsigned)(ci->input[ci->input_position++])) & 0xFF; } static unsigned readU2(CrwClassImage *ci) { unsigned res; res = readU1(ci); return (res << 8) + readU1(ci); } static signed short readS2(CrwClassImage *ci) { unsigned res; res = readU1(ci); return ((res << 8) + readU1(ci)) & 0xFFFF; } static unsigned readU4(CrwClassImage *ci) { unsigned res; res = readU2(ci); return (res << 16) + readU2(ci); } static void writeU1(CrwClassImage *ci, unsigned val) /* Only writes out lower 8 bits */ { CRW_ASSERT_CI(ci); if ( ci->output != NULL ) { ci->output[ci->output_position++] = val & 0xFF; } } static void writeU2(CrwClassImage *ci, unsigned val) { writeU1(ci, val >> 8); writeU1(ci, val); } static void writeU4(CrwClassImage *ci, unsigned val) { writeU2(ci, val >> 16); writeU2(ci, val); } static unsigned copyU1(CrwClassImage *ci) { unsigned value; value = readU1(ci); writeU1(ci, value); return value; } static unsigned copyU2(CrwClassImage *ci) { unsigned value; value = readU2(ci); writeU2(ci, value); return value; } static unsigned copyU4(CrwClassImage *ci) { unsigned value; value = readU4(ci); writeU4(ci, value); return value; } static void copy(CrwClassImage *ci, unsigned count) { CRW_ASSERT_CI(ci); if ( ci->output != NULL ) { (void)memcpy(ci->output+ci->output_position, ci->input+ci->input_position, count); ci->output_position += count; } ci->input_position += count; CRW_ASSERT_CI(ci); } static void skip(CrwClassImage *ci, unsigned count) { CRW_ASSERT_CI(ci); ci->input_position += count; } static void read_bytes(CrwClassImage *ci, void *bytes, unsigned count) { CRW_ASSERT_CI(ci); CRW_ASSERT(ci, bytes!=NULL); (void)memcpy(bytes, ci->input+ci->input_position, count); ci->input_position += count; } static void write_bytes(CrwClassImage *ci, void *bytes, unsigned count) { CRW_ASSERT_CI(ci); CRW_ASSERT(ci, bytes!=NULL); if ( ci->output != NULL ) { (void)memcpy(ci->output+ci->output_position, bytes, count); ci->output_position += count; } } static void random_writeU2(CrwClassImage *ci, CrwPosition pos, unsigned val) { CrwPosition save_position; CRW_ASSERT_CI(ci); save_position = ci->output_position; ci->output_position = pos; writeU2(ci, val); ci->output_position = save_position; } static void random_writeU4(CrwClassImage *ci, CrwPosition pos, unsigned val) { CrwPosition save_position; CRW_ASSERT_CI(ci); save_position = ci->output_position; ci->output_position = pos; writeU4(ci, val); ci->output_position = save_position; } /* ----------------------------------------------------------------- */ /* Constant Pool handling functions. */ static void fillin_cpool_entry(CrwClassImage *ci, CrwCpoolIndex i, ClassConstant tag, unsigned int index1, unsigned int index2, const char *ptr, int len) { CRW_ASSERT_CI(ci); CRW_ASSERT(ci, i > 0 && i < ci->cpool_count_plus_one); ci->cpool[i].tag = tag; ci->cpool[i].index1 = index1; ci->cpool[i].index2 = index2; ci->cpool[i].ptr = ptr; ci->cpool[i].len = (unsigned short)len; } static CrwCpoolIndex add_new_cpool_entry(CrwClassImage *ci, ClassConstant tag, unsigned int index1, unsigned int index2, const char *str, int len) { CrwCpoolIndex i; char *utf8 = NULL; CRW_ASSERT_CI(ci); i = ci->cpool_count_plus_one++; /* NOTE: This implementation does not automatically expand the * constant pool table beyond the expected number needed * to handle this particular CrwTrackerInterface injections. * See MAXIMUM_NEW_CPOOL_ENTRIES */ CRW_ASSERT(ci, ci->cpool_count_plus_one < ci->cpool_max_elements ); writeU1(ci, tag); switch (tag) { case JVM_CONSTANT_Class: writeU2(ci, index1); break; case JVM_CONSTANT_String: writeU2(ci, index1); break; case JVM_CONSTANT_Fieldref: case JVM_CONSTANT_Methodref: case JVM_CONSTANT_InterfaceMethodref: case JVM_CONSTANT_Integer: case JVM_CONSTANT_Float: case JVM_CONSTANT_NameAndType: writeU2(ci, index1); writeU2(ci, index2); break; case JVM_CONSTANT_Long: case JVM_CONSTANT_Double: writeU4(ci, index1); writeU4(ci, index2); ci->cpool_count_plus_one++; CRW_ASSERT(ci, ci->cpool_count_plus_one < ci->cpool_max_elements ); break; case JVM_CONSTANT_Utf8: CRW_ASSERT(ci, len==(len & 0xFFFF)); writeU2(ci, len); write_bytes(ci, (void*)str, len); utf8 = (char*)duplicate(ci, str, len); break; default: CRW_FATAL(ci, "Unknown constant"); break; } fillin_cpool_entry(ci, i, tag, index1, index2, (const char *)utf8, len); CRW_ASSERT(ci, i > 0 && i < ci->cpool_count_plus_one); return i; } static CrwCpoolIndex add_new_class_cpool_entry(CrwClassImage *ci, const char *class_name) { CrwCpoolIndex name_index; CrwCpoolIndex class_index; int len; CRW_ASSERT_CI(ci); CRW_ASSERT(ci, class_name!=NULL); len = (int)strlen(class_name); name_index = add_new_cpool_entry(ci, JVM_CONSTANT_Utf8, len, 0, class_name, len); class_index = add_new_cpool_entry(ci, JVM_CONSTANT_Class, name_index, 0, NULL, 0); return class_index; } static CrwCpoolIndex add_new_method_cpool_entry(CrwClassImage *ci, CrwCpoolIndex class_index, const char *name, const char *descr) { CrwCpoolIndex name_index; CrwCpoolIndex descr_index; CrwCpoolIndex name_type_index; int len; CRW_ASSERT_CI(ci); CRW_ASSERT(ci, name!=NULL); CRW_ASSERT(ci, descr!=NULL); len = (int)strlen(name); name_index = add_new_cpool_entry(ci, JVM_CONSTANT_Utf8, len, 0, name, len); len = (int)strlen(descr); descr_index = add_new_cpool_entry(ci, JVM_CONSTANT_Utf8, len, 0, descr, len); name_type_index = add_new_cpool_entry(ci, JVM_CONSTANT_NameAndType, name_index, descr_index, NULL, 0); return add_new_cpool_entry(ci, JVM_CONSTANT_Methodref, class_index, name_type_index, NULL, 0); } static CrwConstantPoolEntry cpool_entry(CrwClassImage *ci, CrwCpoolIndex c_index) { CRW_ASSERT_CI(ci); CRW_ASSERT(ci, c_index > 0 && c_index < ci->cpool_count_plus_one); return ci->cpool[c_index]; } static void cpool_setup(CrwClassImage *ci) { CrwCpoolIndex i; CrwPosition cpool_output_position; int count_plus_one; CRW_ASSERT_CI(ci); cpool_output_position = ci->output_position; count_plus_one = copyU2(ci); CRW_ASSERT(ci, count_plus_one>1); ci->cpool_max_elements = count_plus_one+MAXIMUM_NEW_CPOOL_ENTRIES; ci->cpool = (CrwConstantPoolEntry*)allocate_clean(ci, (int)((ci->cpool_max_elements)*sizeof(CrwConstantPoolEntry))); ci->cpool_count_plus_one = (CrwCpoolIndex)count_plus_one; /* Index zero not in class file */ for (i = 1; i < count_plus_one; ++i) { CrwCpoolIndex ipos; ClassConstant tag; unsigned int index1; unsigned int index2; unsigned len; char * utf8; ipos = i; index1 = 0; index2 = 0; len = 0; utf8 = NULL; tag = copyU1(ci); switch (tag) { case JVM_CONSTANT_Class: index1 = copyU2(ci); break; case JVM_CONSTANT_String: index1 = copyU2(ci); break; case JVM_CONSTANT_Fieldref: case JVM_CONSTANT_Methodref: case JVM_CONSTANT_InterfaceMethodref: case JVM_CONSTANT_Integer: case JVM_CONSTANT_Float: case JVM_CONSTANT_NameAndType: index1 = copyU2(ci); index2 = copyU2(ci); break; case JVM_CONSTANT_Long: case JVM_CONSTANT_Double: index1 = copyU4(ci); index2 = copyU4(ci); ++i; /* // these take two CP entries - duh! */ break; case JVM_CONSTANT_Utf8: len = copyU2(ci); index1 = (unsigned short)len; utf8 = (char*)allocate(ci, len+1); read_bytes(ci, (void*)utf8, len); utf8[len] = 0; write_bytes(ci, (void*)utf8, len); break; default: CRW_FATAL(ci, "Unknown constant"); break; } fillin_cpool_entry(ci, ipos, tag, index1, index2, (const char *)utf8, len); } if (ci->call_name != NULL || ci->return_name != NULL) { if ( ci->number != (ci->number & 0x7FFF) ) { ci->class_number_index = add_new_cpool_entry(ci, JVM_CONSTANT_Integer, (ci->number>>16) & 0xFFFF, ci->number & 0xFFFF, NULL, 0); } } if ( ci->tclass_name != NULL ) { ci->tracker_class_index = add_new_class_cpool_entry(ci, ci->tclass_name); } if (memoryTrace && ci->obj_init_name != NULL) { ci->object_init_tracker_index = add_new_method_cpool_entry(ci, ci->tracker_class_index, ci->obj_init_name, ci->obj_init_sig); } if (memoryTrace && ci->newarray_name != NULL) { ci->newarray_tracker_index = add_new_method_cpool_entry(ci, ci->tracker_class_index, ci->newarray_name, ci->newarray_sig); } if (ci->call_name != NULL) { ci->call_tracker_index = add_new_method_cpool_entry(ci, ci->tracker_class_index, ci->call_name, ci->call_sig); } if (ci->call_static_name != NULL) { ci->call_static_tracker_index = add_new_method_cpool_entry(ci, ci->tracker_class_index, ci->call_static_name, ci->call_static_sig); } if (ci->return_name != NULL) { ci->return_tracker_index = add_new_method_cpool_entry(ci, ci->tracker_class_index, ci->return_name, ci->return_sig); } if (ci->return_main_name != NULL) { ci->return_main_tracker_index = add_new_method_cpool_entry(ci, ci->tracker_class_index, ci->return_main_name, ci->return_main_sig); } random_writeU2(ci, cpool_output_position, ci->cpool_count_plus_one); } /* ----------------------------------------------------------------- */ /* Functions that create the bytecodes to inject */ static ByteOffset push_pool_constant_bytecodes(ByteCode *bytecodes, CrwCpoolIndex index) { ByteOffset nbytes = 0; if ( index == (index&0x7F) ) { bytecodes[nbytes++] = (ByteCode)opc_ldc; } else { bytecodes[nbytes++] = (ByteCode)opc_ldc_w; bytecodes[nbytes++] = (ByteCode)((index >> 8) & 0xFF); } bytecodes[nbytes++] = (ByteCode)(index & 0xFF); return nbytes; } static ByteOffset push_short_constant_bytecodes(ByteCode *bytecodes, unsigned number) { ByteOffset nbytes = 0; if ( number <= 5 ) { bytecodes[nbytes++] = (ByteCode)(opc_iconst_0+number); } else if ( number == (number&0x7F) ) { bytecodes[nbytes++] = (ByteCode)opc_bipush; bytecodes[nbytes++] = (ByteCode)(number & 0xFF); } else { bytecodes[nbytes++] = (ByteCode)opc_sipush; bytecodes[nbytes++] = (ByteCode)((number >> 8) & 0xFF); bytecodes[nbytes++] = (ByteCode)(number & 0xFF); } return nbytes; } static jboolean static_method(unsigned access_flags) { if ( access_flags & JVM_ACC_STATIC ) { return JNI_TRUE; } return JNI_FALSE; } static ByteOffset injection_template(MethodImage *mi, ByteCode *bytecodes, ByteOffset max_nbytes, CrwCpoolIndex method_index) { CrwClassImage * ci; ByteOffset nbytes = 0; unsigned max_stack; int add_dup; int add_aload; int push_cnum; int push_mnum; ci = mi->ci; CRW_ASSERT(ci, bytecodes!=NULL); if ( method_index == 0 ) { return 0; } if ( method_index == ci->newarray_tracker_index) { max_stack = mi->max_stack + 1; add_dup = JNI_TRUE; add_aload = JNI_FALSE; push_cnum = JNI_FALSE; push_mnum = JNI_FALSE; } else if ( method_index == ci->object_init_tracker_index) { max_stack = mi->max_stack + 1; add_dup = JNI_FALSE; add_aload = JNI_TRUE; push_cnum = JNI_FALSE; push_mnum = JNI_FALSE; } else if ( method_index == ci->call_tracker_index) { max_stack = mi->max_stack + 2; add_dup = JNI_FALSE; add_aload = JNI_TRUE; push_cnum = JNI_FALSE; push_mnum = JNI_TRUE; } else if ( method_index == ci->call_static_tracker_index) { max_stack = mi->max_stack + 1; add_dup = JNI_FALSE; add_aload = JNI_FALSE; push_cnum = JNI_FALSE; push_mnum = JNI_TRUE; } else if(method_index == ci->return_tracker_index){ //max_stack = mi->max_stack + 1; max_stack = mi->max_stack; add_dup = JNI_FALSE; add_aload = JNI_FALSE; push_cnum = JNI_FALSE; //push_mnum = JNI_TRUE; push_mnum = JNI_FALSE; } else if(method_index == ci->return_main_tracker_index){ //Main sera diferente max_stack = mi->max_stack; add_dup = JNI_FALSE; add_aload = JNI_FALSE; push_cnum = JNI_FALSE; push_mnum = JNI_FALSE; }else{ max_stack = mi->max_stack + 2; add_dup = JNI_FALSE; add_aload = JNI_FALSE; push_cnum = JNI_TRUE; push_mnum = JNI_TRUE; } //printf("esta registrando name=[%s] number=[%d]\n", mi->name, mi->number); if ( add_dup ) { bytecodes[nbytes++] = (ByteCode)opc_dup; } if ( add_aload ) { bytecodes[nbytes++] = (ByteCode)opc_aload_0; } if ( push_cnum ) { if ( ci->number == (ci->number & 0x7FFF) ) { nbytes += push_short_constant_bytecodes(bytecodes+nbytes, ci->number); } else { CRW_ASSERT(ci, ci->class_number_index!=0); nbytes += push_pool_constant_bytecodes(bytecodes+nbytes, ci->class_number_index); } } if ( push_mnum ) { nbytes += push_short_constant_bytecodes(bytecodes+nbytes, mi->number); } bytecodes[nbytes++] = (ByteCode)opc_invokestatic; bytecodes[nbytes++] = (ByteCode)(method_index >> 8); bytecodes[nbytes++] = (ByteCode)method_index; bytecodes[nbytes] = 0; CRW_ASSERT(ci, nbytes mi->new_max_stack ) { mi->new_max_stack = max_stack; } return nbytes; } /* Called to create injection code at entry to a method */ static ByteOffset entry_injection_code(MethodImage *mi, ByteCode *bytecodes, ByteOffset len) { CrwClassImage * ci; ByteOffset nbytes = 0; CRW_ASSERT_MI(mi); ci = mi->ci; if ( mi->object_init_method ) { nbytes = injection_template(mi, bytecodes, len, ci->object_init_tracker_index); } if ( !mi->skip_call_return_sites ) { if(!static_method(mi->access_flags)){ nbytes += injection_template(mi, bytecodes+nbytes, len-nbytes, ci->call_tracker_index); }else{ nbytes += injection_template(mi, bytecodes+nbytes, len-nbytes, ci->call_static_tracker_index); //printf("aqui colocar o codigo para static\n"); } } return nbytes; } /* Called to create injection code before an opcode */ static ByteOffset before_injection_code(MethodImage *mi, ClassOpcode opcode, ByteCode *bytecodes, ByteOffset len) { ByteOffset nbytes = 0; CRW_ASSERT_MI(mi); switch ( opcode ) { case opc_return: case opc_ireturn: case opc_lreturn: case opc_freturn: case opc_dreturn: case opc_areturn: if ( !mi->skip_call_return_sites ) { if(strcmp(mi->name, "main") != 0 ){ //printf("nao eh a main\n"); nbytes = injection_template(mi, bytecodes, len, mi->ci->return_tracker_index); }else{ //printf("metodo main sera gravado diferente id=[%d]\n", mi->number); nbytes = injection_template(mi, bytecodes, len, mi->ci->return_main_tracker_index); } } break; default: break; } return nbytes; } /* Called to create injection code after an opcode */ static ByteOffset after_injection_code(MethodImage *mi, ClassOpcode opcode, ByteCode *bytecodes, ByteOffset len) { CrwClassImage* ci; ByteOffset nbytes; ci = mi->ci; nbytes = 0; CRW_ASSERT_MI(mi); switch ( opcode ) { case opc_new: /* Can't inject here cannot pass around uninitialized object */ break; case opc_newarray: case opc_anewarray: case opc_multianewarray: nbytes = injection_template(mi, bytecodes, len, ci->newarray_tracker_index); break; default: break; } return nbytes; } /* Actually inject the bytecodes */ static void inject_bytecodes(MethodImage *mi, ByteOffset at, ByteCode *bytecodes, ByteOffset len) { Injection injection; CrwClassImage *ci; ci = mi->ci; CRW_ASSERT_MI(mi); CRW_ASSERT(ci, at <= mi->code_len); injection = mi->injections[at]; CRW_ASSERT(ci, len <= LARGEST_INJECTION/2); CRW_ASSERT(ci, injection.len+len <= LARGEST_INJECTION); /* Either start an injection area or concatenate to what is there */ if ( injection.code == NULL ) { CRW_ASSERT(ci, injection.len==0); injection.code = (ByteCode *)allocate_clean(ci, LARGEST_INJECTION+1); } (void)memcpy(injection.code+injection.len, bytecodes, len); injection.len += len; injection.code[injection.len] = 0; mi->injections[at] = injection; ci->injection_count++; } /* ----------------------------------------------------------------- */ /* Method handling functions */ static int numMethod = 0; static MethodImage * method_init(CrwClassImage *ci, unsigned mnum, ByteOffset code_len) { MethodImage * mi; ByteOffset i; mi = (MethodImage*)allocate_clean(ci, (int)sizeof(MethodImage)); mi->ci = ci; mi->name = ci->method_name[mnum]; mi->descr = ci->method_descr[mnum]; mi->code_len = code_len; mi->map = (ByteOffset*)allocate_clean(ci, (int)((code_len+1)*sizeof(ByteOffset))); for(i=0; i<=code_len; i++) { mi->map[i] = i; } mi->widening = (signed char*)allocate_clean(ci, code_len+1); mi->injections = (Injection *)allocate_clean(ci, (int)((code_len+1)*sizeof(Injection))); // mi->number = mnum; // Identificador do metodo mi->number = numMethod; ci->current_mi = mi; // printf("metodo = [%s] num=[%d]\n",mi->name, mi->number); return mi; } static void method_term(MethodImage *mi) { CrwClassImage *ci; ci = mi->ci; CRW_ASSERT_MI(mi); if ( mi->map != NULL ) { deallocate(ci, (void*)mi->map); mi->map = NULL; } if ( mi->widening != NULL ) { deallocate(ci, (void*)mi->widening); mi->widening = NULL; } if ( mi->injections != NULL ) { ByteOffset i; for(i=0; i<= mi->code_len; i++) { if ( mi->injections[i].code != NULL ) { deallocate(ci, (void*)mi->injections[i].code); mi->injections[i].code = NULL; } } deallocate(ci, (void*)mi->injections); mi->injections = NULL; } ci->current_mi = NULL; deallocate(ci, (void*)mi); } static ByteOffset input_code_offset(MethodImage *mi) { CRW_ASSERT_MI(mi); return (ByteOffset)(mi->ci->input_position - mi->start_of_input_bytecodes); } static void rewind_to_beginning_of_input_bytecodes(MethodImage *mi) { CRW_ASSERT_MI(mi); mi->ci->input_position = mi->start_of_input_bytecodes; } /* Starting at original byte position 'at', add 'offset' to it's new * location. This may be a negative value. * NOTE: That this map is not the new bytecode location of the opcode * but the new bytecode location that should be used when * a goto or jump instruction was targeting the old bytecode * location. */ static void adjust_map(MethodImage *mi, ByteOffset at, ByteOffset offset) { ByteOffset i; CRW_ASSERT_MI(mi); for (i = at; i <= mi->code_len; ++i) { mi->map[i] += offset; } } static void widen(MethodImage *mi, ByteOffset at, ByteOffset len) { int delta; CRW_ASSERT(mi->ci, at <= mi->code_len); delta = len - mi->widening[at]; /* Adjust everything from the current input location by delta */ adjust_map(mi, input_code_offset(mi), delta); /* Mark at beginning of instruction */ mi->widening[at] = (signed char)len; } static void verify_opc_wide(CrwClassImage *ci, ClassOpcode wopcode) { switch (wopcode) { case opc_aload: case opc_astore: case opc_fload: case opc_fstore: case opc_iload: case opc_istore: case opc_lload: case opc_lstore: case opc_dload: case opc_dstore: case opc_ret: case opc_iinc: break; default: CRW_FATAL(ci, "Invalid opcode supplied to opc_wide"); break; } } static unsigned opcode_length(CrwClassImage *ci, ClassOpcode opcode) { /* Define array that holds length of an opcode */ static unsigned char _opcode_length[opc_MAX+1] = JVM_OPCODE_LENGTH_INITIALIZER; if ( opcode > opc_MAX ) { CRW_FATAL(ci, "Invalid opcode supplied to opcode_length()"); } return _opcode_length[opcode]; } /* Walk one instruction and inject instrumentation */ static void inject_for_opcode(MethodImage *mi) { CrwClassImage * ci; ClassOpcode opcode; int pos; CRW_ASSERT_MI(mi); ci = mi->ci; pos = input_code_offset(mi); opcode = readU1(ci); if (opcode == opc_wide) { ClassOpcode wopcode; wopcode = readU1(ci); /* lvIndex not used */ (void)readU2(ci); verify_opc_wide(ci, wopcode); if ( wopcode==opc_iinc ) { (void)readU1(ci); (void)readU1(ci); } } else { ByteCode bytecodes[LARGEST_INJECTION+1]; int header; int instr_len; int low; int high; int npairs; ByteOffset len; /* Get bytecodes to inject before this opcode */ len = before_injection_code(mi, opcode, bytecodes, (int)sizeof(bytecodes)); if ( len > 0 ) { inject_bytecodes(mi, pos, bytecodes, len); /* Adjust map after processing this opcode */ } /* Process this opcode */ switch (opcode) { case opc_tableswitch: header = NEXT_4BYTE_BOUNDARY(pos); skip(ci, header - (pos+1)); (void)readU4(ci); low = readU4(ci); high = readU4(ci); skip(ci, (high+1-low) * 4); break; case opc_lookupswitch: header = NEXT_4BYTE_BOUNDARY(pos); skip(ci, header - (pos+1)); (void)readU4(ci); npairs = readU4(ci); skip(ci, npairs * 8); break; default: instr_len = opcode_length(ci, opcode); skip(ci, instr_len-1); break; } /* Get position after this opcode is processed */ pos = input_code_offset(mi); /* Adjust for any before_injection_code() */ if ( len > 0 ) { /* Adjust everything past this opcode. * Why past it? Because we want any jumps to this bytecode loc * to go to the injected code, not where the opcode * was moved too. * Consider a 'return' opcode that is jumped too. * NOTE: This may not be correct in all cases, but will * when we are only dealing with non-variable opcodes * like the return opcodes. Be careful if the * before_injection_code() changes to include other * opcodes that have variable length. */ adjust_map(mi, pos, len); } /* Get bytecodes to inject after this opcode */ len = after_injection_code(mi, opcode, bytecodes, (int)sizeof(bytecodes)); if ( len > 0 ) { inject_bytecodes(mi, pos, bytecodes, len); /* Adjust for any after_injection_code() */ adjust_map(mi, pos, len); } } } /* Map original bytecode location to it's new location. (See adjust_map()). */ static ByteOffset method_code_map(MethodImage *mi, ByteOffset pos) { CRW_ASSERT_MI(mi); CRW_ASSERT(mi->ci, pos <= mi->code_len); return mi->map[pos]; } static int adjust_instruction(MethodImage *mi) { CrwClassImage * ci; ClassOpcode opcode; int pos; int new_pos; CRW_ASSERT_MI(mi); ci = mi->ci; pos = input_code_offset(mi); new_pos = method_code_map(mi,pos); opcode = readU1(ci); if (opcode == opc_wide) { ClassOpcode wopcode; wopcode = readU1(ci); /* lvIndex not used */ (void)readU2(ci); verify_opc_wide(ci, wopcode); if ( wopcode==opc_iinc ) { (void)readU1(ci); (void)readU1(ci); } } else { int widened; int header; int newHeader; int low; int high; int new_pad; int old_pad; int delta; int new_delta; int delta_pad; int npairs; int instr_len; switch (opcode) { case opc_tableswitch: widened = mi->widening[pos]; header = NEXT_4BYTE_BOUNDARY(pos); newHeader = NEXT_4BYTE_BOUNDARY(new_pos); skip(ci, header - (pos+1)); delta = readU4(ci); low = readU4(ci); high = readU4(ci); skip(ci, (high+1-low) * 4); new_pad = newHeader - new_pos; old_pad = header - pos; delta_pad = new_pad - old_pad; if (widened != delta_pad) { widen(mi, pos, delta_pad); return 0; } break; case opc_lookupswitch: widened = mi->widening[pos]; header = NEXT_4BYTE_BOUNDARY(pos); newHeader = NEXT_4BYTE_BOUNDARY(new_pos); skip(ci, header - (pos+1)); delta = readU4(ci); npairs = readU4(ci); skip(ci, npairs * 8); new_pad = newHeader - new_pos; old_pad = header - pos; delta_pad = new_pad - old_pad; if (widened != delta_pad) { widen(mi, pos, delta_pad); return 0; } break; case opc_jsr: case opc_goto: case opc_ifeq: case opc_ifge: case opc_ifgt: case opc_ifle: case opc_iflt: case opc_ifne: case opc_if_icmpeq: case opc_if_icmpne: case opc_if_icmpge: case opc_if_icmpgt: case opc_if_icmple: case opc_if_icmplt: case opc_if_acmpeq: case opc_if_acmpne: case opc_ifnull: case opc_ifnonnull: widened = mi->widening[pos]; delta = readS2(ci); if (widened == 0) { new_delta = method_code_map(mi,pos+delta) - new_pos; if ((new_delta < -32768) || (new_delta > 32767)) { switch (opcode) { case opc_jsr: case opc_goto: widen(mi, pos, 2); break; default: widen(mi, pos, 5); break; } return 0; } } break; case opc_jsr_w: case opc_goto_w: (void)readU4(ci); break; default: instr_len = opcode_length(ci, opcode); skip(ci, instr_len-1); break; } } return 1; } static void write_instruction(MethodImage *mi) { CrwClassImage * ci; ClassOpcode opcode; ByteOffset new_code_len; int pos; int new_pos; CRW_ASSERT_MI(mi); ci = mi->ci; pos = input_code_offset(mi); new_pos = method_code_map(mi,pos); new_code_len = mi->injections[pos].len; if (new_code_len > 0) { write_bytes(ci, (void*)mi->injections[pos].code, new_code_len); } opcode = readU1(ci); if (opcode == opc_wide) { ClassOpcode wopcode; writeU1(ci, opcode); wopcode = copyU1(ci); /* lvIndex not used */ (void)copyU2(ci); verify_opc_wide(ci, wopcode); if ( wopcode==opc_iinc ) { (void)copyU1(ci); (void)copyU1(ci); } } else { ClassOpcode new_opcode; int header; int newHeader; int low; int high; int i; int npairs; int widened; int instr_len; int delta; int new_delta; switch (opcode) { case opc_tableswitch: header = NEXT_4BYTE_BOUNDARY(pos); newHeader = NEXT_4BYTE_BOUNDARY(new_pos); skip(ci, header - (pos+1)); delta = readU4(ci); new_delta = method_code_map(mi,pos+delta) - new_pos; low = readU4(ci); high = readU4(ci); writeU1(ci, opcode); for (i = new_pos+1; i < newHeader; ++i) { writeU1(ci, 0); } writeU4(ci, new_delta); writeU4(ci, low); writeU4(ci, high); for (i = low; i <= high; ++i) { delta = readU4(ci); new_delta = method_code_map(mi,pos+delta) - new_pos; writeU4(ci, new_delta); } break; case opc_lookupswitch: header = NEXT_4BYTE_BOUNDARY(pos); newHeader = NEXT_4BYTE_BOUNDARY(new_pos); skip(ci, header - (pos+1)); delta = readU4(ci); new_delta = method_code_map(mi,pos+delta) - new_pos; npairs = readU4(ci); writeU1(ci, opcode); for (i = new_pos+1; i < newHeader; ++i) { writeU1(ci, 0); } writeU4(ci, new_delta); writeU4(ci, npairs); for (i = 0; i< npairs; ++i) { unsigned match = readU4(ci); delta = readU4(ci); new_delta = method_code_map(mi,pos+delta) - new_pos; writeU4(ci, match); writeU4(ci, new_delta); } break; case opc_jsr: case opc_goto: case opc_ifeq: case opc_ifge: case opc_ifgt: case opc_ifle: case opc_iflt: case opc_ifne: case opc_if_icmpeq: case opc_if_icmpne: case opc_if_icmpge: case opc_if_icmpgt: case opc_if_icmple: case opc_if_icmplt: case opc_if_acmpeq: case opc_if_acmpne: case opc_ifnull: case opc_ifnonnull: widened = mi->widening[pos]; delta = readS2(ci); new_delta = method_code_map(mi,pos+delta) - new_pos; new_opcode = opcode; if (widened == 0) { writeU1(ci, opcode); writeU2(ci, new_delta); } else if (widened == 2) { switch (opcode) { case opc_jsr: new_opcode = opc_jsr_w; break; case opc_goto: new_opcode = opc_jsr_w; break; default: CRW_FATAL(ci, "unexpected opcode"); break; } writeU1(ci, new_opcode); writeU4(ci, new_delta); } else if (widened == 5) { switch (opcode) { case opc_ifeq: new_opcode = opc_ifne; break; case opc_ifge: new_opcode = opc_iflt; break; case opc_ifgt: new_opcode = opc_ifle; break; case opc_ifle: new_opcode = opc_ifgt; break; case opc_iflt: new_opcode = opc_ifge; break; case opc_ifne: new_opcode = opc_ifeq; break; case opc_if_icmpeq: new_opcode = opc_if_icmpne; break; case opc_if_icmpne: new_opcode = opc_if_icmpeq; break; case opc_if_icmpge: new_opcode = opc_if_icmplt; break; case opc_if_icmpgt: new_opcode = opc_if_icmple; break; case opc_if_icmple: new_opcode = opc_if_icmpgt; break; case opc_if_icmplt: new_opcode = opc_if_icmpge; break; case opc_if_acmpeq: new_opcode = opc_if_acmpne; break; case opc_if_acmpne: new_opcode = opc_if_acmpeq; break; case opc_ifnull: new_opcode = opc_ifnonnull; break; case opc_ifnonnull: new_opcode = opc_ifnull; break; default: CRW_FATAL(ci, "Unexpected opcode"); break; } writeU1(ci, new_opcode); /* write inverse branch */ writeU2(ci, 3 + 5); /* beyond if and goto_w */ writeU1(ci, opc_goto_w); /* add a goto_w */ writeU4(ci, new_delta); /* write new and wide delta */ } else { CRW_FATAL(ci, "Unexpected widening"); } break; case opc_jsr_w: case opc_goto_w: delta = readU4(ci); new_delta = method_code_map(mi,pos+delta) - new_pos; writeU1(ci, opcode); writeU4(ci, new_delta); break; default: instr_len = opcode_length(ci, opcode); writeU1(ci, opcode); copy(ci, instr_len-1); break; } } } static void method_inject_and_write_code(MethodImage *mi) { ByteCode bytecodes[LARGEST_INJECTION+1]; ByteOffset len; CRW_ASSERT_MI(mi); /* Do injections */ rewind_to_beginning_of_input_bytecodes(mi); len = entry_injection_code(mi, bytecodes, (int)sizeof(bytecodes)); if ( len > 0 ) { int pos; pos = 0; inject_bytecodes(mi, pos, bytecodes, len); /* Adjust pos 0 to map to new pos 0, you never want to * jump into this entry code injection. So the new pos 0 * will be past this entry_injection_code(). */ adjust_map(mi, pos, len); /* Inject before behavior */ } while (input_code_offset(mi) < mi->code_len) { inject_for_opcode(mi); } /* Adjust instructions */ rewind_to_beginning_of_input_bytecodes(mi); while (input_code_offset(mi) < mi->code_len) { if (!adjust_instruction(mi)) { rewind_to_beginning_of_input_bytecodes(mi); } } /* Write new instructions */ rewind_to_beginning_of_input_bytecodes(mi); while (input_code_offset(mi) < mi->code_len) { write_instruction(mi); } } static void copy_attribute(CrwClassImage *ci) { int len; (void)copyU2(ci); len = copyU4(ci); copy(ci, len); } static void copy_attributes(CrwClassImage *ci) { unsigned i; unsigned count; count = copyU2(ci); for (i = 0; i < count; ++i) { copy_attribute(ci); } } static void copy_all_fields(CrwClassImage *ci) { unsigned i; unsigned count; count = copyU2(ci); for (i = 0; i < count; ++i) { /* access, name, descriptor */ copy(ci, 6); copy_attributes(ci); } } static void write_line_table(MethodImage *mi) { unsigned i; unsigned count; CrwClassImage * ci; CRW_ASSERT_MI(mi); ci = mi->ci; (void)copyU4(ci); count = copyU2(ci); for(i=0; ici; (void)copyU4(ci); count = copyU2(ci); for(i=0; ici; count = copyU2(ci); for(i=0; ici; name_index = copyU2(ci); if ( attribute_match(ci, name_index, "LineNumberTable") ) { write_line_table(mi); } else if ( attribute_match(ci, name_index, "LocalVariableTable") ) { write_var_table(mi); } else if ( attribute_match(ci, name_index, "LocalVariableTypeTable") ) { write_var_table(mi); /* Exact same format as the LocalVariableTable */ } else { unsigned len; len = copyU4(ci); copy(ci, len); } } static int is_init_method(const char *name) { if ( name!=NULL && strcmp(name,"")==0 ) { return JNI_TRUE; } return JNI_FALSE; } static int is_clinit_method(const char *name) { if ( name!=NULL && strcmp(name,"")==0 ) { return JNI_TRUE; } return JNI_FALSE; } static int is_finalize_method(const char *name) { if ( name!=NULL && strcmp(name,"finalize")==0 ) { return JNI_TRUE; } return JNI_FALSE; } static int skip_method(CrwClassImage *ci, const char *name, unsigned access_flags, ByteOffset code_len, int system_class, jboolean *pskip_call_return_sites) { *pskip_call_return_sites = JNI_FALSE; if ( system_class ) { if ( code_len == 1 && is_init_method(name) ) { return JNI_TRUE; } else if ( code_len == 1 && is_finalize_method(name) ) { return JNI_TRUE; } else if ( is_clinit_method(name) ) { return JNI_TRUE; } else if ( ci->is_thread_class && strcmp(name,"currentThread")==0 ) { return JNI_TRUE; } /* if ( access_flags & JVM_ACC_PRIVATE ) { *pskip_call_return_sites = JNI_TRUE; } */ } return JNI_FALSE; } /* Process all code attributes */ static void method_write_bytecodes(CrwClassImage *ci, unsigned mnum, unsigned access_flags) { CrwPosition output_attr_len_position; CrwPosition output_max_stack_position; CrwPosition output_code_len_position; CrwPosition start_of_output_bytecodes; unsigned i; unsigned attr_len; unsigned max_stack; ByteOffset code_len; ByteOffset new_code_len; unsigned attr_count; unsigned new_attr_len; MethodImage * mi; jboolean object_init_method; jboolean skip_call_return_sites; CRW_ASSERT_CI(ci); /* Attribute Length */ output_attr_len_position = ci->output_position; attr_len = copyU4(ci); /* Max Stack */ output_max_stack_position = ci->output_position; max_stack = copyU2(ci); /* Max Locals */ (void)copyU2(ci); /* Code Length */ output_code_len_position = ci->output_position; code_len = copyU4(ci); start_of_output_bytecodes = ci->output_position; // Aqui eh o printf que eu uso mais // printf("No metodo=[ %s ] com mnum=[ %d ] class=[%s] classNumber=[%d]\n", ci->method_name[mnum], mnum, ci->name, ci->number); if(methodsTrace){ if((*(ci->trace_options))() || all || (methods != NULL && list_find(methods, (void *)ci->method_name[mnum])) || (allMethods != NULL && list_find(allMethods, (void *)ci->method_name[mnum])) ){ if((strcmp(ci->name, "java/lang/ClassLoader") == 0 && strcmp(ci->method_name[mnum], "findNative") == 0) || (strcmp(ci->name, "java/util/Vector") == 0 && (strcmp(ci->method_name[mnum], "elementAt") == 0 || strcmp(ci->method_name[mnum], "size") == 0))){ //printf("id=[%d] name=[%s] nome da class=[%s]\n",numMethod, ci->method_name[mnum], ci->name); copy(ci, attr_len - (2+2+4)); return; } trace_event_method_load(numMethod, (char *)ci->method_name[mnum], access_flags, ci->number); //printf("id=[%d] name=[%s] nome da class=[%s]\n",numMethod, ci->method_name[mnum], ci->name); }else{ //printf("Metodo nao registrado=[%s] da class[%s]\n",ci->method_name[mnum], ci->name); copy(ci, attr_len - (2+2+4)); return; } } /* Some methods should not be instrumented */ object_init_method = JNI_FALSE; skip_call_return_sites = JNI_FALSE; if (ci->is_object_class && is_init_method(ci->method_name[mnum]) && strcmp(ci->method_descr[mnum],"()V")==0 ){ // if ( is_init_method(ci->method_name[mnum]) || is_clinit_method(ci->method_name[mnum])) { if(!memoryTrace){ copy(ci, attr_len - (2+2+4)); return; } object_init_method = JNI_TRUE; skip_call_return_sites = JNI_TRUE; // } else if ( skip_method(ci, ci->method_name[mnum], access_flags, // code_len, ci->system_class, &skip_call_return_sites) ) { } else if ( !methodsTrace || skip_method(ci, ci->method_name[mnum], access_flags, code_len, ci->system_class, &skip_call_return_sites) || is_init_method(ci->method_name[mnum]) || is_clinit_method(ci->method_name[mnum])) { /* Copy remainder minus already copied, the U2 max_stack, * U2 max_locals, and U4 code_length fields have already * been processed. */ copy(ci, attr_len - (2+2+4)); return; // } else if ( is_init_method(ci->method_name[mnum]) || is_clinit_method(ci->method_name[mnum])) { // if(numMethod == 3797 || numMethod == 3800){ // printf("id=[%d] name=[%s] nome da class=[%s]\n",numMethod, ci->method_name[mnum], ci->name); // copy(ci, attr_len - (2+2+4)); // return; // } }//else if((strcmp(ci->name, "SimpleThread")==0 || strcmp(ci->name, "MyThread")==0 || strcmp(ci->name, "Teste")==0) && is_init_method(ci->method_name[mnum])){ //printf("codelen=[%d] No metodo=[ %s ] com mnum=[ %d ] class=[%s] classNumber=[%d]\n", code_len, ci->method_name[mnum], mnum, ci->name, ci->number); // copy(ci, attr_len - (2+2+4)); // return; // } /* Start Injection */ mi = method_init(ci, mnum, code_len); mi->object_init_method = object_init_method; mi->access_flags = access_flags; mi->skip_call_return_sites = skip_call_return_sites; /* Save the current position as the start of the input bytecodes */ mi->start_of_input_bytecodes = ci->input_position; /* The max stack may increase */ mi->max_stack = max_stack; mi->new_max_stack = max_stack; /* Adjust all code offsets */ method_inject_and_write_code(mi); /* Fix up code length */ new_code_len = (int)(ci->output_position - start_of_output_bytecodes); random_writeU4(ci, output_code_len_position, new_code_len); /* Fixup max stack */ CRW_ASSERT(ci, mi->new_max_stack <= 0xFFFF); random_writeU2(ci, output_max_stack_position, mi->new_max_stack); /* Copy exception table */ method_write_exception_table(mi); /* Copy code attributes */ attr_count = copyU2(ci); for (i = 0; i < attr_count; ++i) { method_write_code_attribute(mi); } /* Fix up attribute length */ new_attr_len = (int)(ci->output_position - (output_attr_len_position + 4)); random_writeU4(ci, output_attr_len_position, new_attr_len); /* Free method data */ method_term(mi); mi = NULL; } static void method_write(CrwClassImage *ci, unsigned mnum) { unsigned i; unsigned access_flags; CrwCpoolIndex name_index; CrwCpoolIndex descr_index; unsigned attr_count; access_flags = copyU2(ci); name_index = copyU2(ci); ci->method_name[mnum] = cpool_entry(ci, name_index).ptr; descr_index = copyU2(ci); ci->method_descr[mnum] = cpool_entry(ci, descr_index).ptr; attr_count = copyU2(ci); for (i = 0; i < attr_count; ++i) { CrwCpoolIndex name_index; name_index = copyU2(ci); if ( attribute_match(ci, name_index, "Code") ) { method_write_bytecodes(ci, mnum, access_flags); } else { unsigned len; len = copyU4(ci); copy(ci, len); } } } static void method_write_all(CrwClassImage *ci) { unsigned i; unsigned count; count = copyU2(ci); ci->method_count = count; if ( count > 0 ) { ci->method_name = (const char **)allocate_clean(ci, count*(int)sizeof(const char*)); ci->method_descr = (const char **)allocate_clean(ci, count*(int)sizeof(const char*)); } for (i = 0; i < count; ++i) { method_write(ci, i); numMethod++; } } /* ------------------------------------------------------------------- */ /* Cleanup function. */ static void cleanup(CrwClassImage *ci) { CRW_ASSERT_CI(ci); if ( ci->name != NULL ) { deallocate(ci, (void*)ci->name); ci->name = NULL; } if ( ci->method_name != NULL ) { deallocate(ci, (void*)ci->method_name); ci->method_name = NULL; } if ( ci->method_descr != NULL ) { deallocate(ci, (void*)ci->method_descr); ci->method_descr = NULL; } if ( ci->cpool != NULL ) { CrwCpoolIndex i; for(i=0; icpool_count_plus_one; i++) { if ( ci->cpool[i].ptr != NULL ) { deallocate(ci, (void*)(ci->cpool[i].ptr)); ci->cpool[i].ptr = NULL; } } deallocate(ci, (void*)ci->cpool); ci->cpool = NULL; } } static jboolean skip_class(unsigned access_flags) { if ( access_flags & JVM_ACC_INTERFACE ) { return JNI_TRUE; } return JNI_FALSE; } static long inject_class(struct CrwClassImage *ci, int system_class, unsigned char *buf, long buf_len) { CrwConstantPoolEntry cs; CrwCpoolIndex this_class; CrwCpoolIndex super_class; unsigned magic; unsigned interface_count; CRW_ASSERT_CI(ci); CRW_ASSERT(ci, buf!=NULL); CRW_ASSERT(ci, buf_len!=0); // CRW_ASSERT(ci, strchr(tclass_name,'.')==NULL); /* internal qualified name */ /*####################################################################*/ ci->injection_count = 0; ci->system_class = system_class; /*####################################################################*/ ci->tclass_name = CLASS_NAME; ci->tclass_sig = CLASS_SIG; /*####################################################################*/ ci->call_name = CALL_NAME; ci->call_sig = CALL_SIG; /*####################################################################*/ ci->call_static_name = CALL_STATIC_NAME; ci->call_static_sig = CALL_STATIC_SIG; /*####################################################################*/ ci->return_name = RETURN_NAME; ci->return_sig = RETURN_SIG; /*####################################################################*/ ci->return_main_name = RETURN_MAIN_NAME; ci->return_main_sig = RETURN_MAIN_SIG; /*####################################################################*/ ci->obj_init_name = OBJECT_INIT_NAME; ci->obj_init_sig = OBJECT_INIT_SIG; /*####################################################################*/ ci->newarray_name = NEWARRAY_NAME; ci->newarray_sig = NEWARRAY_SIG; /*####################################################################*/ ci->output = buf; ci->output_len = buf_len; /*####################################################################*/ magic = copyU4(ci); CRW_ASSERT(ci, magic==0xCAFEBABE); if ( magic != 0xCAFEBABE ) { return (long)0; } /* minor version number not used */ (void)copyU2(ci); /* major version number not used */ (void)copyU2(ci); cpool_setup(ci); ci->access_flags = copyU2(ci); if ( skip_class(ci->access_flags) ) { return (long)0; } this_class = copyU2(ci); cs = cpool_entry(ci, (CrwCpoolIndex)(cpool_entry(ci, this_class).index1)); if ( ci->name == NULL ) { ci->name = duplicate(ci, cs.ptr, cs.len); CRW_ASSERT(ci, strchr(ci->name,'.')==NULL); /* internal qualified name */ } CRW_ASSERT(ci, (int)strlen(ci->name)==cs.len && strncmp(ci->name, cs.ptr, cs.len)==0); super_class = copyU2(ci); if ( super_class == 0 ) { //printf("aqui dentro do if super_class...\n"); ci->is_object_class = JNI_TRUE; CRW_ASSERT(ci, strcmp(ci->name,"java/lang/Object")==0); } interface_count = copyU2(ci); copy(ci, interface_count * 2); copy_all_fields(ci); method_write_all(ci); if ( ci->injection_count == 0 ) { return (long)0; } copy_attributes(ci); return (long)ci->output_position; } void list_all_methods() { hash_data_t *data_list; data_list = hash_locate(&h_options, (hash_key_t)"*"); if(data_list != NULL){ allMethods = *(list_t **)data_list; } } void list_methods(const char *name) { hash_data_t *data_list; data_list = hash_locate(&h_options, (hash_key_t)name); if(data_list != NULL){ methods = *(list_t **)data_list; } } /* ------------------------------------------------------------------- */ /* Exported interfaces */ JNIEXPORT void JNICALL java_crw_demo(unsigned class_number, const char *name, const unsigned char *file_image, long file_len, int system_class, unsigned char **pnew_file_image, long *pnew_file_len, MethodTraceOptions trace_options) { CrwClassImage ci; long max_length; long new_length; void *new_image; /* Initial setup of the CrwClassImage structure */ (void)memset(&ci, 0, (int)sizeof(CrwClassImage)); ci.trace_options = trace_options; if((*(ci.trace_options))() == false){ allMethods = NULL; methods = NULL; list_all_methods(); list_methods(name); all = false; if(methods != NULL){ all = list_find(methods, (void *)"*"); } } if ( file_len==0 ) { return; } /* Do some more interface error checks */ if ( file_image == NULL ) { CRW_FATAL(&ci, "file_image == NULL"); } if ( file_len < 0 ) { CRW_FATAL(&ci, "file_len < 0"); } /* Finish setup the CrwClassImage structure */ ci.is_thread_class = JNI_FALSE; if ( name != NULL ) { CRW_ASSERT(&ci, strchr(name,'.')==NULL); /* internal qualified name */ ci.name = duplicate(&ci, name, (int)strlen(name)); if ( strcmp(name, "java/lang/Thread")==0 ) { ci.is_thread_class = JNI_TRUE; } } ci.number = class_number; ci.input = file_image; ci.input_len = file_len; /* Do the injection */ max_length = file_len*2 + 512; /* Twice as big + 512 */ new_image = allocate(&ci, (int)max_length); new_length = inject_class(&ci, system_class, new_image, max_length); /* Dispose or shrink the space to be returned. */ if ( new_length == 0 ) { deallocate(&ci, (void*)new_image); new_image = NULL; } else { new_image = (void*)reallocate(&ci, (void*)new_image, (int)new_length); } /* Return the new class image */ *pnew_file_image = (unsigned char *)new_image; *pnew_file_len = (long)new_length; /* Cleanup before we leave. */ cleanup(&ci); } /* Return the classname for this class which is inside the classfile image. */ JNIEXPORT char * JNICALL java_crw_demo_classname(const unsigned char *file_image, long file_len) { CrwClassImage ci; CrwConstantPoolEntry cs; CrwCpoolIndex this_class; unsigned magic; char * name; name = NULL; if ( file_len==0 || file_image==NULL ) { return name; } /* The only fields we need filled in are the image pointer and the error * handler. * By not adding an output buffer pointer, no output is created. */ (void)memset(&ci, 0, (int)sizeof(CrwClassImage)); ci.input = file_image; ci.input_len = file_len; /* Read out the bytes from the classfile image */ magic = readU4(&ci); /* magic number */ CRW_ASSERT(&ci, magic==0xCAFEBABE); if ( magic != 0xCAFEBABE ) { return name; } (void)readU2(&ci); /* minor version number */ (void)readU2(&ci); /* major version number */ /* Read in constant pool. Since no output setup, writes are NOP's */ cpool_setup(&ci); (void)readU2(&ci); /* access flags */ this_class = readU2(&ci); /* 'this' class */ /* Get 'this' constant pool entry */ cs = cpool_entry(&ci, (CrwCpoolIndex)(cpool_entry(&ci, this_class).index1)); /* Duplicate the name */ name = (char *)duplicate(&ci, cs.ptr, cs.len); /* Cleanup before we leave. */ cleanup(&ci); /* Return malloc space */ return name; } Paje-1.98/Tracers/JRastro/src/JRastro_list_func.c0000664000175000017500000000543611674062007021641 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" void list_copy_object(list_element_t *element, list_data_t data) { list_null(element); list_null(data); element->data = (void *)malloc(sizeof(list_object_t)); ((list_object_t*)element->data)->jvm = ((list_object_t*)data)->jvm; ((list_object_t*)element->data)->idObject = ((list_object_t*)data)->idObject; //element->data = memcpy(element->data, data, sizeof(list_object_t)); } void list_copy_string_class(list_element_t *element, list_data_t data) { list_null(element); list_null(data); element->data = (void *)malloc(sizeof(list_class_t)); ((list_class_t*)element->data)->className = (void *)malloc((sizeof(char) * strlen((char *)((list_class_t*)data)->className)) + 1); ((list_class_t*)element->data)->jvm = ((list_class_t*)data)->jvm; ((list_class_t*)element->data)->className = strcpy(((list_class_t*)element->data)->className, ((list_class_t*)data)->className); } bool list_cmp_object(list_data_t data, list_data_t data2) { list_null(data); list_null(data2); list_object_t *obj = (list_object_t*) data; list_object_t *obj2 = (list_object_t*) data2; if(obj->jvm == obj2->jvm && obj->idObject == obj2->idObject){ return true; } return false; } bool list_cmp_string_class(list_data_t data, list_data_t data2) { list_null(data); list_null(data2); list_class_t *obj = (list_class_t*) data; list_class_t *obj2 = (list_class_t*) data2; if(obj->jvm == obj2->jvm && strcmp(obj->className, obj2->className) == 0){ return true; } return false; } void list_destroy_string_class(position_t pos) { list_null(pos); list_class_t *obj = (list_class_t*) pos->data; free(obj->className); free(pos->data); pos->data=NULL; pos->next=NULL; pos->prev=NULL; } Paje-1.98/Tracers/JRastro/src/JRastro_basic.c0000664000175000017500000000672611674062007020737 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" /*Funcao que descreve nome do erro*/ void jrst_describe_error(jvmtiEnv *jvmtiLocate, jvmtiError error) { char *describe; jvmtiError err; describe=NULL; err=(*jvmtiLocate)->GetErrorName(jvmtiLocate, error, &describe); if(err != JVMTI_ERROR_NONE){ printf("\n[JRastro ERROR]: Cannot Get Error:(%d) Name\n",error); return; } printf("\n[JRastro ERROR](%d): <%s>\n",error,(describe==NULL?"Unknown":describe)); err=(*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)describe); if(err != JVMTI_ERROR_NONE){ printf("\n[JRastro ERROR]: Cannot Deallocate\n"); return; } } /*Funcao que verifica se exite erro no retorno da JVMTI*/ void jrst_check_error(jvmtiEnv *jvmtiLocate, jvmtiError error, const char *frase) { if (error!= JVMTI_ERROR_NONE){ jrst_describe_error(jvmtiLocate,error); if(frase != NULL){ printf("\t%s\n",frase); } exit(1); } } /*Entra na regiao critica*/ void jrst_enter_critical_section(jvmtiEnv *jvmtiLocate, jrawMonitorID monitor) { jvmtiError error; error=(*jvmtiLocate)->RawMonitorEnter(jvmtiLocate, monitor); jrst_check_error(jvmtiLocate, error, "Cannot enter with raw monitor"); } /*Sai da regiao critica*/ void jrst_exit_critical_section(jvmtiEnv *jvmtiLocate, jrawMonitorID monitor) { jvmtiError error; error=(*jvmtiLocate)->RawMonitorExit(jvmtiLocate, monitor); jrst_check_error(jvmtiLocate, error, "Cannot exit with raw monitor"); } /*Devolve o nome da Thread desejada*/ void jrst_get_thread_name(jvmtiEnv *jvmtiLocate, jthread thread, char *name, int numMax) { jvmtiThreadInfo infoThread; jvmtiError error; (void)memset(&infoThread, 0, sizeof(infoThread)); error=(*jvmtiLocate)->GetThreadInfo(jvmtiLocate, thread, &infoThread); jrst_check_error(jvmtiLocate, error, "Cannot get Thread Info"); if(infoThread.name != NULL){ int len; len = (int)strlen(infoThread.name); if(len < numMax){ (void)strcpy(name, infoThread.name); }else { (void)strcpy(name,"Unknown"); } error=(*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)infoThread.name); jrst_check_error(jvmtiLocate, error,"Cannot deallocate memory"); return; } (void)strcpy(name,"Unknown"); } bool jrst_trace_class(char *className) { if(tracesAll || hash_find(&h_options, "*") || hash_find(&h_options, className)){ return true; } return false; } bool jrst_trace_methods() { if(tracesAll){ return true; } return false; } /* bool jrst_trace(void *key) { printf("jrst_trace\n"); if(hash_find(&h, key)){ return true; } return false; } */ Paje-1.98/Tracers/JRastro/src/JRastro_read.c0000664000175000017500000003372711674062007020572 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" FILE *file; rst_file_t data; rst_event_t ev; static bool read=false; timestamp_t first; hash_t h_class; hash_t h_method; hash_t h_mem; hash_data_t *class_name; hash_data_t *class_number; hash_data_t *data_mem; list_t monitores; int count = 0; void jrst_constant(FILE *file) { fprintf(file,"1\tPJ\t0\t\"Program Java\"\n"); fprintf(file,"1\tJVM\tPJ\t\"Java Virtual Machine\"\n"); fprintf(file,"1\tT\tJVM\t\"Thread\"\n"); fprintf(file,"1\tM\tJVM\t\"Monitor\"\n"); fprintf(file,"2\tE\tT\t\"MonitorE\"\n"); fprintf(file,"2\tEX\tT\t\"ExceptionE\"\n"); fprintf(file,"3\tJS\tJVM\t\"JVM State\"\n"); fprintf(file,"3\tS\tT\t\"Metodo\"\n"); fprintf(file,"3\tMS\tM\t\"Monitor State\"\n"); fprintf(file,"4\tMEM\tJVM\t\"Memory Allocation\"\n"); fprintf(file,"5\tLTM\tJVM\tT\tM\t\"Thread blocked\"\n"); fprintf(file,"5\tLMT\tJVM\tM\tT\t\"Thread unblocked\"\n"); fprintf(file,"6\texe\tJS\t\"Executing\"\n"); fprintf(file,"6\tgc\tJS\t\"Garbage Collection\"\n"); fprintf(file,"6\tlock\tS\t\"Thread locked\"\n"); fprintf(file,"6\tlock\tMS\t\"Monitor locked\"\n"); fprintf(file,"6\tfree\tMS\t\"Monitor free\"\n"); fprintf(file,"6\tme\tE\t\"Monitor enter\"\n"); fprintf(file,"6\tmed\tE\t\"Monitor entered\"\n"); fprintf(file,"6\tmw\tE\t\"Monitor wait\"\n"); fprintf(file,"6\tmwd\tE\t\"Monitor waited\"\n"); fprintf(file,"6\tlb\tLTM\t\"Thread blocked\"\n"); fprintf(file,"6\tlub\tLMT\t\"Thread unblocked\"\n"); fprintf(file,"6\tex\tEX\t\"Start Exception\"\n"); fprintf(file,"6\texpop\tEX\t\"Frame pop by Exception\"\n"); fprintf(file,"7\t0.0\tpj\tPJ\t0\t\"Programa Java\"\n"); } void jrst_access_flags(FILE *file, unsigned int flags) { if(flags & JVM_ACC_PUBLIC){ fprintf(file," PUBLIC"); } if(flags & JVM_ACC_PRIVATE){ fprintf(file," PRIVATE"); } if(flags & JVM_ACC_PROTECTED){ fprintf(file," PROTECTED"); } if(flags & JVM_ACC_STATIC){ fprintf(file," STATIC"); } if(flags & JVM_ACC_FINAL){ fprintf(file," FINAL"); } if(flags & JVM_ACC_SYNCHRONIZED){ fprintf(file," SYNCHRONIZED"); } if(flags & JVM_ACC_NATIVE){ fprintf(file," NATIVE"); } if(flags & JVM_ACC_INTERFACE){ fprintf(file," INTERFACE"); } if(flags & JVM_ACC_ABSTRACT){ fprintf(file," ABSTRACT"); } if(flags & JVM_ACC_STRICT){ fprintf(file," STRICT"); } } void jrst_initialize() { if(!read){ first=ev.timestamp; read=true; } if(ev.id1 == ev.id2){ fprintf(file,"7\t%.6f\tj-%lld\tJVM\tpj\t\"JVM-%lld\"\n",(((double)(ev.timestamp - first))/ 1000000.0),ev.id1,ev.id1); fprintf(file,"11\t%.6f\tJS\tj-%lld\texe\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1); fprintf(file,"13\t%.6f\tMEM\tj-%lld\t0.0\n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1); } fprintf(file,"777\t%.6f\tt-%lld\tT\tj-%lld\t\"%s-%d\"\t%x\t%x\t%x\n",(((double)(ev.timestamp - first))/ 1000000.0),ev.id2,ev.id1,ev.v_string[0], count, ev.v_uint32[1], ev.v_uint32[2],ev.v_uint32[3]); count++; } void jrst_finalize() { fprintf(file,"8\t%.6f\tt-%lld\tT\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2); } void jrst_event_class() { hash_insert(&h_class, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1), (hash_data_t)ev.v_string[0]); } void jrst_event_method() { class_name = hash_locate(&h_class, (hash_key_t)(ev.v_uint32[1]+(int)ev.id1)); if(class_name == NULL){ printf("ERROR: Cannot load Method\n"); exit(1); } if(ev.v_uint32[2] == 0){ fprintf(file,"666\te-%lld.%x\tS\t\"%s.%s\"\t%lld.%x\n", ev.id1, ev.v_uint32[0], *(char **)class_name, ev.v_string[0], ev.id1, ev.v_uint32[1]); }else{ fprintf(file,"6666\te-%lld.%x\tS\t\"%s.%s\"\t%lld.%x\t\"F=", ev.id1, ev.v_uint32[0], *(char **)class_name, ev.v_string[0], ev.id1, ev.v_uint32[1]); jrst_access_flags(file, ev.v_uint32[2]); fprintf(file,"\"\n"); } hash_insert(&h_method, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1), (hash_data_t)(ev.v_uint32[1]+(int)ev.id1)); } void jrst_event_method_entry_alloc() { fprintf(file,"111\t%.6f\tS\tt-%lld\te-%lld.%x\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000),ev.id2, ev.id1, ev.v_uint32[1], ev.id1, ev.v_uint32[0]); fprintf(file,"14\t%.6f\tMEM\tj-%lld\t%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, ev.v_uint64[0]); hash_insert(&h_mem, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1), (hash_data_t)((long)ev.v_uint64[0])); } void jrst_jvmti_event_method_entry() { fprintf(file,"111\t%.6f\tS\tt-%lld\te-%lld.%x\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000),ev.id2, ev.id1, ev.v_uint32[1], ev.id1, ev.v_uint32[0]); } void jrst_method_entry() { class_number = hash_locate(&h_method, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1)); if(class_number == NULL){ printf("metodo nao achado seila=[%d]\n",ev.v_uint32[0]); printf("ERROR: Cannot Method Class\n"); exit(2); } fprintf(file,"111\t%.6f\tS\tt-%lld\te-%lld.%x\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000),ev.id2, ev.id1, ev.v_uint32[0], ev.id1, (*((int*)class_number)-(int)ev.id1)); } void jrst_jvmti_event_method_exit() { fprintf(file,"12\t%.6f\tS\tt-%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id2); } void jrst_method_exception() { fprintf(file,"9999\t%.6f\tEX\tt-%lld\tex\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2, ev.id1, ev.v_uint32[0]); } void jrst_method_exit_exception() { fprintf(file,"12\t%.6f\tS\tt-%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id2); fprintf(file,"9\t%.6f\tEX\tt-%lld\texpop\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2); } void jrst_jvmti_event_vm_object_alloc() { fprintf(file,"14\t%.6f\tMEM\tj-%lld\t%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, ev.v_uint64[0]); hash_insert(&h_mem, (hash_key_t)(ev.v_uint32[0] + (int)ev.id1), (hash_data_t)((long)ev.v_uint64[0])); } void jrst_jvmti_event_object_free() { data_mem = hash_locate(&h_mem, (hash_key_t)(ev.v_uint32[0] + (int)ev.id1)); if(data_mem == NULL){ printf("ERROR: Cannot JVMTI_EVENT_OBJECT_FREE \n"); printf("\tObjeto=[%x] nao achado para liberar\n",ev.v_uint32[0]); return; //continue; //exit(2); } fprintf(file,"15\t%.6f\tMEM\tj-%lld\t%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, (long long)*(long*)data_mem); } void jrst_jvmti_event_garbage_collection_start() { fprintf(file,"11\t%.6f\tJS\tj-%lld\tgc\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1); } void jrst_jvmti_event_garbage_collection_finish() { fprintf(file,"12\t%.6f\tJS\tj-%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1); } void jrst_event_monitor_enter() { list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(!list_find(&monitores, (void *)&obj)){ list_insert_after(&monitores, NULL, (void *)&obj); fprintf(file,"7\t%.6f\to-%lld.%x\tM\tj-%lld\t\"Monitor-%lld.%x\"\n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.id1, ev.v_uint32[0]); } //fprintf(file,"9\t%.6f\tE\tt-%lld\tme\n",(((double)(ev.timestamp - first)) / 1000000), ev.v_uint64[0]); fprintf(file,"999\t%.6f\tE\tt-%lld\tme\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2, ev.id1, ev.v_uint32[0]); fprintf(file,"11\t%.6f\tS\tt-%lld\tlock\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2); fprintf(file,"11\t%.6f\tMS\to-%lld.%x\tlock\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); fprintf(file,"18\t%.6f\tLTM\tj-%lld\tlb\tt-%lld\tl-%lld-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.id2, ev.id2, ev.id1, ev.v_uint32[0]); fprintf(file,"19\t%.6f\tLTM\tj-%lld\tlb\to-%lld.%x\tl-%lld-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.id1, ev.v_uint32[0], ev.id2, ev.id1, ev.v_uint32[0]); } void jrst_event_monitor_entered() { fprintf(file,"999\t%.6f\tE\tt-%lld\tmed\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2, ev.id1, ev.v_uint32[0]); fprintf(file,"12\t%.6f\tS\tt-%lld\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2); fprintf(file,"12\t%.6f\tMS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); fprintf(file,"18\t%.6f\tLMT\tj-%lld\tlub\to-%lld.%x\tlu-%lld.%x-%lld\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.id1, ev.v_uint32[0], ev.id1, ev.v_uint32[0], ev.id2); fprintf(file,"19\t%.6f\tLMT\tj-%lld\tlub\tt-%lld\tlu-%lld.%x-%lld\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.id2, ev.id1, ev.v_uint32[0], ev.id2); } void jrst_event_monitor_wait() { //if(!list_find(&monitores, (void *)&ev.v_uint32[0])){ // list_insert_after(&monitores, NULL, (void *)&ev.v_uint32[0]); // fprintf(file,"7\t%.6f\to-%lld.%x\tM\tj-%lld\t\"Monitor-%lld.%x\"\n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.id1, ev.v_uint32[0]); //} //fprintf(file,"9\t%.6f\tE\tt-%lld\tme\n",(((double)(ev.timestamp - first)) / 1000000), ev.v_uint64[0]); fprintf(file,"999\t%.6f\tE\tt-%lld\tmw\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2, ev.id1, ev.v_uint32[0]); fprintf(file,"11\t%.6f\tS\tt-%lld\tlock\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2); //fprintf(file,"11\t%.6f\tMS\to-%lld.%x\tlock\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); //fprintf(file,"18\t%.6f\tLTM\tj-%lld\tlb\tt-%lld\tl-%lld-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.id2, ev.id2, ev.id1, ev.v_uint32[0]); //fprintf(file,"19\t%.6f\tLTM\tj-%lld\tlb\to-%lld.%x\tl-%lld-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.id1, ev.v_uint32[0], ev.id2, ev.id1, ev.v_uint32[0]); } void jrst_event_monitor_waited() { fprintf(file,"999\t%.6f\tE\tt-%lld\tmwd\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2, ev.id1, ev.v_uint32[0]); fprintf(file,"12\t%.6f\tS\tt-%lld\n",(((double)(ev.timestamp - first)) / 1000000), ev.id2); //fprintf(file,"12\t%.6f\tMS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); //fprintf(file,"18\t%.6f\tLMT\tj-%lld\tlub\to-%lld.%x\tlu-%lld.%x-%lld\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.id1, ev.v_uint32[0], ev.id1, ev.v_uint32[0], ev.id2); //fprintf(file,"19\t%.6f\tLMT\tj-%lld\tlub\tt-%lld\tlu-%lld.%x-%lld\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.id2, ev.id1, ev.v_uint32[0], ev.id2); } void jrst_event_select() { if(ev.type == INITIALIZE){ jrst_initialize(); }else if(ev.type == FINALIZE){ jrst_finalize(); }else if(ev.type == CLASS_LOAD){ jrst_event_class(); }else if(ev.type == METHOD_LOAD){ jrst_event_method(); }else if(ev.type == EVENT_METHOD_ENTRY_ALLOC){ jrst_event_method_entry_alloc(); }else if(ev.type == JVMTI_EVENT_METHOD_ENTRY){ jrst_jvmti_event_method_entry(); }else if(ev.type == METHOD_ENTRY){ jrst_method_entry(); }else if(ev.type == JVMTI_EVENT_METHOD_EXIT){ jrst_jvmti_event_method_exit(); }else if(ev.type == METHOD_EXCEPTION){ jrst_method_exception(); }else if(ev.type == METHOD_EXIT_EXCEPTION){ jrst_method_exit_exception(); }else if(ev.type == JVMTI_EVENT_VM_OBJECT_ALLOC){ jrst_jvmti_event_vm_object_alloc(); }else if(ev.type == JVMTI_EVENT_OBJECT_FREE){ jrst_jvmti_event_object_free(); }else if(ev.type == JVMTI_EVENT_GARBAGE_COLLECTION_START){ jrst_jvmti_event_garbage_collection_start(); }else if(ev.type == JVMTI_EVENT_GARBAGE_COLLECTION_FINISH){ jrst_jvmti_event_garbage_collection_finish(); }else if(ev.type == MONITOR_ENTER){ jrst_event_monitor_enter(); }else if(ev.type == MONITOR_ENTERED){ jrst_event_monitor_entered(); }else if(ev.type == MONITOR_WAIT){ jrst_event_monitor_wait(); }else if(ev.type == MONITOR_WAITED){ jrst_event_monitor_waited(); } } int main(int argc, char *argv[]) { int i; if(argc < 3){ printf("ERROR: Cannot read args\n"); printf("\t%s \n",argv[0]); exit(1); } file=fopen("rastros.trace","w"); paje_header(file); jrst_constant(file); list_initialize(&monitores, list_copy_object, list_cmp_object, list_destroy_int); hash_initialize(&h_class, hash_value, hash_copy, hash_key_cmp, hash_destroy); hash_initialize(&h_method, hash_value, hash_copy_new, hash_key_cmp, hash_destroy_new); hash_initialize(&h_mem, hash_value, hash_copy_new, hash_key_cmp, hash_destroy_new); for (i=2; idata; fprintf(file,"8\t%.6f\to-%lld.%x\tM\n",(((double)(ev.timestamp - first)) / 1000000), (long long)obj->jvm, obj->idObject); list_rem_position (&monitores, pos); } list_finalize(&monitores); fprintf(file,"12\t%.6f\tJS\tj-%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1); fprintf(file,"8\t%.6f\tj-%lld\tJVM\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1); fprintf(file,"8\t%.6f\tpj\tPJ\n",(((double)(ev.timestamp - first)) / 1000000)); hash_finalize(&h_class); hash_finalize(&h_method); hash_finalize(&h_mem); fclose(file); return 0; } Paje-1.98/Tracers/JRastro/src/JRastro_paje.c0000664000175000017500000002264411674062007020572 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" void paje_set_limits(FILE *file) { fprintf(file,"%%EventDef\tSetLimits\t0\n" "%%\tStartTime\tdate\n" "%%\tEndTime\tdate\n" "%%EndEventDef\n"); } void paje_define_container_type(FILE *file) { fprintf(file,"%%EventDef\tPajeDefineContainerType 1\n" "%%\tAlias\tstring\n" "%%\tContainerType\tstring\n" "%%\tName\tstring\n" "%%EndEventDef\n"); } void paje_define_event_type(FILE *file) { fprintf(file,"%%EventDef\tPajeDefineEventType 2\n" "%%\tAlias\tstring\n" "%%\tContainerType\tstring\n" "%%\tName\tstring\n" "%%EndEventDef\n"); } void paje_define_state_type(FILE *file) { fprintf(file,"%%EventDef\tPajeDefineStateType 3\n" "%%\tAlias\tstring\n" "%%\tContainerType\tstring\n" "%%\tName\tstring\n" "%%EndEventDef\n"); } void paje_define_variable_type(FILE *file) { fprintf(file,"%%EventDef\tPajeDefineVariableType 4\n" "%%\tAlias\tstring\n" "%%\tContainerType\tstring\n" "%%\tName\tstring\n" "%%EndEventDef\n"); } void paje_define_link_type(FILE *file) { fprintf(file,"%%EventDef\tPajeDefineLinkType 5\n" "%%\tAlias\tstring\n" "%%\tContainerType\tstring\n" "%%\tSourceContainerType\tstring\n" "%%\tDestContainerType\tstring\n" "%%\tName\tstring\n" "%%EndEventDef\n"); } void paje_define_entity_value(FILE *file) { fprintf(file,"%%EventDef\tPajeDefineEntityValue 6\n" "%%\tAlias\tstring\n" "%%\tEntityType\tstring\n" "%%\tName\tstring\n" //"%%\tColor\tcolor\n" "%%EndEventDef\n"); } void paje_define_entity_value666(FILE *file) { fprintf(file,"%%EventDef\tPajeDefineEntityValue 666\n" "%%\tAlias\tstring\n" "%%\tEntityType\tstring\n" "%%\tName\tstring\n" //"%%\tColor\tcolor\n" "%%\tClass\tstring\n" "%%EndEventDef\n"); } void paje_define_entity_value6666(FILE *file) { fprintf(file,"%%EventDef\tPajeDefineEntityValue 6666\n" "%%\tAlias\tstring\n" "%%\tEntityType\tstring\n" "%%\tName\tstring\n" //"%%\tColor\tcolor\n" "%%\tClass\tstring\n" "%%\tFlags\tstring\n" "%%EndEventDef\n"); } void paje_create_container(FILE *file) { fprintf(file,"%%EventDef\tPajeCreateContainer 7\n" "%%\tTime\tdate\n" "%%\tAlias\tstring\n" "%%\tType\tstring\n" "%%\tContainer\tstring\n" "%%\tName\tstring\n" "%%EndEventDef\n"); } void paje_create_container777(FILE *file) { fprintf(file,"%%EventDef\tPajeCreateContainer 777\n" "%%\tTime\tdate\n" "%%\tAlias\tstring\n" "%%\tType\tstring\n" "%%\tContainer\tstring\n" "%%\tName\tstring\n" "%%\tPriority\tstring\n" "%%\tIsDaemon\tstring\n" "%%\tThreadGroup\tstring\n" "%%EndEventDef\n"); } void paje_destroy_container(FILE *file) { fprintf(file,"%%EventDef\tPajeDestroyContainer 8\n" "%%\tTime\tdate\n" "%%\tContainer\tstring\n" "%%\tType\tstring\n" "%%EndEventDef\n"); } void paje_new_event(FILE *file) { fprintf(file,"%%EventDef\tPajeNewEvent 9\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%EndEventDef\n"); } void paje_new_event999(FILE *file) { fprintf(file,"%%EventDef\tPajeNewEvent 999\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tMonitor\tstring\n" "%%EndEventDef\n"); } void paje_new_event9999(FILE *file) { fprintf(file,"%%EventDef\tPajeNewEvent 9999\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tException\tstring\n" "%%EndEventDef\n"); } void paje_set_state(FILE *file) { fprintf(file,"%%EventDef\tPajeSetState 10\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%EndEventDef\n"); } void paje_push_state(FILE *file) { fprintf(file,"%%EventDef\tPajePushState 11\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%EndEventDef\n"); } void paje_push_state111(FILE *file) { fprintf(file,"%%EventDef\tPajePushState 111\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tObject\tstring\n" "%%EndEventDef\n"); } void paje_pop_state(FILE *file) { fprintf(file,"%%EventDef\tPajePopState 12\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%EndEventDef\n"); } void paje_set_variable(FILE *file) { fprintf(file,"%%EventDef\tPajeSetVariable 13\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tdouble\n" "%%EndEventDef\n"); } void paje_add_variable(FILE *file) { fprintf(file,"%%EventDef\tPajeAddVariable 14\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tdouble\n" "%%EndEventDef\n"); } void paje_sub_variable(FILE *file) { fprintf(file,"%%EventDef\tPajeSubVariable 15\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tdouble\n" "%%EndEventDef\n"); } void paje_start_link(FILE *file) { fprintf(file,"%%EventDef\tPajeStartLink 16\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tSourceContainer\tstring\n" "%%\tKey\tstring\n" "%%\tSize\tint\n" "%%EndEventDef\n"); } void paje_end_link(FILE *file) { fprintf(file,"%%EventDef\tPajeEndLink 17\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tDestContainer\tstring\n" "%%\tKey\tstring\n" "%%\tSize\tint\n" "%%EndEventDef\n"); } void paje_start_link18(FILE *file) { fprintf(file,"%%EventDef\tPajeStartLink 18\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tSourceContainer\tstring\n" "%%\tKey\tstring\n" "%%EndEventDef\n"); } void paje_end_link19(FILE *file) { fprintf(file,"%%EventDef\tPajeEndLink 19\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tDestContainer\tstring\n" "%%\tKey\tstring\n" "%%EndEventDef\n"); } void paje_new_event112(FILE *file) { fprintf(file,"%%EventDef\tPajeNewEvent 112\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tThreadName\tstring\n" "%%\tThreadGroup\tstring\n" "%%\tThreadParent\tstring\n" "%%\tThreadId\tstring\n" "%%EndEventDef\n"); } void paje_new_event113(FILE *file) { fprintf(file,"%%EventDef\tPajeNewEvent 113\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tThreadName\tstring\n" "%%\tThreadGroup\tstring\n" "%%\tThreadId\tstring\n" "%%EndEventDef\n"); } void paje_new_event114(FILE *file) { fprintf(file,"%%EventDef\tPajeNewEvent 114\n" "%%\tTime\tdate\n" "%%\tEntityType\tstring\n" "%%\tContainer\tstring\n" "%%\tValue\tstring\n" "%%\tObject\tstring\n" "%%EndEventDef\n"); } void paje_header(FILE *file) { /*paje_set_limits(file);*/ paje_define_container_type(file); paje_define_event_type(file); paje_define_state_type(file); paje_define_variable_type(file); paje_define_link_type(file); paje_define_entity_value(file); paje_define_entity_value666(file); paje_define_entity_value6666(file); paje_create_container(file); paje_create_container777(file); paje_destroy_container(file); paje_new_event(file); paje_new_event999(file); paje_new_event9999(file); paje_set_state(file); paje_push_state(file); paje_push_state111(file); paje_pop_state(file); paje_set_variable(file); paje_add_variable(file); paje_sub_variable(file); paje_start_link(file); paje_end_link(file); paje_start_link18(file); paje_end_link19(file); paje_new_event112(file); paje_new_event113(file); paje_new_event114(file); } Paje-1.98/Tracers/JRastro/src/JRastro_events.c0000664000175000017500000002011511674062007021146 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" void JNICALL jrst_monitor_contended_enter(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object) { jvmtiError error; jlong tag; error = (*GET_JVMTI())->GetTag( GET_JVMTI(), object, &tag); jrst_check_error(GET_JVMTI(), error, "Cannot Get Tag"); trace_event_monitor_contended_enter(jvmtiLocate, thread, (int)tag); } void JNICALL jrst_monitor_contended_entered(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object) { jvmtiError error; jlong tag; error = (*GET_JVMTI())->GetTag( GET_JVMTI(), object, &tag); jrst_check_error(GET_JVMTI(), error, "Cannot Get Tag"); trace_event_monitor_contended_entered(jvmtiLocate, thread, (int)tag); } void JNICALL jrst_monitor_wait(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object, jlong timeout) { jvmtiError error; jlong tag; error = (*GET_JVMTI())->GetTag( GET_JVMTI(), object, &tag); jrst_check_error(GET_JVMTI(), error, "Cannot Get Tag"); trace_event_monitor_wait(jvmtiLocate, thread, (int)tag); } void JNICALL jrst_monitor_waited(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object, jboolean timed_out) { jvmtiError error; jlong tag; error = (*GET_JVMTI())->GetTag( GET_JVMTI(), object, &tag); jrst_check_error(GET_JVMTI(), error, "Cannot Get Tag"); trace_event_monitor_waited(jvmtiLocate, thread, (int)tag); } /*void JNICALL jrst_event_VMObject_alloc(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jobject object, jclass object_klass, jlong size){}*/ void JNICALL jrst_event_object_free(jvmtiEnv *jvmtiLocate, jlong tag) { trace_event_object_free(tag); } void JNICALL jrst_event_garbage_collection_start(jvmtiEnv *jvmtiLocate) { trace_event_gc_start(); } void JNICALL jrst_event_garbage_collection_finish(jvmtiEnv *jvmtiLocate) { trace_event_gc_finish(); } bool jrst_find_method_all_class(char *methodName) { hash_data_t *data_list; list_t *allMethods; data_list = hash_locate(&h_options, (hash_key_t)"*"); if(data_list != NULL){ allMethods = *(list_t **)data_list; if(list_find(allMethods, (void *)methodName)){ return true; } } return false; } void jrst_deallocate_class(jvmtiEnv *jvmtiLocate, char *classSignature, char *classGeneric) { jvmtiError error; error = (*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)classSignature); jrst_check_error(jvmtiLocate,error, "Cannot deallocate memory"); error = (*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)classGeneric); jrst_check_error(jvmtiLocate,error, "Cannot deallocate memory"); } bool jrst_find_method(jvmtiEnv *jvmtiLocate, jmethodID method, char *methodName) { jvmtiError error; jclass klass; char *className; char *classSignature; char *classGeneric; int size = 0; hash_data_t *data_list; list_t *methods; error = (*jvmtiLocate)->GetMethodDeclaringClass(jvmtiLocate, method, &klass); jrst_check_error(jvmtiLocate,error, "Cannot Get Method Declaring Class"); error = (*jvmtiLocate)->GetClassSignature(jvmtiLocate, klass, &classSignature, &classGeneric); jrst_check_error(jvmtiLocate,error, "Cannot Get Class Signature"); /*Tirar da signature o caracter 'L'*/ className = (char *)classSignature + 1; /* -1 Pois comeca em 0 o vetor*/ size = strlen(className) - 1; /*Tira da signature o caracter ';'*/ className[size] = '\0'; data_list = hash_locate(&h_options, (hash_key_t)className); if(data_list != NULL){ methods = *(list_t **)data_list; if(list_find(methods, (void *)"*") || list_find(methods, (void *)methodName)){ jrst_deallocate_class(jvmtiLocate, classSignature, classGeneric); return true; } } jrst_deallocate_class(jvmtiLocate, classSignature, classGeneric); return false; } void JNICALL jrst_event_exception(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jmethodID method, jlocation location, jobject exception, jmethodID catch_method, jlocation catch_location) { jvmtiError error; jlong tag; char *methodName; char *methodSignature; char *methodGsignature; error = (*GET_JVMTI())->GetTag( GET_JVMTI(), exception, &tag); jrst_check_error(GET_JVMTI(), error, "Cannot Get Tag"); (*jvmtiLocate)->NotifyFramePop(jvmtiLocate, thread, 0); (*jvmtiLocate)->NotifyFramePop(jvmtiLocate, thread, 1); error = (*jvmtiLocate)->GetMethodName(jvmtiLocate, method, &methodName, &methodSignature, &methodGsignature); jrst_check_error(jvmtiLocate,error, "Cannot read Method Name"); if(methodName == NULL){ return; } jrst_enter_critical_section(jvmtiLocate, gagent->monitor); if(jrst_trace_methods() || jrst_find_method_all_class(methodName) || jrst_find_method(jvmtiLocate, method, methodName)){ trace_event_exception(thread, (int)tag); } jrst_exit_critical_section(jvmtiLocate, gagent->monitor); error = (*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)methodName); jrst_check_error(jvmtiLocate,error, "Cannot deallocate memory"); error = (*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)methodSignature); jrst_check_error(jvmtiLocate,error, "Cannot deallocate memory"); error = (*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)methodGsignature); jrst_check_error(jvmtiLocate,error, "Cannot deallocate memory"); } void JNICALL jrst_event_frame_pop(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jmethodID method, jboolean was_popped_by_exception) { if(!was_popped_by_exception){ return; } jvmtiError error; char *methodName; char *methodSignature; char *methodGsignature; error = (*jvmtiLocate)->GetMethodName(jvmtiLocate, method, &methodName, &methodSignature, &methodGsignature); jrst_check_error(jvmtiLocate,error, "Cannot read Method Name"); if(methodName == NULL){ return; } error = (*jvmtiLocate)->NotifyFramePop(jvmtiLocate, thread, 1); // if(strcmp(methodName, "findClass") != 0){ // } jrst_enter_critical_section(jvmtiLocate, gagent->monitor); if(jrst_trace_methods() || jrst_find_method_all_class(methodName) || jrst_find_method(jvmtiLocate, method, methodName)){ trace_event_method_exit_exception(thread); } jrst_exit_critical_section(jvmtiLocate, gagent->monitor); error = (*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)methodName); jrst_check_error(jvmtiLocate,error, "Cannot deallocate memory"); error = (*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)methodSignature); jrst_check_error(jvmtiLocate,error, "Cannot deallocate memory"); error = (*jvmtiLocate)->Deallocate(jvmtiLocate, (unsigned char *)methodGsignature); jrst_check_error(jvmtiLocate,error, "Cannot deallocate memory"); } /*void JNICALL jrst_event_exception_catch(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jmethodID method, jlocation location, jobject exception){}*/ /*void JNICALL jrst_event_method_load(jvmtiEnv *jvmtiLocate, jmethodID method, jint code_size, const void* code_addr, jint map_length, const jvmtiAddrLocationMap* map, const void* compile_info){}*/ /*void JNICALL jrst_event_method_entry(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jmethodID method){}*/ /*void JNICALL jrst_event_method_exit(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread, jmethodID method, jboolean was_popped_by_exception, jvalue return_value){}*/ Paje-1.98/Tracers/JRastro/src/hash.c0000664000175000017500000001575411674062007017136 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include #include #include #include #include "hash.h" /*Funcao que encontra o valor hash*/ int hash_value(hash_key_t key) { return (((int)key / 24 ) % MAX_HASH); } /*Funcao que encontra o valor hash*/ int hash_value_string(hash_key_t key) { int value = 0; char *tmp = (char *) key; while(*tmp){ value += *tmp++; } return (value % MAX_HASH); } /*Funcao que encontra o valor hash*/ int hash_value_int(hash_key_t key) { int *value; value = (int *) key; return ((*value / 24 ) % MAX_HASH); } /*Verifica se Ponteiro eh NULL*/ void hash_null (void *p) { if(p == NULL){ printf("HASH_ERROR: Pointer is NULL\n"); exit(1); } } void hash_initialize(hash_t *h, hash_func_t func, hash_func_copy_t copy, hash_func_compare_t compare, hash_func_destroy_t destroy) { int i; hash_null(h); memset((void *)h, 0, sizeof(hash_t)); h->hash_func=func; h->hash_copy=copy; h->hash_compare=compare; h->hash_destroy=destroy; for(i=0; i < MAX_HASH; i++){ h->hash[i].key=NULL; h->hash[i].data=NULL; h->hash[i].next=NULL; } } void hash_finalize(hash_t *h) { int i; hash_null(h); for(i=0; i < MAX_HASH; i++){ if(h->hash[i].key != NULL){ while(h->hash[i].next != NULL){ hash_remove(h, h->hash[i].next->key); } hash_remove(h, h->hash[i].key); } } } void hash_destroy(hash_element_t *element) { hash_null(element); element->key=NULL; free(element->data); element->data=NULL; } void hash_destroy_string(hash_element_t *element) { hash_null(element); free(element->key); element->key=NULL; element->data=NULL; } void hash_destroy_int(hash_element_t *element) { hash_null(element); free(element->key); element->key=NULL; free(element->data); element->data=NULL; } bool hash_key_cmp(hash_key_t key, hash_key_t key2) { hash_null(key); hash_null(key2); if(key == key2){ return true; } return false; } bool hash_key_cmp_string(hash_key_t key, hash_key_t key2) { hash_null(key); hash_null(key2); if(!strcmp((char *)key, (char *)key2)){ return true; } return false; } bool hash_key_cmp_int(hash_key_t key, hash_key_t key2) { hash_null(key); hash_null(key2); if(!memcmp(key, key2, sizeof(int))){ return true; } return false; } void hash_copy(hash_element_t *element, hash_key_t key, hash_data_t data) { hash_null(element); hash_null(key); hash_null(data); element->key = (void *)key; element->data = (void *) malloc(sizeof(char) * (strlen((char *)data) + 1)); element->data = memcpy(element->data, data, sizeof(char) * (strlen((char *)data) + 1)); } void hash_copy_string (hash_element_t *element, hash_key_t key, hash_data_t data) { hash_null(element); hash_null(key); hash_null(data); element->key = (void *) malloc(sizeof(char) * (strlen((char *)key) + 1)); element->key = memcpy(element->key, key, sizeof(char) * (strlen((char *)key) + 1)); element->data = (void *)data; } void hash_copy_int (hash_element_t *element, hash_key_t key, hash_data_t data) { hash_null(element); hash_null(key); hash_null(data); element->key = (void *)malloc(sizeof(int)); element->key = memcpy(element->key, key, sizeof(int)); element->data = (void *) malloc(sizeof(char) * (strlen((char *)data) + 1)); element->data = memcpy(element->data, data, sizeof(char) * (strlen((char *)data) + 1)); } hash_data_t *hash_locate(hash_t *h, hash_key_t key) { int locate; hash_null(h); hash_null(key); locate = h->hash_func(key); if(h->hash[locate].key != NULL){ if(h->hash_compare(h->hash[locate].key, key)){ return &h->hash[locate].data; }else{ hash_element_t *element; for(element = h->hash[locate].next; element != NULL; element = element->next){ if(h->hash_compare(element->key, key)){ return &element->data; } } } } return NULL; } bool hash_find(hash_t *h, hash_key_t key) { hash_data_t *data; hash_null(h); hash_null(key); data = hash_locate(h, key); if(data != NULL){ return true; } return false; } void hash_insert(hash_t *h, hash_key_t key, hash_data_t data) { int locate; hash_element_t *new_element; hash_null(h); hash_null(key); hash_null(data); if(hash_find(h, key)){ return; } locate = h->hash_func(key); if(h->hash[locate].key == NULL){ h->hash_copy(&(h->hash[locate]), key, data); return; }else{ new_element=(hash_element_t *)malloc(sizeof(hash_element_t)); new_element->next=NULL; h->hash_copy(new_element, key, data); if(h->hash[locate].next == NULL){ h->hash[locate].next = new_element; return; } hash_element_t *element; for(element = h->hash[locate].next; element->next != NULL; element=element->next); element->next = new_element; return; } } void hash_remove(hash_t *h, hash_key_t key) { int locate; hash_element_t *element; hash_null(h); hash_null(key); if(!hash_find(h, key)){ printf("HASH_ERROR: Cannot remove Hash element\n"); exit(1); } locate = h->hash_func(key); if(h->hash_compare(h->hash[locate].key, key)){ h->hash_destroy(&h->hash[locate]); if(h->hash[locate].next == NULL){ return; } for(element=h->hash[locate].next; element->next != NULL; element=element->next){ if(element->next->next == NULL){ h->hash_copy(&(h->hash[locate]), element->next->key, element->next->data); h->hash_destroy(element->next); free(element->next); element->next=NULL; return; } } h->hash_copy(&(h->hash[locate]), element->key, element->data); h->hash_destroy(element); free(element); element=NULL; h->hash[locate].next=NULL; return; }else{ element=h->hash[locate].next; if(h->hash_compare(element->key, key)){ h->hash[locate].next=element->next; h->hash_destroy(element); free(element); element=NULL; return; } for(;element->next != NULL && (!h->hash_compare(element->next->key, key)); element = element->next); if(element->next == NULL){ printf("HASH_ERROR: Cannot remove Hash element\n"); exit(1); } hash_element_t *element2; element2 = element->next; element->next = element2->next; h->hash_destroy(element2); free(element2); element2=NULL; return; } } Paje-1.98/Tracers/JRastro/src/JRastro_func.c0000664000175000017500000001154411674062007020603 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "org_lsc_JRastro_Instru.h" #include"JRastro.h" int i=0; void func_init(jobject obj, jobject th) { i++; } void func_newArray(jobject obj, jobject th) { i++; } void func(jobject obj, jobject thread, int mnum) { i++; } void func_entry(jobject thread, int mnum) { i++; } void func_exit(jobject thread) { i++; } JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func_1init (JNIEnv *env, jclass klass, jobject obj, jobject thread) { jclass klassObject; jvmtiError error; char *signature_ptr; char *generic_ptr; char *tmp; int size = 0; klassObject = (*env)->GetObjectClass(env, obj); error = (*GET_JVMTI())->GetClassSignature(GET_JVMTI(), klassObject, &signature_ptr, &generic_ptr); jrst_check_error(GET_JVMTI(), error, "Cannot Get Class Signature"); /*Tirar da signature o caracter 'L'*/ tmp = (char *)signature_ptr + 1; /* -1 Pois comeca em 0 o vetor*/ size = strlen(tmp) - 1; /*Tira da signature o caracter ';'*/ tmp[size] = '\0'; // printf("signature=[%s]\n", tmp); trace_event_object_alloc((jthread) thread, obj, tmp); error=(*GET_JVMTI())->Deallocate(GET_JVMTI(), (unsigned char*)signature_ptr); jrst_check_error(GET_JVMTI(), error, "Cannot deallocate memory"); } JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func_1newArray (JNIEnv *env, jclass klass, jobject obj, jobject thread) { jclass klassObject; jvmtiError error; char *signature_ptr; char *generic_ptr; char *tmp; int size = 0; klassObject = (*env)->GetObjectClass(env, obj); error = (*GET_JVMTI())->GetClassSignature(GET_JVMTI(), klassObject, &signature_ptr, &generic_ptr); jrst_check_error(GET_JVMTI(), error, "Cannot Get Class Signature"); /*Tirar da signature o caracter 'L'*/ tmp = (char *)signature_ptr + 1; /* -1 Pois comeca em 0 o vetor*/ size = strlen(tmp) - 1; /*Tira da signature o caracter ';'*/ tmp[size] = '\0'; //printf("signature=[%s]\n", tmp); // trace_event_object_alloc((jthread) thread, obj, tmp); trace_event_object_alloc_new_array((jthread) thread, obj, tmp); error=(*GET_JVMTI())->Deallocate(GET_JVMTI(), (unsigned char*)signature_ptr); jrst_check_error(GET_JVMTI(), error, "Cannot deallocate memory"); } JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func (JNIEnv *env, jclass klass, jobject obj, jobject thread, jint mnum) { if(obj != NULL){ jvmtiError error; jlong id = 0; error = (*GET_JVMTI())->GetTag( GET_JVMTI(), obj, &id); if(error != JVMTI_ERROR_NONE){ return; } //jrst_check_error(GET_JVMTI(), error, "Cannot Get Tag"); if(id == 0){ jclass klassObject; char *signature_ptr; char *generic_ptr; char *tmp; int s = 0; klassObject = (*env)->GetObjectClass(env, obj); error = (*GET_JVMTI())->GetClassSignature(GET_JVMTI(), klassObject, &signature_ptr, &generic_ptr); jrst_check_error(GET_JVMTI(), error, "Cannot Get Class Signature"); /*Tirar da signature o caracter 'L'*/ tmp = (char *)signature_ptr + 1; /* -1 Pois comeca em 0 o vetor*/ s = strlen(tmp) - 1; /*Tira da signature o caracter ';'*/ tmp[s] = '\0'; //printf("className=[%s]\n", tmp ); trace_event_method_entry_obj_init((jthread) thread, obj, mnum, tmp); error=(*GET_JVMTI())->Deallocate(GET_JVMTI(), (unsigned char*)signature_ptr); jrst_check_error(GET_JVMTI(), error, "Cannot deallocate memory"); }else{ trace_event_method_entry_obj((jthread) thread, (int)id, mnum); } return; } trace_event_method_entry((jthread) thread, mnum); //func(obj, thread, mnum); } JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func_1entry (JNIEnv *env, jclass klass, jobject thread, jint mnum) { trace_event_method_entry((jthread) thread, mnum); } JNIEXPORT void JNICALL Java_org_lsc_JRastro_Instru_func_1exit (JNIEnv *env, jclass klass, jobject thread) { // jrst_enter_critical_section(jvmti); trace_event_method_exit((jthread) thread); // jrst_exit_critical_section(jvmti); //func_exit(thread, mnum); } Paje-1.98/Tracers/JRastro/src/JRastro_read_objects_class.c0000664000175000017500000004725411674062007023470 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" FILE *file; list_t list; list_t l_class; hash_t h_class; hash_t h_method; hash_t h_thread; hash_t h_mem; hash_data_t *class_name; hash_data_t *class_number; hash_data_t *data_list; hash_data_t *data_mem; rst_file_t data; rst_event_t ev; static bool read=false; timestamp_t first; void jrst_constant(FILE *file) { fprintf(file,"1\tPJ\t0\t\"Program Java\"\n"); fprintf(file,"1\tJVM\tPJ\t\"Java Virtual Machine\"\n"); fprintf(file,"1\tC\tJVM\t\"Class\"\n"); fprintf(file,"1\tO\tC\t\"Object\"\n"); fprintf(file,"2\tEX\tO\t\"ExceptionE\"\n"); fprintf(file,"3\tJS\tJVM\t\"JVM State\"\n"); fprintf(file,"3\tS\tO\t\"Metodo\"\n"); fprintf(file,"3\tMS\tO\t\"Monitor State\"\n"); fprintf(file,"4\tMEM\tJVM\t\"Memory Allocation\"\n"); fprintf(file,"6\texe\tJS\t\"Executing\"\n"); fprintf(file,"6\tgc\tJS\t\"Garbage Collection\"\n"); fprintf(file,"6\tlock\tMS\t\"Monitor locked\"\n"); fprintf(file,"6\tex\tEX\t\"Start Exception\"\n"); fprintf(file,"6\texpop\tEX\t\"Frame pop by Exception\"\n"); fprintf(file,"7\t0.0\tpj\tPJ\t0\t\"Programa Java\"\n"); } void jrst_access_flags(FILE *file, unsigned int flags) { if(flags & JVM_ACC_PUBLIC){ fprintf(file," PUBLIC"); } if(flags & JVM_ACC_PRIVATE){ fprintf(file," PRIVATE"); } if(flags & JVM_ACC_PROTECTED){ fprintf(file," PROTECTED"); } if(flags & JVM_ACC_STATIC){ fprintf(file," STATIC"); } if(flags & JVM_ACC_FINAL){ fprintf(file," FINAL"); } if(flags & JVM_ACC_SYNCHRONIZED){ fprintf(file," SYNCHRONIZED"); } if(flags & JVM_ACC_NATIVE){ fprintf(file," NATIVE"); } if(flags & JVM_ACC_INTERFACE){ fprintf(file," INTERFACE"); } if(flags & JVM_ACC_ABSTRACT){ fprintf(file," ABSTRACT"); } if(flags & JVM_ACC_STRICT){ fprintf(file," STRICT"); } } void jrst_initialize() { if(!read){ first=ev.timestamp; read=true; } if(ev.id1 == ev.id2){ fprintf(file,"7\t%.6f\tj-%lld\tJVM\tpj\t\"JVM-%lld\"\n",(((double)(ev.timestamp - first))/ 1000000.0),ev.id1,ev.id1); fprintf(file,"11\t%.6f\tJS\tj-%lld\texe\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1); fprintf(file,"13\t%.6f\tMEM\tj-%lld\t0.0\n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1); } list_t *new_list; new_list = (list_t *) malloc(sizeof(list_t)); if(new_list == NULL){ printf("ERROR: Cannot malloc list\n"); exit(3); } list_initialize(new_list, list_copy, list_cmp, list_destroy); hash_insert(&h_thread, (hash_key_t)(long)ev.id2, (hash_data_t)new_list); } void jrst_finalize() { data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; position_t pos; for(pos = list_inicio(tmp); pos != NULL ; pos = list_inicio(tmp)){ fprintf(file,"12\t%.6f\tS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, (int)pos->data); //fprintf(file,"8\t%.6f\to-%x\tO\n",(((double)(ev.timestamp - first)) / 1000000), (int)pos->data); list_rem_position (tmp, pos); } list_finalize(tmp); //hash_remove(&h_thread, (hash_key_t)(long)ev.id2); } void jrst_event_class() { hash_insert(&h_class, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1), (hash_data_t)ev.v_string[0]); } void jrst_event_method() { class_name = hash_locate(&h_class, (hash_key_t)(ev.v_uint32[1]+(int)ev.id1)); if(class_name == NULL){ printf("ERROR: Cannot Method load\n"); exit(1); } if(ev.v_uint32[2] == 0){ fprintf(file,"666\te-%lld.%x\tS\t\"%s.%s\"\t%lld.%x\n", ev.id1, ev.v_uint32[0], *(char **)class_name, ev.v_string[0], ev.id1, ev.v_uint32[1]); }else{ fprintf(file,"6666\te-%lld.%x\tS\t\"%s.%s\"\t%lld.%x\t\"F=", ev.id1, ev.v_uint32[0], *(char **)class_name, ev.v_string[0], ev.id1, ev.v_uint32[1]); jrst_access_flags(file, ev.v_uint32[2]); fprintf(file,"\"\n"); } hash_insert(&h_method, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1), (hash_data_t) (ev.v_uint32[1]+(int)ev.id1)); } void jrst_event_method_entry_alloc() { if(strcmp(ev.v_string[0], "") != 0){ //Coloquei essa parte para inicializar os objetos list_class_t classID; classID.jvm = ev.id1; classID.className = ev.v_string[0]; if(!list_find(&l_class, (void *)&classID)){ // printf("init alloc=[%s]\n", ev.v_string[0]); fprintf(file,"7\t%.6f\tc-%lld.%s\tC\tj-%lld\t\"c-%lld.%s\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_string[0], ev.id1, ev.id1, ev.v_string[0]); list_insert_after(&l_class, NULL, (void *)&classID); } list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(!list_find(&list, (void *)&obj)){ fprintf(file,"7\t%.6f\to-%lld.%x\tO\tc-%lld.%s\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.v_string[0], ev.id1, ev.v_string[0], ev.v_uint32[0]); list_insert_after(&list, NULL, (void *)&obj); } }else{ int n_class = 0; class_number = hash_locate(&h_method, (hash_key_t)(ev.v_uint32[1]+(int)ev.id1)); if(class_number == NULL){ printf("ERROR: Cannot Method Class\n"); exit(2); } n_class = *((int*)class_number) - (int)ev.id1; class_name = hash_locate(&h_class, (hash_key_t)(n_class+(int)ev.id1)); if(class_name == NULL){ printf("ERROR: Cannot Method load\n"); exit(1); } list_class_t classID; classID.jvm = ev.id1; classID.className = *(char **)class_name; if(!list_find(&l_class, (void *) &classID)){ // printf("init alloc=[%s]\n", ev.v_string[0]); fprintf(file,"7\t%.6f\tc-%lld.%s\tC\tj-%lld\t\"c-%lld.%s\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, *(char **)class_name, ev.id1, ev.id1, *(char **)class_name); list_insert_after(&l_class, NULL, (void *) &classID); } list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(!list_find(&list, (void *)&obj)){ fprintf(file,"7\t%.6f\to-%lld.%x\tO\tc-%lld.%s\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, *(char **)class_name, ev.id1, *(char **)class_name, ev.v_uint32[0]); list_insert_after(&list, NULL, (void *)&obj); } } ////////////////////////////////////////////////////// fprintf(file,"14\t%.6f\tMEM\tj-%lld\t%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, ev.v_uint64[0]); hash_insert(&h_mem, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1), (hash_data_t)((long)ev.v_uint64[0])); data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; list_insert_after(tmp, NULL, (list_data_t)ev.v_uint32[0]); //printf("obj=[%x] method=[%x] class=[] name=[]\n",ev.v_uint32[0], ev.v_uint32[1]); fprintf(file,"11\t%.6f\tS\to-%lld.%x\te-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0], ev.id1, ev.v_uint32[1]); } void jrst_jvmti_event_method_entry() { int n_class = 0; class_number = hash_locate(&h_method, (hash_key_t)(ev.v_uint32[1]+(int)ev.id1)); if(class_number == NULL){ printf("ERROR: Cannot Method Class\n"); exit(2); } n_class = *((int*)class_number) - (int)ev.id1; class_name = hash_locate(&h_class, (hash_key_t)(n_class+(int)ev.id1)); if(class_name == NULL){ printf("ERROR: Cannot Method load\n"); exit(1); } list_class_t classID; classID.jvm = ev.id1; classID.className = *(char **)class_name; if(!list_find(&l_class, (void *) &classID)){ // printf("init alloc=[%s]\n", ev.v_string[0]); fprintf(file,"7\t%.6f\tc-%lld.%s\tC\tj-%lld\t\"c-%lld.%s\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, *(char **)class_name, ev.id1, ev.id1, *(char **)class_name); list_insert_after(&l_class, NULL, (void *) &classID); } list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(!list_find(&list, (void *)&obj)){ fprintf(file,"7\t%.6f\to-%lld.%x\tO\tc-%lld.%s\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, *(char **)class_name, ev.id1, *(char **)class_name, ev.v_uint32[0]); list_insert_after(&list, NULL, (void *)&obj); } data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; list_insert_after(tmp, NULL, (list_data_t)ev.v_uint32[0]); //printf("obj=[%x] method=[%x] class=[] name=[]\n",ev.v_uint32[0], ev.v_uint32[1]); fprintf(file,"11\t%.6f\tS\to-%lld.%x\te-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0], ev.id1, ev.v_uint32[1]); } void jrst_method_entry() { int n_class = 0; class_number = hash_locate(&h_method, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1)); if(class_number == NULL){ printf("ERROR: Cannot Method Class\n"); exit(2); } n_class = *((int*)class_number) - (int)ev.id1; class_name = hash_locate(&h_class, (hash_key_t)(n_class+(int)ev.id1)); if(class_name == NULL){ printf("ERROR: Cannot Method load\n"); exit(1); } list_class_t classID; classID.jvm = ev.id1; classID.className = *(char **)class_name; if(!list_find(&l_class, (void *) &classID)){ // printf("init alloc=[%s]\n", ev.v_string[0]); fprintf(file,"7\t%.6f\tc-%lld.%s\tC\tj-%lld\t\"c-%lld.%s\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, *(char **)class_name, ev.id1, ev.id1, *(char **)class_name); list_insert_after(&l_class, NULL, (void *) &classID); } list_object_t obj; obj.jvm = ev.id1; obj.idObject = n_class; if(!list_find(&list, (void *)&obj)){ fprintf(file,"7\t%.6f\to-%lld.%x\tO\tc-%lld.%s\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, n_class, ev.id1, *(char **)class_name, ev.id1, *(char **)class_name, n_class); list_insert_after(&list, NULL, (void *)&obj); } data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; list_insert_after(tmp, NULL, (list_data_t)n_class); fprintf(file,"11\t%.6f\tS\to-%lld.%x\te-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, n_class, ev.id1, ev.v_uint32[0]); } void jrst_jvmti_event_method_exit() { data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; position_t pos; pos = list_inicio(tmp); if(pos == NULL){ printf("ERROR: Cannot get data list\n"); exit(2); } fprintf(file,"12\t%.6f\tS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, (int)pos->data); list_rem_position (tmp, NULL); } void jrst_method_exception() { data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; position_t pos; pos = list_inicio(tmp); if(pos == NULL){ printf("ERROR: Cannot get data list\n"); exit(2); } fprintf(file,"9999\t%.6f\tEX\to-%lld.%x\tex\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, (int)pos->data, ev.id1, ev.v_uint32[0]); } void jrst_method_exit_exception() { data_list = hash_locate(&h_thread, (hash_key_t)(long)ev.id2); if(data_list == NULL){ printf("ERROR: Cannot load list\n"); exit(1); } list_t *tmp = *(list_t **)data_list; position_t pos; pos = list_inicio(tmp); if(pos == NULL){ printf("ERROR: Cannot get data list\n"); exit(2); } fprintf(file,"12\t%.6f\tS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, (int)pos->data); fprintf(file,"9\t%.6f\tEX\to-%lld.%x\texpop\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, (int)pos->data); list_rem_position (tmp, NULL); } void jrst_jvmti_event_vm_object_alloc() { //Coloquei essa parte para inicializar os objetos list_class_t classID; classID.jvm = ev.id1; classID.className = ev.v_string[0]; if(!list_find(&l_class, (void *) &classID)){ // printf("init alloc=[%s]\n", ev.v_string[0]); if(strcmp(ev.v_string[0], "") == 0){ fprintf(file,"7\t%.6f\tc-%lld.Unknown\tC\tj-%lld\t\"c-%lld.Unknown\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.id1, ev.id1); }else{ fprintf(file,"7\t%.6f\tc-%lld.%s\tC\tj-%lld\t\"c-%lld.%s\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_string[0], ev.id1, ev.id1, ev.v_string[0]); } list_insert_after(&l_class, NULL, (void *) &classID); } list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(!list_find(&list, (void *)&obj)){ // printf("init alloc=[%s]\n", ev.v_string[0]); if(strcmp(ev.v_string[0], "") == 0){ fprintf(file,"7\t%.6f\to-%lld.%x\tO\tc-%lld.Unknown\t\"o-%lld.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.id1, ev.v_uint32[0]); }else{ fprintf(file,"7\t%.6f\to-%lld.%x\tO\tc-%lld.%s\t\"o-%lld.%s.%x\" \n",(((double)(ev.timestamp - first))/ 1000000.0), ev.id1, ev.v_uint32[0], ev.id1, ev.v_string[0], ev.id1, ev.v_string[0], ev.v_uint32[0]); } list_insert_after(&list, NULL, (void *)&obj); } ////////////////////////////////////////////////////// fprintf(file,"14\t%.6f\tMEM\tj-%lld\t%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, ev.v_uint64[0]); hash_insert(&h_mem, (hash_key_t)(ev.v_uint32[0] + (int)ev.id1), (hash_data_t)((long)ev.v_uint64[0])); } void jrst_jvmti_event_object_free() { data_mem = hash_locate(&h_mem, (hash_key_t)(ev.v_uint32[0]+(int)ev.id1)); if(data_mem == NULL){ printf("ERROR: Cannot JVMTI_EVENT_OBJECT_FREE \n"); printf("\tObjeto=[%x] nao achado para liberar\n",ev.v_uint32[0]); return; //continue; //exit(2); } fprintf(file,"15\t%.6f\tMEM\tj-%lld\t%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1, (long long)*(long*)data_mem); list_object_t obj; obj.jvm = ev.id1; obj.idObject = ev.v_uint32[0]; if(list_find(&list, (void *)&obj)){ fprintf(file,"8\t%.6f\to-%lld.%x\tO\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } } void jrst_jvmti_event_garbage_collection_start() { fprintf(file,"11\t%.6f\tJS\tj-%lld\tgc\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1); } void jrst_jvmti_event_garbage_collection_finish() { fprintf(file,"12\t%.6f\tJS\tj-%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1); } void jrst_event_monitor_enter() { fprintf(file,"11\t%.6f\tMS\to-%lld.%x\tlock\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } void jrst_event_monitor_entered() { fprintf(file,"12\t%.6f\tMS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } void jrst_event_monitor_wait() { fprintf(file,"11\t%.6f\tMS\to-%lld.%x\tlock\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } void jrst_event_monitor_waited() { fprintf(file,"12\t%.6f\tMS\to-%lld.%x\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1, ev.v_uint32[0]); } void jrst_event_select() { if(ev.type == INITIALIZE){ jrst_initialize(); }else if(ev.type == FINALIZE){ jrst_finalize(); }else if(ev.type == CLASS_LOAD){ jrst_event_class(); }else if(ev.type == METHOD_LOAD){ jrst_event_method(); }else if(ev.type == EVENT_METHOD_ENTRY_ALLOC){ jrst_event_method_entry_alloc(); }else if(ev.type == JVMTI_EVENT_METHOD_ENTRY){ jrst_jvmti_event_method_entry(); }else if(ev.type == METHOD_ENTRY){ //Sem o objeto jrst_method_entry(); }else if(ev.type == JVMTI_EVENT_METHOD_EXIT){ jrst_jvmti_event_method_exit(); }else if(ev.type == METHOD_EXCEPTION){ jrst_method_exception(); }else if(ev.type == METHOD_EXIT_EXCEPTION){ jrst_method_exit_exception(); }else if(ev.type == JVMTI_EVENT_VM_OBJECT_ALLOC){ jrst_jvmti_event_vm_object_alloc(); }else if(ev.type == JVMTI_EVENT_OBJECT_FREE){ jrst_jvmti_event_object_free(); }else if(ev.type == JVMTI_EVENT_GARBAGE_COLLECTION_START){ jrst_jvmti_event_garbage_collection_start(); }else if(ev.type == JVMTI_EVENT_GARBAGE_COLLECTION_FINISH){ jrst_jvmti_event_garbage_collection_finish(); }else if(ev.type == MONITOR_ENTER){ jrst_event_monitor_enter(); }else if(ev.type == MONITOR_ENTERED){ jrst_event_monitor_entered(); }else if(ev.type == MONITOR_WAIT){ jrst_event_monitor_wait(); }else if(ev.type == MONITOR_WAITED){ jrst_event_monitor_waited(); } } int main(int argc, char *argv[]) { int i; if(argc < 3){ printf("ERROR: Cannot read args\n"); printf("\t%s \n",argv[0]); exit(1); } file=fopen("rastrosObjClass.trace","w"); paje_header(file); jrst_constant(file); list_initialize(&list, list_copy_object, list_cmp_object, list_destroy_int); list_initialize(&l_class, list_copy_string_class, list_cmp_string_class, list_destroy_string_class); hash_initialize(&h_class, hash_value, hash_copy, hash_key_cmp, hash_destroy); hash_initialize(&h_method, hash_value, hash_copy_new, hash_key_cmp, hash_destroy_new); hash_initialize(&h_thread, hash_value, hash_copy_new, hash_key_cmp, hash_destroy_new_thread); hash_initialize(&h_mem, hash_value, hash_copy_new, hash_key_cmp, hash_destroy_new); for (i=2; idata; fprintf(file,"8\t%.6f\to-%lld.%x\tO\n",(((double)(ev.timestamp - first)) / 1000000), (long long)obj->jvm, obj->idObject); list_rem_position (&list, pos); } for(pos = list_inicio(&l_class); pos != NULL ; pos = list_inicio(&l_class)){ list_class_t *classID; classID = (list_class_t *) pos->data; if(strcmp((char *)classID->className, "") != 0){ fprintf(file,"8\t%.6f\tc-%lld.%s\tC\n",(((double)(ev.timestamp - first)) / 1000000), (long long)classID->jvm, (char *)classID->className); }else{ fprintf(file,"8\t%.6f\tc-%lld.Unknown\tC\n",(((double)(ev.timestamp - first)) / 1000000), (long long)classID->jvm); } list_rem_position (&l_class, pos); } fprintf(file,"12\t%.6f\tJS\tj-%lld\n",(((double)(ev.timestamp - first)) / 1000000),ev.id1); fprintf(file,"8\t%.6f\tj-%lld\tJVM\n",(((double)(ev.timestamp - first)) / 1000000), ev.id1); fprintf(file,"8\t%.6f\tpj\tPJ\n",(((double)(ev.timestamp - first)) / 1000000)); list_finalize(&list); list_finalize(&l_class); hash_finalize(&h_class); hash_finalize(&h_method); hash_finalize(&h_thread); hash_finalize(&h_mem); fclose(file); return 0; } Paje-1.98/Tracers/JRastro/src/JRastro_thread.c0000664000175000017500000000271211674062007021114 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// #include "JRastro.h" /*Inicio de Thread*/ void JNICALL jrst_event_thread_start(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread) { char name[MAX_NAME_THREAD]; jrst_get_thread_name(jvmtiLocate, thread, name, MAX_NAME_THREAD); if(strcmp("main", name) ){ trace_initialize(jvmtiLocate, thread, name); } } /*Fim de Thread*/ void JNICALL jrst_event_thread_end(jvmtiEnv *jvmtiLocate, JNIEnv* jniEnv, jthread thread) { trace_finalize(jvmtiLocate, thread); } Paje-1.98/Tracers/JRastro/README0000664000175000017500000000217611674062007016132 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// Biblioteca JRastro * Compilacao: make * Instalacao: make install * Desinstalacao: make uninstall Mais informacoes no diretorio "help" Paje-1.98/Tracers/JRastro/org/0000775000175000017500000000000011674062007016033 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/org/lsc/0000775000175000017500000000000011674062007016614 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/org/lsc/JRastro/0000775000175000017500000000000011674062007020200 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/org/lsc/JRastro/Instru.java0000664000175000017500000000371011674062007022330 0ustar schnorrschnorr/* Copyright (c) 1998--2006 Benhur Stein This file is part of Paje. Paje is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paje is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paje; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ ////////////////////////////////////////////////// /* Author: Geovani Ricardo Wiedenhoft */ /* Email: grw@inf.ufsm.br */ ////////////////////////////////////////////////// package org.lsc.JRastro; import java.io.*; public class Instru { public Instru() { } native static void func_init(Object obj, Thread th); public static void ObjectInit(Object obj) { Thread th = Thread.currentThread(); func_init(obj, th); } native static void func_newArray(Object obj, Thread th); public static void NewArray(Object obj) { Thread th = Thread.currentThread(); func_newArray(obj, th); } native static void func(Object obj, Thread th, int mnum); public static void CallSite(Object obj, int mnum) { Thread th = Thread.currentThread(); func(obj, th, mnum); } native static void func_entry(Thread th, int mnum); public static void CallStaticSite(int mnum) { Thread th = Thread.currentThread(); func_entry(th, mnum); } native static void func_exit(Thread th); public static void ReturnSite() { Thread th = Thread.currentThread(); func_exit(th); } } Paje-1.98/Tracers/JRastro/help/0000775000175000017500000000000011674062007016174 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/help/JRastro_trabalhoGraduacao.pdf0000664000175000017500000276637111674062007023764 0ustar schnorrschnorr%PDF-1.3 %쏢 5 0 obj <> stream xTkS@EmSjiAPj}f7( UQB(OE[wI~@'3=wl~;u'ߜs@`DbJC.Ѹ3gMᰅEA*u<N\NJB^}X?uJCp# af*l2"Ht>i ҹ!]qgn2%%QҠF`bT>,J.<JIq1*L(6"C?|c9m 1&GiaɌQ>eD`/i|he* h|a ⟦U4JMRưҳFc 6XR\)-uY-"`t(b}~ZuXgD1ʈ8U(GVjN[?r)/WeuA Er5_r3=,=;86f677dGY;9SP[3c+67pi,cL15w`CS޽ @j 6uxs)!Km=ǿ_,v6 u؞s3q+j(xO|1l!16N░Q{%~\5tZY } "]m˹&e\e9Zп]lR.y#K@!endstream endobj 6 0 obj 729 endobj 128 0 obj <> stream xUSE' vqVPp8ٍۛٝ"é#^8B]*Jx&hb$h|Q;{zvLbib]NO?H9:"a(/z #Z/yDPrZgK]uw;<|0evΈerñ[ʽԖNrcZL,Rڡg&"%PPnk )x19GͽhI6 8f!w=܍$GZzH~ MZbN_Zާ1JIկjHDinֿ@O >έ2Uyp7c@ű9%-Laa-=O"x_S٧?Gs=Q5M%vaılp\Ɏ -'LK ȿl}?3 #s $*KXFmZ޳+>?1t(뇛 ?i5`ZFy=g hš!XBPpϥɊ~V~Τ|-&fr ~wBE/Arʻp=XX힗W)ֵ`AÙ"1adSAl1=׃3rTE_?wV0)m}pvBɵi닋sxJ~PCp0ԗQR#K_UI@ߞO]Tb%C=efFfԴD|Tc֖A{F6BlpY]V&d@SwIrcӁ:"(XT7Uٮ\.,&Ta_;Nh'5#S.IZ< VH,ãz7*&%1:[/mS3q(>?hgžaԻ5 d5N:G6GƺAV@0Ό&f&&1uENLz 3,RMX  ֍q7>;*jV`:.E%@ސ|DtZzfiDF),&▯]sBX=•SUom=zr> stream xV]PSGZ)G I0rsPTbbՈVha'vd:㣯t)$~jEmݛ8n~=g#?@Ҏ8bK>"oD G-I8cdH2ãpg 4NЉ}#XHhwCC<1|<{N95{ ށ7^s`_l}E) >DpP3ໆG?/ =7I- 2 SB&]{l yy t"p9Exexc_`iIqJ&|w˞:G@J<5'{5z.Ư^RsQMHe-~u|EbrK| w=jhI@oe"LYO&* !XC3WoDt85q*#bR?k)$'E^t+ge-J8$"#KvHRX3S $j]ĵҦ3,b%ͱܼ )E 6pK4m +*wSfTE@4pJZzI:‹sYd >M$JIjk+>QR`BK!dԏ4 6 MA<2E1#(ܼ5PGSy UUFHm]3?%&o8d6PaH YpUQnCVhgXokܕݤ6YmzGZ$';tv\JNv+/3;Qk KhEjc_Qɳ2[SQ+/]78m7Aoh*SkyHyrt$ $P_S X D?ZҎD /^x)a[5mh_A^q48EJP*/'endstream endobj 210 0 obj 1433 endobj 354 0 obj <> stream xuTOPfL4<NA/$B\x"1Y>`\bd @;6ʶn0e^?Ӟ†=}w_ھ{G'Eu1rMajO |" E%̣U;UEKD=h׫+I#멁t n3lN[A>|E>D t s4`P]m0?dYR7|7 JN\/"' (uOiD-Y<{f ٜ0^! ŋ 6|ɩRUHd^;}[L$r;v] Xu\œ<1Vte"CZ a*"#Trc8DbhVwj$"(W{b".N=˕dV k  0S}8hF`抣iȐVjS\%ыL Sg# +zo.sz9YïDV|rH i'VSY> stream x5J@*za(Cc5(C`!oPYAH >oᚦ5ﳻe3fpl mG(A ZۥqC laOJhFeSޠgd׭fu՜RiީTUYj&խۗgO?W Oj(o0q\־?^@-endstream endobj 436 0 obj 276 endobj 467 0 obj <> stream xZKo&M@4V8+RD'yLÇ␉RSJ("R& ]tEyU%Zun̋.5C7sǒJJ'ǒ~h_ro9*m瓩rU16˒i65i{ۿWo2_]|m𵩕|USU#}=EeIr4^yǽAlL֢_]}6Jc9yvBr [oW؜Bϩzlkl|wXp<ӕE6pxVٌlƎ77d?a}?e.vljJo\cK~a  휺Nd|x R:SJ\>?3? ;n<7MnFQu?cS2'xͱq,? C+4us@ADz/;09_G#O},=/:q͉"^ 3X|*Jv"vE  bT,GSMU|;1!mhp| 0r=l8 3˪j# #+H<*{nY-eKG <<oak wfRQ@f D}*7T;;e}!Q >'J9f^Tjcf钦iEr")]) uƍL@8"M IEިNP-]Er鸅zV9P֜T5SQ( MMcYwI*Btx >Z’0]#dxYmkM&Ow5Ȋ,@h>5J lNܹRe_ڌ0MR+iw{SsʋD"^j*g_"\P\A+GP%@gQ(fl 2ׂl'OFDo8G[d؉'&yJ +I(ٷ'6D^5&;Y *-B3H G[1iAi3Z]eZXW*|K*_K0FrzTb8ZP q~wœ|"5rW.t[ SFIp19-ڒbus5 6yM!慐/TMMx{\f@O @SB =Yu!Yub03_I+]離 s,jrVS;j}I8TFo߻|dl[3v" 4+%ߘqJ-+(nI6@CoVn^K ^XY bXU{E26g'jyE ȟM_*qrV*Tz[z M`~dŐnEW-cpeP\՗@JgQf;bC :I@[ WIJ4z}꼂7G}ǽ.Ԅ5ٸJEt%+!I'߃iu&Qk6Z.’mNߢ`" f Zhִu=Ekr{FC> U܎~H|,dEwE z: Qmjkؑ΃m3.Zendstream endobj 468 0 obj 2512 endobj 518 0 obj <> stream xW[O$EΚ`։4Y"6/aaft 1.8 ,x]\q] H|RC5C3:uwΩ]EEwu+UH0&~V|=59H ѬhVNW,[){ό7SpZJmp1%?xh_RW׬M ŦF0קަ;WX&Qu6l #Y,ݘ:}L+3fA0k{cb5Ңh = [qX14KѸ؄|;KHq)NM?P큑U۱L8݈m;M?`bme{ (Hx^{;,& NOQ'n [̊v\-e >/ࡧ9 jh/ݎRE*֮WjťٹtO;n8:\ ؿ/T G(f3yN\/Aٵ׷7|OH"%pS(8o CDgp gSJ ,I_ [\\/4* +Ih3EyRZ.lMa+Rpj,s 52Ki<*6ơL]  no)b(i~*HlhD?[ oGZboJ~qG?uɅ 5u֤0&3~xR $)Sд>)8ir`4/OX7HĿbVp$W;RmEy,<5Mɜ^Cɟ~e!S@B(93=!Ѡu.e%~|%_r Hyc aah̙,xl_(!aOluku> stream xY[oGVUBMI ag6[z;-\aCEBj@RZ{gPsggxvʒ9gv;|ْ !A>#c$ v92&D]l爆?h[J"d|1߮-JO˲bi0d(tQ_h48uZP{w'm[7? 0cP|8$[d1ƥN0M4jH=16M?ַG3jvF؀ Ǻ*6z avd!.=H4'&V 7D Hs8}v)6Hsωf8&Dhe\,.Ø`Dշ OmTsgEexkd,ŲC2(' `fV5^a kF9b'A' ХTWgF1협(E4gQm=b2-5e+Df%^@\5c(uk^_p'@ O?u3u[ⴟ'y|rҎRƼ;JLKBJyf! 3-uHɉeosQߌ2Aj@b\ˠǣGid6bZ\L 0 ai $#ğ #fd@͠Kj 5[Nx> stream xTn@. R)T<[|UQav3l⼬4$EX Ūk+e+vC+1|n +%g a-ʞh(Ka{ GGYU>kc ߬|;uw72_ca UGhh  \m m3az !602{5Ә3\-s*%`&슓rC8is}endstream endobj 587 0 obj 530 endobj 593 0 obj <> stream xY[oUV" %qH i iyXg6 mb[D2"+*C+b7y˅J%@* O@T@ŞY_IZ*K3g93|3x 1_B`17cnQgq03ʙ_HD ˌ, 3` p<3s% pz4vQն>6E4h*?ܙKeGeXRZQkD8sD\>~g59"PJ,j)_^ʩec o=&4 ]8 zA Z$ErJ 394' tR!1=4RB LN-OB[K%ӓA"0Gd2(FT)]M*:L\[/Z/*g!Q'G7,9D[1xw"J{Zfh}qc2H1+c6*"S#ȮcuV7_r6~PRx~g3 "YmnF3N4A|q|D @f<5Vl{ AJF-k4EI1g%;a+xhX9dgxӊVJ#a~+@c̥R7]}63 `'OPG<=Mn[^+@G/E+J̥ fd8#QYpJ?L^>uޡ1* uz2٧@6#\0"j>f9Vt 5ЊӴwXZ2m@8K4AZf߅fx<6 fB94mEZA@=S$P ͼ MxYSuDo-?HbZ#ثé,Bn"R(ΞA~S4?wvNxuJi^p }0rwlk׆'ڙVN,6~lE~߰.O&hQ Oitʨr`twOѮn+rDR0w~h4:g3-?<v6r~!r3)}{{ghF+MOd )lhQήK!1Am$Z$ծqF˶S v>~ǔiy'h *"v)Qz|zUb1US1DOVIw$$R|iWK9>n?I(ځ"P)d~ z usC=5rB3g>Bușx@o(1-@wۗ^8-%Ma3_ d`)䠋^!S*rE<ЇTWB.cXT-彧0N+/W@sW=Y4Y@ oE_=7nke{ߍۮ}1CW\Zzr(1&7ϝ= #?7?nP(l|Uk~QLvX]SOW"ʶ5uǢ0k2endstream endobj 594 0 obj 1624 endobj 603 0 obj <> stream xZ[l 'crY3a/0M -/`< !" VZ.}ԧJ~Dpr1!54C̲2MăgΜw b$smU?s"DIWaTCZd{KUOCoXhM)uo =Mv p:?(A2 ~wo\=.Vf1b ~DUۿx0z`p]=rMC&??;r׸X$(/$G>]:ዑq 8zBaTLL7GHx #?y.] Ln3 oCL[3}K'ׯ h歿HZlA ٍMsB .jJs@ڢkIaf8gOr!%Ȝj*,`%YEX_`R?esKhyKTLe3 +^mBH>m܉]ѢGcƸNEXIزOrI%:;|9[[eg;heLEcpmelY GWq9Ԉ KvNe5;<%{ w8{|/7_ow܎gNs},Ȓ)/_㟸q{| e)~P|WٰO ;3?^QOVUpdo`:kz 'ע\BϡɌU6DS1StzLbΦ͉-}bLt,K<+58tEzV}e*憗|4뵲UXr)(IE +QC3/lWB)fCɌUS6:l65 R)U:6OvKX={&c=dhr`~Gԋ34>r9#[/Bd^G"{@bLb é84/plzz:yF$>V:b܏w@` 5ϝglf7։X/+l*O|P2މs Lw<ǦCILF.D2ֻHқY 7Z5+/=uNĻ:W Q-ΝkG*O>#^]7ѕG{O^ͫդFljӗ_Er-[Z2D=KLmkqȺ+-Ș?lPƻV QØM(z*풽l(bY 0א;7yUWj5ŽWv/\_z)2BKGnCYVtNbsj&(xwto|Ρgt[|Xz~z`QV`Ǭ?\|#MTOeI;١wJ V'[)RiqbIdwrz}vX~#W8HVoVCy2yȾ#XlCJp= & WKkX}kڱ eP5 im8І;7OVf)3 \5ȝR T-ʥJu].c+q:D|_NjWdH4h4{6:/z%ne4 ?:Dݯre1v<}_\:xc+ mݪ|o Q"h+BH!1 szbɈBhxOߛ1uovo<2@6_ЂΧ ]E 8~ò)>\d}_Ma,UEA'uthMyVU-LkDy@k2rlG&RrJo]=&`g~ mkX+BƊUL07!$+nGJYױ>hȗ9HҌ+83 Ѷ c^ҋ P0m5PNt ]UK\endstream endobj 604 0 obj 3065 endobj 654 0 obj <> stream xZoTo@y;N7wR~yĒ ^!`ת` T!K!p "EjB$!奍S*EKRU3w!ι3gΜ;sf.+S4'ŁuR\.)LYhD*)C-pq ?.e :7{8ClNiJ qfoS14?Ls5zg/؊j?N]R/5\`Nx ˹t;kX'ЂR TKd2?@B N_<]Tcz߭BxvHlJm}P0Buni^5M4o5*hlnTj3m5Hfk)uVr\r6 3.Vr"c`;A,0:&#tx!ql,SљwAvDl:[.KKHƚ=B|.||A/4/rEݍ36ՊT#Dwr}}*V\3ub{ rwr]y`c?"3YVɵǎ+`̾٬7y=7;U$g΂5-FMhM@w?uA?䛧HPo5IهGV(uQt1%+RbLM>l7:l&-=dU@Wn>7DvoQh{\2[1u}qA܋J}9~iQ!yfo-b-VOU/I~4yՋmeSô!Hp7PU5FyMM71&J+5^QNLgPQs/^tgŲJ oȐF_|-ô#XoH](!P;c?tf{94zu4z ~cwou{\#bv|zWo:kOZ;sum̴ xOVGO %ZW^֡t{zDuERfՏ?BgeR{CeP$$H{^݇Q%:(; lHW/O,Rz$GmN$s8q _<56t 09k8kf"O(d)o R^Y:R[v1HaPr`?߅M]c s"i{_˲BP>O(@iR ٯQR7 ET{9QC{FI ):DRt7#eчl 5MѮKh q[۝ 7uiւ=h:z> CvOS!ua[HQKAAԡ9ȄU5v2JwR[5R;hy9yܛ"u^c]f)aꈃbznƙDEF2~;nJdzwҽGqo A zDZtWL MI$ӃYK}u0 iBէMhSKVKQZr]$7uOhfJ͑uS^ӷr-J]ē^AUzj#nb8yK)DG 7KRbަ塔34e;T%_͍ eh2 O%" &궵!{mGы`Ӡ|-궩+ffTSxXaHaAgeTzS@hG2m uHd?bZF>Phyk#eyA{>y.2e+@B&^Ĩp#˱6h,ߦsQt[{׾$H9z{~^hyJHDR?$.e1$2$j,ݏkTn7~PD ꃢ[m_YqUyX`ֳbQ*m|^F_pRJUc *ReԡKh?fƌ[f3&8SE3=d䉟x0gd}7zWҮ;aӻ_S">x NHl䡆yj| foFhAWN} x$o]: 8/T7c)C_[$'H尦W;ny8\WuZ-}QRUN@q Fv_M\:,Rg+'_8VVaVruUTt*6d@Q/_ZfRBw{%߹MKm/!G?,+ $;b&e_e_C9[cvendstream endobj 655 0 obj 2807 endobj 672 0 obj <> stream xY[oUT %nhMŽYw]ۭc0% j")*z塂^xJ}:9nE̞3gofJ42_jjR~)2gHLZjF|Քe.*HV#ɡ#O26:8>!M](e,]$O:%dӚ;j& 1&oE欲O>%+9XRĴZ\b.\q-~ٱGS7H6fޣRy{rtݥGS聨vI {!OTX5Kyq|#vQuk- FV+UE6-tsv3|=qLSsRG*|d%ۍk{=_>{8rF"1^hްn22< рoZW81lJ KK)L,k^]0{X~E"dǑY.Wx 4Kg(== &ĒA;b)  JEG!&^&\iV Oa`GnIs"&0Jue&k t: Iu7 K@ǎ\Y#n+S<lm&&3jҕڱBˁ؈iAͶ 6G:[&Dh(X̅Q^!jߡ(`psơ@jzL–SwFz]k4cHeN GO񝟕/;囏Kl_<T~w&o~nvó_|ǽ޻s#^{=|g(ʌUO5evi*AH:F@:YZqGt+}FUkH4hK 6Z*6& );@x176#-PqrWUڸĥQ ?3HT UYKuJAFWer[|:p˾%g2!NjkFMmXH:-B`w#BAAJRO6I-ds2Y1UM{eceܺ9tkҀƾ(!pU2]D =lo @.`.89Ʋ]H.تL[e0[/^ 7(9X9)@i0Dć՜:&f wTT:'6 8'fr~4K_'1bȎ15ys(rh絩Po: H %cY{:궀 $9`ߊ2pQTwR)IH4ܾ eJcU92HOY<^f =@:H5>]=MU31}lp "8uU!0 EἨt"hgu^@h:a8@}D:+hR;sĘXV3ȝSi~MrGv/ M1e(׃iyPi r=h洝 &+=C@ C$N:AB-ׇڮb//`†Y sȍ(Yfh%xǫ,|H> =s\j%9Bw|\S礉w.̂,9ӳ~Ckyu=؝C;?kLrUYۭxMF(##B5_m#/gAB(R|0|Cj} 7Ss1ۤTZ}`0!M0o`؞͖$j!ś7J._ Plendstream endobj 673 0 obj 1880 endobj 685 0 obj <> stream x\o]uGH Ymuaɑl񻞏;ޱ ( E*b H}%F.j&u*Ȣ"EЕԍsΜ{}RX5=s>y>x~>74g_{}z~Y~rqo.eE;W?]-|iϿ?>y'߾aY`M{>YUW4'~E!S+/r3#߈Y ^:QDJwI.|%s3^2~yNHQKfmD")C&Tb慭ŹdO?Jfl\~Xތ?Jٷݎ'ʋ,|{&GkMfW-'3Ogۋ&2YV"nK>_MmsL`Hg^|vO%sVKgq#ǵ{S\0;jGC'^&H t;N٧&[NxmycYwlBxm~^EbVlFoFtΟu..'9@Yw:,.&\N7E0[>[HmwaQ^Kd.4DNeyj~ZKd=b§Ф{#Uy"ⲁ$$USUXr*¶AdΧMk˛hn֭L?2I3 wFҚ@N}8Rwז!W{silnv.z$>5w!rMڪȡ ^X[75փg?#r%s3`$ ߮6m\I>Q ws(qOkJnLyi魚#S>Ou(ڤlRN.Bݠnl&.)">P@g*w=r\^d$!:e'wEM4RFE 6*`Q;hҠLO .[AMfȩGj\?p=\I-Ɇ^÷O-4}fa O q.n?ϝYK9rOSpOq@'!hGҊIiy 90ҸF@ߥ7&! #'}, 4g1VI*ڬtH5ivm};d!m; @^[!~I]*]t!!Wݹw7h5r!Jt6FeN?mصc/9BV~D<#3HnwCm BMkS#BpT?U7LA1%u)XOoR$v.vc"0I%zfhƃزӼnM)xZpYԕْw6t`$ؿ$9N9Քt&5yPy=43W6/{۽!*BT+cO,ϨDQn'B?-"Je\e]ꇣNJpƬ$ƀR"5.($YJ3UhjC}J*<˕eZrh~*nܩ@Sm:bz WeRD)/@DR 2bLe|8Y^VW>"O(̎WȊPɒLU"J&3JEfuO4 [ JR c3 G4P A1 c$E'uqPyP=%ڞuJx{D4-5z{:֯ZS6=> 'tCdP1mTx!3;l%XҐ祬0}Ç8 N'Nr9>@immKYb " @% ގyYl$w>Ijg+Rfm`7aĖbyivߥ.3, KV1e[OM:1mD_f-!<>1d"[UhhItJby&M,3Q܋(F #6a:g7Di(%*d([%[ ɂk9a:z98q7oܪBD3b:"=W@5`6B[8)%sm[z3y,Txp\g`5BDw*T۫xsVLgM) 5J_ؐNv= a0 9s)ea%Z@Mlc5x4Id$[oHJ\9u$0ŃBn̩eT ةs 4LIֳ+EabVJ| 9JpV#m*SGQ1E_^l ~g= ta{&Ӏ ϶ "F@#uU50a2s:Zj ^cOpNjbh 6{AA+}x sD EڲMԋ"}j,/3Մ>xFxܪ~+RvY/S5?[w~xmto]?6F Oa@Bg[߾6qFY&LY7w [w>m?ǀvYf;Z) : "kW3-#5pdJjȄ j}8W;YXo!ZrvSwA{m«{^D.T|Wiu)kOwm}K[ї)7U.S~ O##w!![P8oH/}Wendstream endobj 686 0 obj 4679 endobj 705 0 obj <> stream xXSm2Q:1XڥLWHZiWH"IWJ2ZiE@NCZ(0q:-o}L$}s{WWXawsȸxƅjYòhYdx5e 2<3ԗ:1N7:,we~)sroi"NX94$ (xϻH 2JPX %ByO@\$Qu)!8E4#ÚA/hōZ9͛|0B\ $HZ);ae1͓H `n:.Q;o!kE$Naacq͑AR4yWd~3_jJPKd@FD,PHXT^ nSN 3L?+V\)vI~#tL 33&J;$1mA2/P{;8Fѹ<9A>mwwc<"vѽp=^qXQez`l?yJ|1eܒys#a|h~a4&&񘜘>2JY6}+$xvxjlc}UΩ\^+ <%}qaI+tRY#o\3ӟXWVBڶƩ5X?{/S ^̍giۂ~X[TdOcF? gQP7l:bKr¶?7rl;Kٹ} zKKLP*O{dfJfŖgbCbykQ]L 8+^gMW2$л+~ZaN]vq_]֓LTUT_ͣ8i(mA&O/R \MRP[p$Wl5D̐ 2 q^}ntPP;(#e-ìE@cTa>F5VXz h)@uc4pb9#ų3ʻl59}lm-h ߆4 ) n=!~i T7fGx$* dy\3Ú Ϡ`CZ@^g\OXlGGP߀Yכ.>:.2 j5^H]endstream endobj 706 0 obj 2366 endobj 768 0 obj <> stream xX pNO݉knl@(4k[++D 6㪚JE*yE Ą(1 i$MAZ镐޴-%I4MxF{{ 7[O߫U$*f+oE3o+6borEhcUܲhʪ[X'Zor=~jQۙE+\zWxIE[+ƂnmAjrHf. U4m4n3_Ѽ?<_ kbSUOIГ4JgOz?Ҿ>}nS{YV<]†{g6liz"%;t|_ZoԺ҇ao|WL.ԝгNA?Η*i9Dl%r{ލp-`)fSQ6anJ*RUa4+G#+R~^e-!N}8INȮaW8ƔmZDuwD=ji37ҭ u V3=i}#sѱDSiVk-3s2bSaWP \ "][- !9  )BZKK3 p~սuBI0jM3FefcɒX"Kb":71$ ah\VYs@a ,)\!kIJ/|(KXA=z8 w{0HdBՓbuS'WD؞ĥ,<q& jb!CD􃹁,8n2(XU6|t{3|sa_ KUI*;;[j ^ a:!_r$(@;Vɧe@,t%=zv\v 2 ozL`!8 -K"%dЀތsd 2mjSU95 w; * tϩ)? pAݰn{0`7STuaHeZkmGFSoԂBxe>-hxS.k0H,o'DV8RbPZDjSS*i:(.gmNUD@ۣ!U_8|x?vV0I{@dŴ+{6j\[)qyZ 7"E/ o waqY!ͫokOhR@Q:tuQu E@99fheM5tvUAxVy2`"+s{Q∣eyu6ЂG eG!: nGֳ-uyI1(7rܙ?}\*9Bҩ 'R/6ѦA`1!ԸPO.}"wf{0т6G ݌  M!*Qu~~EP82@DB`Enxu ~r/P:ڇ]$ݤn tdOL!-F~rgLN 6F21#)ל`].t) 49-}D س p"A ig *"&VLx &7^W'ߌ4 ;i8Vde g8`LP#{scq@Bf.3-/: w`cun|+=ϚC流RgIy4ٶ\B…y "-7U%u&tyMJZ<IP_ŧjIh0/v)ѹnX*QsRLfɒi ~ځ8(bt Sz*j^FZT?P sfYg=Gjj)YY w3if:J4g|M%v0536ZN٦ .Jr8𩈈*AӴya0%](S0W\("!}.LHF?z !ac 0Л.#2ܜbtFOE==EhlG`a2(8o!>Xd x)i|d;E?ڑބNS!_NGڏ"xBE okWB> stream xW]Snf2l\hUbZv% f .:Ni+j2Z8q H]v>jIf|[w:ӛ~wh{缻3I~9y9Npy''8m~\#Lo.mqfCGT;^0 6N>wc5fkfj8jw?Σ'^쳝  C/Kp'EwCR }}/rFLc;G|}H3#[/<- >pF|xU+8TMOI#CVұRC8Q8!#;?|eFF={Gc# bK&]'9a55Tl4mNkX:ыg53Mo6Å3g_%S*_bӿf1-{nhlf(/Pz:P7F"GpnWzog뵌<\9=ۛ/~2+Gc~a|zDw(hAx9êL0951/ڗK1xn17*QH7/0{4Fqkt:3|e,扎\^FcO$R\GD! 5`/>= _R/@Z43wM^7c- z-gx.fy%#QHfcVJ>ex-=ԻURɔ@(f_&v1yBACrx\VeJ(jTT@I}.fHqnjjkv6 ̕0,SwH E;F7$1mZim96F;SJP*.)a-45XѸ.9c3=2Y~GAL4Iwxlr z/Ⱥ`YjRO_/1L7]<؂rM٩ϳH>f&Ӵ@*+@&y #Ԣnȋ f6,fj1;Uov,J] =F{bv3`}Bɾ\&=}榧1CzК*^VOv@pSʂW<'l~9cv%YR01~rW"Xy(kw]s}5e xHa`%MJy&T~vՄd54]"1S@7svBo= ѷYET˕0|:Y YOZmJ B)ү|xc6hVI~r.C82a&f:0G be*6B+aD mV1Lbp 7{L._ȳdʕrL%MSИҩ.l !+ykȈ,gc #U,:Z/bȷsߐͪFUEQ=yskL}v)q\,[·Qd3ce ;~me+>aF efΊCVj| H;w6c*qOP>O 7_3^C=! zo>λ@SêُmMښ""۟iVC)p6U&x7>m嶃u+p0TǻUycwb FF<9{yׁOԬxhawuuV컱,nR9pww5:ْO;dI4Tv~ƳÏ'>r([Wopq,6McU7]15þ sŦZ\㫫NDzc v'62?o6r^JOz&'rj޺^6>ap˳d2~v!XkڎoI5ׯ).F &g"x|endstream endobj 868 0 obj 2591 endobj 947 0 obj <> stream xXolS@2%Ky@}v)š@D&~~j u2f !8֒A5p`eԭiveJ|6>L0ik ɱ=?s~ܷ9ƃQr'ÑgvW6c8;Zi >rպ浦*博7k㪧T[GL'% Ԫ}ʊ6j޽閶͛ ݸ rvo\+Ļ8eJ^XP0Ԯ= W܆]O¿Cae>1^L׮ideŞr"o=^6sr{{TXSMV/o ;^OXnllڃ_8'Z_ ۺV@m"B2#":jth;hrqgߚ|38մçxL>ģaшe5='95c?#gz'2lXԓhǝ ǪgјZvƝF҈g@#f3l4FH/Z8A3 ѤXo2uyG2\6O1Ȗ!VGokո3cAU":vSNѬaT-dU>wq1{Z3l/1eLl|F; eQ)F"N  h S+t- HFbƖ?'[4=g/>jb,\c$'ؔu,zJ OY#I ;feB'RQKf5]NĤg.+,8lpJĒ#F9͌xA6k1u|Z8膭 %%/d zeeԖKv8Rz5Suk'ؤMo~Wʅkxt|c ء%TH>a!,t)_}|֢/nP@ɴܪy;TW?rj \-Cj2l a@# CgDB]tf$2 9V""aI+kCJ+`,ޅ GyI@5lzX)SZOxOQC1G5[n[uc4t0pfCdbio Ae }c''bfak)0[6A,z'̉Ntt G3K~Z+._~qs|Sc^=SwqhMZ^ #[ mMǖ.i<'䫛]s ՟gղWm_jǼ)vO}`1vӅgOlBx|>> stream x}/UDPD~W\?Nw,BZ[ݻ}JՊdšl&$CQĐJR.!1. MB9PeOOy;s"sz<}烗d/ o\_|⃗`n\_>Ń^ǞhEXNeJ/o|ks#Rotv>o|ۺe_η|@vrc{?7$iaM54pB#~Ńo͋si/|w~C?rG^mֻ]Z{Cpܲiǜ;S(/\OWB7C~/}g޹ɯE YZot祧^ݺm\fg?v=E˾<}?c_Ο=eΧ3/v~NPVzZTR~w^?ss޾d) ?9kcmA/#~G?~4~_T>q?w\OzO zoq.Stf&-M.?o?l9OO=]{E3`{}qx<[#^˵m&Ory%WqHEw|^ۿ꩗u#G|^&u'u;߻uYWtΟz*ksi6< O<\}/osSvY:}fh6o]yZ~}f}Χf'C_}ywo<4kO>TLNeFyo O=WO= .}Ţ7{[Kx<:kwz~2r:n)|~ӚSV9m?$K1]>w\;lWQ]\][jE8YtN!]ҘH>fEa'3j-H\a\;eCy+Fyrt@VOC5;[d˥m$?{;?G:妺p~mȏ^sOSG:Q<@2P ƶl!( -((Wg NCy< *pg<"lB8uVBh9O֐;sPGV4F^Xe+j geaZau2܄VȞυAW+uNVq+v"<|mc9ٟ=k} 9EiKd6h7WK)'oz}+BmqmlB} ojٍ*}{Ӣ:f4*kk3؛Ffx\ }5G*}Qf^V>ٟ=tz}؟3bFe:'粄sYx\ސU&WJ .NRjrNf^fN`P>ܙNtOG=SG8zy϶ؾׇN뤳NB_'uB_'|%XPOK5?ZCufjPԧuN%kV)lgj3qMqr7Q7Q7Q7QԽ"""MM!fNMk֔Ї7O8xNN- )ѴoөE@x\ Z_z}_PT`KN.J$ ^OQhWkקMYg™t3 B8,Yg™pf!B%\qIƥn =HCwU *pHU *pUF*#:EJ<>W>_5m[5䨦C/&d6K I]a]tYTfQ;kmӑ赶-Z&+ |HA]a# N*^z\z\z~\?̺;n]=I(/UŃ=øin0}#QE*IΘYS~J_{5qM~5k 4QirpM*5Qi#MD'T$KyR~ɖ?ʖjВ?W܀lr:-89Ј'6?M^y>8Pm+4%9kd嘺FVn". L,"njGԞ+˘5)w _ucEe+;B=aVKPV6K+n@ gXwR]Ǵ|p3p+|ADn,A:6A-F>Cj]qҌ"_*BI@vdoEr~6ylq]sN@~ujiHK_B|O|YȎRv"J.ܜ+rA:mQtA>9v K,o]E\$1$s:}I#|A}ޚAB_Mد/ }A[^_T[cd6כ~}EQx tG8~G8~?B Z#?PwA0C>Ph347˺{u&>]oMi77ĶIeBSr\SH\A=Z@}r^iPOFjrk5>^hCuԫSiN gV>^I.PO~ƨ'A>ͪêlII?U^mIg- }=O }='gz}:_N͈+j+V>=Xz\ᶊGu#zD_:_@޴ }z֛ככ^S QϠ7?MD_O'-POӟa02:o0$#o[No1ݵ g4gN2@1օԫSiUd)j؛^NfF?X*'p4ovݴ |>tto#oZNآ?9Ca}`h}f}~9QG}o5Y'a}2r`IR Ud^FO 65+)=o1gPdg7 3?HfHncR;?]") I "<$*K.d@/[%:ҩdM8N1TR{yC;Y9n"u JRBUW$8Cˬ8W<6 }ށ>*(̧.*hz}$Xy@ZdiZCRA#Q[Dm6^zuڢF[pm*4LϏ1߫0#_[mzꗗWkh1/A^^ NIm?~@:k $S\ąCE#ԧp(PgIh^gڼ>|@/lKL) 3|au4*L],ghIF+n@9nzLEU_TWFO}AI"(]H,[iVI8RGZbY/\q5B+?ũ "9lNVIbI.J.7XndRv$"Qq:o!)N!ڼZ|i|>(|B~r!\nɒS&^ nђKPp{] ''E#±'w bRUռs4HZG>v [y,u@x \O_hW):N_h [ЬHr \qW [BE0Q日7SD#e;)<;D#e$yS: \|sgmx,H֟iM ېyg,>CE}9w .Gv'74gh!iH&/o-Ъ QһI #Ӑl.vSӗP_}jĝ SB>iS 1}H+|!Zf7 M\WP\eei?}bp / +/p[svH3KbYhێ}/\,j W9ǖŲ([ Z;.u>vF^3HJ \q=UF^AS$ɖ4!kJ-V+q+CQ5#,̉ϒE#= O(\!+#/R'gGO-ߌwc{E'ZܙÐQj.}/[tdcQx4 GٲÓ2IޥW ]zvJ)wv ]? _j -+D" }2yЗйq}Nvgs^am򘽉pj~x,א 4ɓsG8z'Oշ湚ZLP}i#(f+ "Ri|sY D.q K a?;E]\=l0` -M D&ngڛ&@ N @E#z4@,J.֡eu5ofpK._WA2=5_\}\W#PjCGrMN:+2muv*Ѕ$#J.$SD#х"PԹbI [VN(uD8<#J$D#Q6z݄DA pB$݄HAXj7D:$.Ky M!WCC釢8~[t!=H'ڡ9 Ѓ΃Ckq5N*2g *x,uD8:E:I i2N2Q: \5$jj8=ӠɣF~`pr%Jb wHlm@fRGK!q3:"\znR{8{9 q{ I!?WCRGl?tyBP Bt !CAP ܒ#AG@#zbzPDp5 EAHQR() BtuAЇ·EZN/>$RG8  GAQ $6±.IjBQ (9 qGA: (HQr$ hp u8 B GAQr(9 BtuAЃ΃,zV|TCt$!IAHR'IAHR#)nb}Hs!̔#d)H)GRc)Y Bt,FaBTRo${KᑥRxKᑥRo-.#Ku,|۬Hكf:Rxd)Iᑥ~{<^Rx`)oRxd)Rxd)Rxd)GᑥnRx`)Rxd)Rxd)Rxd)Rxd)Rxd)Rxd)Rxd)Rxd)Rxd)Rx̤:#Kᑥ:#Kᑥ:#Kᑥ:#:"#1.wtTG*TG*TDJ;x]\lf?L1 L1 xݴ릍iI$x148tDG"-Fw 6 hp`_߉ zp`_;Ɲj_= ᜥ;4!j+> Qp w}}=hpׂkAABVB&#/TRGl xe׸(uD8z\"q<* ./RGK{E#¥Xm1җP>B:"[zōwm\ "}-F#}-D#}-n[xwJ.+|p .ҷna6-} -} -} -cf3bo1η8bo1η8bo1η8vQ}Ѓ΃ ҷ[]o1ҷ[]oABs!y/CBHB/o/}2.ҷnq6-n[xw Hߪ"}ݭnⶻmwvn1җ~8kAouHB-[ݾ}w I } -/Hb}߷o1җ~8@ou@1V1'("G$K1Khp9e .7x_ Pp*уNI+4${+4x] B%_ ]4{iFfo0uFfoBQVh0`%L7dotI &]${v ${IFdo0`%L7dotI F-p†n"! prȲ7``o07`ߜ6.kGX_Bc}I~T: ܡ8Ao07``o0}9s.@{ʱo1 s.7co0^~kip %[8D} FO]o0`N~hd/?K8wN,rDrAPqj"<,W"<aaAe#±vb/FA:RQH4+AY QJ5i]h/zA#2Y# ?V.դ ϒIh>p@+Xn$U 9c >Ts(ܣp[y8'OGхV.хV.хV.qJTZ\-8SxOEjLЃ|VЃ|VуtvH8!NĘR 'D QSp++Ѓ=Hqy t}EbLу1GWeΈ~[t3B 9!t}EfL.ЅdY.ЅdY3݌!S'hZn8-T)Ѓ,z,+Ѓ,Έ q8Rj8#nF48#lJ5OH *H '$)IGR$$)IGR$$)pIGR$bD{\Sa㊛4J5iIUB3hg3x$(Іp|*iؔj8IWIG&y@86\-xF! R }()Nؔj8kE! RM.B#DGu"#D]>BX?;U~wP:"=Ȣ)Njh吐u "&$D]BBĄ Q1!!bBB%$DLHH$D]BBw .: $$h攀 .!!`BBKH0!!OMHhAzOS}#WDq) Jť\ 5<tkx!5<XCk"dE"`E"dE"dE"dEx! G#G#G#G#G#G#G#G#G#G#G#0i `@% L#]@! Tf0`e WCq(uD8E#хd/J.|5q>W;oA2G+q(_8JW00tq:դ kA'{]?`?`?N3$gPj([Ϡ]?`?`?A,-hp]?`?`?A,-hpC]? hn'jA(uD8Ygm\հr?_:"m\RG[_&R^5 \ \nRG }Qp|M }QpsT>CA}$wE#±W䎾(uD8z$@x0X.c=HsWCRGl h ·B1L_8vPL-a/tD;Qsq0aF!unbSsPDĽC >{Qwq0aF;PDa"b@UE,Ѕ`0#nFYH:"]H,$J.obI [sWC[7 RGaFY! B\ e#f7G]vsQqc2dmLFܘ1u7&#lLFdD""UuTED""UuTED"Ƥ GA:ѐ19겛#f7GnLED"ꘊLED"ꘊLE}ɨ"*"nKFܖmɈ.9brsKnHTD$*1qc26&#nLFܘɈnc2bvsnbrw%%_tA+09`vse7nQ]vs) AYN(rAQܖ -tے%f7ݶdA09 Ct E1w%#Atf7n.9 E:")Aw9@vsn09貛f7n E@" E@"w$ AtN̝;t)EQ)EQ)_8$O]tA<0y: Gt8EPq9Eq&O]tA<FT})H: N6l “ 'Hwdҝl <$MxHt }@t>aO.'<@xt'O6l “ Iwlv_d@c}=5x]XS^w)iꔴSҞ%eNI{<%1ԗ~<^{ =jPPSOI{)i=S#}Eqׅqׅ㾋VZ31gr< xѸǜ=Fq=FUhYK\ r< x]΀ǜ9^31gc΀ x =^{=ޑU1~WCׇx ^w#c<2 c<2 c<2 c< x51F۳anjbnLoME jL vQ6qd䎑 dQj3ff.p0ۋt\M\nBm$=cbzΞ|0vE5d1=鴄$7ZG䧧< ʮ'v}1W܀T}T]4(]$v Ǐܲ$*^[?_R ?ȵߦ)ҙ!y}[^~JWyUk^U:ma_z!x|ߒνpxLN~p^1i˴M([8Rjtx0KI:NwyȠchC"r^9F9]dcr(>~xpnj'Z@&0&a"aD`D g&rfq1 !7BAfCC:zC覉4-,VHZBBV<Φ0Nl 6ͦ0IYBԛB?cP'Lat` O]♺9WR)` qm FaQX(-,x|Ga#X[@7ak - x/- I HhIXX $ $ar*X?QucO$uC3z*כ@M` ߝ 0ҙ@M`;M $q0 8&4A@I` Lb X@c6D 2s68tXϣc~/4#8N07 !!pRb,{bBFLFO͆o~VZ f`pyִBb%a20X4,g)s{3:CH a-཰7)7zSNu)7t(:S-B)+L!X0`)Ahl0o`0q;Pf)+Sl ꥕)kSy'kSEɘ:oL߳,08Z?S5he :Khw͖0kKhl UJ8.ʮa5GݛbJJ-)\HpjRoVS޻sn*2AWkȄss~q)~J{Qd'6/S)짊d].%4l"|.#6˘½ləg}=Spɭ˧痨y}2o?UfHSOOhTe\FK6:v! E5|XӳԿ&35.. 9lGe!W sy=fq!C5!r1R@~7ws/|w~p[|Ńw>w}o<KrW~C\4s=tG.O/G>?ɏ{?.~ڗK^7?k?~KK'>wㇾ?{>o|u?_|?yۋ_s~r̚T#?ոF|?Go7/^zoї{5oplk/ĝS_?z|+~?C5=߬MЄꄹ 0"eQ~f}fKC=76K|};ΘߩprpɄ ZI-BXU`o놺,*W-8`^ofAƖٷ J܏Ugǯc'5y?㯻/¿w񽏼~|G~>_?~~7<_}o}onu۫Eǰ1޳o\يGy?NJusH f1-ӠŠ:ɑo*MY []2̦۸1M ,Cm">~7a^[gssXKEnT;sNR89>zh|Z|`Pok70|s-kؑטV++6{Fkatk<̽x^s*=0CimFRyaTRm&rcƝVC>|0^8g,[yV{i# |t &;szw-=g֓ؾR%rzޜzսKm1)ؗylzyX36<[/ح5͍r[0c|\Oe3j2";9Nͽt6a# Y,9嫻Kvj}Q+ˇsßX攷ec[pH'5{/4} =4jA*J h4իU(cR3ݺCnbw{c]6ɁZ=['XrL,3E 6 Z]I\O3jIҿ XEBaXmX}h K=aswfh!y3촲?G@|6Ѝ>=92ݯg &03OfS^;S=x[ tv %R3t0ж19:]S?K2_R 4wƐ܃)B?7.l}&{vk iGNY Y&\)s~gX%tm66>Jnȫ䬆4^Mv>G<+~x[HWlDzOb a葏TW6L3>4'_ֲY#ݘ6]=}x,,k\c.5CK޺.5Cs~dh)9 Z:v,P$f-|9ݕT,ZjRf,GB9V,z1պ -1uK90YAK0CKW uey0YAK~ۏ--]ZJq@Nvg'A -xR34b1h)74R3S},=OjO YߤzQ JB ?/?v}̟*wW}χ]l!W xD%F,P8kk-Eύ2h_M>Jٛڋޤ8bozsVon<;NN.lқп/ۛhQf\flfM[MzsCߛ4sYj[*-13pݙ%eV΋Aїi՗֘V$CS]Uhyok g[iaVQ(xBw5 TW|ol߃J ͌r,2wV:QY*Nʄ}JIjeRvjgӓJ7xɟH"_p#AhE碑f`g؞{9|ICrX!n"߭fԆ"v=DCR5 2Pbr!d/_#TC[h6MrYNd=k~gfn2N LwUzbF]Mf{Is0rvZc_RO[s5&]iVbك婶|j~g c*bC8˖#SY*q1#Sdj,szc%61a'b܁׬˼*- ; ZdC ,'<f7J=EP|^K4C;_ oUQNs[]տ1sEv g>Wgi^oϤmt)-I~oO~fM%{[y48/Knt{_-6b\~% o~'Wۆі?pvGzt:s> stream xXol4 #Qde|-F}!S>k*bF VB1Z0EA3>VB&M]CٴJe]ײulv}ov}~NQ1%=x?n3T]~Iv}O#{liq,݉0j,BKi7slh6U[l)eאі/Y;?mٙe=ub*/N);5"?p76d\LGZ;|9I@-؝ Ӏ\v;L_&Ȧ蒦r'e|9@[dQm.qN 2++#e<.k;gQ`#)[V= <Lȓ;7r.|<5RC}g3T-db taaתLM.I]H\äU28c3{aSb:֒-[pvlm2E&:vZFB+@dy8S Srn0VMM]9*/ _2bB\=rpޕ~/ C;x.)tS*MhA["_G.p$>r#w!vơT ujzG鶶(ez/NQ~CF{rȠ@=U }xeDRق@јB=2ʦE 1:TRC@M4 ϦTv =}V1~fS+8xH`gbb6bCqd4۠Jnb)X1Ҩ*ХX #}OH]-p(\X쏄ꗽzLXusY{u=vž5oxEXniau_UF`a~XY?Wvά 1b[v=(jj/w=xzwM<+QTeUc2W5';j!w^`ג0=ͳf׈OqޘBv],{ЫT"3K3Ko7B(SdFx%cJU@lRrJc>pGgG*_ĀUM 5IyUboH'¼GK"M`֫^g "LK(g1̥:Vmכ^/Ex%SAֺolcmOlʚi)򬵗E#!Q&?eT~A-, =~(ȗk\%rᒽgS)bêؼ*FcGͬ•EjHe:9xvMqv !Thxr9/^3ur_1Xs"4AOlѨ}s xL̦qH܆Ȥ,-:ߨOW(`"F5/-=1J?/xendstream endobj 994 0 obj 2338 endobj 1025 0 obj <> stream xXmlS&V35M.2ר1)M2dֵW|bh` ,Fb 4Jt)ӦN+STѩ+HX""s>&_UQ$;>}y0b#؁@?HDWe.- m =viw@zg\jI;i7yƭ 5jTou*k6Qoݴ:HnVPۨޕ{P"Dp׶@C= ]S`'E?pTaeI3hi{-, l-߃ mdy~̋`zl$R).-U㚡ÜsȐniv_|mO.\M(-fVH;>)|~eP̥u!}j ?)'4C5ŵn&{ufOQXk$:Z?rI8ڌ۞ !kv0Ɠo蕾Ac2+EmvZ> ,FNnlvNʁ:ֹ"lէ"\ ExZL0m` 6e!<XsR"qp_9}){3KwV]F<@[mzwwƯP#rNܖu5XRo/|`h!E0 *5~6ǂMAC4<+qVJ`DGG\:MoR8 ;=;z?E3S95ISӍKܯq͒$BTpd/uܸS厎d(А@vvgBIUW$<$#:oA_ŖJLv^\JaM]py8X=F- 1a_@6&s.*򧈬2)YD K:x 6TnbV}O6Ifҽ9{WM:ߘ&F%& <ʵHij҄s?2I ql3+~p̯Q:5T0>Jo7 ȃŭ<.lO;^ aʧAqaC @>7ipXH(r$0u 3Qƅ 7`Ewd/0HftnwDdE>s=/Ƣ kc9b>7g#ȑjfҮOߢ k}ww깄[t(ye ]HV/()@Jb,B$dyy z:D"+ !,82@$c9[zOT(VUARMnujDV:ƅ ""'Dt9gvHPTcK=T`qd+d;+ȇ6 8nE:> RG9 //%>&Nñ=DSu@XzL qNZdCX HأIHR~l<ۓ2=yJv52iԌML3A%N:Z?x=ykŞ=F70cM⌖D,Aq׫ ew+:{oW{aW5W߂(ȥN${$UR_*C[!Y!ant9BJ4 (Hag]kS_OCC57G,=gJkUkg8>+%iw;嫃@, E[7}D^ H]FDITAcZSMI7\,/}  4).v@:1N^[CD1q}{֥,5E H lx6 Jz&ۙg GL$+8ص"g.q(7Bͺqi\MRYG@MZTY 4Bɫ??pZendstream endobj 1026 0 obj 2659 endobj 1047 0 obj <> stream xY}l[ߦRwJ("M3Ti>;BVtDgMK#֌˒6i"Pۙ -#DaL Mk@*V@L&M 6 m޳Y~{;:`qAc[Þ"sΟŵu{ZpNz~Ω*X=ݦI{cȄ}Ѿ\'7]<̬JٺYgON}j&  __ogVoY(ݽpS^= 8I,4  'q‚lk?ſ@H!"jIc{֓ %,?,R_+ ]...0.{DxS` K瞠z=dQ9"p|'f *ܠ:]4M[nMЋ !pK "JU+O Rq@$Q;q9OnDDGޭ 3B?k 혔Xp+n%)XThdlB֕X{y#V{B?k% mTޭ'"D[E(H΄ep3V4HwNJH"D~CmoPj@ I\Q1$[SE]a .: :*CNa (ȊƠ J ,(% :er T %H.T(;SLR2M~xt 5*qH@P a}Uf nK> We~6 ׈'Bf630 &##g #mO$si#݃L>d*7N }y}]z?XuoÍc?N>s欙rF2Q!:8Ǡ R R1gB:5>3ɋibfKs?M֚p?96%MzذRȄ;HZ6|T+3 jCLmX Q0g:B 0(K4"^ҳܘ;BF[< 0֘]Pq!_iu6 {#Jt[|HKjRDu9u|iɌz̽S: ̱'mԩhV(JtNLfI*A$F,t!K^w< 4dD|+.+9s~pvs/^tTRHCJS%|m0HH7`LĤ%Y>On0z>1&.ڏ! g oЭ/͈҅ hƈ1J+3N`v^F?w[@5 h' ̛#e_$ˏjm%bHt7~nɋ8pNxWŝPx*ON]ʜO\$ fœ[\G+̘Ə&gpf.> ZYz;z)l3$W- = c 81[^A_ZR&7|dbG8̀[4f1KB2q O/Eʠ,K%"0pyƒ10N+:7%#q)|9E銏&;6q抲KO]D:%G:tԠݾv (^PQ~ŽSEiK-/ .` b ) (ڢ$ۢo%Up[HjD!-^jpBy Jo< nCѮ~2u}6~x wQxnLY.@.[/E .2.[a{=]hq+8a'ti"ʃ&W<.Cܣhd@!|nxB>p|-0>b.႑H_5c?D~q* R0 oY#$˖k;vM]7/p}mk7fk$PTXoj¥koq][ 7cL߈L;fU{UYbVX!~_Z0U9T0;1;75GUQD!e]Vloi-΄kϫk(kV &BͅYk&B`Zsl :a[Lc– Uf]#LmgW_k}5Dd͂ VïܵΆKM4eUjTn 3%>YTm_w5b֍w6Uz`mpfa'V VW-n=[~TrW9xwIX͛v݄Bd57endstream endobj 1048 0 obj 3772 endobj 1064 0 obj <> stream xXmlTY^#!Ò}I:ugвigs;L˦mҴew!6aqVďl"1*ꏍJv5Y{~I {>s̤4{@b@b|Jm]} kҺlK Jع﩮 Ѽ7i^oy`ڟtXCGjVQʓvqϵh?v}{' $mo?,!P5j0/#'[K: ?iV_,YaIn`?GP>-DAc~JO$sa:}NW$Szr{m8u0\Ih5HfwzNj%Et;r=l⪓)[>JKZXrX?186ֺ%Y\6=g`)Zy yg 9xɄ^XI^ }pV j͈rn߸~M?Ҥ@Qnr_z(p ^? >!l(!lhe  NT"1Q/=1I. 5N7(oo-b޷w2֔fo{b6'ݙTPr!;c)͝aζTN0 s,; clAN&f5R |d9d+%0睋7 ^ ?Tiޛ71o8/̻abq8 5$xf*zjL-5Ǿ(pUCSӲ)r`\p>r懋/qJ)1ɛ &j[~w.{DDt| KWyt\N*BX@:̻/j(*\Xcp,E cD9Iw} QıGus!'8H#%ٜ?u-\.B2Q{rGsRl}H9|CY^63 )?R#~(^w&/NkFkAn&U_jBUW6^&jDylE su&F4S(cP:fUS^FȱωX紹qjt WQ{aqԣb[ }ԣ"W'^o`*9z$@/W$6Yk$AXI"UZI=U*\U-D -ݜq3|tuK.GJu5jZK B@Si w lJSCK|ĢlBKJ|j9rSH&j0HP?&B-D{.0L)$hP̟"+ }y.IuIN` e.+EVdnà]~,_. GGr)QXZVbe=8/0?oChvm›-{lY:cڽײTV7c±AkYRaet;jf\2jZo+,2, ;6ғ6snAsD8mT ӈ5-[`g ' Hߗ lC =Җ^{BќgCW@ 0Xt3KCPpku@A79tM;]G PШLIBh $L#IF4>ϣ\ >084:i|M8F։NS׋8?G j.vf%endstream endobj 1065 0 obj 2462 endobj 1076 0 obj <> stream xX]l4[.VJu󳻳(^K$1⟸8ڻ3a, K\ZaU}h%ҦD4 H}#K*i{gf=1`}9" ?U{'܏amÉ\֝B~cĪm~m=Y}' ga=k \3̬>f4nˎxz}] t9g O1Q̨" .?R!:;?)RPjUmw&5r`*ggWm[>8v,S6ȉm{gѵ{vOlC’uÙlF&w̵+rsuzүbzWjdUgɧv 4u/tzb}XŦo7 %/^&M;D"h<; &@{$\>.o vm8cBr47Ȋ9 *$֥ݘ;J|Y7U0掋%^7,: ݿ<1sU#rieJH畴2э0)h /)jBZY{ZLୂGKQrf,5WU%N[#Dna ђV nɭDU"p/0zF/C)/j@ ER:3o`]r䨙Om'45NM;3r|.1䓈ƌQmQ7f.Dn}KQXF3Qz1aK&Y׃yV!]&mk4%~O.@V0$L [49`~%DTބ+zb'ˡG[xmܟh@ J'v믿`"zgZʄ{EvQ0Swv H>.fi2  dRQ'İqNR?e\aXג #ÙtyO7T"ǹ+ L- QU *;h!hlYR*\"J.5.X8@q%diZ9% &>';I UazZָܸh} V#9s+&* t;ft{dll7_1g<(L\`BpU`p]^b.Ψ73̒gG[&P<($$U5(k(IpEWSP ݻg&SHeW$9Mr-φO7#)(% r&ѭM9Z?`@ށH.De٬ e.cI7 !dH{!D"azۚqKy(?QJf&RM.SJ@()$St03pT#?\9KuNptnejAj\h̠8һ 6S`ь0.:28,9[ZX%wً| ZTNbiG I7A0HU\gsIG"x|BozmRH´ԝt[{sEf[.X &+R!͓O֘ `C_(^@.ӟ|XȐV T̺>#_aWr_t^#fP0XeJZ}ܬUa \F  ,6~s=X|ږ3sgQm,ʮc(H6+RB_Rd]-:ꮌ%y~)LdZZ%`y#Ik[jd9Qn9-~.D/9nrA;U "*}vdV%5ATsDۊuKWCNU}8Wrr<ފR8ޒ_ضbRB % ͘ŇQCEuY#31A7k +#u;;"6v3oEP*> stream xYmlSԮɤ EI7׾B]yВ,-N,]k'!x9idIMP(0MitLP*GTӘe`{{ׄ/ "~fwҏ{lܸ-1׀Nt7s\>;Œٸjݷƶ|ݪG?eU֭WGq +k6D'_Jf/[_yFX]mxVCUdw6#Y_:̵!{I*;a"LL7.p-7WZSa|}ts| 4OZ:S0o 97%[Ћ"ZE|/ _.*8K_XXڰ+P0`;z '>cKoE\1l[ZF=jlYr=Kt3 KYe\": y@X ǸF*#ppR]f۲V NƎD-j\0Aojsػ`?j /\+>.Da̹Z#plH0v: ss UO?'xC +Bm'!pӡuN >-ؗk}>+4}*g_E*Eau-eW$$xK6x|Y{8z7]~ 7Ǯ-\:vdTov=4j,h\~yޡI%䊠|%:8jɢLG4I.ɰZ!oZ@Yx²+.t} a;uFav]0 { XϚ<@+0[X|@ÑOGDt^̂Wæ~,6D~\<{ʋK_R&,xW WٯWEc#ۡkPs85OZXy>h,(=+u'Rce<¿=CD"xE=e׾ +7$jxj7F͹XIj53q> stream xXolgGA -$䛦HwϕbK횐$Tb>ٷ4T]&$GcMT(|7$`/@ů4|{>{~P 8tHf_'40;Cc`cj/]ah<a 91;wܝwDCv{s';54̷Bܼ:<7 ɯ)nطO ~16pܼAn4%~nT#*  2O牱 hQuƕVQ=bɷC 3!9w |_C_d }b0P]t3\fGp`(3&hzȽk>Of)U2YsS'yﲟp3:7kPH kBJv;3E#Qٝs5N027Wz`VU0vfD#ߤ1-A@ٵ9%ıLHV-C[!mgve9Oh8hxU2eə2d6, t6O>Yr~S :+ޯw+Δ},:o~kF4a-Uc[Y&^Es<PbhRV߼|q R}b=670V1o,)JX*k8X6OsRaxv#V 8阥ÅH`{i6tk1mZ9!]c1Qq @\i;=x5y9`jXi%ވ}CF?BX>{}'dml!)Ȧ,! M5E^KkަkbC[Dh UoZt(9׹c QfZpqG%B2nd vTI&]1^z+qIn"*͏m9%hO=}~bZ P׌osK{q[d$-jU֤ksdXvY,6Ѫ4K'[Kٔl$i4X:Kא 3B|Z)K̺@]]ScA2Y_\}<۳`qY@R. ҜJE;IDGp}kz < q9wZUqZ2dhX:H;^Zf2nNhNn(t7#>v̖( A֦FL#@Ζ˹; )?t,ywn3(64@2,C2dG5LGR\ݝ@\li5U`RY^ Q" JFɵQNM;vbbo"%WaZ4Yd%+z?>>KX͝66cY5d]kpqofq3il<+׌VDJ{ov,2u68d eZ6Tr{EJsB/ X:n4>%c8RMxZ1SY% eۧSTj0BwY#{#qA>JUH{[cF??7;xl6|qĤwB@wb*Խ>n%@w.SmAW3T妮7nH?@ qO[TXh)STi+CM,Y~s )?}6tYi*LL&o>Zljθ|ZG}i(| l v}7ZkgtЍ 1oХɭ/6(> stream xWIle>TP,-Hf=d[(TubسS7c.bMhR@Q4\zeiY$*T"$$ό3e,}{ޛј$xe'21>ض|d`{Ո4NLJnQbɄꩼaG|w~qw#M <ޒ49ɘNs|wKيߟ_8$'X,.wIjp,%_U;Ż|PU==wN#\U-u!zڝ2OI H2pzv:u]rîr }H Fu6Qtk&D,rmۆE1;P0aWZ7κI2F҂Ih57RẒ[4a#LTy<]:&{QcFo-BhleX9$ eH^nCQH7M؞Xu/) #P\ ߣȮN+Ze9;G]8kBGwUZ]GLi3HظTOc/p}h8m_s<R CPoL#3^zYNF\Su?W 5=IYb7 L'Q{#ZZ&VLJҊà@T2Tz5 }:C0";%]7qPX/ ^Ix֞'ܻ ᇙRgFm<c~by$b2 ] e3RRɹVcE`+HW[^,H3ӧlj&wRED Ҫ (=^"@ ЊRM{6po ۼŨ^TJA9r3)8HP`y %):7E okendstream endobj 1136 0 obj 1720 endobj 1146 0 obj <> stream x\[]YCH$xJ{^{WXM\ Xgf2s.>;'r dڠ֊I&u.M*$Di<u9gƉrJD;vF'Ÿ}Dۢ}bLwe[]֡;]o?߱m˯zFN6.5~cGD/h w5ٿ}/\W Pdnd'KwhԲ[:s *E6EI>ru'[NE]#>?G?֝G Z"+n6̴@ZeBqk:~%EVS-r+))=Vx)s-no[kvhLe~j>ڒBU!r2_`jQ.tImj]]FFh֌RwˢfS*x,0P65S64Ph0Qt1Z=;XO+ٸ=)2/Kx@nHqYDs kUB&p[K4JFQT-Y"D!SO~*#~ՊYQ&a "@P KGz֚\kEJ,!(e;,eюcg(˲+EGUSI5:nT/٘Q쁧W- ׬'4]TMf-4A!JWG,Q V;OA &!)u3FϤʺ*H"s]*St+Xg7&/֘Q܁gP}޵*҅Z&\E4B#T*gH(F鮱"KU] Yà@"P̈́$fgBwKSX0|}+fvWT҈9Cb9 0bG^8*K!kkˌmRD2K "|1 =&/1J#Dr F0n,ې,d}Ϭx +1OP?nTVbdOZ=Nex T4<<Q!sH C3N¥O?NX ]=Fd L: J1DQ5 )T"3P5 DnF"~1<@SϬx 0yg7*+1^2Vbg-g q*U&'JGh3TQ|dJ!rS69j()V}]B!c @BBa<ÑZ,woufl},3JS,bݬ3EG3CHv m.cAkG-_ Zў~4[IqB#yWQ 0x‰ 7Vid)Þi_xnZ8`ޚ!,RsVPlבRThen7"A3&pnG Q=ԙ6BR90<LEs}&3̉ =Mmzφ>2q*δ\qy .+452i%.K&3P&ct`tb|4wwuL?&˹m薴%pdn7Mjte)vK;Jm3Tݮvt9w:)Wm s>4:&1/d1o~>qf?&Ϲc]Ll`ʘQ02M0 m! 6& W(PDc$36>C7ڴPv,Gn; =M@3JFK{ `e,N~$ޜXm+"OIQS%J]эDNll5HIˣ0^QA) IM[`RFZOQ:zc}?j7'Nj-5ͣZQ(at-J&rbT(<Fiژ 9: Q)1SՓ3m9Z=˱Ӿt5ěDN\9Oӟh& iJjw/: k-]Me4TK#\?|Lf ,m ]^E[at_g۹PPJMdSjE.*,rҖ1vr}VV`Dg~Ҕ)r4Q y%\ЉU6"Sgk[ JJS4;:c]11e{輽)v47vF՟M=h7 iNrؒrE'|i.(Vħ0t+r]o5ꆐ^ J7 ]tP44NaPrw:蝽v{DBXft =E(YV~ӏE7 IU(ܑkbTX~.=#[OVAixoU)HN VA.G)cՅH!0 Vc'kZ]\tmIg2{R[~H#]Wyut˟,=GB2D~ L>\ARxJn7E)w)lPP}2*oyrMИr(ģqkvkIM2Y370}V\H+ 66uE{~ҕ]6)L7z3DEyX5ւ<AD +8C8-  D‚J/t^VN:8~],8~Zi(u89~`ڑOUMB p*Dz $i8I|=`FܒAJ7] {`zgG 펮?0N&9'#dLq ζ,2%^dV1l)&vQڳ`A8EY–THR}0YLƪ40UI`rl_t×\)ǯ&i!+h% ]~k\CKJhJ!`#ܧJ)X 6U`#`. crP4J7l28(.[Mf*\ ` !ml%ds_^z)hAbT&sɳXom6J,B y l2)8R% U`a*0(Y0\XF LȚ KKSi?qWE[\v`!c/qR蒧4o ݕbeLdK0}_V 6СtFY .D_} .Ml_Kb(uɮoU`Q B(E)S sPb'Y .J- 05^qJ%CQ<] fI%AJp¯ 3 ï/ s 0ǯrr*0ph$ *0 3 +0Cp '  pp( z% pp( 'r 'Jpp( A`_C N%8W``W~}fu%`__~} f%w@BئɁ!>r ڛ3eF7or8%$AtEs<=~zur7,[a藅fY"j4O >ع[L@{Z[[ }Q0g FfSdks5[#AizPow.>n-|fm\}boi2>kda7#1GՏ6,uu<՝/"x;9;s$% ͍ G,\)M .{({Sz Os+/tzOX -y ޼hNk=1/2@|sm1-R؎sMluuy+o PY/\8y ;WvV~1LҕO<-^:ps~C,oOKߟMȮMor<a|#[ݡ0:7-^\X[߁x}a46RN0R7dW (>Rms{0zAI#Fw?~|glEMgt4C S/^zw0ѼnAX_LgU!P0Cհ^رIk7 SAu{Y Ӿe̹0;=`s 9ӈǝ [eg^0Ko~ԆW."/j+Pv5 m?{nƇ7"g9C&Y{ɵT/^3fJg4>Hi^jH'%$7lmo\#!Է\!~3*hz ;Z<u;rF`! Z)A2U[Ug&v+%>3\ T,_ѵ?`_nawc< Z3i%כ?'Y_C mSOll~*b@=!/vں m\2!U=9TQ[:`FPS[+ =|ޙPFk$7~*ah;pjb2%!{> stream xX]lCa]Ռ"*ߝEx-PaI`b)rVk;ӍƠxih 5"KHMԂď>>T}CGΝS)Bbs{svDtBCnh$4"YczCd?nm?ޡ(Vо+?wB}~ɾ>a_S}WW o½Kj_p_܉?a=B﫯p ۚM( Cvr|@_ +.9fvգX0)=ޗ[áAuz~ރBza A9(U1h[xl,e'=)1E =uĥJE~OX'KnOq|OPc/OHr9f鉰5/MHRJLH0 ⛣vn];p5iEL{_/lإٸ 0gT V({'snq(:R2R ۹s%'mIINaLt nͦ3ŲNۏiޘ}ѕ2;̠ l60Xpǚ+5`%\t pYK模,~ӊ__fr .#0%ؔph9RZđic ct%z "FE+>'Z!%AѪ7_NON g+>tuC>VS5#4ʪ*?,E@- 9 I汿tB1Ur./=v̨,i P+iX\vLІ[v[O+lB!OWHza4銛p`x eQ{gZL;G1xUs4'1Zˎ'Ω*P*PL^6NK6_cV'XLۙJIJ2d/Ɖ]01= ſ,Y ?XFn, >Oqe]JW@zhT|@y<>EbT*݀3Ê%v jS[EUSm0.*K TMCT@{~*Rh2U6Mm?i:QT=ç_qYgbf%g,^ dӈZjv0*7~8^ki\YW@ئV+*UZvc43e7X< t).~Gւ;v^ۂOcWiw=Bg[%\SLnJUX;uZ|]%LIT-V'r;P}iG~4CoeCm =BQWTYPdכf|Mk*>h k %ʰ5W^36lu`"â584! ,F`2 LGjFpIs _~]T=#jc0kVc%f9O5r:1%P'ە:gN?ݯv XܨE}+-Oo~rs ܝ| f>˳ṷC[n/;hru a(SsFf&v4`ex8Ѩ]nc̣ꔒ eǪc/)Gt 5յ]H.lM26fҿendstream endobj 1160 0 obj 2498 endobj 1167 0 obj <> stream xW]lWFX"TeF-ƻsgDx-LMb N֩%Zޝ7q֛`["\ u*QRi@BB!>yuYˮE_3;W:=3:0`ԓu() aHt$2@49|ӽg$&meS q cc޶?'o>97z]}ru >iM muG~F(!1>U,*msOVV-ADl DehnE H?4Rzt`ird±tF:2h PɽIT '2h;Ƀ"IQq$_-Sݬ[qiuO(hnvCS# gZkBJ芳nL #!BSfރ>j1Os1u4qsbMvj@dJ-`t5u8:@#f"uhq#АW~zjP`WZu˞H@>}uWu j%ʳ[yu=˨A@a;2 F m1R~xHޢKI]͒gxt->nq?16 `W6RR#bN{QR{گJB9_/<22]ٹAfIB0ɇtmeD9{螝;Lp?ET4;+"!yL@,C eǑ*|; ڎOQ4QG(4"4$TCţF.uѢȵ1 㜍L&<5Dw\?Rdo0Z)G+`,*fq5 ld؃}rv6I)7z?`e"y.N'zs`&$ ޷:4|`@ykE9s.-.m(P)"{ n,5Y2!~a&>Nl0\`ٷ-+2p^u}`Y f=O `COj#F;yL[˱kQ$u7~^9`QJ笒J.9i-TqܫSSyѬEJ<`:.SZu02_Z"s-Ev@]γP",d*M3]J$E<$^DJspK:ٯendstream endobj 1168 0 obj 2250 endobj 1175 0 obj <> stream xXolgG)#!b+&g\ՎdZDmdaǾzSjKJ8.uhZLJӀf lPQ>0m>iR+@Vw[ S1>>SÑG`b㮁03qDy&7q5˔+#;Geh7vNz<%˔{QkG9NWvS[h}fS@A/"u]~~ oO" 1 2t50p/6m|kl6;%"3!^Tܠi"x*EVl"WJ97|V9Cs 8yV'Шj톧= w_NovaCmP2?P2<7wlpN#7(w7mumD*s\} #QHX顴{s* CH|?sߤ{cwm߹cOL*I5'IAU%ݙ-=:[&aY}zI2~4Eb* .)m 6ehpYN+~? 5_(INql̃+*!|хVs8 ,z) Qy$j'ܣ:{ o'+pvzIe8Q(gˬ/h|"sPXK9x&fby"6:˾[i&BlU^H۰Nz!I3*+U8䊁ux^`HVZRNČ&G m c+}8QM !L+pgÚG,8w fNZX: p5sKa|Q} 7S@!&+ 5cNBZxX)Mnss( kKu+L >ClV{ٿSzXνG=jsk=d~~lLo~7.$Ҟ=u.hs;>녆[\d8x]YE.URYȞTejd DL.F\<3=<\k`=̵'qK&O5Ͼ.JكR-5*:OWEB{`X{&&AͩZ>A{{GPm*ǙI :- v>{M0[Q"`a XM[s deq3XG !(Lo$!\%06+5:1*{a75ix_ m`ɀq*tiVmus5fÜIP *%2(AvײV> ٟ͒޹W3)H 1J%MЅMTIik\ئL^5R [:A(/m*/ķ<MVH \VwV}NWC+@J uۖDwmλ/R!pL?`e jU9Cާh;`a܇V !>aȥ%xzKk xغaysR8$GmOkZSрyoOu})S8E1$Zdv'21 2;?OM }$HbEk8 #<%ZS0;Vj2+/(4ReSI{#ڱjZ!oS1W+'LV0>UKNB""Ĥ-d^q7zN&Df"4V#endstream endobj 1176 0 obj 2531 endobj 1196 0 obj <> stream xZol\W00Rd{6&XZ*Sy{44vT` q`0JĂTE|QVnYl|+aEW;ϛw&GUm{9;LN2+X=ʝ̝,0ʹ sP`ZNG0-N+wInaynQARd3A*){Ǿ[9=f1cwգG>3nH/9<{3ǃƏ(/<q۵ˁxPy0z6rG# ;ra=q856/o5gf]JaaՕOc0??3Ayv(c^ C4톶L\#7Y8~LYAA^qC+v!c DžD/陜lٝ{E;C^ ZgvMCiHV영c9۷X2qj!dy!m:`{%%9]-ssu,$|:ܠlyF&q^) +~Ser`酖 M+[aBd`Ӳ|G 72;czaVӚv-2-)Wmb6 2 ? j3W8*o`r;'5$hZtwQh !0{)`Dej݁*]PFsmw|Ew`״vigA<嗀5`j?W+gOJ''Lt,r|΄̊'ejښjŬ*oh TrH%TrP2̊LSI*4%;M%}֊*fCoeJFWT~ gisD 4Dž]@A2GSME1J.H[hB9 RM} xMxg)~Kii]sیN uub]FvT{Hpfq'MR:R=5]5nfTܺTl2.R]vf{4z9xFÇ>f [RsްAl:eSUl1vM}ZliB{h17aHgI7;4F-_ *υMͯeHYUˀM&uPGAۈaqLB)#iJS3chu},`M4,`v3gl̈.wy5fiq *e& :3= F|`S=T%fkv1*e& :ݣÌs;)fn Ma5fi3CV/6hXbv3yx:Vzxn;\@M>c 2$'>+˘Q+DhQnвIQ390#*%MУ١Z2AܣQN"a,>/^[WޒO c er C'%q{W0ӼviHL0upJ}/GB !sSx5φsQ(hz=w&mɖGg^sq]~@ȷU }*o$1%M lO8xIKͭt V؇U!8u\:C>; g I;>Ad%;LܦΎC񩧧]CO`]hN?uxd>|DyM ֒\0. Sl4a\~m;Eg8Kɷzn塍1jL5f%Լ\[ߟ5b=bIq٨\)o|[~Ч=4u4p~׳f*$]7JGOF(VpIÆ^8XZWyuԭel5Z :zurb֨䕯/D7Ix(aYWWs%@5|{?@5@qB_8'x*P5 WeĭWa 2Iq&\f娯_\^Ѱ*.p2lV 2 (.gv-哱y46EҍXa#XLAҜb1d :9ՠӋ͙ s" @h`)?+U|7/_]YkN cq}GWkF NlPl_*!0PIU6CVq@<6z=>qlb|dxd|/FN8:9:>Ğ&|(|sig:U}6 X!}dR'ҧ 7>'% 4![KJEJ UQ vv RȻՕ&Ŝ9[1/3$Ȥ T~v&LQ:\iSE(\zx:5$:Hӈޏd&"'U,i:j󛻃g844Ԓ0F~;Q%Ni7gno13M+E%L^׵Lv2_]hG[ ]v5-!90]"]4Vku -S. -Ę}~6lg6Jm@g%Q,f> ]W}Pҳ2HF/ " xe~)OO`>(֧wW' ԏ.;v,D/5yNxfvEVh&h:B&%Fjo76r35`42~B:> stream xY}lgXk"HSc3HStI_K.LmTEnى}/n'i:@ -KJiF!nJZ6߶?кy;;C ӦI|{=.Xݩ*e%ZWfo/oXʋKbw6VhMяwGc3bqf/2?u/s;3;|Y5-g^Ҽ pAw7x!v=z"vXN7`[ʛkM7uXIyfl_[P~ق{DB""-;X<-+Ԫ mdn|sݪMo0nN^|"l˩X| m"ksNU*hx,.qC'TKJ>~Hϩ%mZ;r_ޝ"pq0; o vYyoqk1ߵAQ 36:.y[Ƥ:Df;k}K>jN'89/M}!r\pa8S {;REke&zHN#V!ȾpD k15Nt`."a-&SR4?59})HS@h"`/ x4]+`kxf9 ode%/DSlTfwFVC$AHrd\:"'lpe3s8uC__e!&݃OCZ]C%75բӪ-8&<џN5P5ّ9Hvt|5Vy^* D!t&s%X~{I|`گ@S#WVt֋ -̾R;Rn=#ޙ(^FiGO} 帤\)g ҉A.ZryAAwhE0'58&u7v[v ( ^E a~9_-ϪKrE&ҶX<[PO'Lf|q'tFPG&XEB$%’{2afQ LI-45~`^C;hޏ0c,yNd8xa B]xv+j,; t,׎ZȴV^ T /73M\){qA{|Д6!(ij*.]mщ.Nf,[ix$j$;q{qN:Ea#4 ' 8 M af҄舣FHG*`lRm17U0ؐu#5?^ݙ #ΡqK"_Puۊ10KH6tt@qCݦm#Ѿ֢TwkmV8 N(̊ä=ق?aK 8&21EZ8Ry6(Dۍ#{# "`gv` d2IcǠVrP1,P@rPޣo\Pneh W䆢g`˔,U_-4ޘkաV)JrI<$!.UYN>sHwI <(hn,f- JBt/]^Rj@ށ9{iSjt[JfM B`j0 RY~Чp@g_Jj3EP m5ʴ0;T 0*S,HɉHdF/#E}`ň^Vs0pa!|~,!ί,F5$j0M@s PYf*#z< s@W?l R&LT& i3IY tNGėݬdtJZI91`oW('7C]d0Z~(JQQGz"Y:O209r}Pǖbeo0Zd&xr󳽄1D!JSb\r6 hY.35o8i}JnTg^}h%]>`vm$a%i֦_Yu9yY#\fU];5 ;"Rw@C;HIDlZ;ä.qhaLFoqx=Y᤭M꼙IEi48Gr~e`r+Ch޵$  c` chp-w4<|4[á[3ZL~#fW~(~xE()O|WgU}ss\expn5fřOWάԁs}>#gcKtegX*zsrs2gϧÃحBGbj[:Mӆkf:p % gldT5ļ6q6AC~<zY\ŏu7*GJ-s{YeYi,'pc$ n`Pg-OXbpf w>X3g% QFd 簴 r;*ٱJ]\A?N-y,K.~Bey?E.C̃8Vy8G$[DǽL4 3!n;it| +ɰ_xy7c?74\ ?N֭uW3O?V>)3٦kk?{k:SuFMcWTOT܌;[׊=U/XW#nUpkWumcVV\smj+CqlqpDǩC/WVZua[1vy%;=V)e endstream endobj 1204 0 obj 3264 endobj 1232 0 obj <> stream x[l5*YYG?PEMxw+j֒K A(uWx'ݵl MJ iT$P|TBmTG?*E zνwwr*DΙs{L(Y(YODjB!l/)H QF* YSۆ'Ajn˖˾៍;':8<k_$Kr۴၃22@&F`QpmºkwY F:K隫Q)- ڦFLZӀu,u)e8:kkjc x#!pQ%@hV 3!DHe:p;6F;̝NuN7\.^'G;=:#." 1t44VL\`.ڰ 63B ֥5LAx! È1k~nIe]%BضF7B"BjA悳fde#*K -Kb)Ea Ċ֑P!P-YTfRe, 6P %@ @2YvmK J5z2 2Av1]6_t;D.Y "5͘Vb7"f`γ㺸6&14;٫qMkۧSױ]@.2x;E6ۡyTTC5e+ViA7^6]RۃqTj,*w1@ǖf;d cZй-6-Ne'Pࣝ]xl's un S&hv;Hc"6ikY0 Nl#ȇ)`0X+)h1vtef#Ý%T](dK B :@I4eGu {#6v?(tt e3hk.1q;|G`` G"Xnl4F;KmB2g;:Ly&w";kM XY j5%w KO\!Sdp#GT+~0w:OJMMy[APB я\}c#z;MHo-A{q>mIYUj~qUWf}!]=C;0 ][ѭJzKҭZ4E-uW^{Dm'[ߦ^zW ߘ`3(WŶw8O\A-JZ\r; R&\6c| b׫]~}(%f.Af2qI\#ҩp"jwffd>? ʠٷ{2lW oLTtaH 'tdƳ{AqKتg#gi&1X9`flv_du.-3Ӎti'k7KXlcZU6mV. /wbS\պ'$ V̬+vo1A?S9_*i…_tt=d/~]A= {fEɂ(z8K#v:D~ęLeomP3'|PK"0=IĢ\csL'*=&rM27 s7AF2P"6.lUYqU勇&"7C-Sjd1%>^n!6QƂ[ApJiT UyU}]d"}8GT̚$1/L<K *= XHz is!cK )->CV2ټ<}i^'u sr 7,+*C$r" 0چ}H7lCr ~4lӍ#{"Hh1J@sI>}[ |Ώz֠'0'X}=MH1uBZŗC+^I4#9AMrV$ߛf.)M$ZPe_;~яb`¼~C]קi桎Ӯ][gįa^_L_~]`eO+m(Q C醈]K$JWW(D_Pԅ7Y\pm]Uau6i<zꬺr04j aK*$U&|? ?`XlamaޗMbqy5a[Fؕt/pX'l2|='&0"}-y"\XU"F&G٤VA~}p(I5:Rz|vqiMr_vOeE$endstream endobj 1233 0 obj 3835 endobj 1237 0 obj <> stream xX_lS_2/I5J&YZ&8)`#8&quk{7c* m,$$Z̅, NL^ayV`ݠB ^~4y"}߹ހy3['Z'oqr*=E{}ѿd k8?L"⌼Yc5W4}zʣ,1M-1/ifa^ve4=:'Tj5DsK津CmIi/]ͪ7S\ɗ 62^9) cU[2aE>< 7{UW\pg,7&,=jQ}~p3 -_w7f7"$)Wkvܵ$VG>7>]HiD罧㉲&l=}P#S%;ŝ_*]hR}K/t+5 " m=ctuQLWxL+┈wȣDU@C@":0 e`̦)_tl94 >uLuL0333&ly>09O-|Fklx3F~Liţzr/5Ӏf]|Pb7"02]2Cq{z0BIYn̖24ёHg~oݟ=s/ߣơ0ـpu*.\b"xJWV̮ p0 2 TsUT\l:MA.`WbeR4p9MʙMkgJ*\v9 Pc4ٱ`e.aSDiJ aOOJsUe 5T&3V6ˌw<{6x.\tɇmJJ,dШ$&t P1ilD+^dv{` ⇞<gm Ky= `0KrH8~r. kEl` S$KK,LuYBhT" Ȑ]d-`@긼B+`H.e~rQ7ojIMLZZ)OY]lSSYm0lc>y} R$ϒvшcl7F+F7qx7qIFB󜱊mD\@tr9cs|Ta[+s ͤZP] }"ajdhq" K{Q*noM<6Mbߗ92Td/?b"ٜ+ {QP@ـVH*{cQ%h9彅3ZHU0.[=LHْ -E#+p8eFaģ@##@yz^|մUH&7B1oEUks7F jͶZH9<܁ov L Ujj 5B.2ߤ4Uar!V l (T i1L'YeG/זA\3駷kn(^lt~jm }Hglcѓ@h[B뽎r0q+g'z2&"kWoynG|P޷)F.B~{(I>) :s?F-Z;It m7_z5l*GHhV0NĹ=2cKwB bn> stream xYol(4F E/L$~F 2wa8frl% MPJ lЪ(&uZ>L44mVڪ?lw@{~y9uI@/?I]/Mv@| ~s+VAnqѯ*mF<7'op?Czݶ{?y9Njj ~?*_P>vTo*k[S'éA/i| m~i6eHJGe?\W^D7&SV+c$$Vaj ENæN(s0XBAoaуii=eЃw1 G>?eOY{jTDw:̨&`ȄYSeaa6L9#[fJilZoX=38]Vv"()'O7C(W&*|w3&\{}$Hܸ?Ꮚ?I4ϊGn>r j?83{~W?;?A3m}=Ž}DJ*;sE1.8ЪN)p;H+2㞙%Ĉ% X stIy> 쑱I%Q:4mNâp KقJaڸN;A[^t$謘q>WS> K7yFz{p끛o6WDQ o\~o\/,6md8=-xNG!KZX 䌈9<e 7G #03M_g!ɧ7])\>"36G=cgY-Rl)P* T N"E_u3P"D>- 4/Q W<ߍ_gPKٵ QNoVNω O9NL@G'힤G &ᮧu-h(dI5Cx]\xPp':qGʿ?6)iu|PHGhxJ]o4g.e@no"8F/d;3LEbnfiqBO).ϗ{43J 5|#除 OrOpv;ݰo`@=;w~uO'{mc}C{Zh4ֺ)= 9{gᔓ $K;3BF7[Ml4†x .dg6@ LKDRƜ1#/DSY M].3ʴ. =gjIgۦ8D oax  'r$"rV$F!BTgZU־Ѿ"+wDv+'(@AW\'C!L.n&L=6YW@޲` 1I(|P]^Ċb  PEEAԍ=To=}OUהf]1RVe9N|kfq9kq@-^M*/YY~;ea]xQ&Xeu^8/}f'a3Va OTZ'gX0H(nP s g&ht}]jLa u3])]0QaR服r5%|Ģdz[LхjCm!]:9NB4jVBsOYJ ,%{& ־ag.đy`^ZNt4u7,\,Hm l4.Rn~ʝHZZXM IP8crl]W ; o >dG|2/ 7-JnS+y̒$_me)jӹ Q(gJ|.2.!pm i`vݪo尿W<.|ac}}څK4 Qյ=੺t!$ErZBQ $)512bCQ6ưr` p.P.g5rkƌFcy6 WGXov]I_}P'cTi!O/A,E4`6r4 IHL*@764icsHT.WnRό}XJQG\qFjGhM/0r9 {cPƛ h0@h\˴=ЊuqjihvuN0X|@iS-(f-@WG%#"lR΀vc{]RF!TUd{Dd HIPZ<1P-:O+P6Jb]`Jj͉N|ch51{7F6ޒ:71vur\zD UlY\&Q:"aO c2 .Aa"5aWseʯ'`2fam<XiЉ;]vXҮB5,m_撔˴93&{c_Ờ\3 >Ϸ<o2i}˾o{~{m,-4c:f"e 9EdafGF2P=RTYz|4]1G͓ qѿ&b:Be 0w1 +?@eendstream endobj 1270 0 obj 3024 endobj 1275 0 obj <> stream xYoL?GZ>LU,4L:>+d ("E:;sqB3l, -*7>ZLӖlRM$>c/mSSy|w~%Q;t2t2oޟQ;3jND BޥEE CjBmˇC->tW7%煳I~sPXW+vHx{/voJ  Ãk()QUߡE P[lm8GOs{ ^^lˤ>)1u'eRM{.̏f>9+r`<;)[ݒreÜ0^d5` e;ɔbIѬ`%;d.ݴ_?fzJc3)':LczW\q:VV©?LHOX`͋BrZ]ƳgJwdTZcF?Ee)LX,7^0LDNq[Ƭۥ8oO᚜_'Bvĕ@{dA#ϲĸd_*8T#5<Fi: mf.ܶB~OM1hwjI6=}EwWHy8|,!}32N p[6L0Ը6i9 #ま02n_jR*Ih@RXٗgV\x9*ךҪЪpw G bku+P .m"hsa8/QR͵94b!%;LQ>2.:吃 # s yWw޳]"^!^aHP| Hsu4\(>;M)y,FcÛlh@DOM:AH9gA/;uޤj QŴG*cI&LS#n# unu %B f%F~jVB?hqNbC>h 7:;o,ZXb 26[p/w>[4uTh{MH!!7N3/{ݵ)@dٍ6h$]vn=gn !a u"ӮޔZuEVԨ^RCQ>Wa'(A=Pd{ҶY]h1Le@r%Kvsw\NLn<8߂}>&vRSfm57=7F]Zthqlϝ$}GWy;72K*=U8_,KAYڄvhj x6 /Ԩ/6>:W;\tZrB#Y$Y`a ƝAq^קk2#1U/6S_\|ɤL[=0&Pцggy7 ׎489R)^YBQ һ|C/H7v_!Y{.<52JZHogl/)'h62}gj6;DA쇷񠴟dNXT %fh;d9aGXu$6cQzӲܗuj4tҘri4ʗ$۔~g˫,?ӽj~1fP #•C+G:f"k&/m斖f`4i-KoCuNJ`G,1).βɤAj*%Fs}[7I70G,e*RwH &ld> stream xY]pNJZÔؙi uU-k]g,Oc@6j3f%#ҢؕM*Xpjn4>vB)3}C:I)mϽwcd ޽\͂Ez@ÀCϪkћhNm!_g`DopVZyEX<wMEvQ? hϜF3؊_wl۽ O.iϬ$z68;-]$z2Kp7%ɛLкm#78oh 9֭䟮Wc۳Gluʳ86ӓzR t脣NuMnp 2~o4|)_gS<8g׭EV~yϡѻp/??Bs> 4Gװ?qp/u]ϡ)+_P;s?& MٸM6xՇ-(C L1"]B6G ]:=զK|" 姊Z&ҡA A컏M(z>Zvz7L؉?uUhΗf\T~Wp!m:jZEttImFX%s>vN,A]> 1ƌYRPs3ǔS{i%@,zH) . 4 m%fȶ(F]Q:I5x^Zғ({p~J bV <>N $y!Sw%y)n}F1.` _=&E PJǵY4˷H.Q6]ֽ~G`]}==;CQ?i\b;O=;]}s:ʛ'HFA}Hf4njjc,[ae=@ݕ4m*>UnIĘUQfi㴌 \"[p Cy&'\AA"I*~SuɪjؼiQ`𠞄.Rg d*)>IrT>X/@"8loJ] HleN? {_NM oe.GAיּ5{dCEr)5cf@?K4ށ4WOY}wp*AqBZ6E8--@  _v๰sGwnW#NPhR\8Q[潲$+oN*v5${@%4Rrn)cWQ+hFV\k5Jd'IE۔5'6$X0;y>6\СdHn*Q*5!3rMS7[IJT!u7(U!Oޙ*?ƏR%f SQ H^9Uf.j %P5jMbԌQrAxH pğ.ŪQNzstFj1HE\SS,ZܮZiWC3 "+YeVXmO!>QF|De nlIuZ -y6Y|iօinb, ֭1 YFUqT/O4B#]_YaW"T~ρFt(g#H Y~=H 0~ꛬs$Uhlthߟ+&1T,A]J&JJMRTIzIJC]D/Ȏ9H=VKQf F+ҍ3\IQOd*=Ds;)0&ZA3 M|IrF P ,C&!IP/}v-@"2WmNYY7kY"3⎰ a˜\ Tfyi0\_=xK`NvLyWb?WyD4Y4=Prg+x*ˍM@Gh3HtpvaQzo|i&1 $?\[rйdd;8$Rځe_DV5h^WzIkj<`YP&u~K~˦ Au] 0r* bG{ 77,na (ǸisI#=VXCPLLm:Y:$k l%VCA$$r֡QWUV cq&,bRP;\3qS\Wt6v)Ō]JxxyCcH.NaL!/8OL:Gp%j&Av6 R"dwd8NWVE{"xBbY+vWxwdGH;endstream endobj 1280 0 obj 3073 endobj 1293 0 obj <> stream x\ ]uvE#Gĥ}!S=s̽w,n62۷}?~ϋ5  0z 'ZkҐIIE$T`Ҩ!ФjR =gܙw8!3gΜ93g㖈fnsnC~z\5q:st1A\V0fnѡ:빶neiqsYqx#g?tn~58^zĢ{2jV)?%tn-Zj1^2^tn=RyHqiT "'d!4Drmnp9$v|'g gVn*,(+&6GK\kc3|j0~YeZ.}'j_/|xŁ;YH^^Wnoo]+JmO 9Eh=],csύJ.3V B3P( ipjx"8N$N>6 m z(a|) RK %d9 y`E4%ËBRBPRuNF`̊AT1%SAI 82)%NZ.6h85r<!H .@,xqJiɀ@|;|׋MI/m3]@@p e,8`oNKK(1;DUPp^"yi qo--/zև`7h``T#z!Ƒ1hI]iAb@ zy(LטiB 1@ ǽtžYv(,5g +Q‡CE&ԗZ (95 5D2Q4/#njRwޝЭEY0U}|]@+ظ` nՉ-V@R.iyPik{Q H2c I֝AהXt0#9@2(~%:%F9Qd҉b*aWތ(jm3H- բd7P4VSJ%O_VqH/(aK;!1r,WtF b:D!ĖC ?Oɷ5c,YcdwCFdT ɚ֦  v3`h$<#<Іat@FXa1+/&&ZbDTJKSP΀`8nxj3V ,V:} ؆@P8T`eS-L'֨!G(SI JXBy@*7&@J>L / }{% eutv48ab67fӗsHIΆB4e\`ς[58>s,,(Sp'6 DQ*N5~ . nVU:H 4P/7OKp/WLxb3r©=72 6>g3g!;ca ۑ*(vwE\aNb5 ٓs6[~psž\>t IF!鰌 iz.) >_rPMc@ <1LYƏ e4rNY¢0g%((f&.{K&[Ӫk5[oHet [ADKbdEQ]+lc[Bqas [(>a>TcFɥwf})X3-5#+NCdT৳mx}H *3l' xYH a2$*oAr %n l:eԐH#э4493'5c \8K 2]^BVh\?P(@@#ϖRXB -RT̖RGH-4 <"(FԺhdK? 2pR*@X[1xxoǗ熡%t~5&Ňl5DmY#Zv|Ȭ͇ˇL$|"F߅Β9AX)-sh>BF#rm(=̳eN 5 mY#-2kD h>5a|[dֈS2kD l=kD95^"F>ghD l=kD3,h>1<7i@aBlD.6B>MMg-DM-5@JjY#S| lY#>bˬ͇2"F450&[fh=3Ȭ'^Q"F4Hh4ѤQ>ƖY#>kˬ͇F4-2kDa.DU%3GlLh>ąUϢш MJORRr2ςq6ɔΘ*$b{$s\XqHFpoK#E|tZ;. ܃60H#*?ESHI9 ٪~lbR=T=y{ͬmgf%܊Xr3:+œoEz߾lħZ6S`vl>N >Ktkc]`jwϒ تR녮?eH@z\6ZZt_ww%m V{K۾om[ەc0П1p==sBbjo z@pQ!W{^o8Hڸrмr\j1ɰE\p0#J府hIOA؅7[`ǡ87VbY2XF8J YmV˳ҊBdC(Z)~!T)@e`X'a84 \nNP7O_~fxyWC{"P`WT<` _G=T|rH' -@wH\ [b wiyx>zG62W^r Dl`.N0v=U귫ޓQkVz+@|`|{|{GNU<ѽ6TN)28R|X>t{UnxdHOx ۚѴ}ݣ7/H[W_*|hd"jM0|y-qm+$эB`^1MP]eiGG݀I_z\H]#it $ ;3ral1~-HBH0Aoی?ai"&b6HN}lfOJ'СdXnz}#yxG6 BDB#ħމ5-o Rb1]iJhkFǾ]2ܖ[}#o3'@G P̣x z{w,yG30Z|釾{ѫdZI/JyveqK F-wXC"~]HSԑjNy+:zO;8}n5 spc>"Hu;K/w `dSS`$^c6Wg{߻| >Qe ꑱ"[W؁LV:0E';4.9ՏC>k""㪐$3).DE\1)z| SHUA)S{Ce쇔E"k!ge9;¾s*w )V2T]eXk`ٖOɯ|C3_ohegv>j]/W>B@9[Y+U%LZ4L*m-Qv?e X$b=+'* 7%"'o5(Sք_,k~r% il;aa'Y ]DxBه%Iz,/C?肸j87j/Pdv+Kniy_(:3 C!Aӏc Aο]ZV)Nm-wV Xbu1/W^RW0K8_?86hywVy<>Rޢ(qr Ӓʣmy䍹`endstream endobj 1294 0 obj 5728 endobj 1302 0 obj <> stream x[[l\ycV@]@=+5c,̹qeP"m)^. p-]RH&@Bhr"Æ} ‡A )P omЇ$mFΜ9gvjܝ/Ya̰9NNL%Sqh,73fr }akr|n|(_;qj8rꤶ~qG*K0ۃƦs'OK'a; b1 ߘc! :Qۓ< ϡ+P󏿧>Kro|Q*I dԡ;Y$DK)6;同SԌ- EOP%2$r{R5#.s8x% FYt?2`9;(Өir@2Nc\XP %æ0rO$PJpе xj0-.&0CSW(<AD1 t&ǴFUy&gԩGmܗQ⓳΅! >]Q.3t{(>(ČhnΗ ԝ5+Um6Qu#\qN('}mD1@d"t% zcd4G3-foZ)%ceѻY!زCqǨ k,3uӨSvugrp,553Hf^mr2Iζ")4\Pw~|߂ui2߶uW]%5i+j Nut?-\T$q[U 9| %_ߢǾ.R/ Z酷*hdӦq~ze/˺v줮Byp8_\QEYG  @ٙ]׭I}k=&nU;lǽaJޥW3c/yg@t%G N,=6rk1A&qI2cy8=,)2 r:UrTΐc0%3h4,yTHfdtFʮxJԩr?_ _Sfōԩvm7Ly`ѯxh<˧Oʱz!dܙj  =; %y?.X@2\Ɋ@~ m:(}"& KZem*߿2E2wԦDWϮI+S;M(qhګO?ȄjJoF(ܰETC 2%On)f[^ŕtl&|B3mkZC=d;W&?won 1tlpDdm:4TQTc`\Zq s|ahE0]4/O6M}*n;vBke<'sSyT0 ytI1'el^I[s O"wYkZ6v穟GOnC]~^0Åfp?ʛozw_k7euX쿈Ò3'`ΌM?0\]ZSVjj3H& JiH"N,%黗 |~fڷ& P$R1dXC('HzIW_*գZT+;g KNٙTg*Yg6+TPK/>[]+Q8VA_>+LMh<>Zv -] }ʇ7讷Jh.+tvtuۍ< i<+Q5&V!9mӨc+,N}Щ{CMcp,U(Z7g 0nFuXs]oi|?h?(qvuۡN]ohIr]ki##6K0VQX,4#"/u7b)pv4DއQD8txI7?rV8740^f|~kVK"D% ١dT[ LьjF֎6 E@ZG"[Ejbvúͯ[8λ"ZZvjBSL xQg E͵Ifqr&\:EGZj)m=mA>1۽ۅ1\:Oݩ,?]Vbŏꔿ{gyuV7ѶZ2Ŋ/--DQe#4e8wiEy>"PF>N(Jsg/g^ EjU~%T~he6K}S7V$h/1AֳlI5UBLvHCa\޸< O$L$ɖtgG"e!@j`P%%wH.l̲_;z:#HZ-$]^e6UFJ z+/͈\^- W+ ]Ȯ7JF/5J!ZJoxFNwr#cǏxS)xޓs'ƋS8Rȣ#ƱgёǎDW7{0etU2`[0ka wlr6TljӣNNUcd}+@vt>j^3熨Fpi*Ε #d$//,dvpK [H?}=%f1c5Q.S3"nX+{(ͦu=2wކd?UjFq;?lk|oC$a2Wzi8Pxr]>6ct-sq E>RaOlpV#:|G1ظI=-I޼ν{Q|:7\#ܣQ'puWM튴b^B9F^sb?[%s9(mz銍"-S:)o(_ZZ$6) j(w旎Im. > stream x=k^GuiC ٴͣJt6B(;w^wBnp.P0ާb{;@88q 5E[*( P#q(D)JО33g߽IM+rsϜ99g<=`=C{:gٰeh25DkVʢh OzC喹W9˗^k}q\>ͻ{oȞO׽|KF0.6I^sM7fޟqJزsn\|tՖ΍;QɪX Rԅ;ZjxP7\7:{oZÆ^۰sYCW]gv;] α7;mӋS3V ѪFYQ~J,뎃mt:*/gJ'?N}ɯ[n{уs#oylmݱ޽s)LeX0WL@E`dn׶]ݱ;dwvjfn7b%hr;k\qn7\ p(Tѽstj;1PuӗMs˖fvʌcySW''yĸUs<TwOmm:䢷.̓D瀒ƶaxΎ̃DAH&eQd ! w]!>zS7bUBou/mxITCd'kuuxxQa0J2{G{'o7dZץU/L1YIn㴆"CzE&9oPݬ-^㋯"{e|>ۯVuWft0*0~,c )[G cMӋ;:r;\kWR5FIh "scc>4Ya&^-8,_̤Z>Tt?!dqAnKѻ>>z`"g v^g]c 4Ȃu&69$_81iY?b` /0ztNCpzWS]A뽔,dzGW/AA db^+ީ*GҒ,o.9FBU_FvM߼u&A\  w`[G@@Q#@ܿ+{@ 'm;fp08}oDUh~ 1 ⮳~&rk:}v8zˑ]jF =;}‚G;&X$umY2Mܓ]{VTe9* pB>urnsXªRL>zyUao-h 93Kxۉ ,J:N ގʻ9Ỿl1߻>OvNKecuv~z1ħ%wl:{dly1V(n; 1`?)1yaf'Z>}6{zWz2K5u;lFVkyr>yFAրI <,_)*?0{s6Wrq@4}/f6{ X9@,HyZĦq'x5J`%6jա  sy-t.r;=20}az1l x$`.h(LL˜msh^0N`xzZ{?ld\!lQdNy"٩ߚG8wxsܓa:O0dI']\p;d%ki'ŽK!nuc$ȔMQ̀Twh?p…z0ӳwc*4ӀQL=1QɐуBdzS'ܐZrR_3YQt՞! 2 b:*} R{ j pY#pb'BLvq[Y S^9 oڋ%+j{ ' j,fSXf1]J}-yJz?V8ƺs%@{XUw1QBcjzn%ӮׂU}:{Ѷtb~ՑYxYE'Epeˀg[_A슭TReGa %j;U nu;׬5 r{FMhT)ub{ Btol 3UW QPګ^=?v+\yىŅ&-\ػ#o>w}]ҍOg9u٫?pݿ K?Z{8uwh9׼C;.0~?qӦog.>x{7ً?y뷿ɳ~aX VBQTZ2(9}LS7|a%gu^tϏ|k{y-O|/_~7lv؇G^|,ˮ-]6!#Vp[_p>:k%/_Ƈ~\/F,^}ٿ~S4o~;W-/ٸ|t+NKW/O7^ Yޏc^mxRx-TwaR2',n2W,:-M%U-6o"ǽv@STR &U4hqJ׌'|ݲ`ڠXYr0 uk^8D Fp}|eOOˡ𜖹8Вqr *(Y@ 5!io7%ju-9 whܒ]lwKlWB1+wCqWmE3-JDSn7{\}dzY.r=iS 4}HHVhE`e NĭpY)vPm+iū/u(Q`x\[6bupMg#١5WH%~BQ3n^F # g/&ed\(# k-2(,fkM$buj9-yZXe"*UtJ *4gC0(]o!Tj IFI!N_]=Z7+ wޱC#Vitp̽M#w`Z\7 +-hmΦ?+atɟ+7gx( 0F-Yr-$D~Ztٟۛw6mYӑj#i3  .P(b-i k;@IMtnE]gW?.\մn\@-n[B߬jZWjZ;+c7[B ZM$U̸yjVӸ*`gb5C7^Uu mp_P (s)sKv\64)]HI^$}em ??-&g0)_Ը <{z04قa.8-tNC3]=cJ<zSM]1QZ ŒWfNO}^ FV B3\?B?_  0^3aenzdSh(M/4iIkS26-Ų|a[[*ٴ5ܱ59@ULYyYN2(7q7!*:-zM|.YڷUںvO帟kdOLqaWQ=Y8@i=$8Bt4^2tj\i!D@&!Hc/) <}PI@ @s N|G Cy%*&D~GR!:TCHG)J{uD*R'B. A"$SsND--2+BQTi!Q [E|?-E0|]*B0PT3N|J [L5@)\f74,H!DGUlMDȍ2%@ oLpC Nڽ xHc$c Nx:dxj H1rI DeNA+xժ0,eP ,;:1L~vـfaZ62J~P c#%_B$m7 K"[9-A"b}ZZ4NPZE9jV4MP٬X7D=/ O@ AC ϲjLپ٘ 'dt˞a֝ L{5iF& +f--MtUqR}suғܑK#@=qԳ + 81BOkgqaȻ~dLrerLPSUGkZ*Ow=Li Q Nh#S'TvS'ܪN WThXNa:yP}T0$HTgC+ϝ\&üB^k[֯b`1o}SDXdEOWAт7R˷~]>m{E5b}L/ϯmtn6fsb;>B˧/{‘$68?pOendstream endobj 1312 0 obj 8470 endobj 1323 0 obj <> stream xZ{l[Ա)Rq&pS%T t4&!ؾo8~ޤ1nʒ$4- qUB7:Ih/saSעMsCĤ ﻾Ϲ6߹;aEOߨZ3\3,OTںkZ#B@.ja?VIp`Ei>;UӲSk_(|Z<Y{j+^}aWgH7@7B߄CsURhs5_c+;}]rH[B~v[p9\f״rك^AijiCRvl~[l{w?S{!Y 6?W\K%F?Er"=ErI{˷ܲkw`)8 {n[׾mc_JbG?-J@":lNYu.K5 \H8^7Ұ81ZL*bhhbt,>jrDNtGGhq[]8OKОwws@ fX˿)7QsuTO>9Vʨ)D7/%_3R,6+R5~S*iچWK -݈"()/??s`IUA5&IuNIΌwN=$KuvkR͋J}Qsj!wjsRǟ7-^}>YDS+;SS }[1HARcV"dsq(=~VO*q(9Zϩh5s`Ldsf䁖T&b/ܞ* 7pX8 LϦJI.w@ 3kld_=ݲ|&oMw77GC܅Ȳ"ZZR`Luf|Kn6kzn&2юp6[*(fYrTNbA~Cn1C9hܐ*vDp}dbd!>?W)s<$#5VB M-6HC0e;i! %x=z)IGZHlz A)zj\5trJM&`J3mPg0=_Yu{$3/{ꙠzGH?JPЧf'*'7b ݐGuO$KϻψBA9E֣I 7ߨ}km_G'\$q-;HWz;(zqFz[tXv:~?޿{))vK%, M{PIi _Pj a Hta$ 0AɈ-_HֲXDPj%I D%Df؉QY"=..]85%S H}$1%O#"oRhYפ c,PbI/[ ξ!vb.l$Zq.KCmK$RJ.2j?C{/a^mL`ˏJgБ\M¦#'i ~ N) NyoV e>VoLhY%M\,i| |y22䔴DDz.UȮ9dvxE{?׈탺LWS"CAb z\x5'Av'nS*e>)|XǙ"98Rufl^ Ԅ`ڭr^Em  N/` rU3ԫu@ԤLc-'p $$d"pw: C!\Ai|V$኶Uvʅw:R]7H?mɆFvWVy5+SfR6x{)c AmM9 WH*UrW"4[qwrx&;8(ʐoaSn 8x(\8s:[%,)9zB0{g2ņ cX &jCtg!:0t hsy&Iˣ@Ḡ(pE#5?w4HcIl*<.wر.nï/KMHQܹ <~t.ugX㦣C3?< Y>s\Td}fw$)-]2w^a1Z8g`9p6{%bQr:M mM3~3.}oeNxoKպ]#+q^."Gґ&zXz.C&SD}_ bI1)VUG4s.]!{o&.,I䊠1^/W*\;ݭư%.0UG'0nR| t<~--Xf, j*!N 5)ÕO y!d鍿ʡC&Wn5Y/qoe[K2 CccstL Wp aAA?Zf@OXS-9 &`pF+}ƫ|QR8T@;,:Ԝp;*~;]d@jx~imq.a,oLЊȃa[V^ c*e|Ÿt 8#cxrJt]2"A>W|RrXxO,չ\ӢDS & Nұe7NzZ!1pOr ~ydE ;Sendstream endobj 1324 0 obj 3443 endobj 1357 0 obj <> stream xkoTǕP%D*JK^UDݵ}w+$1΋BQJȣJ>Uը_CUUD3 Єzfk"3gΙ>s %Jd_R$υ\lHm:d`,?K 1MXR3Hm{|`"S]xWt>0~,}hx?E%I\@%rR酻], fIEL݄֮@`5u{O׽dU#[ 4&~(v0t(ħ8;}ArW/{]ȱ6 o!=-Ƕ/]l$aٹ;fA[APUwƝ\'x8ZqCX#Î"; pgY'. i@n)ԧ=δt0bS7$U1㘻h&-sRAt>|TsD@*dƔ2%Jf[1oIcޢC@ytF[DEP#FMKRu@FNK:iTjBM9_5 ,&mJ 0TR"`eu[PaC:X\WXQ SWtIڭJNS :;Ff~U7L؇6zIL{S2ibTl쎈kG6bLj21XPD20j Zb&lIRK1Cm!!BJM%&bKmNv'X s @ύAMC(f =L8DĚ~`gt]E qöiBy.V됬};Cc2< @Uct,ǐNP~S $k#ULFzxd0ʤ,>LU~J4P 1x̏d ĄOu1*<2+ipk >sB씣x" 4 !bxbES%{]&ԛffޒcЭ$!b}UT㓢qBGhC~;`:|Lă!)!kC4x! ^8r95 $Nx 3Z mB3mNьXr sZ[[Gaf-Y:,WQ}y.z죪ɺX?RB (Q8>C&Ց QX45e,}IUJ5YYU?NN4qR%S3lB!0HsT݃F頭e+dIyZ Ψ3 V!03 F,_5pCÛ/DO.@:/{UBcrds&,  ,'c붿U|wQ'/&۶ G$9G(Y|W:TN{wV25H87VpWj-Y.Olmw gk.kDhFN#B+Pl>ō@Ӝz ?Zْ/xs^Cm6>Qe[#b/ejp>큠U~?܎LJtipn`6I{Q);4Jϴ(b@QBM#sm*#jaR7G&$j>&oO#2!{q> d6o ƟA?F۲ZuWd^lgoe!gn\Lt&EEtJx91GI))h\D.QHiqJAl鶺K׈>eSK22!etmi܁GD|Vlx v Xxvr[μ` 1Z!_GJ1@̺瓫9Z?;rz;3<*`Uu oz_ѝQC"O:r4eX+4M/GVžY hSMn`աHT`]&?5?6BQǚk 0׌GDC0ˆv(3uXg K!|C8ZP_16DZ4cBgc)jVd3{~`r': Ē쥥iTԊN8&4+m-Mf=v5% te{ P1n]pP)ArPD8 iB/OlIb+x.UK3.d߯\kn߷wgמ}݃}訛^@{ڇgq3w;ف{J=ǹM /9}8=pN{N߀P5}hF#TAH@_ a ]@SSW?P1~s7B!$'Jk1K.+ 5sHc8Wtd4<ϲO(*]Ue\/4QLn2 2Uc4g}k̒_cb/5QHFJ`y;+w'ܼ<8!l!8<=#޽vE[ٗ/8Y\tzt (J-PdY('k/|^[U^X;+{bn(99U;m+UTwcF5?#x֊($b t Bu&hE&Hu5PS!.&˩w9!"Q9!BV |NZ!n]|Ou[tW-[/mPuC< zZhgڛxYPKH>x V8 j}-{_;.znǭbR+o6ƿ`EnA_9u&t5 H{hW:o܈v~ g^fGݵc8<_&[[nmkB_NN, ; P?A3]Gx2EK;y6l5S^/-v0,Zџ/jP"$*HÝY3ÓouKgyW5Wj]69endstream endobj 1358 0 obj 3709 endobj 1367 0 obj <> stream x[oS1DLEB,e6jLU)!D_³c1_6)I -& ctAE6iA Ӵ&m}v|}&&$w߽9ţk(O-88*gZVh CNE!#F<ـ?8@&?G`ů36o =r,Cd#W$oKţΞƎdcQAlG"?z_j3Ğꂐ~]Kf>Gp(3N_40>3F OOm>f؃֖*%*WORP4DGpzW> Ƨ>w<tn9GN+ huKYs6$ِ= hg!EA[Bjc\+v4(Sq$2a׆&:|fʼnUm>ހ<GPY2-~;VZ[$cjRI%ElKCY8L8:*i;*AooWn/dJq1[x`_x.YASoIێ"R|OkD`F;_nQd@Xi|Ͽt/`Ѣ= {Vaqh;=KZ]`ŭ02]~O.; {"h@]6$.B)^q0 bpSR_ 6?ϦS`;'`r׉L Y!])l[#ݏT`!n/![(˭#} [a<ؒ>Ob: Ƕz2v! }yf.QͶ;p H2a3a3ߘ#9c25 c־2rf $Z^S >=SZVR*ݘڲǥn{ {ԾV(]D"/*-aW x-Xb34&{E2XXlP}tLfc`G(d-9ruZ*6E}6p&D I:K 0]STL}C0>ŏNU]( ™h: ؖ$X 7ɍtdsQ0̷ z)*D#Đ)DbA҄_A[XUN5,$Y-o$pUcGcԜ2 \ fU(dCzh50~S< į*W26=p #"䷛?+}2m~zݔv+IlUԹ4PsjBe k6JٕlBr$Eh>fhMQ&4 'JZ8o.=Kg+JU* 9eC>tj ZyA5⒋oVˢ0TsO - dtMwܕ>Eod&Q݅f9ͩ;go íkS8M˺ v-D'F|@-BB<`َg'^ܚQ\YsLs1btgTI_-(2cҏ媏|rG{FVy,<^VqKO!E@$'V*Q0c: Cox _T^WTqWk50yk \]}3U*h陦5[ݡeluWmybZW]U%)z`8BCLߕ@pr;QZ)f[ Q?OZ봎,S:PDܸ9;x|,S2r8bқ̾!!V(|õq$|ݱ|_G3 ds>B_0ilB~BC1@-UDjs( of;*ǝn⭭k6$'oJW6G.:%[YCu]ޒ/?]oRתm<ďR0B3eJ]Uej^W(`6R(q[jcӱ-+M8`ջO>m&:ؘm!#' 398A&p79[_X9qEhMwGDPAf{lGyar(V2q~]hq lz}zDۼ혘)n׻jI-*T(r;+ kO>P_We"qiZy/XxRWދzp>hѝ%\A0endstream endobj 1368 0 obj 3458 endobj 1371 0 obj <> stream x} &Gu @ e,;DޕVwJ{Whe! BX!6@b0q8CaxN”qU*r3g*\^LӧO~ f) wk{통Ź{v]=׬u ј\8lu{]u~uϣ?[)g]+ %寿s%`O!o`,5._liTY|q|M/n58I-77 ,R'b{+3B%6F//80JV(̤F^C)Wpw,U^KAe]pY:WqH ({CRg~$نr %F,G4ٌ "CUu$>yĐ\ W  !Ɛh"AI9LGR!BI" 0%m? 0+"N(Gi!EИ !rLZ08cX g=@g8 &10?f ùE`T#r# ih`F( P+Q!z4ՈCPk^!ED( ZݺG s{ " ьNjpfek ed39 d`1xO#+N/9!>`ҿtu1fEtH ìvcHg4 1M\<e`Df2cL!*pGp&gxJ!q: ,F 8'F%qX@FD nhbC4Fi͟Et1hwPMqZ`(m6- =`j8zwȘcQK cAF#m>WAL7~m!^#Fvi@Ȃҿ\!5N0 %RY J%525dyK B"W!7Aga`y3p*lq(vP &!fjw޵HgY5eПЛMWW2Z8mH3Ĕ4լCӔ#qx#䐵G6C @檔l[E8wmFb&2 sHaFO >({311%fFX> )LK" } 1KY#9F.q>-3K1TcT;N \ 1.EO@s48>S|܍YĴk6*t":Ws"{>PfCGI;XqZ`WU,9ģIWX2yGގA^EJ'5eר5ĬqruKlrCFTH4YeE Wp{Ĭ Q$6 17`ΠpeP!kVPޅ B)nyR dRVIb.EbQL9,2ɖG:#^{+6R ECTimfTlWvTS@* D Ł9[\Yy5GT 1P#&F52vFDn'KF!eu`!4 >8-iHZ>8W!z !Kwy?[R qm֛v:"A^6C7PON5b8-[:ѱ'B1\#,t%!LZv g!a܆v@TN{hi>@(#ḑVmr" ` :I;C-oօz r4T:Wö`$[<6Smbn#J fSi`Ԭ|MV_Bʍ1.yN1 9f7+2*@p G4ADAKkgg*~:"M4Oj=D+vATNRm5^Z{R5کOQ {Ht94+ezCkSg{ YJ)O2x7dFrNкou„Vp)Һe*8EUH+ט{i#sD5kLft_#ܲ,癧ho3In& OD|7f Ph Qv$oe;ԏϝAGPWO6pTLL} -L3.{nt`h#eg5`Ch2mX3kнS:y{{6n6#m' mDDe'qgC8] f kx.f895PZ&'<ʑ!'ʔ/-޼6U. ޘxIgJ Ei41+Z!3QN:+;SoV~Xn s׾S;DLIq241_k:/FZ *;mi"do7T 9O[-5k6PPع$/=k4 TAjRETE#Ds m9o+hg-7ή$clDN3ijR6\LE]D]4f4kODwe9im&c'NjiS}2R1ib> j*ifjIJXVxZe&_Cv&xT?ܠ:>s壡[3eimnic[."U(PVo9{$;&yF.IO6mDAp5qx0c:4x[lfjL;#rj4q:yÌ| 9D=tKFbSh`;MG:5mۉxZቷ'7n&棧/gzI il#4El_z0e;1g/V;!K[{SFggUz6ڧ˅}-b;R8>hegbR mt8uh\rVib>y97>;I bEj5VU;`jN:^I4Fȱc̟zّ'@.isBݭמ+{I6Pg$p> \֞p+V2378, q+Bh쁎|6W\02Yڔګvrd:7h48ji#1EAd#b͔U3MֶNG>M̗nn&_Ltkz+PzQ>Q׬FB Ӎf5oioNcx'/^w;'|?4U+̯WW? 'ś/?Co{{[N;?|7^ڭ}_}}M{ros~ZSFH}֞p+}}~=eɡG{p'>K~}'7~;yso_}Ԯuw] Bx "YjrZXDohG[H.|Ź{v]= [qݿ *]bO0Iڳv%g6VVPOspSJƷ3J{X{D=Koin Y0a/HE}Xϵ?Hm:myR@転N&y{M{9=cۼnGru;;\YZV@kO@ʛDI-uGli"T1gTa IUt~ tGOiRU=e!p#~'VDR88m#9UsT\670܁O&V) ~kvC"zWadL5fKܼcOk Hxs}cS(&i77ii㧤zoUڮ//j:^6bC)/8Q[p"! cVXMLԪ]cxMI@VX=2h:݃'9TյjxeuS kchշ1z:Y|Ǘ59֠jkhշﱱ[yv@kЕ5t9kQcd ?v{[c V};h #k06u58=lm vx=F֠Xd`4833\m Q{;h #[{̃9c1AkY~DDȝa.Ǚ59jkhշﱱ%;` kM੻ڬ67^ԸfVZ7_ڨ_(jV4R?apɻ,> $"jiUs2ҟX~/(yNJw%Hc߻q|VKdY. 䍵~g g#jQL1-tf\cmʬ{lov*-C3`:=:}As`Z:5X ]_b",uݼՋ_' |ccm+k̶76n~jgm`jp'_Hf0IIty-9N$:!BnOCcxQy#HȑT!ING$ұɜ!INxN7tH/s"H/*rN$9BIsK_0Zױ t"tH/ᕓG8- !Ik} N$9ܜ!_9Gz9ٖIr!I/Ir)tH##9Cr$=D9C:9ifIH'G5tH<\0Z  9[pzӱ/8x۸!}y0QJN$9x@QH]Gz9d3CJ?$mQ9֜#x !IDztH*I.Gz9Z&_()-_H2|SR(8+H/HU$9T9Cz<\r:$ ˃뿅LH/*Y$9n598S$9[Է3~0!qGZ$&׳ùh^oH_/]; Iѡdf{$ICz9A^'Rr:$1n{$ɉ75t(WNB:9+`Bhd!INa$ǻ& ?^Wă Ir*`BGIr-`Bz=g` JR 쁾,xCxUƃ @Pr/Sr:$Ѿ Ir %CT@A#MLHclҗG.͒!L~0!/9峅 HcMx[rlCp8=˱)҇n*:]gدӟ-:Geκ?pmsW^8e~OvUtE8tg쭂p/?:cM{ :7B^ņ"(DtW^Z.|W@Vpط\o…Ix'ZlH^u+O|xǵֲi/3?+=S͟?]|͟O>]=;JůHV!jVA?^Vg߷_xnR~ 5'E.7scڊkm4K*~>ޙ`䇮:[g8u Wzþ3^q'ܾbh.pg;yG.{hyŤl4_VyAς'Uc߈ݨsٰhotﻞ[*p/s r/|A һf!|Dswo߶yU5080[uRo|{[gvv`Y__\v6G…n,x~?k>އ /]/SzkURN~&.чsç]FeC6s6[l6ƼM :D9 G ŰbrXGaX:~{k@FͫR x}9sLʹ|4<݋a+~}gC΄n>tDG< 8?p5tǃz|Oy C ?WO^gWBOyH?_}j}P)W~E_s=i#gI%"DE7]D۲ݾyu O}S0/=9aJA?ݷ:+VZ0 E|x Y[ۋ Ӷh%e8:\!K>|e03ޕsG۶֩ʋ;> "(pIl9t=W!y=0>{dߠ:džmZʽW~W\zHPT zz3l7\y塡y4ow?D>}y蚭#V:mѮ^yʳ1No3e_Y6~{-wu||3t}r'}nIH5bꖿQ8摺ZB0sN F{?o?Q*ؽ0VE5 G;7\d9$27PigǪcA)ݺ<\{Ðgh7&d$j|g^ucUARvG,;J?7} οT4}X |t ~ر6TlƸn坲i7oLgVFO, Jů,MVwln[푴m=b#:gP84-ڼ$_W 6BK?W4[~s")shk}ǹ@l#3&oNk(XoޣLm8= S RZj=VhCR+-g&\WYl38c^dE؉$!$ { !L^0j{ja̙_9(LAImcN+;Dxv|uwHOWjm$Q{&n LJAai&]YGUS~' [u`'Dd~sj38`{wMʽ}0yUgW޴: >qU0Gmyie/kn-< Ґrpp}rBYuadv`fG\Ⱦ3>iq>i"g+x> stream xZ]l\G. ʶRV"R`Za9)ٛ;s^JZ)nHS5rD}w&8nMA4ADA /< #Ǫ/ Q9s-v9sf|̙9L3ſppqՖ BHa7gG i c&%􄅝:rgDĨ| >c.;QuuBp:C>9#^'Adz%.,-pYyn= r# /7/nڞzL::<=žn)?uUʁ"lWji5Yd3C?lG)kKyjY ?S'tfko!+/N^ĿcꝓY ӱ~=ܖp|I[6r G(]1q>/obn,j `[dwɘrqZm)90M&ֺAՐGhzVb ̣Kw4=w+_}Lh4 -ת'c&do7ە< $gx4W\lRKPXB hs? A*X[tմ/j?ŢVjh oݸaj֝c]Q0Q&bcANzf(nP3ߵCs_7XI %M͕cFjzaپ4ͬ-8쵩(m,3 P@(aa;q%-# asy')$pn밾9T^65a,85y4|"i#sX9$*^b&a@RF`$n}N-X2d;(> -({n!&- )Rg4gPUwU']%&A,邐I1;~A]&;Пn1`ƃ6!0⶜F*50`fj({lAqM> 0׀WIH0&d@nPMa/|BE;TnBN3RTl x΁m^c՟걂eڠt^oU @9:ÐHC Ң g܃LEo7ŪvkL<%)AcsfLU4tpoFۖAf%Y@:';:bB]h1iʮgPӧ;m w5NF+*(A ҹR'I*% .PWvh[Ff&‰k.CYZ_[b4A$؋íbts*^G]n,?sݣ~>ڔ͓b_&5 'լ-y֋Xt2* q1V:nyJζeՑh]d,}K:-R^p*< 6R fXuY?]. zIbe BCEK+amwB\8zq.kwҵw^\K+8 <6WRS.ZSmXY r!v-5DQI #rMUJPԡ*zy++]7>X چŠ>Taz-yp%4E)3,HˎRV.*1;N+Y-Ӻ.a<SZzKbx./Ǘ$w!}S`ZiJZ̼n{L\o3ʎO `Z`}15(ùShyޖ<( Վ^v彠6.m*N6ǧ/rc+t%Z{R$P| )MXbbzy *BC}aQ9v`Ct)ŞJLNK<.p >/Rr|>dWyQ lr z(pg^_ ԯ!GWP8wݸ7N9D'Qh/Y>䰉mh/*HH2 b=D=Lwgמg0jsxaU| '6 4 #TGE%A y+{2; {-'6'Ho +ժ NzŽP@x)dծnWt]s;]2ǨzŶAcUE7BW{ xOLlT(]::0ƿ##vW,*-Xz5m CJ: I鵌@UQ@hS箚w4}-5d[gwÃ9ۮN*Z3Eu:P#pI %V}QG_ cxhEUM5.~ _擨aԐ~ؓO2^PZ,> z<م4y}AxW(4< 8?^S˽;6 7fjø}!sZ@f+ye`@q9<ۭ&&ƒ nr$XL S7-keU;E^IJa]˘萮MɖO J.93>o˽'`HpH>mmX{d }25U64;E )|'H <5`ZRl+O=AN,!_@j?$ZJyCgIt3Rp&Z{X<6^14\`.ŏZWvk|=7FWΡe<Ȑ),T1W8j.g-`1|қ *gSJ-LZAyIX hvO%n>rJ㬿莎ZӫgZVAkLO+2nC]zs_ǰFkxlqP$h;KjE :zƯ\\'{?h4endstream endobj 1386 0 obj 3615 endobj 1391 0 obj <> stream xZ}lE̝6$Ԇc0w8*fjiI֝99_i哦\RF)릭UƗK`@ i[5uhiBФmwgyQM}= XsuuOٿTkks=uV?8Qu-m澦qxw>ZT6<DF@uۿҁ(~ u|k!>SUn(#[Ԏ$mCǐVDMuEWDa!J^7dlZuG5>3um픘Qo!"F"!96G`ţB<Ĩ{] K Rt/ 2|tئ3'*{8ڟ?"C=xo=x*ID/Gɣ?Bo?`:RnN^Ԥ $+L,~;5n.a[j.>[*E5L*4ڌӽ;+k1_KwO\ix~}zQ< CA `aNwg>uor& s/RӽɤطQ&LQ DAJ鋋w @G(T8$rpp6W=ɤ%н ?Ba&h#鸚\eL H20E‚ˬj(FOhG)'\Rq#" JuchK9y ^KՁ}u u".2 3 &)>I`KI`IbWCaSGMX\*SnVBsڟz3]+jt? "eԈt^dbe}~})T 8c;@Fi'87lA!wϢYE&Vճ< _zSF\#EEp"o5kD=}EF2'ٷk_6ZS(j;$9Dwͬ;ZE\*[U󱅽`(c]=%T&opra@׻E ,)2w)#Ѿ@G c{ mICBTf}lCI&PoTÜ|r l_)"=w <z>@L.xYifC(K^$ ayQMe?\#gW$գw}Ake)!$t i<)gHtN~R `Puo;0X77xebpVmc,&{^'Ů*A#:ш'mǢ 2vюfQ"d;g   <ZotX*RCg?wN}Px%ِI}gA:.XSӽ&&پ'c;x~a.Cc-jFî5 מ3qZ`W1USkH`l]rPOec 62R7m` >1SÁfZ+M%ceAuC:Z7(Ƿm]gײgPceQ=h2RRЪt2)>*b*G:QĞW e'VR9`Q'ˤ #(J5v*GOy`0,P}׌3H"%sZbV@^y2?Vՙ[i͂`~wFaQEo3uz)ts)YeBI4D'-1LR)m~H .Yt_9 l~BL!v/*BXU)l].CM[lO;sWV=R ߨ3eUf:O]o,||Xdf-co N RW% V/7Щg1NGٚ3o;}'17 GJjsP{ީAAO[l ,ʸgb2*lw\Yg6$ryl X-؈C 0\yp;s']B1TB ;R4V9D"#`wTkGf̘=o3OK/UJH`,ĎT"]7v5V^^b?`vw8vz70zi #Rh1{ v뭈|ХLTדsƜx~U&gXс139g9 "s+B4P4+$8-<6W@z[5f} ň9\ÓI7aeG@dΑW͔zh}IzT/l4S&T ʦGQͫ->f 䛚l4wkFVɤhy^YFdF!߷Rg.̴m Sqѡ:K_&O>HA2D:a _SjD^vVb%GtOl"H07YD\JfB/UdJ6*!%`JyzARg@~ ]/J o\5v wmK}2uJH ~C'&E9e?z3uڔ-I85Fi7V|$V嫡Y(ddLfNH۬HFF-gϖ^ GJ}3 q%5zA7+k.qy ;X=N/!E47M?dm> stream x\{]y"+Bp|{̙יd{#6{a߽!I(RIK^M$"Td%j`L005Д$(J IoΙמ{7|3wEIL+>ڶڶh|4ъ"fH IxFRBI믫utvяǂ˲u_i}5 / J|^p<Kk w(Q*kV?8>;q$$,EI. C{X]^}YcVԺ/?+X WEj=5J\KBg;žOe ^y16zW:̇}Q}ai'34v@ܥ}vgtHsi1_+ޫ<<)3Ij8??kFn8KI,Fj'21m][^80e$fYԮq`yShbSэ5mF_D B@4f )4_[DJłymeQDȘ\Bh[Po2YJ"YREג0 5XURĊyBd'V "ClĔb1 a*B"d@G 8H0N7;E ծgAJ8̒)(;1DVr=5i t"1t aE OP*q6(?B(U\klе-7 B'KHʳI =h̹/(0Iyt aȖ8#Os0 "Ђ@iE'(jTA@R=#AfYg(Mhb$fve3C` FP'*SY$ S5k!)& 9VX#oM*Tٴ) #AkzFdd Df RscbW 3?%$p2f\Х$Qѓo,U^4.yUkVX`SE+kyV 7*+sq,RL3` o=^#.QGB9Q*::K:a̹3bfsc,GRj[/ CE+>ҪcCN7%:[Өj3Dҙu3K&f1&HYUo6OcdTYA92w Xd2!  v\C ~G3ܨF5j5ڑJ8UKVe ą+&јG~ Rd=Rd+ɤbMj;/+Ta n)KR0f)ub_~N/,Hyb*oT[7/wߊ\qLuy)#WRᕖWa/2 X/+Qtp%q0\9/2x!/ܿ 送t/\;EF?ⶕ؃GT8Ʃ~dVW -̢V4bl/;6I*~ŴP1nIq \!4pLD0ed0pU \|5 '2` NŐлbxzvibZuSW,v+n(sr]nTXgӡFh,)?PC)R9C D{3B?̈́p"|Xv,Ӏ xK0<A}X> |UQ*&21YϣK4P"H3<X[ $,NOYYrhi bd>$H `34"K&̧1壀 ǥ',bZ9I, )˅$$fbOS Ƹ3Ii0=XyRIXOcˇ'<X>+}Zȣ1p6" ^q|Lh bp I `pE 8+ HDE,!k{F,'OXL`>AE,+1|h0*XZ&^4q|Sh b䡄3E,L2IcE,T@BHv|O8r+;@+X>2A,4QqkNt8>1"ʌ,|(2 A>tX>L [r$ cC,<,(bx?E,K ;)cEa @/X>@ c+OY(tX>%AL`',b$aLw˜1!d4b C0\_R[76zx/ߊNKP%zs{.J#2LUfUATM+U4xUPULKJ.9/i^6@?))-)ѫEi9j:Nڐ{Es;Fb!fv!b$ySYR労\fL];gFg-F֌SDNC3fcR,.?xJ/To,r{ԘxP T`2: A ]@l2`rQ(]HS忚tYYldyF#[5Y/c:Z&m_AfjkzL%esRUQa΢ 4'dz1ɜT +Y]dF@1o_'CoW=^W(i[|o?ݕ|MInkwCFl޷qx`ВZu]ތf~YC=Ρ}$HPArûNw'l,(_A)d?" :A 1UkwnqW}NȍYz+g70&=B6ZGzCtoh`M@6*ك-%te&+vJ7Pk* }q[d%8i)650"4 #S+ mţ}/E{|<3q8l1\elhGoY˯ao ܪkwoovq=Zxpnh? LJgcގЖӋ~h~G# zϤ\|THpy5}1&mjCajVWt1Dż:hסΔ_ r9›O6>i;{̠ س86nO)%鑗ZvGcڀ¼S ou_i~ j4^8wh(˟7 jeÿ:gA_0bŻ V}Mgד(&?}uMM7ЕDyA\hW?`V吻8)#]O+mxGR3ƤqݞFߋs/,pN~w_L+]B;'R&/tiLyQq-I=TY!w;=o>oM{#sJ!S~$4؏ ,^g A@24W\zì(Aڕk|CyCЉ9λƞ`%ØS@jFF8)UF6#acFL<1<C{((yMmZ{NTw FkE?%[w=ׅ5϶.7?7x#)XU/3fJ&W"La?t;A/,Nـ߇v QXv޼o3p'40'i6`D퇅e~H. @ܥ  &ˣe`2隼5 |"qwS&ydv4b#yjsdA΂˭C90ƚPZ&Lkg]iHk4Zm]~R]\86tAc9=ܳEi'<~OI>yh-: ;N|hbхN!˻&v||%5qRu.XѓCNb`'u,?,A3wvu;'cBu%ZeZEӂ ?!ѕyWendstream endobj 1423 0 obj 5886 endobj 1437 0 obj <> stream x]gGU_-J QZ3X iwln,vo_-u_M "R䇢!DR,6`)Z5? !BLD\:9rWLοM ;/M.!ĸVOh/&&/FO\klde X&-a :Fv(dVNtLDNK i3y+L8oq-GP UJZ& ="Nߩjw!5\4h|`R,+URPPh>''F{I vqzb55H\DhѴA/Az7humA^V6.@ix;a| hkPnT5!Z[hz݀ZF[K|y 1- VEl^|p c BR)!c1zh;tANw&R4soqBH@g0}Ec5N !i\ѶkZ^iLi NKYw.MAN򌬱ֶma643ɥ {X?vWk]4N8puCC nM& dN@nϿ2B&\Zͮ=K@ %a(:Z ܍_(?) (b BÈ; ARHۍDk :,p0 40 qәnl-@ㄜ(o]t9ƉqL .u& FAEi:8(FKNQc"aBuˆrGuWeVXp` ]@Űa*ǜG>J#G#^X ޒFo|l(ˤ1_~8Ķ8ĶÈ~ w\vy/;t#ø8|ͷ(ymWĻp38sw߻{}?jnsK|7³+'wOwOs>sn}3|o}W?|ᅇ˳:3o{>{o7o~Ntc/FkW@z^4{<}]/y {_~ަOn?}J^zTg=>yN>#[O=ʯ3M{?]( A~  dz:NTj%.H+3F íii{[nh h/]Y_jcZ#16XS7YNfjhxӬ*hq\*]c&8;._]}޳yg}gz?q}O\xѣ/zοxG~?w7GqjKM/>~>G;\Ɨԟ~~+λ>|;|?#|_;_x?|}/z95خzzw(yٻ  "㴷lMS&/P<$Qmzjp2.Z ӌSJz;Pc3 {w<ʩM:L:5to C>zTxϐMn=fs4]zӷg9 wVsXX&C$a]©:*&Zܞ3IYzn1I# ގV:2Qf+*-Ir#õs8HZ_;7p S-@=|UkG%cg[laHϱJɡFf#9gNadw~~5 bcBu݅#n$UyIr#V`ݞZzSލp#iqA> ܌*9xJ0Q7al@/%%saN/q.o8k\+52c/D#ݩZ7:cݰե5O/x{ujcNiʴd~Nx\E֝уVJ+Ӏ;"ӉeӞθtKipOMYԟДE,S@ v(۴vq?Ɉ l+R2BG9+=" nZ HkqO21B@S @Ն BJh !ʄOQY2!!W~ Z\&Cc*&ƒ -*+BSB (eBtЧ 8nOPy$bOR8?䑊=\2B(yST"/Үm!W誻;rE/ C(1ĚJC)ZpYZʒZpT+ZfRЅ@9~^h%6jw!uLC cC1.ePL 0y A/f< ;x :0a\AW_z|{m! s} ˀ2-TP\g=ƵXcxV;Rj]k=qp0iBuugb9u8B k5eRBsH&ˌI#'82q8A9%c€X7ށ*r+ΐgd$"3Rz H۔F8Ri)q eLㄐƉ4N`wY@q:_kb(3 B'Ҹ#umplqAR>%#Og~VM!$>􌬱Ί$,8n7=T bȥypב)1+s4'0c4N !i46.ilpEӍhUZJ­X+bؠarÈQh)kp$f^[e8I9lIEɍg0#;p=+[da<[@t7 f-(,,F@בèI'At` Z`R  Yq ={kӴ;XgaB`Axդug|At؅q^1B.e?8gץY.wg>׼Ϧk~;YbՄzd, bfGS QA44z6_ȥ21yTf-G.9RnWyPUWQfR\ (ft<875xu':f?[3bC QF4N pTMsf<:퐉3\|!,=E&zʖ}:ʠa--k!wi~n g>R=#]uOPElz][yO|]7 K\RQ{7t\zXd'q~IHxx[œcM10YE&!@ UEHqJ&!ۚ'!x2Rl^\&! J&!<J=f" a,^4Ճ@,h<&B,S+`,V" ),Җ>B n B]ڥ'!QR 2 a<05OB O\[d(먀ƃJ&!GsRx40'#9<ʅ$و )<FUT@H)US5OB mCRxuT@q14IHqB Ӣ a>PÔduV;4#svztSͩ]ϜiL9~;i6^5ԜŜ)xUsr`NUed.̩cbNiwL3g8fKZTƋ'mA13#ŜjNO-Dꥦ[8+f;h+;{s+?AT5霭wdq_}uxiS> stream xW[le~}46M qm҅%)T733NKYgmcK^"‹$Dc FP),i"rQ5x?=uK_&sC>}ݼY[ |k5_Z9 [_O|Bwv.^婫\v.Ddo%qP"li?[ /޹Vna :;'ܽDnWCp ږx7NWDj*h8j3Ҹlr֮zc7b3TU*QƳpD̈mK\ϒ3 ˟j+x}SY-5k;[)ʪn󈀖Y~'sxx#=msqVa|aV+|}lbɺM(N@KzQYi&~ \ޟS$n&7jr&y-m $QDThTaaƌۙF4NPE#5 wz|Z qb1 /!jٱe!n@½VCNXbD] ,u?ݶ1I"}jG$*:ƳF,g!1r,΀>" )RO!>~qdW(nUY]偔g$W> #}*48Fw$*%v#&H0"َ5;r2T&^{jʟb YRM\!EHDbꨇ0{;$`L@KxUȣ#jBKa Moi8 ؜S*,W/p+2)fbr+D[صI H8HPY+TlVBR?4zɐ;mlubbԉ2dHHI_w8?S}ֈAڙZ ˡR-/JIX$! R)[zq+lhOblv,ԍZLN^R,>TXs`w[{i)e!T$6$l8ORړ@' V1x8d ZTzGNۓ+ ki#<"^F䴱<_ [^>O 02TQ`$(عZt cP鷸ioS+m)Zzz߼/ʯǾ8:4vk#cG_fl(xIQ+ JР%87CjE @8BY3tNLR0>&3 c ڈʏ)7׹BaG6R0ꔩ|LM 7bTXE]Dy9EI͓jϏirl[ۯ|,Yrpax\v=YM 3]G:L;4Y7Ya%BNaiAb`bFV"/,9Bב0=l 5nG#%Tx 6r̭^\k12f/Q٢;)0kmq ~eͼwm@7`Juu;Kz1]s‹O!AkrȦdVXcF ^5T#NV[fd ܟ4 Opx!R C΁Ý䚷h4DK=M*ue& EKTgr&.Rxz_dhXrHy> P*.YlYD^Cч>vendstream endobj 1449 0 obj 1893 endobj 1467 0 obj <> stream xX[l-@  HJ,.Y0*BL\.Պ-:ڄ*j#E~F> KI> ڲH٢Qi;3\Вe;3qgf\99j^{v}GԽG{I슪ܳ@g_?Av9 .~ς8ͳw{ߓ}>kƒxtM4ҿW! G]In/-Oғ00$ v ~_}zu@_{^L:dkz=X"jyq^zj‘O?xu5iKÇ.H_G6seWG՘g+{3êv;o[id :pǭZ숝)Ы\2R]3*3B):dcܲQur=&h[|iȪNv-Vl ш&9oA-7|9(AAh3 cOmEb3Ʋ\ƌ(\5dŊiUǽe7ayI%ۅJTٺ=TjwLÎ0ɪȔwCş/[L#1z7ԟ}m[R|E}Az ny"#ˬ~;lZlj Gx~ySwV&3K.N H\4 QM,{cDOd ,: )s.&J+ߗ߃όY֮t傋S E'魞E`i_AGNS%!h+Db;>/n}B6B2V7u2G `Y, CXj7S:]PmJMo [m$NmEI Kq\;N"Žv耧N;iO6~3ER<Dqk|_]& }Ԋ߭ƛ.tP| GC}NVzDܬ =]X (kriX:D@k,n:qHjl2bjN8G=ci\pQoH󜑏>xZsf6 oٴt}ф: \ѻo.O蓢~?"6 wW-Y^Z:m5!8" u̱^kvҾRٶao0cvvG /BWs cS8ҥN ;L=*gJZ$R*^ õr'Ċ 8%9A]UhemweAd_%dWw_vjNl endstream endobj 1468 0 obj 2709 endobj 1474 0 obj <> stream x[ouj6)޽w=sν3gL wͨfXr~ fcW]QgwmlLlY uk4{6Bn.lvNqz뚷1(WkN^QE<@NOlLP$Eh㖺-1z]vk_6no[bnBz<&22'DEw&Rw5T gׇ,պ)ԓM{&Iksu5Mdxq"N"?"纍t5D_"V6ɾ>N)<ñ-0ixKtMt"3fknԢʘWtѢ!\4g40Et 'Wi;iH3Z(OM6 碉L/WCزW?1D1dDLu8䇉ĈvޱKE)a(KҦL+l|\QcI @J\F/gYQ>*Z~Dz!U\:\AݝH4Bcr3-L$c3N"?L%`^v.jÀU=kY;h +j0ݾ2u +acĜc\^14#t7"`l 0 L~@iY;FV850 N!zbHbHӉx"C,u7gpdj W(Bp%4p# fh7^Oi$#eN9.Xk􂳥LٻQ``"./cS'OhS/Yl?YRUӺi'.e{A;h-rR 䵣1uT%F@%cZ/gxNue~DSALD쏹{0ZfU ޘo>]qŔq.vEA1X\d !Nʪ\ESQE|'BDga  _ _Go/` !ڄ*{$۾5 ko_Njp]N.X4/]h4~gնXyk] /|=wAe!"V{k-]~+zQ\Q $Am\ .m(rfF9FCEQS2 JY7@*:ŅU;Ԯ^":)DHm2L!( yxvujq5f z*n)$+ j(h)Syȏ"`"L![_t-ST*Ǹtb@8y rbTJϳijk;82a"`^q- %`Հ7J}'2}W&Ymu"/Yd"Yj빈>.~ B $S.e g(!k(V&`b6EVfc `P i*mEs*SH|Q[+}I2s*:S"ٓ;lL@Ya´HYIk xl .M0Xsx}iLv*^Y8Cr/h%RyT/8K\Ǽ rq\&wC$^f8=ަ0L:i\ @SI/F .T::XÔb#Auoap@ue'|ڲt sЕe4r)?U j&.ߜ7jOSX1.T辫x/d T)K+. f7 eR  P< OV- K=T El+ ޿؝Vf?v2}J;uO+9 ~a~g@ xxoMRGasgOB Dchs!,{j{ĊifU!;gF<)`ŲV 1uቋza0Hϲy.߬ԥ CrVډ/VԲaItP&yk\zx8iJ|nL|SA,x5VwJuTǻ6: eOjT!-+]!t/!u41s7-Ϲ0 xcs/UAQ/`|F|9 )fyޙ0xY?hrDO=!^ÚG< g̴ۛzNAo&,A,~gEG7wpaJcnli(M¡#t؞,8AƆ؛.*eU6o?R20kPcMX6bER3)t)qz&kDx :>!/KUZ$$l)QkAxI&Iv "q,"U S[OZ)#sS=s,2EƓMcNI[ԧ&W!hqlK7w=][:/g&͏]۷QG|{Ӻ*eyUn)Xh9 ɥOOaYaBK⳶ XٟXnM¦YkLHj+o^ )h$bf>pK@k${GN5XjSOj{1r``5R;d+rf!Ȕ7kFLߜۃ`/Ov~߂myC1r<_P;:V 1vGL+ hศx_]W$).*^H+Wh{F43$-QT@ 0`=Dqa2-~u)49su u(΅zz fy/fl>bt/-kLS2ݜg*> stream xWMoWdYDEr=|"-tމ,k?8tt~z)8."n5ʂ ]5~3r6r>]2 j TTj79=n "RPhGÚC_sر/+x+pH[ѡsܷYvr-'+"e[9s&7еDu>АP~h*.mT>>,E e 7A eH|Ѭ'9DKX?l{۸Y&5Ys8O^Iіm h-=n^K], CZ3*W#|y9@ 1x~mY9nUIkʔ˱‰po*P zdn Ñ]Qow7㠻`3+! 'LP$X1#|'^ln⊰pdû$n=(䜦/д-%KTZ#SZO;}PL=w~gG>9N%2hdtX P9ިm4%=H $3Tq(jbh*PlH?JDIǧEid)+` G =( 3[69f2!$*.˯]Y90(L vjT5gE0J=o4pRrށ2G-;֩<=vRށfVW\Ņô(jMYYLhm5Э+ O@ũ1KYA"CfEc'(Ǽw@o*N 9~tP~Ѵ9ڼa*)MUea7`WE+@Z=/rV9wUZb{M,nc0)3w8۹~r0[]a$*NF3N}#yt !pnTSs£a:R0iRK(n \7S5!%hӻRR&:O>hژ$`J\'w 9F%B9}fE~^rqV> stream xX]lYF E"dUT,!YHq뙱g˾lx3cLiCҬVHݴnݶ VZh+qν3$ Zs9;ΝGD>]xnxɷ?矟>:ɋTe8Z?ĴrDlG?6urXpTyxz~4)\ϡؓBcp%5MRE^";'eu>Eg>~~JtW2YhJ*ukA6=^֧_qcpjj,N+n3~U0fKe;nAQӻ[B ˊod[z]u"jg( b9ta!ѢOJ lfD~ iMc+I ~-*F|uu7V]`sQqI7i%H`#;]?oq.it>Db{VIV١tMP+L9zii~#V1x+!L>0W(9r%0n>NpgK;^ 岣`u pyWIlcILçBHKʀBsgd׻l M7il(Rn0..Is 9M]3.5UI 2^yU}!mamBUr 7$1ADt 1} ɪz^vAp drH `\8[W\6'Cf݉Cvy{ ōZ]{ҭ׮ 74YD_'3hՏ1o2ͶU*ړsؠ J!1^8` :χ< j!V ۃ瑝} [pJs$Z<)QEZ"y[ѝOEr""ԫpEwWjX=2;dWTbNZf0)˃K'ԣ9 eJbW|2HQaڑm'=׉+V\.X<>O=`PnI)ck t@SkDv̑=[eڹ$hThu,nGu㬻B X?c 4N:T+Q(b4Rޤ^8g^ؓ *Hs1{3Q3BEfK]7vSB`U5!wbGf@bib sqΘwa:j'IP!&;һ/a\p j5"i8sNEx@f/N1D6L^mr:J; (p\pZU?R"qj{PdBi$in{ 3p%@ó!HÕ3(r)Uں_h`ߡ3eg{fH.pRvʚ4oSiz9f'Fn{\Ɋ}7o}qKa{Ӆꠙz4UQfƙA=W@Ha{uqUwXE(‡Iv+(YKk9/[b#Tq 3E<_`%k6ݧuu5+8@%[J;p8ZDѴLO'{)v!&D@C?_f`݇A'BT2sޗ= ׎]&`sǓam#̪_>dl|3Vrj;HtU$i}{QO=}'."٘`[ց- _9/N5UQ838Bx*ۚ$e2{ s(\k*u]| b9ǶdO4vόO EZ$>|a_endstream endobj 1521 0 obj 2429 endobj 1528 0 obj <> stream xU[oETleVeΚ7 A Tֻ:^/N! U\%HTB*PD$ )*Ob&p :;sΜs\f< O멛9C7Xx(mWG^`/"y3M&"p@"`&mɗP`gOò^c4z6>Iudd a2R42mZ,[U4՛ͥ)1˂'Rc`djK.K"mZJn[2SHayY޸cUdvW2MbH-[].b8tƐ΁+ZyyV]gzO/;y[NkVfS+S.jr̤$u]n-?MFJOnӍq^3T2wWxt|AѸ(y ;3/o*jK[Jǁ] z(R[N_.s%3LA 5 UAv௃?;W #}zޢ!/+iBJV2_۫$?6&lg}4$쥷]fL>(i> ٜRleB1uy75Rf{y yD99lո\@Hu7!#4fT*9^u |ƅ;*΁;?060T1H/:"1b7ĝԂSĪ P U>1 t t|?yBe_T9q\#NT<%b KgG ^tUH>丛3endstream endobj 1529 0 obj 1247 endobj 1534 0 obj <> stream xW}tSg,]Ś79\rNȽIcCTuͰI;e4a`69\c:lZA)"']X;lӭ:{x$}{4NsKy?XY,NhZՔUBtM}O˒4H؏-UUH>#k6F'>^bI4+>R@z'ƣ ڋ>DM6ޥc/_-](?U 5՟^~s)߲֕gW}^a_mJAdZJh/ծƮq*}WQRkCܡKۀ_^g[ lޤOENG;5aKa7t[xE#bm1N lnn᷆U6j-Vf6bttuZܣ1FuB1^Bт` zBtt%DhjǙd7P{7ET#6~O _o>2``p`pPp! *-#CpE['~wߝˤ\#C~! rld(0u@?NT]@hKI( ZI=<ҠIt(@)儽ѷƜ4+![ZLewxPZ=Id}Δ"HV|P0FqhAL%)г}\&U\ -S^O=Igd׻?c{%ÿ1{E ߕu>A ]ç]wRtfwgBuJJgKW䙬mĕfmy"OxHϟ?DՏPxi] * S4yf&g'g*^R=J\[JIe=34Aъ "trv%$`Ĭy9Q'/ O_K$q&/_yr+Aozy{/ e>(58WR!XӫBzFz" I_(jScrE&Ir$tˁP6wڕ$ڔ&F6CnHP;D<: [7fn'۫uSnKAJjA: IwL_:IJj*(!Eo*Fojեp߯2ナo;Zg֡5I{9hQ.x/ѣ KUn5m`50"WMN6'Q5 x9bPrp7l’jcy8wOo)Аiay¥ "=t=Q< ~J76j5^#IrxN B!~l @#LB1]y':6{b{9q Wq21#naCyV֭UFMVuNשv=C0c0o$ka89ρ:dYppkة9UWr(nIz0nx ~Z!Jv0K l=y͢ W (`W&\3؊cɷJz[.T_t/qjJ)[wD9yz`{^|,PԨq`y +9:gS-OҬ-CQuؼs§߻(MWԣ̞ _ht^@ ` o/ h#ΰ;2Wì)F:&+#m m߃^U:!'߄qsB+uLP؂݇aQo'wF~pfް6U%ǪkϿBendstream endobj 1535 0 obj 2080 endobj 1678 0 obj <> stream xZ}pT'%egqeYMFCUm{CX7&%")fҐlBa Z6*&Gꌅ! 3u Hڍveju:=9}SvDVa $1wycrfUPXܛ7zG}xQ<&|LK Yݐ556d:q!Cn&zq߷sf$M Lh cΒ* psz֬QF/>5׻Pب.t7ڳzw^g -ЬN0*X<7rd>jnǹ^ =mțM ]v2 )vF 8W/#BYȊgw jK!4D>'wr_\ig9Quf%>;N `uvt̊x=%&Gݨ?Uc j^vjOx;|]~luOJN@iz\ 2CҤxN,yVyʽ4!XRKҜ0R6 ""=NNB(Hq%bXEaVңdԱPvuJr8ݔ QdoF͌)|ۡ/xtP7TcD}외rlylaꅁV?|xi8%Xu sgwFw=-PNRD⨣oie 928\L g+C3 1d%= HLm+]@:xc27'@uQWL"+LJ_mo:\|Vk`K Q.L$NVP':yXhw{E-`(4)a]C>`㘵Uq{I+NJK>MCWFw.,$׬[gkC-f0CBZ \{A)(vO_a# cu,x~jw-=c]DA 9Qר[z OC:Yy$U@mԾ6o]DoY%uIN`Sfv!7~qZu?̠q 9N,C1N/$(C-paIm W+bS-c;nJN]dN W*]&J#s?,X*gϲ%/•WJgB!>91#DFnڝE `ё]C8\C*hw)uUmꇑQcWAՑЙ|X;ArG82LQ}C`J&\`2t+y/.փȢdqlكn(LJMtF4=< rUEG8 ++">,EFOݢjB,y:,ɉ@!f%ӗ!X)=5cx]v4] ]mg^o 17ry}PMELO&a` `q ʎ_`rDb-]GZm1^9M)bV0m|@p&yxtT1C}53K%m7=ЉZ^b+%;sP&]=-4z (u%uS=h)sɄg] jܑplC.f|Xx>}G"یpj*E1H*2b#ţ:~=X5l@\e;.#\GWW clڠSN/I"?.4ΗꚘ w#s߇~ |L7YMf#vc$Y̴΀eiCӾRXYl^(\+q\k*Hv{h̻(ss0Z%+iX3W?g*>ЏUO>[ ^ln; +< .bHتG]ZgztiAi/@=_77]nm?ܼ!VѿG;qjIxQVsz-hb#ӨU齑W@^}J lt=꬯l6)/G(OF<[\u۴:jFp;L̴-:Ƕ,; -' #V [[m+ӠW#vjuW=|_gEfanzMu[ffZV r䰛Ir%py 3)'[ ~I.c7X߼9_Y>.9hB_<0oq6)$:VMϮadc']L>I)*,bO[׮8(5f-$nh!8nwj.UW CG|d(&XNi Vf-ygM L{ų&MҔѻXMx禃§'l?\2BRXY}i_iS7MbZs9p#93*fL)8Yp)/Yx4n? `#NFEn+A_y>6T-+6sry~&|u:L?̀+v\蕂8U8^<^l T?t/endstream endobj 1679 0 obj 3028 endobj 1735 0 obj <> stream xUMhA)QW%ItMٿxVۃBXShsPI#j$ԃڢ9$تb5z)Bn ,dw}{I>x11&${֫#Ba߈0 w2ԫ`^(cȵY~s{ٲ]-˱P#X䪕6ɄSKjԴE=Q߂0oBvj]hSHUÿ$D  T⸾tip<isEM0s!pW߄?MiEWt-Jdj@"g[/䤿䘪}f(ȴ2}|BN`ʟNn] ON;I*[E+5ѹ + 䀙W(q7$[ow$@lL`o/5}֦NjB#kC>_6ƋcW#%bW:zf/_3{);E28X# QU6EYHE ,4:,Ӷ{Nj7+w; p-;ҮXXXKr]YeCdFnVׁ2e;˷ vw+oU\׏4jm \Eڥ,is{~ګ]ڊ|_Ƹ=% G/FPEendstream endobj 1736 0 obj 879 endobj 1743 0 obj <> stream xYopTW?a?Yvfw}1ځ68$Xiv:`4bMjm-ŀ.JKKҢR[m"d?hΤa&w=w~n}ɟrawGgkjuqkD e)֐}hcKx}/z'|UW:ms+-O1WyD|ɚ4ش [n_d?4!Ip7s@o77uu8/i~dRCc&;x}<ų/?c{!c].%y?n(n|t:Fw^9tGH>zFmy#5_E'r /$;H\@yEGKGL8cNZ8@[+@}4)DI3ba)5ɖr7DQ2֤~羟=[TӶf H̤F lI7$4ڂ3@vlu~kP~-45ۅiҾz%)^#d~l*ѡ{;^>ʫh+T`ݺ`Eo+{ׂH)? $j>d$8QUh-8= [X#PfgD c VG;}(Vl>tZW~]gsNMg_H^G W9Ϭ?;۾-G3r/Ň@J0}f1&Z ,+#buh`.NENl*drbVa[)vW=%Ul!Q` MNj4h9R@&;duGp$bj6"lĹvݘ/xl5tcC&3rAΈ :dx5Lđ(ȑ^ Ɉ#hKKPayыvwe W@fuZDmP w =e:6xC@0;"  m5CہE5 l4P#ޢ^1,i[EqZ%& h+gAh1Cĺ=Awtdi׏`RF_Bj5̄+jv٢9!si7WfA@';88SzlhV&['hI0 ڕdhmP6^Q$Ww@%¸Wk^ƺ7嶷lO1*L :OCf;FԬ&IGb;3ќS~g;p4Y74jG!| $.xJG(/T,3\TP$ 1%93Цu=, d:*t1R۽/:nht_6SȻf#LXhe=|c_8س(fw'~ȹ=}Onb[2/4&49̝pP0v~P2|`+&BFU] c[_ucDIqYixI(o)VW- a]al|U<|s4ImOɰk x$ܜԊ[0C&=,i̽L#"#dOjr/RΛݽtYh:>Cӌh20wEE9@~ 8++Am5f`9=34Vf =1իr[8|ں> stream xZ{l[go 59WUrw;.hLu6'w2Yu';WQN\|ٸR@Sh*6T)ju}f68-C.@۱^q;~Nxq'˓ew)Q2i&L7ut{$8Ṛծ,p !gaX*)ZRMH/xSŊ@sfJ~}$iȋG͌+ '}=_1 {B@8˛ˁ:3fr tN ]fk$ֳ~BqjCϋ]QCk_rYԍ&73,\6U}NfȄzJHQX ʳ,ߍ'+sU1T;R:'zf3 &4yn#)~XJHEcUT+F'$$Xӟ eM1E0#Ysɠ*h5̈*D^BZ&u-5l=4ްߍ\D5fuUxT$> vNv?-j.jsNeZn4YT={g`%DN!foN{ ҌCո@s? f21$S2JZb⵺Q! g޽CfTBvOgAYcb3Hyxk[aƜZh=_#H%3{ʏFW*ha."},o^Qd3m0Dk SK֡mE;m 綟F;|iSޤh ] ;}ÁH]$ya-/X4(+DVu,}Mx#q{N|DUT 8ɵcCo1|z<~Y$G:!2Ȣ÷u(b7|0X3߮Yw14K'K&uɫ&SSI@F՜&kj}i>, zkii5Sja"r۾iň똨+V8}uw|XJϋE=- *UYnoIC&ஸ/KeL^kQ栬%8&| LF@Zy3H'>x33W%35nw+Kg^pA~P:' {\$ߚI5w(`y/Z5k`xIl\M>YY$ǃ4(U'ENϞQ 2QFngP<ɭ: Jxu !DyQAg/0ITx. ];|Qo/z ZA9(P%fbWXØMc@lS@e=I9us+>K`r/Ux yAQ5h ?}K&R/8L<N ]tKCuΝ1Չ\'A{,j߳PPh@2 W#o&ECڹ۩( ~;ݝQ dzbrD1QUrmh%s%0x/E 'WIϿΪwendstream endobj 1817 0 obj 2874 endobj 1864 0 obj <> stream x[kpWnI'qbIİ6%U}>['z{NOs_z`wo oo/qBՇKUdTc+ 'q⟚&cXg>}Rmd}=sY9쓍"X^2# m&٥n+Š&[ג1ו߬++  !kdH=1cAJ8t I0ZECq0~h^(1S3DhѠ͛l8ZAGywBA1J&Y]\?Ƃ~j75{>Pe8>5&ؙaOo%F&S z]\]g}r WD#FawOf@ b% Y5^!ʊsZh96Q1- AwpYM=xSk׃OhgW/\z" 2Mx,c!"X7 ؇eF9bx@V(!K$Ex}og<` Åz]T=P vvK#vՃ:3f hUf̑ffݟLJkWEɾn$^T#Yo>Oc3u}TD&,Z \d |&SIJP5vQL*3j>5:,E;ĭȉR9ǡX-TmDu;q(̊laNx͟Dw&D5rC9<@y5OV#9rPlT!+" . Lڵ]8"Or _@NM$@ZhCx:Me.n܎ =/DZϙ"Z1s#I@J:XIM5HOӾ6/ , )e-,N)t"` 蓊IJfZk"ffݥabx0E3,qk^5\|jxot KE(O heF~*홴YD=I 0KlS 3Qr3;ܐH~rwdN$(9`+=ɶ^4y|$O7Si6XI]->}#K+izjJP8ź G ;Dp^9R^ Q^+=(}_R!i  ͢ xj_HP.asMɤ:GaˏK Dlu:\z DT͋- .FFh]q.L/>4|f~bj0^76_@( |Pb hFwyzǺ#+U糁\}+US AF[3r,渶y yfTC!$_98\8dTnO<66+Hr"h | >amed}*YK!5 654~)\V־mklm"wiܥv4}yۮpBslX{yhW7?wOಎU߱}^Wۣ75w}m~ce/lȚV[Gyendstream endobj 1865 0 obj 3360 endobj 1928 0 obj <> stream x[kl/cQPQ'%VK0##XZ!:` &Z&IHh*SFR!"5j*u!摤Mb=wvf=z%?vs9ׇF3Sup8y?:{-mUQm;P-ݬ~!h Wzbt6I$?\]qUo0C7d}\ɳpvMqø*˜ k몊]l_gyo筻jm|gnԴ{eP]SA[Ҋ„ eTWş[ӏEھyXA5m$uDXS;jrR)}jw|\۸jo{OMukנTkT7̙>w -;vWPű2Z4"A-%cMWFhff)PX:Gߡ~ ӈ2IJNmj9S?/dL[.E?y -i<6TZ Q+V:H]otB0˧=ɉg!@ȰСTH:t`Q[Ru'"'Hӓ&UA;4M H<jk͓Mk>%I/P%X J̰. ݁QmtP +l/;JU :Y(c02uw,li<7xлG̃%WF;1X3O.,-SVv23 ]@kuY$;U"ACܓ\o!IMEe.s#ɾ]/!|BWӊT 2ĐĸRشbL1z0r>4_BEA"6ĞНR3 RsVjAmW+U;8迕Lꎌjr+#W \43K^ "m|C:5 Co|}H:c0L^n* gQ nR3?{tCmFKp P2p,Gd:WiM LXԟy֮i45945)iRr>ߔ. ;Pq֏?'ez|}粃N;+-GT;>r&_*Ϋ#xAW Vr? t1,H. K26Gb 4ӘBlZ'9zMJn-K()9NU2"WgچAkVAjXzt:]Ƴq\ [ }:pK.J,h/V{E)kI!ecWR9 2R1k GhEec_JSUzu]Me]fsvݡR]5W$o-௜H<3hӄ=h}ɶX A"AܛJ|at Q=b ^A\]錥S3W//hix甎C 59MfWc9Vx%2uܞ5lzcrv4[[!ik9PxP^ьWR(A=#ž/څ{sIQe.P-NosgAv}"@>r'PU/8@U!tGXS2D4#ҝD)a$ w4 cmr$ *%*k:tR%ʏxX&%V_@T&ޑ?yXДQ2H,.e.8iT !` T5fzX!YCa@m% urO,z_?ۀ9P:QTKzjY!)U1p\%؝PvoV._3h3Ww88sr-{`S^EM6(HWM?@S4Q J#ia鰼=S?u'4z`0]=sڡ}ܒ(_(B SLHk8;FPE|qɅkg˜?H^f^*O7p/DJB󡵠lȩzՇvl{hR M?I"u[XS'퉗at-GEuR-~¿dU}@endstream endobj 1929 0 obj 2937 endobj 4 0 obj <> /Contents 5 0 R >> endobj 127 0 obj <> /Contents 128 0 R >> endobj 208 0 obj <> /Contents 209 0 R >> endobj 353 0 obj <> /Contents 354 0 R >> endobj 434 0 obj <> /Contents 435 0 R >> endobj 466 0 obj <> /Contents 467 0 R >> endobj 517 0 obj <> /Contents 518 0 R >> endobj 558 0 obj <> /Contents 559 0 R >> endobj 585 0 obj <> /Contents 586 0 R >> endobj 592 0 obj <> /Contents 593 0 R >> endobj 602 0 obj <> /Contents 603 0 R >> endobj 653 0 obj <> /Contents 654 0 R >> endobj 671 0 obj <> /Contents 672 0 R >> endobj 684 0 obj <> /Contents 685 0 R >> endobj 704 0 obj <> /Contents 705 0 R >> endobj 767 0 obj <> /Contents 768 0 R >> endobj 866 0 obj <> /Contents 867 0 R >> endobj 946 0 obj <> /Contents 947 0 R >> endobj 970 0 obj <> /Contents 971 0 R >> endobj 992 0 obj <> /Contents 993 0 R >> endobj 1024 0 obj <> /Contents 1025 0 R >> endobj 1046 0 obj <> /Contents 1047 0 R >> endobj 1063 0 obj <> /Contents 1064 0 R >> endobj 1075 0 obj <> /Contents 1076 0 R >> endobj 1115 0 obj <> /Contents 1116 0 R >> endobj 1129 0 obj <> /Contents 1130 0 R >> endobj 1134 0 obj <> /Contents 1135 0 R >> endobj 1145 0 obj <> /Contents 1146 0 R >> endobj 1158 0 obj <> /Contents 1159 0 R >> endobj 1166 0 obj <> /Contents 1167 0 R >> endobj 1174 0 obj <> /Contents 1175 0 R >> endobj 1195 0 obj <> /Contents 1196 0 R >> endobj 1202 0 obj <> /Contents 1203 0 R >> endobj 1231 0 obj <> /Contents 1232 0 R >> endobj 1236 0 obj <> /Contents 1237 0 R >> endobj 1268 0 obj <> /Contents 1269 0 R >> endobj 1274 0 obj <> /Contents 1275 0 R >> endobj 1278 0 obj <> /Contents 1279 0 R >> endobj 1292 0 obj <> /Contents 1293 0 R >> endobj 1301 0 obj <> /Contents 1302 0 R >> endobj 1310 0 obj <> /Contents 1311 0 R >> endobj 1322 0 obj <> /Contents 1323 0 R >> endobj 1356 0 obj <> /Contents 1357 0 R >> endobj 1366 0 obj <> /Contents 1367 0 R >> endobj 1370 0 obj <> /Contents 1371 0 R >> endobj 1384 0 obj <> /Contents 1385 0 R >> endobj 1390 0 obj <> /Contents 1391 0 R >> endobj 1421 0 obj <> /Contents 1422 0 R >> endobj 1436 0 obj <> /Contents 1437 0 R >> endobj 1447 0 obj <> /Contents 1448 0 R >> endobj 1466 0 obj <> /Contents 1467 0 R >> endobj 1473 0 obj <> /Contents 1474 0 R >> endobj 1515 0 obj <> /Contents 1516 0 R >> endobj 1519 0 obj <> /Contents 1520 0 R >> endobj 1527 0 obj <> /Contents 1528 0 R >> endobj 1533 0 obj <> /Contents 1534 0 R >> endobj 1677 0 obj <> /Contents 1678 0 R >> endobj 1734 0 obj <> /Contents 1735 0 R >> endobj 1742 0 obj <> /Contents 1743 0 R >> endobj 1815 0 obj <> /Contents 1816 0 R >> endobj 1863 0 obj <> /Contents 1864 0 R >> endobj 1927 0 obj <> /Contents 1928 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 127 0 R 208 0 R 353 0 R 434 0 R 466 0 R 517 0 R 558 0 R 585 0 R 592 0 R 602 0 R 653 0 R 671 0 R 684 0 R 704 0 R 767 0 R 866 0 R 946 0 R 970 0 R 992 0 R 1024 0 R 1046 0 R 1063 0 R 1075 0 R 1115 0 R 1129 0 R 1134 0 R 1145 0 R 1158 0 R 1166 0 R 1174 0 R 1195 0 R 1202 0 R 1231 0 R 1236 0 R 1268 0 R 1274 0 R 1278 0 R 1292 0 R 1301 0 R 1310 0 R 1322 0 R 1356 0 R 1366 0 R 1370 0 R 1384 0 R 1390 0 R 1421 0 R 1436 0 R 1447 0 R 1466 0 R 1473 0 R 1515 0 R 1519 0 R 1527 0 R 1533 0 R 1677 0 R 1734 0 R 1742 0 R 1815 0 R 1863 0 R 1927 0 R ] /Count 62 >> endobj 1 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ($I8+jWOhUwNRiqd՗>i}isP]j=pP W ǝሣ$nG|KEasyϧQ~q6J~ڴVit%S@<j٢uO[隤6SC#b2nNH'冧o Im-\ py'Ҁ/QTm5}>_*dv+QX6%R-31Ԛؠ(((((((uSKp1ڴ9 !C"e= =>T6N% S%2zZie {ι 5MF Z2(My'_/-mߑ*?nEcEo)X["ciE|l3jw/.%[ _tQEQEQEQEQUu."I Up$8{;j556S-U ? 08bxM=22 ] o5ѡfK. :(((JZ)03 -W-XV[]k]'w޸{hu @Lj~$m4[Y7 nC߯Is{%6 ϖY&r@8huޢėH-eX8sц;~y5r0"ZŐڻ]*FóG]MQEQEQEuTdS+VX_ȅЌP#{^xŬiM淐̕{o>5fQ#C AF3FCޫ fݠa#r'njѵӼM-fE :6pps0gկ}q1]qQqD@UF)QE#0U,$뺜^ p|31h=1z^x{9DPyYa* y揖_ZXg o_RͯY$mG(@$f3r{guim'J9'r}Z:mPviWU n=h˟UB%M!F ᮯ/sr^\HdH)}぀=?m\-dFU\OCd[4k2%1ܜuyĩNN)kG*$P`:TCD,]_XBҥdӖW*rvkf;X"8Qf-E^ή!I֝/scXyRGe"Ƕ3̈}ȭed#U#ֹoa?PL'b4[K( ;۪팜4袊(ۯͬj؎(4l{pb7MB}s\^ omɨQ o:(bnb aa[8 u5jVosGG?*N,ˏa*\ǖE>#@/T` s{{ ,Ƹ)>iEPUiI(EXK"C+ff8 vg1gˌ>썐3*G֭j֯cymm%_mUx5+I ; )I?幍m:Ei9_O^zB ֩'_I{5cjQY_\Q#Bci|5YO٬qZ\m)?8hkZ{Ĉaa.LVc樓WyGJkn0-F?,U_0y^E@1o?x InmA!GA)9d4WX[*W''n5*t%Tk#.gX4;?iP޸%>y?W3p5!fac߀#^_ZLǒ^ҹB!顔f,,9]ua B[09FW[*h?,Rɦk4Y 4K㢨l~տJeg\ ?%K_Kyioi$ A9*1_jTd߁Q'~NcEDUFRRyQEAykӮR=a"Vְ]:v҅e=WGY 7k?w?gˡa YJ5PH 1*̤}*2]]Jȋ4j^!kydX|g1ڼ|7m~dw>n,-jq&:+7V~I:k[F}g$Me3HYJr+^pk7"6GBT)sB>O6Wz2*J(ևXԶM8xcc+ӭXN.;Vv=U[E|| Zk[hM J?T>kN,RD%]$aUxF]Ig m鏘lG@=.U"JdzƉ&'0$v9z{+ #\!fAkUTR8#Iɳ.=Jnn $@NOS:AoKtJJ*\Enk!32#Ұ茔J..)ѧ,iU)sHϬD9pr)E G)h ( ( 7Vs@%xLTH +¾Izyz9⺚4 X,:|If ('4 P#0V0:dZײ;Y2;dO&`혁ܸ ֶ5 G@:t`փ^iwk3E@qzrx2\5jr9`:(i%op*sKLcr1Ȯ ( ( (Ev95t8d ګyh=((8x=WqMcFc]sQ/onJ8U8(8<=k}˻!]k7KqI*`+Nn㔴qBL5W5x^KǸ}?Q\<_z9;A>p?jHY[k|6ַ}ͨc\ h(((qO`Il= I<;[66cۑ|cA5몼>Zw8j2-|3[HI4MwBl/nGuwB 79V]ƶ<⌞rћQ&7 zЃY=մˁ8B=hQ30,*чocڬI ՘ Y*[G|#SYJV`pE%t惰=Ș}rɮny>Q|*)+|鸻 E+$J'W-y 9qXddZJrӳ;Z(Т((9KG(vSTu).沼lA} W6wpt?'Z!2XͿyH!(Fo4J@l)$ZU[]X:uе!;ހ9Z,tR{A7=Y\(Ema:vzɈdL5ĭH}I4i!K-lyk>Q@Q@Z/fWr+.RKIe}ȉϑ]Ĕ41_+޴4YߎGB*{o7w- "e ,rv'o_־!x@gya3?θkc<_b\9&~w?Jw23U}cQ;X. NNNOZ9a5JLj+4; kVK1\ʧ~}OJP {Wϡzj7sA/V<qc]'F5f=zcdOk/o%ᆸ5;jiӺI3]Fkg+U>k,ӯ"t ñHuE{J\[AY>R2ķ(2ryA,KI ZoFKII2^Zκ8wt+BJR8X`֮/-c@͜Y1?)˒[<ݸ A(ro-F5X*Tʱ4}P! *χ%]Cd~xb6 zw'*4763J׵gQFX3A=]barzG(ܣҭ5&CnY&Ň tkԊFCߡ+D:z~fS6noh29Q޻(IY"uxeYNAƳڨlzn%1ȊBH zdqCwwcJh`R ¤R8d(*f1*xkVkK4яh-3 \uPpyG\o"fg Gq%oo/S' - NIor@ڀ6H `=PEPWGs2+YA5i^ O9U[Z{5 Z{4BtHvսޡ[4PT~i#5:0*})Vm4tr?Ҳ["d!\24g_Qh#4xu{+%wP2sPm_]tK7 OR+qc:+O26. d010Eo 8٣ FWL9a!%E pk*Uu+'*gP#t񭆐^{)%vt$w6?yۆ{qt鵬nB3`Y)$3_)Y'mhIq$Jc BzVxZB˛y <[Ui{{ׁLE&' E! ZYKKfo'a{&Iy26}*7ql$c΢Xies$q>#ZIHdyD3|8Ȣķoư‡y^{wU -p FF: d93oy77AUx#qRV-Iiq$[g@"ޭ$/MD"WRo8K{ ss(9j|0K1qU$(((((( endstream endobj 11 0 obj <>stream 0 0 0 0 131 121 d1 131 0 0 121 0 0 cm BI /IM true /W 131 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D  pA&>D~" !oAM a׫#P$  EI endstream endobj 12 0 obj <>stream 0 0 0 0 103 118 d1 103 0 0 118 0 0 cm BI /IM true /W 103 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g/C/ /_%/}|/ A&V? EI endstream endobj 13 0 obj <> stream 143 0 0 0 0 0 d1 endstream endobj 14 0 obj <>stream 0 0 0 -2 84 121 d1 84 0 0 123 0 -2 cm BI /IM true /W 84 /H 123 /BPC 1 /D[1 0] /F/CCF /DP<> ID 8 fd2}+\8h P1P;Ä'AOK5ֺ @yA\VCH!@. ` uZ-ంEP3r Y* z"e&*g AK&u/`/a}A'd73j EI endstream endobj 15 0 obj <> stream 120 0 0 0 0 0 d1 endstream endobj 16 0 obj <>stream 0 0 0 0 165 118 d1 165 0 0 118 0 0 cm BI /IM true /W 165 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AhOI?#''aO[ IIooaO[? aOoo &I?oaO[&? - p EI endstream endobj 17 0 obj <> stream 100 0 0 0 0 0 d1 endstream endobj 18 0 obj <>stream 0 0 0 0 115 117 d1 115 0 0 117 0 0 cm BI /IM true /W 115 /H 117 /BPC 1 /D[1 0] /F/CCF /DP<> ID &+llԚ z^=>stream 0 0 0 39 66 117 d1 66 0 0 78 0 39 cm BI /IM true /W 66 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4 ? =ߔ}Xxᵸ}amIbC EI endstream endobj 20 0 obj <> stream 110 0 0 0 0 0 d1 endstream endobj 21 0 obj <>stream 0 0 0 38 85 119 d1 85 0 0 81 0 38 cm BI /IM true /W 85 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?]@ A@z i h o[&;> ![~߷?Ȁ_%H\1 3 y!A'넻ׅ-,0(\x`a`ɀԐO EI endstream endobj 22 0 obj <> stream 77 0 0 0 0 0 d1 endstream endobj 23 0 obj <>stream 0 0 0 -3 92 119 d1 92 0 0 122 0 -3 cm BI /IM true /W 92 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &tN _ao}Ch ao龃|&Aw.]: % $^ Aʀ1/u/@ EI endstream endobj 24 0 obj <> stream 91 0 0 0 0 0 d1 endstream endobj 25 0 obj <> stream 104 0 0 0 0 0 d1 endstream endobj 26 0 obj <>stream 0 0 0 -3 43 117 d1 43 0 0 120 0 -3 cm BI /IM true /W 43 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A\?@ EI endstream endobj 27 0 obj <> stream 92 0 0 0 0 0 d1 endstream endobj 28 0 obj <>stream 0 0 0 -3 94 117 d1 94 0 0 120 0 -3 cm BI /IM true /W 94 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"r C?z? ~ _z/5p@ EI endstream endobj 29 0 obj <> stream 51 0 0 0 0 0 d1 endstream endobj 30 0 obj <>stream 0 0 0 38 83 119 d1 83 0 0 81 0 38 cm BI /IM true /W 83 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kI"`^CaV<" G^ A&}>AooL?o޿5޿z a-\5il0Ka,2"~<0X0e fH5 EI endstream endobj 31 0 obj <> stream 102 0 0 0 0 0 d1 endstream endobj 32 0 obj <>stream 0 0 0 -3 93 119 d1 93 0 0 122 0 -3 cm BI /IM true /W 93 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &uΠA$h7n5D~ 9.1ZI'>}}~/ׯ~kk`w  1  ]r C_` EI endstream endobj 33 0 obj <>stream 0 0 0 38 74 119 d1 74 0 0 81 0 38 cm BI /IM true /W 74 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j!x" >FAo a7}_nu Hk_`kwa׿l.Km-a kqᅆ !O T@ EI endstream endobj 34 0 obj <>stream 0 0 0 -3 127 120 d1 127 0 0 123 0 -3 cm BI /IM true /W 127 /H 123 /BPC 1 /D[1 0] /F/CCF /DP<> ID &PS( HeA..  /*\ @\-&='A O_ __^_/ e< ~ kk] {]l.^5` OIV ? A O1  e(N EI endstream endobj 35 0 obj <> stream 139 0 0 0 0 0 d1 endstream endobj 36 0 obj <>stream 0 0 0 39 94 119 d1 94 0 0 80 0 39 cm BI /IM true /W 94 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j A2o> F~? M7ZW ?W( / M` EI endstream endobj 37 0 obj <> stream 103 0 0 0 0 0 d1 endstream endobj 38 0 obj <>stream 0 0 0 38 72 151 d1 72 0 0 113 0 38 cm BI /IM true /W 72 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID &V 9(?kI56]pY `e xA@03a&'A7[I>stream 0 0 0 -3 85 119 d1 85 0 0 122 0 -3 cm BI /IM true /W 85 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?]@ A@z i h o[&;> ![~߷?Ȁ_%H\1 3 y!A'넻ׅ-,0(\x`a`ɀԐO4L<&>O 2/F"= 0XfԠ EI endstream endobj 40 0 obj <> stream 83 0 0 0 0 0 d1 endstream endobj 41 0 obj <>stream 0 0 0 0 80 121 d1 80 0 0 121 0 0 cm BI /IM true /W 80 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &R $"$ PAP`恳M> a0^?AB  EI endstream endobj 42 0 obj <>stream 0 0 0 0 134 121 d1 134 0 0 121 0 0 cm BI /IM true /W 134 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xmA$ 5+Ax'o ɨK__A// /KxK ࿝2deL6 o~߆/ׯץY!")p$; 3p EI endstream endobj 43 0 obj <>stream 0 0 0 24 100 118 d1 100 0 0 94 0 24 cm BI /IM true /W 100 /H 94 /BPC 1 /D[1 0] /F/CCF /DP<> ID &o"jAY>A=޻_ wvx\5aK=z_^턿޽{i/k__] EI endstream endobj 44 0 obj <> stream 140 0 0 0 0 0 d1 endstream endobj 45 0 obj <>stream 0 0 0 24 63 120 d1 63 0 0 96 0 24 cm BI /IM true /W 63 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6΁ K!@ AAX|H`Ca O } ?pדPdֵ\Y`AGY p.K-t-0D 5r\pCO]zɪ^XN N` xa> 7! EI endstream endobj 46 0 obj <> stream 114 0 0 0 0 0 d1 endstream endobj 47 0 obj <>stream 0 0 0 27 90 118 d1 90 0 0 91 0 27 cm BI /IM true /W 90 /H 91 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!_vC7z_=׽x/߮ ~# EI endstream endobj 48 0 obj <> stream 78 0 0 0 0 0 d1 endstream endobj 49 0 obj <>stream 0 0 0 25 103 120 d1 103 0 0 95 0 25 cm BI /IM true /W 103 /H 95 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x.ti/2xA~=a+AA%/K/.a~C(g ׯy >,6J  EI endstream endobj 50 0 obj <> stream 101 0 0 0 0 0 d1 endstream endobj 51 0 obj <>stream 0 0 0 24 90 120 d1 90 0 0 96 0 24 cm BI /IM true /W 90 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u okQ>S" Ղ=oH7}>M>Xz /_x\5kv.imm . .aX0Xad~CWX EI endstream endobj 52 0 obj <> stream 108 0 0 0 0 0 d1 endstream endobj 53 0 obj <>stream 0 0 0 41 24 118 d1 24 0 0 77 0 41 cm BI /IM true /W 24 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &OM=kdO'zka~D EI endstream endobj 54 0 obj <> stream 116 0 0 0 0 0 d1 endstream endobj 55 0 obj <>stream 0 0 0 0 105 118 d1 105 0 0 118 0 0 cm BI /IM true /W 105 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &aP 3?  1^5/ Rq  EI endstream endobj 56 0 obj <> stream 136 0 0 0 0 0 d1 endstream endobj 57 0 obj <>stream 0 0 0 25 84 118 d1 84 0 0 93 0 25 cm BI /IM true /W 84 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C?%d3y ]=7 _X' G__/? EI endstream endobj 58 0 obj <> stream 121 0 0 0 0 0 d1 endstream endobj 59 0 obj <> stream 94 0 0 0 0 0 d1 endstream endobj 60 0 obj <> stream 109 0 0 0 0 0 d1 endstream endobj 61 0 obj <>stream 0 0 0 25 127 118 d1 127 0 0 93 0 25 cm BI /IM true /W 127 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &s&?[7?AX?Aa[&7OA@O@ EI endstream endobj 62 0 obj <> stream 111 0 0 0 0 0 d1 endstream endobj 63 0 obj <> stream 141 0 0 0 0 0 d1 endstream endobj 64 0 obj <>stream 0 0 0 25 102 118 d1 102 0 0 93 0 25 cm BI /IM true /W 102 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &𾾿M __. ___/_~ _~___ e ׯ_ EI endstream endobj 65 0 obj <> stream 95 0 0 0 0 0 d1 endstream endobj 66 0 obj <> stream 85 0 0 0 0 0 d1 endstream endobj 67 0 obj <>stream 0 0 0 25 84 118 d1 84 0 0 93 0 25 cm BI /IM true /W 84 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &%X(ʨgckoo_ Aen|.F+A EI endstream endobj 68 0 obj <> stream 115 0 0 0 0 0 d1 endstream endobj 69 0 obj <>stream 0 0 0 0 96 93 d1 96 0 0 93 0 0 cm BI /IM true /W 96 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &vj 9݆^ Y~Ag?aoo~^| f Ael. NRS@ EI endstream endobj 70 0 obj <> stream 99 0 0 0 0 0 d1 endstream endobj 71 0 obj <>stream 0 0 0 24 98 120 d1 98 0 0 96 0 24 cm BI /IM true /W 98 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &uϐ&A`4 ` א\"2cA|%ץx_/_ _j ]k.^o5a{]aܝyV|Ai > z@ EI endstream endobj 72 0 obj <> stream 112 0 0 0 0 0 d1 endstream endobj 73 0 obj <> stream 148 0 0 0 0 0 d1 endstream endobj 74 0 obj <> stream 98 0 0 0 0 0 d1 endstream endobj 75 0 obj <>stream 0 0 0 25 104 120 d1 104 0 0 95 0 25 cm BI /IM true /W 104 /H 95 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f O?????|-}~z>>~-z7?_zL?_A_>WO(@@ EI endstream endobj 76 0 obj <> stream 86 0 0 0 0 0 d1 endstream endobj 77 0 obj <>stream 0 0 0 25 73 118 d1 73 0 0 93 0 25 cm BI /IM true /W 73 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &??5  EI endstream endobj 78 0 obj <> stream 90 0 0 0 0 0 d1 endstream endobj 79 0 obj <> stream 145 0 0 0 0 0 d1 endstream endobj 80 0 obj <>stream 0 0 0 0 44 93 d1 44 0 0 93 0 0 cm BI /IM true /W 44 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A@ EI endstream endobj 81 0 obj <>stream 0 0 0 0 90 93 d1 90 0 0 93 0 0 cm BI /IM true /W 90 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID & gx0|Q AG߷?^^/!3\ P/у0߿\Xf EI endstream endobj 82 0 obj <> stream 55 0 0 0 0 0 d1 endstream endobj 83 0 obj <>stream 0 0 0 0 100 95 d1 100 0 0 95 0 0 cm BI /IM true /W 100 /H 95 /BPC 1 /D[1 0] /F/CCF /DP<> ID &jϐ'"@@N4=C(AI&%}~_߯W<c_ EI endstream endobj 84 0 obj <> stream 105 0 0 0 0 0 d1 endstream endobj 85 0 obj <>stream 0 0 0 -32 48 93 d1 48 0 0 125 0 -32 cm BI /IM true /W 48 /H 125 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?z(Fz$26? >|>~ EI endstream endobj 86 0 obj <> stream 56 0 0 0 0 0 d1 endstream endobj 87 0 obj <>stream 0 0 0 0 138 120 d1 138 0 0 120 0 0 cm BI /IM true /W 138 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &z3?OAo[ҿ|-V+}ҿ}o|%~[zo __վ}+^_oJ·_A? xV@ EI endstream endobj 88 0 obj <>stream 0 0 0 0 168 118 d1 168 0 0 118 0 0 cm BI /IM true /W 168 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID %pOAXFAOA[oOoH7? 0M?77MO?ߧ?N  EI endstream endobj 89 0 obj <>stream 0 0 0 1 120 118 d1 120 0 0 117 0 1 cm BI /IM true /W 120 /H 117 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\`_KmHmMW޿o ^^ $ ? EI endstream endobj 90 0 obj <>stream 0 0 0 0 57 118 d1 57 0 0 118 0 0 cm BI /IM true /W 57 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID $7@ EI endstream endobj 91 0 obj <> stream 137 0 0 0 0 0 d1 endstream endobj 92 0 obj <> stream 84 0 0 0 0 0 d1 endstream endobj 93 0 obj <>stream 0 0 0 40 91 119 d1 91 0 0 79 0 40 cm BI /IM true /W 91 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|6?Jҿ>߅~[վ׭A_V CA_JO ɀ EI endstream endobj 94 0 obj <> stream 87 0 0 0 0 0 d1 endstream endobj 95 0 obj <> stream 89 0 0 0 0 0 d1 endstream endobj 96 0 obj <>stream 0 0 0 39 94 117 d1 94 0 0 78 0 39 cm BI /IM true /W 94 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"r C?Zun~6P޼0ixb x`Ԇ` EI endstream endobj 97 0 obj <> stream 93 0 0 0 0 0 d1 endstream endobj 98 0 obj <>stream 0 0 0 -4 42 117 d1 42 0 0 121 0 -4 cm BI /IM true /W 42 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A\_)_[Xaa EI endstream endobj 99 0 obj <>stream 0 0 0 -1 132 120 d1 132 0 0 121 0 -1 cm BI /IM true /W 132 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x6J)hׄ'|rA_^A}zK_/ \'2\2H܃X? ?߷𗯥/1 L@7@ EI endstream endobj 100 0 obj <>stream 0 0 0 38 72 119 d1 72 0 0 81 0 38 cm BI /IM true /W 72 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u!ODA!A Oނ}o&A_ )AO{om p KaMxd @bA EI endstream endobj 101 0 obj <> stream 76 0 0 0 0 0 d1 endstream endobj 102 0 obj <>stream 0 0 0 -1 185 119 d1 185 0 0 120 0 -1 cm BI /IM true /W 185 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &PxG]o[[4u._maI߿O0~~} /Z ރki>~Z0'Ow?~~WH>SV /~^H  e EI endstream endobj 103 0 obj <>stream 0 0 0 -4 65 117 d1 65 0 0 121 0 -4 cm BI /IM true /W 65 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DD6w?o ,0a<5 a2@@ EI endstream endobj 104 0 obj <>stream 0 0 0 8 59 119 d1 59 0 0 111 0 8 cm BI /IM true /W 59 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C O 7~A_z!kJMOa} EI endstream endobj 105 0 obj <>stream 0 0 0 0 113 123 d1 113 0 0 123 0 0 cm BI /IM true /W 113 /H 123 /BPC 1 /D[1 0] /F/CCF /DP<> ID &NSd6rX@ kxD 0ao & oM KMW?ޓ=/߅< Gm_[[[ m߶᭵a O 0 CUKClƞ@8p EI endstream endobj 106 0 obj <>stream 0 0 0 38 61 119 d1 61 0 0 81 0 38 cm BI /IM true /W 61 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h:A> }>pM}~__׬y r "y q| 0  @ Ϣ50\z _l/5\6 \> <@ EI endstream endobj 107 0 obj <> stream 72 0 0 0 0 0 d1 endstream endobj 108 0 obj <>stream 0 0 0 4 74 119 d1 74 0 0 115 0 4 cm BI /IM true /W 74 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j!x" >FAo a7}_nu Hk_`kwa׿l.Km-a kqᅆ !O V?܃c'\5 a[ .m~[[_ EI endstream endobj 109 0 obj <> stream 50 0 0 0 0 0 d1 endstream endobj 110 0 obj <> stream 82 0 0 0 0 0 d1 endstream endobj 111 0 obj <>stream 0 0 0 39 147 117 d1 147 0 0 78 0 39 cm BI /IM true /W 147 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &KNAa;5/FtxmXk`PY@M^ 3A_ 0Y j @h EI endstream endobj 112 0 obj <>stream 0 0 0 39 92 151 d1 92 0 0 112 0 39 cm BI /IM true /W 92 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/'!DhA!|BL>AAw/iwXMt @KHx1*Ă_X EI endstream endobj 113 0 obj <> stream 74 0 0 0 0 0 d1 endstream endobj 114 0 obj <> stream 96 0 0 0 0 0 d1 endstream endobj 115 0 obj <> stream 75 0 0 0 0 0 d1 endstream endobj 116 0 obj <> stream 52 0 0 0 0 0 d1 endstream endobj 117 0 obj <>stream 0 0 0 94 26 151 d1 26 0 0 57 0 94 cm BI /IM true /W 26 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`}߼?߿p__&/[_f@ EI endstream endobj 118 0 obj <>stream 0 0 0 -1 117 117 d1 117 0 0 118 0 -1 cm BI /IM true /W 117 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`5j/;|3!6߃~߰? K_K^ 2/Ȁi5 7?oo~ /_/ץ/!O+c|.Wz EI endstream endobj 119 0 obj <> stream 130 0 0 0 0 0 d1 endstream endobj 120 0 obj <> stream 73 0 0 0 0 0 d1 endstream endobj 121 0 obj <>stream 0 0 0 0 73 113 d1 73 0 0 113 0 0 cm BI /IM true /W 73 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;k|3`m7oo~ 3[o`o}=}?"[Ⱥ}?_U{3 P޻^m- Xa E  ,/˪  EI endstream endobj 122 0 obj <>stream 0 0 0 0 77 116 d1 77 0 0 116 0 0 cm BI /IM true /W 77 /H 116 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u #`< k<@7ް}?A7[j__. 4l v % [a~ ` EI endstream endobj 123 0 obj <>stream 0 0 0 0 73 116 d1 73 0 0 116 0 0 cm BI /IM true /W 73 /H 116 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u xA> 07z '7|'p|woMk.DM.Kipkg@ 0G5g0%X4d\2 y3_' o*x" q EI endstream endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 130 0 obj <>stream 0 0 0 0 79 110 d1 79 0 0 110 0 0 cm BI /IM true /W 79 /H 110 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ~D aML>?o_/_׿i|.HXV2,c0D@ EI endstream endobj 131 0 obj <>stream 0 0 0 -1 69 78 d1 69 0 0 79 0 -1 cm BI /IM true /W 69 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C ς"Ę@H]}&[M&}&o o_p=va[i[ivm }2f EI endstream endobj 132 0 obj <>stream 0 0 0 0 53 76 d1 53 0 0 76 0 0 cm BI /IM true /W 53 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &%[ a? o[ xw+%`c EI endstream endobj 133 0 obj <> stream 80 0 0 0 0 0 d1 endstream endobj 134 0 obj <>stream 0 0 0 0 105 118 d1 105 0 0 118 0 0 cm BI /IM true /W 105 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &U/Ch * ޿_zy y /@ EI endstream endobj 135 0 obj <>stream 0 0 0 -1 70 78 d1 70 0 0 79 0 -1 cm BI /IM true /W 70 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID & < h<&D =C'?L4-zQj7߰0upc AT U[iv al@b 7D@ EI endstream endobj 136 0 obj <> stream 65 0 0 0 0 0 d1 endstream endobj 137 0 obj <>stream 0 0 0 -44 79 78 d1 79 0 0 122 0 -44 cm BI /IM true /W 79 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P A~(}@'M[|S| _O?׸^]ׯkî_ /m/ 0Pxx/ B# \Րc EI endstream endobj 138 0 obj <>stream 0 0 0 -44 33 76 d1 33 0 0 120 0 -44 cm BI /IM true /W 33 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &&Xk/* @ EI endstream endobj 139 0 obj <>stream 0 0 0 -44 80 76 d1 80 0 0 120 0 -44 cm BI /IM true /W 80 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ԃNMa~zۯ xb.P?1 EI endstream endobj 140 0 obj <> stream 44 0 0 0 0 0 d1 endstream endobj 141 0 obj <>stream 0 0 0 -44 79 78 d1 79 0 0 122 0 -44 cm BI /IM true /W 79 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H ?.2ADL #@AAAh Å߬xH0O/Kxav=5 0` Ax0 .AT3d@ EI endstream endobj 142 0 obj <> stream 135 0 0 0 0 0 d1 endstream endobj 143 0 obj <>stream 0 0 0 -1 61 78 d1 61 0 0 79 0 -1 cm BI /IM true /W 61 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C DAC 7>oIA[}/ k_P w\:\5K 8!~@  EI endstream endobj 144 0 obj <>stream 0 0 0 -44 110 79 d1 110 0 0 123 0 -44 cm BI /IM true /W 110 /H 123 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ji "`Y B"5#?A\ A cA}_^ /߂)&<v {^ap?m{]ypI O_ |0`x2' o*/d EI endstream endobj 145 0 obj <> stream 127 0 0 0 0 0 d1 endstream endobj 146 0 obj <> stream 124 0 0 0 0 0 d1 endstream endobj 147 0 obj <>stream 0 0 0 0 80 78 d1 80 0 0 78 0 0 cm BI /IM true /W 80 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C?0^AA> o<- n~WrP#m_  EI endstream endobj 148 0 obj <>stream 0 0 0 -1 61 110 d1 61 0 0 111 0 -1 cm BI /IM true /W 61 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ʀِ _ᇐׇd44UODb< xD0@oXxI&A~_I¾kֿ _m>Km.l Xz FX2h EI endstream endobj 149 0 obj <>stream 0 0 0 -38 70 78 d1 70 0 0 116 0 -38 cm BI /IM true /W 70 /H 116 /BPC 1 /D[1 0] /F/CCF /DP<> ID & < h<&D =C'?L4-zQj7߰0upc AT U[iv al@b 7F?̞@OAAᓷ:A7 5 EI endstream endobj 150 0 obj <> stream 138 0 0 0 0 0 d1 endstream endobj 151 0 obj <> stream 62 0 0 0 0 0 d1 endstream endobj 152 0 obj <>stream 0 0 0 -1 54 78 d1 54 0 0 79 0 -1 cm BI /IM true /W 54 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0t AEA3 ?i7 0/upAd2uc p  Iz%5yy@u'!C@ EI endstream endobj 153 0 obj <> stream 71 0 0 0 0 0 d1 endstream endobj 154 0 obj <>stream 0 0 0 0 80 76 d1 80 0 0 76 0 0 cm BI /IM true /W 80 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ԃNMap׶V(_m/ @:  EI endstream endobj 155 0 obj <>stream 0 0 0 -30 51 78 d1 51 0 0 108 0 -30 cm BI /IM true /W 51 /H 108 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N W >A>o?2H5?} EI endstream endobj 156 0 obj <> stream 68 0 0 0 0 0 d1 endstream endobj 157 0 obj <>stream 0 0 0 -44 99 79 d1 99 0 0 123 0 -44 cm BI /IM true /W 99 /H 123 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j 9 "A!QK<#XC G ށ|$}oIzC}~_]~_A/Q&<o7u[]ya޸`{a $Ape8 O B 6eXe5p EI endstream endobj 158 0 obj <> stream 64 0 0 0 0 0 d1 endstream endobj 159 0 obj <>stream 0 0 0 -38 31 76 d1 31 0 0 114 0 -38 cm BI /IM true /W 31 /H 114 /BPC 1 /D[1 0] /F/CCF /DP<> ID &&Xk / ?l,P EI endstream endobj 160 0 obj <>stream 0 0 0 -33 61 78 d1 61 0 0 111 0 -33 cm BI /IM true /W 61 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C DAC 7>oIA[}/ k_P w\:\5K 8!~@ !!a{\6k-a]_]Km,=lBP EI endstream endobj 161 0 obj <>stream 0 0 0 -1 61 78 d1 61 0 0 79 0 -1 cm BI /IM true /W 61 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C K C @ &oW\++kAO?߿ v %0Da/! EI endstream endobj 162 0 obj <> stream 48 0 0 0 0 0 d1 endstream endobj 163 0 obj <> stream 131 0 0 0 0 0 d1 endstream endobj 164 0 obj <> stream 113 0 0 0 0 0 d1 endstream endobj 165 0 obj <>stream 0 0 0 0 126 76 d1 126 0 0 76 0 0 cm BI /IM true /W 126 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"a!5 өv a_}~ |?ޞ nP80Ih LOzz b # 1k"  EI endstream endobj 166 0 obj <> stream 88 0 0 0 0 0 d1 endstream endobj 167 0 obj <> stream 69 0 0 0 0 0 d1 endstream endobj 168 0 obj <>stream 0 0 0 28 80 32 d1 80 0 0 4 0 28 cm BI /IM true /W 80 /H 4 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 169 0 obj <> stream 132 0 0 0 0 0 d1 endstream endobj 170 0 obj <>stream 0 0 0 -42 96 76 d1 96 0 0 118 0 -42 cm BI /IM true /W 96 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;;MBkՇ~߿?zz^ץq h d3r2@e i߆7?x__Kp wa@k EI endstream endobj 171 0 obj <> stream 144 0 0 0 0 0 d1 endstream endobj 172 0 obj <> stream 66 0 0 0 0 0 d1 endstream endobj 173 0 obj <> stream 47 0 0 0 0 0 d1 endstream endobj 174 0 obj <>stream 0 0 0 61 16 110 d1 16 0 0 49 0 61 cm BI /IM true /W 16 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID &O8C5\5  EI endstream endobj 175 0 obj <>stream 0 0 0 -42 102 79 d1 102 0 0 121 0 -42 cm BI /IM true /W 102 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t <#PP[M7}7=_Ao_^?a 8 j#A EI endstream endobj 176 0 obj <>stream 0 0 0 1 80 78 d1 80 0 0 77 0 1 cm BI /IM true /W 80 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x5?|oJ?H7 վoX}x[|'[ׅP=q V EI endstream endobj 177 0 obj <> stream 41 0 0 0 0 0 d1 endstream endobj 178 0 obj <> stream 61 0 0 0 0 0 d1 endstream endobj 179 0 obj <>stream 0 0 0 -42 89 76 d1 89 0 0 118 0 -42 cm BI /IM true /W 89 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID %MB j__ o$C( ?zPLH EI endstream endobj 180 0 obj <> stream 133 0 0 0 0 0 d1 endstream endobj 181 0 obj <>stream 0 0 0 0 73 123 d1 73 0 0 123 0 0 cm BI /IM true /W 73 /H 123 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0 P0(Q PkDnao ~a&A{ ^M@렿\/X], j4 }a Ar(F ZLhlp肝__ka}vm\0'} }! g@@ EI endstream endobj 182 0 obj <>stream 0 0 0 -42 127 76 d1 127 0 0 118 0 -42 cm BI /IM true /W 127 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &YOi ,5k(M[7oX Ioa [&L?oIa ?bL EI endstream endobj 183 0 obj <> stream 147 0 0 0 0 0 d1 endstream endobj 184 0 obj <>stream 0 0 0 -53 38 120 d1 38 0 0 173 0 -53 cm BI /IM true /W 38 /H 173 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ikKX_z_^_k~}a{{x}{{x} EI endstream endobj 185 0 obj <> stream 142 0 0 0 0 0 d1 endstream endobj 186 0 obj <> stream 57 0 0 0 0 0 d1 endstream endobj 187 0 obj <>stream 0 0 0 -42 109 79 d1 109 0 0 121 0 -42 cm BI /IM true /W 109 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x' xgOPAcx[OrjD` 5/ |/_K/K2T6@e~A_ ?!aa |/_K/K V!""&V@ EI endstream endobj 188 0 obj <>stream 0 0 0 -9 38 164 d1 38 0 0 173 0 -9 cm BI /IM true /W 38 /H 173 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6Xrjxoo}{xo}o{{___^X____* EI endstream endobj 189 0 obj <> stream 79 0 0 0 0 0 d1 endstream endobj 190 0 obj <> stream 134 0 0 0 0 0 d1 endstream endobj 191 0 obj <>stream 0 0 0 0 79 110 d1 79 0 0 110 0 0 cm BI /IM true /W 79 /H 110 /BPC 1 /D[1 0] /F/CCF /DP<> ID &}kaC0q" &oLzO}~~K߿p]𽴟m/ / "|> stream 43 0 0 0 0 0 d1 endstream endobj 193 0 obj <>stream 0 0 0 -1 73 112 d1 73 0 0 113 0 -1 cm BI /IM true /W 73 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k Y5'oXx$|~IoX}O5u 붂  X</.E+'z (=@7xX| M_]A林a`0b33 !k` EI endstream endobj 194 0 obj <> stream 81 0 0 0 0 0 d1 endstream endobj 195 0 obj <> stream 146 0 0 0 0 0 d1 endstream endobj 196 0 obj <>stream 0 0 0 102 15 117 d1 15 0 0 15 0 102 cm BI /IM true /W 15 /H 15 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pqɪXk @ EI endstream endobj 197 0 obj <> stream 128 0 0 0 0 0 d1 endstream endobj 201 0 obj <>stream 0 0 0 -51 63 62 d1 63 0 0 113 0 -51 cm BI /IM true /W 63 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID ɪgkl?w?o߰o|6CLoooxo߇(' g Tp6޻Awl%vK-aᅐ.@ EI endstream endobj 202 0 obj <>stream 0 0 0 -51 65 65 d1 65 0 0 116 0 -51 cm BI /IM true /W 65 /H 116 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C " xD Oސa}>M7A[5Zk]/ - m- ` /!P EI endstream endobj 203 0 obj <>stream 0 0 0 -52 71 62 d1 71 0 0 114 0 -52 cm BI /IM true /W 71 /H 114 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0aT?߿~~???߷|?@ EI endstream endobj 204 0 obj <> stream 63 0 0 0 0 0 d1 endstream endobj 205 0 obj <>stream 0 0 0 -51 63 65 d1 63 0 0 116 0 -51 cm BI /IM true /W 63 /H 116 /BPC 1 /D[1 0] /F/CCF /DP<> ID &r~&!z!pao 7=& &+%ɪ%\0kAsx4x`/ G$F`PO  EI endstream endobj 206 0 obj <> endobj 207 0 obj <>stream 0 0 0 0 112 101 d1 112 0 0 101 0 0 cm BI /IM true /W 112 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Fm5e@?"}ޯzOo~ yAD3 EI endstream endobj 211 0 obj <>stream 0 0 0 34 80 99 d1 80 0 0 65 0 34 cm BI /IM true /W 80 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID & JfT׿?)C |2Wb/0A EI endstream endobj 212 0 obj <>stream 0 0 0 -2 35 99 d1 35 0 0 101 0 -2 cm BI /IM true /W 35 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &BU+9O=?( EI endstream endobj 213 0 obj <>stream 0 0 0 35 75 101 d1 75 0 0 66 0 35 cm BI /IM true /W 75 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f O ??>j[I o[+ [_ }B%@g!@ EI endstream endobj 214 0 obj <>stream 0 0 0 33 62 101 d1 62 0 0 68 0 33 cm BI /IM true /W 62 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u ^<xAo@7?Af__L`߿ׯ~ ,?m]% Y ` EI endstream endobj 215 0 obj <>stream 0 0 0 34 56 99 d1 56 0 0 65 0 34 cm BI /IM true /W 56 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID "GMB?O~u_o66})5  EI endstream endobj 216 0 obj <>stream 0 0 0 33 53 101 d1 53 0 0 68 0 33 cm BI /IM true /W 53 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &.t?%¾k |Cx,I%, --r . 94྿{] .|%3|@ EI endstream endobj 217 0 obj <>stream 0 0 0 -1 79 101 d1 79 0 0 102 0 -1 cm BI /IM true /W 79 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t:C`9&&  D`A\RI _H?O\6k0`Ȁ[bipazx*i EI endstream endobj 218 0 obj <>stream 0 0 0 33 73 101 d1 73 0 0 68 0 33 cm BI /IM true /W 73 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Aː_\H qCO ymn!%  ,__ᤸA-*_ @@ EI endstream endobj 219 0 obj <>stream 0 0 0 0 89 99 d1 89 0 0 99 0 0 cm BI /IM true /W 89 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &.3 >  ^?_/}}}|/ 3el_ EI endstream endobj 220 0 obj <>stream 0 0 0 -1 36 99 d1 36 0 0 100 0 -1 cm BI /IM true /W 36 /H 100 /BPC 1 /D[1 0] /F/CCF /DP<> ID &BUW@ EI endstream endobj 221 0 obj <>stream 0 0 0 -1 70 101 d1 70 0 0 102 0 -1 cm BI /IM true /W 70 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6F/!%`8>:w}=0 IZ\ m1@@^C`. a%\PD 32$PkUK&Umj` w\6 A0 a?<@ EI endstream endobj 222 0 obj <>stream 0 0 0 8 50 101 d1 50 0 0 93 0 8 cm BI /IM true /W 50 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Pzz5 0^ ċ5>  EI endstream endobj 223 0 obj <>stream 0 0 0 0 140 99 d1 140 0 0 99 0 0 cm BI /IM true /W 140 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &s_td5ᄟ? O 7M [ 7 O8OP EI endstream endobj 224 0 obj <> stream 150 0 0 0 0 0 d1 endstream endobj 225 0 obj <>stream 0 0 0 0 97 102 d1 97 0 0 102 0 0 cm BI /IM true /W 97 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k /liKpʀApi} 0~ޡK/Ú ypm[ka`k~ #K IAy 1gl0V8 EI endstream endobj 226 0 obj <>stream 0 0 0 33 70 101 d1 70 0 0 68 0 33 cm BI /IM true /W 70 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j nOD N(| k7޷ސa}>>_=o a.m- a 1 `fi EI endstream endobj 227 0 obj <>stream 0 0 0 2 97 99 d1 97 0 0 97 0 2 cm BI /IM true /W 97 /H 97 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 3+ ]_^xx]@1 # EI endstream endobj 228 0 obj <> stream 125 0 0 0 0 0 d1 endstream endobj 229 0 obj <>stream 0 0 0 33 60 101 d1 60 0 0 68 0 33 cm BI /IM true /W 60 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t F<zF| AoXzO^O_l5ֿֿ~C(? ?߷톶Xaa_C. EI endstream endobj 230 0 obj <>stream 0 0 0 34 72 129 d1 72 0 0 95 0 34 cm BI /IM true /W 72 /H 95 /BPC 1 /D[1 0] /F/CCF /DP<> ID &` Y p a}>}a0. {uTxArXa 5 QC|Co [’/K[څa<<1:!5C:k P` EI endstream endobj 231 0 obj <>stream 0 0 0 35 80 102 d1 80 0 0 67 0 35 cm BI /IM true /W 80 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j!C`IV??H7)pWVC9? dt EI endstream endobj 232 0 obj <>stream 0 0 0 4 62 101 d1 62 0 0 97 0 4 cm BI /IM true /W 62 /H 97 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u ^<xAo@7?Af__L`߿ׯ~ ,?m]% Y q i]a-m.Xm-lVaXj  EI endstream endobj 233 0 obj <> stream 70 0 0 0 0 0 d1 endstream endobj 234 0 obj <>stream 0 0 0 34 123 99 d1 123 0 0 65 0 34 cm BI /IM true /W 123 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID & E Y eAú kar X5L4=xbh5 A AC EI endstream endobj 235 0 obj <>stream 0 0 0 34 79 127 d1 79 0 0 93 0 34 cm BI /IM true /W 79 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID "! "DqA o uK50 a~RjA EI endstream endobj 236 0 obj <>stream 0 0 0 33 60 127 d1 60 0 0 94 0 33 cm BI /IM true /W 60 /H 94 /BPC 1 /D[1 0] /F/CCF /DP<> ID &10 ipKesP1 F<zF| AoXzO^O_l5ֿֿ~C(? ?߷톶Xaa_C. EI endstream endobj 237 0 obj <>stream 0 0 0 -1 73 101 d1 73 0 0 102 0 -1 cm BI /IM true /W 73 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Aː_\H qCO ymn!%  ,__ᤸA-*_ c+˞ ;!U }3  EI endstream endobj 238 0 obj <>stream 0 0 0 0 95 102 d1 95 0 0 102 0 0 cm BI /IM true /W 95 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID )ԁ ,4Bïa/x~~k޿p޿޻  wh/{v ߽_>stream 0 0 0 1 83 105 d1 83 0 0 104 0 1 cm BI /IM true /W 83 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u 0i j @eAzL=o@&7=W|%z> ?mpkaavmo>  @]S'CL'  EI endstream endobj 240 0 obj <>stream 0 0 0 38 61 104 d1 61 0 0 66 0 38 cm BI /IM true /W 61 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\  PMo `}&zo&oo&&_/z -mva,2 EI endstream endobj 241 0 obj <>stream 0 0 0 39 106 102 d1 106 0 0 63 0 39 cm BI /IM true /W 106 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &L0 aw 9A=)=M31W b "/ EI endstream endobj 242 0 obj <>stream 0 0 0 6 28 102 d1 28 0 0 96 0 6 cm BI /IM true /W 28 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &)k)?BS@ EI endstream endobj 243 0 obj <>stream 0 0 0 38 44 104 d1 44 0 0 66 0 38 cm BI /IM true /W 44 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &! 16@o}?O῾O3 Aap\h FхC*mᯮ0 !A`7 EI endstream endobj 244 0 obj <> stream 38 0 0 0 0 0 d1 endstream endobj 245 0 obj <> stream 54 0 0 0 0 0 d1 endstream endobj 246 0 obj <>stream 0 0 0 8 61 104 d1 61 0 0 96 0 8 cm BI /IM true /W 61 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 4` x"qCO <@4} &> w_o!7aaD\2 z5s?. oX31!n@`O`'`ao0M@@ EI endstream endobj 247 0 obj <>stream 0 0 0 3 81 102 d1 81 0 0 99 0 3 cm BI /IM true /W 81 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID ; rj =CZ!wf_?CE5. "" EI endstream endobj 248 0 obj <>stream 0 0 0 41 69 102 d1 69 0 0 61 0 41 cm BI /IM true /W 69 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID !?ɩ bDzpAm׮KްmkzK}l-pt7 _ oVޡ-_ ,<aM EI endstream endobj 249 0 obj <>stream 0 0 0 38 61 104 d1 61 0 0 66 0 38 cm BI /IM true /W 61 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 4` x"qCO <@4} &> w_o!7aaD\2 z5s?. oX31! EI endstream endobj 250 0 obj <>stream 0 0 0 39 66 102 d1 66 0 0 63 0 39 cm BI /IM true /W 66 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &.i0_ך'_)<ix31x/ VD9G EI endstream endobj 251 0 obj <>stream 0 0 0 2 66 104 d1 66 0 0 102 0 2 cm BI /IM true /W 66 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_@|,>!! -(ZO߿ï~ka \+  EI endstream endobj 252 0 obj <> stream 67 0 0 0 0 0 d1 endstream endobj 253 0 obj <>stream 0 0 0 39 44 102 d1 44 0 0 63 0 39 cm BI /IM true /W 44 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ⱥafd?oo\?kdJ@ EI endstream endobj 254 0 obj <>stream 0 0 0 89 16 130 d1 16 0 0 41 0 89 cm BI /IM true /W 16 /H 41 /BPC 1 /D[1 0] /F/CCF /DP<> ID &}o~a_- EI endstream endobj 255 0 obj <>stream 0 0 0 2 66 104 d1 66 0 0 102 0 2 cm BI /IM true /W 66 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &PBYX}0~o ? /m/_m%^\ EI endstream endobj 256 0 obj <> stream 35 0 0 0 0 0 d1 endstream endobj 257 0 obj <> stream 39 0 0 0 0 0 d1 endstream endobj 258 0 obj <>stream 0 0 0 39 66 130 d1 66 0 0 91 0 39 cm BI /IM true /W 66 /H 91 /BPC 1 /D[1 0] /F/CCF /DP<> ID & _O:?(X~A~)}O?7/a/ VOA{ x<!dCD EI endstream endobj 259 0 obj <>stream 0 0 0 41 67 104 d1 67 0 0 63 0 41 cm BI /IM true /W 67 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p~|~o[I?A}o }[ $@A  EI endstream endobj 260 0 obj <>stream 0 0 0 3 89 102 d1 89 0 0 99 0 3 cm BI /IM true /W 89 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 10U4_޿xAp E\G EI endstream endobj 261 0 obj <>stream 0 0 0 2 29 102 d1 29 0 0 100 0 2 cm BI /IM true /W 29 /H 100 /BPC 1 /D[1 0] /F/CCF /DP<> ID &.`'x EI endstream endobj 262 0 obj <>stream 0 0 0 2 66 102 d1 66 0 0 100 0 2 cm BI /IM true /W 66 /H 100 /BPC 1 /D[1 0] /F/CCF /DP<> ID &.i0_ך'_kƽ1^AO EI endstream endobj 263 0 obj <>stream 0 0 0 38 54 104 d1 54 0 0 66 0 38 cm BI /IM true /W 54 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\|<! A&o |'Շ׭ P$Wk .]^zvX0[ %_$p EI endstream endobj 264 0 obj <>stream 0 0 0 0 93 104 d1 93 0 0 104 0 0 cm BI /IM true /W 93 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u i 2i a kK tjx@a _I@z^}/% zDE ??pmvak^yh/a A/d@Tx^ B|0O @ EI endstream endobj 265 0 obj <>stream 0 0 0 39 66 104 d1 66 0 0 65 0 39 cm BI /IM true /W 66 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_ aA2†!PIgOC,@ EI endstream endobj 266 0 obj <>stream 0 0 0 38 53 130 d1 53 0 0 92 0 38 cm BI /IM true /W 53 /H 92 /BPC 1 /D[1 0] /F/CCF /DP<> ID &oR Ԍ7_#/#ACDx |' 7}0周>Aֿֿhۅ?Ka- 2$b  EI endstream endobj 267 0 obj <> stream 40 0 0 0 0 0 d1 endstream endobj 268 0 obj <>stream 0 0 0 0 53 66 d1 53 0 0 66 0 0 cm BI /IM true /W 53 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &` 0F>stream 0 0 0 39 66 130 d1 66 0 0 91 0 39 cm BI /IM true /W 66 /H 91 /BPC 1 /D[1 0] /F/CCF /DP<> ID &]? AA ~P~ ?a'~IOz^_\?a/ 4h' x@? EI endstream endobj 270 0 obj <>stream 0 0 0 13 43 104 d1 43 0 0 91 0 13 cm BI /IM true /W 43 /H 91 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\'3 7oA Iɫdo EI endstream endobj 271 0 obj <> stream 37 0 0 0 0 0 d1 endstream endobj 272 0 obj <> stream 53 0 0 0 0 0 d1 endstream endobj 273 0 obj <>stream 0 0 0 38 62 132 d1 62 0 0 94 0 38 cm BI /IM true /W 62 /H 94 /BPC 1 /D[1 0] /F/CCF /DP<> ID & $I"`D0p@>>IO}&l.KxX30/-.  怫_&̃؂i&}oH0'[z밤# ށ Bo!0as+Hg@ EI endstream endobj 274 0 obj <>stream 0 0 0 3 82 102 d1 82 0 0 99 0 3 cm BI /IM true /W 82 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID +`\pɨCfv70~߰ /}x_ z x i|_4 _//|/KPKAB RAX @ EI endstream endobj 275 0 obj <>stream 0 0 0 11 54 104 d1 54 0 0 93 0 11 cm BI /IM true /W 54 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\|<! A&o |'Շ׭ P$Wk .]^zvX0[ %_$x$̍4Ka]\=m턶k @ EI endstream endobj 276 0 obj <>stream 0 0 0 89 15 102 d1 15 0 0 13 0 89 cm BI /IM true /W 15 /H 13 /BPC 1 /D[1 0] /F/CCF /DP<> ID & kj  EI endstream endobj 277 0 obj <>stream 0 0 0 0 100 102 d1 100 0 0 102 0 0 cm BI /IM true /W 100 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k /1o*DxD`5zH7xXzO׫xI/IPޗk_~]\>]aol`EI>Rxb y Z@ EI endstream endobj 278 0 obj <>stream 0 0 0 22 76 102 d1 76 0 0 80 0 22 cm BI /IM true /W 76 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &tQ5"0&} [o[X}'[x&_k o]ia]kX`[Eb \Y  EI endstream endobj 279 0 obj <> stream 119 0 0 0 0 0 d1 endstream endobj 281 0 obj <>stream 0 0 0 23 109 100 d1 109 0 0 77 0 23 cm BI /IM true /W 109 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID & GC4<Oi[77MO[A7? O[||' EI endstream endobj 282 0 obj <>stream 0 0 0 23 37 100 d1 37 0 0 77 0 23 cm BI /IM true /W 37 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &__ EI endstream endobj 283 0 obj <>stream 0 0 0 22 53 102 d1 53 0 0 80 0 22 cm BI /IM true /W 53 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6d88`a8¹ `pxWO^_or2d3[%-.axZ#a$+%5zjka{]$|1 ^ 7 EI endstream endobj 284 0 obj <>stream 0 0 0 -7 84 100 d1 84 0 0 107 0 -7 cm BI /IM true /W 84 /H 107 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ^ (^{K8_{_1޻]_^޽{aw߽zka ܂a2 LQ}U`8 EI endstream endobj 285 0 obj <>stream 0 0 0 1 99 100 d1 99 0 0 99 0 1 cm BI /IM true /W 99 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID & J`~ w?R f___ #Џ /5>  EI endstream endobj 286 0 obj <>stream 0 0 0 23 86 100 d1 86 0 0 77 0 23 cm BI /IM true /W 86 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID @CiAׯ vz znKۮ_[ {]밖m[]k -pՇ7~z>_OxH7>}z &A EI endstream endobj 287 0 obj <>stream 0 0 0 22 84 100 d1 84 0 0 78 0 22 cm BI /IM true /W 84 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ^ (^{K8_{_1޻]_^޽{aw߽zka EI endstream endobj 288 0 obj <>stream 0 0 0 23 88 100 d1 88 0 0 77 0 23 cm BI /IM true /W 88 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &tg____5 _/_ K~/%_K //}P -ׅ EI endstream endobj 289 0 obj <>stream 0 0 0 23 83 100 d1 83 0 0 77 0 23 cm BI /IM true /W 83 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &FV]HlO2o~߷^~// z >_T@ EI endstream endobj 290 0 obj <>stream 0 0 0 23 88 102 d1 88 0 0 79 0 23 cm BI /IM true /W 88 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &z: H/?o!ua' ^^.R go?_/K^C8ςJ`P6 EI endstream endobj 291 0 obj <>stream 0 0 0 36 20 100 d1 20 0 0 64 0 36 cm BI /IM true /W 20 /H 64 /BPC 1 /D[1 0] /F/CCF /DP<> ID &fPxO/jXacz&~_@ EI endstream endobj 292 0 obj <>stream 0 0 0 0 81 82 d1 81 0 0 82 0 0 cm BI /IM true /W 81 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID %PsP)BFUC|Geῇ_ }z ^AAx(Rhe( EI endstream endobj 293 0 obj <>stream 0 0 0 28 48 82 d1 48 0 0 54 0 28 cm BI /IM true /W 48 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID "At  Ԛh  EI endstream endobj 294 0 obj <>stream 0 0 0 27 60 84 d1 60 0 0 57 0 27 cm BI /IM true /W 60 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & >@ x zxFC`=7 ɯx\5zz/kaK`ȺAF EI endstream endobj 295 0 obj <>stream 0 0 0 -2 48 82 d1 48 0 0 84 0 -2 cm BI /IM true /W 48 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Ij Gߺ߇[k!D@ EI endstream endobj 296 0 obj <>stream 0 0 0 64 19 82 d1 19 0 0 18 0 64 cm BI /IM true /W 19 /H 18 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|ɮkaa EI endstream endobj 297 0 obj <>stream 0 0 0 0 91 82 d1 91 0 0 82 0 0 cm BI /IM true /W 91 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &VM/4aA* \o?7_z_zz^ׄ` FVp\ @ EI endstream endobj 298 0 obj <>stream 0 0 0 0 84 82 d1 84 0 0 82 0 0 cm BI /IM true /W 84 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|0jC,~  Br P4aC`~C-?~~%r>\ EI endstream endobj 299 0 obj <>stream 0 0 0 27 54 84 d1 54 0 0 57 0 27 cm BI /IM true /W 54 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0z#| 7}&5M?IC:_k.a-a`0  EI endstream endobj 300 0 obj <>stream 0 0 0 28 67 82 d1 67 0 0 54 0 28 cm BI /IM true /W 67 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"hA?(оd* EI endstream endobj 301 0 obj <>stream 0 0 0 -1 67 82 d1 67 0 0 83 0 -1 cm BI /IM true /W 67 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"hAyh_ W`^?P?"  EI endstream endobj 302 0 obj <>stream 0 0 0 28 67 84 d1 67 0 0 56 0 28 cm BI /IM true /W 67 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/ a AD~?P=5rp.D@ EI endstream endobj 303 0 obj <>stream 0 0 0 -1 66 84 d1 66 0 0 85 0 -1 cm BI /IM true /W 66 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &9@_ xA@P T2 tA^ᆻaw 'k"7#ra? @@ EI endstream endobj 304 0 obj <>stream 0 0 0 -1 86 84 d1 86 0 0 85 0 -1 cm BI /IM true /W 86 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j ?10+Ȁ" ް7MA[ }?O5x_Kzw zKzKa `,2 Xx,3Ld4 EI endstream endobj 305 0 obj <>stream 0 0 0 -1 31 82 d1 31 0 0 83 0 -1 cm BI /IM true /W 31 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D@@ EI endstream endobj 306 0 obj <>stream 0 0 0 -2 30 82 d1 30 0 0 84 0 -2 cm BI /IM true /W 30 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D\_A?_[ ( EI endstream endobj 307 0 obj <>stream 0 0 0 29 66 82 d1 66 0 0 53 0 29 cm BI /IM true /W 66 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x)?Η[&} }azҸ EI endstream endobj 308 0 obj <>stream 0 0 0 27 61 84 d1 61 0 0 57 0 27 cm BI /IM true /W 61 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@i|A 0E8p }?a ]AqLZ ? _],6.= @` EI endstream endobj 309 0 obj <>stream 0 0 0 -1 59 84 d1 59 0 0 85 0 -1 cm BI /IM true /W 59 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6W v\Appz.דPTZ4d3@Ŀ![p..,",26+@i0pl}t/5_ׇ] ^vu EO . g@π EI endstream endobj 310 0 obj <>stream 0 0 0 6 43 84 d1 43 0 0 78 0 6 cm BI /IM true /W 43 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ܠ' <.}&޾!ā5>3? EI endstream endobj 311 0 obj <>stream 0 0 0 0 28 120 d1 28 0 0 120 0 0 cm BI /IM true /W 28 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &cXZZ -p]~p/z__a{x}{p EI endstream endobj 312 0 obj <>stream 0 0 0 6 79 93 d1 79 0 0 87 0 6 cm BI /IM true /W 79 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t h<#@<AxI0>MzO0AA7kz]x]][ m[ X0 ,0 z@@ EI endstream endobj 313 0 obj <>stream 0 0 0 37 39 90 d1 39 0 0 53 0 37 cm BI /IM true /W 39 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID A?&=~C?Ѣa=5BN  EI endstream endobj 314 0 obj <>stream 0 0 0 9 26 90 d1 26 0 0 81 0 9 cm BI /IM true /W 26 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID j)@_5L/ EI endstream endobj 315 0 obj <> stream 46 0 0 0 0 0 d1 endstream endobj 316 0 obj <>stream 0 0 0 36 44 92 d1 44 0 0 56 0 36 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ @ EI endstream endobj 317 0 obj <> stream 33 0 0 0 0 0 d1 endstream endobj 318 0 obj <>stream 0 0 0 37 57 90 d1 57 0 0 53 0 37 cm BI /IM true /W 57 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&k.6p &C'  EI endstream endobj 319 0 obj <>stream 0 0 0 17 37 92 d1 37 0 0 75 0 17 cm BI /IM true /W 37 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &O?t?jd0" EI endstream endobj 320 0 obj <> stream 60 0 0 0 0 0 d1 endstream endobj 321 0 obj <>stream 0 0 0 36 53 92 d1 53 0 0 56 0 36 cm BI /IM true /W 53 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,( EI endstream endobj 322 0 obj <>stream 0 0 0 7 57 92 d1 57 0 0 85 0 7 cm BI /IM true /W 57 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!1T3 |@&trւb}//55ap6ix0day ] _) EI endstream endobj 323 0 obj <>stream 0 0 0 36 51 92 d1 51 0 0 56 0 36 cm BI /IM true /W 51 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !ax EI endstream endobj 324 0 obj <> stream 59 0 0 0 0 0 d1 endstream endobj 325 0 obj <>stream 0 0 0 0 28 120 d1 28 0 0 120 0 0 cm BI /IM true /W 28 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &{{|7{{??_kz_ֽaz׭uZu@ EI endstream endobj 329 0 obj <>stream 0 0 0 0 118 82 d1 118 0 0 82 0 0 cm BI /IM true /W 118 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &s`O&du?EA?M?[7ooAMO[ 7Ooodl7@ EI endstream endobj 330 0 obj <>stream 0 0 0 3 61 84 d1 61 0 0 81 0 3 cm BI /IM true /W 61 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@i|A 0E8p }?a ]AqLZ ? _],6.= @q4e8eXx}{ l( EI endstream endobj 331 0 obj <>stream 0 0 0 27 52 84 d1 52 0 0 57 0 27 cm BI /IM true /W 52 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0<"0G&x[>CLQ~> aiq0Y 0gP EI endstream endobj 332 0 obj <>stream 0 0 0 27 43 84 d1 43 0 0 57 0 27 cm BI /IM true /W 43 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &R?K>/jAp/׮Ay $Z kPe8aAG_k.%  EI endstream endobj 333 0 obj <>stream 0 0 0 -1 92 82 d1 92 0 0 83 0 -1 cm BI /IM true /W 92 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &B̂Xua߽v Wz/kkp]]t .? kkkk / EI endstream endobj 334 0 obj <>stream 0 0 0 29 92 82 d1 92 0 0 53 0 29 cm BI /IM true /W 92 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p3V  GO o>ao}[[Z__NZ[TFH  EI endstream endobj 335 0 obj <>stream 0 0 0 -1 82 84 d1 82 0 0 85 0 -1 cm BI /IM true /W 82 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k jI| )<- ޓ| IW¾s\(xd;k [k~07*~<x0O5y m\@ EI endstream endobj 336 0 obj <>stream 0 0 0 -1 61 84 d1 61 0 0 85 0 -1 cm BI /IM true /W 61 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@i|A 0E8p }?a ]AqLZ ? _],6.= @q7!fXf@@ EI endstream endobj 337 0 obj <>stream 0 0 0 0 53 87 d1 53 0 0 87 0 0 cm BI /IM true /W 53 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C6(~hߠ'7L>K륐kOfQ AkZ@/ 5\.ZD4_{.hxaO/|0t<@ EI endstream endobj 338 0 obj <>stream 0 0 0 8 95 90 d1 95 0 0 82 0 8 cm BI /IM true /W 95 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID & |`0[A? F[I- ?ooH0o[ I,OA@ EI endstream endobj 339 0 obj <> stream 106 0 0 0 0 0 d1 endstream endobj 340 0 obj <> stream 58 0 0 0 0 0 d1 endstream endobj 341 0 obj <> stream 34 0 0 0 0 0 d1 endstream endobj 342 0 obj <>stream 0 0 0 78 14 113 d1 14 0 0 35 0 78 cm BI /IM true /W 14 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7{ cM~( EI endstream endobj 343 0 obj <>stream 0 0 0 11 47 90 d1 47 0 0 79 0 11 cm BI /IM true /W 47 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &= f{o7{}o= >oO7 ]XzimX0 EI endstream endobj 344 0 obj <>stream 0 0 0 11 49 93 d1 49 0 0 82 0 11 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3.=X=&Oo[o\=]Xad4  EI endstream endobj 345 0 obj <>stream 0 0 0 8 78 90 d1 78 0 0 82 0 8 cm BI /IM true /W 78 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &FU@Țo! ? ?oo//_^/ o%!@  EI endstream endobj 346 0 obj <>stream 0 0 0 38 43 90 d1 43 0 0 52 0 38 cm BI /IM true /W 43 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID c&!{o ww}>xaow EI endstream endobj 347 0 obj <>stream 0 0 0 37 91 90 d1 91 0 0 53 0 37 cm BI /IM true /W 91 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID $I56@4ӄOK~6LX`iqdž&AP EI endstream endobj 348 0 obj <>stream 0 0 0 7 57 92 d1 57 0 0 85 0 7 cm BI /IM true /W 57 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N>D?h0A7a}?_v&/a dᣏQ0 EI endstream endobj 349 0 obj <>stream 0 0 0 11 47 93 d1 47 0 0 82 0 11 cm BI /IM true /W 47 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@h0H#1x0oM޿ S]?~G{_vFc !yͯ|(|(@ EI endstream endobj 350 0 obj <>stream 0 0 0 78 13 90 d1 13 0 0 12 0 78 cm BI /IM true /W 13 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Mu` EI endstream endobj 351 0 obj <> endobj 352 0 obj <>stream 0 0 0 0 99 99 d1 99 0 0 99 0 0 cm BI /IM true /W 99 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Ap޻.w\?]WDx^zn{åzA߽x^7^~~k~/ EI endstream endobj 356 0 obj <>stream 0 0 0 33 70 127 d1 70 0 0 94 0 33 cm BI /IM true /W 70 /H 94 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H >?EX^0$x5 .C@>@ƍ@@ EI endstream endobj 357 0 obj <>stream 0 0 0 34 64 101 d1 64 0 0 67 0 34 cm BI /IM true /W 64 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4>DQ~?@ EI endstream endobj 358 0 obj <>stream 0 0 0 32 66 101 d1 66 0 0 69 0 32 cm BI /IM true /W 66 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Fn5 n]uPD6k?ADž_oN ?^a/]_ᴶ /Emm`5 $2 EI endstream endobj 359 0 obj <>stream 0 0 0 -3 19 99 d1 19 0 0 102 0 -3 cm BI /IM true /W 19 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P EI endstream endobj 360 0 obj <>stream 0 0 0 33 69 127 d1 69 0 0 94 0 33 cm BI /IM true /W 69 /H 94 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A AO@X/x&}_ % A1©/^E1XcH EI endstream endobj 361 0 obj <>stream 0 0 0 33 44 99 d1 44 0 0 66 0 33 cm BI /IM true /W 44 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &29- ?ɯh  EI endstream endobj 362 0 obj <>stream 0 0 0 33 76 129 d1 76 0 0 96 0 33 cm BI /IM true /W 76 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`  0D! 3<&}ol/dq[﵇Z\,/r,{%X/M_ 丒x_Dˆ>ABr  EI endstream endobj 363 0 obj <>stream 0 0 0 33 64 99 d1 64 0 0 66 0 33 cm BI /IM true /W 64 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3A? )04 EI endstream endobj 364 0 obj <>stream 0 0 0 16 51 101 d1 51 0 0 85 0 16 cm BI /IM true /W 51 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & P=:?@^?pXM~B @ EI endstream endobj 365 0 obj <>stream 0 0 0 32 65 101 d1 65 0 0 69 0 32 cm BI /IM true /W 65 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4@ӄCN }`)4HeHia,{]:p5x0_g EI endstream endobj 366 0 obj <>stream 0 0 0 82 18 115 d1 18 0 0 33 0 82 cm BI /IM true /W 18 /H 33 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4?@ EI endstream endobj 367 0 obj <>stream 0 0 0 32 73 101 d1 73 0 0 69 0 32 cm BI /IM true /W 73 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DW7`O=== o }&O wm-0^=-   !  EI endstream endobj 368 0 obj <>stream 0 0 0 -3 70 101 d1 70 0 0 104 0 -3 cm BI /IM true /W 70 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_AY N>?E@NAA?߾pk-{ .  \>? EI endstream endobj 369 0 obj <>stream 0 0 0 32 55 101 d1 55 0 0 69 0 32 cm BI /IM true /W 55 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|Ȃ2'\?GDŽ q_X_ C-&C`Aq|/X%Aa.Z 0#&є]^A>]xd1_  2  EI endstream endobj 370 0 obj <>stream 0 0 0 33 110 99 d1 110 0 0 66 0 33 cm BI /IM true /W 110 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &NдiWÿh5L/A 0GtJA 5a mX:I@ EI endstream endobj 371 0 obj <>stream 0 0 0 32 63 101 d1 63 0 0 69 0 32 cm BI /IM true /W 63 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S!KzkZ* >~CN]\?^ ~X0X`c  EI endstream endobj 372 0 obj <>stream 0 0 0 -4 19 99 d1 19 0 0 103 0 -4 cm BI /IM true /W 19 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_kRk EI endstream endobj 373 0 obj <>stream 0 0 0 82 18 99 d1 18 0 0 17 0 82 cm BI /IM true /W 18 /H 17 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 374 0 obj <> stream 123 0 0 0 0 0 d1 endstream endobj 375 0 obj <>stream 0 0 0 34 70 99 d1 70 0 0 65 0 34 cm BI /IM true /W 70 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j-:[]]a߰a zmp a?zxOOAOM&}7|/Vh5 EI endstream endobj 376 0 obj <> stream 31 0 0 0 0 0 d1 endstream endobj 377 0 obj <> stream 129 0 0 0 0 0 d1 endstream endobj 378 0 obj <>stream 0 0 0 3 65 101 d1 65 0 0 98 0 3 cm BI /IM true /W 65 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4@ӄCN }`)4HeHia,{]:p5x0_g3o=@ EI endstream endobj 379 0 obj <>stream 0 0 0 0 68 65 d1 68 0 0 65 0 0 cm BI /IM true /W 68 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\?毬?~+߯[A0WO~?iɮ  EI endstream endobj 380 0 obj <>stream 0 0 0 0 28 101 d1 28 0 0 101 0 0 cm BI /IM true /W 28 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ikX]-xZzׯKMW߼?=﷾? EI endstream endobj 381 0 obj <>stream 0 0 0 5 55 75 d1 55 0 0 70 0 5 cm BI /IM true /W 55 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@6qH`Çwsx}/(*T Ș  EI endstream endobj 382 0 obj <>stream 0 0 0 28 31 75 d1 31 0 0 47 0 28 cm BI /IM true /W 31 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@1A}0׿{x EI endstream endobj 383 0 obj <>stream 0 0 0 27 48 77 d1 48 0 0 50 0 27 cm BI /IM true /W 48 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &< xOOk'A';ɯl%V_ , EI endstream endobj 384 0 obj <> stream 36 0 0 0 0 0 d1 endstream endobj 385 0 obj <>stream 0 0 0 29 45 75 d1 45 0 0 46 0 29 cm BI /IM true /W 45 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID &1H_~Շ·\wj5 EI endstream endobj 386 0 obj <>stream 0 0 0 8 45 77 d1 45 0 0 69 0 8 cm BI /IM true /W 45 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AFz_ѬOAzk~G-O~ab5 Ƙ|=xox EI endstream endobj 387 0 obj <>stream 0 0 0 3 47 77 d1 47 0 0 74 0 3 cm BI /IM true /W 47 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &=8??߿K0B:^?@@ EI endstream endobj 388 0 obj <>stream 0 0 0 2 16 75 d1 16 0 0 73 0 2 cm BI /IM true /W 16 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Z?G@ EI endstream endobj 389 0 obj <> stream 25 0 0 0 0 0 d1 endstream endobj 390 0 obj <>stream 0 0 0 3 59 78 d1 59 0 0 75 0 3 cm BI /IM true /W 59 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &SH7IDH(xAִTh ?/~k2ML0Y  EI endstream endobj 391 0 obj <>stream 0 0 0 3 45 75 d1 45 0 0 72 0 3 cm BI /IM true /W 45 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &  M_ ._s"<ڀ EI endstream endobj 392 0 obj <>stream 0 0 0 28 45 75 d1 45 0 0 47 0 28 cm BI /IM true /W 45 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &  M_ ._l/  EI endstream endobj 393 0 obj <> stream 26 0 0 0 0 0 d1 endstream endobj 394 0 obj <>stream 0 0 0 8 45 77 d1 45 0 0 69 0 8 cm BI /IM true /W 45 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AFz_ѬOAzk~G-O~ab5 Ƙ av % mq k€ EI endstream endobj 395 0 obj <>stream 0 0 0 27 37 77 d1 37 0 0 50 0 27 cm BI /IM true /W 37 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &΁~F<'A=ThzY (.^a๬3࿮^C t  EI endstream endobj 396 0 obj <>stream 0 0 0 0 29 101 d1 29 0 0 101 0 0 cm BI /IM true /W 29 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4~~{x_zׯkֽa.iu@ EI endstream endobj 397 0 obj <> stream 45 0 0 0 0 0 d1 endstream endobj 398 0 obj <>stream 0 0 0 -3 69 101 d1 69 0 0 104 0 -3 cm BI /IM true /W 69 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C6 =0O rx }Oo }4% Aq©/Ȧ0/? EI endstream endobj 399 0 obj <>stream 0 0 0 4 65 101 d1 65 0 0 97 0 4 cm BI /IM true /W 65 /H 97 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4@ӄCN }`)4HeHia,{]:p5x0_gC.!> HnOa<0Aar EI endstream endobj 400 0 obj <>stream 0 0 0 3 73 101 d1 73 0 0 98 0 3 cm BI /IM true /W 73 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DW7`O=== o }&O wm-0^=-   !e}7}὇o  EI endstream endobj 401 0 obj <>stream 0 0 0 -4 54 99 d1 54 0 0 103 0 -4 cm BI /IM true /W 54 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ΡAʢ5Y3`0{C(ă@ EI endstream endobj 402 0 obj <>stream 0 0 0 34 61 99 d1 61 0 0 65 0 34 cm BI /IM true /W 61 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &n;}{{x}{}{}yk:@@ EI endstream endobj 403 0 obj <> stream 126 0 0 0 0 0 d1 endstream endobj 404 0 obj <>stream 0 0 0 3 66 101 d1 66 0 0 98 0 3 cm BI /IM true /W 66 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Fn5 n]uPD6k?ADž_oN ?^a/]_ᴶ /Emm`5 $2?|xoo}{~o@ EI endstream endobj 405 0 obj <>stream 0 0 0 -3 18 99 d1 18 0 0 102 0 -3 cm BI /IM true /W 18 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ӯX}O EI endstream endobj 406 0 obj <>stream 0 0 0 5 44 75 d1 44 0 0 70 0 5 cm BI /IM true /W 44 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &cP EI endstream endobj 407 0 obj <>stream 0 0 0 27 45 77 d1 45 0 0 50 0 27 cm BI /IM true /W 45 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AFz_ѬOAzk~G-O~ab5 Ɛ EI endstream endobj 408 0 obj <>stream 0 0 0 27 44 77 d1 44 0 0 50 0 27 cm BI /IM true /W 44 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 5Ѩpɮ}oc83u8֚+~Y! EI endstream endobj 409 0 obj <>stream 0 0 0 3 47 77 d1 47 0 0 74 0 3 cm BI /IM true /W 47 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &9daѬz I\? {#< EI endstream endobj 410 0 obj <>stream 0 0 0 5 64 75 d1 64 0 0 70 0 5 cm BI /IM true /W 64 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`h w:w.3_Aazg(PȨ EI endstream endobj 411 0 obj <>stream 0 0 0 5 68 75 d1 68 0 0 70 0 5 cm BI /IM true /W 68 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`OA?ooo> ~/o߯[[z _'V>?j5 EI endstream endobj 412 0 obj <>stream 0 0 0 27 43 77 d1 43 0 0 50 0 27 cm BI /IM true /W 43 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?c4~jAskW?/] {0X0gP EI endstream endobj 413 0 obj <> stream 27 0 0 0 0 0 d1 endstream endobj 414 0 obj <>stream 0 0 0 3 35 99 d1 35 0 0 96 0 3 cm BI /IM true /W 35 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C?|=}={  EI endstream endobj 415 0 obj <> stream 118 0 0 0 0 0 d1 endstream endobj 416 0 obj <>stream 0 0 0 62 45 71 d1 45 0 0 9 0 62 cm BI /IM true /W 45 /H 9 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|_ɪP EI endstream endobj 417 0 obj <>stream 0 0 0 0 25 99 d1 25 0 0 99 0 0 cm BI /IM true /W 25 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F ~Z,/_ Gɪ{{ EI endstream endobj 418 0 obj <>stream 0 0 0 5 61 75 d1 61 0 0 70 0 5 cm BI /IM true /W 61 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID 45Zx_u޻恳_]_]^ׅ ]= EI endstream endobj 419 0 obj <> stream 32 0 0 0 0 0 d1 endstream endobj 420 0 obj <>stream 0 0 0 3 9 75 d1 9 0 0 72 0 3 cm BI /IM true /W 9 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 421 0 obj <>stream 0 0 0 3 40 77 d1 40 0 0 74 0 3 cm BI /IM true /W 40 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8?0< ׿{zACa0_) EI endstream endobj 422 0 obj <> stream 24 0 0 0 0 0 d1 endstream endobj 423 0 obj <>stream 0 0 0 28 39 77 d1 39 0 0 49 0 28 cm BI /IM true /W 39 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@_AA>>A뒀@/&akkBXk`€ EI endstream endobj 424 0 obj <> stream 49 0 0 0 0 0 d1 endstream endobj 425 0 obj <>stream 0 0 0 29 25 75 d1 25 0 0 46 0 29 cm BI /IM true /W 25 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4pr73>stream 0 0 0 18 32 77 d1 32 0 0 59 0 18 cm BI /IM true /W 32 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &}N?s@׿!/51 EI endstream endobj 427 0 obj <>stream 0 0 0 5 47 75 d1 47 0 0 70 0 5 cm BI /IM true /W 47 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5?[  EI endstream endobj 428 0 obj <>stream 0 0 0 6 11 75 d1 11 0 0 69 0 6 cm BI /IM true /W 11 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &)  EI endstream endobj 429 0 obj <>stream 0 0 0 29 37 75 d1 37 0 0 46 0 29 cm BI /IM true /W 37 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4 8V4Kk m|@ EI endstream endobj 430 0 obj <>stream 0 0 0 28 33 77 d1 33 0 0 49 0 28 cm BI /IM true /W 33 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Jf<q|.hx']`O\--)#_ |{2 EI endstream endobj 431 0 obj <>stream 0 0 0 0 25 99 d1 25 0 0 99 0 0 cm BI /IM true /W 25 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ox~{k~ֿ,/_Z .iu  EI endstream endobj 432 0 obj <> endobj 433 0 obj <>stream 0 0 0 0 69 102 d1 69 0 0 102 0 0 cm BI /IM true /W 69 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID (I5_w?[?[2?7_῿nzm{n|5XF XK p EI endstream endobj 437 0 obj <>stream 0 0 0 48 84 102 d1 84 0 0 54 0 48 cm BI /IM true /W 84 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID 'ܜOûUw ol?kN lk׆k  EI endstream endobj 438 0 obj <> stream 122 0 0 0 0 0 d1 endstream endobj 439 0 obj <>stream 0 0 0 19 28 102 d1 28 0 0 83 0 19 cm BI /IM true /W 28 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID '0?0 EI endstream endobj 440 0 obj <>stream 0 0 0 48 51 102 d1 51 0 0 54 0 48 cm BI /IM true /W 51 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID 'w&aa~ NF<5^X EI endstream endobj 441 0 obj <> stream 28 0 0 0 0 0 d1 endstream endobj 442 0 obj <>stream 0 0 0 14 51 102 d1 51 0 0 88 0 14 cm BI /IM true /W 51 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID 'w&aa~ NF<5^^Clx EI endstream endobj 443 0 obj <>stream 0 0 0 47 49 104 d1 49 0 0 57 0 47 cm BI /IM true /W 49 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$G)N%;\IC05K  Apy C !c4_0 d  EI endstream endobj 444 0 obj <>stream 0 0 0 26 57 104 d1 57 0 0 78 0 26 cm BI /IM true /W 57 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$)N Q pĜ1>MT?~ P?d>?ך /dQ ?᧿Ol{ ˰ 7 a` EI endstream endobj 445 0 obj <>stream 0 0 0 47 46 104 d1 46 0 0 57 0 47 cm BI /IM true /W 46 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@g"01C }aCg :U?2}a:`ǵXa` EI endstream endobj 446 0 obj <>stream 0 0 0 92 16 117 d1 16 0 0 25 0 92 cm BI /IM true /W 16 /H 25 /BPC 1 /D[1 0] /F/CCF /DP<> ID 895_> EI endstream endobj 447 0 obj <>stream 0 0 0 47 52 104 d1 52 0 0 57 0 47 cm BI /IM true /W 52 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8e|E|=o~q7Oj ?ﶶ v a-1Xa~ aD@ EI endstream endobj 448 0 obj <>stream 0 0 0 47 46 104 d1 46 0 0 57 0 47 cm BI /IM true /W 46 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H``A=#.  h/AuAk. ^j@e d"7ǰ ,  EI endstream endobj 449 0 obj <>stream 0 0 0 49 52 104 d1 52 0 0 55 0 49 cm BI /IM true /W 52 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &( /#' @Qz?moma EI endstream endobj 450 0 obj <>stream 0 0 0 48 40 102 d1 40 0 0 54 0 48 cm BI /IM true /W 40 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID '95_߿|>|, ` EI endstream endobj 451 0 obj <>stream 0 0 0 25 49 104 d1 49 0 0 79 0 25 cm BI /IM true /W 49 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$G)N%;\IC05K  Apy C !c4_0 d l/uKAuK EI endstream endobj 452 0 obj <>stream 0 0 0 33 36 104 d1 36 0 0 71 0 33 cm BI /IM true /W 36 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &PN@=?P?Aa7 EI endstream endobj 453 0 obj <>stream 0 0 0 14 60 104 d1 60 0 0 90 0 14 cm BI /IM true /W 60 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &I_NP~^P~Mp~m?0^ .Ǿ =kax2q8{p@ EI endstream endobj 454 0 obj <>stream 0 0 0 48 53 125 d1 53 0 0 77 0 48 cm BI /IM true /W 53 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N )jwx" Mpw70d pk4  EI endstream endobj 455 0 obj <>stream 0 0 0 47 49 104 d1 49 0 0 57 0 47 cm BI /IM true /W 49 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &QFz} \?aa/0!߆a  EI endstream endobj 456 0 obj <>stream 0 0 0 14 28 102 d1 28 0 0 88 0 14 cm BI /IM true /W 28 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID '0??{ EI endstream endobj 457 0 obj <>stream 0 0 0 14 52 104 d1 52 0 0 90 0 14 cm BI /IM true /W 52 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8T/>OO7m? k_^Clx EI endstream endobj 458 0 obj <>stream 0 0 0 48 67 128 d1 67 0 0 80 0 48 cm BI /IM true /W 67 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5>B@½C| A>MɪCe\VXAuh3?4- ؃}H/A)A~߆5&;;"<DM`" EI endstream endobj 459 0 obj <>stream 0 0 0 13 48 102 d1 48 0 0 89 0 13 cm BI /IM true /W 48 /H 89 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5{{7a*0{7{`b  EI endstream endobj 460 0 obj <>stream 0 0 0 49 54 102 d1 54 0 0 53 0 49 cm BI /IM true /W 54 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID %w&}fooa{a{὾  EI endstream endobj 461 0 obj <>stream 0 0 0 47 49 125 d1 49 0 0 78 0 47 cm BI /IM true /W 49 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &jo~a0< D0X}~>{ x.F5 ,Pp EI endstream endobj 462 0 obj <>stream 0 0 0 92 13 102 d1 13 0 0 10 0 92 cm BI /IM true /W 13 /H 10 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/  EI endstream endobj 463 0 obj <>stream 0 0 0 38 56 92 d1 56 0 0 54 0 38 cm BI /IM true /W 56 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`2|~7?VWO׭_ޘA09@ EI endstream endobj 464 0 obj <> endobj 465 0 obj <>stream 0 0 0 0 178 174 d1 178 0 0 174 0 0 cm BI /IM true /W 178 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&  7!v-]:\?]p/pï ߺ z?ka4zvx]aۯA߇K]x]nwvzwK~kk@@ EI endstream endobj 469 0 obj <>stream 0 0 0 61 118 225 d1 118 0 0 164 0 61 cm BI /IM true /W 118 /H 164 /BPC 1 /D[1 0] /F/CCF /DP<> ID &L'26k! 0j/"X= `7>zL=oA7 oaD0޽>oM0Dfh f Bba d4_Sԯ  EI endstream endobj 470 0 obj <>stream 0 0 0 62 91 174 d1 91 0 0 112 0 62 cm BI /IM true /W 91 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &aMAf# '?P 8~l7 s IH20 Ӄ EI endstream endobj 471 0 obj <>stream 0 0 0 61 120 176 d1 120 0 0 115 0 61 cm BI /IM true /W 120 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S @ x 0T_ 0o MVÄa_U m oɀQ ~ *\C]o!K$ x < ?O??__[Wڮ  K[ N % i @@ EI endstream endobj 472 0 obj <>stream 0 0 0 2 128 176 d1 128 0 0 174 0 2 cm BI /IM true /W 128 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j \4!bJy !^>?!<0 pxZA|/^CK/&߇ 붻 pv:K` _)> W _zp\) @<@ EI endstream endobj 473 0 obj <>stream 0 0 0 61 103 176 d1 103 0 0 115 0 61 cm BI /IM true /W 103 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Dm d5J0DAx""3CA @M7& O>a<)/7&ɪozovx^۬6 v-[ %b-,X`e?l+' EI endstream endobj 474 0 obj <>stream 0 0 0 61 99 176 d1 99 0 0 115 0 61 cm BI /IM true /W 99 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k ?mj l ?UpxD faoA0&}> >[5U@?? ߇}m0 ma zI  F  EI endstream endobj 476 0 obj <>stream 0 0 0 0 56 173 d1 56 0 0 173 0 0 cm BI /IM true /W 56 /H 173 /BPC 1 /D[1 0] /F/CCF /DP<> ID P`#P4OA?[[ a@@ EI endstream endobj 477 0 obj <>stream 0 0 0 61 202 173 d1 202 0 0 112 0 61 cm BI /IM true /W 202 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID +`lMAʰW*EaL8_kk׶èua[ 4iFtuA0[ $ sN B!m50X0& @U)WAj QT@ EI endstream endobj 478 0 obj <>stream 0 0 0 62 129 174 d1 129 0 0 112 0 62 cm BI /IM true /W 129 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID +`j `TB/_^_֭୥`ois R  \@ EI endstream endobj 479 0 obj <>stream 0 0 0 17 82 176 d1 82 0 0 159 0 17 cm BI /IM true /W 82 /H 159 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u  گ<'* oW·׭~_?ƿ{~ >>} EI endstream endobj 480 0 obj <>stream 0 0 0 61 115 176 d1 115 0 0 115 0 61 cm BI /IM true /W 115 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F'6d5 04,a@N  Xx@xI7ޓz?OxIO>[ oI& _턿_io za-k z \0\2U0d5AK 2  EI endstream endobj 481 0 obj <>stream 0 0 0 61 85 176 d1 85 0 0 115 0 61 cm BI /IM true /W 85 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6 $`4d X@,A| (7 a=7M7^_ ]KZI-pq Ch`L/Z ]ia׭h.I2\"(\@rL 8]uuMU ]]0ae. pָ0AȰ'A #@ EI endstream endobj 482 0 obj <>stream 0 0 0 0 80 85 d1 80 0 0 85 0 0 cm BI /IM true /W 80 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID *+&u CP%[PU\=kK^_l2]z5u޿k i_P EI endstream endobj 483 0 obj <>stream 0 0 0 31 54 111 d1 54 0 0 80 0 31 cm BI /IM true /W 54 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A6| =>z o.Kz!\Ap B)uGL8#P(>H {7&av/^ +Ma7$ EI endstream endobj 484 0 obj <>stream 0 0 0 36 44 114 d1 44 0 0 78 0 36 cm BI /IM true /W 44 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M@AiFo \h7A [W(6^K 0l<@ EI endstream endobj 485 0 obj <>stream 0 0 0 36 44 92 d1 44 0 0 56 0 36 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h7A [W(6^K 0l<@ EI endstream endobj 486 0 obj <>stream 0 0 0 7 26 90 d1 26 0 0 83 0 7 cm BI /IM true /W 26 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID j)@_5 EI endstream endobj 487 0 obj <>stream 0 0 0 13 53 92 d1 53 0 0 79 0 13 cm BI /IM true /W 53 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,5p\%XK ]p EI endstream endobj 488 0 obj <>stream 0 0 0 7 57 90 d1 57 0 0 83 0 7 cm BI /IM true /W 57 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&k.6 ^8g~?L@ EI endstream endobj 489 0 obj <>stream 0 0 0 11 53 92 d1 53 0 0 81 0 11 cm BI /IM true /W 53 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,r?0n  EI endstream endobj 490 0 obj <>stream 0 0 0 8 35 90 d1 35 0 0 82 0 8 cm BI /IM true /W 35 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID jī  EI endstream endobj 491 0 obj <>stream 0 0 0 37 57 113 d1 57 0 0 76 0 37 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID $j)@kZ"&a0@ a}~}ׯ]k`D-.<0H2p  EI endstream endobj 492 0 obj <>stream 0 0 0 36 38 92 d1 38 0 0 56 0 36 cm BI /IM true /W 38 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0$< zÈ ap_uAY py  @ ^j P_d5ȁx20O EI endstream endobj 493 0 obj <>stream 0 0 0 61 32 69 d1 32 0 0 8 0 61 cm BI /IM true /W 32 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 494 0 obj <>stream 0 0 0 37 57 113 d1 57 0 0 76 0 37 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kk)b́-@&zM?DŽ}_/_ h/z`'y x EI endstream endobj 495 0 obj <>stream 0 0 0 37 57 92 d1 57 0 0 55 0 37 cm BI /IM true /W 57 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CAa<3 o OZ]W A5A  EI endstream endobj 496 0 obj <>stream 0 0 0 12 44 92 d1 44 0 0 80 0 12 cm BI /IM true /W 44 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ ?; =o X0 EI endstream endobj 497 0 obj <>stream 0 0 0 8 71 90 d1 71 0 0 82 0 8 cm BI /IM true /W 71 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &sDІ]xhY(|/ ?z}}|.!WV  EI endstream endobj 498 0 obj <>stream 0 0 0 6 58 90 d1 58 0 0 84 0 6 cm BI /IM true /W 58 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/4#i5h ?\/+C1 EI endstream endobj 499 0 obj <>stream 0 0 0 6 81 93 d1 81 0 0 87 0 6 cm BI /IM true /W 81 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t  85mp˄H a1>/A}A/}|koG_ aw^mwl/ v ='0 EI endstream endobj 500 0 obj <>stream 0 0 0 9 30 114 d1 30 0 0 105 0 9 cm BI /IM true /W 30 /H 105 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~wɪMk:4O~_ EI endstream endobj 501 0 obj <>stream 0 0 0 6 40 90 d1 40 0 0 84 0 6 cm BI /IM true /W 40 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\OɨC@==O 7جX0P EI endstream endobj 502 0 obj <>stream 0 0 0 8 72 90 d1 72 0 0 82 0 8 cm BI /IM true /W 72 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>DЂ <0~߃~%^ %q\.P`p~߆K z XLX࿐P  EI endstream endobj 503 0 obj <> stream 97 0 0 0 0 0 d1 endstream endobj 504 0 obj <>stream 0 0 0 38 58 90 d1 58 0 0 52 0 38 cm BI /IM true /W 58 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID %?jauM`/[ o޸iaۭoֺZxF[ՇWo ^a}C4/ EI endstream endobj 505 0 obj <>stream 0 0 0 0 78 85 d1 78 0 0 85 0 0 cm BI /IM true /W 78 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &HP#aAH7ނa_2Z4Cb EI endstream endobj 506 0 obj <>stream 0 0 0 6 72 93 d1 72 0 0 87 0 6 cm BI /IM true /W 72 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t  8< 3 @&o_I&|$ ސ}~I ?_kao[\50 W 4p EI endstream endobj 507 0 obj <>stream 0 0 0 13 27 90 d1 27 0 0 77 0 13 cm BI /IM true /W 27 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID _ɨpj' a>۽5 EI endstream endobj 508 0 obj <>stream 0 0 0 0 80 103 d1 80 0 0 103 0 0 cm BI /IM true /W 80 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID *+&u CP%[PU\=kK^_l2]z5u޿k i_XAR? D` pK,5 EI endstream endobj 509 0 obj <>stream 0 0 0 8 64 90 d1 64 0 0 82 0 8 cm BI /IM true /W 64 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?4!> cO P@ EI endstream endobj 510 0 obj <>stream 0 0 0 13 51 92 d1 51 0 0 79 0 13 cm BI /IM true /W 51 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !a|.{x}{ EI endstream endobj 511 0 obj <>stream 0 0 0 13 53 92 d1 53 0 0 79 0 13 cm BI /IM true /W 53 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,a` [P EI endstream endobj 512 0 obj <>stream 0 0 0 13 44 92 d1 44 0 0 79 0 13 cm BI /IM true /W 44 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ ?X ?v/kXm.ǵ m@@ EI endstream endobj 513 0 obj <>stream 0 0 0 11 51 92 d1 51 0 0 81 0 11 cm BI /IM true /W 51 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !a|9 A|wa7 EI endstream endobj 514 0 obj <>stream 0 0 0 0 68 82 d1 68 0 0 82 0 0 cm BI /IM true /W 68 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ț@|>P ?߆_}xAz_ (AC` EI endstream endobj 515 0 obj <> endobj 516 0 obj <>stream 0 0 0 0 115 176 d1 115 0 0 176 0 0 cm BI /IM true /W 115 /H 176 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6 6AK솑fAJ`A0\an.#P n7 O zu/}&xe~u_X.@J2şg,d  Y !,FфK.tXAaZZ;ӅxvᷔeQT+"xEL\.]'2P ?cOm EI endstream endobj 520 0 obj <>stream 0 0 0 61 129 175 d1 129 0 0 114 0 61 cm BI /IM true /W 129 /H 114 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F\3!%! Y}! 7& ^o]Bc!U&$5ƿ4@ EI endstream endobj 521 0 obj <>stream 0 0 0 8 120 175 d1 120 0 0 167 0 8 cm BI /IM true /W 120 /H 167 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S @ x 0T_ 0o MVÄa_U m oɀQ ~ *\C]o!K$ x < ?O??__[Wڮ  K[ N % i c KA W{aF[߽X}ka`6 ^  EI endstream endobj 522 0 obj <>stream 0 0 0 0 70 82 d1 70 0 0 82 0 0 cm BI /IM true /W 70 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &w Q ?AQg@ EI endstream endobj 523 0 obj <>stream 0 0 0 1 84 82 d1 84 0 0 81 0 1 cm BI /IM true /W 84 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &UCJf_fĆ+? EI endstream endobj 524 0 obj <>stream 0 0 0 -1 66 84 d1 66 0 0 85 0 -1 cm BI /IM true /W 66 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P DA'  7_~K0\y ?P EI endstream endobj 525 0 obj <>stream 0 0 0 0 73 82 d1 73 0 0 82 0 0 cm BI /IM true /W 73 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &o%__|)~}}( EI endstream endobj 526 0 obj <>stream 0 0 0 28 61 108 d1 61 0 0 80 0 28 cm BI /IM true /W 61 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!<E8a7z_]d .-E>N ȡq{:@azMڗߧvv G)`h  EI endstream endobj 527 0 obj <>stream 0 0 0 29 66 82 d1 66 0 0 53 0 29 cm BI /IM true /W 66 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID *)(:iauim[ /[Xk KF~70սoH7 ? EI endstream endobj 528 0 obj <>stream 0 0 0 0 97 84 d1 97 0 0 84 0 0 cm BI /IM true /W 97 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xCK(<zDa>y55B[s_}//_5~ 0?~/!EAB&A EI endstream endobj 529 0 obj <>stream 0 0 0 28 106 82 d1 106 0 0 54 0 28 cm BI /IM true /W 106 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M(Ђ?KtMvE`L41A_kY d00H  EI endstream endobj 530 0 obj <>stream 0 0 0 0 47 78 d1 47 0 0 78 0 0 cm BI /IM true /W 47 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A(? 1Cb? EI endstream endobj 531 0 obj <>stream 0 0 0 -4 43 78 d1 43 0 0 82 0 -4 cm BI /IM true /W 43 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID ?ā EI endstream endobj 532 0 obj <>stream 0 0 0 27 52 106 d1 52 0 0 79 0 27 cm BI /IM true /W 52 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Hoa `fC6]pK G t xA>A7 "fK삎 k K ag :@ EI endstream endobj 533 0 obj <>stream 0 0 0 0 55 78 d1 55 0 0 78 0 0 cm BI /IM true /W 55 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &of0a}o;߾k { aa.OwKU^X`ȀX`Y @@ EI endstream endobj 534 0 obj <>stream 0 0 0 28 66 105 d1 66 0 0 77 0 28 cm BI /IM true /W 66 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID #AQDxA |C  >o ?_]iD%†B)5 !Q EI endstream endobj 535 0 obj <>stream 0 0 0 4 55 84 d1 55 0 0 80 0 4 cm BI /IM true /W 55 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>Azz4 _a,.Ap. Ȁσ 'oȴNv @@~,05 EI endstream endobj 536 0 obj <>stream 0 0 0 11 39 90 d1 39 0 0 79 0 11 cm BI /IM true /W 39 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID & m||@ EI endstream endobj 537 0 obj <>stream 0 0 0 9 51 90 d1 51 0 0 81 0 9 cm BI /IM true /W 51 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Hߜ @aa{ EI endstream endobj 538 0 obj <>stream 0 0 0 8 82 93 d1 82 0 0 85 0 8 cm BI /IM true /W 82 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xnN,?h77&|0? ?_~/ @|Au37P߃~_//K,&@~8/5@ EI endstream endobj 539 0 obj <>stream 0 0 0 11 49 93 d1 49 0 0 82 0 11 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3`g*"qG|'MCIf>A .?X_u d0ΡAE8>stream 0 0 0 8 82 93 d1 82 0 0 85 0 8 cm BI /IM true /W 82 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`5?EG^O>[VP?^ׅ}o߅>~&0O?BA@ EI endstream endobj 541 0 obj <>stream 0 0 0 9 52 93 d1 52 0 0 84 0 9 cm BI /IM true /W 52 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f~a}~ݾߋ EI endstream endobj 542 0 obj <>stream 0 0 0 0 59 84 d1 59 0 0 84 0 0 cm BI /IM true /W 59 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Pf|W6߇.&_^?Ar@ EI endstream endobj 543 0 obj <>stream 0 0 0 4 55 84 d1 55 0 0 80 0 4 cm BI /IM true /W 55 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 2CzO0Ӿi׆ ty '>A'$}u^ïkl%l0aa٤@ EI endstream endobj 544 0 obj <>stream 0 0 0 8 48 93 d1 48 0 0 85 0 8 cm BI /IM true /W 48 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^B'#=`zM'訽p~7x EI endstream endobj 545 0 obj <>stream 0 0 0 8 77 90 d1 77 0 0 82 0 8 cm BI /IM true /W 77 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A+?A>  x {`KL  EI endstream endobj 546 0 obj <>stream 0 0 0 8 67 90 d1 67 0 0 82 0 8 cm BI /IM true /W 67 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &OȚᮿx^?_ׅp/Q@ EI endstream endobj 547 0 obj <>stream 0 0 0 0 60 78 d1 60 0 0 78 0 0 cm BI /IM true /W 60 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CK_&fg@~?? ߰ { EI endstream endobj 548 0 obj <>stream 0 0 0 0 55 80 d1 55 0 0 80 0 0 cm BI /IM true /W 55 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &܆> A >t 7>A7_îsRi|0_b`P?O6?om[_ ,`p EI endstream endobj 549 0 obj <>stream 0 0 0 11 49 93 d1 49 0 0 82 0 11 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A <,=W}~___>_m/`^8 _Ooo [dž V aD@ EI endstream endobj 550 0 obj <>stream 0 0 0 15 33 92 d1 33 0 0 77 0 15 cm BI /IM true /W 33 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~߇a=$Brk |@ EI endstream endobj 551 0 obj <>stream 0 0 0 7 55 92 d1 55 0 0 85 0 7 cm BI /IM true /W 55 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>aazO&~û u]u܉O? EI endstream endobj 552 0 obj <>stream 0 0 0 37 47 92 d1 47 0 0 55 0 37 cm BI /IM true /W 47 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p5><d1O6Hh.8[A@@ EI endstream endobj 553 0 obj <>stream 0 0 0 37 41 92 d1 41 0 0 55 0 37 cm BI /IM true /W 41 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?ȩxa%4~? ~_& H 81.A~@pxww߶߆uia/H EI endstream endobj 554 0 obj <>stream 0 0 0 37 51 92 d1 51 0 0 55 0 37 cm BI /IM true /W 51 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &σ xG0A} K7>L~~C{o߼?߼H5 EI endstream endobj 555 0 obj <>stream 0 0 0 7 54 92 d1 54 0 0 85 0 7 cm BI /IM true /W 54 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &σ?<#Ga~}&?ۿ?w{{]yKk|~?Z EI endstream endobj 556 0 obj <>stream 0 0 0 37 41 92 d1 41 0 0 55 0 37 cm BI /IM true /W 41 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &J?a xA}7&߿'^>d \.h:p00,z@@ EI endstream endobj 557 0 obj <> endobj 561 0 obj <>stream 0 0 0 11 49 93 d1 49 0 0 82 0 11 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H`G'>}0'_/཮ h- o[a, q년@5}>a7 _._[ - b ,0 EI endstream endobj 562 0 obj <>stream 0 0 0 11 49 93 d1 49 0 0 82 0 11 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^B |@x[" Ӧow{^! y| oQ?K_ wam+h<@ EI endstream endobj 563 0 obj <>stream 0 0 0 7 38 42 d1 38 0 0 35 0 7 cm BI /IM true /W 38 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p3pAB˜5W߻paox EI endstream endobj 564 0 obj <>stream 0 0 0 37 72 92 d1 72 0 0 55 0 37 cm BI /IM true /W 72 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A0hBk>0[ H6o6izvwow{kþok_ 4@Xaa@@ EI endstream endobj 565 0 obj <>stream 0 0 0 11 29 92 d1 29 0 0 81 0 11 cm BI /IM true /W 29 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AzO~ks_aXa@ EI endstream endobj 566 0 obj <>stream 0 0 0 7 38 42 d1 38 0 0 35 0 7 cm BI /IM true /W 38 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l0wÇ w8xp^d? kU|@ EI endstream endobj 567 0 obj <>stream 0 0 0 37 59 92 d1 59 0 0 55 0 37 cm BI /IM true /W 59 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p3O>?=?}ws_{߿߿rkv_uíxh0[C=  EI endstream endobj 568 0 obj <>stream 0 0 0 37 45 92 d1 45 0 0 55 0 37 cm BI /IM true /W 45 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ȵ  o޷{{d~o6-0.<5/H EI endstream endobj 569 0 obj <>stream 0 0 0 6 56 114 d1 56 0 0 108 0 6 cm BI /IM true /W 56 /H 108 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|6q<~|P=?͟#A|;{\1Xaa EI endstream endobj 570 0 obj <>stream 0 0 0 37 50 114 d1 50 0 0 77 0 37 cm BI /IM true /W 50 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &TA?Lm75o |p }'?>ɯ~݇{ 4 a0 EI endstream endobj 571 0 obj <>stream 0 0 0 0 55 80 d1 55 0 0 80 0 0 cm BI /IM true /W 55 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Cx |@& ?|?N ENkKpa. % 0^ /C c)f>f~l4 EI endstream endobj 572 0 obj <>stream 0 0 0 3 54 84 d1 54 0 0 81 0 3 cm BI /IM true /W 54 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0z#| 7}&5M?IC:_k.a-a`0 W!ia>ilKza-k[[Xka~ EI endstream endobj 573 0 obj <>stream 0 0 0 -2 68 82 d1 68 0 0 84 0 -2 cm BI /IM true /W 68 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!4 O#5tQ?? ߰>p+k!!@ EI endstream endobj 574 0 obj <>stream 0 0 0 29 50 82 d1 50 0 0 53 0 29 cm BI /IM true /W 50 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID MsPc ?~7~}}ko{x}~߷ow~t~_ EI endstream endobj 575 0 obj <>stream 0 0 0 0 72 85 d1 72 0 0 85 0 0 cm BI /IM true /W 72 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N# @O0A HÓU}? xp EI endstream endobj 576 0 obj <>stream 0 0 0 0 91 85 d1 91 0 0 85 0 0 cm BI /IM true /W 91 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|C Hla=<"< w4w_Xp | ؟a~]װ3׮ n  EI endstream endobj 577 0 obj <>stream 0 0 0 28 60 84 d1 60 0 0 56 0 28 cm BI /IM true /W 60 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AD&AAO?_[[޷ǻw ?{w5 pbd@C EI endstream endobj 578 0 obj <>stream 0 0 0 28 47 84 d1 47 0 0 56 0 28 cm BI /IM true /W 47 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &΁pb< z|" @Xo]߿׵\R|d' u\/@/B,?Owm[  W0H EI endstream endobj 579 0 obj <>stream 0 0 0 5 38 84 d1 38 0 0 79 0 5 cm BI /IM true /W 38 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5<'o_}߾o߿)~A5 EI endstream endobj 580 0 obj <>stream 0 0 0 28 55 84 d1 55 0 0 56 0 28 cm BI /IM true /W 55 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &߂d}p vav(1_0rp EI endstream endobj 581 0 obj <>stream 0 0 0 28 55 84 d1 55 0 0 56 0 28 cm BI /IM true /W 55 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0"\AA+ 7>oU}op4\=a !D@ EI endstream endobj 582 0 obj <>stream 0 0 0 0 55 80 d1 55 0 0 80 0 0 cm BI /IM true /W 55 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>C OC  ? }_\0Kp. `!`%iaoA7a~~_^Av *؅`a`΁@ EI endstream endobj 583 0 obj <> endobj 584 0 obj <>stream 0 0 0 0 137 171 d1 137 0 0 171 0 0 cm BI /IM true /W 137 /H 171 /BPC 1 /D[1 0] /F/CCF /DP<> ID 25jطWoA$ EI endstream endobj 588 0 obj <>stream 0 0 0 5 161 174 d1 161 0 0 169 0 5 cm BI /IM true /W 161 /H 169 /BPC 1 /D[1 0] /F/CCF /DP<> ID &v, _0YYx__׽xx^y0rf9 = EI endstream endobj 589 0 obj <>stream 0 0 0 2 128 176 d1 128 0 0 174 0 2 cm BI /IM true /W 128 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &z512F;ECSa }@O "n0- 7🴛oa???_ ]kv\0"i}%ᆗC |  dke A EI endstream endobj 590 0 obj <>stream 0 0 0 2 57 174 d1 57 0 0 172 0 2 cm BI /IM true /W 57 /H 172 /BPC 1 /D[1 0] /F/CCF /DP<> ID P`?#P4  EI endstream endobj 591 0 obj <> endobj 595 0 obj <>stream 0 0 0 5 145 174 d1 145 0 0 169 0 5 cm BI /IM true /W 145 /H 169 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;. xf }|/80C4g I+K/__K !DG@ EI endstream endobj 596 0 obj <>stream 0 0 0 8 109 90 d1 109 0 0 82 0 8 cm BI /IM true /W 109 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID *r7&C aۻh>A}?{o^}{ o<0b!!~@ EI endstream endobj 597 0 obj <> stream 42 0 0 0 0 0 d1 endstream endobj 598 0 obj <>stream 0 0 0 0 47 120 d1 47 0 0 120 0 0 cm BI /IM true /W 47 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &m~߽~߽a߽ EI endstream endobj 599 0 obj <> stream 117 0 0 0 0 0 d1 endstream endobj 600 0 obj <> endobj 601 0 obj <>stream 0 0 0 0 113 101 d1 113 0 0 101 0 0 cm BI /IM true /W 113 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x(5JDx'f [kK_K^%. 50  ~ _~}}/ׄP+u\.w0lrd ~  EI endstream endobj 605 0 obj <>stream 0 0 0 0 94 99 d1 94 0 0 99 0 0 cm BI /IM true /W 94 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!!3I 1߇ F>!__~𾾾 2 EI endstream endobj 606 0 obj <>stream 0 0 0 -1 102 101 d1 102 0 0 102 0 -1 cm BI /IM true /W 102 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &SiJ0D3 0D`e< A7|$ޓ[}|-0ISj\=턿޿ =v޷][ ޶ ApvAXb ![ !  EI endstream endobj 607 0 obj <>stream 0 0 0 0 87 102 d1 87 0 0 102 0 0 cm BI /IM true /W 87 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Pb?x@GP@0~} 0&>z_ޯ+^L Ur`7  EI endstream endobj 608 0 obj <>stream 0 0 0 3 75 102 d1 75 0 0 99 0 3 cm BI /IM true /W 75 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID %MB_C*_??"~]C4dD/  EI endstream endobj 609 0 obj <>stream 0 0 0 1 61 105 d1 61 0 0 104 0 1 cm BI /IM true /W 61 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0 `ݐ ń@ᣨWH MaO7|?PeA~_j4edu K -aDeWD4QYN, AuD"W__T__\0a{] ^'!@ EI endstream endobj 610 0 obj <>stream 0 0 0 3 108 102 d1 108 0 0 99 0 3 cm BI /IM true /W 108 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A&jM&MOM??o[I-O??o&?a o[I?@ EI endstream endobj 611 0 obj <>stream 0 0 0 0 84 85 d1 84 0 0 85 0 0 cm BI /IM true /W 84 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & =Hkב( -޿ïa/{k_߱_\f__=_5]޽ۅk_ EI endstream endobj 612 0 obj <>stream 0 0 0 22 64 87 d1 64 0 0 65 0 22 cm BI /IM true /W 64 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P>@|< P#?o_PO|-?OL `G EI endstream endobj 613 0 obj <>stream 0 0 0 22 64 85 d1 64 0 0 63 0 22 cm BI /IM true /W 64 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID & V k z {ד?@ EI endstream endobj 614 0 obj <>stream 0 0 0 21 66 87 d1 66 0 0 66 0 21 cm BI /IM true /W 66 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C n@D= }oIA}o_޿wawm- h- BXp EI endstream endobj 615 0 obj <>stream 0 0 0 22 67 87 d1 67 0 0 65 0 22 cm BI /IM true /W 67 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Hh_( ~ПOPگ?_ׯ0G @\?!_/!2x\VEA@ EI endstream endobj 616 0 obj <>stream 0 0 0 33 13 85 d1 13 0 0 52 0 33 cm BI /IM true /W 13 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ᅏk ( EI endstream endobj 617 0 obj <>stream 0 0 0 1 82 88 d1 82 0 0 87 0 1 cm BI /IM true /W 82 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &tAt[]C  o _O/^%CLOF5^ k߶ .F׆ >aO4x EI endstream endobj 618 0 obj <>stream 0 0 0 22 59 85 d1 59 0 0 63 0 22 cm BI /IM true /W 59 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P@@!?x?r? EI endstream endobj 619 0 obj <>stream 0 0 0 22 68 87 d1 68 0 0 65 0 22 cm BI /IM true /W 68 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`?'Oo _ o+ ~['VxMN`@ EI endstream endobj 620 0 obj <>stream 0 0 0 20 66 85 d1 66 0 0 65 0 20 cm BI /IM true /W 66 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?t(0 n^?]{_0 ޽w_ n޿؅_j  EI endstream endobj 621 0 obj <>stream 0 0 0 22 64 85 d1 64 0 0 63 0 22 cm BI /IM true /W 64 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &uC /a.} _A__/~_/___>(A? EI endstream endobj 622 0 obj <>stream 0 0 0 22 27 85 d1 27 0 0 63 0 22 cm BI /IM true /W 27 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &QyD@ EI endstream endobj 623 0 obj <>stream 0 0 0 3 83 88 d1 83 0 0 85 0 3 cm BI /IM true /W 83 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~h,_#aN`7nME:H^ -+_ K^/ .~@0? K25QP\ EI endstream endobj 624 0 obj <>stream 0 0 0 21 61 87 d1 61 0 0 66 0 21 cm BI /IM true /W 61 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t \< x#pa@Aނ ?OzJ_X}}0]`*x<f EI endstream endobj 625 0 obj <>stream 0 0 0 22 65 85 d1 65 0 0 63 0 22 cm BI /IM true /W 65 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &||>"}6?_z_^Kd3H EI endstream endobj 626 0 obj <>stream 0 0 0 3 121 88 d1 121 0 0 85 0 3 cm BI /IM true /W 121 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`6o`׾HZ~ }CVރ__z~ =7k?_o__kt?7 a$0@a EI endstream endobj 627 0 obj <>stream 0 0 0 22 64 85 d1 64 0 0 63 0 22 cm BI /IM true /W 64 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "QL/g4Q2 EI endstream endobj 628 0 obj <>stream 0 0 0 22 55 85 d1 55 0 0 63 0 22 cm BI /IM true /W 55 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID & C/G_ @O/__`R@ EI endstream endobj 629 0 obj <>stream 0 0 0 0 80 87 d1 80 0 0 87 0 0 cm BI /IM true /W 80 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H ) 0!px AI ނoIIao ooX(7U/]v_x[io[iak[ %!D@@ EI endstream endobj 630 0 obj <>stream 0 0 0 3 69 85 d1 69 0 0 82 0 3 cm BI /IM true /W 69 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID #a5 aP|Ge ?_ _ `(P\p EI endstream endobj 631 0 obj <>stream 0 0 0 73 13 85 d1 13 0 0 12 0 73 cm BI /IM true /W 13 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID & EI endstream endobj 632 0 obj <>stream 0 0 0 3 80 85 d1 80 0 0 82 0 3 cm BI /IM true /W 80 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID *`V@rj) x7 ~^_Kz^ׄ|f&/ I/ EI endstream endobj 633 0 obj <>stream 0 0 0 3 73 85 d1 73 0 0 82 0 3 cm BI /IM true /W 73 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID *ɨ@0h? zxK^Aq4dZxo?o|%`DBʘ( EI endstream endobj 634 0 obj <>stream 0 0 0 21 53 84 d1 53 0 0 63 0 21 cm BI /IM true /W 53 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/Ȩ F@ @@ EI endstream endobj 635 0 obj <>stream 0 0 0 1 54 88 d1 54 0 0 87 0 1 cm BI /IM true /W 54 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0`C 0E݄N8nMA_P]zfW kApatِD@4gPӮ.]D"__j}p~_]]^aB|/H0 EI endstream endobj 636 0 obj <>stream 0 0 0 38 13 90 d1 13 0 0 52 0 38 cm BI /IM true /W 13 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Mu`_` EI endstream endobj 637 0 obj <>stream 0 0 0 0 78 82 d1 78 0 0 82 0 0 cm BI /IM true /W 78 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID & szr$/_|/(_K_/_/A_Kh=" z!_ EI endstream endobj 638 0 obj <>stream 0 0 0 8 63 93 d1 63 0 0 85 0 8 cm BI /IM true /W 63 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & nL=`}~  ?{ɪ{ '~i@ EI endstream endobj 639 0 obj <>stream 0 0 0 37 48 92 d1 48 0 0 55 0 37 cm BI /IM true /W 48 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7GP"̞a}>M~~|aþz[ۭ\0^>Xa@ EI endstream endobj 640 0 obj <>stream 0 0 0 8 77 93 d1 77 0 0 85 0 8 cm BI /IM true /W 77 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &(? ? aooooz A EI endstream endobj 641 0 obj <>stream 0 0 0 37 55 92 d1 55 0 0 55 0 37 cm BI /IM true /W 55 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`O>l m/Iww!wa󃽇ᆂk ! EI endstream endobj 642 0 obj <>stream 0 0 0 7 26 92 d1 26 0 0 85 0 7 cm BI /IM true /W 26 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|zO~{M}ÇD @ EI endstream endobj 643 0 obj <>stream 0 0 0 61 30 68 d1 30 0 0 7 0 61 cm BI /IM true /W 30 /H 7 /BPC 1 /D[1 0] /F/CCF /DP<> ID _y5 EI endstream endobj 644 0 obj <>stream 0 0 0 0 41 55 d1 41 0 0 55 0 0 cm BI /IM true /W 41 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &J?GzS PPo۵j>stream 0 0 0 8 74 90 d1 74 0 0 82 0 8 cm BI /IM true /W 74 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C-l22U=v^`À EI endstream endobj 646 0 obj <>stream 0 0 0 8 53 90 d1 53 0 0 82 0 8 cm BI /IM true /W 53 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &&5???h EI endstream endobj 647 0 obj <> stream 30 0 0 0 0 0 d1 endstream endobj 648 0 obj <>stream 0 0 0 7 41 92 d1 41 0 0 85 0 7 cm BI /IM true /W 41 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & xI&oP{??v]Ǹax0^=  EI endstream endobj 649 0 obj <>stream 0 0 0 8 76 93 d1 76 0 0 85 0 8 cm BI /IM true /W 76 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h$#@ч& ok| ?-/~P )? ?o{wݿ?K]_Op )@ EI endstream endobj 650 0 obj <> stream 107 0 0 0 0 0 d1 endstream endobj 651 0 obj <> endobj 652 0 obj <>stream 0 0 0 0 158 176 d1 158 0 0 176 0 0 cm BI /IM true /W 158 /H 176 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x`-V@gMZ@yHg/E<6" 0A0x[A &x[ ޓM& ^z_W_~_WcZ_MW< [u 5avᵰam0kl. l4Qa $E\@i ᒐ = XKx0O z1@  EI endstream endobj 656 0 obj <>stream 0 0 0 62 128 222 d1 128 0 0 160 0 62 cm BI /IM true /W 128 /H 160 /BPC 1 /D[1 0] /F/CCF /DP<> ID +`yP`G ^< N?@4  L?A}0o߫? ~/_KkAhM,-Xaa.kX0Pdk ru@@ EI endstream endobj 657 0 obj <>stream 0 0 0 9 61 174 d1 61 0 0 165 0 9 cm BI /IM true /W 61 /H 165 /BPC 1 /D[1 0] /F/CCF /DP<> ID +'MA6!G&h>?|=`=h,0=۽oXkk  / EI endstream endobj 659 0 obj <>stream 0 0 0 12 91 174 d1 91 0 0 162 0 12 cm BI /IM true /W 91 /H 162 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!SV&@?MA@C4 !||?@ EI endstream endobj 660 0 obj <>stream 0 0 0 0 81 171 d1 81 0 0 171 0 0 cm BI /IM true /W 81 /H 171 /BPC 1 /D[1 0] /F/CCF /DP<> ID P A%`7 EI endstream endobj 661 0 obj <>stream 0 0 0 60 99 221 d1 99 0 0 161 0 60 cm BI /IM true /W 99 /H 161 /BPC 1 /D[1 0] /F/CCF /DP<> ID &&E_ ӕ0gd X}=^]zX%Smp\.FRo@ ~@z ނaM7'}}>'[Wk_z_&%< ~~~aal5߶ a.X1  ,/6d@@ EI endstream endobj 662 0 obj <>stream 0 0 0 1 120 175 d1 120 0 0 174 0 1 cm BI /IM true /W 120 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S @ x 0T_ 0o MVÄa_U m oɀQ ~ *\C]o!K$ x < ?O??__[Wڮ  K[ N % i cr 30da<0{ r!¶/삂= ?`0 k5 @ EI endstream endobj 663 0 obj <>stream 0 0 0 6 66 93 d1 66 0 0 87 0 6 cm BI /IM true /W 66 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0!0@h v&@o}?o y x% sX5֯]uA?_߰]ypI TiT  EI endstream endobj 664 0 obj <>stream 0 0 0 -30 51 55 d1 51 0 0 85 0 -30 cm BI /IM true /W 51 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0|?vI5\7_-K@[ Do 0{a^= _3  EI endstream endobj 665 0 obj <>stream 0 0 0 37 89 92 d1 89 0 0 55 0 37 cm BI /IM true /W 89 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p  0Aa߇wp|? 濇w{~5 ?wwϯ}[{a[ |?L:aæ & .8A B) EI endstream endobj 666 0 obj <>stream 0 0 0 0 19 120 d1 19 0 0 120 0 0 cm BI /IM true /W 19 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h'8o EI endstream endobj 667 0 obj <>stream 0 0 0 0 19 120 d1 19 0 0 120 0 0 cm BI /IM true /W 19 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' EI endstream endobj 668 0 obj <>stream 0 0 0 12 57 92 d1 57 0 0 80 0 12 cm BI /IM true /W 57 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CAa<3 o OZ]W A5A10`OX 5@@ EI endstream endobj 669 0 obj <> endobj 670 0 obj <>stream 0 0 0 0 11 83 d1 11 0 0 83 0 0 cm BI /IM true /W 11 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID & EI endstream endobj 674 0 obj <>stream 0 0 0 29 43 83 d1 43 0 0 54 0 29 cm BI /IM true /W 43 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID 'm`):m~ a5 @@ EI endstream endobj 675 0 obj <>stream 0 0 0 14 37 85 d1 37 0 0 71 0 14 cm BI /IM true /W 37 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &*~(zwBp#@ EI endstream endobj 676 0 obj <>stream 0 0 0 29 30 83 d1 30 0 0 54 0 29 cm BI /IM true /W 30 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' >>u< {ɨ( EI endstream endobj 677 0 obj <>stream 0 0 0 28 51 85 d1 51 0 0 57 0 28 cm BI /IM true /W 51 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4| @=? G7 =A}o&;? /m/] ]Xa[m~Ca EI endstream endobj 678 0 obj <>stream 0 0 0 -5 47 85 d1 47 0 0 90 0 -5 cm BI /IM true /W 47 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8lF>~C|=_->e_  .? EI endstream endobj 679 0 obj <>stream 0 0 0 30 43 85 d1 43 0 0 55 0 30 cm BI /IM true /W 43 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &#~!@' EI endstream endobj 680 0 obj <>stream 0 0 0 28 43 106 d1 43 0 0 78 0 28 cm BI /IM true /W 43 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0z~t>stream 0 0 0 7 44 85 d1 44 0 0 78 0 7 cm BI /IM true /W 44 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID & X"?_O?O~"ǿ K ^C_ Ap/~ dv 0X EI endstream endobj 682 0 obj <>stream 0 0 0 2 48 83 d1 48 0 0 81 0 2 cm BI /IM true /W 48 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0a}{}=oaax~}_ / mx0Kz bk`a`@ EI endstream endobj 683 0 obj <> endobj 687 0 obj <>stream 0 0 0 12 103 174 d1 103 0 0 162 0 12 cm BI /IM true /W 103 /H 162 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;/}~hol9o}o{}> Hk0o o ߽~{xo{{ 8t  /#`P^ :_a}vmk.Ka[g@nN ؂ Xa~A!lO EI endstream endobj 688 0 obj <>stream 0 0 0 0 176 171 d1 176 0 0 171 0 0 cm BI /IM true /W 176 /H 171 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;-ڠ-892a̸6P0R~@S, y/ ?߆~~߇oazz__z _ z_^^/K^_^ x ^@K/ QQ)Ph EI endstream endobj 692 0 obj <>stream 0 0 0 0 54 76 d1 54 0 0 76 0 0 cm BI /IM true /W 54 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@6S,:$[j  EI endstream endobj 693 0 obj <>stream 0 0 0 -3 16 76 d1 16 0 0 79 0 -3 cm BI /IM true /W 16 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &i~??j  EI endstream endobj 694 0 obj <>stream 0 0 0 24 56 100 d1 56 0 0 76 0 24 cm BI /IM true /W 56 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &.Hq<=?Ѭ0xAx[T(Oaa~p0c'uČ a΂tAzKH 5AH=  EI endstream endobj 695 0 obj <>stream 0 0 0 25 46 78 d1 46 0 0 53 0 25 cm BI /IM true /W 46 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`䋑0!Q:U EI endstream endobj 696 0 obj <>stream 0 0 0 24 32 76 d1 32 0 0 52 0 24 cm BI /IM true /W 32 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@g}o^A@ EI endstream endobj 697 0 obj <>stream 0 0 0 23 47 78 d1 47 0 0 55 0 23 cm BI /IM true /W 47 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &I_  A:5 5?ʂCr 58~\' 1@ EI endstream endobj 698 0 obj <>stream 0 0 0 3 49 76 d1 49 0 0 73 0 3 cm BI /IM true /W 49 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &i\0{{὾oo|7{{{{8Vצl0 `  @ EI endstream endobj 699 0 obj <>stream 0 0 0 63 14 76 d1 14 0 0 13 0 63 cm BI /IM true /W 14 /H 13 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 700 0 obj <>stream 0 0 0 3 43 76 d1 43 0 0 73 0 3 cm BI /IM true /W 43 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ik 8MW2|>€ EI endstream endobj 701 0 obj <>stream 0 0 0 25 14 76 d1 14 0 0 51 0 25 cm BI /IM true /W 14 /H 51 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5@ EI endstream endobj 702 0 obj <> endobj 703 0 obj <>stream 0 0 0 0 67 83 d1 67 0 0 83 0 0 cm BI /IM true /W 67 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &FJ2߃?_𾗯/P#p_T@ EI endstream endobj 707 0 obj <>stream 0 0 0 28 44 85 d1 44 0 0 57 0 28 cm BI /IM true /W 44 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &< z?5φ_wk],?[_X`@@ EI endstream endobj 708 0 obj <>stream 0 0 0 29 46 106 d1 46 0 0 77 0 29 cm BI /IM true /W 46 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' O#Mz _+YXRuXaI7  EI endstream endobj 709 0 obj <>stream 0 0 0 28 43 85 d1 43 0 0 57 0 28 cm BI /IM true /W 43 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & vN~`"߃l e\^EX0  EI endstream endobj 710 0 obj <>stream 0 0 0 29 54 109 d1 54 0 0 80 0 29 cm BI /IM true /W 54 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A6|@e>M5^k l{_hf&P>A}?Aaip׆<1&{ȉ`"i EI endstream endobj 711 0 obj <>stream 0 0 0 29 75 83 d1 75 0 0 54 0 29 cm BI /IM true /W 75 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID ';|*Z m0a$>stream 0 0 0 28 38 85 d1 38 0 0 57 0 28 cm BI /IM true /W 38 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`"ICG&!~/B]pZ5$pQɮB7-: EI endstream endobj 713 0 obj <>stream 0 0 0 5 51 83 d1 51 0 0 78 0 5 cm BI /IM true /W 51 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Pė ??߿ } EI endstream endobj 714 0 obj <>stream 0 0 0 90 24 113 d1 24 0 0 23 0 90 cm BI /IM true /W 24 /H 23 /BPC 1 /D[1 0] /F/CCF /DP<> ID &OM=<'ɪ dN EI endstream endobj 715 0 obj <>stream 0 0 0 0 64 113 d1 64 0 0 113 0 0 cm BI /IM true /W 64 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@D{j6> EI endstream endobj 716 0 obj <>stream 0 0 0 -5 165 113 d1 165 0 0 118 0 -5 cm BI /IM true /W 165 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AhOI?#''aO[ IIooaO[? aOoo &I?oaO[&? - p EI endstream endobj 717 0 obj <>stream 0 0 0 34 83 115 d1 83 0 0 81 0 34 cm BI /IM true /W 83 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kI"`^CaV<" G^ A&}>AooL?o޿5޿z a-\5il0Ka,2"~<0X0e fH5 EI endstream endobj 718 0 obj <>stream 0 0 0 35 94 113 d1 94 0 0 78 0 35 cm BI /IM true /W 94 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"r C?Zun~6P޼0ixb x`Ԇ` EI endstream endobj 719 0 obj <>stream 0 0 0 -8 42 113 d1 42 0 0 121 0 -8 cm BI /IM true /W 42 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A\_)_[Xaa EI endstream endobj 720 0 obj <>stream 0 0 0 4 59 115 d1 59 0 0 111 0 4 cm BI /IM true /W 59 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C O 7~A_z!kJMOa} EI endstream endobj 721 0 obj <>stream 0 0 0 35 66 113 d1 66 0 0 78 0 35 cm BI /IM true /W 66 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4 ? =ߔ}Xxᵸ}amIbC EI endstream endobj 722 0 obj <>stream 0 0 0 34 85 115 d1 85 0 0 81 0 34 cm BI /IM true /W 85 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?]@ A@z i h o[&;> ![~߷?Ȁ_%H\1 3 y!A'넻ׅ-,0(\x`a`ɀԐO EI endstream endobj 723 0 obj <>stream 0 0 0 35 147 113 d1 147 0 0 78 0 35 cm BI /IM true /W 147 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &KNAa;5/FtxmXk`PY@M^ 3A_ 0Y j @h EI endstream endobj 724 0 obj <>stream 0 0 0 34 74 115 d1 74 0 0 81 0 34 cm BI /IM true /W 74 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j!x" >FAo a7}_nu Hk_`kwa׿l.Km-a kqᅆ !O T@ EI endstream endobj 725 0 obj <>stream 0 0 0 -7 93 115 d1 93 0 0 122 0 -7 cm BI /IM true /W 93 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &uΠA$h7n5D~ 9.1ZI'>}}~/ׯ~kk`w  1  ]r C_` EI endstream endobj 726 0 obj <>stream 0 0 0 35 92 147 d1 92 0 0 112 0 35 cm BI /IM true /W 92 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/'!DhA!|BL>AAw/iwXMt @KHx1*Ă_X EI endstream endobj 727 0 obj <>stream 0 0 0 34 85 149 d1 85 0 0 115 0 34 cm BI /IM true /W 85 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ATlp\x@ Fa07ް^vl/dlb d0iK^g((Xf@g]_d=^FOpDHb&O[ opBw{a% m O'VHǃIC2k` EI endstream endobj 728 0 obj <>stream 0 0 0 34 61 115 d1 61 0 0 81 0 34 cm BI /IM true /W 61 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h:A> }>pM}~__׬y r "y q| 0  @ Ϣ50\z _l/5\6 \> <@ EI endstream endobj 729 0 obj <>stream 0 0 0 0 79 87 d1 79 0 0 87 0 0 cm BI /IM true /W 79 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t h<#@<AxI0>MzO0AA7kz]x]][ m[ X0 ,0 z@@ EI endstream endobj 730 0 obj <>stream 0 0 0 31 91 84 d1 91 0 0 53 0 31 cm BI /IM true /W 91 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID $I56@4ӄOK~6LX`iqdž&AP EI endstream endobj 731 0 obj <>stream 0 0 0 30 51 86 d1 51 0 0 56 0 30 cm BI /IM true /W 51 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !ax EI endstream endobj 732 0 obj <>stream 0 0 0 31 57 84 d1 57 0 0 53 0 31 cm BI /IM true /W 57 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&k.6p &C'  EI endstream endobj 733 0 obj <>stream 0 0 0 3 26 84 d1 26 0 0 81 0 3 cm BI /IM true /W 26 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID j)@_5L/ EI endstream endobj 734 0 obj <>stream 0 0 0 11 37 86 d1 37 0 0 75 0 11 cm BI /IM true /W 37 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &O?t?jd0" EI endstream endobj 735 0 obj <>stream 0 0 0 31 39 84 d1 39 0 0 53 0 31 cm BI /IM true /W 39 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID A?&=~C?Ѣa=5BN  EI endstream endobj 736 0 obj <>stream 0 0 0 30 53 86 d1 53 0 0 56 0 30 cm BI /IM true /W 53 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,( EI endstream endobj 737 0 obj <>stream 0 0 0 30 44 86 d1 44 0 0 56 0 30 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ @ EI endstream endobj 738 0 obj <>stream 0 0 0 30 38 86 d1 38 0 0 56 0 30 cm BI /IM true /W 38 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0$< zÈ ap_uAY py  @ ^j P_d5ȁx20O EI endstream endobj 739 0 obj <>stream 0 0 0 0 40 84 d1 40 0 0 84 0 0 cm BI /IM true /W 40 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\OɨC@==O 7جX0P EI endstream endobj 740 0 obj <>stream 0 0 0 32 43 84 d1 43 0 0 52 0 32 cm BI /IM true /W 43 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID c&!{o ww}>xaow EI endstream endobj 741 0 obj <>stream 0 0 0 30 44 86 d1 44 0 0 56 0 30 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h7A [W(6^K 0l<@ EI endstream endobj 742 0 obj <>stream 0 0 0 7 53 86 d1 53 0 0 79 0 7 cm BI /IM true /W 53 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,a` [P EI endstream endobj 743 0 obj <>stream 0 0 0 31 57 107 d1 57 0 0 76 0 31 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kk)b́-@&zM?DŽ}_/_ h/z`'y x EI endstream endobj 744 0 obj <>stream 0 0 0 31 57 86 d1 57 0 0 55 0 31 cm BI /IM true /W 57 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CAa<3 o OZ]W A5A  EI endstream endobj 745 0 obj <>stream 0 0 0 1 57 86 d1 57 0 0 85 0 1 cm BI /IM true /W 57 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!1T3 |@&trւb}//55ap6ix0day ] _) EI endstream endobj 746 0 obj <>stream 0 0 0 3 30 108 d1 30 0 0 105 0 3 cm BI /IM true /W 30 /H 105 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~wɪMk:4O~_ EI endstream endobj 747 0 obj <>stream 0 0 0 1 57 86 d1 57 0 0 85 0 1 cm BI /IM true /W 57 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N>D?h0A7a}?_v&/a dᣏQ0 EI endstream endobj 748 0 obj <>stream 0 0 0 30 44 108 d1 44 0 0 78 0 30 cm BI /IM true /W 44 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M@AiFo \h7A [W(6^K 0l<@ EI endstream endobj 749 0 obj <>stream 0 0 0 5 51 86 d1 51 0 0 81 0 5 cm BI /IM true /W 51 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !a|9 A|wa7 EI endstream endobj 750 0 obj <>stream 0 0 0 32 58 84 d1 58 0 0 52 0 32 cm BI /IM true /W 58 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID %?jauM`/[ o޸iaۭoֺZxF[ՇWo ^a}C4/ EI endstream endobj 751 0 obj <>stream 0 0 0 5 53 86 d1 53 0 0 81 0 5 cm BI /IM true /W 53 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,r?0n  EI endstream endobj 752 0 obj <>stream 0 0 0 31 57 107 d1 57 0 0 76 0 31 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID $j)@kZ"&a0@ a}~}ׯ]k`D-.<0H2p  EI endstream endobj 753 0 obj <>stream 0 0 0 30 54 110 d1 54 0 0 80 0 30 cm BI /IM true /W 54 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A6| =>z o.Kz!\Ap B)uGL8#P(>H {7&av/^ +Ma7$ EI endstream endobj 754 0 obj <>stream 0 0 0 72 13 84 d1 13 0 0 12 0 72 cm BI /IM true /W 13 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Mu` EI endstream endobj 755 0 obj <>stream 0 0 0 -1 80 84 d1 80 0 0 85 0 -1 cm BI /IM true /W 80 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID *+&u CP%[PU\=kK^_l2]z5u޿k i_P EI endstream endobj 756 0 obj <>stream 0 0 0 6 44 86 d1 44 0 0 80 0 6 cm BI /IM true /W 44 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ ?; =o X0 EI endstream endobj 757 0 obj <>stream 0 0 0 1 26 84 d1 26 0 0 83 0 1 cm BI /IM true /W 26 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID j)@_5 EI endstream endobj 758 0 obj <>stream 0 0 0 0 58 84 d1 58 0 0 84 0 0 cm BI /IM true /W 58 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/4#i5h ?\/+C1 EI endstream endobj 759 0 obj <>stream 0 0 0 7 51 86 d1 51 0 0 79 0 7 cm BI /IM true /W 51 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !a|.{x}{ EI endstream endobj 760 0 obj <>stream 0 0 0 55 32 63 d1 32 0 0 8 0 55 cm BI /IM true /W 32 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 761 0 obj <>stream 0 0 0 7 27 84 d1 27 0 0 77 0 7 cm BI /IM true /W 27 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID _ɨpj' a>۽5 EI endstream endobj 762 0 obj <>stream 0 0 0 72 14 107 d1 14 0 0 35 0 72 cm BI /IM true /W 14 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7{ cM~( EI endstream endobj 763 0 obj <>stream 0 0 0 1 57 84 d1 57 0 0 83 0 1 cm BI /IM true /W 57 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&k.6 ^8g~?L@ EI endstream endobj 764 0 obj <>stream 0 0 0 2 78 87 d1 78 0 0 85 0 2 cm BI /IM true /W 78 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &HP#aAH7ނa_2Z4Cb EI endstream endobj 765 0 obj <>stream 0 0 0 2 71 84 d1 71 0 0 82 0 2 cm BI /IM true /W 71 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &sDІ]xhY(|/ ?z}}|.!WV  EI endstream endobj 766 0 obj <> endobj 770 0 obj <>stream 0 0 0 28 44 85 d1 44 0 0 57 0 28 cm BI /IM true /W 44 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &< z?5φ_wk],?[_X`@@ EI endstream endobj 771 0 obj <>stream 0 0 0 29 46 106 d1 46 0 0 77 0 29 cm BI /IM true /W 46 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' O#Mz _+YXRuXaI7  EI endstream endobj 772 0 obj <>stream 0 0 0 28 51 85 d1 51 0 0 57 0 28 cm BI /IM true /W 51 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4| @=? G7 =A}o&;? /m/] ]Xa[m~Ca EI endstream endobj 773 0 obj <>stream 0 0 0 5 49 86 d1 49 0 0 81 0 5 cm BI /IM true /W 49 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 3<'AA7O&_L=xk:}{K둅⿮'J_ EI endstream endobj 774 0 obj <>stream 0 0 0 0 73 113 d1 73 0 0 113 0 0 cm BI /IM true /W 73 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;k|3`m7oo~ 3[o`o}=}?"[Ⱥ}?_U{3 P޻^m- Xa E  ,/˪  EI endstream endobj 775 0 obj <>stream 0 0 0 -5 132 116 d1 132 0 0 121 0 -5 cm BI /IM true /W 132 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x6J)hׄ'|rA_^A}zK_/ \'2\2H܃X? ?߷𗯥/1 L@7@ EI endstream endobj 776 0 obj <>stream 0 0 0 34 72 115 d1 72 0 0 81 0 34 cm BI /IM true /W 72 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u!ODA!A Oނ}o&A_ )AO{om p KaMxd @bA EI endstream endobj 777 0 obj <>stream 0 0 0 35 94 115 d1 94 0 0 80 0 35 cm BI /IM true /W 94 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j A2o> F~? M7ZW ?W( / M` EI endstream endobj 778 0 obj <>stream 0 0 0 34 72 147 d1 72 0 0 113 0 34 cm BI /IM true /W 72 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID &V 9(?kI56]pY `e xA@03a&'A7[I>stream 0 0 0 -7 85 115 d1 85 0 0 122 0 -7 cm BI /IM true /W 85 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?]@ A@z i h o[&;> ![~߷?Ȁ_%H\1 3 y!A'넻ׅ-,0(\x`a`ɀԐO4L<&>O 2/F"= 0XfԠ EI endstream endobj 780 0 obj <>stream 0 0 0 -8 65 113 d1 65 0 0 121 0 -8 cm BI /IM true /W 65 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DD6w?o ,0a<5 a2@@ EI endstream endobj 781 0 obj <>stream 0 0 0 -7 83 115 d1 83 0 0 122 0 -7 cm BI /IM true /W 83 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kI"`^CaV<" G^ A&}>AooL?o޿5޿z a-\5il0Ka,2"~<0X0e fH5׏4L<&>O 2/F"= 0XfԠ EI endstream endobj 782 0 obj <>stream 0 0 0 67 50 82 d1 50 0 0 15 0 67 cm BI /IM true /W 50 /H 15 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 783 0 obj <>stream 0 0 0 0 68 82 d1 68 0 0 82 0 0 cm BI /IM true /W 68 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ț@|>P ?߆_}xAz_ (AC` EI endstream endobj 784 0 obj <>stream 0 0 0 0 78 82 d1 78 0 0 82 0 0 cm BI /IM true /W 78 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID & szr$/_|/(_K_/_/A_Kh=" z!_ EI endstream endobj 785 0 obj <>stream 0 0 0 0 72 87 d1 72 0 0 87 0 0 cm BI /IM true /W 72 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t  8< 3 @&o_I&|$ ސ}~I ?_kao[\50 W 4p EI endstream endobj 786 0 obj <>stream 0 0 0 1 26 86 d1 26 0 0 85 0 1 cm BI /IM true /W 26 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|zO~{M}ÇD @ EI endstream endobj 787 0 obj <>stream 0 0 0 5 29 86 d1 29 0 0 81 0 5 cm BI /IM true /W 29 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AzO~ks_aXa@ EI endstream endobj 788 0 obj <>stream 0 0 0 1 41 86 d1 41 0 0 85 0 1 cm BI /IM true /W 41 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & xI&oP{??v]Ǹax0^=  EI endstream endobj 789 0 obj <>stream 0 0 0 2 76 87 d1 76 0 0 85 0 2 cm BI /IM true /W 76 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h$#@ч& ok| ?-/~P )? ?o{wݿ?K]_Op )@ EI endstream endobj 790 0 obj <>stream 0 0 0 31 51 86 d1 51 0 0 55 0 31 cm BI /IM true /W 51 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &σ xG0A} K7>L~~C{o߼?߼H5 EI endstream endobj 791 0 obj <>stream 0 0 0 31 41 86 d1 41 0 0 55 0 31 cm BI /IM true /W 41 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &J?a xA}7&߿'^>d \.h:p00,z@@ EI endstream endobj 792 0 obj <>stream 0 0 0 9 33 86 d1 33 0 0 77 0 9 cm BI /IM true /W 33 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~߇a=$Brk |@ EI endstream endobj 793 0 obj <>stream 0 0 0 31 47 86 d1 47 0 0 55 0 31 cm BI /IM true /W 47 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p5><d1O6Hh.8[A@@ EI endstream endobj 794 0 obj <>stream 0 0 0 31 45 86 d1 45 0 0 55 0 31 cm BI /IM true /W 45 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ȵ  o޷{{d~o6-0.<5/H EI endstream endobj 795 0 obj <>stream 0 0 0 0 67 101 d1 67 0 0 101 0 0 cm BI /IM true /W 67 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &, g@da=oo{x}὾_ׄ[𶔚[ {K\2\'b[_   EI endstream endobj 796 0 obj <>stream 0 0 0 84 18 101 d1 18 0 0 17 0 84 cm BI /IM true /W 18 /H 17 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 797 0 obj <>stream 0 0 0 0 60 101 d1 60 0 0 101 0 0 cm BI /IM true /W 60 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &-=?7O_| CA|z|? EI endstream endobj 798 0 obj <>stream 0 0 0 -1 19 101 d1 19 0 0 102 0 -1 cm BI /IM true /W 19 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P EI endstream endobj 799 0 obj <>stream 0 0 0 -2 19 101 d1 19 0 0 103 0 -2 cm BI /IM true /W 19 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_kRk EI endstream endobj 800 0 obj <>stream 0 0 0 -1 69 103 d1 69 0 0 104 0 -1 cm BI /IM true /W 69 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C6 =0O rx }Oo }4% Aq©/Ȧ0/? EI endstream endobj 801 0 obj <>stream 0 0 0 2 85 101 d1 85 0 0 99 0 2 cm BI /IM true /W 85 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &}p ֗~ Z_\-t kZ%ֿ ݃0^CP_ ZiIUAu vj  ^  EI endstream endobj 802 0 obj <>stream 0 0 0 34 65 103 d1 65 0 0 69 0 34 cm BI /IM true /W 65 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4@ӄCN }`)4HeHia,{]:p5x0_g EI endstream endobj 803 0 obj <>stream 0 0 0 34 55 103 d1 55 0 0 69 0 34 cm BI /IM true /W 55 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|Ȃ2'\?GDŽ q_X_ C-&C`Aq|/X%Aa.Z 0#&є]^A>]xd1_  2  EI endstream endobj 804 0 obj <>stream 0 0 0 18 51 103 d1 51 0 0 85 0 18 cm BI /IM true /W 51 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & P=:?@^?pXM~B @ EI endstream endobj 805 0 obj <>stream 0 0 0 35 44 101 d1 44 0 0 66 0 35 cm BI /IM true /W 44 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &29- ?ɯh  EI endstream endobj 806 0 obj <>stream 0 0 0 34 73 103 d1 73 0 0 69 0 34 cm BI /IM true /W 73 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DW7`O=== o }&O wm-0^=-   !  EI endstream endobj 807 0 obj <>stream 0 0 0 -6 19 114 d1 19 0 0 120 0 -6 cm BI /IM true /W 19 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h'8o EI endstream endobj 808 0 obj <>stream 0 0 0 0 53 87 d1 53 0 0 87 0 0 cm BI /IM true /W 53 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C6(~hߠ'7L>K륐kOfQ AkZ@/ 5\.ZD4_{.hxaO/|0t<@ EI endstream endobj 809 0 obj <>stream 0 0 0 2 35 84 d1 35 0 0 82 0 2 cm BI /IM true /W 35 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID jī  EI endstream endobj 810 0 obj <>stream 0 0 0 2 64 84 d1 64 0 0 82 0 2 cm BI /IM true /W 64 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?4!> cO P@ EI endstream endobj 811 0 obj <>stream 0 0 0 5 47 84 d1 47 0 0 79 0 5 cm BI /IM true /W 47 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &= f{o7{}o= >oO7 ]XzimX0 EI endstream endobj 812 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3.=X=&Oo[o\=]Xad4  EI endstream endobj 813 0 obj <>stream 0 0 0 3 51 84 d1 51 0 0 81 0 3 cm BI /IM true /W 51 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Hߜ @aa{ EI endstream endobj 814 0 obj <>stream 0 0 0 -6 19 114 d1 19 0 0 120 0 -6 cm BI /IM true /W 19 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' EI endstream endobj 815 0 obj <>stream 0 0 0 -6 28 114 d1 28 0 0 120 0 -6 cm BI /IM true /W 28 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &cXZZ -p]~p/z__a{x}{p EI endstream endobj 816 0 obj <>stream 0 0 0 -6 28 114 d1 28 0 0 120 0 -6 cm BI /IM true /W 28 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &{{|7{{??_kz_ֽaz׭uZu@ EI endstream endobj 817 0 obj <>stream 0 0 0 7 57 86 d1 57 0 0 79 0 7 cm BI /IM true /W 57 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CAa<3 o OZ]W A5A1{{>0aam@@ EI endstream endobj 818 0 obj <>stream 0 0 0 2 78 84 d1 78 0 0 82 0 2 cm BI /IM true /W 78 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &FU@Țo! ? ?oo//_^/ o%!@  EI endstream endobj 819 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H`G'>}0'_/཮ h- o[a, q년@5}>a7 _._[ - b ,0 EI endstream endobj 820 0 obj <>stream 0 0 0 5 39 84 d1 39 0 0 79 0 5 cm BI /IM true /W 39 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID & m||@ EI endstream endobj 821 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A <,=W}~___>_m/`^8 _Ooo [dž V aD@ EI endstream endobj 822 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3`g*"qG|'MCIf>A .?X_u d0ΡAE8> stream 149 0 0 0 0 0 d1 endstream endobj 824 0 obj <>stream 0 0 0 0 58 84 d1 58 0 0 84 0 0 cm BI /IM true /W 58 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/4#iP~~C KC3A EI endstream endobj 825 0 obj <>stream 0 0 0 1 55 86 d1 55 0 0 85 0 1 cm BI /IM true /W 55 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>aazO&~û u]u܉O? EI endstream endobj 826 0 obj <>stream 0 0 0 31 41 86 d1 41 0 0 55 0 31 cm BI /IM true /W 41 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?ȩxa%4~? ~_& H 81.A~@pxww߶߆uia/H EI endstream endobj 827 0 obj <>stream 0 0 0 1 54 86 d1 54 0 0 85 0 1 cm BI /IM true /W 54 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &σ?<#Ga~}&?ۿ?w{{]yKk|~?Z EI endstream endobj 828 0 obj <>stream 0 0 0 -12 28 41 d1 28 0 0 53 0 -12 cm BI /IM true /W 28 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5!{@ EI endstream endobj 830 0 obj <>stream 0 0 0 31 57 107 d1 57 0 0 76 0 31 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID !H?R'_@7~{ =ÿ ?Mv~h-iqdž ` EI endstream endobj 831 0 obj <>stream 0 0 0 0 27 46 d1 27 0 0 46 0 0 cm BI /IM true /W 27 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Mʿ|< EI endstream endobj 832 0 obj <>stream 0 0 0 13 63 82 d1 63 0 0 69 0 13 cm BI /IM true /W 63 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_F~߇!@##@ EI endstream endobj 833 0 obj <>stream 0 0 0 12 47 84 d1 47 0 0 72 0 12 cm BI /IM true /W 47 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0p'a?wr~?Xgx1 J|@ EI endstream endobj 834 0 obj <>stream 0 0 0 37 40 84 d1 40 0 0 47 0 37 cm BI /IM true /W 40 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l~6_dp?}pn~ OS @ EI endstream endobj 835 0 obj <>stream 0 0 0 37 36 84 d1 36 0 0 47 0 37 cm BI /IM true /W 36 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID & jGHz}"*d(/{o~ol,0ia Bl@ EI endstream endobj 836 0 obj <>stream 0 0 0 37 42 84 d1 42 0 0 47 0 37 cm BI /IM true /W 42 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>stream 0 0 0 12 46 84 d1 46 0 0 72 0 12 cm BI /IM true /W 46 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &<@}sz_5Ww ;]n5mp>CGxf EI endstream endobj 838 0 obj <>stream 0 0 0 37 34 84 d1 34 0 0 47 0 37 cm BI /IM true /W 34 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &> z7s0&{ t]-xXK:tA/p0KXb`  EI endstream endobj 839 0 obj <>stream 0 0 0 36 32 84 d1 32 0 0 48 0 36 cm BI /IM true /W 32 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0!_ m8 7_ PU/BX%Z8PD3kkapboN<@ EI endstream endobj 840 0 obj <>stream 0 0 0 15 47 84 d1 47 0 0 69 0 15 cm BI /IM true /W 47 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &IϟFm<,zA矠c7\?~ |ʿ!?w__A K A~AϏ䜂a[{'@ EI endstream endobj 841 0 obj <>stream 0 0 0 36 45 84 d1 45 0 0 48 0 36 cm BI /IM true /W 45 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@13PzMAXz Ow&_K_ m.ް !~( EI endstream endobj 842 0 obj <>stream 0 0 0 37 78 82 d1 78 0 0 45 0 37 cm BI /IM true /W 78 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID ȃ?jDA80PV /a.fo66L4Q / EI endstream endobj 843 0 obj <>stream 0 0 0 17 50 84 d1 50 0 0 67 0 17 cm BI /IM true /W 50 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8cAΡ 9A,d_Qh|?m@@ EI endstream endobj 844 0 obj <>stream 0 0 0 12 22 82 d1 22 0 0 70 0 12 cm BI /IM true /W 22 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID jDkɨ EI endstream endobj 845 0 obj <>stream 0 0 0 21 32 84 d1 32 0 0 63 0 21 cm BI /IM true /W 32 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A|fo_?$$}  EI endstream endobj 846 0 obj <>stream 0 0 0 15 22 82 d1 22 0 0 67 0 15 cm BI /IM true /W 22 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID jDkXQ=?0 EI endstream endobj 847 0 obj <>stream 0 0 0 37 49 102 d1 49 0 0 65 0 37 cm BI /IM true /W 49 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID /85".G? O}x_Kv4 [Rj8` EI endstream endobj 848 0 obj <>stream 0 0 0 11 51 82 d1 51 0 0 71 0 11 cm BI /IM true /W 51 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/}QLG\?o  ` EI endstream endobj 849 0 obj <>stream 0 0 0 37 50 84 d1 50 0 0 47 0 37 cm BI /IM true /W 50 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8cAΡ 9A,d_Qh EI endstream endobj 850 0 obj <>stream 0 0 0 39 50 82 d1 50 0 0 43 0 39 cm BI /IM true /W 50 /H 43 /BPC 1 /D[1 0] /F/CCF /DP<> ID #C(;m/]t0]Ktk=yOVoI׬<-d!1 EI endstream endobj 851 0 obj <>stream 0 0 0 12 49 84 d1 49 0 0 72 0 12 cm BI /IM true /W 49 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8c97>(|-| ZA~_ .a]x1^ _eҜ@ EI endstream endobj 852 0 obj <>stream 0 0 0 36 39 84 d1 39 0 0 48 0 36 cm BI /IM true /W 39 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8DFb0Iޯp%h j_ׇ_h,=a a_' EI endstream endobj 853 0 obj <>stream 0 0 0 36 38 84 d1 38 0 0 48 0 36 cm BI /IM true /W 38 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8joHxA7}&_}u!ɮ#=|0ݬ0N@ EI endstream endobj 854 0 obj <>stream 0 0 0 36 38 103 d1 38 0 0 67 0 36 cm BI /IM true /W 38 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &'hF  A8\X#⇅ aA}&@omkv B8P EI endstream endobj 855 0 obj <>stream 0 0 0 37 34 82 d1 34 0 0 45 0 37 cm BI /IM true /W 34 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID *8k |a>- `IC  EI endstream endobj 856 0 obj <>stream 0 0 0 71 12 82 d1 12 0 0 11 0 71 cm BI /IM true /W 12 /H 11 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ۂ!MPX0 EI endstream endobj 857 0 obj <>stream 0 0 0 7 18 108 d1 18 0 0 101 0 7 cm BI /IM true /W 18 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID a?  EI endstream endobj 858 0 obj <>stream 0 0 0 13 65 82 d1 65 0 0 69 0 13 cm BI /IM true /W 65 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?ek _ k_޽޻'dG EI endstream endobj 859 0 obj <>stream 0 0 0 10 67 82 d1 67 0 0 72 0 10 cm BI /IM true /W 67 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID %"zoo_߽z_=vv_=ǵk@ EI endstream endobj 860 0 obj <>stream 0 0 0 13 67 82 d1 67 0 0 69 0 13 cm BI /IM true /W 67 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID !Jjd0k{^_/BK~K_/ _/ _ KƟAA>  EI endstream endobj 861 0 obj <>stream 0 0 0 16 43 85 d1 43 0 0 69 0 16 cm BI /IM true /W 43 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D?a鿇>>Fd7IPɯ.t0im ,0  EI endstream endobj 862 0 obj <>stream 0 0 0 15 43 85 d1 43 0 0 70 0 15 cm BI /IM true /W 43 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~ao~yPa߿|]@@ EI endstream endobj 863 0 obj <>stream 0 0 0 7 17 108 d1 17 0 0 101 0 7 cm BI /IM true /W 17 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID '  EI endstream endobj 864 0 obj <> endobj 865 0 obj <>stream 0 0 0 0 67 83 d1 67 0 0 83 0 0 cm BI /IM true /W 67 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &FJ2߃?_𾗯/P#p_T@ EI endstream endobj 869 0 obj <>stream 0 0 0 30 43 85 d1 43 0 0 55 0 30 cm BI /IM true /W 43 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &#~!@' EI endstream endobj 870 0 obj <>stream 0 0 0 29 30 83 d1 30 0 0 54 0 29 cm BI /IM true /W 30 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' >>u< {ɨ( EI endstream endobj 871 0 obj <>stream 0 0 0 28 43 85 d1 43 0 0 57 0 28 cm BI /IM true /W 43 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & vN~`"߃l e\^EX0  EI endstream endobj 872 0 obj <>stream 0 0 0 28 43 106 d1 43 0 0 78 0 28 cm BI /IM true /W 43 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0z~t>stream 0 0 0 7 44 85 d1 44 0 0 78 0 7 cm BI /IM true /W 44 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID & X"?_O?O~"ǿ K ^C_ Ap/~ dv 0X EI endstream endobj 874 0 obj <>stream 0 0 0 -5 47 85 d1 47 0 0 90 0 -5 cm BI /IM true /W 47 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8lF>~C|=_->e_  .? EI endstream endobj 875 0 obj <>stream 0 0 0 29 54 109 d1 54 0 0 80 0 29 cm BI /IM true /W 54 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A6|@e>M5^k l{_hf&P>A}?Aaip׆<1&{ȉ`"i EI endstream endobj 876 0 obj <>stream 0 0 0 29 75 83 d1 75 0 0 54 0 29 cm BI /IM true /W 75 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID ';|*Z m0a$>stream 0 0 0 28 38 85 d1 38 0 0 57 0 28 cm BI /IM true /W 38 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`"ICG&!~/B]pZ5$pQɮB7-: EI endstream endobj 878 0 obj <>stream 0 0 0 2 49 86 d1 49 0 0 84 0 2 cm BI /IM true /W 49 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3.c?M}0 ?uK{ ^׆\Kf[ ߇oc a>Y |@ EI endstream endobj 879 0 obj <>stream 0 0 0 32 13 84 d1 13 0 0 52 0 32 cm BI /IM true /W 13 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Mu`_` EI endstream endobj 883 0 obj <>stream 0 0 0 -82 67 0 d1 67 0 0 82 0 -82 cm BI /IM true /W 67 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &OȚᮿx^?_ׅp/Q@ EI endstream endobj 884 0 obj <>stream 0 0 0 0 62 4 d1 62 0 0 4 0 0 cm BI /IM true /W 62 /H 4 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 885 0 obj <>stream 0 0 0 -17 37 31 d1 37 0 0 48 0 -17 cm BI /IM true /W 37 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID $MFP?X W~X0p€ EI endstream endobj 886 0 obj <>stream 0 0 0 -18 36 33 d1 36 0 0 51 0 -18 cm BI /IM true /W 36 /H 51 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0?NGu:xKAr א, @@]_kfpx EI endstream endobj 887 0 obj <>stream 0 0 0 -36 33 33 d1 33 0 0 69 0 -36 cm BI /IM true /W 33 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ax#6~OĄ^M_  EI endstream endobj 888 0 obj <>stream 0 0 0 51 67 57 d1 67 0 0 6 0 51 cm BI /IM true /W 67 /H 6 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|^MR EI endstream endobj 889 0 obj <>stream 0 0 0 -42 24 31 d1 24 0 0 73 0 -42 cm BI /IM true /W 24 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID j2'K  EI endstream endobj 890 0 obj <>stream 0 0 0 -17 55 31 d1 55 0 0 48 0 -17 cm BI /IM true /W 55 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID *&( a?F\01XaI` EI endstream endobj 891 0 obj <>stream 0 0 0 -51 25 58 d1 25 0 0 109 0 -51 cm BI /IM true /W 25 /H 109 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_KK KK]~zz/߇a@ EI endstream endobj 892 0 obj <>stream 0 0 0 20 12 31 d1 12 0 0 11 0 20 cm BI /IM true /W 12 /H 11 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ۄ/k0P EI endstream endobj 893 0 obj <>stream 0 0 0 -51 25 58 d1 25 0 0 109 0 -51 cm BI /IM true /W 25 /H 109 /BPC 1 /D[1 0] /F/CCF /DP<> ID &lo??ֿ-zz%pKK KK EI endstream endobj 894 0 obj <>stream 0 0 0 4 28 11 d1 28 0 0 7 0 4 cm BI /IM true /W 28 /H 7 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 895 0 obj <>stream 0 0 0 -27 67 34 d1 67 0 0 61 0 -27 cm BI /IM true /W 67 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6 pa<<x>x`<<0 Cᇃ4>ypY 3 .   ^A`pX@pA`pQ@@ EI endstream endobj 896 0 obj <>stream 0 0 0 -44 32 31 d1 32 0 0 75 0 -44 cm BI /IM true /W 32 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID j!X`H@@ EI endstream endobj 897 0 obj <>stream 0 0 0 -18 42 33 d1 42 0 0 51 0 -18 cm BI /IM true /W 42 /H 51 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A@' z+an]Al-a)    EI endstream endobj 898 0 obj <>stream 0 0 0 -18 49 33 d1 49 0 0 51 0 -18 cm BI /IM true /W 49 /H 51 /BPC 1 /D[1 0] /F/CCF /DP<> ID &zz i7~@ x>AFzתKK] B  EI endstream endobj 899 0 obj <>stream 0 0 0 -45 25 31 d1 25 0 0 76 0 -45 cm BI /IM true /W 25 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID j2 j&  EI endstream endobj 900 0 obj <>stream 0 0 0 -16 40 31 d1 40 0 0 47 0 -16 cm BI /IM true /W 40 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID _'2jÃowwo}~a߿mp]@ EI endstream endobj 901 0 obj <>stream 0 0 0 -45 54 33 d1 54 0 0 78 0 -45 cm BI /IM true /W 54 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`4|@~}A|mi|.}0i|0 Bx` j&  EI endstream endobj 902 0 obj <>stream 0 0 0 -18 47 33 d1 47 0 0 51 0 -18 cm BI /IM true /W 47 /H 51 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A@@Fcz I޷_ .Am[ EI endstream endobj 903 0 obj <>stream 0 0 0 -18 42 33 d1 42 0 0 51 0 -18 cm BI /IM true /W 42 /H 51 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A@' z|'M07Kﮠ ?4M?vAoXl% vKb ,8`@ EI endstream endobj 904 0 obj <>stream 0 0 0 -46 56 31 d1 56 0 0 77 0 -46 cm BI /IM true /W 56 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?3 G> >?AFxOoÇ`(O EI endstream endobj 905 0 obj <>stream 0 0 0 -44 62 31 d1 62 0 0 75 0 -44 cm BI /IM true /W 62 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID "5t k4G "? EI endstream endobj 906 0 obj <>stream 0 0 0 -16 52 33 d1 52 0 0 49 0 -16 cm BI /IM true /W 52 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\\-?>O}?A_ 8@ EI endstream endobj 907 0 obj <>stream 0 0 0 -17 54 53 d1 54 0 0 70 0 -17 cm BI /IM true /W 54 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID *7j2Ԇ)5 |S}?A|+ ~ᯯu_ 0l\01  @ EI endstream endobj 908 0 obj <>stream 0 0 0 -44 77 34 d1 77 0 0 78 0 -44 cm BI /IM true /W 77 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Xh,?nPނo[y5C ¯_z}z^ xA|.'@? z/Az^AcH@ EI endstream endobj 909 0 obj <>stream 0 0 0 -18 50 55 d1 50 0 0 73 0 -18 cm BI /IM true /W 50 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &' 7xX}>stream 0 0 0 -39 42 33 d1 42 0 0 72 0 -39 cm BI /IM true /W 42 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A@' z|'M07Kﮠ ?4M?vAoXl% vKb ,8b?G ] <6v[io[ ,6{][[[_ EI endstream endobj 911 0 obj <>stream 0 0 0 -45 54 33 d1 54 0 0 78 0 -45 cm BI /IM true /W 54 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A@973>AH<ZO~_av4mp_ x`!WC[ EI endstream endobj 912 0 obj <>stream 0 0 0 -17 55 33 d1 55 0 0 50 0 -17 cm BI /IM true /W 55 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Cj }aoz!p_ I EI endstream endobj 913 0 obj <>stream 0 0 0 -17 85 31 d1 85 0 0 48 0 -17 cm BI /IM true /W 85 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID *̫?j2P /?…4Ng[I`郮Xapb0H0@@@ EI endstream endobj 914 0 obj <>stream 0 0 0 -51 39 -3 d1 39 0 0 48 0 -51 cm BI /IM true /W 39 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &c&X6`"axAaI}oX0[ɨ1  EI endstream endobj 915 0 obj <>stream 0 0 0 -44 63 31 d1 63 0 0 75 0 -44 cm BI /IM true /W 63 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID #`5C P_|4~@=}t4(RZ EI endstream endobj 916 0 obj <>stream 0 0 0 -18 42 53 d1 42 0 0 71 0 -18 cm BI /IM true /W 42 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ND7FC* `sAIA07Kﮠ M|?\0Ȕ؅ EI endstream endobj 917 0 obj <>stream 0 0 0 -41 49 33 d1 49 0 0 74 0 -41 cm BI /IM true /W 49 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &zz i7~@ x>AFzתKK] B &3 |0a=A  EI endstream endobj 918 0 obj <>stream 0 0 0 -46 38 31 d1 38 0 0 77 0 -46 cm BI /IM true /W 38 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID & *0~MB d$;߿ adž ) EI endstream endobj 919 0 obj <>stream 0 0 0 -41 47 33 d1 47 0 0 74 0 -41 cm BI /IM true /W 47 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A@@Fcz I޷_ .Am[Ig0@a=0{C`{> P EI endstream endobj 920 0 obj <>stream 0 0 0 20 13 53 d1 13 0 0 33 0 20 cm BI /IM true /W 13 /H 33 /BPC 1 /D[1 0] /F/CCF /DP<> ID &w{|!]a EI endstream endobj 921 0 obj <>stream 0 0 0 -16 73 33 d1 73 0 0 49 0 -16 cm BI /IM true /W 73 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID &(0 4< -?O_>Vatw>Xx_U? D@ EI endstream endobj 922 0 obj <>stream 0 0 0 -46 56 31 d1 56 0 0 77 0 -46 cm BI /IM true /W 56 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?3 #MB]o7AB  EI endstream endobj 923 0 obj <>stream 0 0 0 -45 55 31 d1 55 0 0 76 0 -45 cm BI /IM true /W 55 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID *&( a?u|0 W]cQ0 EI endstream endobj 924 0 obj <>stream 0 0 0 -13 35 40 d1 35 0 0 53 0 -13 cm BI /IM true /W 35 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID kٰo߆}{xa{[^I[kmaN  EI endstream endobj 925 0 obj <>stream 0 0 0 7 53 86 d1 53 0 0 79 0 7 cm BI /IM true /W 53 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,5p\%XK ]p EI endstream endobj 926 0 obj <>stream 0 0 0 0 31 46 d1 31 0 0 46 0 0 cm BI /IM true /W 31 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID {7v߷`=?bII^ml0K+€ EI endstream endobj 927 0 obj <>stream 0 0 0 11 46 85 d1 46 0 0 74 0 11 cm BI /IM true /W 46 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`3>@l}?O¿ ?_,Ak !Arx. a. ^ D h/GP~D2㯯x_k#; ^' EI endstream endobj 928 0 obj <>stream 0 0 0 37 50 82 d1 50 0 0 45 0 37 cm BI /IM true /W 50 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Nis4-[ BQ@ EI endstream endobj 929 0 obj <>stream 0 0 0 39 38 82 d1 38 0 0 43 0 39 cm BI /IM true /W 38 /H 43 /BPC 1 /D[1 0] /F/CCF /DP<> ID _'2jþ۷ ?}<7Eaoÿm @ EI endstream endobj 930 0 obj <>stream 0 0 0 36 47 84 d1 47 0 0 48 0 36 cm BI /IM true /W 47 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &IϟFm<,zA矠c7\?~ |ʿ!?w__A K A~A EI endstream endobj 931 0 obj <>stream 0 0 0 17 45 84 d1 45 0 0 67 0 17 cm BI /IM true /W 45 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@13PzMAXz Ow&_K_ m.ް !~,!>}k EI endstream endobj 932 0 obj <>stream 0 0 0 36 46 104 d1 46 0 0 68 0 36 cm BI /IM true /W 46 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0@0|'M5L/2+Z 0z3_䏶?&  v׆a! EI endstream endobj 933 0 obj <>stream 0 0 0 17 39 84 d1 39 0 0 67 0 17 cm BI /IM true /W 39 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8DFb0Iޯp%h j_ׇ_h,=a a_'+>x`{{{ EI endstream endobj 934 0 obj <> stream 29 0 0 0 0 0 d1 endstream endobj 935 0 obj <>stream 0 0 0 37 49 102 d1 49 0 0 65 0 37 cm BI /IM true /W 49 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AsFcߠ~L}>}_5~_\0ha/z'  EI endstream endobj 936 0 obj <>stream 0 0 0 11 34 82 d1 34 0 0 71 0 11 cm BI /IM true /W 34 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &gfa> EI endstream endobj 937 0 obj <>stream 0 0 0 17 47 84 d1 47 0 0 67 0 17 cm BI /IM true /W 47 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &IϟFm<,zA矠c7\?~ |ʿ!?w__A K A~AϏ~= EI endstream endobj 938 0 obj <>stream 0 0 0 71 13 102 d1 13 0 0 31 0 71 cm BI /IM true /W 13 /H 31 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~˾c  EI endstream endobj 939 0 obj <>stream 0 0 0 16 50 84 d1 50 0 0 68 0 16 cm BI /IM true /W 50 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8cAΡ 9A,d_QhL! ziXa  EI endstream endobj 940 0 obj <>stream 0 0 0 13 66 82 d1 66 0 0 69 0 13 cm BI /IM true /W 66 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID %`\MD$7῿o~ׯ^_^L@ EI endstream endobj 941 0 obj <>stream 0 0 0 12 49 84 d1 49 0 0 72 0 12 cm BI /IM true /W 49 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &+ao7//u .yi{^ɨ EI endstream endobj 942 0 obj <>stream 0 0 0 39 48 84 d1 48 0 0 45 0 39 cm BI /IM true /W 48 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID &75}o߅XoOzi@ EI endstream endobj 943 0 obj <>stream 0 0 0 15 26 103 d1 26 0 0 88 0 15 cm BI /IM true /W 26 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4 0d.d%_'2@k @ EI endstream endobj 944 0 obj <>stream 0 0 0 57 27 63 d1 27 0 0 6 0 57 cm BI /IM true /W 27 /H 6 /BPC 1 /D[1 0] /F/CCF /DP<> ID @ EI endstream endobj 945 0 obj <> endobj 949 0 obj <>stream 0 0 0 5 49 85 d1 49 0 0 80 0 5 cm BI /IM true /W 49 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &c?|?{ܠ EI endstream endobj 950 0 obj <>stream 0 0 0 90 24 113 d1 24 0 0 23 0 90 cm BI /IM true /W 24 /H 23 /BPC 1 /D[1 0] /F/CCF /DP<> ID &OM=<'ɪ dN EI endstream endobj 951 0 obj <>stream 0 0 0 0 77 116 d1 77 0 0 116 0 0 cm BI /IM true /W 77 /H 116 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k_ _<< F`85=oI| G@@߻ɪ_p  _.Z\m(r2r2 A20}o ~w{_*_[h. ,*2 H4U EI endstream endobj 952 0 obj <>stream 0 0 0 -5 133 115 d1 133 0 0 120 0 -5 cm BI /IM true /W 133 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f ??'5^[~J_o҇}+_^[~oV_}Jo}+~@`"  EI endstream endobj 953 0 obj <>stream 0 0 0 -7 43 113 d1 43 0 0 120 0 -7 cm BI /IM true /W 43 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A\?@ EI endstream endobj 954 0 obj <>stream 0 0 0 36 71 113 d1 71 0 0 77 0 36 cm BI /IM true /W 71 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pQ!_>m~}C0nm߈ EI endstream endobj 955 0 obj <>stream 0 0 0 2 77 84 d1 77 0 0 82 0 2 cm BI /IM true /W 77 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A+?A>  x {`KL  EI endstream endobj 956 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^B |@x[" Ӧow{^! y| oQ?K_ wam+h<@ EI endstream endobj 957 0 obj <>stream 0 0 0 55 30 62 d1 30 0 0 7 0 55 cm BI /IM true /W 30 /H 7 /BPC 1 /D[1 0] /F/CCF /DP<> ID _y5 EI endstream endobj 958 0 obj <>stream 0 0 0 31 89 86 d1 89 0 0 55 0 31 cm BI /IM true /W 89 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p  0Aa߇wp|? 濇w{~5 ?wwϯ}[{a[ |?L:aæ & .8A B) EI endstream endobj 959 0 obj <>stream 0 0 0 -13 35 42 d1 35 0 0 55 0 -13 cm BI /IM true /W 35 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ix#‡ ނowMu K ooN< /_[il  EI endstream endobj 960 0 obj <>stream 0 0 0 31 48 86 d1 48 0 0 55 0 31 cm BI /IM true /W 48 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7GP"̞a}>M~~|aþz[ۭ\0^>Xa@ EI endstream endobj 961 0 obj <>stream 0 0 0 31 59 86 d1 59 0 0 55 0 31 cm BI /IM true /W 59 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p3O>?=?}ws_{߿߿rkv_uíxh0[C=  EI endstream endobj 962 0 obj <>stream 0 0 0 72 19 107 d1 19 0 0 35 0 72 cm BI /IM true /W 19 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0 Too>=0 EI endstream endobj 963 0 obj <>stream 0 0 0 6 53 86 d1 53 0 0 80 0 6 cm BI /IM true /W 53 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &σ xG0A} K7>L~{?~ {~k  4_|>x7{P EI endstream endobj 964 0 obj <>stream 0 0 0 1 51 86 d1 51 0 0 85 0 1 cm BI /IM true /W 51 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0|?vI5\7_-K@[ Do 0{a^= _3  EI endstream endobj 965 0 obj <>stream 0 0 0 31 41 86 d1 41 0 0 55 0 31 cm BI /IM true /W 41 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &J?GzS PPo۵j>stream 0 0 0 7 53 86 d1 53 0 0 79 0 7 cm BI /IM true /W 53 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,!׵v[io av] k@ EI endstream endobj 967 0 obj <>stream 0 0 0 0 31 48 d1 31 0 0 48 0 0 cm BI /IM true /W 31 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID & xG~wo]?Y^Py{͗0K!~8P EI endstream endobj 968 0 obj <>stream 0 0 0 13 69 85 d1 69 0 0 72 0 13 cm BI /IM true /W 69 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l?|}oa~  [A·oa}B~D8Hn@ EI endstream endobj 969 0 obj <> endobj 973 0 obj <>stream 0 0 0 2 49 86 d1 49 0 0 84 0 2 cm BI /IM true /W 49 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3`Gp`|'>m/ Aam- q`aAOo&}oIzm.aa[X`Y |@ EI endstream endobj 975 0 obj <>/Length 233>>stream x `E{P{xۊq-Ab |m#cxZ(6h,q>R1t]m4Mr9 h=|pI:ͯiaqVFHJyi~NʲyUCiwʃmQ%>cnTv&HA>%«a*{q޽=s{$# {챷 vV endstream endobj 976 0 obj <>/Length 156>>stream x `2-BJEheF04!7wQΙ?^y9B`nZ[kgkR}<2WJ("%TKq(}N|zK'oGvH||9с!˻7Wy+à endstream endobj 977 0 obj <>/Length 177>>stream x f!Dgn!t9SC jH rb{챷R a3hj !̻x56NIR]1IlPJ ǜzOJg7@iMeX;:U=6yc=ػ) endstream endobj 979 0 obj <>stream 0 0 0 0 54 76 d1 54 0 0 76 0 0 cm BI /IM true /W 54 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@6S,:$[j  EI endstream endobj 980 0 obj <>stream 0 0 0 -3 16 76 d1 16 0 0 79 0 -3 cm BI /IM true /W 16 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &i~??j  EI endstream endobj 981 0 obj <>stream 0 0 0 24 56 100 d1 56 0 0 76 0 24 cm BI /IM true /W 56 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &.Hq<=?Ѭ0xAx[T(Oaa~p0c'uČ a΂tAzKH 5AH=  EI endstream endobj 982 0 obj <>stream 0 0 0 25 46 78 d1 46 0 0 53 0 25 cm BI /IM true /W 46 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`䋑0!Q:U EI endstream endobj 983 0 obj <>stream 0 0 0 24 32 76 d1 32 0 0 52 0 24 cm BI /IM true /W 32 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@g}o^A@ EI endstream endobj 984 0 obj <>stream 0 0 0 23 47 78 d1 47 0 0 55 0 23 cm BI /IM true /W 47 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &I_  A:5 5?ʂCr 58~\' 1@ EI endstream endobj 985 0 obj <>stream 0 0 0 3 49 76 d1 49 0 0 73 0 3 cm BI /IM true /W 49 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &i\0{{὾oo|7{{{{8Vצl0 `  @ EI endstream endobj 986 0 obj <>stream 0 0 0 63 14 76 d1 14 0 0 13 0 63 cm BI /IM true /W 14 /H 13 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 987 0 obj <>stream 0 0 0 25 14 76 d1 14 0 0 51 0 25 cm BI /IM true /W 14 /H 51 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5@ EI endstream endobj 988 0 obj <>stream 0 0 0 -6 48 79 d1 48 0 0 85 0 -6 cm BI /IM true /W 48 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^B'#=`zM'訽p~7x EI endstream endobj 989 0 obj <> endobj 990 0 obj <> endobj 991 0 obj <>stream 0 0 0 0 158 176 d1 158 0 0 176 0 0 cm BI /IM true /W 158 /H 176 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x`-V@gMZ@yHg/E<6" 0A0x[A &x[ ޓM& ^z_W_~_WcZ_MW< [u 5avᵰam0kl. l4Qa $E\@i ᒐ = XKx0O z1@  EI endstream endobj 995 0 obj <>stream 0 0 0 60 120 175 d1 120 0 0 115 0 60 cm BI /IM true /W 120 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S @ x 0T_ 0o MVÄa_U m oɀQ ~ *\C]o!K$ x < ?O??__[Wڮ  K[ N % i @@ EI endstream endobj 996 0 obj <>stream 0 0 0 61 128 221 d1 128 0 0 160 0 61 cm BI /IM true /W 128 /H 160 /BPC 1 /D[1 0] /F/CCF /DP<> ID +`yP`G ^< N?@4  L?A}0o߫? ~/_KkAhM,-Xaa.kX0Pdk ru@@ EI endstream endobj 997 0 obj <>stream 0 0 0 8 61 173 d1 61 0 0 165 0 8 cm BI /IM true /W 61 /H 165 /BPC 1 /D[1 0] /F/CCF /DP<> ID +'MA6!G&h>?|=`=h,0=۽oXkk  / EI endstream endobj 998 0 obj <>stream 0 0 0 16 82 175 d1 82 0 0 159 0 16 cm BI /IM true /W 82 /H 159 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u  گ<'* oW·׭~_?ƿ{~ >>} EI endstream endobj 999 0 obj <>stream 0 0 0 61 129 175 d1 129 0 0 114 0 61 cm BI /IM true /W 129 /H 114 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F\3!%! Y}! 7& ^o]Bc!U&$5ƿ4@ EI endstream endobj 1000 0 obj <>stream 0 0 0 1 57 173 d1 57 0 0 172 0 1 cm BI /IM true /W 57 /H 172 /BPC 1 /D[1 0] /F/CCF /DP<> ID P`?#P4  EI endstream endobj 1001 0 obj <>stream 0 0 0 60 115 175 d1 115 0 0 115 0 60 cm BI /IM true /W 115 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F'6d5 04,a@N  Xx@xI7ޓz?OxIO>[ oI& _턿_io za-k z \0\2U0d5AK 2  EI endstream endobj 1002 0 obj <>stream 0 0 0 11 108 176 d1 108 0 0 165 0 11 cm BI /IM true /W 108 /H 165 /BPC 1 /D[1 0] /F/CCF /DP<> ID &FK2jA6D`.Ax" ށSz xH0}|;O ] 1/_/ׯKKAu@ZX X\ʌX/ȸjh7y B<0a{>߫_|/_V`%놻~- aAr0 @uXd3!APD@ EI endstream endobj 1003 0 obj <>stream 0 0 0 0 176 171 d1 176 0 0 171 0 0 cm BI /IM true /W 176 /H 171 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;-ڠ-892a̸6P0R~@S, y/ ?߆~~߇oazz__z _ z_^^/K^_^ x ^@K/ QQ)Ph EI endstream endobj 1004 0 obj <>stream 0 0 0 58 103 173 d1 103 0 0 115 0 58 cm BI /IM true /W 103 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Dm d5J0DAx""3CA @M7& O>a<)/7&ɪozovx^۬6 v-[ %b-,X`e?l+' EI endstream endobj 1005 0 obj <>stream 0 0 0 61 91 173 d1 91 0 0 112 0 61 cm BI /IM true /W 91 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &aMAf# '?P 8~l7 s IH20 Ӄ EI endstream endobj 1006 0 obj <>stream 0 0 0 60 99 221 d1 99 0 0 161 0 60 cm BI /IM true /W 99 /H 161 /BPC 1 /D[1 0] /F/CCF /DP<> ID &&E_ ӕ0gd X}=^]zX%Smp\.FRo@ ~@z ނaM7'}}>'[Wk_z_&%< ~~~aal5߶ a.X1  ,/6d@@ EI endstream endobj 1007 0 obj <>stream 0 0 0 1 120 175 d1 120 0 0 174 0 1 cm BI /IM true /W 120 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S @ x 0T_ 0o MVÄa_U m oɀQ ~ *\C]o!K$ x < ?O??__[Wڮ  K[ N % i cr 30da<0{ r!¶/삂= ?`0 k5 @ EI endstream endobj 1008 0 obj <>stream 0 0 0 1 128 175 d1 128 0 0 174 0 1 cm BI /IM true /W 128 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j \4!bJy !^>?!<0 pxZA|/^CK/&߇ 붻 pv:K` _)> W _zp\) @<@ EI endstream endobj 1009 0 obj <>stream 0 0 0 60 118 224 d1 118 0 0 164 0 60 cm BI /IM true /W 118 /H 164 /BPC 1 /D[1 0] /F/CCF /DP<> ID &L'26k! 0j/"X= `7>zL=oA7 oaD0޽>oM0Dfh f Bba d4_Sԯ  EI endstream endobj 1010 0 obj <>stream 0 0 0 61 202 173 d1 202 0 0 112 0 61 cm BI /IM true /W 202 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID +`lMAʰW*EaL8_kk׶èua[ 4iFtuA0[ $ sN B!m50X0& @U)WAj QT@ EI endstream endobj 1011 0 obj <>stream 0 0 0 60 85 175 d1 85 0 0 115 0 60 cm BI /IM true /W 85 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6 $`4d X@,A| (7 a=7M7^_ ]KZI-pq Ch`L/Z ]ia׭h.I2\"(\@rL 8]uuMU ]]0ae. pָ0AȰ'A #@ EI endstream endobj 1012 0 obj <>stream 0 0 0 2 110 176 d1 110 0 0 174 0 2 cm BI /IM true /W 110 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &KĆX`\ |8#ez ޓI No _^׵<N EI endstream endobj 1013 0 obj <>stream 0 0 0 62 127 175 d1 127 0 0 113 0 62 cm BI /IM true /W 127 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Vh?OM}[xV>o}+V?J0oA_P[[xV>վ}o[~JD5 EI endstream endobj 1014 0 obj <>stream 0 0 0 2 95 84 d1 95 0 0 82 0 2 cm BI /IM true /W 95 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID & |`0[A? F[I- ?ooH0o[ I,OA@ EI endstream endobj 1015 0 obj <>stream 0 0 0 32 56 108 d1 56 0 0 76 0 32 cm BI /IM true /W 56 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3@~ ŷo ? |'[}a-}o[oL   EI endstream endobj 1016 0 obj <>stream 0 0 0 31 50 108 d1 50 0 0 77 0 31 cm BI /IM true /W 50 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &TA?Lm75o |p }'?>ɯ~݇{ 4 a0 EI endstream endobj 1017 0 obj <>stream 0 0 0 -6 82 79 d1 82 0 0 85 0 -6 cm BI /IM true /W 82 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`5?EG^O>[VP?^ׅ}o߅>~&0O?BA@ EI endstream endobj 1018 0 obj <>stream 0 0 0 2 82 84 d1 82 0 0 82 0 2 cm BI /IM true /W 82 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &R c0}|//K }/__ |/.7h/k^a{ko`a~5!?@ EI endstream endobj 1019 0 obj <>stream 0 0 0 2 63 87 d1 63 0 0 85 0 2 cm BI /IM true /W 63 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & nL=`}~  ?{ɪ{ '~i@ EI endstream endobj 1021 0 obj <>stream 0 0 0 2 83 84 d1 83 0 0 82 0 2 cm BI /IM true /W 83 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID TH( @; `ov0m{߿p7o}[]p/]8_ g EI endstream endobj 1022 0 obj <>stream 0 0 0 2 93 84 d1 93 0 0 82 0 2 cm BI /IM true /W 93 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID #@HɨB@4k]w_K /~uteM/ ^׿5~ ߰a~}߷ ?a>3B@ EI endstream endobj 1023 0 obj <> endobj 1027 0 obj <>stream 0 0 0 0 41 86 d1 41 0 0 86 0 0 cm BI /IM true /W 41 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ĉ_i0A: EI endstream endobj 1028 0 obj <>stream 0 0 0 30 49 83 d1 49 0 0 53 0 30 cm BI /IM true /W 49 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A D ~o}o ߯o[V0  EI endstream endobj 1029 0 obj <>stream 0 0 0 2 41 83 d1 41 0 0 81 0 2 cm BI /IM true /W 41 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\Cɨ_0> EI endstream endobj 1030 0 obj <>stream 0 0 0 2 49 86 d1 49 0 0 84 0 2 cm BI /IM true /W 49 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3.C.z7o?7Okv_5ip[ q Y  EI endstream endobj 1031 0 obj <>stream 0 0 0 7 44 86 d1 44 0 0 79 0 7 cm BI /IM true /W 44 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ ?X ?v/kXm.ǵ m@@ EI endstream endobj 1032 0 obj <>stream 0 0 0 2 77 87 d1 77 0 0 85 0 2 cm BI /IM true /W 77 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &(? ? aooooz A EI endstream endobj 1033 0 obj <>stream 0 0 0 31 55 86 d1 55 0 0 55 0 31 cm BI /IM true /W 55 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`O>l m/Iww!wa󃽇ᆂk ! EI endstream endobj 1034 0 obj <>stream 0 0 0 2 109 84 d1 109 0 0 82 0 2 cm BI /IM true /W 109 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID *r7&C aۻh>A}?{o^}{ o<0b!!~@ EI endstream endobj 1035 0 obj <>stream 0 0 0 2 77 84 d1 77 0 0 82 0 2 cm BI /IM true /W 77 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID #@5H{]"@܃saow_K^_ !O EI endstream endobj 1036 0 obj <>stream 0 0 0 0 73 108 d1 73 0 0 108 0 0 cm BI /IM true /W 73 /H 108 /BPC 1 /D[1 0] /F/CCF /DP<> ID &| !&0߿ џ #}x|7_{q~!/m72 /} 0v!`2 EI endstream endobj 1037 0 obj <>stream 0 0 0 2 53 84 d1 53 0 0 82 0 2 cm BI /IM true /W 53 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &&5???h EI endstream endobj 1038 0 obj <>stream 0 0 0 0 56 108 d1 56 0 0 108 0 0 cm BI /IM true /W 56 /H 108 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|6q<~|P=?͟#A|;{\1Xaa EI endstream endobj 1039 0 obj <>stream 0 0 0 0 64 113 d1 64 0 0 113 0 0 cm BI /IM true /W 64 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@D{j6> EI endstream endobj 1040 0 obj <>stream 0 0 0 -5 79 116 d1 79 0 0 121 0 -5 cm BI /IM true /W 79 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ܧ y~AHez: apM 7߇޿w_{  EI endstream endobj 1041 0 obj <>stream 0 0 0 -4 115 113 d1 115 0 0 117 0 -4 cm BI /IM true /W 115 /H 117 /BPC 1 /D[1 0] /F/CCF /DP<> ID &+llԚ z^=>stream 0 0 0 -5 58 113 d1 58 0 0 118 0 -5 cm BI /IM true /W 58 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C9@ EI endstream endobj 1043 0 obj <>stream 0 0 0 5 47 87 d1 47 0 0 82 0 5 cm BI /IM true /W 47 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@h0H#1x0oM޿ S]?~G{_vFc !yͯ|(|(@ EI endstream endobj 1044 0 obj <>stream 0 0 0 0 74 82 d1 74 0 0 82 0 0 cm BI /IM true /W 74 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C-l22U=v^`À EI endstream endobj 1045 0 obj <> endobj 1053 0 obj <>stream 0 0 0 3 50 79 d1 50 0 0 76 0 3 cm BI /IM true /W 50 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@<' 3qu P!{{q?M{ . ao_ C8p EI endstream endobj 1054 0 obj <>stream 0 0 0 3 43 76 d1 43 0 0 73 0 3 cm BI /IM true /W 43 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ik 8MW2|>€ EI endstream endobj 1055 0 obj <>stream 0 0 0 2 82 87 d1 82 0 0 85 0 2 cm BI /IM true /W 82 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xnN,?h77&|0? ?_~/ @|Au37P߃~_//K,&@~8/5@ EI endstream endobj 1056 0 obj <>stream 0 0 0 13 43 85 d1 43 0 0 72 0 13 cm BI /IM true /W 43 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &I#PG=[oIh x5׵ 8 EI endstream endobj 1057 0 obj <>stream 0 0 0 13 84 82 d1 84 0 0 69 0 13 cm BI /IM true /W 84 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID !OɩCb0`i?OOoOMM?c!2\7? EI endstream endobj 1058 0 obj <>stream 0 0 0 13 32 82 d1 32 0 0 69 0 13 cm BI /IM true /W 32 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID jă @ EI endstream endobj 1059 0 obj <>stream 0 0 0 11 51 82 d1 51 0 0 71 0 11 cm BI /IM true /W 51 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/},Gf??O K ,t@@ EI endstream endobj 1060 0 obj <>stream 0 0 0 15 45 84 d1 45 0 0 69 0 15 cm BI /IM true /W 45 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@13PzMAXz Ow&_K_ m.ް !~,#r O |^m o`P EI endstream endobj 1061 0 obj <>stream 0 0 0 18 39 84 d1 39 0 0 66 0 18 cm BI /IM true /W 39 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8DFb0Iޯp%h j_ׇ_h,=a a_' va-m {][[  EI endstream endobj 1062 0 obj <> endobj 1066 0 obj <>stream 0 0 0 2 48 83 d1 48 0 0 81 0 2 cm BI /IM true /W 48 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0a}{}=oaax~}_ / mx0Kz bk`a`@ EI endstream endobj 1067 0 obj <>stream 0 0 0 2 72 84 d1 72 0 0 82 0 2 cm BI /IM true /W 72 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>DЂ <0~߃~%^ %q\.P`p~߆K z XLX࿐P  EI endstream endobj 1068 0 obj <>stream 0 0 0 2 79 84 d1 79 0 0 82 0 2 cm BI /IM true /W 79 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID !@U0p!@7{Ga ߾?}oo߽kz^\V\6e>0oݿ{7X}./u^   EI endstream endobj 1069 0 obj <>stream 0 0 0 2 78 84 d1 78 0 0 82 0 2 cm BI /IM true /W 78 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ți ( ??8 EI endstream endobj 1070 0 obj <>stream 0 0 0 72 13 84 d1 13 0 0 12 0 72 cm BI /IM true /W 13 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A  EI endstream endobj 1072 0 obj <>stream 0 0 0 1 38 36 d1 38 0 0 35 0 1 cm BI /IM true /W 38 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p3pAB˜5W߻paox EI endstream endobj 1073 0 obj <>stream 0 0 0 1 38 36 d1 38 0 0 35 0 1 cm BI /IM true /W 38 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l0wÇ w8xp^d? kU|@ EI endstream endobj 1074 0 obj <> endobj 1078 0 obj <>stream 0 0 0 2 49 86 d1 49 0 0 84 0 2 cm BI /IM true /W 49 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &38>h7\__Z %Y u"a7{Z v %`[ Y  EI endstream endobj 1079 0 obj <>stream 0 0 0 11 48 86 d1 48 0 0 75 0 11 cm BI /IM true /W 48 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Q@@t@ BM>[P EI endstream endobj 1080 0 obj <>stream 0 0 0 11 56 86 d1 56 0 0 75 0 11 cm BI /IM true /W 56 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\ =?Ooa o [Aqi5I EI endstream endobj 1081 0 obj <>stream 0 0 0 11 58 84 d1 58 0 0 73 0 11 cm BI /IM true /W 58 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Ӌ MR l&Sf_?OOO?:yO T[M@@ EI endstream endobj 1082 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &&O ᭬zW1z5Xj  EI endstream endobj 1083 0 obj <>stream 0 0 0 11 43 84 d1 43 0 0 73 0 11 cm BI /IM true /W 43 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Zqy5AӋɮ EI endstream endobj 1084 0 obj <>stream 0 0 0 86 49 95 d1 49 0 0 9 0 86 cm BI /IM true /W 49 /H 9 /BPC 1 /D[1 0] /F/CCF /DP<> ID &? EI endstream endobj 1085 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &cɪȔ!O1Oh ׏AS ɪ EI endstream endobj 1086 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4CAk__/_/qIMt@ EI endstream endobj 1087 0 obj <>stream 0 0 0 9 52 86 d1 52 0 0 77 0 9 cm BI /IM true /W 52 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID & x xAao[ AC]]pak[ao0d0O  EI endstream endobj 1088 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kJ˧΢.“]@@ EI endstream endobj 1089 0 obj <>stream 0 0 0 9 54 84 d1 54 0 0 75 0 9 cm BI /IM true /W 54 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N  ɮPzp=a4_aA]kb@ EI endstream endobj 1090 0 obj <>stream 0 0 0 9 49 86 d1 49 0 0 77 0 9 cm BI /IM true /W 49 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CcA>k ??]z,X̃ptK-@E8uZ\.Ԇg}5w"ɏO!_@ EI endstream endobj 1091 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ɮD wC3?̩Qڀ EI endstream endobj 1092 0 obj <>stream 0 0 0 9 49 86 d1 49 0 0 77 0 9 cm BI /IM true /W 49 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &'@< A? zi}v+  EI endstream endobj 1093 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ;&GB߃~~_ /_ b%*T( EI endstream endobj 1094 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &MPMdt ^ 9xTP EI endstream endobj 1095 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3qiMRk 9f>_/ /{^ ?ooY Wqw&Va@@ EI endstream endobj 1096 0 obj <>stream 0 0 0 0 78 87 d1 78 0 0 87 0 0 cm BI /IM true /W 78 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &r<"@}0 xH7I[V7߰h >|0|2@WkyD8 EI endstream endobj 1097 0 obj <>stream 0 0 0 5 45 108 d1 45 0 0 103 0 5 cm BI /IM true /W 45 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f Paܚ~&?wouX0X  EI endstream endobj 1098 0 obj <>stream 0 0 0 104 67 110 d1 67 0 0 6 0 104 cm BI /IM true /W 67 /H 6 /BPC 1 /D[1 0] /F/CCF /DP<> ID & EI endstream endobj 1099 0 obj <>stream 0 0 0 31 72 86 d1 72 0 0 55 0 31 cm BI /IM true /W 72 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A0hBk>0[ H6o6izvwow{kþok_ 4@Xaa@@ EI endstream endobj 1100 0 obj <>stream 0 0 0 2 107 87 d1 107 0 0 85 0 2 cm BI /IM true /W 107 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &͆$?~; (_??>7~}CO}xc{ iA!@`'>  EI endstream endobj 1101 0 obj <>stream 0 0 0 1 31 94 d1 31 0 0 93 0 1 cm BI /IM true /W 31 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &]a:ZZ-ZuֽatZ__&?{{}=?5 EI endstream endobj 1102 0 obj <>stream 0 0 0 1 31 94 d1 31 0 0 93 0 1 cm BI /IM true /W 31 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &.!Mw{὾߇o~_~ֽk]axZ֖-.&P EI endstream endobj 1103 0 obj <>stream 0 0 0 9 39 112 d1 39 0 0 103 0 9 cm BI /IM true /W 39 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C@==(ڿ0O?N 4?@ EI endstream endobj 1104 0 obj <>stream 0 0 0 30 55 86 d1 55 0 0 56 0 30 cm BI /IM true /W 55 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AF2ukCtpc]~ k x|Σ a?4G_^ -X`@ EI endstream endobj 1105 0 obj <>stream 0 0 0 32 56 84 d1 56 0 0 52 0 32 cm BI /IM true /W 56 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\ O[?&oo[[0N,'5H5M@@ EI endstream endobj 1106 0 obj <>stream 0 0 0 1 46 94 d1 46 0 0 93 0 1 cm BI /IM true /W 46 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k5O߿o~ ?߿?o~o߿~o{P EI endstream endobj 1107 0 obj <>stream 0 0 0 11 47 84 d1 47 0 0 73 0 11 cm BI /IM true /W 47 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Zqy5Kk!ɪ@@ EI endstream endobj 1108 0 obj <>stream 0 0 0 31 58 84 d1 58 0 0 53 0 31 cm BI /IM true /W 58 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P(Za8&5JO k ]*bɪ_ b ( EI endstream endobj 1109 0 obj <>stream 0 0 0 31 56 113 d1 56 0 0 82 0 31 cm BI /IM true /W 56 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$0?kt & |. o\{_pguG`}A}o_"Gj|0N `P EI endstream endobj 1110 0 obj <>stream 0 0 0 11 56 86 d1 56 0 0 75 0 11 cm BI /IM true /W 56 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H>CA0|_q @7^z`W !׬& EI endstream endobj 1111 0 obj <>stream 0 0 0 30 48 86 d1 48 0 0 56 0 30 cm BI /IM true /W 48 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@@t ޾z}<%u֣*7_il/ /[_hD@ EI endstream endobj 1112 0 obj <>stream 0 0 0 30 45 86 d1 45 0 0 56 0 30 cm BI /IM true /W 45 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID & D@OA=Fz:~&|}ɪAm{5᭯X0gP EI endstream endobj 1113 0 obj <>stream 0 0 0 18 50 86 d1 50 0 0 68 0 18 cm BI /IM true /W 50 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &` zz@xD? ,)( EI endstream endobj 1114 0 obj <> endobj 1118 0 obj <>stream 0 0 0 5 51 83 d1 51 0 0 78 0 5 cm BI /IM true /W 51 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Pė ??߿ } EI endstream endobj 1119 0 obj <>stream 0 0 0 -5 103 113 d1 103 0 0 118 0 -5 cm BI /IM true /W 103 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g/C/ /_%/}|/ A&V? EI endstream endobj 1120 0 obj <>stream 0 0 0 36 91 115 d1 91 0 0 79 0 36 cm BI /IM true /W 91 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|6?Jҿ>߅~[վ׭A_V CA_JO ɀ EI endstream endobj 1121 0 obj <>stream 0 0 0 2 91 84 d1 91 0 0 82 0 2 cm BI /IM true /W 91 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID #Ahj0̴w?~wǿ7{ÿƈA EI endstream endobj 1122 0 obj <>stream 0 0 0 2 91 84 d1 91 0 0 82 0 2 cm BI /IM true /W 91 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID *4oR! / ^i._߰O_|?_OP+_?|$pd + EI endstream endobj 1123 0 obj <>stream 0 0 0 0 80 82 d1 80 0 0 82 0 0 cm BI /IM true /W 80 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A(ro߾o4_߿^wx__ / _ EI endstream endobj 1124 0 obj <>stream 0 0 0 0 76 87 d1 76 0 0 87 0 0 cm BI /IM true /W 76 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &R #AA H0} 7V_տޡo ?[~~imkAa ,0ipdR0 , EI endstream endobj 1125 0 obj <>stream 0 0 0 31 49 86 d1 49 0 0 55 0 31 cm BI /IM true /W 49 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g< {{h?3  >>oooaxoo}a{y oC#> ! &w @ EI endstream endobj 1126 0 obj <>stream 0 0 0 6 47 86 d1 47 0 0 80 0 6 cm BI /IM true /W 47 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ȩxa%4~? ~TK C \|7oۭK ,zc=~ EI endstream endobj 1127 0 obj <>stream 0 0 0 -6 47 114 d1 47 0 0 120 0 -6 cm BI /IM true /W 47 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &m~߽~߽a߽ EI endstream endobj 1128 0 obj <> endobj 1132 0 obj <>stream 0 0 0 6 57 86 d1 57 0 0 80 0 6 cm BI /IM true /W 57 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CAa<3 o OZ]W A5A10`OX 5@@ EI endstream endobj 1133 0 obj <> endobj 1137 0 obj <>stream 0 0 0 10 115 173 d1 115 0 0 163 0 10 cm BI /IM true /W 115 /H 163 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?'V &~~~~߿߿??a~~~߿~߿=}} EI endstream endobj 1138 0 obj <>stream 0 0 0 0 178 174 d1 178 0 0 174 0 0 cm BI /IM true /W 178 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&  7!v-]:\?]p/pï ߺ z?ka4zvx]aۯA߇K]x]nwvzwK~kk@@ EI endstream endobj 1139 0 obj <>stream 0 0 0 59 129 171 d1 129 0 0 112 0 59 cm BI /IM true /W 129 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID +`j `TB/_^_֭୥`ois R  \@ EI endstream endobj 1140 0 obj <>stream 0 0 0 0 83 113 d1 83 0 0 113 0 0 cm BI /IM true /W 83 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID & #+i5p^߿߿o~~߿߆ῇ{}} EI endstream endobj 1141 0 obj <>stream 0 0 0 -7 129 113 d1 129 0 0 120 0 -7 cm BI /IM true /W 129 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!ӐZ^޸aw_׿:x^uk mw׿\?]. pAw]z%__k EI endstream endobj 1142 0 obj <>stream 0 0 0 35 93 147 d1 93 0 0 112 0 35 cm BI /IM true /W 93 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &eOA"\@o ߬xI~IA~|/zz~׆owm_m/ m'"|1 '5 EI endstream endobj 1143 0 obj <> endobj 1144 0 obj <>stream 0 0 0 0 69 83 d1 69 0 0 83 0 0 cm BI /IM true /W 69 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID (O5w_]p^=z\_\28_tztzp\__ EI endstream endobj 1148 0 obj <>stream 0 0 0 29 43 83 d1 43 0 0 54 0 29 cm BI /IM true /W 43 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID 'm`):m~ a5 @@ EI endstream endobj 1149 0 obj <>stream 0 0 0 14 37 85 d1 37 0 0 71 0 14 cm BI /IM true /W 37 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &*~(zwBp#@ EI endstream endobj 1154 0 obj <>stream 0 0 0 5 53 76 d1 53 0 0 71 0 5 cm BI /IM true /W 53 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &NQR@C5~??߿߿ { EI endstream endobj 1155 0 obj <>stream 0 0 0 -7 113 116 d1 113 0 0 123 0 -7 cm BI /IM true /W 113 /H 123 /BPC 1 /D[1 0] /F/CCF /DP<> ID &NSd6rX@ kxD 0ao & oM KMW?ޓ=/߅< Gm_[[[ m߶᭵a O 0 CUKClƞ@8p EI endstream endobj 1156 0 obj <>stream 0 0 0 -1 44 113 d1 44 0 0 114 0 -1 cm BI /IM true /W 44 /H 114 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/" HN =U|?ۇ{_ EI endstream endobj 1157 0 obj <> endobj 1161 0 obj <>stream 0 0 0 31 44 107 d1 44 0 0 76 0 31 cm BI /IM true /W 44 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &. F|?> )= Pސoo>stream 0 0 0 5 52 86 d1 52 0 0 81 0 5 cm BI /IM true /W 52 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &σ xG0A} K7>L~{?~ {~k  bhSh7p EI endstream endobj 1163 0 obj <>stream 0 0 0 0 66 5 d1 66 0 0 5 0 0 cm BI /IM true /W 66 /H 5 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 1164 0 obj <>stream 0 0 0 -1 75 84 d1 75 0 0 85 0 -1 cm BI /IM true /W 75 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & |?FA0}?7_?1`_߰~{߇ouo]{_@ EI endstream endobj 1165 0 obj <> endobj 1169 0 obj <>stream 0 0 0 2 49 86 d1 49 0 0 84 0 2 cm BI /IM true /W 49 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^B "0!~iHX }>u_pm,00Kbaa0 EI endstream endobj 1170 0 obj <>stream 0 0 0 1 83 107 d1 83 0 0 106 0 1 cm BI /IM true /W 83 /H 106 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l8?ÿw?o;aÿw?򶏋PP`m;w~CJlw~߻m~w 7w~߻w  EI endstream endobj 1171 0 obj <>stream 0 0 0 -6 46 46 d1 46 0 0 52 0 -6 cm BI /IM true /W 46 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &aO}:ᇄzჴmX~c@~X:!f& aXxk` EI endstream endobj 1172 0 obj <>stream 0 0 0 -6 44 46 d1 44 0 0 52 0 -6 cm BI /IM true /W 44 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g_za~MS[Ap6Aa ~ a <" OC|H0[>,95Kk EI endstream endobj 1173 0 obj <> endobj 1177 0 obj <>stream 0 0 0 -5 112 113 d1 112 0 0 118 0 -5 cm BI /IM true /W 112 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g.CLk6*?߇3?!k| . |>stream 0 0 0 0 73 99 d1 73 0 0 99 0 0 cm BI /IM true /W 73 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t SϾ:Y߿߇~a߿߇?|@ EI endstream endobj 1179 0 obj <>stream 0 0 0 0 68 104 d1 68 0 0 104 0 0 cm BI /IM true /W 68 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`r~SO<'ӉVpٚ+ pMP_OZd5pF|. d4o}X~~'\5aoV5`ux2  EI endstream endobj 1180 0 obj <>stream 0 0 0 34 66 103 d1 66 0 0 69 0 34 cm BI /IM true /W 66 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Fn5 n]uPD6k?ADž_oN ?^a/]_ᴶ /Emm`5 $2 EI endstream endobj 1181 0 obj <>stream 0 0 0 35 110 101 d1 110 0 0 66 0 35 cm BI /IM true /W 110 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &NдiWÿh5L/A 0GtJA 5a mX:I@ EI endstream endobj 1182 0 obj <>stream 0 0 0 35 64 101 d1 64 0 0 66 0 35 cm BI /IM true /W 64 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3A? )04 EI endstream endobj 1183 0 obj <>stream 0 0 0 -1 70 103 d1 70 0 0 104 0 -1 cm BI /IM true /W 70 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_AY N>?E@NAA?߾pk-{ .  \>? EI endstream endobj 1184 0 obj <>stream 0 0 0 18 50 103 d1 50 0 0 85 0 18 cm BI /IM true /W 50 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C/D& A9.>CMx0&j  EI endstream endobj 1185 0 obj <>stream 0 0 0 -1 73 101 d1 73 0 0 102 0 -1 cm BI /IM true /W 73 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3Nw{?~? \yNe}^\2ƻ( EI endstream endobj 1186 0 obj <>stream 0 0 0 35 56 101 d1 56 0 0 66 0 35 cm BI /IM true /W 56 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5??o>E")  EI endstream endobj 1187 0 obj <>stream 0 0 0 34 68 103 d1 68 0 0 69 0 34 cm BI /IM true /W 68 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &܌ `EzBP]%c#>z0?Ko*{[X0 `i' EI endstream endobj 1188 0 obj <>stream 0 0 0 34 70 103 d1 70 0 0 69 0 34 cm BI /IM true /W 70 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &΀D !$w H@@OApMS~?;<1Au\ !Sl5~Xka`fd4@@ EI endstream endobj 1189 0 obj <>stream 0 0 0 -1 84 103 d1 84 0 0 104 0 -1 cm BI /IM true /W 84 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>:"7?A]>U\H? ?_ ~0]a<{"_ay i??ڀ EI endstream endobj 1190 0 obj <>stream 0 0 0 34 65 103 d1 65 0 0 69 0 34 cm BI /IM true /W 65 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ϐ@,+}\l7ᯯu|RLPA. k  _ A>]!|7,(0 C  EI endstream endobj 1191 0 obj <>stream 0 0 0 11 58 84 d1 58 0 0 73 0 11 cm BI /IM true /W 58 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P(Za8&5JO kh axXMWa@@ EI endstream endobj 1192 0 obj <>stream 0 0 0 31 54 84 d1 54 0 0 53 0 31 cm BI /IM true /W 54 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ɮO}Nq\It8{0 EI endstream endobj 1193 0 obj <>stream 0 0 0 11 56 86 d1 56 0 0 75 0 11 cm BI /IM true /W 56 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A@ed]pAwO=r bW~II ɯ/ka fe_0^^?Aua@@ EI endstream endobj 1194 0 obj <> endobj 1199 0 obj <>stream 0 0 0 11 58 86 d1 58 0 0 75 0 11 cm BI /IM true /W 58 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f?\ q =>stream 0 0 0 0 92 108 d1 92 0 0 108 0 0 cm BI /IM true /W 92 /H 108 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|6, >xh ᇃn}]Wo߿3C6 ~~?c2&n{p }aCkm80 @@ EI endstream endobj 1201 0 obj <> endobj 1205 0 obj <>stream 0 0 0 11 60 86 d1 60 0 0 75 0 11 cm BI /IM true /W 60 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &` | x xOC'@M>aOrq ?ɪ  EI endstream endobj 1206 0 obj <>stream 0 0 0 30 46 86 d1 46 0 0 56 0 30 cm BI /IM true /W 46 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A8==D2z zL>AM&__ Av[a  EI endstream endobj 1207 0 obj <>stream 0 0 0 30 44 86 d1 44 0 0 56 0 30 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@LA#u=6Rj^ W O- 30D4wT׆.}% @@ EI endstream endobj 1208 0 obj <>stream 0 0 0 9 49 84 d1 49 0 0 75 0 9 cm BI /IM true /W 49 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A,ɯb톟i} H EI endstream endobj 1209 0 obj <>stream 0 0 0 32 58 86 d1 58 0 0 54 0 32 cm BI /IM true /W 58 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_-p@Ӻ։3=dV5U  EI endstream endobj 1210 0 obj <>stream 0 0 0 0 66 87 d1 66 0 0 87 0 0 cm BI /IM true /W 66 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0!0@h v&@o}?o y x% sX5֯]uA?_߰]ypI TiT  EI endstream endobj 1211 0 obj <>stream 0 0 0 2 64 84 d1 64 0 0 82 0 2 cm BI /IM true /W 64 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID +?P?a ?{3w EI endstream endobj 1212 0 obj <>stream 0 0 0 31 52 108 d1 52 0 0 77 0 31 cm BI /IM true /W 52 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &X z3a|0C G w$ ?w aۇ߆koK   EI endstream endobj 1213 0 obj <>stream 0 0 0 0 77 87 d1 77 0 0 87 0 0 cm BI /IM true /W 77 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &܆P@I0! u=&^޿_c ɝ}nׇxmp߰k<6.a_z|0 y q EI endstream endobj 1214 0 obj <>stream 0 0 0 34 63 103 d1 63 0 0 69 0 34 cm BI /IM true /W 63 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S!KzkZ* >~CN]\?^ ~X0X`c  EI endstream endobj 1215 0 obj <>stream 0 0 0 -1 64 101 d1 64 0 0 102 0 -1 cm BI /IM true /W 64 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3A? )ay EI endstream endobj 1216 0 obj <>stream 0 0 0 5 66 103 d1 66 0 0 98 0 5 cm BI /IM true /W 66 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Fn5 n]uPD6k?ADž_oN ?^a/]_ᴶ /Emm`5 $2?|xoo}{~o@ EI endstream endobj 1217 0 obj <>stream 0 0 0 11 66 85 d1 66 0 0 74 0 11 cm BI /IM true /W 66 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C B%0 <,< @oo }o}o [}o_p__Avia q  EI endstream endobj 1218 0 obj <>stream 0 0 0 19 48 82 d1 48 0 0 63 0 19 cm BI /IM true /W 48 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k>MVO _?m/]o  EI endstream endobj 1219 0 obj <>stream 0 0 0 37 49 105 d1 49 0 0 68 0 37 cm BI /IM true /W 49 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0@;a@L:Y5X]`.+k ɀft,> {0IH=0T ,@5 EI endstream endobj 1220 0 obj <>stream 0 0 0 39 43 82 d1 43 0 0 43 0 39 cm BI /IM true /W 43 /H 43 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C0" 5Z φ_uXa~ EI endstream endobj 1221 0 obj <>stream 0 0 0 39 50 82 d1 50 0 0 43 0 39 cm BI /IM true /W 50 /H 43 /BPC 1 /D[1 0] /F/CCF /DP<> ID &%TYd\xRj2p`@ EI endstream endobj 1222 0 obj <>stream 0 0 0 27 43 82 d1 43 0 0 55 0 27 cm BI /IM true /W 43 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ܠ$ >[(^/5K! EI endstream endobj 1223 0 obj <>stream 0 0 0 84 41 92 d1 41 0 0 8 0 84 cm BI /IM true /W 41 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j  EI endstream endobj 1224 0 obj <>stream 0 0 0 19 41 84 d1 41 0 0 65 0 19 cm BI /IM true /W 41 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p" ?0htOXad: EI endstream endobj 1225 0 obj <>stream 0 0 0 21 52 84 d1 52 0 0 63 0 21 cm BI /IM true /W 52 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID & O @ EI endstream endobj 1226 0 obj <>stream 0 0 0 21 42 82 d1 42 0 0 61 0 21 cm BI /IM true /W 42 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kP EI endstream endobj 1227 0 obj <>stream 0 0 0 39 43 82 d1 43 0 0 43 0 39 cm BI /IM true /W 43 /H 43 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 1<x@E z>o}oOiv0K %_ P EI endstream endobj 1228 0 obj <>stream 0 0 0 39 48 82 d1 48 0 0 43 0 39 cm BI /IM true /W 48 /H 43 /BPC 1 /D[1 0] /F/CCF /DP<> ID &" a@P # :'cG4'4GpAix_kj EI endstream endobj 1229 0 obj <>stream 0 0 0 21 48 82 d1 48 0 0 61 0 21 cm BI /IM true /W 48 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &qV4=a %O|'?_&av׵0\1% / _ڀ EI endstream endobj 1230 0 obj <> endobj 1235 0 obj <> endobj 1239 0 obj <>stream 0 0 0 0 60 78 d1 60 0 0 78 0 0 cm BI /IM true /W 60 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P O:_!rrk߇~oj  EI endstream endobj 1240 0 obj <>stream 0 0 0 65 15 78 d1 15 0 0 13 0 65 cm BI /IM true /W 15 /H 13 /BPC 1 /D[1 0] /F/CCF /DP<> ID & EI endstream endobj 1241 0 obj <>stream 0 0 0 -3 55 81 d1 55 0 0 84 0 -3 cm BI /IM true /W 55 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$ ?}"u< }?֗, p\y mqM{~K ؅5 !_ EI endstream endobj 1242 0 obj <>stream 0 0 0 -3 55 78 d1 55 0 0 81 0 -3 cm BI /IM true /W 55 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ӯ{[$7{|=}=>}<>{{8k.^]a. /[[_ ,2 @ EI endstream endobj 1243 0 obj <>stream 0 0 0 -3 47 78 d1 47 0 0 81 0 -3 cm BI /IM true /W 47 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ӯc_O> |@ EI endstream endobj 1244 0 obj <>stream 0 0 0 -5 17 78 d1 17 0 0 83 0 -5 cm BI /IM true /W 17 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Z _a@@ EI endstream endobj 1245 0 obj <>stream 0 0 0 21 90 78 d1 90 0 0 57 0 21 cm BI /IM true /W 90 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@ePXM4¯p pCMyy -Rj a $  EI endstream endobj 1246 0 obj <>stream 0 0 0 21 56 101 d1 56 0 0 80 0 21 cm BI /IM true /W 56 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@mBqD@@;azՅT GpC  d0#@ EI endstream endobj 1247 0 obj <>stream 0 0 0 -10 15 78 d1 15 0 0 88 0 -10 cm BI /IM true /W 15 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &cɪj  EI endstream endobj 1248 0 obj <>stream 0 0 0 20 54 80 d1 54 0 0 60 0 20 cm BI /IM true /W 54 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0Ax_ND ~H_"΁_ omUǵX0_٬@ EI endstream endobj 1249 0 obj <>stream 0 0 0 21 52 78 d1 52 0 0 57 0 21 cm BI /IM true /W 52 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@XL&?Ψ4?ړU ,H9 EI endstream endobj 1250 0 obj <>stream 0 0 0 7 42 80 d1 42 0 0 73 0 7 cm BI /IM true /W 42 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID & qhtFz_~UY_a@@ EI endstream endobj 1251 0 obj <>stream 0 0 0 20 53 80 d1 53 0 0 60 0 20 cm BI /IM true /W 53 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID &΁qB) uN. >(:~&\eX8?.- jCR(]kX5YCf EI endstream endobj 1252 0 obj <>stream 0 0 0 20 52 101 d1 52 0 0 81 0 20 cm BI /IM true /W 52 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &{o~a*DH8_E8NÅ}'ׯ߿߲d&{-,_o@ EI endstream endobj 1253 0 obj <>stream 0 0 0 -1 53 80 d1 53 0 0 81 0 -1 cm BI /IM true /W 53 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &΁qB) uN. >(:~&\eX8?.- jCR(]kX5YCf|zy W>A ?  4  EI endstream endobj 1254 0 obj <>stream 0 0 0 20 60 80 d1 60 0 0 60 0 20 cm BI /IM true /W 60 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Ax"$ < o@}?M> ___a/]0`  /7  EI endstream endobj 1255 0 obj <>stream 0 0 0 23 52 80 d1 52 0 0 57 0 23 cm BI /IM true /W 52 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M@cja})MWP EI endstream endobj 1257 0 obj <>stream 0 0 0 0 44 60 d1 44 0 0 60 0 0 cm BI /IM true /W 44 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID &*x N 7H0OKaׂ֖(X/ b/av!uX0Xa~C@@ EI endstream endobj 1258 0 obj <>stream 0 0 0 -10 56 80 d1 56 0 0 90 0 -10 cm BI /IM true /W 56 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>Caz@_zO -aU0  EI endstream endobj 1259 0 obj <>stream 0 0 0 -9 16 78 d1 16 0 0 87 0 -9 cm BI /IM true /W 16 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &a:xk5[_ EI endstream endobj 1260 0 obj <>stream 0 0 0 -11 61 78 d1 61 0 0 89 0 -11 cm BI /IM true /W 61 /H 89 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Jij4DzrAP EI endstream endobj 1261 0 obj <>stream 0 0 0 20 52 80 d1 52 0 0 60 0 20 cm BI /IM true /W 52 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID & pp" " ?O_d3#׵{ Mx[X0X0 X EI endstream endobj 1262 0 obj <>stream 0 0 0 23 56 78 d1 56 0 0 55 0 23 cm BI /IM true /W 56 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!=??-}~[AC ߿_߇V_Owrjt  EI endstream endobj 1263 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A. S ~z_ޯzޗL=o|_ӓT EI endstream endobj 1264 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Nӯ&k"Іvׯn:o[[_m~u ~|ȃ4  EI endstream endobj 1265 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &. _ɪXk"S>h ߿ K/ (X` EI endstream endobj 1266 0 obj <>stream 0 0 0 3 52 87 d1 52 0 0 84 0 3 cm BI /IM true /W 52 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f~a}~ݾߋ EI endstream endobj 1267 0 obj <> endobj 1271 0 obj <>stream 0 0 0 -5 71 78 d1 71 0 0 83 0 -5 cm BI /IM true /W 71 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &UA+@|?|_ i_ׅ^ xK(W\.IA|.eῇo|%n_..셆%`@ EI endstream endobj 1272 0 obj <>stream 0 0 0 -7 71 81 d1 71 0 0 88 0 -7 cm BI /IM true /W 71 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D0/ ?h a`c AOzj?72 kﷃ !'/ EI endstream endobj 1273 0 obj <> endobj 1277 0 obj <> endobj 1281 0 obj <>stream 0 0 0 -5 67 78 d1 67 0 0 83 0 -5 cm BI /IM true /W 67 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &  lʠc|}53?߿/_ G_ Y,  EI endstream endobj 1282 0 obj <>stream 0 0 0 21 36 78 d1 36 0 0 57 0 21 cm BI /IM true /W 36 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@7|.CAA EI endstream endobj 1283 0 obj <>stream 0 0 0 -10 56 80 d1 56 0 0 90 0 -10 cm BI /IM true /W 56 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\d #  _ -zQ\,0a``G5_P EI endstream endobj 1284 0 obj <>stream 0 0 0 -3 54 80 d1 54 0 0 83 0 -3 cm BI /IM true /W 54 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0Ax_ND ~H_"΁_ omUǵX0_ٮ?)ʟ6Ap4%a!~_ EI endstream endobj 1285 0 obj <>stream 0 0 0 23 56 78 d1 56 0 0 55 0 23 cm BI /IM true /W 56 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID & -: ]imKn w vᴽv!mua𞞺tA}77xXzM^}>a@ EI endstream endobj 1286 0 obj <>stream 0 0 0 -1 60 80 d1 60 0 0 81 0 -1 cm BI /IM true /W 60 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Ax"$ < o@}?M> ___a/]0`  /7/O!'>w| ` /h EI endstream endobj 1287 0 obj <>stream 0 0 0 31 55 86 d1 55 0 0 55 0 31 cm BI /IM true /W 55 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>3?= >stream 0 0 0 5 53 86 d1 53 0 0 81 0 5 cm BI /IM true /W 53 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Zzނ 7o[ =߿5_o6-0.<5/L c;D= k{Æ EI endstream endobj 1289 0 obj <>stream 0 0 0 0 81 107 d1 81 0 0 107 0 0 cm BI /IM true /W 81 /H 107 /BPC 1 /D[1 0] /F/CCF /DP<> ID &fx z}=5A3(.$xxA$U6K=~ajpZ moدI_B [?k_6kv ,=o l%k0KxXm @N פ@ EI endstream endobj 1290 0 obj <>stream 0 0 0 2 79 84 d1 79 0 0 82 0 2 cm BI /IM true /W 79 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID "@5H?C=߽|==ÿ{ ?}/`3@ EI endstream endobj 1291 0 obj <> endobj 1295 0 obj <>/Length 233>>stream x `E{P{xۊq-Ab |m#cxZ(6h,q>R1t]m4Mr9 h=|pI:ͯiaqVFHJyi~NʲyUCiwʃmQ%>cnTv&HA>%«a*{q޽=s{$# {챷 vV endstream endobj 1296 0 obj <>/Length 156>>stream x `2-BJEheF04!7wQΙ?^y9B`nZ[kgkR}<2WJ("%TKq(}N|zK'oGvH||9с!˻7Wy+à endstream endobj 1297 0 obj <>/Length 177>>stream x f!Dgn!t9SC jH rb{챷R a3hj !̻x56NIR]1IlPJ ǜzOJg7@iMeX;:U=6yc=ػ) endstream endobj 1298 0 obj <>stream 0 0 0 5 50 79 d1 50 0 0 74 0 5 cm BI /IM true /W 50 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3`<zzgPaɮ? ^&/Ku tx%' EI endstream endobj 1299 0 obj <> endobj 1300 0 obj <> endobj 1305 0 obj <>stream 0 0 0 3 50 79 d1 50 0 0 76 0 3 cm BI /IM true /W 50 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ._E8o?ރ/x0W! 5ay?{#|?0 EI endstream endobj 1306 0 obj <>stream 0 0 0 -5 93 78 d1 93 0 0 83 0 -5 cm BI /IM true /W 93 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &aiC4 ?'#XAoaA[?zO?P EI endstream endobj 1307 0 obj <>stream 0 0 0 -4 54 80 d1 54 0 0 84 0 -4 cm BI /IM true /W 54 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0Ax_ND ~H_"΁_ omUǵX0_ٮ?> {xo EI endstream endobj 1308 0 obj <>stream 0 0 0 23 50 78 d1 50 0 0 55 0 23 cm BI /IM true /W 50 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ku<7{{{{<7X- EI endstream endobj 1309 0 obj <> endobj 1313 0 obj <>stream 0 0 0 5 42 84 d1 42 0 0 79 0 5 cm BI /IM true /W 42 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F?{?/N~ؼ}߽@ EI endstream endobj 1314 0 obj <>stream 0 0 0 5 55 87 d1 55 0 0 82 0 5 cm BI /IM true /W 55 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID 8 <95 ^06~Oo o7= ay}ލ6Mpwn~]x[ia40Y@ EI endstream endobj 1315 0 obj <>stream 0 0 0 5 55 87 d1 55 0 0 82 0 5 cm BI /IM true /W 55 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Jঁ0`~7>~߻5/ ]ia_{4|= oNr î ] aa x EI endstream endobj 1316 0 obj <>/Length 233>>stream x `E{P{xۊq-Ab |m#cxZ(6h,q>R1t]m4Mr9 h=|pI:ͯiaqVFHJyi~NʲyUCiwʃmQ%>cnTv&HA>%«a*{q޽=s{$# {챷 vV endstream endobj 1317 0 obj <>/Length 156>>stream x `2-BJEheF04!7wQΙ?^y9B`nZ[kgkR}<2WJ("%TKq(}N|zK'oGvH||9с!˻7Wy+à endstream endobj 1318 0 obj <>/Length 177>>stream x f!Dgn!t9SC jH rb{챷R a3hj !̻x56NIR]1IlPJ ǜzOJg7@iMeX;:U=6yc=ػ) endstream endobj 1319 0 obj <>stream 0 0 0 5 50 78 d1 50 0 0 73 0 5 cm BI /IM true /W 50 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &1´@@ EI endstream endobj 1320 0 obj <> endobj 1321 0 obj <> endobj 1325 0 obj <>stream 0 0 0 -7 85 81 d1 85 0 0 88 0 -7 cm BI /IM true /W 85 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D\P@(xOKǭ }&&>o0ak__]^a6\0^ .P+ / F.AD@ EI endstream endobj 1326 0 obj <>stream 0 0 0 -30 41 -2 d1 41 0 0 28 0 -30 cm BI /IM true /W 41 /H 28 /BPC 1 /D[1 0] /F/CCF /DP<> ID :j߇ EI endstream endobj 1327 0 obj <>stream 0 0 0 3 85 58 d1 85 0 0 55 0 3 cm BI /IM true /W 85 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &PGP̠> 0+߇߯{~߇c{÷ݿrjh5 EI endstream endobj 1328 0 obj <>stream 0 0 0 0 59 60 d1 59 0 0 60 0 0 cm BI /IM true /W 59 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID &1JBz"#[?~|?P' x0-6'_\ ai  EI endstream endobj 1329 0 obj <>stream 0 0 0 -29 32 58 d1 32 0 0 87 0 -29 cm BI /IM true /W 32 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@g>M{?\?}m|@ EI endstream endobj 1330 0 obj <>stream 0 0 0 -13 39 60 d1 39 0 0 73 0 -13 cm BI /IM true /W 39 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &HKR>UcɪM EI endstream endobj 1331 0 obj <>stream 0 0 0 -30 41 -2 d1 41 0 0 28 0 -30 cm BI /IM true /W 41 /H 28 /BPC 1 /D[1 0] /F/CCF /DP<> ID > 95Ww EI endstream endobj 1332 0 obj <>stream 0 0 0 1 60 58 d1 60 0 0 57 0 1 cm BI /IM true /W 60 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@ewkw ߿k$˝qᅸkhĆ EI endstream endobj 1333 0 obj <>stream 0 0 0 0 62 60 d1 62 0 0 60 0 0 cm BI /IM true /W 62 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3~C < @Aj~Kl S[Xk 3j EI endstream endobj 1334 0 obj <>stream 0 0 0 -31 53 58 d1 53 0 0 89 0 -31 cm BI /IM true /W 53 /H 89 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@6P}C aװ5ػZ@ EI endstream endobj 1335 0 obj <>stream 0 0 0 3 68 82 d1 68 0 0 79 0 3 cm BI /IM true /W 68 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 88wûTax}߾}Dx[߿P+(~߿7?7{A EI endstream endobj 1336 0 obj <>stream 0 0 0 11 58 86 d1 58 0 0 75 0 11 cm BI /IM true /W 58 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &sO[ᮏ,a/}{~0^}o?:pz 8 j  EI endstream endobj 1337 0 obj <>stream 0 0 0 36 64 103 d1 64 0 0 67 0 36 cm BI /IM true /W 64 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4>DQ~?@ EI endstream endobj 1338 0 obj <>stream 0 0 0 5 73 103 d1 73 0 0 98 0 5 cm BI /IM true /W 73 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DW7`O=== o }&O wm-0^=-   !e}7}὇o  EI endstream endobj 1339 0 obj <>stream 0 0 0 0 79 87 d1 79 0 0 87 0 0 cm BI /IM true /W 79 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t h<#@<AxI0>MzO0AA7kz]x]][ m[ X0 ,0 z@@ EI endstream endobj 1340 0 obj <>stream 0 0 0 30 44 86 d1 44 0 0 56 0 30 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ @ EI endstream endobj 1341 0 obj <>stream 0 0 0 31 39 84 d1 39 0 0 53 0 31 cm BI /IM true /W 39 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID A?&=~C?Ѣa=5BN  EI endstream endobj 1342 0 obj <>stream 0 0 0 31 57 84 d1 57 0 0 53 0 31 cm BI /IM true /W 57 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&k.6p &C'  EI endstream endobj 1343 0 obj <>stream 0 0 0 3 26 84 d1 26 0 0 81 0 3 cm BI /IM true /W 26 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID j)@_5L/ EI endstream endobj 1344 0 obj <>stream 0 0 0 30 53 86 d1 53 0 0 56 0 30 cm BI /IM true /W 53 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,( EI endstream endobj 1345 0 obj <>stream 0 0 0 31 91 84 d1 91 0 0 53 0 31 cm BI /IM true /W 91 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID $I56@4ӄOK~6LX`iqdž&AP EI endstream endobj 1346 0 obj <>stream 0 0 0 11 37 86 d1 37 0 0 75 0 11 cm BI /IM true /W 37 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &O?t?jd0" EI endstream endobj 1347 0 obj <>stream 0 0 0 30 51 86 d1 51 0 0 56 0 30 cm BI /IM true /W 51 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !ax EI endstream endobj 1348 0 obj <>stream 0 0 0 0 40 84 d1 40 0 0 84 0 0 cm BI /IM true /W 40 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\OɨC@==O 7جX0P EI endstream endobj 1349 0 obj <>stream 0 0 0 30 44 86 d1 44 0 0 56 0 30 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h7A [W(6^K 0l<@ EI endstream endobj 1350 0 obj <>stream 0 0 0 30 38 86 d1 38 0 0 56 0 30 cm BI /IM true /W 38 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0$< zÈ ap_uAY py  @ ^j P_d5ȁx20O EI endstream endobj 1351 0 obj <>stream 0 0 0 31 57 107 d1 57 0 0 76 0 31 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kk)b́-@&zM?DŽ}_/_ h/z`'y x EI endstream endobj 1352 0 obj <>stream 0 0 0 31 57 86 d1 57 0 0 55 0 31 cm BI /IM true /W 57 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CAa<3 o OZ]W A5A  EI endstream endobj 1353 0 obj <>stream 0 0 0 32 43 84 d1 43 0 0 52 0 32 cm BI /IM true /W 43 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID c&!{o ww}>xaow EI endstream endobj 1354 0 obj <>stream 0 0 0 7 53 86 d1 53 0 0 79 0 7 cm BI /IM true /W 53 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,a` [P EI endstream endobj 1355 0 obj <> endobj 1360 0 obj <>stream 0 0 0 3 50 79 d1 50 0 0 76 0 3 cm BI /IM true /W 50 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID & xAzaz7xA޸a޶yN>`md^xAG@@A޿xav+ EI endstream endobj 1361 0 obj <>stream 0 0 0 -5 64 78 d1 64 0 0 83 0 -5 cm BI /IM true /W 64 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Z\ @K@@ EI endstream endobj 1362 0 obj <>stream 0 0 0 9 53 86 d1 53 0 0 77 0 9 cm BI /IM true /W 53 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &#Q(&~'~$OCA}Bo}7a / v?kd EI endstream endobj 1363 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8p5O# /|\W __ x_H MP( EI endstream endobj 1364 0 obj <>stream 0 0 0 -4 60 80 d1 60 0 0 84 0 -4 cm BI /IM true /W 60 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Ax"$ < o@}?M> ___a/]0`  /7ya{=x EI endstream endobj 1365 0 obj <> endobj 1369 0 obj <> endobj 1373 0 obj <>/Length 233>>stream x `E{P{xۊq-Ab |m#cxZ(6h,q>R1t]m4Mr9 h=|pI:ͯiaqVFHJyi~NʲyUCiwʃmQ%>cnTv&HA>%«a*{q޽=s{$# {챷 vV endstream endobj 1374 0 obj <>/Length 156>>stream x `2-BJEheF04!7wQΙ?^y9B`nZ[kgkR}<2WJ("%TKq(}N|zK'oGvH||9с!˻7Wy+à endstream endobj 1375 0 obj <>/Length 177>>stream x f!Dgn!t9SC jH rb{챷R a3hj !̻x56NIR]1IlPJ ǜzOJg7@iMeX;:U=6yc=ػ) endstream endobj 1376 0 obj <>stream 0 0 0 3 50 79 d1 50 0 0 76 0 3 cm BI /IM true /W 50 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@o! HO~@~o~aB 7AuB??zo c_ - !8 EI endstream endobj 1377 0 obj <>stream 0 0 0 2 69 104 d1 69 0 0 102 0 2 cm BI /IM true /W 69 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`~AqL ?]a_"G@}?~/i58ȇ]kKb~>K_d@ EI endstream endobj 1378 0 obj <>stream 0 0 0 34 63 128 d1 63 0 0 94 0 34 cm BI /IM true /W 63 /H 94 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A o߿{߽2C` ִT"5 |+k~k0c0`d2@@ EI endstream endobj 1379 0 obj <>stream 0 0 0 6 73 103 d1 73 0 0 97 0 6 cm BI /IM true /W 73 /H 97 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DW7`O=== o }&O wm-0^=-   !ȇ \CE~}lȐO ~  EI endstream endobj 1380 0 obj <>stream 0 0 0 2 116 101 d1 116 0 0 99 0 2 cm BI /IM true /W 116 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &  2p@?&-Oo&&~ O?? [?OA MRx` EI endstream endobj 1381 0 obj <>stream 0 0 0 2 19 101 d1 19 0 0 99 0 2 cm BI /IM true /W 19 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Z &a|@ EI endstream endobj 1382 0 obj <> endobj 1383 0 obj <> endobj 1388 0 obj <>stream 0 0 0 3 50 79 d1 50 0 0 76 0 3 cm BI /IM true /W 50 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H`G >[[[z_޿޿{] ,0À EI endstream endobj 1389 0 obj <> endobj 1393 0 obj <>stream 0 0 0 -8 42 113 d1 42 0 0 121 0 -8 cm BI /IM true /W 42 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A\_)_[Xaa EI endstream endobj 1394 0 obj <>stream 0 0 0 35 92 147 d1 92 0 0 112 0 35 cm BI /IM true /W 92 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/'!DhA!|BL>AAw/iwXMt @KHx1*Ă_X EI endstream endobj 1395 0 obj <>stream 0 0 0 34 83 115 d1 83 0 0 81 0 34 cm BI /IM true /W 83 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kI"`^CaV<" G^ A&}>AooL?o޿5޿z a-\5il0Ka,2"~<0X0e fH5 EI endstream endobj 1396 0 obj <>stream 0 0 0 34 61 115 d1 61 0 0 81 0 34 cm BI /IM true /W 61 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h:A> }>pM}~__׬y r "y q| 0  @ Ϣ50\z _l/5\6 \> <@ EI endstream endobj 1397 0 obj <>stream 0 0 0 -7 93 115 d1 93 0 0 122 0 -7 cm BI /IM true /W 93 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &uΠA$h7n5D~ 9.1ZI'>}}~/ׯ~kk`w  1  ]r C_` EI endstream endobj 1398 0 obj <>stream 0 0 0 34 74 115 d1 74 0 0 81 0 34 cm BI /IM true /W 74 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j!x" >FAo a7}_nu Hk_`kwa׿l.Km-a kqᅆ !O T@ EI endstream endobj 1399 0 obj <>stream 0 0 0 34 85 115 d1 85 0 0 81 0 34 cm BI /IM true /W 85 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?]@ A@z i h o[&;> ![~߷?Ȁ_%H\1 3 y!A'넻ׅ-,0(\x`a`ɀԐO EI endstream endobj 1400 0 obj <>stream 0 0 0 1 57 86 d1 57 0 0 85 0 1 cm BI /IM true /W 57 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!1T3 |@&trւb}//55ap6ix0day ] _) EI endstream endobj 1401 0 obj <>stream 0 0 0 3 30 108 d1 30 0 0 105 0 3 cm BI /IM true /W 30 /H 105 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~wɪMk:4O~_ EI endstream endobj 1402 0 obj <>stream 0 0 0 2 103 101 d1 103 0 0 99 0 2 cm BI /IM true /W 103 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Kl zOAuoJ/[ 7^o~a _7ҿa_҇}+V_ A EI endstream endobj 1403 0 obj <>stream 0 0 0 36 61 101 d1 61 0 0 65 0 36 cm BI /IM true /W 61 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &n;}{{x}{}{}yk:@@ EI endstream endobj 1404 0 obj <>stream 0 0 0 6 65 103 d1 65 0 0 97 0 6 cm BI /IM true /W 65 /H 97 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4@ӄCN }`)4HeHia,{]:p5x0_gC.!> HnOa<0Aar EI endstream endobj 1405 0 obj <>stream 0 0 0 35 69 129 d1 69 0 0 94 0 35 cm BI /IM true /W 69 /H 94 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A AO@X/x&}_ % A1©/^E1XcH EI endstream endobj 1406 0 obj <>stream 0 0 0 1 26 84 d1 26 0 0 83 0 1 cm BI /IM true /W 26 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID j)@_5 EI endstream endobj 1407 0 obj <>stream 0 0 0 30 44 108 d1 44 0 0 78 0 30 cm BI /IM true /W 44 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M@AiFo \h7A [W(6^K 0l<@ EI endstream endobj 1408 0 obj <>stream 0 0 0 5 53 86 d1 53 0 0 81 0 5 cm BI /IM true /W 53 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,r?0n  EI endstream endobj 1409 0 obj <>stream 0 0 0 31 57 107 d1 57 0 0 76 0 31 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID $j)@kZ"&a0@ a}~}ׯ]k`D-.<0H2p  EI endstream endobj 1410 0 obj <>stream 0 0 0 1 57 84 d1 57 0 0 83 0 1 cm BI /IM true /W 57 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&k.6 ^8g~?L@ EI endstream endobj 1411 0 obj <>stream 0 0 0 6 44 86 d1 44 0 0 80 0 6 cm BI /IM true /W 44 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ ?; =o X0 EI endstream endobj 1412 0 obj <>stream 0 0 0 72 14 107 d1 14 0 0 35 0 72 cm BI /IM true /W 14 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7{ cM~( EI endstream endobj 1413 0 obj <>stream 0 0 0 32 58 84 d1 58 0 0 52 0 32 cm BI /IM true /W 58 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID %?jauM`/[ o޸iaۭoֺZxF[ՇWo ^a}C4/ EI endstream endobj 1414 0 obj <>stream 0 0 0 72 13 84 d1 13 0 0 12 0 72 cm BI /IM true /W 13 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Mu` EI endstream endobj 1415 0 obj <>stream 0 0 0 30 54 110 d1 54 0 0 80 0 30 cm BI /IM true /W 54 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A6| =>z o.Kz!\Ap B)uGL8#P(>H {7&av/^ +Ma7$ EI endstream endobj 1416 0 obj <>stream 0 0 0 1 57 86 d1 57 0 0 85 0 1 cm BI /IM true /W 57 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N>D?h0A7a}?_v&/a dᣏQ0 EI endstream endobj 1417 0 obj <>stream 0 0 0 0 58 84 d1 58 0 0 84 0 0 cm BI /IM true /W 58 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/4#i5h ?\/+C1 EI endstream endobj 1418 0 obj <>stream 0 0 0 55 32 63 d1 32 0 0 8 0 55 cm BI /IM true /W 32 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 1419 0 obj <>stream 0 0 0 -1 80 84 d1 80 0 0 85 0 -1 cm BI /IM true /W 80 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID *+&u CP%[PU\=kK^_l2]z5u޿k i_P EI endstream endobj 1420 0 obj <> endobj 1424 0 obj <>stream 0 0 0 28 44 85 d1 44 0 0 57 0 28 cm BI /IM true /W 44 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &< z?5φ_wk],?[_X`@@ EI endstream endobj 1425 0 obj <>stream 0 0 0 28 51 85 d1 51 0 0 57 0 28 cm BI /IM true /W 51 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4| @=? G7 =A}o&;? /m/] ]Xa[m~Ca EI endstream endobj 1426 0 obj <>/Length 233>>stream x `E{P{xۊq-Ab |m#cxZ(6h,q>R1t]m4Mr9 h=|pI:ͯiaqVFHJyi~NʲyUCiwʃmQ%>cnTv&HA>%«a*{q޽=s{$# {챷 vV endstream endobj 1427 0 obj <>/Length 156>>stream x `2-BJEheF04!7wQΙ?^y9B`nZ[kgkR}<2WJ("%TKq(}N|zK'oGvH||9с!˻7Wy+à endstream endobj 1428 0 obj <>/Length 177>>stream x f!Dgn!t9SC jH rb{챷R a3hj !̻x56NIR]1IlPJ ǜzOJg7@iMeX;:U=6yc=ػ) endstream endobj 1429 0 obj <>stream 0 0 0 -2 44 130 d1 44 0 0 132 0 -2 cm BI /IM true /W 44 /H 132 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@^EQMW 8߿?2 EI endstream endobj 1430 0 obj <>stream 0 0 0 7 27 84 d1 27 0 0 77 0 7 cm BI /IM true /W 27 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID _ɨpj' a>۽5 EI endstream endobj 1431 0 obj <>stream 0 0 0 5 51 86 d1 51 0 0 81 0 5 cm BI /IM true /W 51 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !a|9 A|wa7 EI endstream endobj 1432 0 obj <>stream 0 0 0 2 71 84 d1 71 0 0 82 0 2 cm BI /IM true /W 71 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &sDІ]xhY(|/ ?z}}|.!WV  EI endstream endobj 1433 0 obj <>stream 0 0 0 -2 74 101 d1 74 0 0 103 0 -2 cm BI /IM true /W 74 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ΠдuAC3_Opx}>~pC/V EI endstream endobj 1434 0 obj <> endobj 1435 0 obj <> endobj 1439 0 obj <>/Length 233>>stream x `E{P{xۊq-Ab |m#cxZ(6h,q>R1t]m4Mr9 h=|pI:ͯiaqVFHJyi~NʲyUCiwʃmQ%>cnTv&HA>%«a*{q޽=s{$# {챷 vV endstream endobj 1440 0 obj <>/Length 156>>stream x `2-BJEheF04!7wQΙ?^y9B`nZ[kgkR}<2WJ("%TKq(}N|zK'oGvH||9с!˻7Wy+à endstream endobj 1441 0 obj <>/Length 177>>stream x f!Dgn!t9SC jH rb{챷R a3hj !̻x56NIR]1IlPJ ǜzOJg7@iMeX;:U=6yc=ػ) endstream endobj 1442 0 obj <>/Length 233>>stream x `E{P{xۊq-Ab |m#cxZ(6h,q>R1t]m4Mr9 h=|pI:ͯiaqVFHJyi~NʲyUCiwʃmQ%>cnTv&HA>%«a*{q޽=s{$# {챷 vV endstream endobj 1443 0 obj <>/Length 156>>stream x `2-BJEheF04!7wQΙ?^y9B`nZ[kgkR}<2WJ("%TKq(}N|zK'oGvH||9с!˻7Wy+à endstream endobj 1444 0 obj <>/Length 177>>stream x f!Dgn!t9SC jH rb{챷R a3hj !̻x56NIR]1IlPJ ǜzOJg7@iMeX;:U=6yc=ػ) endstream endobj 1445 0 obj <> endobj 1446 0 obj <> endobj 1450 0 obj <>stream 0 0 0 11 103 176 d1 103 0 0 165 0 11 cm BI /IM true /W 103 /H 165 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S$PjHA.FPjaAz ,=&Oҿ}>_:GD`>ø5K .\_~__Ov_\5%Apk^A{! }x1^/ /EA PTc|Hm`>>||? 6>A ?@fD<@ EI endstream endobj 1451 0 obj <>stream 0 0 0 0 56 173 d1 56 0 0 173 0 0 cm BI /IM true /W 56 /H 173 /BPC 1 /D[1 0] /F/CCF /DP<> ID P`#P4OA?[[ a@@ EI endstream endobj 1452 0 obj <>stream 0 0 0 7 51 86 d1 51 0 0 79 0 7 cm BI /IM true /W 51 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !a|.{x}{ EI endstream endobj 1453 0 obj <>stream 0 0 0 0 73 116 d1 73 0 0 116 0 0 cm BI /IM true /W 73 /H 116 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u xA> 07z '7|'p|woMk.DM.Kipkg@ 0G5g0%X4d\2 y3_' o*x" q EI endstream endobj 1454 0 obj <>stream 0 0 0 35 147 113 d1 147 0 0 78 0 35 cm BI /IM true /W 147 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &KNAa;5/FtxmXk`PY@M^ 3A_ 0Y j @h EI endstream endobj 1455 0 obj <>stream 0 0 0 -7 92 115 d1 92 0 0 122 0 -7 cm BI /IM true /W 92 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &tN _ao}Ch ao龃|&Aw.]: % $^ Aʀ1/u/@ EI endstream endobj 1456 0 obj <>stream 0 0 0 35 94 113 d1 94 0 0 78 0 35 cm BI /IM true /W 94 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"r C?Zun~6P޼0ixb x`Ԇ` EI endstream endobj 1457 0 obj <>stream 0 0 0 4 59 115 d1 59 0 0 111 0 4 cm BI /IM true /W 59 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C O 7~A_z!kJMOa} EI endstream endobj 1458 0 obj <>stream 0 0 0 36 93 113 d1 93 0 0 77 0 36 cm BI /IM true /W 93 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID "A)! 0m-np-Kn] .+k p֖=?DxA_}>zo 7}Oz -FA @@ EI endstream endobj 1459 0 obj <>stream 0 0 0 5 51 107 d1 51 0 0 102 0 5 cm BI /IM true /W 51 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l4P?e|,+ Mp%`dGaw߿axo~}}j  EI endstream endobj 1460 0 obj <>stream 0 0 0 0 81 87 d1 81 0 0 87 0 0 cm BI /IM true /W 81 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t  85mp˄H a1>/A}A/}|koG_ aw^mwl/ v ='0 EI endstream endobj 1461 0 obj <>stream 0 0 0 0 78 85 d1 78 0 0 85 0 0 cm BI /IM true /W 78 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &HP#aAH7ނa_2Z4Cb EI endstream endobj 1462 0 obj <>stream 0 0 0 1 55 84 d1 55 0 0 83 0 1 cm BI /IM true /W 55 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID $QJskz_z^Kzz]]^.ik_oo?_Dpj&  EI endstream endobj 1463 0 obj <>stream 0 0 0 104 72 110 d1 72 0 0 6 0 104 cm BI /IM true /W 72 /H 6 /BPC 1 /D[1 0] /F/CCF /DP<> ID &  EI endstream endobj 1464 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^B |@x[" Ӧow{^! y| oQ?K_ wam+h<@ EI endstream endobj 1465 0 obj <> endobj 1469 0 obj <>stream 0 0 0 -5 10 83 d1 10 0 0 88 0 -5 cm BI /IM true /W 10 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 1470 0 obj <>stream 0 0 0 0 11 83 d1 11 0 0 83 0 0 cm BI /IM true /W 11 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@ EI endstream endobj 1471 0 obj <>stream 0 0 0 35 66 113 d1 66 0 0 78 0 35 cm BI /IM true /W 66 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4 ? =ߔ}Xxᵸ}amIbC EI endstream endobj 1472 0 obj <> endobj 1476 0 obj <>stream 0 0 0 0 72 76 d1 72 0 0 76 0 0 cm BI /IM true /W 72 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Py EI endstream endobj 1477 0 obj <>stream 0 0 0 -3 50 78 d1 50 0 0 81 0 -3 cm BI /IM true /W 50 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|q"pA?V(0J>M`v EI endstream endobj 1478 0 obj <>stream 0 0 0 23 48 78 d1 48 0 0 55 0 23 cm BI /IM true /W 48 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID & qN&5߄^ O(Mzׇ הج5p EI endstream endobj 1479 0 obj <>stream 0 0 0 -3 14 76 d1 14 0 0 79 0 -3 cm BI /IM true /W 14 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &MV@ EI endstream endobj 1480 0 obj <>stream 0 0 0 0 59 85 d1 59 0 0 85 0 0 cm BI /IM true /W 59 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6W v\Appz.דPTZ4d3@Ŀ![p..,",26+@i0pl}t/5_ׇ] ^vu EO . g@π EI endstream endobj 1481 0 obj <>stream 0 0 0 28 54 85 d1 54 0 0 57 0 28 cm BI /IM true /W 54 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0z#| 7}&5M?IC:_k.a-a`0  EI endstream endobj 1482 0 obj <>stream 0 0 0 0 31 83 d1 31 0 0 83 0 0 cm BI /IM true /W 31 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D@@ EI endstream endobj 1483 0 obj <>stream 0 0 0 28 52 107 d1 52 0 0 79 0 28 cm BI /IM true /W 52 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Hoa `fC6]pK G t xA>A7 "fK삎 k K ag :@ EI endstream endobj 1484 0 obj <>stream 0 0 0 0 60 85 d1 60 0 0 85 0 0 cm BI /IM true /W 60 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & >@ x zxFC`=7 ɯx\5zz/kaK`ȺAFA_bopP`,3@n EI endstream endobj 1485 0 obj <>stream 0 0 0 28 43 85 d1 43 0 0 57 0 28 cm BI /IM true /W 43 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &R?K>/jAp/׮Ay $Z kPe8aAG_k.%  EI endstream endobj 1487 0 obj <>stream 0 0 0 0 87 106 d1 87 0 0 106 0 0 cm BI /IM true /W 87 /H 106 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~hx@O^x_?!U?C4O0,? tAD,<#^[t A7p ի0Wо>XU \=v]Ap Apap a`,0!c!T@ EI endstream endobj 1488 0 obj <>stream 0 0 0 29 67 85 d1 67 0 0 56 0 29 cm BI /IM true /W 67 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/ a AD~?P=5rp.D@ EI endstream endobj 1489 0 obj <>stream 0 0 0 28 61 85 d1 61 0 0 57 0 28 cm BI /IM true /W 61 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@i|A 0E8p }?a ]AqLZ ? _],6.= @` EI endstream endobj 1490 0 obj <>stream 0 0 0 29 67 83 d1 67 0 0 54 0 29 cm BI /IM true /W 67 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"hA?(оd* EI endstream endobj 1491 0 obj <>stream 0 0 0 7 43 85 d1 43 0 0 78 0 7 cm BI /IM true /W 43 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ܠ' <.}&޾!ā5>3? EI endstream endobj 1492 0 obj <>stream 0 0 0 65 19 83 d1 19 0 0 18 0 65 cm BI /IM true /W 19 /H 18 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|ɮkaa EI endstream endobj 1493 0 obj <>stream 0 0 0 0 66 85 d1 66 0 0 85 0 0 cm BI /IM true /W 66 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &9@_ xA@P T2 tA^ᆻaw 'k"7#ra? @@ EI endstream endobj 1494 0 obj <>stream 0 0 0 30 66 83 d1 66 0 0 53 0 30 cm BI /IM true /W 66 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x)?Η[&} }azҸ EI endstream endobj 1495 0 obj <>stream 0 0 0 2 84 83 d1 84 0 0 81 0 2 cm BI /IM true /W 84 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &UCJf_fĆ+? EI endstream endobj 1496 0 obj <>stream 0 0 0 29 106 83 d1 106 0 0 54 0 29 cm BI /IM true /W 106 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M(Ђ?KtMvE`L41A_kY d00H  EI endstream endobj 1497 0 obj <>stream 0 0 0 29 66 106 d1 66 0 0 77 0 29 cm BI /IM true /W 66 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID #AQDxA |C  >o ?_]iD%†B)5 !Q EI endstream endobj 1498 0 obj <>stream 0 0 0 28 60 85 d1 60 0 0 57 0 28 cm BI /IM true /W 60 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & >@ x zxFC`=7 ɯx\5zz/kaK`ȺAF EI endstream endobj 1499 0 obj <>stream 0 0 0 1 43 83 d1 43 0 0 82 0 1 cm BI /IM true /W 43 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID ?ā EI endstream endobj 1500 0 obj <>stream 0 0 0 28 52 85 d1 52 0 0 57 0 28 cm BI /IM true /W 52 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0<"0G&x[>CLQ~> aiq0Y 0gP EI endstream endobj 1501 0 obj <>stream 0 0 0 29 48 83 d1 48 0 0 54 0 29 cm BI /IM true /W 48 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID "At  Ԛh  EI endstream endobj 1502 0 obj <>stream 0 0 0 -7 97 91 d1 97 0 0 98 0 -7 cm BI /IM true /W 97 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &` =A}D>M}A~maۯ]mp][ ml_xAޛz! o]xIa}'oo ?o}[U &-E]{1j _{a $ S 5 EI endstream endobj 1503 0 obj <>stream 0 0 0 -7 52 113 d1 52 0 0 120 0 -7 cm BI /IM true /W 52 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &2 j{߇{x߿~aڀ EI endstream endobj 1504 0 obj <>stream 0 0 0 29 61 109 d1 61 0 0 80 0 29 cm BI /IM true /W 61 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!<E8a7z_]d .-E>N ȡq{:@azMڗߧvv G)`h  EI endstream endobj 1505 0 obj <>stream 0 0 0 -1 30 83 d1 30 0 0 84 0 -1 cm BI /IM true /W 30 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D\_A?_[ ( EI endstream endobj 1506 0 obj <>stream 0 0 0 30 66 83 d1 66 0 0 53 0 30 cm BI /IM true /W 66 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID *)(:iauim[ /[Xk KF~70սoH7 ? EI endstream endobj 1507 0 obj <>stream 0 0 0 6 47 84 d1 47 0 0 78 0 6 cm BI /IM true /W 47 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A(? 1Cb? EI endstream endobj 1508 0 obj <>stream 0 0 0 3 57 86 d1 57 0 0 83 0 3 cm BI /IM true /W 57 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A4=<'{~ =onp2o[7}`ٞ}|@ EI endstream endobj 1509 0 obj <>stream 0 0 0 66 20 107 d1 20 0 0 41 0 66 cm BI /IM true /W 20 /H 41 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`=>~KCGԚXa@@ EI endstream endobj 1510 0 obj <>stream 0 0 0 6 55 86 d1 55 0 0 80 0 6 cm BI /IM true /W 55 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 2CzO0Ӿi׆ ty '>A'$}u^ïkl%l0aa٤@ EI endstream endobj 1511 0 obj <>stream 0 0 0 6 55 86 d1 55 0 0 80 0 6 cm BI /IM true /W 55 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &܆> A >t 7>A7_îsRi|0_b`P?O6?om[_ ,`p EI endstream endobj 1512 0 obj <>stream 0 0 0 6 55 86 d1 55 0 0 80 0 6 cm BI /IM true /W 55 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Cx |@& ?|?N ENkKpa. % 0^ /C c)f>f~l4 EI endstream endobj 1513 0 obj <>stream 0 0 0 15 79 93 d1 79 0 0 78 0 15 cm BI /IM true /W 79 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`5oO5 EI endstream endobj 1514 0 obj <> endobj 1518 0 obj <> endobj 1522 0 obj <>stream 0 0 0 11 108 176 d1 108 0 0 165 0 11 cm BI /IM true /W 108 /H 165 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F܃`@5A z Ao[oaVz_ kE u^_a} A{װ.؅/ !{={maXlN{h-  r@E+ Cl+ /2 i EI endstream endobj 1523 0 obj <>stream 0 0 0 58 99 173 d1 99 0 0 115 0 58 cm BI /IM true /W 99 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k ?mj l ?UpxD faoA0&}> >[5U@?? ߇}m0 ma zI  F  EI endstream endobj 1524 0 obj <>stream 0 0 0 1 54 86 d1 54 0 0 85 0 1 cm BI /IM true /W 54 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &σ?<#Ga~}&?ۿ?w{{]yKk|~?Z EI endstream endobj 1525 0 obj <> endobj 1526 0 obj <>stream 0 0 0 0 61 88 d1 61 0 0 88 0 0 cm BI /IM true /W 61 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u He+ yu &_~/zɪ>o 5.!#b ,2Y EI endstream endobj 1530 0 obj <>stream 0 0 0 28 43 85 d1 43 0 0 57 0 28 cm BI /IM true /W 43 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?.3=AA_2 #`  l,0Y @@ EI endstream endobj 1531 0 obj <> endobj 1532 0 obj <>stream 0 0 0 0 182 174 d1 182 0 0 174 0 0 cm BI /IM true /W 182 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pbC (  ?&}nM@Hɇ+ k_/_/KxKׄ ^C\k @?Ɓ ~A'߆7 }/%F(QP\;  EI endstream endobj 1536 0 obj <>stream 0 0 0 -2 88 171 d1 88 0 0 173 0 -2 cm BI /IM true /W 88 /H 173 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ĩj`M<>>56~6,5  ʓ Q\@ EI endstream endobj 1537 0 obj <>stream 0 0 0 11 103 175 d1 103 0 0 164 0 11 cm BI /IM true /W 103 /H 164 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Dm d5J0DAx""3CA @M7& O>a<)/7&ɪozovx^۬6 v-[ %b-,X`e?l+' r zh?` vKxXm-] l4av o 4v+kaaXkk@ EI endstream endobj 1538 0 obj <>stream 0 0 0 2 162 173 d1 162 0 0 171 0 2 cm BI /IM true /W 162 /H 171 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;Tsl;4 0s. 88rj @S~@[ xo ?o~߿~?~//~}//z^/ PO _b@ٝ\H26jx? 5 ?~߿a߿zׯׅ__^/R)ڨ+  EI endstream endobj 1539 0 obj <>stream 0 0 0 1 128 175 d1 128 0 0 174 0 1 cm BI /IM true /W 128 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &z512F;ECSa }@O "n0- 7🴛oa???_ ]kv\0"i}%ᆗC |  dke A EI endstream endobj 1540 0 obj <>stream 0 0 0 1 57 173 d1 57 0 0 172 0 1 cm BI /IM true /W 57 /H 172 /BPC 1 /D[1 0] /F/CCF /DP<> ID P`?#P4  EI endstream endobj 1541 0 obj <>stream 0 0 0 60 115 175 d1 115 0 0 115 0 60 cm BI /IM true /W 115 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F'6d5 04,a@N  Xx@xI7ޓz?OxIO>[ oI& _턿_io za-k z \0\2U0d5AK 2  EI endstream endobj 1542 0 obj <>stream 0 0 0 60 118 224 d1 118 0 0 164 0 60 cm BI /IM true /W 118 /H 164 /BPC 1 /D[1 0] /F/CCF /DP<> ID &L'26k! 0j/"X= `7>zL=oA7 oaD0޽>oM0Dfh f Bba d4_Sԯ  EI endstream endobj 1543 0 obj <>stream 0 0 0 61 91 173 d1 91 0 0 112 0 61 cm BI /IM true /W 91 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &aMAf# '?P 8~l7 s IH20 Ӄ EI endstream endobj 1544 0 obj <>stream 0 0 0 8 120 175 d1 120 0 0 167 0 8 cm BI /IM true /W 120 /H 167 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S @ x 0T_ 0o MVÄa_U m oɀQ ~ *\C]o!K$ x < ?O??__[Wڮ  K[ N % i c KA W{aF[߽X}ka`6 ^  EI endstream endobj 1545 0 obj <>stream 0 0 0 0 131 173 d1 131 0 0 173 0 0 cm BI /IM true /W 131 /H 173 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Z 3 _ VԿk) nG'~?߶a߆Cm0a,0.I_  k 8,`@/ EI endstream endobj 1546 0 obj <>stream 0 0 0 58 120 173 d1 120 0 0 115 0 58 cm BI /IM true /W 120 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S @ x 0T_ 0o MVÄa_U m oɀQ ~ *\C]o!K$ x < ?O??__[Wڮ  K[ N % i @@ EI endstream endobj 1547 0 obj <>stream 0 0 0 58 85 173 d1 85 0 0 115 0 58 cm BI /IM true /W 85 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6 $`4d X@,A| (7 a=7M7^_ ]KZI-pq Ch`L/Z ]ia׭h.I2\"(\@rL 8]uuMU ]]0ae. pָ0AȰ'A #@ EI endstream endobj 1548 0 obj <>stream 0 0 0 0 19 120 d1 19 0 0 120 0 0 cm BI /IM true /W 19 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h'8o EI endstream endobj 1549 0 obj <>stream 0 0 0 8 72 90 d1 72 0 0 82 0 8 cm BI /IM true /W 72 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>DЂ <0~߃~%^ %q\.P`p~߆K z XLX࿐P  EI endstream endobj 1550 0 obj <>stream 0 0 0 6 79 93 d1 79 0 0 87 0 6 cm BI /IM true /W 79 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t h<#@<AxI0>MzO0AA7kz]x]][ m[ X0 ,0 z@@ EI endstream endobj 1551 0 obj <>stream 0 0 0 5 47 84 d1 47 0 0 79 0 5 cm BI /IM true /W 47 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &= f{o7{}o= >oO7 ]XzimX0 EI endstream endobj 1552 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3.=X=&Oo[o\=]Xad4  EI endstream endobj 1553 0 obj <>stream 0 0 0 3 51 84 d1 51 0 0 81 0 3 cm BI /IM true /W 51 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Hߜ @aa{ EI endstream endobj 1554 0 obj <>stream 0 0 0 -6 19 114 d1 19 0 0 120 0 -6 cm BI /IM true /W 19 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' EI endstream endobj 1555 0 obj <>stream 0 0 0 2 64 84 d1 64 0 0 82 0 2 cm BI /IM true /W 64 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?4!> cO P@ EI endstream endobj 1556 0 obj <>stream 0 0 0 -1 80 84 d1 80 0 0 85 0 -1 cm BI /IM true /W 80 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID *+&u CP%[PU\=kK^_l2]z5u޿k i_P EI endstream endobj 1557 0 obj <>stream 0 0 0 2 78 84 d1 78 0 0 82 0 2 cm BI /IM true /W 78 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID & szr$/_|/(_K_/_/A_Kh=" z!_ EI endstream endobj 1558 0 obj <>stream 0 0 0 2 78 84 d1 78 0 0 82 0 2 cm BI /IM true /W 78 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &FU@Țo! ? ?oo//_^/ o%!@  EI endstream endobj 1559 0 obj <>stream 0 0 0 72 13 84 d1 13 0 0 12 0 72 cm BI /IM true /W 13 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Mu` EI endstream endobj 1560 0 obj <>stream 0 0 0 2 59 86 d1 59 0 0 84 0 2 cm BI /IM true /W 59 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Pf|W6߇.&_^?Ar@ EI endstream endobj 1561 0 obj <>stream 0 0 0 2 84 84 d1 84 0 0 82 0 2 cm BI /IM true /W 84 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|0jC,~  Br P4aC`~C-?~~%r>\ EI endstream endobj 1562 0 obj <>stream 0 0 0 11 58 84 d1 58 0 0 73 0 11 cm BI /IM true /W 58 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P(Za8&5JO kh axXMWa@@ EI endstream endobj 1563 0 obj <>stream 0 0 0 18 50 86 d1 50 0 0 68 0 18 cm BI /IM true /W 50 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &` zz@xD? ,)( EI endstream endobj 1564 0 obj <>stream 0 0 0 31 56 111 d1 56 0 0 80 0 31 cm BI /IM true /W 56 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P /-N0Aa/^^0r`)UL$) EI endstream endobj 1565 0 obj <>stream 0 0 0 32 15 84 d1 15 0 0 52 0 32 cm BI /IM true /W 15 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID & kk EI endstream endobj 1566 0 obj <>stream 0 0 0 1 46 94 d1 46 0 0 93 0 1 cm BI /IM true /W 46 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k5O߿o~ ?߿?o~o߿~o{P EI endstream endobj 1567 0 obj <>stream 0 0 0 32 56 84 d1 56 0 0 52 0 32 cm BI /IM true /W 56 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &O}{_Z_/}4O "  5I EI endstream endobj 1568 0 obj <>stream 0 0 0 71 15 84 d1 15 0 0 13 0 71 cm BI /IM true /W 15 /H 13 /BPC 1 /D[1 0] /F/CCF /DP<> ID & kj  EI endstream endobj 1569 0 obj <>stream 0 0 0 11 56 86 d1 56 0 0 75 0 11 cm BI /IM true /W 56 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H>CA0|_q @7^z`W !׬& EI endstream endobj 1570 0 obj <>stream 0 0 0 30 46 86 d1 46 0 0 56 0 30 cm BI /IM true /W 46 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A8==D2z zL>AM&__ Av[a  EI endstream endobj 1571 0 obj <>stream 0 0 0 31 54 84 d1 54 0 0 53 0 31 cm BI /IM true /W 54 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ɮO}Nq\It8{0 EI endstream endobj 1572 0 obj <>stream 0 0 0 11 47 84 d1 47 0 0 73 0 11 cm BI /IM true /W 47 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Zqy5Kk!ɪ@@ EI endstream endobj 1573 0 obj <>stream 0 0 0 30 55 86 d1 55 0 0 56 0 30 cm BI /IM true /W 55 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AF2ukCtpc]~ k x|Σ a?4G_^ -X`@ EI endstream endobj 1574 0 obj <>stream 0 0 0 31 58 84 d1 58 0 0 53 0 31 cm BI /IM true /W 58 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P(Za8&5JO k ]*bɪ_ b ( EI endstream endobj 1575 0 obj <>stream 0 0 0 11 56 86 d1 56 0 0 75 0 11 cm BI /IM true /W 56 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A@ed]pAwO=r bW~II ɯ/ka fe_0^^?Aua@@ EI endstream endobj 1576 0 obj <>stream 0 0 0 30 45 86 d1 45 0 0 56 0 30 cm BI /IM true /W 45 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID & D@OA=Fz:~&|}ɪAm{5᭯X0gP EI endstream endobj 1577 0 obj <>stream 0 0 0 31 60 84 d1 60 0 0 53 0 31 cm BI /IM true /W 60 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &GSQ 4k%0a{Gԍ ɪ(40 EI endstream endobj 1578 0 obj <>stream 0 0 0 32 58 86 d1 58 0 0 54 0 32 cm BI /IM true /W 58 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_-p@Ӻ։3=dV5U  EI endstream endobj 1579 0 obj <>stream 0 0 0 30 44 86 d1 44 0 0 56 0 30 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@LA#u=6Rj^ W O- 30D4wT׆.}% @@ EI endstream endobj 1580 0 obj <>stream 0 0 0 0 39 103 d1 39 0 0 103 0 0 cm BI /IM true /W 39 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C@==(ڿ0O?N 4?@ EI endstream endobj 1581 0 obj <>stream 0 0 0 9 44 84 d1 44 0 0 75 0 9 cm BI /IM true /W 44 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Qw5@Qc O@ EI endstream endobj 1582 0 obj <>stream 0 0 0 30 48 86 d1 48 0 0 56 0 30 cm BI /IM true /W 48 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@@t ޾z}<%u֣*7_il/ /[_hD@ EI endstream endobj 1583 0 obj <>stream 0 0 0 32 54 84 d1 54 0 0 52 0 32 cm BI /IM true /W 54 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &." 5k"Pvt 5pKmv׊ }O:}? zMF#M8P EI endstream endobj 1584 0 obj <>stream 0 0 0 30 53 86 d1 53 0 0 56 0 30 cm BI /IM true /W 53 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,( EI endstream endobj 1585 0 obj <>stream 0 0 0 29 60 86 d1 60 0 0 57 0 29 cm BI /IM true /W 60 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & >@ x zxFC`=7 ɯx\5zz/kaK`ȺAF EI endstream endobj 1586 0 obj <>stream 0 0 0 30 48 84 d1 48 0 0 54 0 30 cm BI /IM true /W 48 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID "At  Ԛh  EI endstream endobj 1587 0 obj <>stream 0 0 0 1 31 84 d1 31 0 0 83 0 1 cm BI /IM true /W 31 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D@@ EI endstream endobj 1588 0 obj <>stream 0 0 0 29 61 86 d1 61 0 0 57 0 29 cm BI /IM true /W 61 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@i|A 0E8p }?a ]AqLZ ? _],6.= @` EI endstream endobj 1589 0 obj <>stream 0 0 0 30 67 84 d1 67 0 0 54 0 30 cm BI /IM true /W 67 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"hA?(оd* EI endstream endobj 1590 0 obj <>stream 0 0 0 1 66 86 d1 66 0 0 85 0 1 cm BI /IM true /W 66 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &9@_ xA@P T2 tA^ᆻaw 'k"7#ra? @@ EI endstream endobj 1591 0 obj <>stream 0 0 0 1 86 86 d1 86 0 0 85 0 1 cm BI /IM true /W 86 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j ?10+Ȁ" ް7MA[ }?O5x_Kzw zKzKa `,2 Xx,3Ld4 EI endstream endobj 1592 0 obj <>stream 0 0 0 30 66 107 d1 66 0 0 77 0 30 cm BI /IM true /W 66 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID #AQDxA |C  >o ?_]iD%†B)5 !Q EI endstream endobj 1593 0 obj <>stream 0 0 0 8 43 86 d1 43 0 0 78 0 8 cm BI /IM true /W 43 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ܠ' <.}&޾!ā5>3? EI endstream endobj 1594 0 obj <>stream 0 0 0 0 30 84 d1 30 0 0 84 0 0 cm BI /IM true /W 30 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D\_A?_[ ( EI endstream endobj 1595 0 obj <>stream 0 0 0 30 106 84 d1 106 0 0 54 0 30 cm BI /IM true /W 106 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M(Ђ?KtMvE`L41A_kY d00H  EI endstream endobj 1596 0 obj <>stream 0 0 0 31 50 84 d1 50 0 0 53 0 31 cm BI /IM true /W 50 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID MsPc ?~7~}}ko{x}~߷ow~t~_ EI endstream endobj 1597 0 obj <>stream 0 0 0 29 54 86 d1 54 0 0 57 0 29 cm BI /IM true /W 54 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0z#| 7}&5M?IC:_k.a-a`0  EI endstream endobj 1598 0 obj <>stream 0 0 0 1 59 86 d1 59 0 0 85 0 1 cm BI /IM true /W 59 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID 6W v\Appz.דPTZ4d3@Ŀ![p..,",26+@i0pl}t/5_ׇ] ^vu EO . g@π EI endstream endobj 1599 0 obj <>stream 0 0 0 30 67 86 d1 67 0 0 56 0 30 cm BI /IM true /W 67 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/ a AD~?P=5rp.D@ EI endstream endobj 1600 0 obj <>stream 0 0 0 32 51 84 d1 51 0 0 52 0 32 cm BI /IM true /W 51 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k3{~톶{὾oo/ EI endstream endobj 1601 0 obj <>stream 0 0 0 6 72 93 d1 72 0 0 87 0 6 cm BI /IM true /W 72 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t  8< 3 @&o_I&|$ ސ}~I ?_kao[\50 W 4p EI endstream endobj 1602 0 obj <>stream 0 0 0 8 78 90 d1 78 0 0 82 0 8 cm BI /IM true /W 78 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ți ( ??8 EI endstream endobj 1603 0 obj <>stream 0 0 0 72 14 107 d1 14 0 0 35 0 72 cm BI /IM true /W 14 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7{ cM~( EI endstream endobj 1604 0 obj <>stream 0 0 0 2 48 87 d1 48 0 0 85 0 2 cm BI /IM true /W 48 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^B'#=`zM'訽p~7x EI endstream endobj 1605 0 obj <>stream 0 0 0 32 14 107 d1 14 0 0 75 0 32 cm BI /IM true /W 14 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7{ cM~,/0ɮ@@ EI endstream endobj 1606 0 obj <>stream 0 0 0 0 53 87 d1 53 0 0 87 0 0 cm BI /IM true /W 53 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C6(~hߠ'7L>K륐kOfQ AkZ@/ 5\.ZD4_{.hxaO/|0t<@ EI endstream endobj 1607 0 obj <>stream 0 0 0 2 71 84 d1 71 0 0 82 0 2 cm BI /IM true /W 71 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &sDІ]xhY(|/ ?z}}|.!WV  EI endstream endobj 1608 0 obj <>stream 0 0 0 2 35 84 d1 35 0 0 82 0 2 cm BI /IM true /W 35 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID jī  EI endstream endobj 1609 0 obj <>stream 0 0 0 2 95 84 d1 95 0 0 82 0 2 cm BI /IM true /W 95 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID & |`0[A? F[I- ?ooH0o[ I,OA@ EI endstream endobj 1610 0 obj <>stream 0 0 0 31 66 108 d1 66 0 0 77 0 31 cm BI /IM true /W 66 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$xA<' rj{ uoX~_^}o Mרo+.   EI endstream endobj 1611 0 obj <>stream 0 0 0 29 52 86 d1 52 0 0 57 0 29 cm BI /IM true /W 52 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0<"0G&x[>CLQ~> aiq0Y 0gP EI endstream endobj 1612 0 obj <>stream 0 0 0 2 43 84 d1 43 0 0 82 0 2 cm BI /IM true /W 43 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID ?ā EI endstream endobj 1613 0 obj <>stream 0 0 0 29 43 86 d1 43 0 0 57 0 29 cm BI /IM true /W 43 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &R?K>/jAp/׮Ay $Z kPe8aAG_k.%  EI endstream endobj 1614 0 obj <>stream 0 0 0 49 66 54 d1 66 0 0 5 0 49 cm BI /IM true /W 66 /H 5 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 1615 0 obj <>stream 0 0 0 2 118 84 d1 118 0 0 82 0 2 cm BI /IM true /W 118 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &s`O&du?EA?M?[7ooAMO[ 7Ooodl7@ EI endstream endobj 1616 0 obj <>stream 0 0 0 51 35 63 d1 35 0 0 12 0 51 cm BI /IM true /W 35 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 1617 0 obj <>stream 0 0 0 0 65 83 d1 65 0 0 83 0 0 cm BI /IM true /W 65 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID eMD$}~/ //KK]\/?a??aD.  EI endstream endobj 1618 0 obj <>stream 0 0 0 30 61 110 d1 61 0 0 80 0 30 cm BI /IM true /W 61 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!<E8a7z_]d .-E>N ȡq{:@azMڗߧvv G)`h  EI endstream endobj 1619 0 obj <>stream 0 0 0 9 41 84 d1 41 0 0 75 0 9 cm BI /IM true /W 41 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Z}?E}@ EI endstream endobj 1620 0 obj <>stream 0 0 0 32 56 84 d1 56 0 0 52 0 32 cm BI /IM true /W 56 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\ O[?&oo[[0N,'5H5M@@ EI endstream endobj 1621 0 obj <>stream 0 0 0 9 49 84 d1 49 0 0 75 0 9 cm BI /IM true /W 49 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A,ɯb톟i} H EI endstream endobj 1622 0 obj <>stream 0 0 0 32 55 112 d1 55 0 0 80 0 32 cm BI /IM true /W 55 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & zz}.^K޿[?_?_!D4' |5 EI endstream endobj 1623 0 obj <>stream 0 0 0 8 67 90 d1 67 0 0 82 0 8 cm BI /IM true /W 67 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &OȚᮿx^?_ׅp/Q@ EI endstream endobj 1624 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^B |@x[" Ӧow{^! y| oQ?K_ wam+h<@ EI endstream endobj 1625 0 obj <>stream 0 0 0 5 47 87 d1 47 0 0 82 0 5 cm BI /IM true /W 47 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@h0H#1x0oM޿ S]?~G{_vFc !yͯ|(|(@ EI endstream endobj 1626 0 obj <>stream 0 0 0 2 77 84 d1 77 0 0 82 0 2 cm BI /IM true /W 77 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A+?A>  x {`KL  EI endstream endobj 1627 0 obj <>stream 0 0 0 2 91 84 d1 91 0 0 82 0 2 cm BI /IM true /W 91 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &VM/4aA* \o?7_z_zz^ׄ` FVp\ @ EI endstream endobj 1628 0 obj <>stream 0 0 0 1 66 86 d1 66 0 0 85 0 1 cm BI /IM true /W 66 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P DA'  7_~K0\y ?P EI endstream endobj 1629 0 obj <>stream 0 0 0 0 48 84 d1 48 0 0 84 0 0 cm BI /IM true /W 48 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Ij Gߺ߇[k!D@ EI endstream endobj 1630 0 obj <>stream 0 0 0 31 92 84 d1 92 0 0 53 0 31 cm BI /IM true /W 92 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p3V  GO o>ao}[[Z__NZ[TFH  EI endstream endobj 1631 0 obj <>stream 0 0 0 2 78 87 d1 78 0 0 85 0 2 cm BI /IM true /W 78 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &HP#aAH7ނa_2Z4Cb EI endstream endobj 1632 0 obj <>stream 0 0 0 32 13 84 d1 13 0 0 52 0 32 cm BI /IM true /W 13 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Mu`_` EI endstream endobj 1633 0 obj <>stream 0 0 0 1 57 86 d1 57 0 0 85 0 1 cm BI /IM true /W 57 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!1T3 |@&trւb}//55ap6ix0day ] _) EI endstream endobj 1634 0 obj <>stream 0 0 0 3 26 84 d1 26 0 0 81 0 3 cm BI /IM true /W 26 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID j)@_5L/ EI endstream endobj 1635 0 obj <>stream 0 0 0 30 38 86 d1 38 0 0 56 0 30 cm BI /IM true /W 38 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0$< zÈ ap_uAY py  @ ^j P_d5ȁx20O EI endstream endobj 1636 0 obj <>stream 0 0 0 30 51 86 d1 51 0 0 56 0 30 cm BI /IM true /W 51 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !ax EI endstream endobj 1637 0 obj <>stream 0 0 0 31 57 84 d1 57 0 0 53 0 31 cm BI /IM true /W 57 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&k.6p &C'  EI endstream endobj 1638 0 obj <>stream 0 0 0 55 32 63 d1 32 0 0 8 0 55 cm BI /IM true /W 32 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 1639 0 obj <>stream 0 0 0 2 115 87 d1 115 0 0 85 0 2 cm BI /IM true /W 115 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`L;OOOOz ?k|' 7߾p[V- $k}>moz-> ׾$h4 !* EI endstream endobj 1640 0 obj <>stream 0 0 0 30 44 86 d1 44 0 0 56 0 30 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ @ EI endstream endobj 1641 0 obj <>stream 0 0 0 1 26 84 d1 26 0 0 83 0 1 cm BI /IM true /W 26 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID j)@_5 EI endstream endobj 1642 0 obj <>stream 0 0 0 32 56 108 d1 56 0 0 76 0 32 cm BI /IM true /W 56 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3@~ ŷo ? |'[}a-}o[oL   EI endstream endobj 1643 0 obj <>stream 0 0 0 5 39 84 d1 39 0 0 79 0 5 cm BI /IM true /W 39 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID & m||@ EI endstream endobj 1644 0 obj <>stream 0 0 0 8 82 90 d1 82 0 0 82 0 8 cm BI /IM true /W 82 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &R c0}|//K }/__ |/.7h/k^a{ko`a~5!?@ EI endstream endobj 1645 0 obj <>stream 0 0 0 7 14 42 d1 14 0 0 35 0 7 cm BI /IM true /W 14 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7 ߿^1& @ EI endstream endobj 1646 0 obj <>stream 0 0 0 31 39 84 d1 39 0 0 53 0 31 cm BI /IM true /W 39 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID A?&=~C?Ѣa=5BN  EI endstream endobj 1647 0 obj <>stream 0 0 0 3 84 84 d1 84 0 0 81 0 3 cm BI /IM true /W 84 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &UCJf_fĆ+? EI endstream endobj 1648 0 obj <>stream 0 0 0 1 67 84 d1 67 0 0 83 0 1 cm BI /IM true /W 67 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"hAyh_ W`^?P?"  EI endstream endobj 1649 0 obj <>stream 0 0 0 2 97 86 d1 97 0 0 84 0 2 cm BI /IM true /W 97 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|Wo׭ (~_'׭X_ o()0 EI endstream endobj 1650 0 obj <>stream 0 0 0 2 81 84 d1 81 0 0 82 0 2 cm BI /IM true /W 81 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID %PsP)BFUC|Geῇ_ }z ^AAx(Rhe( EI endstream endobj 1651 0 obj <>stream 0 0 0 9 54 84 d1 54 0 0 75 0 9 cm BI /IM true /W 54 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N  ɮPzp=a4_aA]kb@ EI endstream endobj 1652 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &. _ɪXk"S>h ߿ K/ (X` EI endstream endobj 1653 0 obj <>stream 0 0 0 31 56 113 d1 56 0 0 82 0 31 cm BI /IM true /W 56 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$0?kt & |. o\{_pguG`}A}o_"Gj|0N `P EI endstream endobj 1654 0 obj <>stream 0 0 0 2 96 84 d1 96 0 0 82 0 2 cm BI /IM true /W 96 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?_)@ EI endstream endobj 1655 0 obj <>stream 0 0 0 2 97 86 d1 97 0 0 84 0 2 cm BI /IM true /W 97 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xCK(<zDa>y55B[s_}//_5~ 0?~/!EAB&A EI endstream endobj 1656 0 obj <>stream 0 0 0 2 73 84 d1 73 0 0 82 0 2 cm BI /IM true /W 73 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &o%__|)~}}( EI endstream endobj 1657 0 obj <>stream 0 0 0 31 57 107 d1 57 0 0 76 0 31 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID $j)@kZ"&a0@ a}~}ׯ]k`D-.<0H2p  EI endstream endobj 1658 0 obj <>stream 0 0 0 -6 47 114 d1 47 0 0 120 0 -6 cm BI /IM true /W 47 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &m~߽~߽a߽ EI endstream endobj 1659 0 obj <>stream 0 0 0 8 68 90 d1 68 0 0 82 0 8 cm BI /IM true /W 68 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ț@|>P ?߆_}xAz_ (AC` EI endstream endobj 1660 0 obj <>stream 0 0 0 0 58 84 d1 58 0 0 84 0 0 cm BI /IM true /W 58 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/4#i5h ?\/+C1 EI endstream endobj 1662 0 obj <>stream 0 0 0 30 54 110 d1 54 0 0 80 0 30 cm BI /IM true /W 54 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A6| =>z o.Kz!\Ap B)uGL8#P(>H {7&av/^ +Ma7$ EI endstream endobj 1663 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &MPMdt ^ 9xTP EI endstream endobj 1664 0 obj <>stream 0 0 0 11 58 86 d1 58 0 0 75 0 11 cm BI /IM true /W 58 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f?\ q =>stream 0 0 0 9 49 86 d1 49 0 0 77 0 9 cm BI /IM true /W 49 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &'@< A? zi}v+  EI endstream endobj 1666 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ɮD wC3?̩Qڀ EI endstream endobj 1667 0 obj <>stream 0 0 0 0 81 87 d1 81 0 0 87 0 0 cm BI /IM true /W 81 /H 87 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t  85mp˄H a1>/A}A/}|koG_ aw^mwl/ v ='0 EI endstream endobj 1668 0 obj <>stream 0 0 0 31 66 84 d1 66 0 0 53 0 31 cm BI /IM true /W 66 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x)?Η[&} }azҸ EI endstream endobj 1669 0 obj <>stream 0 0 0 31 91 84 d1 91 0 0 53 0 31 cm BI /IM true /W 91 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID $I56@4ӄOK~6LX`iqdž&AP EI endstream endobj 1670 0 obj <>stream 0 0 0 31 57 86 d1 57 0 0 55 0 31 cm BI /IM true /W 57 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CAa<3 o OZ]W A5A  EI endstream endobj 1671 0 obj <>stream 0 0 0 30 44 86 d1 44 0 0 56 0 30 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h7A [W(6^K 0l<@ EI endstream endobj 1672 0 obj <>stream 0 0 0 11 37 86 d1 37 0 0 75 0 11 cm BI /IM true /W 37 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &O?t?jd0" EI endstream endobj 1673 0 obj <>stream 0 0 0 1 57 86 d1 57 0 0 85 0 1 cm BI /IM true /W 57 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N>D?h0A7a}?_v&/a dᣏQ0 EI endstream endobj 1674 0 obj <>stream 0 0 0 2 82 87 d1 82 0 0 85 0 2 cm BI /IM true /W 82 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`5?EG^O>[VP?^ׅ}o߅>~&0O?BA@ EI endstream endobj 1675 0 obj <> endobj 1676 0 obj <>stream 0 0 0 0 61 83 d1 61 0 0 83 0 0 cm BI /IM true /W 61 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &=/|%_ K//~//|}|?!ׯK^A@+ @0  EI endstream endobj 1680 0 obj <>stream 0 0 0 0 54 83 d1 54 0 0 83 0 0 cm BI /IM true /W 54 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &,' ʪ EI endstream endobj 1681 0 obj <>stream 0 0 0 0 50 83 d1 50 0 0 83 0 0 cm BI /IM true /W 50 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5 pʐo EI endstream endobj 1682 0 obj <>stream 0 0 0 -24 54 83 d1 54 0 0 107 0 -24 cm BI /IM true /W 54 /H 107 /BPC 1 /D[1 0] /F/CCF /DP<> ID &,' ʪO7׵AvK 5]mmoa EI endstream endobj 1683 0 obj <>stream 0 0 0 0 60 83 d1 60 0 0 83 0 0 cm BI /IM true /W 60 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4 _/__ _B EI endstream endobj 1684 0 obj <>stream 0 0 0 -2 61 86 d1 61 0 0 88 0 -2 cm BI /IM true /W 61 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u He+ yu &_~/zɪ>o 5.!#b ,2Y EI endstream endobj 1685 0 obj <>stream 0 0 0 0 11 83 d1 11 0 0 83 0 0 cm BI /IM true /W 11 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID & EI endstream endobj 1686 0 obj <>stream 0 0 0 0 69 83 d1 69 0 0 83 0 0 cm BI /IM true /W 69 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID (O5w_]p^=z\_\28_tztzp\__ EI endstream endobj 1687 0 obj <>stream 0 0 0 -2 54 86 d1 54 0 0 88 0 -2 cm BI /IM true /W 54 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$0  /FaAw}u]-uxY  a.a-tr.Ph5ud0a=B= Y@@ EI endstream endobj 1688 0 obj <>stream 0 0 0 0 61 83 d1 61 0 0 83 0 0 cm BI /IM true /W 61 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>N ߐ̯/__K_^ x%6.%`F|σ~C0?o ^OW "`@ EI endstream endobj 1689 0 obj <>stream 0 0 0 0 48 83 d1 48 0 0 83 0 0 cm BI /IM true /W 48 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID & EI endstream endobj 1690 0 obj <>stream 0 0 0 -2 75 86 d1 75 0 0 88 0 -2 cm BI /IM true /W 75 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t &Dzx@)zx@}>o~[AoOv zp_]x] v K a- V/ `pːjD@ EI endstream endobj 1691 0 obj <>stream 0 0 0 -2 63 86 d1 63 0 0 88 0 -2 cm BI /IM true /W 63 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u \o<,T뚂0AKt^^_%.O!o}CV0]^װ =Q: EI endstream endobj 1692 0 obj <>stream 0 0 0 -19 69 83 d1 69 0 0 102 0 -19 cm BI /IM true /W 69 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID (O5w_]p^=z\_\28_tztzp\__  EI endstream endobj 1693 0 obj <>stream 0 0 0 5 51 83 d1 51 0 0 78 0 5 cm BI /IM true /W 51 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Pė ??߿ } EI endstream endobj 1694 0 obj <>stream 0 0 0 2 49 86 d1 49 0 0 84 0 2 cm BI /IM true /W 49 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3.c?M}0 ?uK{ ^׆\Kf[ ߇oc a>Y |@ EI endstream endobj 1695 0 obj <>stream 0 0 0 6 44 86 d1 44 0 0 80 0 6 cm BI /IM true /W 44 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ ?; =o X0 EI endstream endobj 1696 0 obj <>stream 0 0 0 30 44 108 d1 44 0 0 78 0 30 cm BI /IM true /W 44 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M@AiFo \h7A [W(6^K 0l<@ EI endstream endobj 1697 0 obj <>stream 0 0 0 5 53 86 d1 53 0 0 81 0 5 cm BI /IM true /W 53 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,r?0n  EI endstream endobj 1698 0 obj <>stream 0 0 0 32 58 84 d1 58 0 0 52 0 32 cm BI /IM true /W 58 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID %?jauM`/[ o޸iaۭoֺZxF[ՇWo ^a}C4/ EI endstream endobj 1699 0 obj <>stream 0 0 0 32 43 84 d1 43 0 0 52 0 32 cm BI /IM true /W 43 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID c&!{o ww}>xaow EI endstream endobj 1700 0 obj <>stream 0 0 0 1 92 84 d1 92 0 0 83 0 1 cm BI /IM true /W 92 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &B̂Xua߽v Wz/kkp]]t .? kkkk / EI endstream endobj 1701 0 obj <>stream 0 0 0 5 60 86 d1 60 0 0 81 0 5 cm BI /IM true /W 60 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID & >@ x zxFC`=7 ɯx\5zz/kaK`ȺAFC@3r Xx}{ l( EI endstream endobj 1702 0 obj <>stream 0 0 0 5 61 86 d1 61 0 0 81 0 5 cm BI /IM true /W 61 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@i|A 0E8p }?a ]AqLZ ? _],6.= @q4e8eXx}{ l( EI endstream endobj 1703 0 obj <>stream 0 0 0 1 61 86 d1 61 0 0 85 0 1 cm BI /IM true /W 61 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@i|A 0E8p }?a ]AqLZ ? _],6.= @q7!fXf@@ EI endstream endobj 1704 0 obj <>stream 0 0 0 1 82 86 d1 82 0 0 85 0 1 cm BI /IM true /W 82 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k jI| )<- ޓ| IW¾s\(xd;k [k~07*~<x0O5y m\@ EI endstream endobj 1705 0 obj <>stream 0 0 0 66 20 107 d1 20 0 0 41 0 66 cm BI /IM true /W 20 /H 41 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`=>~KCGԚXa@@ EI endstream endobj 1706 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3`g*"qG|'MCIf>A .?X_u d0ΡAE8>stream 0 0 0 7 27 84 d1 27 0 0 77 0 7 cm BI /IM true /W 27 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID _ɨpj' a>۽5 EI endstream endobj 1708 0 obj <>stream 0 0 0 1 92 86 d1 92 0 0 85 0 1 cm BI /IM true /W 92 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S5"2pA5X  AK^ X xS_& k\6]5 / !||'Q7kj EI endstream endobj 1709 0 obj <>stream 0 0 0 29 52 108 d1 52 0 0 79 0 29 cm BI /IM true /W 52 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Hoa `fC6]pK G t xA>A7 "fK삎 k K ag :@ EI endstream endobj 1710 0 obj <>stream 0 0 0 66 19 84 d1 19 0 0 18 0 66 cm BI /IM true /W 19 /H 18 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|ɮkaa EI endstream endobj 1711 0 obj <>stream 0 0 0 2 94 86 d1 94 0 0 84 0 2 cm BI /IM true /W 94 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Si@̂=NzOzO߯n5 EI endstream endobj 1712 0 obj <>stream 0 0 0 2 82 84 d1 82 0 0 82 0 2 cm BI /IM true /W 82 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID $+&20YaamWu o[ipa޻Ki}oᆂ/l% ~]봷=_O^X}z?}7I}?P=8x@? "M EI endstream endobj 1713 0 obj <>stream 0 0 0 -19 71 84 d1 71 0 0 103 0 -19 cm BI /IM true /W 71 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID &sDІ]xhY(|/ ?z}}|.!WV phAE|>ڀ EI endstream endobj 1714 0 obj <>stream 0 0 0 3 30 108 d1 30 0 0 105 0 3 cm BI /IM true /W 30 /H 105 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~wɪMk:4O~_ EI endstream endobj 1715 0 obj <>stream 0 0 0 0 40 84 d1 40 0 0 84 0 0 cm BI /IM true /W 40 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\OɨC@==O 7جX0P EI endstream endobj 1716 0 obj <>stream 0 0 0 1 57 84 d1 57 0 0 83 0 1 cm BI /IM true /W 57 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&k.6 ^8g~?L@ EI endstream endobj 1717 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A <,=W}~___>_m/`^8 _Ooo [dž V aD@ EI endstream endobj 1718 0 obj <>stream 0 0 0 31 66 84 d1 66 0 0 53 0 31 cm BI /IM true /W 66 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID *)(:iauim[ /[Xk KF~70սoH7 ? EI endstream endobj 1719 0 obj <>stream 0 0 0 5 54 86 d1 54 0 0 81 0 5 cm BI /IM true /W 54 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0z#| 7}&5M?IC:_k.a-a`0 '3tpKXK^u@ EI endstream endobj 1720 0 obj <>stream 0 0 0 5 61 86 d1 61 0 0 81 0 5 cm BI /IM true /W 61 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@i|A 0E8p }?a ]AqLZ ? _],6.= @q 0\׮u]a EI endstream endobj 1721 0 obj <>stream 0 0 0 5 54 86 d1 54 0 0 81 0 5 cm BI /IM true /W 54 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0z#| 7}&5M?IC:_k.a-a`0 ?>ht=`} } EI endstream endobj 1722 0 obj <>stream 0 0 0 6 44 86 d1 44 0 0 80 0 6 cm BI /IM true /W 44 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ ?4\./ZX. ` EI endstream endobj 1723 0 obj <>stream 0 0 0 31 57 107 d1 57 0 0 76 0 31 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kk)b́-@&zM?DŽ}_/_ h/z`'y x EI endstream endobj 1724 0 obj <>stream 0 0 0 50 117 53 d1 117 0 0 3 0 50 cm BI /IM true /W 117 /H 3 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 1725 0 obj <>stream 0 0 0 0 68 84 d1 68 0 0 84 0 0 cm BI /IM true /W 68 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!4 O#5tQ?? ߰>p+k!!@ EI endstream endobj 1726 0 obj <>stream 0 0 0 5 49 87 d1 49 0 0 82 0 5 cm BI /IM true /W 49 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H`G'>}0'_/཮ h- o[a, q년@5}>a7 _._[ - b ,0 EI endstream endobj 1727 0 obj <>stream 0 0 0 0 49 75 d1 49 0 0 75 0 0 cm BI /IM true /W 49 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ӯ|0}[ v{{ᇆ{{}7὾}o>z`4a"ձ_aaG@ EI endstream endobj 1728 0 obj <>stream 0 0 0 9 54 84 d1 54 0 0 75 0 9 cm BI /IM true /W 54 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t5EM!5~oo/ EI endstream endobj 1729 0 obj <>stream 0 0 0 11 49 86 d1 49 0 0 75 0 11 cm BI /IM true /W 49 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A 3xOOo_? _t& ~ K]sD y~?=j  EI endstream endobj 1730 0 obj <>stream 0 0 0 9 49 86 d1 49 0 0 77 0 9 cm BI /IM true /W 49 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3 x  >AOwKK޶  kk/ EI endstream endobj 1731 0 obj <>stream 0 0 0 2 96 84 d1 96 0 0 82 0 2 cm BI /IM true /W 96 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &)𾾿____ 1}A__/~/__/KA~K__/K_Bd` EI endstream endobj 1732 0 obj <>stream 0 0 0 3 52 87 d1 52 0 0 84 0 3 cm BI /IM true /W 52 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f~a}~ݾߋ EI endstream endobj 1733 0 obj <> endobj 1737 0 obj <>stream 0 0 0 5 49 85 d1 49 0 0 80 0 5 cm BI /IM true /W 49 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &c?|?{ܠ EI endstream endobj 1738 0 obj <>stream 0 0 0 2 81 84 d1 81 0 0 82 0 2 cm BI /IM true /W 81 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID ; 55_5U?4g_ep?/O}/}@ EI endstream endobj 1739 0 obj <>stream 0 0 0 1 87 107 d1 87 0 0 106 0 1 cm BI /IM true /W 87 /H 106 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~hx@O^x_?!U?C4O0,? tAD,<#^[t A7p ի0Wо>XU \=v]Ap Apap a`,0!c!T@ EI endstream endobj 1740 0 obj <> endobj 1741 0 obj <>stream 0 0 0 0 178 174 d1 178 0 0 174 0 0 cm BI /IM true /W 178 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID $&  7!v-]:\?]p/pï ߺ z?ka4zvx]aۯA߇K]x]nwvzwK~kk@@ EI endstream endobj 1745 0 obj <>stream 0 0 0 62 128 222 d1 128 0 0 160 0 62 cm BI /IM true /W 128 /H 160 /BPC 1 /D[1 0] /F/CCF /DP<> ID +`yP`G ^< N?@4  L?A}0o߫? ~/_KkAhM,-Xaa.kX0Pdk ru@@ EI endstream endobj 1746 0 obj <>stream 0 0 0 12 103 176 d1 103 0 0 164 0 12 cm BI /IM true /W 103 /H 164 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Dm d5J0DAx""3CA @M7& O>a<)/7&ɪozovx^۬6 v-[ %b-,X`e?l+' r zh?` vKxXm-] l4av o 4v+kaaXkk@ EI endstream endobj 1747 0 obj <>stream 0 0 0 62 129 174 d1 129 0 0 112 0 62 cm BI /IM true /W 129 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID +`j `TB/_^_֭୥`ois R  \@ EI endstream endobj 1748 0 obj <>stream 0 0 0 2 128 176 d1 128 0 0 174 0 2 cm BI /IM true /W 128 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j \4!bJy !^>?!<0 pxZA|/^CK/&߇ 붻 pv:K` _)> W _zp\) @<@ EI endstream endobj 1749 0 obj <>stream 0 0 0 1 56 174 d1 56 0 0 173 0 1 cm BI /IM true /W 56 /H 173 /BPC 1 /D[1 0] /F/CCF /DP<> ID P`#P4OA?[[ a@@ EI endstream endobj 1750 0 obj <>stream 0 0 0 61 99 176 d1 99 0 0 115 0 61 cm BI /IM true /W 99 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k ?mj l ?UpxD faoA0&}> >[5U@?? ߇}m0 ma zI  F  EI endstream endobj 1751 0 obj <>stream 0 0 0 61 103 176 d1 103 0 0 115 0 61 cm BI /IM true /W 103 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Dm d5J0DAx""3CA @M7& O>a<)/7&ɪozovx^۬6 v-[ %b-,X`e?l+' EI endstream endobj 1752 0 obj <>stream 0 0 0 62 129 176 d1 129 0 0 114 0 62 cm BI /IM true /W 129 /H 114 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F\3!%! Y}! 7& ^o]Bc!U&$5ƿ4@ EI endstream endobj 1753 0 obj <>stream 0 0 0 14 82 173 d1 82 0 0 159 0 14 cm BI /IM true /W 82 /H 159 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u  گ<'* oW·׭~_?ƿ{~ >>} EI endstream endobj 1754 0 obj <>stream 0 0 0 58 99 219 d1 99 0 0 161 0 58 cm BI /IM true /W 99 /H 161 /BPC 1 /D[1 0] /F/CCF /DP<> ID &&E_ ӕ0gd X}=^]zX%Smp\.FRo@ ~@z ނaM7'}}>'[Wk_z_&%< ~~~aal5߶ a.X1  ,/6d@@ EI endstream endobj 1755 0 obj <>stream 0 0 0 -1 120 173 d1 120 0 0 174 0 -1 cm BI /IM true /W 120 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S @ x 0T_ 0o MVÄa_U m oɀQ ~ *\C]o!K$ x < ?O??__[Wڮ  K[ N % i cr 30da<0{ r!¶/삂= ?`0 k5 @ EI endstream endobj 1756 0 obj <>stream 0 0 0 63 97 174 d1 97 0 0 111 0 63 cm BI /IM true /W 97 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;5E 5k$A&?a~þ{~~A}>{~~;~o6ߓ EI endstream endobj 1757 0 obj <>stream 0 0 0 0 145 169 d1 145 0 0 169 0 0 cm BI /IM true /W 145 /H 169 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D!oJ@Q@ x ztD@oH7~ |ޝ^ xa{^k EI endstream endobj 1758 0 obj <>stream 0 0 0 0 182 169 d1 182 0 0 169 0 0 cm BI /IM true /W 182 /H 169 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S d!_D "xO ɪ&~#Ao? `k׾}ÿz^K,8%\W ;0 >h5<r ^>~ }ݾm߾  }v¾A ٳ=.;- +;( l @ EI endstream endobj 1759 0 obj <>stream 0 0 0 57 119 167 d1 119 0 0 110 0 57 cm BI /IM true /W 119 /H 110 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u@7@ #2@AFv zAH8{wC߻? _wUü?w {~]00l%0T  3 480@ EI endstream endobj 1760 0 obj <>stream 0 0 0 57 93 167 d1 93 0 0 110 0 57 cm BI /IM true /W 93 /H 110 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Fl0S@ Aްz%-o Cn}ݷ~5[ 'K q \8ALS U pZuւax\`4X5km 2atA ~}_H?~}kmw2 r!maiWᅐW EI endstream endobj 1761 0 obj <>stream 0 0 0 12 78 167 d1 78 0 0 155 0 12 cm BI /IM true /W 78 /H 155 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C _P_ .0CV7o߰ݿw=?HkC00_ EI endstream endobj 1762 0 obj <>stream 0 0 0 57 111 167 d1 111 0 0 110 0 57 cm BI /IM true /W 111 /H 110 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A>< |?߿?P֜<>Ӿt߿o?o{?݇5]0_cb  ,20d n EI endstream endobj 1763 0 obj <>stream 0 0 0 57 113 167 d1 113 0 0 110 0 57 cm BI /IM true /W 113 /H 110 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Sgf PU PD2t 0zoVO&?&߿6oMT?~}޶a~ m^ v %Ar+ ` `y EI endstream endobj 1764 0 obj <>stream 0 0 0 2 63 87 d1 63 0 0 85 0 2 cm BI /IM true /W 63 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & nL=`}~  ?{ɪ{ '~i@ EI endstream endobj 1765 0 obj <>stream 0 0 0 2 76 87 d1 76 0 0 85 0 2 cm BI /IM true /W 76 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h$#@ч& ok| ?-/~P )? ?o{wݿ?K]_Op )@ EI endstream endobj 1766 0 obj <>stream 0 0 0 31 51 86 d1 51 0 0 55 0 31 cm BI /IM true /W 51 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &σ xG0A} K7>L~~C{o߼?߼H5 EI endstream endobj 1767 0 obj <>stream 0 0 0 31 41 86 d1 41 0 0 55 0 31 cm BI /IM true /W 41 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &J?a xA}7&߿'^>d \.h:p00,z@@ EI endstream endobj 1768 0 obj <>stream 0 0 0 9 33 86 d1 33 0 0 77 0 9 cm BI /IM true /W 33 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &~߇a=$Brk |@ EI endstream endobj 1769 0 obj <>stream 0 0 0 31 47 86 d1 47 0 0 55 0 31 cm BI /IM true /W 47 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p5><d1O6Hh.8[A@@ EI endstream endobj 1770 0 obj <>stream 0 0 0 31 45 86 d1 45 0 0 55 0 31 cm BI /IM true /W 45 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ȵ  o޷{{d~o6-0.<5/H EI endstream endobj 1771 0 obj <>stream 0 0 0 7 53 86 d1 53 0 0 79 0 7 cm BI /IM true /W 53 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,a` [P EI endstream endobj 1772 0 obj <>stream 0 0 0 7 53 86 d1 53 0 0 79 0 7 cm BI /IM true /W 53 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,5p\%XK ]p EI endstream endobj 1773 0 obj <>stream 0 0 0 7 51 86 d1 51 0 0 79 0 7 cm BI /IM true /W 51 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !a|.{x}{ EI endstream endobj 1774 0 obj <>stream 0 0 0 -6 28 114 d1 28 0 0 120 0 -6 cm BI /IM true /W 28 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &cXZZ -p]~p/z__a{x}{p EI endstream endobj 1775 0 obj <>stream 0 0 0 -6 28 114 d1 28 0 0 120 0 -6 cm BI /IM true /W 28 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &{{|7{{??_kz_ֽaz׭uZu@ EI endstream endobj 1776 0 obj <>stream 0 0 0 5 51 86 d1 51 0 0 81 0 5 cm BI /IM true /W 51 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4|0<-oM ްo[[;__kio_ a- !a|9 A|wa7 EI endstream endobj 1777 0 obj <>stream 0 0 0 0 129 120 d1 129 0 0 120 0 0 cm BI /IM true /W 129 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!ӐZ^޸aw_׿:x^uk mw׿\?]. pAw]z%__k EI endstream endobj 1778 0 obj <>stream 0 0 0 97 24 120 d1 24 0 0 23 0 97 cm BI /IM true /W 24 /H 23 /BPC 1 /D[1 0] /F/CCF /DP<> ID &OM=<'ɪ dN EI endstream endobj 1779 0 obj <>stream 0 0 0 7 64 120 d1 64 0 0 113 0 7 cm BI /IM true /W 64 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@D{j6> EI endstream endobj 1780 0 obj <>stream 0 0 0 2 132 123 d1 132 0 0 121 0 2 cm BI /IM true /W 132 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x6J)hׄ'|rA_^A}zK_/ \'2\2H܃X? ?߷𗯥/1 L@7@ EI endstream endobj 1781 0 obj <>stream 0 0 0 41 74 122 d1 74 0 0 81 0 41 cm BI /IM true /W 74 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j!x" >FAo a7}_nu Hk_`kwa׿l.Km-a kqᅆ !O T@ EI endstream endobj 1782 0 obj <>stream 0 0 0 42 93 154 d1 93 0 0 112 0 42 cm BI /IM true /W 93 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &eOA"\@o ߬xI~IA~|/zz~׆owm_m/ m'"|1 '5 EI endstream endobj 1783 0 obj <>stream 0 0 0 42 94 122 d1 94 0 0 80 0 42 cm BI /IM true /W 94 /H 80 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j A2o> F~? M7ZW ?W( / M` EI endstream endobj 1784 0 obj <>stream 0 0 0 -1 42 120 d1 42 0 0 121 0 -1 cm BI /IM true /W 42 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A\_)_[Xaa EI endstream endobj 1785 0 obj <>stream 0 0 0 41 61 122 d1 61 0 0 81 0 41 cm BI /IM true /W 61 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h:A> }>pM}~__׬y r "y q| 0  @ Ϣ50\z _l/5\6 \> <@ EI endstream endobj 1786 0 obj <>stream 0 0 0 11 59 122 d1 59 0 0 111 0 11 cm BI /IM true /W 59 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C O 7~A_z!kJMOa} EI endstream endobj 1787 0 obj <>stream 0 0 0 41 83 122 d1 83 0 0 81 0 41 cm BI /IM true /W 83 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kI"`^CaV<" G^ A&}>AooL?o޿5޿z a-\5il0Ka,2"~<0X0e fH5 EI endstream endobj 1788 0 obj <>stream 0 0 0 7 73 120 d1 73 0 0 113 0 7 cm BI /IM true /W 73 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;k|3`m7oo~ 3[o`o}=}?"[Ⱥ}?_U{3 P޻^m- Xa E  ,/˪  EI endstream endobj 1789 0 obj <>stream 0 0 0 2 58 120 d1 58 0 0 118 0 2 cm BI /IM true /W 58 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C9@ EI endstream endobj 1790 0 obj <>stream 0 0 0 42 94 120 d1 94 0 0 78 0 42 cm BI /IM true /W 94 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"r C?Zun~6P޼0ixb x`Ԇ` EI endstream endobj 1791 0 obj <>stream 0 0 0 -7 43 113 d1 43 0 0 120 0 -7 cm BI /IM true /W 43 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A\?@ EI endstream endobj 1792 0 obj <>stream 0 0 0 34 72 147 d1 72 0 0 113 0 34 cm BI /IM true /W 72 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID &V 9(?kI56]pY `e xA@03a&'A7[I>stream 0 0 0 -7 85 115 d1 85 0 0 122 0 -7 cm BI /IM true /W 85 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?]@ A@z i h o[&;> ![~߷?Ȁ_%H\1 3 y!A'넻ׅ-,0(\x`a`ɀԐO4L<&>O 2/F"= 0XfԠ EI endstream endobj 1794 0 obj <>stream 0 0 0 11 48 86 d1 48 0 0 75 0 11 cm BI /IM true /W 48 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Q@@t@ BM>[P EI endstream endobj 1795 0 obj <>stream 0 0 0 1 54 86 d1 54 0 0 85 0 1 cm BI /IM true /W 54 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &σ?<#Ga~}&?ۿ?w{{]yKk|~?Z EI endstream endobj 1796 0 obj <>stream 0 0 0 31 72 86 d1 72 0 0 55 0 31 cm BI /IM true /W 72 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A0hBk>0[ H6o6izvwow{kþok_ 4@Xaa@@ EI endstream endobj 1797 0 obj <>stream 0 0 0 31 59 86 d1 59 0 0 55 0 31 cm BI /IM true /W 59 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p3O>?=?}ws_{߿߿rkv_uíxh0[C=  EI endstream endobj 1798 0 obj <>stream 0 0 0 1 26 86 d1 26 0 0 85 0 1 cm BI /IM true /W 26 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|zO~{M}ÇD @ EI endstream endobj 1799 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ;&GB߃~~_ /_ b%*T( EI endstream endobj 1800 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3qiMRk 9f>_/ /{^ ?ooY Wqw&Va@@ EI endstream endobj 1801 0 obj <>stream 0 0 0 86 49 95 d1 49 0 0 9 0 86 cm BI /IM true /W 49 /H 9 /BPC 1 /D[1 0] /F/CCF /DP<> ID &? EI endstream endobj 1802 0 obj <>stream 0 0 0 11 58 84 d1 58 0 0 73 0 11 cm BI /IM true /W 58 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Ӌ MR l&Sf_?OOO?:yO T[M@@ EI endstream endobj 1803 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &cɪȔ!O1Oh ׏AS ɪ EI endstream endobj 1804 0 obj <>stream 0 0 0 9 49 86 d1 49 0 0 77 0 9 cm BI /IM true /W 49 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CcA>k ??]z,X̃ptK-@E8uZ\.Ԇg}5w"ɏO!_@ EI endstream endobj 1805 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &&O ᭬zW1z5Xj  EI endstream endobj 1806 0 obj <>stream 0 0 0 11 43 84 d1 43 0 0 73 0 11 cm BI /IM true /W 43 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Zqy5AӋɮ EI endstream endobj 1807 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8p5O# /|\W __ x_H MP( EI endstream endobj 1808 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4CAk__/_/qIMt@ EI endstream endobj 1809 0 obj <>stream 0 0 0 2 109 84 d1 109 0 0 82 0 2 cm BI /IM true /W 109 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID *r7&C aۻh>A}?{o^}{ o<0b!!~@ EI endstream endobj 1810 0 obj <>stream 0 0 0 1 51 86 d1 51 0 0 85 0 1 cm BI /IM true /W 51 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0|?vI5\7_-K@[ Do 0{a^= _3  EI endstream endobj 1811 0 obj <>stream 0 0 0 31 41 86 d1 41 0 0 55 0 31 cm BI /IM true /W 41 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?ȩxa%4~? ~_& H 81.A~@pxww߶߆uia/H EI endstream endobj 1812 0 obj <>stream 0 0 0 0 73 108 d1 73 0 0 108 0 0 cm BI /IM true /W 73 /H 108 /BPC 1 /D[1 0] /F/CCF /DP<> ID &| !&0߿ џ #}x|7_{q~!/m72 /} 0v!`2 EI endstream endobj 1813 0 obj <> endobj 1814 0 obj <>stream 0 0 0 0 80 83 d1 80 0 0 83 0 0 cm BI /IM true /W 80 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ?~[?oA0&oO(1O8 EI endstream endobj 1818 0 obj <>stream 0 0 0 28 43 85 d1 43 0 0 57 0 28 cm BI /IM true /W 43 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & vN~`"߃l e\^EX0  EI endstream endobj 1819 0 obj <>stream 0 0 0 29 43 83 d1 43 0 0 54 0 29 cm BI /IM true /W 43 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID 'm`):m~ a5 @@ EI endstream endobj 1820 0 obj <>stream 0 0 0 30 43 85 d1 43 0 0 55 0 30 cm BI /IM true /W 43 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &#~!@' EI endstream endobj 1821 0 obj <>stream 0 0 0 -5 10 83 d1 10 0 0 88 0 -5 cm BI /IM true /W 10 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 1822 0 obj <>stream 0 0 0 -5 47 85 d1 47 0 0 90 0 -5 cm BI /IM true /W 47 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8lF>~C|=_->e_  .? EI endstream endobj 1823 0 obj <>stream 0 0 0 28 44 85 d1 44 0 0 57 0 28 cm BI /IM true /W 44 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &< z?5φ_wk],?[_X`@@ EI endstream endobj 1824 0 obj <>stream 0 0 0 0 11 83 d1 11 0 0 83 0 0 cm BI /IM true /W 11 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@ EI endstream endobj 1825 0 obj <>stream 0 0 0 28 38 85 d1 38 0 0 57 0 28 cm BI /IM true /W 38 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`"ICG&!~/B]pZ5$pQɮB7-: EI endstream endobj 1826 0 obj <>stream 0 0 0 14 37 85 d1 37 0 0 71 0 14 cm BI /IM true /W 37 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &*~(zwBp#@ EI endstream endobj 1827 0 obj <>stream 0 0 0 28 43 106 d1 43 0 0 78 0 28 cm BI /IM true /W 43 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 0z~t>stream 0 0 0 7 44 85 d1 44 0 0 78 0 7 cm BI /IM true /W 44 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID & X"?_O?O~"ǿ K ^C_ Ap/~ dv 0X EI endstream endobj 1829 0 obj <>stream 0 0 0 28 51 85 d1 51 0 0 57 0 28 cm BI /IM true /W 51 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4| @=? G7 =A}o&;? /m/] ]Xa[m~Ca EI endstream endobj 1830 0 obj <>stream 0 0 0 30 43 83 d1 43 0 0 53 0 30 cm BI /IM true /W 43 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID ( ߷o{{|7{{{{ EI endstream endobj 1831 0 obj <>stream 0 0 0 0 58 86 d1 58 0 0 86 0 0 cm BI /IM true /W 58 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`"@_f? {{@ EI endstream endobj 1832 0 obj <>stream 0 0 0 0 72 83 d1 72 0 0 83 0 0 cm BI /IM true /W 72 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ~ Kann|>| 0߆?~] k ,2( EI endstream endobj 1833 0 obj <>stream 0 0 0 28 49 85 d1 49 0 0 57 0 28 cm BI /IM true /W 49 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$G)N%;\IC05K  Apy C !c4_0 d  EI endstream endobj 1834 0 obj <>stream 0 0 0 28 46 85 d1 46 0 0 57 0 28 cm BI /IM true /W 46 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H``A=#.  h/AuAk. ^j@e d"7ǰ ,  EI endstream endobj 1835 0 obj <>stream 0 0 0 14 36 85 d1 36 0 0 71 0 14 cm BI /IM true /W 36 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &PN@=?P?Aa7 EI endstream endobj 1836 0 obj <>stream 0 0 0 29 40 83 d1 40 0 0 54 0 29 cm BI /IM true /W 40 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID '95_߿|>|, ` EI endstream endobj 1837 0 obj <>stream 0 0 0 28 52 85 d1 52 0 0 57 0 28 cm BI /IM true /W 52 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8e|E|=o~q7Oj ?ﶶ v a-1Xa~ aD@ EI endstream endobj 1838 0 obj <>stream 0 0 0 2 49 86 d1 49 0 0 84 0 2 cm BI /IM true /W 49 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^B "0!~iHX }>u_pm,00Kbaa0 EI endstream endobj 1839 0 obj <>stream 0 0 0 2 77 84 d1 77 0 0 82 0 2 cm BI /IM true /W 77 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID #@5H{]"@܃saow_K^_ !O EI endstream endobj 1840 0 obj <>stream 0 0 0 -1 75 84 d1 75 0 0 85 0 -1 cm BI /IM true /W 75 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & |?FA0}?7_?1`_߰~{߇ouo]{_@ EI endstream endobj 1842 0 obj <>stream 0 0 0 2 74 84 d1 74 0 0 82 0 2 cm BI /IM true /W 74 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C-l22U=v^`À EI endstream endobj 1843 0 obj <>stream 0 0 0 2 91 84 d1 91 0 0 82 0 2 cm BI /IM true /W 91 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID #Ahj0̴w?~wǿ7{ÿƈA EI endstream endobj 1844 0 obj <>stream 0 0 0 -6 47 92 d1 47 0 0 98 0 -6 cm BI /IM true /W 47 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h== ׿߅w -c}|/.@K]\ }~!? wm{ -K`S`gF @ EI endstream endobj 1845 0 obj <>stream 0 0 0 1 55 84 d1 55 0 0 83 0 1 cm BI /IM true /W 55 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID $QJskz_z^Kzz]]^.ik_oo?_Dpj&  EI endstream endobj 1846 0 obj <>stream 0 0 0 1 85 107 d1 85 0 0 106 0 1 cm BI /IM true /W 85 /H 106 /BPC 1 /D[1 0] /F/CCF /DP<> ID &lÿp> ^;ww#5Y;wpw;ÿ EI endstream endobj 1847 0 obj <>stream 0 0 0 7 77 123 d1 77 0 0 116 0 7 cm BI /IM true /W 77 /H 116 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k_ _<< F`85=oI| G@@߻ɪ_p  _.Z\m(r2r2 A20}o ~w{_*_[h. ,*2 H4U EI endstream endobj 1848 0 obj <>stream 0 0 0 2 131 123 d1 131 0 0 121 0 2 cm BI /IM true /W 131 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D  pA&>D~" !oAM a׫#P$  EI endstream endobj 1849 0 obj <>stream 0 0 0 43 71 120 d1 71 0 0 77 0 43 cm BI /IM true /W 71 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pQ!_>m~}C0nm߈ EI endstream endobj 1850 0 obj <>stream 0 0 0 31 55 86 d1 55 0 0 55 0 31 cm BI /IM true /W 55 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`O>l m/Iww!wa󃽇ᆂk ! EI endstream endobj 1851 0 obj <>stream 0 0 0 31 52 108 d1 52 0 0 77 0 31 cm BI /IM true /W 52 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &X z3a|0C G w$ ?w aۇ߆koK   EI endstream endobj 1852 0 obj <>stream 0 0 0 31 89 86 d1 89 0 0 55 0 31 cm BI /IM true /W 89 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p  0Aa߇wp|? 濇w{~5 ?wwϯ}[{a[ |?L:aæ & .8A B) EI endstream endobj 1853 0 obj <>stream 0 0 0 54 42 62 d1 42 0 0 8 0 54 cm BI /IM true /W 42 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID && EI endstream endobj 1854 0 obj <>stream 0 0 0 33 52 62 d1 52 0 0 29 0 33 cm BI /IM true /W 52 /H 29 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/ zam|@ EI endstream endobj 1855 0 obj <>stream 0 0 0 71 19 101 d1 19 0 0 30 0 71 cm BI /IM true /W 19 /H 30 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8}ɯ}Aֵ_o@ EI endstream endobj 1856 0 obj <>stream 0 0 0 55 30 62 d1 30 0 0 7 0 55 cm BI /IM true /W 30 /H 7 /BPC 1 /D[1 0] /F/CCF /DP<> ID _y5 EI endstream endobj 1857 0 obj <>stream 0 0 0 5 29 86 d1 29 0 0 81 0 5 cm BI /IM true /W 29 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AzO~ks_aXa@ EI endstream endobj 1858 0 obj <>stream 0 0 0 1 41 86 d1 41 0 0 85 0 1 cm BI /IM true /W 41 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID & xI&oP{??v]Ǹax0^=  EI endstream endobj 1859 0 obj <>stream 0 0 0 7 53 86 d1 53 0 0 79 0 7 cm BI /IM true /W 53 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DxDa l#KQM?O=߆3S!&@y[AxU\a\^,,!׵v[io av] k@ EI endstream endobj 1860 0 obj <>stream 0 0 0 2 80 84 d1 80 0 0 82 0 2 cm BI /IM true /W 80 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A(ro߾o4_߿^wx__ / _ EI endstream endobj 1861 0 obj <>stream 0 0 0 31 48 86 d1 48 0 0 55 0 31 cm BI /IM true /W 48 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7GP"̞a}>M~~|aþz[ۭ\0^>Xa@ EI endstream endobj 1862 0 obj <> endobj 1866 0 obj <>stream 0 0 0 5 49 86 d1 49 0 0 81 0 5 cm BI /IM true /W 49 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID & 3<'AA7O&_L=xk:}{K둅⿮'J_ EI endstream endobj 1867 0 obj <>stream 0 0 0 2 49 86 d1 49 0 0 84 0 2 cm BI /IM true /W 49 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3.C.z7o?7Okv_5ip[ q Y  EI endstream endobj 1868 0 obj <>stream 0 0 0 11 54 84 d1 54 0 0 73 0 11 cm BI /IM true /W 54 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kJ˧΢.“]@@ EI endstream endobj 1869 0 obj <>stream 0 0 0 11 56 84 d1 56 0 0 73 0 11 cm BI /IM true /W 56 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A. S ~z_ޯzޗL=o|_ӓT EI endstream endobj 1870 0 obj <>stream 0 0 0 31 57 107 d1 57 0 0 76 0 31 cm BI /IM true /W 57 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID !H?R'_@7~{ =ÿ ?Mv~h-iqdž ` EI endstream endobj 1871 0 obj <>stream 0 0 0 1 55 86 d1 55 0 0 85 0 1 cm BI /IM true /W 55 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>aazO&~û u]u܉O? EI endstream endobj 1872 0 obj <>stream 0 0 0 1 38 36 d1 38 0 0 35 0 1 cm BI /IM true /W 38 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p3pAB˜5W߻paox EI endstream endobj 1873 0 obj <>stream 0 0 0 1 38 36 d1 38 0 0 35 0 1 cm BI /IM true /W 38 /H 35 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l0wÇ w8xp^d? kU|@ EI endstream endobj 1874 0 obj <>stream 0 0 0 7 44 86 d1 44 0 0 79 0 7 cm BI /IM true /W 44 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID & "A &ޗZ_&kXa m\ ?X ?v/kXm.ǵ m@@ EI endstream endobj 1875 0 obj <>stream 0 0 0 -12 28 41 d1 28 0 0 53 0 -12 cm BI /IM true /W 28 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5!{@ EI endstream endobj 1876 0 obj <>stream 0 0 0 2 82 87 d1 82 0 0 85 0 2 cm BI /IM true /W 82 /H 85 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xnN,?h77&|0? ?_~/ @|Au37P߃~_//K,&@~8/5@ EI endstream endobj 1877 0 obj <>stream 0 0 0 104 72 110 d1 72 0 0 6 0 104 cm BI /IM true /W 72 /H 6 /BPC 1 /D[1 0] /F/CCF /DP<> ID &  EI endstream endobj 1878 0 obj <>stream 0 0 0 -6 44 46 d1 44 0 0 52 0 -6 cm BI /IM true /W 44 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g_za~MS[Ap6Aa ~ a <" OC|H0[>,95Kk EI endstream endobj 1879 0 obj <>stream 0 0 0 5 45 108 d1 45 0 0 103 0 5 cm BI /IM true /W 45 /H 103 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f Paܚ~&?wouX0X  EI endstream endobj 1880 0 obj <>stream 0 0 0 31 41 86 d1 41 0 0 55 0 31 cm BI /IM true /W 41 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &J?GzS PPo۵j>stream 0 0 0 7 83 120 d1 83 0 0 113 0 7 cm BI /IM true /W 83 /H 113 /BPC 1 /D[1 0] /F/CCF /DP<> ID & #+i5p^߿߿o~~߿߆ῇ{}} EI endstream endobj 1882 0 obj <>stream 0 0 0 2 112 120 d1 112 0 0 118 0 2 cm BI /IM true /W 112 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g.CLk6*?߇3?!k| . |>stream 0 0 0 43 91 122 d1 91 0 0 79 0 43 cm BI /IM true /W 91 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|6?Jҿ>߅~[վ׭A_V CA_JO ɀ EI endstream endobj 1884 0 obj <>stream 0 0 0 -1 65 120 d1 65 0 0 121 0 -1 cm BI /IM true /W 65 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DD6w?o ,0a<5 a2@@ EI endstream endobj 1885 0 obj <>stream 0 0 0 -7 83 115 d1 83 0 0 122 0 -7 cm BI /IM true /W 83 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kI"`^CaV<" G^ A&}>AooL?o޿5޿z a-\5il0Ka,2"~<0X0e fH5׏4L<&>O 2/F"= 0XfԠ EI endstream endobj 1886 0 obj <>stream 0 0 0 0 93 122 d1 93 0 0 122 0 0 cm BI /IM true /W 93 /H 122 /BPC 1 /D[1 0] /F/CCF /DP<> ID &uΠA$h7n5D~ 9.1ZI'>}}~/ׯ~kk`w  1  ]r C_` EI endstream endobj 1887 0 obj <>stream 0 0 0 -5 79 116 d1 79 0 0 121 0 -5 cm BI /IM true /W 79 /H 121 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ܧ y~AHez: apM 7߇޿w_{  EI endstream endobj 1888 0 obj <>stream 0 0 0 -5 133 115 d1 133 0 0 120 0 -5 cm BI /IM true /W 133 /H 120 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f ??'5^[~J_o҇}+_^[~oV_}Jo}+~@`"  EI endstream endobj 1889 0 obj <>stream 0 0 0 -5 165 113 d1 165 0 0 118 0 -5 cm BI /IM true /W 165 /H 118 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AhOI?#''aO[ IIooaO[? aOoo &I?oaO[&? - p EI endstream endobj 1890 0 obj <>stream 0 0 0 -4 115 113 d1 115 0 0 117 0 -4 cm BI /IM true /W 115 /H 117 /BPC 1 /D[1 0] /F/CCF /DP<> ID &+llԚ z^=>stream 0 0 0 0 27 46 d1 27 0 0 46 0 0 cm BI /IM true /W 27 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Mʿ|< EI endstream endobj 1892 0 obj <>stream 0 0 0 10 67 82 d1 67 0 0 72 0 10 cm BI /IM true /W 67 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID %"zoo_߽z_=vv_=ǵk@ EI endstream endobj 1893 0 obj <>stream 0 0 0 37 34 82 d1 34 0 0 45 0 37 cm BI /IM true /W 34 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID *8k |a>- `IC  EI endstream endobj 1894 0 obj <>stream 0 0 0 37 49 102 d1 49 0 0 65 0 37 cm BI /IM true /W 49 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AsFcߠ~L}>}_5~_\0ha/z'  EI endstream endobj 1895 0 obj <>stream 0 0 0 37 50 84 d1 50 0 0 47 0 37 cm BI /IM true /W 50 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8cAΡ 9A,d_Qh EI endstream endobj 1896 0 obj <>stream 0 0 0 15 22 82 d1 22 0 0 67 0 15 cm BI /IM true /W 22 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID jDkXQ=?0 EI endstream endobj 1897 0 obj <>stream 0 0 0 39 48 84 d1 48 0 0 45 0 39 cm BI /IM true /W 48 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID &75}o߅XoOzi@ EI endstream endobj 1898 0 obj <>stream 0 0 0 36 45 84 d1 45 0 0 48 0 36 cm BI /IM true /W 45 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@13PzMAXz Ow&_K_ m.ް !~( EI endstream endobj 1899 0 obj <>stream 0 0 0 36 46 104 d1 46 0 0 68 0 36 cm BI /IM true /W 46 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0@0|'M5L/2+Z 0z3_䏶?&  v׆a! EI endstream endobj 1900 0 obj <>stream 0 0 0 36 39 84 d1 39 0 0 48 0 36 cm BI /IM true /W 39 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8DFb0Iޯp%h j_ׇ_h,=a a_' EI endstream endobj 1901 0 obj <>stream 0 0 0 36 47 84 d1 47 0 0 48 0 36 cm BI /IM true /W 47 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &IϟFm<,zA矠c7\?~ |ʿ!?w__A K A~A EI endstream endobj 1902 0 obj <>stream 0 0 0 12 49 84 d1 49 0 0 72 0 12 cm BI /IM true /W 49 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8c97>(|-| ZA~_ .a]x1^ _eҜ@ EI endstream endobj 1903 0 obj <>stream 0 0 0 36 38 84 d1 38 0 0 48 0 36 cm BI /IM true /W 38 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8joHxA7}&_}u!ɮ#=|0ݬ0N@ EI endstream endobj 1904 0 obj <>stream 0 0 0 37 78 82 d1 78 0 0 45 0 37 cm BI /IM true /W 78 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID ȃ?jDA80PV /a.fo66L4Q / EI endstream endobj 1905 0 obj <>stream 0 0 0 21 32 84 d1 32 0 0 63 0 21 cm BI /IM true /W 32 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A|fo_?$$}  EI endstream endobj 1906 0 obj <>stream 0 0 0 12 22 82 d1 22 0 0 70 0 12 cm BI /IM true /W 22 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID jDkɨ EI endstream endobj 1907 0 obj <>stream 0 0 0 39 38 82 d1 38 0 0 43 0 39 cm BI /IM true /W 38 /H 43 /BPC 1 /D[1 0] /F/CCF /DP<> ID _'2jþ۷ ?}<7Eaoÿm @ EI endstream endobj 1908 0 obj <>stream 0 0 0 36 38 103 d1 38 0 0 67 0 36 cm BI /IM true /W 38 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &'hF  A8\X#⇅ aA}&@omkv B8P EI endstream endobj 1909 0 obj <>stream 0 0 0 15 47 84 d1 47 0 0 69 0 15 cm BI /IM true /W 47 /H 69 /BPC 1 /D[1 0] /F/CCF /DP<> ID &IϟFm<,zA矠c7\?~ |ʿ!?w__A K A~AϏ䜂a[{'@ EI endstream endobj 1910 0 obj <>stream 0 0 0 12 49 84 d1 49 0 0 72 0 12 cm BI /IM true /W 49 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &+ao7//u .yi{^ɨ EI endstream endobj 1911 0 obj <>stream 0 0 0 12 22 84 d1 22 0 0 72 0 12 cm BI /IM true /W 22 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|'x#)wy5_~߿*C  EI endstream endobj 1912 0 obj <>stream 0 0 0 16 25 84 d1 25 0 0 68 0 16 cm BI /IM true /W 25 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID & A>MV~X0_/@^@ EI endstream endobj 1913 0 obj <>stream 0 0 0 12 35 84 d1 35 0 0 72 0 12 cm BI /IM true /W 35 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID & '0z߆~Շoۮ gֽ^K]_ EI endstream endobj 1914 0 obj <>stream 0 0 0 13 68 85 d1 68 0 0 72 0 13 cm BI /IM true /W 68 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h, (#6~C{>׾ /bN0߆> ][{ `"  EI endstream endobj 1915 0 obj <>stream 0 0 0 37 42 84 d1 42 0 0 47 0 37 cm BI /IM true /W 42 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &>stream 0 0 0 37 34 84 d1 34 0 0 47 0 37 cm BI /IM true /W 34 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &> z7s0&{ t]-xXK:tA/p0KXb`  EI endstream endobj 1917 0 obj <>stream 0 0 0 19 30 84 d1 30 0 0 65 0 19 cm BI /IM true /W 30 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID & |=0[߿;"y5_!g} EI endstream endobj 1918 0 obj <>stream 0 0 0 37 40 84 d1 40 0 0 47 0 37 cm BI /IM true /W 40 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l~6_dp?}pn~ OS @ EI endstream endobj 1919 0 obj <>stream 0 0 0 37 40 84 d1 40 0 0 47 0 37 cm BI /IM true /W 40 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID & g:G=oH>վoX?]  ) EI endstream endobj 1920 0 obj <>stream 0 0 0 37 50 82 d1 50 0 0 45 0 37 cm BI /IM true /W 50 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Nis4-[ BQ@ EI endstream endobj 1921 0 obj <>stream 0 0 0 36 32 84 d1 32 0 0 48 0 36 cm BI /IM true /W 32 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0!_ m8 7_ PU/BX%Z8PD3kkapboN<@ EI endstream endobj 1922 0 obj <>stream 0 0 0 37 49 102 d1 49 0 0 65 0 37 cm BI /IM true /W 49 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID /85".G? O}x_Kv4 [Rj8` EI endstream endobj 1923 0 obj <>stream 0 0 0 39 50 82 d1 50 0 0 43 0 39 cm BI /IM true /W 50 /H 43 /BPC 1 /D[1 0] /F/CCF /DP<> ID #C(;m/]t0]Ktk=yOVoI׬<-d!1 EI endstream endobj 1924 0 obj <>stream 0 0 0 57 27 63 d1 27 0 0 6 0 57 cm BI /IM true /W 27 /H 6 /BPC 1 /D[1 0] /F/CCF /DP<> ID @ EI endstream endobj 1925 0 obj <>stream 0 0 0 71 12 82 d1 12 0 0 11 0 71 cm BI /IM true /W 12 /H 11 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ۂ!MPX0 EI endstream endobj 1926 0 obj <> endobj 1930 0 obj <>stream 0 0 0 2 41 83 d1 41 0 0 81 0 2 cm BI /IM true /W 41 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\Cɨ_0> EI endstream endobj 1931 0 obj <>stream 0 0 0 0 72 76 d1 72 0 0 76 0 0 cm BI /IM true /W 72 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Py EI endstream endobj 1932 0 obj <>stream 0 0 0 23 47 78 d1 47 0 0 55 0 23 cm BI /IM true /W 47 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &I_  A:5 5?ʂCr 58~\' 1@ EI endstream endobj 1933 0 obj <>stream 0 0 0 -3 50 78 d1 50 0 0 81 0 -3 cm BI /IM true /W 50 /H 81 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|q"pA?V(0J>M`v EI endstream endobj 1934 0 obj <>stream 0 0 0 23 48 78 d1 48 0 0 55 0 23 cm BI /IM true /W 48 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID & qN&5߄^ O(Mzׇ הج5p EI endstream endobj 1935 0 obj <>stream 0 0 0 -3 14 76 d1 14 0 0 79 0 -3 cm BI /IM true /W 14 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &MV@ EI endstream endobj 1936 0 obj <>stream 0 0 0 0 70 76 d1 70 0 0 76 0 0 cm BI /IM true /W 70 /H 76 /BPC 1 /D[1 0] /F/CCF /DP<> ID &{]_p/ۯ_<5 t t ׅazznaz5  EI endstream endobj 1937 0 obj <>stream 0 0 0 63 14 76 d1 14 0 0 13 0 63 cm BI /IM true /W 14 /H 13 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 1938 0 obj <>stream 0 0 0 3 43 76 d1 43 0 0 73 0 3 cm BI /IM true /W 43 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ik 8MW2|>€ EI endstream endobj 1939 0 obj <>stream 0 0 0 25 14 76 d1 14 0 0 51 0 25 cm BI /IM true /W 14 /H 51 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5@ EI endstream endobj 1940 0 obj <>stream 0 0 0 2 70 84 d1 70 0 0 82 0 2 cm BI /IM true /W 70 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &w Q ?AQg@ EI endstream endobj 1941 0 obj <>stream 0 0 0 2 134 86 d1 134 0 0 84 0 2 cm BI /IM true /W 134 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pg4AAauS.mo<'}~>i յO >O o? [Hr`7@ EI endstream endobj 1942 0 obj <>stream 0 0 0 0 40 108 d1 40 0 0 108 0 0 cm BI /IM true /W 40 /H 108 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`" <zz k 3l5C/z€ EI endstream endobj 1943 0 obj <>stream 0 0 0 3 49 76 d1 49 0 0 73 0 3 cm BI /IM true /W 49 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &i\0{{὾oo|7{{{{8Vצl0 `  @ EI endstream endobj 1944 0 obj <>stream 0 0 0 32 79 86 d1 79 0 0 54 0 32 cm BI /IM true /W 79 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &6 ?k k׵i~z__Oo_ >Am}.c>_> endobj 199 0 obj <> endobj 198 0 obj <>stream x HAUZEC+CMMI12lj=80FL[Copyright (C) 1997 American Mathematical Society. All Rights ReservedCMMI12Computer ModernoP^#MUPֵ/\M0$!,D$!YfѹåcEcv eNbHTqdMkL%]$tˋVvȋ||PxLbn|vmEw~{zdULSy܋H~~uk%׊|w8v?`  7 -ٕ endstream endobj 1946 0 obj 513 endobj 327 0 obj <> endobj 326 0 obj <>stream xq QFDAQZ+CMMI8s41.FKZCopyright (C) 1997 American Mathematical Society. All Rights ReservedCMMI8Computer ModernaBMUP4[`nN (#O¾Fωŋr}TxWdtǏx~|rlGYFWvk]tȼ̞Br)q~\`v?`  7 ؕ endstream endobj 1947 0 obj 380 endobj 881 0 obj <> endobj 880 0 obj <>stream xcd`ab`ddssv 44f!C9_ȯ?g.&J9wfFF7hʢ gMCKKsԢ<Ē 'G!8?93RO1'G!X!(8,5bs~nAiIjo~JjQC#?& bbddRqx3'oF3#%&_3>xEtOl&oz-b>s,qQ3 endstream endobj 1948 0 obj 239 endobj 1152 0 obj <> endobj 1151 0 obj <>stream xekL[uϡD:F{RGMp32d\ƈҲr+k(Z0M4agAeY$3Kbg}y'y^(*,.@OiICjUp22b${ؕ&!!Nn7/"^!S #q TI$jQl@uDrt1RKLjFC] Ԛ TH՞P!/( UYIYG ,=5:29&-SJWN(c ԩ3ZR$J םCiLDIȉ/ s\Ljl#uL:aZ`~ )Pl;3 7W&LIXdA̍ga*cT{|,> K7ɖk{&O0gU5 6gɣSq ]M .O8q ۬`W-ή7JBfc_Rj ԍ A8)&C:&\U׍~}+X;X[Z _K'a<&׶S+'vo z}Xx}4hԓFh`?iKܝЎ##3wqƾAe vL Ńҕq[ѐyLល8h\vs^AOIZ1<;q^)|?7Ꮈx 0ӧ endstream endobj 1949 0 obj 1044 endobj 1051 0 obj <> endobj 1050 0 obj <>stream xUyPSG $y"K*ZQD1$!BRX@$ :UFԞ):j/?vgw?$I?JVԩ@Y&ͶúaCЫWJn~ A,0&H27f*,((egYR+u77Vh2Zΰ vk4TF1UY<-Mf;MQ3jZf|K. ]x.BK!1TTfZXHl&DOD[D!#6N=LH_͋}abWm`Z_FVpm!Rb>,/|Vo|'@$q_ߙdea₀qo~p⽡{b$)P]9UBw#6B%0v0^ oLp<B!cOF=Z:he X9O-7Z`@59 QXgղD)ݗqW}}4 P؁ux/92<~IQ?.߿7e`x. ܽlxV֠g4^o̅Q#u'OʷSlāaB~4 ypQ !tKr#T{F`):ZK α֮Gt#g@վӔXDvEv=Ǐ^B%&7Ue#UaFiC; بqrd:OB#;n/-͇7K&J W =/+?Õeu̦N r{ccHM#> endobj 689 0 obj <>stream x|X,;;Ktbv]V@E;*(cXA,رSh4ߙ]V轹twvfN{[O)EӴsPDRPBX;o@G{g"rYS)jhҪшƭ}Oe(JQuj*SezF~T4C7 vtW'mAa(zN z>Ρ7;t1}Jߡ/h%0,ӘgL''c82D0L:3Yάa61CL1s)c*{L-EHO$u,E6"GS4R4V"MM-eΉn~4Бut1ֱұ3GgNz-:{t\)׹S\W,뉥Vnb#N:r=837g q#1\sln[ms{\1w+npw鲺 u5mEn?]]]w]o]Ph$4HwJ<]t uO^-׭н wX^\^w=S^zzzz#|&қLomz{ ]ѻwg@t̄Є֝=Fv֭;֭M>imպ#H Jzy;"",uHĄABA"bbZwХIϞ=ȇаq[v ICb\}PD DH訐 8Ͱన 1q aaQ GB㢣ő۪?CԟPHm#ȫڟ!QAԟu  H J 3¤ܸ¬g݅9O㞖uk +sOu!MZ gm{چʹ Զdmzp@4!g- 5m^=Bmڵ͘&F%FF'&hV;jkQFZYzڟni폩Wu0Hmc5vʳ~Z6Xhnmͬ5+3#Ӻfʹԣnu ms֞9aZXh`mcu# VONd{}Xh76iGg"4PךF\>ӗPie傹q3mn{gbmtgз6 #kؽ@CRsmfFM-ib1^=46Lvă×ʛA3mVnd&C?L=/8|XZh66lQ~-Z[?.kK3tHoKPBh5OC?JtX_qjJz\q/$(0u7$uSkBhZ RW6l|@g8#AQQ̄ijuGfQ|j B}cB>= ڐw>.n<^3?&:>!.:&vzQ ~9u䵰: EM꽟̮\emrܴW9hk Ӕ2OܚפCv>S{gүWe2zPm)oʕ)C5F9P(#=5rzS=DS)wʙ2:Q@ʔLyR(3 5LS] eAu!eIuFQCH֔ңpj,ՆjF}G%S?ՇjN5 i$5KS )@EQT?ՈQh*OS:$DPA e@}OT* lVTҨ8*~Rj2ORR5J¨1ҥҩTOSj:A-fRYj6C-2)DDͫ=u:F'tuʣ.R[.jE]NS&*% ZO" *u*vSkJ:EF.PG|j+u*Rǩ=TMݤ.QGruD^WS+T1uљ4Ht^H/K2z9ֳ*z5^KIΥ7M$ϣ[mvzwnzG]@GB}."Q $}>M"}L_KR. &}+.]EW!]C??OZ)~N_ү-{*;/bhaD#fXFp.|4`2L)#e~`dL39ϴ`Z2L+GF(L-ӎit`:2L+Ӎ` #'c̘0cX0cbz3}L??c2vƞq`'ƙ b3.f( c3n;x2#3fF3>/3c28& d`& e˜L8D2QL42qL<$2IL2L`&2T&Laҙ4&`f2&A\f3Y,d1%RfYd1+Ujf Yd39z&ld61e1ASf0GBs)bIs9Üe1 Es”0LS\e1 % BsD ]H_A:YLY}zbzX{zxyPy<=< =`FHHGV|k4^GuwOy޻GSF>gOoS>}1} 3̊1~~3wc7K[gk?۸q[ZX=4peA}Cq q jz!U؀a(|Xxf׌n,|M#"HAG n- )6-k4MCy Չ&>O KKZt)zrdo,N:gš %nMtX9Q5c҄I'&]t#ub4YcڴL8tʈ)S6OOo,}NcMMZ2b4i[V0ɴWS2*3dN~zӗM?:[gqdOf73eY Rg-a%4c9ޙ2gC=$k1w]sk8lk*$F"UF ?D򣪰m4B9]̦(,^,)h1,T}q#~6R@92A介MXpP[MNI E-yp65Z6-Kׯ޴n MH_V?zhvST̯n._N*P܃N?r EUͷ<tcQvr FB߽FE|8:#yKH;6FXᾏ[C[hr&LaɦYGM8e 5!dD 2Xax/vb,fa&\'ra4>- ! MIT/ jX&ec1}၅`AV5Epvhms)Te8=E[b|N_ٶč8HΠ]V;!D,)B[oLٔ2且#K @mM_Oj^"<% B1#DFiޕ0@e`,j ]Ǖ7$|/`#/ÝLb{l_@sɞꇛUUTz.Џ0!VxZ' qo;<4vl4OeOM 65zAwd$a 6jf+aa[+i =yHْtTU˪jXF0:8^%H+dQ`fTP'uv!`w2Sï$~e"{rnګ;S|8Y=_eΌ{.BձlS K!"F1%o5W*[{d>ɜCT_JBDzkސU R][EUAޙ?GNKD~aP m!N)@!cgKwL ˭u5n]}[eu oɗB`}RuZѣf! Qll$VW<+] >]Zh V ˍh~ڂM*6 -{D7dž竞(6J:]^-D̪]k,2$) ND\?_?Sʧy(ѨUTRQr&-7 o7&(k}|fLap˯*ۨiuzуJK<5OZ51r""AR&.CƬָ`;&aj4"`^ϛKP f:[;X!31K"[8 0}Ӝ %Nb^8^)u J$VjkFnƤȏ3 ,W%VfA~r1QLO[C\2Kt|n=p [GGE=D9pz z`;n=Xu Hpt7p{¨_n}ܮ]KD"C{+骪5;"?rvyrIə2unFGh C鹤lWRJS*#u,)WMQZxQT+Z~,u}:[c}#?)`hѓn-Q`R@DbTo0y =}ʮss"]>_wet=vy3\/0w˅/<\G zD%kT7)d7(a\M `՗'5s1@}JYbvuEB4N lH <<8k6Bs'%,B=Wʆױj[ͪFV0oJdTʬaZV5VF =HM}4_>G܃ŝU}qk/UXDF*e[%>fqR.xj* k+*ɛ>B`BG9TV*ے P~ 1~b܄谉sm` #_aq1o:J,Oh( 2Eb7Y!8[ ͱ[9A𯹴P [b$һN/+Y?7 ?%O=8' GoNZxCc[ EuK=V7K$¡1I젟;,3,P[$j5^ېϽ(SBv,nz{\c5 GBoeJ O I/q^ ~2%m&_;n$n߅]%4}HM FihXLⲔE 5W˝ledEPnƲ/\7M:u#.?VX-Q+eJݯ|aZҍ V7I ަ76gy+6۽/q}|G(@hbBRyHw{̪.y܁~2ܯݖ;HoĆ(-q,EBQjq%4#0qA9vDz㾦-G *v̡RBxQvP紴f4#LRO_g y؝F_V ?/dq8dGm4*t _D܇=9āqz%nq]yKy-{:EaOwwoSyWRm]` vE7|M]b6͓-Ire[X -b7,]vI1㴱Shl9b,9iѸ`+S5`(aG w9g0lH~>{$)L×EqxL^gjTq<QjN)]uITɱ ;<jk6A AG \H:W8 P.#fC(+LY  X1Q2?Nv~>DEֱ .KA)%^u;0u9\ܢgN4nt*k5$Q >XM ^S6ɠma=oX WV<>3f\2`_L0/CqQ)D_k#fdb.؞tZ3/uP/!?՜;0ZNC@288(S,`or6JnZ^ ÈI| t.Nzxw8oĞʦyY7a3vƊY_*NW6|ޔ!w[e;Coq^ĺ[^F}߳1.6ʙNJT 5_яJ&VpAEcwu3sn᠕A%(#,L0U|R D"eKYpĝG4)H005V:yD;CM >sw?jQ.Q0-:͇=D` '>A!|4 x]CKZȬ8MLb !ȥoz 7{a pzsyqC7M9w+KWwcsN[OTk42'9< ^uqv85I5">~n,@lb'|1q7/m'Pqܯ2(=TߋXhĐKl/ְޭ.T豠BsB ʲ"!n-ly];al?n8yXmݻuDCؽiU]p22:bg]N B!w-sJA'(K%φ?:F`;1f^A8D|mC- Ŀ&N2MN#a>pd9Ǐ+ *e>4f$8?ajhoC|gFOO HA$oQ-FhmnN\ϝ?=~k,WBqO´e| S=S #ph%[^wh><,fW~j 1mmȬE(N7q1We/2 HFi '.h5} :~;dCSukh&nJbQsu4laVJj'LUNpu ZE|\.&9: " G6lNፒ1Z32ׇ47 v/ߑI,l#vFy#~E#^s,n;!e}rʁ7qg#uȁ-Q`jhLl|Bܴ3THF`L ]pg9 ۪ܷik FTGxV:ߕq*o?1zP\^"ɖj]^vFAYBR%e1tkfc:r^n!QȥRifemI03oҘ %c!;~>8yk@}WT_KҲpO{'JI>*#N[h'q;i° h &|hIUy;r{$3>\GVod`o@!yWV :c7 _\}$tW;wC*B\猸:ώt#!o.>/`8oyN9)_@Ĵ ʠ)J[a~=zT{Z[Qͭn c<|x>ypIoTFtvFgGTͅrB'O~TS]I6l!]7|/ }#hl ߆"~nF9}3qeeeB[6s. qվe×SYUE (AձoُpwUUdm YtlwrhȤMi0`ؙStF N9p{nЕ o%_$ Zo>vi l:U5lN|IY]|&vO~rN}tE K9KRJu9M_e>V? oNBe*]vyBǯlI={FuF9<5.(otіo*FܝsnǏv Qĝ-:g-c]]"]f|R/ˈK2MA1>/ vQrrֆi'VZ ]ʈzywtwwt<^VzTUSQsi1DZ< ; S!B#l n\mENѽ%G>VVT`yMNźz#+:J>IG qekCӇq1- )eӎcW[B^ױn׿/6Gs.ذ|}CH_yfԄIdrutWaps<acM.A/z=ɚB;o i!u*F+O*f~\qGXw-Ci1GT@=PɦW)cdsL\| բËqY=\?qizi:ސ{WVF=G- ڒ4uSRţf݇跹'jQ7u1RYdѤ'43Gvypةnn, ^D+j\UC`NLrPϦ pK;2[4xTJwgm`lC! :[_Ic~*1|)hi0zaTt4g"X3= cʹy@WU|Y'!.V#o-Vex11R JɕK ahMڸ.fCCơ(0'gGЎr ӓf#'nݮ9 Siӵ'&~, (Q fd~u3?.V*`6Sx}9LaRtf 2 sp^Πyfr#'vji2l<ˮ,s ?>|jǞC!Mya7PqI U=tpAn*ЯWO">x>Jû*xIFOŰJ ◤Z?4%Wp][`+eWsfΜmd$me=&~,0)Z1Y3f1qz( |i[vE@f-AGfUEK\DTzbم 4*eC:P^5nu;HN=C.oYފs=;WXwB&%l|*΋FpOBp `;bvxW [h.p}qv`m=* >"R蠝6{A)Tad0Obs>+=3@_V e+jU1)s2@I1nB0+dwdS3}%I}$lA!{֮;{qm; P1wõȼw mW/Z!ov>6"9&0I1'xVW^͜Š[ =ҋ`|"Bsi0cdjj'=^kFntHKHwfˇ'G| ;Fdoƈޣ{̑_dQ޼Y+oځ#[b}*$#URկ2dN^;F_ ׉I`X XA?9Uk^zS5WʊO,m~ @SB%`ۃ$ԫRt:xπ:Y-gelJna(nm>[2[ M?-7Tw 2 )N#)7"1 : g~!P,Me_?cϲw x}w2Gǥ7W,_qu#VӮpߤ^ᾡnopT#΁I).\gQ?ѳM?gHഉdJCEMI(b?͵ZG}[/>#v}V q'aEhyمğT僯C*eВ^.y"3E/^FvB֬g2N_#ߚ{}xjx9 su%$}|F*aE5:E*?B;SGy(`&Ef: ``B >B$CYpxM ЄSqχ=دmio~W99w{?qɋrzܥ3QGe@s>B~vWCU}vyo5u4\Zi$|NfdeUXu~SM,:~`>y7JpHBܟ5! Ln_>PzW?4_k7if_]}pylz ZBx0[5v_!_p0xJ`F]Od 쒀 -GgR/!zزVW<S` 󀈄= n!aE܂g@:W^0鯡b3qM7X4 ڰ9RB!!GP&T9 +T(gQ-殿[E_( $⍿DGAR07pl PZG5MTE$* ve7E|c٣/փveg(k6P=S32ےŸOFnMᨿ]ʢ1ْ1rDFyc$WLfif+yAuy/8aKF>*E94ZKbM>/ uSحf9Rv9&K_\ۣM?U1C/?Q𭰴 ogLBsc *6' }aß?ϟSrn;f3ou_e>="S'i0,() zT},ЌOi ?7ǿc}]C5?׊zηyG}elDkEg ?.Oba ZiaW[t#m"`Nn[xC'WJzIFfȭ$9n8+ƙl*-&^y9esl({n?[#2G8Jt:sںIAS"Vi*-^LcDn:DZX!mbUob1;`O5lv0C56S2U3ƪxo.S6}tCyI]uxJ901*!+EIw=d3i@YFP+( _!UBhڷC/oˍ\);m#We5y(ʡ([ى<7'n75DdMKGޔ w ;9'~0#7 qK@s,PM6q?wII~` "kQ "k1xccQyq 1rX֭[9ʦN\el=T ,x2lAo/&C`laW$e-?ۢ~E}zj޲ SVgC"x䟩Sx=/ ';XfQ6sFj7}IVNiDeE~ڒ=x_}wGmS~=6o6Fwh{h\ s!*by˿\YTRnW 5+#pn"xٹ[m^q~SR[5dK8SNzz߈5VJOY }Dd\Zێ鈫/`ss~vg&|?$#1)`״h0H)W26Ej5'm&`-՟Z|[=KK8M@j GjӓYJag?Щw6p0 `,O'i.}tDZ܁ VYٮ+SZ G[4z*0tSejDZϬĵy{H,6[-d{"i0s,q8M B 2jdsA}Ӈ | J!Rç!FϐAxh9L:l6BpOtOՈn4k9^+j_v.b=.mU헴K^I\G^%07LI76`\?X-) h+]>V:vX1$Jy¹+*HVW@! {gGE#do`ol{dҗ| :HB\B#&pi&}'H'ha+~ÂDp)ˎB!#cSǣ16?JY BE+V^6gvA5MO?5ՐCf/d7IiݎD uҜU $xF_4{t@}ަFԇ|> )X%?΁fە^_U UI"@BĉRQjq 4Eg [Hˑ CPVwS!U2Auj 4QF_ٮK+ũ3X=oF}P]z"XX#SNYS ?7M=ш1'b- HPĂztF =\^k.4&Ŀx3l&sCq>-I !z]ȪOZ+`)mD W)-3Bk ،Otxh(:`݇`^R]`U!2#t qTS`&ù{}yn/R7-F}Ѽ{ʉSތ-qrp!~P~=,?NxUA$ȉw56$lL:@/4 NfBOlXivN67!F-a.:`0kiˢ#p iCs7\30/&'i\͠B1~yCym& 2gYrR7f\A.hwFP#a6=ŝp+'&)eGKP1*ˎ\9w$7I60KY>͝P+LBӖ}3DO* Giuo;ЉӹP[ZB`e[D p{^y L$0,s\񦾂nIpOypswk88D7 '5[3TzTB55 91:a_!2_2 u"'R *~n]~EWe8q5M[Oϙ|dxR{V`~^3K-1-1|; 6&^n-h{S ~.?Z fPʼVFŨ=Λ߃N=wl܋?#ed7ʙ6RMjfN4н $#ЗlGkgOrS3Sc[S&M4!)# ɚD>*-ք5 M3#$$i=5Usjݪo4rU=_v߾mf&ñD]4u9-?KF]CфQ?|^)*"%Oﲧ^saOTWGkZ5\Dtc/H`AP KNplM4TpE-TH'=WA>&b8oK48/܂|T}'‰nƅl4}.,LhOVOhLhOKELwWz罾 /vD |tԂ3xax#Z_| 0X-F6eBR7w)*/j%v),ic'ĿLcH0έ? }2#ޗcB\z!}n XLz#JTƬtVLlD$Oh$ۧKT4Ǹ-"!;#ϥn31cϗH ]|LoH@/kl"h7 uU6oܚwrYDb{FqNEYϞE>8Ū2UUV/5VP/aܐJ<+sSkF|[mK.;Wa3ܧn)r1p{qݱ”6swۅo"[SnkJ#M:mL[iE^T0K$Bj( 5QKL%6%R4GLԆPLE=ÙsfQ?|{^,a3No^ٯl^>+ykެyDYob\U#BÒRH4u5 MSaoxg 7dz\ W?{yS7,+y/G$*DG-qJ[R BFC Պn;W3CcLNl-fE}%,8N _e7hTf(懻|Ӧ[,BޟRO^n Є̄ |?öyGP̑."w)> 1BHQ@$yQ :!tBw0O$ٶR5E*k)s7vQ6V:kަkuƘ8_Lިޓ8Ӂ9 9 П9IKt@D3P`k(TѬջ%U6lmt-o@/+.z b]m&[佸[n 1I1sPzH`:Y0?~QӓωY~ zx'.N|#ԝ|^H>f]E9^eo۾g]`~kuUâk^( tx#$,s~@ F؈LSڣ\)'8%D7o'xC)UBz{Pו{?F/W=:߽LsqE{E/2_΢ K0P''θf]<-6洀]j__=-^zYVq?bΜ3k(&A&s e#»{p"$ya%]>U Oɜxw_9 9^D4r'\,%5kYoqA9\rpҹΨ܀LywsTg=Ԋxo9i}9,Is3,9"!| ZWRh'>$˖~Oٟen_|J# >f(UluIvܒy})w57nW]̚~ X}CAhDii>o XH_}SXIH-dkJ.9删8~Zгܲ{} >El})U4kgNKZXC%+HӢ!XGeE%w$,ۮ9ݭqٳ f,7{VX#BW_}En}E\Z:JgcEdlL4\o9OnUDV׭$+CY˔hg&] k-|QTYpk/ƝKnuSQk/j\OS]&v< qiPGlMkD|Iz'fj=*ZMdM.PͤXi/E)V_~lV/&<K-Y#; |aCdz &Jrym,tbO)$j"( 38b[1Jd|XvC÷qgC4Q5}2=#}M:~E+HދU)rI ѷ-B0woPݙy@^_YG^SA^p[xSi o|XO35w^/43"QqEE_z9.`T԰:)zġ0jJt}=Q: ef4K N+o ܽ2xCG@co[^b쥬0 XŽ{tQt<}ToW Zy?·~DOi8\+/_8nȋ"s}-}w HM|h T8$Dݖ`]qb U %J4q>8ƹno xa٥bc}XX qŷw|\iḋ[EWеjEXfN zYUևr+J6ޗ2{>76}$~7k )?`9~゙X^Kj@q&ub;+[†:++:Y#jv =+sXW!.bѵ{'O+Q%.KM?W'JfeZGnߴ1;dHWN@:pp\ek@U 'hEF+TGQ?c^{oDGhUSCݐ}#ѡQ6m_T-_cr RYh?Y xEMVMɚZ'n~!爷qU3TE΅Puj<˹BU_U%V_3)KBC0 H>y*J'Rb%q|> V#ؠx}M*#* dzo6>oC7 @>>F.ܠt\֤wǀh0=p"n7?lOy-bQQc*`XJL2@װJ[G! ESDK·&R0-[AANJǓ#zptn/B;s)ׂ|IE֭e.+COMI49] QGIY|FI2NR$'>}\Y||- N<횱c% hM؉a zܶ|EDYSY;\/Q1˅mNƼI(3W".;.KV\ tMiM$}X*$eScl;b#JWY-}RZC5D ZZW³3ZN쎴Xi9Pꨳvr@ԉvF:@8V҂NRKkh_5b@\ ]V tFJzZ_S<įӂ O3>B jD"xyY@x';z\7֚l|}]cP%鳋D'YԐXXGAYK4F]26ď7,zV57x2{N`|Ej'j:=+׎f< - rz+[Xr?:&K<3\|[nCth!t6laimXؖ+R/ƨ\ V<ݙ%9Q#=o0sg#lԲ@V8|} sQ[v4KL\bI Wbچdм;񺍎>:u7a=lGs[,j&ϿJEf# Ӕ6}Po߆zDhCt}ޘ\qK`+C:twTܽl&Z AOS;'3N\zhՍjC!BTN_R#5Z"!F3Z#H2aּejKKsڰZ |V5jS2aMuf&8x޲:SeN:P@71celTy%$ MQ F֝3s=tOԅq|r*?n6gg~4^Tgj%=P+f|sL-S!pW/͸hJnri.eTK*ԝ3^=/q>/FontBBox[0 -104 165 129]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 164/Widths[ 0 93 0 71 0 129 0 58 0 57 0 45 0 0 50 0 0 46 0 0 128 0 0 75 0 120 54 0 30 0 38 0 47 0 48 0 81 0 0 60 0 90 59 0 61 74 111 0 0 37 0 96 0 55 0 0 0 0 65 0 104 36 99 49 0 39 92 0 95 83 82 94 0 42 0 0 121 0 147 0 0 135 0 0 0 143 0 0 0 43 0 73 0 41 0 51 0 56 0 27 0 0 0 44 0 0 0 88 0 125 89 0 0 28 0 0 0 0 40 0 0 26 0 32 0 0 0 0 0 33 0 0 52 0 78 86 0 80 0 91 0 84 0 0 0 0 0 0 0 25 0 98 0 85 0 0 0 105 0 97 0 0 29 0 53] >> endobj 1661 0 obj <>/FontBBox[0 -97 182 175]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 255/Widths[ 0 65 0 56 0 61 0 64 0 59 0 88 0 60 36 0 57 99 84 0 0 52 0 0 0 58 82 51 63 0 0 75 0 70 66 0 0 0 78 0 0 25 0 0 112 32 0 0 27 0 81 0 69 29 71 77 0 0 85 87 33 0 34 109 0 0 53 45 0 101 46 0 0 0 0 0 37 0 126 0 74 0 79 0 0 108 0 0 73 0 0 86 0 0 55 0 97 95 40 0 47 83 0 0 0 0 0 38 0 62 0 0 44 68 0 0 28 0 0 42 0 43 0 0 0 0 0 80 0 103 76 0 0 0 0 118 0 144 0 0 72 0 114 0 137 143 0 98 0 129 0 116 0 130 115 0 0 140 0 0 133 0 113 0 0 110 92 0 0 0 0 0 50 0 39 0 93 0 0 0 0 100 0 94 0 0 0 149 0 0 0 0 0 0 102 0 0 0 106 0 0 0 0 91 0 0 120 0 0 0 0 0 48 35 0 0 0 0 0 0 0 0 54 96 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 0 0 0 0 0 0 0 0 0 0 0 0 90 0 0] >> endobj 1486 0 obj <>/FontBBox[0 -72 182 175]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 255/Widths[ 0 0 98 0 73 0 66 0 69 0 60 0 32 0 61 77 0 0 62 0 112 0 78 0 51 0 75 0 59 0 116 0 56 63 68 54 0 0 55 0 65 113 64 0 0 0 0 34 0 67 0 0 101 100 48 49 0 0 144 0 0 0 0 0 117 0 105 0 0 71 0 145 0 0 130 0 129 0 106 0 126 0 115 0 0 0 26 0 84 0 0 58 0 57 0 0 86 0 0 88 0 0 94 0 134 0 74 39 0 0 0 0 83 0 46 0 0 0 0 0 0 0 0 0 81 0 0 0 0 70 0 0 0 53 0 0 99 0 95 0 0 0 38 0 0 0 0 97 0 0 0 0 0 36 0 136 0 72 45 82 0 0 27 0 90 0 93 0 96 0 0 109 0 0 43 0 0 0 0 137 52 0 0 0 148 0 0 0 110 111 76 37 0 0 0 0 80 0 0 103 0 0 85 92 0 102 0 132 147 121 143 0 120 41 125 107 40 0 0 87 89 0 0 0 0 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 104 0 127 118 79 0 0 0 28 0 0 0 0 0 0 0] >> endobj 1359 0 obj <> endobj 1952 0 obj <> endobj 1256 0 obj <>/FontBBox[0 -104 147 173]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 255/Widths[ 0 0 0 66 0 53 0 27 0 74 111 0 61 0 0 63 0 58 0 60 0 118 0 86 0 0 83 0 72 109 71 69 46 0 40 0 0 59 0 45 0 57 0 116 62 80 0 54 0 0 29 0 0 108 96 64 0 28 0 44 0 42 0 43 0 0 0 93 0 68 0 79 0 0 36 0 0 0 0 34 0 31 75 0 0 142 0 126 0 0 0 52 0 51 0 0 0 98 0 0 47 65 91 33 97 0 37 0 137 0 99 50 0 78 0 101 38 0 103 0 100 56 107 87 35 88 106 94 95 89 138 92 82 85 117 84 32 48 76 128 112 114 110 102 90 105 104 149 113 115 0 143 0 141 67 122 130 0 0 145 81 73 0 135 77 148 129 144 125 140 0 0 132 0 0 0 0 136 133 0 146 0 127 0 0 0 0 0 0 0 134 0 55 70 0 0 0 0 0 0 0 0 0 0 0 0 49 0 0 0 0 0 0 0 0 139 0 0 0 0 119 0 124 0 0 39 41 0 0 0 0 150 0 0 147 0 0 0 0 0 0 0 0 0 0 131 0 0 0 0 0 0 0 0 0 0] >> endobj 1020 0 obj <>/FontBBox[0 -104 178 174]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 255/Widths[ 0 107 0 86 0 84 0 55 0 0 54 0 45 0 117 0 39 0 72 0 91 0 43 0 89 0 36 51 0 52 0 0 0 128 60 0 28 65 0 67 59 0 98 0 33 0 93 46 0 68 0 75 0 71 0 27 0 0 76 44 83 0 0 92 0 41 79 49 0 90 0 0 0 0 0 124 0 0 61 0 62 0 0 57 0 58 0 64 0 0 0 0 63 0 0 0 0 0 37 0 56 96 0 88 0 53 0 73 105 0 87 0 125 0 0 103 0 0 0 0 0 0 66 0 0 0 0 0 101 0 0 0 0 0 85 26 0 110 0 32 82 50 0 0 122 0 108 34 0 0 0 119 118 0 0 0 0 0 0 0 0 0 0 0 0 106 104 120 0 0 0 97 100 80 0 0 126 149 148 0 121 0 0 38 0 0 0 0 134 0 140 0 0 0 0 0 0 94 0 0 0 81 0 111 0 0 0 0 0 0 99 78 0 0 29 0 0 0 130 0 135 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 0 0 0 0 35 0 0 69 0 102 0 0 0 0 0 0 0] >> endobj 829 0 obj <>/FontBBox[0 -90 202 176]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 255/Widths[ 0 85 0 0 57 0 58 0 54 0 39 0 41 0 50 0 48 0 80 0 0 0 82 0 81 0 55 0 27 0 0 28 52 0 70 0 56 0 51 0 72 0 78 43 0 45 44 0 116 115 83 46 38 84 0 40 0 0 59 0 0 64 0 74 0 108 0 53 0 0 0 60 0 0 36 0 0 0 100 0 35 0 61 88 0 0 0 65 0 0 0 122 0 0 0 0 0 30 0 0 0 26 0 0 0 0 31 47 0 32 0 0 91 0 0 0 49 0 77 62 37 76 0 89 79 0 34 42 0 0 0 0 0 0 0 128 127 0 0 69 92 0 0 0 0 0 73 86 102 101 75 138 104 93 0 90 0 0 0 0 99 0 0 0 0 0 0 0 0 29 0 124 0 0 0 0 0 87 63 0 0 123 0 0 0 0 97 0 0 0 0 0 0 120 0 0 0 98 0 0 0 0 0 0 0 0 0 107 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 129 0 145 0 0 0 144 0 71 0 0 0 0 143 105 0 130 0 0 0 0 0 0 132 0 119 126 0 0 0 0 0 0] >> endobj 658 0 obj <>/FontBBox[0 -90 176 173]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 255/Widths[ 0 0 0 144 0 116 0 97 0 48 0 50 0 90 0 56 0 61 62 0 0 30 0 54 0 0 35 0 63 0 64 0 0 52 55 0 0 0 115 0 0 0 26 0 65 0 0 37 0 98 0 0 33 0 0 0 77 0 60 0 36 100 59 96 0 0 88 0 0 0 0 0 0 0 93 0 102 0 73 0 91 0 0 92 0 85 0 103 0 146 76 0 0 0 0 147 0 0 0 0 32 47 0 0 46 58 0 99 51 0 113 45 0 109 38 0 57 108 0 0 0 118 0 66 0 117 0 43 0 34 0 0 101 0 49 0 106 0 143 0 0 0 95 87 0 53 0 94 150 0 0 104 0 42 68 0 0 75 0 105 44 0 107 110 140 69 81 79 0 67 74 78 86 82 89 137 84 0 0 0 0 0 0 71 72 0 0 83 0 0 134 0 0 136 145 0 0 111 114 138 0 131 40 0 139 41 31 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 0 0 0 80 0 0 0 133 0 0 27 0 0 0 0 0 0 123 0 0 0 0 0 0 0 0 149 0 0 0 0 0] >> endobj 475 0 obj <>/FontBBox[0 -73 202 176]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 255/Widths[ 0 0 0 72 0 119 0 132 0 104 0 131 0 0 88 0 51 0 33 0 58 0 82 0 65 0 99 0 84 0 59 0 78 0 63 0 135 0 61 90 34 0 68 134 89 46 57 47 31 52 91 96 102 64 62 0 98 0 95 103 45 105 0 85 93 81 0 55 137 108 0 0 32 53 54 97 0 49 0 0 86 48 0 37 83 0 0 0 101 94 0 56 66 0 80 0 0 92 0 0 138 144 0 0 0 0 0 0 0 0 0 74 0 0 0 75 0 0 106 67 0 0 0 0 0 27 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 0 0 60 0 28 50 0 0 0 0 0 0 41 87 0 0 70 38 0 0 26 0 0 0 69 0 0 116 0 0 0 0 0 43 0 0 145 148 0 0 0 129 0 118 130 150 0 114 110 0 42 0 120 113 117 0 0 0 0 0 0 111 0 0 0 0 73 0 0 77 0 79 0 0 0 71 0 0 0 0 0 0 0 0 0 0 76 0 146 0 0 0 0 0 121 0 39 0 0 0 0 0 0 0 0 0 0 30 0 0 109 107 0 0 0] >> endobj 280 0 obj <>/FontBBox[0 -92 178 174]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 255/Widths[ 0 89 0 120 0 50 69 0 67 0 148 0 108 0 96 95 0 47 98 0 0 94 0 105 0 0 93 0 55 0 0 0 91 102 61 0 92 0 0 63 0 74 0 71 73 0 101 0 111 0 0 38 0 37 68 62 0 56 0 110 0 70 54 0 0 40 0 0 46 0 33 0 52 0 60 0 48 0 57 0 65 59 0 103 0 0 127 64 0 109 0 66 53 0 75 114 0 0 0 0 0 106 58 34 0 0 0 0 88 0 51 0 0 0 0 0 0 0 0 79 0 80 133 90 0 136 85 0 81 0 0 0 78 0 0 0 0 84 0 131 0 83 0 0 77 72 39 82 0 124 123 0 31 128 129 0 76 0 35 0 0 43 0 0 36 0 0 0 0 25 0 0 0 26 0 0 0 45 0 0 0 0 0 126 86 0 140 0 0 0 0 0 0 0 87 0 27 0 118 0 137 138 0 0 32 0 0 24 0 49 0 0 0 0 0 0 0 0 0 122 0 0 28 0 0 0 0 0 0 0 0 0 0 0 99 0 0 0 0 0 132 0 0 0 0 0 0 0 0 0 130 0 0 0 143 0] >> endobj 10 0 obj <>/FontBBox[0 -102 185 226]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 255/Widths[ 0 0 143 0 120 0 100 0 0 110 0 77 0 91 104 0 92 0 51 0 102 0 0 0 139 0 103 0 0 83 0 0 0 140 0 114 0 78 0 101 0 108 0 116 0 136 0 121 94 109 0 111 141 0 95 85 0 115 0 99 0 112 148 98 0 86 0 90 145 0 0 55 0 105 0 56 0 0 0 0 137 84 0 87 89 0 93 0 0 0 76 0 0 0 0 0 72 0 50 82 0 0 74 96 75 52 0 0 130 73 0 0 0 0 0 0 80 0 0 65 0 0 0 44 0 135 0 0 127 124 0 0 0 138 62 0 71 0 0 68 0 64 0 0 0 48 131 113 0 88 69 0 132 0 144 66 47 0 0 0 41 61 0 133 0 0 147 0 142 57 0 0 79 134 0 43 0 81 146 0 128 0 0 0 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 150 0 0 0 125 0 0 0 0 70 0 0 0 0 0 0 0 0 0 0 38 54 0 0 0 0 0 0 67 0 0 0 35 39 0 0 0 0 0 0 0 0 0 40 0 0 0 37 53 0 0 0 0 0 0 119] >> endobj 1052 0 obj <> endobj 974 0 obj <> endobj 1953 0 obj <> endobj 691 0 obj <> endobj 1954 0 obj <> endobj 1387 0 obj <> endobj 1955 0 obj <> endobj 1198 0 obj <> endobj 1956 0 obj <> endobj 1150 0 obj <> endobj 1957 0 obj <> endobj 882 0 obj <> endobj 328 0 obj <> endobj 1234 0 obj <> endobj 1958 0 obj <> endobj 1153 0 obj <> endobj 1071 0 obj <> endobj 1959 0 obj <> endobj 200 0 obj <> endobj 1049 0 obj <> endobj 1960 0 obj <> endobj 1304 0 obj <> endobj 1961 0 obj <> endobj 978 0 obj <> endobj 1962 0 obj <> endobj 9 0 obj <> endobj 2 0 obj <>endobj xref 0 1963 0000000000 65535 f 0000231350 00000 n 0000742167 00000 n 0000230760 00000 n 0000220828 00000 n 0000000015 00000 n 0000000814 00000 n 0000231398 00000 n 0000231467 00000 n 0000740930 00000 n 0000720097 00000 n 0000241621 00000 n 0000241932 00000 n 0000242215 00000 n 0000242280 00000 n 0000242646 00000 n 0000242711 00000 n 0000243087 00000 n 0000243152 00000 n 0000243427 00000 n 0000243668 00000 n 0000243733 00000 n 0000244048 00000 n 0000244112 00000 n 0000244427 00000 n 0000244491 00000 n 0000244556 00000 n 0000244795 00000 n 0000244859 00000 n 0000245143 00000 n 0000245207 00000 n 0000245497 00000 n 0000245562 00000 n 0000245879 00000 n 0000246164 00000 n 0000246532 00000 n 0000246597 00000 n 0000246865 00000 n 0000246930 00000 n 0000247257 00000 n 0000247626 00000 n 0000247690 00000 n 0000247963 00000 n 0000248310 00000 n 0000248589 00000 n 0000248654 00000 n 0000248968 00000 n 0000249033 00000 n 0000249280 00000 n 0000249344 00000 n 0000249649 00000 n 0000249714 00000 n 0000250021 00000 n 0000250086 00000 n 0000250304 00000 n 0000250369 00000 n 0000250645 00000 n 0000250710 00000 n 0000250985 00000 n 0000251050 00000 n 0000251114 00000 n 0000251179 00000 n 0000251511 00000 n 0000251576 00000 n 0000251641 00000 n 0000251946 00000 n 0000252010 00000 n 0000252074 00000 n 0000252336 00000 n 0000252401 00000 n 0000252683 00000 n 0000252747 00000 n 0000253065 00000 n 0000253130 00000 n 0000253195 00000 n 0000253259 00000 n 0000253543 00000 n 0000253607 00000 n 0000253845 00000 n 0000253909 00000 n 0000253974 00000 n 0000254190 00000 n 0000254479 00000 n 0000254543 00000 n 0000254824 00000 n 0000254889 00000 n 0000255150 00000 n 0000255214 00000 n 0000255531 00000 n 0000255905 00000 n 0000256180 00000 n 0000256411 00000 n 0000256476 00000 n 0000256540 00000 n 0000256801 00000 n 0000256865 00000 n 0000256929 00000 n 0000257190 00000 n 0000257254 00000 n 0000257498 00000 n 0000257845 00000 n 0000258130 00000 n 0000258195 00000 n 0000258585 00000 n 0000258854 00000 n 0000259115 00000 n 0000259471 00000 n 0000259776 00000 n 0000259841 00000 n 0000260176 00000 n 0000260241 00000 n 0000260306 00000 n 0000260618 00000 n 0000260926 00000 n 0000260991 00000 n 0000261056 00000 n 0000261121 00000 n 0000261186 00000 n 0000261406 00000 n 0000261744 00000 n 0000261810 00000 n 0000261875 00000 n 0000262179 00000 n 0000262482 00000 n 0000262809 00000 n 0000262840 00000 n 0000262871 00000 n 0000221023 00000 n 0000000833 00000 n 0000002023 00000 n 0000262902 00000 n 0000263208 00000 n 0000263493 00000 n 0000263734 00000 n 0000263799 00000 n 0000264076 00000 n 0000264384 00000 n 0000264449 00000 n 0000264763 00000 n 0000265006 00000 n 0000265293 00000 n 0000265358 00000 n 0000265681 00000 n 0000265747 00000 n 0000266026 00000 n 0000266393 00000 n 0000266459 00000 n 0000266525 00000 n 0000266794 00000 n 0000267114 00000 n 0000267470 00000 n 0000267536 00000 n 0000267601 00000 n 0000267899 00000 n 0000267964 00000 n 0000268222 00000 n 0000268484 00000 n 0000268549 00000 n 0000268898 00000 n 0000268963 00000 n 0000269205 00000 n 0000269533 00000 n 0000269812 00000 n 0000269877 00000 n 0000269943 00000 n 0000270009 00000 n 0000270317 00000 n 0000270382 00000 n 0000270447 00000 n 0000270615 00000 n 0000270681 00000 n 0000271013 00000 n 0000271079 00000 n 0000271144 00000 n 0000271209 00000 n 0000271417 00000 n 0000271730 00000 n 0000271986 00000 n 0000272051 00000 n 0000272116 00000 n 0000272400 00000 n 0000272466 00000 n 0000272822 00000 n 0000273201 00000 n 0000273267 00000 n 0000273557 00000 n 0000273623 00000 n 0000273688 00000 n 0000274039 00000 n 0000274330 00000 n 0000274395 00000 n 0000274461 00000 n 0000274766 00000 n 0000274831 00000 n 0000275188 00000 n 0000275253 00000 n 0000275319 00000 n 0000275506 00000 n 0000655649 00000 n 0000655428 00000 n 0000736491 00000 n 0000275572 00000 n 0000275879 00000 n 0000276183 00000 n 0000276465 00000 n 0000276530 00000 n 0000276849 00000 n 0000276893 00000 n 0000221178 00000 n 0000002045 00000 n 0000003552 00000 n 0000277184 00000 n 0000277432 00000 n 0000277664 00000 n 0000277910 00000 n 0000278176 00000 n 0000278405 00000 n 0000278684 00000 n 0000278979 00000 n 0000279272 00000 n 0000279532 00000 n 0000279760 00000 n 0000280090 00000 n 0000280336 00000 n 0000280674 00000 n 0000280740 00000 n 0000281057 00000 n 0000281325 00000 n 0000281577 00000 n 0000281643 00000 n 0000281905 00000 n 0000282234 00000 n 0000282491 00000 n 0000282799 00000 n 0000282864 00000 n 0000283152 00000 n 0000283432 00000 n 0000283727 00000 n 0000284065 00000 n 0000284349 00000 n 0000284664 00000 n 0000284929 00000 n 0000285217 00000 n 0000285441 00000 n 0000285719 00000 n 0000285784 00000 n 0000285849 00000 n 0000286174 00000 n 0000286450 00000 n 0000286713 00000 n 0000287003 00000 n 0000287249 00000 n 0000287541 00000 n 0000287606 00000 n 0000287837 00000 n 0000288040 00000 n 0000288327 00000 n 0000288392 00000 n 0000288457 00000 n 0000288739 00000 n 0000288984 00000 n 0000289240 00000 n 0000289468 00000 n 0000289733 00000 n 0000289995 00000 n 0000290321 00000 n 0000290575 00000 n 0000290869 00000 n 0000290934 00000 n 0000291194 00000 n 0000291476 00000 n 0000291722 00000 n 0000291787 00000 n 0000291852 00000 n 0000292178 00000 n 0000292473 00000 n 0000292772 00000 n 0000292954 00000 n 0000293283 00000 n 0000293567 00000 n 0000716108 00000 n 0000293633 00000 n 0000293944 00000 n 0000294156 00000 n 0000294447 00000 n 0000294743 00000 n 0000295027 00000 n 0000295310 00000 n 0000295571 00000 n 0000295851 00000 n 0000296116 00000 n 0000296397 00000 n 0000296609 00000 n 0000296858 00000 n 0000297078 00000 n 0000297328 00000 n 0000297567 00000 n 0000297752 00000 n 0000298022 00000 n 0000298299 00000 n 0000298548 00000 n 0000298780 00000 n 0000299026 00000 n 0000299267 00000 n 0000299540 00000 n 0000299833 00000 n 0000300050 00000 n 0000300273 00000 n 0000300504 00000 n 0000300769 00000 n 0000301070 00000 n 0000301303 00000 n 0000301558 00000 n 0000301854 00000 n 0000302073 00000 n 0000302288 00000 n 0000302353 00000 n 0000302595 00000 n 0000302660 00000 n 0000302891 00000 n 0000303123 00000 n 0000303188 00000 n 0000303455 00000 n 0000303724 00000 n 0000303970 00000 n 0000304035 00000 n 0000656490 00000 n 0000656273 00000 n 0000731974 00000 n 0000304289 00000 n 0000304603 00000 n 0000304896 00000 n 0000305144 00000 n 0000305404 00000 n 0000305666 00000 n 0000305929 00000 n 0000306221 00000 n 0000306519 00000 n 0000306824 00000 n 0000307135 00000 n 0000307201 00000 n 0000307266 00000 n 0000307331 00000 n 0000307529 00000 n 0000307793 00000 n 0000308057 00000 n 0000308325 00000 n 0000308557 00000 n 0000308819 00000 n 0000309083 00000 n 0000309355 00000 n 0000309536 00000 n 0000309590 00000 n 0000221333 00000 n 0000003574 00000 n 0000004472 00000 n 0000309870 00000 n 0000310136 00000 n 0000310370 00000 n 0000310635 00000 n 0000310825 00000 n 0000311078 00000 n 0000311287 00000 n 0000311599 00000 n 0000311833 00000 n 0000312069 00000 n 0000312337 00000 n 0000312524 00000 n 0000312786 00000 n 0000313056 00000 n 0000313335 00000 n 0000313607 00000 n 0000313863 00000 n 0000314061 00000 n 0000314233 00000 n 0000314299 00000 n 0000314565 00000 n 0000314630 00000 n 0000314696 00000 n 0000314989 00000 n 0000315230 00000 n 0000315467 00000 n 0000315685 00000 n 0000315893 00000 n 0000316123 00000 n 0000316188 00000 n 0000316409 00000 n 0000316655 00000 n 0000316893 00000 n 0000317095 00000 n 0000317160 00000 n 0000317416 00000 n 0000317641 00000 n 0000317855 00000 n 0000317920 00000 n 0000318175 00000 n 0000318413 00000 n 0000318653 00000 n 0000318718 00000 n 0000318976 00000 n 0000319280 00000 n 0000319567 00000 n 0000319812 00000 n 0000320040 00000 n 0000320106 00000 n 0000320395 00000 n 0000320615 00000 n 0000320808 00000 n 0000321039 00000 n 0000321272 00000 n 0000321501 00000 n 0000321736 00000 n 0000321984 00000 n 0000322211 00000 n 0000322276 00000 n 0000322507 00000 n 0000322573 00000 n 0000322747 00000 n 0000322980 00000 n 0000323224 00000 n 0000323289 00000 n 0000323461 00000 n 0000323684 00000 n 0000323749 00000 n 0000323981 00000 n 0000324046 00000 n 0000324240 00000 n 0000324455 00000 n 0000324646 00000 n 0000324842 00000 n 0000325044 00000 n 0000325280 00000 n 0000325515 00000 n 0000325547 00000 n 0000221488 00000 n 0000004493 00000 n 0000004843 00000 n 0000325826 00000 n 0000326093 00000 n 0000326159 00000 n 0000326378 00000 n 0000326614 00000 n 0000326679 00000 n 0000326936 00000 n 0000327192 00000 n 0000327479 00000 n 0000327722 00000 n 0000327913 00000 n 0000328162 00000 n 0000328414 00000 n 0000328651 00000 n 0000328869 00000 n 0000329144 00000 n 0000329372 00000 n 0000329642 00000 n 0000329905 00000 n 0000330145 00000 n 0000330371 00000 n 0000330638 00000 n 0000330931 00000 n 0000331170 00000 n 0000331394 00000 n 0000331652 00000 n 0000331830 00000 n 0000332064 00000 n 0000332096 00000 n 0000221643 00000 n 0000004864 00000 n 0000007450 00000 n 0000332460 00000 n 0000332920 00000 n 0000333196 00000 n 0000333586 00000 n 0000333967 00000 n 0000334304 00000 n 0000712125 00000 n 0000334635 00000 n 0000334903 00000 n 0000335270 00000 n 0000335572 00000 n 0000335875 00000 n 0000336218 00000 n 0000336577 00000 n 0000336842 00000 n 0000337143 00000 n 0000337414 00000 n 0000337659 00000 n 0000337872 00000 n 0000338162 00000 n 0000338406 00000 n 0000338704 00000 n 0000338918 00000 n 0000339179 00000 n 0000339428 00000 n 0000339596 00000 n 0000339859 00000 n 0000340098 00000 n 0000340363 00000 n 0000340626 00000 n 0000340880 00000 n 0000341182 00000 n 0000341421 00000 n 0000341656 00000 n 0000341934 00000 n 0000341999 00000 n 0000342244 00000 n 0000342511 00000 n 0000342799 00000 n 0000343021 00000 n 0000343313 00000 n 0000343546 00000 n 0000343814 00000 n 0000344103 00000 n 0000344376 00000 n 0000344653 00000 n 0000344903 00000 n 0000344945 00000 n 0000221798 00000 n 0000007472 00000 n 0000008966 00000 n 0000345405 00000 n 0000345723 00000 n 0000346166 00000 n 0000346399 00000 n 0000346638 00000 n 0000346903 00000 n 0000347149 00000 n 0000347446 00000 n 0000347689 00000 n 0000347968 00000 n 0000348237 00000 n 0000348456 00000 n 0000348669 00000 n 0000348948 00000 n 0000349211 00000 n 0000349469 00000 n 0000349749 00000 n 0000349970 00000 n 0000350217 00000 n 0000350502 00000 n 0000350787 00000 n 0000351057 00000 n 0000351296 00000 n 0000351532 00000 n 0000351808 00000 n 0000352048 00000 n 0000352286 00000 n 0000352530 00000 n 0000352772 00000 n 0000353051 00000 n 0000353337 00000 n 0000353575 00000 n 0000353848 00000 n 0000354085 00000 n 0000354337 00000 n 0000354600 00000 n 0000354882 00000 n 0000355138 00000 n 0000221953 00000 n 0000008988 00000 n 0000010736 00000 n 0000355180 00000 n 0000355477 00000 n 0000355759 00000 n 0000355975 00000 n 0000356254 00000 n 0000356503 00000 n 0000356722 00000 n 0000356989 00000 n 0000357231 00000 n 0000357498 00000 n 0000357780 00000 n 0000358056 00000 n 0000358339 00000 n 0000358598 00000 n 0000358833 00000 n 0000359081 00000 n 0000359370 00000 n 0000359629 00000 n 0000359891 00000 n 0000360130 00000 n 0000360373 00000 n 0000360619 00000 n 0000360910 00000 n 0000360952 00000 n 0000222108 00000 n 0000010758 00000 n 0000011362 00000 n 0000361249 00000 n 0000361566 00000 n 0000361942 00000 n 0000362204 00000 n 0000222263 00000 n 0000011383 00000 n 0000013081 00000 n 0000362246 00000 n 0000362570 00000 n 0000362901 00000 n 0000362966 00000 n 0000363223 00000 n 0000363289 00000 n 0000363331 00000 n 0000222418 00000 n 0000013103 00000 n 0000016242 00000 n 0000363647 00000 n 0000363928 00000 n 0000364254 00000 n 0000364539 00000 n 0000364797 00000 n 0000365121 00000 n 0000365456 00000 n 0000365724 00000 n 0000365971 00000 n 0000366198 00000 n 0000366468 00000 n 0000366729 00000 n 0000366927 00000 n 0000367228 00000 n 0000367471 00000 n 0000367720 00000 n 0000367968 00000 n 0000368232 00000 n 0000368437 00000 n 0000368722 00000 n 0000368986 00000 n 0000369235 00000 n 0000369567 00000 n 0000369798 00000 n 0000370028 00000 n 0000370325 00000 n 0000370577 00000 n 0000370757 00000 n 0000371023 00000 n 0000371298 00000 n 0000371517 00000 n 0000371814 00000 n 0000372013 00000 n 0000372299 00000 n 0000372549 00000 n 0000372799 00000 n 0000373064 00000 n 0000373329 00000 n 0000373566 00000 n 0000373737 00000 n 0000373978 00000 n 0000374231 00000 n 0000374459 00000 n 0000374524 00000 n 0000374784 00000 n 0000375074 00000 n 0000375140 00000 n 0000375191 00000 n 0000222573 00000 n 0000016264 00000 n 0000019145 00000 n 0000375625 00000 n 0000375995 00000 n 0000708127 00000 n 0000376281 00000 n 0000376559 00000 n 0000376816 00000 n 0000377208 00000 n 0000377666 00000 n 0000377963 00000 n 0000378250 00000 n 0000378552 00000 n 0000378787 00000 n 0000379003 00000 n 0000379267 00000 n 0000379319 00000 n 0000222728 00000 n 0000019167 00000 n 0000021121 00000 n 0000379519 00000 n 0000379726 00000 n 0000379948 00000 n 0000380148 00000 n 0000380395 00000 n 0000380644 00000 n 0000380852 00000 n 0000381104 00000 n 0000381378 00000 n 0000381631 00000 n 0000222883 00000 n 0000021143 00000 n 0000025896 00000 n 0000381683 00000 n 0000382057 00000 n 0000660904 00000 n 0000660688 00000 n 0000726311 00000 n 0000382438 00000 n 0000382637 00000 n 0000382841 00000 n 0000383117 00000 n 0000383327 00000 n 0000383529 00000 n 0000383771 00000 n 0000384017 00000 n 0000384188 00000 n 0000384409 00000 n 0000384592 00000 n 0000384657 00000 n 0000223038 00000 n 0000025918 00000 n 0000028358 00000 n 0000384921 00000 n 0000385161 00000 n 0000385395 00000 n 0000385637 00000 n 0000385926 00000 n 0000386160 00000 n 0000386407 00000 n 0000386645 00000 n 0000386837 00000 n 0000387080 00000 n 0000387459 00000 n 0000387750 00000 n 0000388012 00000 n 0000388257 00000 n 0000388518 00000 n 0000388760 00000 n 0000389076 00000 n 0000389388 00000 n 0000389674 00000 n 0000389992 00000 n 0000390300 00000 n 0000390668 00000 n 0000390973 00000 n 0000391269 00000 n 0000391531 00000 n 0000391777 00000 n 0000392008 00000 n 0000392223 00000 n 0000392455 00000 n 0000392674 00000 n 0000392941 00000 n 0000393183 00000 n 0000393432 00000 n 0000393667 00000 n 0000393899 00000 n 0000394144 00000 n 0000394431 00000 n 0000394694 00000 n 0000394933 00000 n 0000395202 00000 n 0000395441 00000 n 0000395705 00000 n 0000395976 00000 n 0000396251 00000 n 0000396496 00000 n 0000396792 00000 n 0000397053 00000 n 0000397354 00000 n 0000397535 00000 n 0000397802 00000 n 0000398065 00000 n 0000398278 00000 n 0000398532 00000 n 0000398798 00000 n 0000398966 00000 n 0000399186 00000 n 0000399384 00000 n 0000399628 00000 n 0000399895 00000 n 0000400158 00000 n 0000223193 00000 n 0000028380 00000 n 0000031087 00000 n 0000400219 00000 n 0000400459 00000 n 0000400693 00000 n 0000400940 00000 n 0000401193 00000 n 0000401497 00000 n 0000401845 00000 n 0000402130 00000 n 0000402399 00000 n 0000402727 00000 n 0000403097 00000 n 0000403366 00000 n 0000403711 00000 n 0000403882 00000 n 0000404132 00000 n 0000404418 00000 n 0000404706 00000 n 0000404943 00000 n 0000405190 00000 n 0000405450 00000 n 0000405740 00000 n 0000406003 00000 n 0000406259 00000 n 0000406495 00000 n 0000406732 00000 n 0000406974 00000 n 0000407254 00000 n 0000407427 00000 n 0000407666 00000 n 0000407857 00000 n 0000408056 00000 n 0000408314 00000 n 0000408580 00000 n 0000408848 00000 n 0000409127 00000 n 0000409363 00000 n 0000409573 00000 n 0000409835 00000 n 0000410072 00000 n 0000410377 00000 n 0000410591 00000 n 0000410824 00000 n 0000411086 00000 n 0000411348 00000 n 0000411595 00000 n 0000411813 00000 n 0000412070 00000 n 0000412326 00000 n 0000412587 00000 n 0000412855 00000 n 0000413150 00000 n 0000413369 00000 n 0000413653 00000 n 0000413936 00000 n 0000414002 00000 n 0000414256 00000 n 0000414529 00000 n 0000414781 00000 n 0000415063 00000 n 0000704124 00000 n 0000415270 00000 n 0000415545 00000 n 0000415744 00000 n 0000415984 00000 n 0000416243 00000 n 0000416469 00000 n 0000416710 00000 n 0000416955 00000 n 0000417220 00000 n 0000417458 00000 n 0000417696 00000 n 0000417974 00000 n 0000418210 00000 n 0000418459 00000 n 0000418710 00000 n 0000418918 00000 n 0000419141 00000 n 0000419350 00000 n 0000419599 00000 n 0000419843 00000 n 0000420074 00000 n 0000420305 00000 n 0000420562 00000 n 0000420796 00000 n 0000421027 00000 n 0000421281 00000 n 0000421495 00000 n 0000421676 00000 n 0000421875 00000 n 0000422105 00000 n 0000422354 00000 n 0000422620 00000 n 0000422880 00000 n 0000423110 00000 n 0000423319 00000 n 0000423371 00000 n 0000223348 00000 n 0000031109 00000 n 0000033774 00000 n 0000423635 00000 n 0000423843 00000 n 0000424043 00000 n 0000424285 00000 n 0000424537 00000 n 0000424811 00000 n 0000425060 00000 n 0000425349 00000 n 0000425583 00000 n 0000425830 00000 n 0000426103 00000 n 0000657186 00000 n 0000656981 00000 n 0000731101 00000 n 0000426302 00000 n 0000426549 00000 n 0000426714 00000 n 0000426933 00000 n 0000427177 00000 n 0000427406 00000 n 0000427580 00000 n 0000427796 00000 n 0000428026 00000 n 0000428277 00000 n 0000428457 00000 n 0000428707 00000 n 0000428873 00000 n 0000429154 00000 n 0000429369 00000 n 0000429608 00000 n 0000429869 00000 n 0000430083 00000 n 0000430311 00000 n 0000430574 00000 n 0000430816 00000 n 0000431057 00000 n 0000431312 00000 n 0000431553 00000 n 0000431784 00000 n 0000432044 00000 n 0000432323 00000 n 0000432612 00000 n 0000432885 00000 n 0000433153 00000 n 0000433390 00000 n 0000433649 00000 n 0000433897 00000 n 0000434143 00000 n 0000434406 00000 n 0000434695 00000 n 0000434929 00000 n 0000435200 00000 n 0000435396 00000 n 0000435659 00000 n 0000435911 00000 n 0000436155 00000 n 0000436390 00000 n 0000436678 00000 n 0000436900 00000 n 0000437184 00000 n 0000437406 00000 n 0000437628 00000 n 0000437879 00000 n 0000438135 00000 n 0000438414 00000 n 0000438667 00000 n 0000438732 00000 n 0000438979 00000 n 0000439206 00000 n 0000439477 00000 n 0000439674 00000 n 0000439927 00000 n 0000440173 00000 n 0000440425 00000 n 0000440650 00000 n 0000440882 00000 n 0000441050 00000 n 0000223503 00000 n 0000033796 00000 n 0000036615 00000 n 0000441115 00000 n 0000441341 00000 n 0000441533 00000 n 0000441873 00000 n 0000442189 00000 n 0000442429 00000 n 0000442696 00000 n 0000442934 00000 n 0000443214 00000 n 0000443385 00000 n 0000443687 00000 n 0000443932 00000 n 0000444182 00000 n 0000444449 00000 n 0000444652 00000 n 0000444934 00000 n 0000445217 00000 n 0000445460 00000 n 0000445757 00000 n 0000445989 00000 n 0000446243 00000 n 0000223658 00000 n 0000036637 00000 n 0000063506 00000 n 0000446308 00000 n 0000725090 00000 n 0000446595 00000 n 0000447027 00000 n 0000447382 00000 n 0000739817 00000 n 0000447758 00000 n 0000447957 00000 n 0000448161 00000 n 0000448437 00000 n 0000448647 00000 n 0000448849 00000 n 0000449091 00000 n 0000449337 00000 n 0000449508 00000 n 0000449691 00000 n 0000449933 00000 n 0000449994 00000 n 0000450085 00000 n 0000223838 00000 n 0000063529 00000 n 0000065941 00000 n 0000450519 00000 n 0000450909 00000 n 0000451279 00000 n 0000451565 00000 n 0000451868 00000 n 0000452186 00000 n 0000452449 00000 n 0000452793 00000 n 0000453218 00000 n 0000453600 00000 n 0000453938 00000 n 0000454215 00000 n 0000454608 00000 n 0000455067 00000 n 0000455449 00000 n 0000455910 00000 n 0000456278 00000 n 0000456638 00000 n 0000456959 00000 n 0000457265 00000 n 0000457577 00000 n 0000457839 00000 n 0000458122 00000 n 0000458395 00000 n 0000458680 00000 n 0000699974 00000 n 0000458931 00000 n 0000459206 00000 n 0000459500 00000 n 0000223994 00000 n 0000065963 00000 n 0000068698 00000 n 0000459564 00000 n 0000459786 00000 n 0000460016 00000 n 0000460235 00000 n 0000460499 00000 n 0000460771 00000 n 0000461037 00000 n 0000461303 00000 n 0000461635 00000 n 0000461893 00000 n 0000462199 00000 n 0000462428 00000 n 0000462696 00000 n 0000462940 00000 n 0000463217 00000 n 0000463496 00000 n 0000463732 00000 n 0000464003 00000 n 0000464257 00000 n 0000224152 00000 n 0000068721 00000 n 0000072569 00000 n 0000737416 00000 n 0000659208 00000 n 0000658943 00000 n 0000724043 00000 n 0000464334 00000 n 0000464594 00000 n 0000464816 00000 n 0000465102 00000 n 0000465335 00000 n 0000465622 00000 n 0000465831 00000 n 0000466079 00000 n 0000466343 00000 n 0000466606 00000 n 0000224310 00000 n 0000072592 00000 n 0000075130 00000 n 0000466700 00000 n 0000466954 00000 n 0000467233 00000 n 0000467519 00000 n 0000467766 00000 n 0000735205 00000 n 0000467947 00000 n 0000468164 00000 n 0000468384 00000 n 0000224468 00000 n 0000075153 00000 n 0000077935 00000 n 0000468476 00000 n 0000468750 00000 n 0000468983 00000 n 0000469234 00000 n 0000469509 00000 n 0000469732 00000 n 0000469949 00000 n 0000470124 00000 n 0000470360 00000 n 0000470624 00000 n 0000470883 00000 n 0000471102 00000 n 0000471350 00000 n 0000471633 00000 n 0000471865 00000 n 0000472112 00000 n 0000472364 00000 n 0000472605 00000 n 0000472876 00000 n 0000473173 00000 n 0000473437 00000 n 0000473613 00000 n 0000473893 00000 n 0000474212 00000 n 0000474451 00000 n 0000474693 00000 n 0000474935 00000 n 0000475191 00000 n 0000475428 00000 n 0000475668 00000 n 0000475885 00000 n 0000476121 00000 n 0000476418 00000 n 0000476676 00000 n 0000476920 00000 n 0000477158 00000 n 0000477388 00000 n 0000224626 00000 n 0000077958 00000 n 0000080969 00000 n 0000477465 00000 n 0000477704 00000 n 0000477991 00000 n 0000478254 00000 n 0000478520 00000 n 0000478808 00000 n 0000479080 00000 n 0000479377 00000 n 0000479641 00000 n 0000479917 00000 n 0000480177 00000 n 0000224784 00000 n 0000080992 00000 n 0000083551 00000 n 0000480241 00000 n 0000480504 00000 n 0000224942 00000 n 0000083574 00000 n 0000085370 00000 n 0000480568 00000 n 0000480894 00000 n 0000481259 00000 n 0000481562 00000 n 0000481840 00000 n 0000482152 00000 n 0000482463 00000 n 0000482527 00000 n 0000225100 00000 n 0000085393 00000 n 0000092184 00000 n 0000482784 00000 n 0000482992 00000 n 0000729969 00000 n 0000657786 00000 n 0000657536 00000 n 0000734163 00000 n 0000483215 00000 n 0000483449 00000 n 0000483808 00000 n 0000484065 00000 n 0000225258 00000 n 0000092207 00000 n 0000094781 00000 n 0000484159 00000 n 0000484428 00000 n 0000484720 00000 n 0000484886 00000 n 0000485151 00000 n 0000225416 00000 n 0000094804 00000 n 0000097130 00000 n 0000485228 00000 n 0000485505 00000 n 0000485823 00000 n 0000486080 00000 n 0000486335 00000 n 0000225574 00000 n 0000097153 00000 n 0000099760 00000 n 0000486425 00000 n 0000486742 00000 n 0000487001 00000 n 0000487312 00000 n 0000487578 00000 n 0000487852 00000 n 0000488088 00000 n 0000488359 00000 n 0000488604 00000 n 0000488883 00000 n 0000489115 00000 n 0000489379 00000 n 0000489657 00000 n 0000489954 00000 n 0000490236 00000 n 0000490483 00000 n 0000490705 00000 n 0000490966 00000 n 0000225732 00000 n 0000099783 00000 n 0000103784 00000 n 0000728683 00000 n 0000491030 00000 n 0000491291 00000 n 0000491632 00000 n 0000225890 00000 n 0000103807 00000 n 0000107147 00000 n 0000491711 00000 n 0000491965 00000 n 0000492207 00000 n 0000492462 00000 n 0000492691 00000 n 0000492926 00000 n 0000493224 00000 n 0000493466 00000 n 0000493742 00000 n 0000494042 00000 n 0000494299 00000 n 0000494555 00000 n 0000494845 00000 n 0000495122 00000 n 0000495359 00000 n 0000495636 00000 n 0000495869 00000 n 0000496092 00000 n 0000496311 00000 n 0000496485 00000 n 0000496721 00000 n 0000496961 00000 n 0000497168 00000 n 0000497400 00000 n 0000497643 00000 n 0000497886 00000 n 0000226048 00000 n 0000107170 00000 n 0000111081 00000 n 0000732906 00000 n 0000497950 00000 n 0000226206 00000 n 0000111104 00000 n 0000113919 00000 n 0000498029 00000 n 0000498269 00000 n 0000498446 00000 n 0000498723 00000 n 0000498983 00000 n 0000499208 00000 n 0000499396 00000 n 0000499643 00000 n 0000499886 00000 n 0000500076 00000 n 0000500324 00000 n 0000500539 00000 n 0000500767 00000 n 0000501021 00000 n 0000501285 00000 n 0000501570 00000 n 0000501818 00000 n 0000695826 00000 n 0000502033 00000 n 0000502287 00000 n 0000502542 00000 n 0000502749 00000 n 0000503002 00000 n 0000503247 00000 n 0000503482 00000 n 0000503728 00000 n 0000503989 00000 n 0000504234 00000 n 0000504474 00000 n 0000226364 00000 n 0000113942 00000 n 0000117042 00000 n 0000504575 00000 n 0000504855 00000 n 0000505126 00000 n 0000226522 00000 n 0000117065 00000 n 0000119982 00000 n 0000505214 00000 n 0000226680 00000 n 0000120005 00000 n 0000123154 00000 n 0000505278 00000 n 0000505529 00000 n 0000505737 00000 n 0000505983 00000 n 0000506263 00000 n 0000506516 00000 n 0000506796 00000 n 0000507061 00000 n 0000507336 00000 n 0000507678 00000 n 0000507933 00000 n 0000226838 00000 n 0000123177 00000 n 0000128981 00000 n 0000508008 00000 n 0000508441 00000 n 0000508797 00000 n 0000509174 00000 n 0000509421 00000 n 0000509489 00000 n 0000227022 00000 n 0000129004 00000 n 0000133322 00000 n 0000738555 00000 n 0000509577 00000 n 0000509839 00000 n 0000510133 00000 n 0000510403 00000 n 0000510624 00000 n 0000227180 00000 n 0000133345 00000 n 0000141891 00000 n 0000510714 00000 n 0000510950 00000 n 0000511254 00000 n 0000511543 00000 n 0000511976 00000 n 0000512332 00000 n 0000512709 00000 n 0000512933 00000 n 0000513001 00000 n 0000227364 00000 n 0000141914 00000 n 0000145433 00000 n 0000513089 00000 n 0000513381 00000 n 0000513580 00000 n 0000513841 00000 n 0000514102 00000 n 0000514328 00000 n 0000514561 00000 n 0000514759 00000 n 0000514995 00000 n 0000515247 00000 n 0000515492 00000 n 0000515748 00000 n 0000516023 00000 n 0000516258 00000 n 0000516546 00000 n 0000516843 00000 n 0000517086 00000 n 0000517306 00000 n 0000517538 00000 n 0000517754 00000 n 0000518022 00000 n 0000518285 00000 n 0000518518 00000 n 0000518765 00000 n 0000519001 00000 n 0000519247 00000 n 0000519497 00000 n 0000519761 00000 n 0000520001 00000 n 0000520234 00000 n 0000520522 00000 n 0000227522 00000 n 0000145456 00000 n 0000149241 00000 n 0000694558 00000 n 0000520597 00000 n 0000520865 00000 n 0000521089 00000 n 0000521355 00000 n 0000521609 00000 n 0000521880 00000 n 0000227680 00000 n 0000149264 00000 n 0000152798 00000 n 0000521970 00000 n 0000227838 00000 n 0000152821 00000 n 0000165976 00000 n 0000522045 00000 n 0000522478 00000 n 0000522834 00000 n 0000523211 00000 n 0000523475 00000 n 0000523753 00000 n 0000524031 00000 n 0000524330 00000 n 0000524631 00000 n 0000524820 00000 n 0000524888 00000 n 0000228022 00000 n 0000166000 00000 n 0000169691 00000 n 0000727437 00000 n 0000524976 00000 n 0000525230 00000 n 0000228180 00000 n 0000169714 00000 n 0000172748 00000 n 0000525320 00000 n 0000525566 00000 n 0000525875 00000 n 0000526167 00000 n 0000526473 00000 n 0000526792 00000 n 0000527079 00000 n 0000527396 00000 n 0000527666 00000 n 0000527906 00000 n 0000528197 00000 n 0000528427 00000 n 0000528732 00000 n 0000528986 00000 n 0000529200 00000 n 0000529472 00000 n 0000529769 00000 n 0000530031 00000 n 0000530276 00000 n 0000530540 00000 n 0000530739 00000 n 0000530985 00000 n 0000531167 00000 n 0000531469 00000 n 0000531734 00000 n 0000531989 00000 n 0000532158 00000 n 0000532426 00000 n 0000228338 00000 n 0000172771 00000 n 0000178733 00000 n 0000532501 00000 n 0000532742 00000 n 0000532990 00000 n 0000533423 00000 n 0000533779 00000 n 0000534156 00000 n 0000534401 00000 n 0000534622 00000 n 0000534898 00000 n 0000535162 00000 n 0000535426 00000 n 0000535494 00000 n 0000228522 00000 n 0000178756 00000 n 0000187802 00000 n 0000535582 00000 n 0000536015 00000 n 0000536371 00000 n 0000536748 00000 n 0000537181 00000 n 0000537537 00000 n 0000537914 00000 n 0000538027 00000 n 0000228706 00000 n 0000187825 00000 n 0000189794 00000 n 0000538105 00000 n 0000538505 00000 n 0000538774 00000 n 0000539041 00000 n 0000539369 00000 n 0000539682 00000 n 0000539999 00000 n 0000540262 00000 n 0000540524 00000 n 0000540808 00000 n 0000541086 00000 n 0000541389 00000 n 0000541657 00000 n 0000541911 00000 n 0000542088 00000 n 0000542369 00000 n 0000228864 00000 n 0000189817 00000 n 0000192602 00000 n 0000542444 00000 n 0000542625 00000 n 0000542825 00000 n 0000543068 00000 n 0000229022 00000 n 0000192625 00000 n 0000196626 00000 n 0000543143 00000 n 0000543357 00000 n 0000543591 00000 n 0000543830 00000 n 0000544016 00000 n 0000544316 00000 n 0000544566 00000 n 0000544782 00000 n 0000545062 00000 n 0000545344 00000 n 0000690410 00000 n 0000545605 00000 n 0000545940 00000 n 0000546182 00000 n 0000546448 00000 n 0000546681 00000 n 0000546915 00000 n 0000547101 00000 n 0000547373 00000 n 0000547605 00000 n 0000547845 00000 n 0000548115 00000 n 0000548374 00000 n 0000548625 00000 n 0000548837 00000 n 0000549086 00000 n 0000549307 00000 n 0000549676 00000 n 0000549940 00000 n 0000550238 00000 n 0000550462 00000 n 0000550706 00000 n 0000550926 00000 n 0000551169 00000 n 0000551375 00000 n 0000551652 00000 n 0000551932 00000 n 0000552209 00000 n 0000552427 00000 n 0000229180 00000 n 0000196649 00000 n 0000198560 00000 n 0000552526 00000 n 0000229338 00000 n 0000198583 00000 n 0000201088 00000 n 0000552601 00000 n 0000553020 00000 n 0000553352 00000 n 0000553635 00000 n 0000553721 00000 n 0000229496 00000 n 0000201111 00000 n 0000202434 00000 n 0000553988 00000 n 0000554224 00000 n 0000554310 00000 n 0000229654 00000 n 0000202457 00000 n 0000204613 00000 n 0000554727 00000 n 0000555032 00000 n 0000555439 00000 n 0000555843 00000 n 0000556220 00000 n 0000556483 00000 n 0000556827 00000 n 0000557288 00000 n 0000557565 00000 n 0000558009 00000 n 0000558364 00000 n 0000558755 00000 n 0000559115 00000 n 0000559351 00000 n 0000559630 00000 n 0000559927 00000 n 0000560190 00000 n 0000560453 00000 n 0000560701 00000 n 0000560920 00000 n 0000561154 00000 n 0000561422 00000 n 0000561709 00000 n 0000561978 00000 n 0000562160 00000 n 0000562397 00000 n 0000562675 00000 n 0000562922 00000 n 0000563152 00000 n 0000563416 00000 n 0000563616 00000 n 0000563856 00000 n 0000564102 00000 n 0000564284 00000 n 0000564542 00000 n 0000564784 00000 n 0000565006 00000 n 0000565223 00000 n 0000565479 00000 n 0000565715 00000 n 0000565976 00000 n 0000566214 00000 n 0000566463 00000 n 0000566698 00000 n 0000566953 00000 n 0000567195 00000 n 0000567412 00000 n 0000567656 00000 n 0000567903 00000 n 0000568171 00000 n 0000568422 00000 n 0000568643 00000 n 0000568859 00000 n 0000569125 00000 n 0000569358 00000 n 0000569630 00000 n 0000569922 00000 n 0000570181 00000 n 0000570415 00000 n 0000570637 00000 n 0000570907 00000 n 0000571143 00000 n 0000571393 00000 n 0000571693 00000 n 0000571935 00000 n 0000572162 00000 n 0000572451 00000 n 0000572698 00000 n 0000572897 00000 n 0000573138 00000 n 0000573356 00000 n 0000573662 00000 n 0000573926 00000 n 0000574141 00000 n 0000574453 00000 n 0000574716 00000 n 0000574965 00000 n 0000575177 00000 n 0000575438 00000 n 0000575607 00000 n 0000575922 00000 n 0000576094 00000 n 0000576344 00000 n 0000576642 00000 n 0000576863 00000 n 0000577100 00000 n 0000577329 00000 n 0000577590 00000 n 0000577835 00000 n 0000578116 00000 n 0000578387 00000 n 0000578626 00000 n 0000578897 00000 n 0000579161 00000 n 0000579399 00000 n 0000579663 00000 n 0000579931 00000 n 0000580131 00000 n 0000580401 00000 n 0000580617 00000 n 0000580867 00000 n 0000581114 00000 n 0000581346 00000 n 0000581515 00000 n 0000581844 00000 n 0000582087 00000 n 0000582301 00000 n 0000582563 00000 n 0000582783 00000 n 0000583068 00000 n 0000583264 00000 n 0000583484 00000 n 0000583724 00000 n 0000583969 00000 n 0000584234 00000 n 0000584484 00000 n 0000584732 00000 n 0000584977 00000 n 0000585274 00000 n 0000585515 00000 n 0000585795 00000 n 0000586042 00000 n 0000586304 00000 n 0000586564 00000 n 0000586815 00000 n 0000686267 00000 n 0000587070 00000 n 0000587372 00000 n 0000587613 00000 n 0000587874 00000 n 0000588121 00000 n 0000588353 00000 n 0000588656 00000 n 0000588888 00000 n 0000589151 00000 n 0000589391 00000 n 0000589637 00000 n 0000589870 00000 n 0000590135 00000 n 0000590406 00000 n 0000590483 00000 n 0000229812 00000 n 0000204636 00000 n 0000207740 00000 n 0000590751 00000 n 0000590969 00000 n 0000591188 00000 n 0000591443 00000 n 0000591702 00000 n 0000591971 00000 n 0000592172 00000 n 0000592429 00000 n 0000592725 00000 n 0000593005 00000 n 0000593218 00000 n 0000593515 00000 n 0000593792 00000 n 0000594075 00000 n 0000594314 00000 n 0000594588 00000 n 0000594852 00000 n 0000595124 00000 n 0000595421 00000 n 0000595667 00000 n 0000595900 00000 n 0000596161 00000 n 0000596440 00000 n 0000596734 00000 n 0000597031 00000 n 0000597322 00000 n 0000597528 00000 n 0000597812 00000 n 0000598033 00000 n 0000598333 00000 n 0000598613 00000 n 0000598799 00000 n 0000599063 00000 n 0000599355 00000 n 0000599651 00000 n 0000599891 00000 n 0000600127 00000 n 0000600372 00000 n 0000600657 00000 n 0000600901 00000 n 0000601175 00000 n 0000601465 00000 n 0000601740 00000 n 0000602005 00000 n 0000602269 00000 n 0000602442 00000 n 0000602700 00000 n 0000602996 00000 n 0000603249 00000 n 0000603493 00000 n 0000603749 00000 n 0000604009 00000 n 0000604293 00000 n 0000604533 00000 n 0000229970 00000 n 0000207763 00000 n 0000208718 00000 n 0000604599 00000 n 0000604826 00000 n 0000605087 00000 n 0000605422 00000 n 0000605488 00000 n 0000230128 00000 n 0000208740 00000 n 0000211337 00000 n 0000605853 00000 n 0000606224 00000 n 0000606631 00000 n 0000606934 00000 n 0000607316 00000 n 0000607585 00000 n 0000607917 00000 n 0000608255 00000 n 0000608574 00000 n 0000608878 00000 n 0000609271 00000 n 0000609732 00000 n 0000610042 00000 n 0000610384 00000 n 0000610810 00000 n 0000611173 00000 n 0000611529 00000 n 0000611843 00000 n 0000612164 00000 n 0000612505 00000 n 0000612756 00000 n 0000613047 00000 n 0000613311 00000 n 0000613568 00000 n 0000613805 00000 n 0000614043 00000 n 0000614286 00000 n 0000614574 00000 n 0000614863 00000 n 0000615130 00000 n 0000615388 00000 n 0000615645 00000 n 0000615921 00000 n 0000616231 00000 n 0000616424 00000 n 0000616668 00000 n 0000617015 00000 n 0000617302 00000 n 0000617613 00000 n 0000617883 00000 n 0000618129 00000 n 0000618435 00000 n 0000618699 00000 n 0000618991 00000 n 0000619296 00000 n 0000619530 00000 n 0000619793 00000 n 0000620034 00000 n 0000620363 00000 n 0000620734 00000 n 0000620967 00000 n 0000621250 00000 n 0000621530 00000 n 0000621798 00000 n 0000622036 00000 n 0000622288 00000 n 0000622559 00000 n 0000622734 00000 n 0000623009 00000 n 0000623245 00000 n 0000623528 00000 n 0000623751 00000 n 0000623968 00000 n 0000624222 00000 n 0000624486 00000 n 0000624818 00000 n 0000625102 00000 n 0000625355 00000 n 0000625661 00000 n 0000625740 00000 n 0000230286 00000 n 0000211360 00000 n 0000214310 00000 n 0000626023 00000 n 0000626266 00000 n 0000626474 00000 n 0000626683 00000 n 0000626864 00000 n 0000627114 00000 n 0000627355 00000 n 0000627555 00000 n 0000627803 00000 n 0000628026 00000 n 0000628279 00000 n 0000628554 00000 n 0000628802 00000 n 0000629016 00000 n 0000629257 00000 n 0000629531 00000 n 0000629787 00000 n 0000630039 00000 n 0000630267 00000 n 0000630485 00000 n 0000630734 00000 n 0000631011 00000 n 0000631269 00000 n 0000683582 00000 n 0000631534 00000 n 0000631788 00000 n 0000632054 00000 n 0000632372 00000 n 0000632626 00000 n 0000632919 00000 n 0000633260 00000 n 0000633573 00000 n 0000633841 00000 n 0000634107 00000 n 0000634383 00000 n 0000634686 00000 n 0000634861 00000 n 0000635050 00000 n 0000635249 00000 n 0000635421 00000 n 0000635669 00000 n 0000635930 00000 n 0000636228 00000 n 0000636500 00000 n 0000636751 00000 n 0000230444 00000 n 0000214333 00000 n 0000217769 00000 n 0000636841 00000 n 0000637095 00000 n 0000637359 00000 n 0000637578 00000 n 0000637824 00000 n 0000638100 00000 n 0000638374 00000 n 0000638591 00000 n 0000638811 00000 n 0000639083 00000 n 0000639291 00000 n 0000639577 00000 n 0000639754 00000 n 0000640009 00000 n 0000640273 00000 n 0000640517 00000 n 0000640795 00000 n 0000641110 00000 n 0000641373 00000 n 0000641643 00000 n 0000641989 00000 n 0000642306 00000 n 0000642583 00000 n 0000642900 00000 n 0000643280 00000 n 0000643559 00000 n 0000643759 00000 n 0000644009 00000 n 0000644224 00000 n 0000644472 00000 n 0000644704 00000 n 0000644914 00000 n 0000645140 00000 n 0000645377 00000 n 0000645657 00000 n 0000645892 00000 n 0000646144 00000 n 0000646402 00000 n 0000646634 00000 n 0000646884 00000 n 0000647108 00000 n 0000647317 00000 n 0000647540 00000 n 0000647795 00000 n 0000648074 00000 n 0000648327 00000 n 0000648555 00000 n 0000648792 00000 n 0000649040 00000 n 0000649312 00000 n 0000649558 00000 n 0000649797 00000 n 0000650028 00000 n 0000650255 00000 n 0000650491 00000 n 0000650714 00000 n 0000650953 00000 n 0000651203 00000 n 0000651435 00000 n 0000651604 00000 n 0000651786 00000 n 0000230602 00000 n 0000217792 00000 n 0000220805 00000 n 0000651876 00000 n 0000652095 00000 n 0000652309 00000 n 0000652552 00000 n 0000652786 00000 n 0000653025 00000 n 0000653211 00000 n 0000653461 00000 n 0000653633 00000 n 0000653855 00000 n 0000654039 00000 n 0000654273 00000 n 0000654593 00000 n 0000654845 00000 n 0000655092 00000 n 0000655362 00000 n 0000656251 00000 n 0000656959 00000 n 0000657514 00000 n 0000658920 00000 n 0000660665 00000 n 0000683558 00000 n 0000695738 00000 n 0000726255 00000 n 0000727362 00000 n 0000728617 00000 n 0000729863 00000 n 0000731022 00000 n 0000734086 00000 n 0000736385 00000 n 0000738469 00000 n 0000739735 00000 n 0000740868 00000 n trailer << /Size 1963 /Root 1 0 R /Info 2 0 R >> startxref 742217 %%EOF Paje-1.98/Tracers/JRastro/help/JRastro_manual.pdf0000664000175000017500000021474711674062007021627 0ustar schnorrschnorr%PDF-1.3 %쏢 6 0 obj <> stream xZˎMH60]ëȲˎ,g4I6 N7GMnKȇ/y.9鱢@d==soFdwxs/^o=VK1KiPT#^|j/CFa]/>Yv d0ai}V0Hje“!^Fč{}$b9zPuanM34ͦWXS"bdMͰ"k޹dque\4H #;_]Uþ‹raw %%2 It';RUƽGfUk7.ƒ8PdJuCwtDYrлi㚯uӆsXi|p8 0W<@:kЬ+ff4. v{t18gr.{q^U9oyQH7(Rt}wq$qZlMH7Oq%٩5þV&A{AZ$8.v|*$x՛O*J̇ǡke:[!(3sqed.D>SfE(N/_΂,i/vХ&GvϏ:nR,PT]6gHLEG X.eG޾} Gf`K\)|bѵmĨ]woMWչrgr*;˃}2(]WW Rtfr Tnl+MS2u2m=pFnDs(P0Un@$*D1 ϼ/,eޮ x\"\/t0ra ztRAufU~Q{vG~}wD/A)F]'Ua8@2~3Ǫ<L;h8h"PY$,0 M? _Ӣ>?ҍeMYl0s!OnSp7,O c׳>endstream endobj 7 0 obj 3093 endobj 44 0 obj <> stream x[n & p]*^H˰aE``4gT b ! ,yU$),_Uu{fVWdV?fFܵb={~yvQ%.>/UgՕҳwgTrO\.>Ǿ[u4 {J3K)efAy]3nIř1f6/5[{53B*#3sU9SYi{fOVv. B4NͰs:]8MEjލaiqKCQ vvw Q<^ozwJ Z7Etx_6.+hjFR"!Na]ﺕ$3= QYSpy}> 6h $0Ͱo@փڔ d +@ 8|:1^W ^mc؇d{TB~o#mfnJQњǻ6YK\a4LY7!Oq5~HUK q  &(O|CpxnrkEJKZm׻U"Q 01P?WJRL}֕8uL"( |aQ0">8MU)ooUmŶW6Zg5Y49~Wauz>80D-.ln; Y×LH&`;^sx?D—5~ltE7ݫKWË[Cb , ^z GN bp-I(*CBɈ&5ID~8L/*En|LC";`i8Zj9.)[W =}O1Un@ 4ͳ0/2JdEwf[K49prs;LJUۮU(ݜc/o$k`㹁m@aNXV~bg+fRdYtX8 +yK !|!EX!;!9(Knf z!C1IS{d>չHu%X:ݎEV<ʎGVV0u\D1f,et>iJ5GOH]PSқ'V]DhUvqЄhP-EZ`4LH-R9I }qRXB}/cɊӱQ;~#ؽ, =1#K%q؏/h)>2\61͕4_aLX;@NnR!X2=Y9^@*rze~݆* KEiMB !`j1nO!h*M9Ɛ5Buլ޺;&{W_BԈh*(v*,u|0rR{ڃcVy)6γPQ# } P)S")>@$ 20i0"];Afj 8ey-d,`M= 5:U8C2o"U@>P<.jޢÕp1CJAZ(&|qL8?TJJ̽l5F'EKq|H !,3@V`]c淁zUƒLEáY_uI`vXS:Gz8B`JN7?}gӫgN*|s@1l#t]a/VUdaH8>%vùVWIpbQ J8Ls5%㨧q bc9f,#ic֫n_Vb}'T}qB''6$\+ɄZ(u(f+" xa#TpВLxHjbH9u_drKpJ ߼%I&rB ^Q',-p|}pm"I% z'K~0GvaBc?q.m Di33RH,]Ď٣eDlJ@e]oQ:3cisi %h]E:SԆ̭ y,Sȭ3GCRM d`In8"5=ΏȠvݻV dYR T0FEFOv[{k}T± *fhU$CGNŘSymQ]}%>> hmD:MA5gʢc.b ZU'd' ]Y?^iי"v>n}h|fg6':W/)jSH:ИIWOf5ƿ݈X`TX/B4{ uˏ'Z ԓPfs/mNF84n#藶 s|d$2_0AѰ7^\~v3sQ[, WϠh{p>{}h.9#g<5ٟ^tߙ>8dFVcv9ܝnz~H0nHRna6-܈~{8 '%#υ2t9zq|L;lw0@`5g4MQO@u_Y$D%5CIn?&ާdDّΠm6f +dђgNk8z((_`ù"`jx̥!$tc’?^TVz{k#؆`ƻ=g#Ƶ&nNgPF|!:Q5tJ3#idY*iđ%13m7Vk=h)zX_PY [&sy \5D:{HC/)RQhCQ -P Qb896M*  qU*ɬG82xbVS68IX}X]qɷ _LYᣝm Z&~"5aH [c*?ڒendstream endobj 45 0 obj 3630 endobj 60 0 obj <> stream xZr7#osLVrdٖ+Jֹkbr>Idymp(r-UeƧ#R`WOOkc*.ngo)B^2 ? B1.nWoΨr;no~kaJ[1"[!IC=O:íhD5cf7oDH?iaEH7n-#Gx>#\p.@̓L"{fcBǫͺ(/ ÒGtrwr$Ntb<?DRx[w†=rx؆0K%-`%I -H"$@|(JQ$$H6QGmjMf՜C9 /@okZr\ ͥ9ʺmX(6ܬLG) &l~u\"ew x޺-7A "^*O!TM]UvvhDziUxD Bydˇ^xFX$gHʯT3@Qpu7r;oz?PdhdaOIi@i4 'zG9~kx#yl7ze"*n' H'cw6-q^S pVOm: 3*gA8 u!㴋M׳뛢kOr\_fWlי@?$.~\7U s$y`B(E6$p,9ëkL.SA@%k%|(_O}]@2EfTЬAFW^ dpϿvUB,[Mfwe]vWG8޸2ݯSom_/3ay$f$5^y.6Y-[A!1]U98V仮\OYÃR<)DEiqy@}PUR'k}ΫIk,-= ]/rgy'y dž!œ!vJ%d9 0'*@YTiqcqVҐ7}Ap*蟗`q F# ){]dzr qK )6 bD^s vHb18e:אV6I(pj%)"$ ^R/m{g?)؋$QDr C.H͔?#p@< 2!LgeFEC!e`^4`h1Plr6 x,吝$A2Q(UY @)b>kRMTo4+&0E,Fs m REod.Y)dB~*3*0MMݡؽ %ki&"=t2MX=$"i7$T컬™9OP(' qF@2<.w!i><_)hxaޛ9QQLPL1~"G9WYnU7 7*΢tPt NSsFQJܓhhk0$9d0LeԐmO)09isB8F @vmp,`b~o`!omgџk? O8Dt~tvqyM  ~u_Lm|{>Suvmh뜡a 0v0/H-ǹ 5LTժl7S'"9cU̡}%Dda !Vi@ٻ/.Oӻ7m.ۮ*'q+.l;GO qVaaa@Z>.'FG_Eendstream endobj 61 0 obj 2441 endobj 5 0 obj <> /Contents 6 0 R >> endobj 43 0 obj <> /Contents 44 0 R >> endobj 59 0 obj <> /Contents 60 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R 43 0 R 59 0 R ] /Count 3 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 58 0 obj <> endobj 62 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <>stream xeS]L[ur3XѱJɰe!sdf0 Bkk{C?. )m'@J["N$eq=l_߃];;88.66HZZ4<(.d+1Nb_AvR8"Cq7ZgZ6Q'$9bE (_:4*u<)5zFԙަJٚTJ2j#%S(eu2:OkhѷQ'Jsܼ _Akf#UtTH+YKC8a)z *;I01v#Fl/2lI!>;aߌB9L%V.@! FEoݿ+́,~t\ҮD̪2 zRWթ./~EέGfbY !Y`q 0h0Ͽ=_|26a0;kXEWWLsT.EE>T^YެDy678֓̌53+x= ؁ux0nj?VXP")bjtC̐Ќ a Ā3{;߯6k5kL`0>:sMvq@ލp g]ṔFqhW[;P3!a.79OtJ_!6x5#n3pP="[ IJw;q flP|eū8\`%RM*W͓6ȋz+ ٻM#Kqu˕"ke:Aqx/!ŃPB6x'@x>dZVpikEg cӫaN]q{q(jU٪Alf.Qws4q9y!lWg$=go Q---xQ t.y_vD ]~+`@%2=-2,ۭ;hE$/xC0-5> endobj 8 0 obj <>stream xe{PSW%&R$slkt:BѶHH RGD"IB,DU]ujn3Nᏽٝ9{|Hb] AdzIcU޶m/g%[H!3EwULYs:܈@|!!@$8ʪZVDz%'//-sam6K&b>&49-U6VuɴbI_>o0,*cھ=gxn䟅FE⇥1YX0lTs oE9hu f˕LA}'Q6'L3&zyXsWQ7ˆ 믣"b%%ڕ4n]y6QB54!58%ŏ?)-\f||;jMu[CrDψ\ѡ)cFɩ:X3dtNx˼_4^h|KVM6R,y6J땉o?` Cw CW`7\Q(n&'D]8Hqoߩ6j 1 Ş%Oa鞣ϕE3ȅ3wi`C1Kb/WsTXl7h~UxKksW]m196FQp՟7{0Gt;l܀-`RܙTQND z]}0YW {cIWW_-lxkK.\7TTߔje , ĮO$6l@_Ŀ+ 7 endstream endobj 64 0 obj 1598 endobj 21 0 obj <> endobj 20 0 obj <>stream xcd`ab`dd v 44f!C9_ȯ?g.)R wfFF7hʢ gMCKKsԢ<Ē 'G!8?93RO1'G!X!(8,5bs~nAiIjo~JjQSZ:C C3Ѝ L S~t[#mU1_h̝h =95w׫E8wf.̯-(ihijl=K~[ǃnuQ݁ݙӶi^1}rݍ=6v4۽{}Sz/MkmPe,ۢG׆oHX=%b㭶 qS;38~ mypSon|ݥE%Ům]ݭ Srw^v^|eNsL3܄>9J_[`fr\,y87a`0ӌ endstream endobj 65 0 obj 489 endobj 18 0 obj <> endobj 17 0 obj <>stream xmX TS׺>i$8S muBWhN82"J $$!gJygDCũVSnmmk_ۇk}}kX9{gi,u/7=˼#Ţ^RqDz["klwovoǁFlۤ2yldxDR/-[oV:㉓(.2\O(Z*$;mcVGGGw "BBCEm!Ѣ(ё24i8;^|iX+]) D˝B$NĢ'qHM+wZ)c qN/_% O'Y.9OM& #.+>`BORtd7[eʏV9^cp0'XIxۉwObXMG$vKob7!C!'ŸGl%~b1xxp$f|&BbK#T%RtBO|䐘FWY Y^ x&ۋ3m4yv2~K^V+fL1cbf̖Ygݛb?^l9'ns5w|y^\WRP=Kfu"UR-wjg)$,+{PHYqg2yGoVvjʃvvrkL2;9V;{: ,sϟ 'rm!$beQgRJa! &Pyjh]n!VZTRHNٖъ;H]^1%5 @4Wp}h%`e˺O.A ;Grn `)=:x-"[cqynɜ;%ZFMm'a}vUklWmN}h46EG&TyWӍVu=ɯH(mI98%BHΘ] | مExXRR+釘]b9\E(@8L(+VS`Zl7/Rݜ_ºmsM@ q> :T<ܙy %mc m\U7UghjO Ļ `Z7!\̷UX9>Kkc{Ơ9VFaB^~?=7b=j1!g M'[rAe0R%\Y.LAǡ"2cc&92i*75Lhԛb?)`($]T(M1֤Tӫ5pX@5wy&zNNd_^*ojinrUW'vѲ~H(}p҅ɌhE(,( B$"Z~A4zQ0(rWk!A<;ڂ#j8VSʴz}}=UxSx \HFŔ{0aqW*sx¤epkF? FeBSIfTYBtШ!w=SYeJ8LBr)ݽ卍A; {21;-,:&)B%-ˢdfk3K]T/*b>T;) W=Fw,瘧thtcu%0LZY߿@bӈ6q c}}y,p-:QX7z3A`lDަmn>42;R cUoy>A{u'a׹\GIvJt>N#[cףxI08bd.$3M*c1 wAKQYfIv TQڥ$k5h$.R,2s3֔ 7Baqy~q/b^mkd \S.JT!Gv`Vc! RKEHf)Dvvsow|?Z}FPf(ו  3u ]GpL_T[W]USScfjlmx>EQ}<}(PKB~`.CU_ :#-15N%MK*B1(, B=dI^=g)h63R/:GBG6m˻IѼӝVrߦo| R9fٸU8?*E V@],,::lDCRyBW_ޖ˷5J%D*HMMЧI*G逼Pf62Y?,&[\zG#`W1D_޵Bh1W 9N<= e`pʜ,ƈVf2& !6r<>B)KB$@ D0 `5/\e\P!2^y2!g&tOHj!cyJc$zOO|dTNe(dfRx@Fϼ JVLne(e|M `8-D8UNF}!r|^CќM?.$;uFlA{] o>yywN4tM節N8>toh\t,j~8|'3PV8"}z𑘃]堈ɷQW-޵Kp=Ue0<\ (iO#YI{~II"rs..v9JX%~ ׄ ?x١Y_>9g/ûW=G?5# &֚-r}0xHeV/*ṣ+6@Az3txhܻZD!Uh:kËqn^Nxy .I$eiҤqap6E3ϗ_nVT՗6:A`DKc[|rޠ}M7Xq#8Xvm@0g622!DyPIƍç0X9~QfS(bxO^EN' EÈThOb3ԦeZ\.KW?^> endobj 14 0 obj <>stream xe}XmJ'1MR۩-ݪ̢ȋABH IHH@ywyUQ|áh]۵Y~O?}s9\CX,DI8$A^ y_װ|}V+4EqR!)!;y5""BF-*euF%"2RXKT+srD9^dT/)J J!eAXh!)+)7 $\LX((戼 $"`KD_8IAvIi8y` A$. vy((/!F)_l$D4"O v1~b[bDCl!b;N,'V2%*fli7_}[r3Fb)O@%JZ-vzi|\O]Ł#@\ԁcZh:;`[E]Y5qQi U8 6 iYl e<˃xMǂ}(C\Ah'ҍOGZt|kMޮ;μvTO͔?{go=9v_6CzM#Ǩ!2?|Q8m^᪩%C'VY^GF~ oxFF:fY8(εx=3|5:m%;x<ѕûW$Uae&۰ >cilrID-gʭzY+Y,.~64o֡GC6+r`%*ǁ.ҀҤT[4\C x=zŝDރh0@ho`p:He ::g6UĬ#:ͰR .YWgǺyvUQj{ѩN2u DQhK} ~ QzN/z-& WT޾ξ^eԅJjA}P8G\yDӕ1ɗ+:sm0 f+˓j0FNG~7EsEM *X 8?fl} $g;zvvmӎ!@ԗw~,}xv^8 /Kcf&a|gak<8Nz4?:1O:ϣnpij]Pe* u D6TwY=&7;ԕ@/ˌGڠ=v:[Z5uҌ'C.m#і'ly9{ qٛ.43ڱ|_.,?sy+%]kc}xzlV!_/;Pb˻-[v}r>׬= endstream endobj 67 0 obj 2392 endobj 30 0 obj <> endobj 29 0 obj <>stream xeiXSgoZjMo$.`,mՊ chR*K@ @v!HXVآRԶڎTmLsˇә>z~ S(@nܲo>h5jayk`>7WyN ߾-X9YͤAIЪbRd;C/d6ETI2oE$'F'jU,VE(Jײ=ٻ**9YZl@UbdNS$ ޗD+U?@QԼL2`fUjVm=jXqvP7TzIGyS j7C^BU@mVS,5SF*RS)uI\ LO94Gȩ?Dw腴>3Vp4< /A7J` у<YG#ڙJ 1h#ɻ1,U1?hgy ~;~$0fL! lLH|O]W\2cQ)Smc[>^A<'[9̼ws|T&옠ǧX*/v]9 &9uyu|b9H%C>T9VA0 Ϝތ@cQ;wqe5t~BAF>!,ް$ŢI16}daRČWɭ_ a*D 'Y" 쳟4|~&T͎65ʹ΃7lj˹Mڕ'LrjڽQx$A\/1a"ۙ3VFdxϻ_F֡ҒOY\i4sS1ڣ_uvrnÎp2_8IߝU,.&lBoI-?rM纞^ gaFS9܁Օe(q ե|@:[|ی|6lvFQ_4$YK$7Wݸo.yu̻־~ũy1Z 5^Թ]7'C@H/%kT3ˌ}`9Tg2 $Ź8t{A’%qH &b-}\wX5[<};7^4ΈpHN;q&HCib1Y1ڞ0 "_YOjlB+c U mT!q0gmV?Al OKV ^Lava⼲J$VŧT]5`~ŏҿ&vhqR& ݬ8H/b's0u-\Gr;0z|e[){4|9;m Kral0 ^͎DZvk>?#BK-=^Ԙ$_fxߒ D bsQkV:> _=[TFaW͌{iQۂQ0lqm]ZtV{hrI7-X¥.T̯ǑQi*PF*3qF܋6sqqUwv?Xתƪ +36Dc8L|>WQd _Pbt%b(nШ=-kV XNnJ'9EGtt> t QG`Yx7קDX/#9Wr0+0dflrRd':\b/+= 396|9Y`uugos; !wŗWk;$k/ mix#" zL x>QKc}2~c-sToE%-? 8jx<:s.~ 9q7ۍ;V򋖹_b Mhh.7K-؂TʘxUtdGI[N_~F  .O']peHd.f4Y74U/j _ tHfopWټE#TcB#&"U_[+Z:ݣmɁ ?-F79gC^:c {4~DB.4D}{S_HdLx:"Pi[ENY%p"& /zl޲JPj)28f{; 7Ɔ*>T/[Λ\ ,y-g Yu=J"EW@ȐWI4 0$r-OK_nNlbI%25euJ'Ye#7,+˴{j<p<bYo,S/t_w=~]B;'Q*T bgz}{ErJ|y lQ~lɨŽ(dNrfP!qKgRS9ъxd5djgO`- gz{f}T\=|򜇁- &}a ʫKkDZ#9ٱ95)²"'j`Cb(vKq6@61d3^\: endstream endobj 68 0 obj 2863 endobj 27 0 obj <> endobj 26 0 obj <>stream xeW tSպNMEȍ$9ũNW s vLi6MN$;)is)@x}Eֽ}\wuY+笓}f2`2ڶoޤ-R D%JyQ3ӨgY;toocBV́?Άݳ $dVt+KrrKLEfի2%.^$)E"Iuh#KrqYY]bQ~܆MւR`(MrZ6fYQ!x]* fwN?:bS3 4oKlDhr=8J]r/16B-E; jE^Fxudk^] ƾL}M)kN^{x.QI{Ϗ;u?22~ <ٍL ʄ,mZ`:vixwn.m Us%A9PL=|à<0)5:^?vο_ǵ{JPIBᣟ 7 ^`I[|ybn[[Ѡ PϤ5B-5p\@C?K%/I ՚4:s@Ԅ&u`p>\ ߆߼?$N?6!c+,pb6-=qx7d ݽpnr©$ 3z-ƂA&o]@('gu:V\u|-,hKHW <͉\҅p۱3q+Z}Ρlr'ټQc\=}kѫbl_JPg vBdpKˏNDzà=;dscQ *E@pپvHNȞP.(>(OM>RIF-$,T[P}#ۗ1&1챺' 2xcc9u=7Ϟ;!GXGlXAdcB:"(5_YFmᑎ^& Z8hm,N=YM[GgKS3Qd&ewܸpKKrinWo.U»l2f: D=Cn(uKũ&d]Rb,Ji^SY8eg,ف۪CQNW"KJqP, l$a6=>tUЇu)GSG5nM4+~8oϙc30 ܜzΈP~EHrFrPޕZ٫8_s;'XB9M5FlᆬJ)4nDȘh*AZ V=Fsd1u9ndkg]Eۼ4t7c <`Qh{ SMTMU2C=wJfRI-n{p?DRQd΍3CaKgx(2 eԂ "fہ+Jzkߑ0ࡦOݕ6C @@Kr8> ~T Jh@ZNz.z>_iṳ`)(yC@{MktV zcO xz-4J92foYvmwE@6Dq٩&9!YpOWj=En@EeiVQ5\>}맏үӚOlK jǻ ި 6RO:bisy=1YVl5g1ND\߄No\;/Biܫ1m4`k9kӞmx(YhRcTx'$PB/Yx&e,zW&U!ը_fiw:ݸkw7Py9!/*ۧ ob2v4Z,,OTN+։!7&+)(:T\v{#;\|Wn!,b$UBv/ᎦQdM:fXpj:$8 5MkKؑ"e6¯a&>]VmA'XYÃav;O4g`0q endstream endobj 69 0 obj 4129 endobj 24 0 obj <> endobj 23 0 obj <>stream xyiXSwmJM&jZbu* "(31I´ <ϢX:ڪժUOӖ}t+w\aa繟1ybf =kIP(:miX^y'f63y :(c9zכq`G^$X,Sc}<%VYoO|D&ȌNKDk}7II}c䒸4Ȩ(ϴȤDmI8wW}W._b)r Qt5todr^Qtl(2*ڳQ|zw/:;qT=5ѱI 7ʓޤG,޻%%fmiqHڙx=iRd.UtkK{{EJE'f:iK{-2bqGl%^'6b9$+Wb!D$ UīD0xXL$%DD&^#B=fSSӉlM( M !≗#a&v`a)ZV$^^ N.a?gOF_RT~_DOӟJ_nSO;md_|3fC>4-e~u{ytG܄hUR$r)dDt>(ݨSF1:T`+=t*ZF)=m,ah?*X{ĤAEuDQ]M֡| CRG,qsl"%T>A+56.`Q{GS.#fhl+-0Q3u2>tYh:r+V$QϤwBc *%CF]+Y @Ki m7N] 25G[s#W93k6 T B jU!ƹbtѰ:u葺BM"3(Eh`rꇈ Ó P0y6( Owa7=/f.\=56-w}z؄ R^ 5 [O Fwh42uKXnlTf=b*GbnrC)Qs Ԧܢ}3F! ,d9 D/|ψiԻŊZ+,`I6:[7nQ36fq:+seԣl lT<&[]mU')0$Kj5JqTiNg}N^y mA_s.%͉xȌ:(? 0UiOơUm)u HH]9r]pR!4ha|ZX[p6W^ 5f|">;H@U B)JS2DWJf*ѡkbV6741Gh%Hf ?;Y^G,A/#b23Y7qOfqB (tEwX8GqFAvVP%̩$75:tS֯H=!GdƩ|xBF^a6jxj.Z4yG/{ Whx_5«PpXd XAyMHxH }~GpԉhEU]8$.$q~4GKۖ ^:+p?'?,du `Xޕx.u)@σ}m҃٩#`TƵNG6=8IԜȺǞzj!!k 6k'X# v_pS~ VzМ T+#JqomrZˬOgş?&@@S~pHrfkp?K* x7Uyz43븜Ҩh4?\:pjHp/WnɡP뤂z+9&%u Y& $MZ؜y|Ds)g<ښC0 >찰%.ث~i򒻵کKuuWvE4, ODc k@7HI!ZcҖ4rkM\Ҭ!2Q `إ3& \a6x\+ʌ@׹*3#ӷ 48#VOƟz[ n& klALKIq'Z2#~{a 􀫇6 .J-堪ZZ`)0w A NZU >v@ۮ Xo4ZX~9ڠ * ޟ7Ogew& fqq(Zr-NOj<Sq䧝c-J6 !PƽɪfVTkU&1弖 簵d~~ @W-n(NN`m^JV$~D8$>Q#dgת/Y$-wP[q7jg~/`lj̭}K7O"Cq4Z/į8ѥ2AxJqI-kЫ. ߧ^c\dy<ޕmNGiG^I燦oFC#W?7E\.Cגz 2*@In9 :桅諍.S48TBOXƺSbŭ9m&m6袃 MYt\r􃑞3uYfB1kB+ĉ6zbX%ً_76جn\Yy ɕ5M͵5Mɘ[Ϊ3;pIwugُi5MjBXc1DpD( X;Nw;̱RuI&H9VB$gűkB =>}g}tn ^=WO b;Δ}Lٯ!f}5 /zh0Y`kQ eڿQNS­nj ?{ Pn}#Nssp-'sTW:J# 9*V:*c@9WTԩ<ӨzTȧݽ卍AU}''?ʂqN0Ӿh>9%"W kK S`}^Vjԩ*:Z^*NHK?'}+ [R p-cw<oi~pSkUwZQ5Z4#]҈eבuU놓l(ڠ֬6 &HSGVQY"\f;v)5!n7ϥ2!;o,5:2K %Փo χ/>^d0r pu×^fK~ 8Yw1yqqa6!x&m0EI aɇE{MEyEyųǩ#Zo:1K2%Krl}: 6P1M+YRyab2I UεkXdY-\[ n(ƣv(|&F?"ʌ7`a}Θb-[̟y*ų6n_3YVh/&ͦ&Tja/y"ZM1qpy}=W(qCBřfe]FQ>,-^%).()K B74&в h}T?qeA~ЁCױNԤٙw 1kwCQf[E2|^AA^<~Bg!N[F;U+a0ETRS&D'7^̊Y\{ |tQPڊHHҮCkݣtuOijm8Je-x..*HM<}|q ߍ\Գ*s`L"hΐW.J)q-.G--6vp7y {eϏu+ҬCBd`Jc*E)@/ ;)PdY,JK=VtXWiXB WbOb) J)+A//7@RY6H6kAW^p:nNQR?'{XW)/'|ypaក0 xrɮ3OCӐס]kLc3^|?cO2):1!!$Ϯ61yW%.ز;ֶN4yP[ṷqZ7!2{)<02f-\5"C Iҳ6^ _YWł$,0$1;{p(v|EOlLJ'^=h+Ω[|)Nld>okPl=X${ d>,=_-L]N&h |~NqϠ@*n^g:R#$֦p'4'>i3p[6z:b(M 79-Te|~>je~>#.z>7_vbN_<~*  f?K! ]EgsMCrq L%ޖ unsRmzw}@JXPtLc\Ko%?V;p5V/qa5u&8(5%)>5A$|VC* *ba"tdć$χ)Ap|؈+ؗvĆ>CDzxM̸Z  a"u^z: YqtԵF_ 섔x86b5[iI-- >;D31Gy?Sw&w?8:]~Iz#݉Ȋhs 8N}@;cc)=0\.Wf(?Se)+5BlDpjG ev\.o{XOqrUZ*֬.U& =<$ӳ٪Hw4w l-_{f$+[sx}jЏ.^lJ!چdz-wkɱJt)LE|fT,T%5kjsީ3 tƂ|:;M4i\Ȗ)o[ endstream endobj 70 0 obj 7090 endobj 36 0 obj <> endobj 35 0 obj <>stream xcd`ab`ddt rwv 4432 f!C9_ȯ?g.)VwcfFF7hʢ gMCKKsԢ<Ē 'G!8?93RO1'G!X!(8,5bs~nAiIjo~JjQC#?& bbddRqx3'oF3#%&_3>xEtOl&oz-b>s,GR# endstream endobj 71 0 obj 242 endobj 33 0 obj <> endobj 32 0 obj <>stream xW{\TG tݎ3L"GAI@DyElyCn1\6QИɆQ`6ɹݺ@oV:u|甄$㢨ąa9MM┻&h#f}x-=G&m<34;NDRPAXNnᦌݽ㗯 tO)HvB٢Rfov#333ֹgsONMU3#223rss{1cL獘U{tNvRtUf5IQf^ O[)=o+6\%*?3yIVw)iQ?AR4j2G-2*ANER3) jZL͢(*%lj*VSʏ¨Ġ#BQNF"MIb$7lBlٶ$ehrZ-#WnqSj?ͱc7la7L!Np+.lm M1 OMמ.CF )P]V^$/6&'cEU՚z:meڟFMMi/Tv#kxS3Wi͐**>ffqdGOǃx& JňlResz6TP¿JQ'VG"{x[pVDOn.9t7ת9YоP:.^n !$1B ;b0ƿ _M9o̚ovMs tqLP( -aw4c?2]q` ߿ySsz4LJs|A'Y&9ß@q prVԠuE,k L8CcbNVd+EgL-P@F}mV"[Q1#7$Tdv"E ӃC|{뾟 sv5\8˗5k:]~'pU_ܱk]q*Eɯ2n;0CfDz6@ k`!9D(1ž5?Lc)F@;H~d ߛ3:9\E* S(p5J.`2}k/n[ϧd hY~铀3HtKgz;vU\*NVG_S+b3#JN6sI6&qUC9,8nXlהȱU`qRY+B 2 S+lM?Y<Nľgo|~+sB$3 *t5 p5e%BE%t9T-7k `Bq)!5V֔W%lB3Ƿ!Dꖙ|Ff"ARBW[Mx1`sYC\Ӷ#ŘH̋j..g\?9Dƒ{9U'a;,3_{Dyȕ * 9U#B.TC[{I #Wh(+Gi~4PL}}φ{:8? m]Z!\ןH`9'c"|ؘ}=VtLӧ99ZraY&Dia9f"zRKZuml-ݙvk_}ߚyxPYUSY2[[ ydOݯ`91c^d@rcjfEu˲;MNJ6re Bv>@$+H"J8N3kyotm>yL)~Η$"]K;10T|vZZKyx{{q1a˱򽺪~\W^YRc܎WCCA+ /:%u8heINmd8> endobj 38 0 obj <>stream xWkTS׶ 46*xmj@D @B 1AH $!$\#@ "AQϞڗq[ms榋wm{Ͽ;2FFFk}s~\zZJ-R; TBmשMrjz*JPn*ZO-5,͋Yxf̚Q: ) x撙OVokf5c.Jus- ~&BEL<|j勼E TP,,+r2;t/"&I ho]jݪ#h3h̨i`!/w qBC4 (¼hꥥ F'dMƖnՃ1P*"F/]WފFojk2Y*`٤<A$ aO(8X)a/}W] ]`Fe9R8W6~ϋ{ Ǣ;0EG|| xpNeƗ,kZ}MN T}".Je&4j0 |*}İr& =JJF}c}Z VgIq BbAxCJh]+k˝)x%^R--X"&]d.k^S\uvLlYK"!T  <_#iGLH'f ݑ'-y=ܪDQ@xЏ d]>I`G>`Pe&P #M;ŋ3!/ v<ːtqFξ玼HySp:YM R}=]tR]c}=QOx{I)ܦզ QciF̸w+s!=;:eolF 1\r`cJgnQWC1C>t:л'G7D&"Y5Ώ aXq ᮏ^\چ0,in׻0qWMW.E5rGMc='+\Kw|v xo~o^_\ n ޯUjDdS_([-W0UzmOa4 KO$u^\L4Ղ4TUjѭǛWKgcW[jj/f7֌Ź2!r6s_3=>^i$½B^wT;9,Ȁ: ?f^$S mӅҎwuU cUyD U֙[N#WFa839ٮ\:$_ZR,cyMi'`!+b"2`ׄ6p%)4N q]/ez'{6Kln^UhrKdJ/?4ڥSD]3( N$T)<2i7&x۸ djN C6cI:ϣnkOV"g 8C YCZM4WRy^Q>h/W ;62¼+,m[8?Ad7xj |pn"=җ(VV_dmFQjm(*{;ƻ *l%j"εeȉ=#CjG=-2rT*0+>>مiwva/t :!ζ.WGcbtnrLAj.zb&ӡ \hwTS<a2JP34՚ZQips(j7%4rk匌]p6#󮀸(,fV2(=b D/!{%RA++ 8J,cQ*iQz}Dr,G dW^4*'jA^gh]-c;G_j١Xg?ptU7qZǹ 阚;@ѽ|HbɃچ=]m3;tDpC a@x8zL endstream endobj 73 0 obj 3741 endobj 47 0 obj <> endobj 46 0 obj <>stream xcd`ab`ddsqM- M̫3J(f!Cﵿf2`]_A``fdxs~AeQfzFFhPBR!&ZdX+8Ud&+Td+$%f+ed)h8k* #kԢ|̼̼̒JļDĔT.%E &yp~I `*[*($a0000201012x~=CZ0`e>aZIsvs,R-';#Y6=SwsxW>G!Vr=^9\^:s" endstream endobj 74 0 obj 367 endobj 56 0 obj <> endobj 55 0 obj <>stream xeS[PgMLZ (MMf/K :B J0"$l&D@HB&" h:`-_D}h;N3s̹};3, (+;p0}\)Ӯ۩(G7}XzY29. ?goVrWrؕA2EQN^]#ҊMOLFff&Qo.ʫUDj<jRm!r݊80Qhh T*.HZ"Ok4j=ظaCƺX WVk"R" ԙHV] /E:BR >d? )Fv!H6,Y#t3M,Bw"C!\xoi;lƻSŏnߌ]߾5`^{OܢDyx^U"!Źo ?c#KdD W^Ff"}<6_X4pR4&gxH!yZx*iWvٞ"jL^okh̎CT\ٕ)%` f`7| K)zKd8 Bg) VչS5-M&@6ՙ\bBiO+.BPp~a!`\¹sѓ(8u1$V:Z@+hi) @PHY1})(޲$vl7#teYiKds-6~\)nvXbii~YBY`w4?6JK `!@f=$IvӍ/y"(:hk)K[kc 0tu0WӵghW@KipIФP ɽV0`U~Cl|lXό 4G=GӚEz^` 0I`n[KhjXuw{8]0<2#)vXi3ήyqn:`<xQ ޸r&FYY;ae ww:]c[X@tk*TD]f7V޼32pVh1UwKdTϣi1|eՂ~4/K7V]|2=>tr-^f'P?Bγ4fZofv^{nN9f3zGJ]\maA)9Z(ǫdxox Af{~䇗{9|l2 au endstream endobj 75 0 obj 1311 endobj 53 0 obj <> endobj 52 0 obj <>stream xeVyTSW~1&iVb`KmknhTNmK$B0$$d{%@BX`(ZhukiNt}Ǽ339λ~~ d,`,Nߵ+5auH",Y(J ojy\ _E.cR[[~du'D› uLQ K+SW^6DEE 4iKDR C%mA4[,5An~0?4,%W,<(!rJ2z`cd䆵kۂJP![#IR W/# $@DT6E[$SmU[%$ \ M_+˗ %"J[&[= ˑ=H #ۑdEv!IH2!"!#n$Y £Gf#B+zɬgbF0;:m`F'9s ;trK~Ɠve'TSc,Xiv4S8 8}죫=rW1B[R6r! FGFa\13r9hmX[S(H4Ӫ0,iu:0zxg`pJ86=)߇f=`QmbmNlЈLId<g[Lr9fn/(IXd]{^ӁFܩli:oe NYǏ 큁 Ȉ'#--OUa'~A6K3A>j#Gi2>rc|cBK-\MW0 .YZdܙe[tQᲩk:Ac=&צX-VPt'/V{цZ'h!7S0(oO]GԢଳcx, l$Lls]&o|dV NONIZm0!H, T>Xѹe\w 6"(gLLrtZkh0)&igW Er~ ؓU$-;pvč(bflJP(\7s3'`_tZ3f]v_fwt1 >/ބ!2Χn5ܦÇ. [݄=x + ,܃OwwRjjj6 vusgzOMT< jt1VL Mhc{c> TJeYQ @ިW]W1Op7_,şg6;ܵspʁt9Hׁهth}`J4xtM} n_kߐ/ʕd?"HQxIXt/ \~ p( ~UCR6uۢ#«ExFX5PxTqTyс9o 5Aq)vH]qv #Po.}O#C滖I}?d(Hx/b?9>91ث = +-ޓ{GZ<7t0N+YS_d6[ ,1NkRYWtKbZuk rDbog_Seٜ8*ҋZͶ. ` T-uܵ%C{Fq ,k`߉.TbdLӕ@pW@X 3!LڗY^e2[ km)g[OuO M*P]!ic+ 2I,] xCA4arN‡~P_ DӠ+/-:K:J&ΑV}sq46^D9Zj1ʈU7ɕb`qqxZGOU7@6Fգ[N}ypK ?v6}R" i6(\VPQE[" GUK6[ѨTƠea^@-M~-G+jCez;pb hUE6lvz%˦tąf;^GC({8 [C)v]8]c#,܎S@MĐZK}hb\`=:plq1TV&N2Zl m0png&'$5Ӣ@228&}9H+/ % >ykYU:k `GT|. ΂/=zmwBA2ѩۧߡSبԏz"wp%bG??X+iKgqB@] /(J: tbV_*~Tg@@WPG&?Fd6йxc>XҊT ׋]UAu*8u`o2axV!{Oa=0s o<xE endstream endobj 76 0 obj 2787 endobj 50 0 obj <> endobj 49 0 obj <>stream xcd`ab`dd u M- M̫36(f!Cﵿf2`]_A``fdxs~AeQfzFFhPBR!&ZdX+8Ud&+Td+$%f+ed)h8k* #kԢ|̼̼̒JļDĔT.%E &yp~I `*[*($a0000201012x~=CZ0`e>aZIsvs,R-';#Y6=SwsxW>G!Vr=^9\^ endstream endobj 77 0 obj 367 endobj 34 0 obj <> endobj 31 0 obj <> endobj 28 0 obj <> endobj 25 0 obj <> endobj 54 0 obj <> endobj 22 0 obj <> endobj 51 0 obj <> endobj 19 0 obj <> endobj 48 0 obj <> endobj 16 0 obj <> endobj 13 0 obj <> endobj 10 0 obj <> endobj 40 0 obj <> endobj 37 0 obj <> endobj 57 0 obj <> endobj 2 0 obj <>endobj xref 0 78 0000000000 65535 f 0000009992 00000 n 0000070478 00000 n 0000009919 00000 n 0000010040 00000 n 0000009455 00000 n 0000000015 00000 n 0000003178 00000 n 0000012098 00000 n 0000011841 00000 n 0000066107 00000 n 0000010694 00000 n 0000010455 00000 n 0000064939 00000 n 0000020591 00000 n 0000020329 00000 n 0000063777 00000 n 0000015016 00000 n 0000014614 00000 n 0000061447 00000 n 0000014019 00000 n 0000013802 00000 n 0000059412 00000 n 0000031379 00000 n 0000030886 00000 n 0000057082 00000 n 0000026650 00000 n 0000026361 00000 n 0000055921 00000 n 0000023391 00000 n 0000023090 00000 n 0000054752 00000 n 0000039468 00000 n 0000039130 00000 n 0000053597 00000 n 0000038782 00000 n 0000038576 00000 n 0000068441 00000 n 0000043509 00000 n 0000043210 00000 n 0000067272 00000 n 0000010109 00000 n 0000010139 00000 n 0000009615 00000 n 0000003198 00000 n 0000006900 00000 n 0000047584 00000 n 0000047357 00000 n 0000062612 00000 n 0000053124 00000 n 0000052897 00000 n 0000060282 00000 n 0000050003 00000 n 0000049717 00000 n 0000058247 00000 n 0000048299 00000 n 0000048057 00000 n 0000069314 00000 n 0000010281 00000 n 0000009767 00000 n 0000006921 00000 n 0000009434 00000 n 0000010401 00000 n 0000011820 00000 n 0000013781 00000 n 0000014594 00000 n 0000020308 00000 n 0000023069 00000 n 0000026340 00000 n 0000030865 00000 n 0000038555 00000 n 0000039110 00000 n 0000043189 00000 n 0000047336 00000 n 0000048037 00000 n 0000049696 00000 n 0000052876 00000 n 0000053577 00000 n trailer << /Size 78 /Root 1 0 R /Info 2 0 R >> startxref 70528 %%EOF Paje-1.98/Tracers/JRastro/Makefile0000775000175000017500000002150011674062007016705 0ustar schnorrschnorr#/* # Copyright (c) 1998--2006 Benhur Stein # # This file is part of Paj. # # Paj is free software; you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # Paj is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with Paj; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. #*/ ################################################################# ################################################################# #////////////////////////////////////////////////// #/* Author: Geovani Ricardo Wiedenhoft */ #/* Email: grw@inf.ufsm.br */ #////////////////////////////////////////////////// ################################################################# ################################################################# #Alterar essa variavel, indicar qual o caminho da home do Java JDK_HOME=/usr/local/java/jdk1.5.0 #Diretorio da biblioteca JRastro export JRASTRO_DIR=/usr/local/JRastro #Diretorio dos binarios export JRASTRO_DIR_BIN=$(JRASTRO_DIR)/bin ################################################################# #Diretorio que ficara a biblioteca export JRASTRO_DIR_LIB=$(JRASTRO_DIR)/lib #Diretorio que ficara os codigos fontes export JRASTRO_DIR_SRC=$(JRASTRO_DIR)/src #Diretorio que ficara os objetos export JRASTRO_DIR_OBJ=$(JRASTRO_DIR)/objects #Diretorio que ficara os include export JRASTRO_DIR_INCLUDE=$(JRASTRO_DIR)/include #Diretorio que ficara os manuais export JRASTRO_DIR_HELP=$(JRASTRO_DIR)/help ################################################################# RASTRO_LIB=-L./libRastro/lib/ -lrastro RASTRO_INCLUDE=-I./libRastro/include/ INCLUDE=-I./include/ -I$(JDK_HOME)/include/ -I$(JDK_HOME)/include/linux $(RASTRO_INCLUDE) CC=gcc CFLAGS=-g -Wall -fPIC PERMDIR=0755 ################################################################# hist: librastro.a ./org/lsc/JRastro/Instru.class ./lib/libJRastro.so ./bin/JRastro_read ./bin/JRastro_readObj ./bin/JRastro_readObjClass ./bin/JRastro_read: ./include/JRastro.h ./libRastro/lib/librastro.a ./src/JRastro_read.c ./src/JRastro_paje.c ./include/JRastro_paje.h ./objects/hash.o ./objects/JRastro_hash_func.o ./objects/JRastro_list_func.o $(CC) $(CFLAGS) -o ./bin/JRastro_read ./src/JRastro_read.c ./src/JRastro_paje.c ./objects/hash.o ./objects/JRastro_hash_func.o ./objects/JRastro_list_func.o $(INCLUDE) $(RASTRO_LIB) ./bin/JRastro_readObj: ./include/JRastro.h ./libRastro/lib/librastro.a ./src/JRastro_read_objects.c ./src/JRastro_paje.c ./include/JRastro_paje.h ./objects/hash.o ./objects/JRastro_hash_func.o ./objects/JRastro_list_func.o $(CC) $(CFLAGS) -o ./bin/JRastro_readObj ./src/JRastro_read_objects.c ./src/JRastro_paje.c ./objects/hash.o ./objects/JRastro_hash_func.o ./objects/JRastro_list_func.o $(INCLUDE) $(RASTRO_LIB) ./bin/JRastro_readObjClass: ./include/JRastro.h ./libRastro/lib/librastro.a ./src/JRastro_read_objects_class.c ./src/JRastro_paje.c ./include/JRastro_paje.h ./objects/hash.o ./objects/JRastro_hash_func.o ./objects/JRastro_list_func.o $(CC) $(CFLAGS) -o ./bin/JRastro_readObjClass ./src/JRastro_read_objects_class.c ./src/JRastro_paje.c ./objects/hash.o ./objects/JRastro_hash_func.o ./objects/JRastro_list_func.o $(INCLUDE) $(RASTRO_LIB) ./lib/libJRastro.so: ./libRastro/lib/librastro.a ./objects/JRastro_rastros.o ./objects/JRastro_traces.o ./objects/JRastro_basic.o ./objects/hash.o ./objects/JRastro_options.o ./objects/JRastro_events.o ./objects/JRastro_thread.o ./objects/JRastro_hash_func.o ./objects/JRastro_list_func.o ./objects/JRastro.o ./objects/JRastro_java_crw_demo.o ./objects/JRastro_func.o ld -shared -o ./lib/libJRastro.so ./objects/JRastro_rastros.o ./objects/JRastro_traces.o ./objects/hash.o ./objects/JRastro_basic.o ./objects/JRastro_options.o ./objects/JRastro_events.o ./objects/JRastro_thread.o ./objects/JRastro_hash_func.o ./objects/JRastro_list_func.o ./objects/JRastro.o ./libRastro/lib/librastro.a ./objects/JRastro_java_crw_demo.o ./objects/JRastro_func.o ./org/lsc/JRastro/Instru.class: ./org/lsc/JRastro/Instru.java javac org/lsc/JRastro/Instru.java librastro.a: (cd ./libRastro/ && make) ./objects/JRastro.o: ./include/JRastro.h ./src/JRastro.c ./objects/JRastro_basic.o $(CC) $(CFLAGS) -c -o ./objects/JRastro.o ./src/JRastro.c $(INCLUDE) ./objects/JRastro_hash_func.o: ./include/JRastro_hash_func.h ./src/JRastro_hash_func.c ./objects/JRastro_basic.o $(CC) $(CFLAGS) -c -o ./objects/JRastro_hash_func.o ./src/JRastro_hash_func.c $(INCLUDE) ./objects/JRastro_list_func.o: ./include/JRastro_list_func.h ./src/JRastro_list_func.c ./objects/JRastro_basic.o $(CC) $(CFLAGS) -c -o ./objects/JRastro_list_func.o ./src/JRastro_list_func.c $(INCLUDE) ./objects/JRastro_java_crw_demo.o: ./include/JRastro.h ./include/JRastro_classfile_constants.h ./include/JRastro_java_crw_demo.h ./src/JRastro_java_crw_demo.c $(CC) $(CFLAGS) -c -o ./objects/JRastro_java_crw_demo.o ./src/JRastro_java_crw_demo.c $(INCLUDE) ./objects/JRastro_thread.o: ./include/JRastro.h ./include/JRastro_thread.h ./src/JRastro_thread.c ./objects/JRastro_basic.o $(CC) $(CFLAGS) -c -o ./objects/JRastro_thread.o ./src/JRastro_thread.c $(INCLUDE) ./objects/JRastro_events.o: ./include/JRastro.h ./include/JRastro_events.h ./src/JRastro_events.c ./objects/JRastro_basic.o $(CC) $(CFLAGS) -c -o ./objects/JRastro_events.o ./src/JRastro_events.c $(INCLUDE) ./objects/JRastro_options.o: ./include/JRastro.h ./include/JRastro_options.h ./src/JRastro_options.c ./objects/JRastro_basic.o $(CC) $(CFLAGS) -c -o ./objects/JRastro_options.o ./src/JRastro_options.c $(INCLUDE) ./objects/hash.o: ./include/hash.h ./src/hash.c $(CC) $(CFLAGS) -c -o ./objects/hash.o ./src/hash.c $(INCLUDE) ./objects/JRastro_basic.o: ./include/JRastro.h ./include/JRastro_basic.h ./src/JRastro_basic.c $(CC) $(CFLAGS) -c -o ./objects/JRastro_basic.o ./src/JRastro_basic.c $(INCLUDE) ./objects/JRastro_traces.o: ./include/JRastro.h ./include/JRastro_traces.h ./src/JRastro_traces.c ./libRastro/lib/librastro.a ./objects/JRastro_rastros.o ./objects/JRastro_basic.o $(CC) $(CFLAGS) -c -o ./objects/JRastro_traces.o ./src/JRastro_traces.c $(INCLUDE) ./objects/JRastro_rastros.o: ./libRastro/lib/librastro.a ./include/JRastro_rastros.h ./src/JRastro_rastros.c $(CC) $(CFLAGS) -c -o ./objects/JRastro_rastros.o ./src/JRastro_rastros.c $(INCLUDE) ./objects/JRastro_func.o: ./include/JRastro.h ./include/org_lsc_JRastro_Instru.h ./src/JRastro_func.c ./objects/JRastro_basic.o $(CC) $(CFLAGS) -c -o ./objects/JRastro_func.o ./src/JRastro_func.c $(INCLUDE) clean: (cd ./libRastro/ && make clean) rm -f ./objects/JRastro*.o ./objects/hash.o ./lib/libJRastro.so ./bin/JRastro_read ./bin/JRastro_readObj ./bin/JRastro_readObjClass ./org/lsc/JRastro/Instru.class install: cp -f lib/libJRastro.so $(JDK_HOME)/jre/lib/i386/ cp -rf org/ $(JDK_HOME)/jre/lib/ (cd $(JDK_HOME)/jre/lib && cp -f rt.jar rt.jar.BACK && jar -uf rt.jar org/lsc/JRastro/Instru.class) install -m $(PERMDIR) -d $(JRASTRO_DIR) install -m $(PERMDIR) -d $(JRASTRO_DIR_LIB) install -m $(PERMDIR) -d $(JRASTRO_DIR_BIN) install -m $(PERMDIR) -d $(JRASTRO_DIR_SRC) install -m $(PERMDIR) -d $(JRASTRO_DIR_OBJ) install -m $(PERMDIR) -d $(JRASTRO_DIR_INCLUDE) install -m $(PERMDIR) -d $(JRASTRO_DIR_HELP) install -m 0744 Makefile $(JRASTRO_DIR)/Makefile install -m 0444 README $(JRASTRO_DIR)/README install -m 0644 ./lib/libJRastro.so $(JRASTRO_DIR_LIB) install -m 0755 ./bin/JRastro* $(JRASTRO_DIR_BIN) install -m 0644 ./src/JRastro* $(JRASTRO_DIR_SRC) install -m 0644 ./src/hash.c $(JRASTRO_DIR_SRC) install -m 0755 ./objects/JRastro* $(JRASTRO_DIR_OBJ) install -m 0755 ./objects/hash.o $(JRASTRO_DIR_OBJ) install -m 0644 ./include/JRastro* $(JRASTRO_DIR_INCLUDE) install -m 0644 ./include/hash.h $(JRASTRO_DIR_INCLUDE) install -m 0644 ./include/org_lsc_JRastro_Instru.h $(JRASTRO_DIR_INCLUDE) install -m 0644 ./help/JRastro* $(JRASTRO_DIR_HELP) cp -rf org/ $(JRASTRO_DIR)/ (cd libRastro && make install) uninstall: rm -f $(JDK_HOME)/jre/lib/i386/libJRastro.so rm -f $(JRASTRO_DIR)/Makefile $(JRASTRO_DIR)/README $(JRASTRO_DIR_LIB)/libJRastro.so $(JRASTRO_DIR_BIN)/JRastro* $(JRASTRO_DIR_BIN)/rastro_* $(JRASTRO_DIR_SRC)/JRastro* $(JRASTRO_DIR_SRC)/hash.c $(JRASTRO_DIR_OBJ)/JRastro* $(JRASTRO_DIR_OBJ)/hash.o $(JRASTRO_DIR_INCLUDE)/JRastro* $(JRASTRO_DIR_INCLUDE)/hash.h $(JRASTRO_DIR_INCLUDE)/org_lsc_JRastro_Instru.h $(JRASTRO_DIR_HELP)/JRastro* rm -rf $(JRASTRO_DIR)/org/ (cd $(JDK_HOME)/jre/lib && mv -f rt.jar.BACK rt.jar) (cd libRastro && make uninstall) Paje-1.98/Tracers/JRastro/bin/0000775000175000017500000000000011674062007016014 5ustar schnorrschnorrPaje-1.98/Tracers/JRastro/bin/JRastro_gera_func.sh0000775000175000017500000000220611674062007021750 0ustar schnorrschnorr#!/bin/sh #/* # Copyright (c) 1998--2006 Benhur Stein # # This file is part of Paj. # # Paj is free software; you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # Paj is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # # You should have received a copy of the GNU Lesser General Public License # along with Paj; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. #*/ #////////////////////////////////////////////////// #/* Author: Geovani Ricardo Wiedenhoft */ #/* Email: grw@inf.ufsm.br */ #////////////////////////////////////////////////// rastro_get_names.sh ./src/JRastro_traces.c JRastro_rastros mv JRastro_rastros.c ./src/ mv JRastro_rastros.h ./include/ Paje-1.98/Documentation/0000775000175000017500000000000011674062007015066 5ustar schnorrschnorrPaje-1.98/Documentation/lang-paje/0000775000175000017500000000000011674062007016724 5ustar schnorrschnorrPaje-1.98/Documentation/lang-paje/definitions.tex0000664000175000017500000000440311674062007021762 0ustar schnorrschnorr \usepackage{amsmath} \usepackage{pifont} % use of dingbats \usepackage{array} % extension to the tabular env. \usepackage{color} % for adding colors to things \usepackage{colortbl} % for adding colors to tables \newenvironment{captiontext}{\begin{quote} \footnotesize}{\end{quote}} \newcommand{\ath}{\textsc{Atha\-pas\-can}\xspace} \newcommand{\comment}[1]{} \newlength{\figurewidth}\setlength{\figurewidth}{\textwidth} %\addtolength{\figurewidth}{-\fboxsep} %\addtolength{\figurewidth}{-\fboxsep} \newsavebox{\figurebox} \newcommand{\makefigure}[4]{% \begin{figure}[bt]\centering% \sbox{\figurebox}{#2}% \ifdim \wd\figurebox >\figurewidth% \resizebox{\figurewidth}{!}{\usebox{\figurebox}}% \else% \makebox[\figurewidth]{\usebox{\figurebox}}% \fi% \vspace*{-3mm} \caption[#3]{\parbox[t]{11cm}{#3\newline\raggedright\protect\scriptsize #4}}% \vspace*{2mm} \label{#1}% \end{figure}% } %% Tables % % Usage: % \maketable{label}{figure command}{main caption}{secondary caption} % % there is a new column type for titles, T, to be used in \multicolumns, % to put titles in reverse color, bold, sans serif, left aligned. % there are also types R, L and C; they are like r, l, c but sans serif % \newlength{\tablewidth}\setlength{\tablewidth}{\textwidth} \newcommand{\maketable}[4]{% \begin{table}[bt]\centering% \caption[#3]{#3\newline\footnotesize #4}\label{#1}% \sbox{\figurebox}{#2}% \ifdim \wd\figurebox >\tablewidth \resizebox{\tablewidth}{!}{\usebox{\figurebox}}% \else% \usebox{\figurebox}% \fi% \end{table}% } \newcolumntype{T}{>{\sffamily\bfseries\color{white}\columncolor[gray]{.2}}l} \newcolumntype{R}{>{\sffamily}r} \newcolumntype{L}{>{\sffamily}l} \newcolumntype{C}{>{\sffamily}c} \newcommand{\codefigurestart}{ \begin{figure}[hbt] \begin{tabular}{|l|} \hline \begin{minipage}{\codewidth} \medskip\small } \newcommand{\codefigureend}[3]{ \medskip \end{minipage} \\\hline \end{tabular} % \caption[#2]{#2\newline\footnotesize #3}% \caption[#2]{\parbox[t]{11cm}{#2\newline\raggedright\protect\scriptsize #3}}% \label{#1}% \end{figure} } \newlength{\codewidth}\setlength{\codewidth}{\figurewidth} \addtolength{\codewidth}{-\fboxsep} \addtolength{\codewidth}{-\fboxsep} Paje-1.98/Documentation/lang-paje/Makefile0000664000175000017500000000023211674062007020361 0ustar schnorrschnorr LATEX_MASTER=lang-paje.tex include ../latex.mk lang-paje.dvi: %.dvi: %.tex %.bib $(LATEX_FILES) latex $* bibtex $* makeindex $* latex $* latex $* Paje-1.98/Documentation/lang-paje/lang-paje.tex0000664000175000017500000000651711674062007021315 0ustar schnorrschnorr\documentclass[11pt,twoside]{report} \usepackage{fullpage} \usepackage{epsfig} \usepackage{xspace} \usepackage{alltt} % \usepackage[francais]{babel} % Pour Linux \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \setcounter{secnumdepth}{3} %% pour numroter les subsubsections \setcounter{tocdepth}{3} %% profondeur dans la table des matires \usepackage{times} \include{definitions} % Dfinitions de la thse de Benhur \makeindex \title{Paj trace file format} \author{B. de Oliveira Stein\\ Departamento de Eletr\^onica e Computa\c{c}\~ao\\ Universidade Federal de Santa Maria - RS, Brazil.\\ Email: benhur@inf.UFSM.br\\ \and J. Chassin de Kergommeaux\\ Laboratoire Informatique et Distribution (ID-IMAG)\\ ENSIMAG - antenne de Montbonnot,\\ ZIRST, 51, avenue Jean Kuntzmann\\ F-38330 Montbonnot Saint Martin, France \\ Email:Jacques.Chassin-de-Kergommeaux@imag.fr\\ http://www-apache.imag.fr/\~\/chassin } \begin{document} \maketitle \begin{abstract} Paj is an interactive and scalable trace-based visualization tool which can be used for a large variety of visualizations including performance monitoring of parallel applications, monitoring the execution of processors in a large scale PC cluster or representing the behavior of distributed applications. Users of Paj can tailor the visualization to their needs, without having to know any insight nor to modify any component of Paj. This can be done by defining the type hierarchy of objects to be visualized as well as how these objects should be visualized. This feature allows the use of Paj for a wide variety of visualizations such as the use of resources by applications in a large-size cluster or the behavior of distributed Java applications. This report describes the trace format used by Paj. Traces include three different kind of informations: definition of the formats of the event, definition of the type hierarchy of the objects to be visualized, definition of the formats of the events of the trace and a set of recorded events, complying with the format definition, to be used to build visualizations according to the type hierarchy. \textbf{Keywords:} performance debugging, visualization, MPI, pthread, parallel programming, self defined data format. \end{abstract} \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\chapter{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\input{intro.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\chapter{Extensibility of Paj} %\label{chap:paje} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\input{extensibility.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Definition of type hierarchies and trace event formats} \label{chap:format} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \input{typeevent.tex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\chapter{Conclusion} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\input{conclusion.tex} \bibliography{lang-paje} \bibliographystyle{abbrv} \addcontentsline{toc}{chapter}{Index} \IfFileExists{lang-paje.ind}{% \input{lang-paje.ind} } \end{document} Paje-1.98/Documentation/lang-paje/typeevent.tex0000664000175000017500000011624411674062007021501 0ustar schnorrschnorr%* % Copyright 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein % % This file is part of Paj. % % Paj is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2 of the License, or % (at your option) any later version. % % Foobar is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with Foobar; if not, write to the Free Software % Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA %/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \chapter{Definition of type hierarchies and trace event formats} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % T, R, L and C already in definitions.tex %\newcolumntype{T}{>{\sffamily\bfseries\color{white}\columncolor[gray]{.2}}l} %\newcolumntype{R}{>{\sffamily}r} %\newcolumntype{L}{>{\sffamily}l} %\newcolumntype{C}{>{\sffamily}c} \newcolumntype{P}{>{\sffamily}p{5cm}} \section{Introduction} \label{sec:traceintro} A visualization constructed by Paj is composed of objects organized according to a tree type hierarchy whose nodes are called \emph{containers}\index{container} and leaves \emph{entities}\index{entity}% (see \S\ref{sec:genericity}) . The Paj data format is self-defined, although it does not comply with the SDDF\index{SDDF} format used by Pablo \cite{sddf}. There exists a ``meta-format'' used to define: \begin{itemize} \item The format of the instructions defining containers and entities. \item The format of the events recorded during the executions of parallel programs. \end{itemize} These definitions are usually inserted in trace files. They can even be inserted in the observed programs source files, provided that the tracers used to record the events of these programs are able to capture a new definition as a ``user-defined'' event.% (see for example %figure~\ref{f:simpleprogramtraced}). Using these definitions, it is possible to define a hierarchy of containers and entities adapted for a given programming model or language. Definitions of type hierarchies as well as instructions and events formats constitute a specialisation of the ``generic'' Paj visualization tool: it has been used so far to visualize distributed applications written in Java \cite{OttogaliOSCV:2001} or help to perform system monitoring on large sized clusters \cite{GuilloudCAS:2001}. The organization of this chapter is the following. The next section defines the meta format of Paj used to define the format of type definition instructions and events. The following sections describe how containers and entities are defined and created. The next section is dedicated to the trace events: self definition, recording. The last section of this chapter contains a complete example of use of the Paj data format. \section{Meta format of Paj} \label{sec:file} A trace file is composed of events. An event can be seen as a table composed of named fields, as shown in figure~\ref{f:event:table}. The first event in the figure can represent the sending of a message containing 320 bytes by process 5 to process 3, containing 320 bytes by process 5 to process 3, containing 320 bytes by process 5 to process 3, containing 320 bytes by process 5 to process 3, 3.233222 seconds after the process started executing. The second event shows that process 5 unblocked at time 5.123002, and that this happened while executing line 98 of file sync.c. Each event has some fields, each of them composed of a name, a type and a value. Generally, there are lots of similar events in a trace file (lots of ``SendMessage'' events, all with the same fields); a typical trace file contains thousands of events of tens of different types. Usually, events of the same type have the same fields. It is therefore wise, in order to reduce the trace file size, not to put the information that is common to many events in each of those events. The most common solution is to put only the type of each event and the values of its fields in the trace file. Information on what event types exist and the fields that constitute each of these event types being kept elsewhere. In some trace file formats, this information is hardcoded in the trace generator and trace reader, making the trace structure hard to change in order to incorporate new types of events, new data in existing events or to remove unused or unknown data from those events. \begin{figure}[htbp] \begin{center} \begin{tabular}{|>{\bf}rll|} \hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Field Value} \\ \hline EventName & string & SendMessage \\ Time & timestamp & 3.233222 \\ ProcessId & integer & 5 \\ Receiver & integer & 3 \\ Size & integer & 320 \\ \hline \end{tabular} \quad\quad \begin{tabular}{|>{\bf}rll|} \hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Field Value} \\ \hline EventName & string & UnblockProcess \\ Time & timestamp & 5.123002 \\ ProcessId & integer & 5 \\ FileName & string & sync.c \\ LineNumber & integer & 98 \\ \hline \end{tabular} \end{center} \caption{Examples of events} \label{f:event:table} \end{figure} A Paj trace file is self defined, meaning that the event definition information is put inside the trace file itself, much like the SDDF file format used by the Pablo visualization tool \cite{sddf}. The file is constituted of two parts: the definition of the events at the beginning of the file followed by the events themselves. The definition of events contains the name of each event type and the names and types of each field. The second part of the trace file contains the events, with the values associated to each field, in the same order as in the definition. The correspondence of an event with its definition is made by means of a number, that must be unique for each event description; this number appears in an event definition and at the beginning of each event contained in the trace file. The event definition part of a Paj trace file follows the following format: \begin{itemize} \item all the lines start with a `\%' character; \item each event definition starts with a \%EventDef\index{EventDef} line and terminates with a \%EndEventDef\index{EndEventDef} line; \item the \%EventDef line contains the name and the unique number of an event type. The number (an integer) will be used to identify the event in the second part of the trace file. The choice of this number is left to the user. The numbers given in the definitions below (see % \S\ref{sec:containers} and \S\ref{sec:entities} \S\ref{sec:example}) are thus \textbf{arbitrary}. The name of the event will be put in a field called ``PajeEventName''. There cannot be another field called so. The name is used to identify the type of an event; \item the fields of an event are defined between the \%EventDef and the \%EndEventDef lines, one field per line, with the name of the field followed by its type (see below). \end{itemize} The structure of the two events of figure~\ref{f:event:table} are shown in figure~\ref{f:event:def}. \begin{figure} \begin{center} \begin{minipage}{5.6cm} \begin{verbatim} %EventDef SendMessage 21 % Time date % ProcessId int % Receiver int % Size int %EndEventDef \end{verbatim} \end{minipage} \quad\quad \begin{minipage}{5.6cm} \begin{verbatim} %EventDef UnblockProcess 17 % Time date % ProcessId int % LineNumber int % FileName string %EndEventDef \end{verbatim} \end{minipage} \end{center} \caption{Examples of event definitions} \label{f:event:def} \end{figure} The type of a field can be one of the following: \begin{description} \item [date:] for fields that represent dates\index{date}. It's a double precision floating-point number, usually meaning seconds since program start; \item [int:] for fields containing integer numeric values; \item [double:] for fields containing floating-point values; \item [hex:] for fields that represent addresses, in hexadecimal; \item [string:] for strings of characters. \item [color:] for fields that represent colors. A color is a sequence of three floating-point numbers between 0 and 1, inside double quotes ("). The three numbers are the values of red, green and blue components. \end{description} %Most events are dated. If that is the case, it must be defined with a field named ``Time'' of type ``date'', for %the date of generation of the event. The second part of the trace file contains one event per line, whose fields are separated by spaces or tabs, the first field being the number that identifies the event type, followed by the other fields, in the same order that they appear in the definition of the event. Fields of type string must be inside double quotes (") if they contain space or tab characters, or if they are empty. For example, the two events of figure~\ref{f:event:table} are shown in figure~\ref{f:event}. \begin{figure} \begin{center} \begin{minipage}{5cm} \begin{verbatim} 21 3.233222 5 3 320 17 5.123002 5 98 sync.c \end{verbatim} \end{minipage} \end{center} \caption{Examples of events} \label{f:event} \end{figure} In Paj, event numbers are used only as a means to find the definition of an event; they are discarded as soon as an event is read. After being read, events are identified by their names. Two different definitions can have the same name (and different numbers), making it possible to have, in the same trace file, two events of the same type containing different fields. We use this feature to optionally include the source file identification in some events. The ``UnblockProcess'' event in the examples above could also be defined without the fields FileName and LineNumber, for use in places where this information is not known or not necessary. \section{Events treated by the Paj simulator} %{Paj "generic" events} \label{sec:generic} A Paj visualization is best described as a typed hierarchy of objects organized as a tree. Elementary objects are the leaves of the tree and called ``entities'' while intermediate nodes of the tree are named ``containers''. Entities are the objects that can be visualized in Paj's space-time diagram, while containers organize the space where those entities are displayed. Paj includes a simulator module which builds this hierarchical data structure from the elementary event records of the trace files. Paj has no predefined containers or entities. Before an entity can be created and visualized, a hierarchy of container and entity types must be defined, and containers must be instantiated. For example, to visualize the states of threads in a program, one must first define the container types ``Program'' and ``Thread'' and the entity type ``Thread State''. One must also define the possible values that the entities of type ``Thread State'' can assume (for example, ``Executing'' and ``Blocked''). Then, one must instantiate the program creating a container of type ``Program'' (called ``Thread Testing Program'', for example). The threads of the program also have to be instantiated; they are containers of type ``Thread'', called for example ``Thread 1'' and ``Thread 2'', and contained in container ``Thread Testing Program''. Only then one is able to create visualizable entities of type ``Thread State'', by means of events that represent changes in state, contained either in ``Thread 1'' or ``Thread 2''. The events that the Paj simulator understands can be divided into four classes: \begin{itemize} \item events to define types of containers; \item events to define types of entities and possible values that entities can have; \item events to instantiate and destroy containers; \item events to create visualizable entities. \end{itemize} Typically, the events of the first two classes are in the beginning of a trace file, followed by events that instantiate containers, followed by a large number of events creating entities. The simulator does not impose this order, events of these four classes can be mixed in the trace file. The limitation is that an entity or a container cannot be created before its type has been defined and its container created. The four classes of events are discussed in the following sessions. \subsection{Definition of types of Containers} \label{sec:contype} Containers types are defined with events named ``PajeDefineContainerType''. \subsubsection*{PajeDefineContainerType\index{PajeDefineContainerType}} Events of this type (see figure~\ref{f:pajedefinecontainertype}) must contain the fields ``Name'' and ``ContainerType''. It defines a new container type called ``Name'', contained by a previously defined container type ``ContainerType'' (or the special container type ``0'' or ``/'', if this container type is the top of the container hierarchy). Optionally this event can contain a field ``Alias'' with an alias name to be used to identify this container. Aliases are usually short strings used when the container name is too big and its use throughout the trace file would increase the file's size. When an alias is used in a definition, it must also be used in later references to the container type being defined. When an alias is not used, a container type must be later referenced by its name. The use of aliases allows for the definition of more than one container with the same name (and different aliases). \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeDefineContainerType}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Name & string or integer & Name of new container type\\ ContainerType & string or integer & Parent container type\\ \hline Alias & string or integer & Alternative name of new container type\\ \hline \end{tabular}% \end{center}% \caption{Fields of PajeDefineContainerType event} \label{f:pajedefinecontainertype} \end{figure} For the example, one could need two events (see %in section~\ref{s:generic}, one would need two events (see figure~\ref{f:definecontainerexample} to indicate that a ``Program'' contains ``Thread''s: \begin{figure}[htbp] \begin{center} \begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeDefineContainerType \\ Name & Program\\ ContainerType & /\\ Alias & P\\ \hline \end{tabular}% \quad%\quad \begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeDefineContainerType \\ Name & Thread\\ ContainerType & P \emph{or} Program\\ Alias & T\\ \hline \end{tabular}% \end{center}% \caption{Examples of PajeDefineContainerType events} \label{f:definecontainerexample} \end{figure} \subsection{Creation and destruction of containers} \label{sec:instant} Containers are created using the ``PajeCreateContainer'' event, and destroyed using the ``PajeDestroyContainer'' event. \subsubsection*{PajeCreateContainer\index{PajeCreateContainer}} This event (see figure~\ref{f:pajecreatecontainer} must have the fields ``Time'', ``Name'', ``Type'' and ``Container''. Optionally it can have a field named ``Alias''. The simulation of this event instantiates, in the simulation time ``Time'', a new container named ``Name'', of type ``Type'', contained in the preexisting container ``Container''. The field ``Type'' must have a value corresponding to the ``Name'' or ``Alias'' of a previous PajeDefineContainerType event. The field ``Container'' must have a value corresponding to the ``Name'' or ``Alias'' of a previous PajeCreateContainer event (or ``0'' or ``/'', if on top of the hierarchy). This new container can be referenced in future events by the value of its ``Name'' or, if it has an ``Alias'' field, by it alias. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeCreateContainer}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time of creation of container \\ Name & string or integer & Name of new container \\ Type & string or integer & Type of new container \\ Container & string or integer & Parent of new container \\ \hline Alias & string or integer & Alternative name of new container \\ \hline \end{tabular}% \end{center}% \caption{Fields of PajeCreateContainer event} \label{f:pajecreatecontainer} \end{figure} Figure~\ref{f:createcontainerexample} shows the events necessary to create the containers ``Thread Testing Program'' of type ``Program'' and ``Thread 1'' and ``Thread 2'' of type ``Thread'', contained by ``Thread Testing Program''.%, from the example in section~\ref{s:generic}. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeCreateContainer \\ Time & 0\\ Name & "Thread Testing Program"\\ Container & /\\ Type & P\\ Alias & TTP\\ \hline \end{tabular}% %\quad%\quad \begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeCreateContainer \\ Time & 0.986789\\ Name & "Thread 1"\\ Container & TTP\\ Type & T\\ Alias & T1\\ \hline \end{tabular}% \quad%\quad \begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeCreateContainer \\ Time & 1.012332\\ Name & "Thread 2"\\ Container & TTP\\ Type & T\\ Alias & T2\\ \hline \end{tabular}% \end{center}% \caption{Examples of PajeCreateContainer events} \label{f:createcontainerexample} \end{figure} \subsubsection*{PajeDestroyContainer\index{PajeDestroyContainer}} Containers can be destroyed using the event named ``PajeDestroyContainer'' with fields ``Time'', ``Name'' and ``Type'' (see figure~\ref{f:pajedestroycontainer}. After simulating this event, the container named (or aliased) ``Name'' of type ``Type'' will be marked as being destroyed at time ``Time''. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeDestroyContainer}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time of destruction of container \\ Name & string or integer & Name of container \\ Type & string or integer & Type of container \\ \hline \end{tabular}% \end{center}% \caption{Fields of PajeDestroyContainer event} \label{f:pajedestroycontainer} \end{figure} For example, if ``Thread 1'' finishes execution at time 4.34565. it can be represented by the event in figure~\ref{f:destroycontainerexample}. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeDestroyContainer \\ Time & 4.34565\\ Name & "Thread 1"\\ Type & T\\ \hline \end{tabular}% \end{center}% \caption{Example of PajeDestroyContainer event} \label{f:destroycontainerexample} \end{figure} \subsection{Definitions of types of entities} \label{sec:entypedef} Entities are the leaves of the type hierarchy tree of a Paj specialization. There exist four types of entities: \begin{itemize} \item \textbf{events}\index{event}, used to represent an event that happened in a certain point in time, usually displayed as triangles in Paj's space-time diagram; \item \textbf{states}\index{state}, used to represent the fact that a certain container was in a determined state during a certain amount of time, usually displayed as rectangles in Paj's space-time diagram; \item \textbf{links}\index{link}, used to represent a relation between two containers that started in a certain time and finished in a possibly different time (for example, a communication between two nodes), usually displayed as arrows; and \item \textbf{variables}\index{variable}, used to represent the evolution in time of a certain value associated to a container, displayed as graphs in the space-time diagram. \end{itemize} An event of type event, state or link can have a value associated with it, and all possible values must be defined before an event with this value can be created. There are four different events to create an entity type in Paj, ``PajeDefineEventType'', ``PajeDefineStateType'', ``PajeDefineLinkType'' and ``PajeDefineVariableType'' and one event to define a possible value of an entity, ``PajeDefineEntityValue''. \subsubsection*{PajeDefineEventType\index{PajeDefineEventType}} Entities of this new type represent a remarkable type of event recorded during the visualized executions and are displayed as triangles in the space-time diagram. Event types are defined with the "PajeDefineEventType" event. This event (see figure~\ref{f:pajedefineevent}) contains the fields ``Name'' and ``ContainerType''. It defines a new event entity type called ``Name'', subtype of the previously defined container type ``ContainerType''. Optionally it can have a field named ``Alias'' to have an alternative way to identify this type of entity. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeDefineEventType}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Name & string or integer & Name of new entity type \\ ContainerType & string or integer & Type of container of entity\\ \hline Alias & string or integer & Alternative name of new entity type \\ Shape & string & Name of shape used to represent entities\\ Height & integer & Height of shape, in points\\ Width & integer & Width of shape, in points\\ \hline \end{tabular}% \end{center}% \caption{Fields of PajeDefineEventType event} \label{f:pajedefineevent} \end{figure} \subsubsection*{PajeDefineStateType\index{PajeDefineStateType}} Entities of this new type will represent ``states'', and are displayed as rectangles in the space-time diagram. The definition contains (see figure~\ref{f:pajedefinestate}) the fields ``Name'' and ``ContainerType''. Optionally, it can have a field ``Alias''. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeDefineStateType}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Name & string or integer & Name of new entity type \\ ContainerType & string or integer & Type of container of entity\\ \hline Alias & string or integer & Alternative name of new entity type \\ Shape & string & Name of shape used to represent entities\\ Height & integer & Height of shape, in points\\ \hline \end{tabular}% \end{center}% \caption{Fields of PajeDefineStateType event} \label{f:pajedefinestate} \end{figure} In the example of \S\ref{sec:instant}, the event in figure~\ref{f:definestateexample} could be used to define the entity type that will represent the states of the threads of the program. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeDefineStateType \\ Name & "Thread State"\\ Alias & S\\ ContainerType & Thread\\ \hline \end{tabular}% \end{center}% \caption{Example of PajeDefineStateType event} \label{f:definestateexample} \end{figure} \subsubsection*{PajeDefineVariableType\index{PajeDefineVariableType}} Entities of this new type represent variables, whose evolutions are to be visualized as graphs during the execution of parallel programs. Variables are created with the \texttt{PajeDefineVariableType} event (see figure~\ref{f:pajedefinevariable}), containing fields ``Name'', ``ContainerType'' and optionally ``Alias''. Their value represent an attribute of a container, whose value (a double) is set by the \texttt{PajeSetVariable} event. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeDefineVariableType}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Name & string or integer & Name of new entity type \\ ContainerType & string or integer & Type of container of entity\\ \hline Alias & string or integer & Alternative name of new entity type \\ Height & integer & Height of shape, in points\\ \hline \end{tabular}% \end{center}% \caption{Fields of PajeDefineVariableType event} \label{f:pajedefinevariable} \end{figure} \subsubsection*{PajeDefineLinkType\index{PajeDefineLinkType}} Links are used to display a directed link between two containers such as a communication or the identification of a reaction in a container corresponding to an action on another one. The source and destination containers must have a common ancestral in the container hierarchy (identified by ``Container'' in the events below). Links are usually displayed as arrows. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeDefineLinkType}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Name & string or integer & Name of new link type \\ ContainerType & string or integer & Type of common ancestral container \\ SourceContainerType & string or integer & Type of source container of link\\ DestContainerType & string or integer & Type of destination container of link\\ \hline Alias & string or integer & Alternative name of new link type \\ Shape & string & Name of shape used to represent entities\\ \hline \end{tabular}% \end{center}% \caption{Fields of PajeDefineLinkType event} \label{f:pajedefinelink} \end{figure} \subsubsection*{PajeDefineEntityValue\index{PajeDefineEntityValue}} \label{sec:entvaldef} Contains fields ``Name'', ``EntityType'' and optionally ``Alias''. Used to give names to the possible values of an entity type. ``Alias'' will represent the value ``Name'' that entities of type ``EntityType'' can have. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeDefineEntityValue}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Name & string or integer & Value of entity \\ EntityType & string or integer & Type of entity that can have this value \\ \hline Alias & string or integer & Alternative name of new value \\ Color & color & Color of entities of this value\\ \hline \end{tabular}% \end{center}% \caption{Fields of PajeDefineEntityValue event} \label{f:pajedefinevalue} \end{figure} In the example started in \S\ref{sec:instant}, ``Thread State''s can be ``Executing'' or ``Blocked'', as shown in figure~\ref{f:definevalueexample}. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeDefineEntityValue \\ Name & Executing\\ Alias & E\\ EntityType & S\\ Color & "0 1 0"\\ \hline \end{tabular}% \quad\begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeDefineEntityValue \\ Name & Blocked\\ Alias & B\\ EntityType & S\\ Color & "0.9 0 0.1"\\ \hline \end{tabular}% \end{center}% \caption{Example of PajeDefineEntityValue event} \label{f:definevalueexample} \end{figure} \subsection{Creation of visualizable entities} \label{sec:creation} There are different events to create entities of each possible type (states, events, variables or links). In events that create entities, the optional fields named "FileName" and "LineNumber" can be used to relate the created event to a position in a file, that can be obtained in Paj during the inspection of the entity. These events can also have the optional field named "RelationKey", to group entities that are somehow related to each other. All entities with the same key are highlighted in the space-time diagram when the mouse cursor is over one of them. \subsubsection{States} There are events to change a state ("PajeSetState")\index{PajeSetState}, to push a state, saving the old state ("PajePushState")\index{PajePushState}, and to pop the previously saved state ("PajePopState")\index{PajePopState}. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeSetState}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time the state changed \\ Type & string or integer & Type of state \\ Container & string or integer & Container whose state changed \\ Value & string or integer & Value of new state of container \\ \hline \end{tabular} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajePushState}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time the state changed \\ Type & string or integer & Type of state \\ Container & string or integer & Container whose state changed \\ Value & string or integer & Value of new state of container \\ \hline \end{tabular} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajePopState}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time the state changed \\ Type & string or integer & Type of state \\ Container & string or integer & Container whose state changed \\ \hline \end{tabular}% \end{center}% \caption{Fields of state changing events} \label{f:pajesetstate} \end{figure} For example, if "Thread 1" blocks at time 2.34567 and unblocks at time 2.456789, the trace file could contain the events shown in figure~\ref{f:setstateexample}. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeSetState \\ Time & 2.34567\\ Type & "Thread State" \\ Container & "Thread 1"\\ Value & Blocked \\ \hline \end{tabular}% \quad\begin{tabular}{|LL|} \hline \textbf{Field Name} & \textbf{Field Value} \\ \hline PajeEventName & PajeSetState \\ Time & 2.456789\\ Type & S \\ Container & T1\\ Value & E \\ \hline \end{tabular}% \end{center}% \caption{Example of PajeSetState event} \label{f:setstateexample} \end{figure} \subsubsection{Events} Events are created with the event named ``PajeNewEvent''\index{PajeNewEvent}. Just like states, the values of events must be previously defined by ``PajeDefineEntityValue''. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeNewEvent}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time the event happened \\ Type & string or integer & Type of event \\ Container & string or integer & Container that produced event \\ Value & string or integer & Value of new event \\ \hline \end{tabular}% \end{center}% \caption{Fields of PajeNewEvent event} \label{f:pajenewevent} \end{figure} \subsubsection{Variables} There exist several events to set, add or subtract a value to/from a variable\index{PajeSetVariable}\index{PajeAddVariable}\index{PajeSubVariable}. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeSetVariable}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time the variable changed value\\ Type & string or integer & Type of variable \\ Container & string or integer & Container whose value changed \\ Value & double & New value of variable \\ \hline \end{tabular} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeAddVariable}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time the variable changed value\\ Type & string or integer & Type of variable \\ Container & string or integer & Container whose value changed \\ Value & double & Value to be added to variable \\ \hline \end{tabular} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeSubVariable}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time the variable changed value\\ Type & string or integer & Type of variable \\ Container & string or integer & Container whose value changed \\ Value & double & Value to be subtracted from variable \\ \hline \end{tabular}% \end{center}% \caption{Fields of events that change value of variables} \label{f:pajesetvalue} \end{figure} \subsubsection{Links} A link is defined by two events, a ``PajeStartLink''\index{PajeStartLink} and a ``PajeEndLink''\index{PajeEndLink}. These two events are matched and considered to form a link when their respective ``Container'', ``Value'' and ``Key'' fields are the same. \begin{figure}[htbp] \begin{center} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeStartLink}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time the link started\\ Type & string or integer & Type of link \\ Container & string or integer & Container that has the link \\ SourceContainer&string or integer & Container where link started \\ Value & string or integer & Value of link \\ Key & string or integer & Used to match to link end \\ \hline \end{tabular} \begin{tabular}{|LLL|} \hline \multicolumn{3}{|T|}{\textsf{\textbf{PajeEndLink}}}\\\hline \textbf{Field Name} & \textbf{Field Type} & \textbf{Description}\\ \hline Time & date & Time the link started\\ Type & string or integer & Type of link \\ Container & string or integer & Container that has the link \\ DestContainer & string or integer & Container where link ended \\ Value & string or integer & Value of link \\ Key & string or integer & Used to match to link start \\ \hline \end{tabular}% \end{center}% \caption{Fields of events that create links} \label{f:pajelink} \end{figure} \section{Example} \label{sec:example} The whole trace file of the example would be: \begin{verbatim} %EventDef PajeDefineContainerType 1 % Alias string % ContainerType string % Name string %EndEventDef %EventDef PajeDefineStateType 3 % Alias string % ContainerType string % Name string %EndEventDef %EventDef PajeDefineEntityValue 6 % Alias string % EntityType string % Name string %EndEventDef %EventDef PajeCreateContainer 7 % Time date % Alias string % Type string % Container string % Name string %EndEventDef %EventDef PajeDestroyContainer 8 % Time date % Name string % Type string %EndEventDef %EventDef PajeSetState 10 % Time date % Type string % Container string % Value string %EndEventDef 1 P 0 Program 1 T P Thread 3 S T "Thread State" 6 E S Executing 6 B S Blocked 7 0 TTP P 0 "Thread Testing Program" 7 0.986789 T1 T TTP "Thread 1" 10 0.986789 S T1 E 7 1.012332 T2 T TTP "Thread 2" 10 1.012332 S T2 E 10 2.34567 S T1 B 10 2.405678 S T2 B 10 2.456789 S T1 E 10 4.001543 S T2 E 8 4.295677 T2 T 8 4.34565 T1 T 8 4.3498 TTP P \end{verbatim} \section{Visualisation of the activity of the processors of a cluster} \label{sec:admin} The genericity of Paj made it possible to visualize the system activity of the processors of a large-sized (200 PEs) cluster of personal computers \cite{GuilloudCAS:2001}. Several visualizations were built from the system information available in the \texttt{/proc} pseudo-directory of each PE. It was thus possible to represent the processor and memory load of each PE, the most time consuming process of each PE., etc. Paj was also used to visualize the reservations of PEs by the users of the cluster, the reservations being done using the PBS system \cite{PBS} (see figure~\ref{fig:pbs}). The main bits of the Paj trace file analyzed to produce this figure are given below. \begin{figure}[ht] \epsfxsize=\linewidth %\epsfysize=5cm %\centerline{\epsfbox{FIG/pbs5.eps}} \caption{Scheduling of jobs on a large-sized cluster} \label{fig:pbs} \end{figure} \begin{verbatim} %EventDef PajeDefineContainerType 1 % Alias string % ContainerType string % Name string %EndEventDef %EventDef PajeDefineEventType 2 % Alias string % ContainerType string % Name string %EndEventDef %EventDef PajeDefineStateType 3 % Name string % ContainerType string %EndEventDef %EventDef PajeDefineEntityValue 6 % Name string % EntityType string %EndEventDef %EventDef PajeCreateContainer 7 % Time date % Alias string % Type string % Container string % Name string %EndEventDef %EventDef PajeDestroyContainer 8 % Time date % Name string % Type string %EndEventDef %EventDef PajeSetState 10 % Time date % Type string % Container string % Value string %EndEventDef 1 MG 0 M-Grappe 1 G MG Grappe 1 M G Machine 1 CPU M Processeur 3 pbs-task CPU 7 7 MG1 MG 0 M-grappe_1 7 7 G1 G MG1 Grappe_1 6 nobody pbs-task 6 chapron pbs-task 6 charao pbs-task 6 fchaussum pbs-task 6 feliot pbs-task 6 guilloud pbs-task 6 gustavo pbs-task 6 leblanc pbs-task 6 maillard pbs-task 6 mpillon pbs-task 6 paugerat pbs-task 6 plumejea pbs-task 6 romagnol pbs-task 6 sderr pbs-task 7 8 M_icluster11 M G1 M_icluster11 7 8 P_icluster11 CPU M_icluster11 P_icluster11 7 8 M_icluster21 M G1 M_icluster21 7 8 P_icluster21 CPU M_icluster21 P_icluster21 7 8 M_icluster31 M G1 M_icluster31 7 8 P_icluster31 CPU M_icluster31 P_icluster31 7 8 M_icluster41 M G1 M_icluster41 [...] 10 1 pbs-task P_icluster5 nobody 10 4273 pbs-task P_icluster5 nobody 10 5323 pbs-task P_icluster5 plumejea 10 7893 pbs-task P_icluster5 nobody 10 8277 pbs-task P_icluster5 feliot 10 8611 pbs-task P_icluster5 nobody 10 8633 pbs-task P_icluster5 feliot 10 8804 pbs-task P_icluster5 nobody 10 8836 pbs-task P_icluster5 feliot 10 9655 pbs-task P_icluster5 nobody 10 10038 pbs-task P_icluster5 feliot 10 10899 pbs-task P_icluster5 nobody 10 10930 pbs-task P_icluster5 feliot 10 10944 pbs-task P_icluster5 nobody [...] 10 438224 pbs-task P_icluster100 feliot 10 438278 pbs-task P_icluster100 nobody 10 438339 pbs-task P_icluster100 feliot 10 438713 pbs-task P_icluster100 nobody 10 665686 pbs-task P_icluster100 sderr 10 665727 pbs-task P_icluster100 nobody 8 1465976 P_icluster100 P 8 1465976 M_icluster100 M 8 1465976 G1 G 8 1465976 MG1 MG \end{verbatim} Paje-1.98/Documentation/lang-paje/conclusion.tex0000664000175000017500000000204011674062007021616 0ustar schnorrschnorr%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\chapter{Conclusion} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Paj is a versatile visualization tool which can be used in a large variety of contexts. This report describes the data format used by Paj. Paj being trace-based, the data actually used for the visualisation is to be presented as a set of execution events. In addition, a description of the type hierarchy of the visual objects needs to be included in the data (trace) file. Both the formats of the type hierarchy description and of the events being self defined, there also need to be a definition of these formats in the input data (trace) file used by Paj. The versatility property has been used so far to visualize a distributed Java application and the activity of the nodes of a large-sized cluster of PCs. To enlarge the applicability of Paj, a translator from traces produced by Tau \cite{ShendeMCLBK:1998} into the Paj format is currently being implemented. Paje-1.98/Documentation/lang-paje/extensibility.tex0000664000175000017500000006145311674062007022353 0ustar schnorrschnorr%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \chapter{Extensibility of Paj} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Introduction} The Paj visualization tool described in this article\footnote{This chapter was published \emph{in: Euro-Par 2000 Parallel Processing, Proc. 6th International Euro-Par Conference}, A.~Bode, W.~Ludwig, T.~Karl, R.~Wism\"uller (r\'ed.), \emph{LNCS}, \emph{1900}, Springer, p.~133--140, 2000.} was designed to allow programmers to visualize the executions of parallel programs using a potentially large number of communicating threads (lightweight processes) evolving dynamically. The visualization of the executions is an essential tool to help tuning applications implemented using such a parallel programming model. Visualizing a large number of threads raises a number of problems such as coping with the lack of space available on the screen to visualize them and understanding such a complex display. The graphical displays of most existing visualization tools for parallel programs \cite{Heath:1991,upshot,Kranzlmueller:1996:PPV,PALLAS,pablo,ncstrl.gatech_cc//GIT-CC-95-21,ute} show the activity of a fixed number of nodes and inter-nodes communications; it is only possible to represent the activity of a single thread of control on each of the nodes. It is of course conceivable to use these systems to visualize the activity of multi-threaded nodes, representing each thread as a node. In this case, the number of threads should be fairly limited and should not vary during the execution of the program. These visualization tools are therefore not adapted to visualize threads whose number varies continuously and life-time is often short. In addition, these tools do not support the visualization of local thread synchronizations using mutexes or semaphores. Some tools were designed to display multithreaded programs~\cite{HammondKev1995a,gthread}. However, they support a programming model involving a single level of parallelism within a node, this node being in general a shared-memory multiprocessor. Our programs execute on several nodes: within the same node, threads communicate using synchronization primitives; however, threads executing on different nodes communicate by message passing. Moreover, compared to these systems, Paj ought to represent a much larger number of objects. The most innovative feature of Paj is to combine the characteristics of interactivity and scalability with extensibility. In contrast with passive visualization tools~\cite{Heath:1991,pablo} where parallel program entities --- communications, changes in processor states, etc. --- are displayed as soon as produced and cannot be interrogated, it is possible to inspect all the objects displayed in the current screen and to move back in time, displaying past objects again. Scalability is the ability to cope with a large number of threads. Extensibility is an important characteristic of visualization tools to cope with the evolution of parallel programming interfaces and visualization techniques. Extensibility gives the possibility to extend the environment with new functionalities: processing of new types of traces, adding new graphical displays, visualizing new programming models, etc. The interactivity and scalability characteristics of Paj were described in previous articles \cite{ChassinS00,ChassinS:2000a,SteinC98}. This article focuses on the extensibility characteristics: modular design easing the addition of new modules, semantics independent modules which allow them to be used in a large variety of contexts and especially genericity of the simulator component of Paj which gives to application programmers the ability to define what they want to visualize and how it must be done. The organization of this article is the following. The next section summarizes the main functionalities of Paj. The following section describes the extensibility of Paj before the conclusion. \section{Outline of Paj} \label{sec:Paj} Paj was designed to ease performance debugging of \ath programs by visualizing their executions and because no existing visualization tool could be used to visualize such multi-threaded programs. \subsection{\ath: a thread-based parallel programming model} \label{sec:ath} Combining threads and communications is increasingly used to program irregular applications, mask communication or I/O latencies, avoid communication deadlocks, exploit shared-memory parallelism and implement remote memory accesses \cite{Fahringer:1995:UTD,FosterKT96,hicss95}. The \ath~\cite{ath0b-europar97} programming model was designed for parallel hardware systems composed of shared-memory multi-processor nodes connected by a communication network. It exploits two levels of parallelism: inter-nodes parallelism and inner parallelism within each of the nodes. The first type of parallelism is exploited by a fixed number of system-level processes while the second type is implemented by a network of communicating threads evolving dynamically. The main functionalities of \ath are dynamic local or remote thread creation and termination, sharing of memory space between the threads of the same node which can synchronize using locks or semaphores, and blocking or non-blocking message-passing communications between non local threads, using ports. Combining the main functionalities of MPI \cite{MPI} with those of \texttt{pthread} compliant libraries, \ath can be seen as a ``thread aware'' implementation of MPI. \subsection{Tracing of parallel programs} \label{sec:tracing} Execution traces are collected during an execution of the observed application, using an instrumented version of the \ath\ library. A non-intrusive, statistical method is used to estimate a precise global time reference \cite{MailletT:1995}. The events are stored in local event buffers, which are flushed when full to local event files. The collection of events into a single file is only done after the end of the user's application to avoid interfering with it. Recorded events may contain source code information in order to implement source code click-back --- from visualization to source code --- and click-forward --- from source code to visualization --- in Paj. \subsection{Visualization of threads in Paj} \label{s-spacetime} The visualization of the activity of multi-threaded nodes is mainly performed in a diagram combining in a single representation the states and communications of each thread(see figure~\ref{f-spacetime}) . % \makefigure{f-spacetime} {\includegraphics{FIG/spacetime-bact-e-2}} {Visualization of an \ath program execution} {Blocked thread states are represented in clear color; runnable states in a dark color. The smaller window shows the inspection of an event.} \makefigure{f-sema} {\includegraphics{FIG/sema-note-2}} {Visualization of semaphores} {Note the highlighting of a thread blocked state because the mouse pointer is over a semaphore blocked state, and the arrows that show the link between a ``V'' operation in a semaphore and the corresponding unblocking of a thread.} % The horizontal axis represents time while threads are displayed along the vertical axis, grouped by node. The space allocated to each node of the parallel system is dynamically adjusted to the number of visualized threads of this node. Communications are represented by arrows while the states of threads are displayed by rectangles. Colors are used to indicate either the type of a communication, or the activity of a thread. It is not the most compact or scalable representation, but it is very convenient for analyzing detailed threads relationship, load distribution and masking of communication latency. Paj deals with the scalability problem of this visualization by means of filters, discussed later in section~\ref{s-filtering}. The states of semaphores and locks are represented like the states of threads: each possible state is associated with a color, and a rectangle of this color is shown in a position corresponding to the period of time when the semaphore was in this state. Each lock is associated with a color, and a rectangle of this color is drawn close to the thread that holds it (see figure~\ref{f-sema}). \subsection{Interactivity} Progresses of the simulation are entirely driven by user-controlled time displacements: at any time during a simulation, it is possible to move forward or backward in time, within the limits of the visualized program execution. In addition, Paj offers many possible interactions to programmers: displayed objects can be inspected to obtain all the information available for them (see inspection window in figure~\ref{f-spacetime}), identify related objects or check the corresponding source code. Moving the mouse pointer over the representation of a blocked thread state highlights the corresponding semaphore state, allowing an immediate recognition (see figure \ref{f-sema}). Similarly, all threads blocked in a semaphore are highlighted when the pointer is moved over the corresponding state of the semaphore. From the visual representation of an event, it is possible to display the corresponding source code line of the parallel application being visualized. Likewise, selecting a line in the source code browser highlights the events that have been generated by this line. \subsection{Scalability: filtering of information and zooming capabilities} \label{s-filtering} It is not possible to represent simultaneously all the information that can be deduced from the execution traces. Screen space limitation is not the only reason: part of the information may not be needed all the time or cannot be represented in a graphical way or can have several graphical representations. Paj offers several filtering and zooming functionalities to help programmers cope with this large amount of information to give users a simplified, abstract view of the data. Accessing more detailed information can amount to exploding a synthetic view into a more detailed view or getting to data that exist but have not been used or are not directly related to the visualization. Figure~\ref{f-filters-group} examplifies one of the filtering facilities provided by Paj where a single line represents the number of active threads of a node and a pie graph the CPU activity in the time slice selected in the space-time diagram (see \cite{ChassinS00,ChassinS:2000a,Stein:1999}) for more details). \makefigure{f-filters-group} {\includegraphics{FIG/busy+pie}} {CPU utilization} {Grouping the threads of each node to display the state of the whole system (lighter colors mean more active threads); the pie-chart shows the percentage of the selected time slice spent with each number of active threads in each node.} \section{Extensibility} \label{sec:extensibility} Extensibility is a key property of a visualization tool. The main reason is that a visualization tool being a very complex piece of software costly to implement, its lifetime ought to be as long as possible. This will be possible only if the tool can cope with the evolutions of parallel programming models --- since this domain is still evolving rapidly --- and of the visualization techniques. Several characteristics of Paj were designed to provide a high degree of extensibility: modular architecture, flexibility of the visualization modules and genericity of the simulation module. \subsection{Modular architecture} \label{sec:modular} To favor extensibility, the architecture of Paj is a data flow graph of software modules or components (see figure~\ref{f-diagramme}). It is therefore possible to add a new visualization component or adapt to a change of trace format by changing the trace reader component without changing the remaining of the environment. This architectural choice was inspired by Pablo \cite{pablo}, although the graph of Paj is not purely data-flow for interactivity reasons: it also includes control-flow information, generated by the visualization modules to process user interactions and triggering the flow of data in the graph (see \cite{ChassinS00,ChassinS:2000a,Stein:1999} for more details on the implementation of interactivity in Paj). \makefigure{f-diagramme} {\includegraphics{FIG/struct-obj-1b-e}} {Example data-flow graph} {The trace reader produces event objects from the data read from disk. These events are used by the simulator to produce more abstract objects, like thread states, communications, etc., traveling on the arcs of the data-flow graph to be used by the other components of the environment.} \subsection{Flexibility of visualization modules} \label{sec:flexibility} The Paj visualization components have no dependency whatsoever with any parallel programming model. Prior to any visualization they receive as input the description of the types of the objects to be visualized as well as the relations between these objects and the way these objects ought to be visualized (see figure~\ref{fig:hierarchie1}). The only constraints are the hierarchical nature of the type relations between the visualized objects and the ability to place each of these objects on the time-scale of the visualization. The hierarchical type description is used by the visualization components to query objects from the preceding components in the graph. This type description can be changed to adapt to a new programming model (see section~\ref{sec:genericity}) or during a visualization, to change the visual representation of an object upon request from the user. In addition to providing a high versatility for the visualization components, this feature is used by the filtering components. When a filter is dynamically inserted in a data-flow graph --- for example between the simulation and visualization components of figure~\ref{f-diagramme} to zoom from a detailed visualization to obtain a more global view of the program execution such as figure~\ref{f-filters-group} ---, it first sends a type description of the hierarchy of objects to be visualized to the following components of the data-flow graph. \makefigure{fig:hierarchie1} {\includegraphics{FIG/hierarchya}} {Use of a simple type hierarchy} {The type hierarchy on the left-hand side of the figure defines the type hierarchical relations between the objects to be visualized and how how these objects should be represented: communications as arrows, thread events as triangles and thread states as rectangles.} The type hierarchies used in Paj are trees whose leaves are called \textit{entities}\index{entities} and intermediate nodes \textit{containers}\index{containers}. Entities are elementary objects that can be displayed such as events, thread states or communications. Containers are higher level objects used to structure the type hierarchy\index{type hierarchy} (see figure~\ref{fig:hierarchie1}). For example: all events occurring in thread~1 of node~0 belong to the container ``thread-1-of-node-0''. \subsection{Genericity of Paj} \label{sec:genericity} The modular structure of Paj as well as the fact that filter and visualization components are independent of any programming model makes it ``easy'' for tool developers to add a new component or extend an existing one. These characteristics alone would not be sufficient to use Paj to visualize various programming models if the simulation component were dependent on the programming model: visualizing a new programming model would then require to develop a new simulation component, which is still an important programming effort, reserved for experienced tool developers. On the contrary, the generic property of Paj allows application programmers to define \textit{what} they would like to visualize and \textit{how} the visualized objects should be represented by Paj. Instead of being computed by a simulation component, designed for a specific programming model such as \ath, the type hierarchy of the visualized objects (see section~\ref{sec:flexibility}) can be defined by inserting several definitions and commands in the trace file (see format in chapter~\ref{chap:format}). If --- as it is the case with the \ath-0 tracer and as it is assumed in this paper --- the tracer (see section~\ref{sec:tracing}) can collect them, these definitions and command can be inserted in the application program to be traced and visualized. The simulator uses these definitions to build a new data type tree used to relate the objects to be displayed, this tree being passed to the following modules of the data flow graph: filters and visualization components. \subsubsection{New data types definition.} One function call is available to create new types of containers while four can be used to create new types of entities which can be events, states, links and variables. An ``event''\index{event} is an entity representing an instantaneous action. ``States''\index{state} of interest are those of containers. A ``link''\index{link} represents some form of connection between a source and a destination container. A ``variable''\index{variable} stores the temporal evolution of the successive values of a data associated with a container. Table~\ref{t:defusertypes} contains the function calls that can be used to define new types of containers and entities. Figure~\ref{fig:hierarchie2} shows the effect of adding the ``threads'' container to the type hierarchy of figure~\ref{fig:hierarchie1}. \maketable{t:defusertypes} {\small \begin{tabular}{|>{\scshape}RL>{\scshape}L|} \hline \multicolumn{1}{|T}{Result}& \multicolumn{1}{T}{Call}& \multicolumn{1}{T|}{Parameters} \\ \hline ctype & pajeDefineUserContainerType & ctype name \\ \hline \hline etype & pajeDefineUserEventType & ctype name \\ etype & pajeDefineUserStateType & ctype name \\ etype & pajeDefineUserLinkType & ctype name \\ etype & pajeDefineUserVariableType & ctype name \\ \hline evalue & pajeNewUserEntityValue & etype name \\ \hline \end{tabular} } {Containers\index{container} and entities\index{entity} types definitions} {The argument \textsc{\textsf{ctype}} is the type of the father container of the newly defined type, in the type hierarchy (the container ``Execution'' being always the root of the tree of types).} % \makefigure{fig:hierarchie2} {\includegraphics{FIG/hierarchyb}}{Adding a container to the type hierarchy\index{type hierarchy} of figure~\ref{fig:hierarchie1}}{} \subsubsection{Data generation.} Several functions can be used to create containers\index{container} and entities\index{entity} whose types were defined using table~\ref{t:defusertypes} primitives. Specific functions are used to create events, states (and embedded states using \textit{Push} and \textit{Pop}), links --- each link being created by one source and one destination calls, the coupling between them being performed by the simulator when parameters \texttt{container, evalue} and \texttt{key} of both source and destination calls match --- and change the values of variables (see table~\ref{t:creationuser}). % \maketable{t:creationuser} {\small \begin{tabular}{|>{\scshape}RL>{\scshape}L|} \hline \multicolumn{1}{|T}{Result}& \multicolumn{1}{T}{Call}& \multicolumn{1}{T|}{Parameters} \\ \hline container & pajeCreateUserContainer & ctype name in-container \\ & pajeDestroyUserContainer & container \\ \hline \hline & pajeUserEvent & etype container evalue comment \\ \hline & pajeSetUserState & etype container evalue comment \\ & pajePushUserState & etype container evalue comment \\ & pajePopUserState & etype container comment \\ \hline & pajeStartUserLink & etype container srccontainer \\ & & \quad \quad evalue key comment \\ & pajeEndUserLink & etype container destcontainer \\ & & \quad \quad evalue key comment \\ \hline & pajeSetUserVariable & etype container value comment \\ & pajeAddUserVariable & etype container value comment \\ \hline \end{tabular} } {Creation of containers and entities} {Calls to these functions are inserted in the traced application to generate ``user events'' whose processing by the Paj simulator will use the type tree built from the containers and entities types definitions done using the functions of table~\ref{t:defusertypes}.} In the example of figure~\ref{f:simpleprogramtraced}, a new event is generated for each change of computation phase. This event is interpreted by the Paj simulator component to generate the corresponding container state. For example the following call indicates that the computation is entering in a ``Local computation'' phase: \\ {\small\tt\verb" pajeSetUserState ( phase_state, node, local_phase, str_iter );"}\\ The second parameter indicates the container of the state (the ``node'' whose computation has just been changed). The last parameter is a comment that can be visualized by Paj. In the example it is used to display the current iteration value. The example program of figure~\ref{f:simpleprogramtraced} includes the definitions and creations of entities ``Computation phase'', allowing the visual representation of an \ath program execution to be extended to represent the phases of the computation. Figure~\ref{f:simpleprogramvisu} includes two space-time diagrams visualizing the execution of this example program, without and with the definition of the new entities. \codefigurestart{\scriptsize\alltt \textbf{unsigned phase_state, init_phase, local_phase, global_phase; phase_state = pajeDefineUserStateType( A0_NODE, "Computation phase"); init_phase = pajeNewUserEntityValue( phase_state, "Initialization"); local_phase = pajeNewUserEntityValue( phase_state, "Local computation"); global_phase = pajeNewUserEntityValue( phase_state,"Global computation"); pajeSetUserState ( phase_state, node, init_phase, "" );} initialization(); while (!converge) \{ iter++; str_iter = itoa (iter); \textbf{pajeSetUserState ( phase_state, node, local_phase, str_iter );} local_computation(); send (local_data); receive (remote_data); \textbf{pajeSetUserState ( phase_state, node, global_phase, str_iter );} global_computation(); \} }\codefigureend{f:simpleprogramtraced} {Simplified algorithm of the example program} {The five first lines written in bold face contain the generic instructions that have to be passed to Paj through the trace file, to define a new type of state for the container \texttt{A0\_NODE}. Here it is assumed that the tracer is able to record these instructions in addition to the events of the program ( \texttt{pajeSetUserState}).} % \makefigure{f:simpleprogramvisu} {\includegraphics{FIG/simpleprogram-2}} {Visualization of the example program} {The second figure displays the entities ``Computation phases'' defined by the end-user. It is also possible to restrict the visualization to this information alone.} \section{Conclusion} \label{sec:conc} Paj provides solutions to interactively visualize the execution of parallel applications using a varying number of threads communicating by shared memory within each node and by message passing between different nodes. The most original feature of the tool is its unique combination of extensibility, interactivity and scalability properties. Extensibility means that the tool was defined to allow tool developers to add new functionalities or extend existing ones without having to change the rest of the tool. In addition, it is possible to application programmers using the tool to define what they wish to visualize and how this should be represented. To our knowledge such a generic feature was not present in any previous visualization tool for parallel programs executions. The genericity property of Paj was used to visualize \ath-1 programs executions without having to perform any new development in Paj. \ath-1 is a high level parallel programming model where parallelism is expressed by asynchronous task creations whose scheduling is performed automatically by the run-time system \cite{a1-europar98,a1-pact98}. The runtime system of \ath-1 is implemented using \ath. By extending the type hierarchy defined for \ath and inserting few instructions to the \ath-1 implementation, it was possible to visualize where the time was spent during \ath-1 computations: computing the user program, managing the task graph or scheduling the user-defined tasks. Further developments include simplifying the generic description and creation of visual objects, currently more complex when the generic simulator is used instead of a specialized one. The generation of traces for other thread-based programming models such as Java will also be investigated to further validate the flexibility of Paj. Paje-1.98/Documentation/lang-paje/intro.tex0000664000175000017500000000756111674062007020612 0ustar schnorrschnorr%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \chapter{Introduction} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% This report defines the input data format used by the Paj visualization tool. Paj is a versatile trace-based visualization tool designed to help performance debugging of large-sized parallel applications. From trace files, recorded during the execution of parallel programs, Paj builds a graphical representation of the behavior of these programs, to help programmers identify their ``performance errors''. The main novelty of Paj is an original combination of three of the most desirable properties of visualisation tools for parallel programs: extensibility, interactivity and scalability. Scalability is the ability to represent the execution of parallel programs executing during long periods on large-sized systems; it is provided in Paj by zooming and filtering functionalities, both in space --- ability to synthesize the information originating from several nodes of the system or to zoom in one of these nodes --- and in time --- possibility to display period of time at various levels of detail. Interactivity is the ability to interrogate visual objects --- events, thread states, communications, etc. --- to obtain more details or check the source code whose execution produced a given event; it is also the ability to move back and forth in time or to zoom from a synthetic representation to a detailed one or vice versa or to set or reset a filter. Extensibility is the possibility ot extend the tool with new functionalities --- visual representations, filters, etc. --- or to display new programming models. Several characteristics of Paj contribute to its extensibility: careful modular design, independence of the visualization modules from the programming model. Key to the ability to build a visual representation of the behavior of parallel programs, developed with various programming models, is the \textit{genericity} of Paj: ability to parameterize the tools with a description of \textit{what} is to be represented and \textit{how}. This description is provided in the trace file as a hierarchy of the types of objects appearing in the visualization. The format of this description as well as the format of the events of the trace are also described in the trace file. The trace files\index{trace file} used as input by Paj thus contain four categories of data: \begin{enumerate} \item Description of the format of the generic instructions. \item Generic instructions, describing the hierarchy of the types of objects appearing in the visualization. \item Description of the format of the events recorded during the execution of the visualized program. \item Events recorded during the execution of the program to be visualized. \end{enumerate} The aim of this technical report is to describe the Paj trace data format. The organization of the report is the following. After this introduction, the extensibility and genericity of Paj are described in detail. The following section defines the Paj data format and gives an example of use before the conclusion. %Paj is an interactive visualization tool originally designed for %displaying the execution of parallel applications where a %(potentially) large number of communicating threads of various %life-times execute on each node of a distributed memory parallel %system. To be easier %to extend, Paj was designed as a data-flow graph of modular %components, most of them being independent of the semantics of the %parallel programming model of the visualized parallel programs. In %addition, application programmers can tailor the visualization to %their needs, without having to know any insight nor to modify any %component of Paj. This can be done by defining the type hierarchy of %objects to be visualized as well as how these objects should be %visualized. Paje-1.98/Documentation/lang-paje/lang-paje.bib0000664000175000017500000005364711674062007021257 0ustar schnorrschnorr@INPROCEEDINGS{ BPT96, AUTHOR = {Bernard, P.-E. and Plateau, B. and Trystram, D.}, TITLE = {{Using Threads for developing Parallel Applications: Molecular Dynamics as a case study.}}, YEAR = 1996, PAGES = {3--16}, MONTH = sep, EDITOR = {Trobec, R.}, ADDRESS = {Gozd Martuljek, Slovenia}, BOOKTITLE = {Parallel Numerics}, KEY = 4 } @InProceedings{ShendeMCLBK:1998, author = {Shende, S. and Malony, A. D. and Cuny, J. and Lindlan, K. and Beckman, P. and Karmesin, S. }, title = {Portable Profiling and Tracing for Parallel Scientific Applications using C++}, booktitle = {Proceedings of SPDT'98: ACM SIGMETRICS Symposium on Parallel and Distributed Tools}, pages = {134-145}, year = 1998, month = {Aug} } @Article{ChassinS00, author = {Chassin de Kergommeaux, J. and de Oliveira Stein, B. and Bernard, P.E.}, title = {Paj\'e, an interactive visualization tool for tuning multi-threaded parallel applications}, journal = {Parallel Computing}, year = 2000, volume = 26, number = 10, pages = {1253-1274}, month = {aug} } @InProceedings{ChassinS:2000, author = {Chassin de Kergommeaux, J. and de Oliveira Stein, B.}, title = {Paj\'e: an Extensible Environment for Visualizing Multi-Threaded Programs Executions}, booktitle = {Euro-Par 2000 Parallel Processing, Proc. 6th International Euro-Par Conference}, pages = {133--140}, year = 2000, editor = {Bode, A. and Ludwig, T. Karl, W. and Wism\"uller, R.}, volume = 1900, series = {LNCS}, publisher = {Springer} } @TechReport{ChassinS:2000a, author = {Chassin de Kergommeaux, J. and Stein, B. de Oliveira}, title = {Paj, an Extensible and Interactive and Scalable Environment for Visualizing Parallel Program Executions}, institution = {INRIA Rhone-Alpes}, year = 2000, type = {Rapport de Recherche}, number = {RR-3919}, month = {april}, note = {http://www.inria.fr/RRRT/publications-fra.html} } @TECHREPORT{ClemenconChr1996c, author = "Christian Cl\'emen\c{c}on and Akiyoshi Endo and Josef Fritscher and Andreas M{\"u}ller and Brian J. N. Wylie", institution = "Centro Svizzero di Calcolo Scientifico", title = "Annai scalable run-time support for interactive debugging and performance analysis of large-scale parallel programs", year = "1996", abstract-url = "http://www.cscs.ch/Official/SoftwareTech/CSCS-NEC/pubs_abs.html#tec:9604", address = "CH-6928 Manno, Switzerland", url = "ftp://ftp.cscs.ch/pub/CSCS/techreports/1996/TR-96-04.ps.gz", keywords = "parallel program development environment; integrated tools and run-time support libraries; distributed data management and visualization;multi-level execution performance data browsing; HPF and MPI", month = apr, number = "CSCS-TR-96-04", type = "Technical Report", scope = "f90", } @INPROCEEDINGS{Fahringer:1995:UTD, author = "T. Fahringer and M. Haines and P. Mehrotra", title = "On the Utility of Threads for Data Parallel Programming", booktitle = "{Conf. proc. of the 9th Int. Conference on Supercomputing, Barcelona, Spain, 1995}", publisher = "ACM Press, New York, NY 10036, USA", pages = "51--59", year = "1995", bibdate = "Mon Aug 26 10:38:41 MDT 1996", acknowledgement = ack-nhfb, } @Misc{PBS, author = {Veridian Systems}, title = {Portable Batch System - OpenPBS Release 2.3 - Administrator Guide}, howpublished = {http://pbs.mrj.com}, year = 2000 } @ARTICLE{FosterKT96, AUTHOR = {Foster, I and Kesselman, C. and Tuecke, S.}, JOURNAL = {Journal of Parallel and Distributed Computing}, NUMBER = 1, PAGES = {70--82}, TITLE = {The Nexus Approach to Integrating Multithreading and Communication}, VOLUME = 37, YEAR = 1996, MONTH = aug } @InProceedings{GuilloudCAS:2001, author = {Guilloud, C. and Chassin de Kergommeaux, J and Augerat, P. and Stein, B.}, title = {Outil visuel d'administration systme pour grappe de processeurs de grande taille}, booktitle = {RenPar'13, 13i\`emes Rencontres Francophones du Parall\'elisme des Architectures et des Syst\`emes}, pages = {163--168}, year = 2001, address = {Paris} } @ARTICLE{Hackstadt:1994:NPP, author = "S. T. Hackstadt and A. D. Malony", title = "Next-Generation Parallel Performance Visualization: {A} Prototyping Environment for Visualization Development", journal = "Lecture Notes in Computer Science", volume = "817", pages = "192--??", year = "1994", coden = "LNCSD9", ISSN = "0302-9743", bibdate = "Mon May 13 11:52:14 MDT 1996", acknowledgement = ack-nhfb, } @INPROCEEDINGS{HackstadtS94a, author = "S. Hackstadt and A. Malony and B. Mohr", booktitle = "Proceedings of the Scalable High Performance Computing Conference (SHPCC)", title = "Scalable Performance Visualization for Data-Parallel Programs", year = "94", abstract-url = "http://www.cs.uoregon.edu/~hacks/research/papers/SHPCC94/SHPCC94.html", address = "Knoxville, Tennessee", url = "ftp://ftp.cs.uoregon.edu/pub/malony/Papers/shpcc94.ps.gz", keywords = "parallel C++", month = may, scope = "vis", } @INPROCEEDINGS{ HammondKev1995a, AUTHOR = {Kevin Hammond and Hans Loidl and Andrew Partridge}, TITLE = {Visualising granularity in parallel programs: {A} graphical winnowing system for Haskell}, YEAR = 1995, PAGES = {208--221}, MONTH = apr, EDITOR = {A. P. Wim Bohm and John T. Feo}, BOOKTITLE = {High Performance Functional Computing} } @ARTICLE{Heath:1991, AUTHOR = {M. T. Heath}, TITLE = {Visualizing the performance of parallel programs}, JOURNAL = {IEEE Software}, YEAR = 1991, VOLUME = 8, NUMBER = 4, PAGES = {29--39} } @ARTICLE{Heath:1995:PPV, author = "Michael T. Heath and Allen D. Malony and Diane T. Rover", title = "Parallel Performance Visualization: From Practice to Theory", journal = "IEEE parallel and distributed technology: systems and applications", volume = "3", number = "4", pages = "44--60", month = "Winter", year = "1995", coden = "IPDTEX", ISSN = "1063-6552", bibdate = "Fri Apr 11 07:24:28 MDT 1997", acknowledgement = ack-nhfb, affiliation = "Univ of Illinois at Urbana-Champaign", affiliationaddress = "Urbana, IL, USA", classification = "722.4; 723.5; 731; 921.6; C6110P (Parallel programming); C6115 (Programming support); C6130B (Graphics techniques); C6150N (Distributed systems software); C7430 (Computer engineering)", corpsource = "Illinois Univ., Urbana, IL, USA", journalabr = "IEEE Parallel Distrib Technol", keywords = "abstract model; Computational methods; Computer simulation; data visualisation; engineering graphics; evaluation models; parallel; Parallel performance visualization; Parallel processing systems; parallel program performance visualization; Performance; performance; performance data; performance displays; programming; software; software performance evaluation; software tools; systems analysis; Three dimensional computer graphics; tools; user centred design; user involvement; Visualization; visualization", treatment = "P Practical", } @ARTICLE{HeathMR:1995, AUTHOR = {M. T. Heath and A. D. Malony and D. T. Rover}, TITLE = {Parallel performance visualization: From practice to theory}, JOURNAL = {IEEE Parallel and Distributed Technology}, YEAR = 1995, VOLUME = 3, NUMBER = 4, PAGES = {44--60} } @ARTICLE{JZDM94, AUTHOR = {R.H. Jacobson. and X.-J. Zhang and R.F. DuBose and B.W.Matthews}, JOURNAL = {Nature}, PAGES = {761-766}, TITLE = {{Three-dimensional Structure of $\beta$-galactosidase from {\em E.coli}.}}, VOLUME = {369}, YEAR = {1986} } @INPROCEEDINGS{ Kranzlmueller:1996:ATEMPT, AUTHOR = {D. Kranzlmueller and S. Grabner and J. Volkert}, TITLE = {Debugging massively parallel programs with {ATEMPT}}, YEAR = 1996, VOLUME = 1067, PAGES = {806--811}, MONTH = apr, EDITOR = {H. Liddell and A. Colbrook and B. Hertzberger and P. Sloot}, PUBLISHER = {Springer Verlag}, SERIES = {Lecture Notes in Computer Science}, BOOKTITLE = {High-Performance Computing and Networking} } @INPROCEEDINGS{ Kranzlmueller:1996:PPV, AUTHOR = {D. Kranzlmueller and R. Koppler and S. Grabner and C. Holzner}, TITLE = {Parallel Program Visualization with {MUCH}}, YEAR = 1996, VOLUME = 1127, PAGES = {148--160}, MONTH = sep, EDITOR = {L. Boeszoermenyi}, PUBLISHER = {Springer Verlag}, SERIES = {Lecture Notes in Computer Science}, BOOKTITLE = {Third International ACPC Conference} } @TECHREPORT{MPI, AUTHOR = {{MPI Forum}}, INSTITUTION = {University of Tennessee, Knoxville, USA}, TITLE = {{MPI}: a Message-Passing Interface Standard}, YEAR = {1995} } @ARTICLE{MailletT:1995, AUTHOR = {Maillet, {\'E}. and Tron, C.}, JOURNAL = {{J}ournal of {P}arallel and {D}istributed {C}omputing}, MONTH = jul, PAGES = {84-93}, TITLE = {{O}n {E}fficiently {I}mplementing {G}lobal {T}ime for {P}erformance { E}valuation on {M}ultiprocessor {S}ystems}, VOLUME = {28}, YEAR = {1995} } @ARTICLE{Malony:1991:TTV, author = "Allen Malony and David Hammerslag and David Jablonowski", title = "{Traceview}: a Trace Visualization Tool", journal = "IEEE Software", volume = "8", number = "5", pages = "19--28", month = sep, year = "1991", coden = "IESOEG", ISSN = "0740-7459", bibdate = "Tue Jan 9 17:09:45 MST 1996", acknowledgement = ack-nhfb, } @ARTICLE{Malony:1997:STE, author = "A. D. Malony and B. Tourancheau", title = "Support Tools and Environments", journal = "Lecture Notes in Computer Science", volume = "1300", pages = "87--??", year = "1997", coden = "LNCSD9", ISSN = "0302-9743", bibdate = "Tue Apr 28 08:51:33 MDT 1998", acknowledgement = ack-nhfb, } @ARTICLE{Miller:1995:PPP, author = "Barton P. Miller and Mark D. Callaghan and Jonathan M. Cargille and Jeffrey K. Hollingsworth and R. Bruce Irvin and Karen L. Karavanic and Krishna Kunchithapadam and Tia Newhall", title = "The {Paradyn} Parallel Performance Measurement Tool", journal = "Computer", volume = "28", number = "11", pages = "37--46", month = nov, year = "1995", coden = "CPTRB4", ISSN = "0018-9162", bibdate = "Mon Feb 3 07:21:26 MST 1997", acknowledgement = ack-nhfb, affiliation = "Wisconsin Univ., Madison, WI, USA", affiliationaddress = "Madison, USA", classification = "722.2; 722.4; 723; 723.1; 723.1.1; 723.5; C6110P (Parallel programming); C6150N (Distributed systems software)", journalabr = "Computer", keywords = "Automatic instrumentation control; Color computer graphics; Computer aided software engineering; Computer software selection and evaluation; Data abstraction; Dynamic instrumentation; Flexible performance information; High level languages; Insertion; Large-scale parallel program; Paradyn parallel performance measurement tool; Parallel performance; Parallel processing systems; Performance; Performance Consultant; Synchronization; User interfaces; Visualization", thesaurus = "Parallel programming; Software performance evaluation; Software tools", } @Unpublished{OttogaliOSCV:2001, author = {Ottogali, F.-G. and Olive, V. and Stein, B. de Oliveira and Chassin de Kergommeaux, J. and Vincent, J.-M.}, title = {Visualization of distributed Java applications for performance debugging}, note = {Accept ICCS 2001: Tools and Environments for Parallel and Distributed Programming} } @INPROCEEDINGS{ PALLAS, AUTHOR = {Krotz-Vogel, W. and Hoppe, H-C.}, TITLE = {The {PALLAS} Portable Parallel Programming Environment}, YEAR = 1996, VOLUME = 1124, PAGES = {899--906}, PUBLISHER = {Springer Verlag}, SERIES = {Lecture Notes in Computer Science}, ADDRESS = {Lyon, France}, BOOKTITLE = {Sec. Int. Euro-Par Conference}, } @ARTICLE{PVM, AUTHOR = {Sunderam, V.S.}, JOURNAL = {Concurrency: Practice and Experience}, MONTH = dec, NUMBER = {4}, PAGES = {315--339}, TITLE = {{PVM}: {A} {F}ramework for {P}arallel {D}istributed {C}omputing}, VOLUME = {2}, YEAR = {1990} } @PhdThesis{Stein:1999, author = {de Oliveira Stein, B.}, title = {Visualisation interactive et extensible de programmes parallles base de processus lgers}, school = {Universit Joseph Fourier}, year = 1999, address = {Grenoble}, note = {In French. http://www-mediatheque.imag.fr} } @INPROCEEDINGS{SteinC98, AUTHOR = {de Oliveira Stein, B. and Chassin de Kergommeaux, J.}, BOOKTITLE = {Parallel Computing: Fundamentals, Applications and New Directions}, PUBLISHER = {Elsevier}, TITLE = {Interactive Visualisation Environment of Multi-threaded parallel programs}, PAGES = {311--318}, YEAR = {1998} } @ARTICLE{Yan:1995:PMV, author = "Jerry Yan and Sekhar Sarukkai and Pankaj Mehra", title = "Performance Measurement, Visualization and Modeling of Parallel and Distributed Programs using the {AIMS} Toolkit", journal = "Soft\-ware---Prac\-tice and Experience", volume = "25", number = "4", pages = "429--461", month = apr, year = "1995", coden = "SPEXBL", ISSN = "0038-0644", bibdate = "Sat May 31 13:36:16 MDT 1997", acknowledgement = ack-nhfb, } @Inproceedings{ a1-europar98, Author = {G. G. H. Cavalheiro and Y. Denneulin and J.-L. Roch}, Title = {A General Modular Specification for Distributed Schedulers}, Year = 1998, Month = sep, Editor = {Springer Verlag, LNCS 980}, Address = {Southampton, England}, Booktitle = {Proceedings of Europar'98} } @Inproceedings{ a1-pact98, Author = {F. Galil{\'e}e and J.-L. Roch and G. G. H. Cavalheiro and M. Doreille}, Title = {Athapascan-1: On-Line Building Data Flow Graph in a Parallel Language}, Year = 1998, Month = oct, Address = {Paris, France}, Booktitle = {{PACT}'98}, Note = {http://www-apache.imag.fr}} @TECHREPORT{ apache, AUTHOR = {Brigitte Plateau and others}, TITLE = {Pr\'esentation d'{APACHE}}, YEAR = 1993, NUMBER = 1, MONTH = oct, ADDRESS = {Grenoble}, TYPE = {Rapport APACHE}, INSTITUTION = {IMAG}, NOTE = {http://www-apache.imag.fr/apache} } @PHDTHESIS{ arrouye, AUTHOR = {Yves Arrouye}, TITLE = {Environnements de visualisation pour l'{\'e}valuation des performances des syst{\`e}mes parall{\`e}les: {\'e}tude, conception et r{\'e}alisation}, YEAR = 1995, MONTH = nov, SCHOOL = {INPG} } @UNPUBLISHED{ ath0b, AUTHOR = {Jacques Briat and Ilan Ginzburg and Marcelo Pasin}, TITLE = {Athapascan0b User Manual}, YEAR = 1996, MONTH = oct, NOTE = {http://navajo.imag.fr/ath0b/a0b-usr.html} } @INPROCEEDINGS{ ath0b-europar97, AUTHOR = {Jacques Briat and Ilan Ginzburg and Marcelo Pasin and Brigitte Plateau}, TITLE = {Athapascan runtime: efficiency for irregular problems}, YEAR = 1997, VOLUME = 1300, PAGES = {591--600}, MONTH = aug, EDITOR = {Christian Lengauer and others}, PUBLISHER = {Springer}, SERIES = {LNCS}, BOOKTITLE = {EURO-PAR'97 Parallel Processing} } @UNPUBLISHED{ ath1, AUTHOR = {Jean-Louis Roch and Mathias Doreille and Gerson Cavalheiro}, TITLE = {Athapascan-1b User Manual}, YEAR = 1996, NOTE = {http://navajo.imag.fr/ath1/ps/DocAth1.ps.gz} } @INPROCEEDINGS{ correct-intrusion, AUTHOR = {Florin Teodorescu and Jacques Chassin de Kergommeaux}, TITLE = {On correcting the intrusion of tracing nondeterministic programs by software}, YEAR = 1997, VOLUME = 1300, PAGES = {94-101}, MONTH = aug, EDITOR = {Christian Lengauer and others}, PUBLISHER = {Springer}, SERIES = {LNCS}, BOOKTITLE = {EURO-PAR'97 Parallel Processing} } @MISC{ debugger-unl, AUTHOR = {Jos{\'e} C. Cunha and Jo{\~a}o Louren{\c c}o and Tiago Ant{\~a}o}, TITLE = {A Debugging Engine for a Parallel and Distributed Environment}, YEAR = 1997, HOWPUBLISHED = {{\`a} para{\^\i}tre dans Parallel Computing}, NOTE = {ftp://ftp.cpc.wmin.ac.uk/pub/sepp/P5/appendix-C1.ps.gz} } @ARTICLE{ debugger-unl-2, AUTHOR = {P{\'e}ter Kacsuk and Jos{\'e} C. Cunha and G{\'a}bor D{\'o}zsa and Jo{\~a}o Louren{\c c}o and Tibor Fadgyas and Tiago Ant{\~a}o}, TITLE = {A graphical development and debugging environment for parallel programs}, JOURNAL = {Parallel Computing}, YEAR = 1997, VOLUME = 22, NUMBER = 13, PAGES = {1747--1770}, MONTH = feb, HOWPUBLISHED = {{\`a} para{\^\i}tre dans Parallel Computing} } @ARTICLE{ debugger-unl-3, AUTHOR = {Jos{\'e} C. Cunha and Jo{\~a}o Louren{\c c}o}, TITLE = {An Experiment in Tool Integration: the {DDBG} Parallel and Distributed Debugger.}, JOURNAL = {EUROMICRO Journal of Systems Architecture, 2$^{\mbox{\small nd}}$ Special Issue on Tools and Environments for Parallel Processing}, YEAR = 1997, HOWPUBLISHED = {{\`a} para{\^\i}tre dans Parallel Computing} } @MISC{ eve, AUTHOR = {Yves Arrouye}, TITLE = {The {EVE} Extensible Visual Environment}, YEAR = 1995, MONTH = mar, NOTE = {LMC-IMAG, 100, rue des math{\'e}matiques, Campus, 38041 Grenoble, France} } @TECHREPORT{ gthread, AUTHOR = {Qiang A. Zhao and John T. Stasko}, TITLE = {Visualizing the Execution of Threads-based Parallel Programs}, YEAR = 1995, NUMBER = {GIT-GVU-95-01}, INSTITUTION = {Georgia Institute of Technology} } @INPROCEEDINGS{hicss95, author = "M. Haines and W. B{\"o}hm", title = "An Initial Comparison of Implicit and Explicit Programming Styles for Distributed Memory Multiprocessors", pages = "379--389", editor = "Hesham El-Rewini and Bruce D. Shriver", booktitle = "Proc. 28th Annual Hawaii Int. Conf. on System Sciences. Volume 2: Software Technology", month = jan, publisher = "IEEE Computer Society Press", address = "Los Alamitos, CA, USA", year = 1995, } @TECHREPORT{ ncstrl.gatech_cc//GIT-CC-95-21, AUTHOR = {Brad Topol and John T. Stasko and Vaidy Sunderam}, TITLE = {The Dual Timestamping Methodology for Visualizing Distributed Applications}, YEAR = 1995, NUMBER = {GIT-CC-95-21}, MONTH = may, TYPE = {Technical Report}, INSTITUTION = {Georgia Institute of Technology. College of Computing} } @TECHREPORT{ ncstrl.gatech_cc//GIT-CC-96-10, AUTHOR = {Brad Topol and John T. Stasko and Vaidy Sunderam}, TITLE = {Monitoring and Visualization in Cluster Environments}, YEAR = 1996, NUMBER = {GIT-CC-96-10}, MONTH = mar, TYPE = {Technical Report}, INSTITUTION = {Georgia Institute of Technology. College of Computing} } @MANUAL{ntv, AUTHOR = {Louis Lopez}, TITLE = {The NAS Trace Visualizer (NTV) Rel. 1.2 User's Guide}, YEAR = 1995, MONTH = sep, NOTE = {http://science.nas.nasa.gov/Pubs/TechReports/NASreports/NAS-95-018/NAS-95-018.ps} } @INPROCEEDINGS{pablo, AUTHOR = {D. A. Reed and others}, TITLE = {{Scalable Performance Analysis: The Pablo Performance Analysis Environment}}, YEAR = 1993, PAGES = {104--113}, EDITOR = {Anthony Skjellum}, PUBLISHER = {IEEE Computer Society}, BOOKTITLE = {Proceedings of the Scalable Parallel Libraries Conference}, INSTITUTION = {Department of Computer Science, University of Illinois} } @TECHREPORT{ pablo-old, AUTHOR = {D. A. Reed and others}, TITLE = {{An Overview of the Pablo Performance Analysis Environment}}, YEAR = 1992, INSTITUTION = {Department of Computer Science, University of Illinois} } @MANUAL{ paragraph, AUTHOR = {M. T. Heath and J. E. Finger}, TITLE = {Paragraph: A Tool for Vizualizing Performance of Parallel Programs}, YEAR = 1994, INSTITUTION = {Oak Ridge National Laboratory} } @ARTICLE{ scope, AUTHOR = {Yves Arrouye}, TITLE = {Environnements de visualisation pour l'{\'e}valuation des performances des syst{\`e}mes parall{\`e}les: {\'e}tude, conception et r{\'e}alisation}, JOURNAL = {Microprocessing and Microprogramming Journal}, YEAR = 1995, MONTH = dec, SCHOOL = {INPG} } @Techreport{sddf, AUTHOR = {Ruth A. Aydt}, TITLE = {The Pablo Self-Defining Data Format}, YEAR = 1992, INSTITUTION = {University of Illinois at Urbana Champaign}, abstract-url = {http://www-pablo.cs.uiuc.edu/Publications/Documents/documents.htm} } @PHDTHESIS{ these-Ilan, AUTHOR = {Ilan~Ginzburg}, TITLE = {Athapascan-0b~:~Int{\'e}gration~efficace~et~portable~de~mul\-ti\-pro\-gram- ma\-tion~l{\'e}\-g{\`e}\-re et de communications}, YEAR = 1997, MONTH = sep, SCHOOL = {INPG}, NOTE = {In French} } @MISC{ upshot, AUTHOR = {Virginia Herrarte and Ewing Lusk}, TITLE = {Studying Parallel Program Behavior with Upshot}, YEAR = 1992, NOTE = {http://www.mcs.anl.gov/home/lusk/upshot/upshotman/upshot.html} } @MANUAL{ ute, AUTHOR = {C. E. Wu and H. Franke}, TITLE = {UTE User's Guide for IBM SP Systems}, YEAR = 1995, NOTE = {http://www.research.ibm.com/people/w/wu/uteug.ps.Z} } } Paje-1.98/Documentation/UserManual/0000775000175000017500000000000011674062007017142 5ustar schnorrschnorrPaje-1.98/Documentation/UserManual/user.tex0000664000175000017500000000267011674062007020647 0ustar schnorrschnorr\documentclass[a4paper,twoside]{article} \usepackage{fullpage} \usepackage{graphics} \usepackage{xspace} \usepackage{alltt} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \setcounter{secnumdepth}{3} %% pour numroter les subsubsections \setcounter{tocdepth}{3} %% profondeur dans la table des matires \usepackage{times} \title{Paj User Manual} \author{Benhur Stein} \newenvironment{code}{\begin{alltt}}{\end{alltt}} \begin{document} \newcommand{\menu}[1]{\fbox{#1}} \maketitle \section{Starting the application} To execute Paj, the GNUstep environment must have been set previously, with either \begin{code} source \emph{gnustep_path}/System/Makefiles/GNUstep.sh \end{code} or \begin{code} source \emph{gnustep_path}/System/Makefiles/GNUstep.csh \end{code} depending on your shell. Then, the command \begin{code} openapp Paje \end{code} will execute it. Once started, the \menu{Open...} menu option can be used to open a file. Alternatively, the command \begin{code} gopen \emph{file.trace} \end{code} will execute Paj and make it open the trace file \emph{file.trace}. \section{Navegating the trace file} The main visualization window is composed of three parts: \begin{itemize} \item space-time diagram; \item status area; \item zooming buttons. \end{itemize} \subsection{Space-time diagram} \subsection{Status area} \subsection{Zooming buttons} \section{Customizing the space-time view} \section{Using Filters} \end{document} Paje-1.98/Documentation/UserManual/Makefile0000664000175000017500000000002611674062007020600 0ustar schnorrschnorr include ../latex.mk Paje-1.98/Documentation/latex.mk0000664000175000017500000000050211674062007016531 0ustar schnorrschnorr LATEX_FILES?=$(wildcard *.tex) LATEX_MASTER?=$(LATEX_FILES) all: $(LATEX_MASTER:%.tex=%.ps) %.pdf: %.dvi dvipdf $* %.ps: %.dvi dvips $* -o %.dvi: %.tex latex $*.tex .PHONY: clean clean:: $(RM) $(foreach suffix,.log .aux .toc .bbl .blg .ind .idx .ilg .dvi .ps, \ $(addsuffix $(suffix),$(LATEX_FILES:%.tex=%))) Paje-1.98/EntityTypeFilter/0000775000175000017500000000000011674062007015541 5ustar schnorrschnorrPaje-1.98/EntityTypeFilter/EntityTypeSelector.m0000664000175000017500000004443711674062007021552 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* EntityTypeSelector.m created by benhur on Sat 14-Jun-1997 */ #include "EntityTypeSelector.h" #include "../General/FoundationAdditions.h" #include "../General/UniqueString.h" #include "../General/Macros.h" #include "../General/ColoredSwitchButtonCell.h" @implementation EntityTypeSelector - (id)initWithController:(PajeTraceController *)c { NSWindow *win; [super initWithController:c]; filters = [[NSMutableDictionary alloc] init]; hiddenEntityTypes = [[NSMutableSet alloc] init]; if (![NSBundle loadNibNamed:@"EntityTypeSelector" owner:self]) { NSRunAlertPanel(@"EntityTypeSelector", @"Couldn't load interface file", nil, nil, nil); return self; } win = [view window]; // view is an NSBox. we need its contents. view = [[(NSBox *)view contentView] retain]; [matrix registerForDraggedTypes:[NSArray arrayWithObject:NSColorPboardType]]; [matrix setDelegate:self]; #ifdef __APPLE__ ColoredSwitchButtonCell *protoCell; protoCell = [[ColoredSwitchButtonCell alloc] init]; [matrix setPrototype:protoCell]; [protoCell release]; #else [matrix setCellClass:[ColoredSwitchButtonCell class]]; #endif [entityTypePopUp removeAllItems]; [self registerFilter:self]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(filterEntityValueNotification:) name:@"PajeFilterEntityValueNotification" object:nil]; #ifndef GNUSTEP [win release]; #endif return self; } - (void)dealloc { [entityTypePopUp removeAllItems]; [filters release]; [hiddenEntityTypes release]; [view release]; [super dealloc]; } - (NSView *)filterView { return view; } - (NSString *)filterName { return @"Entity Type Selector"; } - (id)filterDelegate { return self; } // // Notifications sent by other filters // - (void)hierarchyChanged { PajeEntityType *entityType; NSEnumerator *typeEnum; typeEnum = [[self allEntityTypes] objectEnumerator]; while ((entityType = [typeEnum nextObject]) != nil) { if (![self isContainerEntityType:entityType]) { [self setFilterForEntityType:entityType]; } } [self synchronizeMatrix]; [super hierarchyChanged]; } - (void)colorChangedForEntityType:(PajeEntityType *)entityType { if (entityType == nil || [entityType isEqual:[self selectedEntityType]]) { [self synchronizeMatrix]; } [super colorChangedForEntityType:entityType]; } // // // - (BOOL)isRegisteredAsHiddenEntityType:(PajeEntityType *)entityType { NSString *defaultKey; defaultKey = [[entityType description] stringByAppendingString:@" Hide"]; return [[NSUserDefaults standardUserDefaults] boolForKey:defaultKey]; } - (void)setFilterForEntityType:(PajeEntityType *)entityType // a new entity type is known. create a new filter for it. { NSMutableSet *filter; NSParameterAssert(entityType); filter = [filters objectForKey:entityType]; if (nil == filter) { filter = [self defaultFilterForEntityType:entityType]; [filters setObject:filter forKey:entityType]; [entityTypePopUp addItemWithTitle:[entityType description]]; [[entityTypePopUp lastItem] setRepresentedObject:entityType]; #ifdef GNUSTEP [entityTypePopUp setEnabled:YES]; #endif } if ([self isRegisteredAsHiddenEntityType:entityType]) { [hiddenEntityTypes addObject:entityType]; } else { [hiddenEntityTypes removeObject:entityType]; } } - (void)setHidden:(BOOL)hidden entityType:(PajeEntityType *)entityType { NSString *defaultKey; defaultKey = [[entityType description] stringByAppendingString:@" Hide"]; if (hidden) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:defaultKey]; [hiddenEntityTypes addObject:entityType]; } else { [[NSUserDefaults standardUserDefaults] removeObjectForKey:defaultKey]; [hiddenEntityTypes removeObject:entityType]; } } - (NSMutableSet *)defaultFilterForEntityType:(PajeEntityType *)entityType { NSString *defaultName = [NSString stringWithFormat:@"%@%@Filter", NSStringFromClass([self class]), [entityType description]]; NSArray *filterArray = [[NSUserDefaults standardUserDefaults] arrayForKey:defaultName]; NSMutableSet *uniqueSet; NSEnumerator *filterEnum; NSString *s; #ifdef GNUSTEP uniqueSet = [[[NSMutableSet alloc] init] autorelease]; #else uniqueSet = [NSMutableSet set]; #endif filterEnum = [filterArray objectEnumerator]; while ((s = [filterEnum nextObject]) != nil) { [uniqueSet addObject:U(s)]; } return uniqueSet; } - (void)registerDefaultFilter:(NSSet *)filter forEntityType:(PajeEntityType *)entityType { NSString *defaultName = [NSString stringWithFormat:@"%@%@Filter", NSStringFromClass([self class]), [entityType description]]; NSArray *filterArray = [filter allObjects]; [[NSUserDefaults standardUserDefaults] setObject:filterArray forKey:defaultName]; } - (PajeEntityType *)selectedEntityType { if ([entityTypePopUp selectedItem] == nil) { [entityTypePopUp selectItemAtIndex:0]; } return [[entityTypePopUp selectedItem] representedObject]; } // // Handle interface messages // - (void)selectAll:(id)sender { PajeEntityType *entityType = [self selectedEntityType]; NSMutableSet *filter = [filters objectForKey:entityType]; if (filter != nil) { [filter removeAllObjects]; [self synchronizeMatrix]; [self registerDefaultFilter:filter forEntityType:entityType]; [super dataChangedForEntityType:entityType]; } else { [NSException raise:@"EntityTypeSelector: Internal Inconsistency" format:@"%@ sent by unknown view %@", NSStringFromSelector(_cmd), sender]; } } - (NSArray *)unfilteredObjectsForEntityType:(PajeEntityType *)entityType { return [super allValuesForEntityType:entityType]; } - (void)unselectAll:(id)sender { PajeEntityType *entityType = [self selectedEntityType]; NSMutableSet *filter = [filters objectForKey:entityType]; if (filter != nil) { [filter addObjectsFromArray: [self unfilteredObjectsForEntityType:entityType]]; [self synchronizeMatrix]; [self registerDefaultFilter:filter forEntityType:entityType]; [super dataChangedForEntityType:entityType]; } else { [NSException raise:@"EntityTypeSelector: Internal Inconsistency" format:@"%@ sent by unknown view %@", NSStringFromSelector(_cmd), sender]; } } - (IBAction)hideButtonClicked:(id)sender { [self setHidden:[sender state] entityType:[self selectedEntityType]]; [super hierarchyChanged]; } - (void)filterValue:(id)value ofEntityType:(PajeEntityType *)entityType show:(BOOL)flag { NSMutableSet *filter; filter = [filters objectForKey:entityType]; if (filter != nil) { if (flag) { [filter removeObject:value]; } else { [filter addObject:value]; } [self registerDefaultFilter:filter forEntityType:entityType]; [super dataChangedForEntityType:entityType]; } } - (void)filterEntityValueNotification:(NSNotification *)notification { id value; PajeEntityType *entityType; BOOL flag; NSDictionary *userInfo; userInfo = [notification userInfo]; if (userInfo == nil) return; entityType = [userInfo objectForKey:@"EntityType"]; value = [userInfo objectForKey:@"EntityValue"]; flag = [[userInfo objectForKey:@"Show"] isEqualToString:@"YES"]; if (entityType != nil && value != nil) { [self filterValue:value ofEntityType:entityType show:flag]; } [self synchronizeMatrix]; } - (void)matrixChanged:(id)sender { NSButtonCell *cell = [sender selectedCell]; PajeEntityType* entityType = [self selectedEntityType]; if (cell != nil) { [self filterValue:[cell representedObject] ofEntityType:entityType show:[cell state]]; } } - (void)entityPopUpChanged:(id)sender { [self synchronizeMatrix]; } - (void)synchronizeMatrix { id entityType = [self selectedEntityType]; NSMutableSet *filter; NSEnumerator *names; id entityName; int i = 0; ColoredSwitchButtonCell *cell; if (entityType == nil) { return; } filter = [filters objectForKey:entityType]; names = [[self unfilteredObjectsForEntityType:entityType] objectEnumerator]; while ([matrix numberOfRows] > 0 && ![[matrix cellAtRow:0 column:0] isKindOfClass:[ColoredSwitchButtonCell class]]) { [matrix removeRow:0]; } [matrix renewRows:[[self unfilteredObjectsForEntityType:entityType] count] columns:1]; while ((entityName = [names nextObject]) != nil) { cell = [matrix cellAtRow:i column:0]; [cell setState:!([filter containsObject:entityName])]; [cell setRepresentedObject:entityName]; [cell setTitle:[entityName description]]; [cell setColor:[inputComponent colorForValue:entityName ofEntityType:entityType]]; [cell setHighlightsBy:NSChangeBackgroundCellMask]; i++; } [matrix sortUsingSelector:@selector(compare:)]; [matrix sizeToCells]; [matrix setNeedsDisplay:YES]; [hideButton setState:[self isHiddenEntityType:entityType]]; } // // interact with interface // - (void)viewWillBeSelected:(NSView *)selectedView // message sent by PajeController when a view will be selected for display { [self synchronizeMatrix]; } // // Trace messages that are filtered // - (NSArray *)containedTypesForContainerType:(PajeEntityType *)containerType { NSArray *types; NSMutableSet *filteredTypes; types = [super containedTypesForContainerType:containerType]; filteredTypes = [NSMutableSet setWithArray:types]; [filteredTypes minusSet:hiddenEntityTypes]; return [filteredTypes allObjects]; } - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { NSEnumerator *origEnum; NSMutableSet *filter; if ([self isHiddenEntityType:entityType]) { NSWarnLog(@"enumerating hidden type %@", entityType); return nil; } origEnum = [inputComponent enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; filter = [filters objectForKey:entityType]; if (filter != nil) { return [[[FilteredEnumerator alloc] initWithEnumerator:origEnum filter:self selector:@selector(filterHiddenEntity:filter:) context:filter] autorelease]; } else { return origEnum; } } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { NSEnumerator *origEnum; NSMutableSet *filter; if ([self isHiddenEntityType:entityType]) { NSWarnLog(@"enumerating hidden type %@", entityType); return nil; } origEnum = [inputComponent enumeratorOfCompleteEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; filter = [filters objectForKey:entityType]; if (filter != nil) { return [[[FilteredEnumerator alloc] initWithEnumerator:origEnum filter:self selector:@selector(filterHiddenEntity:filter:) context:filter] autorelease]; } else { return origEnum; } } - (BOOL)isHiddenEntityType:(PajeEntityType*)entityType { return [hiddenEntityTypes member:entityType] != nil; } - (id)filterHiddenEntity:(PajeEntity *)entity filter:(NSSet *)filter { if ([filter containsObject:[self valueForEntity:entity]]) { return nil; } else { return entity; } } - (NSArray *)allValuesForEntityType:(PajeEntityType *)entityType { NSArray *allValues = [inputComponent allValuesForEntityType:entityType]; NSMutableSet *filter = [filters objectForKey:entityType]; if (filter != nil) { NSMutableSet *set = [NSMutableSet setWithArray:allValues]; [set minusSet:filter]; allValues = [set allObjects]; } return allValues; } // // methods to be a dragging destination, as delegate of matrix // - (void)highlightCell:(id)cell inMatrix:(NSMatrix *)m { NSInteger r, c; static id highlightedCell; // the last cell that has been highlighted if (highlightedCell && ![highlightedCell isEqual:cell]) { [m getRow:&r column:&c ofCell:highlightedCell]; [m highlightCell:NO atRow:r column:c]; highlightedCell = nil; } if (cell && ![cell isEqual:highlightedCell]) { [m getRow:&r column:&c ofCell:cell]; [m highlightCell:YES atRow:r column:c]; highlightedCell = cell; } } #ifdef GNUSTEP - (NSDragOperation)matrix:(NSMatrix *)m draggingEntered:(id )sender { return NSDragOperationAll; } #endif - (NSDragOperation)matrix:(NSMatrix *)m draggingUpdated:(id )sender { NSPoint point = [m convertPoint:[sender draggingLocation] fromView:nil]; NSButtonCell *cell = [m cellAtPoint:point]; [self highlightCell:cell inMatrix:m]; if (cell) return NSDragOperationAll;//NSDragOperationGeneric; else return NSDragOperationNone; } #ifdef GNUSTEP - (BOOL)matrix:(NSMatrix *)m prepareForDragOperation:(id )sender { return YES; } #endif - (BOOL)matrix:(NSMatrix *)m performDragOperation:(id )sender { NSPoint point; NSButtonCell *cell; point = [m convertPoint:[sender draggingLocation] fromView:nil]; cell = [m cellAtPoint:point]; [self highlightCell:nil inMatrix:m]; if (cell != nil) { PajeEntityType *entityType = [self selectedEntityType]; NSColor *dragColor; dragColor = [NSColor colorFromPasteboard:[sender draggingPasteboard]]; [inputComponent setColor:dragColor forValue:[cell representedObject] ofEntityType:entityType]; return YES; } return NO; } - (void)matrix:(NSMatrix *)m draggingExited:(id )sender { [self highlightCell:nil inMatrix:m]; } - (id)configuration { NSMutableDictionary *hiddenNames; NSEnumerator *keyEnum; id key; NSSet *value; hiddenNames = [NSMutableDictionary dictionaryWithCapacity:[filters count]]; keyEnum = [filters keyEnumerator]; while ((key = [keyEnum nextObject]) != nil) { value = [filters objectForKey:key]; [hiddenNames setObject:[value allObjects] forKey:[self descriptionForEntityType:key]]; } return [NSDictionary dictionaryWithObjectsAndKeys: hiddenNames, @"HiddenNames", [hiddenEntityTypes allObjects], @"HiddenEntityTypes", nil]; } - (void)setConfiguration:(id)config { NSDictionary *configuration; NSMutableDictionary *hiddenNames; NSMutableArray *hiddenTypes; NSEnumerator *keyEnum; NSString *entityTypeName; PajeEntityType *entityType; int i; NSParameterAssert([config isKindOfClass:[NSDictionary class]]); configuration = config; hiddenNames = [[configuration objectForKey:@"HiddenNames"] unifyStrings]; keyEnum = [hiddenNames keyEnumerator]; while ((entityTypeName = [keyEnum nextObject]) != nil) { entityType = [self entityTypeWithName:entityTypeName]; if (entityType != nil) { NSArray *value; value = [hiddenNames objectForKey:entityTypeName]; [filters setObject:[NSMutableSet setWithArray:value] forKey:entityType]; } } hiddenTypes = [[configuration objectForKey:@"HiddenEntityTypes"] unifyStrings]; for (i = 0; i < [hiddenTypes count];) { entityTypeName = [hiddenTypes objectAtIndex:i]; entityType = [self entityTypeWithName:entityTypeName]; if (entityType == nil) { [hiddenTypes removeObjectAtIndex:i]; } else { [hiddenTypes replaceObjectAtIndex:i withObject:entityType]; i++; } } Assign(hiddenEntityTypes, [NSMutableSet setWithArray:hiddenTypes]); [self hierarchyChanged]; [super dataChangedForEntityType:nil]; } @end Paje-1.98/EntityTypeFilter/GNUmakefile0000664000175000017500000000132411674062007017613 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make BUNDLE_NAME = EntityTypeFilter EntityTypeSelector_PRINCIPAL_CLASS = EntityTypeSelector ADDITIONAL_INCLUDE_DIRS = -I../General.bproj ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else EntityTypeFilter_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif EntityTypeFilter_RESOURCE_FILES = \ EntityTypeSelector.gorm \ EntityTypeSelector.nib EntityTypeFilter_OBJC_FILES = EntityTypeSelector.m EntityTypeFilter_HEADER_FILES = EntityTypeSelector.h -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/EntityTypeFilter/EntityTypeSelector.gorm/0000775000175000017500000000000011674062007022323 5ustar schnorrschnorrPaje-1.98/EntityTypeFilter/EntityTypeSelector.gorm/data.classes0000664000175000017500000000761711674062007024626 0ustar schnorrschnorr{ EntityTypeSelector = { Actions = ( "selectAll:", "unselectAll:", "matrixChanged:", "entityPopUpChanged:", "highlightCell:", "hideButtonClicked:" ); Outlets = ( view, matrix, entityTypePopUp, hideButton ); Super = PajeFilter; }; FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "inputEntity:", "outputEntity:", "unselectAll:", "matrixChanged:", "entityPopUpChanged:", "highlightCell:" ); Super = NSObject; }; PajeComponent = { Actions = ( "inputEntity:", "outputEntity:" ); Outlets = ( ); Super = NSObject; }; PajeFilter = { Actions = ( ); Outlets = ( ); Super = PajeComponent; }; }Paje-1.98/EntityTypeFilter/EntityTypeSelector.gorm/objects.gorm0000664000175000017500000001253211674062007024645 0ustar schnorrschnorrGNUstep archive00002a96:00000023:00000092:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary& 01NSString&% Button201NSButton1 NSControl1NSView1 NSResponder% C B A  B A& 01 NSMutableArray1 NSArray&%01 NSButtonCell1 NSActionCell1NSCell0&%Hide Entity Type01NSImage0 1NSMutableString&% common_SwitchOff0 1NSFont%&&&&&&&&%0 &0 &0 0&% common_SwitchOn&&&0&%NSOwner0&%EntityTypeSelector0&% Box101NSBox% C C B A  B A& 0 &0%  B A  B A&0 &0%  Bp A  Bp A& 0 &%0 0&%Show all &&&&&&&&%0&0&&&&0% Bp  Bp A  Bp A& 0 &%0 0&%Hide all &&&&&&&&%0 &0!&&&&0"0#&%Title &&&&&&&& %%0$& % ScrollView0%1 NSScrollView%  C C  C C&0& &0'1 NSClipView% A @ Ck C  Ck C&0( &0)1NSMatrix%  Cj A  Cj A& 0* &%0+ 0,& &&&&&&&&%% Cj A 0-1NSColor0.&%NSNamedColorSpace0/&%System00&%controlBackgroundColor-01& % NSButtonCell02 03&%Switch &&&&&&&&%04&05& &&&%%06 &07 3 &&&&&&&&%408& &&&7-091 NSScroller% @ @ A C  A C&0: &%0;, &&&&&&&&&%2 _doScroll:v12@0:4@8'% A A A A 90<& % TextField0=1 NSTextField% C B A  B A& 0> &%0?1NSTextFieldCell0@& % Entity type:0A% A0&&&&&&&&%0B.0C&%System0D&%textBackgroundColor0E.C0F& % textColor0G&%GSCustomClassMap0H&0I&%GormNSPopUpButton0J1 NSPopUpButton% B C CA A  CA A& 0K &%0L1NSPopUpButtonCell1NSMenuItemCell0M& &&&&&&&&0N1NSMenu0O&0P &0Q1 NSMenuItem0R&%Item 10S&&&%0T0U& % common_Nibble%0V0W&%Item 2S&&%%0X0Y&%Item 3S&&%%%0Z&0[&&&&QN%%%%%0\&%Button0]& % GormNSPanel0^1NSPanel1 NSWindow% ? A C C& % D6@ C0_% ? A C C  C C&0` &0a% A A` C C  C C&0b &0c%  C C  C C&0d &J%=0e0f&%Box &&&&&&&& %%0g.0h&%System0i&%windowBackgroundColor0j&%Window0k&%Panelk ? B F@ F@%0l0m&%NSApplicationIcon0n&%Boxa0o&%Matrix)0p&% Button10q &0r1!NSNibConnector]0s&%NSOwner0t!n0u!I0v!\0w!p0x1"NSNibControlConnectorIs0y&% entityPopUpChanged:0z"\s0{& %  selectAll:0|1#NSNibOutletConnectorsI0}&%entityTypePopUp0~#sn0&%view0"ps0& % unselectAll:0!o0!$0#so0&%matrix0"os0&%matrixChanged:0!0"s0&% hideButtonClicked:0#os0&%delegate0!<0#s0& % hideButton0!Paje-1.98/EntityTypeFilter/EntityTypeSelector.nib/0000775000175000017500000000000011674062007022127 5ustar schnorrschnorrPaje-1.98/EntityTypeFilter/EntityTypeSelector.nib/keyedobjects.nib0000664000175000017500000002544011674062007025301 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 156<=AEQYpuy $%*+,04568;AJ5KT5UY[aemnyz|~ h"+,-489<FGHKSGTUXY[\]cdijmpstx}~ rc !"#&)Gefghijklmnopqrstuvwxyz{|U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRoot̀΀π̀!234[NSClassName_EntityTypeSelector789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FPGHIJKLMNO :RSTUVW0]NSDestinationWNSLabelXNSSource Z[\]^_`abcdeffhhijklmnoZNSSubviews_NSNextResponder[NSSuperview\NSBorderType_NSTitlePosition[NSTitleCellWNSFrameYNSOffsets]NSTransparent]NSContentViewYNSBoxType xvw ~Z[`q.stu>vPm :Z[z\{U}Ut[NSFrameSize t u>P >DHO:[\`mmYNSEnabledXNSvFlagsVNSCell   _{{13, 324}, {64, 14}}_NSBackgroundColor[NSTextColorYNSSupportZNSContents]NSControlView[NSCellFlags\NSCellFlags2@[Entity typeVNSSizeVNSNameXNSfFlags"A0 \LucidaGrande78;VNSFontWNSColor[NSColorName\NSColorSpace]NSCatalogNameVSystem\controlColornWNSWhiteK0.6666666978;_controlTextColornB078Ϥ;_NSTextFieldCell\NSActionCell78Ӧ;[NSTextField\%NSTextFieldYNSControlVNSView[NSResponder[\`mm߀ !  ="_{{79, 319}, {206, 22}}n_NSAlternateImage^NSButtonFlags2]NSButtonFlagsVNSMenuZNSMenuItem_NSAlternateContents_NSPreferredEdge_NSPeriodicDelay]NSAltersState_NSKeyEquivalent_NSUsesItemFromMenu_NSPeriodicInterval_NSArrowPosition#A@@('$< % KPYNS.string&78   ;_NSMutableStringXNSString  ]NSMnemonicLoc_NSKeyEquivModMaskWNSStateWNSTitleYNSOnImageZNSKeyEquivXNSTarget\NSMixedImageXNSAction()*$".10 !"#[NSMenuItems2;3UItem1&2'()^NSResourceName,-+WNSImage_NSMenuCheckmark78-../;_NSCustomResource_%NSCustomResource&21()/-+_NSMenuMixedState__popUpItemAction:787;9ZOtherViews&><P>?'47:  CI(5*$".16UItem2  MS(8*$".19UItem378VWWX;^NSMutableArrayWNSArray78Z;78\]]^_`;_NSPopUpButtonCell^NSMenuItemCell\NSButtonCell]%NSButtonCell78bccd;]NSPopUpButtonXNSButton[\`mmhjkl ?  C@_{{178, 298}, {55, 18}}rtuvx$#A>"@B$XShow all78{__`;78}dd;[\`mmjk E CF_{{232, 298}, {50, 18}}tuvx$#GDB$XHide all[\`mmk I CJ_{{13, 298}, {107, 18}}v$LKHHPQko:Z[\`YNSBGColorYNSDocViewYNScvFlagsROOSSij>PʀS:[\z[NSCellClassZNSCellSizeYNSNumRowsYNSNumCols]NSSelectedColWNSCells[NSProtoCell]NSSelectedRow_NSCellBackgroundColor]NSMatrixFlags_NSIntercellSpacingfdUQ gQheTY{247, 34}>PVc:v]NSNormalImageLXWSB$VSwitchVNSReps\NSImageFlagsYabZ X{15, 16}> P [:> \]`_NSTIFFRepresentation^_OMM*)LLLssstttrrrqqqqqqqqqtttttt???)  ""##!!bbbeee ^!!! ]  -FLLLMMME- vRS~s  applmntrRGB XYZ 5acspAPPL-applo]4Q$\A rXYZ gXYZ4bXYZHwtpt\chadp,rTRCgTRCbTRCvcgt0ndin8desc4cprt-mmod(XYZ oT:xXYZ ^=XYZ (PXYZ ihsf32_ d?7curvcurvcurvvcgtndin0WJ@@%HL@:::descSDM-X72 CalibratedSDM-X72 CalibratedSDM-X72 CalibratedtextCopyright Apple Computer, Inc., 2003mmodMp78;_NSBitmapImageRepZNSImageRep78XX;nD0 078 **!;X%NSImage#vUNSTagLXWSB$Y{247, 18}W{0, -2}#vLXWB$785667;XNSMatrixY%NSMatrix_{{1, 1}, {249, 274}}78:;;;ZNSClipView[\`=ABCDEYNSPercentOOOln"?`>m_{{250, 1}, {15, 274}}\_doScroller:78IJJ;ZNSScroller[\`=OBCQROOOpn"?lq_{{-100, -100}, {249, 15}}_{{16, 16}, {266, 276}}78VWW;\NSScrollViewZ{298, 356}78Z֣;_{{63, 58}, {298, 356}}V{0, 0}^_ahz}ySBoxef|{_textBackgroundColorknB1nnM0 0.8000000178qrr;UNSBoxTview78uvvw;_NSNibOutletConnector^NSNibConnectorRSTzW0SVmatrixRSTW0HZhideButtonRSTW0 _entityTypePopUpRST0 _entityPopUpChanged78w;_NSNibControlConnectorRST0H_hideButtonClickedRST0>YselectAllRST0D[unselectAllRST0ʀS]matrixChanged>fU?>m (c DS'7H4O> V`nf_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClass px_{{400, 204}, {433, 455}}UPanel&WNSPanel&TView&>PU :_{{1, 1}, {433, 455}}_{{0, 0}, {1280, 1002}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78;_NSWindowTemplate>mm0fmmmmUʀ S O(( ( S`>m0?>UV 74 'H(`>`ZNSButton41\File's Owner[NSMenuItem2[NSMenuItem1\NSTextField1YNSButton4YPopUpList>$`>'`>*JKGHMN>L0IOmfU?(O 4c>DS' V H7`>HIJKLMNOPQRSTUVWXYZ[\]^_`abc€ÀĀŀƀǀȀɀʀˀ`     >}P:>`>`78;^NSIBObjectData#,1:LQVdf Zl,FR`jqsuwy{}$%'07DJSfhjlnprtvxz +7?IWeoqsuwy{}~#,3579:=?AYz  %'),9BGNckw!#,5GT]jv / B Q _ f q        " $ ) * , . 0 1 3 D F H J K T ^ ` i p    % * , . 0 2 4 6 8 E Q S U W ] j y { }    ! , . 7 > @ B D F o q s u w y { }    % 4 A O X e s |   %09DaceghjlGIKMOQSUZ\^`ex "$&)+-/1:ACEGIr| !+9AM[s "$&(*,.5JQ^`bdfkt}fov&.cegikmox  #09DOtvxz|~ 13579;?TVXZ\r   %')+-8IKMOQctvxz|  ".?ACEGU^   $ 1 > H U _ k m o q s u w y ~ !!!9!B!G!Z!c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" " """""""""" """$"/"<"H"T"a"k"u"~"""""""""""""""""""""""""""""""######I#K#M#O#Q#S#U#W#Y#[#]#_#a#c#e#g#i#k#m#o#q#s#u#w#y#{#}#####################################Paje-1.98/EntityTypeFilter/EntityTypeSelector.nib/info.nib0000664000175000017500000000070411674062007023555 0ustar schnorrschnorr IBDocumentLocation 69 62 356 240 0 0 1280 1002 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/EntityTypeFilter/EntityTypeSelector.nib/classes.nib0000664000175000017500000000255711674062007024267 0ustar schnorrschnorr{ IBClasses = ( { ACTIONS = { entityPopUpChanged = id; hideButtonClicked = id; matrixChanged = id; selectAll = id; unselectAll = id; }; CLASS = ContainerSelector; LANGUAGE = ObjC; OUTLETS = { entityTypePopUp = NSPopUpButton; hideButton = NSButton; matrix = NSMatrix; view = NSView; }; SUPERCLASS = PajeFilter; }, { ACTIONS = { entityPopUpChanged = id; hideButtonClicked = id; matrixChanged = id; selectAll = id; unselectAll = id; }; CLASS = EntityTypeSelector; LANGUAGE = ObjC; OUTLETS = { entityTypePopUp = NSPopUpButton; hideButton = NSButton; matrix = NSMatrix; view = NSView; }; SUPERCLASS = PajeFilter; }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeComponent; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeFilter; LANGUAGE = ObjC; SUPERCLASS = PajeComponent; } ); IBVersion = 1; }Paje-1.98/EntityTypeFilter/EntityTypeSelector.h0000664000175000017500000000570611674062007021541 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _EntityTypeSelector_h_ #define _EntityTypeSelector_h_ /* EntityTypeSelector.h created by benhur on Sat 14-Jun-1997 */ #include #include "../General/FilteredEnumerator.h" #include "../General/Protocols.h" #include "../General/PajeFilter.h" @interface EntityTypeSelector : PajeFilter { NSMutableDictionary *filters; NSMutableSet *hiddenEntityTypes; IBOutlet NSView *view; IBOutlet NSMatrix *matrix; IBOutlet NSPopUpButton *entityTypePopUp; IBOutlet NSButton *hideButton; } - (id)initWithController:(PajeTraceController *)c; - (void)dealloc; - (void)setFilterForEntityType:(PajeEntityType *)entityType; - (PajeEntityType *)selectedEntityType; // read and write defaults - (NSMutableSet *)defaultFilterForEntityType:(PajeEntityType *)entityType; - (void)registerDefaultFilter:(NSSet *)filter forEntityType:(PajeEntityType *)entityType; // // Handle interface messages // - (IBAction)selectAll:(id)sender; - (IBAction)unselectAll:(id)sender; - (IBAction)matrixChanged:(id)sender; - (IBAction)entityPopUpChanged:(id)sender; - (IBAction)hideButtonClicked:(id)sender; // // interact with interface // - (void)viewWillBeSelected:(NSView *)view; - (void)synchronizeMatrix; // // methods in Trace for making the filtering // - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration; - (BOOL)isHiddenEntityType:(PajeEntityType*)entityType; // // methods to be a dragging destination, as delegate of matrix // (colors dropped in a cell change the color of the // entity type it represents) // - (NSDragOperation)matrix:(NSMatrix *)m draggingUpdated:(id )sender; - (BOOL)matrix:(NSMatrix *)m performDragOperation:(id )sender; - (void)matrix:(NSMatrix *)m draggingExited:(id )sender; // help method for highlighting the destination cell - (void)highlightCell:(id)cell inMatrix:(NSMatrix *)m; @end #endif Paje-1.98/StorageController/0000775000175000017500000000000011674062007015725 5ustar schnorrschnorrPaje-1.98/StorageController/GNUmakefile0000664000175000017500000000137111674062007020001 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make StorageController_PRINCIPAL_CLASS = Encapsulate BUNDLE_NAME = StorageController ADDITIONAL_INCLUDE_DIRS = -I../General ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else StorageController_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif StorageController_OBJC_FILES = \ AnchorFilter.m \ Encapsulate.m StorageController_HEADER_FILES = \ AnchorFilter.h \ Encapsulate.h OTHERSRCS = Makefile.preamble Makefile Makefile.postamble m.template \ h.template -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/StorageController/Encapsulate.m0000664000175000017500000002363611674062007020361 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* * Encapsulate.m * * Component that reads individual events, states and communications * and encapsulates them for grouped access. * * 19970423 BS creation */ #include "Encapsulate.h" #include "../General/MultiEnumerator.h" #include "../General/PajeEntity.h" #include "../General/Macros.h" #include "../General/NSDate+Additions.h" @implementation Encapsulate - (id)initWithController:(PajeTraceController *)c { [super initWithController:c]; traceChanged = NO; timerActive = NO; entityLists = [[NSMutableDictionary alloc] init]; startTimeInMemory = nil; endTimeInMemory = nil; return self; } - (void)dealloc { [entityLists release]; [startTimeInMemory release]; [endTimeInMemory release]; [super dealloc]; } - (void)reset /*"Forget everything that has been done, start all over again."*/ { traceChanged = YES; if (!timerActive) { [self performSelector:@selector(timeElapsed:) withObject:self afterDelay:0]; timerActive = YES; } } - (void)activateTimer { if (!timerActive) { [self performSelector:@selector(timeElapsed:) withObject:self afterDelay:0.0]; timerActive = YES; } } - (void)hierarchyChanged { hierarchyChanged = YES; [self activateTimer]; } - (void)timeLimitsChanged { timeLimitsChanged = YES; [self activateTimer]; } - (void)inputEntity:(id)entity /*"There's new data in the input port. Encapsulate it."*/ { //[self addEntity:entity]; [self addChunk:entity]; traceChanged = YES; [self activateTimer]; } - (void)addChunk:(EntityChunk *)chunk { //KLUDGE to identify last date in memory. // (doesn't work if events are not seen) // FIXME this should be calculated on demand NSDate *time = [chunk endTime]; if(endTimeInMemory == nil || [time isLaterThanDate:endTimeInMemory]) { Assign(endTimeInMemory, time); } time = [chunk startTime]; if (startTimeInMemory == nil || [time isEarlierThanDate:startTimeInMemory]) { Assign(startTimeInMemory, time); } //ENDKLUDGE } - (void)send /*"notifies that data has changed."*/ { // only send trace if it is already initialized // (or else space time diagram will think trace has no data, and the // lazy reading will not work well) // FIXME should send more specific notification if (hierarchyChanged) { [super hierarchyChanged]; hierarchyChanged = NO; } if (timeLimitsChanged) { [super timeLimitsChanged]; timeLimitsChanged = NO; } [self performSelector:@selector(timeElapsed:) withObject:self afterDelay:0.005]; timerActive = YES; } - (void)timeElapsed:(id)sender /*"Called by the timer; notifies if necessary."*/ { timerActive = NO; if (traceChanged) { [self send]; } } - (NSDate *)time { return [self startTime]; } - (NSDate *)firstTime { return [self startTime]; } - (NSDate *)lastTime { return [self endTime]; } - (NSDate *)startTimeInMemory { return startTimeInMemory; } - (NSDate *)endTimeInMemory { return endTimeInMemory; } - (void)verifyStartTime:(NSDate *)start endTime:(NSDate *)end { return; NSDebugMLLog(@"tim", @"[%@:%@] [%@:%@]", start, end, startTimeInMemory, endTimeInMemory); if ([start isEarlierThanDate:startTimeInMemory] || ![endTimeInMemory isLaterThanDate:end]) { NSDictionary *userInfo; userInfo = [NSDictionary dictionaryWithObjectsAndKeys: start, @"StartTime", end, @"EndTime", nil]; NSDebugMLLog(@"tim", @"notify [%@:%@] [%@:%@]", start, end, startTimeInMemory, endTimeInMemory); NSLog(@"fault:[%@:%@] [%@:%@]", start, end, startTimeInMemory, endTimeInMemory); [[NSNotificationCenter defaultCenter] postNotificationName:@"PajeTraceNotInMemoryNotification" object:self userInfo:userInfo]; } } - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end { return [container enumeratorOfEntitiesTyped:entityType fromTime:start toTime:end]; } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end { return [container enumeratorOfCompleteEntitiesTyped:entityType fromTime:start toTime:end]; } - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { if (![[entityType containerType] isEqual:[container entityType]]) { NSEnumerator *subcontainerEnum; id subcontainer; MultiEnumerator *multiEnum; PajeEntityType *parentType; parentType = [entityType containerType]; subcontainerEnum = [self enumeratorOfContainersTyped:parentType inContainer:container]; multiEnum = [MultiEnumerator enumerator]; while ((subcontainer = [subcontainerEnum nextObject]) != nil) { NSEnumerator *en; en = [self enumeratorOfEntitiesTyped:entityType inContainer:subcontainer fromTime:start toTime:end minDuration:minDuration]; if (en != nil) { [multiEnum addEnumerator:en]; } } return multiEnum; } return [self enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:start toTime:end]; } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { // if container should contain entityType directly, we have no entities! if (![[entityType containerType] isEqual:[container entityType]]) { // container does not contain entityType's directly. // Try containers in-between. NSEnumerator *subcontainerEnum; id subcontainer; MultiEnumerator *multiEnum; PajeEntityType *parentType; parentType = [entityType containerType]; subcontainerEnum = [self enumeratorOfContainersTyped:parentType inContainer:container]; multiEnum = [MultiEnumerator enumerator]; while ((subcontainer = [subcontainerEnum nextObject]) != nil) { NSEnumerator *en; en = [self enumeratorOfCompleteEntitiesTyped:entityType inContainer:subcontainer fromTime:start toTime:end minDuration:minDuration]; if (en != nil) { [multiEnum addEnumerator:en]; } } return multiEnum; } return [self enumeratorOfCompleteEntitiesTyped:entityType inContainer:container fromTime:start toTime:end]; } - (NSEnumerator *)enumeratorOfContainersTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container { NSEnumerator *ienum; PajeContainer *instance; NSMutableArray *instancesInContainer = [NSMutableArray array]; if ([entityType isContainer]) { PajeContainerType *containerType = (PajeContainerType *)entityType; ienum = [[containerType allInstances] objectEnumerator]; while ((instance = [ienum nextObject]) != nil) { if ([instance isContainedBy:container]) { [instancesInContainer addObject:instance]; } } } //[instancesInContainer sortUsingSelector:@selector(compare:)]; return [instancesInContainer objectEnumerator]; } - (void)startChunk:(int)chunkNumber { // the components following this should not be interested in this method } - (void)endOfChunkLast:(BOOL)last { // the components following this should not be interested in this method } @end Paje-1.98/StorageController/Encapsulate.h0000664000175000017500000000306311674062007020344 0ustar schnorrschnorr/* Copyright (c) 1998--2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _Encapsulate_h_ #define _Encapsulate_h_ // #include "AnchorFilter.h" #include "../General/Protocols.h" #include "../General/ChunkArray.h" @interface Encapsulate : AnchorFilter { BOOL traceChanged; BOOL timeLimitsChanged; BOOL hierarchyChanged; BOOL timerActive; NSDate *startTimeInMemory; NSDate *endTimeInMemory; NSMutableDictionary *entityLists; // dictionary (by entity type) of // dictionaries (by container) of // ChunkArrays } - (id)initWithController:(PajeTraceController *)c; - (void)addChunk:(EntityChunk *)entity; - (NSDate *)startTimeInMemory; @end #endif Paje-1.98/StorageController/AnchorFilter.h0000664000175000017500000000100311674062007020450 0ustar schnorrschnorr#ifndef _AnchorFilter_h_ #define _AnchorFilter_h_ /** AnchorFilter * First filter in chain of filters. * Must implement all filter queries and commands. * Implements queries by accessing entities directly. * Implements container and time selections. * Implements other commands by logging "not implemented" message. */ #include "../General/PajeFilter.h" @interface AnchorFilter : PajeFilter { NSSet *selectedContainers; NSDate *selectionStartTime; NSDate *selectionEndTime; } @end #endif Paje-1.98/StorageController/AnchorFilter.m0000664000175000017500000001575311674062007020476 0ustar schnorrschnorr#include "AnchorFilter.h" #include "../General/PajeEntityInspector.h" #include "../General/Macros.h" @implementation AnchorFilter - (id)initWithController:(PajeTraceController *)c { [super initWithController:c]; //Assign(selectedContainers, [NSSet set]); Assign(selectedContainers, [[[NSSet alloc] init] autorelease]); selectionStartTime = nil; selectionEndTime = nil; return self; } - (void)dealloc { Assign(selectedContainers, nil); Assign(selectionStartTime, nil); Assign(selectionEndTime, nil); [super dealloc]; } - (void)setSelectedContainers:(NSSet *)containers { Assign(selectedContainers, containers); [self containerSelectionChanged]; } - (NSSet *)selectedContainers { return selectedContainers; } - (void)setSelectionStartTime:(NSDate *)from endTime:(NSDate *)to { Assign(selectionStartTime, from); Assign(selectionEndTime, to); [self timeSelectionChanged]; } - (NSDate *)selectionStartTime { return selectionStartTime; } - (NSDate *)selectionEndTime { return selectionEndTime; } - (void)setOrder:(NSArray *)containers ofContainersTyped:(PajeEntityType *)containerType inContainer:(PajeContainer *)container { NSLog(@"Must include filter to change container order"); } - (void)hideEntityType:(PajeEntityType *)entityType { NSLog(@"Must include filter to hide entity types"); } - (void)hideSelectedContainers { NSLog(@"Must include filter to hide containers"); } - (void)inspectEntity:(id)entity { Class inspectorClass = nil; Class class = [(NSObject *)entity class]; while ((inspectorClass == nil) && (class != [class superclass])) { NSString *inspName; inspName = [NSStringFromClass(class) stringByAppendingString:@"Inspector"]; inspectorClass = NSClassFromString(inspName); class = [class superclass]; } if (inspectorClass != nil) { [(PajeEntityInspector *)[inspectorClass inspector] inspectEntity:entity withFilter:self]; } // [entity inspect]; } // // Queries // // Queries for entity types - (NSArray *)containedTypesForContainerType:(PajeEntityType *)containerType { if ([containerType isContainer]) { return [(PajeContainerType *)containerType containedTypes]; } else { return [NSArray array]; } } - (PajeContainerType *)containerTypeForType:(PajeEntityType *)entityType { return [entityType containerType]; } - (double)minValueForEntityType:(PajeEntityType *)entityType { return [entityType minValue]; } - (double)maxValueForEntityType:(PajeEntityType *)entityType { return [entityType maxValue]; } - (double)minValueForEntityType:(PajeEntityType *)entityType inContainer:(PajeContainer *)container { return [container minValueForEntityType:entityType]; } - (double)maxValueForEntityType:(PajeEntityType *)entityType inContainer:(PajeContainer *)container { return [container maxValueForEntityType:entityType]; } - (NSArray *)allValuesForEntityType:(PajeEntityType *)entityType { return [entityType allValues]; } - (NSString *)descriptionForEntityType:(PajeEntityType *)entityType { return [entityType description]; } - (BOOL)isHiddenEntityType:(PajeEntityType *)entityType { return NO; } - (PajeDrawingType)drawingTypeForEntityType:(PajeEntityType *)entityType { return [entityType drawingType]; } - (NSColor *)colorForValue:(id)value ofEntityType:(PajeEntityType *)entityType { return [entityType colorForValue:value]; } - (void)setColor:(NSColor *)color forValue:(id)value ofEntityType:(PajeEntityType *)entityType { [entityType setColor:color forValue:value]; [self colorChangedForEntityType:entityType]; } - (NSColor *)colorForEntityType:(PajeEntityType *)entityType { return [entityType color]; } - (NSArray *)fieldNamesForEntityType:(PajeEntityType *)entityType { return [entityType fieldNames]; } - (id)valueOfFieldNamed:(NSString *)fieldName forEntityType:(PajeEntityType *)entityType { return [entityType valueOfFieldNamed:fieldName]; } // Queries for entities - (double)doubleValueForEntity:(PajeEntity *)entity { return [entity doubleValue]; } - (double)minValueForEntity:(PajeEntity *)entity { return [entity minValue]; } - (double)maxValueForEntity:(PajeEntity *)entity { return [entity maxValue]; } - (PajeContainer *)containerForEntity:(id)entity; { return [entity container]; } - (PajeEntityType *)entityTypeForEntity:(id)entity; { return [entity entityType]; } - (PajeContainer *)sourceContainerForEntity:(id)entity; { return [entity sourceContainer]; } - (PajeEntityType *)sourceEntityTypeForEntity:(id)entity; { return [entity sourceEntityType]; } - (PajeContainer *)destContainerForEntity:(id)entity; { return [entity destContainer]; } - (PajeEntityType *)destEntityTypeForEntity:(id)entity; { return [entity destEntityType]; } - (NSColor *)colorForEntity:(id)entity { return [entity color]; } - (NSDate *)startTimeForEntity:(id)entity; { return [entity startTime]; } - (NSDate *)endTimeForEntity:(id)entity; { return [entity endTime]; } - (NSDate *)timeForEntity:(id)entity { return [entity time]; } - (PajeDrawingType)drawingTypeForEntity:(id)entity { return [entity drawingType]; } - (id)valueForEntity:(id)entity { return [entity value]; } - (int)imbricationLevelForEntity:(id)entity { return [entity imbricationLevel]; } - (BOOL)isAggregateEntity:(id)entity { return [entity isAggregate]; } - (unsigned)subCountForEntity:(id)entity { return [entity subCount]; } - (NSColor *)subColorAtIndex:(unsigned)index forEntity:(id)entity { return [entity subColorAtIndex:index]; } - (id)subValueAtIndex:(unsigned)index forEntity:(id)entity { return [entity subValueAtIndex:index]; } - (double)subDurationAtIndex:(unsigned)index forEntity:(id)entity { return [entity subDurationAtIndex:index]; } - (unsigned)subCountAtIndex:(unsigned)index forEntity:(id)entity { return [entity subCountAtIndex:index]; } - (NSString *)descriptionForEntity:(id)entity { return [entity description]; } - (BOOL)canHighlightEntity:(id)entity { return YES; } - (BOOL)isSelectedEntity:(id)entity { return NO; } - (NSArray *)fieldNamesForEntity:(id)entity { return [entity fieldNames]; } - (id)valueOfFieldNamed:(NSString *)fieldName forEntity:(id)entity { return [entity valueOfFieldNamed:fieldName]; } - (void)setColor:(NSColor *)color forEntity:(id)entity { [entity setColor:color]; [self colorChangedForEntityType:[self entityTypeForEntity:entity]]; } @end Paje-1.98/ContainerFilter/0000775000175000017500000000000011674062007015345 5ustar schnorrschnorrPaje-1.98/ContainerFilter/ContainerSelector.nib/0000775000175000017500000000000011674062007021537 5ustar schnorrschnorrPaje-1.98/ContainerFilter/ContainerSelector.nib/keyedobjects.nib0000664000175000017500000002544611674062007024717 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 156<=AEQYpuy $%*+,04568;AJ5KT5UY[aemnyz|~ h"+,-489<FGHKSGTUXY[\]cdijmpstx}~ r !c"#&)Gefghijklmnopqrstuvwxyz{|U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRoot΀Ѐрπ!234[NSClassName_ContainerSelector789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FPGHIJKLMNO :RSTUVW0]NSDestinationWNSLabelXNSSource Z[\]^_`abcdeffhhijklmnoZNSSubviews_NSNextResponder[NSSuperview\NSBorderType_NSTitlePosition[NSTitleCellWNSFrameYNSOffsets]NSTransparent]NSContentViewYNSBoxType zxy Z[`q.stw>vPm :Z[z\{U}Ut[NSFrameSize v w>P >DHO:[\`mmYNSEnabledXNSvFlagsVNSCell   _{{13, 324}, {86, 14}}_NSBackgroundColor[NSTextColorYNSSupportZNSContents]NSControlView[NSCellFlags\NSCellFlags2@^Container TypeVNSSizeVNSNameXNSfFlags"A0 \LucidaGrande78;VNSFontWNSColor[NSColorName\NSColorSpace]NSCatalogNameVSystem\controlColornWNSWhiteK0.6666666978;_controlTextColornB078Ϥ;_NSTextFieldCell\NSActionCell78Ӧ;[NSTextField\%NSTextFieldYNSControlVNSView[NSResponder[\`mm߀ !  ="_{{101, 319}, {184, 22}}n_NSAlternateImage^NSButtonFlags2]NSButtonFlagsVNSMenuZNSMenuItem_NSAlternateContents_NSPreferredEdge_NSPeriodicDelay]NSAltersState_NSKeyEquivalent_NSUsesItemFromMenu_NSPeriodicInterval_NSArrowPosition#A@@('$< % KPYNS.string&78   ;_NSMutableStringXNSString  ]NSMnemonicLoc_NSKeyEquivModMaskWNSStateWNSTitleYNSOnImageZNSKeyEquivXNSTarget\NSMixedImageXNSAction()*$".10 !"#[NSMenuItems2;3UItem1&2'()^NSResourceName,-+WNSImage_NSMenuCheckmark78-../;_NSCustomResource_%NSCustomResource&21()/-+_NSMenuMixedState__popUpItemAction:787;9ZOtherViews&><P>?'47:  CI(5*$".16UItem2  MS(8*$".19UItem378VWWX;^NSMutableArrayWNSArray78Z;78\]]^_`;_NSPopUpButtonCell^NSMenuItemCell\NSButtonCell]%NSButtonCell78bccd;]NSPopUpButtonXNSButton[\`mmhjkl ?  C@_{{178, 298}, {55, 18}}rtuvx$#A>"@B$XShow all78{__`;78}dd;[\`mmjk E CF_{{232, 298}, {50, 18}}tuvx$#GDB$XHide all[\`mmk I CJ_{{13, 298}, {100, 18}}v$LKHHPQmq:Z[\`YNSBGColorYNSDocViewYNScvFlagsROOSSkl>PʀS:[\z[NSCellClassZNSCellSizeYNSNumRowsYNSNumCols]NSSelectedColWNSCells[NSProtoCell]NSSelectedRow_NSCellBackgroundColor]NSMatrixFlags_NSIntercellSpacinggeUQ hQjfTX{64, 34}>PVc:v]NSNormalImageLXWSB$VSwitchVNSReps\NSImageFlagsYabZ X{15, 16}> P [:> \]`_NSTIFFRepresentation^_OMM*)LLLssstttrrrqqqqqqqqqtttttt???)  ""##!!bbbeee ^!!! ]  -FLLLMMME- vRS~s  applmntrRGB XYZ 5acspAPPL-applo]4Q$\A rXYZ gXYZ4bXYZHwtpt\chadp,rTRCgTRCbTRCvcgt0ndin8desc4cprt-mmod(XYZ oT:xXYZ ^=XYZ (PXYZ ihsf32_ d?7curvcurvcurvvcgtndin0WJ@@%HL@:::descSDM-X72 CalibratedSDM-X72 CalibratedSDM-X72 CalibratedtextCopyright Apple Computer, Inc., 2003mmodMp78;_NSBitmapImageRepZNSImageRep78XX;nD0 078 **!;X%NSImage#'vUNSTagLXdSB$X{64, 18}W{0, -2}#1vLXiB$785667;XNSMatrixY%NSMatrix_{{1, 1}, {249, 274}}78:;;;ZNSClipView[\`=ABCDEYNSPercentOOOnp"?`>o_{{250, 1}, {15, 274}}\_doScroller:78IJJ;ZNSScroller[\`=OBCQROOOrp"?ls_{{-100, -100}, {249, 15}}_{{16, 16}, {266, 276}}78VWW;\NSScrollViewZ{298, 356}78Z֣;_{{63, 58}, {298, 356}}V{0, 0}^_ah|{SBoxef~}_textBackgroundColorknB1nnM0 0.8000000178qrr;UNSBoxTview78uvvw;_NSNibOutletConnector^NSNibConnectorRSTzW0SVmatrixRSTW0HZhideButtonRSTW0 _entityTypePopUpRST0 _entityPopUpChanged:78w;_NSNibControlConnectorRST0H_hideButtonClicked:RST0>ZselectAll:RST0D\unselectAll:RST0ʀS^matrixChanged:>f?U>mV>c 'H7 O4D S(`>PU :_{{1, 1}, {433, 455}}nf_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClass px_{{400, 204}, {433, 455}}UPanel&WNSPanel&TView&_{{0, 0}, {1280, 1002}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78;_NSWindowTemplate>mm0mfmmmUS S(  ( ( O `>U0>m? '4VH( 7`>`\File's Owner[NSMenuItem1ZNSButton41YNSButton4\NSTextField1YPopUpList[NSMenuItem2>$`>'`>*LMJG?O0fUHKImN>V SH>7cD  O'4(`>HIJKLMNOPQRSTUVWXYZ[\]^_`abc€ÀĀŀƀǀȀɀʀˀ̀̀`     >}P:>`>`78;^NSIBObjectData#,1:LQVdf ^p"0JVdnuwy{}'(*3:GMVikmoqsuwy{}.:BLZhrtvxz|~&/68:<=@BD\}&+-/2?HMTiq}$')2;MZcp| 6 I X f m x     " $ & ) + 0 1 3 5 7 8 : K M O Q R [ e g p w    % ' , 1 3 5 7 9 ; = ? L X Z \ ^ d q    ( 3 5 > E G I K M v x z | ~  , ; H V _ l z #,7@KhjlnoqsNPRTVXZ\acegl{!#%'),.024=DFHJLu$.<DP^v"$&(*,.07LS`bdfhmvhqx '/dfhjlnpy  $1:EPuwy{}2468:<@UWY[]s  &(*,.9JLNPRduwy{}  "$&3DFHJL[d   + 5 C Q ^ k u !!"!?!H!M!`!i!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""" """$"&"("*"7"C"N"X"e"o"{"""""""""""""""""""""""""""""##### # # ##O#Q#S#U#W#Y#[#]#_#a#c#e#g#i#k#m#o#q#s#u#w#y#{#}########################################Paje-1.98/ContainerFilter/ContainerSelector.nib/info.nib0000664000175000017500000000070411674062007023165 0ustar schnorrschnorr IBDocumentLocation 69 62 356 240 0 0 1280 1002 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/ContainerFilter/ContainerSelector.nib/classes.nib0000664000175000017500000000150211674062007023664 0ustar schnorrschnorr{ IBClasses = ( { ACTIONS = { entityPopUpChanged = id; hideButtonClicked = id; matrixChanged = id; selectAll = id; unselectAll = id; }; CLASS = ContainerSelector; LANGUAGE = ObjC; OUTLETS = { entityTypePopUp = NSPopUpButton; hideButton = NSButton; matrix = NSMatrix; view = NSView; }; SUPERCLASS = PajeFilter; }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeComponent; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeFilter; LANGUAGE = ObjC; SUPERCLASS = PajeComponent; } ); IBVersion = 1; }Paje-1.98/ContainerFilter/GNUmakefile0000664000175000017500000000127311674062007017422 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make BUNDLE_NAME = ContainerFilter ContainerFilter_PRINCIPAL_CLASS = ContainerSelector ADDITIONAL_INCLUDE_DIRS = -I../General ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else ContainerFilter_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif ContainerFilter_RESOURCE_FILES = \ ContainerSelector.gorm \ ContainerSelector.nib ContainerFilter_OBJC_FILES = ContainerSelector.m ContainerFilter_HEADER_FILES = ContainerSelector.h -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/ContainerFilter/ContainerSelector.h0000664000175000017500000000542311674062007021145 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _ContainerSelector_h_ #define _ContainerSelector_h_ /* ContainerSelector.h created by benhur on Sat 03-Jul-2004 */ #include #include "../General/FilteredEnumerator.h" #include "../General/Protocols.h" #include "../General/PajeFilter.h" @interface ContainerSelector : PajeFilter { NSMutableDictionary *filters; NSMutableSet *hiddenEntityTypes; IBOutlet NSView *view; IBOutlet NSMatrix *matrix; IBOutlet NSPopUpButton *entityTypePopUp; IBOutlet NSButton *hideButton; } - (id)initWithController:(PajeTraceController *)c; - (void)dealloc; - (void)setFilterForEntityType:(PajeEntityType *)entityType; - (PajeEntityType *)selectedEntityType; // read and write defaults - (NSMutableSet *)defaultFilterForEntityType:(PajeEntityType *)entityType; - (void)registerDefaultFilter:(NSSet *)filter forEntityType:(PajeEntityType *)entityType; // // Handle interface messages // - (IBAction)selectAll:(id)sender; - (IBAction)unselectAll:(id)sender; - (IBAction)matrixChanged:(id)sender; - (IBAction)entityPopUpChanged:(id)sender; - (IBAction)hideButtonClicked:(id)sender; // // interact with interface // - (void)viewWillBeSelected:(NSView *)view; - (void)synchronizeMatrix; // // methods in Trace for making the filtering // - (NSEnumerator *)enumeratorOfContainersTyped:(PajeContainerType *)entityType inContainer:(PajeContainer *)container; - (BOOL)isHiddenEntityType:(PajeEntityType*)entityType; // // methods to be a dragging destination, as delegate of matrix // (colors dropped in a cell change the color of the // entity type it represents) // - (NSDragOperation)matrix:(NSMatrix *)m draggingUpdated:(id )sender; - (BOOL)matrix:(NSMatrix *)m performDragOperation:(id )sender; - (void)matrix:(NSMatrix *)m draggingExited:(id )sender; // help method for highlighting the destination cell - (void)highlightCell:(id)cell inMatrix:(NSMatrix *)m; @end #endif Paje-1.98/ContainerFilter/ContainerSelector.m0000664000175000017500000004366011674062007021157 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* ContainerSelector.m created by benhur on Sat 14-Jun-1997 */ #include "ContainerSelector.h" #include "../General/FoundationAdditions.h" #include "../General/UniqueString.h" #include "../General/Macros.h" #include "../General/ColoredSwitchButtonCell.h" @implementation ContainerSelector - (id)initWithController:(PajeTraceController *)c { NSWindow *win; [super initWithController:c]; filters = [[NSMutableDictionary alloc] init]; hiddenEntityTypes = [[NSMutableSet alloc] init]; if (![NSBundle loadNibNamed:@"ContainerSelector" owner:self]) { NSRunAlertPanel(@"ContainerSelector", @"Couldn't load interface file", nil, nil, nil); return self; } win = [view window]; // view is an NSBox. we need its contents. view = [[(NSBox *)view contentView] retain]; [matrix registerForDraggedTypes: [NSArray arrayWithObject:NSColorPboardType]]; [matrix setDelegate:self]; // [matrix setCellClass:[ColoredSwitchButtonCell class]]; [entityTypePopUp removeAllItems]; [self registerFilter:self]; #ifndef GNUSTEP [win release]; #endif return self; } - (void)dealloc { [entityTypePopUp removeAllItems]; [filters release]; [hiddenEntityTypes release]; [view release]; [super dealloc]; } - (NSView *)filterView { return view; } - (NSString *)filterName { return @"Container Selector"; } - (id)filterDelegate { return self; } // // Notifications sent by other filters // - (void)hierarchyChanged { PajeEntityType *entityType; NSEnumerator *typeEnum; typeEnum = [[self allEntityTypes] objectEnumerator]; while ((entityType = [typeEnum nextObject]) != nil) { if ([self isContainerEntityType:entityType] && ![entityType isEqual:[self rootEntityType]]) { [self setFilterForEntityType:entityType]; } } [self synchronizeMatrix]; [super hierarchyChanged]; } - (void)colorChangedForEntityType:(PajeEntityType *)entityType { if (entityType == nil || [entityType isEqual:[self selectedEntityType]]) { [self synchronizeMatrix]; } [super colorChangedForEntityType:entityType]; } // // // - (BOOL)isRegisteredAsHiddenEntityType:(PajeEntityType *)entityType { NSString *defaultKey; defaultKey = [[self descriptionForEntityType:entityType] stringByAppendingString:@" Hide"]; return [[NSUserDefaults standardUserDefaults] boolForKey:defaultKey]; } - (void)setFilterForEntityType:(PajeEntityType *)entityType // a new entity type is known. create a new filter for it. { NSMutableSet *filter; NSString *entityTypeDescription; NSParameterAssert(entityType); entityTypeDescription = [self descriptionForEntityType:entityType]; filter = [filters objectForKey:entityTypeDescription]; if (nil == filter) { filter = [self defaultFilterForEntityType:entityType]; [filters setObject:filter forKey:entityTypeDescription]; [entityTypePopUp addItemWithTitle:entityTypeDescription]; [[entityTypePopUp lastItem] setRepresentedObject:entityType]; #ifdef GNUSTEP [entityTypePopUp setEnabled:YES]; #endif } // if ([self isRegisteredAsHiddenEntityType:entityType]) { // [hiddenEntityTypes addObject:entityTypeDescription]; // } else { // [hiddenEntityTypes removeObject:entityTypeDescription]; // } } - (void)setHidden:(BOOL)hidden entityType:(PajeEntityType *)entityType { NSString *defaultKey; NSString *entityTypeDescription; entityTypeDescription = [self descriptionForEntityType:entityType]; defaultKey = [entityTypeDescription stringByAppendingString:@" Hide"]; if (hidden) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:defaultKey]; [hiddenEntityTypes addObject:entityTypeDescription]; } else { [[NSUserDefaults standardUserDefaults] removeObjectForKey:defaultKey]; [hiddenEntityTypes removeObject:entityTypeDescription]; } } - (NSMutableSet *)defaultFilterForEntityType:(PajeEntityType *)entityType { NSString *defaultName; NSArray *filterArray; defaultName = [NSString stringWithFormat:@"%@%@Filter", NSStringFromClass([self class]), [self descriptionForEntityType:entityType]]; filterArray = [[NSUserDefaults standardUserDefaults] arrayForKey:defaultName]; return [NSMutableSet setWithArray:[filterArray unifyStrings]]; } - (void)registerDefaultFilter:(NSSet *)filter forEntityType:(PajeEntityType *)entityType { NSString *defaultName = [NSString stringWithFormat:@"%@%@Filter", NSStringFromClass([self class]), [self descriptionForEntityType:entityType]]; NSArray *filterArray = [filter allObjects]; [[NSUserDefaults standardUserDefaults] setObject:filterArray forKey:defaultName]; } - (PajeEntityType *)selectedEntityType { if ([entityTypePopUp selectedItem] == nil) { [entityTypePopUp selectItemAtIndex:0]; } return [[entityTypePopUp selectedItem] representedObject]; } - (NSMutableSet *)filterForEntityType:(PajeEntityType *)entityType { NSString *entityTypeDescription; entityTypeDescription = [self descriptionForEntityType:entityType]; return [filters objectForKey:entityTypeDescription]; } // // Handle interface messages // - (IBAction)selectAll:(id)sender { PajeEntityType *entityType = [self selectedEntityType]; NSMutableSet *filter = [self filterForEntityType:entityType]; if (filter) { [filter removeAllObjects]; [self synchronizeMatrix]; [self registerDefaultFilter:filter forEntityType:entityType]; [super dataChangedForEntityType:entityType]; } else { [NSException raise:@"ContainerSelector: Internal Inconsistency" format:@"%@ sent by unknown view %@", NSStringFromSelector(_cmd), sender]; } } - (NSArray *)unfilteredObjectsForEntityType:(PajeEntityType *)entityType { NSEnumerator *containerEnum; PajeContainer *container; NSMutableArray *allDescriptions = [NSMutableArray array]; containerEnum = [super enumeratorOfContainersTyped:entityType inContainer:[self rootInstance]]; while ((container = [containerEnum nextObject]) != nil) { [allDescriptions addObject:[self nameForContainer:container]]; } return allDescriptions; } - (id)configuration { NSMutableDictionary *hiddenContainers; NSEnumerator *keyEnum; id key; NSSet *value; hiddenContainers = [NSMutableDictionary dictionaryWithCapacity:[filters count]]; keyEnum = [filters keyEnumerator]; while ((key = [keyEnum nextObject]) != nil) { value = [filters objectForKey:key]; [hiddenContainers setObject:[value allObjects] forKey:key]; } return [NSDictionary dictionaryWithObjectsAndKeys: hiddenContainers, @"HiddenContainers", [hiddenEntityTypes allObjects], @"HiddenContainerTypes", nil]; } - (void)setConfiguration:(id)config { NSDictionary *configuration; NSMutableDictionary *hiddenContainers; NSEnumerator *keyEnum; id key; NSArray *value; NSArray *hiddenTypes; NSParameterAssert([config isKindOfClass:[NSDictionary class]]); configuration = config; hiddenContainers = [[configuration objectForKey:@"HiddenContainers"] unifyStrings]; keyEnum = [hiddenContainers keyEnumerator]; while ((key = [keyEnum nextObject]) != nil) { value = [hiddenContainers objectForKey:key]; [filters setObject:[NSMutableSet setWithArray:value] forKey:key]; } hiddenTypes = [[configuration objectForKey:@"HiddenContainerTypes"] unifyStrings]; Assign(hiddenEntityTypes, [NSMutableSet setWithArray:hiddenTypes]); [self hierarchyChanged]; [super dataChangedForEntityType:nil]; } - (IBAction)unselectAll:(id)sender { PajeEntityType *entityType = [self selectedEntityType]; NSMutableSet *filter = [self filterForEntityType:entityType]; if (filter) { [filter addObjectsFromArray:[self unfilteredObjectsForEntityType:entityType]]; [self synchronizeMatrix]; [self registerDefaultFilter:filter forEntityType:entityType]; [super dataChangedForEntityType:entityType]; } else { [NSException raise:@"ContainerSelector: Internal Inconsistency" format:@"%@ sent by unknown view %@", NSStringFromSelector(_cmd), sender]; } } - (IBAction)hideButtonClicked:(id)sender { [self setHidden:[sender state] entityType:[self selectedEntityType]]; [super hierarchyChanged]; } - (void)filterName:(NSString *)name ofEntityType:(PajeEntityType *)entityType show:(BOOL)flag { NSMutableSet *filter; filter = [self filterForEntityType:entityType]; if (filter != nil) { if (flag) { [filter removeObject:name]; } else { [filter addObject:name]; } [self registerDefaultFilter:filter forEntityType:entityType]; [super dataChangedForEntityType:entityType]; } } - (IBAction)matrixChanged:(id)sender { NSButtonCell *cell = [sender selectedCell]; PajeEntityType* entityType = [self selectedEntityType]; if (cell != nil) { [self filterName:[cell representedObject] ofEntityType:entityType show:[cell state]]; } } - (IBAction)entityPopUpChanged:(id)sender { [self synchronizeMatrix]; } - (void)synchronizeMatrix { id entityType = [self selectedEntityType]; NSMutableSet *filter; NSEnumerator *names; id entityName; int i = 0; ColoredSwitchButtonCell *cell; if (entityType == nil) { return; } filter = [self filterForEntityType:entityType]; names = [[self unfilteredObjectsForEntityType:entityType] objectEnumerator]; while ([matrix cellAtRow:0 column:0]) { [matrix removeRow:0]; } while ((entityName = [names nextObject]) != nil) { [matrix addRow]; cell = [matrix cellAtRow:i column:0]; [cell setState:!([filter containsObject:entityName])]; [cell setRepresentedObject:entityName]; #if 0 #ifndef xxGNUSTEP NSMutableAttributedString *title; title = [[[NSMutableAttributedString alloc] initWithString:[entityName description]] autorelease]; #if defined(__APPLE__)// || defined(GNUSTEP) [title replaceCharactersInRange:NSMakeRange(0,0) withString:@"# "]; [title addAttribute:NSFontAttributeName value:[NSFont boldSystemFontOfSize:16] range:NSMakeRange(0,1)]; [title addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:12] range:NSMakeRange(1, [title length]-1)]; #else // 0x25a0 is unicode for a solid small square [title replaceCharactersInRange:NSMakeRange(0,0) withString:[NSString stringWithCharacter:0x25a0]]; [title replaceCharactersInRange:NSMakeRange(1,0) withString:@" "]; #endif [title addAttribute:NSForegroundColorAttributeName value:[inputComponent colorForName:entityName ofEntityType:entityType] range:NSMakeRange(0,1)]; [title fixAttributesInRange:NSMakeRange(0, [title length])]; [cell setAttributedTitle:title]; #else /*!GNUSTEP*/ [cell setTitle:[entityName description]]; #endif #else [cell setTitle:[entityName description]]; // [cell setColor:[inputComponent colorForName:entityName // ofEntityType:entityType]]; #endif [cell setHighlightsBy:NSChangeBackgroundCellMask]; i++; } // [matrix sortUsingSelector:@selector(compare:)]; [matrix sizeToCells]; [matrix setNeedsDisplay:YES]; [hideButton setState:[self isHiddenEntityType:entityType]]; } // // interact with interface // - (void)viewWillBeSelected:(NSView *)selectedView // message sent by PajeController when a view will be selected for display { [self synchronizeMatrix]; } // // Trace messages that are filtered // - (void)hideEntityType:(PajeEntityType *)entityType { if (![self isContainerEntityType:entityType]) { [super hideEntityType:entityType]; } else { [self setHidden:YES entityType:entityType]; [super hierarchyChanged]; } } - (void)hideSelectedContainers { NSEnumerator *containerEnum; PajeContainer *container; containerEnum = [[self selectedContainers] objectEnumerator]; while ((container = [containerEnum nextObject]) != nil) { [[self filterForEntityType:[self entityTypeForEntity:container]] addObject:[self nameForContainer:container]]; } [self synchronizeMatrix]; [super dataChangedForEntityType:nil]; } - (NSArray *)containedTypesForContainerType:(PajeEntityType *)containerType { NSArray *entityTypes; PajeEntityType *entityType; NSEnumerator *typeEnum; NSMutableArray *filteredTypes; filteredTypes = [NSMutableArray array]; entityTypes = [super containedTypesForContainerType:containerType]; typeEnum = [entityTypes objectEnumerator]; while ((entityType = [typeEnum nextObject]) != nil) { if (![self isHiddenEntityType:entityType]) { [filteredTypes addObject:entityType]; } } return filteredTypes; } - (id)filterHiddenContainer:(PajeContainer *)container filter:(NSSet *)filter { if ([filter containsObject:[self nameForContainer:container]]) { return nil; } else { return container; } } - (NSEnumerator *)enumeratorOfContainersTyped:(PajeContainerType *)entityType inContainer:(PajeContainer *)container { NSEnumerator *origEnum; NSMutableSet *filter; if ([self isHiddenEntityType:entityType]) { NSWarnLog(@"enumerating hidden type %@", entityType); return nil; } origEnum = [inputComponent enumeratorOfContainersTyped:entityType inContainer:container]; filter = [self filterForEntityType:entityType]; if (filter != nil) { return [[[FilteredEnumerator alloc] initWithEnumerator:origEnum filter:self selector:@selector(filterHiddenContainer:filter:) context:filter] autorelease]; } else { return origEnum; } } - (BOOL)isHiddenEntityType:(PajeEntityType*)entityType { NSString *entityTypeDescription; entityTypeDescription = [self descriptionForEntityType:entityType]; return [hiddenEntityTypes containsObject:entityTypeDescription]; } // // methods to be a dragging destination, as delegate of matrix // - (void)highlightCell:(id)cell inMatrix:(NSMatrix *)m { NSInteger r, c; static id highlightedCell; // the last cell that has been highlighted if (highlightedCell && ![highlightedCell isEqual:cell]) { [m getRow:&r column:&c ofCell:highlightedCell]; [m highlightCell:NO atRow:r column:c]; highlightedCell = nil; } if (cell && ![cell isEqual:highlightedCell]) { [m getRow:&r column:&c ofCell:cell]; [m highlightCell:YES atRow:r column:c]; highlightedCell = cell; } } #ifdef GNUSTEP - (NSDragOperation)matrix:(NSMatrix *)m draggingEntered:(id )sender { NSDebugMLog(@""); return NSDragOperationAll; } #endif - (NSDragOperation)matrix:(NSMatrix *)m draggingUpdated:(id )sender { NSPoint point = [m convertPoint:[sender draggingLocation] fromView:nil]; NSButtonCell *cell = [m cellAtPoint:point]; NSDebugMLog(@""); [self highlightCell:cell inMatrix:m]; if (cell) return NSDragOperationAll;//NSDragOperationGeneric; else return NSDragOperationNone; } #ifdef GNUSTEP - (BOOL)matrix:(NSMatrix *)m prepareForDragOperation:(id )sender { NSDebugMLog(@""); return YES; } #endif - (BOOL)matrix:(NSMatrix *)m performDragOperation:(id )sender { NSPoint point; NSButtonCell *cell; NSDebugMLog(@""); point = [m convertPoint:[sender draggingLocation] fromView:nil]; cell = [m cellAtPoint:point]; [self highlightCell:nil inMatrix:m]; if (cell != nil) { id entityType = [self selectedEntityType]; NSDebugMLog(@"entityType:%@ color:%@", entityType, [NSColor colorFromPasteboard:[sender draggingPasteboard]]); [inputComponent setColor:[NSColor colorFromPasteboard:[sender draggingPasteboard]] forValue:[cell representedObject] ofEntityType:entityType]; if ([cell state] == 1) { [super colorChangedForEntityType:entityType]; } [self synchronizeMatrix]; return YES; } return NO; } - (void)matrix:(NSMatrix *)m draggingExited:(id )sender { NSDebugMLog(@""); [self highlightCell:nil inMatrix:m]; } @end Paje-1.98/ContainerFilter/ContainerSelector.gorm/0000775000175000017500000000000011674062007021733 5ustar schnorrschnorrPaje-1.98/ContainerFilter/ContainerSelector.gorm/data.classes0000664000175000017500000000761611674062007024235 0ustar schnorrschnorr{ ContainerSelector = { Actions = ( "selectAll:", "unselectAll:", "matrixChanged:", "entityPopUpChanged:", "highlightCell:", "hideButtonClicked:" ); Outlets = ( view, matrix, entityTypePopUp, hideButton ); Super = PajeFilter; }; FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "inputEntity:", "outputEntity:", "unselectAll:", "matrixChanged:", "entityPopUpChanged:", "highlightCell:" ); Super = NSObject; }; PajeComponent = { Actions = ( "inputEntity:", "outputEntity:" ); Outlets = ( ); Super = NSObject; }; PajeFilter = { Actions = ( ); Outlets = ( ); Super = PajeComponent; }; }Paje-1.98/ContainerFilter/ContainerSelector.gorm/objects.gorm0000664000175000017500000001253711674062007024262 0ustar schnorrschnorrGNUstep archive00002a96:00000023:00000092:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary& 01NSString&% Button201NSButton1 NSControl1NSView1 NSResponder% C C A  C A& 01 NSMutableArray1 NSArray&%01 NSButtonCell1 NSActionCell1NSCell0&%Hide Container Type01NSImage0 1NSMutableString&% common_SwitchOff0 1NSFont%&&&&&&&&%0 &0 &0 0&% common_SwitchOn&&&0&%NSOwner0&%ContainerSelector0&% Box101NSBox% C C B A  B A& 0 &0%  B A  B A&0 &0% Bp  Bp A  Bp A& 0 &%0 0&%Hide all &&&&&&&&%0&0&&&&0%  Bp A  Bp A& 0 &%0 0&%Show all &&&&&&&&%0 &0!&&&&0"0#&%Title &&&&&&&& %%0$& % ScrollView0%1 NSScrollView%  C C  C C&0& &0'1 NSClipView% A @ Ck C  Ck C&0( &0)1NSMatrix%  Cj A  Cj A& 0* &%0+ 0,& &&&&&&&&%% Cj A 0-1NSColor0.&%NSNamedColorSpace0/&%System00&%controlBackgroundColor-01& % NSButtonCell02 03&%Switch &&&&&&&&%04&05& &&&%%06 &07 3 &&&&&&&&%408& &&&7-091 NSScroller% @ @ A C  A C&0: &%0;, &&&&&&&&&%2 _doScroll:v12@0:4@8'% A A A A 90<& % TextField0=1 NSTextField% C B A  B A& 0> &%0?1NSTextFieldCell0@&%Container type:0A% A0&&&&&&&&%0B.0C&%System0D&%textBackgroundColor0E.C0F& % textColor0G&%GSCustomClassMap0H&0I&%GormNSPopUpButton0J1 NSPopUpButton% B C C* A  C* A& 0K &%0L1NSPopUpButtonCell1NSMenuItemCell0M& &&&&&&&&0N1NSMenu0O&0P &0Q1 NSMenuItem0R&%Item 10S&&&%0T0U& % common_Nibble%0V0W&%Item 2S&&%%0X0Y&%Item 3S&&%%%0Z&0[&&&&QN%%%%%0\&%Button0]& % GormNSPanel0^1NSPanel1 NSWindow% ? A C C& % D'@ C0_% ? A C C  C C&0` &0a% A A` C C  C C&0b &0c%  C C  C C&0d &J%=0e0f&%Box &&&&&&&& %%0g.0h&%System0i&%windowBackgroundColor0j&%Window0k&%Panelk ? B F@ F@%0l0m&%NSApplicationIcon0n&%Boxa0o&%Matrix)0p&% Button10q &0r1!NSNibConnector]0s&%NSOwner0t!n0u!I0v!\0w!p0x1"NSNibControlConnectorIs0y&% entityPopUpChanged:0z"\s0{& %  selectAll:0|1#NSNibOutletConnectorsI0}&%entityTypePopUp0~#sn0&%view0"ps0& % unselectAll:0!o0!$0#so0&%matrix0"os0&%matrixChanged:0!0"s0&% hideButtonClicked:0#os0&%delegate0!<0#s0& % hideButton0!Paje-1.98/ReductionFilter/0000775000175000017500000000000011674062007015357 5ustar schnorrschnorrPaje-1.98/ReductionFilter/BusyEnumerator.h0000664000175000017500000000306311674062007020516 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _BusyEnumerator_h_ #define _BusyEnumerator_h_ // BusyEnumerator // // Enumerator that first enumerates the states of a trace, and // creates a list of time slices when the node is busy; then, // enumerates these busy states. // 19980227 BS creation #include #include "BusyArray.h" #includeinclude "BusyDate.h" @interface BusyEnumerator : NSEnumerator { NSEnumerator *enumerator; BusyArray *array; NSSet *busyEntities; BOOL firstFase; } - (id)initWithEnumerator:(NSEnumerator *)original container:(PajeContainer *)cont fromTime:(NSDate *)start toTime:(NSDate *)end concurrentTypes:(NSSet *)busySet; - (void)dealloc; - (id)nextObject; @end #endif Paje-1.98/ReductionFilter/GNUmakefile0000664000175000017500000000160111674062007017427 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make BUNDLE_NAME = ReductionFilter ReductionFilter_PRINCIPAL_CLASS = BusyNode ADDITIONAL_INCLUDE_DIRS = -I../General ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else ReductionFilter_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif ReductionFilter_RESOURCE_FILES = \ ReductionFilter.gorm \ ReductionFilter.nib ReductionFilter_OBJC_FILES = \ BusyNode.m \ BusyArray.m \ BusyDate.m \ ReduceEntity.m \ ReduceEntityType.m ReductionFilter_HEADER_FILES = \ BusyNode.h \ BusyArray.h \ BusyDate.h \ ReduceEntity.h \ ReduceEntityType.h -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/ReductionFilter/BusyArray.h0000664000175000017500000000534511674062007017460 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _BusyArray_h_ #define _BusyArray_h_ // BusyArray // // Array that keeps an ordered list (by time) of the occupation // of a node, with a BusyDate for each time, representing how many // threads (and which states) were busy between that time and the // next time of the list. Receives PStates as input objects. // Its enumerator returns PStates created to represent each of these // time slices. // 19980227 BS creation #include #include "../General/PSortedArray.h" #include "BusyDate.h" #include "../General/PajeContainer.h" @interface BusyArray : PSortedArray { PajeContainer *container; // not retained PajeEntityType *entityType; } - (id)initWithEntityType:(PajeEntityType *)et container:(PajeContainer *)cont startTime:(NSDate *)startTime endTime:(NSDate *)endTime; - (id)initWithEntityType:(PajeEntityType *)et container:(PajeContainer *)cont startTime:(NSDate *)startTime endTime:(NSDate *)endTime enumerator:(NSEnumerator *)enumerator valueFilter:(NSSet *)filter; - (void)dealloc; - (void)addEntity:(PajeEntity *)entity; - (NSEnumerator *)objectEnumeratorOfClass:(Class)c; - (NSEnumerator *)objectEnumeratorOfClass:(Class)c fromTime:(NSDate *)t1 toTime:(NSDate *)t2; - (NSEnumerator *)completeObjectEnumeratorOfClass:(Class)c fromTime:(NSDate *)t1 toTime:(NSDate *)t2; - (NSEnumerator *)reverseObjectEnumeratorOfClass:(Class)c; - (NSEnumerator *)reverseObjectEnumeratorOfClass:(Class)c fromTime:(NSDate *)t1 toTime:(NSDate *)t2; - (PajeContainer *)container; - (PajeEntityType *)entityType; - (NSDate *)startTime; - (NSDate *)endTime; @end #endif Paje-1.98/ReductionFilter/ReduceEntityType.h0000664000175000017500000000522511674062007021002 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _ReduceEntityType_h_ #define _ReduceEntityType_h_ #include "../General/PajeFilter.h" #include "../General/PajeType.h" #include "BusyArray.h" @interface ReduceEntityType : PajeVariableType { PajeFilter *component; Class entityClass; PajeEntityType *entityTypeToReduce; NSMutableSet *filterValues; // entity values that are reduced BusyArray *array; } + (ReduceEntityType *)typeWithName:(NSString *)n containerType:(PajeContainerType *)cont component:(PajeFilter *)comp; + (ReduceEntityType *)typeFromDictionary:(NSDictionary *)dict component:(PajeFilter *)comp; - (id)initWithName:(NSString *)n containerType:(PajeContainerType *)cont component:(PajeFilter *)comp; - (NSDictionary *)dictionaryForDefaults; - (PajeFilter *)component; - (void)setDescription:(NSString *)n; - (void)setContainerType:(PajeContainerType *)newContainerType; - (void)setEntityClass:(Class)c; - (Class)entityClass; - (void)setEntityTypeToReduce:(PajeEntityType *)newEntityTypeToReduce; - (PajeEntityType *)entityTypeToReduce; - (void)addValueToFilter:(id)value; - (void)addValuesToFilter:(NSArray *)values; - (void)removeValueFromFilter:(id)value; - (NSSet *)filterValues; - (NSEnumerator *)enumeratorOfEntitiesInContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration; - (NSEnumerator *)enumeratorOfCompleteEntitiesInContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration; @end #endif Paje-1.98/ReductionFilter/BusyNode.h0000664000175000017500000000570211674062007017264 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _BusyNode_h_ #define _BusyNode_h_ /* BusyNode.h created by benhur on Fri 27-Feb-1998 */ #include #include "BusyArray.h" #include "ReduceEntityType.h" #include "../General/PajeFilter.h" @interface BusyNode : PajeFilter { IBOutlet NSBox *view; // NSBox that contains interface objects IBOutlet NSTextField *entityNameField; // name of new entity type IBOutlet NSButton *createEntityButton; IBOutlet NSButton *renameEntityButton; IBOutlet NSButton *deleteEntityButton; IBOutlet NSPopUpButton *entityNamePopUp; // name of new entity type IBOutlet NSPopUpButton *entityTypePopUp; // select entity type to count IBOutlet NSPopUpButton *groupByPopUp; // select grouping IBOutlet NSPopUpButton *reduceModePopUp; // select way to reduce IBOutlet NSMatrix *nameMatrix; // switches; select event names to count NSMutableDictionary *entityTypesDictionary; NSMutableSet *reduceEntityTypes; NSMutableDictionary *typesContainingReducedTypes; } - (id)initWithController:(PajeTraceController *)c; - (void)dealloc; // // default read and write // - (void)readDefaults; - (void)registerDefaults; // // update interface // - (void)calcEntityTypes; - (void)calcEntityNamePopUp; - (void)calcEntityTypePopUp; - (void)calcGroupPopUp; - (void)calcReduceModePopUp; - (void)refreshMatrix; // // interaction with interface // - (IBAction)createEntityType:(id)sender; - (IBAction)deleteEntityType:(id)sender; - (IBAction)renameEntityType:(id)sender; - (IBAction)entityNamePopUpChanged:(id)sender; - (IBAction)entityTypePopUpChanged:(id)sender; - (IBAction)groupByPopUpChanged:(id)sender; - (IBAction)reduceModePopUpChanged:(id)sender; - (IBAction)matrixChanged:(id)sender; // - (void)calcHierarchy; - (void)addToHierarchy:(ReduceEntityType *)entityType; // // filtering // - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration; @end #endif Paje-1.98/ReductionFilter/BusyNode.m0000664000175000017500000005355611674062007017303 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* BusyNode.m created by benhur on Fri 27-Feb-1998 */ #include "BusyNode.h" #include "ReduceEntity.h" #include "../General/UniqueString.h" #include "../General/Macros.h" @implementation BusyNode - (id)initWithController:(PajeTraceController *)c { self = [super initWithController:c]; if (self) { // load the interface. it initializes view. if (![NSBundle loadNibNamed:@"ReductionFilter" owner:self]) NSRunAlertPanel(NSStringFromClass([self class]), @"Couldn't load interface file", nil, nil, nil); // view is an NSBox. we need its contents. view = [[view contentView] retain]; #ifndef GNUSTEP [[view window] autorelease]; #endif [view removeFromSuperview]; reduceEntityTypes = [[NSMutableSet alloc] init]; typesContainingReducedTypes = [[NSMutableDictionary alloc] init]; [self readDefaults]; // [self registerFilterWithInfo:[NSDictionary dictionaryWithObjectsAndKeys: // NSStringFromClass([self class]), @"Name", // view, @"View", nil]]; [self registerFilter:self]; } return self; } - (NSString *)filterName { return @"Reduction"; } - (NSView *)filterView { return view; } - (void)dealloc { [reduceEntityTypes release]; [entityTypesDictionary release]; [typesContainingReducedTypes release]; [view removeFromSuperview]; [groupByPopUp removeAllItems]; [entityTypePopUp removeAllItems]; //[nameMatrix removeAllItems]; [entityNamePopUp removeAllItems]; [view release]; [super dealloc]; } - (void)readDefaults { NSString *defaultName; defaultName = [NSStringFromClass([self class]) stringByAppendingString:@" ReduceEntityTypes"]; entityTypesDictionary = [[[NSUserDefaults standardUserDefaults] dictionaryForKey:defaultName] mutableCopy]; if (entityTypesDictionary == nil) { entityTypesDictionary = [[NSMutableDictionary alloc] init]; } } - (void)registerDefaults { NSString *defaultName; defaultName = [NSStringFromClass([self class]) stringByAppendingString:@" ReduceEntityTypes"]; [[NSUserDefaults standardUserDefaults] setObject:entityTypesDictionary forKey:defaultName]; } //TODO treat -dataChangedForEntityType: //- (void)dataChangedForEntityType:(id)entityType //{ // [self hierarchyChanged]; //} - (void)hierarchyChanged { [self calcEntityTypes]; [self calcEntityNamePopUp]; [self calcEntityTypePopUp]; [self calcGroupPopUp]; [self calcReduceModePopUp]; [self refreshMatrix]; [super hierarchyChanged]; } - (void)calcEntityTypes { NSEnumerator *filterEnum; NSDictionary *filter; ReduceEntityType *entityType; [reduceEntityTypes removeAllObjects]; filterEnum = [entityTypesDictionary objectEnumerator]; while ((filter = [filterEnum nextObject]) != nil) { entityType = [ReduceEntityType typeFromDictionary:filter component:self]; if (entityType != nil) { [reduceEntityTypes addObject:entityType]; [self addToHierarchy:entityType]; } } } - (void)calcEntityNamePopUp { NSEnumerator *typeEnumerator; ReduceEntityType *selectedType; ReduceEntityType *type; int ct = 0; selectedType = [[entityNamePopUp selectedItem] representedObject]; [entityNamePopUp removeAllItems]; typeEnumerator = [reduceEntityTypes objectEnumerator]; while ((type = [typeEnumerator nextObject]) != nil) { [entityNamePopUp addItemWithTitle:[type description]]; [[entityNamePopUp itemWithTitle:[type description]] setRepresentedObject:type]; ct++; } if (ct == 0) { [entityNamePopUp addItemWithTitle:@"None"]; [entityNamePopUp setEnabled:NO]; } else { [entityNamePopUp setEnabled:YES]; } if (selectedType != nil) [entityNamePopUp selectItemWithTitle:[selectedType description]]; if ([entityNamePopUp selectedItem] == nil && [entityNamePopUp numberOfItems] > 0) [entityNamePopUp selectItemAtIndex:0]; if ([entityNamePopUp selectedItem] != nil) [entityNameField setStringValue:[entityNamePopUp titleOfSelectedItem]]; } - (void)calcEntityTypePopUp { NSEnumerator *subenum; PajeEntityType *entityType; ReduceEntityType *type; int ct = 0; type = [[entityNamePopUp selectedItem] representedObject]; [entityTypePopUp removeAllItems]; // subenum = [[inputComponent allEntityTypes] objectEnumerator]; subenum = [[self allEntityTypes] objectEnumerator]; while ((entityType = [subenum nextObject]) != nil) { if (![self isContainerEntityType:entityType]) { NSString *title; title = [self descriptionForEntityType:entityType]; [entityTypePopUp addItemWithTitle:title]; [[entityTypePopUp itemWithTitle:title] setRepresentedObject:entityType]; ct++; } } if (ct == 0) { [entityTypePopUp addItemWithTitle:@"None"]; [entityTypePopUp setEnabled:NO]; } else { [entityTypePopUp setEnabled:YES]; } NSString *selectedTitle; selectedTitle = [self descriptionForEntityType:[type entityTypeToReduce]]; [entityTypePopUp selectItemWithTitle:selectedTitle]; } - (void)calcGroupPopUp { PajeEntityType *entityType; PajeEntityType *parentEntityType; ReduceEntityType *type; int ct = 0; type = [[entityNamePopUp selectedItem] representedObject]; [groupByPopUp removeAllItems]; entityType = [type entityTypeToReduce]; while ((parentEntityType = [self containerTypeForType:entityType]) != nil) { if (parentEntityType == entityType) break; entityType = parentEntityType; NSString *title; title = [self descriptionForEntityType:entityType]; [groupByPopUp insertItemWithTitle:title atIndex:0]; [[groupByPopUp itemAtIndex:0] setRepresentedObject:entityType]; ct++; } if (ct == 0) { [groupByPopUp addItemWithTitle:@"None"]; [groupByPopUp setEnabled:NO]; } else { [groupByPopUp setEnabled:YES]; } NSString *selectedTitle; selectedTitle = [self descriptionForEntityType: [self containerTypeForType:type]]; [groupByPopUp selectItemWithTitle:selectedTitle]; } - (void)calcReduceModePopUp { ReduceEntityType *type; Class entityClass; NSArray *reduceEntityClassNames = [NSArray arrayWithObjects: @"CountReduceEntity", @"SumReduceEntity", @"AverageReduceEntity", @"MaxReduceEntity", @"MinReduceEntity", nil]; NSEnumerator *classNameEnum; NSString *className; int ct = 0; [reduceModePopUp removeAllItems]; classNameEnum = [reduceEntityClassNames objectEnumerator]; while ((className = [classNameEnum nextObject]) != nil) { entityClass = NSClassFromString(className); if (!entityClass) { NSWarnMLog(@"class named %@ not found!", className); continue; } [reduceModePopUp addItemWithTitle:[entityClass titleForPopUp]]; [[reduceModePopUp lastItem] setRepresentedObject:entityClass]; ct++; } if (ct == 0) { [reduceModePopUp addItemWithTitle:@"None"]; [reduceModePopUp setEnabled:NO]; } else { [reduceModePopUp setEnabled:YES]; } type = [[entityNamePopUp selectedItem] representedObject]; entityClass = [type entityClass]; if (entityClass) [reduceModePopUp selectItemWithTitle:[entityClass titleForPopUp]]; } - (void)calcHierarchy { ReduceEntityType *entityType; NSEnumerator *entityTypeEnumerator; [typesContainingReducedTypes removeAllObjects]; entityTypeEnumerator = [reduceEntityTypes objectEnumerator]; while ((entityType = [entityTypeEnumerator nextObject]) != nil) { [self addToHierarchy:entityType]; } [super hierarchyChanged]; } - (void)addToHierarchy:(ReduceEntityType *)entityType { PajeContainerType *containerType; NSMutableArray *containedTypes; containerType = [entityType containerType]; containedTypes = [typesContainingReducedTypes objectForKey:containerType]; if (containedTypes == nil) { containedTypes = [NSMutableArray arrayWithObject:entityType]; [containedTypes addObjectsFromArray:[super containedTypesForContainerType:containerType]]; [typesContainingReducedTypes setObject:containedTypes forKey:containerType]; } else { [containedTypes addObject:entityType]; } } // // interaction with interface // - (IBAction)createEntityType:(id)sender; { ReduceEntityType *selectedEntityType; ReduceEntityType *newEntityType; NSString *newEntityName; int index; newEntityName = [entityNameField stringValue]; index = [entityNamePopUp indexOfItemWithTitle:newEntityName]; if (index != -1) { [entityNamePopUp selectItemAtIndex:index]; [self entityNamePopUpChanged:self]; return; } selectedEntityType = [[entityNamePopUp selectedItem] representedObject]; if (selectedEntityType) { newEntityType = [ReduceEntityType typeWithName:newEntityName containerType:(PajeContainerType *)[self containerTypeForType:selectedEntityType] component:self]; [newEntityType setEntityClass:[selectedEntityType entityClass]]; [newEntityType setEntityTypeToReduce:[selectedEntityType entityTypeToReduce]]; [newEntityType addValuesToFilter:[[selectedEntityType filterValues] allObjects]]; } else { newEntityType = [ReduceEntityType typeWithName:newEntityName containerType:(PajeContainerType *)[self rootEntityType] component:self]; [newEntityType setEntityClass:[CountReduceEntity class]]; [newEntityType setEntityTypeToReduce:nil]; //FIXME } [reduceEntityTypes addObject:newEntityType]; [entityTypesDictionary setObject:[newEntityType dictionaryForDefaults] forKey:[newEntityType description]]; [self registerDefaults]; [self addToHierarchy:newEntityType]; [self calcEntityNamePopUp]; [entityNamePopUp selectItemWithTitle:[newEntityType description]]; [self entityNamePopUpChanged:self]; [super hierarchyChanged]; } - (IBAction)deleteEntityType:(id)sender { PajeEntityType *entityType; entityType = [[entityNamePopUp selectedItem] representedObject]; if (entityType == nil) { NSBeep(); return; } [entityTypesDictionary removeObjectForKey:[entityType description]]; [reduceEntityTypes removeObject:entityType]; [self calcHierarchy]; [self registerDefaults]; [self hierarchyChanged]; } - (IBAction)renameEntityType:(id)sender { ReduceEntityType *entityType; NSString *oldName; NSString *newName; entityType = [[entityNamePopUp selectedItem] representedObject]; oldName = [entityType description]; newName = [entityNameField stringValue]; if ((oldName == nil) || (newName == nil) || [newName isEqual:oldName]) { NSBeep(); return; } [reduceEntityTypes removeObject:entityType]; [entityType setDescription:newName]; [reduceEntityTypes addObject:entityType]; [entityTypesDictionary removeObjectForKey:oldName]; [entityTypesDictionary setObject:[entityType dictionaryForDefaults] forKey:newName]; [self calcHierarchy]; [self registerDefaults]; [[entityNamePopUp selectedItem] setTitle:newName]; [entityNamePopUp synchronizeTitleAndSelectedItem]; // [super hierarchyChanged]; } - (IBAction)entityNamePopUpChanged:(id)sender { [entityNameField setStringValue:[entityNamePopUp titleOfSelectedItem]]; [self calcEntityTypePopUp]; [self calcGroupPopUp]; [self refreshMatrix]; } - (IBAction)entityTypePopUpChanged:(id)sender { ReduceEntityType *type; PajeEntityType *newEntityTypeToReduce; type = [[entityNamePopUp selectedItem] representedObject]; if (type == nil) { NSBeep(); return; } newEntityTypeToReduce = [[entityTypePopUp selectedItem] representedObject]; if (![[type entityTypeToReduce] isEqual:newEntityTypeToReduce]) { [type setEntityTypeToReduce:newEntityTypeToReduce]; [entityTypesDictionary setObject:[type dictionaryForDefaults] forKey:[type description]]; [self registerDefaults]; [self calcGroupPopUp]; [self refreshMatrix]; [self calcHierarchy]; } } - (IBAction)groupByPopUpChanged:(id)sender { ReduceEntityType *type; PajeContainerType *newContainerType; type = [[entityNamePopUp selectedItem] representedObject]; if (type == nil) { NSBeep(); return; } newContainerType = [[groupByPopUp selectedItem] representedObject]; if (![newContainerType isEqual:[type containerType]]) { [type setContainerType:newContainerType]; [entityTypesDictionary setObject:[type dictionaryForDefaults] forKey:[type description]]; [self registerDefaults]; [self refreshMatrix]; [self calcHierarchy]; } } - (IBAction)reduceModePopUpChanged:(id)sender { ReduceEntityType *type; Class entityClass; type = [[entityNamePopUp selectedItem] representedObject]; if (type == nil) { NSBeep(); return; } entityClass = [[reduceModePopUp selectedItem] representedObject]; if (entityClass == nil) { NSBeep(); return; } [type setEntityClass:entityClass]; [entityTypesDictionary setObject:[type dictionaryForDefaults] forKey:[type description]]; [self registerDefaults]; [super dataChangedForEntityType:type]; } - (IBAction)matrixChanged:(id)sender // some cell has been (de)selected in matrix. { ReduceEntityType *type; NSButtonCell *cell; cell = [sender selectedCell]; if (nil == cell) return; type = [[entityNamePopUp selectedItem] representedObject]; if (type == nil) { NSBeep(); return; } if ([cell state]) { [type removeValueFromFilter:[cell representedObject]]; } else { [type addValueToFilter:[cell representedObject]]; } [entityTypesDictionary setObject:[type dictionaryForDefaults] forKey:[type description]]; [self registerDefaults]; [super dataChangedForEntityType:type]; } - (void)refreshMatrix { unsigned i, n; NSButtonCell *cell; NSArray *allArray; ReduceEntityType *type; type = [[entityNamePopUp selectedItem] representedObject]; allArray = [inputComponent allValuesForEntityType:[type entityTypeToReduce]]; n = [allArray count]; [nameMatrix renewRows:n columns:1]; for (i = 0; i < n; i++) { NSString *name = [allArray objectAtIndex:i]; cell = [nameMatrix cellAtRow:i column:0]; [cell setTitle:name]; [cell setRepresentedObject:name]; [cell setState:![[type filterValues] containsObject:name]]; } [nameMatrix sizeToFit]; [nameMatrix setNeedsDisplay:YES]; } // // Trace messages that are filtered // - (NSArray *)containedTypesForContainerType:(PajeEntityType *)containerType { NSArray *containedTypes; containedTypes = [typesContainingReducedTypes objectForKey:containerType]; if (containedTypes != nil) { return containedTypes; } else { return [super containedTypesForContainerType:containerType]; } } - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { if (![entityType isKindOfClass:[ReduceEntityType class]]) { return [super enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; } return [(ReduceEntityType *)entityType enumeratorOfEntitiesInContainer:container fromTime:start toTime:end minDuration:minDuration]; } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { if (![entityType isKindOfClass:[ReduceEntityType class]]) { return [super enumeratorOfCompleteEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; } return [(ReduceEntityType *)entityType enumeratorOfCompleteEntitiesInContainer:container fromTime:start toTime:end minDuration:minDuration]; } - (BOOL)canHighlightEntity:(PajeEntity *)entity { if ([entity isKindOfClass:[ReduceEntity class]]) { return NO; } else { return [inputComponent canHighlightEntity:entity]; } } - (PajeDrawingType)drawingTypeForEntityType:(PajeEntityType *)entityType { if ([entityType isKindOfClass:[ReduceEntityType class]]) return [(ReduceEntityType *)entityType drawingType]; else return [super drawingTypeForEntityType:entityType]; } - (double)doubleValueForEntity:(PajeEntity *)entity { if ([entity isKindOfClass:[ReduceEntity class]]) { return [(ReduceEntity *)entity doubleValue]; } else { return [inputComponent doubleValueForEntity:entity]; } } - (double)minValueForEntity:(PajeEntity *)entity { if ([entity isKindOfClass:[ReduceEntity class]]) { return [(ReduceEntity *)entity minValue]; } else { return [inputComponent minValueForEntity:entity]; } } - (double)maxValueForEntity:(PajeEntity *)entity { if ([entity isKindOfClass:[ReduceEntity class]]) { return [(ReduceEntity *)entity maxValue]; } else { return [inputComponent maxValueForEntity:entity]; } } - (double)minValueForEntityType:(PajeEntityType *)entityType { if ([entityType isKindOfClass:[ReduceEntityType class]]) { return [(ReduceEntityType *)entityType minValue]; } else { return [super minValueForEntityType:entityType]; } } - (double)maxValueForEntityType:(PajeEntityType *)entityType { if ([entityType isKindOfClass:[ReduceEntityType class]]) { return [(ReduceEntityType *)entityType maxValue]; } else { return [super maxValueForEntityType:entityType]; } } - (double)minValueForEntityType:(PajeEntityType *)entityType inContainer:(PajeContainer *)container { if ([entityType isKindOfClass:[ReduceEntityType class]]) { return [(ReduceEntityType *)entityType minValue]; } else { return [super minValueForEntityType:entityType inContainer:container]; } } - (double)maxValueForEntityType:(PajeEntityType *)entityType inContainer:(PajeContainer *)container { if ([entityType isKindOfClass:[ReduceEntityType class]]) { return [(ReduceEntityType *)entityType maxValue]; } else { return [super maxValueForEntityType:entityType inContainer:container]; } } - (id)configuration { NSEnumerator *typeEnum; ReduceEntityType *type; NSMutableArray *types; types = [NSMutableArray arrayWithCapacity:[reduceEntityTypes count]]; typeEnum = [reduceEntityTypes objectEnumerator]; while ((type = [typeEnum nextObject]) != nil) { [types addObject:[type dictionaryForDefaults]]; } return types; } - (void)setConfiguration:(id)config { NSEnumerator *filterEnum; NSDictionary *filter; ReduceEntityType *entityType; [reduceEntityTypes removeAllObjects]; filterEnum = [config objectEnumerator]; while ((filter = [filterEnum nextObject]) != nil) { entityType = [ReduceEntityType typeFromDictionary:filter component:self]; if (entityType != nil) { [reduceEntityTypes addObject:entityType]; [self addToHierarchy:entityType]; } } [self calcEntityNamePopUp]; [self calcEntityTypePopUp]; [self calcGroupPopUp]; [self calcReduceModePopUp]; [self refreshMatrix]; [self calcHierarchy]; //[super hierarchyChanged]; } @end Paje-1.98/ReductionFilter/ReductionFilter.gorm/0000775000175000017500000000000011674062007021424 5ustar schnorrschnorrPaje-1.98/ReductionFilter/ReductionFilter.gorm/data.info0000664000175000017500000000027011674062007023211 0ustar schnorrschnorrGNUstep archive00002c24:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed StreamPaje-1.98/ReductionFilter/ReductionFilter.gorm/data.classes0000664000175000017500000000142511674062007023716 0ustar schnorrschnorr{ "## Comment" = "Do NOT change this file, Gorm maintains it"; BusyNode = { Actions = ( "createEntityType:", "deleteEntityType:", "renameEntityType:", "entityNamePopUpChanged:", "entityTypePopUpChanged:", "groupByPopUpChanged:", "reduceModePopUpChanged:", "matrixChanged:" ); Outlets = ( view, entityTypePopUp, groupByPopUp, nameMatrix, entityNamePopUp, entityNameField, createEntityButton, deleteEntityButton, renameEntityButton, reduceModePopUp ); Super = PajeFilter; }; PajeComponent = { Actions = ( "inputEntity:", "outputEntity:" ); Outlets = ( ); Super = NSObject; }; PajeFilter = { Actions = ( ); Outlets = ( ); Super = PajeComponent; }; }Paje-1.98/ReductionFilter/ReductionFilter.gorm/objects.gorm0000664000175000017500000002605711674062007023755 0ustar schnorrschnorrGNUstep archive00002c24:00000028:0000014a:00000000:01GSNibContainer1NSObject01 GSMutableSet1 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&%NSPanel1 NSPanel1 NSWindow1 NSResponder% ? A C Cƀ& % B D/01 NSView% ? A C Cƀ  C Cƀ&01 NSMutableArray1NSArray&01NSBox% @ A C C  C C&0 &0 %  C C  C C&0 &  0 1 NSTextField1 NSControl% A C B A  B A& 0 &%0 1NSTextFieldCell1 NSActionCell1NSCell0&%New name01NSFont% A0&&&&&&&&0%01NSColor0&%NSNamedColorSpace0&%System0&%textBackgroundColor00& % textColor0% B C C A  C A& 0 &%00&0%&&&&&&&&0%00&%System0&%textBackgroundColor00& % textColor0 % A C\ B A  B A& 0! &%0"0#& % Reduce type#&&&&&&&&0%0$0%&%System0&&%textBackgroundColor0'%0(& % textColor0)1 NSPopUpButton1NSButton% B CX C A  C A& 0* &%0+1NSPopUpButtonCell1NSMenuItemCell1 NSButtonCell0,&&&&&&&&&0-1NSMenu0.&0/ &001 NSMenuItem01&%Item 1,&&%%0203&%Item 2,&&%%0405&%Item 3,&&%%%06&6&&&-%%%%%07% A Cs B A  B A& 08 &%090:& % Entity name:&&&&&&&&0%0;0<&%System0=&%textBackgroundColor0><0?& % textColor0@% B Co C A  C A& 0A &%0B0C&&&&&&&&&0D0E&0F &0G0H&%Item 1C&&%%0I0J&%Item 2C&&%%0K0L&%Item 3C&&%%%0M&M&&&D%%%%%0N% A C. B A  B A& 0O &%0P0Q&%Group byQ&&&&&&&&0%0R0S&%System0T&%textBackgroundColor0US0V& % textColor0W% B C* C A  C A& 0X &%0Y0Z&&&&&&&&&0[0\&0] &0^0_&%Item 1Z&&%%0`0a&%Item 2Z&&%%0b0c&%Item 3Z&&%%%0d&d&&&[%%%%%0e% A CE B A  B A& 0f &%0g0h& % Reductionh&&&&&&&&0%0i0j&%System0k&%textBackgroundColor0lj0m& % textColor0n% B CA C A  C A& 0o &%0p0q&&&&&&&&&0r0s&0t &0u0v&%Item 1q&&%%0w0x&%Item 2q&&%%0y0z&%Item 3q&&%%%0{&{&&&r%%%%%0|1 NSScrollView% @ @ Cy C   Cy C &0} &0~1 NSClipView% A ? Cd C   Cd C &0 &01 NSMatrix%  B B  B B&0 &%00&&&&&&&&&%% B A 00&%System0&%controlBackgroundColor00&%NSCalibratedRGBColorSpace ?e ?e ?e ?e ?0& % NSButtonCell00&01!NSImage01"NSMutableString&%common_SwitchOff&&&&&&&&%0&0&0!0"&%common_SwitchOn&&&%%0 &0&&&&&&&&%0&&&&0&&&&&&&&%0&&&&0&&&&&&&&%0&&&&0&&&&&&&&%0&&&&0&&&&&&&&%0&&&&0&&&&&&&&%0&&&&0 ? ? ? ? ?01# NSScroller% ? ? A C   A C &0 &%0&&&&&&&&&~% A A A A 0% B C C A  C A& 0 &0 %  C A  C A&0 &0%  B< A  B< A&0 &%00&%Create&&&&&&&&%0&0&&&&0% B<  B\ A  B\ A&0 &%00&%Rename&&&&&&&&%0&0&&&&0% B  B@ A  B@ A&0 &%00&%Delete&&&&&&&&%0&0&&&&00&%Title&&&&&&&& %%0% A C B A  B A& 0 &%00&%Values to reduce:0% A&&&&&&&&0%00&%System0±&%textBackgroundColor0ñ0ı& % textColor0ű0Ʊ&%Box&&&&&&&& %%0DZ0ȱ&%windowBackgroundColor0ɱ&%Window0ʱ&%Panel ? ? F@ F@%&   E D0˱ &0̱ &01$NSMutableDictionary1% NSDictionary&&0α&%View(2)0ϱ&%View(1) 0б&%View(0)0ѱ&%PopUpButton(3)n0ұ& % Matrix(0)0ӱ& % MenuItem(9)u0Ա&%PopUpButton(2)W0ձ& % ClipView(0)~0ֱ& % MenuItem(8)b0ױ&%PopUpButton(1)@0ر& % Button(2)0ٱ& % MenuItem(7)`0ڱ& % Scroller(1)0۱&%Box(1)0ܱ& % ScrollView(0)|0ݱ&%PopUpButton(0))0ޱ& % MenuItem(6)^0߱& % Button(1)0& % Scroller(0)0#% A B Ch A`  Ch A`&0 &%0&&&&&&&&&0&%Box(0)0& % TextField(7)0& % Button(0)0& % MenuItem(5)K0& % MenuItem(4)I0& % TextField(5)e0& % MenuItem(3)G0& % TextField(4)N0& % MenuItem(2)40& % TextField(3) 0& % MenuItem(1)20& % TextField(2)70& % MenuItem(0)00&%Panel(0)0& % TextField(1)0& % TextField(0) 0&%NSOwner0&%BusyNode0& % MenuItem(11)y0& % MenuItem(10)w0 &::01&NSNibConnector0&%NSOwner0&а0&А0&ϰ0&ϐ0&ϐP&ېP&߰ېP&ذېP&ϐP&ݰϐP&ݐP&ݐP&ݐP&ϐP &װϐP &אP &אP &אP &ϐP&԰ϐP&ްԐP&ٰԐP&ְԐP&ϐP&ѰϐP&ӰѐP&ѐP&ѐP&ҐP&ܰϐP&հܐP&ܐP1'NSNibControlConnectorP& % _doScroll:P&ڰܐP'ڰP& % _doScroll:P &۰ϐP!&ΰېP"&ϐP#'P$"&%createEntityType:P%'$P&'߰P'"&%renameEntityType:P('ذP)"&%deleteEntityType:P*'װP+"&%entityNamePopUpChanged:P,'ݰP-"&%entityTypePopUpChanged:P.'ѰP/"&%reduceModePopUpChanged:P0'԰P1"&%groupByPopUpChanged:P2'ҰP3"&%matrixChanged:P41(NSNibOutletConnectorP5"&%viewP6(P7"&%createEntityButtonP8(P9"&%entityNameFieldP:(P;"&%deleteEntityButtonP<(P="&%renameEntityButtonP>(P?"&%entityNamePopUpP@(PA"&%entityTypePopUpPB(PC"&%reduceModePopUpPD(PE"& % groupByPopUpPF(PG"& % nameMatrixPH$&Paje-1.98/ReductionFilter/BusyEnumerator.m0000664000175000017500000000422511674062007020524 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // BusyEnumerator.m // 19980227 BS creation #include "BusyEnumerator.h" #include "ReduceEntity.h" #include "BusyState.h" @implementation BusyEnumerator - (id)initWithEnumerator:(NSEnumerator *)original container:(PajeContainer *)cont fromTime:(NSDate *)start toTime:(NSDate *)end concurrentTypes:(NSSet *)busySet { self = [super init]; enumerator = [original retain]; busyEntities = [busySet retain]; array = [[BusyArray alloc] initWithEntityType:[BusyState entityType] container:cont startTime:start endTime:end]; firstFase = YES; return self; } - (void)dealloc { [enumerator release]; [busyEntities release]; [array release]; [super dealloc]; } - (id)nextObject { id obj; if (firstFase) { do { obj = [enumerator nextObject]; if ((nil != obj) && [busyEntities containsObject:[obj name]]) [array addObject:obj]; } while (obj); if (/*sendOriginal && */(nil != obj)) { return obj; } else { firstFase = NO; [enumerator release]; enumerator = [[array objectEnumeratorOfClass:[CountReduceEntity class]] retain]; } } // second fase -- take objects from the array enumerator return [enumerator nextObject]; } @end Paje-1.98/ReductionFilter/ReductionFilter.nib/0000775000175000017500000000000011674062007021230 5ustar schnorrschnorrPaje-1.98/ReductionFilter/ReductionFilter.nib/keyedobjects.nib0000664000175000017500000003757211674062007024413 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdatai 156<=AE[cqyz !+,678<>CDGJNUVafgjopwx!"&(,/67CEOSU[d!mtu! #$(-1268;>BCFOW_`ahlmpz{|{!   %&+,1278=>CDptuL   .      ^3U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRoote%&$g'hfM234[NSClassNameXBusyNode789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FZGHIJKLMNOPQRSTUVWXY $؀ڀ܀ހg\]^_`a0]NSDestinationWNSLabelXNSSource defghijjlmnop_NSNextResponder[NSSuperviewWNSFrameYNSEnabledXNSvFlagsVNSCell   rdsetuvuxZNSSubviews[NSFrameSize(%р%_{{223, 302}, {55, 16}}{|}~__NSKeyEquivalent_NSAlternateImageYNSSupportZNSContents]NSControlView^NSButtonFlags2_NSPeriodicInterval]NSButtonFlags_NSPeriodicDelay[NSCellFlags_NSAlternateContents\NSCellFlags2 "K@VDeleteVNSSizeVNSNameXNSfFlags"A0 \LucidaGrande78;VNSFontP78i;\NSButtonCell]%NSButtonCell\NSActionCell78;XNSButtonYNSControlVNSView[NSResponder_deleteEntityButton78;_NSNibOutletConnector^NSNibConnector\]^a0defghijjmo€   _{{111, 302}, {55, 16}}{|}~VCreate_createEntityButton\]^a0#defghijjmoڀ  !_{{165, 302}, {59, 16}}{|}~"VRename_renameEntityButton\]^ua0%׀rdsehj\NSBorderType_NSTitlePosition[NSTitleCellYNSOffsets]NSTransparent]NSContentViewYNSBoxType'&Ҁ&Ԁ rdf.x>Zj g> Z    _)7?CGK Ok{gdefghijjm * 6+_{{18, 319}, {88, 14}}"#}~$%' )*_NSBackgroundColor[NSTextColor-2,)5@ZNew name -./012345WNSColor[NSColorName\NSColorSpace]NSCatalogName0/.1VSystem\controlColor9/:5WNSWhiteK0.66666669178=--;-./0?@34543.1_controlTextColor9/E5B0178HIIi;_NSTextFieldCell78KLLM;[NSTextField\%NSTextFielddefghijjQmT 8 69_{{111, 317}, {167, 19}}"#}~WXY m)_`_NSDrawsBackground:=7 5qAB-./0bc345<;.1_textBackgroundColor9/h5B11-./0?l3454>.1YtextColordefghijjsmv @ 6A_{{18, 275}, {88, 14}}"#}~$%| )*-2B?5[Entity namedefghijjm D 6E_{{18, 253}, {88, 14}}"#}~$% )*-2FC5[Reduce typedefghijjm H 6I_{{18, 231}, {88, 14}}"#}~$%)*-2JG5YReductiondefghijjm L 6M_{{18, 209}, {88, 14}}"#}~$%)*-2NK5XGroup bydefghijjm P jQ_{{108, 248}, {174, 22}}|{}mmmVNSMenuZNSMenuItem_NSPreferredEdgeZNSPullDown]NSAltersState_NSUsesItemFromMenu_NSArrowPositionA@@UT i OR YNS.stringS78ԣ;_NSMutableStringXNSStringm]NSMnemonicLoc_NSKeyEquivModMaskWNSStateWNSTitleYNSOnImageZNSKeyEquivXNSTargetZNSIsHidden\NSMixedImageXNSActionUVWQ [^][NSMenuItems_h`UItem12^NSResourceNameYZXWNSImage_NSMenuCheckmark78;_NSCustomResource_%NSCustomResource2\ZX_NSMenuMixedState__popUpItemAction:78;ZOtherViewsS> Z  TadgUbWQ[^cUItem2 UeWQ[^fUItem378#$$%;^NSMutableArrayWNSArray78';78)**+i;_NSPopUpButtonCell^NSMenuItemCell78-..;]NSPopUpButtondefghijj2m5 l jm_{{108, 226}, {174, 22}}|{}9:mm@m€po i kn рS9G5mNpqWm [^rPRshtрS>VZ:XYouxg9]5cpvWm[^w9f5lpyWm[^zdefghijjpms | j}_{{108, 204}, {174, 22}}|{}wxmm~m€ i {~ рSwsmW} [^hрS>ZxgwsW}[^wsW}[^rdefhjj >Zgrdsex>ZÀgrdseh]NSNextKeyView[NSHScrollerXNSsFlags[NSVScroller>Zπgrdefh$YNSBGColorYNSDocViewYNScvFlags->Zgdges"hm$$[NSCellClassZNSCellSizeYNSNumRowsYNSNumCols]NSSelectedColWNSCells[NSProtoCell]NSSelectedRow_NSCellBackgroundColor]NSMatrixFlags_NSIntercellSpacing --X{64, 66}>Z   g|}~]NSNormalImageH%Z&g>),*+./0_NSTIFFRepresentationOMM*)LLLssstttrrrqqqqqqqqqtttttt???)  ""##!!bbbeee ^!!! ]  -FLLLMMME- vRS~s  applmntrRGB XYZ 5acspAPPL-applo]4Q$\A rXYZ gXYZ4bXYZHwtpt\chadp,rTRCgTRCbTRCvcgt0ndin8desc4cprt-mmod(XYZ oT:xXYZ ^=XYZ (PXYZ ihsf32_ d?7curvcurvcurvvcgtndin0WJ@@%HL@:::descSDM-X72 CalibratedSDM-X72 CalibratedSDM-X72 CalibratedtextCopyright Apple Computer, Inc., 2003mmodMp783445;_NSBitmapImageRepZNSImageRep787%%;9/95D0 0178<=;X%NSImage?@A[NSImageNameXNSSwitch78DEE;_NSButtonImageSource|}~GUNSTag|}~G|}~GX{64, 18}W{0, -2}|}~G78ijjk;XNSMatrixY%NSMatrix_{{1, 1}, {244, 150}}78noo;ZNSClipViewdefhquvvwxyYNSPercent"?n_{{245, 1}, {11, 150}}\_doScroller:78}~~;ZNSScrollerdefhqvw"?l_{{-100, -100}, {209, 15}}Z{257, 152}78;\NSScrollViewZ{258, 153}78;_{{21, 21}, {258, 168}}V{0, 0}"#}~X):5_Values to reduce9/5M0 0.80000001178;UNSBoxdefghijjm j_{{108, 270}, {174, 22}}|{}mmm€ƀŀ i Ā рSmƀǀW [^€ɀhрS>Zɀŀˀ΀gӀƀ̀WÀ[^܀ƀπWÀ[^Z{298, 356}"#}~X):րՀ5SBox9/51Tview\]^ a07ـ_entityNameField\]^a0ۀ_entityNamePopUp\]^a0O݀_entityTypePopUp\]^a0{߀\groupByPopUp\]^a0k_reduceModePopUp\]^a0ZnameMatrix\]^0 7_createEntityType78;_NSNibControlConnector\]^0\]^0π_renameEntityType\]^0"_ _deleteEntityType\]^0(_entityNamePopUpChanged\]^0.O_entityTypePopUpChanged\]^04k_reduceModePopUpChanged\]^0:{_groupByPopUpChanged\]^0@怓]matrixChanged>E,)   : xS YuwX   _j9 7&UG?o)ˀkCx%ua΀ ƀ pOŀd{TK>qZu%g_{{1, 1}, {298, 356}}vwxyz{|}~_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClass&px_{{424, 280}, {298, 356}}UPanelSWNSPanelSTViewS_{{0, 0}, {1280, 1002}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78;_NSWindowTemplate>,)jSjwj9jjjw0jwj99jjjujjj O p ƀ p&{pUƀ %k ƀU U >,  : 0xS YuwX j9 7UG?o)ˀkCx%ua΀ƀ p{ŀdOTK>,       !"#YPopUpList_NSTextField11111[NSMenuItem1^NSTextField111\NSTextField1\File's Owner_NSPopUpButton11[NSMenuItem2_NSTextField1111YNSButton4_NSPopUpButton111^NSPopUpButton1_NSTextField111111>,>,>,= J RW xX :IYGS_09UVTSN   ju YwHMOXQK LP{$7a򀧀oOx Uˀ G΀pƀKހ)dC %?􀀀܀u؀&kڀŀT>_,=`abcdefghijklmnopqrstuvwxyz{|}~()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd/#-.8 2@E&F07 5A'CDB<4 3  G$6;=!?91:>%>Zg>,>,78;^NSIBObjectData#,1:LQVdf<B.5CQ_y&/BKVWYbiv|  +=IQ[dkmoqruwy",7ETiw(16=NPRTU^iv   ' ) + - / L N P R S V X Z s       / d f h j l n p r y    - 7 9 ; = ? A C E G H J L N _ a c e g p s u w  0 < > @ B D F H M X m u      ( + - 6 ? Q Z g s +-/13IVY[prtvx!#;\^`bdfht  +LNPRTVXa~!/DVXachjlnotvwy{}~!+6?JW`bglnprtuwy{ "$&9MV[doqz&.7<EThw,.024578:<>?HJ{}$&(*,.024QSUWXZ\v!#%2468ACLSUWY[  !$&(=?ACEGPSUW$&(*,.02479BEGI*,.79;<>@BDMOQS\enprtvx   &)+-6;=?AJace####2#=#F#K#X#]#_#h#o#x###########$$$$$ $ $D$F$H$J$L$N$P$R$$$$$$$$$$$$$$$$$$%% %%+%4%=%H%m%w%y%{%}%%%%%%%%%%%%%%%%&&&&$&/&8&A&N&Y&b&i&&&&&&&&&&&&&&&''''''' ':''''''''''''''''''''''''''''(((((((((H(J(L(N(P(R(T(V(X((((((((((((((((((((((((()))))))1)B)D)F)H)J)\)m)o)q)s)u)))))))))))))))))))** *%*6*8*:*<*>*O*Q*S*U*W*j*{*}****************+ + ++++,+=+?+A+C+E+[+l+n+p+r+t++++++++++++++++++,,,,,, , ,,,,,,,,,, ,",$,&,(,*,,,.,0,2,4,=,@,B,D,[,,,,,,,,,- ---!-#-%-'-)-,-.-3-6-8-S-\-b-d-m-u-w----------.G.I.K.M.O.Q.S.U.W.Y.[.]._.a.c.e.g.i.k.m.o.q.s.u.w.y.{.}..............................///// / / //////////!/#/%/./o/r/u/x/{/~//////////////////////////////000 020>0P0Z0m0|000000001.10121416181:1<1>1@1B1D1F1H1J1L1N1P1R1T1V1X1Z1\1^1`1b1d1f1h1j1l1n1p1r1t1v1x1z1|1~11111111111111111111111202326292<2?2B2E2H2K2N2Q2T2W2Z2]2`2c2f2i2l2o2r2u2x2{2~2222222222222222222222222222222222222222222222233333 3 3 3333333333!3#3%3'3)3+3-3/31333537393;3=3?3A3C3E3G3I3K3M3O3Q3S3U3W3`3a3c3l3m3o3x3y3{333Paje-1.98/ReductionFilter/ReductionFilter.nib/info.nib0000664000175000017500000000070411674062007022656 0ustar schnorrschnorr IBDocumentLocation 69 62 356 240 0 0 1280 1002 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/ReductionFilter/ReductionFilter.nib/classes.nib0000664000175000017500000000237511674062007023366 0ustar schnorrschnorr{ IBClasses = ( { ACTIONS = { createEntityType = id; deleteEntityType = id; entityNamePopUpChanged = id; entityTypePopUpChanged = id; groupByPopUpChanged = id; matrixChanged = id; reduceModePopUpChanged = id; renameEntityType = id; }; CLASS = BusyNode; LANGUAGE = ObjC; OUTLETS = { createEntityButton = NSButton; deleteEntityButton = NSButton; entityNameField = NSTextField; entityNamePopUp = NSPopUpButton; entityTypePopUp = NSPopUpButton; groupByPopUp = NSPopUpButton; nameMatrix = NSMatrix; reduceModePopUp = NSPopUpButton; renameEntityButton = NSButton; view = NSBox; }; SUPERCLASS = PajeFilter; }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeComponent; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeFilter; LANGUAGE = ObjC; SUPERCLASS = PajeComponent; } ); IBVersion = 1; }Paje-1.98/ReductionFilter/BusyState.h0000664000175000017500000000372011674062007017455 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _BusyArray_h_ #define _BusyArray_h_ // BusyState // // Has a state of a node // (start and end time, and active states in this time slice). // 19980302 BS creation #include #include "../General/Protocols.h" #include "../A0bSimul.bproj/A0State.h" extern NSString *BusyStateEntityType; @interface BusyState : /*NSObject */A0State { NSDate *startTime; NSDate *endTime; id container; // NSArray *relatedEntities; } + (BusyState *)stateWithStartTime:(NSDate *)start endTime:(NSDate *)end container:(PajeContainer *)cont relatedEntities:(NSArray *)related; - (id)initWithStartTime:(NSDate *)start endTime:(NSDate *)end container:(PajeContainer *)cont relatedEntities:(NSArray *)related; - (void)dealloc; + (PajeDrawingType)drawingType; + (NSString *)entityType; - (PajeDrawingType)drawingType; - (NSString *)entityType; - (NSNumber *)value; - (NSDate *)startTime; - (NSDate *)endTime; - (id)container; - (NSString *)name; - (NSColor *)color; - (NSArray *)relatedEntities; - (void)inspect; @end #endif Paje-1.98/ReductionFilter/BusyDate.h0000664000175000017500000000255511674062007017257 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _BusyDate_h_ #define _BusyDate_h_ // BusyDate // // Keeps a date and an array of PStates that are active in that date. // 19980228 BS creation #include #include "../General/Protocols.h" @interface BusyDate : NSObject { NSDate *time; NSMutableArray *objects; } + (BusyDate *)dateWithDate:(NSDate *)date objects:(NSArray *)objs; - (id)initWithDate:(NSDate *)date objects:(NSArray *)objs; - (void)dealloc; - (NSDate *)time; - (void)addObject:(id)obj; - (NSArray *)allObjects; - (NSString *)description; @end #endif Paje-1.98/ReductionFilter/ReduceEntityType.m0000664000175000017500000002230211674062007021002 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "ReduceEntityType.h" #include "ReduceEntity.h" #include "../General/Macros.h" #include "../General/NSUserDefaults+Additions.h" #include @implementation ReduceEntityType + (ReduceEntityType *)typeFromDictionary:(NSDictionary *)dict component:(PajeFilter *)comp { ReduceEntityType *newType; NSString *n; PajeContainerType *cont; PajeEntityType *red; NSEnumerator *en; NSString *nameToFilter; Class reductionClass; cont = (PajeContainerType *)[comp entityTypeWithName:[dict objectForKey:@"ContainerType"]]; if (cont == nil) return nil; red = [comp entityTypeWithName:[dict objectForKey:@"EntityTypeToReduce"]]; if (red == nil) return nil; n = [dict objectForKey:@"EntityName"]; if (n == nil) return nil; newType = [self typeWithName:n containerType:cont component:comp]; if (newType == nil) return nil; [newType setEntityTypeToReduce:red]; reductionClass = NSClassFromString([dict objectForKey:@"ReductionClass"]); if (reductionClass == Nil) { reductionClass = [CountReduceEntity class]; } [newType setEntityClass:reductionClass]; en = [[dict objectForKey:@"ValuesToFilter"] objectEnumerator]; while ((nameToFilter = [en nextObject]) != nil) { [newType addValueToFilter:nameToFilter]; } return newType; } + (ReduceEntityType *)typeWithName:(NSString *)n containerType:(PajeContainerType *)cont component:(PajeFilter *)comp { return [[[self alloc] initWithName:n containerType:cont component:comp] autorelease]; } - (id)initWithName:(NSString *)n containerType:(PajeContainerType *)type component:(PajeFilter *)comp { // super adds self as a subtype of containertype. // call init with nil as containerType so as to not do that; // initialize containerType after it. self = [super initWithId:n description:n containerType:nil event:nil]; if (self != nil) { containerType = type; component = comp; filterValues = [[NSMutableSet alloc] init]; } return self; } - (void)dealloc { Assign(filterValues, nil); Assign(entityTypeToReduce, nil); Assign(array, nil); [super dealloc]; } - (PajeFilter *)component { return component; } - (NSDictionary *)dictionaryForDefaults { return [NSDictionary dictionaryWithObjectsAndKeys: [self description], @"EntityName", [[self containerType] description], @"ContainerType", [[self entityTypeToReduce] description], @"EntityTypeToReduce", [filterValues allObjects], @"ValuesToFilter", NSStringFromClass(entityClass), @"ReductionClass", nil]; } - (void)setDescription:(NSString *)n { Assign(description, n); } - (void)setContainerType:(PajeContainerType *)newContainerType { NSString *defaultName; Assign(containerType, newContainerType); defaultName = [[self description] stringByAppendingString:@"ContainerType"]; [[NSUserDefaults standardUserDefaults] setObject:[containerType description] forKey:defaultName]; minValue = HUGE_VAL; maxValue = -HUGE_VAL; Assign(array, nil); } - (void)setEntityClass:(Class)c { entityClass = c; minValue = HUGE_VAL; maxValue = -HUGE_VAL; if (array != nil) { [entityClass getMinValue:&minValue maxValue:&maxValue forArray:array pajeComponent:component]; } } - (Class)entityClass { return entityClass; } - (PajeDrawingType)drawingType { return PajeVariableDrawingType; } - (void)setEntityTypeToReduce:(PajeEntityType *)newEntityTypeToReduce { Assign(entityTypeToReduce, newEntityTypeToReduce); [filterValues removeAllObjects]; Assign(array, nil); minValue = HUGE_VAL; maxValue = -HUGE_VAL; } - (PajeEntityType *)entityTypeToReduce { return entityTypeToReduce; } - (void)addValueToFilter:(id)value { [filterValues addObject:value]; Assign(array, nil); minValue = HUGE_VAL; maxValue = -HUGE_VAL; } - (void)addValuesToFilter:(NSArray *)values { [filterValues addObjectsFromArray:values]; Assign(array, nil); minValue = HUGE_VAL; maxValue = -HUGE_VAL; } - (void)removeValueFromFilter:(id)value { [filterValues removeObject:value]; Assign(array, nil); minValue = HUGE_VAL; maxValue = -HUGE_VAL; } - (NSSet *)filterValues { return filterValues; } - (NSEnumerator *)enumeratorOfEntitiesInContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { NSEnumerator *origEnum; double min; double max; BOOL limitsChanged = NO; if (array != nil && [container isEqual:[array container]] && ![start isEarlierThanDate:[array startTime]] && ![end isLaterThanDate:[array endTime]]) { return [array reverseObjectEnumeratorOfClass:entityClass fromTime:start toTime:end]; } if (array != nil) [array release]; origEnum = [component enumeratorOfEntitiesTyped:entityTypeToReduce inContainer:container fromTime:start toTime:end minDuration:0]; array = [[BusyArray alloc] initWithEntityType:self container:container startTime:start endTime:end enumerator:origEnum valueFilter:filterValues]; [entityClass getMinValue:&min maxValue:&max forArray:array pajeComponent:component]; if (min < minValue) { minValue = min; limitsChanged = YES; } if (max > maxValue) { maxValue = max; limitsChanged = YES; } if (limitsChanged) { [component limitsChangedForEntityType:self]; } return [array reverseObjectEnumeratorOfClass:entityClass]; } - (NSEnumerator *)enumeratorOfCompleteEntitiesInContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { NSEnumerator *origEnum; double min; double max; BOOL limitsChanged = NO; if (array != nil && [container isEqual:[array container]] && ![start isEarlierThanDate:[array startTime]] && ![end isLaterThanDate:[array endTime]]) { return [array completeObjectEnumeratorOfClass:entityClass fromTime:start toTime:end]; } if (array != nil) [array release]; origEnum = [component enumeratorOfEntitiesTyped:entityTypeToReduce inContainer:container fromTime:start toTime:end minDuration:0]; array = [[BusyArray alloc] initWithEntityType:self container:container startTime:start endTime:end enumerator:origEnum valueFilter:filterValues]; [entityClass getMinValue:&min maxValue:&max forArray:array pajeComponent:component]; if (min < minValue) { minValue = min; limitsChanged = YES; } if (max > maxValue) { maxValue = max; limitsChanged = YES; } if (limitsChanged) { [component limitsChangedForEntityType:self]; } return [array completeObjectEnumeratorOfClass:entityClass fromTime:start toTime:end]; } @end Paje-1.98/ReductionFilter/BusyState.m0000664000175000017500000000662511674062007017471 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // BusyState #include "BusyState.h" #include #include "../General/UniqueString.h" NSString *BusyStateEntityType; @implementation BusyState static NSMutableDictionary *colorDict; + (void)initialize { if (self == [BusyState class]) { BusyStateEntityType = U(@"Activity State"); } } + (NSMutableDictionary *)colorDict { if (!colorDict) colorDict = [[NSMutableDictionary alloc] init]; return colorDict; } + (BusyState *)stateWithStartTime:(NSDate *)start endTime:(NSDate *)end container:(PajeContainer *)cont relatedEntities:(NSArray *)related { return [[[self alloc] initWithStartTime:start endTime:end container:cont relatedEntities:related] autorelease]; } - (id)initWithStartTime:(NSDate *)start endTime:(NSDate *)end container:(PajeContainer *)cont relatedEntities:(NSArray *)related { self = [super init]; startTime = [start retain]; endTime = [end retain]; container = [cont retain]; relatedEntities = [related retain]; return self; } - (void)dealloc { [startTime release]; [endTime release]; [container release]; [relatedEntities release]; [super dealloc]; } + (id)hierarchy { static id hier = nil; if (!hier) hier = [[NSArray alloc] initWithObjects:@"Node", nil]; return hier; } - (id)container { return container; } - (NSDate *)startTime { return startTime; } - (NSDate *)endTime { return endTime; } + (PajeDrawingType)drawingType { return PajeVariableDrawingType; } //PajeStateDrawingType; } - (PajeDrawingType)drawingType { return PajeVariableDrawingType; } //PajeStateDrawingType; } - (NSNumber *)value { return [NSNumber numberWithInt:[relatedEntities count]]; } - (NSString *)entityType { return BusyStateEntityType;} + (NSString *)entityType { return BusyStateEntityType;} + (NSString *)name { return BusyStateEntityType;} - (NSString *)name { unsigned ct = [relatedEntities count]; if (ct == 0) return @"Inactive"; if (ct == 1) return @"1 active thread"; return [NSString stringWithFormat:@"%d active threads", ct]; } - (NSColor *)color { int ct = [relatedEntities count]; if (ct >= 10) return [NSColor redColor]; return [[NSColor blueColor] blendedColorWithFraction:ct/10. ofColor:[NSColor redColor]]; return [NSColor colorWithDeviceHue:.667 - ct/15. saturation:1.0 brightness:1.0 alpha:1.0]; } - (NSArray *)relatedEntities { return relatedEntities; } @end Paje-1.98/ReductionFilter/BusyArray.m0000664000175000017500000001771611674062007017472 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // BusyArray #include "BusyArray.h" #include "ReduceEntity.h" @interface BusyArrayEnumerator : NSEnumerator { BusyArray *array; Class class; int index; int lastIndex; } - (id)initWithArray:(BusyArray *)a entityClass:(Class)c; - (id)initWithArray:(BusyArray *)a entityClass:(Class)c firstIndex:(unsigned)i1 lastIndex:(unsigned)i2; - (void)dealloc; - (id)nextObject; @end @implementation BusyArrayEnumerator - (id)initWithArray:(BusyArray *)a entityClass:(Class)c { NSParameterAssert(a != nil); self = [super init]; if (self != nil) { array = [a retain]; class = c; index = 0; // last element of array doesn't generate an entity lastIndex = [array count] - 2; } return self; } - (id)initWithArray:(BusyArray *)a entityClass:(Class)c firstIndex:(unsigned)i1 lastIndex:(unsigned)i2 { self = [self initWithArray:a entityClass:c]; if (self != nil) { if (i1 > index) { index = i1; } if (i2 < lastIndex) { lastIndex = i2; } } return self; } - (void)dealloc { [array release]; [super dealloc]; } - (id)nextObject { id entity; if (index > lastIndex) { return nil; } entity = [class entityWithArray:array index:index]; index++; return entity; } @end @interface BusyArrayReverseEnumerator : BusyArrayEnumerator @end @implementation BusyArrayReverseEnumerator - (id)nextObject { id entity; if (index > lastIndex) { return nil; } entity = [class entityWithArray:array index:lastIndex]; lastIndex--; return entity; } @end @implementation BusyArray - (id)initWithEntityType:(PajeEntityType *)et container:(PajeContainer *)cont startTime:(NSDate *)startTime endTime:(NSDate *)endTime { self = [super initWithSelector:@selector(time)]; if (self != nil) { container = [cont retain]; entityType = et; // not retained [array insertObject:[BusyDate dateWithDate:startTime objects:[NSMutableArray array]] atIndex:0]; [array insertObject:[BusyDate dateWithDate:endTime objects:[NSMutableArray array]] atIndex:1]; } return self; } - (id)initWithEntityType:(PajeEntityType *)et container:(PajeContainer *)cont startTime:(NSDate *)startTime endTime:(NSDate *)endTime enumerator:(NSEnumerator *)enumerator valueFilter:(NSSet *)filter { self = [self initWithEntityType:et container:cont startTime:startTime endTime:endTime]; if (self) { PajeEntity *entity; while ((entity = [enumerator nextObject]) != nil) { if (![filter containsObject:[entity value]]) { [self addEntity:entity]; } } } return self; } - (void)dealloc { [container release]; [super dealloc]; } - (PajeContainer *)container { return container; } - (PajeEntityType *)entityType { return entityType; } - (NSDate *)startTime { return [[array objectAtIndex:0] time]; } - (NSDate *)endTime { return [[array lastObject] time]; } - (void)addEntity:(PajeEntity *)entity; { id startTime = [entity startTime]; id endTime = [entity endTime]; unsigned index1, index2; BusyDate *date1; BusyDate *date2; unsigned i; // See if startTime of entity is in the array's time interval. // If it is, insert it in the array if not there yet. index1 = [self indexOfFirstObjectNotBeforeValue:startTime]; if ((index1 > 0) && (index1 < [array count]) && ([startTime isEarlierThanDate:[[array objectAtIndex:index1] time]])) { date1 = [BusyDate dateWithDate:startTime objects:[[self objectAtIndex:index1 - 1] allObjects]]; [array insertObject:date1 atIndex:index1]; } // do the same for endTime index2 = [self indexOfFirstObjectNotBeforeValue:endTime]; if ((index2 > 0) && (index2 < [array count]) && ([endTime isEarlierThanDate:[[array objectAtIndex:index2] time]])) { date2 = [BusyDate dateWithDate:endTime objects:[[self objectAtIndex:index2 - 1] allObjects]]; [array insertObject:date2 atIndex:index2]; } // insert "entity" in all dates in array that are within the interval. for (i = index1; i < index2; i++) { [[self objectAtIndex:i] addObject:entity]; } } - (NSEnumerator *)objectEnumeratorOfClass:(Class)c { return [[[BusyArrayEnumerator alloc] initWithArray:self entityClass:c] autorelease]; } - (NSEnumerator *)objectEnumeratorOfClass:(Class)c fromTime:(NSDate *)t1 toTime:(NSDate *)t2 { BusyArrayEnumerator *enumerator; NSUInteger i1, i2; i1 = [self indexOfLastObjectNotAfterValue:t1]; if (i1 == NSNotFound) { i1 = 0; } i2 = [self indexOfFirstObjectNotBeforeValue:t2]; enumerator = [[BusyArrayEnumerator alloc] initWithArray:self entityClass:c firstIndex:i1 lastIndex:i2]; return [enumerator autorelease]; } - (NSEnumerator *)completeObjectEnumeratorOfClass:(Class)c fromTime:(NSDate *)t1 toTime:(NSDate *)t2 { BusyArrayEnumerator *enumerator; NSUInteger i1, i2; i1 = [self indexOfFirstObjectNotBeforeValue:t1]; i2 = [self indexOfLastObjectNotAfterValue:t2]; if (i2 != NSNotFound && i2 != 0) { enumerator = [[BusyArrayEnumerator alloc] initWithArray:self entityClass:c firstIndex:i1 lastIndex:i2 - 1]; return [enumerator autorelease]; } else { return nil; } } - (NSEnumerator *)reverseObjectEnumeratorOfClass:(Class)c { return [[[BusyArrayReverseEnumerator alloc] initWithArray:self entityClass:c] autorelease]; } - (NSEnumerator *)reverseObjectEnumeratorOfClass:(Class)c fromTime:(NSDate *)t1 toTime:(NSDate *)t2 { BusyArrayEnumerator *enumerator; NSUInteger i1, i2; i1 = [self indexOfLastObjectNotAfterValue:t1]; if (i1 == NSNotFound) { i1 = 0; } i2 = [self indexOfFirstObjectNotBeforeValue:t2]; enumerator = [[BusyArrayReverseEnumerator alloc] initWithArray:self entityClass:c firstIndex:i1 lastIndex:i2]; return [enumerator autorelease]; } - (NSString *)description { return [array description]; } @end Paje-1.98/ReductionFilter/ReduceEntity.m0000664000175000017500000001547411674062007020154 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "ReduceEntity.h" #include "ReduceEntityType.h" #include "../General/Macros.h" #include "../General/NSObject+Additions.h" #include @implementation ReduceEntity + (ReduceEntity *)entityWithArray:(BusyArray *)a index:(int)i { return [[[self alloc] initWithArray:a index:i] autorelease]; } - (id)initWithArray:(BusyArray *)a index:(int)i { self = [super initWithType:[a entityType] name:@"" container:[a container]]; if (self) { Assign(array, a); index = i; } // FIXME: temporary solution to get all fields' names [[a entityType] addFieldNames:[self fieldNames]]; return self; } + (PajeDrawingType)drawingType { return PajeVariableDrawingType; } - (void)dealloc { Assign(array, nil); [super dealloc]; } - (PajeDrawingType)drawingType { return PajeVariableDrawingType; } - (ReduceEntityType *)xentityType { return (ReduceEntityType *)[array entityType]; } - (NSDate *)startTime { return [[array objectAtIndex:index] time]; } - (NSDate *)endTime; { return [[array objectAtIndex:index+1] time]; } - (PajeContainer *)container { return [array container]; } - (NSString *)name { return [NSString stringWithFormat:@"%f", [self doubleValue]]; } - (id)value { return [NSString stringWithFormat:@"%f", [self doubleValue]]; } - (NSColor *)xcolor { // FIXME: should color be calculated from value? If so, who keeps the color limits? float x; x = ([self doubleValue] - [[self entityType] minValue]); x /= ([[self entityType] maxValue] - [[self entityType] minValue]); return [[NSColor blueColor] blendedColorWithFraction:x ofColor:[NSColor redColor]]; } - (NSArray *)relatedEntities { return [[array objectAtIndex:index] allObjects]; } + (void)getMinValue:(double *)min maxValue:(double *)max forArray:(BusyArray *)a pajeComponent:(PajeFilter *)filter { double minValue = HUGE_VAL; double maxValue = -HUGE_VAL; double v; int i; int c; c = [a count]; for (i = 1; i < c; i++) { v = [self valueForRelatedEntities:[[a objectAtIndex:i] allObjects] pajeComponent:filter]; if (v < minValue) { minValue = v; } if (v > maxValue) { maxValue = v; } } *min = minValue; *max = maxValue; } // to be implemented by subclasses - (double)doubleValue { return [[self class] valueForRelatedEntities:[self relatedEntities] pajeComponent:[(ReduceEntityType *)[self entityType] component]]; } - (double)minValue { return [self doubleValue]; } - (double)maxValue { return [self doubleValue]; } // to be implemented by subclasses + (NSString *)titleForPopUp { [self _subclassResponsibility:_cmd]; return nil; } + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter { [self _subclassResponsibility:_cmd]; return 0.0; } @end @implementation CountReduceEntity + (NSString *)titleForPopUp { return @"Count"; } + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter { return (double)[entities count]; } @end @implementation SumReduceEntity + (NSString *)titleForPopUp { return @"Sum"; } + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter { double sum = 0.0; PajeEntity *entity; NSEnumerator *entityEnum; entityEnum = [entities objectEnumerator]; while ((entity = [entityEnum nextObject]) != nil) { sum += [filter doubleValueForEntity:entity]; } return sum; } @end @implementation AverageReduceEntity + (NSString *)titleForPopUp { return @"Average"; } + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter { double sum = 0.0; int n = 0; PajeEntity *entity; NSEnumerator *entityEnum; entityEnum = [entities objectEnumerator]; while ((entity = [entityEnum nextObject]) != nil) { sum += [filter doubleValueForEntity:entity]; n++; } if (n == 0) { return 0.0; } else { return sum/n; } } @end @implementation MinReduceEntity + (NSString *)titleForPopUp { return @"Min"; } + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter { double val = HUGE_VAL; PajeEntity *entity; NSEnumerator *entityEnum; entityEnum = [entities objectEnumerator]; while ((entity = [entityEnum nextObject]) != nil) { double newval; newval = [filter doubleValueForEntity:entity]; if (newval < val) { val = newval; } } return val; } - (double)doubleValue { if (xval == HUGE_VAL) { xval = [super doubleValue]; } return xval; } - (NSArray *)relatedEntities { double val = HUGE_VAL; PajeEntity *entity; NSEnumerator *entityEnum; NSMutableArray *a = [NSMutableArray array]; entityEnum = [[super relatedEntities] objectEnumerator]; while ((entity = [entityEnum nextObject]) != nil) { double newval; newval = [[(ReduceEntityType *)[self entityType] component] doubleValueForEntity:entity]; if (newval < val) { val = newval; [a removeAllObjects]; [a addObject:entity]; } else if (newval == val) { [a addObject:entity]; } } return a; } @end @implementation MaxReduceEntity + (NSString *)titleForPopUp { return @"Max"; } + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter { double val = -HUGE_VAL; PajeEntity *entity; NSEnumerator *entityEnum; entityEnum = [entities objectEnumerator]; while ((entity = [entityEnum nextObject]) != nil) { double newval; newval = [filter doubleValueForEntity:entity]; if (newval > val) { val = newval; } } return val; } @end Paje-1.98/ReductionFilter/BusyDate.m0000664000175000017500000000347111674062007017262 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // BusyDate // 19980228 BS creation #include "BusyDate.h" @implementation BusyDate + (BusyDate *)dateWithDate:(NSDate *)date objects:(NSArray *)objs { return [[[self alloc] initWithDate:date objects:objs] autorelease]; } - (id)initWithDate:(NSDate *)date objects:(NSArray *)objs { self = [super init]; time = [date retain]; objects = [objs mutableCopy]; return self; } - (void)dealloc { [time release]; [objects release]; [super dealloc]; } - (NSDate *)time { return time; } - (void)addObject:(id)obj { [objects addObject:obj]; } - (NSArray *)allObjects { return objects; } - (NSString *)description { int i; NSMutableString *s = [NSMutableString stringWithFormat:@"time = %@; objects = (", [time description]]; for (i=0; i<[objects count]; i++) { id o = [objects objectAtIndex:i]; [s appendFormat:@"%@ %@-%@, ", [o value], [[o startTime] description], [[o endTime] description]]; } [s appendString:@")\n"]; return s; } @end Paje-1.98/ReductionFilter/BusyNode.gorm/0000775000175000017500000000000011674062007020052 5ustar schnorrschnorrPaje-1.98/ReductionFilter/BusyNode.gorm/data.classes0000664000175000017500000000142511674062007022344 0ustar schnorrschnorr{ "## Comment" = "Do NOT change this file, Gorm maintains it"; BusyNode = { Actions = ( "createEntityType:", "deleteEntityType:", "renameEntityType:", "entityNamePopUpChanged:", "entityTypePopUpChanged:", "groupByPopUpChanged:", "reduceModePopUpChanged:", "matrixChanged:" ); Outlets = ( view, entityTypePopUp, groupByPopUp, nameMatrix, entityNamePopUp, entityNameField, createEntityButton, deleteEntityButton, renameEntityButton, reduceModePopUp ); Super = PajeFilter; }; PajeComponent = { Actions = ( "inputEntity:", "outputEntity:" ); Outlets = ( ); Super = NSObject; }; PajeFilter = { Actions = ( ); Outlets = ( ); Super = PajeComponent; }; }Paje-1.98/ReductionFilter/BusyNode.gorm/objects.gorm0000664000175000017500000002174611674062007022403 0ustar schnorrschnorrGNUstep archive00002b5c:00000023:000000d1:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&% Button201NSButton1 NSControl1NSView1 NSResponder% B4  B\ A  B\ A&01 NSMutableArray1 NSArray&%01 NSButtonCell1 NSActionCell1NSCell0&%Rename01NSFont%0 & % Helvetica A@A@&&&&&&&&%0 & &&&0 & %  PopUpButton30 1 NSPopUpButton% B CJ C A  C A& 0 &%01NSPopUpButtonCell1NSMenuItemCell0&0%&&&&&&&&01NSMenu0&0 &01 NSMenuItem0&%Count &&%01NSImage0& % common_Nibble%%0&0&&&&%%%%%0&%NSOwner0&%BusyNode0&% Box101NSBox% B C C A  C A& 0 &0%  C A  C A&0 &0!%  B4 A  B4 A&0" &%0# 0$&%Create&&&&&&&&%  &&&0%% B  B, A  B, A&0& &%0' 0(&%Delete&&&&&&&&%  &&&0)0*&%Title&&&&&&&& %%0+& %  TextField10,1 NSTextField% A0 CL B Ap  B Ap& 0- &%0.1NSTextFieldCell0/& % Reduction00%01&%Helvetica-Bold A@A@&&&&&&&&0%021NSColor03&%NSCalibratedRGBColorSpace ? ? ? ? ?043 ?05& % PopUpButton06% B Ca C A  C A& 07 &%08&&&&&&&&090: &0;0<&%Item1 &&%%0=0>&%Item2 &&%%0?0@&%Item3 &&%%%&&&;9%%%%%0A& %  TextField20B% A0 C5 B Ap  B Ap& 0C &%0D0E&%Group by0&&&&&&&&0%0F3 ? ? ? ? ?0G3 ?0H& % TextField0I% B C C A  C A& 0J &%0K &&&&&&&&0%0L3 ? ? ? ? ?0M3 ?0N&%GSCustomClassMap0O&0P&%Button!0Q& % GormNSPanel0R1NSPanel1NSWindow%  C Cƀ&% C D,0S%  C Cƀ  C Cƀ&0T &0U% @ A C C  C C&0V &0W%  C C  C C&0X &  60Y% B C3 C A  C A& 0Z &%0[&&&&&&&&0\0] &0^0_&%Item1 &&%%0`0a&%Item2 &&%%0b0c&%Item3 &&%%%&&&^\%%%%%0d% A0 Cc B Ap  B Ap& 0e &%0f0g&%Reduce Entities0&&&&&&&&0%LM0h1 NSScrollView% @ @ Cy C  Cy C&0i1 NSClipView% A @ Cb C#  Cb C#&0j1NSMatrix%  Bh B  Bh B& i0k &%0l 0m&&&&&&&&&%% Bh Ap @ @0n3 ?* ?* ?* ?* ?n0o& % NSButtonCell0p 0q0r1NSMutableString&% common_SwitchOff&&&&&&&&% 0s0t&% common_SwitchOn&&&%%0u &0v q&&&&&&&&% s&&&0w q&&&&&&&&% s&&&0x q&&&&&&&&% s&&&0y q&&&&&&&&% s&&&0z q&&&&&&&&% s&&&0{ q&&&&&&&&% s&&&vh0| &n0} &i0~% A @ Cb C  Cb C&0 &jn01 NSScroller% @ @ A C  A C&0 &%0m&&&&&&&&&h2 _doScroll:v12@0:4@8~% A A A A 0% A0 C C$ Ap  C$ Ap& 0 &%00&%Values to reduce:&&&&&&&&0%LM 0% B Cx C A  C A& 0 &%0&&&&&&&&00 &00&%Item1 &&%%00&%Item2 &&%%00&%Item3 &&%%%&&&%%%%%0% A0 Cz B Ap  B Ap& 0 &%00& % Entity name0&&&&&&&&0%LM0% A0 C B Ap  B Ap& 0 &%00&%New name0&&&&&&&&0%LMI,B00&%Title&&&&&&&& %%n 0& % Inspector ? ? F@ F@%00&%NSApplicationIcon0&%BoxU0& %  PopUpButton1Y0&%Matrixj0& %  PopUpButton20&% Button1%0 &01!NSNibOutletConnector1"NSNibConnectorQ0&%NSOwner0&%delegate0!0&%view0!50&%entityTypePopUp0!0& % groupByPopUp01#NSNibControlConnector50&%entityTypePopUpChanged:0!0& % nameMatrix0#0&%matrixChanged:0#0&%groupByPopUpChanged:0!0&%entityNamePopUp0#0&%entityNamePopUpChanged:0!H0&%entityNameField0!P0&%createEntityButton0!0&%deleteEntityButton0!0&%renameEntityButton0±#P0ñ&%createEntityType:0ı#0ű&%renameEntityType:0Ʊ#0DZ&%deleteEntityType:0ȱ#H0ɱ! 0ʱ&%reduceModePopUp0˱# 0̱&%reduceModePopUpChanged:0ͱ"+0α"A0ϱ"Paje-1.98/ReductionFilter/ReduceEntity.h0000664000175000017500000000570111674062007020137 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _ReduceEntity_h_ #define _ReduceEntity_h_ // // An entity that represents many others, reducing them. // Subclasses can reduce by counting, summing, maxing, etc. // Reduced entities are kept in an array that has also some global data. // This entity only has a pointer to the array and an index to the correct entry. // // BS 2001.02.20 creation // #include "BusyArray.h" #include "../General/PajeEntity.h" #include "../General/PajeFilter.h" @interface ReduceEntity : PajeEntity { BusyArray *array; int index; } + (ReduceEntity *)entityWithArray:(BusyArray *)a index:(int)i; - (id)initWithArray:(BusyArray *)a index:(int)i; - (PajeDrawingType)drawingType; //- (ReduceEntityType *)entityType; - (NSDate *)startTime; - (NSDate *)endTime; - (PajeContainer *)container; - (NSString *)name; - (id)value; - (double)doubleValue; //- (NSColor *)color; - (NSArray *)relatedEntities; + (void)getMinValue:(double *)min maxValue:(double *)max forArray:(BusyArray *)a pajeComponent:(PajeFilter *)filter; // to be implemented by subclasses + (NSString *)titleForPopUp; + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter; @end @interface CountReduceEntity : ReduceEntity + (NSString *)titleForPopUp; + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter; @end @interface SumReduceEntity : ReduceEntity + (NSString *)titleForPopUp; + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter; @end @interface AverageReduceEntity : ReduceEntity + (NSString *)titleForPopUp; + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter; @end @interface MaxReduceEntity : ReduceEntity + (NSString *)titleForPopUp; + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter; @end @interface MinReduceEntity : ReduceEntity {double xval;} + (NSString *)titleForPopUp; + (double)valueForRelatedEntities:(NSArray *)entities pajeComponent:(PajeFilter *)filter; @end #endif Paje-1.98/PajeEventDecoder/0000775000175000017500000000000011674062007015424 5ustar schnorrschnorrPaje-1.98/PajeEventDecoder/GNUmakefile0000664000175000017500000000212311674062007017474 0ustar schnorrschnorr# # GNUmakefile - Generated by ProjectCenter # Written by Philippe C.D. Robert # # NOTE: Do NOT change this file -- ProjectCenter maintains it! # # Put all of your customisations in GNUmakefile.preamble and # GNUmakefile.postamble # include $(GNUSTEP_MAKEFILES)/common.make # # Subprojects # # # Bundle # PACKAGE_NAME=PajeEventDecoder BUNDLE_NAME=PajeEventDecoder BUNDLE_EXTENSION=.bundle BUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje PajeEventDecoder_PRINCIPAL_CLASS=PajeEventDecoder # # Additional libraries # ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else PajeEventDecoder_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif # # Resource files # PajeEventDecoder_RESOURCE_FILES= # # Header files # PajeEventDecoder_HEADERS= \ PajeEventDecoder.h # # Class files # PajeEventDecoder_OBJC_FILES= \ PajeEventDecoder.m # # C files # PajeEventDecoder_C_FILES= -include GNUmakefile.preamble -include GNUmakefile.local include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/PajeEventDecoder/PajeEventDecoder.h0000664000175000017500000000314011674062007020742 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeEventDecoder_h_ #define _PajeEventDecoder_h_ #include #include "../General/PajeEvent.h" #include "../General/PTime.h" #include "../General/DataScanner.h" #include "../General/PajeFilter.h" @interface PajeEventDecoder: PajeComponent { enum { OUT_DEF, IN_DEF } defStatus; PajeEventDefinition *eventBeingDefined; NSMutableArray *valArray; /* used only while reading an event */ int eventCount; int lineCount; NSMapTable *eventDefinitions; NSMutableArray *chunkInfo; unsigned currentChunk; BOOL rereadingChunk; } - (id)initWithController:(PajeTraceController *)c; - (void)scanDefinitionLine:(line *)line; - (PajeEvent *)scanEventLine:(line *)line; - (void)raise:(NSString *)reason, ...; - (int)eventCount; @end #endif Paje-1.98/PajeEventDecoder/PajeEventDecoder.m0000664000175000017500000002405711674062007020761 0ustar schnorrschnorr/* Copyright (c) 1998-2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "PajeEventDecoder.h" #include "../General/FoundationAdditions.h" #include "../General/UniqueString.h" #include "../General/NSUserDefaults+Additions.h" #include "../General/NSColor+Additions.h" #include "../General/Macros.h" #include "../General/CStringCallBacks.h" char *break_line(char *s, line *line) { BOOL in_string = NO; BOOL in_word = NO; char *p; line->word_count = 0; for (p = s; *p != '\0'; p++) { if (*p == '\n') { *p = '\0'; p++; break; } if (in_string) { if (*p == '"') { *p = '\0'; in_string = NO; } continue; } if (*p == '#') { *p = '\0'; while (YES) { p++; if (*p == '\n') { p++; break; } else if (*p == '\0') { break; } } break; } if (in_word && isspace(*p)) { *p = '\0'; in_word = NO; continue; } if (!in_word && !isspace(*p)) { if (*p == '"') { p++; in_string = YES; } else { in_word = YES; } if (line->word_count < PE_MAX_NFIELDS) { line->word[line->word_count] = p; line->word_count ++; } continue; } } return p; } @implementation PajeEventDecoder - (id)initWithController:(PajeTraceController *)c { self = [super initWithController:c]; if (self != nil) { defStatus = OUT_DEF; eventDefinitions = NSCreateMapTable(CStringMapKeyCallBacks, NSObjectMapValueCallBacks, 50); chunkInfo = [[NSMutableArray alloc] init]; currentChunk = 0; } return self; } - (void)dealloc { NSFreeMapTable(eventDefinitions); [chunkInfo release]; [super dealloc]; } - (void)startChunk:(int)chunkNumber { rereadingChunk = (chunkNumber + 1 < [chunkInfo count]); if (rereadingChunk) { if (chunkNumber >= [chunkInfo count]) { // cannot position in an unread place [self raise:@"Cannot start unknown chunk"]; } NSArray *info; info = [chunkInfo objectAtIndex:chunkNumber]; eventCount = [[info objectAtIndex:0] intValue]; lineCount = [[info objectAtIndex:1] intValue]; currentChunk = chunkNumber; } else { // let's register the first chunk position if ([chunkInfo count] == 0) { [chunkInfo addObject:[NSArray arrayWithObjects: [NSNumber numberWithInt:eventCount], [NSNumber numberWithInt:lineCount], nil]]; } } // keep the ball rolling (tell other components) [super startChunk:chunkNumber]; } // The current chunk has ended. - (void)endOfChunkLast:(BOOL)last { if (!last) { currentChunk++; // if we're at the end of the known world, let's register its position if (currentChunk == [chunkInfo count]) { [chunkInfo addObject:[NSArray arrayWithObjects: [NSNumber numberWithInt:eventCount], [NSNumber numberWithInt:lineCount], nil]]; } } [super endOfChunkLast:last]; } - (void)raise:(NSString *)reason, ... { va_list args; va_start(args, reason); [NSException raise:@"DecodeFileException" format:reason arguments:args]; va_end(args); return; [[NSException exceptionWithName:@"DecodeFileException" reason:reason userInfo: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:eventCount], @"Event Number", nil] ] raise]; } - (void)inputEntity:(id)data { if (![data isKindOfClass:[NSData class]]) { [self raise:@"Internal error: incorrect data type"]; } char *dataPointer; char *initDataPointer; int length; length = [data length]; dataPointer = (char *)[data bytes]; initDataPointer = dataPointer; line line; while ((dataPointer - initDataPointer) < length) { dataPointer = break_line(dataPointer, &line); if (line.word_count == 0) { continue; } if (line.word[0][0] == '%') { if (rereadingChunk) { continue; } [self scanDefinitionLine:&line]; } else { PajeEvent *event; event = [self scanEventLine:&line]; if (event != nil) { [self outputEntity:event]; } } } } - (BOOL)canEndChunkBefore:(id)data { if (rereadingChunk) { [self raise:@"This method should not be called when rereading!!!"]; return YES; } if (![data isKindOfClass:[NSData class]]) { [self raise:@"Internal error: incorrect data type"]; } char *dataPointer; char *initDataPointer; int length; length = [data length]; dataPointer = (char *)[data bytes]; initDataPointer = dataPointer; line line; BOOL canEndChunk = YES; // it is possible to end the chunk before the received data if // it can be ended before the first event in it, and there is // no event definition data before that event while ((dataPointer - initDataPointer) < length) { dataPointer = break_line(dataPointer, &line); if (line.word_count == 0) { continue; } if (line.word[0][0] == '%') { [self scanDefinitionLine:&line]; canEndChunk = NO; break; } else { PajeEvent *event; event = [self scanEventLine:&line]; if (event != nil) { canEndChunk = [super canEndChunkBefore:event]; break; } } } if (canEndChunk) { return canEndChunk; } // the chunk cannot be ended -- process all remaining data while ((dataPointer - initDataPointer) < length) { dataPointer = break_line(dataPointer, &line); if (line.word_count == 0) { continue; } if (line.word[0][0] == '%') { [self scanDefinitionLine:&line]; } else { PajeEvent *event; event = [self scanEventLine:&line]; if (event != nil) { [self outputEntity:event]; } } } return NO; } - (void)scanDefinitionLine:(line *)line { char *str; int n = 0; char *eventName; char *eventId; char *fieldName; char *fieldType; str = line->word[n++]; if (*str++ != '%') { [self raise:@"Line should start with a '%%'"]; } if (*str == '\0') { str = line->word[n++]; } switch (defStatus) { case OUT_DEF: eventName = line->word[n++]; eventId = line->word[n++]; if (n != line->word_count || strcmp(str, "EventDef") != 0) { [self raise:@"'EventDef ' expected"]; } if (NSMapGet(eventDefinitions, eventId) != nil) { [self raise:@"redefinition of event with id '%s'", eventId]; } PajeEventId pajeEventId = pajeEventIdFromName(eventName); if (pajeEventId == PajeUnknownEventId) { //[self raise:@"unknown event name '%s'", eventName]; NSLog(@"unknown event name '%s'", eventName); pajeEventId = 0; } eventBeingDefined = [PajeEventDefinition definitionWithPajeEventId:pajeEventId internalId:eventId]; NSMapInsert(eventDefinitions, strdup(eventId), eventBeingDefined); defStatus = IN_DEF; break; case IN_DEF: fieldName = str; if (n > line->word_count) { [self raise:@"Incomplete line, missing field name"]; } if (strcmp(fieldName, "EndEventDef") == 0) { // TODO: verify if all obligatory fields are defined defStatus = OUT_DEF; break; } PajeFieldId fieldId; fieldId = pajeFieldIdFromName(fieldName); if (n >= line->word_count) { [self raise:@"Incomplete line, missing field type"]; } fieldType = line->word[n++]; PajeFieldType fieldTypeId; fieldTypeId = pajeFieldTypeFromName(fieldType); if (fieldTypeId == PajeUnknownFieldType) { [self raise:@"Unrecognised field type '%s'", fieldType]; } [eventBeingDefined addFieldId:fieldId fieldType:fieldTypeId]; break; default: [self raise:@"Internal error, invalid status"]; } } - (PajeEvent *)scanEventLine:(line *)line { char *eventId; PajeEvent *event; PajeEventDefinition *eventDefinition; eventId = line->word[0]; if (*eventId == '%') { [self raise:@"Line should not start with a '%%'"]; } eventDefinition = NSMapGet(eventDefinitions, eventId); if (eventDefinition == nil) { [self raise:@"Event with id '%s' has not been defined", eventId]; } event = [PajeEvent eventWithDefinition:eventDefinition line:line]; eventCount++; return event; } - (int)eventCount { return eventCount; } @end Paje-1.98/Traces/0000775000175000017500000000000011674062007013476 5ustar schnorrschnorrPaje-1.98/Traces/JavaTest.trace0000664000175000017500000002665111674062007016251 0ustar schnorrschnorr%EventDef PajeDefineContainerType 1 % Alias string % ContainerType string % Name string %EndEventDef %EventDef PajeDefineEventType 2 % Alias string % ContainerType string % Name string %EndEventDef %EventDef PajeDefineStateType 3 % Alias string % ContainerType string % Name string %EndEventDef %EventDef PajeDefineVariableType 4 % Alias string % ContainerType string % Name string %EndEventDef %EventDef PajeDefineLinkType 5 % Alias string % ContainerType string % SourceContainerType string % DestContainerType string % Name string %EndEventDef %EventDef PajeDefineEntityValue 6 % Alias string % EntityType string % Name string % Color color %EndEventDef %EventDef PajeCreateContainer 7 % Time date % Alias string % Type string % Container string % Name string %EndEventDef %EventDef PajeDestroyContainer 8 % Time date % Type string % Container string %EndEventDef %EventDef PajeNewEvent 9 % Time date % EntityType string % Container string % Value string %EndEventDef %EventDef PajeSetState 10 % Time date % EntityType string % Container string % Value string %EndEventDef %EventDef PajePushState 11 % Time date % EntityType string % Container string % Value string %EndEventDef %EventDef PajePushState 111 % Time date % EntityType string % Container string % Value string % Object string %EndEventDef %EventDef PajePopState 12 % Time date % EntityType string % Container string %EndEventDef %EventDef PajeSetVariable 13 % Time date % EntityType string % Container string % Value double %EndEventDef %EventDef PajeAddVariable 14 % Time date % EntityType string % Container string % Value double %EndEventDef %EventDef PajeSubVariable 15 % Time date % EntityType string % Container string % Value double %EndEventDef %EventDef PajeStartLink 16 % Time date % EntityType string % Container string % Value string % SourceContainer string % Key string % Size int %EndEventDef %EventDef PajeEndLink 17 % Time date % EntityType string % Container string % Value string % DestContainer string % Key string % Size int %EndEventDef %EventDef PajeStartLink 18 % Time date % EntityType string % Container string % Value string % SourceContainer string % Key string %EndEventDef %EventDef PajeEndLink 19 % Time date % EntityType string % Container string % Value string % DestContainer string % Key string %EndEventDef %EventDef PajeNewEvent 112 % Time date % EntityType string % Container string % Value string % ThreadName string % ThreadGroup string % ThreadParent string %EndEventDef 1 PJ 0 "Java Program" 1 J PJ "Java Virtual Machine" 1 T J "Thread" 1 M J "Monitor" 2 ME T "Monitor Event" 2 TD T "Thread Data" 3 MT T "Method" 3 JS J "JVM State" 3 MS M "Monitor State" 5 TS J T T "T-T Synchronization" 5 ML J T M "Monitor Lock" 5 MU J M T "Monitor Unlock" 6 exj JS "Executing" "0 .8 .2" 6 ext MT "Executing" ".1 .9 .3" 6 blm MT "Monitor Enter" "1 .5 .5" 6 loc MS "Monitor locked" "1 0 0" 6 fre MS "Monitor free" "0 1 0" 6 cr TS "Thread.start()" ".1 .1 .6" 6 jo TS "Thread.join()" ".1 .1 .6" 6 mlo ML "Monitor lock" ".6 .1 .1" 6 munl MU "Monitor unlock" ".1 .6 .1" 6 me ME "Monitor enter" ".7 0 0" 6 med ME "Monitor entered" ".6 .1 .1" 6 mex ME "Monitor exit" "0 .6 0" 6 tdb TD "Thread Data" ".7 .7 .8" 6 315146706-135096936 MT "Testing:dandan" ".1 .4 .2" 6 315146706-135096960 MT "Testing:Print" ".1 .5 .2" 6 315146706-135096984 MT "Testing:main" ".1 .6 .2" 6 315146706-135097008 MT "Testing:" ".4 .1 .2" 6 315146706-135096888 MT "Flux:run" ".2 .5 .3" 6 315146706-135105680 MT "Flux:" ".5 .1 .2" 6 315146706-135096496 MT "Flux2:sincro" ".7 .1 .2" 6 315146706-135096520 MT "Flux2:run" ".2 .5 .3" 6 315146706-135096568 MT "Flux2:" ".5 .1 .2" 6 315146706-134841944 MT "java.lang.Thread:join" ".8 .1 .1" 6 315146706-134841968 MT "java.lang.Thread:join" ".8 .1 .1" 6 315146706-134841992 MT "java.lang.Thread:join" ".8 .1 .1" 6 315146706-134842496 MT "java.lang.Thread:start" ".1 .8 .1" 7 -0.0001 pj PJ 0 "JavaTest" 7 0.0 315146706:0 J pj "JVM 0" 11 0.0 JS 315146706:0 exj 7 0 315146706:1131217720 T 315146706:0 "T3" 11 0 MT 315146706:1131217720 ext 7 0.001 m-1131265744-0 M 315146706:0 "Monitor 0" 11 0.001 MS m-1131265744-0 fre 7 0.004751 315146706:1131217472 T 315146706:0 "T2" 11 0.004751 MT 315146706:1131217472 ext 7 0.006707 315146706:1131217168 T 315146706:0 "T1" 11 0.006707 MT 315146706:1131217168 ext 112 0.006748 TD 315146706:1131217168 tdb main main system 7 0.037116 315146706:1131322736 T 315146706:0 "T4" 11 0.037116 MT 315146706:1131322736 ext 7 0.040469 315146706:1131323008 T 315146706:0 "T5" 11 0.040469 MT 315146706:1131323008 ext 111 0.778995 MT 315146706:1131217168 315146706-135096984 0 111 0.779351 MT 315146706:1131217168 315146706-135097008 1131389784 12 0.779734 MT 315146706:1131217168 111 0.783141 MT 315146706:1131217168 315146706-135105680 1131389800 12 0.804195 MT 315146706:1131217168 111 0.804327 MT 315146706:1131217168 315146706-135105680 1131390736 12 0.809547 MT 315146706:1131217168 111 0.812969 MT 315146706:1131217168 315146706-135096568 1131391064 12 0.821993 MT 315146706:1131217168 111 0.822128 MT 315146706:1131217168 315146706-135096568 1131391392 12 0.82775 MT 315146706:1131217168 111 0.828325 MT 315146706:1131217168 315146706-134842496 1131389800 7 0.830818 315146706:1131389800 T 315146706:0 "T6" 11 0.830818 MT 315146706:1131389800 ext 112 0.830868 TD 315146706:1131389800 tdb Thread-0 main system 111 0.834234 MT 315146706:1131389800 315146706-135096888 1131389800 111 0.841342 MT 315146706:1131389800 315146706-135096568 1131391800 12 0.846734 MT 315146706:1131389800 111 0.84686 MT 315146706:1131389800 315146706-135096568 1131392128 12 0.916215 MT 315146706:1131389800 111 0.916595 MT 315146706:1131389800 315146706-134842496 1131391800 12 0.916996 MT 315146706:1131217168 111 0.917047 MT 315146706:1131217168 315146706-134842496 1131390736 12 0.918378 MT 315146706:1131389800 111 0.918431 MT 315146706:1131389800 315146706-134842496 1131392128 12 0.919946 MT 315146706:1131217168 111 0.920009 MT 315146706:1131217168 315146706-134842496 1131391064 12 0.924599 MT 315146706:1131389800 111 0.92495 MT 315146706:1131389800 315146706-134841944 1131391800 111 0.925157 MT 315146706:1131389800 315146706-134841992 1131391800 7 0.927015 315146706:1131391800 T 315146706:0 "T10" 11 0.927015 MT 315146706:1131391800 ext 112 0.927055 TD 315146706:1131391800 tdb Thread-4 main system 111 0.932631 MT 315146706:1131391800 315146706-135096520 1131391800 111 0.93705 MT 315146706:1131391800 315146706-135096496 1131391800 12 0.941083 MT 315146706:1131391800 12 0.941099 MT 315146706:1131391800 12 0.943288 MT 315146706:1131217168 111 0.943351 MT 315146706:1131217168 315146706-134842496 1131391392 7 0.944376 315146706:1131390736 T 315146706:0 "T7" 11 0.944376 MT 315146706:1131390736 ext 112 0.944415 TD 315146706:1131390736 tdb Thread-1 main system 111 0.946917 MT 315146706:1131390736 315146706-135096888 1131390736 8 0.948869 T 315146706:1131391800 12 0.950725 MT 315146706:1131389800 12 0.950765 MT 315146706:1131389800 111 0.950808 MT 315146706:1131389800 315146706-134841944 1131392128 111 0.950846 MT 315146706:1131389800 315146706-134841992 1131392128 7 0.955456 315146706:1131392128 T 315146706:0 "T11" 11 0.955456 MT 315146706:1131392128 ext 112 0.9555 TD 315146706:1131392128 tdb Thread-5 main system 111 0.957982 MT 315146706:1131392128 315146706-135096520 1131392128 11 0.95817 MT 315146706:1131392128 blm 11 0.95817 MS m-1131265744-0 loc 9 0.95817 ME 315146706:1131392128 me 18 0.95817 ML 315146706:0 mlo 315146706:1131392128 l-1131265744 19 0.95817 ML 315146706:0 mlo m-1131265744-0 l-1131265744 9 0.960463 ME 315146706:1131390736 mex 111 0.960554 MT 315146706:1131390736 315146706-135096568 1131392552 12 0.962375 MT 315146706:1131392128 12 0.962375 MS m-1131265744-0 9 0.962375 ME 315146706:1131392128 med 111 0.966148 MT 315146706:1131392128 315146706-135096496 1131392128 12 0.969887 MT 315146706:1131392128 12 0.969902 MT 315146706:1131392128 12 0.971915 MT 315146706:1131217168 111 0.972245 MT 315146706:1131217168 315146706-135096960 1131389784 12 0.979246 MT 315146706:1131217168 111 0.979569 MT 315146706:1131217168 315146706-134841944 1131389800 111 0.97963 MT 315146706:1131217168 315146706-134841992 1131389800 8 0.981057 T 315146706:1131392128 12 0.983078 MT 315146706:1131389800 12 0.983114 MT 315146706:1131389800 12 0.983129 MT 315146706:1131389800 12 0.98754 MT 315146706:1131390736 111 0.987673 MT 315146706:1131390736 315146706-135096568 1131392976 8 0.989516 T 315146706:1131389800 12 0.991422 MT 315146706:1131217168 12 0.991744 MT 315146706:1131217168 111 0.99181 MT 315146706:1131217168 315146706-134841944 1131390736 111 0.991855 MT 315146706:1131217168 315146706-134841992 1131390736 12 0.996884 MT 315146706:1131390736 111 0.996932 MT 315146706:1131390736 315146706-134842496 1131392552 7 0.998022 315146706:1131391064 T 315146706:0 "T8" 11 0.998022 MT 315146706:1131391064 ext 112 0.998065 TD 315146706:1131391064 tdb Thread-2 main system 111 1.00304 MT 315146706:1131391064 315146706-135096520 1131391064 111 1.00694 MT 315146706:1131391064 315146706-135096496 1131391064 12 1.01074 MT 315146706:1131391064 12 1.01076 MT 315146706:1131391064 12 1.01359 MT 315146706:1131390736 111 1.01365 MT 315146706:1131390736 315146706-134842496 1131392976 8 1.01385 T 315146706:1131391064 7 1.01632 315146706:1131392552 T 315146706:0 "T12" 11 1.01632 MT 315146706:1131392552 ext 112 1.01635 TD 315146706:1131392552 tdb Thread-6 main system 111 1.01881 MT 315146706:1131392552 315146706-135096520 1131392552 111 1.02093 MT 315146706:1131392552 315146706-135096496 1131392552 12 1.0282 MT 315146706:1131392552 12 1.02822 MT 315146706:1131392552 7 1.03021 315146706:1131391392 T 315146706:0 "T9" 11 1.03021 MT 315146706:1131391392 ext 112 1.03025 TD 315146706:1131391392 tdb Thread-3 main system 111 1.03305 MT 315146706:1131391392 315146706-135096520 1131391392 111 1.03744 MT 315146706:1131391392 315146706-135096496 1131391392 12 1.04174 MT 315146706:1131391392 12 1.04176 MT 315146706:1131391392 12 1.04282 MT 315146706:1131390736 111 1.04289 MT 315146706:1131390736 315146706-134841944 1131392552 111 1.04294 MT 315146706:1131390736 315146706-134841992 1131392552 8 1.04346 T 315146706:1131392552 12 1.04805 MT 315146706:1131390736 12 1.04817 MT 315146706:1131390736 111 1.04822 MT 315146706:1131390736 315146706-134841944 1131392976 111 1.04826 MT 315146706:1131390736 315146706-134841992 1131392976 8 1.05002 T 315146706:1131391392 7 1.05339 315146706:1131392976 T 315146706:0 "T13" 11 1.05339 MT 315146706:1131392976 ext 112 1.05343 TD 315146706:1131392976 tdb Thread-7 main system 111 1.05593 MT 315146706:1131392976 315146706-135096520 1131392976 111 1.06026 MT 315146706:1131392976 315146706-135096496 1131392976 12 1.06479 MT 315146706:1131392976 12 1.0648 MT 315146706:1131392976 8 1.06525 T 315146706:1131392976 12 1.06724 MT 315146706:1131390736 12 1.06727 MT 315146706:1131390736 12 1.06729 MT 315146706:1131390736 8 1.06774 T 315146706:1131390736 12 1.07807 MT 315146706:1131217168 12 1.0781 MT 315146706:1131217168 12 1.07812 MT 315146706:1131217168 8 1.07902 T 315146706:1131217168 7 1.08552 315146706:1131393560 T 315146706:0 "T14" 11 1.08552 MT 315146706:1131393560 ext 112 1.08556 TD 315146706:1131393560 tdb Thread-8 main system 8 1.08941 T 315146706:1131322736 8 1.11233 T 315146706:1131217720 8 1.11383 T 315146706:1131217472 8 1.11514 T 315146706:1131323008 8 1.11653 T 315146706:1131393560 8 1.11882 J 315146706:0 8 1.11882 PJ pj Paje-1.98/COPYING.LIB0000664000175000017500000006347411674062007013733 0ustar schnorrschnorr GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! Paje-1.98/NEWS0000664000175000017500000000000011674062007012742 0ustar schnorrschnorrPaje-1.98/ImbricationFilter/0000775000175000017500000000000011674062007015663 5ustar schnorrschnorrPaje-1.98/ImbricationFilter/GNUmakefile0000664000175000017500000000125311674062007017736 0ustar schnorrschnorrBUNDLE_INSTALL_DIR=$(GNUSTEP_BUNDLES)/Paje include $(GNUSTEP_MAKEFILES)/common.make ImbricationFilter_PRINCIPAL_CLASS = InsetLimit BUNDLE_NAME = ImbricationFilter ADDITIONAL_INCLUDE_DIRS = -I../General.bproj ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else ImbricationFilter_BUNDLE_LIBS += -lGeneral ADDITIONAL_LIB_DIRS += -L../General/General.framework/Versions/Current endif ImbricationFilter_RESOURCE_FILES = \ InsetLimit.gorm \ InsetLimit.nib ImbricationFilter_OBJC_FILES = InsetLimit.m ImbricationFilter_HEADER_FILES = InsetLimit.h -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make -include GNUmakefile.postamble Paje-1.98/ImbricationFilter/InsetLimit.nib/0000775000175000017500000000000011674062007020513 5ustar schnorrschnorrPaje-1.98/ImbricationFilter/InsetLimit.nib/keyedobjects.nib0000664000175000017500000001737311674062007023673 0ustar schnorrschnorrbplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 156<=AES[iqr  +567;=BCFIMNS[\ilopu|}   "'(-238Kbcfilpqrstwyx Kd     2 #U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRootv)234[NSClassNameZInsetLimit789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FRGHIJKLMNOPQ .=DINmprsu(TUVWXY0]NSDestinationWNSLabelXNSSource ,-\]^_`abbdefgh_NSNextResponder[NSSuperviewWNSFrameYNSEnabledXNSvFlagsVNSCell  + j\k]lmnmpZNSSubviews[NSFrameSizeROdOe_{{76, 319}, {209, 22}}stuvwxyz{|}~eWe_NSAlternateImage[NSCellFlags^NSButtonFlags2]NSButtonFlagsVNSMenuZNSMenuItem_NSAlternateContents_NSPreferredEdge_NSPeriodicDelay\NSCellFlags2]NSAltersState]NSControlView_NSKeyEquivalentYNSSupport_NSUsesItemFromMenu_NSPeriodicInterval_NSArrowPositionA@@*  KVNSSizeVNSNameXNSfFlags"A0 \LucidaGrande78;VNSFontPYNS.string78;_NSMutableStringXNSStringwh]NSMnemonicLoc_NSKeyEquivModMaskWNSStateWNSTitleYNSOnImageZNSKeyEquivXNSTarget\NSMixedImageXNSAction [NSMenuItems )!UItem12^NSResourceNameWNSImage_NSMenuCheckmark78У;_NSCustomResource_%NSCustomResource2ˀ_NSMenuMixedState__popUpItemAction:78xx;ZOtherViews>R"%(wh# $UItem2wh& 'UItem378;^NSMutableArrayWNSArray78ww;78a;_NSPopUpButtonCell^NSMenuItemCell\NSButtonCell]%NSButtonCell\NSActionCell78  ;]NSPopUpButtonXNSButtonYNSControlVNSView[NSResponder_entityTypePopUp78 ;_NSNibOutletConnector^NSNibConnectorTUVY0/<-\]^_`abbef 0 ;1_{{107, 278}, {156, 19}} ~!t|"#e()*_NSBackgroundColor[NSTextColorZNSContents_NSDrawsBackground27/ :qAB,-./01234WNSColor[NSColorName\NSColorSpace]NSCatalogName5436VSystem_textBackgroundColor8.94WNSWhiteB1678<,,;,-./>?2349836YtextColor8.D4B0678GHHa;_NSTextFieldCell78JKKL  ;[NSTextField\%NSTextFieldXminFieldTUVOPY0>C-\]^_`abbVeXYZ ? B@_{{269, 276}, {15, 22}}]~^_t`|eOcdefgh\NSAutorepeatZNSMaxValue\NSValueWraps[NSIncrement >#@MA  #?78jkka;]NSStepperCell78mnn  ;YNSStepperZminStepperTUVqrY0EH-\]^_`abbxef{ F ;G_{{107, 251}, {156, 19}} ~!t|"#qe()*27E :XmaxFieldTUVY0JM-\]^_`abbeXY K BL_{{269, 249}, {15, 22}}]~^_t`|ecdefgh JA ZmaxStepperTUVmY0Ol-j\]^b\NSBorderType_NSTitlePosition[NSTitleCellYNSOffsets]NSTransparent]NSContentViewYNSBoxTypeQPPhfg kj\^.p|}e>Rb (>RWOq€ S/>E\J`(\]^_`abbeˀ T  ;U_{{13, 280}, {89, 14}} ~t|(ՀWZVS:@]Minimum value,-./234YX36\controlColor8.4K0.666666696,-./>2349[36_controlTextColor\]^_`abbe ] ;^_{{13, 253}, {89, 14}} ~t|(ՀWZ_\:]Maximum value\]^_`abbe a ;b_{{13, 324}, {61, 14}} ~t|(ՀWZc`:\Entity type Z{298, 356}78   ;_{{68, 53}, {298, 356}}V{0, 0} t|" (2ji:SBox8.4M0 0.80000001678  ;UNSBoxTviewTUV0Wno _entityTypeSelected78 !!;_NSNibControlConnectorTUV0$qo/_minValueChangedTUV0$Oqo>TUV0/qtoE_maxValueChangedTUV0/toJ>9J<qbWmOJwEP S`%/"O>\LMNOPQRSTUVWXYZ[\]_`a_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClassyzx~Ppx{_{{346, 52}, {404, 463}}dUPanelgWNSPaneljTView>mRmO(_{{1, 1}, {404, 463}}_{{0, 0}, {1280, 1002}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78uvv;_NSWindowTemplate78x;>zJWb0b<mbbbbbb  wO  P >JOmqW0b<J">O\`E S /w%>J]NSCustomView1YPopUpList[NSMenuItem1\NSCustomView]NSTextField11]NSTextField12\NSTextField2\File's Owner\NSTextField1[NSMenuItem2>J>J>JJMbIOP0QNqHmLOWK<GD%Jm =rsu/pE".PO\N> SIw` >J    #%&'$ " !(>R(>J>!J78$%%;^NSIBObjectData#,1:LQVdf.@\ny&4>EGIKMOQSUWY[]_acegir~468:<>@BDFHJL]ks|~!#%>,:LVk ')+-.7ACLSen (468:@M\^`bj|     ! # % ' ) R T V X Z \ ^ ` b h   $ 2 ? H U c l v }     , Q e q |  # + . 0 9 > S U W Y [ e r u w      0 Q ^ i v #%')*,.Hmoqsuwxz "$&(Yfx  9;=?@CEG_68:<=?AYz|~")BIfhjlnpt/@BDFHY[]_as 1;IWdq{,EPmv{ "$&(*,.02468Adfhjlnprtvxz|~'bdfhjlnprtvxz|~   "$&(*,.02468:<>@BDFHJLNWXZcdfopr{&Paje-1.98/ImbricationFilter/InsetLimit.nib/info.nib0000664000175000017500000000070411674062007022141 0ustar schnorrschnorr IBDocumentLocation 99 88 356 240 0 0 1280 1002 IBFramework Version 446.1 IBOpenObjects 5 IBSystem Version 8P135 Paje-1.98/ImbricationFilter/InsetLimit.nib/classes.nib0000664000175000017500000000141711674062007022645 0ustar schnorrschnorr{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {entityTypeSelected = id; maxValueChanged = id; minValueChanged = id; }; CLASS = InsetLimit; LANGUAGE = ObjC; OUTLETS = { entityTypePopUp = NSPopUpButton; maxField = NSTextField; maxStepper = NSStepper; minField = NSTextField; minStepper = NSStepper; view = NSView; }; SUPERCLASS = PajeFilter; }, {CLASS = PajeComponent; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = PajeFilter; LANGUAGE = ObjC; SUPERCLASS = PajeComponent; } ); IBVersion = 1; }Paje-1.98/ImbricationFilter/InsetLimit.m0000664000175000017500000002766611674062007020143 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* InsetLimit.m created by benhur on 25-feb-2001 */ #include "InsetLimit.h" #include "../General/FoundationAdditions.h" #include "../General/UniqueString.h" #include "../General/Macros.h" @interface ImbricationFilteringEnumerator : NSEnumerator { NSEnumerator *origEnum; PajeFilter *inputComponent; int minValue; int maxValue; } + (ImbricationFilteringEnumerator *)enumeratorWithEnumerator:(NSEnumerator *)e inputComponent:(PajeFilter *)comp minValue:(int)min maxValue:(int)max; - (id)initWithEnumerator:(NSEnumerator *)e inputComponent:(PajeFilter *)comp minValue:(int)min maxValue:(int)max; - (id)nextObject; @end @implementation ImbricationFilteringEnumerator + (ImbricationFilteringEnumerator *)enumeratorWithEnumerator:(NSEnumerator *)e inputComponent:(PajeFilter *)comp minValue:(int)min maxValue:(int)max { return [[[self alloc] initWithEnumerator:e inputComponent:comp minValue:min maxValue:max] autorelease]; } - (id)initWithEnumerator:(NSEnumerator *)e inputComponent:(PajeFilter *)comp minValue:(int)min maxValue:(int)max { self = [super init]; if (self) { origEnum = [e retain]; inputComponent = comp; minValue = min; maxValue = max; } return self; } - (void)dealloc { [origEnum release]; [super dealloc]; } - (id)nextObject { id obj; while ((obj = [origEnum nextObject]) != nil) { int val = [inputComponent imbricationLevelForEntity:obj]; if (val >= minValue && val <= maxValue) break; } return obj; } @end @implementation InsetLimit - (id)initWithController:(PajeTraceController *)c { self = [super initWithController:c]; if (self != nil) { NSWindow *win; [self readDefaults]; if (![NSBundle loadNibNamed:@"InsetLimit" owner:self]) { NSRunAlertPanel(@"InsetLimit", @"Couldn't load interface file", nil, nil, nil); return self; } [entityTypePopUp removeAllItems]; win = [view window]; // view is an NSBox. we need its contents. view = [[(NSBox *)view contentView] retain]; [self registerFilter:self]; #ifndef GNUSTEP [win release]; #endif } return self; } - (void)dealloc { [entityTypePopUp removeAllItems]; [limits release]; [view release]; [super dealloc]; } - (NSView *)filterView { return view; } - (NSString *)filterName { return @"Imbrication Limit"; } - (id)filterDelegate { return self; } // // Notifications sent by other filters // - (void)hierarchyChanged { [self calcPopUp]; [super hierarchyChanged]; } - (void)calcPopUp { NSEnumerator *typeEnum; PajeEntityType *selectedEntityType; PajeEntityType *entityType; selectedEntityType = [self selectedEntityType]; [entityTypePopUp removeAllItems]; typeEnum = [[self allEntityTypes] objectEnumerator]; while ((entityType = [typeEnum nextObject]) != nil) { // only states have indentationLevel if ([self drawingTypeForEntityType:entityType] == PajeStateDrawingType) { [entityTypePopUp addItemWithTitle:[self descriptionForEntityType:entityType]]; [[entityTypePopUp lastItem] setRepresentedObject:entityType]; } } if ([entityTypePopUp numberOfItems] > 0) { if (selectedEntityType != nil) { [entityTypePopUp selectItemWithTitle:[self descriptionForEntityType:selectedEntityType]]; } if ([entityTypePopUp selectedItem] == nil) { [entityTypePopUp selectItemAtIndex:0]; } } [self synchronizeValues]; } - (void)synchronizeValues { PajeEntityType *selectedEntityType; selectedEntityType = [self selectedEntityType]; if (selectedEntityType == nil) { [minField setIntValue:0]; [maxField setIntValue:0]; [minField setEnabled:NO]; [maxField setEnabled:NO]; [minStepper setEnabled:NO]; [maxStepper setEnabled:NO]; } else { NSString *value; NSRange range; value = [limits objectForKey:[self descriptionForEntityType:selectedEntityType]]; if (value) { range = [value rangeValue]; } else { range = NSMakeRange(0,0); } [minField setIntValue:range.location]; [maxField setIntValue:range.length]; [minStepper setIntValue:range.location]; [maxStepper setIntValue:range.length]; [minField setEnabled:YES]; [maxField setEnabled:YES]; [minStepper setEnabled:YES]; [maxStepper setEnabled:YES]; [minStepper setValueWraps:NO]; [maxStepper setValueWraps:NO]; } } - (PajeEntityType *)selectedEntityType { return [[entityTypePopUp selectedItem] representedObject]; } // // // - (void)readDefaults { NSString *defaultName = [NSStringFromClass([self class]) stringByAppendingString:@" Limits"]; NSDictionary *limitsDict = [[NSUserDefaults standardUserDefaults] dictionaryForKey:defaultName]; [limits release]; if (limitsDict != nil) limits = [limitsDict mutableCopy]; else limits = [[NSMutableDictionary alloc] init]; } - (void)registerDefaults { NSString *defaultName = [NSStringFromClass([self class]) stringByAppendingString:@" Limits"]; [[NSUserDefaults standardUserDefaults] setObject:limits forKey:defaultName]; } #define SETCACHEABSENT(et) \ do { \ _cachedEntityType = et; \ _cachedPresence = NO; \ _cachedRange = NSMakeRange(0,0); \ } while(0) #define SETCACHERANGE(et, ran) \ do { \ _cachedEntityType = et; \ _cachedPresence = YES; \ _cachedRange = ran; \ } while(0) #define FILLCACHE(et) \ do { \ if (et != _cachedEntityType) { \ NSString * val; \ val = [limits objectForKey:[self descriptionForEntityType:et]]; \ if (val == nil) { \ SETCACHEABSENT(et); \ } else { \ SETCACHERANGE(et, [val rangeValue]); \ } \ } \ } while(0) - (BOOL)isFilteredEntityType:(PajeEntityType *)entityType { FILLCACHE(entityType); return _cachedPresence; } - (NSRange)rangeForEntityType:(PajeEntityType *)entityType { FILLCACHE(entityType); return _cachedRange; } - (void)setRange:(NSRange)ran forEntityType:(PajeEntityType *)entityType { if ((ran.location == 0) && (ran.length == 0)) { [limits removeObjectForKey:[self descriptionForEntityType:entityType]]; SETCACHEABSENT(entityType); } else { [limits setObject:[NSString stringWithRange:ran] forKey:[self descriptionForEntityType:entityType]]; SETCACHERANGE(entityType, ran); } [self registerDefaults]; [self dataChangedForEntityType:entityType]; } // // Handle interface messages // - (IBAction)entityTypeSelected:(id)sender { [self synchronizeValues]; } - (void)_valueChanged { [self setRange:NSMakeRange([minField intValue], [maxField intValue]) forEntityType:[self selectedEntityType]]; } - (IBAction)minValueChanged:(id)sender { [minField setIntValue:[sender intValue]]; [minStepper setIntValue:[sender intValue]]; [self _valueChanged]; } - (IBAction)maxValueChanged:(id)sender { [maxField setIntValue:[sender intValue]]; [maxStepper setIntValue:[sender intValue]]; [self _valueChanged]; } // // interact with interface // - (void)viewWillBeSelected:(NSView *)selectedView // message sent by PajeController when a view will be selected for display { [self synchronizeValues]; } // // Trace messages that are filtered // - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { int min, max; NSRange ran; NSEnumerator *origEnum; origEnum = [inputComponent enumeratorOfEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; if (![self isFilteredEntityType:entityType]) { return origEnum; } ran = [self rangeForEntityType:entityType]; min = ran.location; max = ran.length; return [ImbricationFilteringEnumerator enumeratorWithEnumerator:origEnum inputComponent:inputComponent minValue:min maxValue:max]; } - (NSEnumerator *)enumeratorOfCompleteEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration { int min, max; NSRange ran; NSEnumerator *origEnum; origEnum = [inputComponent enumeratorOfCompleteEntitiesTyped:entityType inContainer:container fromTime:start toTime:end minDuration:minDuration]; if (![self isFilteredEntityType:entityType]) { return origEnum; } ran = [self rangeForEntityType:entityType]; min = ran.location; max = ran.length; return [ImbricationFilteringEnumerator enumeratorWithEnumerator:origEnum inputComponent:inputComponent minValue:min maxValue:max]; } - (int)imbricationLevelForEntity:(PajeEntity *)entity; { int origValue; NSRange ran; PajeEntityType *entityType; entityType = [self entityTypeForEntity:entity]; origValue = [inputComponent imbricationLevelForEntity:entity]; if (![self isFilteredEntityType:entityType]) { return origValue; } ran = [self rangeForEntityType:entityType]; if (origValue > ran.length) origValue = ran.length; origValue -= ran.location; return origValue; } - (id)configuration { return limits; } - (void)setConfiguration:(id)config { if (![config isKindOfClass:[NSDictionary class]]) { return; } Assign(limits, [config unifyStrings]); } @end Paje-1.98/ImbricationFilter/InsetLimit.gorm/0000775000175000017500000000000011674062007020707 5ustar schnorrschnorrPaje-1.98/ImbricationFilter/InsetLimit.gorm/data.classes0000664000175000017500000000745411674062007023211 0ustar schnorrschnorr{ FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:" ); Super = NSObject; }; InsetLimit = { Actions = ( "entityTypeSelected:", "valueChanged:", "increaseMinValue:", "increaseMaxValue:", "decreaseMinValue:", "decreaseMaxValue:" ); Outlets = ( view, entityTypePopUp, minField, maxField, minStepper, maxStepper ); Super = PajeFilter; }; PajeComponent = { Actions = ( "inputEntity:", "outputEntity:" ); Outlets = ( ); Super = NSObject; }; PajeFilter = { Actions = ( ); Outlets = ( ); Super = PajeComponent; }; }Paje-1.98/ImbricationFilter/InsetLimit.gorm/objects.gorm0000664000175000017500000001203311674062007023225 0ustar schnorrschnorrGNUstep archive00002a96:00000023:00000085:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary& 01NSString&%Stepper01 NSStepper1 NSControl1NSView1 NSResponder% CT C) A A  A A& 01 NSMutableArray1 NSArray&%01 NSStepperCell1 NSActionCell1NSCell0&%001NSNumber1NSValuei%&&&&&&&&% @M ?%%0 &%NSOwner0 & % InsetLimit0 & %  TextField10 1 NSTextField% C C  B` A  B` A& 0 &%01NSTextFieldCell0&%Text01NSFont%&&&&&&&&%01NSColor0&%NSNamedColorSpace0&%System0&%textBackgroundColor00& % textColor0& % PopUpButton01 NSPopUpButton1NSButton% A CZ CE A  CE A& 0 &%01NSPopUpButtonCell1NSMenuItemCell1 NSButtonCell0&&&&&&&&&01NSMenu0&0 &01 NSMenuItem0 &%Item10!&&&%0"1NSImage0#& % common_Nibble%0$0%&%Item2!&&%%0&0'&%Item3!&&%%%0(&0)&&&&%%%%%0*&% Stepper10+% CT C  A A  A A& 0, &%0- 0.&%0&&&&&&&&% @M ?%Ӏ%Ӏ0/& %  TextField200% A C+ B A  B A& 01 &%0203& % Minimum Value04% A0&&&&&&&&%0506&%System07&%textBackgroundColor08609& % textColor0:& % TextField0;% C C) B` A  B` A& 0< &%0=0>&%Text&&&&&&&&%0?0@&%System0A&%textBackgroundColor0B@0C& % textColor0D& %  TextField30E% A C  B A  B A& 0F &%0G0H& % Maximum Value4&&&&&&&&%0I0J&%System0K&%textBackgroundColor0LJ0M& % textColor0N& %  FormCell10O1 NSFormCell!0P%0Q& % Helvetica A@A@&&&&&&&&% B0R0S& % Maximum Value&&&&&&&&0T&%GSCustomClassMap0U&0V& % GormNSPanel0W1NSPanel1NSWindow% ? A C C& % C D@0X% ? A C C  C C&0Y &0Z1 NSBox%  C C  C C&0[ &0\%  C C  C C&0] &; +0E0^0_&%TitleP&&&&&&&& %%0`0a&%NSCalibratedRGBColorSpace ?* ?* ?* ?* ?!0b&%Panelb ? ? F@ F@%0c0d&%NSApplicationIcon0e&%BoxZ0f&%FormCell0g!P&&&&&&&&% B0h0i& % Minimum Value&&&&&&&&0j &0k1!NSNibOutletConnector1"NSNibConnector0l&%NSOwnere0m&%view0n!l0o&%entityTypePopUp0p1#NSNibControlConnectorl0q&%entityTypeSelected:0r"0s":0t!l:0u&%minField0v" 0w"*0x!l 0y&%maxField0z#*l0{&% maxValueChanged:0|#l0}&% minValueChanged:0~#:l}0# l{0!l0& % minStepper0!l*0& % maxStepper0"/0"DlPaje-1.98/ImbricationFilter/InsetLimit.h0000664000175000017500000000446211674062007020123 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _InsetLimit_h_ #define _InsetLimit_h_ /* InsetLimit.h created by benhur on 25-feb-2001 */ #include #include "../General/FilteredEnumerator.h" #include "../General/Protocols.h" #include "../General/PajeFilter.h" @interface InsetLimit : PajeFilter { NSMutableDictionary *limits; IBOutlet NSView *view; IBOutlet NSPopUpButton *entityTypePopUp; IBOutlet NSTextField *minField; IBOutlet NSTextField *maxField; IBOutlet NSStepper *minStepper; IBOutlet NSStepper *maxStepper; id _cachedEntityType; BOOL _cachedPresence; NSRange _cachedRange; } - (id)initWithController:(PajeTraceController *)c; - (void)dealloc; // read and write defaults - (void)readDefaults; - (void)registerDefaults; // // Handle interface messages // - (IBAction)entityTypeSelected:(id)sender; - (IBAction)minValueChanged:(id)sender; - (IBAction)maxValueChanged:(id)sender; // // interact with interface // - (void)calcPopUp; - (void)synchronizeValues; - (PajeEntityType *)selectedEntityType; - (void)viewWillBeSelected:(NSView *)view; // // methods to filter // - (void)hierarchyChanged; - (NSEnumerator *)enumeratorOfEntitiesTyped:(PajeEntityType *)entityType inContainer:(PajeContainer *)container fromTime:(NSDate *)start toTime:(NSDate *)end minDuration:(double)minDuration; - (int)imbricationLevelForEntity:(PajeEntity *)entity; @end #endif Paje-1.98/Paje/0000775000175000017500000000000011674062007013134 5ustar schnorrschnorrPaje-1.98/Paje/GNUmakefile0000664000175000017500000000177611674062007015221 0ustar schnorrschnorrinclude $(GNUSTEP_MAKEFILES)/common.make Paje_PRINCIPAL_CLASS = NSApplication APP_NAME = Paje Paje_APPLICATION_ICON = Paje.tiff Paje_DOCICONS = traceFilePaje.tiff ADDITIONAL_INCLUDE_DIRS = -I../General ifeq ($(FOUNDATION_LIB), apple) LDFLAGS += -F../General -framework General else LDFLAGS += -L../General/General.framework -lGeneral endif Paje_MAIN_MODEL_FILE = Paje.gorm Paje_RESOURCE_FILES = \ Paje.gorm \ Paje.nib \ Paje.tiff \ traceFilePaje.tiff \ PajeInfo.plist \ ../SpaceTimeViewer/near.tiff \ ../SpaceTimeViewer/distant.tiff \ ../SpaceTimeViewer/toselection.tiff \ ../General/PajeEntityInspector.gorm \ ../General/PajeEntityInspector.nib Paje_OBJC_FILES = PajeController.m PajeTraceController.m PajeCheckPoint.m Paje_OBJC_FILES += Paje_main.m Paje_HEADER_FILES = PajeController.h PajeTraceController.h PajeCheckPoint.h -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/application.make -include GNUmakefile.postamble Paje-1.98/Paje/Paje_main.m0000664000175000017500000000166111674062007015201 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004, 2005 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include int main(int argc, const char *argv[]) { return NSApplicationMain(argc, argv); } Paje-1.98/Paje/PajeTraceController.h0000664000175000017500000000405311674062007017211 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeTraceController_h_ #define _PajeTraceController_h_ #include #include "../General/PSortedArray.h" #include "../General/PajeFilter.h" #include "PajeCheckPoint.h" #ifdef GNUSTEP #define IBOutlet #endif @interface PajeTraceController : NSObject { id reader; id simulator; id encapsulator; NSMutableDictionary *components; NSMutableDictionary *filters; NSMutableArray *tools; NSString *configurationName; PSortedArray *chunkDates; BOOL timeLimitsChanged; } - (void)registerFilter:(PajeFilter *)filter; - (void)registerTool:(id)tool; - (NSDictionary *)filters; - (NSArray *)tools; - (void)readNextChunk:(id)sender; - (void)readChunk:(int)chunkNumber; - (void)startChunk:(int)chunkNumber; - (void)endOfChunkLast:(BOOL)last; - (void)missingChunk:(int)chunkNumber; - (BOOL)openFile:(NSString *)filename; - (void)setConfigurationName:(NSString *)name; - (void)loadConfiguration:(NSString *)name; - (void)saveConfiguration; // One of the windows controlled by me has become key. - (void)windowIsKey; // Remove a component from the chain. - (void)removeComponent:component; // Close the controller (remove all components) - (void)close; @end #endif Paje-1.98/Paje/PajeInfo.plist0000664000175000017500000000162411674062007015707 0ustar schnorrschnorr{ ApplicationDescription = "A trace file viewer."; ApplicationName = "Paj\u00e9"; ApplicationRelease = "1.98"; ApplicationURL = "http://paje.sf.net"; Authors = ("Benhur Stein ", "Developed at Laboratoire ID, IMAG, France", "and Laborat\u00f3rio de Sistemas de Computa\u00e7\u00e3o, UFSM, Brazil", "", "Sponsored by: CAPES/COFECUB and CNPq"); Copyright = "Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Benhur Stein."; CopyrightDescription = "Released under the GNU Lesser General Public License 2.0"; FullVersionID = "1.98, (second pre2.0), Dec 2011"; NOTE = "Automatically generated, do not edit!"; NSExecutable = "Paje"; NSMainNibFile = "Paje"; NSIcon = "Paje.tiff"; NSPrincipalClass = "NSApplication"; NSRole = "Viewer"; NSTypes = ( { NSIcon = traceFilePaje.tiff; NSUnixExtensions = ( trace ); } ); } Paje-1.98/Paje/PajeController.m0000664000175000017500000002454211674062007016244 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "PajeController.h" #include "PajeTraceController.h" #include "PajeCheckPoint.h" #include "../General/Protocols.h" #include "../General/Macros.h" #include "../General/PajeFilter.h" #include "../StorageController/Encapsulate.h" #include @interface NSMenu (RemoveAllItems) - (void)removeAllItems; @end @implementation NSMenu (RemoveAllItems) - (void)removeAllItems { int i; for (i = [self numberOfItems]; i > 0; i--) { [self removeItemAtIndex: i-1]; } } @end @implementation PajeController static PajeController *uniqueController; + (PajeController *)controller { if (uniqueController == nil) { [[self alloc] init]; } return uniqueController; } - (void)awakeFromNib { // Couldn't connect to menu in Gorm, only to menuitem... if ([[filtersMenu class] isEqual:[NSMenuItem class]]) { filtersMenu = [(NSMenuItem *)filtersMenu submenu]; } if ([[toolsMenu class] isEqual:[NSMenuItem class]]) { toolsMenu = [(NSMenuItem *)toolsMenu submenu]; } } - (id)init { if (uniqueController != nil) { [self release]; } else { // initialisation code here Assign(traceControllers, [NSMutableArray array]); Assign(bundles, [NSMutableDictionary dictionary]); uniqueController = self; // FIXME: find a cleaner way of reading numbers independently of locale setlocale(LC_NUMERIC, "C"); } return uniqueController; } - (void)dealloc { Assign(traceControllers, nil); [super dealloc]; } - (NSBundle *)loadBundleNamed:(NSString*)name { NSString *bundleName; NSArray *bundlePaths; NSEnumerator *pathEnumerator; NSString *path; NSString *bundlePath; NSBundle *bundle; bundleName = [@"Bundles" stringByAppendingPathComponent:@"Paje"]; bundleName = [bundleName stringByAppendingPathComponent:name]; bundleName = [bundleName stringByAppendingPathExtension:@"bundle"]; bundlePaths = [[NSUserDefaults standardUserDefaults] arrayForKey:@"BundlePaths"]; if (!bundlePaths) { bundlePaths = NSSearchPathForDirectoriesInDomains( NSAllLibrariesDirectory, NSAllDomainsMask, YES); } // insert application path (eases development) bundlePaths = [[NSArray arrayWithObject:[[NSBundle mainBundle] bundlePath]] arrayByAddingObjectsFromArray:bundlePaths]; pathEnumerator = [bundlePaths objectEnumerator]; while ((path = [pathEnumerator nextObject]) != nil) { bundlePath = [path stringByAppendingPathComponent:bundleName]; bundle = [NSBundle bundleWithPath:bundlePath]; if ([bundle load]) { [bundles setObject:bundle forKey:name]; return bundle; } } [NSException raise:@"PajeException" format:@"Bundle '%@' not found", name]; return nil; } - (NSBundle *)bundleWithName:(NSString *)name { NSBundle *bundle; bundle = [bundles objectForKey:name]; if (bundle == nil) { [self loadBundleNamed:name]; bundle = [bundles objectForKey:name]; } return bundle; } - (void)loadAllBundles { return; [self loadBundleNamed:@"General"]; [self loadBundleNamed:@"FileReader"]; [self loadBundleNamed:@"PajeEventDecoder"]; [self loadBundleNamed:@"PajeSimulator"]; [self loadBundleNamed:@"StorageController"]; [self loadBundleNamed:@"EntityTypeFilter"]; [self loadBundleNamed:@"FieldFilter"]; [self loadBundleNamed:@"ContainerFilter"]; [self loadBundleNamed:@"OrderFilter"]; [self loadBundleNamed:@"ReductionFilter"]; [self loadBundleNamed:@"ImbricationFilter"]; [self loadBundleNamed:@"SpaceTimeViewer"]; [self loadBundleNamed:@"StatViewer"]; } - (void)applicationWillFinishLaunching:(NSNotification *)notification { [filtersPopUp removeAllItems]; [filtersMenu removeAllItems]; [[NSColorPanel sharedColorPanel] setShowsAlpha:YES]; [self loadAllBundles]; } - (void)applicationWillTerminate:(NSNotification *)notif { [[NSUserDefaults standardUserDefaults] synchronize]; } - (void)print:(id)sender { [[[NSApplication sharedApplication] keyWindow] print:sender]; } - (void)open:(id)sender { id openFilePanel; int result; NSString *directory; NSString *filename; //NSArray *filetypes = [NSArray arrayWithObjects:@"trace", nil]; filename = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastOpenFile"]; if (!filename) filename = @""; directory = [filename stringByDeletingLastPathComponent]; filename = [filename lastPathComponent]; openFilePanel = [NSOpenPanel openPanel]; [openFilePanel setCanChooseDirectories:NO]; [openFilePanel setCanChooseFiles:YES]; result = [openFilePanel runModalForDirectory:directory file:filename types:nil/*filetypes*/]; if (result == NSOKButton) { [self application:NSApp openFile:[openFilePanel filename]]; } } // // message sent by NSApplication if the user double-clicks a trace file // - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename { PajeTraceController *traceController; [[NSUserDefaults standardUserDefaults] setObject:filename forKey:@"LastOpenFile"]; traceController = [[[PajeTraceController alloc] init] autorelease]; if (![traceController openFile:filename]) { return NO; } [traceControllers addObject:traceController]; [self setCurrentTraceController:traceController]; return YES; } - (void)closeTraceController:(PajeTraceController *)traceController { if (traceController == currentTraceController) { [self setCurrentTraceController:nil]; } [traceController close]; [traceControllers removeObjectIdenticalTo:traceController]; } - (void)filterMenuSelected:(id)sender { [filtersPopUp selectItemAtIndex:[sender tag]]; [self filterChanged:self]; [filtersWindow makeKeyAndOrderFront:self]; } - (void)filterChanged:(id)sender { PajeFilter *filter; NSView *view; id delegate; filter = [[filtersPopUp selectedItem] representedObject]; if (filter == nil ) return; view = [filter filterView]; if ([filtersDummyView contentView] == view) return; delegate = [filter filterDelegate]; [filtersWindow setDelegate:delegate]; if ([delegate respondsToSelector:@selector(viewWillBeSelected:)]) [delegate viewWillBeSelected:view]; [filtersDummyView setContentView:view]; } - (void)setCurrentTraceController:(PajeTraceController *)controller { if (currentTraceController == controller) { return; } currentTraceController = controller; [self updateToolsMenu]; [self updateFiltersMenu]; } - (void)updateToolsMenu { NSEnumerator *toolsEnum; id tool; // keep the first menu item (Colors) while ([toolsMenu numberOfItems] > 1) { [toolsMenu removeItemAtIndex:1]; } toolsEnum = [[currentTraceController tools] objectEnumerator]; for (tool = [toolsEnum nextObject]; tool != nil; tool = [toolsEnum nextObject]) { NSString *toolName = [tool toolName]; [[toolsMenu addItemWithTitle:[toolName stringByAppendingString:@"..."] action:@selector(activateTool:) keyEquivalent:@""] setTarget:tool]; } [toolsMenu sizeToFit]; } - (void)updateFiltersMenu { NSDictionary *filters; NSEnumerator *filterNamesEnum; PajeFilter *filter; NSString *filterName; NSString *previouslySelectedFilterName; int tag = 0; previouslySelectedFilterName = [[[filtersPopUp selectedItem] title] retain]; [filtersMenu removeAllItems]; [filtersPopUp removeAllItems]; filters = [currentTraceController filters]; filterNamesEnum = [filters keyEnumerator]; while ((filterName = [filterNamesEnum nextObject]) != nil) { NSString *keyEquivalent; id menuItem; NSString *menuTitle; filter = [filters objectForKey:filterName]; keyEquivalent = [filter filterKeyEquivalent]; if ([filter filterView] == nil) { NSWarnLog(@"Filter %@ has no view", filterName); continue; } [filtersPopUp addItemWithTitle:filterName]; [[filtersPopUp lastItem] setRepresentedObject:filter]; menuTitle = [filterName stringByAppendingString:@"..."]; menuItem = [filtersMenu addItemWithTitle:menuTitle action:@selector(filterMenuSelected:) keyEquivalent:keyEquivalent]; [menuItem setTag:tag++]; } [filtersMenu addItemWithTitle:@"Save Configuration" action:@selector(saveFilterConfiguration:) keyEquivalent:@""]; [filtersMenu addItemWithTitle:@"Load Configuration" action:@selector(loadFilterConfiguration:) keyEquivalent:@""]; [filtersMenu sizeToFit]; [filtersPopUp selectItemWithTitle:previouslySelectedFilterName]; [self filterChanged:self]; [previouslySelectedFilterName release]; } - (void)saveFilterConfiguration:(id)sender { [currentTraceController setConfigurationName:@"/tmp/pajeconfig"]; } - (void)loadFilterConfiguration:(id)sender { [currentTraceController loadConfiguration:@"/tmp/pajeconfig"]; } @end Paje-1.98/Paje/Paje.gorm/0000775000175000017500000000000011674062007014756 5ustar schnorrschnorrPaje-1.98/Paje/Paje.gorm/data.info0000664000175000017500000000027011674062007016543 0ustar schnorrschnorrGNUstep archive00002f44:00000003:00000003:00000000:01GormFilePrefsManager1NSObject% 01NSString&%Latest Version0& % Typed StreamPaje-1.98/Paje/Paje.gorm/data.classes0000664000175000017500000000070711674062007017252 0ustar schnorrschnorr{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "filterChanged:", "filterMenuSelected:" ); Super = NSObject; }; PajeController = { Actions = ( "filterChanged:", "filterMenuSelected:", "print:", "open:", "zoom:" ); Outlets = ( filtersDummyView, filtersPopUp, filtersWindow, filtersMenu, toolsMenu ); Super = NSObject; }; }Paje-1.98/Paje/Paje.gorm/objects.gorm0000664000175000017500000004763311674062007017312 0ustar schnorrschnorrGNUstep archive00002f44:00000023:000002db:00000001:01GSNibContainer1NSObject01 GSMutableSet1 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&%NSPanel1 NSPanel1 NSWindow1 NSResponder% @ @ @p @v& % @ @01 NSView% @ @ @p @v  @p @v&01 NSMutableArray1NSArray&01 NSPopUpButton1NSButton1 NSControl% @( @u @n @4  @n @4& 0 &%0 1NSPopUpButtonCell1NSMenuItemCell1 NSButtonCell1 NSActionCell1NSCell0 &0 1NSFont%&&&&&&&&0 1NSMenu0 &0 &01 NSMenuItem0&%Item10&&&%01NSImage0& % common_Nibble%&&&&&&%0&0&&&& && %%%%%01NSBox% ? @t @p @  @p @& 0 &0 % @ @ @p   @p &0 &00&%Box0%0& % Helvetica A@A@&&&&&&&&&&&&&& %%0% @ @ @p @s  @p @s&0 &0 %  @p @s  @p @s&0! &0"0#&%Box&&&&&&&&&&&&&& %%0$1NSColor0%&%NSNamedColorSpace0&&%System0'&%windowBackgroundColor0(&%Filters( ? ? @È @È%0)0*&%NSApplicationIcon&   @@ @0+1 GSNibItem0,&%PajeController  &0-0.&%Paj0/ &  0001&%Info02&&&%03041NSMutableString&%common_2DCheckMark0506& % common_2DDash%07108 &090:& % Info Panel...2&&%35%0;0<&%Preferences...2&&%35%0=0>&%Help...0?&%?&&%35%-0@0A&%Open...0B&%o&&%%0C0D&%Edit0E&&&%%0FD0G &0H0I&%Cut0J&%x&&%%0K0L&%Copy0M&%c&&%%0N0O&%Paste0P&%v&&%%0Q0R& % Select All0S&%a&&%%-0T0U&%FiltersE&&%2 submenuAction:v24@0:8@16%0V0W&%Filters0X &0Y0Z&%ItemE&&%%-0[0\&%ToolsE&&%%0]\0^ &0_0`& % Colors...E&&%%-0a0b&%WindowsE&&%%0cb0d &0e0f&%Arrange in FrontE&&%%0g0h&%Miniaturize Window0i&%m&&%%0j0k& % Close Window0l&%w&&%%-0m0n&%Services0o&&&%35%0pn0q &-0r0s&%Print...0t&%p&&%%0u0v&%Hide0w&%h&&%35%0x0y&%Quit0z&%q&&%35%0{ &0| &0}1NSMutableDictionary1 NSDictionary&0~&%Menu(0)00&%Paj0 &  00&%Info0&&&%%00 &00& % Info Panel...&&%%00&%Preferences...&&%%00&%Help...0&%?&&%%00&%Open...0&%o&&%%00&%Edit&&%%00 &00&%Cut0&%x&&%%00&%Copy0&%c&&%%00&%Paste0&%v&&%%00& % Select All0&%a&&%%00&%Filters&&%%00 &00&%Item&&%%00&%Tools&&%%00 &00& % Colors...&&%%00&%Windows&&%%00 &00&%Arrange in Front&&%%00&%Miniaturize Window0&%m&&%%00& % Close Window0&%w&&%%00&%Services&&%%00 &00&%Print...0&%p&&%%00&%Hide0±&%h&&%%0ñ0ı&%Quit0ű&%q&&%%0Ʊ& % MenuItem(38)0DZ0ȱ&%Windows0ɱ&&&%%0ʱ0˱ &0̱0ͱ&%Arrange in Front&&%%0α0ϱ&%Miniaturize Window0б&%m&&%%0ѱ0ұ& % Close Window0ӱ&%w&&%%0Ա0ձ&%Paj0ֱ &  0ױ0ر&%Info&&%%0ٱ0ڱ &0۱0ܱ& % Info Panel...&&%%0ݱ0ޱ&%Preferences...&&%%0߱0&%Help...0&%?&&%%00&%Open...0&%o&&%%00&%Edit&&%%00 &00&%Cut0&%x&&%%00&%Copy0&%c&&%%00&%Paste0&%v&&%%00& % Select All0&%a&&%%00&%Filters&&%%00 &00&%Item&&%%00&%Tools&&%%00 &0P& % Colors...&&%%PP&%Services&&%%PP &PP&%Print...P&%p&&%%PP &%HideP &%h&&%%P P &%QuitP &%q&&%%P&%Box(1)P& % MenuItem(9)P& % MenuItem(111)9P& % MenuItem(58)PP&%ToolsP&&&%%PP &PP& % Colors...&&%%PP&%PajP &  PP&%Info&&%%PP &P P!& % Info Panel...&&%%P"P#&%Preferences...&&%%P$P%&%Help...P&&%?&&%%P'P(&%Open...P)&%o&&%%P*P+&%Edit&&%%P,+P- &P.P/&%CutP0&%x&&%%P1P2&%CopyP3&%c&&%%P4P5&%PasteP6&%v&&%%P7P8& % Select AllP9&%a&&%%P:P;&%Filters&&%%P<;P= &P>P?&%Item&&%%P@PA&%Windows&&%%PBAPC &PDPE&%Arrange in Front&&%%PFPG&%Miniaturize WindowPH&%m&&%%PIPJ& % Close WindowPK&%w&&%%PLPM&%Services&&%%PNMPO &PPPQ&%Print...PR&%p&&%%PSPT&%HidePU&%h&&%%PVPW&%QuitPX&%q&&%%PY&%Panel(0)PZ& % MenuItem(26)P[& % MenuItem(78)TP\&%Menu(9)P]&%View(3) P^&%Menu(18)P_& % MenuItem(46)P`& % MenuItem(98)QPa&%Menu(38)pPb&%NSMenu-Pc& % MenuItem(14)Pd& % MenuItem(66)SPe& % MenuItem(34)Pf& % MenuItem(5)Pg& % MenuItem(86)mPh&%Menu(26)pPi& % MenuItem(108)uPj& % MenuItem(54)4Pk& % MenuItem(128)uPl& % MenuItem(22)Pm& % MenuItem(74)HPn&%Menu(5)Po&%Menu(14)Pp& % MenuItem(42)Pq& % MenuItem(94)CPr&%NSOwnerPs& % NSApplicationPt& % MenuItem(116)HPu& % MenuItem(10)Pv&%Menu(34)FPw& % MenuItem(62)FPx& % MenuItem(30)Py& % MenuItem(82)aPz& % MenuItem(1)xP{& % MenuItem(104)gP|&%Menu(22)FP}& % MenuItem(50)'P~& % MenuItem(19)P& % MenuItem(124)gP& % MenuItem(70)9P&%Menu(1)P& % MenuItem(39)P&%Menu(10)P& % MenuItem(90);P& % MenuItem(59)P&%Menu(30)]P& % MenuItem(112);P& % MenuItem(27)P& % MenuItem(79)YP&%Menu(19)BP& % MenuItem(47) P& % MenuItem(100)[P& % MenuItem(99)YP& % MenuItem(15)P& % MenuItem(120)[P& % MenuItem(67)VP& % MenuItem(35)P& % MenuItem(87)rP& % MenuItem(6)P& % MenuItem(109)xP&%Menu(27)7P& % MenuItem(55)7P& % NSWindowsMenucP& % MenuItem(23)P& % MenuItem(129)xP& % MenuItem(75)KP&%Menu(6)P&%Menu(15)P& % MenuItem(43)P& % MenuItem(95)HP& % MenuItem(11)P&%Menu(35)VP& % MenuItem(117)KP& % MenuItem(63)IP& % MenuItem(31)P& % MenuItem(2)P& % MenuItem(83)eP&%Menu(23)VP& % MenuItem(105)jP& % MenuItem(51)*P& % MenuItem(125)jP& % MenuItem(71);P&%Menu(2)P&%Menu(11)P& % MenuItem(91)=P& % MenuItem(113)=P&%Menu(31)cP& % MenuItem(28)P& % MenuItem(101)_P& % MenuItem(48)"P& % MenuItem(16)P&%PopUpButton(0)P& % MenuItem(68)P& % MenuItem(121)_P& % MenuItem(36)P& % MenuItem(7)P& % MenuItem(88)0P&%Menu(28)FP& % MenuItem(56):P& % MenuItem(24)P& % MenuItem(76)NP&%Menu(7)P&%View(1)P&%Menu(16),P& % MenuItem(44)P±& % MenuItem(96)KPñ& % MenuItem(118)NPı& % MenuItem(12)Pű&%Menu(36)]PƱ& % MenuItem(64)LPDZ&%PajeController(0)+Pȱ& % MenuItem(32)Pɱ& % MenuItem(84)gPʱ& % MenuItem(3)P˱&%Menu(24)]P̱& % MenuItem(106)PͱPα&%ServicesE&&%%PϱPб &Pѱ& % MenuItem(52).Pұ& % MenuItem(20)Pӱ& % MenuItem(126)mPԱ&%Menu(3)Pձ& % MenuItem(72)@Pֱ&%Menu(12)Pױ& % MenuItem(40)Pر& % MenuItem(92)=Pٱ&%Menu(32)Pڱ& % MenuItem(114)@P۱& % MenuItem(60)@Pܱ& % MenuItem(29)Pݱ& % MenuItem(80)[Pޱ&%Menu(20)NP߱& % MenuItem(49)$P& % MenuItem(102)aP& % MenuItem(17)P& % MenuItem(69)0P& % MenuItem(122)aP& % MenuItem(37)P& % MenuItem(8)P& % MenuItem(89)9P&%Box(0)P&%Menu(29)VP& % MenuItem(57)>P& % MenuItem(110)0P& % MenuItem(25)P& % MenuItem(77)QP&%Menu(8)P&%Menu(17)!l~P?!~P@!PA!PB!PC!PD!ZPE!PF"PG&%submenuAction:PH!PI!PJ!\ܐPK!x\PL!\PM!\PN!\PO"PP&%submenuAction:PQ!ePR!ePS!PT"ePU&%submenuAction:PV!PW!PX!PY"PZ&%submenuAction:P[!P\!ְƐP]!֐P^!֐P_!֐P`"Pa&%submenuAction:Pb!pPc!pPd"pPe&%submenuAction:Pf!Pg!Ph!Pi!oPj!_oPk!_Pl!Pm!Pn!Po"_oPp&%submenuAction:Pq!}oPr!oPs!Pt!Pu!Pv!jPw!Px"oPy&%submenuAction:Pz!oP{!P|!P}"oP~&%submenuAction:P!oP!^P!^P"oP&%submenuAction:P!oP!ېP!P!wP!P"oP&%submenuAction:P!oP!ƐP"oP&%submenuAction:P!oP!doP!oP!bP!P!P!P!P!P"bP&%submenuAction:P![bP![P!P"[bP&%submenuAction:P!bP!ݐP!ːP"bP&%submenuAction:P!bP!P! P!P!P"bP&%submenuAction:P!bP!P1#NSNibOutletConnectorP&%delegateP#bP&%menuP!bP"P&%open:P"P&%print:P"P&%orderFrontColorPanel:P!bP! P! P"P&%orderFrontStandardInfoPanel:P! P! P"P&%orderFrontHelpPanel:P"bP±&%submenuAction:Pñ!YPı!YPű!YPƱ!PDZ!YPȱ!Pɱ!YPʱ!]P˱#P̱&%filtersDummyViewPͱ#Pα& % filtersPopUpPϱ#YPб& % filtersWindowPѱ#[Pұ& % filtersMenuPӱ#PԱ& % toolsMenuPձ!gbPֱ!gPױ"gbPر&%submenuAction:Pٱ"Pڱ&%filterChanged:P۱&Paje-1.98/Paje/Paje.nib/0000775000175000017500000000000011674062007014562 5ustar schnorrschnorrPaje-1.98/Paje/Paje.nib/keyedobjects.nib0000664000175000017500000043531211674062007017737 0ustar schnorrschnorr $archiver NSKeyedArchiver $objects $null $class CF$UID 514 NSAccessibilityConnectors CF$UID 511 NSAccessibilityOidsKeys CF$UID 512 NSAccessibilityOidsValues CF$UID 513 NSClassesKeys CF$UID 381 NSClassesValues CF$UID 382 NSConnections CF$UID 9 NSFontManager CF$UID 0 NSFramework CF$UID 6 NSNamesKeys CF$UID 351 NSNamesValues CF$UID 352 NSNextOid 275 NSObjectsKeys CF$UID 265 NSObjectsValues CF$UID 350 NSOidsKeys CF$UID 383 NSOidsValues CF$UID 384 NSRoot CF$UID 2 NSVisibleWindows CF$UID 7 $class CF$UID 5 NSClassName CF$UID 3 $class CF$UID 4 NS.string NSApplication $classes NSMutableString NSString NSObject $classname NSMutableString $classes NSCustomObject NSObject $classname NSCustomObject $class CF$UID 4 NS.string IBCocoaFramework $class CF$UID 8 NS.objects $classes NSMutableSet NSSet NSObject $classname NSMutableSet $class CF$UID 188 NS.objects CF$UID 10 CF$UID 24 CF$UID 29 CF$UID 35 CF$UID 40 CF$UID 46 CF$UID 51 CF$UID 57 CF$UID 61 CF$UID 66 CF$UID 70 CF$UID 74 CF$UID 79 CF$UID 84 CF$UID 90 CF$UID 95 CF$UID 100 CF$UID 105 CF$UID 110 CF$UID 115 CF$UID 120 CF$UID 125 CF$UID 130 CF$UID 134 CF$UID 138 CF$UID 142 CF$UID 148 CF$UID 152 CF$UID 156 CF$UID 160 CF$UID 165 CF$UID 170 CF$UID 175 CF$UID 239 CF$UID 241 CF$UID 243 CF$UID 245 CF$UID 250 CF$UID 255 CF$UID 259 $class CF$UID 23 NSLabel CF$UID 22 NSSource CF$UID 11 $class CF$UID 21 NSKeyEquiv CF$UID 14 NSKeyEquivModMask 1048576 NSMenu CF$UID 12 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 13 $class CF$UID 230 NSMenuItems CF$UID 319 NSName CF$UID 321 NSTitle CF$UID 318 Minimize m $class CF$UID 18 NSClassName CF$UID 16 NSResourceName CF$UID 17 NSImage NSMenuCheckmark $classes NSCustomResource %NSCustomResource NSObject $classname NSCustomResource $class CF$UID 18 NSClassName CF$UID 16 NSResourceName CF$UID 20 NSMenuMixedState $classes NSMenuItem NSObject $classname NSMenuItem $class CF$UID 4 NS.string performMiniaturize: $classes NSNibControlConnector NSNibConnector NSObject $classname NSNibControlConnector $class CF$UID 23 NSLabel CF$UID 28 NSSource CF$UID 25 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 12 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 26 Bring All to Front $class CF$UID 4 NS.string arrangeInFront: $class CF$UID 23 NSLabel CF$UID 34 NSSource CF$UID 30 $class CF$UID 21 NSKeyEquiv CF$UID 33 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 32 $class CF$UID 230 NSMenuItems CF$UID 294 NSTitle CF$UID 293 Print… p $class CF$UID 4 NS.string print: $class CF$UID 23 NSLabel CF$UID 39 NSSource CF$UID 36 $class CF$UID 21 NSKeyEquiv CF$UID 38 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 37 Page Setup… P $class CF$UID 4 NS.string runPageLayout: $class CF$UID 23 NSLabel CF$UID 45 NSSource CF$UID 41 $class CF$UID 21 NSKeyEquiv CF$UID 44 NSKeyEquivModMask 1048576 NSMenu CF$UID 42 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 43 $class CF$UID 230 NSMenuItems CF$UID 323 NSTitle CF$UID 322 NewApplication Help ? $class CF$UID 4 NS.string showHelp: $class CF$UID 23 NSLabel CF$UID 50 NSSource CF$UID 47 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 48 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 49 $class CF$UID 230 NSMenuItems CF$UID 302 NSName CF$UID 303 NSTitle CF$UID 301 Clear Menu $class CF$UID 4 NS.string clearRecentDocuments: $class CF$UID 23 NSDestination CF$UID 2 NSLabel CF$UID 56 NSSource CF$UID 52 $class CF$UID 21 NSKeyEquiv CF$UID 55 NSKeyEquivModMask 1048576 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 54 $class CF$UID 230 NSMenuItems CF$UID 267 NSName CF$UID 282 NSTitle CF$UID 266 Quit NewApplication q $class CF$UID 4 NS.string terminate: $class CF$UID 23 NSDestination CF$UID 2 NSLabel CF$UID 60 NSSource CF$UID 58 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 59 About NewApplication $class CF$UID 4 NS.string orderFrontStandardAboutPanel: $class CF$UID 23 NSDestination CF$UID 2 NSLabel CF$UID 65 NSSource CF$UID 62 $class CF$UID 21 NSKeyEquiv CF$UID 64 NSKeyEquivModMask 1572864 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 63 Hide Others h hideOtherApplications: $class CF$UID 23 NSDestination CF$UID 2 NSLabel CF$UID 69 NSSource CF$UID 67 $class CF$UID 21 NSKeyEquiv CF$UID 64 NSKeyEquivModMask 1048576 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 68 Hide NewApplication hide: $class CF$UID 23 NSDestination CF$UID 2 NSLabel CF$UID 73 NSSource CF$UID 71 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 72 Show All unhideAllApplications: $class CF$UID 23 NSLabel CF$UID 78 NSSource CF$UID 75 $class CF$UID 21 NSKeyEquiv CF$UID 77 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 76 Close w performClose: $class CF$UID 23 NSLabel CF$UID 83 NSSource CF$UID 80 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 81 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 82 $class CF$UID 230 NSMenuItems CF$UID 340 NSTitle CF$UID 338 Check Spelling as You Type toggleContinuousSpellChecking: $class CF$UID 23 NSLabel CF$UID 89 NSSource CF$UID 85 $class CF$UID 21 NSKeyEquiv CF$UID 88 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 87 $class CF$UID 230 NSMenuItems CF$UID 331 NSTitle CF$UID 330 Undo z $class CF$UID 4 NS.string undo: $class CF$UID 23 NSLabel CF$UID 94 NSSource CF$UID 91 $class CF$UID 21 NSKeyEquiv CF$UID 93 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 92 Copy c $class CF$UID 4 NS.string copy: $class CF$UID 23 NSLabel CF$UID 99 NSSource CF$UID 96 $class CF$UID 21 NSKeyEquiv CF$UID 98 NSKeyEquivModMask 1048576 NSMenu CF$UID 81 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 97 Check Spelling ; $class CF$UID 4 NS.string checkSpelling: $class CF$UID 23 NSLabel CF$UID 104 NSSource CF$UID 101 $class CF$UID 21 NSKeyEquiv CF$UID 103 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 102 Paste v $class CF$UID 4 NS.string paste: $class CF$UID 23 NSLabel CF$UID 109 NSSource CF$UID 106 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 107 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 108 $class CF$UID 230 NSMenuItems CF$UID 314 NSTitle CF$UID 312 Stop Speaking stopSpeaking: $class CF$UID 23 NSLabel CF$UID 114 NSSource CF$UID 111 $class CF$UID 21 NSKeyEquiv CF$UID 113 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 112 Cut x $class CF$UID 4 NS.string cut: $class CF$UID 23 NSLabel CF$UID 119 NSSource CF$UID 116 $class CF$UID 21 NSKeyEquiv CF$UID 118 NSKeyEquivModMask 1048576 NSMenu CF$UID 81 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 117 Spelling… : $class CF$UID 4 NS.string showGuessPanel: $class CF$UID 23 NSLabel CF$UID 124 NSSource CF$UID 121 $class CF$UID 21 NSKeyEquiv CF$UID 123 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 122 Redo Z $class CF$UID 4 NS.string redo: $class CF$UID 23 NSLabel CF$UID 129 NSSource CF$UID 126 $class CF$UID 21 NSKeyEquiv CF$UID 128 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 127 Select All a $class CF$UID 4 NS.string selectAll: $class CF$UID 23 NSLabel CF$UID 133 NSSource CF$UID 131 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 107 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 132 Start Speaking startSpeaking: $class CF$UID 23 NSLabel CF$UID 137 NSSource CF$UID 135 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 136 Delete delete: $class CF$UID 23 NSLabel CF$UID 141 NSSource CF$UID 139 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 12 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 140 Zoom performZoom: $class CF$UID 23 NSLabel CF$UID 147 NSSource CF$UID 143 $class CF$UID 21 NSKeyEquiv CF$UID 146 NSKeyEquivModMask 1048576 NSMenu CF$UID 144 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTag 1 NSTitle CF$UID 145 $class CF$UID 230 NSMenuItems CF$UID 284 NSTitle CF$UID 283 Find… f performFindPanelAction: $class CF$UID 23 NSLabel CF$UID 147 NSSource CF$UID 149 $class CF$UID 21 NSKeyEquiv CF$UID 151 NSKeyEquivModMask 1048576 NSMenu CF$UID 144 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTag 2 NSTitle CF$UID 150 Find Next g $class CF$UID 23 NSLabel CF$UID 147 NSSource CF$UID 153 $class CF$UID 21 NSKeyEquiv CF$UID 155 NSKeyEquivModMask 1048576 NSMenu CF$UID 144 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTag 3 NSTitle CF$UID 154 Find Previous G $class CF$UID 23 NSLabel CF$UID 147 NSSource CF$UID 157 $class CF$UID 21 NSKeyEquiv CF$UID 159 NSKeyEquivModMask 1048576 NSMenu CF$UID 144 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTag 7 NSTitle CF$UID 158 Use Selection for Find e $class CF$UID 23 NSLabel CF$UID 164 NSSource CF$UID 161 $class CF$UID 21 NSKeyEquiv CF$UID 163 NSKeyEquivModMask 1048576 NSMenu CF$UID 144 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 162 Jump to Selection j centerSelectionInVisibleArea: $class CF$UID 23 NSLabel CF$UID 169 NSSource CF$UID 166 $class CF$UID 21 NSKeyEquiv CF$UID 168 NSKeyEquivModMask 1572864 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 167 Paste and Match Style V pasteAsPlainText: $class CF$UID 174 NSDestination CF$UID 171 NSLabel CF$UID 173 NSSource CF$UID 2 $class CF$UID 5 NSClassName CF$UID 172 PajeController delegate $classes NSNibOutletConnector NSNibConnector NSObject $classname NSNibOutletConnector $class CF$UID 174 NSDestination CF$UID 176 NSLabel CF$UID 238 NSSource CF$UID 171 $class CF$UID 237 NSMaxSize CF$UID 236 NSMinSize CF$UID 235 NSScreenRect CF$UID 234 NSViewClass CF$UID 180 NSWTFlags 1886912512 NSWindowBacking 2 NSWindowClass CF$UID 179 NSWindowRect CF$UID 177 NSWindowStyleMask 10 NSWindowTitle CF$UID 178 NSWindowView CF$UID 181 {{169, 390}, {298, 416}} Panel $class CF$UID 4 NS.string NSPanel $class CF$UID 4 NS.string View $class CF$UID 187 NSFrame CF$UID 233 NSNextResponder CF$UID 0 NSSubviews CF$UID 182 $class CF$UID 188 NS.objects CF$UID 183 CF$UID 204 CF$UID 213 $class CF$UID 203 NSBorderType 0 NSBoxType 3 NSContentView CF$UID 185 NSFrameSize CF$UID 189 NSNextResponder CF$UID 181 NSOffsets CF$UID 190 NSSubviews CF$UID 184 NSSuperview CF$UID 181 NSTitleCell CF$UID 191 NSTitlePosition 0 NSTransparent NSvFlags 18 $class CF$UID 188 NS.objects CF$UID 185 $class CF$UID 187 NSFrameSize CF$UID 186 NSNextResponder CF$UID 183 NSSuperview CF$UID 183 {298, 356} $classes NSView NSResponder NSObject $classname NSView $classes NSMutableArray NSArray NSObject $classname NSMutableArray {298, 356} {0, 0} $class CF$UID 202 NSBackgroundColor CF$UID 196 NSCellFlags 67239424 NSCellFlags2 0 NSContents CF$UID 192 NSSupport CF$UID 193 NSTextColor CF$UID 201 Box $class CF$UID 195 NSName CF$UID 194 NSSize 11 NSfFlags 3100 LucidaGrande $classes NSFont NSObject $classname NSFont $class CF$UID 200 NSCatalogName CF$UID 197 NSColor CF$UID 199 NSColorName CF$UID 198 NSColorSpace 6 System textBackgroundColor $class CF$UID 200 NSColorSpace 3 NSWhite MQA= $classes NSColor NSObject $classname NSColor $class CF$UID 200 NSColorSpace 3 NSWhite MCAwLjgwMDAwMDAxAA== $classes NSTextFieldCell NSActionCell NSCell NSObject $classname NSTextFieldCell $classes NSBox NSView NSResponder NSObject $classname NSBox $class CF$UID 203 NSBorderType 3 NSBoxType 2 NSFrame CF$UID 208 NSNextResponder CF$UID 181 NSOffsets CF$UID 209 NSSubviews CF$UID 205 NSSuperview CF$UID 181 NSTitleCell CF$UID 210 NSTitlePosition 0 NSTransparent NSvFlags 10 $class CF$UID 188 NS.objects CF$UID 206 $class CF$UID 187 NSFrame CF$UID 207 NSNextResponder CF$UID 204 NSSuperview CF$UID 204 {{2, 2}, {125, 1}} {{0, 354}, {298, 5}} {0, 0} $class CF$UID 202 NSBackgroundColor CF$UID 196 NSCellFlags 67239424 NSCellFlags2 0 NSContents CF$UID 192 NSSupport CF$UID 211 NSTextColor CF$UID 212 $class CF$UID 195 NSName CF$UID 194 NSSize 13 NSfFlags 1044 $class CF$UID 200 NSColorSpace 3 NSWhite MCAwLjgwMDAwMDAxAA== $class CF$UID 232 NSCell CF$UID 215 NSEnabled NSFrame CF$UID 214 NSNextResponder CF$UID 181 NSSuperview CF$UID 181 NSvFlags 266 {{17, 373}, {264, 26}} $class CF$UID 231 NSAlternateContents CF$UID 27 NSAlternateImage CF$UID 216 NSAltersState NSArrowPosition 1 NSButtonFlags 109199615 NSButtonFlags2 1 NSCellFlags -2076049856 NSCellFlags2 134219776 NSControlView CF$UID 213 NSKeyEquivalent CF$UID 217 NSMenu CF$UID 219 NSMenuItem CF$UID 218 NSPeriodicDelay 400 NSPeriodicInterval 75 NSPreferredEdge 3 NSSupport CF$UID 211 NSUsesItemFromMenu $class CF$UID 195 NSName CF$UID 194 NSSize 13 NSfFlags 16 $class CF$UID 4 NS.string $class CF$UID 21 NSAction CF$UID 221 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 219 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSState 1 NSTarget CF$UID 215 NSTitle CF$UID 220 $class CF$UID 230 NSMenuItems CF$UID 223 NSTitle CF$UID 222 Item1 _popUpItemAction: $class CF$UID 4 NS.string OtherViews $class CF$UID 188 NS.objects CF$UID 218 CF$UID 224 CF$UID 227 $class CF$UID 21 NSAction CF$UID 226 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 219 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTarget CF$UID 215 NSTitle CF$UID 225 Item2 _popUpItemAction: $class CF$UID 21 NSAction CF$UID 229 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 219 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTarget CF$UID 215 NSTitle CF$UID 228 Item3 _popUpItemAction: $classes NSMenu NSObject $classname NSMenu $classes NSPopUpButtonCell NSMenuItemCell NSButtonCell %NSButtonCell NSActionCell NSCell NSObject $classname NSPopUpButtonCell $classes NSPopUpButton NSButton NSControl NSView NSResponder NSObject $classname NSPopUpButton {{1, 1}, {298, 416}} {{0, 0}, {1280, 1002}} {200, 222} {3.40282e+38, 3.40282e+38} $classes NSWindowTemplate NSObject $classname NSWindowTemplate filtersWindow $class CF$UID 174 NSDestination CF$UID 183 NSLabel CF$UID 240 NSSource CF$UID 171 filtersDummyView $class CF$UID 174 NSDestination CF$UID 213 NSLabel CF$UID 242 NSSource CF$UID 171 filtersPopUp $class CF$UID 23 NSDestination CF$UID 171 NSLabel CF$UID 244 NSSource CF$UID 213 filterChanged: $class CF$UID 23 NSDestination CF$UID 171 NSLabel CF$UID 249 NSSource CF$UID 246 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 247 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 248 $class CF$UID 230 NSMenuItems CF$UID 257 NSTitle CF$UID 256 Item filterMenuSelected: $class CF$UID 23 NSDestination CF$UID 171 NSLabel CF$UID 254 NSSource CF$UID 251 $class CF$UID 21 NSKeyEquiv CF$UID 253 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 252 Open… o open: $class CF$UID 174 NSDestination CF$UID 247 NSLabel CF$UID 258 NSSource CF$UID 171 Filters $class CF$UID 188 NS.objects CF$UID 246 filtersMenu $class CF$UID 174 NSDestination CF$UID 260 NSLabel CF$UID 264 NSSource CF$UID 171 $class CF$UID 230 NSMenuItems CF$UID 262 NSTitle CF$UID 261 Tools $class CF$UID 188 NS.objects CF$UID 263 $class CF$UID 21 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 260 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 248 toolsMenu $class CF$UID 349 NS.objects CF$UID 53 CF$UID 260 CF$UID 144 CF$UID 91 CF$UID 30 CF$UID 263 CF$UID 285 CF$UID 288 CF$UID 280 CF$UID 291 CF$UID 67 CF$UID 101 CF$UID 31 CF$UID 58 CF$UID 11 CF$UID 185 CF$UID 41 CF$UID 268 CF$UID 206 CF$UID 171 CF$UID 309 CF$UID 62 CF$UID 295 CF$UID 139 CF$UID 166 CF$UID 308 CF$UID 311 CF$UID 176 CF$UID 246 CF$UID 315 CF$UID 143 CF$UID 42 CF$UID 25 CF$UID 269 CF$UID 80 CF$UID 36 CF$UID 71 CF$UID 251 CF$UID 135 CF$UID 12 CF$UID 52 CF$UID 324 CF$UID 327 CF$UID 218 CF$UID 247 CF$UID 149 CF$UID 272 CF$UID 304 CF$UID 86 CF$UID 81 CF$UID 281 CF$UID 298 CF$UID 181 CF$UID 126 CF$UID 116 CF$UID 286 CF$UID 75 CF$UID 219 CF$UID 153 CF$UID 121 CF$UID 345 CF$UID 343 CF$UID 48 CF$UID 333 CF$UID 224 CF$UID 320 CF$UID 332 CF$UID 337 CF$UID 305 CF$UID 131 CF$UID 273 CF$UID 157 CF$UID 85 CF$UID 213 CF$UID 107 CF$UID 47 CF$UID 204 CF$UID 96 CF$UID 183 CF$UID 334 CF$UID 227 CF$UID 111 CF$UID 106 CF$UID 276 CF$UID 161 NewApplication $class CF$UID 188 NS.objects CF$UID 58 CF$UID 268 CF$UID 269 CF$UID 272 CF$UID 273 CF$UID 280 CF$UID 67 CF$UID 62 CF$UID 71 CF$UID 281 CF$UID 52 $class CF$UID 21 NSIsDisabled NSIsSeparator NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 27 $class CF$UID 21 NSKeyEquiv CF$UID 271 NSKeyEquivModMask 1048576 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 270 Preferences… , $class CF$UID 21 NSIsDisabled NSIsSeparator NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 27 $class CF$UID 21 NSAction CF$UID 275 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 276 NSTitle CF$UID 274 Services submenuAction: $class CF$UID 230 NSMenuItems CF$UID 278 NSName CF$UID 279 NSTitle CF$UID 277 $class CF$UID 4 NS.string Services $class CF$UID 188 NS.objects _NSServicesMenu $class CF$UID 21 NSIsDisabled NSIsSeparator NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 27 $class CF$UID 21 NSIsDisabled NSIsSeparator NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 53 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 27 _NSAppleMenu $class CF$UID 4 NS.string Find $class CF$UID 188 NS.objects CF$UID 143 CF$UID 149 CF$UID 153 CF$UID 157 CF$UID 161 $class CF$UID 21 NSAction CF$UID 287 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 286 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 53 NSTitle CF$UID 266 $class CF$UID 230 NSMenuItems CF$UID 342 NSName CF$UID 348 NSTitle CF$UID 341 submenuAction: $class CF$UID 21 NSKeyEquiv CF$UID 290 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 289 Save As… S $class CF$UID 21 NSKeyEquiv CF$UID 27 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 292 Revert $class CF$UID 4 NS.string File $class CF$UID 188 NS.objects CF$UID 295 CF$UID 251 CF$UID 298 CF$UID 304 CF$UID 75 CF$UID 305 CF$UID 288 CF$UID 291 CF$UID 308 CF$UID 36 CF$UID 30 $class CF$UID 21 NSKeyEquiv CF$UID 297 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 296 New n $class CF$UID 21 NSAction CF$UID 300 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 48 NSTitle CF$UID 299 Open Recent submenuAction: $class CF$UID 4 NS.string Open Recent $class CF$UID 188 NS.objects CF$UID 47 _NSRecentDocumentsMenu $class CF$UID 21 NSIsDisabled NSIsSeparator NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 27 $class CF$UID 21 NSKeyEquiv CF$UID 307 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 306 Save s $class CF$UID 21 NSIsDisabled NSIsSeparator NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 31 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 27 $class CF$UID 21 NSAction CF$UID 310 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 286 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 247 NSTitle CF$UID 256 submenuAction: $class CF$UID 21 NSAction CF$UID 313 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 107 NSTitle CF$UID 312 Speech submenuAction: $class CF$UID 188 NS.objects CF$UID 131 CF$UID 106 $class CF$UID 21 NSAction CF$UID 317 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 286 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 12 NSTitle CF$UID 316 Window submenuAction: $class CF$UID 4 NS.string Window $class CF$UID 188 NS.objects CF$UID 11 CF$UID 139 CF$UID 320 CF$UID 25 $class CF$UID 21 NSIsDisabled NSIsSeparator NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 12 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 27 _NSWindowsMenu $class CF$UID 4 NS.string Help $class CF$UID 188 NS.objects CF$UID 41 $class CF$UID 21 NSAction CF$UID 326 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 286 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 31 NSTitle CF$UID 325 File submenuAction: $class CF$UID 21 NSAction CF$UID 329 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 286 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 86 NSTitle CF$UID 328 Edit submenuAction: $class CF$UID 4 NS.string Edit $class CF$UID 188 NS.objects CF$UID 85 CF$UID 121 CF$UID 332 CF$UID 111 CF$UID 91 CF$UID 101 CF$UID 166 CF$UID 135 CF$UID 126 CF$UID 333 CF$UID 334 CF$UID 337 CF$UID 311 $class CF$UID 21 NSIsDisabled NSIsSeparator NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 27 $class CF$UID 21 NSIsDisabled NSIsSeparator NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSTitle CF$UID 27 $class CF$UID 21 NSAction CF$UID 336 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 144 NSTitle CF$UID 335 Find submenuAction: $class CF$UID 21 NSAction CF$UID 339 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 86 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 81 NSTitle CF$UID 338 Spelling submenuAction: $class CF$UID 188 NS.objects CF$UID 116 CF$UID 96 CF$UID 80 Paje $class CF$UID 188 NS.objects CF$UID 285 CF$UID 324 CF$UID 327 CF$UID 309 CF$UID 343 CF$UID 315 CF$UID 345 $class CF$UID 21 NSAction CF$UID 344 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 286 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 260 NSTitle CF$UID 261 submenuAction: $class CF$UID 21 NSAction CF$UID 347 NSKeyEquiv CF$UID 27 NSKeyEquivModMask 1048576 NSMenu CF$UID 286 NSMixedImage CF$UID 19 NSMnemonicLoc 2147483647 NSOnImage CF$UID 15 NSSubmenu CF$UID 42 NSTitle CF$UID 346 Help submenuAction: _NSMainMenu $classes NSArray NSObject $classname NSArray $class CF$UID 349 NS.objects CF$UID 285 CF$UID 343 CF$UID 334 CF$UID 86 CF$UID 31 CF$UID 260 CF$UID 286 CF$UID 31 CF$UID 53 CF$UID 31 CF$UID 53 CF$UID 86 CF$UID 324 CF$UID 53 CF$UID 12 CF$UID 183 CF$UID 42 CF$UID 53 CF$UID 204 CF$UID 2 CF$UID 286 CF$UID 53 CF$UID 31 CF$UID 12 CF$UID 86 CF$UID 31 CF$UID 86 CF$UID 2 CF$UID 247 CF$UID 286 CF$UID 144 CF$UID 345 CF$UID 12 CF$UID 53 CF$UID 81 CF$UID 31 CF$UID 53 CF$UID 31 CF$UID 86 CF$UID 315 CF$UID 53 CF$UID 286 CF$UID 286 CF$UID 219 CF$UID 309 CF$UID 144 CF$UID 53 CF$UID 31 CF$UID 327 CF$UID 337 CF$UID 53 CF$UID 31 CF$UID 176 CF$UID 86 CF$UID 81 CF$UID 2 CF$UID 31 CF$UID 213 CF$UID 144 CF$UID 86 CF$UID 286 CF$UID 286 CF$UID 298 CF$UID 86 CF$UID 219 CF$UID 12 CF$UID 86 CF$UID 86 CF$UID 31 CF$UID 107 CF$UID 53 CF$UID 144 CF$UID 86 CF$UID 181 CF$UID 311 CF$UID 48 CF$UID 181 CF$UID 81 CF$UID 181 CF$UID 86 CF$UID 219 CF$UID 86 CF$UID 107 CF$UID 273 CF$UID 144 $class CF$UID 349 NS.objects CF$UID 345 CF$UID 30 CF$UID 218 CF$UID 213 CF$UID 251 CF$UID 288 CF$UID 96 CF$UID 269 CF$UID 42 CF$UID 305 CF$UID 36 CF$UID 12 CF$UID 81 CF$UID 204 CF$UID 227 CF$UID 52 CF$UID 320 CF$UID 183 CF$UID 31 CF$UID 116 CF$UID 291 CF$UID 185 CF$UID 286 CF$UID 324 CF$UID 206 CF$UID 2 CF$UID 304 CF$UID 219 CF$UID 171 CF$UID 41 CF$UID 295 CF$UID 75 CF$UID 176 CF$UID 337 CF$UID 308 CF$UID 80 CF$UID 224 $class CF$UID 349 NS.objects CF$UID 353 CF$UID 354 CF$UID 355 CF$UID 356 CF$UID 357 CF$UID 358 CF$UID 355 CF$UID 359 CF$UID 360 CF$UID 361 CF$UID 362 CF$UID 363 CF$UID 365 CF$UID 366 CF$UID 367 CF$UID 368 CF$UID 357 CF$UID 369 CF$UID 357 CF$UID 370 CF$UID 371 CF$UID 372 CF$UID 373 CF$UID 357 CF$UID 372 CF$UID 374 CF$UID 375 CF$UID 376 CF$UID 172 CF$UID 357 CF$UID 377 CF$UID 378 CF$UID 379 CF$UID 355 CF$UID 380 CF$UID 367 CF$UID 370 $class CF$UID 4 NS.string 1 $class CF$UID 4 NS.string 6 NSMenuItem NSPopUpButton $class CF$UID 4 NS.string $class CF$UID 4 NS.string 8 121 $class CF$UID 4 NS.string 2 $class CF$UID 4 NS.string 3 $class CF$UID 4 NS.string 5 $class CF$UID 364 $classes NSNull %NSNull NSObject $classname NSNull NSMenu NSBox1 NSMenuItem2 1111 NSBox NSMenuItem1 $class CF$UID 4 NS.string 10 NSView $class CF$UID 4 NS.string MainMenu $class CF$UID 4 NS.string File's Owner $class CF$UID 4 NS.string 7 PopUpList $class CF$UID 4 NS.string 9 $class CF$UID 4 NS.string 1 Panel $class CF$UID 4 NS.string 2 $class CF$UID 349 NS.objects $class CF$UID 349 NS.objects $class CF$UID 349 NS.objects CF$UID 259 CF$UID 41 CF$UID 165 CF$UID 260 CF$UID 95 CF$UID 280 CF$UID 170 CF$UID 139 CF$UID 295 CF$UID 204 CF$UID 120 CF$UID 206 CF$UID 171 CF$UID 111 CF$UID 308 CF$UID 263 CF$UID 309 CF$UID 48 CF$UID 166 CF$UID 61 CF$UID 327 CF$UID 218 CF$UID 320 CF$UID 227 CF$UID 272 CF$UID 149 CF$UID 276 CF$UID 66 CF$UID 333 CF$UID 337 CF$UID 304 CF$UID 67 CF$UID 86 CF$UID 161 CF$UID 343 CF$UID 70 CF$UID 100 CF$UID 58 CF$UID 281 CF$UID 176 CF$UID 42 CF$UID 74 CF$UID 10 CF$UID 125 CF$UID 79 CF$UID 29 CF$UID 246 CF$UID 51 CF$UID 80 CF$UID 30 CF$UID 107 CF$UID 251 CF$UID 75 CF$UID 47 CF$UID 175 CF$UID 91 CF$UID 36 CF$UID 52 CF$UID 268 CF$UID 213 CF$UID 135 CF$UID 185 CF$UID 286 CF$UID 219 CF$UID 96 CF$UID 105 CF$UID 153 CF$UID 121 CF$UID 288 CF$UID 345 CF$UID 12 CF$UID 334 CF$UID 106 CF$UID 110 CF$UID 62 CF$UID 130 CF$UID 35 CF$UID 183 CF$UID 285 CF$UID 324 CF$UID 134 CF$UID 241 CF$UID 24 CF$UID 239 CF$UID 138 CF$UID 250 CF$UID 243 CF$UID 311 CF$UID 142 CF$UID 247 CF$UID 332 CF$UID 291 CF$UID 11 CF$UID 81 CF$UID 90 CF$UID 31 CF$UID 298 CF$UID 305 CF$UID 148 CF$UID 25 CF$UID 101 CF$UID 84 CF$UID 224 CF$UID 115 CF$UID 131 CF$UID 143 CF$UID 273 CF$UID 269 CF$UID 152 CF$UID 2 CF$UID 46 CF$UID 57 CF$UID 85 CF$UID 126 CF$UID 116 CF$UID 53 CF$UID 156 CF$UID 157 CF$UID 181 CF$UID 255 CF$UID 40 CF$UID 315 CF$UID 245 CF$UID 144 CF$UID 71 CF$UID 160 $class CF$UID 349 NS.objects CF$UID 385 CF$UID 386 CF$UID 387 CF$UID 388 CF$UID 389 CF$UID 390 CF$UID 391 CF$UID 392 CF$UID 393 CF$UID 394 CF$UID 395 CF$UID 396 CF$UID 397 CF$UID 398 CF$UID 399 CF$UID 400 CF$UID 401 CF$UID 402 CF$UID 403 CF$UID 404 CF$UID 405 CF$UID 406 CF$UID 407 CF$UID 408 CF$UID 409 CF$UID 410 CF$UID 411 CF$UID 412 CF$UID 413 CF$UID 414 CF$UID 415 CF$UID 416 CF$UID 417 CF$UID 418 CF$UID 419 CF$UID 420 CF$UID 421 CF$UID 422 CF$UID 423 CF$UID 424 CF$UID 425 CF$UID 426 CF$UID 427 CF$UID 428 CF$UID 429 CF$UID 430 CF$UID 431 CF$UID 432 CF$UID 433 CF$UID 434 CF$UID 435 CF$UID 436 CF$UID 437 CF$UID 438 CF$UID 439 CF$UID 440 CF$UID 441 CF$UID 442 CF$UID 443 CF$UID 444 CF$UID 445 CF$UID 446 CF$UID 447 CF$UID 448 CF$UID 449 CF$UID 450 CF$UID 451 CF$UID 452 CF$UID 453 CF$UID 454 CF$UID 455 CF$UID 456 CF$UID 457 CF$UID 458 CF$UID 459 CF$UID 460 CF$UID 461 CF$UID 462 CF$UID 463 CF$UID 464 CF$UID 465 CF$UID 466 CF$UID 467 CF$UID 468 CF$UID 469 CF$UID 470 CF$UID 471 CF$UID 472 CF$UID 473 CF$UID 474 CF$UID 475 CF$UID 476 CF$UID 477 CF$UID 478 CF$UID 479 CF$UID 480 CF$UID 481 CF$UID 482 CF$UID 483 CF$UID 484 CF$UID 485 CF$UID 486 CF$UID 487 CF$UID 488 CF$UID 489 CF$UID 490 CF$UID 491 CF$UID 492 CF$UID 493 CF$UID 494 CF$UID 495 CF$UID 496 CF$UID 497 CF$UID 498 CF$UID 499 CF$UID 500 CF$UID 501 CF$UID 502 CF$UID 503 CF$UID 504 CF$UID 505 CF$UID 506 CF$UID 507 CF$UID 508 CF$UID 509 CF$UID 510 274 111 247 268 225 144 249 239 82 254 231 255 248 199 74 269 264 125 246 146 217 259 92 258 143 208 130 152 214 216 79 134 205 210 267 153 226 58 149 250 106 193 37 232 222 86 266 139 219 78 212 72 73 126 261 197 77 136 236 256 202 253 29 257 201 227 213 215 80 103 24 218 195 228 145 233 87 252 56 83 235 263 39 262 240 272 270 211 241 265 206 112 23 200 224 81 124 75 242 5 203 223 260 230 196 209 131 129 243 1 127 142 207 198 204 57 244 221 251 273 122 19 271 220 150 245 $class CF$UID 188 NS.objects $class CF$UID 349 NS.objects $class CF$UID 349 NS.objects $classes NSIBObjectData NSObject $classname NSIBObjectData $top IB.objectdata CF$UID 1 $version 100000 Paje-1.98/Paje/Paje.nib/info.nib0000664000175000017500000000124311674062007016207 0ustar schnorrschnorr IBDocumentLocation 69 66 356 240 0 0 1280 1002 IBEditorPositions 29 69 311 449 44 0 0 1280 1002 IBFramework Version 446.1 IBOldestOS 2 IBOpenObjects 250 29 IBSystem Version 8P135 IBUsesTextArchiving Paje-1.98/Paje/Paje.nib/classes.nib0000664000175000017500000000120111674062007016703 0ustar schnorrschnorr{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = NSObject; LANGUAGE = ObjC; }, { ACTIONS = {filterChanged = id; filterMenuSelected = id; open = id; print = id; }; CLASS = PajeController; LANGUAGE = ObjC; OUTLETS = { filtersDummyView = NSBox; filtersMenu = NSMenu; filtersPopUp = NSPopUpButton; filtersWindow = NSWindow; toolsMenu = NSMenu; }; SUPERCLASS = NSObject; } ); IBVersion = 1; }Paje-1.98/Paje/traceFilePaje.tiff0000664000175000017500000000555211674062007016513 0ustar schnorrschnorrII* P8$ BaPd6DbQ8V-FcQv=HdR9$M'JeRd]/LfS9m60){?Pg)CQi4zU6OTiu*uRSSna]׫+gZl%lۭW+q3 ~7 a1X<`49,'䲹o#3:,;1hs=^)Z}t%o/ {o ?ƛJ]t.['=?oɪz;lйx\J<Ծ0c?(h6m$"m\M\AdngTN>!4 TX ౎k0sp8M`hq !H"LHt(Id%HrJQE\1 A$NΓP ʮT C2zMlGE0p DLtOS;QU-CSM6@(4}eT\T *$0}Yc`.p5*ZX`@ifgdQ5sMŒDG& 0 h6 L `tPMAbrb#+1c2A QFa0LYn”Xa"顮붌EiYf&h fν.jnl'ś<׻n!ox֕!q> '!\5 çj8'rndBSЫ^f^xeݮF`Xd`^JD*+8]M *PIԤK(|e?ӾG}0Eq"q:~t]c4-B kΔ 0V zeAR\!a#蜄#@9t j< `,* p3c`Icb"q:h ex?hKI!0YK0$[$`( a QlPF"L;_8¤y>]/A\4Ad?r 1$"yC9L?_bMIW  bD1,.etS,eQJfC  ь1JVL18GN qTmqI6L1v ( 3T ZBL@. E[k|05cF1-!O):hs=A1:EPFZZ 1% Tj1Az_ZI5/׺_-XK0ײ!A!2DI;E 杇`(PJy`״ޫ/*$d(}G2Xz chP؛)@v<X)85A>D f sFrSA#kiQ 0,V Eij7NTunFD#[3wmb`|  y?Hy/`8q$:2qd_A9F#dc-> KEк {?Lj~ v9# #Q`l?L'L= $s.*0x?Cm lY2D"+q2 L?Vl.tɋ y% WpW@^cp `?x]B|*LDNxǐYs͂.S30 8`s^|}F?@dndE`\#P& @l ˽a(@ @8G~9̓D7Q;LcC 0Q{,?GnoP sh#(``+~@DX  ϥ`m҃<5iAmBh.$g#~l?WJruԱh aF=<f[h GR4@ `!%r -hhsQ46il? GAMc=1fD7sar pK`I c7"w#` n;`AmJ{l8ƅ`gPltʪOpĺ :m)foD"hpJ thA@ r`šh" \͸|8MK?&nm raL ؇lN" ̠ @N `ra| ~ . g@dX fPN : o8+K ⸭[_ ErtZ ud@vh 0ڛg:Hac1qgLP!`m_IQ1q1U00R  Z b (R ' 'Paje-1.98/Paje/PajeCheckPoint.h0000664000175000017500000000243011674062007016133 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeCheckPoint_h_ #define _PajeCheckPoint_h_ // PajeCheckPoint.h // // Holds the date and file name of a check point. // 19980211 BS creation #include @interface PajeCheckPoint : NSObject { NSDate *time; NSString *fileName; } + (PajeCheckPoint *)checkPointWithTime:(NSDate *)t fileName:(NSString *)f; - (id)initWithTime:(NSDate *)t fileName:(NSString *)f; - (void)dealloc; - (NSDate *)time; - (NSString *)fileName; @end #endif Paje-1.98/Paje/PajeCheckPoint.m0000664000175000017500000000327711674062007016152 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ // PajeCheckPoint.m // 19980211 BS creation #include "PajeCheckPoint.h" @implementation PajeCheckPoint + (PajeCheckPoint *)checkPointWithTime:(NSDate *)t fileName:(NSString *)f { return [[[self alloc] initWithTime:t fileName:f] autorelease]; } - (id)initWithTime:(NSDate *)t fileName:(NSString *)f { self = [super init]; time = [t retain]; fileName = [f retain]; return self; } - (void)dealloc { [time release]; [fileName release]; [super dealloc]; } - (NSDate *)time { return time; } - (NSString *)fileName { return fileName; } - (NSUInteger)hash { return [time hash]; } - (BOOL)isEqual:(id)anObject { if (self == anObject) return YES; if ([anObject isKindOfClass:[PajeCheckPoint class]]) return [time isEqual:[anObject time]]; return [time isEqual:anObject]; } - (NSString *)description { return fileName; } @end Paje-1.98/Paje/PajeTraceController.m0000664000175000017500000002746411674062007017231 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include "PajeTraceController.h" #include "PajeController.h" #include "../General/Protocols.h" #include "../General/Macros.h" #include "../General/PajeFilter.h" #include "../StorageController/Encapsulate.h" @implementation PajeTraceController - (id)init { NSNotificationCenter *notificationCenter; self = [super init]; if (self == nil) { return nil; } Assign(components, [NSMutableDictionary dictionary]); Assign(filters, [NSMutableDictionary dictionary]); Assign(tools, [NSMutableArray array]); chunkDates = [[NSClassFromString(@"PSortedArray") alloc] initWithSelector:@selector(self)]; notificationCenter = [NSNotificationCenter defaultCenter]; // accept notifications posted when we should read more of the trace file [notificationCenter addObserver:self selector:@selector(chunkFault:) name:@"PajeChunkNotInMemoryNotification" object:nil]; return self; } - (void)dealloc { if (components != nil) { [self close]; } [super dealloc]; } - (void)disconnectComponents { NSEnumerator *componentEnumerator; PajeComponent *component; componentEnumerator = [components objectEnumerator]; while ((component = [componentEnumerator nextObject]) != nil) { [component disconnectComponent]; } } - (void)close { [[NSNotificationCenter defaultCenter] removeObserver:self]; Assign(filters, nil); Assign(tools, nil); [self disconnectComponents]; Assign(components, nil); Assign(chunkDates, nil); } - (NSDictionary *)filters { return filters; } - (NSArray *)tools { return tools; } - (id)createComponentWithName:(NSString *)componentName ofClassNamed:(NSString *)className { Class componentClass; id component; componentClass = NSClassFromString(className); if (componentClass == Nil) { NSBundle *bundle; bundle = [[PajeController controller] bundleWithName:className]; componentClass = [bundle principalClass]; //NSLog(@"bundle %@: %@ class:%@", className, bundle, componentClass); } component = [componentClass componentWithController:self]; if (component != nil) { [components setObject:component forKey:componentName]; } return component; } - (void)connectComponent:(id)c1 toComponent:(id)c2 { [c1 setOutputComponent:c2]; [c2 setInputComponent:c1]; } - (id)componentWithName:(NSString *)name { id component; component = [components objectForKey:name]; if (component == nil) { NSString *className; if ([[NSScanner scannerWithString:name] scanCharactersFromSet:[NSCharacterSet alphanumericCharacterSet] intoString:&className]) { component = [self createComponentWithName:name ofClassNamed:className]; } } return component; } - (void)connectComponentNamed:(NSString *)n1 toComponentNamed:(NSString *)n2 { id c1; id c2; c1 = [self componentWithName:n1]; c2 = [self componentWithName:n2]; [self connectComponent:c1 toComponent:c2]; } - (void)addComponentSequence:(NSArray *)componentSequence { int index; int count; count = [componentSequence count]; for (index = 1; index < count; index++) { NSString *componentName1; NSString *componentName2; componentName1 = [componentSequence objectAtIndex:index-1]; componentName2 = [componentSequence objectAtIndex:index]; [self connectComponentNamed:componentName1 toComponentNamed:componentName2]; } } - (void)addComponentSequences:(NSArray *)componentSequences { int index; int count; count = [componentSequences count]; for (index = 0; index < count; index++) { NSArray *componentSequence; componentSequence = [componentSequences objectAtIndex:index]; [self addComponentSequence:componentSequence]; } } + (NSArray *)defaultComponentGraph { NSArray *graph; graph = [@"( ( FileReader, \ PajeEventDecoder, \ PajeSimulator, \ StorageController, \ ReductionFilter, \ FieldFilter, \ ContainerFilter, \ OrderFilter, \ EntityTypeFilter, \ ImbricationFilter, \ AggregatingFilter, \ SpaceTimeViewer \ ), \ ( AggregatingFilter, \ StatViewer ) )" propertyList]; /* graph = [@"( ( PajeFileReader, \ PajeEventDecoder, \ PajeSimul, \ Encapsulate, \ InsetLimit, \ STController \ ), \ ( InsetLimit, \ StatViewer ) )" propertyList]; */ return graph; } - (void)createComponentGraph { [self addComponentSequences:[[self class] defaultComponentGraph]]; reader = [self componentWithName:@"FileReader"]; simulator = [self componentWithName:@"PajeSimulator"]; encapsulator = [self componentWithName:@"StorageController"]; /* reader = [self componentWithName:@"PajeFileReader"]; simulator = [self componentWithName:@"PajeSimul"]; encapsulator = [self componentWithName:@"Encapsulate"]; */ } // // message sent by NSApplication if the user double-clicks a trace file // - (BOOL)openFile:(NSString *)filename { NS_DURING [self createComponentGraph]; [reader setInputFilename:filename]; [self performSelector:@selector(readNextChunk:) withObject:self afterDelay:0.0]; NS_VALUERETURN(YES, BOOL); NS_HANDLER if (NSRunAlertPanel([localException name], @"%@\n%@", @"Continue", @"Abort", nil, [localException reason], [[[localException userInfo] objectEnumerator] allObjects]) != NSAlertDefaultReturn) [[NSApplication sharedApplication] terminate:self]; NS_VALUERETURN(NO, BOOL); NS_ENDHANDLER } - (void)readNextChunk:(id)sender { [self readChunk:[chunkDates count]]; /* if ([reader hasMoreData]) { float delay = (float)rand()/RAND_MAX*100; [self performSelector:_cmd withObject:self afterDelay:delay]; NSLog(@"one more after %f", delay); } */ } - (void)readChunk:(int)chunkNumber { int i; NSDate *start, *end, *e2; double t, t2; NSAutoreleasePool *pool; pool = [NSAutoreleasePool new]; start = [NSDate date]; NS_DURING [self startChunk:chunkNumber]; i = -(int)[simulator eventCount]; if ([reader hasMoreData]) { NSDebugMLLog(@"tim", @"will read chunk starting at %@", [simulator currentTime]); [reader readNextChunk]; } [self endOfChunkLast:![reader hasMoreData]]; NS_HANDLER if (NSRunAlertPanel([localException name], @"%@\n%@", @"Continue", @"Abort", nil, [localException reason], [localException userInfo] //[[[localException userInfo] objectEnumerator] //allObjects] ) != NSAlertDefaultReturn) [[NSApplication sharedApplication] terminate:self]; NS_ENDHANDLER end = [[NSDate date] retain]; t = [end timeIntervalSinceDate:start]; i += [simulator eventCount]; [pool release]; e2 = [NSDate date]; t2 = [e2 timeIntervalSinceDate:end]; [end release]; //NSLog(@"%@: %d events in %f seconds = %f e/s; rel=%f", [reader inputFilename], i, t, i/t, t2); } - (void)startChunk:(int)chunkNumber { [reader startChunk:chunkNumber]; if ([reader hasMoreData] && chunkNumber >= [chunkDates count]) { [chunkDates addObject:[simulator currentTime]]; timeLimitsChanged = YES; } } - (void)endOfChunkLast:(BOOL)last { [reader endOfChunkLast:last]; if (timeLimitsChanged) { [encapsulator timeLimitsChanged]; timeLimitsChanged = NO; } } - (void)missingChunk:(int)chunkNumber { [self readChunk:chunkNumber]; } - (void)chunkFault:(NSNotification *)notification { int chunkNumber; chunkNumber = [[[notification userInfo] objectForKey:@"ChunkNumber"] intValue]; [self readChunk:chunkNumber]; } - (void)registerFilter:(PajeFilter *)filter { NSString *filterName; PajeFilter *f; filterName = [filter filterName]; while (YES) { f = [filters objectForKey:filterName]; if (f == nil) { break; } if (f == filter) { return; } filterName = [filterName stringByAppendingString:@"+"]; } [filters setObject:filter forKey:filterName]; [[PajeController controller] updateFiltersMenu]; } - (void)registerTool:(id)tool { [tools addObject:tool]; [[PajeController controller] updateToolsMenu]; } - (void)windowIsKey { [[PajeController controller] setCurrentTraceController:self]; } - (void)removeComponent:component { [[PajeController controller] closeTraceController:self]; } - (void)saveConfiguration { NSEnumerator *filterEnum; NSString *filterName; NSMutableDictionary *configuration; configuration = [NSMutableDictionary dictionary]; filterEnum = [filters keyEnumerator]; while ((filterName = [filterEnum nextObject]) != nil) { PajeFilter *filter; NSDictionary *filterConfig; filter = [filters objectForKey:filterName]; filterConfig = [filter configuration]; if (filterConfig != nil) { [configuration setObject:filterConfig forKey:filterName]; } } [configuration writeToFile:configurationName atomically:YES]; } - (void)loadConfiguration:(NSString *)name { // FIXME: should load and connect filters; more info needed on config file NSDictionary *configuration; NSEnumerator *filterEnum; NSString *filterName; Assign(configurationName, name); configuration = [NSDictionary dictionaryWithContentsOfFile:configurationName]; filterEnum = [configuration keyEnumerator]; while ((filterName = [filterEnum nextObject]) != nil) { PajeFilter *filter; NSDictionary *filterConfig; filter = [filters objectForKey:filterName]; if (filter == nil) { // FIXME: shouldn't be done this way: reload all filters continue; } filterConfig = [configuration objectForKey:filterName]; if (filterConfig != nil) { [filter setConfiguration:filterConfig]; } } } - (void)setConfigurationName:(NSString *)name { Assign(configurationName, name); [self saveConfiguration]; } @end Paje-1.98/Paje/Paje.tiff0000664000175000017500000000573411674062007014676 0ustar schnorrschnorrII* P8$ BaPd6  QFcQv=B@X3` R- LfS9.!H$I&O!h 5RiTH aTQBQUJuB_XfU,`Ѕ{0F(W;Onxdob`A@PoV] d`1[hik5VjuPڶ[: f#x l5āgо<G>ervnֻni(Ny;tXkHcEA`q7"K .@|/Pb 4Y6NF a{@$#40anIf b[!S !CjLQ#jG4eƧZ !X6P4T{ďZ_$H!B(V=ϓi.(C"5x~=B g#E?#[xha) \8oe[DȢ) NE>ԇ}T'"64mfչ {5+> 0<@F A82aE$-_V,0 y#<76 Ax5 =X0q6$ܞ5Fƀ q^ssYnH XэV@p=3Cxt$:x  E#(m$>aI=[&DD@ץT'5{߬ %#{BHuEʄTDDvpi$ 4CXM:}T?'=;rs\tUUMz=TDDAso`R,~ҧHL {>L㨔o9P 0^P@ ?ۺ"D%`uAk=UAA^Gx?!ǀ?0x n#4r9@O@j%DGTZ0< 4ZMOz 5`0%u)<"tw:_nLІ#b?bWt?(XGv?ĪшdžA PQ,9@r;n><cѢ5!sص~ ` -(6jrВaRe}`kO7@ѳPǸb?CA,SXs ^oF`\GH 7A4@7q ['^Gx'z 8CP[I p OPCXJtPV&e݃PG@Yfp) Vj \-mHZ4'r_rL3{ &;Was4 cZf˭u[8IS$nDz@^+0,A== D eJjG='`v5C= 5]{ MJB{4As`(!4jVF.al }f + i26`فlF5>j}}Sx!`#l9FhG0Uw,Y] \ }H*@h#Q.$s! FoC#x%k07" @wlp?11G=A%fF?@ST!Fde wLoUCʼn"?|{I_G Lc!h6z:Ͳ|_RqC ! zl9+Yt:.]X (Q,8UdTY w^]Jf3A8dƝq⦫ aLj}P "Eq{L5uqj±RQVoH)hwDl=JY1N`lX6ha2QζWy6t>@^ GlXlt.D XPј,B U֩ .ͥ! Pi~^qs3C{@ yr|+CpnoۇNaLVx!dD ^c&HL: nm~nqE6S>~FRꬢhuh||9e^A@ % ϑ{K dE@ b@ İKD] 5#3 "]\\!k%$%`[Rd0rc&g%o&q&y'r}'R'2'4" 00    (R ' 'Paje-1.98/Paje/PajeController.h0000664000175000017500000000354311674062007016235 0ustar schnorrschnorr/* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004 Benhur Stein This file is part of Paj. Paj is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Paj is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Paj; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PajeController_h_ #define _PajeController_h_ #include #include "PajeTraceController.h" @interface PajeController:NSObject { NSMutableArray *traceControllers; PajeTraceController *currentTraceController; NSMutableDictionary *bundles; IBOutlet NSWindow *filtersWindow; IBOutlet NSPopUpButton *filtersPopUp; IBOutlet NSBox *filtersDummyView; IBOutlet NSMenu *filtersMenu; IBOutlet NSMenu *toolsMenu; } + (PajeController *)controller; - (void)filterChanged:(id)sender; - (void)filterMenuSelected:(id)sender; - (NSBundle *)bundleWithName:(NSString *)name; - (void)print:(id)sender; - (void)open:(id)sender; - (void)setCurrentTraceController:(PajeTraceController *)controller; - (void)updateToolsMenu; - (void)updateFiltersMenu; - (void)closeTraceController:(PajeTraceController *)traceController; // NSApplication delegate - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename; @end @interface NSObject (PajeFilterDelegate) - (void)viewWillBeSelected:(NSView *)view; @end #endif Paje-1.98/GNUmakefile.preamble0000664000175000017500000001203111674062007016112 0ustar schnorrschnorr############################################################################### # NeXT Makefile.preamble # Copyright 1996, NeXT Software, Inc. # # This Makefile is used for configuring the standard app makefiles associated # with ProjectBuilder. # # Use this template to set attributes for a project. Each node in a project # tree of sub-projects, tools, etc. should have its own Makefile.preamble and # Makefile.postamble. # ############################################################################### ## Configure the flags passed to $(CC) here. These flags will also be ## inherited by all nested sub-projects and bundles. Put your -I, -D, -U, and ## -L flags in ProjectBuilder's Build Options inspector if at all possible. ## To change the default flags that get passed to ${CC} ## (e.g. change -O to -O2), see Makefile.postamble. # Flags passed to compiler (in addition to -g, -O, etc) OTHER_CFLAGS = # Flags passed to ld (in addition to -ObjC, etc.) OTHER_LDFLAGS = # Flags passed to libtool when building libraries OTHER_LIBTOOL_FLAGS = # For ordering named sections on NEXTSTEP (see ld(1)) SECTORDER_FLAGS = # If you do not want any headers exported before compilations begin, # uncomment the following line. This can be a big time saver. #SKIP_EXPORTING_HEADERS = YES # Stuff related to exporting headers from this project that isn't already # handled by PB. OTHER_PUBLIC_HEADERS = OTHER_PROJECT_HEADERS = OTHER_PRIVATE_HEADERS = # Set these two macros if you want a precomp to be built as part of # installation. The cc -precomp will be run in the public header directory # on the specified public header files with the specified additional flags. PUBLIC_PRECOMPILED_HEADERS = PUBLIC_PRECOMPILED_HEADERS_CFLAGS = # Set this for library projects if you want to publish header files. If your # app or tool project exports headers Don't # include $(DSTROOT); this is added for you automatically. PUBLIC_HEADER_DIR = PRIVATE_HEADER_DIR = # If, in a subproject, you want to append to the parent's PUBLIC_HEADER_DIR# # (say, to add a subdirectory like "/sys"), you can use: PUBLIC_HEADER_DIR_SUFFIX = PRIVATE_HEADER_DIR_SUFFIX = # Set this for dynamic library projects on platforms where code which references # a dynamic library must link against an import library (i.e., Windows NT) # Don't include $(DSTROOT); this is added for you automatically. IMPORT_LIBRARY_DIR = # Additional (non-localized) resources for this project, which can be generated OTHER_RESOURCES = # Uncomment this to produce a static archive-style (.a) library #LIBRARY_STYLE = STATIC # Set this to YES if you don't want a final libtool call for a library/framework. BUILD_OFILES_LIST_ONLY = # Additional relocatables to be linked into this project OTHER_OFILES = # Additional libraries to link against OTHER_LIBS = # To include a version string, project source must exist in a directory named # $(NAME).%d[.%d][.%d] and the following line must be uncommented. # OTHER_GENERATED_OFILES = $(VERS_OFILE) ## Configure how things get built here. Additional dependencies, source files, ## derived files, and build order should be specified here. # Other dependencies of this project OTHER_PRODUCT_DEPENDS = # Built *before* building subprojects/bundles OTHER_INITIAL_TARGETS = # Other source files maintained by .pre/postamble OTHER_SOURCEFILES = # Additional files to be removed by `make clean' OTHER_GARBAGE = # Targets to build before installation OTHER_INSTALL_DEPENDS = # More obscure flags you might want to set for pswrap, yacc, lex, etc. PSWFLAGS = YFLAGS = LFLAGS = ## Delete this line if you want fast and loose cleans that will not remove ## things like precomps and user-defined OTHER_GARBAGE in subprojects. CLEAN_ALL_SUBPROJECTS = YES ## Add more obscure source files here to cause them to be automatically ## processed by the appropriate tool. Note that these files should also be ## added to "Supporting Files" in ProjectBuilder. The desired .o files that ## result from these files should also be added to OTHER_OFILES above so they ## will be linked in. # .msg files that should have msgwrap run on them MSGFILES = # .defs files that should have mig run on them DEFSFILES = # .mig files (no .defs files) that should have mig run on them MIGFILES = # .x files that should have rpcgen run on them RPCFILES = ## Add additional Help directories here (add them to the project as "Other ## Resources" in Project Builder) so that they will be compressed into .store ## files and copied into the app wrapper. If the help directories themselves ## need to also be in the app wrapper, then a cp command will need to be added ## in an after_install target. OTHER_HELP_DIRS = # After you have saved your project using the 4.0 PB, you will automatically # start using the makefiles in /NextDeveloper/Makefiles/project. If you should # need to revert back to the old 3.3 Makefile behavior, override MAKEFILEDIR to # be /NextDeveloper/Makefiles/app. # Don't add more rules here unless you want the first one to be the default # target for make! Put all your targets in Makefile.postamble. Paje-1.98/COPYING0000664000175000017500000004311011674062007013307 0ustar schnorrschnorr GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. Paje-1.98/ChangeLog0000664000175000017500000015357311674062007014045 0ustar schnorrschnorr2011-12-20 (1.98) Lucas M. Schnorr * New release. Second RC before 2.0. 2011-12-18 Lucas M. Schnorr * General/NSColor+Additions.m: bug fix, correctly parsing RGB colors from trace using a NSScanner. The fix considers that a RGB color in the trace file is defined as three values from 0 to 1 that defines the red, green and blue components. This is defined in the Paje trace file format description. * FileReader/PajeFileReader.m: bug fix, was casting NSData to a NSMutableData, causing an exception when running with the Cocoa's NSFileHandle implementation. In Linux, the used method to read from the file returned a NSMutableData, hiding the bug. * fixing several compilation warnings 2011-12-17 Lucas M. Schnorr * many: Fix several compilation warnings detected by gcc, clang and gcc by Apple. 2011-06-01 Lucas M. Schnorr * General/PSortedArray.[mh]: performance optimization in array insertion by using a smarter algorithm; if the object is to be inserted in an empty array or in the last position of the array, just add it to the end; otherwise, do a binary insertion. This change benefits only the reading of un-ordered trace files. 2011-03-15 Lucas M. Schnorr * General/PajeType.[mh]: color dictionaries must not have keys with white spaces in the beginning. If values for states start with white spaces, we trimm them out before registering the colors. 2011-02-21 Lucas M. Schnorr * General/PajeType.[mh], General/HierarchyBrowser.m, General/PajeEntityInspector.m, PajeSimulator/PajeSimul+Events.m PajeSimulator/PajeSimul.m, ReductionFilter/BusyNode.m, ReductionFilter/ReduceEntityType.[mh]: types have an ident (its unique identification, usually the alias) and a description (usually its name). Old attributes (name, uniqueAlias) are removed to reflect this new layout. The -name method is removed, objects should call description on type to get its name. 2011-02-16 Lucas M. Schnorr * General/PajeType.[mh], PajeSimulator/PajeSimul+Events.m PajeSimulator/PajeSimul.m: bugfix, multiple types with same name are correctly managed by the simulator. Types were used as keys in the userEntities dictionary, but their hashes were the name, and not the unique identifier of the type (an optional alias). This commit addresses this issue by creating a new attribute to the PajeType that corresponds to the alias defined in the trace or the name (if alias not present). PajeTypes' hash is based on this new attribute. 2010-12-15 Lucas M. Schnorr * Paje/Paje.gorm/*: bugfix, changing the selected filter on popup updates the current filter of the "Filter" window 2010-11-24 Lucas M. Schnorr * FileReader/PajeFileReader.[hm]: method to obtain the porcentage of the trace file that has already been read. 2010-07-13 Lucas M. Schnorr * FileReader/PajeFileReader.[hm], General/Protocols.h: let the user specify the chunk size used during the reading of a trace file. 2010-07-01 Lucas M. Schnorr * General/PajeFilter.[hm], StorageController/AnchorFilter.m: fixing the return type for the protocol method containerTypeForType (it was PajeEntityType, but it always return PajeContainerType). * Removed some compilation warnings 2010-03-10 Lucas M. Schnorr * PajeSimulator/SimulContainer.[mh]: maxValueForEntityType and minValueForEntityType were returning NSNumber* instead of double (as defined by the PajeFilter protocol). 2010-02-23 Benhur Stein * Documentation/lang-paje/typeevent.tex, PajeSimulator/PajeSimul+Events.m, PajeSimulator/PajeSimul.m: some code cleanup; change the way aliases work: now, if an alias is defined, all references must be to the alias, they cannot be to the name anymore. This allows for different entities to have the same name when in a different container. 2009-12-23 Lucas M. Schnorr * Tracers/JRastro/libRastro/*: using autotools (automake, ...) to create a configuration environment for libRastro 2009-10-09 Lucas M. Schnorr * PajeSimulator/UserLink.[mh]: new method "key" for UserLink class so other objects are allowed to obtain the key used for the link and specified in the tracefile 2009-09-23 Lucas M. Schnorr * PajeSimulator/PajeSimul+Events.m,PajeSimul.m,SimulContainer.[h|m]: changes to make containers keep extra fields when specified in PajeCreateContainer events in the trace file. The SimulContainer class now has an attribute extraFields and two new methods to intercept queries about fields (fieldNames and valueOfFieldnamed:) 2009-05-17 Benhur Stein * PajeSimul/SimulContainer.m: create (and use) auxiliary class to keep container state in chunks * PajeSimulator/PajeSimul: remove userNumberToContainer variable 2009-05-17 Benhur Stein * Tracers/JRastro/libRastro/many: cleanup for 64-bit compiling 2008-05-17 Benhur Stein * SpaceTimeViewer/DrawView+Drawing.m,HirarchyRuler.m: small changes to make it compile and work on windows 2008-04-19 Benhur Stein * AggregatingFilter/AggregatingChunkArray.m General/EntityChunk.h General/EntityChunk.m PajeEventDecoder/PajeEventDecoder.h PajeEventDecoder/PajeEventDecoder.m PajeSimulator/SimulChunk.h PajeSimulator/SimulChunk.m: chunk code cleanup 2008-03-07 Benhur Stein * General/: correct some #includes 2008-02-21 Benhur Stein * SpaceTimeViewer/DrawView.m: register a default size for aggregation 2008-02-21 Benhur Stein * Paje/PajeController.m General/NSDate+Additions.m: move locale setting to a more global place 2008-02-21 Benhur Stein * all GNUmakefile: clean some compiling/linking issues (patches by Yavor Doganov and Vincent Danjean) 2007-11-11 Benhur Stein * correct some coloring issues 2007-11-06 Benhur Stein * better display of fields 2007-11-06 Benhur Stein * FieldFilter/FieldFilter.m, ImbricationFilter/InsetLimit.m: add missing method enumeratorOfCompleteEntitiesTyped:... 2007-11-06 Benhur Stein * remove a log message 2007-11-05 Benhur Stein * SpaceTimeViewer/HierarchyRuler.m: correct typo/missing line break 2007-11-03 Benhur Stein * better drawing code for variables 2007-11-03 Benhur Stein * Clean some compilation warnings; simplify compilation on MacOSX and Linux; change installations instructions in README 2007-07-19 Benhur Stein * */*.nib: add missing files 2007-07-19 Benhur Stein * General/GNUmakefile: define installation domain; General framework needs to be installed separately, before compiling Paje * README: change installation howto 2007-07-19 Benhur Stein * */GNUmakefile: make General into a framework 2007-07-19 Benhur Stein * AggregatingFilter/AggregatingChunk.m: use -latestTime instead of [lastEntity time] * General/PajeEntityInspector.m: change box size calculations so that it looks better on Mac * Paje/PajeTraceController.m: change default order of filters * SpaceTimeViewer/DrawView+Drawing.m: change way of highlighting entities * SpaceTimeViewer/DrawView.h: add aux variables for new highlighting * SpaceTimeViewer/DrawView.m: call new highlighting * SpaceTimeViewer/HierarchyRuler.m: change drawing of ruler to a way that is compatible with MacOSX * SpaceTimeViewer/STLayoutEditor.[hm]: add steppers for editing numbers * SpaceTimeViewer/Shape.m: correct some shapes 2007-07-19 Benhur Stein * General/Association.m, General/CStringCallBacks.m, General/NSArray+Additions.m, General/NSDate+Additions.h, General/PajeFilter.m, General/PajeType.m, General/Protocols.h, General/UniqueString.m, OrderFilter/Order.m, Paje/PajeController.m, SpaceTimeViewer/DrawView+Finding.m: change some small incompatibilities with MacOSX (include files, type declarations) 2007-07-19 Benhur Stein * ReductionFilter/ReduceEntity.m, SpaceTimeViewer/STEntityTypeLayout.m, SpaceTimeViewer/STLayoutEditor.m, StatViewer/StatArray.m: rename subclassResponsibility to _subclassResponsibility (does not exist in Mac) 2007-07-19 Benhur Stein * ContainerFilter/ContainerSelector.nib, OrderFilter/Order.nib, EntityTypeFilter/EntityTypeSelector.nib, Paje/Paje.nib, FieldFilter/FieldFilter.nib, ReductionFilter/ReductionFilter.nib, General/HierarchyBrowser.nib, SpaceTimeViewer/STEntityTypeLayout.nib, General/PajeEntityInspector.nib, SpaceTimeViewer/SpaceTime.nib, General/SourceTextViewer.nib, StatViewer/StatViewer.nib, ImbricationFilter/InsetLimit.nib: new interface files for MacOSX * ContainerFilter/GNUmakefile, EntityTypeFilter/GNUmakefile, FieldFilter/GNUmakefile, General/GNUmakefile, ImbricationFilter/GNUmakefile, OrderFilter/GNUmakefile, Paje/GNUmakefile, ReductionFilter/GNUmakefile, SpaceTimeViewer/GNUmakefile, StatViewer/GNUmakefile: declare nib files as resources 2007-07-19 Benhur Stein * General/Macros.h: declare debug log macros missing in MacOSX 2007-07-18 Benhur Stein * FileReader/PajeFileReader.m: remove file compression support when on MacOSX (GNUstep extension) 2007-07-18 Benhur Stein * EntityTypeFilter/EntityTypeSelector.m: make ColoredSwitchButtonCell appear on MacOSX; add missing enumerator method 2007-07-18 Benhur Stein * AggregatingFilter/AggregateValue.[hm]: avoid inter-bundle dependency (derive from PajeEntity instead of UserValue) 2007-07-18 Benhur Stein * AggregatingFilter/AggregateEvent.h, StatViewer/PieCell.m: correct method name (subValueAtIndex:) 2007-07-18 Benhur Stein * General/PajeEvent.m: fix 'for' limit (bug report from Lucas Schnorr) 2007-03-11 Benhur Stein * Change makefiles to be compatible with gnustep-make v2 2007-02-27 (1.97) Vincent Danjean * New release. First RC before 2.0 ;-) 2007-02-16 Benhur Stein * put version info 2007-02-16 Benhur Stein * change chunk sizes. * version 1.97 (first pre 2.0) 2007-02-16 Benhur Stein * AggregatingFilter/AggregatingFilter.m: correct wrong enumerator use 2007-02-16 Benhur Stein * SpaceTime/DrawView+Drawing.m: better drawing of incomplete links and min/max values 2007-02-16 Benhur Stein * AggregatingFilter/AggregatingChunk.m: remove debug messages 2007-02-16 Benhur Stein * SpaceTime/DrawView.m: test for nil window when drawing; correct trackingRect setting. 2007-02-15 Benhur Stein * General/EntityChunk.h: added missing method declarations * PajeSimulator/PajeSimul.h: ditto * PajeSimulator/SimulChunk.h: ditto * SpaceTimeViewer/STController: abort initialisation if interface cannot be loaded 2007-02-15 Benhur Stein * SpaceTimeViewer/STController: better initialisation code for when more than one interface file is loaded 2007-02-15 Benhur Stein * ReductionFilter/BusyArray: add new enumerator * ReductionFilter/BusyNode: add new enumerator * ReductionFilter/ReduceEntity: add min/maxValue methods * ReductionFilter/ReduceEntityType: call new notification limitsChanged instead of dataChanged 2007-02-15 Benhur Stein * AggregatingFilter/AggregatingChunk: new class * AggregatingFilter/AggregatingChunkArray: move aggregator to AggregatingChunk class; major refactoring, removing most subclasses * AggregatingFilter/AggregatingFilter.m: clear cache when hierarchyChanged * AggregatingFilter/EntityAggregator: implement OneLinkAggregator, auxiliary class for LinkAggregator (aggregates one src-dest pair); retain temporary times; * AggregatingFilter/GNUmakefile: compile new file 2007-02-15 Benhur Stein * PajeSimulator/SimulContainer: remove missing chunk notif; PajeSimulator/UserLink: better comparision of matching links, should work when re-simulating 2007-02-15 Benhur Stein * PajeSimulator/SimulChunk: cope with changes in EntityChunk; remove aggregation subclasses; test for indexOfLastObject... returning NSNotFound 2007-02-14 Benhur Stein * General/ChunkArray: use exception instead of notif for missing chk; add new enumerators * General/EntityChunk.[hm]: use new enumerators; store entities here, not in subclasses. * General/PSortedArray: new enumerators * General/NSArray+Additions.m: allow range out of array 2007-02-14 Benhur Stein * FileReader: add support for reading gzipped files add control of when a chunk can end * PajeEventDecoder: ditto * PajeSimulator: ditto 2007-02-14 Benhur Stein * add timeLimitsChanged notification for better control of when to recalculate layouts 2007-02-14 Benhur Stein * Paje/PajeTraceController.m; PajeSimulator/PajeSimul.m: call missingChunk directly instead of thru a notification 2007-02-14 Benhur Stein * Paje/Paje*Controller.[hm]: cleaned finalisation code 2007-02-14 Benhur Stein * Paje/Paje.gorm: small changes in interface file 2006-11-02 Benhur Stein * SpaceTimeViewer/DrawView.m: corrected trackingRect handling * SpaceTimeViewer/SpaceTime.gorm: corrected autosizing 2006-10-30 Benhur Stein * EntityTypeFilter/EntityTypeSelector.m: indentation; removed unused code * General/ChunkArray.m,EntityChunk.m,PajeEvent.[hm],PajeType.[hm]: removed debug or unused code * SpaceTimeViewer/Shape.m: remove unused code * PajeEventDecoder/PajeEventDecoder.[hm]: removed unused code * PajeSimulator/PajeSimul.[hm],SimulChunk.m,UserLink.m,UserState.m: removed unused code * AggregatingFilter/AggregatingChunkArray.m: removed unused code * StorageController/Encapsulate.m: removed unused code * StorageController/*Aggreg*[hm]: removed files moved to AggregatingFilter/ 2006-10-29 Benhur Stein * */*: rewrote file reading and simulation for better speed. (events are kept pointing into original string from file; events cannot be retained anymore; fields are made into objects only when needed, by the simulator). new AggregatingFilter, with some code from StorageController; completed missing entity types (values); still needing some refactoring. made distinction between -value and -doubleValue for all entity types. 2006-10-29 Benhur Stein * SpaceTimeDiagram/*: major overhaul in drawing code, mainly to substitute PS functions by NSBezierPath. variables now have a vertical scale; all variables use the same scale in a container. 2006-06-24 Benhur Stein * StorageController/AggregateEvent.m: get startTime and endTime of entity to aggregate separetely (for when it is already an aggregation) * StorageController/AggregatingChunkArray.[hm]: new initialisation method that returns a subclass depending on entityType; new AggregatingEventChunkArray subclass; in aggregateEntitiesUntilTime:, try to aggregate entities at end, when there is an interval without entities just before time. * StorageController/Encapsulate.m: use new initialisation method; support for aggregating events as well as states * StorageController/EventAggregator.[hm]: new method aggregateBefore:; take into account possibility of aggregated events have different start and end times (when already aggregated). 2006-06-22 Benhur Stein * StorageController/AggregatingChunkArray.[hm]: refactored to define private subclasses for each entity type * StorageController/Encapsulate.m: use new interface to AggChArr. 2006-06-20 Benhur Stein * PajeSimulator/UserEvent.[hm]: -setEvent: new method * PajeSimulator/UserLink.[hm]: remove direct access to event ivar * StorageController/EventAggregator.[hm]: changed maxDuration to aggregationDuration; added a new initialization method; refactored some methods; changed to agglomerate events added in increasing date; added copyWithZone: method * StorageController/StateAggregator.[hm]: some refactoring; changed aggregation to work with states being added in increasing endTime order; added copyWithZone: method * StorageController/AggregateState.m: get entities in reverse order * StorageController/AggregatingChunkArray.[hm]: new class * StorageController/GNUmakefile: include new class * General/ChunkArray.[hm]: new method for enumeration of only completed entities, necessary for state aggregation; chunks are now ordered by startTime; send notification when accessing an empty chunk (chunks are no longer removed, they are emptied) * StorageController/Encapsulate.[hm]: Most functionality removed -- no longer enumerates entities, enumeration is now done directly by containers. New code for controlling aggregation of states. This will eventually go into a new filter. * EntityChunk.[hm]: chunks can be emptied. A chunk keeps its state. Three new methods to change state (-freeze, -activate, -empty). The class keeps a list in LRU order of all chunks, to be emptied by controller. New enumerators for accessing data in forward or reverse order (forward enums needed by agglomerators). Some methods from SimulChunk migrated to here. * General/EntityDescriptor.h: add missing newline at end of file. * EntityTypeFilter/EntityTypeSelector.m: change method decl * General/FilteredEnumerator.m: -nextObject rewriten * General/MultiEnumerator.[hm]: new initializer * General/PSortedArray.[hm]: new auxiliary methods (lastObject, indexOfFirstObjectAfterValue:, indexOfLastObjectBeforeValue:) * General/PajeContainer.[hm]: declare new enumeration methods * Paje/PajeController.[hm]: new method -bundleWithName: for loading/ keeping track of loaded bundles * Paje/PajeTraceController.[hm]: new way of loading/connecting bundles, following a config structure (still fixed, should be read from a config file); remove code for checkpointing, now all info needed for resimulation is kept by containers, indexed by "chunkNumber"; reading of each chunk is started by calling startChunk:, components must know how to restart a chunk; new support for conversion of time into chunkNumber. * many files: removed encode/decodeCheckPointWithCoder: method * PajeEventDecoder.[hm]: keep info for each chunk; implement -startChunk: and endOfChunk; some cleaning on -init. * PajeFileReader.[hm]: same thing; change class name to FileReader * PajeSimulator/PajeSimul.[hm]: same thing; * PajeSimulator/PajeSimul+Events.m: some optimizations for when simulation is being replayed * General/Protocols.h: add -startChunk: and -endOfChunk methods * PajeSimulator/SimulChunk.[hm]: some methods refactored into super; implement simulation of each entity event here (from SimulContainer); better error for illegal events (in wrong entity type). Each chunk now keeps the entities that finish in its lifetime (those are freed when the chunk is emptied) and entities that exist during its lifetime but finish after it (those are never freed and are used for resimulating). AggregateStateChunk: new subclass to help with aggregation of states (should not be here). still needs some refactoring and better implementation of 'variable' entities. * SimulContainer.[hm]: methods for reverse/forward enumeration of entities; moved most of entity simulation into SimulChunk. * General/PajeFilter.[hm]: declare new methods -startChunk:, -endOfChunk, -enumeratorOfCompleteEntitiesTyped:inContainer:fromTime:toTime: minDuration: 2006-03-13 (1.4.0) Vincent Danjean * New release. All new features seem to work. 2006-03-08 Benhur Stein * General/NSMatrix+Additions.m: remove uses of performSelector: returning BOOL (GCC4 incompatibility) 2006-03-08 Benhur Stein * FieldFilter/FieldFilter.m, EntityTypeFilter/EntityTypeSelector.m, ContainerFilter/ContainerSelector.m: change filtering method for GCC4 2006-03-08 Benhur Stein * General/EntityChunk.[hm]: change signature of filtering method (isEntity:laterThan: becames filterEntity:laterThan:) * PajeSimulator/SimulChunk.m: use it * General/FilteredEnumerator.m: use new signature on performed method 2006-03-08 Benhur Stein * General/HierarchyBrowser.m, General/PajeType.m: remove some more GCC4 warnings 2006-03-08 Benhur Stein * ContainerFilter/ContainerSelector.h, EntityTypeFilter/EntityTypeSelector.h, NSDate+Additions.m, General/PajeContainer.m, General/PajeEvent.m, General/PajeFilter.h, General/PajeFilter.m, General/PajeType.h, PajeSimulator/SimulContainer.m, SpaceTimeViewer/DrawView.h: remove some warnings when compiling on gcc4 2006-02-10 Benhur Stein * GNUmakefile: change installation dir to GNUSTEP_LOCAL_ROOT; installation in GNUSTEP_USER_ROOT is buggy on GNUstep 2006-01-31 Benhur Stein * Tracers: new directory * Tracers/JRastro: new directory, placeholder for JRastro, a tracer for java programs. 2006-01-30 Benhur Stein * PajeSimulator/SimulChunk.m: implement missing methods in EventChunk 2006-01-29 Benhur Stein * General/Association.m: retain decoded object * General/ChunkArray.m: correct removing of chunks * General/EntityChunk: implement NSCopying protocol; do not retain entityType and container * General/PSortedArray.[hm]: implement NSCopying protocol * General/PajeEntity.m: do not encode entityType and container; new method setEntityType: * General/PajeEntityInspector.m: release filter on dealloc * OrderFilter/Order.m: remove compilation warning * OrderFilter/OrderKey.[hm]: remove compilation warning * PajeSimulator/EventNames.h: remove compilation warning * PajeSimulator/PajeSimul+Events.m: commented some warnings on entity redefinition * PajeSimulator/PajeSimul.[hm]: remove encoding of start/endTime * PajeSimulator/SimulContainer.[hm]: cleanup and remove some methods; more changes to operate with chunks; redone writing of checkpoints, they are much smaller now * StatViewer/StatViewer.m: remove one memory leak (there are more) * StorageController/Encapsulate.m: make it work with chunks and chunkarrays 2006-01-25 Benhur Stein * General/Protocols.h: add endOfChunk method to PajeSimulator protocol * Paje/PajeTraceController.m: call endOfChunk on simulator * PajeSimulator/PajeSimul.[hm]: new method endOfChunk * General/EntityChunk.[hm]: enumeratorOfAllEntities new method * General/PSortedArray.[hm]: removeAllObjects new method; implement NSCopying protocol * PajeSimulator/SimulContainer.[hm]: chunkOfType: new method; change simulation to put new entities in chunks instead of sending to encapsulator; endOfChunk new method; * PajeSimulator/SimulChunk: new class * PajeSimulator/GNUmakefile: add SimulChunk (altered from branch by Edmar Pessoa Arajo Neto) * General/TimeList.[hm]: removed class 2006-01-25 Benhur Stein * General/PSortedArray.[hm]: -reverseEnumerator* new methods; removed specific enumerator, use range enumerator in array instead. 2006-01-24 Benhur Stein * PajeSimulator/SimulContainer.[hm], PajeSimul+Events.m: move simulation of newEvent events to container, like other events. 2006-01-24 Benhur Stein * General/ChunkArray.[hm]: new files (from branch by Edmar Pessoa Arajo Neto) * General/PSortedArray.[hm]: -removeObjectsInRange: new method * General/GNUmakefile: include new files 2006-01-24 Benhur Stein * General/EntityChunk.[hm]: new files (from branch by Edmar Pessoa Arajo Neto) 2006-01-24 Benhur Stein * General/NSArray+Additions.[hm]: new files, implement range enumeration of objects in an array (from branch by Edmar Pessoa Arajo Neto) 2006-01-08 Benhur Stein * SpaceTimeViewer/DrawView+Drawing.m SpaceTimeViewer/DrawView+Mouse.m SpaceTimeViewer/DrawView.h SpaceTimeViewer/DrawView.m SpaceTimeViewer/STController.m: cleanup in time selection code 2006-01-07 Benhur Stein * SpaceTimeViewer/DrawView+Drawing.m, SpaceTimeViewer/DrawView.m: code cleanup & use NSBezierPath to draw states 2006-01-06 Benhur Stein * ReductionFilter/BusyArray.h, ReductionFilter/BusyArray.m, ReductionFilter/ReduceEntityType.m: code cleanup & better reverse enumeration 2006-01-06 Benhur Stein * ReductionFilter/ReduceEntityType.m, SpaceTimeViewer/DrawView+Drawing.m, SpaceTimeViewer/DrawView+Finding.m, StatViewer/StatViewer.m, StorageController/Encapsulate.m: reverse object enumeration, so that they are in the right drawing order 2006-01-06 Benhur Stein * ContainerFilter/ContainerSelector.m, EntityTypeFilter/EntityTypeSelector.m, General/Association.m, General/HierarchyBrowser.m, General/PSortedArray.m, General/PajeEntityInspector.m, General/Protocols.h, OrderFilter/Order.m, Paje/PajeController.m, PajeSimulator/PajeSimul.m, SpaceTimeViewer/STLayoutEditor.m, SpaceTimeViewer/Shape.m: remove compiler warnings 2005-12-26 Benhur Stein * StatViewer/StatViewer.[hm]: correctly declare cell; remove .h inclusion 2005-12-26 Benhur Stein * General/CondensedEntitiesArray.[hm]: added totalDuration variable and access methods * StorageController/AggregateState.m: -exclusiveDuration: add method * General/NSString+Additions.[hm]: added string drawing methods from PieCell * PajeSimulator/SimulContainer.m: added a FIXME comment to stopWithEvent * StatViewer/GNUmakefile: removed StatValue class * StatViewer/StatValue.[hm]: removed files * StatViewer/PieCell.[hm]: major change in pie drawing code * StatViewer/StatArray.[hm]: mostly rewritten * StatViewer/StatViewer.gorm: modified interface * StatViewer/StatViewer.[hm]: reflect interface changes 2005-12-26 Benhur Stein * PajeSimulator/PajeSimul.m: -inputEntity: check for unknown event 2005-10-14 Benhur Stein * PajeSimulator/UserState.m: encode/decode new variables 2005-10-02 Benhur Stein * PajeEventDecoder/PajeEventDecoder.m: forgotten on previous commit 2005-10-02 Benhur Stein * SpaceTimeViewer/DrawView+Drawing.m: optimize drawing code for variables 2005-10-02 Benhur Stein * StorageController/Encapsulate.m: remove field names discovery * General/PajeType.[hm]: add knownEventTypes variable and -isKnownEventType: method * PajeSimulator/User{Event,State}.m: use new method to speed up field name discovery 2005-10-02 Benhur Stein * SpaceTimeViewer/DrawView+Drawing.m: new drawing code for events with support for aggregates. 2005-10-01 Benhur Stein * SpaceTimeViewer/DrawView+Drawing.m: new drawing code for states with support for aggregates. 2005-10-01 Benhur Stein * SpaceTimeViewer/DrawView+Drawing.m: new drawing code for variables 2005-10-01 Benhur Stein * StatViewer/StatViewer.m: forgot on previous commit 2005-10-01 Benhur Stein * StatViewer/PieCell.m: autosize pie; draw arc around "other" value. 2005-10-01 Benhur Stein * SpaceTimeViewer/STEntityTypeLayout.[hm], SpaceTimeViewer/STLayoutEditor.{h,m,gorm}: keep user drawName choice; add choice for drawing pseudo-3D lines for variables 2005-10-01 Benhur Stein * General/PajeEntityInspector.m: add inspection of new data and aggregate events and states 2005-09-30 Benhur Stein * General/Filter.[hm]: add new query methods to support aggregates - (BOOL)isAggregateEntity:(id)entity; - (unsigned)subCountForEntity:(id)entity; - (NSColor *)subColorAtIndex:(unsigned)index forEntity:(id)entity; - (NSString *)subNameAtIndex:(unsigned)index forEntity:(id)entity; - (double)subDurationAtIndex:(unsigned)index forEntity:(id)entity; - (unsigned)subCountAtIndex:(unsigned)index forEntity:(id)entity; * General/PajeEntity.[hm]: add similar methods for entity * General/Protocols.h: likewise * StorageController/AnchorFilter.m: likewise * StorageController/Aggregate{Event,State}.[hm], StorageController/{Event,State}Aggregator.[hm]: new classes * StorageController/Encapsulate.m: use aggregator classes when minDuration is big enough * StorageController/GNUmakefile: add new classes 2005-09-30 Benhur Stein * StorageController/Encapsulate.m: forgotten change to minDuration 2005-09-30 Benhur Stein * General/PajeFilter.[hm]: change entity enumeration method to include minDuration hint (enumeratorOfEntitiesTyped:inContainer:fromTime:toTime:minDuration:) * EntityTypeFilter/EntityTypeSelector.[hm], FieldFilter/FieldFilter.[hm], ImbricationFilter/InsetLimit.[hm], ReductionFilter/BusyNode.[hm], StatViewer/StatViewer.m: reflect change * SpaceTimeViewer/DrawView+{Drawing,Finding}.m: reflect change * SpaceTimeViewer/DrawView.h: add smallEntityWidth field to keep the width smaller than which entities should be aggregated; add SMALL_ENTITY_DURATION to convert width to time duration * SpaceTimeViewer/DrawView.m: read "SmallEntityWidth" from defaults 2005-09-30 Benhur Stein * StorageController/AnchorFilter.[hm]: new class (from Encapsulate) * StorageController/Encapsulate.[hm]: split in AnchorFilter subclass * StorageController/GNUmakefile: add AnchorFilter 2005-09-30 Benhur Stein * General/Association.[hm]: new class * General/CondensedEntitiesArray.[hm]: new class * General/GNUmakefile: include new classes * PajeSimulator/UserState.[hm]: add innerStates and condensedEntitiesCount variables; add addInnerState: method; add accessor methods condensedEntities, condensedEntitiesCount, subCount, subColorAtIndex:, subDurationAtIndex: * PajeSimulator/SimulContainer.m: add inner states to states 2005-09-29 Benhur Stein * General/PajeEntity.[hm]: change duration type to double, add exclusiveDuration method * General/PajeEntityInspector.m: reflect type change; show exclusiveDuration if not 0 * General/PajeFilter.[hm]: durationForEntity: is double now * General/Protocols.h: duration is double too * PajeSimulator/UserState.[hm]: add inclusiveDuration variable and exclusiveDuration method 2005-09-29 Benhur Stein * General/PajeType.m: change default entity color to white 2005-09-14 Benhur Stein * General/PajeEntity.h: declare -duration method * General/PajeEntityInspector.h: new fields for executing script * General/PajeEntityInspector.m: further changes in layout of boxes; window size changes dynamically with content; add souurce/destination fields if existent in entity -> can remove from specific inspectors * General/PajeEntityInspector.gorm: add script box * PajeSimulator/User{Event,Link,State}.[hm]: remove Inspector * ReductionFilter/BusyState.m: remove Inspector call * ReductionFilter/GNUmakefile: remove ReduceEntityInspector * ReductionFilter/ReduceEntityInspector.{h,m,gorm}: removed 2005-08-28 Benhur Stein * General/PajeEntityInspector.{m,h,gorm}: size text fields according to contents size * General/DataScanner.m: allow \n in strings 2005-01-23 (1.3.3) Vincent Danjean * New official release - statviewer available - trace files read by chuncks 2005-07-03 Benhur Stein * PajeEventDecoder/PajeEventDecoder.m: use Assign macro 2005-06-29 Benhur Stein * FileReader/PajeFileReader.h: changed file read chunk size to 1MB * PajeSimulator/PajeSimul.[hm]: use NSMapTable instead of NSDictionary as simulation dispatch table * SpaceTimeViewer/STEntityTypeLayout.[hm]: set height for variables in container, instead of variable types * SpaceTimeViewer/STEntityTypeLayoutController.[hm,gorm]: refactoring, separation of layout editor classes * SpaceTimeViewer/STLayoutEditor.[hm]: new files * SpaceTimeViewer/GNUmakefile: add new files * SpaceTimeViewer/HierarchyRuler.m: remove names of variables from ruler 2005-06-26 Benhur Stein * SpaceTimeViewer/STController.m: workaround for GNUstep bug #13382 2005-06-25 Benhur Stein * ContainerFilter/ContainerSelector.m, EntityTypeFilter/EntityTypeSelector.m, FieldFilter/FieldFilter.m, ImbricationFilter/InsetLimit.m, ReductionFilter/BusyNode.m (-dealloc): remove items of NSPopUp * General/PajeEntity.[hm]: entityType and container are not retained; document it * General/PajeType.[hm]: same, for source and destContainerType * OrderFilter/Order.m (-dealloc): release hierarchyBrowser * PajeEventDecoder/PajeEventDecoder.m: make sure values in eventBeingDefined are properly released * PajeSimulator/PajeSimul.[hm]: remove unused variable "name"; release NSInvocations * PajeSimulator/UserLink.[hm]: source and destContainer are not retained * SpaceTimeViewer/DrawView+Drawing.m, SpaceTimeViewer/DrawView+Finding.m, SpaceTimeViewer/HierarchyRuler.m: remove unused variables * SpaceTimeViewer/DrawView.m [-removeFromSuperview]: remove tracking rectangle * SpaceTimeViewer/STController.m (dealloc): release layoutController * SpaceTimeViewer/STEntityTypeLayout.m: changed default height for variables to 60 points (was 6) * StatViewer/StatViewer.[hm]: removed "filter"variable (use self); remove items from popups 2005-06-11 Benhur Stein * StatViewer/StatViewer.m: do not retain filter; implement -dealloc * SpaceTimeViewer/STController.m: implement -windowWillClose, to inform controller that it should remove this component. * SpaceTimeViewer/DrawView.m: do not retain filter * PajeSimulator/PajeSimul.[hm]: remove "simulators" class variable * Paje/PajeTraceController.[hm]: new method -removeComponent: * Paje/PajeController.[hm]: new method -closeTraceController: * General/PajeFilter.m: retain outputComponent * General/HierarchyBrowser.m: do not retain filter 2005-06-11 Benhur Stein * Paje/PajeTraceController.[hm]: put checkpoints in a better place; remove them when dealloc'ed 2005-06-06 Benhur Stein * Documentation/lang-paje/typeevent.tex: document new "RelationKey" field that entities can have to identify related entities. * PajeSimulator/PajeSimul.h: add relatedEntities dictionary * PajeSimulator/PajeSimul.m: -outputEntity:, -addRelatedEntity:toKey:, -relatedEntitiesToEntity: new methods * StorageController/Encapsulate.m: removed -relatedEntitiesToEntity: method (taken over by simulator) 2005-06-06 Benhur Stein * PajeSimulator/PajeSimul.m (-rootInstance): implemented to return rootContainer * SpaceTimeViewer/DrawView+Mouse.m: remove unused notification * SpaceTimeViewer/DrawView.[hm]: removed -rootInstance method; changed calls to ask filter * SpaceTimeViewer/STController.m: remove obsolete fileSelected notification * StorageController/Encapsulate.[hm]: removed local startTime, endTime and rootInstance variables; changed uses to ask previous component (simulator); also removed unused entityTypeToClass variable. removed obsolete PajeFilenameNotification. 2005-05-22 Benhur Stein * ContainerFilter/ContainerSelector.m: code reformating * EntityTypeFilter/EntityTypeSelector.m: code reformating, remove call to colorChanged.. when droping color, it will come automatically from previous filters. * General/PajeEntity.m: moved inspect method to Encapsulator's -inspectEntity: * General/PajeEntityInspector.h: declared outlets and new/changed methods * General/PajeEntityInspector.m: changed window layout a bit, corrected some memory leaks, changed way of starting inspection -- now the filter is known and integration is better (mainly for changing colors) * General/PajeEntityInspector.gorm: layout changes * Paje/PajeController.m: enabled alpha channel in color panel, now entities can be semi-transparent. * ReductionFilter/ReduceEntityInspector.{h,m,gorm}: layout changes * SpaceTimeViewer/DrawView.m: change selection background color when a color is dropped inside the time selection. * StatViewer/StatViewer.m: redraw when colors change * StorageController/Encapsulate.m: send colorChanged... notification to other filters when colors are changed, get code for inspection from PajeEntity. * General/Protocols.h, General/PajeFilter.[hm]: removed "PajeInspecting" protocol 2005-05-21 Benhur Stein * PajeSimulator/PajeSimul+Events.m, StatViewer/StatViewer.m: remove unneeded hack 2005-05-21 Benhur Stein * General/SourceCodeReference.m: unify references 2005-05-21 Benhur Stein * StorageController/Encapsulate.m, General/PajeFilter.[hm]: new -entitySelectionChanged notification and -isSelectedEntity: query * SpaceTimeViewer/DrawView+Drawing.m: use new query to highlight selected entities * FieldFilter/FieldFilter.gorm, FieldFilter/FieldFilterDescriptor.[hm], FieldFilter/FieldFilter.[hm]: Add action to perform when applying filter (filter in, filter out or highlight) * General/NSString+Additions.m: fix a bug in line numbering * General/SourceTextViewer.gorm, General/SourceTextController.[mh]: correct buggy gorm file, show selected line number. 2005-05-21 Benhur Stein * ReductionFilter/BusyArray.[hm], ReductionFilter/BusyDate.m, ReductionFilter/ReduceEntity.m: fix memory leak 2005-05-07 Benhur Stein * PajeSimulator/SimulContainer.m [-start/endUserLink...]: code cleanup 2005-05-07 Benhur Stein * PajeSimulator/SimulContainer.m [-enumeratorOfEntitiesTyped:fromTime:toTime:]: new method * StorageController/Encapsulate.m [-enumeratorOfEntitiesTyped:inContainer:fromTime:toTime:]: call new method in container 2005-04-30 Benhur Stein * General/NSColor+Additions.m (-contrastingWhiteOrBlackColor): use less contrasting colors * Paje/PajeController.m (-loadAllBundles): load StatViewer bundle * Paje/PajeTraceController.m (-createComponentGraph): inatantiate and connect statViewer to component graph; some small changes to remove compiler warnings * PajeEventDecoder/PajeEventDecoder.m: commented some unused code * StatViewer/PieCell.h StatViewer/PieCell.m StatViewer/StatArray.h StatViewer/StatArray.m StatViewer/StatValue.h StatViewer/StatValue.m StatViewer/StatViewer.gorm StatViewer/StatViewer.h StatViewer/StatViewer.m: new files 2005-04-30 Benhur Stein * GNUmakefile, */GNUmakefile: removed definition of GNUSTEP_MAKEFILES 2005-04-23 Benhur Stein * General/NSUserDefaults+Colors.[hm], General/NSUserDefaults+Additions.[hm] General/PajeEvent.m, General/PajeType.m PajeEventDecoder/PajeEventDecoder.m, ReductionFilter/ReduceEntityType.m SpaceTimeViewer/DrawView.m, SpaceTimeViewer/STEntityTypeLayout.m: changed NSUserDefaults+Colors to NSUserDefaults+Additions. * General/NSColor+Additions.[hm]: new files 2005-04-22 Benhur Stein * General/DataScanner.m: set numeric locale to C instead of en_US (suggestion from castet.matthieu@free.fr) 2005-04-18 Benhur Stein * many: removed compiler warnings 2005-04-18 Benhur Stein * General/PajeEntityInspector.m, General/PajeType.h, General/PajeType.m, General/SourceTextController.h, General/SourceTextController.m, General/UniqueString.m: removed some compiler warnings 2005-04-16 Benhur Stein * FileReader/PajeFileReader.h, FileReader/PajeFileReader.m, General/PSortedArray.m, General/PajeEntity.m, Paje/PajeCheckPoint.m, Paje/PajeTraceController.m, PajeEventDecoder/PajeEventDecoder.m, PajeSimulator/PajeSimul.m, PajeSimulator/SimulContainer.m, PajeSimulator/SimulContainer.m, PajeSimulator/UserEvent.m, PajeSimulator/UserState.m, SpaceTimeViewer/DrawView.m, SpaceTimeViewer/HierarchyRuler.m, StorageController/Encapsulate.m: First implementation of trace reading by chunks. 2005-04-16 Benhur Stein * SpaceTimeViewer/DrawView+Drawing.m: corrected bug in which drawing names on events made them bigger each time * SpaceTimeViewer/HierarchyRuler.m: corrected sizes of boxes (again) 2005-04-16 Benhur Stein * ContainerFilter/ContainerSelector.m, EntityTypeFilter/EntityTypeSelector.m, General/HierarchyBrowser.m, General/MultiEnumerator.m, General/PajeType.m, General/TimeList.m, Paje/PajeController.m, ReductionFilter/BusyNode.m, PajeSimulator/PajeSimul+Events.m: small code reorganization; changed NSLog's into NSDebugLog's or NSWarnLog's 2005-01-23 (1.3.2) Vincent Danjean * New official release 2005-03-26 Benhur Stein * SpaceTimeViewer/STEntityTypeLayoutController.[hm], STEntityTypeLayout.gorm: changed names of instance variables to better reflect their use. Corrected a bug that was preventing the edition of layout data in some cases (an invisible view over the others). Should create separate editor classes for each drawing type for this to be easily changed. 2005-03-16 Benhur Stein * Traces: added directory * Traces/JavaTest.trace: small trace example added 2005-03-06 Benhur Stein * EntityTypeFilter/EntityTypeSelector.m, ImbricationFilter/InsetLimit.m, OrderFilter/Order.m, ReductionFilter/BusyNode.m, Paje/PajeController.[hm], Paje/PajeTraceController.m: implemented support for saving/loading filter configuration. Configuration is saved/loaded for file /tmp/pajeconfig. Missing FieldFilter, the possibility of naming configurations, a configuration editor (loading and unloading of filters, more than one filter of the same type, etc. * General/PajeFilter.[hm]: added helper methods -entityTypeWithName: and -containerWithName:type: * General/HierarchyBrowser.m: some better support for when updating last column (still does not work in all cases) * ImbricationFilter/InsetLimit.[hm]: added a cache for increased performance (not measured) 2005-02-21 Benhur Stein * General/PajeFilter.h: add some documentation. 2005-02-17 Benhur Stein * General/DataScanner.m: hack to read numbers from trace file in a locale independent way (solves bug #303193). 2005-02-17 Benhur Stein * Allow files with any extension to be selected in the open file panel. 2005-02-17 Benhur Stein * Make sure Shapes&Sizes tool is informed when trace hierarchy changes (adds an instance variable to STController, must do a "make clean" before doing "make"). * fixes bug #301194 2005-02-17 Benhur Stein * General/NSUserDefaults+Colors.[hm]: add -doubleForKey: and -setDouble:forKey: methods (should change file name as it doesn't only deal with colors. * SpaceTimeViewer/DrawView.m: save and restore time scale in defaults database 2005-01-23 (1.3.1) Vincent Danjean * Add Makfiles to compile the documentation * Remove undefined references in lang-paje * New official release - bump to 1.3 as there are few features (filters) 2005-01-23 Benhur Stein * SpaceTimeViewer/HierarchyRuler.m: change rect size calculations to be on pair with recent GNUstep bugfixes 2005-01-23 Benhur Stein * General/UniqueString.m: comment out some debug messages 2005-01-20 Benhur Stein * SpaceTimeViewer/DrawView.[hm]: workaround a probable bug in GNUstep ([NSScrollView tile] is changing the frame size) 2005-01-20 Benhur Stein * Documentation/lang-paje/{typeevent.tex,lang-paje.tex}: comment the inclusion of some files, to make the documentation compile. 2005-01-09 Benhur Stein * SpaceTimeViewer/STEntityTypeLayout.[hm]: declare and implement accessors for minValue and maxValue (for storing limits of graph) * SpaceTimeViewer/STEntityTypeLayout.gorm: added a new Form for max & min values of variables; * SpaceTimeViewer/STEntityTypeLayoutController.[mh]: make use of new variables and Form (they are not saved in defaults); * SpaceTimeViewer/DrawView+Drawing.m: use min and maxValue from descriptor, if valid. 2005-01-05 Benhur Stein * GNUmakefile, Paje/PajeController.m, Paje/PajeTraceController.m: compile and load FieldFilter 2005-01-05 Benhur Stein * FieldFilter, FieldFilter/FieldFilterDescriptor.h, FieldFilter/FieldFilter.h, FieldFilter/FieldFilterDescriptor.m, FieldFilter/FieldFilter.m, FieldFilter/GNUmakefile, FieldFilter/FieldFilter.gorm: new files, first implementation of filter that selects entities based on values of some of its fields. 2005-01-05 Benhur Stein * General/PajeEntity.m: added -duration method (returns elapsed time of entity); added "StartTime", "EndTime" and "Duration" named fields * General/PajeType.h: added new instance variable "fieldNames" to hold all known names of fields of entities of a type. * General/PajeType.m: initialize new variable; implemented new methods -addFieldNames: and -fieldNames to populate and get names of fields. * ReductionFilter/ReduceEntityType.m: also initialize new variable (this class does not use initialization code from superclass) * StorageController/Encapsulate.m: implement -fieldNamesForEntityType: so that a filter can have access to names of fields; add a temporary solution to garantee that an entity type has access to all names (make it see all entities - ugly) * ReductionFilter/ReduceEntity.m: likewise, even uglier! 2005-01-05 Benhur Stein * SpaceTimeViewer/DrawView+Drawing.m: changed way of drawing values (now there can be times without values, and they will not be drawn) (necessary for new field value filter (to be commited)). 2005-01-05 Benhur Stein * SpaceTimeViewer/STEntityTypeLayoutController.m: made highlighting of selected buttons in "Shapes&Sizes" work again 2005-01-05 Benhur Stein * General/PajeEntityInspector.m: removed debug message 2005-01-05 Benhur Stein * General/ColoredSwitchButtonCell.m: added -compare: method (some recent change in GNUstep made ordering of these cells wrong) 2005-01-05 Benhur Stein * Paje/Paje_main.m, Paje/PajeInfo.plist: Changed Copyright notice 2005-01-04 (1.2.2) Vincent Danjean * Version NEED to be set in changelog so that release can be easily generated 2005-01-04 (1.2.1) Vincent Danjean * Bump to version 1.2.1 to make a release on objectweb 2004-12-21 Benhur Stein * Paje/PajeController.m: fixed typo in filter name corrects bug #301134 (reported by Gregory) 2004-12-14 (1.2.0) Vincent Danjean * Bump to version 1.2 to make the first release on objectweb 2004-10-18 Benhur Stein * **/*.{h,m,tex}: add copyright notice 2004-10-17 Benhur Stein * SpaceTime.bproj/DrawView+Drawing.m,ST*.{h,m,gorm}: add support for writing names on events and states 2004-10-12 Benhur Stein * PajeSimul/PajeSimul+Events.m SpaceTime.bproj/DrawView+Drawing.m SpaceTime.bproj/STController.m SpaceTime.bproj/STEntityTypeLayout.m Encapsulate.bproj/Encapsulate.m General.bproj/PajeType.h General.bproj/PajeType.m General.bproj/PajeFilter.h General.bproj/PajeFilter.m, PajeEventDecoder/PajeEventDecoder.m Documentation/lang-paje/typeevent.tex: add support for 'color' type in event fields; 'Color' field in 'PajeDefineValue'; 'Shape' and 'Height' fields in 'PajeDefineType'; 'Width' field in 'PajeDefineEventType' 2004-10-07 Benhur Stein * SpaceTime.bproj: correct limitation of maximum visible size 2004-10-07 Benhur Stein * General.bproj/NSDate+Additions.h: correct typo in previous commit 2004-10-07 Benhur Stein * SpaceTime.bproj/STEntityTypeLayoutController.m: change order of types in popup, remove unused field for links in gui, remove unused code * STEntityTypeLayout.gorm: highlights matrix was not scrolling and highlighting of events 2004-10-07 Benhur Stein * SpaceTime.bproj/{Shape.m,STEntityTypeLayout.m}: correct drawing and highlighting of events 2004-10-07 Benhur Stein * SpaceTime.bproj/DrawView+Positioning.m (rectForEntity:), SpaceTime.bproj/DrawView.[hm]: sanitize relation between STController and DrawView; create and use [DrawView timeToX:] method. 2004-10-07 Benhur Stein * SpaceTime.bproj/DrawView+Finding.m (rectForEntity:), SpaceTime.bproj/DrawView+Drawing.m (drawValuesWithDescriptor:inContainer:fromEnumerator:drawFunction:): change drawing of values, to include 2-pixel top and bottom margins 2004-10-07 Benhur Stein * General.bproj/NSDate+Additions.[hm]: change NSDate description to be only the secondsSinceReferenceDate 2004-09-30 Benhur Stein * SpaceTime.bproj/STEntityDescriptor.[hm], SpaceTime.bproj/EntityTypeInspector.{h,m,gorm}: remove unused classes obsoleted by previous changes (layout) 2004-09-30 Benhur Stein * SpaceTime.bproj/DrawView+Drawing.m SpaceTime.bproj/DrawView+Finding.m SpaceTime.bproj/DrawView+Mouse.m SpaceTime.bproj/DrawView+Positioning.m SpaceTime.bproj/DrawView.h SpaceTime.bproj/DrawView.m SpaceTime.bproj/GNUmakefile SpaceTime.bproj/HierarchyRuler.h SpaceTime.bproj/HierarchyRuler.m SpaceTime.bproj/STController.h SpaceTime.bproj/STController.m SpaceTime.bproj/STEntityDescriptor.h SpaceTime.bproj/STEntityDescriptor.m SpaceTime.bproj/SpaceTime.gorm/data.classes SpaceTime.bproj/SpaceTime.gorm/distant.tiff SpaceTime.bproj/SpaceTime.gorm/near.tiff SpaceTime.bproj/SpaceTime.gorm/objects.gorm SpaceTime.bproj/SpaceTime.gorm/toselection.tiff: make use of new layout classes 2004-09-30 Benhur Stein * SpaceTime.bproj/{STEntityTypeLayout.{h,m,gorm}, STEntityTypeLayoutController.[hm], Shape.[hm]}: new classes and GUI for layout 2004-09-30 Benhur Stein * PajeSimul/PajeSimul+Events.m: containerOfNumber:type:inEvent: check for wrong type 2004-09-30 Benhur Stein * TODO: refresh list of things to do 2004-08-19 Benhur Stein * */*.gorm: resaved in old format, compatible with gui 0.9.3 2004-07-26 Benhur Stein * many: remove PajeContainerType from PajeFilter.h and change all places to reflect this 2004-07-26 Benhur Stein * General.bproj/PajeFilter.[hm]: remove notifications 2004-07-26 Benhur Stein * paje: restarting CVS, near version 1.2 2002-05-10 Benhur Stein * paje: initial version. Paje-1.98/README.git0000664000175000017500000001703711674062007013727 0ustar schnorrschnorrUsing Git for Paje ================== Paje developement tree is now managed with Git. So, you need to use Git to : - follow the last development of Paje - propose some new commit to Paje developpers Installing Git and finding documentation ---------------------------------------- Refer to your OS documentation for installing Git. On Debian/Unbuntu, you can install the following packages : apt-get install git-core git-gui gitk git-email Git website is http://git.or.cz/ . A **lot** of documentation is available on this website. You can read for example the link:http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html[Tutorial Introduction to Git] to begin with Git. Setting up GIT on your computer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Be sure that git will use your right name and email for commits: git config --global user.name "Firstname Lastname" git config --global user.email Firstname.Lastname@imag.fr Note: the "--global" switch ensure that these setups will be used for all git projects. You can change these settings per project without this flags (see "man gitconfig" for more information) Getting a working copy of Paje developement tree ------------------------------------------------ Read-only access: git clone git://paje.git.sourceforge.net/gitroot/paje/paje Read-write access (for people with account on the forge and in the Paje project): git clone ssh://USER@paje.git.sourceforge.net/gitroot/paje/paje (replace USER by your login name on the forge) Note: due to the distributed nature of Git, it is probably better to checkout with a read-only access and later push in the official repo with another "remote" setup (see later). Creating a commit ~~~~~~~~~~~~~~~~~ A commit is a self-contained modification of the sources associated to meta-data such as author, date, message, etc. Several rules must be repected as much as possible : - all commits in public branches should lead to a state where "make" works (required in order git-bisect to be useful) - all commits in public branches must never be rebased (use "git revert" if you need to revert a public commit) - each commit should contain only one logical modification - this modification must be described in the log message. The first line of the log is a summary, the second line should be empty, the next lines can describe more precisely the modifications. Your first line of commit message can begin with a [flag] telling which global part of Paje you are changing. It can be for example [doc], [network], [build system], [bugfix], etc. [bugfix] commits will probably be considered to be also applied in the last stable branch. If you need to modify your commits (changeset) before publishing them (better log message, splitting/merging of commits, ...), you can use : - "git gui" to modify (ammend) the last commit (check the good box) - "gitk" to cherry pick interresting commits (right-clic on interesting commits) and (re)create a linear branch - "git rebase -i" to merge/split/reorder commits in a linear branch - your email or your feet to go ask for help ;-) Writing in the official repo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ People with an accound on the forge (and in the Paje group) are allowed to publish their changes in the main repo. However, they can only create/modify/remove heads under refs/heads/$forge_login/* Global branches $global such as 'master', 'stable-*', ... are only writable if they are a subset of a refs/heads/$forge_login/official/$global . Restrictions to push to these global branches can be added if required. To publish some commit, the easiest way is to create a "remote" config such as: git remote add sourceforge ssh://$forge_login@paje.git.sourceforge.net/gitroot/paje/paje And then, you should add to the configuration (in the [remote "sourceforge"] section of .git/config) some lines such as (replace $forge_login by your login on the forge): push = refs/heads/master:refs/heads/$forge_login/wip/master push = refs/heads/public/*:refs/heads/$forge_login/* push = +refs/heads/wip/*:refs/heads/$forge_login/wip/* The idea here is to establish a correspondance between local heads and remote heads. As said before, remote heads **must** match refs/heads/$forge_login/* in order the push to succeed. Note: you can also add the previous config directly into the [remote "origin"] section if your clone has been done with the ssh protocol. You can create one-to-one correspondances (lines 1) or global correspondances (lines 2 and 3) as you wish. If you add a '+' in front of the line (line 3), then non fast-forward updates will be allowed. See 'man git-push' for more information. You can them push your commits with: git push sourceforge To summary, with this setup: - local branch named master is pushed to '$forge_login/wip/master' - local branches named 'public/*' are pushed to '$forge_login/*' - local branches named 'wip/*' are pushed to '$forge_login/wip/*' - other local branches are not pushed Putting something in the 'master', 'stable-*', ... branches ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Just create a branch that merge the current 'master', 'stable-*', ... branch (called $global in this text) you want to update, push it first as $forge_login/official/$global and then push it as $global. With the previous example setup, if you want to update 'master' to include your current commit, you have to type something like: git merge sourceforge/master git push sourceforge HEAD:$forge_login/official/master git push sourceforge HEAD:master You can also add some config in .git/config such as push = refs/heads/user-master:refs/heads/$forge_login/official/master push = refs/heads/global-master:refs/heads/master You can also ask one official maintainer of this branch to pull from your one (ie publish your branch and give its name to the official maintainers). Note: take care to ask to push only well commented, well formed changeset. Use 'git-rebase' to cleanup your branch if needed. Do not hesitate to ask for help if you do not know how to do it. Publishing branches ~~~~~~~~~~~~~~~~~~~ There is mainly two reasons for which you might want to publish some of your commits: - to merge your work into the main (master) developement branch. You must then ensure that the branch you want to publish is ready to be merged (well commented, well formed, bug free changeset) and then ask for a merge (see previous paragraph). If 'make' does not produce a working binary, you should reconsider seriously your request. Even if your work is not merged immediately, you should never rebase this branch (ie only fast-forward commits should be done). Paje developers should use public/* heads to track these kind of works; - to allow you/other people to test some experimental features. Rebase can occurs here, so other developers must never merge from theses branches unless they really know what they do. Paje developers should use wip/* heads to track these kind of works; To summary: commits in public/* heads (and 'master', 'stable-*' heads) must never be rebased as they can be used by other people. Take care before pushing such heads! Essential commands ------------------ You can probably do most of your work with the following commands: - git clone: get a new repo - git gui: commit some changes (graphical program) You can very easily modify your last commit with this program - gitk: look at commits and manage branches (graphical program) - git rebase: rewrite/reorganize your (not yet public) commits - git fetch: get upstream changes - git merge: merge commits present on other branches - git pull: do a fetch and a merge - git push: publish your changes