From 5895c25b92b90d5d3a30c02b6153e6363303f358 Mon Sep 17 00:00:00 2001 From: himal1 Date: Fri, 16 Jan 2026 09:31:09 -0500 Subject: [PATCH 01/10] Additing test --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index f3499b35..a6819c24 100644 --- a/Readme.md +++ b/Readme.md @@ -1,4 +1,4 @@ -Orca +Orca Test ==== I. Prerequisites From b0542c7485e60713d4b63dfa02d0ce6d7fd4a81a Mon Sep 17 00:00:00 2001 From: himal1 Date: Fri, 16 Jan 2026 09:32:00 -0500 Subject: [PATCH 02/10] Removing test --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index a6819c24..f3499b35 100644 --- a/Readme.md +++ b/Readme.md @@ -1,4 +1,4 @@ -Orca Test +Orca ==== I. Prerequisites From d3865ee86ba41c9ecbded8f9cbd0e21baa43fed2 Mon Sep 17 00:00:00 2001 From: himal1 Date: Fri, 16 Jan 2026 09:50:45 -0500 Subject: [PATCH 03/10] Changes for the better Memory management --- .../LEGEND/L200/ORL200DetectorView.m | 13 +-- .../FlashCamADC/ORFlashCamADCDecoders.m | 18 ++-- .../FlashCamIO/ORFlashCamListenerController.m | 4 +- .../FlashCamIO/ORFlashCamListenerDecoders.m | 82 +++++++++++++++---- 4 files changed, 86 insertions(+), 31 deletions(-) diff --git a/Source/Experiments/LEGEND/L200/ORL200DetectorView.m b/Source/Experiments/LEGEND/L200/ORL200DetectorView.m index dcbb642d..d41ba7e8 100644 --- a/Source/Experiments/LEGEND/L200/ORL200DetectorView.m +++ b/Source/Experiments/LEGEND/L200/ORL200DetectorView.m @@ -47,7 +47,7 @@ #define kL200CC4InnerR (kL200CC4Offset*2-5) #define kL200CC4OuterR (kL200CC4Offset*2 + 2*kL200CC4Size*7+10) #define kL200CC4DeltaAngle (360/kNumCC4Positions) -static NSInteger NumberofTimesCall = 0; +//static NSInteger NumberofTimesCall = 0; @interface ORL200DetectorView (private) - (void) makeAllSegments; @@ -212,11 +212,11 @@ - (void) drawRect:(NSRect)rect - (NSColor*) getColorForSet:(int)setIndex value:(float)aValue { - if (NumberofTimesCall==1000){ //only calling to make source once in 1000 times - [self makeSource]; - NumberofTimesCall=0; - } - NumberofTimesCall++; + //if (NumberofTimesCall==10000){ //only calling to make source once in 1000 times + // [self makeSource]; + // NumberofTimesCall=0; + //} + //NumberofTimesCall++; if(setIndex == kL200DetType) return [detColorScale getColorForValue:aValue]; else if(setIndex == kL200SiPMType) return [sipmColorScale getColorForValue:aValue]; else if(setIndex == kL200PMTType) return [pmtColorScale getColorForValue:aValue]; @@ -1024,6 +1024,7 @@ -(void) makeSource } -(void)drawSourceLabel{ NSFont* font = [NSFont fontWithName:@"Geneva" size:7]; + [sourceLabelAttr release]; sourceLabelAttr = [[NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, [NSColor systemRedColor], NSForegroundColorAttributeName, nil] retain]; for(int i=0; i<4; i++){ diff --git a/Source/Objects/Hardware/Internet/FlashCam/FlashCamADC/ORFlashCamADCDecoders.m b/Source/Objects/Hardware/Internet/FlashCam/FlashCamADC/ORFlashCamADCDecoders.m index e536fc1e..2e743ccc 100644 --- a/Source/Objects/Hardware/Internet/FlashCam/FlashCamADC/ORFlashCamADCDecoders.m +++ b/Source/Objects/Hardware/Internet/FlashCam/FlashCamADC/ORFlashCamADCDecoders.m @@ -35,6 +35,9 @@ - (id) init - (void) dealloc { [fcCards release]; + fcCards = nil; + [decoderOptions release]; // + decoderOptions = nil; [super dealloc]; } @@ -117,26 +120,30 @@ - (uint32_t) decodeData:(void*)someData fromDecoder:(ORDecoder*)aDecoder intoDat struct timeval tv; gettimeofday(&tv, NULL); uint64_t now = (uint64_t)(tv.tv_sec)*1000 + (uint64_t)(tv.tv_usec)/1000; - if(!decoderOptions) decoderOptions = [[NSMutableDictionary dictionary] retain]; - NSString* lastTimeKey = [NSString stringWithFormat:@"%@,%@,%@,LastTime", crateKey, cardKey, channelKey]; + if(!decoderOptions) decoderOptions = [[NSMutableDictionary alloc] init]; + NSString* lastTimeKey = [[NSString alloc] initWithFormat:@"%@,%@,%@,LastTime", crateKey, cardKey, channelKey]; uint64_t lastTime = [[decoderOptions objectForKey:lastTimeKey] unsignedLongLongValue]; if(now - lastTime >= 100){ fullDecode = YES; [decoderOptions setObject:[NSNumber numberWithUnsignedLongLong:now] forKey:lastTimeKey]; } BOOL someoneWatching = NO; - if([aDataSet isSomeoneLooking:[NSString stringWithFormat:@"FlashCamADC,Waveforms,%d,%d,%d", crate, card, channel]]){ + NSString* watchKey = [[NSString alloc] initWithFormat:@"FlashCamADC,Waveforms,%u,%u,%u", crate, card, channel]; + if([aDataSet isSomeoneLooking:watchKey]){ + //if([aDataSet isSomeoneLooking:[NSString stringWithFormat:@"FlashCamADC,Waveforms,%d,%d,%d", crate, card, channel]]){ someoneWatching = YES; } - + [watchKey release]; // Memory is freed INSTANTLY + [lastTimeKey release]; // decode the waveform if this is the first one or the above conditions are satisfied if(lastTime == 0 || (fullDecode && someoneWatching)){ ptr ++; - NSMutableData* tmpData = [NSMutableData dataWithCapacity:wfSamples*sizeof(unsigned short)]; + NSMutableData* tmpData = [[NSMutableData alloc] initWithCapacity:wfSamples*sizeof(unsigned short)]; [tmpData setLength:wfSamples/2*sizeof(uint32_t)]; memcpy((uint32_t*) [tmpData bytes], ptr, wfSamples*sizeof(unsigned short)); [aDataSet loadWaveform:tmpData offset:0 unitSize:2 sender:self withKeys:@"FlashCamADC", @"Waveforms", crateKey, cardKey, channelKey, nil]; + [tmpData release]; } return length; @@ -191,6 +198,7 @@ - (id) init - (void) dealloc { + [super dealloc]; } diff --git a/Source/Objects/Hardware/Internet/FlashCam/FlashCamIO/ORFlashCamListenerController.m b/Source/Objects/Hardware/Internet/FlashCam/FlashCamIO/ORFlashCamListenerController.m index ef324c6c..5af9e88b 100644 --- a/Source/Objects/Hardware/Internet/FlashCam/FlashCamIO/ORFlashCamListenerController.m +++ b/Source/Objects/Hardware/Internet/FlashCam/FlashCamIO/ORFlashCamListenerController.m @@ -89,7 +89,7 @@ - (void) fcLogChanged:(NSNotification*)note [nlinesTextField setIntegerValue:(NSInteger)[model fclogLines]]; [[historyView textStorage] deleteCharactersInRange:NSMakeRange(0, [[historyView textStorage] length])]; [[errorView textStorage] deleteCharactersInRange:NSMakeRange(0, [[errorView textStorage] length])]; - for(NSUInteger i=[model fclogLines]-1; i<[model fclogLines]; i--){ + for(NSUInteger i=[model fclogLines]-1; i>=0; i--){ NSString* line = [model fclog:i]; if([line isEqualToString:@""]) continue; NSAttributedString* s = [self makeAttributedString:line]; @@ -98,7 +98,7 @@ - (void) fcLogChanged:(NSNotification*)note [line rangeOfString:@"warning" options:NSCaseInsensitiveSearch].location != NSNotFound) [[errorView textStorage] appendAttributedString:s]; } - for(NSUInteger i=[model fcrunlogLines]-1; i<[model fcrunlogLines]; i--){ + for(NSUInteger i=[model fcrunlogLines]-1; i>=0; i--){ NSString* line = [model fcrunlog:i]; NSAttributedString* s = [self makeAttributedString:line]; [[historyView textStorage] appendAttributedString:s]; diff --git a/Source/Objects/Hardware/Internet/FlashCam/FlashCamIO/ORFlashCamListenerDecoders.m b/Source/Objects/Hardware/Internet/FlashCam/FlashCamIO/ORFlashCamListenerDecoders.m index 2696f687..4f3cffe8 100644 --- a/Source/Objects/Hardware/Internet/FlashCam/FlashCamIO/ORFlashCamListenerDecoders.m +++ b/Source/Objects/Hardware/Internet/FlashCam/FlashCamIO/ORFlashCamListenerDecoders.m @@ -54,11 +54,23 @@ - (ORFCIOConfigDecoder*) init - (void) dealloc { - [super dealloc]; + //[super dealloc]; for (int i = 0; i < kMaxFCIOStreams; i++) { - FCIOClose(fcioStreams[i]); - FSPDestroy(processors[i]); + if (fcioStreams[i]) { + FCIOClose(fcioStreams[i]); + fcioStreams[i] = NULL; + } + if (processors[i]) { + FSPDestroy(processors[i]); + processors[i] = NULL; + } + + //FCIOClose(fcioStreams[i]); + //FSPDestroy(processors[i]); } + [decoderOptions release]; + decoderOptions = nil; + [super dealloc]; } - (void)broadcastToOthers:(ORDecoder*)aDecoder @@ -78,7 +90,8 @@ - (void)broadcastToOthers:(ORDecoder*)aDecoder - (void) setupOptionsfromHeader:(NSDictionary*)aHeader forListener:(uint32_t) listener_id andTracemap:(unsigned int*)tracemap withSize:(size_t)nadcs; { - if(!decoderOptions) decoderOptions = [[NSMutableDictionary dictionary] retain]; + //if(!decoderOptions) decoderOptions = [[NSMutableDictionary dictionary] retain]; + if(!decoderOptions) decoderOptions = [[NSMutableDictionary alloc] init]; //set up the crate cache NSArray* crates = [aHeader nestedObjectForKey:@"ObjectInfo",@"Crates",nil]; @@ -97,10 +110,26 @@ - (void) setupOptionsfromHeader:(NSDictionary*)aHeader forListener:(uint32_t) li unsigned int fcioCardAddress = tracemap[trace_idx] >> 16; if (fcioCardAddress == cardAddress) { unsigned int chan = tracemap[trace_idx] & 0xFFFF; - NSNumber* channel = [NSNumber numberWithUnsignedInteger:chan]; - [decoderOptions setObject:crate forKey:[NSString stringWithFormat:@"Listener %2d,Trace %4d,crate", listener_id, trace_idx]]; - [decoderOptions setObject:card forKey:[NSString stringWithFormat:@"Listener %2d,Trace %4d,card", listener_id, trace_idx]]; - [decoderOptions setObject:channel forKey:[NSString stringWithFormat:@"Listener %2d,Trace %4d,channel", listener_id, trace_idx]]; + NSNumber* channel = [[NSNumber alloc] initWithUnsignedInt:chan]; + + // Create keys manually to avoid autorelease pool bloat + NSString* kCrate = [[NSString alloc] initWithFormat:@"Listener %2d,Trace %4d,crate", listener_id, trace_idx]; + NSString* kCard = [[NSString alloc] initWithFormat:@"Listener %2d,Trace %4d,card", listener_id, trace_idx]; + NSString* kChan = [[NSString alloc] initWithFormat:@"Listener %2d,Trace %4d,channel", listener_id, trace_idx]; + + [decoderOptions setObject:crate forKey:kCrate]; + [decoderOptions setObject:card forKey:kCard]; + [decoderOptions setObject:channel forKey:kChan]; + + [kCrate release]; + [kCard release]; + [kChan release]; + [channel release]; + + //NSNumber* channel = [NSNumber numberWithUnsignedInteger:chan]; + //[decoderOptions setObject:crate forKey:[NSString stringWithFormat:@"Listener %2d,Trace %4d,crate", listener_id, trace_idx]]; + //[decoderOptions setObject:card forKey:[NSString stringWithFormat:@"Listener %2d,Trace %4d,card", listener_id, trace_idx]]; + //[decoderOptions setObject:channel forKey:[NSString stringWithFormat:@"Listener %2d,Trace %4d,channel", listener_id, trace_idx]]; } } } @@ -300,51 +329,68 @@ - (uint32_t) decodeData:(void*)someData fromDecoder:(ORDecoder*)aDecoder intoDat return 0; } if (aDataSet) { + //suggested fix of the memory loop + if(!decoderOptions) { + decoderOptions = [[NSMutableDictionary alloc] init]; + } uint32_t wfSamples = fcio->config.eventsamples; for (int i = 0; i < fcio->event.num_traces; i++) { int trace_idx = fcio->event.trace_list[i]; unsigned int crate = [[config getCrateForTrace:trace_idx] unsignedIntValue]; unsigned int card = [[config getCardForTrace:trace_idx] unsignedIntValue]; unsigned int channel = [[config getChannelForTrace:trace_idx] unsignedIntValue]; - + NSString* crateKey = [self getCrateKey:crate]; + // Instead of autoreleased helper: NSString* cardKey = [self getCardKey:card]; NSString* channelKey = [self getChannelKey:channel]; - + uint16_t fpga_baseline = fcio->event.theader[trace_idx][0]; uint16_t fpga_integrator = fcio->event.theader[trace_idx][1]; - + [aDataSet histogram:fpga_baseline numBins:0xffff sender:self withKeys:@"FlashCamADC", @"Baseline", crateKey, cardKey, channelKey, nil]; [aDataSet histogram:fpga_integrator numBins:0xffff sender:self withKeys:@"FlashCamADC", @"Energy", crateKey, cardKey, channelKey, nil]; - + // Event specific, not in Header // only decode the waveform if it has been 100 ms since the last decoded waveform and the plotting window is open BOOL fullDecode = NO; struct timeval tv; gettimeofday(&tv, NULL); uint64_t now = (uint64_t)(tv.tv_sec)*1000 + (uint64_t)(tv.tv_usec)/1000; - if(!decoderOptions) decoderOptions = [[NSMutableDictionary dictionary] retain]; - NSString* lastTimeKey = [NSString stringWithFormat:@"%@,%@,%@,LastTime", crateKey, cardKey, channelKey]; + + //if(!decoderOptions) decoderOptions = [[NSMutableDictionary dictionary] retain]; + + NSString* lastTimeKey = [[NSString alloc] initWithFormat:@"%@,%@,%@,LastTime", crateKey, cardKey, channelKey]; uint64_t lastTime = [[decoderOptions objectForKey:lastTimeKey] unsignedLongLongValue]; + if(now - lastTime >= 100){ fullDecode = YES; - [decoderOptions setObject:[NSNumber numberWithUnsignedLongLong:now] forKey:lastTimeKey]; + NSNumber* nowNum = [[NSNumber alloc] initWithUnsignedLongLong:now]; + [decoderOptions setObject:nowNum forKey:lastTimeKey]; + [nowNum release]; + //[decoderOptions setObject:[NSNumber numberWithUnsignedLongLong:now] forKey:lastTimeKey]; } BOOL someoneWatching = NO; - if([aDataSet isSomeoneLooking:[NSString stringWithFormat:@"FlashCamADC,Waveforms,%d,%d,%d", crate , card, channel]]){ + NSString* watchKey = [[NSString alloc] initWithFormat:@"FlashCamADC,Waveforms,%d,%d,%d", crate, card, channel]; + + //if([aDataSet isSomeoneLooking:[NSString stringWithFormat:@"FlashCamADC,Waveforms,%d,%d,%d", crate , card, channel]]){ + if([aDataSet isSomeoneLooking:watchKey]){ someoneWatching = YES; } - + [watchKey release]; + [lastTimeKey release]; // decode the waveform if this is the first one or the above conditions are satisfied if(lastTime == 0 || (fullDecode && someoneWatching)){ - NSMutableData* tmpData = [NSMutableData dataWithCapacity:wfSamples*sizeof(unsigned short)]; + NSMutableData* tmpData = [[NSMutableData alloc] initWithCapacity:wfSamples*sizeof(unsigned short)]; [tmpData setLength:wfSamples*sizeof(unsigned short)]; memcpy((uint32_t*) [tmpData bytes], fcio->event.trace[trace_idx], wfSamples*sizeof(unsigned short)); [aDataSet loadWaveform:tmpData offset:0 unitSize:2 sender:self withKeys:@"FlashCamADC", @"Waveforms", crateKey, cardKey, channelKey, nil]; + [tmpData release]; } + //} } } From 2b7f42be1bba308e4e0d3d299e8106e8f52fc6ab Mon Sep 17 00:00:00 2001 From: himal1 Date: Sun, 18 Jan 2026 20:51:22 -0500 Subject: [PATCH 04/10] added app icon in catlog --- .../Catalog/Catalog.nib/designable.nib | 51091 ++++++++-------- .../Catalog.nib/keyedobjects-101300.nib | Bin 18121032 -> 18120462 bytes .../Catalog/Catalog.nib/keyedobjects.nib | Bin 18261035 -> 18262231 bytes 3 files changed, 25637 insertions(+), 25454 deletions(-) diff --git a/Source/Main Dialogs/Catalog/Catalog.nib/designable.nib b/Source/Main Dialogs/Catalog/Catalog.nib/designable.nib index e4dbf4bf..9ae238b5 100644 --- a/Source/Main Dialogs/Catalog/Catalog.nib/designable.nib +++ b/Source/Main Dialogs/Catalog/Catalog.nib/designable.nib @@ -1,8 +1,8 @@ - + - + @@ -16,20 +16,20 @@ - - + + - + - + - + @@ -41,7 +41,7 @@ - + @@ -535,7 +535,7 @@ - + @@ -544,7 +544,7 @@ - + @@ -553,7 +553,7 @@ - + @@ -562,7 +562,7 @@ - + @@ -571,7 +571,7 @@ - + @@ -580,7 +580,7 @@ - + @@ -589,7 +589,7 @@ - + @@ -606,7 +606,7 @@ - + @@ -711,7 +711,7 @@ - + @@ -736,7 +736,7 @@ - + @@ -829,7 +829,7 @@ - + @@ -854,7 +854,7 @@ - + @@ -887,7 +887,7 @@ - + @@ -952,7 +952,7 @@ - + @@ -1011,7 +1011,7 @@ - + @@ -1064,7 +1064,7 @@ - + @@ -1267,7 +1267,7 @@ - + @@ -1360,7 +1360,7 @@ - + @@ -1369,7 +1369,7 @@ - + @@ -1406,7 +1406,7 @@ - + @@ -1447,7 +1447,7 @@ - + @@ -1464,7 +1464,7 @@ - + @@ -1473,7 +1473,7 @@ - + @@ -1564,7 +1564,7 @@ - + - + @@ -1806,10 +1806,10 @@ Controller - + - + @@ -1919,7 +1919,7 @@ Controller - + - + @@ -2048,20 +2048,20 @@ Controller - + - + - + + - - + + - + @@ -2466,7 +2474,7 @@ Gauge Controller - + @@ -2475,7 +2483,7 @@ Gauge Controller - + @@ -2516,7 +2524,7 @@ Gauge Controller - + @@ -2525,7 +2533,7 @@ Gauge Controller - + @@ -2534,7 +2542,7 @@ Gauge Controller - + @@ -2583,7 +2591,7 @@ Gauge Controller - + @@ -2592,7 +2600,7 @@ Gauge Controller - + @@ -2601,7 +2609,7 @@ Gauge Controller - + @@ -2610,7 +2618,7 @@ Gauge Controller - + @@ -2629,10 +2637,10 @@ Gauge Controller - + - + @@ -2643,7 +2651,7 @@ Can only be used with the M21 M-Module controller. - + @@ -2688,7 +2696,7 @@ Can only be used with the M21 M-Module controller. - + @@ -2702,7 +2710,7 @@ Can only be used with the M21 M-Module controller. - + @@ -2884,7 +2892,7 @@ Can only be used with the M21 M-Module controller. - + @@ -3180,7 +3188,7 @@ Relay - + @@ -3407,7 +3415,7 @@ Relay - + @@ -3416,7 +3424,7 @@ Relay - + @@ -3603,7 +3611,7 @@ Relay - + - + @@ -535,7 +535,7 @@ - + @@ -544,7 +544,7 @@ - + @@ -553,7 +553,7 @@ - + @@ -562,7 +562,7 @@ - + @@ -571,7 +571,7 @@ - + @@ -580,7 +580,7 @@ - + @@ -589,7 +589,7 @@ - + @@ -606,7 +606,7 @@ - + @@ -711,7 +711,7 @@ - + @@ -736,7 +736,7 @@ - + @@ -829,7 +829,7 @@ - + @@ -854,7 +854,7 @@ - + @@ -887,7 +887,7 @@ - + @@ -952,7 +952,7 @@ - + @@ -1064,7 +1064,7 @@ - + @@ -1360,7 +1360,7 @@ - + @@ -1369,7 +1369,7 @@ - + @@ -1406,7 +1406,7 @@ - + @@ -1447,7 +1447,7 @@ - + @@ -1464,7 +1464,7 @@ - + @@ -1473,7 +1473,7 @@ - + @@ -1655,7 +1655,7 @@ Digitizer - + @@ -1809,7 +1809,7 @@ Controller - + @@ -1986,7 +1986,7 @@ Controller - + @@ -2057,11 +2057,11 @@ Controller - + - + @@ -2474,7 +2474,7 @@ Gauge Controller - + @@ -2483,7 +2483,7 @@ Gauge Controller - + @@ -2524,7 +2524,7 @@ Gauge Controller - + @@ -2533,7 +2533,7 @@ Gauge Controller - + @@ -2542,7 +2542,7 @@ Gauge Controller - + @@ -2591,7 +2591,7 @@ Gauge Controller - + @@ -2600,7 +2600,7 @@ Gauge Controller - + @@ -2609,7 +2609,7 @@ Gauge Controller - + @@ -2618,7 +2618,7 @@ Gauge Controller - + @@ -2640,7 +2640,7 @@ Gauge Controller - + @@ -2651,7 +2651,7 @@ Can only be used with the M21 M-Module controller. - + @@ -2696,7 +2696,7 @@ Can only be used with the M21 M-Module controller. - + @@ -3415,7 +3415,7 @@ Relay - + @@ -3424,7 +3424,7 @@ Relay - + diff --git a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib new file mode 100644 index 00000000..50874208 --- /dev/null +++ b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib @@ -0,0 +1,492 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects-101300.nib b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects-101300.nib new file mode 100644 index 0000000000000000000000000000000000000000..63b5a706de99cb2738b0694e8cd26820a611a144 GIT binary patch literal 29740 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 s=kfWxfEV&bd<9?0-{&9mBK`^A%=i6M1*rNzvN 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 Y`NpQJH~YE@3iP_gw+852bHMdSpWb4 literal 0 HcmV?d00001 diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.h b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.h new file mode 100644 index 00000000..613e477a --- /dev/null +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.h @@ -0,0 +1,85 @@ +//-------------------------------------------------------- +// ORDefender3000Controller +// Orca +// +// Created by Mark Howe on 05/14/2024. +// Copyright 2024 CENPA, University of North Carolina. All rights reserved. +//----------------------------------------------------------- +//This program was prepared for the Regents of the University of +//North Carolina sponsored in part by the United States +//Department of Energy (DOE) under Grant #DE-FG02-97ER41020. +//The University has certain rights in the program pursuant to +//the contract and the program should not be copied or distributed +//outside your organization. The DOE and the University of +//North Carolina reserve all rights in the program. Neither the authors, +//University of North Carolina, or U.S. Government make any warranty, +//express or implied, or assume any liability or responsibility +//for the use of this software. +//------------------------------------------------------------- +#pragma mark ***Imported Files + +@class ORCompositeTimeLineView; + +@interface ORDefender3000ControllerNew : OrcaObjectController +{ + IBOutlet NSTextField* lockDocField; + IBOutlet NSButton* shipWeightButton; + IBOutlet NSButton* lockButton; + IBOutlet NSButton* sendCmdButton; + IBOutlet NSTextField* portStateField; + IBOutlet NSPopUpButton* portListPopup; + IBOutlet NSPopUpButton* pollTimePopup; + IBOutlet NSPopUpButton* commandPopup; + IBOutlet NSPopUpButton* unitsPopup; + IBOutlet NSButton* openPortButton; + IBOutlet NSButton* sendAllButton; + IBOutlet NSTextField* weightField; + IBOutlet NSTextField* timeField; + IBOutlet NSTextField* unitsField; + IBOutlet NSTextField* printIntervalField; + IBOutlet NSTextField* tareField; + IBOutlet ORCompositeTimeLineView* plotter0; +} + +#pragma mark ***Initialization +- (id) init; +- (void) dealloc; +- (void) awakeFromNib; + +#pragma mark ***Notifications +- (void) registerNotificationObservers; +- (void) updateWindow; + +#pragma mark ***Interface Management +- (void) updateTimePlot:(NSNotification*)aNote; +- (void) scaleAction:(NSNotification*)aNote; +- (void) shipWeightChanged:(NSNotification*)aNote; +- (void) lockChanged:(NSNotification*)aNote; +- (void) portNameChanged:(NSNotification*)aNote; +- (void) portStateChanged:(NSNotification*)aNote; +- (void) weightChanged:(NSNotification*)aNote; +- (void) pollTimeChanged:(NSNotification*)aNote; +- (void) miscAttributesChanged:(NSNotification*)aNote; +- (void) unitsChanged:(NSNotification*)aNote; +- (void) commandChanged:(NSNotification*)aNote; +- (void) updateButtonStates; + +#pragma mark ***Actions +- (IBAction) shipWeightAction:(id)sender; +- (IBAction) lockAction:(id) sender; +- (IBAction) portListAction:(id) sender; +- (IBAction) openPortAction:(id)sender; +- (IBAction) sendCommandAction:(id)sender; +- (IBAction) pollTimeAction:(id)sender; +- (IBAction) printIntervalAction:(id)sender; +- (IBAction) tareAction:(id)sender; +- (IBAction) unitsAction:(id)sender; +- (IBAction) commandAction:(id)sender; +- (IBAction) sendAllAction:(id)sender; + +- (int) numberPointsInPlot:(id)aPlotter; +- (void) plotter:(id)aPlotter index:(int)i x:(double*)xValue y:(double*)yValue; + +@end + + diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.m b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.m new file mode 100644 index 00000000..99423c43 --- /dev/null +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.m @@ -0,0 +1,439 @@ +//-------------------------------------------------------- +// ORDefender3000Controller +// Orca +// +// Created by Mark Howe on 05/14/2024. +// Copyright 2024 CENPA, University of North Carolina. All rights reserved. +//----------------------------------------------------------- +//This program was prepared for the Regents of the University of +//North Carolina sponsored in part by the United States +//Department of Energy (DOE) under Grant #DE-FG02-97ER41020. +//The University has certain rights in the program pursuant to +//the contract and the program should not be copied or distributed +//outside your organization. The DOE and the University of +//North Carolina reserve all rights in the program. Neither the authors, +//University of North Carolina, or U.S. Government make any warranty, +//express or implied, or assume any liability or responsibility +//for the use of this software. +//------------------------------------------------------------- +#pragma mark ***Imported Files + +#import "ORDefender3000ControllerNew.h" +#import "ORDefender3000ModelNew.h" +#import "ORTimeLinePlot.h" +#import "ORCompositePlotView.h" +#import "ORTimeAxis.h" +#import "ORSerialPortList.h" +#import "ORSerialPort.h" +#import "ORTimeRate.h" + +@interface ORDefender3000ControllerNew (private) +- (void) populatePortListPopup; +@end + +@implementation ORDefender3000ControllerNew + +#pragma mark ***Initialization + +- (id) init +{ + self = [super initWithWindowNibName:@"Defender3000New"]; + return self; +} + +- (void) dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [super dealloc]; +} + +- (void) awakeFromNib +{ + [self populatePortListPopup]; + [[plotter0 yAxis] setRngLow:0.0 withHigh:300.]; + [[plotter0 yAxis] setRngLimitsLow:-300.0 withHigh:500 withMinRng:4]; + + [[plotter0 xAxis] setRngLow:0.0 withHigh:10000]; + [[plotter0 xAxis] setRngLimitsLow:0.0 withHigh:200000. withMinRng:200]; + + ORTimeLinePlot* aPlot; + aPlot= [[ORTimeLinePlot alloc] initWithTag:0 andDataSource:self]; + [plotter0 addPlot: aPlot]; + [(ORTimeAxis*)[plotter0 xAxis] setStartTime: [[NSDate date] timeIntervalSince1970]]; + [aPlot release]; + + [super awakeFromNib]; +} + +- (void) setModel:(id)aModel +{ + [super setModel:aModel]; + [[self window] setTitle:[NSString stringWithFormat:@"Defender 3000 New (Unit %u)",[model uniqueIdNumber]]]; +} + +#pragma mark ***Notifications + +- (void) registerNotificationObservers +{ + NSNotificationCenter* notifyCenter = [NSNotificationCenter defaultCenter]; + [super registerNotificationObservers]; + [notifyCenter addObserver : self + selector : @selector(lockChanged:) + name : ORRunStatusChangedNotification + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(lockChanged:) + name : ORDefender3000NewLock + object: nil]; + + [notifyCenter addObserver : self + selector : @selector(portNameChanged:) + name : ORDefender3000ModelNewPortNameChanged + object: nil]; + + [notifyCenter addObserver : self + selector : @selector(portStateChanged:) + name : ORSerialPortStateChanged + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(weightChanged:) + name : ORDefender3000NewWeightChanged + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(pollTimeChanged:) + name : ORDefender3000ModelNewPollTimeChanged + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(shipWeightChanged:) + name : ORDefender3000ModelNewShipWeightChanged + object: model]; + + [notifyCenter addObserver : self + selector : @selector(scaleAction:) + name : ORAxisRangeChangedNotification + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(miscAttributesChanged:) + name : ORMiscAttributesChanged + object : model]; + + [notifyCenter addObserver : self + selector : @selector(updateTimePlot:) + name : ORRateAverageChangedNotification + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(printIntervalChanged:) + name : ORDefender3000NewPrintIntervalChanged + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(unitsChanged:) + name : ORDefender3000NewUnitsChanged + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(commandChanged:) + name : ORDefender3000NewCommandChanged + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(tareChanged:) + name : ORDefender3000NewTareChanged + object : nil]; + + [notifyCenter addObserver : self + selector : @selector(unitsDataChanged:) + name : ORDefender3000ModelNewUnitDataChanged + object : nil]; + +} + +- (void) updateWindow +{ + [super updateWindow]; + [self lockChanged:nil]; + [self portStateChanged:nil]; + [self portNameChanged:nil]; + [self weightChanged:nil]; + [self pollTimeChanged:nil]; + [self shipWeightChanged:nil]; + [self updateTimePlot:nil]; + [self miscAttributesChanged:nil]; + [self printIntervalChanged:nil]; + [self unitsChanged:nil]; + [self commandChanged:nil]; + [self tareChanged:nil]; + [self unitsChanged:nil]; +} + +- (void) scaleAction:(NSNotification*)aNote +{ + if(aNote == nil || [aNote object] == [plotter0 xAxis]){ + [model setMiscAttributes:[(ORAxis*)[plotter0 xAxis]attributes] forKey:@"XAttributes0"]; + }; + + if(aNote == nil || [aNote object] == [plotter0 yAxis]){ + [model setMiscAttributes:[(ORAxis*)[plotter0 yAxis]attributes] forKey:@"YAttributes0"]; + }; +} + +- (void) miscAttributesChanged:(NSNotification*)aNote +{ + + NSString* key = [[aNote userInfo] objectForKey:ORMiscAttributeKey]; + NSMutableDictionary* attrib = [model miscAttributesForKey:key]; + + if(aNote == nil || [key isEqualToString:@"XAttributes0"]){ + if(aNote==nil)attrib = [model miscAttributesForKey:@"XAttributes0"]; + if(attrib){ + [(ORAxis*)[plotter0 xAxis] setAttributes:attrib]; + [plotter0 setNeedsDisplay:YES]; + [[plotter0 xAxis] setNeedsDisplay:YES]; + } + } + if(aNote == nil || [key isEqualToString:@"YAttributes0"]){ + if(aNote==nil)attrib = [model miscAttributesForKey:@"YAttributes0"]; + if(attrib){ + [(ORAxis*)[plotter0 yAxis] setAttributes:attrib]; + [plotter0 setNeedsDisplay:YES]; + [[plotter0 yAxis] setNeedsDisplay:YES]; + } + } +} + +- (void) updateTimePlot:(NSNotification*)aNote +{ + if(!aNote || ([aNote object] == [model timeRate])){ + [plotter0 setNeedsDisplay:YES]; + } +} + +- (void) shipWeightChanged:(NSNotification*)aNote +{ + [shipWeightButton setIntValue: [model shipWeight]]; +} + +- (void) printIntervalChanged:(NSNotification*)aNote +{ + [printIntervalField setIntValue: [model printInterval]]; +} + +- (void) tareChanged:(NSNotification*)aNote +{ + [tareField setIntValue: [model tare]]; +} + +- (void) unitsDataChanged:(NSNotification*)aNote +{ + [unitsField setStringValue:[model getUnitString]]; +} + +- (void) unitsChanged:(NSNotification*)aNote +{ + [unitsPopup selectItemWithTag: [(ORDefender3000ModelNew*)model units]]; +} + +- (void) commandChanged:(NSNotification*)aNote +{ + [commandPopup selectItemWithTag: [model command]]; +} + +- (void) weightChanged:(NSNotification*)aNote +{ + [weightField setFloatValue:[model weight]]; + uint32_t t = [model timeMeasured]; + NSDate* theDate; + if(t){ + theDate = [NSDate dateWithTimeIntervalSince1970:t]; + [timeField setObjectValue:[theDate stdDescription]]; + } + else [timeField setObjectValue:@"--"]; +} + + +- (void) checkGlobalSecurity +{ + BOOL secure = [[[NSUserDefaults standardUserDefaults] objectForKey:OROrcaSecurityEnabled] boolValue]; + [gSecurity setLock:ORDefender3000NewLock to:secure]; + [lockButton setEnabled:secure]; +} + +- (void) lockChanged:(NSNotification*)aNote +{ + BOOL runInProgress = [gOrcaGlobals runInProgress]; + BOOL lockedOrRunningMaintenance = [gSecurity runInProgressButNotType:eMaintenanceRunType orIsLocked:ORDefender3000NewLock]; + BOOL locked = [gSecurity isLocked:ORDefender3000NewLock]; + + [lockButton setState: locked]; + + [portListPopup setEnabled:!locked]; + [openPortButton setEnabled:!locked]; + + [self updateButtonStates]; + + NSString* s = @""; + if(lockedOrRunningMaintenance){ + if(runInProgress && ![gSecurity isLocked:ORDefender3000NewLock])s = @"Not in Maintenance Run."; + } + [lockDocField setStringValue:s]; + +} + +- (void) updateButtonStates +{ + BOOL locked = [gSecurity isLocked:ORDefender3000NewLock]; + bool portOpen = [[model serialPort] isOpen]; + + [unitsPopup setEnabled:!locked && portOpen]; + [commandPopup setEnabled:!locked && portOpen]; + [printIntervalField setEnabled:!locked && portOpen]; + [tareField setEnabled:!locked && portOpen]; + [shipWeightButton setEnabled:!locked && portOpen]; + [sendAllButton setEnabled:!locked && portOpen]; + [pollTimePopup setEnabled:!locked && portOpen]; + [sendCmdButton setEnabled:!locked && portOpen]; +} + +- (void) portStateChanged:(NSNotification*)aNote +{ + if(aNote == nil || [aNote object] == [model serialPort]){ + if([model serialPort]){ + [openPortButton setEnabled:YES]; + + if([[model serialPort] isOpen]){ + [openPortButton setTitle:@"Close"]; + [portStateField setTextColor:[NSColor colorWithCalibratedRed:0.0 green:.8 blue:0.0 alpha:1.0]]; + [portStateField setStringValue:@"Open"]; + } + else { + [openPortButton setTitle:@"Open"]; + [portStateField setStringValue:@"Closed"]; + [portStateField setTextColor:[NSColor redColor]]; + } + } + else { + [openPortButton setEnabled:NO]; + [portStateField setTextColor:[NSColor blackColor]]; + [portStateField setStringValue:@"---"]; + [openPortButton setTitle:@"---"]; + } + [self updateButtonStates]; + } +} + +- (void) pollTimeChanged:(NSNotification*)aNote +{ + [pollTimePopup selectItemWithTag:[model pollTime]]; +} + +- (void) portNameChanged:(NSNotification*)aNote +{ + NSString* portName = [model portName]; + + NSEnumerator *enumerator = [ORSerialPortList portEnumerator]; + ORSerialPort *aPort; + + [portListPopup selectItemAtIndex:0]; //the default + while (aPort = [enumerator nextObject]) { + if([portName isEqualToString:[aPort name]]){ + [portListPopup selectItemWithTitle:portName]; + break; + } + } + [self portStateChanged:nil]; +} + +#pragma mark ***Actions +- (IBAction) printIntervalAction:(id)sender +{ + [model setPrintInterval:[sender intValue]]; +} + +- (IBAction) tareAction:(id)sender +{ + [model setTare:[sender intValue]]; +} + +- (IBAction) sendCommandAction:(id)sender +{ + [self endEditing]; + [model sendCommand]; +} + +- (IBAction) sendAllAction:(id)sender +{ + [self endEditing]; + [model sendAllCommands]; +} + +- (void) shipWeightAction:(id)sender +{ + [model setShipWeight:[sender intValue]]; +} + +- (IBAction) lockAction:(id) sender +{ + [gSecurity tryToSetLock:ORDefender3000NewLock to:[sender intValue] forWindow:[self window]]; +} + +- (IBAction) portListAction:(id) sender +{ + [model setPortName: [portListPopup titleOfSelectedItem]]; +} + +- (IBAction) openPortAction:(id)sender +{ + [model openPort:![[model serialPort] isOpen]]; +} + +- (IBAction) pollTimeAction:(id)sender +{ + [model setPollTime:(int)[[sender selectedItem] tag]]; +} +- (IBAction) unitsAction:(id)sender +{ + [model setUnits:(int)[[sender selectedItem] tag]]; +} +- (IBAction) commandAction:(id)sender +{ + [self endEditing]; + [model setCommand:(int)[[sender selectedItem] tag]]; +} + +#pragma mark •••Data Source +- (int) numberPointsInPlot:(id)aPlotter +{ + return (int)[[model timeRate] count]; +} + +- (void) plotter:(id)aPlotter index:(int)i x:(double*)xValue y:(double*)yValue +{ + int count = (int)[[model timeRate] count]; + int index = count-i-1; + *xValue = [[model timeRate] timeSampledAtIndex:index]; + *yValue = [[model timeRate] valueAtIndex:index]; +} + +@end + +@implementation ORDefender3000ControllerNew (private) + +- (void) populatePortListPopup +{ + NSEnumerator *enumerator = [ORSerialPortList portEnumerator]; + ORSerialPort *aPort; + [portListPopup removeAllItems]; + [portListPopup addItemWithTitle:@"--"]; + + while (aPort = [enumerator nextObject]) { + [portListPopup addItemWithTitle:[aPort name]]; + } +} +@end + diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000DecodersNew.h b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000DecodersNew.h new file mode 100644 index 00000000..2674ddde --- /dev/null +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000DecodersNew.h @@ -0,0 +1,31 @@ +// +// ORDefender3000Decoders.h +// Orca +// +// Created by Mark Howe on 05/14/2024. +// Copyright 2024 CENPA, University of North Carolina. All rights reserved. +//----------------------------------------------------------- +//This program was prepared for the Regents of the University of +//North Carolina sponsored in part by the United States +//Department of Energy (DOE) under Grant #DE-FG02-97ER41020. +//The University has certain rights in the program pursuant to +//the contract and the program should not be copied or distributed +//outside your organization. The DOE and the University of +//North Carolina reserve all rights in the program. Neither the authors, +//University of North Carolina, or U.S. Government make any warranty, +//express or implied, or assume any liability or responsibility +//for the use of this software. +//------------------------------------------------------------- + + +#import "ORBaseDecoder.h" + +@class ORDataPacket; +@class ORDataSet; + +@interface ORDefender3000DecoderForWeightNew : ORBaseDecoder { +} +- (NSString*) getUnitKey:(unsigned short)aUnit; +- (uint32_t) decodeData:(void*)someData fromDecoder:(ORDecoder*)aDecoder intoDataSet:(ORDataSet*)aDataSet; +- (NSString*) dataRecordDescription:(uint32_t*)dataPtr; +@end diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000DecodersNew.m b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000DecodersNew.m new file mode 100644 index 00000000..5d1e2380 --- /dev/null +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000DecodersNew.m @@ -0,0 +1,89 @@ +// +// ORDefender3000Decoders.m +// Orca +// +// Created by Mark Howe on 05/14/2024. +// Copyright 2024 CENPA, University of North Carolina. All rights reserved. +//----------------------------------------------------------- +//This program was prepared for the Regents of the University of +//North Carolina sponsored in part by the United States +//Department of Energy (DOE) under Grant #DE-FG02-97ER41020. +//The University has certain rights in the program pursuant to +//the contract and the program should not be copied or distributed +//outside your organization. The DOE and the University of +//North Carolina reserve all rights in the program. Neither the authors, +//University of North Carolina, or U.S. Government make any warranty, +//express or implied, or assume any liability or responsibility +//for the use of this software. +//------------------------------------------------------------- + +#import "ORDefender3000DecodersNew.h" +#import "ORDataPacket.h" +#import "ORDataSet.h" + +//----------------------------------------------------------------------------------- +// Data Format +//xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx +//^^^^ ^^^^ ^^^^ ^^-----------------------data id +// ^^ ^^^^ ^^^^ ^^^^ ^^^^-length in longs +// xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx +// ^^^^ ^^^^ ^^^^ ^^^^- device id +// xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx weight encoded as a float +// xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx time weight taken in seconds since Jan 1, 1970 +// xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx format data +// ^^^-- 1:g,2:kg,3:lb,4:oz,5:lb:oz +// ^^^------- 0:unknown,1:Dynamic +//------------------------------------------------------------------------------------- +static NSString* kDefender3000Unit[8] = { + //pre-make some keys for speed. + @"Unit 0",@"Unit 1",@"Unit 2",@"Unit 3",@"Unit 4",@"Unit 5",@"Unit 6",@"Unit 7" +}; + +@implementation ORDefender3000DecoderForWeightNew + +- (NSString*) getUnitKey:(unsigned short)aUnit +{ + if(aUnit<8) return kDefender3000Unit[aUnit]; + else return [NSString stringWithFormat:@"Unit %d",aUnit]; +} + +- (uint32_t) decodeData:(void*)someData fromDecoder:(ORDecoder*)aDecoder intoDataSet:(ORDataSet*)aDataSet +{ + uint32_t *dataPtr = (uint32_t*)someData; + union { + float asFloat; + uint32_t asLong; + }theTemp; + + int index = 2; + theTemp.asLong = dataPtr[index]; //encoded as float, use union to convert + [aDataSet loadTimeSeries:theTemp.asFloat + atTime:dataPtr[index+1] + sender:self + withKeys:@"Defender", + [self getUnitKey:dataPtr[1] & 0x0000ffff], + nil]; + + return ExtractLength(dataPtr[0]); +} + +- (NSString*) dataRecordDescription:(uint32_t*)dataPtr +{ + NSString* title= @"Defender Weight Record\n\n"; + NSString* theString = [NSString stringWithFormat:@"%@\n",title]; + union { + float asFloat; + uint32_t asLong; + }theData; + theString = [theString stringByAppendingFormat:@"HW ID = %u\n",dataPtr[1] & 0x0000ffff]; + int index = 2; + theData.asLong = dataPtr[index]; + + NSDate* date = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval)dataPtr[index+1]]; + theString = [theString stringByAppendingFormat:@"%.2f %@\n",theData.asFloat,[date stdDescription]]; + + return theString; +} +@end + + diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.h b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.h new file mode 100644 index 00000000..fbaf2ee6 --- /dev/null +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.h @@ -0,0 +1,139 @@ +//-------------------------------------------------------- +// ORDefender3000Model +// Orca +// +// Created by Mark Howe on 05/14/2024. +// Copyright 2024 CENPA, University of North Carolina. All rights reserved. +//----------------------------------------------------------- +//This program was prepared for the Regents of the University of +//North Carolina sponsored in part by the United States +//Department of Energy (DOE) under Grant #DE-FG02-97ER41020. +//The University has certain rights in the program pursuant to +//the contract and the program should not be copied or distributed +//outside your organization. The DOE and the University of +//North Carolina reserve all rights in the program. Neither the authors, +//University of North Carolina, or U.S. Government make any warranty, +//express or implied, or assume any liability or responsibility +//for the use of this software. +//------------------------------------------------------------- +#pragma mark ***Imported Files +#import "ORAdcProcessing.h" +#import "ORInFluxDBModel.h" + +@class ORSerialPort; +@class ORTimeRate; + +@interface ORDefender3000ModelNew : OrcaObject +{ + @private + NSString* portName; + ORInFluxDBModel* InFluxDB; + BOOL portWasOpen; + ORSerialPort* serialPort; + uint32_t dataId; + NSString* lastRequest; + NSMutableArray* cmdQueue; + float weight; + uint32_t timeMeasured; + int pollTime; + NSMutableString* buffer; + BOOL shipWeight; + ORTimeRate* timeRate; + uint16_t printInterval; + uint16_t tare; + uint8_t units; + uint8_t command; + uint8_t unitData; + uint8_t modeData; + + BOOL processedRunStart; + BOOL processedCloseRun; + BOOL processCheckedOnce; + float processLimitHigh; //should be set by user + float processLimitLow; + +} + +#pragma mark ***Initialization +- (id) init; +- (void) dealloc; + +- (void) registerNotificationObservers; +- (void) dataReceived:(NSNotification*)note; + +#pragma mark ***Accessors +- (ORSerialPort*) serialPort; +- (void) setSerialPort:(ORSerialPort*)aSerialPort; +- (BOOL) portWasOpen; +- (void) setPortWasOpen:(BOOL)aPortWasOpen; +- (NSString*) portName; +- (void) setPortName:(NSString*)aPortName; +- (ORTimeRate*)timeRate; +- (BOOL) shipWeight; +- (void) setShipWeight:(BOOL)aShipWeight; +- (int) pollTime; +- (void) setPollTime:(int)aPollTime; +- (NSString*) lastRequest; +- (void) setLastRequest:(NSString*)aRequest; +- (void) openPort:(BOOL)state; +- (uint32_t) timeMeasured; +- (void) setWeight:(float)aValue; +- (float) weight; +- (uint16_t) printInterval; +- (void) setPrintInterval:(uint16_t)aValue; +- (uint8_t) units; +- (void) setUnits:(uint8_t)aValue; +- (uint8_t) command; +- (void) setCommand:(uint8_t)aValue; +- (uint16_t) tare; +- (void) setTare:(uint16_t)aValue; +- (void) sendAllCommands; + +#pragma mark ***Data Records +- (void) appendDataDescription:(ORDataPacket*)aDataPacket userInfo:(NSDictionary*)userInfo; +- (NSDictionary*) dataRecordDescription; +- (uint32_t) dataId; +- (void) setDataId: (uint32_t) DataId; +- (void) setDataIds:(id)assigner; +- (void) syncDataIdsWith:(id)anotherDefender3000New; + +- (void) shipWeightData; +- (void) sendCommand; +- (NSString*) getUnitString; + +#pragma mark ***Commands +- (void) addCmdToQueue:(NSString*)aCmd; +- (void) readWeight; + +- (id) initWithCoder:(NSCoder*)decoder; +- (void) encodeWithCoder:(NSCoder*)encoder; + +#pragma mark •••Bit Processing Protocol +- (void) processIsStarting; +- (void) processIsStopping; +- (void) startProcessCycle; +- (void) endProcessCycle; +- (NSString*) identifier; +- (NSString*) processingTitle; +- (double) convertedValue:(int)aChan; +- (double) maxValueForChan:(int)aChan; +- (double) minValueForChan:(int)aChan; +- (void) getAlarmRangeLow:(double*)theLowLimit high:(double*)theHighLimit channel:(int)channel; +- (BOOL) processValue:(int)channel; +- (void) setProcessOutput:(int)channel value:(int)value; + +@end + +extern NSString* ORDefender3000ModelNewShipWeightChanged; +extern NSString* ORDefender3000ModelNewPollTimeChanged; +extern NSString* ORDefender3000ModelNewSerialPortChanged; +extern NSString* ORDefender3000NewLock; +extern NSString* ORDefender3000ModelNewPortNameChanged; +extern NSString* ORDefender3000ModelNewPortStateChanged; +extern NSString* ORDefender3000NewWeightArrayChanged; +extern NSString* ORDefender3000NewWeightChanged; +extern NSString* ORDefender3000NewPrintIntervalChanged; +extern NSString* ORDefender3000NewUnitsChanged; +extern NSString* ORDefender3000NewCommandChanged; +extern NSString* ORDefender3000NewTareChanged; +extern NSString* ORDefender3000ModelNewUnitDataChanged; diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.m b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.m new file mode 100644 index 00000000..3fc90f40 --- /dev/null +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.m @@ -0,0 +1,737 @@ +//-------------------------------------------------------- +// ORDefender3000Model +// Orca +// +// Created by Mark Howe on 05/14/2024. +// Copyright 2024 CENPA, University of North Carolina. All rights reserved. +//----------------------------------------------------------- +//This program was prepared for the Regents of the University of +//North Carolina sponsored in part by the United States +//Department of Energy (DOE) under Grant #DE-FG02-97ER41020. +//The University has certain rights in the program pursuant to +//the contract and the program should not be copied or distributed +//outside your organization. The DOE and the University of +//North Carolina reserve all rights in the program. Neither the authors, +//University of North Carolina, or U.S. Government make any warranty, +//express or implied, or assume any liability or responsibility +//for the use of this software. +//------------------------------------------------------------- +#pragma mark ***Imported Files + +#import "ORDefender3000ModelNew.h" +#import "ORSerialPort.h" +#import "ORSerialPortList.h" +#import "ORSerialPort.h" +#import "ORSerialPortAdditions.h" +#import "ORDataTypeAssigner.h" +#import "ORDataPacket.h" +#import "ORTimeRate.h" + +#pragma mark ***External Strings +NSString* ORDefender3000ModelNewShipWeightChanged = @"ORDefender3000ModelNewShipWeightChanged"; +NSString* ORDefender3000ModelNewPollTimeChanged = @"ORDefender3000ModelNewPollTimeChanged"; +NSString* ORDefender3000ModelNewSerialPortChanged = @"ORDefender3000ModelNewSerialPortChanged"; +NSString* ORDefender3000ModelNewPortNameChanged = @"ORDefender3000ModelNewPortNameChanged"; +NSString* ORDefender3000ModelNewPortStateChanged = @"ORDefender3000ModelNewPortStateChanged"; +NSString* ORDefender3000NewWeightArrayChanged = @"ORDefender3000NewWeightArrayChanged"; +NSString* ORDefender3000NewWeightChanged = @"ORDefender3000NewWeightChanged"; +NSString* ORDefender3000NewPrintIntervalChanged = @"ORDefender3000NewPrintIntervalChanged"; +NSString* ORDefender3000NewUnitsChanged = @"ORDefender3000NewUnitsChanged"; +NSString* ORDefender3000NewCommandChanged = @"ORDefender3000NewCommandChanged"; +NSString* ORDefender3000NewTareChanged = @"ORDefender3000NewTareChanged"; +NSString* ORDefender3000ModelNewUnitDataChanged = @"ORDefender3000ModelNewUnitDataChanged"; +NSString* ORDefender3000NewLock = @"ORDefender3000NewLock"; + +@interface ORDefender3000ModelNew (private) +- (void) runStarted:(NSNotification*)aNote; +- (void) runStopped:(NSNotification*)aNote; +- (void) timeout; +- (void) processOneCommandFromQueue; +- (void) process_response:(NSString*)theResponse; +- (void) pollWeight; +- (void) setUnitData:(NSString*)theUnit; +- (void) setModeData:(NSString*)theMode; + +@end + +@implementation ORDefender3000ModelNew +- (id) init +{ + self = [super init]; + [self registerNotificationObservers]; + return self; +} + +- (void) dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + [buffer release]; + [cmdQueue release]; + [lastRequest release]; + [portName release]; + if([serialPort isOpen]){ + [serialPort close]; + } + [serialPort release]; + [timeRate release]; + + + [super dealloc]; +} + +- (void) setUpImage +{ + [self setImage:[NSImage imageNamed:@"Defender3000New.tif"]]; +} + +- (void) makeMainController +{ + [self linkToController:@"ORDefender3000ControllerNew"]; +} + +- (void) registerNotificationObservers +{ + NSNotificationCenter* notifyCenter = [NSNotificationCenter defaultCenter]; + + [notifyCenter addObserver : self + selector : @selector(dataReceived:) + name : ORSerialPortDataReceived + object : nil]; + + [notifyCenter addObserver: self + selector: @selector(runStarted:) + name: ORRunStartedNotification + object: nil]; + + [notifyCenter addObserver: self + selector: @selector(runStopped:) + name: ORRunStoppedNotification + object: nil]; + +} + +- (void) dataReceived:(NSNotification*)note +{ + if([[note userInfo] objectForKey:@"serialPort"] == serialPort){ + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; + NSString* theString = [[[[NSString alloc] initWithData:[[note userInfo] objectForKey:@"data"] + encoding:NSASCIIStringEncoding] autorelease] uppercaseString]; + + //the serial port may break the data up into small chunks, so we have to accumulate the chunks until + //we get a full piece. + theString = [[theString componentsSeparatedByString:@"\n"] componentsJoinedByString:@""]; + if(!buffer)buffer = [[NSMutableString string] retain]; + [buffer appendString:theString]; + + do { + NSRange lineRange = [buffer rangeOfString:@"\r"]; + if(lineRange.location!= NSNotFound){ + NSMutableString* theResponse = [[[buffer substringToIndex:lineRange.location+1] mutableCopy] autorelease]; + [buffer deleteCharactersInRange:NSMakeRange(0,lineRange.location+1)]; //take the cmd out of the buffer + + [self process_response:theResponse]; + + [self setLastRequest:nil]; //clear the last request + [self processOneCommandFromQueue]; //do the next command in the queue + } + } while([buffer rangeOfString:@"\r"].location!= NSNotFound); + } +} + +- (void) shipWeightData +{ + //----------------------------------------------------------------------------------- + // Data Format + //xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx + //^^^^ ^^^^ ^^^^ ^^-----------------------data id + // ^^ ^^^^ ^^^^ ^^^^ ^^^^-length in longs + // xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx + // ^^^^ ^^^^ ^^^^ ^^^^- device id + // xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx weight encoded as a float + // xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx time weight taken in seconds since Jan 1, 1970 + // xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx format data + // ^^^-- 1:g,2:kg,3:lb,4:oz,5:lb:oz + // ^^^------- 0:unknown,1:Dynamic + //------------------------------------------------------------------------------------- + if([[ORGlobal sharedGlobal] runInProgress]){ + + uint32_t data[5]; + data[0] = dataId | 5; + data[1] = ([self uniqueIdNumber]&0x0000fffff); + + union { + float asFloat; + uint32_t asLong; + }theData; + + theData.asFloat = weight; + data[2] = theData.asLong; + data[3] = timeMeasured; + + data[4] = (unitData & 0x7) << 0 | //1:g,2:kg,3:lb,4:oz,5:lb:oz + (modeData & 0x7) << 4 ; //0:Unknown,1:Dynamic + + [[NSNotificationCenter defaultCenter] postNotificationName:ORQueueRecordForShippingNotification + object:[NSData dataWithBytes:data length:sizeof(int32_t)*4]]; + } +} + + +#pragma mark ***Accessors +- (ORTimeRate*)timeRate +{ + return timeRate; +} + +- (BOOL) shipWeight +{ + return shipWeight; +} + +- (void) setShipWeight:(BOOL)aShipWeight +{ + [[[self undoManager] prepareWithInvocationTarget:self] setShipWeight:shipWeight]; + + shipWeight = aShipWeight; + + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000ModelNewShipWeightChanged object:self]; +} + +- (int) pollTime +{ + return pollTime; +} + +- (void) setPollTime:(int)aPollTime +{ + [[[self undoManager] prepareWithInvocationTarget:self] setPollTime:pollTime]; + pollTime = aPollTime; + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000ModelNewPollTimeChanged object:self]; + + if(pollTime){ + [self performSelector:@selector(pollWeight) withObject:nil afterDelay:2]; + } + else { + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(pollWeight) object:nil]; + } +} + +- (float) weight +{ + return weight; +} + +- (uint32_t) timeMeasured +{ + return timeMeasured; +} + +- (void) setWeight:(float)aValue; +{ + weight = aValue; + //get the time(UT!) + time_t ut_Time; + time(&ut_Time); + //struct tm* theTimeGMTAsStruct = gmtime(&theTime); + timeMeasured = (uint32_t)ut_Time; + + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000NewWeightChanged + object:self]; + + if(timeRate == nil) timeRate = [[ORTimeRate alloc] init]; + [timeRate addDataToTimeAverage:aValue]; +} + +- (uint8_t) command +{ + return command; +} + +- (void) setCommand:(uint8_t)aValue +{ + [[[self undoManager] prepareWithInvocationTarget:self] setCommand:command]; + + if(command>11)command=11; + + command = aValue; + + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000NewCommandChanged + object:self]; +} + +- (uint16_t) printInterval +{ + return printInterval; +} + +- (void) setPrintInterval:(uint16_t)aValue +{ + [[[self undoManager] prepareWithInvocationTarget:self] setPrintInterval:printInterval]; + + if(aValue>3600)aValue = 3600; + + printInterval = aValue; + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000NewPrintIntervalChanged + object:self]; +} + +- (uint8_t) units +{ + return units; +} + +- (void) setUnits:(uint8_t)aValue +{ + [[[self undoManager] prepareWithInvocationTarget:self] setUnits:units]; + + if(units<1) units = 1; + else if(units>5)units = 5; + + units = aValue; + + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000NewUnitsChanged + object:self]; +} +- (uint16_t) tare +{ + return tare; +} + +- (void) setTare:(uint16_t)aValue +{ + [[[self undoManager] prepareWithInvocationTarget:self] setTare:tare]; + + tare = aValue; + + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000NewTareChanged + object:self]; +} +- (NSString*) lastRequest +{ + return lastRequest; +} + +- (void) setLastRequest:(NSString*)aRequest +{ + [lastRequest autorelease]; + lastRequest = [aRequest copy]; +} + +- (BOOL) portWasOpen +{ + return portWasOpen; +} + +- (void) setPortWasOpen:(BOOL)aPortWasOpen +{ + portWasOpen = aPortWasOpen; +} + +- (NSString*) portName +{ + return portName; +} + +- (void) setPortName:(NSString*)aPortName +{ + [[[self undoManager] prepareWithInvocationTarget:self] setPortName:portName]; + + if(![aPortName isEqualToString:portName]){ + [portName autorelease]; + portName = [aPortName copy]; + + BOOL valid = NO; + NSEnumerator *enumerator = [ORSerialPortList portEnumerator]; + ORSerialPort *aPort; + while (aPort = [enumerator nextObject]) { + if([portName isEqualToString:[aPort name]]){ + [self setSerialPort:aPort]; + if(portWasOpen){ + [self openPort:YES]; + } + valid = YES; + break; + } + } + if(!valid){ + [self setSerialPort:nil]; + } + } + + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000ModelNewPortNameChanged object:self]; +} + +- (ORSerialPort*) serialPort +{ + return serialPort; +} + +- (void) setSerialPort:(ORSerialPort*)aSerialPort +{ + [aSerialPort retain]; + [serialPort release]; + serialPort = aSerialPort; + + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000ModelNewSerialPortChanged object:self]; +} + +- (void) openPort:(BOOL)state +{ + if(state) { + [serialPort open]; + [serialPort setSpeed:9600]; + [serialPort setParityNone]; + [serialPort setStopBits2:1]; + [serialPort setDataBits:8]; + [serialPort commitChanges]; + } + else [serialPort close]; + portWasOpen = [serialPort isOpen]; + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000ModelNewPortStateChanged object:self]; + +} + + +#pragma mark ***Archival +- (id) initWithCoder:(NSCoder*)decoder +{ + self = [super initWithCoder:decoder]; + [[self undoManager] disableUndoRegistration]; + [self setShipWeight: [decoder decodeBoolForKey: @"shipWeight"]]; + [self setPollTime: [decoder decodeIntForKey: @"pollTime"]]; + [self setPortWasOpen:[decoder decodeBoolForKey: @"portWasOpen"]]; + [self setPortName: [decoder decodeObjectForKey:@"portName"]]; + [self setUnits: [decoder decodeIntForKey: @"units"]]; + [self setTare: [decoder decodeIntForKey: @"tare"]]; + [self setCommand: [decoder decodeIntForKey: @"command"]]; + [self setPrintInterval: [decoder decodeIntForKey: @"printInterval"]]; + [[self undoManager] enableUndoRegistration]; + timeRate = [[ORTimeRate alloc] init]; + + [self registerNotificationObservers]; + + return self; +} + +- (void) encodeWithCoder:(NSCoder*)encoder +{ + [super encodeWithCoder:encoder]; + [encoder encodeBool:shipWeight forKey:@"shipWeight"]; + [encoder encodeInteger:pollTime forKey:@"pollTime"]; + [encoder encodeBool:portWasOpen forKey:@"portWasOpen"]; + [encoder encodeObject:portName forKey:@"portName"]; + [encoder encodeInteger:units forKey:@"units"]; + [encoder encodeInteger:command forKey:@"command"]; + [encoder encodeInteger:tare forKey:@"tare"]; + [encoder encodeInteger:printInterval forKey:@"printInterval"]; +} + +#pragma mark *** Commands +- (void) addCmdToQueue:(NSString*)aCmd +{ + if([serialPort isOpen]){ + if(!cmdQueue)cmdQueue = [[NSMutableArray array] retain]; + [cmdQueue addObject:aCmd]; + if(!lastRequest){ + [self processOneCommandFromQueue]; + } + } +} + +- (void) readWeight +{ + [self addCmdToQueue:@"P"]; + [self addCmdToQueue:@"++ShipRecords"]; +} + +#pragma mark ***Data Records +- (uint32_t) dataId { return dataId; } +- (void) setDataId: (uint32_t) DataId +{ + dataId = DataId; +} +- (void) setDataIds:(id)assigner +{ + dataId = [assigner assignDataIds:kLongForm]; +} + +- (void) syncDataIdsWith:(id)anotherDefender3000New +{ + [self setDataId:[anotherDefender3000New dataId]]; +} + +- (void) appendDataDescription:(ORDataPacket*)aDataPacket userInfo:(NSDictionary*)userInfo +{ + //---------------------------------------------------------------------------------------- + // first add our description to the data description + [aDataPacket addDataDescriptionItem:[self dataRecordDescription] forKey:@"Defender3000ModelNew"]; +} + +- (NSDictionary*) dataRecordDescription +{ + NSMutableDictionary* dataDictionary = [NSMutableDictionary dictionary]; + NSDictionary* aDictionary = [NSDictionary dictionaryWithObjectsAndKeys: + @"ORDefender3000DecoderForWeightNew",@"decoder", + [NSNumber numberWithLong:dataId], @"dataId", + [NSNumber numberWithBool:NO], @"variable", + [NSNumber numberWithLong:4], @"length", + nil]; + [dataDictionary setObject:aDictionary forKey:@"Weights"]; + + return dataDictionary; +} + +- (void) sendAllCommands +{ + [self addCmdToQueue:[NSString stringWithFormat:@"%dP",printInterval]]; + [self addCmdToQueue:[NSString stringWithFormat:@"%dT",tare]]; + [self addCmdToQueue:[NSString stringWithFormat:@"%dU",units]]; +} + +- (void) sendCommand +{ + //format the command + switch(command){ + case 0: [self addCmdToQueue:@"P"]; break; + case 1: + [self addCmdToQueue:[NSString stringWithFormat:@"%dP",printInterval]]; + //[self addCmdToQueue:@"P"]; + break; + case 2: [self addCmdToQueue:@"Z"]; break; + case 3: + [self addCmdToQueue:[NSString stringWithFormat:@"%dT",tare]]; + break; + case 4: [self addCmdToQueue:@"T"]; break; + case 5: [self addCmdToQueue:@"PU"]; break; + case 6: + [self addCmdToQueue:[NSString stringWithFormat:@"%dU",units]]; + break; + case 7: [self addCmdToQueue:@"PV"]; break; + case 8: + [self addCmdToQueue:[NSString stringWithFormat:@"%cR",0x1B]]; + break; + } +} +- (NSString*) getUnitString +{ + switch(unitData){ + case 0: return @"kg"; + case 1: return @"g"; + case 2: return @"kg"; + case 3: return @"lb"; + case 4: return @"oz"; + case 5: return @"lb"; + default:return @"kg"; + } +} +#pragma mark •••Adc Processing Protocol +- (void) processIsStarting +{ + processCheckedOnce = NO; +} + +- (void) processIsStopping +{ +} + +//note that everything called by these routines MUST be threadsafe +- (void) startProcessCycle +{ + if(!processCheckedOnce){ + @try { + [self readWeight]; + processCheckedOnce = YES; + } + @catch(NSException* localException) { + //catch this here to prevent it from falling thru, but nothing to do. + } + } +} + +- (void) endProcessCycle +{ +} + +- (NSString*) identifier +{ + return [NSString stringWithFormat:@"Defender3000New,%u",[self uniqueIdNumber]]; +} + +- (NSString*) processingTitle +{ + return [self identifier]; +} + +- (double) convertedValue:(int)aChan +{ + return weight; //chan has no meaning for this object +} + +- (double) maxValueForChan:(int)aChan +{ + return 1000; //change to max scale reading +} + +- (double) minValueForChan:(int)aChan +{ + return 0; +} + +- (BOOL) processValue:(int)channel +{ + //channel has no meaning for this object + return weight; +} + +- (void) setProcessOutput:(int)channel value:(int)value +{ + +} + +- (void)getAlarmRangeLow:(double *)theLowLimit high:(double *)theHighLimit channel:(int)channel +{ + //these values need to come from the dialog and be set by user. + *theLowLimit = -10; + *theHighLimit = 1000; +} + + +@end + +@implementation ORDefender3000ModelNew (private) +- (void) runStarted:(NSNotification*)aNote +{ +} + +- (void) runStopped:(NSNotification*)aNote +{ +} + +- (void) timeout +{ + NSLogError(@"command timeout",@"Defender 3000 New",nil); + [self setLastRequest:nil]; + [self processOneCommandFromQueue]; //do the next command in the queue +} + +- (void) processOneCommandFromQueue +{ + if([cmdQueue count] == 0) return; + NSString* aCmd = [[[cmdQueue objectAtIndex:0] retain] autorelease]; + [cmdQueue removeObjectAtIndex:0]; + if([aCmd isEqualToString:@"++ShipRecords"]){ + if(shipWeight) [self shipWeightData]; + } + else if([aCmd isEqualToString:@"++Delay"]){ + [ORTimer delay:1]; + } + else { + [self setLastRequest:aCmd]; + [self performSelector:@selector(timeout) withObject:nil afterDelay:3]; + aCmd = [aCmd stringByAppendingString:@"\r\n"]; + + [serialPort writeString:aCmd]; + if(!lastRequest){ + [self performSelector:@selector(processOneCommandFromQueue) withObject:nil afterDelay:.01]; + } + } +} + +- (void) process_response:(NSString*)theResponse +{ + //NSLog(@"%@",theResponse); + if([lastRequest isEqualToString:@"PV"]){ + } + else if([theResponse hasPrefix:@"OK"]){ + } + else if([theResponse hasPrefix:@"ES"]){ + } + else { + theResponse = [theResponse stringByReplacingOccurrencesOfString:@":" withString:@" "]; + theResponse = [theResponse removeExtraSpaces]; + theResponse = [theResponse uppercaseString]; + NSArray* components; + components = [theResponse componentsSeparatedByString:@" "]; + if([components count]>=3){ + //format is wt unit mode + //[self setWeight:[[components objectAtIndex:0]floatValue]]; + //[self setUnitData: [components objectAtIndex:1]]; + [self setModeData:[components objectAtIndex:2]]; + } + else if([components count]==2){ + [self setWeight:[[components objectAtIndex:0]floatValue]]; + [self sendDefender3000ToInflux:[[components objectAtIndex:0]doubleValue]]; + [self setUnitData: [components objectAtIndex:1]]; + + if([[components objectAtIndex:0] isEqualToString:@"UNIT"]){ + [self setUnitData: [components objectAtIndex:1]]; + } + else if([[components objectAtIndex:0] isEqualToString:@"MODE"]){ + [self setModeData: [components objectAtIndex:1]]; + } + } + } +} + +-(void)sendDefender3000ToInflux:(double)weight +{ + @autoreleasepool { + // Retrieve the InFluxDB model instance + InFluxDB = [[[(ORAppDelegate*)[NSApp delegate] document] findObjectWithFullID:@"ORInFluxDBModel,1"] retain]; + + if (InFluxDB == nil) { + NSLog(@"Error: Unable to find the InfluxDB model."); + return; + } + // Current timestamp + double currentTimeStamp = [[NSDate date] timeIntervalSince1970]; + + // Create a new measurement object for the InfluxDB bucket + ORInFluxDBMeasurement *measurement = [ORInFluxDBMeasurement measurementForBucket:@"ENAP_SC_UNC" org:[InFluxDB org]]; + + [measurement start:@"Defender3000New_1"]; + [measurement addTag:@"GasOfWeight" withString:@"weightMeasured"]; + [measurement addField:@"weight" withDouble:weight]; + + // Set the timestamp + [measurement setTimeStamp:currentTimeStamp]; + + // Execute the database command + [InFluxDB executeDBCmd:measurement]; + + // Manually release InFluxDB if using manual memory management (MRC) + [InFluxDB release]; + } +} + + + + +- (void) pollWeight +{ + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(pollWeight) object:nil]; + [self readWeight]; + [self performSelector:@selector(pollWeight) withObject:nil afterDelay:pollTime]; +} + +- (void) setUnitData:(NSString*)theUnit +{ + theUnit = 0; + if([theUnit isEqualToString: @"G"]) unitData = 1; + else if([theUnit isEqualToString:@"KG"]) unitData = 2; + else if([theUnit isEqualToString:@"LB"]) unitData = 3; + else if([theUnit isEqualToString:@"OZ"]) unitData = 4; + else if([theUnit isEqualToString:@"LB:OZ"]) unitData = 5; + else theUnit = 0; + + [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000ModelNewUnitDataChanged object:self]; +} + +- (void) setModeData:(NSString*)theMode +{ + if([theMode isEqualToString: @"DYNAMIC"]) modeData = 1; + else modeData = 0; +} + +@end From 8ab76e53249ac0e51035959fc3c6c5d8b29f4769 Mon Sep 17 00:00:00 2001 From: himal1 Date: Tue, 20 Jan 2026 13:51:59 -0500 Subject: [PATCH 06/10] Changes in new Defenfer NIB --- .../Defender3000New.nib/designable.nib | 316 +++++++----------- .../keyedobjects-101300.nib | Bin 29740 -> 27680 bytes .../Defender3000New.nib/keyedobjects.nib | Bin 38144 -> 35443 bytes 3 files changed, 126 insertions(+), 190 deletions(-) diff --git a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib index 50874208..9501abec 100644 --- a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib +++ b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib @@ -10,14 +10,11 @@ - - - @@ -33,15 +30,15 @@ - + - + - + @@ -59,7 +56,7 @@ - + @@ -68,7 +65,7 @@ - + @@ -88,7 +85,7 @@ - + @@ -96,26 +93,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - @@ -126,7 +183,7 @@ - + @@ -135,23 +192,23 @@ - + - + - + - + - + @@ -159,31 +216,11 @@ - + - - - - - - - - - - - - - - - - - - - - - + @@ -206,17 +243,8 @@ - - - - - - - - - - - - - - - - - - - - + @@ -409,7 +330,7 @@ - + @@ -420,17 +341,32 @@ - - + + - - + + + + + + + + + + + + + + + + + - + diff --git a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects-101300.nib b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects-101300.nib index 63b5a706de99cb2738b0694e8cd26820a611a144..f144c2782229c15c0d6437543acaa4ed9d166c35 100644 GIT binary patch delta 10151 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 delta 11929 zcmeHNd3ck@ng8Td9*ns$zQujn!IFG)`2Yg}Ou~JGF#?Q@?bw1q2vJ6wPm(Q5vh{HU zNCNcSmNZFA+oV_8rrB+Jkz||FHVxY(&8F?PIcd|hNy`4_{rm|DLpJ;L>9hZ=pXc|R znRl*t=6mOz!#ev5(?h>A6*nxYt?6vq(|o{TQWS*&xe1D5L-+s?HY>^xhA4_UQc)%# zUESGVJl1v2_hsRK{J6NtyPr8Ke#3iS^@!hc@jD*)eX#dkRlLu|2R!(pTU_P63Rguk z=fM>27G};x8s{N~csl3ap}Z%M$%A4N=Yh!xZ3yiMs}a^9Y(TgI;bw$e5bj0T!hd`qRc;=f?RJZ~Zr(c&={lqrAYG3- zi`=4rsr$6pg*JA(d1Q~u?L!*0*9dk}X)p6KCPlE-iZU+fY7WuD_=hlh7Jq256c z2H^>XQia=_CcJ@RqF3Yy9>^6zF&*Iygyje;5H1v4)C(vrgny|^9246G?`{-F#eTti z4hT=+kO+oSRJYfxia@&BE5@ljkcDuv%Ec6w`=+X*f2Mj$EL3@6Y@ho?hlisg_sAl!s-Gs0$sdlBC0=i;EB`wsa<{}KObF|M0Ovbuf3(#^&AZtk1VE$*Ar z-7m_Kt^g{5s&0OAc6YaTLAT4_zpVR|*o8{FQK_w)_qQXR*25#L$0tVg@KYmu`n?l- z+$SgZ1iZyPXZlz4oECeL--7(k9^T)DbVh(jh6Q|LY=EE63`D%s1DI7{Cgg>X+XGxH z2?$Yv{7U36Mcy)CxeEmv0>0C0AlwbX9;BO*?m#-Bmy5(+9!cu;ogUH~@#Z0&k8}aj zQ;@Dex)SLsq-&5~h4gBq*Yx`OH}{?vcOrhU*C$-Pyk7~P7CAvKa)UgQ7xatCL9R^+ z3gMc8$jqR6v^eNKW()FuI|??S& zh*yMsVt$DCS0lX<=}k!QK)MO(BS_zabaI%B6d*Osz2>mz{vlx@hK0H7{^4P9a&)-c zn-})MhQ<$qe!`)&ZWNkn@&;i^5 zbOK#~6WAZ-4;~12_qxKWNb2Lk4>qyY>V(&yqL9g(4Z+?UZO#7Kmr`ox*c zK99)m<7aXZ<|8aXI04~Agi{bsMK}ZDOoX=}oQ2Sa(B9|qm-QVLxAyVwrG3W&+xtSH zwm!GFqt6>S(AOJC=nn>l0lEFbGt>J$qR`dP&lDk2jL?d(1Ys${ihh2!vj07|HRATz zBOXx};i5dkPgX?yq8ech!X*fAjrdQl1U3RYfV~lapfl1f4o7(4?nw99WbM7PN3<+{ zcI>e%es0!rey$j>0ye;Y+{Mq8AW{mH0p&miPzh84vw=ClTwoqBAE*XufLfpqSO6>p z>VZYTVqghyE3gz;1}p~}fEB=P!0o_FV3iBB8dw9Y1=a!UfepY$U=y$z*aBFB_K5^kEsr8BZ zzJ^t+ni^Xj2f76#7py}bO_|z;!^$b<0zb#@1s`P`{AZSpv&*Mh z4mgb?(99#3yO!eIqO#kG*Aed_K0tgou}T~u?k7G;{2=kCh(AyK4dU+---K>es=YKaJNu_-`V(nyniSI&mWKHAOiEs1=_YOT zsM%@94j-;8E3{OWU)V6JJt?kqaZKqPllDqxjj2MLH14ehw<6<(v{X(l8EwyvDV>S_ zQ+V^3>JQW-5iawMJ0Hj{o0PB33&E0DlA(-B-|%e1puOE#`V zJjB+5skiBvSlQc1e9To4KF_2CQ*BK0D9%KD=f8@ z;v1J%k}2D;!mOq8dnZ;a)#57t@XgIhu%-9mAW1lUqj8m3Lyvka%m-DA+ z6}DkTvBrH6jbVh~8?Wp`+8^i5)Y=M0E|jCS*=Z4%$<T*c;WJ7q z$eirunBe$XmF}Y(O+;6tS9{hrbIs9Jj<%han$}j!nl4ADWo={Yen;0ObFd3yNNe{y zo$YOgXX{1%5bFaE(mn{Gp}m*=_DzFBxGrt6^xnr?< z$krc7u-sm;IIJXmS4kMc*>Q-pNAt#LFWN_#PH1n~r%yixQHVVN9;Cx*2#vWJZPGp{ zBTIA{mS`nSZfJ=Y*}bS6oe|l`^>*3qZ0vNz+1MGB3b9Xu2WfH^LPL|BH;}mTN*yT{|m}Rdy{Qn>+M@*xf9Mq5@KHm59;k92&Ewm9hGJJf;Oyt zW~xnYRHZhpro15IVdO^JJx@;d5s0LdeN=m}d~EuoNDX+(hozIP{Q?BBPWFpPOD8L< zsq9O{Unc%4@#A1L1|DeUg4}-cuyqWybjj>)*&SEnE3!m>LQDxy>yECtB9BocaLLyi zX}>G3#Mfkr5lJy6ylA9Kd$S_5_M6Zq#J&R_G+p0<(D*oVo^Skdo*4Kzw(M`COmqTe zyVpLSvXN*V*?VbmL@maQjc$Q;2_!Wq^}8`&R_sv^UaB zoc$Z3Kc`J4!WN?X%d8&!9kvMkYVtX@7~z+QFPTrkwPQV3RM3L5S72+g!QULYWY)G+ zmAalrQ%|r3sDQy3$07O2Nx#a%WRsZ zF4y&9Y=2V0`2Muj&HEgd<&MU#{hf}TmT8NYubv*)`BUsaQ0WT$HP~<$a)zP8XX5U5 z53!dZ{yKXZ{7EJ8F(u)wk`UCsQ8zNtT3N0=TbJj01zCm*Niz;#zkv{E(bdh)R!7_c z>{Vnu!j@2WPirIYcXW5ZPP^BTe}(-PY-lIHIcfJhL<}z=wR1`Jeh=X_^^%@WrYmO! zPAgVBc@_AVQrycfnR^bG()OM0 zS+4SO+KnsWN9evFmm1v<|2JK~NnO8Xbd8?nBDmqS$XR(C1qWtD>sdD>(N=8LK3`w3 z{^O4H3U&9VnC|5Ayy-yyEC;F;)Tg*$8vn>J|3dw~7t^m?Qa2suUy&L2@wHFYPyX10 ze4je|Af_|vp>8_J5B0C9U;qA*VP0WZWBQby5Pja@VMW0gj@gcIe@J>;yE<=1s=PN? z?N+ULe$G}C3Pt@7{N{E3pnJv2x*BXrt*zH=SxLXb5>d@qV6qmCItfB!fzb^nS^M;& z$_BYhQuO+0O~QR_cml42DY{zeX!g+&OMDzOIJIbX;b^YeT{89yDaT(t%odkws*EzcC~j}rs8#? zc~`Sz=Tu9Ve2eTNo$IbW9gT?5dd^L?9*I)%m&7D(TS=b0YuK$g%-hSP_pr%V9{ng^ zt$U9oIm@F^*>J$L2O4A1ov;T_BiCkG3PTIH^D-B*Gx`LVjl z6G^--$BlOf%d}$4&gQPh9WbWpv0A0$Y0wg*l|0W3Xoc?-w_?Xjt!`oRrfSE`l$L4V zuFi2yh}A%zdg3+ku4!v_c2&{SqFgmL@^SVuyfRuV@U%z=^&%|vBK_uTuRxB?hJ(61 z^vP4C%BF!|qj?Omsfa&9@3|Rth;-pV&|TZu)!bxR(b4r9J#dDY?YdGpilrH+P5B~z zg;~KEr!hd;*-VI3wh|M7uVy@*%6ITWWJI4%uXCo!@|n6wdwI>a@dL-TTTuEkHD(;2 ziXmZ~&C(jzE-leVj@|l_*;}`#vC}CR_qChEQ>+A~zs*X)SJ*r-4%+ewC1Jivdw5Q9 zVHrd!D<`fXt|YD^o=rT5c&_OJn_ForvdgPaG0l4=CbyhU3W@@Eig#o@m!t4yCa*M~ zSCogfj(OShYLFPp)81pXhc zPBbDd4SokgJfjmg5$`0Hzr~4biyqK3ud;!L;_~R>JOdBsF`3#!`L=9&Fpm*N-#X}_ z+(i%N1KH=9bUVf*?MC-7x&6{{L}yWYOQS$D6*wCAuo^8WZ+S++7AhDT*kz+du0r_w?P(V&iJESUm5(QOSoW{FA3rX6E+lcQV?jqJ-4Sqy%X^ARpAl6?Ho}sw@ zj&KMU3}nk~((rO}pD?buA&Tpl-Jerjzw-Wy;__OjvX6i9-ALuP5N{*itc;XRG*Y68 z*r8}Mw=8qX1Dnd^@zA&&r$EoZIV*S4SS&E+_K1VFC4Ju0})^E@m6qnylW%`Kq z+q68Hs7!tbmEBLQ->k>FC_}$s%bnS{X6I2{T8T=pTPi)Cee?sHaV?)uwe-ummE!sp z-A{43WvOgD@iY@kspR{O?VyM<Mz&E#D-GX(Nn~(A0rN?#K)#JMD>T%t6_4v(9S2yFI>0et<=(elJKR!!` ztkOUKRQhM$%~@|#f8JqKD_hZ~Hw+@T94}{t;a{}#;hlFlh)(<%aI-*Y|`>o*f8(dxL#hK_KgAPCaueLlh)(9 zNk6Adl11g=Dc+>z(Z;Y0yGb+c7^_`v90#OK9&E{SpE0a@Ag;~Xk>&cQJ4hPm&5SIh zo7X?nLCRq_k`ji0loG?pwDK+0|L-d?A-XZ?N9T{>E2{=u*hig0Vtu7nGjjC*^{;7W z(P~&n{6GAf24$X3zA$xHM}iB_(^TUR#D64yo%jvnH;LaOew+9m;w!{|BK|Y+yTpGX zevkOC#D61xpZEjf4~hRS*~P9>LcxJwWhUYT;zZ&k;$-3!;#6WYaT>8a$*XJ#aXRr( z;tb+p#KVb45RW7tMQj;O!5HGP#F@n7h_ezd9NTl+wCH}5Pr2XZ2fBeCAOQ3NK_CQ# zfj*!ghyWUJ6gUPP2TlO@U6{4kWYXrh)MfJD|6rfC^%MLW~( zv@hM2?nZ~x5p*OSNB5@(&;#jmx`M8whtOtvG(Dc4Ku@8k)3fP0^dfpG{R+LDUPG^? z_s}2F`{@Jp5&8msk-koUNB>CQq<^Mw)AwbpOeJ%Xxyrm`-m!B>Px)Om<%OrR=)wJJ}uCUD-X^?~Fa; zz_>FWj3?vABr-`%GLyojGX0n;rkZJB8kxz=6lNAPn_0(fWVSNfnC;9CW+$_Yd6(JE z>|x$x4l&1>6U=Gm4D&g2p81Kn#oS}=%T;n~xsBXK?ke|^d&>jmLGlQBq&!z%Ag_>* zmXDFokuR1nkuQ~Rl)ok4BHt?CCf_eVApaEE$dAfT$WP19$UlSf1^H$9SMc|`{GR-w z{5Sa{WTT)Ja)ko^+A6#iYK5Po4U{`8!WB`9XecErk`%d$JVlYBw_=b&t0+_G6b41P zqEb<>XiyAOj8TkJEKn>|yrNj8Sgly6Sg+WicwMneu}AS9JiT9WO7WTEER-%PE-5Z6 zzEXUxxT5%0aZT}~;-=zP#RJ7d#UDyqDN|Z0S*4wlQ#vbMl%7g2rJpiD8K{g=rYp0R zMM|x*S~)^FK{-)5O*vgTTRBI$P`Sv8v9dyuR<>4lR<2fVR%$ChtIk$ktb(k9t)i@= zt&*>+K6htom5>wbEMYtd6t&5R3iLQ8XP-!t?Pe{1*E)wS>LGe#2g6zh$qn*V*sb z@7W*N8|;tlP4*}D7W*@MoBf6TmAymlW$&{0*!%1Q_96Ql`-uIW{eyk1LMp7HRJ2N_ zVpMXKLZwt$saTatWv#MN*{bYRoXTG1Kpj;%s+?5LDi@Wj%1!02@=$rIyj0#QAC<34 zjZUllRBcpkRqa&mRUK3vRh?9wRb5nFRoztns_v>DssL4>Do7Qq3Q>is!c-bnxGF*w zsftoXt725Ks-CJiRlF)em8eQmC96_Ysj4(px++7JsmfAit8!GisytP`s+X!jRj4Xb z^;Y#!^;Pv#^;Zp04OEq=%8J_6G*(reM|Oxq_Q(M_A}8dGT#zerL+;1}c_J_5jeL+V zQp0Z>)E2etom0@OwzgqVPC;UAO%3og;CA%`a|&`z`ug75szyV-$lh`#ekWal%9iiI z_29mHPC>j*XQ;0?m6@tc4I^4U%jFdGHo=W5LmyL(zIGT?cYRLv=Qm^-QmwhZcRO8` zw!Xf%DbxXVgjsh&ol%zoFgfycj<(uR z!g1*d;IW=Gv+%gZU&1MPW#T!uv~8se#A(N<{+W zXGXOWMWD#%T<_Zie5t``6jKb-Ypidmt(F#LC5lFoCs9wBNgRp?h*>t7`W3uVdL|Ji z!3t+LHfUj43JeXaP$Ei3kwrNL@I`tu73nr{o+u5aqYRXZvQRe4LAfXo<)dDx02QJl z)Eo6deNjKu9}PeQ(I8ZeN>C}%qB5T4WBDAuh#$n)@T2)z`~rSCznL%jkS$X-3LgdstTwjtG2?V(^g4OCYj6q2-M%Q;i`323ZO8 zWPrs>F#{<8A4)V-RYAWwrn17?Mx8N1Ywnj*kX%EMR1YLv&{$_M4~0RLaQ0-biB+b$ z`oh|T+Qu5a1TxD^fUq0u4fQD|vpCKs0C_f#tO)KF0350eWGG}5C7iDaKBE>`ltEuG zqPk36kaAN+qgg~CGBB7Ba2^5&dki?CRPxq5a(rz0;beT26>r1a@yLp|=E!Zt+kOcZ zhXdk_0>l~%$W{;NwggaZ44}yjv<$tBUO~&z3i$1TR>5x%AlQP&GBVG4;BTD;94255 z|HvLY@QyLsdb;h$;ho zY3?{kBzCcF;9G{K{=~5ZS|tx@G{Hz<2*A%IN1&AZy;Sq^eOPA%f;_&5~DM{=1wXJuvOprn+DcjBEv z^|0q%1}2&6>i~2Hy}D1sY4jEP8eM^P{03b`-=b>(X~GGBrIm|dgztoxwvFq6#2Z_D_{^3rvgqOYF;AjfQ||00)}E)xn?HX z3cA@QfRP!fzl8H^;UMH>1C)h8|q;gYYf%3H6|UjM|NA&aD!f~4g)MSHB=e+b`Bt>AuB81Rmr;p z+i1@_IgABn!mD|=Q|KYKLT;GFDr^nt+qBB{d zf#KcMftoQQir{v*Jv1r`nJaNSBE^8rggfF+AP2$lMIonYY%6g`6xn*}UBs#Tld1D< z#ButOaf%O<@ri37B1h8zgUA5+w!BXtaUh{%0HaFkYU_&X2uVpuW*LPBhqs`%l~{u! z`{yP4vuMnkSlkoG;dq>Y6LAvn!gu1k@ZI?Cd;lNBhwx#1_(j0* zTY&%1!F`;H(*XB>6FK5jxQ|#6(h9W|d}qF0E5zZ|#ZA0Sod?+6@Yfv_{aFV9jjqo$ zUD)4XuKnu<%l@oEbd>jhwn3m5!(TU8`=<>~=X*TUU~#IUK}{M}i^%iWO^^Pwrtu^` z@R_DLrY~u{sK)d!U^?|ro1M=GKijOlF9_RzquE7&+UzPm^x0+=1ITDC7N)<3!`eS> z`7K`aY|G02DWF`cf&Pe+KnU|4ycL**MURL#o3$fW!L@BD5{Ov*DplKocUt!8m3T)J zQNN3Ki`+Yp5Sz52k)3iaei!e-@8S3HUKB|hx9o1@9@$yNJ>Bv}B2V%KnkRpx?)Kpi zf%~>-cP-wBKf?R*0elce0<)GH0sd`~7vX6_!@wY6Zj!V(P*+=Bt*y~RD~)whvxo5~ zC7hEep5`_J`)+`ziN0KGUWE_iBjRX5bZx%+v<9;XpFll$qI%f!*+hhM7&S`MO)biA z!63;62mjxQZ<0PT4}Xa-v=-m+H!a1t+5Frm;@g}{90vm1dmy?IL2W<&7VX5>K!7_8 zBHM1*ls^LD?KHlQza!!qzJY&4i||jd9sA**(Q$km{{A9z*=FfR+!$aPa%#=h+A8sz zgA4=(Q40B38K)+4hl3KX@TmZhMEIJ(XL3}t+=1`lyF~728`n;hFOa>;lL#2CIsQYD zP)KN+e3g|Rg?l(k{38Z(b9o3#JKisjXqvGP{!K^@b&*yuQ#m^(M z`#G_T;h>Zd)ua{_6P|)C6x5O#R3QBA0m?}aXfPD$L)6rWFaZiN)>!c;pgH&mxR8KZPdfpt+(fLh;1m^3aEgk;s{j}=_%?|C$MIWKoQNqC zL2#8Yg+hqW2eWdumqd-!iKvLrX*PB&HYP={efeJ}Y zexgEB(-A95r;_;x1aPpG4Cjk^9UsYSi3)@)DiA0@WxWFf)b$44CC*M%Odf)2LKKtR ztyL48N>mf*4;U?sVFpo7s9{aY3AKc82QBkDDi>W)z$-BWxbAf7N9yLE(?uOWqy=5L zjv5sd5<#Q@$)FPi5zt=omWIf?{L%nFPf=>3BMUPDHhI(x2I%>Ex#^&~yr&Dk9eeurP~uXxQFG zJ2agO2sZ%CckX$aLKaW$E0sC@?(L?5;H52YGy$B1)jH% zRNJ^LUc^{w#|b5r6)5h!VSzwc;bX@19~DGI6isNrn9o7*-ARNJdJtU<;>mt|9Tuz< z|4f(BI$BS|Ai&I&pw(4Yn2E7Dv9_w#4AKypfLP|o@GpV*I*y;p3l3ZyLIwW*{=j8u zBWW*gl94HN>hZ+A$?z;Yp{W z$WBb)T66MnkTV+1hOB_@VF5v!z|de#Fyg1=z}Kc9jXIE@7$10=9z(xCkA=Q@TA;_# zFBXCsC<)9G>4}NZHL<2waaQ~!4)K$7?d_K#WWP)c7C{i;P&EucwO4$IS$6c6QYP=2%AoKghkSSX(}Hl~qs2tu^mNMm6i zD0@ITtFkteJPVAUF0U!e$%QiXMNih%C-#SOCn)bT8q&#{wS)5a=GtDQP8Wn^wt7QS zGL&H)vT##FdZDE}v3_U)xenu$ogQgSB;$m>80*2>j65iJfN}>zRVwKh+F`Ql8uCb+ z@SPc2Q^voId{#Bx(gI+RnOywPY*BiCWR z@>_LPBAx+E6x{*uQ{g(mL^0gl*o(jc=BQY0s3{`w1RPOZM7^;VT#>b?4F17^E)(2IRZ&yjgbV@rfF*MO5$D~?T^J4DX#`8aclNq21Kt%IX?yCL;w)At@i z>esoQAH%q%F{;nVb__gaeQ@+&tg5vBEis_=s^+%D8xfQA&)^M=g*gdvLKm6SNDY6# zfoP%YP&&_i37;>T$Ma+j2u_*cx`Y!Fw&_63YJyKZK&DE(TMf`4D`gPZDHWd60(>QB zcR5_G0W8det4&z=G=>nIZh43c(Q4Kf#t~;qy-@qy>GH*Ua*$ zt1DhR`Zq(Jv_53*43l#1=Ad!i0yYQS2v{BPdcZFM7ey!#%vJ}S4frwOOu(yf=LdQ& zy%nOycGA1(BS;P3cF`ZuJH^uL^ltdP)%;v*ijZL3nj#2(>MRsMX5V1J!Irer5+}%d zkaoywkorw99BiTNmbgkF-V%ohEdSn!TEe2uOZZ%870ZlFG4BG%DOFcih~wGPbRRI5qhYH{;S~o2pCHXEP`)@ zPmr6$9TR4F{NuDN8L28KAgX{7h@(d_PkXkYyS)eQ(xLz(& z%i?9B5NRlt2`7w(58;CnjQqto#8_F9ES&Jjma~PCNU$Z`^7%7uNrfP5G=TI8dlX8n zts7xBRTvx8qTf}WUZd*{_LYD@*b#}GMd~2*OTH*SVV5JiM)OeVnvDEmz>Z-DVPfvc z2epM=-5upWN`>gO47;a`S5?+0*k-9^7)j1>^2>WJOJA=n;w#X&e6JY>l@3-`kPATqTA z;!+#&X#66chUefV_*J|CzlC?=4OgNV~ls58`M>Ido$jc66^Li^GF5M!E1=R$;OImDH|Ku@I? z&@1UTfeRd@Ptlj@8}tL2T;?cK%lu(&(jZz?CmSMrK{g#CMAyr7LgB9Hs)&IoOf5uQPE;(0_{#ScClyx}_mwK8uQEuPqU^7%QI1nCP;OMdr#z{= zru@x{vubY@X_afGw;EwJ(`vQVE~{f!SFL_y?b(iO3|q(!W(9T;`zE`e{gV9!A{N^~ zRAIi#q~cYJRGU>FtG-e_uy(NSVx4F`(7MrjhV?q@z1Ck?|6*ff)4?XrroT;t%?z6j zHXqttw7GBVXxrU3-Bxcq)^@4wHrtc7H|?zK+S|q372A!pTVVIL-7&ixoE6uBOXRfN z3*1s}CwG>+WAA7mXrF6eZ9m<9qx~WK>kbNs4i3oCsoZfIc>U7K5!8ydaxASo4rOtbtFT2n#9bD2~s$6EeY;pO_ z<)N#$YrLz$b&Bhot|wjZxp}(9xf$H1x@~eh8##de?a`_WscOhL4L+oX=pN zc|Py?eCO-v8|!QGo#*?$@AqnFb-cPty-59$`j(%UUz%T|->ZH{{eElHu}x8%acwrW zxzLtv8{W3O?Yy@8+TLpC+b+A^=ytEQJJ;T-eRz9g`-SZfw!hb*V~0K+CUw}};d)26 zj_Dmoc6_blmz``n_3SjH)5=b#JIgzVcdqRGa_8e+s4k&hj9r#?Io6fx8rId+_2sT7 zx-s1%y47@B+3l>qwST<-Q2*Ebzv}MNJ*)e;?%TWH?9r}A{~oh@9PIH&KxjY}>~H4- z9Rf1~#|7>RydBgfNEfs;=yb46a7ysl;2ps~hja}wguD{+d8lJ(cIc$geWAaHX~N85 zZ-#xRX{RaGEYq9~cM8u7pC0~k1QU@EF*ag%#DmDN$cD%*kv~QGM^#2`jJh7(G1?Hl zI{HdXn;31(t1*{j)v=|qD`GGA^y{hZxw7Ziac$%DackqQ#dnS$9RGU!&4hpibHdhy zdx?>WV-oi!(MhREQyy-HPM^zt zd-NUC_mh4e{Y?FK^jGxn-G6QWI|Gsj%pY)dVCcY!13w$oanSHVhl)LltBUuO*p+BY z-Y#WI`;=}heWcCRuGHQsOD|hic1xG2Td4a%AE%$E|IQF&m}9tB9#cN2{CY)9#oUVT zj6IDDj5kb)rX{AI2d52QKKNc`Zsoel$5nl*HdQODORIO*IMh_ud{paGJG}NpUDvva zb(e=k4w*mXmO0bBwjS3Hs^8Jz1WM_V#!ihB8owGEJ9O#L`@?zjhS*6h0jnFmBGc zUtjF=;;!-D$BNCXRn`QKWF5eD|55wZkwl`H+9~x^GoI* zS`e~e`9gMKSGTR~uyVmF`KqC-zFpmW^}#jaYc{O)SUYX)@9S#TU0&a7{YM)#8#Zk8 z+Bowy>b1t#zI%P(>&M?ndSl0%{%^jz$z{{D&1iGu=I`Gsee1I=nOpX~9sc&4@3ens z*;dD`Q@7!5BevbzZrpx(N535>c4q9{w<~Jb)_1$VyKcAN?xlO2_so2ceQ*4GkKZ5p z{++#bdvAPD@xhgSCHu~Q*!RQJALV~^bbsdlj}N3A`0!x-!S_Fo`FQuC$U{31hacYl zN!Tabj)WfB`f2E=TaShv-F8fKY{&74?^wp8C3%)*o zMR()%|AcBJ^dH=U)KE^^6S1kd3P?}t-kx)y{Y%z@2`Il{@~!lJ`b<`Htdn& z(W2iw|Gw*w%s;+-T>bd5=t-g{(vw=*qE^zAQDmztQoX74v?jyUN_r}aY;ED1AzHX* z@l*I|V6vJHwk3(F>&rlmJDnQ5ECg~3cq-1Cx|_HFtdVy0~h7zRn?U9?;@HKsLI zK!k8blZn=fvsQ|BPHV}|Dd6q`?m;Y_)=FjDIBlFL&hfwSkN$zP6@c)8lWIxL5o3GHCVcoZ4Z7Al6NvSgn7qf0aH&AGQE-A^!?7Y5%98)ROOd9ylmY(`Q;j z2FjJq^9S$sB7U)D@&FGwV&y0WQi$eV;#(xF>b^`U8CfkWdV8AeLKx z8UHebm=p{%HRy~In*K!J5+gq)Fp4#$DE5`~Phy0BJ+vt``Fu#ECy@FpyAnpDP zRz4Le@T}|L8MlELFCgI~L~r<^Nitd{BT%O-5d%-z)?ejU5}-rKfW?Um4yvGF4WXBC zu&xJ2j2ZJqlO0`VO%FnQ!Ir*XW<%ehOTnc-L*^iJq;)c95y6wp+F|ui4C)R}bts-+ z0Y-FtD}FVi9|Fo~B1rs2?8WLhXNfsv4v_y3< zo5eP}H7w-LZ{%NZCiXsiC1QUK!UG@#Je;@*gM&n_6$I`Kh`j*RcLY5&L6!(7Qj)+1 z*c^Ktw02G+22OA2LIh2{yZI7~%v7&4$Ab*iV)Z1M5Mjk~r7$ za^eXh%$5YM5>^aX6KaQ(5M=ON6q>a)5FZMMX&PYLNC4LjoRfrG5(g)b zDdC()jS3alHIS?;iK&q|+TUN+G0n@`Q6@aKtP{zy%BF}b;i$CYHwf6i#X@joAq4F3 zypJ@tg1D#gGzy zSF_(-c0lx-@3HvJWrvV%H5e>DksXnJ%D>CM$M5C${fmHO+3}{hil@7ViM;Bjgo-I*Rt029ar zF~O(@6Uu~9Y9<`b01H?o6V1dhvDlC4$;81d&*4?T|D|)DB!HlV^A-=!n8na^az2cN zm!!jCiUw1;$zX=9L#ixpE3l=2f1gAbHa9}z+Q?;74Y@3aAV?3S*F&f-gx->~VQ|J? ztU{ub3v_0Kp$1}b$x$BZ8FEuQ{JA%wAL#*Uur5u*u{_`0Eu6ZMx+Ss(2<9-PK84~b znC2OXM=M~1BqJ8fqHkS#3XXF%kWEk&eJq#A;UIEah5r=z?NI?2@p%F+gnhBM_^&{~ zefZ-JrNa^8k3kJ5al0p5L3p?rI2Rm2)D;aJ`GQuP4xFmViBolsVHilDQa=#o5C}ns zfdS-%1)K*77rc41bRQ z5u)XO=I;YLdnDjA0cV4p7XDv~Uy*h##=w-fWa)IjW`fBBP>?{6Q~YTQUl)bZ!0;dd zh7>s^#&jzJhv|fkXflkWffohpK;1Fqb;+2{EB*d7R_spr+ zC1?UOA4U!5UO_n!i7SuK76?z;)jxS280|Z0@n^+6908)Mh5d+Do?PR@4 zJZ)UUsV&+Pp_IHT;0easDv%c;#z$uW&Y&~!Up8;yH(>L;%6}`ugXkmtc?pZxBOPF& zRDKP`uV-Fo-eBHjHZhx-x0o%=+x!LoB7cd$%zwpy&0pca;X!HX0U`a}N$`lFdz}{Y zag^0+&HCi*5-yjOFJ~@WIh3dleloa*QknREMCy%M63T>Y> z39-@800e@N)(Dr&HZ*9HAfgAjljN7lOHV9(wh4F3&7_oP@1^TU)O6Px!-Di7=Aj`K zjo~A7VS4c13>&5m9$pQ911l=^jrG-m0U;rE!-tG$G-`wDhSv`r7GMYsEvv5{rqgQl z!S!Xs;Cy6LKRKz-_TwxKzJ{Fg$`ipN3GW~;5uGAPBZeeK03K=}BJmv2@|gD-2;*ix zKzo^e%!g<{U_cJw!Zc<-;KKo+<4MfNU@H;>!9-3ds=e_wrfTu*9NZF*N0PsA*p3`y zlUR4!vhG&clPo0N<)~G>uAiGvt{tc)(c@R)K=W)CvZD zp|*_B4Pkz8aI3|)dN^Q3j{SnzRM?ykfiMRM`z$m!*683gv|h~MP%q#}0Y`vgQ^4V{ zd>|90lITt={&ygCWF>NZc^=Zeil%_wK-vN1g+!*Ymlw%<%lpVi$oqjUBUU~T&em7b zhd|sflXZmCO5dRE{9^%Q0W0QA`nye&Tm%%C9O{I{$= zqUl#&FK-~=LzY|-@{#i1%|zd9=c5 z8L)%|ilVGI)xT{Dk-rQqO0;l+H~!VurV#mBg2i;IXbQ0=Mk&Aw_`lgGMI?^r8>QsE zn@7KyhU_Ky$?z3mmn26G)Y%3tiKx}9JEdk9c9u~0ZBcLmMMgAP2ZoB42#{R6sl{0T zzdx-VP1BM+l<$6OS|7BSmMd6z4hYz##jKpAS@j+TJS6maaB`c`j%S1_!I~wBCvq)d5HFP>lWQwwD=E9rSk8aAWk2W-+T(=_ zV9yp1Cnx5CbiJer+kfW|GSL+Q!O*#Wym6EBb>qr6usM^YXqv%E4H;O`jihzUo7X=&)?g1$? zVgjTYlbko?M1!J_UgU<@d zQ6NI(6hd}EN+G}jr6(t<>!A`UKlyob3Lz~|t$uR-ZtTsXUK9rrRVS|E5d~0&O!JsojIRMJm5JaB{Wr%)PT356vm$fJp z&l}Wj5q;Q6*BQKk5#j1I!!W?C2LC)TmVt_`CWnr+H6sveagxG;z*Y@F4udR4Vg5ng z0sPHBe|fXH)?XLM+DbK^L_R*b_Tin^{k;l`TeS`vipC&ON!-ZUsVi z;}P0+ti^m>2)-B_8tNi@^cXg5Sa*{_*PQ^g`R89&Xs-F^g%mMbZbtcrzWyLVGm$D1zQg=7T^bew!;7BV=cx& ziV|K!!EyB;$f=||;*L2X`o|+k=BPsSz*pc7ZeF)6tKNuEULW6U65c}@?u-Ao`j46k zUn$6%qb8RVdljnx7cu+4h}r)|%>FN8_J0wx|BIOYU&QSH+Yz&pzmeE4q{K}cP{RU= z8&))l-~$T%D#;Wg+IYxWb7Hv)ju5pqFxX0pVFl8yl*cJdqPa6h%yz4Q17eD5x>8Yt zrYP#ra=OftmWo(SCCjRSqlsZO3i5!C>j%f`;UIEu9b}$^R9uQi#ZVH6^~40bQqd?z z=ssze%2A9Y?UH8t2sni_BMs*T7>;5rl_KDteDD8D?=DHD16guuDLa7}@urxem_Ol@2A+-!Y+|X z>=GHoD3M2u=K@Y|X_R=^Vw51(If9j8V$5@J7?i;}_dE;H`*bU-L{?+;XIiJ=e|4`^C6H3ez{ ziE%wZ1Gv=`J^@Y_a9ocH1P|krA5y91&zRn$#5N>?{6=xLMF>ct0n9Dn=2)rt21WJ; zJqgkbw+fMCe2|CY2Qez=2u}&PKacuCA_YSQJk+WpmC{_Xx257~IPgd^WxJt8aPOYt zKDaTUi9rG`9zZgWwM=8F_)YOh^x8MVJuEqUzV=I_tsv1@J}vdefVF|=MwS}%px z!GP10^~BQ0lgf~8Ua5e}xukNLRJkc(*VC2Z@Sum%1}evq%6hS~gBW}+W#N0eK2-_z z9ie_PsbAhS5-G*c)0OE%P}v+XVrBa$A=gh=S9(KrU&Va^4<_{+p#CM!nevAN zzD-dRPX$|B;w6C4NRDu28=y)tRs#N)lCm`?%2J9xKZ)<59s-u4+7Y056rg<-uso8G zt#4CStV<9iDdtoLH_+e6sthAPstks>;(w78OBs#8&oNlQH4vXjl3+>ki2|-BLGvUf z@88IL1s#c*uasSyf)p*8ub^3Q@IrKNl@zGh9HywuBw>mIuC>G|Dsv$9l`>Zut;|>U zQbNE}9gIN0Lj-IVaQ)v(_5*`}ILQ`65c6Nb2wDz+FaOKf!Y8?}o@vdJ`|7Fo{<^j1 zq*u?hW=VSWk6LR^clAtbmULH7wI&ke^T`0hyF8RrfDE=1v>pm*Jy49+eH#Da(6xth zCe%}rdc&b!F+{nLT$oSSr0+n@`A~BOsW}pA4j@tWmTID8pDd zR@PDyLjk|QGa!_b2q$=l0Wk@F0S6D)}qVAD-}!dJb&;@T7m#b7bp>r~IRy z6I(w#?H~1=)%xL=ntMJ6Y1n^(z2E`5150)fav(lLw=n};{}H5M$As&nNmfN@h83@d zuyhDY2f=-&)j%=%Gzm9^$lSlx2Az)93h7Nw?R;BOB6=E60JlZ*pyLOyCHAAWmLY6~ZM1Gvc>AUj()32>9% zXv$NcN|BQs18&mtGX(^SDYA#~TL!-!;h9Bf3WS$T0V!s=#7Q8LsG58Thiv_^aFSr) zCh#HmcnUsG7)c{AlROAb%>zb~2aF^S7)c&5l00A}c@{>Z17<=#c@X532aF`o!bo-l zGuaK_nivUD7BO&?)*lsQns*0DoaGh5F#u#N0cb{IRH z9l?%dN3o;XG3*QMSeA!08spd(+41ZIb|O28oy<;Qr?S)7>Fi7F40a|vi=EBRVdt{* z*!k=Nb|IwPSj;YAm$J*)m)Td?5`#SpuB!#?1$_}kjUczdyxH@J;WYn zKVgrspRz~UW9)JE1bdP_#hzx*u%EGK+0WT8*mLZ8NcwSsy~ti-FAI3SfENfD0#FtS zc(H(&2zaT0mkIb~0ly;Pjb=Bz#9a-QNR!t_qu@J z5b&D<-X!470)9)t5Hk0+fZq}DRsnAl@OA<35b#a`?-KC40^Tj)Jpz7D!0!uquYf-g z@IC>5DBzC-ykEcv1bk4y9}D=9fDa4!69FF)@TUSkD&S)RJ}%%B0zN6=QvyCM;4=dL zOu%Oa{JDU?5b!wxpBM0#0=^*NivqqRV3^}q0{&XSR|NcxfUgSpTLE7a@O1%yC*bb| z{DVM(mVOlQO#%NT;9COzS-`gi{EL8p74RJa-xcsZ0pAz!0|7r2@NWVJ4)?o&{}AwF zfkFa>1&R_VTA*YC#R!yKpy1tNN`bNxC|00U0%a{wHUecUP<8^v36#A+IS7=aKsgDN zvp~5Bl&e6w36#4)c>uCPwiFd-&Dn6aoE^t;_M8Lf$T@M&oD1j5xpD5C2j|Ioao(IS zr{?^)He6e-9oHT*taRi$ah}wADdcl0<8+*!GjQcx1!v?;++ePftKzD;8m^YBw~j^_k!9QPtOo}0i;6q&wikZ7=x%B5B^Kt0$EV0TyPRCC zSVrRHSE_W7drt{@h}u9Ny+A1Ugm;bghl2?uym*T25WJi55ktfK7=7S0QY_OS-oH4B zStY)8aXY+maW{md?}HpX2bsgnr;tPK6myxm!912@2tZ~aBTrj-m^=ZpIHf>do(#D` zULzkNA19v=Z&`c;-mdsQyjSs*{7d;Yc$eb$@?R7P^7Pm!Tp&wNzM=r$me>bEQ3k*p z6H6d#4|!u^g~9~yOsrPa!Fv;jDn=+qgZeN|F+nj|F%1lyvlVmU&53V8UY~=CpA3v&;i!UwHH3NaZZ$TgnfW7nBdI9N`^@8SpN{(N^QFrdchvT4lA#>O-q6h7D&U*eJ;GlftI48Eht-&E~TCY%j?8)0^$X_GSA6>w8ILL(72utOUlh4p`1> zz-~4Ht2qqs9+ciZ*aO}=NZvUZ2JagrZyS`}H5d=?8C;@TuiB;hKy?ao1pR1DS=(59 zS_fEXTlcrFupVPQ)A|+b_13$r_gkNZd_m`}FIZo;zG{8b`j+)=>tC(!Sl_k2XZ^_f z4;y4d*~o0c4zIrusd&e!S0gXZM(-D=4hZuU!bmFprAyckP^Us9pHTh;Cvcd>V~_ptY}_pw*o zx3@30FSReT*V*gs%k3-dP4<fr9+>EP|)>(I$T>!5QmIFvh7IG7v;J5)K;IMg|q z9U2^lI*fJL;jqhLx5FNX_Z;>*d;oct_B$MOIOOn&!>0~kI662wIl4HyI=VS}IC?sI zJNi2MK@O(&jvXC?9HSgF9P=IfIhHw^9BUkhIZkt25jclyEUhSN=_TTZu~esQ|vbkFI5 z(?h36PQN?-;f$Oq=Va%;&gIUP&JE5(A+OUI=dsR$^NY?CoF_R?ah~S9%z2ITdgqPK zuRHH|KInYN`4i_)osT)6a6adJ&G|d$ADn-6v2n3;v3GHFadvTaad%O>_`CFQ33Q2c zNp#6_DRL=wsdV98#<`4lndmavWva_nmuoK9UA}Yq!R1GnpImOa+;;iZ<*v&;mj^Bn zU4C=<-L->jkZXvm#x>kE(ly#O)-}#G(RHBfeAic8SGcZpUFW*N^)=TwTsOJC<+{yv zzw0^IFI_LXUUvQ3^&2;5Hy1ZIHxD;2Hy<~(TN}4_ZXMh@x#hbRxb=4HPwqdv|Kfhf{hs@M_Xq9|-5+~k588wAPJR^!FI(QS4FbQRY$WF~pr!Q+ajm#2@X+SAXojb}U0_MRO*J9~EZ^!M!H z8R!}AImENxv(a;?=P=I^o+CX+d%obwdyexQ?>W(Py61k+gPw;x4|{&%`Kjko&*Ppa zJx_an=J~njdC#vrfAW%f$-R_bte3Tyt(VEG(yPj=+N;)Uh*!N=gV#{6;a(#l1J@X@ z7re%L30_ORZhQUeb=T{@*F&%0ydHV|?oD~iyyf0XZ`Pah_Ve!I?eE>gJJ5Tuca?Xw zcMat08sc5=-RM2cdxZBW?=jv}y{CK6@SX)(yjFOx^j__~)_cA81@BAVm%YF8zT*9j z_qX2Hy}$Rq;eFHlmiJwsu0H-g-FD96sqiuRRQgo= z)cOqZx$N`Ex1Dd4?-1XmzT16w`tI_5*LRQadyobweUJJc z_dVfz()YaYufC7fYITS@PMx4mQm3fX)EVk5b-ubtJy<aFUd>d(|y)c5^Ver|pqex3cg`uY3C`X&0M`{nx;_!ar}@#`1#Aeaia3w8?j3+@sO zc{YNxf^&lNf_nuQ23G|0!7m0+2%Zu=E%>G21;Ois-wNIpd?5Hl@a5n;!S{k61pgNN zd+_5Bw~%Qe%R^R#tPEKdvL&Ct!E zTSDIn-5R<*bVumU(04=kgq{j>2y+c{5AzIDhqVc77uF%HQ&<;B9^Er6Gb}qSH>_`% zHf&hf=&+e#tHaiYtqZ_=)qpn0NS8pweEay0@m=Em<9oyh#;=H98NVuib^O}+b@A)tH$v{aH{&q5k!ok>C4zLxk-;?~6NiF*@IB%Vq;+&#RnVB*>WlqZ6l=&$O zQWmBxPFb4ra>^?y%Tr!WS(UOTWo^p(lnp5xQ{GNFlJaB9PbojA{E~7fHPgAC`Y1V1BY3^y`(?07N#vu zTbi~k?Ul6UX)DrJrtL~QpLQYbQrcH(SJJMgT}!)}9+94(UYcH!J|ul=`b+7v(r2g7 zO<$0{D1Ax#%jwJ0Urk?`zB+wv`g+JrxFvmS`u6ml>HE^JrGJ-xBmJlJpVNO$znA_X z{Zabk44gq{Fd2#rs|;0!O@>{Dea85Vi5ZhJCTC2|n3gd;V@AfTj5!%|Gv;M1%vh4K zEaT;jp+nVFe6nR%J{kPERe zvnaDTQ=2(1bA0B+%*mNkGpA?H%v_MUIrDKAmBnPqvlLlumQ5Cy<&fo+<&x!|<(cK3 z<(n0km6(;Bm70~Fm6?^3rO&F)s>!O$nw0ff))!e{W?jg-m~}bpO4heo*R#IQx{>u$ z*3VhLWZlVnlQWbMkU}5%!|p3%S+5l&P&Zp&&$fo$;->@l{X-7U|w-vW8Q+i#d%Bf zUd~&d_iEniyxnR&Uc9OJ zt>U+f_Y@x}K3)7p@y+6&i+?G;TYSIxVF_KLEK!x%K)%TrO863?WL(Mkk_jafOD300 zEty{OQpt>x*(LKz7L+V3SzNNDWNFFjl079COTH?(Qu1xd^^zY-Zk9YQRhF`)Hl=o@ zuBGit<4Y4u2bStet4fEKjx9Z0`f2I$(i5d8OV5;kUV5(d%hHRbUzJ`dy;^#$^j7K5 zrN3xZ+HTq&+CXivHdL$8MrtQ$Cu^r^r)yu*&eG1+&etx~F4iv7zM@^BU8#Ld`?~f` z?E&pI?f2Rn+MC*2+S`y76P3A_wJS?4%PH$qHn^;|Y-riEvX{zcmd!4kSGJ&RdD%N< z+sby7?JC<-_I}y%vXf<}%g&aaEBm(WC!IoPtMi7C`2byzE>st;%g_zb4bqk9%5(PP5D z=|}6w=*Q{>{fqkX`bqjJ`lDa2jZv#s6;;$~#0WWQD79B9wQ4o!x5w%I z;lBTh_v_tIHBs$UN7Y4jQv+3u8mxw?;Yz7=HA`ix*=nwu=W|uF)e4oTj;efhLKUb& zRiu7Xmvw*+)a7)ruAoD7sIH>JbcBx7eRY)Xrw8b09ivC;DLO$X>FGK}&(P^QLod*~ z^YPN>0Wy5T^t!o?D zMz)D<~N54!5K1So|EvV;oMz$rz7Q zF%gq68B;M0XJQ6s;vCGv`M40XaWO8%<(PvjaW$^Nb+`dH;%3~6+i*MX#9g=>_u@W0 zfQK*_^Y9qv<4G*UQ+Ni?;RU>m*YF13!aH~u@8d&!gir7p7UK&lL4H(<{3(C}sVoIk z1qz{1s!Ua>8r7iMRENT;9yOrG)QnnCD{4b+sXcX~uGE8iQ6GAb2GBrypN7(K8bxF1 zV;W1EEDzU7+CZCVr+3&p z>g9U{-ml(i@2q#;yX0NUT$25{4438d9Kw~jDp%)PT!-J{ z`rL?{atm(7ZMYqGr}zw?qZqidCrLXk! z`7MKFundzCGFrxnk71IrqQr>xjcv0yiIs6OLE>bhOqO_=Dv6RL$&xB*GE*`nQ|3sP z%$J3dEsJHTESDTvDXV3TtdkA0Q8vp~*(Td%r|gp5vRC%W0XZbOk|#&yxSWszDU>2P zEobC+IWHIGvRswx@`v1#+wzy(lLzv*JeH^Ok35%`K3ln@EA3u)Wn7Re=gPZ^?hRMT zRdH{+>aM1%?drI2SJ%~d4P9f`)HQc+yH>8Xd)Kvd9b6~Z#dUK%T!f2seO#35=LWcF iH^`0fdCjBUXHGeAvCh{I`|texUS-fHuk!!zlK%w}Cf#HJ literal 38144 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 s=kfWxfEV&bd<9?0-{&9mBK`^A%=i6M1*rNzvN Date: Tue, 20 Jan 2026 13:55:34 -0500 Subject: [PATCH 07/10] More update no NIB --- .../Defender3000New.nib/designable.nib | 52 +++++++++--------- .../keyedobjects-101300.nib | Bin 27680 -> 27680 bytes .../Defender3000New.nib/keyedobjects.nib | Bin 35443 -> 35443 bytes 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib index 9501abec..505247a3 100644 --- a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib +++ b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib @@ -84,15 +84,6 @@ - - - - - - - - - @@ -136,6 +127,18 @@ + + + + + + + + + + + + @@ -317,11 +320,18 @@ - + + + + + + + + - + @@ -329,13 +339,6 @@ - - - - - - - @@ -349,17 +352,14 @@ - - + + - - + + - + - - - diff --git a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects-101300.nib b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects-101300.nib index f144c2782229c15c0d6437543acaa4ed9d166c35..3ab8e10a8657a2c6b32bae2f2ac48ddc10007022 100644 GIT binary patch delta 283 zcmZ2*gK@zP#tjxyY!*5ShNecF?WCMonamA0H_1CnOYUP}U})t!4<*Z1$PGAu!#>wkL^TCFgm`_#->tr(mnrCjdd2`q#*2#e}A?&SSb?uuM#F#Ux z!Zd-5mth2vN?=kAOs0dCW^MixYsxg)HX($ub#q&SEu*{ySXK&5ZUL)7CetS+iBJBY ZC;`N5lf{!}kZJ4WKe3sc&!+^k0|1}bMt=YR delta 263 zcmZ2*gK@zP#tjxyZ00%&hGxc_?WCMonM^G=H_1CnGp0}8XC*uNp_LqC>n7{vQXEo@ z3=FMYP7IURhvu`HfixIRRtf85GXyd%%r|cio5aeV&Hz%AHQ6C1a`Vy{BSuw-CK;$! zkfairtp+Ar!OGh=|A{qa0@|mR5Wjh1f)S%UM3)3u%@(j4WU_TqlKABRi4s7}Hd#Dr R2AQ@_{u7(I`Fu(sI{`h2LFa@4YwNJHpDf2Y*^6nqhWi)pGHQHMn>O;+RgfoVl0flo84SzF*5p1 ze(3gqF<|o{cPDXfCO7tmhOkCP`v!~2g>qh#BjW?X_L`Va-Vm?I*f9B0d=r}y&>`k# zo1+p`*yVu^n9u6R`hqE&shp{aX(3Y&(_*G2OiNh<*jSjqvP_ zYd}zeHGoNh`Rn9o*%>@ce(ViE1whDbJ2@)HdGf*>8O8;ZcjaXBHiUzG699&_lZ|pC w$a8WP0q1VE$`24`8(>48PzBMZM(^=m9M+`X8SBA0G=n71poj5 delta 459 zcmex7h3WGYrVS+$Z00%&hGxc_t0dCdnM^G=Kb99$G-I}9^<(vC%4Q8@4Pu$jFrPJ) zHH`UdLw>`h2LFa@4Yduo8s0Xv!CcPDXf_If6_Mn?OFum+3Cg>qh#BjW?v%s}=UP2Lc%$XGx5QhXDeAyB}= zd~;NS3cEbBEpsr?3G-R~Szj<^GnF$nF)d{3VOq?zglQ>jAlu}*>FIpz_3ZsjZV;!j zuuPWAQ<`j&p}<_*&@g#=p6uiuc?Cj1I~y4t8^T~NY*;keD&KgsX6Ae*Ic8fX1y(;G z_GeOnTG0fw1_TvY11CSr&foz$8>j#TnZHhs%5i3_ojfZ?e)8U&3|^3L!W#m>aKU7w y+z9fVTt&dSo2~K#gc-RvcQ@T+Vt$_SYIAz)R7OUP$$#5!GHd7SZNAw)iwOWqhn5Tg From 43da39c86f1d5bed1a3af5f1cbd2eb6fd2b8b5fc Mon Sep 17 00:00:00 2001 From: himal1 Date: Tue, 20 Jan 2026 16:28:02 -0500 Subject: [PATCH 08/10] update xib --- .../Defender3000New.nib/designable.nib | 55 +++++------------- .../keyedobjects-101300.nib | Bin 27680 -> 26201 bytes .../Defender3000New.nib/keyedobjects.nib | Bin 35443 -> 33495 bytes .../ORDefender3000ControllerNew.h | 1 - .../ORDefender3000ControllerNew.m | 13 +---- .../Defender3000New/ORDefender3000ModelNew.m | 8 ++- 6 files changed, 22 insertions(+), 55 deletions(-) diff --git a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib index 505247a3..f077b7c0 100644 --- a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib +++ b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/designable.nib @@ -8,7 +8,6 @@ - @@ -136,7 +135,7 @@ - + @@ -158,8 +157,9 @@ - + + @@ -222,41 +222,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -305,7 +270,7 @@ + @@ -379,6 +355,7 @@ + diff --git a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects-101300.nib b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects-101300.nib index 3ab8e10a8657a2c6b32bae2f2ac48ddc10007022..d83fd5cd16c2933d3feeffd1ad53740f4c54eb87 100644 GIT binary patch delta 10384 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 delta 11825 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 diff --git a/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects.nib b/Source/Objects/Hardware/Serial/Defender3000New/Defender3000New.nib/keyedobjects.nib index 6c19d69e97a2a21e98515ab6eb997366a5ec247b..5b2b0a54881c132227a61f320e4760361c55772b 100644 GIT binary patch literal 33495 zcmeFacVJY-_6I(5w{O}_ufWm*Qj*v)SyXkU|IVMT#H@q9Prn zDbl1D3r(boN)bgxiUC@rtBm@_1{Z`U zEh(j)vT`zvBaMc5Tc+bkieyNR>`G~$G;Kh`$c9E^b#iS@V_uy>*JvEX7g`Lr_;TQ) zj>ZgL?~Lyw2jqylquwY81*1q5gS03al_M*911(1@&|Y*7okv&EkLV}#06j#%VT3Uj zVhMJ{PS^#zVmIuKJ7ERxhI`=%oQRX~06Y*6#zSxkHsgBSfJfkwcnltkU%;>8*YH}r z4j;y!;xF)Nd#oH52ypwLFy27g8G{JhB`-Gq^?j` zsh_D|sJqlX>UV*Iz)|2X@DO+kItT&;fr4;Bgdj!`E6@rO1ZjdoL6N{Ds1#HSY6Ojf zCc$XIOu;LHm4bDG^@4W=TLni1M+ILCE(*REToPOp{3iHaC=<$s9zq{s7h!-fP#7tU z5~d2%gn7b2!XjavaHw#EaHMdQkP$8wE)y;nt`M#iZWkUA9u=Mto)lgdUJ?E*yeSfk zWFj|_yU0W2De@9|i+n`BB0o_FQBP5zNGS>u1&cyO5uz+nwrG%Ou&7F85m`k|qG6)Z zqA{YGqE|$7L~}*!L>oo>MQ21`i*AbUi+&Y75KF~QVp{Afb`y6McN6zU4&pxIK(SgJ zBo2mjq&P+#3!lm2Jn;~5zPJF=IQ1Kx#D?{dQ-eqyjHwU zyh*%S{GNE1c(-_uc%S$q@gec&;^X2|;;+T$#CODZ#lK6igp!CPVu?f|mv~8hC4R_3 z(p9381WQ676(xz5#7JT#agumRq9jR@A<2{slnj;(krYXEl5&YjQYopH)JPg6jgpa) zQIh8+FH2@f=1bm^td?w&?2;UjoR(aad@s2w`BCz-bP$S=7D|hx2B}e6Ev=Cb zlMa_YFJ+`JN~cI)kqGCJYKGq zC&&}!N%CZQiab@GCQnDl^ijQf`)4$t`lLyjor(ua(!yhsx{a4e~~LlYE$bxO{|s zqWaDz%E}p7 zTiaNim6K3gQv+HE^ixAoR!+9r&@f16Z8A1+3Mre{Q2Z6hZ2Jy+3hsMn<;3gt#)bxS zx!G!N9NG3+IxA<88E#mOgUvOD+ToDh^BLKnU68Fwwe<~yy6LUDhK2&ZVI((0F)|j9 zV(|zTm$CRRBZ2=|e22yNSUmCs@<%Et2UO>befj?HqcmMtT)!^ zjf{{HFyfP_59*5o;F&;p^+f8TG;P0HLzC6m@)-ZMe|_yRv%y$jXe)=@W)QrDjHs0M z${v^q1=m1^Af-|XJ!q`2wOWn!$59B)lw9WBA#)5NHg*I z0;5oL33RWip|Q4_AC#pi3Pl`8vCxw^6b}@$O$!Z67%Bfu0!oAt?$^|)gJH=rHZDU6 zC<#U6W#zyZ{>c=iTTgqVRFsC&Q3lFH{ZJOlM*YzMG!W&WT$G0fp}}Yf%0~sL5EY?f zRDw!T86#)9F@2a|CYLE^hB0H9iOkE)>&yaX4YQHOaV*xdIDy5XD`;tsGg~)Ywl~Z!*_3q%;BVl+v!8yb;zQjW*Xb)iy!)jvyIUD+ozu zt;wv{S@|au&Go!oa*~*39ML$?*ictXSPX=T)R3dAFvdfd`TVvjKq_qn8C-9MDokz4 z0THy_%K=u6=cK-$uED~q0n)4-^C)PhKapPJ@WHy8#s)2r9xAT2HWBJ)*BNV4GIN^h zD|C9u=+RPOF0?P+YBtqW8*3Wd-pDl97`4zy3y6^s1~0iDBmmS;g3)S)db7;sxwTFD zO0BLwKPxAxhVZ5VBsZt2&R9PT8c|9+lfEWc&2w^l zoy`RDZE0B^+|2%%-M#j)6$SphKW=2pya; z@Pky!*fYrWvF(o*GM#B8V;mSK20rZJHewvV0p=M7j587#Yb-F^P++$?z-ps8#+ira zqXlRoS_JPv^d`ImK~8g;%1J*PK&{a%?!e-X%tdGH!d!#`FA)t>O1q369ok0`KDLiy zbdaWxA}DC=*zagRv=Y4qb-ewjEWPR}rhW&lhSseC#$5+&+n%|%0Ao)FCMOKN9qnkx z-n-Clw2+fHGS10nqt(zd*aLw}(`p)wjSaRXX({d2%+NL#%&o1p!k`6#QmQAcG|UJ} zxe;h>Z7F52xe<7v!T2=O_Q=Xlnv&7>Flzk3GL14Ri``l5VH?h_ak@A}{+Kh&#qVeu z?L!}-{pe$K03Ae!&|!209Yvp@W9U;D>(9{V=r}roPNGxj3v?QN2`cOiq}QNt(6{I; ze0~R`n3dDt2$dVm`m~xx;BK9jOi>^QoZ0}M(>66W*4EgR2uT#knxWF>mM0pmx{*++);P*&&1oEIHNrg9rrl~f!$k;G;{@fPG)}?LOeYs9 zp`$OTVK?~d?2KnJ3YzMF5?w$S(f2^VOXvr58C?OjKok&Y(h80U@SUjeu5sPSKp^C7 z=gYV-u0YCw__{in#JD|CUK-gI@pIfYbR8Zd-1hlQ2!1 z#B^*^d4IkhckDq1n&U~rW6QBS_QYN&0{?ua6Q zmztT7pILz7&~9E=7Z3{ZkMMJVTERWQ;0A<8}qwQ}s(v+Z=zC!mXtLXU_hvgsk5 zO!N>=gH2EmoQcljEc7kT#{D^=oWwK>C4~?z0U|xeD41Tflvd=D>AgiNaSqNUQrR`m z-zI+cenk9AY9UvDPz?N_JxTsTTx27EUnYnF1xTjE9=0jb-!>`QrbJwZb+{bsu>mc@ zdX6%IGDgV+GHND(QNf!d2BGIjD8;KSMS-;~FkvmgHLVmSbn62XX-5`!=O5*W*cXJV zZxAgXiLTz)lCb3GZ`Yu21lM zya3Egi|}Ho|69BSzloQk<9Hd20eQ*sTO8B91I#uJuR(Ht+Gw7SlME)Z>g#8$Y2t41 zOLU_l4c4Ld)U-v?$3#ZgGXj z*Voq$?@z`LmaI$&Enp&C#K86(|4)cRam)ZFOeT}LAWDkJ1O;}pUQGBPl~U1Q)PF}i z;q~}kya8{-n}9N#@fN%lZ$n;qJKlkJ;`i|T_yg!SESG>5)6qn{4^PAU(J6cYAH;`1 z0rJ|BTXet@lAEky-APv3pw4s6pwr;f*4NIY?_^ceoRgc@K}GAV=26^Yw9N*gU7mhs z=w>~vXkhyZs~fYyV5~{28ECAlH#We^fO{4+Z*~no6+z9g7cn*hv6_nky7#LwR@c^; z^-v*jbwBe67!tB>fL&p(&cr0RfK34bv6u*%l!*kEN@Qr4=V1}d#M1H;K%*l-m!tR- zd<=A1^B^=ZNlY@+zuoMMKjUVj6Tq;)GSS>@6a^yZ!wndDFrm_@w^ZxuEw;H5f5}Zu zF=S#=5vdIw+rGeWxB|c93XJCpjN=Q0MGz^F>kLQb<`Tc>O4KsmgSiqz#=;Pl*45VK z)e+X=N6j|LUd2DQ;i{$hDvBt`Zmcxc6OnJ=cFXuDq+5Y+;5GOrzJ-5bQkZZijmcp8 zG1=d8478bJpZ3hNfiMpd7+{_DjPsaDkO7%nsLaGNsd-sOFc+T%GQSHYKC8UVI z{b!X(IWXx@l}UFT6vT1)Ul&UMX`#MM=F^2n<*5|a=9<4Qv*VwZ`5cq=RGH4WPhJQq zl+(IYAF3}*`!?eR$hU6fGPo9iB0!S3uY5KorLt+6rIgaPV4{MkU``hMlaX#+&#Z(S zAfDBD_PbhsVnu@V0{X9nZf1&ir zt__qvl}e@kxzZoR3~rkv+}3VF@Sk6uj((&txF1B@rV@I;C zILism#%HoQFE(U@Ivv^qfYg{UiK&5qM4|Ad!tc{Nd8l$&3d}DGOn~BV6pnfOz{Q>)st9kre}0D~2atd(HO zAug`wy)|Qm*@En>{Xrwc&YCeW6*j)?8kfm%!_KcsLRDmW%dO2ckW__@9a}J3O;)<0 zA>N+6A>{O zaA`)*G%(IgB~!Il?vl=_4^2DN+! zLi9Ox93CHBX>R0efF))PzpDq+0KcGYt(M#35sQ_sK4}E3MVso4naTi-QXQ%a2?`BD zOl=l?ZT<^Ys2FR!>LhiNIz@c}b)Tlbq`sogq4_BT@E&Ps&{rdbqY#q%=s^O8){*oWNV{2b z2PQyzCgicVJqwpnrxariSXcCl6qp+nDZ1)vokAU;R)F2U!fbs;tI0$E$zQd#iL{&i zb%M8jgC!>eJ_Dfr6AZdUl8%7%M!ha62hw4XzCO%6C=1eY2vObY8npu`%&s@1kKf)+|z29Hb8#8@T?$cd@jwGB*{j zt0A4+Sf5Lth4zRiRhX00Ae{{9cPi^s$#v+j_-37z<1?U%Bmnq61+D{4BqQpZ1`;|z zA0^9;HF<=dz$22gXb{$c*Ps@B+eYvp)PPr80ULZX>=jAMgmkdq)ImxO<)~2#+OW7A{9U7@wN&H$Oq1=?h+hdMLR9@>=0ZQW9Sl@l%kTd?~e168T0-zQSG8+iDDe z8WTFM08@hkRif)~zYhp{GzO41#y0FjE*URC2Y|LynQCFLynPyVhK5 zYtKpFuC~-V6x!Oh_iZWGOvODwuSO`@3Oyv=7DAr}XwC1?Zj0^dR%&uJ&h%;OSywmv zUuDq*z1mI0$9&ZB(2RZZA4ve_+gCj4D6= zZ8@O*sAjk28;+99K&zNw_c`C}ZU~rW&Y0M#{+1CkJ%^Ce+TJG|!Pjnr za`|tq9IxlD5Dp>r6K;8$KL12Q+Q>&m%}k%Vx{{S+elynb<3q;II63QH78>72`L6Q1 za=CJi^0xA93%wM|)5@Qer<8BPooj+u1zQ9k2zCf|3XUQLeA_A5BiO;E)(GB**M^qo z+Dim4ckLyD@TcA;0i^ehHXdv%D{Xm#j0Y))j0VZyOv5T}RGy|$TOJ~`{Ch2GTTXio z!jC>DrH)-4RgMzJUXCG-@s8NBGrZJ}aggfj*u^o^(G%{bI`(i(bo6bZNArkT;R@j( zGxynE@8v@)n>mg2uM$STp3`PJTYuZiBjGAVJN-vApt-G_VF!?8z9wFWJWF>e+G)@{ zsL2eTRw54#P`?$vkA!;Ka1neXdV;jA78i13_zWHuM~Hiflf*qBw@nj>6UC|GWTX(Q z$aO%&q(eHKcVmQ!!Z4yE+x8Y( z!qb*$%V+nrtrWsqqY>7hFh`+;+PabTW>aOOg7a4>(rWYp#D=Sa8Ii2BNFIc458&2M z*yE_aseTxLO-MdOU}JJZZUExw2%wFgFeYk%5=6p0n*{5IZ1BhDga2I*<5>+f8xG!U z7EJKztFr zS9jbSjND;32Jl{)fcMG=`>YAq;3hzNy#Ut6S$G~;{Z@fFVh7%X58==8SNJ@>ihscm zDFJ0qxdFP%AFy3vR6LbI<-$J8L=6Q**97WiShg>v)=*nv$$bQtsOP9_)Lj7**a2p% zv!Jga3~*Z6f&xK>pk6ReFjX*HuoTc)I|T;>Cj{pN*98xRVxg;0A?yodlL|O2Jz%iL z38x9?3EviO6@CP`tMkH}!bc(pKv?w#R8^X2h{z-wE}A5oEm|qs0vM`OqD!KCVzJl* z_#zbeC0|?xc&KUOh2r(%-GFtvD838GCT~e^z%gY5VyRIwNitWm29Qa|C6^?>O6{bb zq-trhv;dGuE-o?I`eS&?FeUtsm_HWtm zw*Sihwu6I%zeAiufkUIi%MPm?_Bot&_|?(XF~Bj+(ct*J<9x@hj>jEuILVy4JHW{+jP|D!XdOL{o=@+fPt$juU7c0V+0NC@)12RNKIDAGMdIS`lH_7= znc%X_WuMDMSAlC+*92F+>kF>SUH7|Qaud7ta7%Nma(l^bt=loTo9-^|!R~|HN4U>- z|G@p6hrq+%BhAC=F~eh{#}^(CJv(^Ddm25bc&_t2?s?zK*DKD;=rz@Az1JzPhu#YB zByWrNE8g3@zx5IN^zs?tGu&s9&wiilzHYvezIxxOz8ihd_)&hn{091s_FLw6)bDPG zjvZ1u)ODEKVPA*q9X&e6b*$?6TE`DNUhU-CDW;RT(`%h}b^1}^u83Dy6>}6HDQzvxTsq>qik9Gd7OOGyjUB-7=-{sq`@~&ZBE4secb#K?3-8yya*KJI<)!oi?mvs;8 zUfKPP?gzTx_wV69*nhJBHvcOEC!Z5P7xtXxxrNVt z){E*D(yOx9{9d2-rh037n|m+p{dpfzpYT34eU|n)-PgWveBWVxSNA<1;1Q4+Fg{>g zz>UCefdzrD1Re-{qzqA7VSf8s<)TVgjaThd{i5!r)~n~MPX;*zB?mnpv_0rnaPMGa z@S@-^LtI1pg-j0F8}f%HR8y~6r@0#1Ewn6jLFnl)x3K~PQIBE zk}^7Fcd95gBlVTk(`g;j^l7WoZl;H(k4^t5!#*P?V_wFE%wC!GnLGPY{nGor+V7jJ z?pZZi+pr28ajrA25Hw4+B*L#|%7>h6}Ol`km2sZY?qp}%H`GrVTF zYK%6{GG4BTu9#JE#T0FN)pWHowsLmmb#sDwp7~Z)YSrSZ`<86WTb9Sx!PfQF((1D6 z9W^dBmYR=hJJyb<{k*Ps-K4s6LnDU1KJ;dNM*YeL+)&)Gz0nOerAM23Hcf0gKP+b0 z{9(TiA2fW^2nsDPNlX((lvs(+*EpO`kLU@yiu2ADf|>v1q1vX3fkmUWt9>?OD#V zM$NkTYQI;vzNUC>>T7piFMa*c?BLmp-;lr2^v1b4nRB+!?KXGj+~4O_&O0?YG?T=Q4u3Ghu-#ar_Q>&X+UtLqQ=CielYqziKyY9{P9_wFv7roo` z?vESFHhi%$W8>aUVVl-%?!I}!7S}CPx8kiMx8B@Vx$WHc{OzCbNZ+w{XXMT;?*+W~ z*882`pZ|gT2QxmDe>ma8$Gb-Dy1Tn>_w_xdJs01Tc77i9`G?12 zkMB8=c;e%eX(x}I$~yJ=7kOWNdAjKIxi1Z0Uir%U)vYtb&iwW@0}K19-_qaCKI?aO z>37e4xBi^w+z00q&mX;zbK&cY`is}TZ}|TAOA~%@_+j?tPM23*QD1rgYVy_3ek}a) z(zUv4zg?g7lk-mtZuGpd`RBNwkKP<|^U|&QTaSO4cH8^*TX%x*?7iFn?%8|Q_kO!S z^;hp--+mDG;K0Md4=?{V{CCOkbN+blkDZS)9)0t;`tf7l1pO^_ww*Oml5@+MO%+xYN88ZX;G1_LWYB7|xw^;oM7OU%=#R^mfn3@ul zynTtU>n3%J^V*PyIV=!|4xn!G=m0*?ZR(EA4#(wKLEUZ!1C$V(Cg+yn?mTHXe?UF7 z88wG9qlr=TKL_m*voZMZ1ww&{m@wOb_RO4-(jJVIon_1jW+bsu@=z{7-GldC6$Xx{ zFwSGD(gefG4a}4O!23=;5V-K(cW{rsLmZ9FaAp+owhtL-)EN|6wZn_SRcA=3Haydp zF7Off+K4fhnecx{jA=lO?gIbz#GoFuCB``B`Bq{82+x&+poN7J=P~gk6GJUHO4}h3 z2r7zTqS|2*1WMv05CjQ=p*I?UXLD!-f{1cS4I9A2gW$jfVpwJ@!w}jO=2V*N6oZXq z-F#dSiM#|+f@okS&M!%9u*`Vo1@N-w3^zCGD>-%(#0la#bR|zlE+-EjT`Gv<@U#t3 zCST;UDV;1xu~B*wGo4V{`zcHMlhBc;;dR7C)7Fa414wva-5TifL_w|~udNmR2`l+z z=0!quz>wG+_TaBk2k|rqH;yWN?AWiGE#iV=Y7;sNR`G*^5XM?GRLO zR`JAo-SCE1)3}RU9g1frfjPXFjG4+zVd`9jS|J*sYNsg#RYX$=te`1g0!=Xuh)VV{ zt;KM9r=7A8)KYr|Ly58wG-y>sS*Unrk>9ARH$F?o1tSC_ZN#3zyhe!a_wP9_(D)}^ z7cEd--gQBsx)TMH1uwQ`b-~Mm87&S9BKyQaF_W2P~gvcnyscybjjJ7RaYyHo^P|-mt+wR}1C{=EBGmz|eHT0>MJT zB52|ZAO-|eyhgAT{tu)U5;uKC1;J1frAYt+M5V%2ZS4pG#seQjZoRGskY)f~CzwAi zfF9u-5!~W6F?pl~@bC+ZrBXn_AQnrQdjMO7PO?}GJw=T187>vU2*N(Zr6O1(Sj)^H zJi-u{$*V5XID|@6%0QJ`p;AY1|MDBb<@wBE-6Ys-8`jy({Qu^#a`Y7J73^y_tcL`L zpBmOTn7J*(n#zz-Ma-O1+I{rs5N=deWK;>niq~g-ism9z0FlT_?J~3qqt_ZH$ z=)RCyP3Zm~0p4u*A~~8WxGf-n$v?ptEn*hilof#}6N-Y0QU`@_Geir#=pQ(m1y}GQ z!J}43GnhbZj%J~-6;TrKPC^CqCbOJb$-K?H!({&@07BTc z836HQ_0XdgPc>km1$y%rzz?DFPm5c_y!BLZIo9%qzb-HO&&tD#m{m`eH?Vfp|7CGJ zdq2y~EzB1d*w}k5v*Ew4R)m#8^Al=i(^G0?9kbr1R+!lw@2g;OsN#7)m?U9}c!rP* z^P7cSI2?q0ZHth|UlYEL1B7p&>B712nlD@+1b4r1k#I5e@)S;o z$%H?mMR5G3bcd`QfZo+}0CjT4gFrXZ09e*&t}q+xVIJZ$b8{5TPXMzg*wvOo2s(;f zHrJ5L9E_KLAguvFdjR1j=R4p)E0-l1POatW>y5@5!15A&JO2#1sT=Xkn@|t`0N+@T z=H}R*Z>bgl>wL9j;Q|ObXwu-^W|TdDhdT@gvn^>cm*yPq{5?35(MV=gZXIR2M4;{j z!N+U{9lnLdQH(!}BVm?}=Ke*nIELBgQZ@o6n5~e5=GG2mW(ni>4?*F;7eS$bxr9=i z&x$F?VKGIPaX2hz`Fa5SpaQh2N*M|mZ~&|b-y%n{oTzBwD%?Z3TDV5I7Bj;2f@I+a z!4whVY2zO9L2vavJ=^ZvEEVSB%(#mA{XW(WWbAUO> z9AXYLM;O=v1?p?70|=tT7*MB!!|&y_x_U!E9RPyO4Msy>g6il?%ow0J`ZjVa;f`6x zA-Rg&wB%&Pu;2itqV+KapP_4Ok$}910stLCN+VjXpRrMw2tXguPQ0_Ge_BHB(?xjO zZYCx_eJ{;0vL--RsZkq(>xTuKn!-lvH3o3$3?Hrw8c_|ODwD;~)KINb1_#%T7&@}4 zQm3vP(J*Yd(ijp_-cUVUuM0H96)4uil`f!ChAW1rlKBTK;j_PoF?S< z(D60qY7R#Xx46STh2Wtg-s=NjUzx8_~Uo^lBL z@2zdt4Wc~iJ<#dRdhc{T98HJ^wP&>w&G63;0Ir6SZf~P#M*0yW8E2yqm5azpjMi2E z?kB7iUol_XI>(%8(<>fh8fx1h6A&NZ`JM^l6IBb>lZB8#FRB+ch#JX(u{fBu$hLDT z^DXm@i;xncB7mzKZDyeM=1kFu7IWrVV$LkEk^{k=IIhdM*CT-LLkP57Gk_1YJ{1)nGP2Q<&ixfOad;V zd1#zyK5u9cE#S_UdJ#i|XrX8kZ)y+}ixz_@FM(m4ELw)MK=HpITFI&Z(`dTr9cVlZ zDlAq(g1O_-MnkTyoX8DPegJ=N^Q{3e)Z`2uESqv$&NLI{0Ou5P>ziuya7x3#ox*Nl zac34Qz-r3kPB471CJG>+PZ{$)h&qz-8h<^~y@@7+8NxOLY$9tKTC^D)vs(p+McctJ zGDGwpnkUQ`Y!ZwBn80kXocb_7FjtuC%pB$xm@=4GSS*JVvao2L4O?nE#t}@ZW68qi zzhyh(W&Lx}aY8pR*ANrVMA4U`EiKaCY&*KlTqQjQ!*SO*fV7c6<_fnh2qMy;;Y>$C z8+=2w^{ED5V}5FBaA6$Z;Ooy=e~C7?=%IU{hkj_$Lq87U zZK=G0j7&5t4Ts@Xaf?^3n}6GuBKi#!4`(0~Z5KUmZ%Yvi3Exr+nO~UOU`x5h+-$L> z{7e|^nf5HvmgZ)Q9iiD*TAFV7~h&`ISBg_~3Jkgy_E!}wp-C4{0(bApY`R)uF4T>VcU#oNojh(g#?6W1zTyCY`-0hUxwtQXERFA-($+hom4eB5sX4PUsSLVT0Fy3R zI6ND2Ee>f{^KY#+^JPapK{=k^ZIpWkTZ!Y^mG`){ynkR;6{j|nS>Pkie1gma2${vX z3|K;iK=4>iDllVSfA8yS28S)9U0%O<&G(9HfMOtXkE^EhApmd{jZa9HudwTSokjc(r&< zDNPRhH9^Q0SX1kH*K0LwZ^$XdL~{cd`og6fnLQjyjo_wXu@{RyU1*Ai^L(EypaDXQha*7F9b{S}Iq%YQH7%%3a31k)bGpC7;z zAZ_K(7~q?bb}P4#^9Ha8g>*eM5Yk>GZQ|2?xIBD1j-(CMH3rB-+FWO-Hjwm3kbZGk zlM&K_Oh``}21_kSpM-QbYg4ru(!WC5ts3Scz}(xD>y1WzC8U**wg;C zHtF&e{~baXW%5o&X0!iCUQ0YuiQ z!Zn({>Hr{r%imw#Y{~W42{N{Pj#i9g>$TQrTd&nFg(C=efi^Q+ua(b5Xxl`Dyw0>< z>$U_TrwIsc{j^PgJP5y3Ha6Bp1O^TtK0Lr|)CUlPw*39e3@thTJkh4U08(EI?G&)D z)iqfg6@;jII6u@>ui#=sDEdCh#Q*k#ZJO1l9erAYS}Dkao~Q?~h=KtJ6btBsKO5nH z^RYHq3G5ppXHK=h|>Nbu89By_byf}%xm2e*t{rfd)*k~g^1WuEUL4fnbK z+x9 zunkiY-zsMW!5zeVm+{6A&YVNel@o7VP&l_+11l`QFWirGOGS&t2RIvMH!cjN_%Jex zk5GHWN6}>QF|?4{4yI7DrXr?L-dxJ!uEg5eg}KO7=0nIjIC7j_2N6LaG?(~<_#}a9 zwc1seicfG@+}3ijUi>8~mlPAg;=ZI9zB%7Ob8w;fEYp|8{{NRQTVl>9;Vau<;>6d* zKf%@MSkK!v#kX6GgaNR12A3_1d$71CF%t$5yXH``C$V`kI8$aYXFmd06ESf=(|apE zOKlbZN^KWE6x|c7C4B;G@pDWii+eLawnT#v{~>-PeoUfF_2gV!+h3AvlH(MnnPJ%_m%nmV;NW_FS61P^H zgqqkSRA7+sC+2V#E87?(B;GcI1Tn@DmehoC?5Tk?7~`H{7m{>nZ;=RUwMhK^b`vij zXJ(c3e4^cbTiYE<+O27AcSzfItJ}02Y=~;!$sP0;?bft!cUWt?3qTxghzM@jK$v-) zb*PFM&6T0RRLx)raG`)3dbA4sg{^-iQ`^6>gGO^@aFQs|N)p-tI&zI*X91_hQi&Et z41x_31paJ?q7#lqK9V#JW3!2&SRBuwArLFUXo82@WrTBy%^CaJGM3O8| z6et}mH_h=uY<09`#yudj5i)ltnbY{p&2ihF%uGFi%ofNzoMg`6GP`iN^je6b&>Sc> zqP1`a@(+dlAtZml=9cimaGoq&-~*Y5L*}t0b2gXRxfPB5WOm7D$Uaswh{Xd){zAzA z9qkU$^I9YKK8eHTJ~2qQkkBtV=lC>Gqck)%5ujIjm8C|N~7j4U2xLorI$0E$tvRx(erUh=MF1B(Yk z3s^ja#rZ5Q_*-Fdpb>zgY|{iTgcY=)Z3CFpzk~_4hOc_EwC3*-R-FT$}n0OCxgQ8|1>BjGCHehBy&1TeAl02F&9Tq{a}h<(%W z;?^i-!u2A(AX$(n+#s3)z~MWBN3BR!v=Cg#lff-}92~P(o^;I$&ETBf2iW}=LC?)V zv(XN4(u&|vhrjp$L~w+Ki})uVjz+DL#!2I)T4{nbQJN%8mW-CXD0!uo*QD7}2>q>N zHo?@G2QixpZK0TU07$Gm(-W{zy8u-33E&>S02LF;M6?O5_9cK1CNVF9m;5}Caxvh5 zTj95Wck2vJ<{!Wvdj&k4&u|^D2j}rza39YC745`0l4!rf;ndGq=6M!(gJ_dvz5IYbzBv{4Z`R1V;PSK$Cq5dp&0@LmJ&weX!+5sN`hkXL|kJq{2g!{-M0uvPUe;Wcw@c&g^&-^F9d(pxfGda$Xy&{_>dsX(D z>~+~}*&DJsvbnN(viY(FvW2omvc<9`vNvT*Wy>JG#0uF;*;}%=WvgWG$X3hN$kxi% z$=1u>m2Hr1lx>o2mTi%3m2H!4m+gQ^6z|F2mwh1nP_|39Tee5GSGG^~k!-*0W7z@O zLD?bMVc8McQQ0T5V-T_8Guh{|U&_9cosoSl`$qPy?5ylN**V#H z*#+4}+4m6J;s@Df*%jGU*^jbovg@*+WH)3#%WleU$$pXDmfexvmEDuwm;EYxAbTkL zP4>I&57{HxV>z6Fl~ZzoTqqaG#d3*UDu=b|XcmuQF~Bp%u^6UchQ%z4$Fuka7EfUD zL>5nC@njai$l@t125V=`4Pk#WPqulf?iFo5kW+S^OG{UuW@b7QeybIV_&b z;(08d&*B9vUdZA_EMCmwB`kiE#Y!R%HnM-2II{R7Vl*7dn|sR#UHTvLl*C1@opCHVewuT z?_=>tEZ)!Jk6C~>w7N2GDcPu`~;`1!Nz~YN6{+`8`So{NvFSGaxi?6cyM;2dW z@pTse#Nrz){+Y!$S$vDdfb_Txyhe*4GKd{*Pdm_#v=dF!&a?~dO1shSvLdym<%x2I`2{ZV0`Us*MgUjr5+4Lp*kkyWEdl(>mP8_x*hw5DP7-H{tHfR636W|1 zB%LH(B;6%FAx2FA_q$u6k_hV_YOK;p z(xuY(rH7@rW%dxMrmrkmrj=#NhRCe4>7YM80U1AQlkV?9vVR6SzRk(-uOPofdU@Fu zfZS@hU${zwU$)ACU$p8Ezh#vRzhgB7e#5F(e!)&|*V%5c9c#DHZiC$>yUli6?Y7zN zu-j?(p4|s_yX^MZ?X}xy_p#j}yCZf-?T*=fYWJDlS9V|9eQU3<53!H8&$c((54WFS z|Azev`%U&A+J9z$#{Rnf0|%*t+`-Ag%fZLN&!MwJSBLHnJsh5M=1UV!+ zWH{tH6gn6jOb%uTiv!~@#bKty>kjK2-g7wM@V&!rh@K^I6hTxinWLSfgQL4+N5|fd z8i=oz;F#o?r#H}B>FxAR`hEIC zdN;k7{)j$ApP?_(KhRg`AL$3qj?T2Ri?f@vhqIS+nsd5yrgN5af9HYDxz2-}hd38F z7dcOKp6oo;`6cIgm$UWunVumls{8xV+>t-DQT$OqW?Muer>2dBbI{%RHC)E(=|@x;jIIpkA&~uIa9& zu47y$yUul;@4C=+F~kd6>$=``gX>1uO|F|=ceuXi`hn{%*FCQLTo1d+++5uJ-2&V+ zZUt_m-DbNjaa-lK*=?`er*5a*PP={McGm4XxASfn+%CFZa=Ywy)$N+wO}Ag%?zm%j z2X`lTXLnckKJEeTN_RCxAJVvoxu?4icF%V&bT_z(yPyz6n**givpoBI=6L3NmU|BM9O218Or)8f zuX`@?+~~Q>^O)yp&r6=acp)!$FHbLTh?CU8tCQC#uQ6U@y~cSlUgNzccun-0>@~&f zC9i2-FMG}Kn&~ymYmK+STjVYAmU-KG+j~2BJ9@i%yL)?jdwctOclK6$M|#J2$9ZeL zM|+R;9_RhMH|ss#dxG~Q?-#wNdQbCy*?YeCLhr@iZ+gGuy}^5v_ZEo5w8Q&`_f79x z-oJR?@xJSQ-}{00Z{B}+KlZ^s5}zoa7@t_5I3KM~f=`l9icgwPhEG4AY@a+Iz0U}r zQ9fgQ#`!Ql<9%-VI`}&I(!S2Vt`Nt`-PhCC+t=6E&$okbC*RJ#U46Ux`uq0q?dhxX zP4~_79R^XJX8X?Zo#(s2caiTB-=)59`L6ce?R(VsE8ok$Kl|SDz3qF~_rC7~Kji1& z=kFKb7wOmEPw!XfSMSIAz2G;|Z?@ljzc>9>`K|U_>$l!-L%@K5f&f#1HDDyfTbdd$ zBVc*J%7C{6-U(O}uq)upfUg6-4LBcgG2jwJVnTtkK$pOdfzJho1@;Tf4jd4e6POn` zIB;v=_P`y1I|JVj{4j8L;GV#Jf%_p|)4{;Qfky(51|AFiEbywbi?W;2U)fXHOW6k; z4WY^;Wr4CtS)wdcmMaa)eaijHkCg|Mhm=Q@pD2$hKT{r8o`iUYrs24AK2{x69abGx9aD#> zHR@1xxH>`|sg731s^isKb%HucouW=tr>is7{nS}%lX{wZiF$?lE%hq(YV{iRI`zBi zjp}Xc9qME1&(z1&C)Ho5uLp^Oq(Sl^#~?b$CCCqAEC&UVz`@}`kwNQ%-VNFiv@vLN z(3YUB5QA!G(EC9j1brB^J7{mvM?w384g?(xIuvv~=w#51;OO9#;GE#%U`z0b;HkmW zf@cKJ41Oi}wcs~`=LXLYUKqSMcxmwR;FZB|2OkPP68uT>OP&5N3;noF9?nk$;CnroV$G(T%@YJSn&(cIJA*F4ZX)cmITBh)?A8d?)t z7g`_M7}^v%EOdD2n9y;dOz8N~389lhcZKc=-5a_ubbsi_p$9_`haL?*7W!G}@zC!= z&xc+Ny%c&Q^g-xvp?`!v4#Q!BFi}`cSX`JkEFmm0EIBMCEG;Y}tY27m*nqIyu<2nl z!d?lR74~Y_>tVCQ=7h})TM)J=Y)RPiuy4b@3p*cnA?#w4;TOZd z5C0+jO8AfA*TS!d-w3}M{!94n@Vnvn!tXD1bh>z$OQ66E4 zsEDYHutZcxY>(IQ7=YK zjhYtqa@5SISy8V=y%9ApYC+VZXoqO0XgbF@s|E#C#I-Wz26ef5beFMX@+m5G#t6 z#7bjjv39Wzu}-mctV^tGtXr%{tQW*e>k`{7wr^}qY+S51HZe9iHZ?XqHZwLWwtwvS z*k!SYVtO3#i`y4>B<^h74{o0?_eb30coZ*+?-;L$?-JiF-ao!) ze6RS>_{8|+_|*6T@dfb}@zwFe;>X8NkN-XXQT$^q(o$N1R;U$grCPbxPHV4q)Y4iP zt*h2u>!J13DzxF+0&S7DL|djU*BZ1H+B)sm+HbVqYQNK-)1KE})LznF)?U$G)n3#7 zr2ScYQ~Qhdw)T$pUV>ACPeNouT!Jq$Q)-AKBb zbSvqXq&rFXl73Bkkn}L=_oPS3C>bZiiRWZdvSTux+%tK8^1|dr$%~WUOkSG2EO|xp zTgj`E-+_pAYm?U}Z%E#lyg7MG^48>C$$OG7B!8d$L-Lj6ACs>q-$=fj;*?U7QkGJl zqE9iTRHRgQfq1hNX;1nVT{{Wns$Vls8kBrL0JKFXf|@{V4}h&ZhQF z4NO&~s#AkfLsCOi!&4(uqf=v3<5Lq-lTuSsvr=nQho&~9Hl+?v9ho{hl}(+RIx}@{ z>eAF@sVh=HNIjT(HT7ERPpLnr-b%fldN=h^>f%CxuBR;R5^Tc5Tu?Y*@3(>_f5BJF%Sl`cw`q|4In(jC&B z(!J8X(|yy`={f0x(ubrMq!*=^q?e_yPv4NfIekm|*7WV^@1=i`zAJrC`o8p!(+{Q} zPX8qRi}cg!U#0(?{xHKgqhp35qf17&4F8Ot8N)M1W{k-gn=vkf&6toeDdWYAsTtEU zW@NmQ@oL8F8H+L&XS|uQJ>#p4Z!*qioXfb7@qNY*8ILl%W~O9jW@csf&m5SUlbM$} zB(pHHEOTDw`pgZPn=`j&?#Min`F-Y(nb$M#^pp0p>*vtVr=MTHPW?LPSLaX4pOHU1 ze{KHO{P*%d%-@s0FaOK@@A9waU(dghe=GlX{@wh?1=0eK0^b51Pmyo-E`Iut32x)gOQ@-GT3QWmL;(u*ubHAQtr^+kczS#s0-Ti+dIKDGn%B7DpE67MB)} zFP>67t9V86JH;D{KQ2C4e7N{%@u$U~7oREqx%gJ`?c%$|zZO3%u`6*XaVl{saWCmy z(yK&Ul2$UL#9U%2sV=E2X(*XkGP`6>$-I(IuZ<(?zs4S!`v@EPFyey(Dsw}1~t}LN!eA$GuNoAAErk1@_Hm&UC zvRBGpEqlG}jk4usE6Y}utuEVKwySJ!+5WPFWk<@6m3^iY=_ER-PNuWhIp~~pE;=`z zht5mqqs!6d=?3eD=<;<%x?)|au3Tr(Rp=^pZ|aumR_Iph-qO9JTdiBGdsnwnw^_GU z_p|Pn?zZlZ?yl}v-2>fkx<}=xoGKTVdzAMmf3CcDc|f_UJf=Lmd_Z|l`JnRra$|Xo zK2WdL2kSNZFnxqRN*|+-(`)sK`ec2oK3$)w&(inT57g)C2kD3C3-m?$5`CGzTyM}< z=qvSAdaJ%hU#G9vH|mG!N9afC$LPoD8U1+u1pQ?F6#Yy3>G~P^SM;yyUx!$e^Yjb! zi}g$O%k?YuZ|mRDuhFm5zpLM<->l!J-=Tj`|ABs&ey{!`{m1%4`lI?!^~d!m^PJcmvNq8k0P=_k|Ardy`lrn{#5rU$0qOn;ajS5lRtN@=BCrDLUYrCX&(rB|hI zWjC|8+1K3BtT1;mcQgB&dzyQh`DR&F9P)%|Dp0ny;IGHveM2Yrb!OVE)bghxu_8t`by< zsw7piD!VF&DyJ&vDz_@nDxazjRf?*vRsL1aRrRR~tWsBnRK-|=EE-F=CCUvIdA#i za@q2uCmY<07GT79e?tO{#atH1R*Yai?XQ_~rL z!~paPIHj~WEHghsb zk|Z-pW->FA$s{u~Gm}|y`sKYp;(dHUY6wwBnEJg>*+wEX6QzY1t;A`kgT2&7H$C*y z#{db2NHWYQDbkE{mkjrLz(XGKgh{4&$}^txf>*pI%QSD8VU{`OSzwVRmU+uNR#;_? z_k3WTk9^`YU)bO)n|x!7ZNBq^pZwxCfB4G||M+j7`4(8{0gEm1pocu{5lbzz+@n@l zX_d!3?g>wN%AnPrHe{`5413mdp0~j!BVO>LQ7?Jfm{+`N+%~V-VW-#a@`g9c?H!Y*95ZdkdrtV+m$}VdAdqv>NY48-y9?`a+0Os~ literal 35443 zcmeFacVHAn`#3(cdo6n@n@jH(dJCjqI_bTVgieyn-6eOVa!KfsU8IBb4hqu2LQ$%q zfC7R@M--$eqM(R~QbqYavwH~%ps&8~=l$pReRG7&?at0T^UO2PJZ+vWt*tcG)%*LO zK^RepMiL}NG9*XVecKH+nCnb6)&1IO%{rqAz7@2quc__ZuBLRbL04a=LU_XRV%9D@ zKf^G>ppUauI)xO-3Nc7o%(|z=cdr{!S8u3FuBomstkrAl4ZX!i2f;0|9k{4vF^4zW zQ{Ko1*`oHSD+)rvC=$h>c$AFvs2VLoYtUM>16@W}&~mU@SJm)b||r;bx6sEgDk>N0hWx=Y=oX<9;C(N44* z?L&8^yU}5EI2}R9(*5ZH^gz0dE~jhhA+(tuO^>6;)063G^elQdy^vl)zeX>kSJP|g zJ@iNP0s0_)l)gw`qOa38=pX4@^w0Di`hkRzC?(Dk7m26DOVU=-PSQovQxYpFlnjy- zNs1)~$wu=IrVr1XsRtn_o~1?f-H+tT~e2QsD1T4p12mbu70WnQuXS)eRj79q=# z<;%)tqh*b<*|J5l#j+)`4YJL$EwZh$ZL$NhgR)PNjqI50r0k6Btn4!=UzA;ueFcB7 z%kIk_$$pbPMmBOvOwenKA zPHvEw$t&b_@_P9&d82%+e7<~v{5APX`6~HZ`8xS}`J3`x@;&nR;pqeN)AG;c=b&^+ zep!A+{+0Y|`BnM1^6%t7%5TYkl|Pg}lK-Kg6%vJ&f>GEhScQ|qS>d7ZRQM|V6#;}sJWQx($`vlO!x3ls~jq*hia!phdl&dSBg)k_B4DI8M{!m>p3CFeJRZeUo}3*1<0%iG^5XHF)2IXL2&3+VI-@QFU~uH= zY;BdHm}S%Ag>StKWd^gMT4&%S9L>qjpl-+yb%$qqz^4-m9GDiLRikgHG&DaZe$6%4 z3^nNu<^h&=$ZZb6N5V;qS=XFiiO_I0R0#6-_lFVGn` zKH+gc9uMI0Kpq$KSj%G_j}1I7=dp>$4Llyk;}KlgS%BVv%1}8nA`?(<1*$|nVCeZZ z4Q8DI2r$u5S8uA;5_0X6ou8>KHB=U}?Ew=;Q>FeX))UMIp-#S`5@@@|EKF83(2kOe z;?QN*1=XNhGz6JZ9jZqSXejhM3=Kyk&`2~2jYf^=B{T*mmq%mK%V-=L54156K9k|^ zR5T5}0=xWl_??DkpqX%OI^3Bn)aZd00=z?$E4Ae?z0PUz1j-RL4fR=CbGfOyE~Np8 zsF-yS79ODy0<@{Rp{4<x`5?rK}a973A!k6(GILd%e{P{**IbOXKCvyM1DZP$~TP!FguWC zY#7!@TU}ol52%NZYbqNE_H$|t)hU_z4dybf4k|h~H&_7h#Z{WhtE&vv^(}8?nyL-) z0AvNMCj(4gvKf{F@Sy}lWhL~RZ7MCOY0w$twdQ`=`AOA;NcFIU^BZan=Ai&YF>6o8 znowz~tt+UBuW6{(izu^<1QvEfouMw-WES9TLXbx@WQA}yAMj9VAfON^idi24eMT*? zD1$zKL{+IUA!VlW2D3mw1TYv7a2|pOdki$8P;k~9a(H6-VI^Fo6=%cQamb3ZX31^D z*?tKXhXdh^0>T;t#8wC7wirmQ5y)gZT8dspuc2jVIsEoOE8({XEZF>pQZmju;BTFI z9Li%2_t+k*xW~}oAB5EaHb;#L2oLS14hwJWrXCd#;@?dj7}(hOpA+<30$dFIzY%SE zhM>1MjhV}|;(Bs%!a#*##$INf&`z`qy@z(AJ?MQH><4Hs+K2X|579^H06K^cp^wpF zbOe2Zj>2j_hK{2X=p;IYPNOsEETDpX81w}?k1n7u(M15@5@Mc`A;G#p_PJ)lx6KB9 zlD?c!O_rg$LA+rwn`-nXU812X=YsTS5B*#LmJENfAfou6x|n^s*9G^MQs zq!Z!+Lal=*<0|25U4A`?>cuS7CiIdD>cW>`d^Xv8%P7w;B~ zs5JoG1Rw&3c++gI8J1g92g|&snp3hg=VFg%s$^WOTAnpFGH=_PzMtv+=6Mz zsZOiXmJ^&508cm6!)!FQ1XPq&ZK$fLHtC=}vfG-58}veT0I)rW`!NFz{Gacxa)VJ%rwB9U33(BQBZt8E3= zposoC^+to4aHcvzYQm97w;o->(KrV8#IZOI$KwQ?$T@SJxGr2bt~=+?1#-b$C>M4K zDEv0i{|jgzr{Gke{oe$R_zdkM286T%Z8_JOYuAc!ICW7IFH`3Nb=UuO2Zevu0brx+ zb4?fYH<)Ywy1~*vYY-jd{GM+R){Eh<8?5=$2B&d7o@=lu#Za#%jj9FW`Rk@f|5?*` zA{X#n)2y^FX}qx7^e=Ea&j@qJJ_dmugslL`fhE^Ig0Zn1w};h%=kDBUZw-Z72d3vG7%_wgd09?9(go zj;2NZ9^Nf*?_9Fj#0`z?lxy&Ncn^Lbe}MO*2-3J^cO&=6&MNHbmM`M+BwwI;@<;4$ zKmHK7Z;N)<;Qja`d;lNBhfoACYq1gF-xhfho+fJ;7$l5Mloki-YO1QV)p}^9p;m16 z2>zs)bri(YoCaXu_3$*&mut)`@ezDffEGm8=Bv+YFbnZX)Pp0chb@;yL^#!`QJQXQ zL4FGYNiHbp|3-Wh^^v*wOMJ1l_=dk}DZb6(<~$YOW?yDm5ZK-a(Txad2k^IOC;kou zxFaC4?S@VHBM{!s;OqDX5zp{V{3BY3e}e7U7ypb-;5+d57lF$*OE<#C0Mn3NW3JLx z3g1)`5EKL{@7z9KUa2b!CmN!l1YCd5RMFd@|?VcT`Xi;5xLiRXdc7v_n}5?W76q zq>^@e!`|JZ6_2K%%uP{!6s!`C2YfEGS-Smd7`ZcQGQ)Cg8 zB!Tv(;c<-ksDK|oAU(ezf}J1@5qm;FV{2u0g8l=A`u&M1$t9;(LQPdIk>(8rrYb>M zC5%cSG0H%d5$!^diOAJel)=K`YAb8%L4omqmewjLu%QSXsEDij&uL9GeauDEsG-y_ z82gK84HV*HuB4gP1S|xG0hI)X`x88bH|wp=qWVa2e@B6&K!K#j0t{bfMGgOPN-o`$_cfYYX>cJIx8a6mk^nrQ?pF7I8VKbtwDs>bK!!- zNG(UY)zs_MG-@TaidxMXxKgg1GjSDM*hK+|7s!Ve-3at$=)QI5TZCO(*P?5#tT5XE zZmYkP1gNb|lE8B6D(Om!hZhjy7-#9YFQUG+^GM9bpc+9>A-cTQ9n|*{(N23azk3I z3zt!&0)xYe6d)RO0zo1O2q6-|Kd`G%U&FF^&|*L>8Xf915hO6NkUJHEQx2jq`N%d<#1t?f&WfxqFCH&03(Ig zf`G)#^_k#Cei4b$(R7T3#2UF7gv31PI69tAKs9vYpV^=3q-QPAbTXYH5Z8FHFbj5Q z*xm&@G@SzkHywlk*zD+qx*>-8n7;t?Ziy{G&R+rB!U&BeuQ8&C#KqDlc7@I zY{lvYl5JWwNcwdaRYH(`MVqw6id;}rQwet0AW-k2&6>)g25_*{gSoV_xs^VqdNAYG z8J@R0cLX)|X{W@}-LloVva%YpUJJe%0rX~*UzT>bXxZ*#($^cgF~DSrnUzR2)1mwl z$61zC+t^G_pjdIo(F72=MA&&lp%@U>*w}wmAQ4eCA^we@gW$W92qp9&x(LLR1Nb^j zSPA}_E~Ry}o(3Sm%oMNHRg{~Fu{oipvc?S35E+0_<{G(IKztp`P2qSI8;elBpPwIa z8QMsj=)rUaT}fBrd2}^hLyR!wX<|_!yEiH46Uz#S$_WqzP+3z>Zh`(JHawXd$Gyyr z?=4!>Kr0cvNy5F)=sM`39(rh?htk8Kj}hn?J(3;;5BD*G$RM;2;zKpDY6^BtQCN7| zsUWfw6S&r#G#uoN2D2g4zk8^Epe7(BNE3v($=UF==|`gu;3mWcoS_@(m*_FjH%IgI zSo-AxFasrmSt2bV0lFsE^h(x>o5&(=QjWd-QiSZ6YQZ810vxIW@Kbul_3PWOzgqq! z1WCAntFk+?)9UJK<8pH|$&^(Cz~pc1pL?GnOs<^vBW<<5_bVyFhgu}+-=s;)Xk z3o4>IuzMgFTx!Zpl`nvrJoKOZR8=+*xXF(X{94ylx_+C&>hqAt*qA(81-Jtw-nK`)-$}vzrZ)`{<=!>4Dt4rt)y@69#6NS!VSNo@6o z#3U#K9Fj0oeOiH~JfUuAKDiEXO3sWlCJ;EGFRArlZF(-0J3zUEp)!T^3++fVYwL4K zoA6yaw7N2z^c4%`j}3Lgc;UNDQEx0rh3kP(E~qybkY@oN*@QAvavGGAp}fIpP9@i2 zyt3Q1l>(gsPUPKz?o;48;6y&$+|Y~Q0mdj_WvDJB_yih}UqZdH7F>}vs1*L!K^)Fk zNDZoz30#GwR1O}`D)?0c1l`~_1!`5puNi98fun=eFoOxb>3-7_9u{ zxY_{s%Awq{mq4JTK=A1jXhj&vebUPfOD{F>gkI=Ne2$D$ge?JJt_CNmR)9?yJ4D?0 zOM>7xQj#f&miP<3nW4rA4Nl2_|G-ZP8B29?YrUNmn2|sawnM&bq6<~wRltGxM6nIVx_!XVq zWpK3`s4y32pI^F!v&FfsdHHX7T_f0O@B|5g5P`v2m8Nx%Z3Y_j zTOn#}C%ub4iq!CJ7rl?(DU{x%cf)6M^K-3NgoxwTD}vCc&awi?=<6*s*mAA3qzN(~ zq#ZIFq<#|)2U}KlOIjruZ%IQ0mwykUmbh-sLB!b?R;g`U+W=d+Z5P`R+c;Zn>kFSi z+gK>IwQXaYY3l-aQ*AriCfa&5@vq^Zv)yb3eiih~wHPbRRIk@Zjq{a3>G5dcdIDuQo> zPY~E@@Bm>BUqGV}i`P+>BC`*+kBQ?b8!F5>=Svr)%NiB)DBtVh|TrUTy zC2^7vh%^+-gcC-=hwwoWM}9&aVvHnF5=MAr%h3WPB5nz{eDO$Iu0oJC>OuO1Jqjh% z)Q&Kl%8m7E!SAY0tJZY~`-*=6?1)6pB6Se@B~Or_u=7z}gL$ZUO+x-i!H!`EVPbB` z8?}X9-49^ZK-_68L)DqLs8W?MwSXjA;U$0}-ZW5LfyVJ%yf6 zub|%sE^vrGO<$pJ(hnsviGxHf@q@WZg=kToWQgP?$ux)%T_@QF(V?d$UrBCD{*c;8 zJ*8cx5z;hiUun5?m~?`4zH|-5ejWg>eNB2#CWE-njxr6yUL>>3R4RamlNcRAinYg`6>A|`2&Sg;iCvtBrEzWsug1u^A#Hu?<-Cz zzEk{W#agwuim=MD(p!zNnqjrdYM0e0yUq5L?JYYiyY_Z*c13n0?dIFPV|U!{CTqoZU=vs^ z`x3i^-N~L~@7g=q2iWJ>SJ_Xq-(Y{({<=!8>Yz$e=~d%YD^(w=t~$^TZ5_qR43+Z47L+h${% zi*1>|>7v#fJi=Zem+c0SRC>Jrk$*kwtV<6Wt)pi34zY{0I7JAqvSb%9F)&ji^7B?pZO+7a|~aMxf%@N2=Jhd6{}g-i_DAM$&sCe$4I zcIXXFJ57mZspedmV_0t3w6KrErQz}6W5RcbKa2>CsE^nZ@l&KxZqYP22 zqOL}_iPlEH9(^T79a9psJmyMI-=5l@D|&t%+cs7oyC(L#xXy8d@{98~Z@{&IAp<82{A^IiLBj_fE^;rbEZS3SSFA05 zr$k!Pr({FPV{MLhh4yY~TItf#+qwkZ0^JY#Sp8i64MVhHw&A<7=(5>m*UO{J=akBS=RQ9RdSf!{csoGhss;;R1sK&cyc+JV$uC)_t zuMCM8GH=LjbB1|M9j+Txx1-(>l+vROof^hBd^I#?=#rrihV>ry&T#wT)x(dD=rUsR zi0?)wk6b-UGDLnPi%DY;w@#MU(%SqMvePs{hpaQy)*$ zO*`^Rz$*)1c{06h`mq_IGhUl1n^`^cvspc7t($E>d*tk^bF$`ao2#BXW$v%@isv1k zA3T5A0%k$Of-4I%7w%ZpZqdv|j~5#kpIs8aWaCoLrIVN5e^vkLsn=p(dwZGJvZ>1+ zEjKOy{PmRAx2@=~V*X0m%AqU2UDbQlq19ol*ROG3Gj+}HYpd5@S=VdbN9#4~*KhFL zFyjsCjfOXFygBgA6K^HHwc~BSw_o4rym9I#w5eg!_nS*Lf3_uK%l>!5-g*1o_U|s; z>acanHoR@bw%gl{+pp~Cx8vl_^qu>6Mef@AUibIb?)KfiWRKIH8SgXik9+^g2O~eY zySH}l&3)zjuI?}1f8oQvAD;Or@1tV}G7fxvF!|tzhvE)>@Nx9VyAMYk-gzYK$o5Y{ zKiPIPbu#MY`=@%I+IKqf^uaS}XFfTbefH#Mg`a(X zZs55qpX)!r{zc^%Kc63Z{zeY-f#D(JaBuk?qS%&Ly!7A`tG-3kL8aS z{@(fbU4LZ!@#T}MCr<=V53uV!3%u(UktdU?U6@qA5e6 z7zj4P%dF?WWu#q;#t}0uy}rpz+Y~MgW?JH&7tOTq(C-p6ZBxK7NFwi{WrC?OwV@m$ zgv*;uv{tOOLa=jMi*`;Pcjs{rV(GM2DB8wqV+C=J`-OY_51g%lgngp36+rru_*l7E zZZ2`J_U&cR>ebmb!v;aDn?9jR|3d#NeV9ICLE-}LHDc2KPeZ9i-}PK@P@JL9w!{pS zE1Jg--s^?jBFo?bA8^FVK@6l2%)7+5NX)y$iT6xE1DOAgw01qymx)(|{+hlDqq&BT zS)9)h%%DmQ%M%^Xa3BnEOSlExVuG6i`9@Q%x{ra#+o$O7!3g>TeG`aK2yh^lTW%@$ zDukHi4>Q&4j3Sx-MBf%7KSeYOHN`0Q74%O+gnu2hDK`0HOy8yNSunkvTT3wQ_8e6{ z6Djb#>)<)Jferz{Zz&)C*q=T;D;L&$)|i3<*@z#t7-FJa)f z3J7m({G!Q@F0rNup}k;BKOnK8@6sjU(w{C-NgQaM#7Q9VM6-5S-BW|Q%CQ#3am&Go zZg0h{;#P7~RFZfJ$_r@4VI*#Z!$>@U!>k4lvj&h#bfBlrJZ~14c+-^;;SJc))OV65=~1|2eVmB zvs=Tm+_??ho6U>8&t7q{zX9O^5CR@X+=M}a0@n%zcLu~>0O>n`9vUx6fDa0B+00NWBpnF>5m$_4fMg)Io=}P4YI#egh()LDwt){YYXnQ5Isrd2Xom}xYPu;%(f+XSG1vnC)*>WWdBnvIr-_CtRu>YUMIW-@aDX_(XD4@+tQo_dd6m+y5^DjwL6W;wql)8V2&gbDj69fRX$~ z{IcZYpEU>J#rvLXF2Az0?yuYX{?FQj=;9BbYp++$NRbj>Z7XdjZ7=O0?I`Ue?JVsg?TTEb-K2if?$RDoe`$a; zP#T1KNJFHdlv)~wrh^46LK-EFmd0RTX-{b^jPg8Q3H)C?=Sczxidiq=@QhgqO(*BW zNO(ya9Hyu@m6;4?*gC|@!nOii3i$U)bYXKNB(9BIHdT|$LI{HRKw2Gy>O$x(IU5FN z?1d^MIyqlwHW;cQ2A3S=5uYJ9wZmU{6Z#P!5P@}W0>|=vbGLBnM(mcz8X%YhNPP-~ zQ!vdV5RO*B21y_m%7SlQdRdamS&Cqp;nRtspE+2%HNFC+dm@0tlhirUR#Ha^h5-Z5Rd;sMrrgIRrq^ zVSqn5VF4#XrK#jxrycdRG@WvjW=gZ9*;Iuzm%c0Q1*~nEv{2fcj)vf%QxI$U8F!xh z5n|u?1?xo&+BiF)SAJj+`0+t&jQH=4jhBx77h^le zecp0xf&L_3IZ&ANzZzR+^Vnv<*gk6>+ZO}KsMLZo3}bUgHPYGO5NUPdRXXQsh_Q6; zbEjSxqw&&t05zO@1?519Hd zkZw5_CYIkoaqFaSO5c*cE!`;HB;73CB7KLu$X((tb62>pxUadZ+&3I3Ej=KlzdH#Y zF?6rhLOzbt8m(F1y%vu2nd%IBKN7&Nckd~aR9va-;U;Xqk zwOFC;(Ag}$M#D!@NDxOVuE5e-IdVD0d_p~L(QAt9x8 zRl{^zjXtQZbQqkEZ0aXF<@tV`MBuB*DX&}sEu!!a@)FT00yRQNVmQ#D1|kyA6D?2r zffT~HrTfrc>3->l=m1ba7SO^}=>edJgRqV#N(9i59a``Wc3ECW4+W{X%-a=^mlY)zUAT%t`+x zmLS@Jq~C$BziIKn5|iF~j@{kjezLHHwy`9p1%5;&+@FZE;llKU5H;aX_+EB1Z@5Pr zfTuU{z1#gD!aNSxUS%b4hUbh5&zy&U-l#yYg_)iXD&zCfh+yUt%?dJF*2=6vzxRw` z;STq!WpEsvA%Szvfx@UnZmzNDv?N*&0{31RttYdE4GdI7iAv@mbCfxeb0)E{YY{zh z6?c!jtCCO>G*CDlCYo7VTP|gSU4bT+%ljNyF8f!KWCDUQ;XlBN%;zt$(plD}<)i~v z?6Jkl*R;t!(gF5Q*b24pd^o}zU?Vl9hBb7gTby_02$=pr!w@v;=c{_#yTU6ujB1I>c4 z3M*Jhtzgg>XiLeuAUbQ% z<8Ux+@;D5p4`iYg65VOV{SHeVSqU6pmWy<+qsd@55O)As0g-9!WrecdvOba#vVLI8 zh>;D1v-K79VG#FAB^}|k(l=;3_k_oo$5L(!j~TE)aBuLqEgZ4ulwjUF2>R@L&X$`E zW>AoC{##Zb!SpMulhqUSAxo|Z*+^OM=0)FZ{VbsGP)6^&SO0B;-YMvg{Du#7>Xm zn>@B{Vj(=XDHK#SVZ)Rimz{vHUoZo%k{uV19*KiIWf>%4S;1ub0tGWM=?+HOA9iFS zRlGRxT6V5=-;OQ%7F)mc3<||XU_s%F2<_|EExNX7@gJBJ@c zN_gwJ5asBVs$_cYfno4 z-NVDf0>Z-s1A{|gfd$6}oF=CekgL2%UQEBt%6S|@P9a#QLhyVloOGyx@d&37pf$B{ z3gH+y_^gl&1t3IDA!Owz7XThmT2g|#4l0rI)1RlO5K?p1>ZjNLR>@vGZGdy3c93|g z0FQ%mrFilH--fbdX$3ij0P-r7%>W>jT}ioIEO!&?h~-#P)>l>Qp$>t$R$rwj<&U5| zX=sB1%5)}_CkzFt49aJq+^({r$^_*HP4GJRht;zLzgU$$Le<)i+5PbraA^Kfm zUEZQx+M-N6Z&0^I^kFAmXYc}shpAHy!+^5t{c^!r1}e6i96Higk3gu!NeUIgts0OV z3R#Ro{Q|oK`kR0L@@8|bzb=ru6>B_=e0+NC>9bF-)vSPn33mZEGoM~7U4+o~@d&w| ze|oLma)j*0A++syi}5%UdNJ15*GBZ{F>Khd?k0n-J3(mk&%dnDT=UNhE&A(D`fJ9W z8dP9yLuI|1AXNuviW6{!CgG5f!W+5bh%{x4$oe-X3)i@!iaVxH=uu>=3iuMESgCD@YW$jC$Ts@1Y2jYU`+zA6tRZC z(9tXB=o0y2x>UYYwon3jhI?|a@EBaZJWd4jVsmy2`7-%(`RgRbR41Ve#Iih2;2iqo zYT-y#L)~ejiGnV<8ZmTb4(smU-9I=)6B-Z{8UmW9e?XYVKO{IXOicm{pVEbB(i7<- zw6U>wf>CR(x6IN8`5RBCbCrC9NGf2EZxyg-NfrBixSss&Cd-6;vm}d{oZ0pMYL`a>$U{AuhxN@zn|kl)C!wFm(zFo3xQ+#D<9 z-=K)zpeI3^;Z`AXQg7rg|3Qe#Im%Hy?$4pVkVwH$4iB}eNF_H{>}{!d1`a%uOxdnz zA>6w!e*kU_XkrkLiw2O)V=dEI%72qT7Q8lMsya*FX-ghExcU2YdF+~7hwL)$3Jk5+ zkk(6}bui#GWj(R<@w76en^(x8at^6nDpqbv*!65>I6UaCuz||4q_SS9tP+CH#VmZ! z)~70& zBxs(bpL`|6qY z{<^j1q*u?iW=VSWk6LR^clBIrmULIov?eUb7cT<{?{Zg6hGnpwko8a?>w!YF?z8j{ zhpycfGoYT5)Ef@YAZ z$y-fPt!SAn7TnT>vU+g&PI=bp3rCZWKc9pbPI#P^Jd!ft4mLxOzXo{aCNPt~i?-v7 zaucNf1NlcjLkxhU^A*1+epTF6+*90FJWxDTcqzIlf}YZ<6=g;9cr04F!{h%^&jGC;p7@V?j%fYx zems1)rykqyd;oE`+A$0wc)p3pk^Gzw4?$St21Yy&ule|%!@U6gd#}j>)V6f=Ms$P8kNm|~`c(K4lsj?ps)ri>|PjEo6VV^lDeOchhj)G)Qo5XQ{Z zG4)IXGn5&|3};3#BbiamXr_^Qi5bIikVa!H^D;Az8P7~$CNh(l$;=dHDl?6Fg_+LG zU}iG2nAyx6W-c?2na?bMlpBkf#mo|BDf24x8ncX9&b-d7U{*4#nAOZ0W-YUhS z-eBHj-h$*D8<|baW@ZcX4)ZRvmD$E@XLc|}Nh?K7vFZ z2bn|6$IM~o2=fVZl=+l7#vEr(FejN)%xUHfbC&sxImdj?e8HS&EUW#Ud`h*JYLJ=bv$0r z;|)B9sJJ(I{1%Vj=J7@zZ{qQ09z)37J3M}u$6I;4jmO)0yo1L(dAy6q@9}sykN5ES zeI9?np$|e1pf|^Y{mz1TFo@<6AubiO08j{4@xv9{<7PCp?9C3iA}jQ#4OWcuLAsGM<8Wiz#@@il-Q!Qu35FPucL4El=6;6w6cg zJf-3(2cB}|DJPzC<|!ARa^)#Eo^l6bg={HG)|$0pZCN{(W$jrN>%cm)POLNQ!n(3< ztUK$$da_=u536Q<**0ujwjJ9ZGOToDJF%VFE^Jq}8|%k*XM3>zYyca`2C>0x2ph_3 z*f2JnjbJ0$Xf}rJ$;PsAY&_&;No14QWHyCOWz*PnHj~X_v)LRrm(62)vH5HPTgdii z`>=i4er$hs06UN!#1^r|YzgFZDP?u6o;9##Y&mOWP3&N{f~{n$*lMX10#4 zXB*g|>@apXJAxg_j$%i%jgSXs49l@RJC=Q!9mkGmCkRYmIY=L$blD;2u@EnpJk$ws})J{vUNN-A?$S?#TOCcjqTUn?q z9~_R#qVXm$Pwh}v5`ANmYzI$ zKD;fl4}_u&fHx)8^D3Er7lC9j3|CJvR4kdKy+fj1|Pmrs&U1q0_S`5bt2 z;%3O}b4dP^{Ac+u^1EP`d8p_MZ$2EUn5o#T_)u|C@zBZv-f@@??=l>1HO^|P)gr5v zRvWE8wEBjjn08Dc6T)biFeaRdgbY8)Oe&MkWH4Dw4wJ|9f{Z`CnLbQkra!R0R|Gb+ z6xh!SU_5Jq<-7sxW+SkgBk=A)@y&xh;H`t?or9t9zCrS~LGfLKaqynO#maTcUCMpR z(~u+RM{CO3#@fT$-#W{>zje8FqxB5y*R0oB@3KB%eGc*kU9i4reZ~5k^)2h$)_1Ib zwZ3b8&-%XgW9vU`kPT%cv60z0*tE0hY7=Y|X_IJ^Vv}Z*VN+sbvZ=Lcuo-GI%x06# zPMc3{&f46wb%*R@Jt5CnzOB}_+IFbzaN9=PmmuR1Z#&j@ob3eLNw!mLXV}iNonyP) z_D$QjZ8zC&vHigIbK7gSKik>bdD(Tf^Rw$=7ho4;7huHw<*@;Yc^>#z;hC`O3 zm+hw6&9z%(x593#-7dS+c4zI**?nPm!S15nWxG3ePgu;-up)h6bp^o+N`Mto479HU zx-SQsuK;?l0a~wP-(!xJ*xLrdsX`&&(Z2TNK3FK%}Ir=zua_s4t>{#eH*s;>F+OgKr>{#zO+3~vL_l`d}-gLa>c-!%g<1dbP z9q&6nbbRFa*ztGAKb(*g<&@;q*Qv~@!l~YADCBi&bQNvHEp-#OiI`oZZ}XB%fbXM1M{XD4SDXE$fHv!8Ph z=K$vj=LF|W=R)Ta=L%=ed93p|=Lyb}oToTnbNk~a^Bw13o$oo{ zcYf&n$oV(t-(5Pm1iA#fXk5ZvB3z zW|wU)2VBm(eCcw@<%-MKF5kF1xjMVLy1Ki1x_Y~+UE8>}bM4^T$u-Y4-?g`EAJ_h_ zgItSUwXQnX(XOw!&TyUOI>&V$WTx8TdcgIV>p9n(uD4uoyWVmA)%BiRo?E_Kfm@+l zAGdyP1Kb9>6}gqTmAdKN3~ps^weDt3-=4|7u~OVczSqys6Bi=+IY0{Xz$U{qq9d> z4?m9{9swR<9z#6pJQ_TPdJOXz;W5%T=4kH<0nsvr_58~$#`0O+IpHiD?BSbt2}Ewhj`X`)_V^19PT+1 zGH^9|zT`Q^llNTWdB^it&wHK^JRf=f=K0w3cQ49I;wAG^crjkAm##El`Uf+6M_xj%Jrq?a6+g|s)yL$V1clYk$9pD}49qb+I9p)Y39pxS4o#@@myWHF4 zUEy8jUE@8(`-=BtpLRZxK0|z#_-yyt>9fn{J)b>3??XngeLf%h9Pl~lbI9kg&nG^g z`W*8);d9dGl+Oj9Uwxja)#_k%tU6wus7_X=s?*h(>O6I!da!z^`epSj^&<5W^{eV- z>etol)LYfZ)Ss!Zsvr0&eO-OseLMSh_4V_O@lEhe^Ud?k_bv48+@!EXe=75sMa#^5c%TZ6X;?+D%%{9f?x z-~+*jf)9sKA(9YTh$4guu@12faS3T35)l#=5)%>|5+9NnvNB|K$eNI~A?ril2ze{y z?T}3&TSDFq*&4DvWJk!(koQ9Ngq#jlg}Q{gg?falL)(P53+)ivDYOeDkM0?o5tbm)xGRiSG_*M)8feKYiJjg!V%8~#Pt#qKqN&tyn(>;6n#r1}nrWKpnwgr}ngyCgnzuEZG+Q+9YPM;PYOZOnYrfaq z(%jbE(L4^b4|51}3Udi_3-bt@9yT*!j^}v2wN4l zI&5v&y0GqMN~)B zL=1_ji)e@#8Zj(lM8v3w#)y|9xClOCY{b-vS0YwN{2FmT;!(tJ5sxGOh{TbSNLi#J zl8Lm5w2QQlbc_s%)I^3yMn* zk!K^%MSdQ6KJv@ROOcl&zl!`i@@nL@$ls$1qIyU5jp`pYFlta#QB-l1HcAKC+{&X& zQ7a&)+v=z_QR|}CN4*jCR@BC*%~9_}ZH?L=^-E(Srv02=1|Pxm``FpjX553GUiOo zm6*FR_hTN${1)>^Pt-G`XWyQ~drs&%v*)Wl*YM@<2J@^ zirW(RZrrxG?QuKfcE!CHcP8#`-2J$Ralgg=9`__3$J@k@j(;hBOgtAqHvZ-Kaq$!4 zC&f>RpBg_cetP`O_}TGu;^)QBk6#eKDgI>q>G-qp=ih{zgJULP>r3tSkEKgXGurgtF!kUD&3F{NyNO(74Yr^(~y$L51PA8mA zIG6B6!i9v336~STO1PTnlo*;gFmXiUyu_~(e@}8s@=NNSRFpI%X+#pAG%aa*(#)jU zNpq4GCT&i7CuwWa_N1Lj?5HTbN#7*>nDj6iC0ivsC99KXB+p8oojfOb zUh@3p1<8w&mn6TM{95v|>7L6H_LqtVnq)_R;Kc~u46{$?Bb*gQuTk5#f@u`ziC#OzLotFAa>I}#yI45;(>b%qi zsf$vVq%KW;Ep=Jy^3)ZnyHYQtUQE55`c>-H)N85VrQS*lPs>XyNh?nqk~Ssnm9&{@ zv(o0I%}-mHwm9w8v}I|pr>#g^m9{2r9b_illD0K%d)m&l{b}E&-AKEc_EXx=X}_l3 zPkWg5IPFO~PN&nQ>GE`|bY;3tx?Q?``ndE7=@Zi@rB6wpnm#Rkdiu=t+39oA=cX@6 zU!1-){nhkk>C4k!Pv4OKR{DXAu#AX|$c(6rn2eqou^I6hi5bZmDH*9585!9bxfywo z3$Y-hFrz3#n=v+HT*icqNf}czre(~?n4hsJ<4Go!Db18+$}^cvn@l!SmFbx2oavV7 zk?ED`lNpYSRKAvyIq!*WLCjLK=u;c~|2jLVsrGc#uvWQ1Iw^KQ=BoX>O4 z=X{xSDd$Sg)!e|`kle7`@Z5;p=-k-cgxsXul-#u3%-rnU+}vKd19AuE7UeeN&d*(x zyCnD3+-141=dQ}#o%>auG>^%%&a=&9^X&5+@|^SB^1So<=2hj@V3&RdbU zE^kBLmb`;`hx0zk`#kS_-o?DjMO}*$i?WIeiYkigi$)ZUE*ewB7tJqvwP05 zsd!59wBlEarx(vEo?AS>ctP=^;>E>FidPlyDZW(vRq@s0Z;P)N|4@9Z_(_SPgekEp zu`6*YX;%_gl29_RL|0N-GPGn&$&r#zOHP!WEICzjw&e4Y^Ce%FTq^mhI)McD#0ycB*!o_7&|+?Huhq?E>v0?NaS)+U436+BdXs zYTwo#)PAS^UVBq}OM6>;2eM+KQn%7}r75M^rF}{Vm)4XHEuC8WO6iQ!S*3GJ=a()k zeYbR5>5kG}rF%+0C_Pbns`O0hxzh8c-mGiXnmu8jGouOtRJVJsGqE#qMxdtrk}1~pueNPtAC(>q<^gcUH^yvi2)mEgVdlf zq!`i+8HP+ljv?2O2d_o%ZRl(0Zy0DW87knl54DC7hH-|8hAD}3`Y&0 z8jcxG8crF`7|t2KFkCQPG+ZuoEpspPEb}V!F7qvGQ`WAmV_E02u4R5@Wo5>)!DSU? zm1Q+$wPohAhO%L0Bg#gVy<4`eY)9G7vR!3+%HA*ATlQhufwDtohs!RM-7LFRcDwAC zvU}xpxnsF=xof#cxp%o=c}#h1d3}MQc9AqpuYK=Oh!B}oI87quc#v0=gW1X?VILtW0ILg>)9Ao5- zFB``jCmN?1rx~XkXBp=j7Z?{Cml~HDR~T0r*BUn%-!#5$++^HheAl?mxWl;1xZC)? zaj$W|@gw6wI^qjijq)x-59ov4%aG@YWS>vWx= z7wFx3uimc@=tDYJ=jnW1tV{HB^NR5^WsJWGFo7n-bTpkz7t_u3Fg;DA>0_eIV3S}b znM5zre8=kK=J7 zCg5b8f=QT+shEZ{FatAj4rbweT!`7Y7?yZ&DL#M&ZQ5igU>Zsz zXcT=yqe+t`A|^+1G=|1eJdLM`lt7bd3MEl8rBXU&&}_=01(Z!oXgRH*)wGs2&?egH z9rliT1zw@|t9Qyf!x$|&(MOfp)O7_q*wZ5AhSGDgNpyo{HLk|2|1iX=(0q)M91kPOL` zIg%ywWuautVp%H7B}Z1uYFQ)eWP@y!&9YUt$#&T(yJWZQm3?wR4oR-$$x%5b$E8q; zq*zYLY585w$pyJ2SLB-fAvfig{3UngzWgnZsE}7w9UwO0J4~ z%~f^P-RrKFtK;gq1}@Y!bd6kN_m*qsn!9&gOV`T1=i0jVuA}Shy1MQz!bQ5?F3R Date: Tue, 20 Jan 2026 16:54:13 -0500 Subject: [PATCH 09/10] update defender xib --- .../Serial/Defender3000New/ORDefender3000ControllerNew.h | 1 - .../Serial/Defender3000New/ORDefender3000ControllerNew.m | 1 - 2 files changed, 2 deletions(-) diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.h b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.h index 9ac4a0b8..31c32ef4 100644 --- a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.h +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.h @@ -74,7 +74,6 @@ - (IBAction) printIntervalAction:(id)sender; - (IBAction) tareAction:(id)sender; - (IBAction) unitsAction:(id)sender; -- (IBAction) sendAllAction:(id)sender; - (int) numberPointsInPlot:(id)aPlotter; - (void) plotter:(id)aPlotter index:(int)i x:(double*)xValue y:(double*)yValue; diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.m b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.m index 48b14640..8db2efb9 100644 --- a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.m +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ControllerNew.m @@ -295,7 +295,6 @@ - (void) updateButtonStates [printIntervalField setEnabled:!locked && portOpen]; [tareField setEnabled:!locked && portOpen]; [shipWeightButton setEnabled:!locked && portOpen]; - [sendAllButton setEnabled:!locked && portOpen]; [pollTimePopup setEnabled:!locked && portOpen]; [sendCmdButton setEnabled:!locked && portOpen]; } From ee2cecef4e8820f2b4916db647ba024a2cf28b3e Mon Sep 17 00:00:00 2001 From: himal1 Date: Wed, 21 Jan 2026 14:18:48 -0500 Subject: [PATCH 10/10] more changes on defender new object --- .../Defender3000New/ORDefender3000ModelNew.h | 6 +- .../Defender3000New/ORDefender3000ModelNew.m | 103 ++++++++++++++---- 2 files changed, 87 insertions(+), 22 deletions(-) diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.h b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.h index fbaf2ee6..3a9149c3 100644 --- a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.h +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.h @@ -78,6 +78,8 @@ - (void) openPort:(BOOL)state; - (uint32_t) timeMeasured; - (void) setWeight:(float)aValue; +- (float) convertSerialWeightToPound:(float)aValue; +- (float) convertWeightToSelectedUnit:(float)aValue; - (float) weight; - (uint16_t) printInterval; - (void) setPrintInterval:(uint16_t)aValue; @@ -85,8 +87,8 @@ - (void) setUnits:(uint8_t)aValue; - (uint8_t) command; - (void) setCommand:(uint8_t)aValue; -- (uint16_t) tare; -- (void) setTare:(uint16_t)aValue; +- (float) tare; +- (void) setTare:(float)aValue; - (void) sendAllCommands; #pragma mark ***Data Records diff --git a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.m b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.m index 12700be0..963ec740 100644 --- a/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.m +++ b/Source/Objects/Hardware/Serial/Defender3000New/ORDefender3000ModelNew.m @@ -229,7 +229,8 @@ - (uint32_t) timeMeasured - (void) setWeight:(float)aValue; { - weight = aValue; + weight = [self convertWeightToSelectedUnit : [self convertSerialWeightToPound: aValue]]; + //weight = aValue; //get the time(UT!) time_t ut_Time; time(&ut_Time); @@ -242,6 +243,72 @@ - (void) setWeight:(float)aValue; if(timeRate == nil) timeRate = [[ORTimeRate alloc] init]; [timeRate addDataToTimeAverage:aValue]; } +- (float) convertSerialWeightToPound:(float)aValue; +{ + switch (unitData) { + case 1: // Grams to Pounds + weight = aValue * 0.00220462; + break; + + case 2: // Kilograms to Pounds + weight = aValue * 2.20462; + break; + + case 3: // Pounds + weight = aValue; + // Already in pounds + break; + + case 4: // Ounces to Pounds + weight = aValue / 16.0; + break; + + case 5: // lb:oz to Pounds + /* Logic: Assumes 'weight' is total ounces. + If weight is 18 (representing 1lb 2oz), 18 / 16 = 1.125 lbs + */ + weight = aValue / 16.0; + break; + + default: + break; + } + return weight; +} + +- (float) convertWeightToSelectedUnit:(float)aValue; +{ + switch (units) { + case 1: // pounds to gm + weight = aValue / 0.00220462; + break; + + case 2: // pounds to Kilograms + weight = aValue / 2.20462; + break; + + case 3: // Pounds + weight = aValue; + // Already in pounds + break; + + case 4: // Pounds to Ounces + weight = aValue * 16.0; + break; + + case 5: // Pounds to lb:oz + /* Logic: Assumes 'weight' is total ounces. + If weight is 18 (representing 1lb 2oz), 18 / 16 = 1.125 lbs + */ + weight = aValue * 16.0; + break; + + default: + break; + } + return weight; +} + - (uint8_t) command { @@ -293,12 +360,12 @@ - (void) setUnits:(uint8_t)aValue [[NSNotificationCenter defaultCenter] postNotificationName:ORDefender3000NewUnitsChanged object:self]; } -- (uint16_t) tare +- (float) tare { return tare; } -- (void) setTare:(uint16_t)aValue +- (void) setTare:(float)aValue { [[[self undoManager] prepareWithInvocationTarget:self] setTare:tare]; @@ -657,8 +724,9 @@ - (void) process_response:(NSString*)theResponse components = [theResponse componentsSeparatedByString:@" "]; if([components count]>=3){ //format is wt unit mode - //[self setWeight:[[components objectAtIndex:0]floatValue]]; - //[self setUnitData: [components objectAtIndex:1]]; + [self setWeight:[[components objectAtIndex:0]floatValue]]; + [self sendDefender3000ToInflux:[[components objectAtIndex:0]doubleValue]]; + [self setUnitData: [components objectAtIndex:1]]; [self setModeData:[components objectAtIndex:2]]; } else if([components count]==2){ @@ -679,30 +747,25 @@ - (void) process_response:(NSString*)theResponse -(void)sendDefender3000ToInflux:(double)weight { @autoreleasepool { - // Retrieve the InFluxDB model instance + // Retrieve the InFluxDB model instance InFluxDB = [[[(ORAppDelegate*)[NSApp delegate] document] findObjectWithFullID:@"ORInFluxDBModel,1"] retain]; - - if (InFluxDB == nil) { + if (InFluxDB == nil) { NSLog(@"Error: Unable to find the InfluxDB model."); return; } - // Current timestamp - double currentTimeStamp = [[NSDate date] timeIntervalSince1970]; - - // Create a new measurement object for the InfluxDB bucket + // Current timestamp + double currentTimeStamp = [[NSDate date] timeIntervalSince1970]; //timestamp is already there check. + // Create a new measurement object for the InfluxDB bucket ORInFluxDBMeasurement *measurement = [ORInFluxDBMeasurement measurementForBucket:@"ENAP_SC_UNC" org:[InFluxDB org]]; - + [measurement start:@"Defender3000New_1"]; [measurement addTag:@"GasOfWeight" withString:@"weightMeasured"]; [measurement addField:@"weight" withDouble:weight]; - - // Set the timestamp + // Set the timestamp [measurement setTimeStamp:currentTimeStamp]; - - // Execute the database command - [InFluxDB executeDBCmd:measurement]; - - // Manually release InFluxDB if using manual memory management (MRC) + // Execute the database command + [InFluxDB executeDBCmd:measurement]; + // Manually release InFluxDB if using manual memory management (MRC) [InFluxDB release]; } }