diff --git a/Application/AppController.h b/Application/AppController.h index 038859a17..21dcae655 100644 --- a/Application/AppController.h +++ b/Application/AppController.h @@ -11,8 +11,6 @@ @class FileOutlineView; @class AppleRemote; @class PlaylistLoader; -@class SpotlightWindowController; - @interface AppController : NSObject { @@ -48,7 +46,7 @@ IBOutlet NSMenuItem *showTrackColumn; IBOutlet NSMenuItem *showYearColumn; - IBOutlet SpotlightWindowController *spotlightWindowController; + IBOutlet NSWindowController *spotlightWindowController; NDHotKeyEvent *playHotKey; NDHotKeyEvent *prevHotKey; diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index 7f44fbaf6..4c360e9e2 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -101,7 +101,9 @@ 17F3BB890CBC565900864489 /* CueSheet.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 17F3BB880CBC565100864489 /* CueSheet.bundle */; }; 17F561400C3BD4F30019975C /* CogAudio.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 17F561330C3BD4DC0019975C /* CogAudio.framework */; }; 17F562390C3BD91B0019975C /* General.preferencePane in Resources */ = {isa = PBXBuildFile; fileRef = 17F5622E0C3BD8FB0019975C /* General.preferencePane */; }; - 569C52E20D5F347800BDBDC9 /* SpotlightWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 569C52E10D5F347800BDBDC9 /* SpotlightWindowController.m */; }; + 567E73780D5F456D006C6486 /* SpotlightSearchController.m in Sources */ = {isa = PBXBuildFile; fileRef = 567E73770D5F456D006C6486 /* SpotlightSearchController.m */; }; + 567E75070D5F71E7006C6486 /* SpotlightTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 567E75060D5F71E7006C6486 /* SpotlightTransformers.m */; }; + 567E75750D5F8E20006C6486 /* SpotlightWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 567E75740D5F8E20006C6486 /* SpotlightWindowController.m */; }; 569C52E60D5F34F500BDBDC9 /* SpotlightPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 569C52E50D5F34F500BDBDC9 /* SpotlightPanel.xib */; }; 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; @@ -585,8 +587,12 @@ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* Cog_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cog_Prefix.pch; sourceTree = ""; }; 566D32160D538550004466A5 /* APL.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = APL.xcodeproj; path = Plugins/APL/APL.xcodeproj; sourceTree = ""; }; - 569C52E00D5F347800BDBDC9 /* SpotlightWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpotlightWindowController.h; sourceTree = ""; }; - 569C52E10D5F347800BDBDC9 /* SpotlightWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpotlightWindowController.m; sourceTree = ""; }; + 567E73760D5F456D006C6486 /* SpotlightSearchController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpotlightSearchController.h; sourceTree = ""; }; + 567E73770D5F456D006C6486 /* SpotlightSearchController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpotlightSearchController.m; sourceTree = ""; }; + 567E75050D5F71E7006C6486 /* SpotlightTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpotlightTransformers.h; sourceTree = ""; }; + 567E75060D5F71E7006C6486 /* SpotlightTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpotlightTransformers.m; sourceTree = ""; }; + 567E75730D5F8E20006C6486 /* SpotlightWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpotlightWindowController.h; sourceTree = ""; }; + 567E75740D5F8E20006C6486 /* SpotlightWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpotlightWindowController.m; sourceTree = ""; }; 569C52E50D5F34F500BDBDC9 /* SpotlightPanel.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SpotlightPanel.xib; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8E07AAEE0AAC910500A4B32F /* SS_PreferencePaneProtocol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SS_PreferencePaneProtocol.h; path = Preferences/SS_PreferencePaneProtocol.h; sourceTree = ""; }; @@ -1076,8 +1082,12 @@ 569C52C50D5F2BD500BDBDC9 /* Spotlight */ = { isa = PBXGroup; children = ( - 569C52E00D5F347800BDBDC9 /* SpotlightWindowController.h */, - 569C52E10D5F347800BDBDC9 /* SpotlightWindowController.m */, + 567E73760D5F456D006C6486 /* SpotlightSearchController.h */, + 567E73770D5F456D006C6486 /* SpotlightSearchController.m */, + 567E75050D5F71E7006C6486 /* SpotlightTransformers.h */, + 567E75060D5F71E7006C6486 /* SpotlightTransformers.m */, + 567E75730D5F8E20006C6486 /* SpotlightWindowController.h */, + 567E75740D5F8E20006C6486 /* SpotlightWindowController.m */, ); name = Spotlight; sourceTree = ""; @@ -1609,7 +1619,9 @@ 178BAB9A0CD4E1B700B33D47 /* GCWindowMenu.m in Sources */, 178BAB9B0CD4E1B700B33D47 /* PopupButton.m in Sources */, 17BBE5BC0CD95CFA00258F7A /* InvertedToolbarWindow.m in Sources */, - 569C52E20D5F347800BDBDC9 /* SpotlightWindowController.m in Sources */, + 567E73780D5F456D006C6486 /* SpotlightSearchController.m in Sources */, + 567E75070D5F71E7006C6486 /* SpotlightTransformers.m in Sources */, + 567E75750D5F8E20006C6486 /* SpotlightWindowController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SpotlightPanel.xib b/SpotlightPanel.xib index cd2279934..69d0a2cbc 100644 --- a/SpotlightPanel.xib +++ b/SpotlightPanel.xib @@ -8,17 +8,17 @@ 343.00 YES - + YES com.apple.InterfaceBuilderKit - com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin YES - NSObject + SpotlightWindowController FirstResponder @@ -39,50 +39,392 @@ 256 YES - + - 268 - {{20, 228}, {313, 22}} + 265 + {{335, 222}, {131, 32}} YES - - 343014976 - 268436480 - + + 67239424 + 134217728 + Add to Playlist - LucidaGrande + LucidaGrande 1.300000e+01 1044 - + + -2038284033 + 129 + + + 200 + 25 + + + + + 274 + + YES + + + 2304 + + YES + + + 4370 + {440, 183} + + + YES + + + 256 + {440, 17} + + + + + + + -2147483392 + {{-26, 0}, {16, 17}} + + + + + YES + + artist + 7.000000e+01 + 3.600000e+01 + 1.000000e+03 + + 67239424 + 0 + Artist + + + 1.100000e+01 + 3100 + + + 6 + System + headerColor + + 3 + MQA + + + + 6 + + headerTextColor + + 3 + MAA + + + + + 337772096 + 2048 + Text Cell + + + + 6 + + controlBackgroundColor + + 3 + MC42NjY2NjY2OQA + + + + 6 + + controlTextColor + + + + 3 + YES + + + + album + 7.300000e+01 + 3.900000e+01 + 1.000000e+03 + + 67239424 + 0 + Album + + + + + + 337772096 + 2048 + + + + + + + 3 + YES + + + + title + 7.500000e+01 + 4.100000e+01 + 1.000000e+03 + + 75628032 + 0 + Title + + + 3 + MC4zMzMzMzI5OQA + + + + + 337772096 + 2048 + + + + + + + 3 + YES + + + + length + 7.462012e+01 + 4.062012e+01 + 1.000000e+03 + + 67239424 + 67108864 + Length + + + + + + 337772096 + 67110912 + + + + + + + 3 + YES + + + + year + 4.400000e+01 + 1.000000e+01 + 1.000000e+03 + + 67239424 + 67108864 + Year + + + + + + 337772096 + 67110912 + + + + + + + 3 + YES + + + + genre + 4.400000e+01 + 1.000000e+01 + 1.000000e+03 + + 67239424 + 0 + Genre + + + + + + 337772096 + 2048 + + + + + + + 3 + YES + + + + track + 3.800000e+01 + 4.000000e+00 + 1.000000e+03 + + 67239424 + 67108864 + Track + + + + + + 337772096 + 67110912 + + + + + + + 3 + YES + + + + 3.000000e+00 + 2.000000e+00 + + + 6 + + gridColor + + 3 + MC41AA + + + 1.700000e+01 + -608141312 + CogSpotlightPlaylist + 1 + 15 + 0 + YES + + + {{0, 17}, {440, 183}} + + + + + + 2 + + + + -2147483392 + {{85, 17}, {15, 68}} + + + + _doScroller: + 8.192771e-01 + + + + -2147483392 + {{0, 185}, {440, 15}} + + + 1 + + + 8.133087e-01 + + + + 2304 + + YES + + + {440, 17} + + + + + + 4 + + + + {{20, 20}, {440, 200}} + + + + 560 + + + + + + AAAAAAAAAABBmAAAQZgAAA + + + + 266 + {{20, 230}, {313, 22}} + + + YES + + 343014976 + 268436480 + + + YES 1 6 - System + textBackgroundColor - - 3 - MQA - - - - 6 - - controlTextColor - - 3 - MAA - + + 130560 0 search _searchFieldSearch: - - + + 138690815 0 @@ -110,8 +452,8 @@ _searchFieldCancel: - - + + 138690815 0 @@ -121,213 +463,6 @@ 255 - - - 268 - {{335, 222}, {131, 32}} - - - YES - - 67239424 - 134217728 - Add to Playlist - - - -2038284033 - 129 - - - 200 - 25 - - - - - 268 - - YES - - - 2304 - - YES - - - 256 - {425, 168} - - - YES - - - 256 - {425, 17} - - - - - - - 256 - {{425, 0}, {16, 17}} - - - - - YES - - 1.010000e+02 - 4.000000e+01 - 1.000000e+03 - - 75628032 - 0 - - - - 1.100000e+01 - 3100 - - - 3 - MC4zMzMzMzI5OQA - - - 6 - - headerTextColor - - - - - 337772096 - 2048 - Text Cell - - - - 6 - - controlBackgroundColor - - 3 - MC42NjY2NjY2OQA - - - - - 3 - YES - YES - - - - 3.180000e+02 - 4.000000e+01 - 1.000000e+03 - - 75628032 - 0 - - - - - - - 337772096 - 2048 - - - - - - - 3 - YES - YES - - - - 3.000000e+00 - 2.000000e+00 - - - 6 - - gridColor - - 3 - MC41AA - - - 1.700000e+01 - -700448768 - 4 - 15 - 0 - YES - - - {{0, 17}, {425, 168}} - - - - - - 4 - - - - 256 - {{425, 17}, {15, 168}} - - - - _doScroller: - 3.700000e+01 - 1.947368e-01 - - - - 256 - {{0, 185}, {425, 15}} - - - 1 - - - 5.714286e-01 - - - - 2304 - - YES - - - {425, 17} - - - - - - 4 - - - - {{20, 20}, {440, 200}} - - - - 48 - - - - - - QSAAAEEgAABBmAAAQZgAAA - {480, 270} @@ -335,10 +470,234 @@ {{0, 0}, {1280, 778}} + + + YES + kMDItemTitle + kMDItemAlbum + kMDItemAudioTrackNumber + kMDItemRecordingYear + kMDItemDurationSeconds + kMDItemAuthors + kMDItemPath + + NSMetadataItem + YES + + YES + YES + YES + YES + YES + + + SpotlightSearchController + YES + + + contentArray: query.results + + + + + + + contentArray + query.results + 2 + + + 45 + + + + value: arrangedObjects.kMDItemTitle + + + + + + + value + arrangedObjects.kMDItemTitle + + NSConditionallySetsEditable + + + 2 + + + 46 + + + + value: searchString + + + + + + + + searchString + 2 + + + 58 + + + + value: arrangedObjects.kMDItemAlbum + + + + + + + + arrangedObjects.kMDItemAlbum + + + + + 2 + + + 60 + + + + initialFirstResponder + + + + 61 + + + + value: arrangedObjects.kMDItemAudioTrackNumber + + + + + + + + arrangedObjects.kMDItemAudioTrackNumber + + + + + 2 + + + 64 + + + + value: arrangedObjects.kMDItemRecordingYear + + + + + + + + arrangedObjects.kMDItemRecordingYear + + + + + 2 + + + 65 + + + + value: arrangedObjects.kMDItemDurationSeconds + + + + + + + + arrangedObjects.kMDItemDurationSeconds + + + + + 2 + + + 66 + + + + value: arrangedObjects.kMDItemAuthors + + + + + + + + arrangedObjects.kMDItemAuthors + + YES + + YES + + NSValueTransformerName + + + YES + + SpotlightArtistTransformer + + + 2 + + + 71 + + + + window + + + + 72 + + + + addToPlaylist: + + + + 74 + + + + playlistController + + + + 75 + + + + spotlightWindowController + + + + 76 + @@ -383,26 +742,12 @@ YES - - + + - - 3 - - - YES - - - - - - 4 - - - 5 @@ -418,69 +763,168 @@ - 7 - + 16 + + + + + 17 + + + + + 24 + YES - - - - + + + + - 8 - - + 25 + + - 9 - - + 26 + + - 10 - + 27 + + + + + 28 + YES - - + + + + + + + - + - 11 - - - - - 12 - + 29 + YES - + - + - 13 - + 30 + YES - + - + - 14 - - + 31 + + + YES + + + - 15 - - + 32 + + + YES + + + + + + 33 + + + YES + + + + + + 34 + + + YES + + + + + + 36 + + + YES + + + + + + 37 + + + + + 39 + + + + + 40 + + + + + 41 + + + + + 42 + + + + + 43 + + + + + 44 + + + + + 55 + + + YES + + + + + + 56 + + @@ -496,47 +940,111 @@ 1.NSWindowTemplate.visibleAtLaunch 1.WindowOrigin 1.editorWindowContentRectSynchronizationRect - 10.CustomClassName - 10.IBPluginDependency - 11.IBPluginDependency - 12.IBPluginDependency - 13.IBPluginDependency - 14.IBPluginDependency - 15.IBPluginDependency + 16.CustomClassName + 16.IBPluginDependency + 17.IBPluginDependency 2.IBPluginDependency - 3.IBPluginDependency - 4.IBPluginDependency + 24.IBPluginDependency + 24.ImportedFromIB2 + 25.IBPluginDependency + 25.ImportedFromIB2 + 26.IBPluginDependency + 26.ImportedFromIB2 + 27.IBPluginDependency + 27.ImportedFromIB2 + 28.CustomClassName + 28.IBPluginDependency + 28.ImportedFromIB2 + 29.IBPluginDependency + 29.ImportedFromIB2 + 30.IBPluginDependency + 30.ImportedFromIB2 + 31.IBPluginDependency + 31.ImportedFromIB2 + 32.IBPluginDependency + 32.ImportedFromIB2 + 33.IBPluginDependency + 33.ImportedFromIB2 + 34.IBPluginDependency + 34.ImportedFromIB2 + 36.IBPluginDependency + 36.ImportedFromIB2 + 37.IBPluginDependency + 37.ImportedFromIB2 + 39.IBPluginDependency + 39.ImportedFromIB2 + 40.IBPluginDependency + 40.ImportedFromIB2 + 41.IBPluginDependency + 41.ImportedFromIB2 + 42.IBPluginDependency + 42.ImportedFromIB2 + 43.IBPluginDependency + 43.ImportedFromIB2 + 44.IBPluginDependency + 44.ImportedFromIB2 5.IBPluginDependency + 55.IBPluginDependency + 56.IBPluginDependency 6.IBPluginDependency - 7.IBPluginDependency - 8.IBPluginDependency - 9.IBPluginDependency YES - + - - {{48, 119}, {480, 270}} + + {{33, 319}, {480, 270}} {196, 240} - {{48, 119}, {480, 270}} + + PlaylistController + + + + + + + + + + + PlaylistView - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -559,11 +1067,286 @@ - 15 + 76 YES + + + NSObject + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + IBUserSource + + + + + SpotlightSearchController + + + addToPlaylist: + id + + + YES + + YES + playlistController + + + + YES + NSArrayController + SpotlightWindowController + + + + IBProjectSource + SpotlightSearchController.h + + + + SpotlightWindowController + NSWindowController + + YES + + YES + + + YES + + + + playlistLoader + PlaylistLoader + + + + SpotlightWindowController.h + + + + TrackingSlider + NSSlider + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + Utils/TrackingSlider.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/AppleRemote/AppleRemote.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/UKKQueue/UKKQueue.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/UKKQueue/UKFileWatcher.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/UKKQueue/UKMainThreadProxy.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/NDHotKeys/NDHotKeyEvent.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/GCWindowMenu/GCOneShotEffectTimer.h + + + + PlaylistLoader + + + YES + + YES + + + YES + + + + playlistController + PlaylistController + + + + Playlist/PlaylistLoader.h + + DNDArrayController NSArrayController @@ -581,7 +1364,7 @@ NSTableView - IBProjectSource + Playlist/DNDArrayController.h @@ -611,22 +1394,22 @@ YES - id - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -653,55 +1436,46 @@ - + Application/PlaybackController.h - TrackingSlider - NSSlider + PlaylistView + NSTableView YES - + YES + scrollToCurrentEntry: + shufflePlaylist: + sortByPath: + toggleColumn: YES + + + + YES - + YES + playbackController + playlistController YES + PlaybackController + PlaylistController - - Utils/TrackingSlider.h - - - - PlaylistLoader - - - YES - - YES - - - YES - - - - playlistController - PlaylistController - - - - Playlist/PlaylistLoader.h + + Playlist/PlaylistView.h @@ -719,11 +1493,11 @@ YES - - - - - + + + + + @@ -731,204 +1505,10 @@ PlaylistLoader - + Playlist/PlaylistController.h - - PlaylistView - NSTableView - - YES - - YES - scrollToCurrentEntry: - shufflePlaylist: - sortByPath: - toggleColumn: - - - YES - - - - - - - - YES - - YES - playbackController - playlistController - - - YES - PlaybackController - PlaylistController - - - - - Playlist/PlaylistView.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/UKKQueue/UKFileWatcher.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/UKKQueue/UKMainThreadProxy.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/NDHotKeys/NDHotKeyEvent.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/GCWindowMenu/GCOneShotEffectTimer.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/AppleRemote/AppleRemote.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/UKKQueue/UKKQueue.h - - 0 @@ -936,136 +1516,226 @@ 3 YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxCbAAsADAAxADUANgA7ADwA -QQBVAFYAVwBYAAsAZgBsAHgAeQCTAJQAnACdAKAAqgCrAKwAsQCzALgAuQC8AM8A0ADRANUA3gDfAOMA -7ADtAO4AjgDvAPMA9wD4APwBAwELAQwBGgEbAR4BNQE9AUwBUAFwAXEBcgFzAXoBhAGFAYgBjgGPAZIB -lwGpAbABtQG4Ab0BvgHBAcoBywHQAdEB1AHWAdkB4QHnAe4B8wH0AfcB+gH7Af4CCgILAgwCDwIYAhkB -hAIdAh4CIQALAiICJAIlAigCLAIvAkICRQJGAkgCWwJvAoMChAKFAoYChwKIAokCigKLAowCjQKOAo8C -kAKRApICkwKUApgCnAKwAsQCxQCnAsYArwFsAscCyAFEAFICyQLKAssCzALNAs4CzwLSAtUC2FUkbnVs -bN8QEgANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAo -ACkAKgArACwALQAuAC8AMFZOU1Jvb3RWJGNsYXNzXU5TT2JqZWN0c0tleXNfEA9OU0NsYXNzZXNWYWx1 -ZXNfEBlOU0FjY2Vzc2liaWxpdHlPaWRzVmFsdWVzXU5TQ29ubmVjdGlvbnNbTlNOYW1lc0tleXNbTlNG -cmFtZXdvcmtdTlNDbGFzc2VzS2V5c1pOU09pZHNLZXlzXU5TTmFtZXNWYWx1ZXNfEBlOU0FjY2Vzc2li -aWxpdHlDb25uZWN0b3JzXU5TRm9udE1hbmFnZXJfEBBOU1Zpc2libGVXaW5kb3dzXxAPTlNPYmplY3Rz -VmFsdWVzXxAXTlNBY2Nlc3NpYmlsaXR5T2lkc0tleXNZTlNOZXh0T2lkXE5TT2lkc1ZhbHVlc4ACgJqA -a4CEgJmAaoBwgAWAg4CFgHGAl4AAgAaAb4CYEBGAhtIADgAyADMANFtOU0NsYXNzTmFtZYAEgANYTlNP -YmplY3TSADcAOAA5ADpYJGNsYXNzZXNaJGNsYXNzbmFtZaIAOgA1Xk5TQ3VzdG9tT2JqZWN0XxAQSUJD -b2NvYUZyYW1ld29ya9IADgA9AD4AP1pOUy5vYmplY3RzgGmhAECAB9oAQgAOAEMARABFAEYARwBIAEkA -SgBLAEwATQBOAE8AUABRAFIAUwArXE5TV2luZG93Vmlld1xOU1NjcmVlblJlY3RdTlNXaW5kb3dUaXRs -ZVlOU1dURmxhZ3NdTlNXaW5kb3dDbGFzc1xOU1dpbmRvd1JlY3RfEA9OU1dpbmRvd0JhY2tpbmdfEBFO -U1dpbmRvd1N0eWxlTWFza1tOU1ZpZXdDbGFzc4ALgGiAZ4AJEiAAAACACoAIEAIQH4AAXxAYe3sxOTYs -IDI0MH0sIHs0ODAsIDI3MH19XxATT3BlbiBmcm9tIFNwb3RsaWdodFdOU1BhbmVs1wBZAA4AWgBbAFwA -XQBeAF8AYABhAGIAYwBfAGVfEA9OU05leHRSZXNwb25kZXJaTlNTdWJ2aWV3c1hOU3ZGbGFnc1tOU0Zy -YW1lU2l6ZVhOU1dpbmRvd1tOU1N1cGVydmlld4AMgGaADREBAIBkgAyAZdIADgA9AGcAaIAqowBpAGoA -a4AOgC6AM9gAWQAOAG0AbgBbAG8AXQBeAEsAcQByAHMAdAB1AF8AS1dOU0ZyYW1lVk5TQ2VsbFlOU0Vu -YWJsZWSAC4AtgA+AEBEBDAmADIALXxAWe3syMCwgMjI4fSwgezMxMywgMjJ9fd0AegAOAHsAfAB9AH4A -fwCAAIEAggCDAIQAhQCGAIcAiACJAIoAiwBpAI0AjgB1AJAAkQCSW05TQ2VsbEZsYWdzXxASTlNDYW5j -ZWxCdXR0b25DZWxsXxARTlNCYWNrZ3JvdW5kQ29sb3JaTlNDb250ZW50c1lOU1N1cHBvcnRdTlNDb250 -cm9sVmlld1xOU0NlbGxGbGFnczJfEBBOU1RleHRCZXplbFN0eWxlXxARTlNEcmF3c0JhY2tncm91bmRf -EBJOU1NlYXJjaEJ1dHRvbkNlbGxfEBBOU01heGltdW1SZWNlbnRzW05TVGV4dENvbG9yEhRx/kCALIAh -gBWAEYASgA4SEAAEABABCYAdEP+AGlDUAA4AlQCWAJcAmACZAJoAm1ZOU1NpemVWTlNOYW1lWE5TZkZs -YWdzgBQjQCoAAAAAAACAExEEFFxMdWNpZGFHcmFuZGXSADcAOACeAJ+iAJ8ANVZOU0ZvbnTVAA4AoQCi -AKMApAClAKYApwCoAKlXTlNDb2xvclxOU0NvbG9yU3BhY2VbTlNDb2xvck5hbWVdTlNDYXRhbG9nTmFt -ZYAZgBgQBoAXgBZWU3lzdGVtXxATdGV4dEJhY2tncm91bmRDb2xvctMADgCiAK0ApQCvALBXTlNXaGl0 -ZYAZEANCMQDSADcAOACyAKGiAKEANdUADgChAKIAowCkAKUAtQCnALYAqYAZgByAG4AWXxAQY29udHJv -bFRleHRDb2xvctMADgCiAK0ApQCvALuAGUIwANwAvQB6AA4AvgC/AMAAfQB/AMEAgADCAMMAcwDFAMYA -xwDIAIoAygBpAMwAyADNAM5YTlNUYXJnZXRfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNCdXR0b25GbGFn -czJfEA9OU0tleUVxdWl2YWxlbnRfEA9OU1BlcmlvZGljRGVsYXlYTlNBY3Rpb25dTlNCdXR0b25GbGFn -c4AQEgAB/gCAIBBLEACAEYAegA4RAZCAHxIIRED/VnNlYXJjaF8QE19zZWFyY2hGaWVsZFNlYXJjaDrS -ADcAOADSANOkANMA1ABuADVcTlNCdXR0b25DZWxsXE5TQWN0aW9uQ2VsbN0AvQB6AA4AvgC/AMAA1gB9 -AH8AwQCAAMIAwwBzAMUAxgDHAMgAigDaANsAaQDMAMgA3QDOXxAjTlNBY2Nlc3NpYmlsaXR5T3ZlcnJp -ZGRlbkF0dHJpYnV0ZXOAEIAggBGAI4AigA6AK1VjbGVhctIADgA9AGcA4YAqoQDigCTTAA4A5AA9AOUA -5gDpV05TLmtleXOAKaIA5wDogCWAJqIA6gDrgCeAKF1BWERlc2NyaXB0aW9uXxApTlNBY2Nlc3NpYmls -aXR5RW5jb2RlZEF0dHJpYnV0ZXNWYWx1ZVR5cGVWY2FuY2Vs0gA3ADgA8ADxowDxAPIANV8QE05TTXV0 -YWJsZURpY3Rpb25hcnlcTlNEaWN0aW9uYXJ50gA3ADgA9AD1owD1APYANV5OU011dGFibGVBcnJheVdO -U0FycmF5XxATX3NlYXJjaEZpZWxkQ2FuY2VsOtIANwA4APkA+qUA+gD7ANQAbgA1XxARTlNTZWFyY2hG -aWVsZENlbGxfEA9OU1RleHRGaWVsZENlbGzSADcAOAD9AP6mAP4A/wEAAQEBAgA1XU5TU2VhcmNoRmll -bGRbTlNUZXh0RmllbGRZTlNDb250cm9sVk5TVmlld1tOU1Jlc3BvbmRlctgAWQAOAG0AbgBbAG8AXQBe -AEsBBQEGAQcAdAB1AF8AS4ALgDKAL4AwCYAMgAtfEBd7ezMzNSwgMjIyfSwgezEzMSwgMzJ9fdwAegAO -AQ0AvgC/AMAAfQB+AH8AwQCAAMMBDgDGAIoBEQESAIoBFACLAGoBFwEYARlfEBNOU0FsdGVybmF0ZUNv -bnRlbnRzEgQB/gCAIIAREBkQgYARgDGAEoAuEMgSCAAAABP/////hoJA/18QD0FkZCB0byBQbGF5bGlz -dNIANwA4ARwBHaUBHQEAAQEBAgA1WE5TQnV0dG9u3xAPAFkBHwAOAG0BIAEhASIAWgEjAFsAXQBeASQB -JQEmAEsBKAEpASoBKwEsAS0BLgEvAHQAXwBLATIBMwEzW05TSFNjcm9sbGVyWE5Tc0ZsYWdzXE5TQ29y -bmVyVmlld18QEE5TSGVhZGVyQ2xpcFZpZXdcTlNTY3JvbGxBbXRzW05TVlNjcm9sbGVyXU5TTmV4dEtl -eVZpZXddTlNDb250ZW50Vmlld4ALgF6AY4BiEDCAP4A8gDRPEBBBIAAAQSAAAEGYAABBmAAAgAyAC4Ba -gDWANdIADgA9AGcBN4AqpQEzATIBKAEtASyANYBagF6APIA/2wBZAA4AbQE+AFoAWwE/AF0BQABeASUA -awFCAUMBRAFFAUYBRwBfAUkAawFHWU5TY3ZGbGFnc1lOU0RvY1ZpZXdZTlNCR0NvbG9ygDOAWYBYEASA -NhEJAIA3gAyATIAzgDfSAA4APQBnAU6AKqEBR4A33xAWAFkBUQAOAVIBUwFUAHwBVQEhAVYBVwFYAFsA -XABvAF0AMgFZAVoAXgFbAVwBMwDIAV4BXwFgAWEApgB1ASwBZQFEAWYAYgFnAHUAXwFqAWsBbAEzAW4B -b18QH05TRHJhZ2dpbmdTb3VyY2VNYXNrRm9yTm9uTG9jYWxZTlNUdkZsYWdzXxATTlNPcmlnaW5hbENs -YXNzTmFtZVxOU0hlYWRlclZpZXdfEBJOU0FsbG93c1R5cGVTZWxlY3RfEBdOU0ludGVyY2VsbFNwYWNp -bmdXaWR0aF8QGU5TQ29sdW1uQXV0b3Jlc2l6aW5nU3R5bGVfEBhOU0ludGVyY2VsbFNwYWNpbmdIZWln -aHRbTlNHcmlkQ29sb3JfEBxOU0RyYWdnaW5nU291cmNlTWFza0ZvckxvY2FsXk5TVGFibGVDb2x1bW5z -W05TUm93SGVpZ2h0gDWAVxP/////1kAAAIA5gDuAGAmAPyNACAAAAAAAACNAAAAAAAAAAIA6CYAMgDiA -VBAPgDWAQiNAMQAAAAAAAFxQbGF5bGlzdFZpZXdbTlNUYWJsZVZpZXdaezQyNSwgMTY4fdcAWQAOAFsA -XABdAF4BcQEtAXUAYgF2AF8BLQFHgDyAPoA9gAyAPIA32wBZAA4BPgBaAFsAXAE/AF0BQABeASUAawFC -AUQBfQFGAX4BYQBfAUkAawFhgDOAWYBggGGAO4AMgEyAM4A7WXs0MjUsIDE3fdIANwA4AYYBh6QBhwEB -AQIANV8QEU5TVGFibGVIZWFkZXJWaWV31gBZAA4AbQBbAF0AXgBrAYoBiwBiAF8Aa4AzgEGAQIAMgDNf -EBR7ezQyNSwgMH0sIHsxNiwgMTd9fdIANwA4AZABkaQBkQEBAQIANV1fTlNDb3JuZXJWaWV30gAOAD0A -ZwGUgCqiAZUBloBDgFHaAZgADgGZAZoBmwGcAZ0BngGfAXEAdQGhAaIBowGkAK8BpQGmAHUBR15OU0lz -UmVzaXplYWJsZVxOU0hlYWRlckNlbGxXTlNXaWR0aFpOU0RhdGFDZWxsXk5TUmVzaXppbmdNYXNrWk5T -TWluV2lkdGhaTlNNYXhXaWR0aFxOU0lzRWRpdGFibGUJgFCARCNAWUAAAAAAAIBKI0BEAAAAAAAAI0CP -QAAAAAAACYA31wB6AA4AfAB9AH4AgACFAaoBqwGsAIoBrgDIAa8SBIH+AIBJgEaAEYBFgEfUAA4AlQCW -AJcAmAGyAJoBtIAUI0AmAAAAAAAAgBMRDBzTAA4AogCtAKUArwG3gBlLMC4zMzMzMzI5OQDVAA4AoQCi -AKMApAClALUApwG7AKmAGYAcgEiAFl8QD2hlYWRlclRleHRDb2xvctIANwA4Ab8BwKUBwAD7ANQAbgA1 -XxARTlNUYWJsZUhlYWRlckNlbGzYAHoADgB8AH0AfgB/AIAAhQHCAcMBSQHFAIsBRwHIAJISFCH+QIBP -gEyAS4ASgDcRCACAGllUZXh0IENlbGzVAA4AoQCiAKMApAClAc0ApwHOAKmAGYBOgE2AFl8QFmNvbnRy -b2xCYWNrZ3JvdW5kQ29sb3LTAA4AogCtAKUArwHTgBlLMC42NjY2NjY2OQDSADcAOAHVAPukAPsA1ABu -ADXSADcAOAHXAdiiAdgANV1OU1RhYmxlQ29sdW1u2gGYAA4BmQGaAZsBnAGdAZ4BnwFxAHUBoQHcAd0B -3gCvAaUBpgB1AUcJgFCAUiNAc+AAAAAAAIBTCYA31wB6AA4AfAB9AH4AgACFAaoBqwGsAIoBrgDIAa+A -SYBGgBGARYBH2AB6AA4AfAB9AH4AfwCAAIUBwgHDAUkBxQCLAUcByACSgE+ATIBLgBKAN4Aa1QAOAKEA -ogCjAKQApQHwAKcB8QCpgBmAVoBVgBZZZ3JpZENvbG9y0wAOAKIArQClAK8B9oAZRDAuNQDSADcAOAH4 -AfmiAfkANV5OU0NsYXNzU3dhcHBlcl8QFXt7MCwgMTd9LCB7NDI1LCAxNjh9fdIANwA4AfwB/aQB/QEB -AQIANVpOU0NsaXBWaWV32gBZAL0ADgBtAFsAXQDCAF4B/wIAAGsAawIDAgQAYgBfAgYAawIIAglaTlND -dXJWYWx1ZVlOU1BlcmNlbnSAM4AzgF2AW4AMgFyAMyNAQoAAAAAAACM/yO0ioAAAAF8QFnt7NDI1LCAx -N30sIHsxNSwgMTY4fX1cX2RvU2Nyb2xsZXI60gA3ADgCDQIOpQIOAQABAQECADVaTlNTY3JvbGxlctoA -WQC9AA4AbQEgAFsAXQDCAF4CAABrAGsCAwITAI4AYgBfAgYAawIXgDOAM4BdgF+ADIBcgDMjP+JJJKAA -AABfEBV7ezAsIDE4NX0sIHs0MjUsIDE1fX3SAA4APQBnAhuAKqEBYYA7XxAWe3syMCwgMjB9LCB7NDQw -LCAyMDB9fdIANwA4Ah8CIKQCIAEBAQIANVxOU1Njcm9sbFZpZXdaezQ4MCwgMjcwfdIANwA4AiMBAaMB -AQECADVfEBV7ezAsIDB9LCB7MTI4MCwgNzc4fX3SADcAOAImAieiAicANV8QEE5TV2luZG93VGVtcGxh -dGXSADcAOAIpAiqjAioCKwA1XE5TTXV0YWJsZVNldFVOU1NldNIADgA9AGcCLoAqoNIADgA9AjACMYBu -rxAQAEACMwEoAQcBRwBpAaQAagBzAEsBYQHeAZYBlQBrATKAB4BsgF6AMIA3gA6ASoAugBCAC4A7gFOA -UYBDgDOAWtIADgAyADMCRIAEgG1dTlNBcHBsaWNhdGlvbtIANwA4AkcA9qIA9gA10gAOAD0CMAJKgG6v -EBAAHwAfAGsAagBrAEsBlQBLAGkAQABrAZYBRwFHAEsAa4ACgAKAM4AugDOAC4BDgAuADoAHgDOAUYA3 -gDeAC4Az0gAOAD0CMAJdgG6vEBEAQAIzASgBBwFHAGkBpAAfAGoAcwBLAWEB3gGWAZUAawEygAeAbIBe -gDCAN4AOgEqAAoAugBCAC4A7gFOAUYBDgDOAWtIADgA9AjACcYBurxARAnICcwJ0AnUCdgJ3AngCeQJ6 -AnsCfAJ9An4CfwKAAoECgoBygHOAdIB1gHaAd4B4gHmAeoB7gHyAfYB+gH+AgICBgIJfEBtQYW5lbCAo -T3BlbiBmcm9tIFNwb3RsaWdodClbQXBwbGljYXRpb25fEBNIb3Jpem9udGFsIFNjcm9sbGVyXxAdQnV0 -dG9uIENlbGwgKEFkZCB0byBQbGF5bGlzdCldUGxheWxpc3QgVmlld1xTZWFyY2ggRmllbGRfEB1UZXh0 -IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMVxGaWxlJ3MgT3duZXJfEB1QdXNoIEJ1dHRvbiAoQWRkIHRv -IFBsYXlsaXN0KV8QEVNlYXJjaCBGaWVsZCBDZWxsXENvbnRlbnQgVmlld18QEVRhYmxlIEhlYWRlciBW -aWV3XxAbVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpXFRhYmxlIENvbHVtbl5UYWJsZSBDb2x1bW4t -MVtTY3JvbGwgVmlld18QEVZlcnRpY2FsIFNjcm9sbGVy0gAOAD0CMAKWgG6hAUeAN9IADgA9AjACmoBu -oQFqgDjSAA4APQIwAp6Abq8QEQBAAjMBKAEHAUcAaQGkAB8AagBzAEsBYQHeAZYBlQBrATKAB4BsgF6A -MIA3gA6ASoACgC6AEIALgDuAU4BRgEOAM4Ba0gAOAD0CMAKygG6vEBEA6wK0ArUCtgK3ArgCuQK6ArsC -vAK9Ar4CvwLAAsECwgLDgCiAh4CIgImAioCLgIyAjYCOgI+AkICRgJKAk4CUgJWAlhP//////////RAJ -EAoQEBAFEAsQDhANEAwQBxAI0gAOAD0AZwLRgCqg0gAOAD0CMALUgG6g0gAOAD0CMALXgG6g0gA3ADgC -2QLaogLaADVeTlNJQk9iamVjdERhdGEACAAZACIAJwAxADoAPwBEAFIAVABmAZ8BpQHwAfcB/gIMAh4C -OgJIAlQCYAJuAnkChwKjArECxALWAvAC+gMHAwkDCwMNAw8DEQMTAxUDFwMZAxsDHQMfAyEDIwMlAycD -KQMrAzQDQANCA0QDTQNWA18DagNvA34DkQOaA6UDpwOqA6wD1QPiA+8D/QQHBBUEIgQ0BEgEVARWBFgE -WgRcBGEEYwRlBGcEaQRrBIYEnASkBMEE0wTeBOcE8wT8BQgFCgUMBQ4FEQUTBRUFFwUgBSIFKQUrBS0F -LwVQBVgFXwVpBWsFbQVvBXEFdAV1BXcFeQWSBccF0wXoBfwGBwYRBh8GLAY/BlMGaAZ7BocGjAaOBpAG -kgaUBpYGmAadBp8GoAaiBqQGpganBrgGvwbGBs8G0QbaBtwG3wbsBvUG+gcBBxYHHgcrBzcHRQdHB0kH -SwdNB08HVgdsB3kHgQeDB4UHiAeRB5YHqwetB68HsQezB8YH0wfVB9gICQgSCCcINghICFoIYwhxCHMI -eAh6CHwIfgiACIIIhAiHCIkIjgiVCKsItAi9CMoI1wkMCTIJNAk2CTgJOgk8CT4JQAlGCU8JUQlUCVYJ -YwlrCW0Jcgl0CXYJewl9CX8JjQm5CcAJyQnQCeYJ8wn8CgMKEgoaCjAKOQpEClgKagpzCoAKjgqaCqQK -qwq3CtgK2grcCt4K4ArhCuMK5Qr/CzALRgtLC00LTwtRC1MLVQtXC1kLWwtdC2ILawt9C4YLkQuaC9kL -5QvuC/sMDgwbDCcMNQxDDEUMRwxJDEsMTQxPDFEMUwxmDGgMagxsDG4McAx5DHsMhgyIDIoMjAyODJAM -vQzHDNEM2wzdDN8M4QzjDOUM6AzqDOwM7gzwDPIM+wz9DQANAg1dDX8NiQ2fDawNwQ3bDfcOEg4eDj0O -TA5YDloOXA5lDmcOaQ5rDmwObg53DoAOgg6DDoUOhw6JDosOjQ6PDpgOpQ6xDrwO2Q7bDt0O3w7hDuMO -5Q8SDxQPFg8YDxoPHA8eDyAPIg8kDy4PNw9AD1QPbQ9vD3EPcw91D3cPjg+XD6APrg+3D7kPvg/AD8IP -6w/6EAcQDxAaECkQNBA/EEwQTRBPEFEQWhBcEGUQbhBvEHEQjhCTEJUQlxCZEJsQnRCuELAQuRC7EL4Q -yxDNENkQ7hDwEPIQ9BD2EQgREREcETARURFWEVgRWhFcEV4RYBFjEWURbxGEEYYRiBGKEYwRpRGyEbQR -wBHJEdIR2xHgEe4SFxIYEhoSHBIlEicSKBIqEkcSSRJLEk0STxJREnISdBJ2EngSehJ8En4SkxKVEpcS -mRKbEqUSshK0ErkSwhLHEtYS7hL3EwATCxM0Ez8TSRNLE00TTxNRE1MTVRNXE2ATaROCE48TmBOjE64T -1xPZE9sT3RPfE+ET4xPlE+4UBhQPFBEUFBQWFC8UOBRBFE4UWRRiFGkUgRSKFI8UohSrFLIUvxTFFM4U -0BTRFNoU3BT/FQEVAxUFFQcVCRULFQ0VDxURFRMVFRUXFRkVGxUdFR8VKBUqFSwVOhVDFUgVURVTFXYV -eBV6FXwVfhWAFYIVhBWGFYgVihWMFY4VkBWSFZQVlhWfFaEVxhXIFcoVzBXOFdAV0hXUFdYV2BXaFdwV -3hXgFeIV5BXmFegV8RXzFhgWGhYcFh4WIBYiFiQWJhYoFioWLBYuFjAWMhY0FjYWOBY6FlgWZBZ6FpoW -qBa1FtUW4hcCFxYXIxc3F1UXYhdxF30XkReaF5wXnxehF6oXrBevF7EXuhe8F+EX4xflF+cX6RfrF+0X -7xfxF/MX9Rf3F/kX+xf9F/8YARgDGAwYDhgzGDUYNxg5GDsYPRg/GEEYQxhFGEcYSRhLGE0YTxhRGFMY -VRheGGAYYhhkGGYYaBhqGGwYbhhwGHIYexh9GH4YhxiJGIoYkxiVGJYYnxikAAAAAAAAAgIAAAAAAAAC -2wAAAAAAAAAAAAAAAAAAGLM +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBIQALAAwAMQA1ADYAPAA9 +AEIAVgBXAFgAWQALAGcAbQB5AHoAkgCTAJsAnACfAKAApACqAMIAygDYANwBAgEDAQQBBQEMARcBGAEb +ASIBIwEmATABQwFEAUsBTAFRAVsBXAFdAWEBYwFoAWkBbAFwAXkBegF/AYABgwGIAYkBiwGOAZcBmAGe +AZ8BpgGvAbABtwG4AbsBwgHLAcwB0wHUAdwB5QHmAewB7QH0AfsB/AICAgMCCgITAhQCGgIbAiICJgIr +AiwCLwIwAjMCNAI3AkMCRAJFAkgCUQJSARcCVgJXAloCYwJkAnYCewJ8AocCiAKJApICkwKXAqACoQKi +APUCowKnAqgCqwKvAAsCsAKyArMCtgK6AsoC0gLVAtYC1wLbAuAC4QLkAukC/wMAAwEDCwMMAw0DDgMP +AxADEQMSAxMDFQMXAxgDHQMeAyMDJAMwAzEDMgMzAzsDPAM9Az4DQANDA0sDTANNA1MDWwNcA10DYwNq +A2sDbANzA3QDdQN2A34DfwOAA4YDjgOPA5ADlgOeA58DoAOmA8UDyAPJA8sD6gQKBCoEKwQsBC0ELgQv +BDAEMQQyBDMENAQ1BDYENwQ4BDkEOgQ7BDwEPQQ+BD8EQARBBEIEQwREBEUERgRHBEwEUQR+BKsErASt +BK4ErwSwBLEAVAFYBLIEswS0BLUEtgS3BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGAoAExwTI +BMkEygTLBMwEzQTOAIkAUwTPBNIE1QTYVSRudWxs3xASAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkA +GgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwVk5TUm9vdFYkY2xhc3Nd +TlNPYmplY3RzS2V5c18QD05TQ2xhc3Nlc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNd +TlNDb25uZWN0aW9uc1tOU05hbWVzS2V5c1tOU0ZyYW1ld29ya11OU0NsYXNzZXNLZXlzWk5TT2lkc0tl +eXNdTlNOYW1lc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eUNvbm5lY3RvcnNdTlNGb250TWFuYWdlcl8Q +EE5TVmlzaWJsZVdpbmRvd3NfEA9OU09iamVjdHNWYWx1ZXNfEBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5 +c1lOU05leHRPaWRcTlNPaWRzVmFsdWVzgAKBASCAzIDxgQEfgIqA0YAFgPCA8oDSgQEdgACABoDQgQEe +EE6A89IADgAyADMANFtOU0NsYXNzTmFtZYAEgANfEBlTcG90bGlnaHRXaW5kb3dDb250cm9sbGVy0gA3 +ADgAOQA6WCRjbGFzc2VzWiRjbGFzc25hbWWiADoAO15OU0N1c3RvbU9iamVjdFhOU09iamVjdF8QEElC +Q29jb2FGcmFtZXdvcmvSAA4APgA/AEBaTlMub2JqZWN0c4CJoQBBgAfaAEMADgBEAEUARgBHAEgASQBK +AEsATABNAE4ATwBQAFEAUgBTAFQAK1xOU1dpbmRvd1ZpZXdcTlNTY3JlZW5SZWN0XU5TV2luZG93VGl0 +bGVZTlNXVEZsYWdzXU5TV2luZG93Q2xhc3NcTlNXaW5kb3dSZWN0XxAPTlNXaW5kb3dCYWNraW5nXxAR +TlNXaW5kb3dTdHlsZU1hc2tbTlNWaWV3Q2xhc3OAC4CIgIeACRIgAAAAgAqACBACEB+AAF8QGHt7MTk2 +LCAyNDB9LCB7NDgwLCAyNzB9fV8QE09wZW4gZnJvbSBTcG90bGlnaHRXTlNQYW5lbNcAWgAOAFsAXABd +AF4AXwBgAGEAYgBjAGQAYABmXxAPTlNOZXh0UmVzcG9uZGVyWk5TU3Vidmlld3NYTlN2RmxhZ3NbTlNG +cmFtZVNpemVYTlNXaW5kb3dbTlNTdXBlcnZpZXeADICGgA0RAQCAhIAMgIXSAA4APgBoAGmAXqMAagBr +AGyADoAYgHDYAFoADgBuAG8AXABwAF4AXwBMAHIAcwB0AHUAdgBgAExXTlNGcmFtZVZOU0NlbGxZTlNF +bmFibGVkgAuAF4APgBARAQkJgAyAC18QF3t7MzM1LCAyMjJ9LCB7MTMxLCAzMn193AB7AA4AfAB9AH4A +fwCAAIEAggCDAIQAhQCGAIcAiACJAIoAiACMAI0AagCPAJAAkVtOU0NlbGxGbGFnc18QE05TQWx0ZXJu +YXRlQ29udGVudHNfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNCdXR0b25GbGFnczJfEA9OU0tleUVxdWl2 +YWxlbnRaTlNDb250ZW50c1lOU1N1cHBvcnRdTlNDb250cm9sVmlld18QD05TUGVyaW9kaWNEZWxheVxO +U0NlbGxGbGFnczJdTlNCdXR0b25GbGFncxIEAf4AgBaAFRAZEIGAFYARgBKADhDIEggAAAAT/////4aC +QP9fEA9BZGQgdG8gUGxheWxpc3TUAA4AlACVAJYAlwCYAJkAmlZOU1NpemVWTlNOYW1lWE5TZkZsYWdz +gBQjQCoAAAAAAACAExEEFFxMdWNpZGFHcmFuZGXSADcAOACdAJ6iAJ4AO1ZOU0ZvbnRQ0gA3ADgAoQCi +pACiAKMAbwA7XE5TQnV0dG9uQ2VsbFxOU0FjdGlvbkNlbGzSADcAOAClAKalAKYApwCoAKkAO1hOU0J1 +dHRvbllOU0NvbnRyb2xWTlNWaWV3W05TUmVzcG9uZGVy3xAPAFoAqwAOAG4ArACtAK4AWwCvAFwAXgBf +ALAAsQCyAEwAtAC1ALYAtwC4ALkAugC7ALwAYABMAL8AwADAW05TSFNjcm9sbGVyWE5Tc0ZsYWdzXE5T +Q29ybmVyVmlld18QEE5TSGVhZGVyQ2xpcFZpZXdcTlNTY3JvbGxBbXRzW05TVlNjcm9sbGVyXU5TTmV4 +dEtleVZpZXddTlNDb250ZW50Vmlld4ALgGqAb4BuEQIwgCSAIYAZTxAQAAAAAAAAAABBmAAAQZgAABEB +EoAMgAuAZoAagBrSAA4APgBoAMSAXqUAwAC/ALQAuQC4gBqAZoBqgCGAJNsAWgAOAG4AywBbAFwAzABe +AM0AXwCxAGsAzwDQAFMA0QDSANMAYADVAGsA01lOU2N2RmxhZ3NZTlNEb2NWaWV3WU5TQkdDb2xvcoAY +gGWAZIAbEQkAgByADIA4gBiAHNIADgA+AGgA2oBeoQDTgBzfEBcAWgDdAA4A3gDfAOAA4QDiAK0A4wDk +AOUAXABdAHAA5gBeADIA5wDoAF8A6QDqAMAA7ADtAO4A7wDwANUAdgC4APQA9QD2APcA+AB2APoAYAD8 +AP0A/gDAAQABAV8QH05TRHJhZ2dpbmdTb3VyY2VNYXNrRm9yTm9uTG9jYWxZTlNUdkZsYWdzXxATTlNP +cmlnaW5hbENsYXNzTmFtZVxOU0hlYWRlclZpZXdfEBFOU0JhY2tncm91bmRDb2xvcl8QEk5TQWxsb3dz +VHlwZVNlbGVjdF8QF05TSW50ZXJjZWxsU3BhY2luZ1dpZHRoXxAZTlNDb2x1bW5BdXRvcmVzaXppbmdT +dHlsZV8QGE5TSW50ZXJjZWxsU3BhY2luZ0hlaWdodF5OU0F1dG9zYXZlTmFtZVtOU0dyaWRDb2xvcl8Q +HE5TRHJhZ2dpbmdTb3VyY2VNYXNrRm9yTG9jYWxeTlNUYWJsZUNvbHVtbnNbTlNSb3dIZWlnaHSAGhAA +gGMT/////9vAgACAHoAggDgJgCQjQAgAAAAAAAAQASNAAAAAAAAAABEREoAfCYBigAyAHYBfEA+AGoAn +I0AxAAAAAAAAXFBsYXlsaXN0Vmlld1tOU1RhYmxlVmlld1p7NDQwLCAxODN91wBaAA4AXABdAF4AXwED +ALkBBwBjAQgAYAC5ANOAIYAjgCKADIAhgBzbAFoADgDLAFsAXABdAMwAXgDNAF8AsQBrAM8BDwEQANIB +EQDwAGAA1QBrAPCAGIBlEASAbIBtgCCADIA4gBiAIFl7NDQwLCAxN33SADcAOAEZARqkARoAqACpADtf +EBFOU1RhYmxlSGVhZGVyVmlld9YAWgAOAG4AXABeAF8AawEdAR4BHwBgAGuAGIAmgCUT/////4AAAQCA +DIAYXxAUe3stMjYsIDB9LCB7MTYsIDE3fX3SADcAOAEkASWkASUAqACpADtdX05TQ29ybmVyVmlld9IA +DgA+AGgBKIBepwEpASoBKwEsAS0BLgEvgCiAP4BEgEqAT4BUgFnaATEADgEyATMBNAE1ATYBNwE4AQMA +dgE6ATsBPAE9AT4BPwFAAUEA015OU0lzUmVzaXplYWJsZVxOU0hlYWRlckNlbGxcTlNJZGVudGlmaWVy +V05TV2lkdGhaTlNEYXRhQ2VsbF5OU1Jlc2l6aW5nTWFza1pOU01pbldpZHRoWk5TTWF4V2lkdGgJgD6A +KoApI0BRgAAAAAAAgDYQAyNAQgAAAAAAACNAj0AAAAAAAIAcVmFydGlzdNcAewAOAOEAgACBAIQBRQCG +AUYBRwFIAUkA7AFKW05TVGV4dENvbG9ygDWALYArgCyAMlZBcnRpc3TUAA4AlACVAJYAlwFOAJkBUIAU +I0AmAAAAAAAAgBMRDBzVAA4BUgFTAVQBVQFWAVcBWAFZAVpXTlNDb2xvclxOU0NvbG9yU3BhY2VbTlND +b2xvck5hbWVdTlNDYXRhbG9nTmFtZYAxgDAQBoAvgC5WU3lzdGVtW2hlYWRlckNvbG9y0wAOAVMBXgFW +AT8BYFdOU1doaXRlgDFCMQDSADcAOAFiAVKiAVIAO9UADgFSAVMBVAFVAVYBZQFYAWYBWoAxgDSAM4Au +XxAPaGVhZGVyVGV4dENvbG9y0wAOAVMBXgFWAT8Ba4AxQjAA0gA3ADgBbQFupQFuAW8AowBvADtfEBFO +U1RhYmxlSGVhZGVyQ2VsbF8QD05TVGV4dEZpZWxkQ2VsbNgAewAOAOEAgACBAIIAhAFFAXEBcgDVAXQA +jQDTAXcBeBIUIf5AgD2AOIA3gBKAHBEIAIA7WVRleHQgQ2VsbNUADgFSAVMBVAFVAVYBfAFYAX0BWoAx +gDqAOYAuXxAWY29udHJvbEJhY2tncm91bmRDb2xvctMADgFTAV4BVgE/AYKAMUswLjY2NjY2NjY5ANUA +DgFSAVMBVAFVAVYBZQFYAYYBWoAxgDSAPIAuXxAQY29udHJvbFRleHRDb2xvctIANwA4AYoBb6QBbwCj +AG8AO9IANwA4AYwBjaIBjQA7XU5TVGFibGVDb2x1bW7aATEADgEyATMBNAE1ATYBNwE4AQMAdgE6AZEB +kgGTAZQBPwGVAUEA0wmAPoBBgEAjQFJAAAAAAACAQyNAQ4AAAAAAAIAcVWFsYnVt1wB7AA4A4QCAAIEA +hAFFAIYBRgFHAZsBSQDsAUqANYAtgEKALIAyVUFsYnVt2AB7AA4A4QCAAIEAggCEAUUBcQFyANUBdACN +ANMBdwF4gD2AOIA3gBKAHIA72gExAA4BMgEzATQBNQE2ATcBOAEDAHYBOgGpAaoBqwGsAT8BrQFBANMJ +gD6ARoBFI0BSwAAAAAAAgEkjQESAAAAAAACAHFV0aXRsZdcAewAOAOEAgACBAIQBRQGxAUYBswG0AUkA +7AFKEgSB/gCANYBIgEeALIAyVVRpdGxl0wAOAVMBXgFWAT8BuoAxSzAuMzMzMzMyOTkA2AB7AA4A4QCA +AIEAggCEAUUBcQFyANUBdACNANMBdwF4gD2AOIA3gBKAHIA72gExAA4BMgEzATQBNQE2ATcBOAEDAHYB +OgHFAcYBxwHIAT8ByQFBANMJgD6ATIBLI0BSp7AAAAAAgE4jQERPYCAAAACAHFZsZW5ndGjXAHsADgDh +AIAAgQCEAUUAhgFGAUcBzwFJAdEBSoA1gC2ATYAsEgQAAACAMlZMZW5ndGjYAHsADgDhAIAAgQCCAIQB +RQFxAXIA1QF0AI0A0wHaAXiAPYA4gDeAEoAcEgQACACAO9oBMQAOATIBMwE0ATUBNgE3ATgBAwB2AToB +3wHgAeEB4gE/AeMBQQDTCYA+gFGAUCNARgAAAAAAAIBTI0AkAAAAAAAAgBxUeWVhctcAewAOAOEAgACB +AIQBRQCGAUYBRwHpAUkB0QFKgDWALYBSgCyAMlRZZWFy2AB7AA4A4QCAAIEAggCEAUUBcQFyANUBdACN +ANMB2gF4gD2AOIA3gBKAHIA72gExAA4BMgEzATQBNQE2ATcBOAEDAHYBOgH3AfgB4QH5AT8B4wFBANMJ +gD6AVoBVgFiAHFVnZW5yZdcAewAOAOEAgACBAIQBRQCGAUYBRwH/AUkA7AFKgDWALYBXgCyAMlVHZW5y +ZdgAewAOAOEAgACBAIIAhAFFAXEBcgDVAXQAjQDTAXcBeIA9gDiAN4ASgByAO9oBMQAOATIBMwE0ATUB +NgE3ATgBAwB2AToCDQIOAg8CEAE/AhEBQQDTCYA+gFuAWiNAQwAAAAAAAIBdI0AQAAAAAAAAgBxVdHJh +Y2vXAHsADgDhAIAAgQCEAUUAhgFGAUcCFwFJAdEBSoA1gC2AXIAsgDJVVHJhY2vYAHsADgDhAIAAgQCC +AIQBRQFxAXIA1QF0AI0A0wHaAXiAPYA4gDeAEoAcgDvSADcAOAIjAiSjAiQCJQA7Xk5TTXV0YWJsZUFy +cmF5V05TQXJyYXnVAA4BUgFTAVQBVQFWAigBWAIpAVqAMYBhgGCALllncmlkQ29sb3LTAA4BUwFeAVYB +PwIugDFEMC41AF8QFENvZ1Nwb3RsaWdodFBsYXlsaXN00gA3ADgCMQIyogIyADteTlNDbGFzc1N3YXBw +ZXJfEBV7ezAsIDE3fSwgezQ0MCwgMTgzfX3SADcAOAI1AjakAjYAqACpADtaTlNDbGlwVmlld9kAWgI4 +AA4AbgBcAF4COQBfAjoAawBrAj0CPgEfAGACQABrAkJYTlNUYXJnZXRYTlNBY3Rpb25ZTlNQZXJjZW50 +gBiAGIBpgGeADIBogBgjP+o3hKAAAABfEBR7ezg1LCAxN30sIHsxNSwgNjh9fVxfZG9TY3JvbGxlcjrS +ADcAOAJGAkelAkcApwCoAKkAO1pOU1Njcm9sbGVy2gBaAjgADgBuAKwAXABeAjkAXwI6AGsAawI9AkwA +9QEfAGACQABrAlCAGIAYgGmAa4AMgGiAGCM/6gagAAAAAF8QFXt7MCwgMTg1fSwgezQ0MCwgMTV9fdIA +DgA+AGgCVIBeoQDwgCBfEBZ7ezIwLCAyMH0sIHs0NDAsIDIwMH190gA3ADgCWAJZpAJZAKgAqQA7XE5T +U2Nyb2xsVmlld9gAWgAOAG4AbwBcAHAAXgBfAEwCXAJdAl4CXwB2AGAATIALgIOAcYByEQEKCYAMgAtf +EBZ7ezIwLCAyMzB9LCB7MzEzLCAyMn193QB7AA4CZQDhAIAAgQCCAIQCZgJnAmgCaQFFAmoCawJsAm0A +iACNAGwCcQD1AHYCcwJ0AXhfEBJOU0NhbmNlbEJ1dHRvbkNlbGxfEBBOU1RleHRCZXplbFN0eWxlXxAR +TlNEcmF3c0JhY2tncm91bmRfEBJOU1NlYXJjaEJ1dHRvbkNlbGxfEBBOU01heGltdW1SZWNlbnRzEhRx +/kCAgoB4gHOAFYASgHASEAAEAAmAdRD/gDvVAA4BUgFTAVQBVQFWAVcBWAJ5AVqAMYAwgHSALl8QE3Rl +eHRCYWNrZ3JvdW5kQ29sb3LcAjgAewAOAH0AfgB/AIAAggCDAIQCOQCFAl4CfgCHAoAA7ACIAoIAbAKE +AOwChQKGgHISAAH+AIAWEEuAFYB2gHARAZCAdxIIRED/VnNlYXJjaF8QE19zZWFyY2hGaWVsZFNlYXJj +aDrdAjgAewAOAH0AfgB/AooAgACCAIMAhAI5AIUCXgJ+AIcCgADsAIgCjgKPAGwChADsApEChl8QI05T +QWNjZXNzaWJpbGl0eU92ZXJyaWRkZW5BdHRyaWJ1dGVzgHKAFoAVgHqAeYBwgIFVY2xlYXLSAA4APgBo +ApWAXqECloB70wAOApgAPgKZApoCnVdOUy5rZXlzgICiApsCnIB8gH2iAp4Cn4B+gH9dQVhEZXNjcmlw +dGlvbl8QKU5TQWNjZXNzaWJpbGl0eUVuY29kZWRBdHRyaWJ1dGVzVmFsdWVUeXBlVmNhbmNlbNIANwA4 +AqQCpaMCpQKmADtfEBNOU011dGFibGVEaWN0aW9uYXJ5XE5TRGljdGlvbmFyeV8QE19zZWFyY2hGaWVs +ZENhbmNlbDrSADcAOAKpAqqlAqoBbwCjAG8AO18QEU5TU2VhcmNoRmllbGRDZWxs0gA3ADgCrAKtpgKt +Aq4ApwCoAKkAO11OU1NlYXJjaEZpZWxkW05TVGV4dEZpZWxkWns0ODAsIDI3MH3SADcAOAKxAKijAKgA +qQA7XxAVe3swLCAwfSwgezEyODAsIDc3OH190gA3ADgCtAK1ogK1ADtfEBBOU1dpbmRvd1RlbXBsYXRl +0gA3ADgCtwK4owK4ArkAO1xOU011dGFibGVTZXRVTlNTZXTSAA4APgBoAryAXq0CvQK+Ar8CwALBAsIC +wwLEAsUCxgLHAsgCyYCLgJCAk4CjgKWAp4CxgLWAuYC8gMCAxIDI1AAOAssCzALNAs4CzwBqAtFdTlNE +ZXN0aW5hdGlvblhOU1NvdXJjZVdOU0xhYmVsgI+AjIAOgI7SAA4AMgAzAtSABICNXxAZU3BvdGxpZ2h0 +U2VhcmNoQ29udHJvbGxlcl5hZGRUb1BsYXlsaXN0OtIANwA4AtgC2aMC2QLaADtfEBVOU05pYkNvbnRy +b2xDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LUAA4CywLMAs0C3ABBAB8C34CSgAeAAoCRVndpbmRvd9IA +NwA4AuIC46MC4wLaADtfEBROU05pYk91dGxldENvbm5lY3RvctQADgLLAswCzQLcAuYCzwLogJKAlICM +gKLcAuoADgLrAN8C7ALtAu4C7wLwADIC8QLyAHYA7QB2AvYAdgL4AvkC+gB2AvwAdgB2XxAaTlNGaWx0 +ZXJSZXN0cmljdHNJbnNlcnRpb25fEBROU1ByZXNlcnZlc1NlbGVjdGlvblpOU0VkaXRhYmxlXxAPX05T +TWFuYWdlZFByb3h5XxARTlNPYmplY3RDbGFzc05hbWVeTlNEZWNsYXJlZEtleXNfECJOU0NsZWFyc0Zp +bHRlclByZWRpY2F0ZU9uSW5zZXJ0aW9uXxAYTlNTZWxlY3RzSW5zZXJ0ZWRPYmplY3RzXxAWTlNBdm9p +ZHNFbXB0eVNlbGVjdGlvbgmAYwmAlgmAoICfgJcJgJUJCV8QElBsYXlsaXN0Q29udHJvbGxlcl8QEU5T +QXJyYXlDb250cm9sbGVy0gAOAD4AaAMDgF6nAwQDBQMGAwcDCAMJAwqAmICZgJqAm4CcgJ2AnlxrTURJ +dGVtVGl0bGVca01ESXRlbUFsYnVtXxAXa01ESXRlbUF1ZGlvVHJhY2tOdW1iZXJfEBRrTURJdGVtUmVj +b3JkaW5nWWVhcl8QFmtNREl0ZW1EdXJhdGlvblNlY29uZHNea01ESXRlbUF1dGhvcnNba01ESXRlbVBh +dGheTlNNZXRhZGF0YUl0ZW3RAA4DFICh0gA3ADgDFgLtogLtADtfEBJwbGF5bGlzdENvbnRyb2xsZXLU +AA4CywLMAs0C3AAfAs8DHICSgAKAjICkXxAZc3BvdGxpZ2h0V2luZG93Q29udHJvbGxlctQADgLLAswC +zQLcAGwAQQMigJKAcIAHgKZfEBVpbml0aWFsRmlyc3RSZXNwb25kZXLYAA4CywMlAyYCzALNAycDKAMp +AuYDKwMsASkDLgMvAFNZTlNLZXlQYXRoWU5TQmluZGluZ1lOU09wdGlvbnNfEBxOU05pYkJpbmRpbmdD +b25uZWN0b3JWZXJzaW9ugLCAlICqgKmAKICogKtfECV2YWx1ZTogYXJyYW5nZWRPYmplY3RzLmtNREl0 +ZW1BdXRob3JzVXZhbHVlXxAeYXJyYW5nZWRPYmplY3RzLmtNREl0ZW1BdXRob3Jz0wAOApgAPgM0AzUD +OICvogM2AzeArICtogM5Ap+AroB/XxAWTlNWYWx1ZVRyYW5zZm9ybWVyTmFtZV8QG05TQ29uZGl0aW9u +YWxseVNldHNFZGl0YWJsZV8QGlNwb3RsaWdodEFydGlzdFRyYW5zZm9ybWVy0gA3ADgDPwKmogKmADvS +ADcAOANBA0KjA0IC2gA7XxAVTlNOaWJCaW5kaW5nQ29ubmVjdG9y2AAOAssDJQMmAswCzQMnAygDKQLm +A0YDLAEtA0kDSgBTgLCAlICzgKmAT4CygLRfECt2YWx1ZTogYXJyYW5nZWRPYmplY3RzLmtNREl0ZW1S +ZWNvcmRpbmdZZWFyXxAkYXJyYW5nZWRPYmplY3RzLmtNREl0ZW1SZWNvcmRpbmdZZWFy0wAOApgAPgM0 +A08DUYCvoQM3gK2hAp+Af9gADgLLAyUDJgLMAs0DJwMoAykC5gNWAywBLwNZA1oAU4CwgJSAt4CpgFmA +toC4XxAudmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5rTURJdGVtQXVkaW9UcmFja051bWJlcl8QJ2FycmFu +Z2VkT2JqZWN0cy5rTURJdGVtQXVkaW9UcmFja051bWJlctMADgKYAD4DNANfA2GAr6EDN4CtoQKfgH/X +AA4CywMlAyYCzALNAygDKQLPA2YDLAJeA2kAU4CwgIyAu4CpgHKAul8QE3ZhbHVlOiBzZWFyY2hTdHJp +bmdcc2VhcmNoU3RyaW5n1wAOAssDJQMmAswCzQMoAykCzwNvA3AC5gNyAFOAsICMgL+AvoCUgL1fEBtj +b250ZW50QXJyYXk6IHF1ZXJ5LnJlc3VsdHNcY29udGVudEFycmF5XXF1ZXJ5LnJlc3VsdHPYAA4CywMl +AyYCzALNAycDKAMpAuYDeQMsASwDfAN9AFOAsICUgMKAqYBKgMGAw18QLXZhbHVlOiBhcnJhbmdlZE9i +amVjdHMua01ESXRlbUR1cmF0aW9uU2Vjb25kc18QJmFycmFuZ2VkT2JqZWN0cy5rTURJdGVtRHVyYXRp +b25TZWNvbmRz0wAOApgAPgM0A4IDhICvoQM3gK2hAp+Af9gADgLLAyUDJgLMAs0DJwMoAykC5gOJAywB +KgOMA40AU4CwgJSAxoCpgD+AxYDHXxAjdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5rTURJdGVtQWxidW1f +EBxhcnJhbmdlZE9iamVjdHMua01ESXRlbUFsYnVt0wAOApgAPgM0A5IDlICvoQM3gK2hAp+Af9gADgLL +AyUDJgLMAs0DJwMoAykC5gOZAywBKwOcA50AU4CwgJSAyoCpgESAyYDLXxAjdmFsdWU6IGFycmFuZ2Vk +T2JqZWN0cy5rTURJdGVtVGl0bGVfEBxhcnJhbmdlZE9iamVjdHMua01ESXRlbVRpdGxl0wAOApgAPgM0 +A6IDpICvoQM3gK2hAp+Af9IADgA+A6cDqIDPrxAcAfkBKQBqAT4BLQB0AhAA0wJeAGsBLgHiASsAvwGs +AS8BLALmAcgBKgGUAs8AQQBsAEwAtADwA8SAWIAogA6ANoBPgBCAXYAcgHKAGIBUgFOARIBmgEmAWYBK +gJSAToA/gEOAjIAHgHCAC4BqgCCAzdIADgAyADMDx4AEgM5dTlNBcHBsaWNhdGlvbtIANwA4A8oCJaIC +JQA70gAOAD4DpwPNgM+vEBwBLgDTAEwBKQDTAGoBLwBrAGwATADTAS0A0wBrASsA0wDTAB8BLADTASoA +HwAfAEwAQQBrAGsAH4BUgByAC4AogByADoBZgBiAcIALgByAT4AcgBiARIAcgByAAoBKgByAP4ACgAKA +C4AHgBiAGIAC0gAOAD4DpwPsgM+vEB0B+QEpAGoBPgEtAHQCEAAfANMCXgBrAS4BKwHiAL8BrAEvASwC +5gHIASoBlALPAEEAbAPEAEwA8AC0gFiAKIAOgDaAT4AQgF2AAoAcgHKAGIBUgESAU4BmgEmAWYBKgJSA +ToA/gEOAjIAHgHCAzYALgCCAatIADgA+A6cEDIDPrxAdBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkE +GgQbBBwEHQQeBB8EIAQhBCIEIwQkBCUEJgQnBCgEKYDTgNSA1YDWgNeA2IDZgNqA24DcgN2A3oDfgOCA +4YDigOOA5IDlgOaA54DogOmA6oDrgOyA7YDugO9fEB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCkt +Ml8QFVRhYmxlIENvbHVtbiAoYXJ0aXN0KV8QHVB1c2ggQnV0dG9uIChBZGQgdG8gUGxheWxpc3QpXxAb +VGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpXxATVGFibGUgQ29sdW1uICh5ZWFyKV8QHUJ1dHRvbiBD +ZWxsIChBZGQgdG8gUGxheWxpc3QpXxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTRcRmlsZSdz +IE93bmVyXxBAUGxheWxpc3QgVmlldyAoQXJ0aXN0LCBBbGJ1bSwgVGl0bGUsIExlbmd0aCwgWWVhciwg +R2VucmUsIFRyYWNrKV8QEVNlYXJjaCBGaWVsZCBDZWxsW1Njcm9sbCBWaWV3XxAUVGFibGUgQ29sdW1u +IChnZW5yZSlfEBRUYWJsZSBDb2x1bW4gKHRpdGxlKV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxs +KS0xXxARVmVydGljYWwgU2Nyb2xsZXJfEB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktM18QFFRh +YmxlIENvbHVtbiAodHJhY2spXxAVVGFibGUgQ29sdW1uIChsZW5ndGgpXxATUGxheWxpc3QgQ29udHJv +bGxlcl8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS01XxAUVGFibGUgQ29sdW1uIChhbGJ1bSlf +EB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktNl8QG1Nwb3RsaWdodCBTZWFyY2ggQ29udHJvbGxl +cl8QG1BhbmVsIChPcGVuIGZyb20gU3BvdGxpZ2h0KVxTZWFyY2ggRmllbGRbQXBwbGljYXRpb25cQ29u +dGVudCBWaWV3XxARVGFibGUgSGVhZGVyIFZpZXdfEBNIb3Jpem9udGFsIFNjcm9sbGVy0gAOAD4DpwRJ +gM+iAuYA04CUgBzSAA4APgOnBE6Az6IC/AD8gJWAHdIADgA+A6cEU4DPrxAqAsEB+QLHAsUBKQBqAT4B +LQB0AhACwgLJAB8A0wJeAGsCvQLDAS4B4gErAr4AvwGsAS8CyAEsAuYByALEAr8CxgEqAZQCzwBBAsAA +bAC0A8QA8ABMgKWAWIDAgLmAKIAOgDaAT4AQgF2Ap4DIgAKAHIBygBiAi4CxgFSAU4BEgJCAZoBJgFmA +xIBKgJSAToC1gJOAvIA/gEOAjIAHgKOAcIBqgM2AIIAL0gAOAD4DpwSAgM+vECoEgQSCBIMEhASFBIYE +hwSIBIkEigSLBIwEjQSOBI8EkASRBJIEkwSUBJUElgSXBJgEmQSaBJsEnASdBJ4EnwSgBKEEogSjAp8E +pQSmBKcEqASpBKqA9ID1gPaA94D4gPmA+oD7gPyA/YD+gP+BAQCBAQGBAQKBAQOBAQSBAQWBAQaBAQeB +AQiBAQmBAQqBAQuBAQyBAQ2BAQ6BAQ+BARCBARGBARKBAROBARSBARWBARaAf4EBF4EBGIEBGYEBGoEB +G4EBHBA9ECsQQhA6ECIQBRAnECwQRxAuEE0QHBA4EBgQShBBEB4QKhAkEEgQGxAlEB0QPBAgEBAQKRBA +EC0QIRAoEBEQTBA3EBoT//////////3SAA4APgBoBNGAXqDSAA4APgOnBNSAz6DSAA4APgOnBNeAz6DS +ADcAOATZBNqiBNoAO15OU0lCT2JqZWN0RGF0YQAIABkAIgAnADEAOgA/AEQAUgBUAGYCrAKyAv0DBAML +AxkDKwNHA1UDYQNtA3sDhgOUA7ADvgPRA+MD/QQHBBQEFgQZBBsEHQQgBCIEJAQmBCgEKgQsBC8EMQQz +BDUEOAQ6BDwERQRRBFMEVQRxBHoEgwSOBJMEogSrBL4ExwTSBNQE1wTZBQIFDwUcBSoFNAVCBU8FYQV1 +BYEFgwWFBYcFiQWOBZAFkgWUBZYFmAWzBckF0QXuBgAGCwYUBiAGKQY1BjcGOQY7Bj4GQAZCBkQGTQZP +BlYGWAZaBlwGfQaFBowGlgaYBpoGnAaeBqEGogakBqYGwAbxBv0HEwcoBzcHSQdUB14HbAd+B4sHmQee +B6AHogekB6YHqAeqB6wHrgewB7UHvgfQB+EH6AfvB/gH+ggDCAUICAgVCB4IIwgqCCsINAg9CEoIVwhg +CGsIdAh+CIUIkQjQCNwI5QjyCQUJEgkeCSwJOgk8CT4JQAlCCUUJRwlJCUsJXglhCWMJZQlnCWkJawl0 +CXYJgQmDCYUJhwmJCYsJuAnCCcwJ1gnYCdoJ3AneCeEJ4wnlCecJ6QnrCfQJ9gn5CfsKWgp8CoYKnAqp +Cr0K0grsCwgLIwsyCz4LXQtsC3gLegt8C34LhwuJC4sLjQuOC5ALmQubC6QLpwupC6oLrAuuC7ALsgu0 +C7YLuAvBC84L2gvlDAIMBAwGDAgMCgwMDA4MOww9DD8MQQxDDEUMRwxJDEsMTQxPDFkMYgxrDH8MmAya +DJwMngynDKkMqwzCDMsM1AziDOsM7Qz8DP4NAA0CDQQNBg0IDQoNMw1CDU8NXA1kDW8Nfg2JDZQNlQ2X +DZkNmw2kDaYNqA2xDboNvA3DDeAN7A3uDfAN8g30DfYN/Q4ODhAOGQ4bDh4OMw47DkgOVA5iDmQOZg5o +DmoObA5zDn8OjA6UDpYOmQ6iDqcOvA6+DsAOwg7EDtYO4w7lDugO8Q78DxAPIg9DD0gPSg9MD04PUA9S +D1UPVw9hD3YPeA96D3wPfg+XD6QPpg+yD8cPyQ/LD80Pzw/iD+sP9A/9EAIQEBA5EDoQPBA+EEAQSRBL +EFQQVhBcEHkQexB9EH8QgRCDEIkQqhCsEK4QsBCyELQQthDfEOAQ4hDkEOYQ7xDxEPoQ/BECER8RJBEm +ESgRKhEsES4RNBFBEUMRTxFwEXIRdBF2EXgRehF8EaURphGoEaoRrBG1EbcRwBHCEckR5hHoEeoR7BHu +EfMR9RH8Eh0SHxIhEiMSJRInEiwSLhJXElgSWhJcEl4SZxJpEnISdBJ5EpYSmBKaEpwSnhKgEqUSxhLI +EsoSzBLOEtAS0hL7EvwS/hMAEwITBBMGEwwTKRMrEy0TLxMxEzMTORNaE1wTXhNgE2ITZBNmE48TkBOS +E5QTlhOfE6ETqhOsE7ITzxPRE9MT1RPXE9kT3xQAFAIUBBQGFAgUChQMFBUUHBQrFDMUSBRKFEwUThRQ +FFoUZxRpFG4UhRSOFJMUohS6FMMUzBTXFPwVBRUOFRgVGhUcFR4VIBUiFSQVJhUvFUYVUxVcFWcVchWb +FZ0VnxWhFaMVpRWnFakVshXKFdMV1RXYFdoV8xX8FgUWEhYzFjUWNxY5FjsWPhY/FkEWQxZcFpEWpha5 +Fs0W4hb1FvoW/Bb+FwAXAhcEFwYXCxcMFw4XEBcSFycXKRcrFy0XLxdFF3YXeBd9F38XgReDF4UXhxeK +F4wXkReYF64X4xgJGAsYDRgPGBEYExgVGBcYHRgmGCgYKxgtGDoYQhhEGEkYSxhNGFIYVBhWGGQYkBiX +GKAYpxi9GMoY4BjpGPQZCBkRGR4ZLBk4GUMZTBlTGWsZdBl5GYwZlRmcGakZrxm4GboZ1RnXGdkZ2xnd +Gd8Z4RnjGeUZ5xnpGesZ7RnvGgAaDhoXGh8aIRojGiUaJxowGjIaNBpQGl8aaBpvGocalhqnGqkaqxqt +Gq8athq/GsYa3RruGvAa8hr0GvYbJxtEG1sbZht4G4wbmxvAG9sb9Bv1G/cb+Bv6G/sb/Rv/HAEcAhwE +HAUcBhwbHC8cOBw6HEkcSxxNHE8cURxTHFUcVxxkHHEcixyiHLscyhzWHOUc6hzsHPUc+h0PHSAdIh0k +HSYdKB1EHVUdVx1ZHVsdXR11HZYdoB2qHbQd0x3VHdcd2R3bHd0d3x3hHgkeDx4wHj0ePx5EHkYeSB5N +Hk8eUR5qHogepR6uHrMevB7DHtse/B7+HwAfAh8EHwYfCB8KHzgfXx9sH24fcR9zH3YfeB+ZH5sfnR+f +H6Efox+lH6cf2CACIA8gESAUIBYgGSAbIDggOiA8ID4gQCBCIEQgWiBnIIQghiCIIIogjCCOIJAgriC7 +IMkg6iDsIO4g8CDyIPQg9iD4ISghUSFeIWAhYyFlIWghaiGLIY0hjyGRIZMhlSGXIZkhvyHeIesh7SHw +IfIh9SH3IhgiGiIcIh4iICIiIiQiJiJMImsieCJ6In0ifyKCIoQijSKPIsoizCLOItAi0iLUItYi2CLa +Itwi3iLgIuIi5CLmIugi6iLsIu4i8CLyIvQi9iL4Ivoi/CL+IwAjAiMLIw0jDyMdIyYjKyM0IzYjcSNz +I3UjdyN5I3sjfSN/I4EjgyOFI4cjiSOLI40jjyORI5MjlSOXI5kjmyOdI58joSOjI6UjpyOpI7IjtCPx +I/Mj9SP3I/kj+yP9I/8kASQDJAUkByQJJAskDSQPJBEkEyQVJBckGSQbJB0kHyQhJCMkJSQnJCkkKyQ0 +JDYkcyR1JHckeSR7JH0kfySBJIMkhSSHJIkkiySNJI8kkSSTJJUklySZJJsknSSfJKEkoySlJKckqSSr +JK0kzSTlJQUlIyU5JVkleSWGJckl3SXpJgAmFyY3JksmayaCJpomsCbQJucnByclJ0MnUCdcJ2knfSeT +J5wnniejJ6UnpyewJ7Intye5J7snxCfGKB0oHyghKCMoJSgnKCkoKygtKC8oMSgzKDUoNyg5KDsoPSg/ +KEEoQyhFKEcoSShLKE0oTyhRKFMoVShXKFkoWyhdKF8oYShjKGUoZyhpKGsobShvKHEoeih8KNMo1SjX +KNko2yjdKN8o4SjjKOUo5yjpKOso7ijxKPQo9yj6KP0pACkDKQYpCSkMKQ8pEikVKRgpGykeKSEpJCkn +KSopLSkwKTIpNSk4KTspPilBKUQpRilIKUopTClOKVApUilUKVYpWClaKVwpXilgKWIpZClmKWgpails +KW4pcClyKXQpdil4KXopfCl+KYApgimEKYYpiCmKKZMpnCmeKZ8pqCmqKasptCm2KbcpwCnFAAAAAAAA +AgIAAAAAAAAE2wAAAAAAAAAAAAAAAAAAKdQ diff --git a/SpotlightSearchController.h b/SpotlightSearchController.h new file mode 100644 index 000000000..c3dc5a832 --- /dev/null +++ b/SpotlightSearchController.h @@ -0,0 +1,27 @@ +// +// SpotlightSearchController.h +// Cog +// +// Created by Matthew Grinshpun on 10/02/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import + +@class SpotlightWindowController; + +@interface SpotlightSearchController : NSObject { + IBOutlet NSArrayController *playlistController; + IBOutlet SpotlightWindowController *spotlightWindowController; + NSMetadataQuery *query; + NSString *searchString; +} + +- (IBAction)addToPlaylist:(id)sender; + +- (void)performSearch; + +@property(retain) NSMetadataQuery *query; +@property(copy) NSString *searchString; + +@end diff --git a/SpotlightSearchController.m b/SpotlightSearchController.m new file mode 100644 index 000000000..202c54412 --- /dev/null +++ b/SpotlightSearchController.m @@ -0,0 +1,90 @@ +// +// SpotlightSearchController.m +// Cog +// +// Created by Matthew Grinshpun on 10/02/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import "SpotlightSearchController.h" +#import "SpotlightWindowController.h" +#import "PlaylistLoader.h" + +// Store a class predicate for searching for music +static NSPredicate * musicOnlyPredicate = nil; + +@implementation SpotlightSearchController + ++ (void)initialize +{ + musicOnlyPredicate = [[NSPredicate predicateWithFormat: + @"kMDItemContentTypeTree==\'public.audio\'"] retain]; +} + +- (id)init +{ + if (self = [super init]) { + self.query = [[NSMetadataQuery alloc] init]; + } + + return self; +} + +- (void)performSearch +{ + unsigned options = (NSCaseInsensitivePredicateOption| + NSDiacriticInsensitivePredicateOption); + NSString *processedKey = [NSString stringWithFormat: @"*%@*", self.searchString]; + + NSPredicate *searchPredicate = [NSComparisonPredicate + predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"*"] + rightExpression:[NSExpression expressionForConstantValue:processedKey] + modifier:NSDirectPredicateModifier + type:NSLikePredicateOperatorType + options:options]; + + // spotlightPredicate, which is what will finally be used for the spotlight search + // is the union of the bound NSSearchField and the static musicOnlyPredicate + + NSPredicate *spotlightPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: + [NSArray arrayWithObjects: musicOnlyPredicate, + searchPredicate, + nil]]; + if([self.query isStarted]) + [self.query stopQuery]; + self.query.predicate = spotlightPredicate; + [self.query startQuery]; + NSLog(@"Started query: %@", [self.query.predicate description], [[self.query class]description]); +} + +- (void)dealloc +{ + [self.query stopQuery]; + [self.query release]; + [self.searchString release]; + [musicOnlyPredicate release]; + [super dealloc]; +} + +- (IBAction)addToPlaylist:(id)sender; +{ + NSArray *songPaths = [[playlistController selectedObjects]valueForKey:@"kMDItemPath"]; + NSMutableArray *songURLs = [NSMutableArray arrayWithCapacity:[songPaths count]]; + for (NSString *songPath in songPaths) { + [songURLs addObject:[NSURL fileURLWithPath:songPath]]; + } + [spotlightWindowController.playlistLoader addURLs:songURLs sort:NO]; +} + +@synthesize query; + +@synthesize searchString; +- (void)setSearchString:(NSString *)aString +{ + if (searchString != aString) { + searchString = [aString copy]; + [self performSearch]; + } +} + +@end diff --git a/SpotlightWindowController.h b/SpotlightTransformers.h similarity index 63% rename from SpotlightWindowController.h rename to SpotlightTransformers.h index 99f0fd8ef..7eef61517 100644 --- a/SpotlightWindowController.h +++ b/SpotlightTransformers.h @@ -1,5 +1,5 @@ // -// SpotlightWindowController.h +// SpotlightTransformers.h // Cog // // Created by Matthew Grinshpun on 10/02/08. @@ -9,7 +9,7 @@ #import -@interface SpotlightWindowController : NSWindowController { +@interface SpotlightArtistTransformer : NSValueTransformer{ } diff --git a/SpotlightTransformers.m b/SpotlightTransformers.m new file mode 100644 index 000000000..a8f59af6b --- /dev/null +++ b/SpotlightTransformers.m @@ -0,0 +1,27 @@ +// +// SpotlightTransformers.m +// Cog +// +// Created by Matthew Grinshpun on 10/02/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import "SpotlightTransformers.h" + +// kMDItemAuthor is an array of values. +// For music, the first value is the artist +@implementation SpotlightArtistTransformer + ++ (Class)transformedValueClass { + return [NSString class]; +} + +- (id)transformedValue:(id)value { + NSString * artistString = @""; + if (value != nil) { + artistString = [NSString stringWithString: + (NSString *)[value objectAtIndex:0]]; + } + return artistString; +} +@end diff --git a/SpotlightWindowController.m b/SpotlightWindowController.m deleted file mode 100644 index 67f97f0d4..000000000 --- a/SpotlightWindowController.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// SpotlightWindowController.m -// Cog -// -// Created by Matthew Grinshpun on 10/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - -#import "SpotlightWindowController.h" - - -@implementation SpotlightWindowController - -@end