Cleaned up the Spotlight code considerably and added the ability to do simple searches for artist, album and title using %a, %l and %t respectively. For example searching "%awaits" will return all tracks by Tom Waits, etc...

CQTexperiment
matthewleon 2008-02-14 14:07:10 +00:00
parent d795c59c10
commit d6e7efd2c1
13 changed files with 475 additions and 406 deletions

View File

@ -109,6 +109,7 @@
56462DDA0D61D71E000AB68C /* SpotlightPlaylistView.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462DD90D61D71E000AB68C /* SpotlightPlaylistView.m */; }; 56462DDA0D61D71E000AB68C /* SpotlightPlaylistView.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462DD90D61D71E000AB68C /* SpotlightPlaylistView.m */; };
56462EAF0D6341F6000AB68C /* SpotlightTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462EAE0D6341F6000AB68C /* SpotlightTransformers.m */; }; 56462EAF0D6341F6000AB68C /* SpotlightTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462EAE0D6341F6000AB68C /* SpotlightTransformers.m */; };
56462EB20D634206000AB68C /* SpotlightPlaylistController.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462EB10D634206000AB68C /* SpotlightPlaylistController.m */; }; 56462EB20D634206000AB68C /* SpotlightPlaylistController.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462EB10D634206000AB68C /* SpotlightPlaylistController.m */; };
56C63D910D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m in Sources */ = {isa = PBXBuildFile; fileRef = 56C63D900D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m */; };
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
@ -602,6 +603,8 @@
56462EB00D634206000AB68C /* SpotlightPlaylistController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SpotlightPlaylistController.h; path = Spotlight/SpotlightPlaylistController.h; sourceTree = "<group>"; }; 56462EB00D634206000AB68C /* SpotlightPlaylistController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SpotlightPlaylistController.h; path = Spotlight/SpotlightPlaylistController.h; sourceTree = "<group>"; };
56462EB10D634206000AB68C /* SpotlightPlaylistController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightPlaylistController.m; path = Spotlight/SpotlightPlaylistController.m; sourceTree = "<group>"; }; 56462EB10D634206000AB68C /* SpotlightPlaylistController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightPlaylistController.m; path = Spotlight/SpotlightPlaylistController.m; sourceTree = "<group>"; };
566D32160D538550004466A5 /* APL.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = APL.xcodeproj; path = Plugins/APL/APL.xcodeproj; sourceTree = "<group>"; }; 566D32160D538550004466A5 /* APL.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = APL.xcodeproj; path = Plugins/APL/APL.xcodeproj; sourceTree = "<group>"; };
56C63D8F0D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSComparisonPredicate+CogPredicate.h"; path = "Spotlight/NSComparisonPredicate+CogPredicate.h"; sourceTree = "<group>"; };
56C63D900D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSComparisonPredicate+CogPredicate.m"; path = "Spotlight/NSComparisonPredicate+CogPredicate.m"; sourceTree = "<group>"; };
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8E07AAEE0AAC910500A4B32F /* SS_PreferencePaneProtocol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SS_PreferencePaneProtocol.h; path = Preferences/SS_PreferencePaneProtocol.h; sourceTree = "<group>"; }; 8E07AAEE0AAC910500A4B32F /* SS_PreferencePaneProtocol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SS_PreferencePaneProtocol.h; path = Preferences/SS_PreferencePaneProtocol.h; sourceTree = "<group>"; };
8E07AAEF0AAC910500A4B32F /* SS_PrefsController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SS_PrefsController.h; path = Preferences/SS_PrefsController.h; sourceTree = "<group>"; }; 8E07AAEF0AAC910500A4B32F /* SS_PrefsController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SS_PrefsController.h; path = Preferences/SS_PrefsController.h; sourceTree = "<group>"; };
@ -1099,6 +1102,8 @@
5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */, 5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */,
56462DD80D61D71E000AB68C /* SpotlightPlaylistView.h */, 56462DD80D61D71E000AB68C /* SpotlightPlaylistView.h */,
56462DD90D61D71E000AB68C /* SpotlightPlaylistView.m */, 56462DD90D61D71E000AB68C /* SpotlightPlaylistView.m */,
56C63D8F0D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.h */,
56C63D900D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m */,
); );
name = Spotlight; name = Spotlight;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1638,6 +1643,7 @@
56462DDA0D61D71E000AB68C /* SpotlightPlaylistView.m in Sources */, 56462DDA0D61D71E000AB68C /* SpotlightPlaylistView.m in Sources */,
56462EAF0D6341F6000AB68C /* SpotlightTransformers.m in Sources */, 56462EAF0D6341F6000AB68C /* SpotlightTransformers.m in Sources */,
56462EB20D634206000AB68C /* SpotlightPlaylistController.m in Sources */, 56462EB20D634206000AB68C /* SpotlightPlaylistController.m in Sources */,
56C63D910D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@ -0,0 +1,16 @@
//
// NSComparisonPredicate+CogPredicate.h
// Cog
//
// Created by Matthew Grinshpun on 14/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface NSComparisonPredicate (CogPredicate)
+ (NSPredicate *)predicateForMdKey:(NSString *)key withString:(NSString *)aString;
@end

View File

@ -0,0 +1,28 @@
//
// NSComparisonPredicate+CogPredicate.m
// Cog
//
// Created by Matthew Grinshpun on 14/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import "NSComparisonPredicate+CogPredicate.h"
// Ignore case and diacritics
static const unsigned OPTIONS = (NSCaseInsensitivePredicateOption|
NSDiacriticInsensitivePredicateOption);
@implementation NSComparisonPredicate (CogPredicate)
+ (NSPredicate *)predicateForMdKey:(NSString *)key withString:(NSString *)aString
{
NSString * likeString = [NSString stringWithFormat:@"*%@*", aString];
return [NSComparisonPredicate
predicateWithLeftExpression:[NSExpression expressionForKeyPath:key]
rightExpression:[NSExpression expressionForConstantValue:likeString]
modifier:NSDirectPredicateModifier
type:NSLikePredicateOperatorType
options:OPTIONS];
}
@end

View File

@ -52,7 +52,7 @@
<int key="NSCellFlags2">134217728</int> <int key="NSCellFlags2">134217728</int>
<string key="NSContents">Add to Playlist</string> <string key="NSContents">Add to Playlist</string>
<object class="NSFont" key="NSSupport" id="723568032"> <object class="NSFont" key="NSSupport" id="723568032">
<string key="NSName" id="824195771">LucidaGrande</string> <string key="NSName" id="936823292">LucidaGrande</string>
<double key="NSSize">1.300000e+01</double> <double key="NSSize">1.300000e+01</double>
<int key="NSfFlags">1044</int> <int key="NSfFlags">1044</int>
</object> </object>
@ -109,7 +109,7 @@
<int key="NSCellFlags2">0</int> <int key="NSCellFlags2">0</int>
<string key="NSContents" id="490720579">Title</string> <string key="NSContents" id="490720579">Title</string>
<object class="NSFont" key="NSSupport" id="26"> <object class="NSFont" key="NSSupport" id="26">
<reference key="NSName" ref="824195771"/> <reference key="NSName" ref="936823292"/>
<double key="NSSize">1.100000e+01</double> <double key="NSSize">1.100000e+01</double>
<int key="NSfFlags">3100</int> <int key="NSfFlags">3100</int>
</object> </object>
@ -119,7 +119,7 @@
</object> </object>
<object class="NSColor" key="NSTextColor" id="24919857"> <object class="NSColor" key="NSTextColor" id="24919857">
<int key="NSColorSpace">6</int> <int key="NSColorSpace">6</int>
<string key="NSCatalogName" id="1043699508">System</string> <string key="NSCatalogName" id="169189318">System</string>
<string key="NSColorName">headerTextColor</string> <string key="NSColorName">headerTextColor</string>
<object class="NSColor" key="NSColor" id="807894922"> <object class="NSColor" key="NSColor" id="807894922">
<int key="NSColorSpace">3</int> <int key="NSColorSpace">3</int>
@ -130,12 +130,12 @@
<object class="NSTextFieldCell" key="NSDataCell" id="756234421"> <object class="NSTextFieldCell" key="NSDataCell" id="756234421">
<int key="NSCellFlags">337772096</int> <int key="NSCellFlags">337772096</int>
<int key="NSCellFlags2">2048</int> <int key="NSCellFlags2">2048</int>
<string key="NSContents" id="687071126">Text Cell</string> <string key="NSContents" id="79865742">Text Cell</string>
<reference key="NSSupport" ref="723568032"/> <reference key="NSSupport" ref="723568032"/>
<reference key="NSControlView" ref="1001643430"/> <reference key="NSControlView" ref="1001643430"/>
<object class="NSColor" key="NSBackgroundColor" id="570822745"> <object class="NSColor" key="NSBackgroundColor" id="570822745">
<int key="NSColorSpace">6</int> <int key="NSColorSpace">6</int>
<reference key="NSCatalogName" ref="1043699508"/> <reference key="NSCatalogName" ref="169189318"/>
<string key="NSColorName">controlBackgroundColor</string> <string key="NSColorName">controlBackgroundColor</string>
<object class="NSColor" key="NSColor" id="613247351"> <object class="NSColor" key="NSColor" id="613247351">
<int key="NSColorSpace">3</int> <int key="NSColorSpace">3</int>
@ -144,7 +144,7 @@
</object> </object>
<object class="NSColor" key="NSTextColor" id="472724546"> <object class="NSColor" key="NSTextColor" id="472724546">
<int key="NSColorSpace">6</int> <int key="NSColorSpace">6</int>
<reference key="NSCatalogName" ref="1043699508"/> <reference key="NSCatalogName" ref="169189318"/>
<string key="NSColorName">controlTextColor</string> <string key="NSColorName">controlTextColor</string>
<reference key="NSColor" ref="807894922"/> <reference key="NSColor" ref="807894922"/>
</object> </object>
@ -165,7 +165,7 @@
<reference key="NSSupport" ref="26"/> <reference key="NSSupport" ref="26"/>
<object class="NSColor" key="NSBackgroundColor" id="142072741"> <object class="NSColor" key="NSBackgroundColor" id="142072741">
<int key="NSColorSpace">6</int> <int key="NSColorSpace">6</int>
<reference key="NSCatalogName" ref="1043699508"/> <reference key="NSCatalogName" ref="169189318"/>
<string key="NSColorName">headerColor</string> <string key="NSColorName">headerColor</string>
<object class="NSColor" key="NSColor" id="71117423"> <object class="NSColor" key="NSColor" id="71117423">
<int key="NSColorSpace">3</int> <int key="NSColorSpace">3</int>
@ -177,7 +177,7 @@
<object class="NSTextFieldCell" key="NSDataCell" id="664713172"> <object class="NSTextFieldCell" key="NSDataCell" id="664713172">
<int key="NSCellFlags">337772096</int> <int key="NSCellFlags">337772096</int>
<int key="NSCellFlags2">2048</int> <int key="NSCellFlags2">2048</int>
<reference key="NSContents" ref="687071126"/> <reference key="NSContents" ref="79865742"/>
<reference key="NSSupport" ref="723568032"/> <reference key="NSSupport" ref="723568032"/>
<reference key="NSControlView" ref="1001643430"/> <reference key="NSControlView" ref="1001643430"/>
<reference key="NSBackgroundColor" ref="570822745"/> <reference key="NSBackgroundColor" ref="570822745"/>
@ -203,7 +203,7 @@
<object class="NSTextFieldCell" key="NSDataCell" id="594990735"> <object class="NSTextFieldCell" key="NSDataCell" id="594990735">
<int key="NSCellFlags">337772096</int> <int key="NSCellFlags">337772096</int>
<int key="NSCellFlags2">2048</int> <int key="NSCellFlags2">2048</int>
<reference key="NSContents" ref="687071126"/> <reference key="NSContents" ref="79865742"/>
<reference key="NSSupport" ref="723568032"/> <reference key="NSSupport" ref="723568032"/>
<reference key="NSControlView" ref="1001643430"/> <reference key="NSControlView" ref="1001643430"/>
<reference key="NSBackgroundColor" ref="570822745"/> <reference key="NSBackgroundColor" ref="570822745"/>
@ -310,7 +310,7 @@
<object class="NSTextFieldCell" key="NSDataCell" id="951203136"> <object class="NSTextFieldCell" key="NSDataCell" id="951203136">
<int key="NSCellFlags">337772096</int> <int key="NSCellFlags">337772096</int>
<int key="NSCellFlags2">67110912</int> <int key="NSCellFlags2">67110912</int>
<reference key="NSContents" ref="687071126"/> <reference key="NSContents" ref="79865742"/>
<reference key="NSSupport" ref="723568032"/> <reference key="NSSupport" ref="723568032"/>
<reference key="NSControlView" ref="1001643430"/> <reference key="NSControlView" ref="1001643430"/>
<reference key="NSBackgroundColor" ref="570822745"/> <reference key="NSBackgroundColor" ref="570822745"/>
@ -326,7 +326,7 @@
<reference key="NSBackgroundColor" ref="570822745"/> <reference key="NSBackgroundColor" ref="570822745"/>
<object class="NSColor" key="NSGridColor"> <object class="NSColor" key="NSGridColor">
<int key="NSColorSpace">6</int> <int key="NSColorSpace">6</int>
<reference key="NSCatalogName" ref="1043699508"/> <reference key="NSCatalogName" ref="169189318"/>
<string key="NSColorName">gridColor</string> <string key="NSColorName">gridColor</string>
<object class="NSColor" key="NSColor"> <object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int> <int key="NSColorSpace">3</int>
@ -417,7 +417,7 @@
<int key="NSTextBezelStyle">1</int> <int key="NSTextBezelStyle">1</int>
<object class="NSColor" key="NSBackgroundColor"> <object class="NSColor" key="NSBackgroundColor">
<int key="NSColorSpace">6</int> <int key="NSColorSpace">6</int>
<reference key="NSCatalogName" ref="1043699508"/> <reference key="NSCatalogName" ref="169189318"/>
<string key="NSColorName">textBackgroundColor</string> <string key="NSColorName">textBackgroundColor</string>
<reference key="NSColor" ref="71117423"/> <reference key="NSColor" ref="71117423"/>
</object> </object>
@ -482,7 +482,7 @@
<reference key="NSControlView" ref="595225768"/> <reference key="NSControlView" ref="595225768"/>
<object class="NSColor" key="NSBackgroundColor"> <object class="NSColor" key="NSBackgroundColor">
<int key="NSColorSpace">6</int> <int key="NSColorSpace">6</int>
<reference key="NSCatalogName" ref="1043699508"/> <reference key="NSCatalogName" ref="169189318"/>
<string key="NSColorName">controlColor</string> <string key="NSColorName">controlColor</string>
<reference key="NSColor" ref="613247351"/> <reference key="NSColor" ref="613247351"/>
</object> </object>
@ -767,7 +767,7 @@
</object> </object>
<object class="IBConnectionRecord"> <object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection"> <object class="IBOutletConnection" key="connection">
<string key="label" id="47137979">spotlightWindowController</string> <string key="label">spotlightWindowController</string>
<reference key="source" ref="498175063"/> <reference key="source" ref="498175063"/>
<reference key="destination" ref="1001"/> <reference key="destination" ref="1001"/>
</object> </object>
@ -775,7 +775,7 @@
</object> </object>
<object class="IBConnectionRecord"> <object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection"> <object class="IBOutletConnection" key="connection">
<string key="label" id="152700087">playlistController</string> <string key="label">playlistController</string>
<reference key="source" ref="1001"/> <reference key="source" ref="1001"/>
<reference key="destination" ref="498175063"/> <reference key="destination" ref="498175063"/>
</object> </object>
@ -783,13 +783,13 @@
</object> </object>
<object class="IBConnectionRecord"> <object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection"> <object class="IBBindingConnection" key="connection">
<string key="label" id="887732185">contentArray: query.results</string> <string key="label" id="789844923">contentArray: query.results</string>
<reference key="source" ref="498175063"/> <reference key="source" ref="498175063"/>
<reference key="destination" ref="1001"/> <reference key="destination" ref="1001"/>
<object class="NSNibBindingConnector" key="connector"> <object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="498175063"/> <reference key="NSSource" ref="498175063"/>
<reference key="NSDestination" ref="1001"/> <reference key="NSDestination" ref="1001"/>
<reference key="NSLabel" ref="887732185"/> <reference key="NSLabel" ref="789844923"/>
<string key="NSBinding">contentArray</string> <string key="NSBinding">contentArray</string>
<string key="NSKeyPath">query.results</string> <string key="NSKeyPath">query.results</string>
<int key="NSNibBindingConnectorVersion">2</int> <int key="NSNibBindingConnectorVersion">2</int>
@ -797,6 +797,14 @@
</object> </object>
<int key="connectionID">162</int> <int key="connectionID">162</int>
</object> </object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label" id="308878383">addToPlaylist:</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="281142208"/>
</object>
<int key="connectionID">163</int>
</object>
</object> </object>
<object class="IBMutableOrderedSet" key="objectRecords"> <object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects"> <object class="NSArray" key="orderedObjects">
@ -1201,7 +1209,7 @@
</object> </object>
</object> </object>
<nil key="sourceID"/> <nil key="sourceID"/>
<int key="maxID">162</int> <int key="maxID">163</int>
</object> </object>
<object class="IBClassDescriber" key="IBDocument.Classes"> <object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions"> <object class="NSMutableArray" key="referencedPartialClassDescriptions">
@ -1228,7 +1236,7 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey" id="261590112">IBProjectSource</string> <string key="majorKey" id="1023292355">IBProjectSource</string>
<string key="minorKey">ThirdParty/UKKQueue/UKFileWatcher.h</string> <string key="minorKey">ThirdParty/UKKQueue/UKFileWatcher.h</string>
</object> </object>
</object> </object>
@ -1254,7 +1262,7 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">ThirdParty/UKKQueue/UKMainThreadProxy.h</string> <string key="minorKey">ThirdParty/UKKQueue/UKMainThreadProxy.h</string>
</object> </object>
</object> </object>
@ -1280,7 +1288,7 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">ThirdParty/GCWindowMenu/GCOneShotEffectTimer.h</string> <string key="minorKey">ThirdParty/GCWindowMenu/GCOneShotEffectTimer.h</string>
</object> </object>
</object> </object>
@ -1306,7 +1314,7 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">ThirdParty/NDHotKeys/NDHotKeyEvent.h</string> <string key="minorKey">ThirdParty/NDHotKeys/NDHotKeyEvent.h</string>
</object> </object>
</object> </object>
@ -1332,7 +1340,7 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">ThirdParty/AppleRemote/AppleRemote.h</string> <string key="minorKey">ThirdParty/AppleRemote/AppleRemote.h</string>
</object> </object>
</object> </object>
@ -1358,58 +1366,10 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">ThirdParty/UKKQueue/UKKQueue.h</string> <string key="minorKey">ThirdParty/UKKQueue/UKKQueue.h</string>
</object> </object>
</object> </object>
<object class="IBPartialClassDescription">
<string key="className">SpotlightPlaylistController</string>
<string key="superclassName">PlaylistController</string>
<object class="NSMutableDictionary" key="actions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<reference key="NS.key.0" ref="47137979"/>
<string key="NS.object.0">SpotlightWindowController</string>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/>
<string key="minorKey">Spotlight/SpotlightPlaylistController.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">SpotlightWindowController</string>
<string key="superclassName">NSWindowController</string>
<object class="NSMutableDictionary" key="actions">
<string key="NS.key.0">addToPlaylist:</string>
<string key="NS.object.0" id="695696504">id</string>
</object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSMutableArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>pathControl</string>
<reference ref="152700087"/>
<string>playlistLoader</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSPathControl</string>
<string>NSArrayController</string>
<string>PlaylistLoader</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/>
<string key="minorKey">Spotlight/SpotlightWindowController.h</string>
</object>
</object>
<object class="IBPartialClassDescription"> <object class="IBPartialClassDescription">
<string key="className">DNDArrayController</string> <string key="className">DNDArrayController</string>
<string key="superclassName">NSArrayController</string> <string key="superclassName">NSArrayController</string>
@ -1427,7 +1387,7 @@
<string key="NS.object.0">NSTableView</string> <string key="NS.object.0">NSTableView</string>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Playlist/DNDArrayController.h</string> <string key="minorKey">Playlist/DNDArrayController.h</string>
</object> </object>
</object> </object>
@ -1445,10 +1405,10 @@
</object> </object>
<object class="NSMutableArray" key="dict.values"> <object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool> <bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="695696504"/> <string id="830980271">id</string>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
</object> </object>
</object> </object>
<object class="NSMutableDictionary" key="outlets"> <object class="NSMutableDictionary" key="outlets">
@ -1465,36 +1425,10 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Playlist/PlaylistView.h</string> <string key="minorKey">Playlist/PlaylistView.h</string>
</object> </object>
</object> </object>
<object class="IBPartialClassDescription">
<string key="className">SpotlightPlaylistView</string>
<string key="superclassName">PlaylistView</string>
<object class="NSMutableDictionary" key="actions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/>
<string key="minorKey">Spotlight/SpotlightPlaylistView.h</string>
</object>
</object>
<object class="IBPartialClassDescription"> <object class="IBPartialClassDescription">
<string key="className">TrackingSlider</string> <string key="className">TrackingSlider</string>
<string key="superclassName">NSSlider</string> <string key="superclassName">NSSlider</string>
@ -1517,10 +1451,63 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Utils/TrackingSlider.h</string> <string key="minorKey">Utils/TrackingSlider.h</string>
</object> </object>
</object> </object>
<object class="IBPartialClassDescription">
<string key="className">SpotlightWindowController</string>
<string key="superclassName">NSWindowController</string>
<object class="NSMutableDictionary" key="actions">
<reference key="NS.key.0" ref="308878383"/>
<reference key="NS.object.0" ref="830980271"/>
</object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSMutableArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>pathControl</string>
<string>playlistController</string>
<string>playlistLoader</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSPathControl</string>
<string>NSArrayController</string>
<string>PlaylistLoader</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Spotlight/SpotlightWindowController.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">SpotlightPlaylistView</string>
<string key="superclassName">PlaylistView</string>
<object class="NSMutableDictionary" key="actions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Spotlight/SpotlightPlaylistView.h</string>
</object>
</object>
<object class="IBPartialClassDescription"> <object class="IBPartialClassDescription">
<string key="className">PlaylistLoader</string> <string key="className">PlaylistLoader</string>
<reference key="superclassName" ref="381641511"/> <reference key="superclassName" ref="381641511"/>
@ -1538,7 +1525,7 @@
<string key="NS.object.0">PlaylistController</string> <string key="NS.object.0">PlaylistController</string>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Playlist/PlaylistLoader.h</string> <string key="minorKey">Playlist/PlaylistLoader.h</string>
</object> </object>
</object> </object>
@ -1564,7 +1551,7 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Playlist/EntriesController.h</string> <string key="minorKey">Playlist/EntriesController.h</string>
</object> </object>
</object> </object>
@ -1583,11 +1570,11 @@
</object> </object>
<object class="NSMutableArray" key="dict.values"> <object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool> <bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
</object> </object>
</object> </object>
<object class="NSMutableDictionary" key="outlets"> <object class="NSMutableDictionary" key="outlets">
@ -1604,10 +1591,31 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Playlist/PlaylistController.h</string> <string key="minorKey">Playlist/PlaylistController.h</string>
</object> </object>
</object> </object>
<object class="IBPartialClassDescription">
<string key="className">SpotlightPlaylistController</string>
<string key="superclassName">PlaylistController</string>
<object class="NSMutableDictionary" key="actions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<string key="NS.key.0">spotlightWindowController</string>
<string key="NS.object.0">SpotlightWindowController</string>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Spotlight/SpotlightPlaylistController.h</string>
</object>
</object>
<object class="IBPartialClassDescription"> <object class="IBPartialClassDescription">
<string key="className">PlaybackController</string> <string key="className">PlaybackController</string>
<reference key="superclassName" ref="381641511"/> <reference key="superclassName" ref="381641511"/>
@ -1634,22 +1642,22 @@
</object> </object>
<object class="NSMutableArray" key="dict.values"> <object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool> <bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
<reference ref="695696504"/> <reference ref="830980271"/>
</object> </object>
</object> </object>
<object class="NSMutableDictionary" key="outlets"> <object class="NSMutableDictionary" key="outlets">
@ -1676,7 +1684,7 @@
</object> </object>
</object> </object>
<object class="IBClassDescriptionSource" key="sourceIdentifier"> <object class="IBClassDescriptionSource" key="sourceIdentifier">
<reference key="majorKey" ref="261590112"/> <reference key="majorKey" ref="1023292355"/>
<string key="minorKey">Application/PlaybackController.h</string> <string key="minorKey">Application/PlaybackController.h</string>
</object> </object>
</object> </object>
@ -1687,247 +1695,249 @@
<int key="IBDocument.defaultPropertyAccessControl">3</int> <int key="IBDocument.defaultPropertyAccessControl">3</int>
<object class="NSMutableData" key="IBDocument.RunnableNib"> <object class="NSMutableData" key="IBDocument.RunnableNib">
<bytes key="NS.bytes">YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA <bytes key="NS.bytes">YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA
AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBQAALAAwAMQA1ADYAPAA9 AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBRAALAAwAMQA1ADYAPAA9
AEIAWgBbAFwAXQBeAAsAbAB0AIAAgQCZAJoAogCjAKYApwCrALEAyQDRAN8A4wEJAQoBCwEMARMBHgEf AEIAWgBbAFwAXQBeAAsAbAB0AIAAgQCZAJoAogCjAKYApwCrALEAyQDRAN8A4wEJAQoBCwEMARMBHgEf
ASIBKQEqAS0BNwFKAUsBUwFUAVkBXgFhAWkBagFrAW4BcgF7AXwBgQGCAYUBigGLAY0BkAGZAZoBoAGh ASIBKQEqAS0BNwFKAUsBUwFUAVkBXgFhAWkBagFrAW4BcgF7AXwBgQGCAYUBigGLAY0BkAGZAZoBoAGh
AaYBpwGqAbEBugG7AcEBwgHJAdQB1QHcAd0BewHlAe8B8AH2AfcB/gIHAggCDgIPAhYCHwIgAiYCJwIu AaYBpwGqAbEBugG7AcEBwgHJAdQB1QHcAd0BewHlAe8B8AH2AfcB/gIHAggCDgIPAhYCHwIgAiYCJwIu
AjICNwI4AjsCPAI/AkACQwJPAlACUQJUAl0CXgEeAmICYwJmAm8CcAKCAocCiAKTApQClQKeAp8CowKs AjICNwI4AjsCPAI/AkACQwJPAlACUQJUAl0CXgEeAmICYwJmAm8CcAKCAocCiAKTApQClQKeAp8CowKs
Aq0CrgD8Aq8CswK0ArcCuwLEAsUCzgLPAtQC1QLXAuEC5gLnAugC7ALtAvgC+wL+AwEACwMCAwQDBQMG Aq0CrgD8Aq8CswK0ArcCuwLEAsUCzgLPAtQC1QLXAuEC5gLnAugC7ALtAvgC+wL+AwEACwMCAwQDBQMG
AwkDHQMlAzsDPAM9A0gDSQNLA00DTgNSA1cDWANdA14DYwNkA2kDagNvA3ADdQN2A4ADgQOCA4MDhgON AwkDHgMmAzwDPQM+A0kDSgNMA04DTwNTA1gDWQNeA18DZANlA2oDawNuA3MDdAN5A3oDfwOAA4oDiwOM
A44DjwOQA5kDmgObA6EDogOkA6wDrQOuA7QDvAO9A74DxAPMA80DzgPUA9wD3QPeA+QD7APtA+4D9AP8 A40DkAOXA5gDmQOaA6MDpAOlA6sDrAOuA7YDtwO4A74DxgPHA8gDzgPWA9cD2APeA+YD5wPoA+4D9gP3
A/0D/gQEBAwEDQQOBBQEFQQWBDgEOwQ8BD4EYASDBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIEswS0 A/gD/gQGBAcECAQOBBYEFwQYBB4EHwQgBEIERQRGBEgEagSNBLAEsQSyBLMEtAS1BLYEtwS4BLkEugS7
BLUEtgS3BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGBMsE0AUEBTgFOQU6BTsFPAU9BT4BZgU/ BLwEvQS+BL8EwATBBMIEwwTEBMUExgTHBMgEyQTKBMsEzATNBM4EzwTQBNUE2gUPBUQFRQVGBUcFSAFm
BUAFQQVCBUMFRABXBUUFRgVHBUgFSQVKBUsAkAVMBU0FTgVPBVAFUQVSBVMAVgVUBVUFVgVXBVgFWQVa BUkFSgVLBUwFTQBXBU4FTwVQBVEFUgVTAJAFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8AVgVgBWEFYgVj
BVsFXAVdBV4FXwVgBWEFYgVjBWQFZwVqBW1VJG51bGzfEBIADQAOAA8AEAARABIAEwAUABUAFgAXABgA BWQFZQVmBWcFaAVpBWoFawVsBW0FbgVvBXAFcQV0BXcFelUkbnVsbN8QEgANAA4ADwAQABEAEgATABQA
GQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADBWTlNSb290ViRjbGFz FQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMFZOU1Jv
c11OU09iamVjdHNLZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5T2lkc1ZhbHVl b3RWJGNsYXNzXU5TT2JqZWN0c0tleXNfEA9OU0NsYXNzZXNWYWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlP
c11OU0Nvbm5lY3Rpb25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5TQ2xhc3Nlc0tleXNaTlNPaWRz aWRzVmFsdWVzXU5TQ29ubmVjdGlvbnNbTlNOYW1lc0tleXNbTlNGcmFtZXdvcmtdTlNDbGFzc2VzS2V5
S2V5c11OU05hbWVzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVjdG9yc11OU0ZvbnRNYW5hZ2Vy c1pOU09pZHNLZXlzXU5TTmFtZXNWYWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlDb25uZWN0b3JzXU5TRm9u
XxAQTlNWaXNpYmxlV2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05TQWNjZXNzaWJpbGl0eU9pZHNL dE1hbmFnZXJfEBBOU1Zpc2libGVXaW5kb3dzXxAPTlNPYmplY3RzVmFsdWVzXxAXTlNBY2Nlc3NpYmls
ZXlzWU5TTmV4dE9pZFxOU09pZHNWYWx1ZXOAAoEBP4DhgQEJgQE+gJ2A5oAFgQEIgQEKgOeBATyAAIAG aXR5T2lkc0tleXNZTlNOZXh0T2lkXE5TT2lkc1ZhbHVlc4ACgQFDgOSBAQyBAUKAnYDpgAWBAQuBAQ2A
gOWBAT0QpIEBC9IADgAyADMANFtOU0NsYXNzTmFtZYAEgANfEBlTcG90bGlnaHRXaW5kb3dDb250cm9s 6oEBQIAAgAaA6IEBQRClgQEO0gAOADIAMwA0W05TQ2xhc3NOYW1lgASAA18QGVNwb3RsaWdodFdpbmRv
bGVy0gA3ADgAOQA6WCRjbGFzc2VzWiRjbGFzc25hbWWiADoAO15OU0N1c3RvbU9iamVjdFhOU09iamVj d0NvbnRyb2xsZXLSADcAOAA5ADpYJGNsYXNzZXNaJGNsYXNzbmFtZaIAOgA7Xk5TQ3VzdG9tT2JqZWN0
dF8QEElCQ29jb2FGcmFtZXdvcmvSAA4APgA/AEBaTlMub2JqZWN0c4CRoQBBgAfcAEMADgBEAEUARgBH WE5TT2JqZWN0XxAQSUJDb2NvYUZyYW1ld29ya9IADgA+AD8AQFpOUy5vYmplY3RzgJGhAEGAB9wAQwAO
AEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWAArXE5TV2luZG93Vmlld1xOU1NjcmVlblJl AEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYACtcTlNXaW5kb3dWaWV3XE5T
Y3RdTlNXaW5kb3dUaXRsZVlOU1dURmxhZ3NdTlNXaW5kb3dDbGFzc18QFk5TV2luZG93Q29udGVudE1p U2NyZWVuUmVjdF1OU1dpbmRvd1RpdGxlWU5TV1RGbGFnc11OU1dpbmRvd0NsYXNzXxAWTlNXaW5kb3dD
blNpemVcTlNXaW5kb3dSZWN0XxAPTlNXaW5kb3dCYWNraW5nXxARTlNXaW5kb3dTdHlsZU1hc2tZTlNN b250ZW50TWluU2l6ZVxOU1dpbmRvd1JlY3RfEA9OU1dpbmRvd0JhY2tpbmdfEBFOU1dpbmRvd1N0eWxl
aW5TaXplW05TVmlld0NsYXNzgAyAnICagAkSIAAAAIAKgAuACBACEB+Am4AAXxAYe3sxOTYsIDE5Mn0s TWFza1lOU01pblNpemVbTlNWaWV3Q2xhc3OADICcgJqACRIgAAAAgAqAC4AIEAIQH4CbgABfEBh7ezE5
IHs0ODAsIDMyMH19XxATT3BlbiBmcm9tIFNwb3RsaWdodFdOU1BhbmVsWns0MDAsIDI2MH3XAF8ADgBg NiwgMTkyfSwgezQ4MCwgMzIwfX1fEBNPcGVuIGZyb20gU3BvdGxpZ2h0V05TUGFuZWxaezQwMCwgMjYw
AGEAYgBjAGQAZQBmAGcAaABpAGUAa18QD05TTmV4dFJlc3BvbmRlclpOU1N1YnZpZXdzWE5TdkZsYWdz fdcAXwAOAGAAYQBiAGMAZABlAGYAZwBoAGkAZQBrXxAPTlNOZXh0UmVzcG9uZGVyWk5TU3Vidmlld3NY
W05TRnJhbWVTaXplWE5TV2luZG93W05TU3VwZXJ2aWV3gA2AmYAOEQEAgJeADYCY0gAOAD4AbQBugGCl TlN2RmxhZ3NbTlNGcmFtZVNpemVYTlNXaW5kb3dbTlNTdXBlcnZpZXeADYCZgA4RAQCAl4ANgJjSAA4A
AG8AcABxAHIAc4APgBmAcoCGgI3YAF8ADgB1AHYAYQB3AGMAZABOAHkAegB7AHwAfQBlAE5XTlNGcmFt PgBtAG6AYKUAbwBwAHEAcgBzgA+AGYBygIaAjdgAXwAOAHUAdgBhAHcAYwBkAE4AeQB6AHsAfAB9AGUA
ZVZOU0NlbGxZTlNFbmFibGVkgAyAGIAQgBERAQkJgA2ADF8QF3t7MzM1LCAyNzV9LCB7MTMxLCAzMn19 TldOU0ZyYW1lVk5TQ2VsbFlOU0VuYWJsZWSADIAYgBCAEREBCQmADYAMXxAXe3szMzUsIDI3NX0sIHsx
3ACCAA4AgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAjwCTAJQAbwCWAJcAmFtOU0NlbGxGbGFn MzEsIDMyfX3cAIIADgCDAIQAhQCGAIcAiACJAIoAiwCMAI0AjgCPAJAAkQCPAJMAlABvAJYAlwCYW05T
c18QE05TQWx0ZXJuYXRlQ29udGVudHNfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNCdXR0b25GbGFnczJf Q2VsbEZsYWdzXxATTlNBbHRlcm5hdGVDb250ZW50c18QEk5TUGVyaW9kaWNJbnRlcnZhbF5OU0J1dHRv
EA9OU0tleUVxdWl2YWxlbnRaTlNDb250ZW50c1lOU1N1cHBvcnRdTlNDb250cm9sVmlld18QD05TUGVy bkZsYWdzMl8QD05TS2V5RXF1aXZhbGVudFpOU0NvbnRlbnRzWU5TU3VwcG9ydF1OU0NvbnRyb2xWaWV3
aW9kaWNEZWxheVxOU0NlbGxGbGFnczJdTlNCdXR0b25GbGFncxIEAf4AgBeAFhAZEIGAFoASgBOADxDI XxAPTlNQZXJpb2RpY0RlbGF5XE5TQ2VsbEZsYWdzMl1OU0J1dHRvbkZsYWdzEgQB/gCAF4AWEBkQgYAW
EggAAAAT/////4aCQP9fEA9BZGQgdG8gUGxheWxpc3TUAA4AmwCcAJ0AngCfAKAAoVZOU1NpemVWTlNO gBKAE4APEMgSCAAAABP/////hoJA/18QD0FkZCB0byBQbGF5bGlzdNQADgCbAJwAnQCeAJ8AoAChVk5T
YW1lWE5TZkZsYWdzgBUjQCoAAAAAAACAFBEEFFxMdWNpZGFHcmFuZGXSADcAOACkAKWiAKUAO1ZOU0Zv U2l6ZVZOU05hbWVYTlNmRmxhZ3OAFSNAKgAAAAAAAIAUEQQUXEx1Y2lkYUdyYW5kZdIANwA4AKQApaIA
bnRQ0gA3ADgAqACppACpAKoAdgA7XE5TQnV0dG9uQ2VsbFxOU0FjdGlvbkNlbGzSADcAOACsAK2lAK0A pQA7Vk5TRm9udFDSADcAOACoAKmkAKkAqgB2ADtcTlNCdXR0b25DZWxsXE5TQWN0aW9uQ2VsbNIANwA4
rgCvALAAO1hOU0J1dHRvbllOU0NvbnRyb2xWTlNWaWV3W05TUmVzcG9uZGVy3xAPAF8AsgAOAHUAswC0 AKwAraUArQCuAK8AsAA7WE5TQnV0dG9uWU5TQ29udHJvbFZOU1ZpZXdbTlNSZXNwb25kZXLfEA8AXwCy
ALUAYAC2AGEAYwBkALcAuAC5AE4AuwC8AL0AvgC/AMAAwQDCAMMAZQBOAMYAxwDHW05TSFNjcm9sbGVy AA4AdQCzALQAtQBgALYAYQBjAGQAtwC4ALkATgC7ALwAvQC+AL8AwADBAMIAwwBlAE4AxgDHAMdbTlNI
WE5Tc0ZsYWdzXE5TQ29ybmVyVmlld18QEE5TSGVhZGVyQ2xpcFZpZXdcTlNTY3JvbGxBbXRzW05TVlNj U2Nyb2xsZXJYTlNzRmxhZ3NcTlNDb3JuZXJWaWV3XxAQTlNIZWFkZXJDbGlwVmlld1xOU1Njcm9sbEFt
cm9sbGVyXU5TTmV4dEtleVZpZXddTlNDb250ZW50Vmlld4AMgGyAcYBwEQIwgCWAIoAaTxAQAAAAAAAA dHNbTlNWU2Nyb2xsZXJdTlNOZXh0S2V5Vmlld11OU0NvbnRlbnRWaWV3gAyAbIBxgHARAjCAJYAigBpP
AABBmAAAQZgAABEBEoANgAyAaIAbgBvSAA4APgBtAMuAYKUAxwDGALsAwAC/gBuAaIBsgCKAJdsAXwAO EBAAAAAAAAAAAEGYAABBmAAAEQESgA2ADIBogBuAG9IADgA+AG0Ay4BgpQDHAMYAuwDAAL+AG4BogGyA
AHUA0gBgAGEA0wBjANQAZAC4AHAA1gDXAFYA2ADZANoAZQDcAHAA2llOU2N2RmxhZ3NZTlNEb2NWaWV3 IoAl2wBfAA4AdQDSAGAAYQDTAGMA1ABkALgAcADWANcAVgDYANkA2gBlANwAcADaWU5TY3ZGbGFnc1lO
WU5TQkdDb2xvcoAZgGeAZoAcEQkAgB2ADYA3gBmAHdIADgA+AG0A4YBgoQDagB3fEBcAXwDkAA4A5QDm U0RvY1ZpZXdZTlNCR0NvbG9ygBmAZ4BmgBwRCQCAHYANgDeAGYAd0gAOAD4AbQDhgGChANqAHd8QFwBf
AOcA6ADpALQA6gDrAOwAYQBiAHcA7QBjADIA7gDvAGQA8ADxAMcA8wD0APUA9gD3ANwAfQC/APsA/AD9 AOQADgDlAOYA5wDoAOkAtADqAOsA7ABhAGIAdwDtAGMAMgDuAO8AZADwAPEAxwDzAPQA9QD2APcA3AB9
AP4A/wB9AQEAZQEDAQQBBQDHAQcBCF8QH05TRHJhZ2dpbmdTb3VyY2VNYXNrRm9yTm9uTG9jYWxZTlNU AL8A+wD8AP0A/gD/AH0BAQBlAQMBBAEFAMcBBwEIXxAfTlNEcmFnZ2luZ1NvdXJjZU1hc2tGb3JOb25M
dkZsYWdzXxATTlNPcmlnaW5hbENsYXNzTmFtZVxOU0hlYWRlclZpZXdfEBFOU0JhY2tncm91bmRDb2xv b2NhbFlOU1R2RmxhZ3NfEBNOU09yaWdpbmFsQ2xhc3NOYW1lXE5TSGVhZGVyVmlld18QEU5TQmFja2dy
cl8QEk5TQWxsb3dzVHlwZVNlbGVjdF8QF05TSW50ZXJjZWxsU3BhY2luZ1dpZHRoXxAZTlNDb2x1bW5B b3VuZENvbG9yXxASTlNBbGxvd3NUeXBlU2VsZWN0XxAXTlNJbnRlcmNlbGxTcGFjaW5nV2lkdGhfEBlO
dXRvcmVzaXppbmdTdHlsZV8QGE5TSW50ZXJjZWxsU3BhY2luZ0hlaWdodF5OU0F1dG9zYXZlTmFtZVtO U0NvbHVtbkF1dG9yZXNpemluZ1N0eWxlXxAYTlNJbnRlcmNlbGxTcGFjaW5nSGVpZ2h0Xk5TQXV0b3Nh
U0dyaWRDb2xvcl8QHE5TRHJhZ2dpbmdTb3VyY2VNYXNrRm9yTG9jYWxeTlNUYWJsZUNvbHVtbnNbTlNS dmVOYW1lW05TR3JpZENvbG9yXxAcTlNEcmFnZ2luZ1NvdXJjZU1hc2tGb3JMb2NhbF5OU1RhYmxlQ29s
b3dIZWlnaHSAGxAAgGUT/////9vAgACAH4AhgDcJgCUjQAgAAAAAAAAQASNAAAAAAAAAABEREoAgCYBk dW1uc1tOU1Jvd0hlaWdodIAbEACAZRP/////28CAAIAfgCGANwmAJSNACAAAAAAAABABI0AAAAAAAAAA
gA2AHoBhEA+AG4AoI0AxAAAAAAAAXxAVU3BvdGxpZ2h0UGxheWxpc3RWaWV3W05TVGFibGVWaWV3Wns0 ERESgCAJgGSADYAegGEQD4AbgCgjQDEAAAAAAABfEBVTcG90bGlnaHRQbGF5bGlzdFZpZXdbTlNUYWJs
NDAsIDIxMX3XAF8ADgBhAGIAYwBkAQoAwAEOAGgBDwBlAMAA2oAigCSAI4ANgCKAHdsAXwAOANIAYABh ZVZpZXdaezQ0MCwgMjExfdcAXwAOAGEAYgBjAGQBCgDAAQ4AaAEPAGUAwADagCKAJIAjgA2AIoAd2wBf
AGIA0wBjANQAZAC4AHAA1gEWARcA2QEYAPcAZQDcAHAA94AZgGcQBIBugG+AIYANgDeAGYAhWXs0NDAs AA4A0gBgAGEAYgDTAGMA1ABkALgAcADWARYBFwDZARgA9wBlANwAcAD3gBmAZxAEgG6Ab4AhgA2AN4AZ
IDE3fdIANwA4ASABIaQBIQCvALAAO18QEU5TVGFibGVIZWFkZXJWaWV31gBfAA4AdQBhAGMAZABwASQB gCFZezQ0MCwgMTd90gA3ADgBIAEhpAEhAK8AsAA7XxARTlNUYWJsZUhlYWRlclZpZXfWAF8ADgB1AGEA
JQEmAGUAcIAZgCeAJhP/////gAABAIANgBlfEBR7ey0yNiwgMH0sIHsxNiwgMTd9fdIANwA4ASsBLKQB YwBkAHABJAElASYAZQBwgBmAJ4AmE/////+AAAEAgA2AGV8QFHt7LTI2LCAwfSwgezE2LCAxN3190gA3
LACvALAAO11fTlNDb3JuZXJWaWV30gAOAD4AbQEvgGCnATABMQEyATMBNAE1ATaAKYA+gEaAS4BRgFaA ADgBKwEspAEsAK8AsAA7XV9OU0Nvcm5lclZpZXfSAA4APgBtAS+AYKcBMAExATIBMwE0ATUBNoApgD6A
W9oBOAAOATkBOgE7ATwBPQE+AT8BCgB9AUEBQgFDAUQBRQFGAUcBSADaXk5TSXNSZXNpemVhYmxlXE5T RoBLgFGAVoBb2gE4AA4BOQE6ATsBPAE9AT4BPwEKAH0BQQFCAUMBRAFFAUYBRwFIANpeTlNJc1Jlc2l6
SGVhZGVyQ2VsbFxOU0lkZW50aWZpZXJXTlNXaWR0aFpOU0RhdGFDZWxsXk5TUmVzaXppbmdNYXNrWk5T ZWFibGVcTlNIZWFkZXJDZWxsXE5TSWRlbnRpZmllcldOU1dpZHRoWk5TRGF0YUNlbGxeTlNSZXNpemlu
TWluV2lkdGhaTlNNYXhXaWR0aAmAPYArgCojQGAAAAAAAACANRADI0BEgAAAAAAAI0CPQAAAAAAAgB1V Z01hc2taTlNNaW5XaWR0aFpOU01heFdpZHRoCYA9gCuAKiNAYAAAAAAAAIA1EAMjQESAAAAAAAAjQI9A
dGl0bGXXAIIADgDoAIcAiACLAUwBTQFOAU8BUAFRAPMBUltOU1RleHRDb2xvchIEgf4AgDSALoAsgC2A AAAAAACAHVV0aXRsZdcAggAOAOgAhwCIAIsBTAFNAU4BTwFQAVEA8wFSW05TVGV4dENvbG9yEgSB/gCA
MFVUaXRsZdQADgCbAJwAnQCeAVYAoAFYgBUjQCYAAAAAAACAFBEMHNMADgFaAVsBXAFGAV1cTlNDb2xv NIAugCyALYAwVVRpdGxl1AAOAJsAnACdAJ4BVgCgAViAFSNAJgAAAAAAAIAUEQwc0wAOAVoBWwFcAUYB
clNwYWNlV05TV2hpdGWAL0swLjMzMzMzMjk5ANIANwA4AV8BYKIBYAA7V05TQ29sb3LVAA4BYAFaAWIB XVxOU0NvbG9yU3BhY2VXTlNXaGl0ZYAvSzAuMzMzMzMyOTkA0gA3ADgBXwFgogFgADtXTlNDb2xvctUA
YwFcAWUBZgFnAWhbTlNDb2xvck5hbWVdTlNDYXRhbG9nTmFtZYAvgDMQBoAygDFWU3lzdGVtXxAPaGVh DgFgAVoBYgFjAVwBZQFmAWcBaFtOU0NvbG9yTmFtZV1OU0NhdGFsb2dOYW1lgC+AMxAGgDKAMVZTeXN0
ZGVyVGV4dENvbG9y0wAOAVoBWwFcAUYBbYAvQjAA0gA3ADgBbwFwpQFwAXEAqgB2ADtfEBFOU1RhYmxl ZW1fEA9oZWFkZXJUZXh0Q29sb3LTAA4BWgFbAVwBRgFtgC9CMADSADcAOAFvAXClAXABcQCqAHYAO18Q
SGVhZGVyQ2VsbF8QD05TVGV4dEZpZWxkQ2VsbNgAggAOAOgAhwCIAIkAiwFMAXMBdADcAXYAlADaAXkB EU5TVGFibGVIZWFkZXJDZWxsXxAPTlNUZXh0RmllbGRDZWxs2ACCAA4A6ACHAIgAiQCLAUwBcwF0ANwB
ehIUIf5AgDyAN4A2gBOAHREIAIA6WVRleHQgQ2VsbNUADgFgAVoBYgFjAVwBfgFmAX8BaIAvgDmAOIAx dgCUANoBeQF6EhQh/kCAPIA3gDaAE4AdEQgAgDpZVGV4dCBDZWxs1QAOAWABWgFiAWMBXAF+AWYBfwFo
XxAWY29udHJvbEJhY2tncm91bmRDb2xvctMADgFaAVsBXAFGAYSAL0swLjY2NjY2NjY5ANUADgFgAVoB gC+AOYA4gDFfEBZjb250cm9sQmFja2dyb3VuZENvbG9y0wAOAVoBWwFcAUYBhIAvSzAuNjY2NjY2NjkA
YgFjAVwBZQFmAYgBaIAvgDOAO4AxXxAQY29udHJvbFRleHRDb2xvctIANwA4AYwBcaQBcQCqAHYAO9IA 1QAOAWABWgFiAWMBXAFlAWYBiAFogC+AM4A7gDFfEBBjb250cm9sVGV4dENvbG9y0gA3ADgBjAFxpAFx
NwA4AY4Bj6IBjwA7XU5TVGFibGVDb2x1bW7aATgADgE5AToBOwE8AT0BPgE/AQoAfQFBAZMBlAGVAZYB AKoAdgA70gA3ADgBjgGPogGPADtdTlNUYWJsZUNvbHVtbtoBOAAOATkBOgE7ATwBPQE+AT8BCgB9AUEB
RgGXAUgA2gmAPYBAgD8jQF7AAAAAAACARSNAQgAAAAAAAIAdVmFydGlzdNcAggAOAOgAhwCIAIsBTACN kwGUAZUBlgFGAZcBSADaCYA9gECAPyNAXsAAAAAAAIBFI0BCAAAAAAAAgB1WYXJ0aXN01wCCAA4A6ACH
AU4BnAGdAVEA8wFSgDSAQoBBgC2AMFZBcnRpc3TVAA4BYAFaAWIBYwFcAaMBZgGkAWiAL4BEgEOAMVto AIgAiwFMAI0BTgGcAZ0BUQDzAVKANIBCgEGALYAwVkFydGlzdNUADgFgAVoBYgFjAVwBowFmAaQBaIAv
ZWFkZXJDb2xvctMADgFaAVsBXAFGAamAL0IxANgAggAOAOgAhwCIAIkAiwFMAXMBdADcAXYAlADaAXkB gESAQ4AxW2hlYWRlckNvbG9y0wAOAVoBWwFcAUYBqYAvQjEA2ACCAA4A6ACHAIgAiQCLAUwBcwF0ANwB
eoA8gDeANoATgB2AOtoBOAAOATkBOgE7ATwBPQE+AT8BCgB9AUEBtAG1AbYBtwFGAbgBSADaCYA9gEiA dgCUANoBeQF6gDyAN4A2gBOAHYA62gE4AA4BOQE6ATsBPAE9AT4BPwEKAH0BQQG0AbUBtgG3AUYBuAFI
RyNAX0AAAAAAAIBKI0BDgAAAAAAAgB1VYWxidW3XAIIADgDoAIcAiACLAUwAjQFOAZwBvgFRAPMBUoA0 ANoJgD2ASIBHI0BfQAAAAAAAgEojQEOAAAAAAACAHVVhbGJ1bdcAggAOAOgAhwCIAIsBTACNAU4BnAG+
gEKASYAtgDBVQWxidW3YAIIADgDoAIcAiACJAIsBTAFzAXQA3AF2AJQA2gF5AXqAPIA3gDaAE4AdgDrb AVEA8wFSgDSAQoBJgC2AMFVBbGJ1bdgAggAOAOgAhwCIAIkAiwFMAXMBdADcAXYAlADaAXkBeoA8gDeA
ATgBygE5AToADgE7ATwBPQE+AT8BCgB9AH0BzQHOAUEB0AHRAUYB0gFIANpYTlNIaWRkZW4JCYBNgEyA NoATgB2AOtsBOAHKATkBOgAOATsBPAE9AT4BPwEKAH0AfQHNAc4BQQHQAdEBRgHSAUgA2lhOU0hpZGRl
PSNASQAAAAAAAIBPI0BET2AgAAAAgB1WbGVuZ3Ro1wCCAA4A6ACHAIgAiwFMAI0BTgGcAdgBUQHaAVKA bgkJgE2ATIA9I0BJAAAAAAAAgE8jQERPYCAAAACAHVZsZW5ndGjXAIIADgDoAIcAiACLAUwAjQFOAZwB
NIBCgE6ALRIEAAAAgDBWTGVuZ3Ro2ACCAA4A6ACHAIgAiQCLAUwBcwF0ANwB4ACUANoB4wF6gDyAN4BQ 2AFRAdoBUoA0gEKAToAtEgQAAACAMFZMZW5ndGjYAIIADgDoAIcAiACJAIsBTAFzAXQA3AHgAJQA2gHj
gBOAHRIEAAgAgDrbATgBygE5AToADgE7ATwBPQE+AT8BCgB9AH0B6AHpAUEB6wHsAUYB7QFIANoJCYBT AXqAPIA3gFCAE4AdEgQACACAOtsBOAHKATkBOgAOATsBPAE9AT4BPwEKAH0AfQHoAekBQQHrAewBRgHt
gFKAPSNAR4AAAAAAAIBVI0AkAAAAAAAAgB1UeWVhctcAggAOAOgAhwCIAIsBTACNAU4BnAHzAVEB2gFS AUgA2gkJgFOAUoA9I0BHgAAAAAAAgFUjQCQAAAAAAACAHVR5ZWFy1wCCAA4A6ACHAIgAiwFMAI0BTgGc
gDSAQoBUgC2AMFRZZWFy2ACCAA4A6ACHAIgAiQCLAUwBcwF0ANwB4ACUANoB4wF6gDyAN4BQgBOAHYA6 AfMBUQHaAVKANIBCgFSALYAwVFllYXLYAIIADgDoAIcAiACJAIsBTAFzAXQA3AHgAJQA2gHjAXqAPIA3
2wE4AcoBOQE6AA4BOwE8AT0BPgE/AQoAfQB9AgECAgFBAgQCBQFGAe0BSADaCQmAWIBXgD0jQEcAAAAA gFCAE4AdgDrbATgBygE5AToADgE7ATwBPQE+AT8BCgB9AH0CAQICAUECBAIFAUYB7QFIANoJCYBYgFeA
AACAWoAdVWdlbnJl1wCCAA4A6ACHAIgAiwFMAI0BTgGcAgsBUQDzAVKANIBCgFmALYAwVUdlbnJl2ACC PSNARwAAAAAAAIBagB1VZ2VucmXXAIIADgDoAIcAiACLAUwAjQFOAZwCCwFRAPMBUoA0gEKAWYAtgDBV
AA4A6ACHAIgAiQCLAUwBcwF0ANwB4ACUANoBeQF6gDyAN4BQgBOAHYA62gE4AA4BOQE6ATsBPAE9AT4B R2VucmXYAIIADgDoAIcAiACJAIsBTAFzAXQA3AHgAJQA2gF5AXqAPIA3gFCAE4AdgDraATgADgE5AToB
PwEKAH0BQQIZAhoCGwIcAUYCHQIbANoJgD2AXYBcI0BKAAAAAAAAgF8jQCAAAAAAAACAHVV0cmFja9cA OwE8AT0BPgE/AQoAfQFBAhkCGgIbAhwBRgIdAhsA2gmAPYBdgFwjQEoAAAAAAACAXyNAIAAAAAAAAIAd
ggAOAOgAhwCIAIsBTACNAU4BnAIjAVEB2gFSgDSAQoBegC2AMFVUcmFja9gAggAOAOgAhwCIAIkAiwFM VXRyYWNr1wCCAA4A6ACHAIgAiwFMAI0BTgGcAiMBUQHaAVKANIBCgF6ALYAwVVRyYWNr2ACCAA4A6ACH
AXMBdADcAXYAlADaAeMBeoA8gDeANoATgB2AOtIANwA4Ai8CMKMCMAIxADteTlNNdXRhYmxlQXJyYXlX AIgAiQCLAUwBcwF0ANwBdgCUANoB4wF6gDyAN4A2gBOAHYA60gA3ADgCLwIwowIwAjEAO15OU011dGFi
TlNBcnJhedUADgFgAVoBYgFjAVwCNAFmAjUBaIAvgGOAYoAxWWdyaWRDb2xvctMADgFaAVsBXAFGAjqA bGVBcnJheVdOU0FycmF51QAOAWABWgFiAWMBXAI0AWYCNQFogC+AY4BigDFZZ3JpZENvbG9y0wAOAVoB
L0QwLjUAXxAUQ29nU3BvdGxpZ2h0UGxheWxpc3TSADcAOAI9Aj6iAj4AO15OU0NsYXNzU3dhcHBlcl8Q WwFcAUYCOoAvRDAuNQBfEBRDb2dTcG90bGlnaHRQbGF5bGlzdNIANwA4Aj0CPqICPgA7Xk5TQ2xhc3NT
FXt7MCwgMTd9LCB7NDQwLCAyMTF9fdIANwA4AkECQqQCQgCvALAAO1pOU0NsaXBWaWV32QBfAkQADgB1 d2FwcGVyXxAVe3swLCAxN30sIHs0NDAsIDIxMX190gA3ADgCQQJCpAJCAK8AsAA7Wk5TQ2xpcFZpZXfZ
AGEAYwJFAGQCRgBwAHACSQJKASYAZQJMAHACTlhOU1RhcmdldFhOU0FjdGlvbllOU1BlcmNlbnSAGYAZ AF8CRAAOAHUAYQBjAkUAZAJGAHAAcAJJAkoBJgBlAkwAcAJOWE5TVGFyZ2V0WE5TQWN0aW9uWU5TUGVy
gGuAaYANgGqAGSM/6jeEoAAAAF8QFHt7ODUsIDE3fSwgezE1LCA2OH19XF9kb1Njcm9sbGVyOtIANwA4 Y2VudIAZgBmAa4BpgA2AaoAZIz/qN4SgAAAAXxAUe3s4NSwgMTd9LCB7MTUsIDY4fX1cX2RvU2Nyb2xs
AlICU6UCUwCuAK8AsAA7Wk5TU2Nyb2xsZXLaAF8CRAAOAHUAswBhAGMCRQBkAkYAcABwAkkCWAD8ASYA ZXI60gA3ADgCUgJTpQJTAK4ArwCwADtaTlNTY3JvbGxlctoAXwJEAA4AdQCzAGEAYwJFAGQCRgBwAHAC
ZQJMAHACXIAZgBmAa4BtgA2AaoAZIz/tpGEAAAAAXxAVe3swLCAyMTN9LCB7NDQwLCAxNX190gAOAD4A SQJYAPwBJgBlAkwAcAJcgBmAGYBrgG2ADYBqgBkjP+2kYQAAAABfEBV7ezAsIDIxM30sIHs0NDAsIDE1
bQJggGChAPeAIV8QFnt7MjAsIDQ0fSwgezQ0MCwgMjI4fX3SADcAOAJkAmWkAmUArwCwADtcTlNTY3Jv fX3SAA4APgBtAmCAYKEA94AhXxAWe3syMCwgNDR9LCB7NDQwLCAyMjh9fdIANwA4AmQCZaQCZQCvALAA
bGxWaWV32ABfAA4AdQB2AGEAdwBjAGQATgJoAmkCagJrAH0AZQBOgAyAhYBzgHQRAQoJgA2ADF8QFnt7 O1xOU1Njcm9sbFZpZXfYAF8ADgB1AHYAYQB3AGMAZABOAmgCaQJqAmsAfQBlAE6ADICFgHOAdBEBCgmA
MjAsIDI4Mn0sIHszMTMsIDIyfX3dAIIADgJxAOgAhwCIAIkAiwJyAnMCdAJ1AUwCdgJ3AngCeQCPAJQA DYAMXxAWe3syMCwgMjgyfSwgezMxMywgMjJ9fd0AggAOAnEA6ACHAIgAiQCLAnICcwJ0AnUBTAJ2AncC
cQJ9APwAfQJ/AoABel8QEk5TQ2FuY2VsQnV0dG9uQ2VsbF8QEE5TVGV4dEJlemVsU3R5bGVfEBFOU0Ry eAJ5AI8AlABxAn0A/AB9An8CgAF6XxASTlNDYW5jZWxCdXR0b25DZWxsXxAQTlNUZXh0QmV6ZWxTdHls
YXdzQmFja2dyb3VuZF8QEk5TU2VhcmNoQnV0dG9uQ2VsbF8QEE5TTWF4aW11bVJlY2VudHMSFHH+QICE ZV8QEU5TRHJhd3NCYWNrZ3JvdW5kXxASTlNTZWFyY2hCdXR0b25DZWxsXxAQTlNNYXhpbXVtUmVjZW50
gHqAdYAWgBOAchIQAAQACYB3EP+AOtUADgFgAVoBYgFjAVwBowFmAoUBaIAvgESAdoAxXxATdGV4dEJh cxIUcf5AgISAeoB1gBaAE4ByEhAABAAJgHcQ/4A61QAOAWABWgFiAWMBXAGjAWYChQFogC+ARIB2gDFf
Y2tncm91bmRDb2xvctwCRACCAA4AhACFAIYAhwCJAIoAiwJFAIwCagKKAI4CjADzAI8CjgBxApAA8wKR EBN0ZXh0QmFja2dyb3VuZENvbG9y3AJEAIIADgCEAIUAhgCHAIkAigCLAkUAjAJqAooAjgKMAPMAjwKO
ApKAdBIAAf4AgBcQS4AWgHiAchEBkIB5EghEQP9Wc2VhcmNoXxATX3NlYXJjaEZpZWxkU2VhcmNoOt0C AHECkADzApECkoB0EgAB/gCAFxBLgBaAeIByEQGQgHkSCERA/1ZzZWFyY2hfEBNfc2VhcmNoRmllbGRT
RACCAA4AhACFAIYClgCHAIkAigCLAkUAjAJqAooAjgKMAPMAjwKaApsAcQKQAPMCnQKSXxAjTlNBY2Nl ZWFyY2g63QJEAIIADgCEAIUAhgKWAIcAiQCKAIsCRQCMAmoCigCOAowA8wCPApoCmwBxApAA8wKdApJf
c3NpYmlsaXR5T3ZlcnJpZGRlbkF0dHJpYnV0ZXOAdIAXgBaAfIB7gHKAg1VjbGVhctIADgA+AG0CoYBg ECNOU0FjY2Vzc2liaWxpdHlPdmVycmlkZGVuQXR0cmlidXRlc4B0gBeAFoB8gHuAcoCDVWNsZWFy0gAO
oQKigH3TAA4CpAA+AqUCpgKpV05TLmtleXOAgqICpwKogH6Af6ICqgKrgICAgV1BWERlc2NyaXB0aW9u AD4AbQKhgGChAqKAfdMADgKkAD4CpQKmAqlXTlMua2V5c4CCogKnAqiAfoB/ogKqAquAgICBXUFYRGVz
XxApTlNBY2Nlc3NpYmlsaXR5RW5jb2RlZEF0dHJpYnV0ZXNWYWx1ZVR5cGVWY2FuY2Vs0gA3ADgCsAKx Y3JpcHRpb25fEClOU0FjY2Vzc2liaWxpdHlFbmNvZGVkQXR0cmlidXRlc1ZhbHVlVHlwZVZjYW5jZWzS
owKxArIAO18QE05TTXV0YWJsZURpY3Rpb25hcnlcTlNEaWN0aW9uYXJ5XxATX3NlYXJjaEZpZWxkQ2Fu ADcAOAKwArGjArECsgA7XxATTlNNdXRhYmxlRGljdGlvbmFyeVxOU0RpY3Rpb25hcnlfEBNfc2VhcmNo
Y2VsOtIANwA4ArUCtqUCtgFxAKoAdgA7XxARTlNTZWFyY2hGaWVsZENlbGzSADcAOAK4ArmmArkCugCu RmllbGRDYW5jZWw60gA3ADgCtQK2pQK2AXEAqgB2ADtfEBFOU1NlYXJjaEZpZWxkQ2VsbNIANwA4ArgC
AK8AsAA7XU5TU2VhcmNoRmllbGRbTlNUZXh0RmllbGTYAF8ADgB1AHYAYQB3AGMAZABOAr0CvgK/AsAA uaYCuQK6AK4ArwCwADtdTlNTZWFyY2hGaWVsZFtOU1RleHRGaWVsZNgAXwAOAHUAdgBhAHcAYwBkAE4C
fQBlAE6ADICMgIeAiBEBIQmADYAMXxAUe3s4OCwgMTR9LCB7OTYsIDE3fX3YAIIADgDoAIcAiACJAIsB vQK+Ar8CwAB9AGUAToAMgIyAh4CIEQEhCYANgAxfEBR7ezg4LCAxNH0sIHs5NiwgMTd9fdgAggAOAOgA
TALGAXQCyALJAJQAcgLMAXoSBAH+QIA8gIqAiYATgIYSEEAEAIA6XFNlYXJjaCBQYXRoOtUADgFgAVoB hwCIAIkAiwFMAsYBdALIAskAlAByAswBehIEAf5AgDyAioCJgBOAhhIQQAQAgDpcU2VhcmNoIFBhdGg6
YgFjAVwBfgFmAtIBaIAvgDmAi4AxXGNvbnRyb2xDb2xvctIANwA4AtYCuqUCugCuAK8AsAA72QBfAA4A 1QAOAWABWgFiAWMBXAF+AWYC0gFogC+AOYCLgDFcY29udHJvbENvbG9y0gA3ADgC1gK6pQK6AK4ArwCw
dQB2AtgAYQB3AGMAZABOAtoC2wLcAt0CwAB9AGUATltOU0RyYWdUeXBlc4AMgJaAkoCTgI4JgA2ADNIA ADvZAF8ADgB1AHYC2ABhAHcAYwBkAE4C2gLbAtwC3QLAAH0AZQBOW05TRHJhZ1R5cGVzgAyAloCSgJOA
DgA+AD8C44CRogLkAuWAj4CQXxAZQXBwbGUgVVJMIHBhc3RlYm9hcmQgdHlwZV8QFU5TRmlsZW5hbWVz jgmADYAM0gAOAD4APwLjgJGiAuQC5YCPgJBfEBlBcHBsZSBVUkwgcGFzdGVib2FyZCB0eXBlXxAVTlNG
UGJvYXJkVHlwZdIANwA4AukC6qMC6gLrADtcTlNNdXRhYmxlU2V0VU5TU2V0XxAWe3sxODksIDEwfSwg aWxlbmFtZXNQYm9hcmRUeXBl0gA3ADgC6QLqowLqAusAO1xOU011dGFibGVTZXRVTlNTZXRfEBZ7ezE4
ezI3MSwgMjZ9fdgC7gCCAA4AiACJAIsC7wLwAFYC8QLyAJQAcwL1AvYAc1tOU1BhdGhTdHlsZV8QFE5T OSwgMTB9LCB7MjcxLCAyNn192ALuAIIADgCIAIkAiwLvAvAAVgLxAvIAlABzAvUC9gBzW05TUGF0aFN0
UGF0aENvbXBvbmVudENlbGxzWk5TRGVsZWdhdGUSFCH+AYCVgBOAjRGAAICUgI3SAA4APgBtAvqAYKDS eWxlXxAUTlNQYXRoQ29tcG9uZW50Q2VsbHNaTlNEZWxlZ2F0ZRIUIf4BgJWAE4CNEYAAgJSAjdIADgA+
ADcAOAL8Av2kAv0AqgB2ADtaTlNQYXRoQ2VsbNIANwA4Av8DAKUDAACuAK8AsAA7XU5TUGF0aENvbnRy AG0C+oBgoNIANwA4AvwC/aQC/QCqAHYAO1pOU1BhdGhDZWxs0gA3ADgC/wMApQMAAK4ArwCwADtdTlNQ
b2xaezQ4MCwgMzIwfdIANwA4AwMAr6MArwCwADtfEBV7ezAsIDB9LCB7MTI4MCwgNzc4fX1aezQwMCwg YXRoQ29udHJvbFp7NDgwLCAzMjB90gA3ADgDAwCvowCvALAAO18QFXt7MCwgMH0sIHsxMjgwLCA3Nzh9
Mjc2fdIANwA4AwcDCKIDCAA7XxAQTlNXaW5kb3dUZW1wbGF0ZdIADgA+AG0DC4BgrxARAwwDDQMOAw8D fVp7NDAwLCAyNzZ90gA3ADgDBwMIogMIADtfEBBOU1dpbmRvd1RlbXBsYXRl0gAOAD4AbQMLgGCvEBID
EAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHICegKiAqoCsgK6AsICygLSAuYC9gMOAx4DLgM+A04DXgNvU DAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx2AnoCogKqArICugLGAs4C1gLeAvIDAgMaA
AA4DHgMfAyADIQMiANoDJF1OU0Rlc3RpbmF0aW9uWE5TU291cmNlV05TTGFiZWyAp4CfgB2AptwDJgAO yoDOgNKA1oDagN7UAA4DHwMgAyEDIgMjANoDJV1OU0Rlc3RpbmF0aW9uWE5TU291cmNlV05TTGFiZWyA
AycA5gMoAykDKgMrAywAMgMtAy4AfQD0AH0DMgB9AzQDNQM2AH0DOAB9AH1fEBpOU0ZpbHRlclJlc3Ry p4CfgB2AptwDJwAOAygA5gMpAyoDKwMsAy0AMgMuAy8AfQD0AH0DMwB9AzUDNgM3AH0DOQB9AH1fEBpO
aWN0c0luc2VydGlvbl8QFE5TUHJlc2VydmVzU2VsZWN0aW9uWk5TRWRpdGFibGVfEA9fTlNNYW5hZ2Vk U0ZpbHRlclJlc3RyaWN0c0luc2VydGlvbl8QFE5TUHJlc2VydmVzU2VsZWN0aW9uWk5TRWRpdGFibGVf
UHJveHlfEBFOU09iamVjdENsYXNzTmFtZV5OU0RlY2xhcmVkS2V5c18QIk5TQ2xlYXJzRmlsdGVyUHJl EA9fTlNNYW5hZ2VkUHJveHlfEBFOU09iamVjdENsYXNzTmFtZV5OU0RlY2xhcmVkS2V5c18QIk5TQ2xl
ZGljYXRlT25JbnNlcnRpb25fEBhOU1NlbGVjdHNJbnNlcnRlZE9iamVjdHNfEBZOU0F2b2lkc0VtcHR5 YXJzRmlsdGVyUHJlZGljYXRlT25JbnNlcnRpb25fEBhOU1NlbGVjdHNJbnNlcnRlZE9iamVjdHNfEBZO
U2VsZWN0aW9uCYBlCYChCYCkgKOAogmAoAkJXxAbU3BvdGxpZ2h0UGxheWxpc3RDb250cm9sbGVyXxAR U0F2b2lkc0VtcHR5U2VsZWN0aW9uCYBlCYChCYCkgKOAogmAoAkJXxAbU3BvdGxpZ2h0UGxheWxpc3RD
TlNBcnJheUNvbnRyb2xsZXLSAA4APgBtAz+AYKgBUAFDAekBlAG1AgIBzgIagCyAKoBSgD+AR4BXgEyA b250cm9sbGVyXxARTlNBcnJheUNvbnRyb2xsZXLSAA4APgBtA0CAYKgBUAFDAekBlAG1AgIBzgIagCyA
XF1QbGF5bGlzdEVudHJ50QAOA0qApdIANwA4A0wDKaIDKQA7WmRhdGFTb3VyY2XSADcAOANPA1CjA1AD KoBSgD+AR4BXgEyAXF1QbGF5bGlzdEVudHJ50QAOA0uApdIANwA4A00DKqIDKgA7WmRhdGFTb3VyY2XS
UQA7XxAUTlNOaWJPdXRsZXRDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LUAA4DHgMfAyADIQDaAyIDVoCn ADcAOANQA1GjA1EDUgA7XxAUTlNOaWJPdXRsZXRDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LUAA4DHwMg
gB2An4CpWXRhYmxlVmlld9QADgMeAx8DIAMhAyIAHwNcgKeAn4ACgKtfEBJwbGF5bGlzdENvbnRyb2xs AyEDIgDaAyMDV4CngB2An4CpWXRhYmxlVmlld9QADgMfAyADIQMiAyMAHwNdgKeAn4ACgKtfEBJwbGF5
ZXLUAA4DHgMfAyADIQBxAEEDYoCngHKAB4CtXxAVaW5pdGlhbEZpcnN0UmVzcG9uZGVy1AAOAx4DHwMg bGlzdENvbnRyb2xsZXLUAA4DHwMgAyEDIgBxAEEDY4CngHKAB4CtXxAVaW5pdGlhbEZpcnN0UmVzcG9u
AyEAHwMiA2iAp4ACgJ+Ar18QGXNwb3RsaWdodFdpbmRvd0NvbnRyb2xsZXLUAA4DHgMfAyADIQBzAB8D ZGVy1AAOAx8DIAMhA2YAHwBvA2mAsIACgA+Ar15hZGRUb1BsYXlsaXN0OtIANwA4A2wDbaMDbQNSADtf
boCngI2AAoCxW3BhdGhDb250cm9s1AAOAx4DHwMgAyEAQQAfA3SAp4AHgAKAs1Z3aW5kb3fXAA4DHgN3 EBVOU05pYkNvbnRyb2xDb25uZWN0b3LUAA4DHwMgAyEDIgAfAyMDcoCngAKAn4CyXxAZc3BvdGxpZ2h0
A3gDHwMgA3kDegAfA3wDfQBxA38AVllOU0tleVBhdGhZTlNCaW5kaW5nXxAcTlNOaWJCaW5kaW5nQ29u V2luZG93Q29udHJvbGxlctQADgMfAyADIQMiAHMAHwN4gKeAjYACgLRbcGF0aENvbnRyb2zUAA4DHwMg
bmVjdG9yVmVyc2lvboC4gAKAt4C2gHKAtV8QE3ZhbHVlOiBzZWFyY2hTdHJpbmdVdmFsdWVcc2VhcmNo AyEDIgBBAB8DfoCngAeAAoC2VndpbmRvd9cADgMfA4EDggMgAyEDgwOEAB8DhgOHAHEDiQBWWU5TS2V5
U3RyaW5n0gA3ADgDhAOFowOFA1EAO18QFU5TTmliQmluZGluZ0Nvbm5lY3RvctcADgMeA3cDeAMfAyAD UGF0aFlOU0JpbmRpbmdfEBxOU05pYkJpbmRpbmdDb25uZWN0b3JWZXJzaW9ugLuAAoC6gLmAcoC4XxAT
eQN6AB8DiQOKAyIDjABWgLiAAoC8gLuAn4C6XxAbY29udGVudEFycmF5OiBxdWVyeS5yZXN1bHRzXGNv dmFsdWU6IHNlYXJjaFN0cmluZ1V2YWx1ZVxzZWFyY2hTdHJpbmfSADcAOAOOA4+jA48DUgA7XxAVTlNO
bnRlbnRBcnJheV1xdWVyeS5yZXN1bHRz2AAOAx4DdwN4Ax8DIAORA3kDegMiA5QDfQE2A5cDmABWWU5T aWJCaW5kaW5nQ29ubmVjdG9y1wAOAx8DgQOCAyADIQODA4QAHwOTA5QDIwOWAFaAu4ACgL+AvoCfgL1f
T3B0aW9uc4C4gJ+Av4C2gFuAvoDAXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy50cmFja18QFWFycmFu EBtjb250ZW50QXJyYXk6IHF1ZXJ5LnJlc3VsdHNcY29udGVudEFycmF5XXF1ZXJ5LnJlc3VsdHPYAA4D
Z2VkT2JqZWN0cy50cmFja9MADgKkAD4DnAOdA5+AwqEDnoDBoQKrgIFfEBtOU0NvbmRpdGlvbmFsbHlT HwOBA4IDIAMhA5sDgwOEAyMDngOHATYDoQOiAFZZTlNPcHRpb25zgLuAn4DCgLmAW4DBgMNfEBx2YWx1
ZXRzRWRpdGFibGXSADcAOAOjArKiArIAO9gADgMeA3cDeAMfAyADkQN5A3oDIgOnA30BMAOqA6sAVoC4 ZTogYXJyYW5nZWRPYmplY3RzLnRyYWNrXxAVYXJyYW5nZWRPYmplY3RzLnRyYWNr0wAOAqQAPgOmA6cD
gJ+AxYC2gCmAxIDGXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy50aXRsZV8QFWFycmFuZ2VkT2JqZWN0 qYDFoQOogMShAquAgV8QG05TQ29uZGl0aW9uYWxseVNldHNFZGl0YWJsZdIANwA4A60CsqICsgA72AAO
cy50aXRsZdMADgKkAD4DnAOwA7KAwqEDnoDBoQKrgIHYAA4DHgN3A3gDHwMgA5EDeQN6AyIDtwN9ATMD Ax8DgQOCAyADIQObA4MDhAMjA7EDhwEwA7QDtQBWgLuAn4DIgLmAKYDHgMlfEBx2YWx1ZTogYXJyYW5n
ugO7AFaAuICfgMmAtoBLgMiAyl8QHXZhbHVlOiBhcnJhbmdlZE9iamVjdHMubGVuZ3RoXxAWYXJyYW5n ZWRPYmplY3RzLnRpdGxlXxAVYXJyYW5nZWRPYmplY3RzLnRpdGxl0wAOAqQAPgOmA7oDvIDFoQOogMSh
ZWRPYmplY3RzLmxlbmd0aNMADgKkAD4DnAPAA8KAwqEDnoDBoQKrgIHYAA4DHgN3A3gDHwMgA5EDeQN6 AquAgdgADgMfA4EDggMgAyEDmwODA4QDIwPBA4cBMwPEA8UAVoC7gJ+AzIC5gEuAy4DNXxAddmFsdWU6
AyIDxwN9ATEDygPLAFaAuICfgM2AtoA+gMyAzl8QHXZhbHVlOiBhcnJhbmdlZE9iamVjdHMuYXJ0aXN0 IGFycmFuZ2VkT2JqZWN0cy5sZW5ndGhfEBZhcnJhbmdlZE9iamVjdHMubGVuZ3Ro0wAOAqQAPgOmA8oD
XxAWYXJyYW5nZWRPYmplY3RzLmFydGlzdNMADgKkAD4DnAPQA9KAwqEDnoDBoQKrgIHYAA4DHgN3A3gD zIDFoQOogMShAquAgdgADgMfA4EDggMgAyEDmwODA4QDIwPRA4cBMQPUA9UAVoC7gJ+A0IC5gD6Az4DR
HwMgA5EDeQN6AyID1wN9ATQD2gPbAFaAuICfgNGAtoBRgNCA0l8QG3ZhbHVlOiBhcnJhbmdlZE9iamVj XxAddmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5hcnRpc3RfEBZhcnJhbmdlZE9iamVjdHMuYXJ0aXN00wAO
dHMueWVhcl8QFGFycmFuZ2VkT2JqZWN0cy55ZWFy0wAOAqQAPgOcA+AD4oDCoQOegMGhAquAgdgADgMe AqQAPgOmA9oD3IDFoQOogMShAquAgdgADgMfA4EDggMgAyEDmwODA4QDIwPhA4cBNAPkA+UAVoC7gJ+A
A3cDeAMfAyADkQN5A3oDIgPnA30BNQPqA+sAVoC4gJ+A1YC2gFaA1IDWXxAcdmFsdWU6IGFycmFuZ2Vk 1IC5gFGA04DVXxAbdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy55ZWFyXxAUYXJyYW5nZWRPYmplY3RzLnll
T2JqZWN0cy5nZW5yZV8QFWFycmFuZ2VkT2JqZWN0cy5nZW5yZdMADgKkAD4DnAPwA/KAwqEDnoDBoQKr YXLTAA4CpAA+A6YD6gPsgMWhA6iAxKECq4CB2AAOAx8DgQOCAyADIQObA4MDhAMjA/EDhwE1A/QD9QBW
gIHYAA4DHgN3A3gDHwMgA5EDeQN6AyID9wN9ATID+gP7AFaAuICfgNmAtoBGgNiA2l8QHHZhbHVlOiBh gLuAn4DYgLmAVoDXgNlfEBx2YWx1ZTogYXJyYW5nZWRPYmplY3RzLmdlbnJlXxAVYXJyYW5nZWRPYmpl
cnJhbmdlZE9iamVjdHMuYWxidW1fEBVhcnJhbmdlZE9iamVjdHMuYWxidW3TAA4CpAA+A5wEAAQCgMKh Y3RzLmdlbnJl0wAOAqQAPgOmA/oD/IDFoQOogMShAquAgdgADgMfA4EDggMgAyEDmwODA4QDIwQBA4cB
A56AwaECq4CB2AAOAx4DdwN4Ax8DIAORA3kDegAfBAcDfQBzBAoECwBWgLiAAoDdgLaAjYDcgN5fEBp2 MgQEBAUAVoC7gJ+A3IC5gEaA24DdXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5hbGJ1bV8QFWFycmFu
YWx1ZTogc3BvdGxpZ2h0U2VhcmNoUGF0aF8QE3Nwb3RsaWdodFNlYXJjaFBhdGjTAA4CpAA+A5wEEAQS Z2VkT2JqZWN0cy5hbGJ1bdMADgKkAD4DpgQKBAyAxaEDqIDEoQKrgIHYAA4DHwOBA4IDIAMhA5sDgwOE
gMKhBBGA36EEE4DgXxAWTlNWYWx1ZVRyYW5zZm9ybWVyTmFtZV8QFlN0cmluZ1RvVVJMVHJhbnNmb3Jt AB8EEQOHAHMEFAQVAFaAu4ACgOCAuYCNgN+A4V8QGnZhbHVlOiBzcG90bGlnaHRTZWFyY2hQYXRoXxAT
ZXLSAA4APgQXBBiA5K8QHwLcAhwEGwBwAUUB0QEwATYAQQDaAHsCvwDGAE4CagGWATQAcQExAyIAbwC7 c3BvdGxpZ2h0U2VhcmNoUGF0aNMADgKkAD4DpgQaBByAxaEEG4DioQQdgONfEBZOU1ZhbHVlVHJhbnNm
ATMBMgG3AewBNQBzAgUA9wBygJOAX4DigBmANYBPgCmAW4AHgB2AEYCIgGiADIB0gEWAUYBygD6An4AP b3JtZXJOYW1lXxAWU3RyaW5nVG9VUkxUcmFuc2Zvcm1lctIADgA+BCEEIoDnrxAfAtwCHAQlAHABRQHR
gGyAS4BGgEqAVYBWgI2AWoAhgIbSAA4AMgAzBDqABIDjXU5TQXBwbGljYXRpb27SADcAOAQ9AjGiAjEA ATABNgBBANoAewK/AMYATgJqAZYBNABxATEDIwBvALsBMwEyAbcB7AE1AHMCBQD3AHKAk4BfgOWAGYA1
O9IADgA+BBcEQIDkrxAfAHMBNgAfAE4BMAEzANoA2gAfAHAAbwByAHAAQQBxATEA2gBOANoAHwBOAHAA gE+AKYBbgAeAHYARgIiAaIAMgHSARYBRgHKAPoCfgA+AbIBLgEaASoBVgFaAjYBagCGAhtIADgAyADME
2gDaATIBNADaAE4BNQBwAE6AjYBbgAKADIApgEuAHYAdgAKAGYAPgIaAGYAHgHKAPoAdgAyAHYACgAyA RIAEgOZdTlNBcHBsaWNhdGlvbtIANwA4BEcCMaICMQA70gAOAD4EIQRKgOevEB8AcwE2AB8ATgEwATMA
GYAdgB2ARoBRgB2ADIBWgBmADNIADgA+BBcEYoDkrxAgAtwCHAQbAHABRQHRATABNgBBANoAxgB7Ar8A 2gDaAB8AcABvAHIAcABBAHEBMQDaAE4A2gAfAE4AcADaANoBMgE0ANoATgE1AHAAToCNgFuAAoAMgCmA
TgJqAZYDIgBxATQBMQBvALsBMwEyAB8A9wE1AHMB7AG3AgUAcoCTgF+A4oAZgDWAT4ApgFuAB4AdgGiA S4AdgB2AAoAZgA+AhoAZgAeAcoA+gB2ADIAdgAKADIAZgB2AHYBGgFGAHYAMgFaAGYAM0gAOAD4EIQRs
EYCIgAyAdIBFgJ+AcoBRgD6AD4BsgEuARoACgCGAVoCNgFWASoBagIbSAA4APgQXBIWA5K8QIASGBIcE gOevECAC3AIcBCUAcAFFAdEBMAE2AEEA2gDGAHsCvwBOAmoBlgMjAHEBNAExAG8AuwEzATIAHwD3ATUA
iASJBIoEiwSMBI0EjgSPBJAEkQSSBJMElASVBJYElwSYBJkEmgSbBJwEnQSeBJ8EoAShBKIEowSkBKWA cwHsAbcCBQBygJOAX4DlgBmANYBPgCmAW4AHgB2AaIARgIiADIB0gEWAn4BygFGAPoAPgGyAS4BGgAKA
6IDpgOqA64DsgO2A7oDvgPCA8YDygPOA9ID1gPaA94D4gPmA+oD7gPyA/YD+gP+BAQCBAQGBAQKBAQOB IYBWgI2AVYBKgFqAhtIADgA+BCEEj4DnrxAgBJAEkQSSBJMElASVBJYElwSYBJkEmgSbBJwEnQSeBJ8E
AQSBAQWBAQaBAQdZUGF0aCBDZWxsXxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTFbQXBwbGlj oAShBKIEowSkBKUEpgSnBKgEqQSqBKsErAStBK4Er4DrgOyA7YDugO+A8IDxgPKA84D0gPWA9oD3gPiA
YXRpb25bU2Nyb2xsIFZpZXdfEBtUZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbClfEB1UZXh0IEZpZWxk +YD6gPuA/ID9gP6A/4EBAIEBAYEBAoEBA4EBBIEBBYEBBoEBB4EBCIEBCYEBCllQYXRoIENlbGxfEB1U
IENlbGwgKFRleHQgQ2VsbCktNF8QFFRhYmxlIENvbHVtbiAodGl0bGUpXxAUVGFibGUgQ29sdW1uICh0 ZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMVtBcHBsaWNhdGlvbltTY3JvbGwgVmlld18QG1RleHQg
cmFjaylfEBtQYW5lbCAoT3BlbiBmcm9tIFNwb3RsaWdodClfEEpTcG90bGlnaHQgUGxheWxpc3QgVmll RmllbGQgQ2VsbCAoVGV4dCBDZWxsKV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS00XxAUVGFi
dyAoVGl0bGUsIEFydGlzdCwgQWxidW0sIExlbmd0aCwgWWVhciwgR2VucmUsIFRyYWNrKV8QEVZlcnRp bGUgQ29sdW1uICh0aXRsZSlfEBRUYWJsZSBDb2x1bW4gKHRyYWNrKV8QG1BhbmVsIChPcGVuIGZyb20g
Y2FsIFNjcm9sbGVyXxAdQnV0dG9uIENlbGwgKEFkZCB0byBQbGF5bGlzdClfEB5UZXh0IEZpZWxkIENl U3BvdGxpZ2h0KV8QSlNwb3RsaWdodCBQbGF5bGlzdCBWaWV3IChUaXRsZSwgQXJ0aXN0LCBBbGJ1bSwg
bGwgKFNlYXJjaCBQYXRoOilcQ29udGVudCBWaWV3XxARU2VhcmNoIEZpZWxkIENlbGxfEB1UZXh0IEZp TGVuZ3RoLCBZZWFyLCBHZW5yZSwgVHJhY2spXxARVmVydGljYWwgU2Nyb2xsZXJfEB1CdXR0b24gQ2Vs
ZWxkIENlbGwgKFRleHQgQ2VsbCktM18QHVNwb3RsaWdodCBQbGF5bGlzdCBDb250cm9sbGVyXFNlYXJj bCAoQWRkIHRvIFBsYXlsaXN0KV8QHlRleHQgRmllbGQgQ2VsbCAoU2VhcmNoIFBhdGg6KVxDb250ZW50
aCBGaWVsZF8QE1RhYmxlIENvbHVtbiAoeWVhcilfEBVUYWJsZSBDb2x1bW4gKGFydGlzdClfEB1QdXNo IFZpZXdfEBFTZWFyY2ggRmllbGQgQ2VsbF8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS0zXxAd
IEJ1dHRvbiAoQWRkIHRvIFBsYXlsaXN0KV8QE0hvcml6b250YWwgU2Nyb2xsZXJfEBVUYWJsZSBDb2x1 U3BvdGxpZ2h0IFBsYXlsaXN0IENvbnRyb2xsZXJcU2VhcmNoIEZpZWxkXxATVGFibGUgQ29sdW1uICh5
bW4gKGxlbmd0aClfEBRUYWJsZSBDb2x1bW4gKGFsYnVtKVxGaWxlJ3MgT3duZXJfEBFUYWJsZSBIZWFk ZWFyKV8QFVRhYmxlIENvbHVtbiAoYXJ0aXN0KV8QHVB1c2ggQnV0dG9uIChBZGQgdG8gUGxheWxpc3Qp
ZXIgVmlld18QFFRhYmxlIENvbHVtbiAoZ2VucmUpXxAaUG9wIFVwIFBhdGggQ29udHJvbCBXaWRnZXRf XxATSG9yaXpvbnRhbCBTY3JvbGxlcl8QFVRhYmxlIENvbHVtbiAobGVuZ3RoKV8QFFRhYmxlIENvbHVt
EB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMl8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxs biAoYWxidW0pXEZpbGUncyBPd25lcl8QEVRhYmxlIEhlYWRlciBWaWV3XxAUVGFibGUgQ29sdW1uIChn
KS01XxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTZfEBpTdGF0aWMgVGV4dCAoU2VhcmNoIFBh ZW5yZSlfEBpQb3AgVXAgUGF0aCBDb250cm9sIFdpZGdldF8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBD
dGg6KdIADgA+BBcEyIDkogDaAyKAHYCf0gAOAD4EFwTNgOSiAQMDOIAegKDSAA4APgQXBNKA5K8QMQLc ZWxsKS0yXxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTVfEB1UZXh0IEZpZWxkIENlbGwgKFRl
AxAEGwBwAUUBNgBBAw0AewK/AxgDFAJqAZYDDwE0ATEDEgBvALsDGgIFAB8A9wIcAdEDEwEwAxwA2gDG eHQgQ2VsbCktNl8QGlN0YXRpYyBUZXh0IChTZWFyY2ggUGF0aDop0gAOAD4EIQTSgOeiANoDI4AdgJ/S
Aw4ATgMbAxkDFwMiAHEDEQMMATMBMgG3AewBNQBzAxUDFgBygJOAroDigBmANYBbgAeAqIARgIiAy4C5 AA4APgQhBNeA56IBAwM5gB6AoNIADgA+BCEE3IDnrxAyAtwEJQBwAUUBNgBBAHsCvwMZAxUCagGWATQB
gHSARYCsgFGAPoCygA+AbIDTgFqAAoAhgF+AT4C0gCmA24AdgGiAqoAMgNeAz4DHgJ+AcoCwgJ6AS4BG MQBvALsDGwIFAB8A9wMSAhwDDQHRAxQDEQEwAx0A2gDGAw8DEwBOAxADHAMaAxgDIwBxAw4BMwEyAbcB
gEqAVYBWgI2AvYDDgIbSAA4APgQXBQaA5K8QMQUHBQgFCQUKBQsFDAKrBQ4FDwUQBREFEgUTBRQFFQUW 7AMXAHMBNQMWAwwAcoCTgOWAGYA1gFuAB4ARgIiAzoC8gHSARYBRgD6AD4BsgNaAWoACgCGAs4BfgKiA
BRcFGAUZBRoFGwUcBR0FHgUfBSAFIQUiBSMFJAUlBSYFJwUoBSkFKgUrBSwFLQUuBS8FMAUxBTIFMwU0 T4C3gLGAKYDegB2AaICsgLWADICugNqA0oDKgJ+AcoCqgEuARoBKgFWAxoCNgFaAwICegIbSAA4APgQh
BTUFNgU3gQEMgQENgQEOgQEPgQEQgQERgIGBARKBAROBARSBARWBARaBAReBARiBARmBARqBARuBARyB BRGA568QMgUSBRMFFAUVBRYCqwUYBRkFGgUbBRwFHQUeBR8FIAUhBSIFIwUkBSUFJgUnBSgFKQUqBSsF
AR2BAR6BAR+BASCBASGBASKBASOBASSBASWBASaBASeBASiBASmBASqBASuBASyBAS2BAS6BAS+BATCB LAUtBS4FLwUwBTEFMgUzBTQFNQU2BTcFOAU5BToFOwU8BT0FPgU/BUAFQQVCBUOBAQ+BARCBARGBARKB
ATGBATKBATOBATSBATWBATaBATeBATiBATmBATqBATsQWRCgE//////////9EBgQJRAdEJUQUBBoEKIQ AROAgYEBFIEBFYEBFoEBF4EBGIEBGYEBGoEBG4EBHIEBHYEBHoEBH4EBIIEBIYEBIoEBI4EBJIEBJYEB
OBAnED0QIhBIEAUQGhBmECsQoxAsECkQmhAkEJ0QHBAbEKEQZRBeEGkQEBA3EJ8QlxAgECEQKBAqEB4Q JoEBJ4EBKIEBKYEBKoEBK4EBLIEBLYEBLoEBL4EBMIEBMYEBMoEBM4EBNIEBNYEBNoEBN4EBOIEBOYEB
WBBrEF0QT9IADgA+AG0FZoBgoNIADgA+BBcFaYDkoNIADgA+BBcFbIDkoNIANwA4BW4Fb6IFbwA7Xk5T OoEBO4EBPIEBPYEBPoEBPxBZE//////////9EBgQJRAdEFAQaBCiEDgQJxAiEAUQGhBmECsQpBCfECwQ
SUJPYmplY3REYXRhAAgAGQAiACcAMQA6AD8ARABSAFQAZgLqAvADOwNCA0kDVwNpA4UDkwOfA6sDuQPE lRApEJoQoBAkEJ0QHBAbED0QSBCjEGUQXhBpEBAQNxChECAQIRAoECoQXRBYEB4QaxCXEE/SAA4APgBt
A9ID7gP8BA8EIQQ7BEUEUgRUBFcEWQRcBF8EYQRjBGUEaARrBG0EcARyBHQEdgR5BHsEfgSHBJMElQSX BXOAYKDSAA4APgQhBXaA56DSAA4APgQhBXmA56DSADcAOAV7BXyiBXwAO15OU0lCT2JqZWN0RGF0YQAI
BLMEvATFBNAE1QTkBO0FAAUJBRQFFgUZBRsFTAVZBWYFdAV+BYwFpQWyBcQF2AXiBe4F8AXyBfQF9gX7 ABkAIgAnADEAOgA/AEQAUgBUAGYC8gL4A0MDSgNRA18DcQONA5sDpwOzA8EDzAPaA/YEBAQXBCkEQwRN
Bf0F/wYBBgMGBQYHBgkGJAY6BkIGTQZqBnwGhwaQBpwGpQaxBrMGtQa3BroGvAa+BsAGyQbLBtYG2Aba BFoEXARfBGEEZARnBGkEawRtBHAEcwR1BHgEegR8BH4EgQSDBIYEjwSbBJ0EnwS7BMQEzQTYBN0E7AT1
BtwG3gbgBwEHCQcQBxoHHAceByAHIgclByYHKAcqB0QHdQeBB5cHrAe7B80H2AfiB/AIAggPCB0IIggk BQgFEQUcBR4FIQUjBVQFYQVuBXwFhgWUBa0FugXMBeAF6gX2BfgF+gX8Bf4GAwYFBgcGCQYLBg0GDwYR
CCYIKAgqCCwILggwCDIINAg5CEIIVAhlCGwIcwh8CH4IhwiJCIwImQiiCKcIrgivCLgIwQjOCNsI5Ajv BiwGQgZKBlUGcgaEBo8GmAakBq0GuQa7Br0GvwbCBsQGxgbIBtEG0wbeBuAG4gbkBuYG6AcJBxEHGAci
CPgJAgkJCRUJVAlgCWkJdgmJCZYJogmwCb4JwAnCCcQJxgnJCcsJzQnPCeIJ5QnnCekJ6wntCe8J+An6 ByQHJgcoByoHLQcuBzAHMgdMB30HiQefB7QHwwfVB+AH6gf4CAoIFwglCCoILAguCDAIMgg0CDYIOAg6
CgUKBwoJCgsKDQoPCjwKRgpQCloKXApeCmAKYgplCmcKaQprCm0Kbwp4CnoKfQp/Ct4LAAsKCyALLQtB CDwIQQhKCFwIbQh0CHsIhAiGCI8IkQiUCKEIqgivCLYItwjACMkI1gjjCOwI9wkACQoJEQkdCVwJaAlx
C1YLcAuMC6cLtgvCC+EL8Av8C/4MAAwCDAsMDQwPDBEMEgwUDB0MHwwoDCsMLQwuDDAMMgw0DDYMOAw6 CX4JkQmeCaoJuAnGCcgJygnMCc4J0QnTCdUJ1wnqCe0J7wnxCfMJ9Qn3CgAKAgoNCg8KEQoTChUKFwpE
DDwMRQxdDGkMdAyRDJMMlQyXDJkMmwydDMoMzAzODNAM0gzUDNYM2AzaDNwM3gzoDPEM+g0ODScNKQ0r Ck4KWApiCmQKZgpoCmoKbQpvCnEKcwp1CncKgAqCCoUKhwrmCwgLEgsoCzULSQteC3gLlAuvC74Lygvp
DS0NNg04DToNUQ1aDWMNcQ16DXwNiw2NDY8NkQ2TDZUNlw2ZDcIN0Q3eDesN8w3+Dg0OGA4jDiQOJg4o C/gMBAwGDAgMCgwTDBUMFwwZDBoMHAwlDCcMMAwzDDUMNgw4DDoMPAw+DEAMQgxEDE0MZQxxDHwMmQyb
DioOMw41DjcOQA5JDksOUQ5uDnoOfw6BDoMOhQ6HDokOjw6gDqIOqw6tDrAOvQ7KDtIO1A7gDukO7g72 DJ0MnwyhDKMMpQzSDNQM1gzYDNoM3AzeDOAM4gzkDOYM8Az5DQINFg0vDTENMw01DT4NQA1CDVkNYg1r
DwsPFw8lDycPKQ8rDy0PLw82D0gPVQ9XD1oPYw9uD4IPlA+1D7oPvA++D8APwg/ED8cPyQ/TD+gP6g/s DXkNgg2EDZMNlQ2XDZkNmw2dDZ8NoQ3KDdkN5g3zDfsOBg4VDiAOKw4sDi4OMA4yDjsOPQ4/DkgOUQ5T
D+4P8BAJEBYQGBAkEDkQOxA9ED8QQRBUEF0QZhBvEHQQghCrEKwQrhCwELIQuxC9EMYQyBDPEOwQ7hDw DlkOdg6CDocOiQ6LDo0Ojw6RDpcOqA6qDrMOtQ64DsUO0g7aDtwO6A7xDvYO/g8TDx8PLQ8vDzEPMw81
EPIQ9BD2EP0REhEUERYRGBEaESYRMxE1ETgRWRFbEV0RXxFhEWMRZRGOEY8RkRGTEZURnhGgEakRqxGx DzcPPg9QD10PXw9iD2sPdg+KD5wPvQ/CD8QPxg/ID8oPzA/PD9EP2w/wD/IP9A/2D/gQERAeECAQLBBB
Ec4R0BHSEdQR1hHYEd4R/xIBEgMSBRIHEgkSCxI4EkESQhJDEkUSRxJJElISVBJdEl8SZhKDEoUShxKJ EEMQRRBHEEkQXBBlEG4QdxB8EIoQsxC0ELYQuBC6EMMQxRDOENAQ1xD0EPYQ+BD6EPwQ/hEFERoRHBEe
EosSkBKSEpkSuhK8Er4SwBLCEsQSyRLLEvgS+RL6EvwS/hMAEwkTCxMUExYTGxM4EzoTPBM+E0ATQhNH ESARIhEuETsRPRFAEWERYxFlEWcRaRFrEW0RlhGXEZkRmxGdEaYRqBGxEbMRuRHWEdgR2hHcEd4R4BHm
E2gTahNsE24TcBNyE3QToROiE6MTpROnE6kTshO0E7YTvBPZE9sT3RPfE+ET4xPpFAoUDBQOFBAUEhQU EgcSCRILEg0SDxIREhMSQBJJEkoSSxJNEk8SURJaElwSZRJnEm4SixKNEo8SkRKTEpgSmhKhEsISxBLG
FBYUPxRAFEIURBRGFE8UURRaFFwUYhR/FIEUgxSFFIcUiRSPFLAUshS0FLYUuBS6FLwUxRTMFNsU4xT4 EsgSyhLMEtES0xMAEwETAhMEEwYTCBMRExMTHBMeEyMTQBNCE0QTRhNIE0oTTxNwE3ITdBN2E3gTehN8
FPoU/BT+FQAVChUXFRkVHhU1FT4VQxVSFWoVcxV8FYcVrBW1Fb4VyBXKFcwVzhXQFdIV1BXWFd8V9hYD E6kTqhOrE60TrxOxE7oTvBO+E8QT4RPjE+UT5xPpE+sT8RQSFBQUFhQYFBoUHBQeFEcUSBRKFEwUThRX
FgwWFxYiFksWTRZPFlEWUxZVFlcWWRZiFnoWgxaFFogWihajFqwWtRbCFuMW5RbnFukW6xbuFu8W8Rbz FFkUYhRkFGoUhxSJFIsUjRSPFJEUlxS4FLoUvBS+FMAUwhTEFM0U1BTjFOsVABUCFQQVBhUIFRIVHxUh
FwwXQRdWF2kXfReSF6UXqhesF64XsBeyF7QXthe7F7wXvhfAF8IX1xfZF9sX3RffF/UYJhgoGC0YLxgx FSYVPRVGFUsVWhVyFXsVhBWPFbQVvRXGFdAV0hXUFdYV2BXaFdwV3hXnFf4WCxYUFh8WKhZTFlUWVxZZ
GDMYNRg3GDoYPBhBGEgYXhiTGLkYuxi9GL8YwRjDGMUYxxjNGNYY2BjbGN0Y6hjyGPQY+Rj7GP0ZAhkE FlsWXRZfFmEWahaCFosWjRaQFpIWqxa0Fr0WyhbrFu0W7xbxFvMW9hb3FvkW+xcUF0kXXhdxF4UXmhet
GQYZFBlAGUcZUBlXGW0ZehmQGZkZpBm4GcEZzhncGegaCRoLGg0aDxoRGhQaFRoXGhkaMBpRGlYaWBpa F7IXtBe2F7gXuhe8F74XwxfEF8YXyBfKF98X4RfjF+UX5xf9GC4YMBg1GDcYORg7GD0YPxhCGEQYSRhQ
GlwaXhpgGmUaZxp0GokaixqNGo8akRqeGqcashrXGuMa5RrnGuka6xrtGu4a8BryGvsa/RsCGwQbBhsi GGYYmxjBGMMYxRjHGMkYyxjNGM8Y1RjeGOAY4xjlGPIY+hj8GQEZAxkFGQoZDBkOGRwZSBlPGVgZXxl1
GzobQxtKG1cbXRt2G5cboxu6G8UbyhvMG84b0BvTG9Ub1xvgG+Ib4xvsG/UcABwJHBQcIhwtHDYcPRxV GYIZmBmhGawZwBnJGdYZ5BnwGhEaExoVGhcaGRocGh0aHxohGjgaWRpeGmAaYhpkGmYaaBptGm8afBqR
HGAcaRxuHIEcihyMHLEcsxy1HLccuRy7HL0cvxzBHMMcxRzHHMkcyxzNHM8c0RzTHOQc8hz7HQMdBR0H GpMalRqXGpkaphqvGroa3xrrGu0a7xrxGvMa9Rr2Gvga+hsDGwUbChsMGw4bKhtCG0sbUhtfG2Ubfhuf
HQkdCx08HVkdcB17HY0doR2wHdUd8B4JHgoeDB4NHg8eEB4SHhQeFh4XHhkeGh4bHjkeTR5WHlgeaR5r G6sbwhvNG9Ib1BvWG9gb2xvdG98b6BvqG+sb9Bv9HAgcERwcHCocNRw+HEUcXRxoHHEcdhyJHJIclBy7
Hm0ebx5xHnMedR53Hnkehx6MHo4elx6cHqcesB63Hs4e3R7uHvAe8h70HvYfAB8RHxMfFR8XHxkfLh8/ HL0cvxzBHMMcxRzHHMkcyxzNHM8c0RzTHNUc1xzZHNsc3RzfHPAc/h0HHQ8dER0THRUdFx1IHWUdfB2H
H0EfQx9FH0cfXx9wH3IfdB92H3gflB+lH6cfqR+rH60fuR/KH8wfzh/QH9If2R/2IAAgCiApICsgLSAv HZkdrR28HeEd/B4VHhYeGB4ZHhseHB4eHiAeIh4jHiUeJh4nHkUeWR5iHmQedR53Hnkeex59Hn8egR6D
IDEgMyA1IEsgUSBeIGcgbiCGIKMgpSCnIKkgqyCtIK8gzSDaIOghCSETIRUhFyEZIRshHSEfISEhQCFY HoUekx6YHpoeox6oHrMevB7DHtoe6R76Hvwe/h8AHwIfDB8dHx8fIR8jHyUfOh9LH00fTx9RH1Mfax98
IWUhZyFqIWwhbyFxIY8hmCGdIb4hwCHCIcQhxiHIIcohzCHrIgMiECISIhUiFyIaIhwiPSI/IkEiQyJF H34fgB+CH4Qfkx+cH6Mfux/MH84f0B/SH9Qf8CABIAMgBSAHIAkgFSAmICggKiAsIC4gNSBSIFwgZiCF
IkciSSJLImsihCKRIpMiliKYIpsinSK+IsAiwiLEIsYiyCLKIswi7CMFIxIjFCMXIxkjHCMeIz8jQSND IIcgiSCLII0gjyCRIKcgrSC6IMMgyiDiIP8hASEDIQUhByEJIQshKSE2IUQhZSFvIXEhcyF1IXcheSF7
I0UjRyNJI0sjTSNrI4IjjyORI5QjliOZI5sjvCO+I8AjwiPEI8YjyCPKI+kkASQOJBAkEyQVJBgkGiQ7 IX0hnCG0IcEhwyHGIcghyyHNIesh9CH5IhoiHCIeIiAiIiIkIiYiKCJHIl8ibCJuInEicyJ2IngimSKb
JD0kPyRBJEMkRSRHJEkkaCSAJI0kjySSJJQklySZJLokvCS+JMAkwiTEJMYkyCTlJPslCCUKJQ0lDyUS Ip0inyKhIqMipSKnIsci4CLtIu8i8iL0Ivci+SMaIxwjHiMgIyIjJCMmIygjSCNhI24jcCNzI3UjeCN6
JRQlLSVGJU8lUSWSJZQlliWYJZolnCWeJaAloiWkJaYlqCWqJawlriWwJbIltCW2JbgluiW8Jb4lwCXC I5sjnSOfI6EjoyOlI6cjqSPHI94j6yPtI/Aj8iP1I/ckGCQaJBwkHiQgJCIkJCQmJEUkXSRqJGwkbyRx
JcQlxiXIJcolzCXOJdAl2SXbJd0l6yX0JfkmAiYEJkUmRyZJJksmTSZPJlEmUyZVJlcmWSZbJl0mXyZh JHQkdiSXJJkkmySdJJ8koSSjJKUkxCTcJOkk6yTuJPAk8yT1JRYlGCUaJRwlHiUgJSIlJCVBJVclZCVm
JmMmZSZnJmkmayZtJm8mcSZzJnUmdyZ5JnsmfSZ/JoEmgyaMJo4m0SbTJtUm1ybZJtsm3SbfJuEm4ybl JWklayVuJXAliSWiJaslrSXuJfAl8iX0JfYl+CX6Jfwl/iYAJgImBCYGJggmCiYMJg4mECYSJhQmFiYY
Jucm6SbrJu0m7ybxJvMm9Sb3Jvkm+yb9Jv8nAScDJwUnBycJJwsnDScPJxEnGiccJ18nYSdjJ2UnZydp JhomHCYeJiAmIiYkJiYmKCYqJiwmNSY3JjkmRyZQJlUmXiZgJqEmoyalJqcmqSarJq0mryaxJrMmtSa3
J2snbSdvJ3Encyd1J3cneSd7J30nfyeBJ4MnhSeHJ4kniyeNJ48nkieVJ5gnmyeeJ6EnpCenJ7En0Sfd Jrkmuya9Jr8mwSbDJsUmxybJJssmzSbPJtEm0ybVJtcm2SbbJt0m3yboJuonLScvJzEnMyc1JzcnOSc7
J+koBygnKD4oVShzKMAo1Cj0KRUpIik2KVYpdimDKZkpsSnRKecp/yoWKiMqNypOKmsqiyqrKssq6Crx Jz0nPydBJ0MnRSdHJ0knSydNJ08nUSdTJ1UnVydZJ1snXSdfJ2EnYydlJ2cnaSdrJ20ndid4J7snvSe/
KvMq+Cr6KvwrBSsHKwwrDisQKxkrGyuAK4IrhCuGK4griiuMK44rkCuSK5QrliuYK5ornCueK6Aroiuk J8EnwyfFJ8cnySfLJ80nzyfRJ9Mn1SfXJ9kn2yfdJ98n4SfjJ+Un6CfrJ+4n8Sf0J/cn+if9KAAoAygG
K6YrqCuqK6wrriuwK7IrtCu2K7gruiu8K74rwCvCK8QrxivIK8orzCvOK9Ar0ivUK9Yr2CvaK9wr3ivg KBAoMCg8KEgoZiiGKJ0otCjSKR8pMylTKXQpgSmVKbUp1SniKfgqECowKkYqXip1KoIqliqtKsoq6isK
K+Ir6yvtLFIsVSxYLFssXixhLGQsZixpLGwsbyxyLHUseCx7LH4sgSyELIcsiiyNLJAskyyWLJksnCyf KyorRytQK1IrVytZK1srZCtmK2srbStvK3greivhK+Mr5SvnK+kr6yvtK+8r8SvzK/Ur9yv5K/sr/Sv/
LKIspSyoLKssriyxLLQstyy6LL0swCzDLMYsySzMLM8s0izVLNgs2yzeLOEs5CzmLOgs8SzzLPUs9yz5 LAEsAywFLAcsCSwLLA0sDywRLBMsFSwXLBksGywdLB8sISwjLCUsJywpLCssLSwvLDEsMyw1LDcsOSw7
LPss/Sz/LQEtAy0FLQctCS0LLQ0tDy0RLRMtFS0XLRktGy0dLR8tIS0jLSUtJy0pLSstLS0vLTEtMy01 LD0sPyxBLEMsRSxOLFAstyy6LL0swCzDLMYsyCzLLM4s0SzULNcs2izdLOAs4yzmLOks7CzvLPIs9Sz4
LTctOS07LT0tPy1BLUMtTC1OLU8tWC1aLVstZC1mLWctcC11AAAAAAAAAgIAAAAAAAAFcAAAAAAAAAAA LPss/i0BLQQtBy0KLQ0tEC0TLRYtGS0cLR8tIi0lLSgtKy0uLTEtNC03LTotPS1ALUMtRi1JLUwtTi1X
AAAAAAAALYQ</bytes> LVktWy1dLV8tYS1jLWUtZy1pLWstbS1vLXEtcy11LXcteS17LX0tfy2BLYMthS2HLYktiy2NLY8tkS2T
LZUtly2ZLZstnS2fLaEtoy2lLactqS2rLa0tti24Lbktwi3ELcUtzi3QLdEt2i3fAAAAAAAAAgIAAAAA
AAAFfQAAAAAAAAAAAAAAAAAALe4</bytes>
</object> </object>
</data> </data>
</archive> </archive>

View File

@ -3,7 +3,7 @@
// Cog // Cog
// //
// Created by Matthew Grinshpun on 13/02/08. // Created by Matthew Grinshpun on 13/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved. // Copyright 2008 Matthew Leon Grinshpun. All rights reserved.
// //
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>

View File

@ -3,7 +3,7 @@
// Cog // Cog
// //
// Created by Matthew Grinshpun on 13/02/08. // Created by Matthew Grinshpun on 13/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved. // Copyright 2008 Matthew Leon Grinshpun. All rights reserved.
// //
#import "SpotlightPlaylistController.h" #import "SpotlightPlaylistController.h"

View File

@ -3,7 +3,7 @@
// Cog // Cog
// //
// Created by Matthew Grinshpun on 11/02/08. // Created by Matthew Grinshpun on 11/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved. // Copyright 2008 Matthew Leon Grinshpun. All rights reserved.
// //
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>

View File

@ -3,7 +3,7 @@
// Cog // Cog
// //
// Created by Matthew Grinshpun on 11/02/08. // Created by Matthew Grinshpun on 11/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved. // Copyright 2008 Matthew Leon Grinshpun. All rights reserved.
// //
#import "SpotlightPlaylistEntry.h" #import "SpotlightPlaylistEntry.h"

View File

@ -3,7 +3,7 @@
// Cog // Cog
// //
// Created by Matthew Grinshpun on 12/02/08. // Created by Matthew Grinshpun on 12/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved. // Copyright 2008 Matthew Leon Grinshpun. All rights reserved.
// //
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>

View File

@ -3,7 +3,7 @@
// Cog // Cog
// //
// Created by Matthew Grinshpun on 12/02/08. // Created by Matthew Grinshpun on 12/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved. // Copyright 2008 Matthew Leon Grinshpun. All rights reserved.
// //
#import "SpotlightPlaylistView.h" #import "SpotlightPlaylistView.h"

View File

@ -3,7 +3,7 @@
// Cog // Cog
// //
// Created by Matthew Grinshpun on 11/02/08. // Created by Matthew Grinshpun on 11/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved. // Copyright 2008 Matthew Leon Grinshpun. All rights reserved.
// //
#include <Cocoa/Cocoa.h> #include <Cocoa/Cocoa.h>

View File

@ -3,7 +3,7 @@
// Cog // Cog
// //
// Created by Matthew Grinshpun on 10/02/08. // Created by Matthew Grinshpun on 10/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved. // Copyright 2008 Matthew Leon Grinshpun. All rights reserved.
// //
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>

View File

@ -3,12 +3,13 @@
// Cog // Cog
// //
// Created by Matthew Grinshpun on 10/02/08. // Created by Matthew Grinshpun on 10/02/08.
// Copyright 2008 __MyCompanyName__. All rights reserved. // Copyright 2008 Matthew Leon Grinshpun. All rights reserved.
// //
#import "SpotlightWindowController.h" #import "SpotlightWindowController.h"
#import "PlaylistLoader.h" #import "PlaylistLoader.h"
#import "SpotlightPlaylistEntry.h" #import "SpotlightPlaylistEntry.h"
#import "NSComparisonPredicate+CogPredicate.h"
// Minimum length of a search string (searching for very small strings gets ugly) // Minimum length of a search string (searching for very small strings gets ugly)
#define MINIMUM_SEARCH_STRING_LENGTH 3 #define MINIMUM_SEARCH_STRING_LENGTH 3
@ -77,7 +78,7 @@ static NSPredicate * musicOnlyPredicate = nil;
- (NSPredicate *)processSearchString - (NSPredicate *)processSearchString
{ {
NSMutableArray *searchComponents = [NSMutableArray arrayWithCapacity:10]; NSMutableArray *subpredicates = [NSMutableArray arrayWithCapacity:10];
NSScanner *scanner = [NSScanner scannerWithString:self.searchString]; NSScanner *scanner = [NSScanner scannerWithString:self.searchString];
@ -86,39 +87,47 @@ static NSPredicate * musicOnlyPredicate = nil;
NSString *scannedString; NSString *scannedString;
if ([scanner scanUpToString:@" " intoString:&scannedString]) if ([scanner scanUpToString:@" " intoString:&scannedString])
{ {
// don't add tiny strings in... They're make the system go nuts if ([scannedString length] < MINIMUM_SEARCH_STRING_LENGTH)
// TODO: Maybe consider a better solution to the issue? continue;
if ([scannedString length] >= MINIMUM_SEARCH_STRING_LENGTH)
if ([scannedString characterAtIndex:0] == '%')
{ {
[searchComponents addObject:scannedString]; if ([scannedString length] < (MINIMUM_SEARCH_STRING_LENGTH + 2))
continue;
// Search for artist
if([scannedString characterAtIndex:1] == 'a')
{
[subpredicates addObject:
[NSComparisonPredicate predicateForMdKey:@"kMDItemAuthors"
withString:[scannedString substringFromIndex:2]]];
}
// Search for album
if([scannedString characterAtIndex:1] == 'l')
{
[subpredicates addObject:
[NSComparisonPredicate predicateForMdKey:@"kMDItemAlbum"
withString:[scannedString substringFromIndex:2]]];
}
// Search for title
if([scannedString characterAtIndex:1] == 't')
{
[subpredicates addObject:
[NSComparisonPredicate predicateForMdKey:@"kMDItemTitle"
withString:[scannedString substringFromIndex:2]]];
}
}
else
{
[subpredicates addObject:
[NSComparisonPredicate predicateForMdKey:@"*"
withString:scannedString]];
} }
} }
} }
// create an array of all the predicates to join together
NSMutableArray * subpredicates = [NSMutableArray
arrayWithCapacity:[searchComponents count]];
// we will ignore case and diacritics
unsigned options = (NSCaseInsensitivePredicateOption|
NSDiacriticInsensitivePredicateOption);
for(NSString *s in searchComponents)
{
// convert each "word" into "*word*"
NSString *processedKey = [NSString stringWithFormat: @"*%@*", s];
// Search all tags for something like word
NSPredicate *predicate = [NSComparisonPredicate
predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"*"]
rightExpression:[NSExpression expressionForConstantValue:processedKey]
modifier:NSDirectPredicateModifier
type:NSLikePredicateOperatorType
options:options];
//TODO: Ability to search only artist, albums, etc.
[subpredicates addObject: predicate];
}
if ([subpredicates count] == 0) if ([subpredicates count] == 0)
return Nil; return Nil;
else if ([subpredicates count] == 1) else if ([subpredicates count] == 1)
@ -178,9 +187,9 @@ replacementObjectForResultObject:(NSMetadataItem*)result
return [[[NSUserDefaults standardUserDefaults] return [[[NSUserDefaults standardUserDefaults]
stringForKey:@"spotlightSearchPath"]copy]; stringForKey:@"spotlightSearchPath"]copy];
} }
// Normally, our nspathcontrol would just bind to the user defaults // Normally, our NSPathcontrol would just bind to the user defaults
// However, this does not allow us to perform a new search when // However, this does not allow us to perform a new search when
// the path changes. This getter/setter combo wraps around the user // the path changes. This getter/setter combo wraps the user
// defaults while performing a new search when the value changes. // defaults while performing a new search when the value changes.
- (void)setSpotlightSearchPath:(NSString *)aString - (void)setSpotlightSearchPath:(NSString *)aString
{ {