diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index b0579e0c2..b4c5a4296 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -108,6 +108,7 @@ 5604D45B0D60349B004F5C5D /* SpotlightWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5604D4590D60349B004F5C5D /* SpotlightWindowController.m */; }; 5604D4F60D60726E004F5C5D /* SpotlightPlaylistEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */; }; 562EA72E0D60CC5B0017B2B7 /* SpotlightTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 562EA72D0D60CC5B0017B2B7 /* SpotlightTransformers.m */; }; + 56462DDA0D61D71E000AB68C /* SpotlightPlaylistView.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462DD90D61D71E000AB68C /* SpotlightPlaylistView.m */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; @@ -598,6 +599,8 @@ 5604D4F40D60726E004F5C5D /* SpotlightPlaylistEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SpotlightPlaylistEntry.h; path = Spotlight/SpotlightPlaylistEntry.h; sourceTree = ""; }; 5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightPlaylistEntry.m; path = Spotlight/SpotlightPlaylistEntry.m; sourceTree = ""; }; 562EA72D0D60CC5B0017B2B7 /* SpotlightTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpotlightTransformers.m; sourceTree = ""; }; + 56462DD80D61D71E000AB68C /* SpotlightPlaylistView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SpotlightPlaylistView.h; path = Spotlight/SpotlightPlaylistView.h; sourceTree = ""; }; + 56462DD90D61D71E000AB68C /* SpotlightPlaylistView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightPlaylistView.m; path = Spotlight/SpotlightPlaylistView.m; sourceTree = ""; }; 566D32160D538550004466A5 /* APL.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = APL.xcodeproj; path = Plugins/APL/APL.xcodeproj; 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 = ""; }; @@ -1094,6 +1097,8 @@ 5604D4F40D60726E004F5C5D /* SpotlightPlaylistEntry.h */, 5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */, 562EA72D0D60CC5B0017B2B7 /* SpotlightTransformers.m */, + 56462DD80D61D71E000AB68C /* SpotlightPlaylistView.h */, + 56462DD90D61D71E000AB68C /* SpotlightPlaylistView.m */, ); name = Spotlight; sourceTree = ""; @@ -1632,6 +1637,7 @@ 5604D45B0D60349B004F5C5D /* SpotlightWindowController.m in Sources */, 5604D4F60D60726E004F5C5D /* SpotlightPlaylistEntry.m in Sources */, 562EA72E0D60CC5B0017B2B7 /* SpotlightTransformers.m in Sources */, + 56462DDA0D61D71E000AB68C /* SpotlightPlaylistView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Spotlight/SpotlightPanel.xib b/Spotlight/SpotlightPanel.xib index cc2997acf..9dfd601aa 100644 --- a/Spotlight/SpotlightPanel.xib +++ b/Spotlight/SpotlightPanel.xib @@ -51,7 +51,7 @@ 134217728 Add to Playlist - LucidaGrande + LucidaGrande 1.300000e+01 1044 @@ -108,13 +108,13 @@ 0 Artist - + 1.100000e+01 3100 6 - System + System headerColor 3 @@ -123,7 +123,7 @@ 6 - + headerTextColor 3 @@ -134,12 +134,12 @@ 337772096 2048 - Text Cell + Text Cell 6 - + controlBackgroundColor 3 @@ -148,7 +148,7 @@ 6 - + controlTextColor @@ -173,7 +173,7 @@ 337772096 2048 - + @@ -202,7 +202,7 @@ 337772096 2048 - + @@ -228,7 +228,7 @@ 337772096 67110912 - + @@ -254,7 +254,7 @@ 337772096 67110912 - + @@ -280,7 +280,7 @@ 337772096 2048 - + @@ -306,7 +306,7 @@ 337772096 67110912 - + @@ -322,7 +322,7 @@ 6 - + gridColor 3 @@ -413,7 +413,7 @@ 1 6 - + textBackgroundColor @@ -478,7 +478,7 @@ 6 - + controlColor @@ -541,7 +541,7 @@ YES - SpotlightSearchController + SpotlightSearchController YES @@ -798,6 +798,14 @@ 110 + + + tableView + + + + 149 + @@ -1133,10 +1141,10 @@ - {{70, 101}, {480, 318}} + {{70, 17}, {480, 318}} {196, 240} - + {{70, 17}, {480, 318}} PlaylistController @@ -1149,7 +1157,7 @@ - PlaylistView + SpotlightPlaylistView @@ -1210,7 +1218,7 @@ - 148 + 149 @@ -1229,10 +1237,10 @@ YES - id - - - + id + + + @@ -1249,7 +1257,7 @@ - IBProjectSource + IBProjectSource Playlist/PlaylistView.h @@ -1275,7 +1283,7 @@ - + Playlist/EntriesController.h @@ -1296,348 +1304,12 @@ PlaylistLoader - + Spotlight/SpotlightWindowController.h - PlaylistLoader - - - YES - - YES - - - YES - - - - playlistController - PlaylistController - - - - Playlist/PlaylistLoader.h - - - - PlaybackController - - - YES - - YES - changeVolume: - next: - pause: - pauseResume: - play: - playPauseResume: - playbackButtonClick: - prev: - resume: - seek: - seekBackward: - seekForward: - stop: - toggleShowTimeRemaining: - volumeDown: - volumeUp: - - - YES - - - - - - - - - - - - - - - - - - - - YES - - YES - outputDevices - playbackButtons - playlistController - playlistView - positionSlider - timeField - volumeSlider - - - YES - NSArrayController - NSSegmentedControl - PlaylistController - PlaylistView - TrackingSlider - NSTextField - NSSlider - - - - - Application/PlaybackController.h - - - - TrackingSlider - NSSlider - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Utils/TrackingSlider.h - - - - DNDArrayController - NSArrayController - - YES - - YES - - - YES - - - - tableView - NSTableView - - - - Playlist/DNDArrayController.h - - - - PlaylistController - DNDArrayController - - YES - - YES - clear: - clearFilterPredicate: - showEntryInFinder: - takeRepeatFromObject: - takeShuffleFromObject: - - - YES - - - - - - - - - YES - - YES - entriesController - playlistLoader - - - YES - EntriesController - PlaylistLoader - - - - - Playlist/PlaylistController.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/NDHotKeys/NDHotKeyEvent.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/UKKQueue/UKKQueue.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/AppleRemote/AppleRemote.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/GCWindowMenu/GCOneShotEffectTimer.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/UKKQueue/UKFileWatcher.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/UKKQueue/UKMainThreadProxy.h - - - - + YES @@ -1674,8 +1346,8 @@ YES - - + + @@ -1694,10 +1366,372 @@ - + Spotlight/SpotlightSearchController.h + + PlaylistLoader + + + YES + + YES + + + YES + + + + playlistController + PlaylistController + + + + Playlist/PlaylistLoader.h + + + + SpotlightPlaylistView + PlaylistView + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + Spotlight/SpotlightPlaylistView.h + + + + PlaybackController + + + YES + + YES + changeVolume: + next: + pause: + pauseResume: + play: + playPauseResume: + playbackButtonClick: + prev: + resume: + seek: + seekBackward: + seekForward: + stop: + toggleShowTimeRemaining: + volumeDown: + volumeUp: + + + YES + + + + + + + + + + + + + + + + + + + + YES + + YES + outputDevices + playbackButtons + playlistController + playlistView + positionSlider + timeField + volumeSlider + + + YES + NSArrayController + NSSegmentedControl + PlaylistController + PlaylistView + TrackingSlider + NSTextField + NSSlider + + + + + Application/PlaybackController.h + + + + TrackingSlider + NSSlider + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + Utils/TrackingSlider.h + + + + DNDArrayController + NSArrayController + + YES + + YES + + + YES + + + + + NSTableView + + + + Playlist/DNDArrayController.h + + + + PlaylistController + DNDArrayController + + YES + + YES + clear: + clearFilterPredicate: + showEntryInFinder: + takeRepeatFromObject: + takeShuffleFromObject: + + + YES + + + + + + + + + YES + + YES + entriesController + playlistLoader + + + YES + EntriesController + PlaylistLoader + + + + + Playlist/PlaylistController.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/NDHotKeys/NDHotKeyEvent.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/UKKQueue/UKKQueue.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/AppleRemote/AppleRemote.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/GCWindowMenu/GCOneShotEffectTimer.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/UKKQueue/UKFileWatcher.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/UKKQueue/UKMainThreadProxy.h + + 0 @@ -1705,250 +1739,252 @@ 3 YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBRgALAAwAMQA1ADYAPAA9 +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBSQALAAwAMQA1ADYAPAA9 AEIAVgBXAFgAWQALAGcAbwB7AHwAlACVAJ0AngChAKIApgCsAMQAzADaAN4BBAEFAQYBBwEOARkBGgEd ASQBJQEoATIBRQFGAU0BTgFTAV0BXgFfAWMBZQFqAWsBbgFyAXsBfAGBAYIBhQGKAYsBjQGQAZkBmgGg AaEBqAGxAbIBuQG6Ab0BxAHNAc4B1QHWAd4B5wHoAe4B7wH2Af0B/gIEAgUCDAIVAhYCHAIdAiQCKAIt Ai4CMQIyAjUCNgI5AkUCRgJHAkoCUwJUARkCWAJZAlwCZQJmAngCfQJ+AokCigKLApQClQKZAqICowKk -APcCpQKpAqoCrQKxAroCuwLEAsUCygLLAs0C1wLcAt0C3gLiAuMC7gLxAvQC9wALAvgC+gL7Av4DEgMa -Ax0DHgMfAyMDKAMpAy4DLwM0AzUDOgM7Az4DQwNZA1oDWwNmA2cDaQNrA2wDcQNyA34DfwOAA4EDhwOI -A4oDjQOVA5YDlwOdA6QDpQOmA6cDrgOvA7ADuAO5A7oDwAPIA8kDygPQA9gD2QPaA+AD6APpA+oD8AP4 -A/wEAAQBBAIECAQJBAoEEgQTBBQEGgQ+BEEEQgREBGgEjQSyBLMEtAS1BLYEtwS4BLkEugS7BLwEvQS+ -BL8EwATBBMIEwwTEBMUExgTHBMgEyQTKBMsEzATNBM4EzwTQBNEE0gTTBNQE2QTeBRQFSgVLBUwFTQVO -BU8FUAVRBVIAiwVTBVQFVQVWBVcCggVYBVkFWgVbAFMFXAVdBV4FXwVgBWEFYgVjBWQFZQVmBWcFaAVp -AVoFagVrBWwFbQVuBW8FcAVxBXIAVAVzBXQFdQV2BXcFegV9BYBVJG51bGzfEBIADQAOAA8AEAARABIA -EwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADBW -TlNSb290ViRjbGFzc11OU09iamVjdHNLZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nlc3NpYmls -aXR5T2lkc1ZhbHVlc11OU0Nvbm5lY3Rpb25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5TQ2xhc3Nl -c0tleXNaTlNPaWRzS2V5c11OU05hbWVzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVjdG9yc11O -U0ZvbnRNYW5hZ2VyXxAQTlNWaXNpYmxlV2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05TQWNjZXNz -aWJpbGl0eU9pZHNLZXlzWU5TTmV4dE9pZFxOU09pZHNWYWx1ZXOAAoEBRYDjgQENgQFEgJqA6IAFgQEM -gQEOgOmBAUKAAIAGgOeBAUMQloEBD9IADgAyADMANFtOU0NsYXNzTmFtZYAEgANfEBlTcG90bGlnaHRX -aW5kb3dDb250cm9sbGVy0gA3ADgAOQA6WCRjbGFzc2VzWiRjbGFzc25hbWWiADoAO15OU0N1c3RvbU9i -amVjdFhOU09iamVjdF8QEElCQ29jb2FGcmFtZXdvcmvSAA4APgA/AEBaTlMub2JqZWN0c4CPoQBBgAfa -AEMADgBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAK1xOU1dpbmRvd1ZpZXdcTlNTY3Jl -ZW5SZWN0XU5TV2luZG93VGl0bGVZTlNXVEZsYWdzXU5TV2luZG93Q2xhc3NcTlNXaW5kb3dSZWN0XxAP -TlNXaW5kb3dCYWNraW5nXxARTlNXaW5kb3dTdHlsZU1hc2tbTlNWaWV3Q2xhc3OAC4CZgJiACRIgAAAA -gAqACBACEB+AAF8QGHt7MTk2LCAxOTJ9LCB7NDgwLCAzMTh9fV8QE09wZW4gZnJvbSBTcG90bGlnaHRX -TlNQYW5lbNcAWgAOAFsAXABdAF4AXwBgAGEAYgBjAGQAYABmXxAPTlNOZXh0UmVzcG9uZGVyWk5TU3Vi -dmlld3NYTlN2RmxhZ3NbTlNGcmFtZVNpemVYTlNXaW5kb3dbTlNTdXBlcnZpZXeADICXgA0RAQCAlYAM -gJbSAA4APgBoAGmAXqUAagBrAGwAbQBugA6AGIBwgISAi9gAWgAOAHAAcQBcAHIAXgBfAEwAdAB1AHYA -dwB4AGAATFdOU0ZyYW1lVk5TQ2VsbFlOU0VuYWJsZWSAC4AXgA+AEBEBCQmADIALXxAXe3szMzUsIDI3 -Mn0sIHsxMzEsIDMyfX3cAH0ADgB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACKAI4AjwBqAJEA -kgCTW05TQ2VsbEZsYWdzXxATTlNBbHRlcm5hdGVDb250ZW50c18QEk5TUGVyaW9kaWNJbnRlcnZhbF5O -U0J1dHRvbkZsYWdzMl8QD05TS2V5RXF1aXZhbGVudFpOU0NvbnRlbnRzWU5TU3VwcG9ydF1OU0NvbnRy -b2xWaWV3XxAPTlNQZXJpb2RpY0RlbGF5XE5TQ2VsbEZsYWdzMl1OU0J1dHRvbkZsYWdzEgQB/gCAFoAV -EBkQgYAVgBGAEoAOEMgSCAAAABP/////hoJA/18QD0FkZCB0byBQbGF5bGlzdNQADgCWAJcAmACZAJoA -mwCcVk5TU2l6ZVZOU05hbWVYTlNmRmxhZ3OAFCNAKgAAAAAAAIATEQQUXEx1Y2lkYUdyYW5kZdIANwA4 -AJ8AoKIAoAA7Vk5TRm9udFDSADcAOACjAKSkAKQApQBxADtcTlNCdXR0b25DZWxsXE5TQWN0aW9uQ2Vs -bNIANwA4AKcAqKUAqACpAKoAqwA7WE5TQnV0dG9uWU5TQ29udHJvbFZOU1ZpZXdbTlNSZXNwb25kZXLf -EA8AWgCtAA4AcACuAK8AsABbALEAXABeAF8AsgCzALQATAC2ALcAuAC5ALoAuwC8AL0AvgBgAEwAwQDC -AMJbTlNIU2Nyb2xsZXJYTlNzRmxhZ3NcTlNDb3JuZXJWaWV3XxAQTlNIZWFkZXJDbGlwVmlld1xOU1Nj -cm9sbEFtdHNbTlNWU2Nyb2xsZXJdTlNOZXh0S2V5Vmlld11OU0NvbnRlbnRWaWV3gAuAaoBvgG4RAjCA -JIAhgBlPEBAAAAAAAAAAAEGYAABBmAAAEQESgAyAC4BmgBqAGtIADgA+AGgAxoBepQDCAMEAtgC7ALqA -GoBmgGqAIYAk2wBaAA4AcADNAFsAXADOAF4AzwBfALMAawDRANIAUwDTANQA1QBgANcAawDVWU5TY3ZG -bGFnc1lOU0RvY1ZpZXdZTlNCR0NvbG9ygBiAZYBkgBsRCQCAHIAMgDiAGIAc0gAOAD4AaADcgF6hANWA -HN8QFwBaAN8ADgDgAOEA4gDjAOQArwDlAOYA5wBcAF0AcgDoAF4AMgDpAOoAXwDrAOwAwgDuAO8A8ADx -APIA1wB4ALoA9gD3APgA+QD6AHgA/ABgAP4A/wEAAMIBAgEDXxAfTlNEcmFnZ2luZ1NvdXJjZU1hc2tG -b3JOb25Mb2NhbFlOU1R2RmxhZ3NfEBNOU09yaWdpbmFsQ2xhc3NOYW1lXE5TSGVhZGVyVmlld18QEU5T -QmFja2dyb3VuZENvbG9yXxASTlNBbGxvd3NUeXBlU2VsZWN0XxAXTlNJbnRlcmNlbGxTcGFjaW5nV2lk -dGhfEBlOU0NvbHVtbkF1dG9yZXNpemluZ1N0eWxlXxAYTlNJbnRlcmNlbGxTcGFjaW5nSGVpZ2h0Xk5T -QXV0b3NhdmVOYW1lW05TR3JpZENvbG9yXxAcTlNEcmFnZ2luZ1NvdXJjZU1hc2tGb3JMb2NhbF5OU1Rh -YmxlQ29sdW1uc1tOU1Jvd0hlaWdodIAaEACAYxP/////28CAAIAegCCAOAmAJCNACAAAAAAAABABI0AA -AAAAAAAAERESgB8JgGKADIAdgF8QD4AagCcjQDEAAAAAAABcUGxheWxpc3RWaWV3W05TVGFibGVWaWV3 -Wns0NDAsIDE5OH3XAFoADgBcAF0AXgBfAQUAuwEJAGMBCgBgALsA1YAhgCOAIoAMgCGAHNsAWgAOAM0A -WwBcAF0AzgBeAM8AXwCzAGsA0QERARIA1AETAPIAYADXAGsA8oAYgGUQBIBsgG2AIIAMgDiAGIAgWXs0 -NDAsIDE3fdIANwA4ARsBHKQBHACqAKsAO18QEU5TVGFibGVIZWFkZXJWaWV31gBaAA4AcABcAF4AXwBr -AR8BIAEhAGAAa4AYgCaAJRP/////gAABAIAMgBhfEBR7ey0yNiwgMH0sIHsxNiwgMTd9fdIANwA4ASYB -J6QBJwCqAKsAO11fTlNDb3JuZXJWaWV30gAOAD4AaAEqgF6nASsBLAEtAS4BLwEwATGAKIA/gESASoBP -gFSAWdoBMwAOATQBNQE2ATcBOAE5AToBBQB4ATwBPQE+AT8BQAFBAUIBQwDVXk5TSXNSZXNpemVhYmxl -XE5TSGVhZGVyQ2VsbFxOU0lkZW50aWZpZXJXTlNXaWR0aFpOU0RhdGFDZWxsXk5TUmVzaXppbmdNYXNr -Wk5TTWluV2lkdGhaTlNNYXhXaWR0aAmAPoAqgCkjQFGAAAAAAACANhADI0BCAAAAAAAAI0CPQAAAAAAA -gBxWYXJ0aXN01wB9AA4A4wCCAIMAhgFHAIgBSAFJAUoBSwDuAUxbTlNUZXh0Q29sb3KANYAtgCuALIAy -VkFydGlzdNQADgCWAJcAmACZAVAAmwFSgBQjQCYAAAAAAACAExEMHNUADgFUAVUBVgFXAVgBWQFaAVsB -XFdOU0NvbG9yXE5TQ29sb3JTcGFjZVtOU0NvbG9yTmFtZV1OU0NhdGFsb2dOYW1lgDGAMBAGgC+ALlZT -eXN0ZW1baGVhZGVyQ29sb3LTAA4BVQFgAVgBQQFiV05TV2hpdGWAMUIxANIANwA4AWQBVKIBVAA71QAO -AVQBVQFWAVcBWAFnAVoBaAFcgDGANIAzgC5fEA9oZWFkZXJUZXh0Q29sb3LTAA4BVQFgAVgBQQFtgDFC -MADSADcAOAFvAXClAXABcQClAHEAO18QEU5TVGFibGVIZWFkZXJDZWxsXxAPTlNUZXh0RmllbGRDZWxs -2AB9AA4A4wCCAIMAhACGAUcBcwF0ANcBdgCPANUBeQF6EhQh/kCAPYA4gDeAEoAcEQgAgDtZVGV4dCBD -ZWxs1QAOAVQBVQFWAVcBWAF+AVoBfwFcgDGAOoA5gC5fEBZjb250cm9sQmFja2dyb3VuZENvbG9y0wAO -AVUBYAFYAUEBhIAxSzAuNjY2NjY2NjkA1QAOAVQBVQFWAVcBWAFnAVoBiAFcgDGANIA8gC5fEBBjb250 -cm9sVGV4dENvbG9y0gA3ADgBjAFxpAFxAKUAcQA70gA3ADgBjgGPogGPADtdTlNUYWJsZUNvbHVtbtoB -MwAOATQBNQE2ATcBOAE5AToBBQB4ATwBkwGUAZUBlgFBAZcBQwDVCYA+gEGAQCNAUkAAAAAAAIBDI0BD -gAAAAAAAgBxVYWxidW3XAH0ADgDjAIIAgwCGAUcAiAFIAUkBnQFLAO4BTIA1gC2AQoAsgDJVQWxidW3Y -AH0ADgDjAIIAgwCEAIYBRwFzAXQA1wF2AI8A1QF5AXqAPYA4gDeAEoAcgDvaATMADgE0ATUBNgE3ATgB -OQE6AQUAeAE8AasBrAGtAa4BQQGvAUMA1QmAPoBGgEUjQFLAAAAAAACASSNARIAAAAAAAIAcVXRpdGxl -1wB9AA4A4wCCAIMAhgFHAbMBSAG1AbYBSwDuAUwSBIH+AIA1gEiAR4AsgDJVVGl0bGXTAA4BVQFgAVgB -QQG8gDFLMC4zMzMzMzI5OQDYAH0ADgDjAIIAgwCEAIYBRwFzAXQA1wF2AI8A1QF5AXqAPYA4gDeAEoAc -gDvaATMADgE0ATUBNgE3ATgBOQE6AQUAeAE8AccByAHJAcoBQQHLAUMA1QmAPoBMgEsjQFKnsAAAAACA -TiNARE9gIAAAAIAcVmxlbmd0aNcAfQAOAOMAggCDAIYBRwCIAUgBSQHRAUsB0wFMgDWALYBNgCwSBAAA -AIAyVkxlbmd0aNgAfQAOAOMAggCDAIQAhgFHAXMBdADXAXYAjwDVAdwBeoA9gDiAN4ASgBwSBAAIAIA7 -2gEzAA4BNAE1ATYBNwE4ATkBOgEFAHgBPAHhAeIB4wHkAUEB5QFDANUJgD6AUYBQI0BGAAAAAAAAgFMj -QCQAAAAAAACAHFR5ZWFy1wB9AA4A4wCCAIMAhgFHAIgBSAFJAesBSwHTAUyANYAtgFKALIAyVFllYXLY -AH0ADgDjAIIAgwCEAIYBRwFzAXQA1wF2AI8A1QHcAXqAPYA4gDeAEoAcgDvaATMADgE0ATUBNgE3ATgB -OQE6AQUAeAE8AfkB+gHjAfsBQQHlAUMA1QmAPoBWgFWAWIAcVWdlbnJl1wB9AA4A4wCCAIMAhgFHAIgB -SAFJAgEBSwDuAUyANYAtgFeALIAyVUdlbnJl2AB9AA4A4wCCAIMAhACGAUcBcwF0ANcBdgCPANUBeQF6 -gD2AOIA3gBKAHIA72gEzAA4BNAE1ATYBNwE4ATkBOgEFAHgBPAIPAhACEQISAUECEwFDANUJgD6AW4Ba -I0BDAAAAAAAAgF0jQBAAAAAAAACAHFV0cmFja9cAfQAOAOMAggCDAIYBRwCIAUgBSQIZAUsB0wFMgDWA -LYBcgCyAMlVUcmFja9gAfQAOAOMAggCDAIQAhgFHAXMBdADXAXYAjwDVAdwBeoA9gDiAN4ASgByAO9IA -NwA4AiUCJqMCJgInADteTlNNdXRhYmxlQXJyYXlXTlNBcnJhedUADgFUAVUBVgFXAVgCKgFaAisBXIAx -gGGAYIAuWWdyaWRDb2xvctMADgFVAWABWAFBAjCAMUQwLjUAXxAUQ29nU3BvdGxpZ2h0UGxheWxpc3TS -ADcAOAIzAjSiAjQAO15OU0NsYXNzU3dhcHBlcl8QFXt7MCwgMTd9LCB7NDQwLCAxOTh9fdIANwA4AjcC -OKQCOACqAKsAO1pOU0NsaXBWaWV32QBaAjoADgBwAFwAXgI7AF8CPABrAGsCPwJAASEAYAJCAGsCRFhO -U1RhcmdldFhOU0FjdGlvbllOU1BlcmNlbnSAGIAYgGmAZ4AMgGiAGCM/6jeEoAAAAF8QFHt7ODUsIDE3 -fSwgezE1LCA2OH19XF9kb1Njcm9sbGVyOtIANwA4AkgCSaUCSQCpAKoAqwA7Wk5TU2Nyb2xsZXLaAFoC -OgAOAHAArgBcAF4COwBfAjwAawBrAj8CTgD3ASEAYAJCAGsCUoAYgBiAaYBrgAyAaIAYIz/qBqAAAAAA -XxAVe3swLCAyMDB9LCB7NDQwLCAxNX190gAOAD4AaAJWgF6hAPKAIF8QFnt7MjAsIDQ1fSwgezQ0MCwg -MjE1fX3SADcAOAJaAlukAlsAqgCrADtcTlNTY3JvbGxWaWV32ABaAA4AcABxAFwAcgBeAF8ATAJeAl8C -YAJhAHgAYABMgAuAg4BxgHIRAQoJgAyAC18QFnt7MjAsIDI3OH0sIHszMTMsIDIyfX3dAH0ADgJnAOMA -ggCDAIQAhgJoAmkCagJrAUcCbAJtAm4CbwCKAI8AbAJzAPcAeAJ1AnYBel8QEk5TQ2FuY2VsQnV0dG9u -Q2VsbF8QEE5TVGV4dEJlemVsU3R5bGVfEBFOU0RyYXdzQmFja2dyb3VuZF8QEk5TU2VhcmNoQnV0dG9u -Q2VsbF8QEE5TTWF4aW11bVJlY2VudHMSFHH+QICCgHiAc4AVgBKAcBIQAAQACYB1EP+AO9UADgFUAVUB -VgFXAVgBWQFaAnsBXIAxgDCAdIAuXxATdGV4dEJhY2tncm91bmRDb2xvctwCOgB9AA4AfwCAAIEAggCE -AIUAhgI7AIcCYAKAAIkCggDuAIoChABsAoYA7gKHAoiAchIAAf4AgBYQS4AVgHaAcBEBkIB3EghEQP9W -c2VhcmNoXxATX3NlYXJjaEZpZWxkU2VhcmNoOt0COgB9AA4AfwCAAIECjACCAIQAhQCGAjsAhwJgAoAA -iQKCAO4AigKQApEAbAKGAO4CkwKIXxAjTlNBY2Nlc3NpYmlsaXR5T3ZlcnJpZGRlbkF0dHJpYnV0ZXOA -coAWgBWAeoB5gHCAgVVjbGVhctIADgA+AGgCl4BeoQKYgHvTAA4CmgA+ApsCnAKfV05TLmtleXOAgKIC -nQKegHyAfaICoAKhgH6Af11BWERlc2NyaXB0aW9uXxApTlNBY2Nlc3NpYmlsaXR5RW5jb2RlZEF0dHJp -YnV0ZXNWYWx1ZVR5cGVWY2FuY2Vs0gA3ADgCpgKnowKnAqgAO18QE05TTXV0YWJsZURpY3Rpb25hcnlc -TlNEaWN0aW9uYXJ5XxATX3NlYXJjaEZpZWxkQ2FuY2VsOtIANwA4AqsCrKUCrAFxAKUAcQA7XxARTlNT -ZWFyY2hGaWVsZENlbGzSADcAOAKuAq+mAq8CsACpAKoAqwA7XU5TU2VhcmNoRmllbGRbTlNUZXh0Rmll -bGTYAFoADgBwAHEAXAByAF4AXwBMArMCtAK1ArYAeABgAEyAC4CKgIWAhhEBIQmADIALXxAUe3s4OCwg -MjB9LCB7OTYsIDE3fX3YAH0ADgDjAIIAgwCEAIYBRwK8AXQCvgK/AI8AbQLCAXoSBAH+QIA9gIiAh4AS -gIQSEEAEAIA7XFNlYXJjaCBQYXRoOtUADgFUAVUBVgFXAVgBfgFaAsgBXIAxgDqAiYAuXGNvbnRyb2xD -b2xvctIANwA4AswCsKUCsACpAKoAqwA72QBaAA4AcABxAs4AXAByAF4AXwBMAtAC0QLSAtMCtgB4AGAA -TFtOU0RyYWdUeXBlc4ALgJSAkICRgIwJgAyAC9IADgA+AD8C2YCPogLaAtuAjYCOXxAZQXBwbGUgVVJM -IHBhc3RlYm9hcmQgdHlwZV8QFU5TRmlsZW5hbWVzUGJvYXJkVHlwZdIANwA4At8C4KMC4ALhADtcTlNN -dXRhYmxlU2V0VU5TU2V0XxAWe3sxODksIDE1fSwgezI3MSwgMjZ9fdgC5AB9AA4AgwCEAIYC5QLmAFMC -5wLoAI8AbgLrAuwAbltOU1BhdGhTdHlsZV8QFE5TUGF0aENvbXBvbmVudENlbGxzWk5TRGVsZWdhdGUS -FCH+AYCTgBKAixGAAICSgIvSAA4APgBoAvCAXqDSADcAOALyAvOkAvMApQBxADtaTlNQYXRoQ2VsbNIA -NwA4AvUC9qUC9gCpAKoAqwA7XU5TUGF0aENvbnRyb2xaezQ4MCwgMzE4fdIANwA4AvkAqqMAqgCrADtf -EBV7ezAsIDB9LCB7MTI4MCwgNzc4fX3SADcAOAL8Av2iAv0AO18QEE5TV2luZG93VGVtcGxhdGXSAA4A -PgBoAwCAXq8QEQMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxGAm4CggKKApICmgKmAsoC0 -gLyAwIDEgMeAy4DPgNOA14Df1AAOAxMDFAMVAxYAbgMYAxldTlNEZXN0aW5hdGlvblhOU1NvdXJjZVdO -U0xhYmVsgJ+Ai4CcgJ7SAA4AMgAzAxyABICdXxAZU3BvdGxpZ2h0U2VhcmNoQ29udHJvbGxlcltwYXRo -Q29udHJvbNIANwA4AyADIaMDIQMiADtfEBROU05pYk91dGxldENvbm5lY3Rvcl5OU05pYkNvbm5lY3Rv -ctQADgMTAxQDFQMWAGwAQQMngJ+AcIAHgKFfEBVpbml0aWFsRmlyc3RSZXNwb25kZXLUAA4DEwMUAxUD -FgBBAB8DLYCfgAeAAoCjVndpbmRvd9QADgMTAxQDFQMWAB8DGAMzgJ+AAoCcgKVfEBlzcG90bGlnaHRX -aW5kb3dDb250cm9sbGVy1AAOAxMDFAMVAzYDGABqAzmAqICcgA6Ap15hZGRUb1BsYXlsaXN0OtIANwA4 -AzwDPaMDPQMiADtfEBVOU05pYkNvbnRyb2xDb25uZWN0b3LUAA4DEwMUAxUDFgNAAxgDQoCfgKqAnICx -3ANEAA4DRQDhA0YDRwNIA0kDSgAyA0sDTAB4AO8AeANQAHgDUgNTA1QAeANWAHgAeF8QGk5TRmlsdGVy -UmVzdHJpY3RzSW5zZXJ0aW9uXxAUTlNQcmVzZXJ2ZXNTZWxlY3Rpb25aTlNFZGl0YWJsZV8QD19OU01h -bmFnZWRQcm94eV8QEU5TT2JqZWN0Q2xhc3NOYW1lXk5TRGVjbGFyZWRLZXlzXxAiTlNDbGVhcnNGaWx0 -ZXJQcmVkaWNhdGVPbkluc2VydGlvbl8QGE5TU2VsZWN0c0luc2VydGVkT2JqZWN0c18QFk5TQXZvaWRz -RW1wdHlTZWxlY3Rpb24JgGMJgKwJgK+AroCtCYCrCQlfEBJQbGF5bGlzdENvbnRyb2xsZXJfEBFOU0Fy -cmF5Q29udHJvbGxlctIADgA+AGgDXYBeqAG2AawB4gE+AZQB+gHIAhCAR4BFgFCAKYBAgFWAS4BaXVBs -YXlsaXN0RW50cnnRAA4DaICw0gA3ADgDagNHogNHADtfEBJwbGF5bGlzdENvbnRyb2xsZXLUAA4DEwMU -AxUDNgMYAG4DcICogJyAi4CzXxARY2hhbmdlU2VhcmNoUGF0aDrYAA4DEwNzA3QDFAMVA3UDdgN3A0AD -eQN6ASsDfAN9AFNZTlNLZXlQYXRoWU5TQmluZGluZ1lOU09wdGlvbnNfEBxOU05pYkJpbmRpbmdDb25u -ZWN0b3JWZXJzaW9ugLuAqoC3gLaAKIC1gLhfEB12YWx1ZTogYXJyYW5nZWRPYmplY3RzLmFydGlzdFV2 -YWx1ZV8QFmFycmFuZ2VkT2JqZWN0cy5hcnRpc3TTAA4CmgA+A4IDgwOFgLqhA4SAuaECoYB/XxAbTlND -b25kaXRpb25hbGx5U2V0c0VkaXRhYmxl0gA3ADgDiQKoogKoADvSADcAOAOLA4yjA4wDIgA7XxAVTlNO -aWJCaW5kaW5nQ29ubmVjdG9y2AAOAxMDcwN0AxQDFQN1A3YDdwNAA5ADegEwA5MDlABTgLuAqoC+gLaA -VIC9gL9fEBx2YWx1ZTogYXJyYW5nZWRPYmplY3RzLmdlbnJlXxAVYXJyYW5nZWRPYmplY3RzLmdlbnJl -0wAOApoAPgOCA5kDm4C6oQOEgLmhAqGAf9cADgMTA3MDdAMUAxUDdgN3AxgDoAOhA0ADowBTgLuAnIDD -gMKAqoDBXxAbY29udGVudEFycmF5OiBxdWVyeS5yZXN1bHRzXGNvbnRlbnRBcnJheV1xdWVyeS5yZXN1 -bHRz1wAOAxMDcwN0AxQDFQN2A3cDGAOqA3oCYAOtAFOAu4CcgMaAtoBygMVfEBN2YWx1ZTogc2VhcmNo -U3RyaW5nXHNlYXJjaFN0cmluZ9gADgMTA3MDdAMUAxUDdQN2A3cDQAOzA3oBMQO2A7cAU4C7gKqAyYC2 -gFmAyIDKXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy50cmFja18QFWFycmFuZ2VkT2JqZWN0cy50cmFj -a9MADgKaAD4DggO8A76AuqEDhIC5oQKhgH/YAA4DEwNzA3QDFAMVA3UDdgN3A0ADwwN6AS8DxgPHAFOA -u4CqgM2AtoBPgMyAzl8QG3ZhbHVlOiBhcnJhbmdlZE9iamVjdHMueWVhcl8QFGFycmFuZ2VkT2JqZWN0 -cy55ZWFy0wAOApoAPgOCA8wDzoC6oQOEgLmhAqGAf9gADgMTA3MDdAMUAxUDdQN2A3cDQAPTA3oBLAPW -A9cAU4C7gKqA0YC2gD+A0IDSXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5hbGJ1bV8QFWFycmFuZ2Vk -T2JqZWN0cy5hbGJ1bdMADgKaAD4DggPcA96AuqEDhIC5oQKhgH/YAA4DEwNzA3QDFAMVA3UDdgN3A0AD -4wN6AS0D5gPnAFOAu4CqgNWAtoBEgNSA1l8QHHZhbHVlOiBhcnJhbmdlZE9iamVjdHMudGl0bGVfEBVh -cnJhbmdlZE9iamVjdHMudGl0bGXTAA4CmgA+A4ID7APugLqhA4SAuaECoYB/2AAOAxMDcwN0AxQDFQN1 -A3YDdwPyA/MDegBuA/YD9wBTgLuA2IDbgLaAi4DagNzSAA4D+QP6AHhfEBBOU1NoYXJlZEluc3RhbmNl -gNkJ0gA3ADgD/QP+owP+A/8AO18QGE5TVXNlckRlZmF1bHRzQ29udHJvbGxlclxOU0NvbnRyb2xsZXJf -ECF2YWx1ZTogdmFsdWVzLnNwb3RsaWdodFNlYXJjaFBhdGhfEBp2YWx1ZXMuc3BvdGxpZ2h0U2VhcmNo -UGF0aNMADgKaAD4DggQEBAaAuqEEBYDdoQQHgN5fEBZOU1ZhbHVlVHJhbnNmb3JtZXJOYW1lXxAWU3Ry -aW5nVG9VUkxUcmFuc2Zvcm1lctgADgMTA3MDdAMUAxUDdQN2A3cDQAQNA3oBLgQQBBEAU4C7gKqA4YC2 -gEqA4IDiXxAddmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5sZW5ndGhfEBZhcnJhbmdlZE9iamVjdHMubGVu -Z3Ro0wAOApoAPgOCBBYEGIC6oQOEgLmhAqGAf9IADgA+BBsEHIDmrxAhAG4BMADBAGsBLgEtAPIBMQB2 -AfsB5ABqA0AAQQC2AG0A1QK1AEwBKwMYAmAC0gPyAUABLAEvAZYEOQISAGwBygGugIuAVIBmgBiASoBE -gCCAWYAQgFiAU4AOgKqAB4BqgISAHICGgAuAKICcgHKAkYDYgDaAP4BPgEOA5IBdgHCAToBJ0gAOADIA -MwRAgASA5V1OU0FwcGxpY2F0aW9u0gA3ADgEQwInogInADvSAA4APgQbBEaA5q8QIQBMANUAawBMANUA -1QBrANUAagEwAS8ATAAfAB8AawBMAGsAbQBBANUAHwBsAG4AHwErANUA1QEsAB8BMQBMAS4BLYALgByA -GIALgByAHIAYgByADoBUgE+AC4ACgAKAGIALgBiAhIAHgByAAoBwgIuAAoAogByAHIA/gAKAWYALgEqA -RNIADgA+BBsEaoDmrxAiAG4BMAAfAMEAawEuAPIBLQExAHYB+wNAAGoB5ABBALYAbQDVArUATAErAxgC -YALSA/IBLwEsAhIBQAQ5AZYAbAHKAa6Ai4BUgAKAZoAYgEqAIIBEgFmAEIBYgKqADoBTgAeAaoCEgByA -hoALgCiAnIBygJGA2IBPgD+AXYA2gOSAQ4BwgE6ASdIADgA+BBsEj4DmrxAiBJAEkQSSBJMElASVBJYE -lwSYBJkEmgSbBJwEnQSeBJ8EoAShBKIEowSkBKUEpgSnBKgEqQSqBKsErAStBK4ErwSwBLGA6oDrgOyA -7YDugO+A8IDxgPKA84D0gPWA9oD3gPiA+YD6gPuA/ID9gP6A/4EBAIEBAYEBAoEBA4EBBIEBBYEBBoEB -B4EBCIEBCYEBCoEBC18QGlBvcCBVcCBQYXRoIENvbnRyb2wgV2lkZ2V0XxAUVGFibGUgQ29sdW1uIChn -ZW5yZSlcRmlsZSdzIE93bmVyXxARVmVydGljYWwgU2Nyb2xsZXJbU2Nyb2xsIFZpZXdfEBVUYWJsZSBD -b2x1bW4gKGxlbmd0aClfEBFUYWJsZSBIZWFkZXIgVmlld18QFFRhYmxlIENvbHVtbiAodGl0bGUpXxAU -VGFibGUgQ29sdW1uICh0cmFjaylfEB1CdXR0b24gQ2VsbCAoQWRkIHRvIFBsYXlsaXN0KV8QG1RleHQg -RmllbGQgQ2VsbCAoVGV4dCBDZWxsKV8QE1BsYXlsaXN0IENvbnRyb2xsZXJfEB1QdXNoIEJ1dHRvbiAo -QWRkIHRvIFBsYXlsaXN0KV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS02XxAbUGFuZWwgKE9w -ZW4gZnJvbSBTcG90bGlnaHQpXxATSG9yaXpvbnRhbCBTY3JvbGxlcl8QGlN0YXRpYyBUZXh0IChTZWFy -Y2ggUGF0aDopXxBAUGxheWxpc3QgVmlldyAoQXJ0aXN0LCBBbGJ1bSwgVGl0bGUsIExlbmd0aCwgWWVh -ciwgR2VucmUsIFRyYWNrKV8QHlRleHQgRmllbGQgQ2VsbCAoU2VhcmNoIFBhdGg6KVxDb250ZW50IFZp -ZXdfEBVUYWJsZSBDb2x1bW4gKGFydGlzdClfEBtTcG90bGlnaHQgU2VhcmNoIENvbnRyb2xsZXJfEBFT -ZWFyY2ggRmllbGQgQ2VsbFlQYXRoIENlbGxfEB9TaGFyZWQgVXNlciBEZWZhdWx0cyBDb250cm9sbGVy -XxATVGFibGUgQ29sdW1uICh5ZWFyKV8QFFRhYmxlIENvbHVtbiAoYWxidW0pXxAdVGV4dCBGaWVsZCBD -ZWxsIChUZXh0IENlbGwpLTNfEB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktNFtBcHBsaWNhdGlv -bl8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS01XFNlYXJjaCBGaWVsZF8QHVRleHQgRmllbGQg -Q2VsbCAoVGV4dCBDZWxsKS0xXxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTLSAA4APgQbBNaA -5qIA1QNAgByAqtIADgA+BBsE24DmogD+A1aAHYCr0gAOAD4EGwTggOavEDMDBQMRAG4BMAAfAMEBLgMC -AS0A8gExAwkB+wNAAxAAQQMGAw0AbQMLArUATAMYAmADAwMMA/IBlgBsAcoBrgMBAw4AawMHAwoAdgHk -AGoAtgDVASsDDwLSAUABLAEvAhIEOQMEAwiApoDfgIuAVIACgGaASoCggESAIIBZgLyAWICqgNeAB4Cp -gMuAhIDEgIaAC4CcgHKAooDHgNiAQ4BwgE6ASYCbgM+AGICygMCAEIBTgA6AaoAcgCiA04CRgDaAP4BP -gF2A5ICkgLTSAA4APgQbBRaA5q8QMwUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQKhBScFKAUp -BSoFKwUsBS0FLgUvBTAFMQUyBTMFNAU1BTYFNwU4BTkFOgU7BTwFPQU+BT8FQAVBBUIFQwVEBUUFRgVH -BUgFSYEBEIEBEYEBEoEBE4EBFIEBFYEBFoEBF4EBGIEBGYEBGoEBG4EBHIEBHYEBHoB/gQEfgQEggQEh -gQEigQEjgQEkgQElgQEmgQEngQEogQEpgQEqgQErgQEsgQEtgQEugQEvgQEwgQExgQEygQEzgQE0gQE1 -gQE2gQE3gQE4gQE5gQE6gQE7gQE8gQE9gQE+gQE/gQFAgQFBEEoQaRBYEB4QlRAbECAQPRAkEB0QZhAr -EBAQbhBeEE8QOhBQEBEQOBBIEGsQbBAoEDcQKRAlEFoQZRAYEFsQLRAqEAUQGhAcECIQXRBZECcQIRAs -E//////////9EEwQaNIADgA+AGgFeYBeoNIADgA+BBsFfIDmoNIADgA+BBsFf4DmoNIANwA4BYEFgqIF -ggA7Xk5TSUJPYmplY3REYXRhAAgAGQAiACcAMQA6AD8ARABSAFQAZgL2AvwDRwNOA1UDYwN1A5EDnwOr -A7cDxQPQA94D+gQIBBsELQRHBFEEXgRgBGMEZQRoBGsEbQRvBHEEdAR3BHkEfAR+BIAEggSFBIcEigST -BJ8EoQSjBL8EyATRBNwE4QTwBPkFDAUVBSAFIgUlBScFUAVdBWoFeAWCBZAFnQWvBcMFzwXRBdMF1QXX -BdwF3gXgBeIF5AXmBgEGFwYfBjwGTgZZBmIGbgZ3BoMGhQaHBokGjAaOBpAGkgabBp0GqAaqBqwGrgaw -BrIG0wbbBuIG7AbuBvAG8gb0BvcG+Ab6BvwHFgdHB1MHaQd+B40HnweqB7QHwgfUB+EH7wf0B/YH+Af6 -B/wH/ggACAIIBAgGCAsIFAgmCDcIPghFCE4IUAhZCFsIXghrCHQIeQiACIEIigiTCKAIrQi2CMEIygjU -CNsI5wkmCTIJOwlICVsJaAl0CYIJkAmSCZQJlgmYCZsJnQmfCaEJtAm3CbkJuwm9Cb8JwQnKCcwJ1wnZ -CdsJ3QnfCeEKDgoYCiIKLAouCjAKMgo0CjcKOQo7Cj0KPwpBCkoKTApPClEKsArSCtwK8gr/CxMLKAtC -C14LeQuIC5QLswvCC84L0AvSC9QL3QvfC+EL4wvkC+YL7wvxC/oL/Qv/DAAMAgwEDAYMCAwKDAwMDgwX -DCQMMAw7DFgMWgxcDF4MYAxiDGQMkQyTDJUMlwyZDJsMnQyfDKEMowylDK8MuAzBDNUM7gzwDPIM9Az9 -DP8NAQ0YDSENKg04DUENQw1SDVQNVg1YDVoNXA1eDWANiQ2YDaUNsg26DcUN1A3fDeoN6w3tDe8N8Q36 -DfwN/g4HDhAOEg4ZDjYOQg5EDkYOSA5KDkwOUw5kDmYObw5xDnQOiQ6RDp4Oqg64DroOvA6+DsAOwg7J -DtUO4g7qDuwO7w74Dv0PEg8UDxYPGA8aDywPOQ87Dz4PRw9SD2YPeA+ZD54PoA+iD6QPpg+oD6sPrQ+3 -D8wPzg/QD9IP1A/tD/oP/BAIEB0QHxAhECMQJRA4EEEQShBTEFgQZhCPEJAQkhCUEJYQnxChEKoQrBCy -EM8Q0RDTENUQ1xDZEN8RABECEQQRBhEIEQoRDBE1ETYROBE6ETwRRRFHEVARUhFYEXURehF8EX4RgBGC -EYQRihGXEZkRpRHGEcgRyhHMEc4R0BHSEfsR/BH+EgASAhILEg0SFhIYEh8SPBI+EkASQhJEEkkSSxJS -EnMSdRJ3EnkSexJ9EoIShBKtEq4SsBKyErQSvRK/EsgSyhLPEuwS7hLwEvIS9BL2EvsTHBMeEyATIhMk -EyYTKBNRE1ITVBNWE1gTWhNcE2ITfxOBE4MThROHE4kTjxOwE7ITtBO2E7gTuhO8E+UT5hPoE+oT7BP1 -E/cUABQCFAgUJRQnFCkUKxQtFC8UNRRWFFgUWhRcFF4UYBRiFGsUchSBFIkUnhSgFKIUpBSmFLAUvRS/ -FMQU2xTkFOkU+BUQFRkVIhUtFVIVWxVkFW4VcBVyFXQVdhV4FXoVfBWFFZwVqRWyFb0VyBXxFfMV9RX3 -FfkV+xX9Ff8WCBYgFikWKxYuFjAWSRZSFlsWaBaJFosWjRaPFpEWlBaVFpcWmRayFucW/BcPFyMXOBdL -F1AXUhdUF1YXWBdaF1wXYRdiF2QXZhdoF30XfxeBF4MXhRebF8wXzhfTF9UX1xfZF9sX3RfgF+IX5xfu -GAQYORhfGGEYYxhlGGcYaRhrGG0Ycxh8GH4YgRiDGJAYmBiaGJ8YoRijGKgYqhisGLoY5hjtGPYY/RkT -GSAZNhk/GUoZXhlnGXQZghmOGa8ZsRmzGbUZtxm6GbsZvRm/GdYZ9xn8Gf4aABoCGgQaBhoLGg0aGhov -GjEaMxo1GjcaRBpNGlgafRqJGosajRqPGpEakxqUGpYamBqhGqMaqBqqGqwayBrgGuka8Br9GwMbHBs9 -G0kbYBtrG3Abcht0G3YbeRt7G30bhhuIG4kbkhubG6Ybrxu6G8gb0xvcG+Mb+xwEHAkcHBwlHCccTBxO -HFAcUhxUHFYcWBxaHFwcXhxgHGIcZBxmHGgcahxsHG4cfxyNHJYcnhygHKIcpBymHK8csRyzHM8c2xzk -HOsdAh0RHSIdJB0mHSgdKh1CHVMdVR1XHVkdWx1iHXMddR13HXkdex2XHagdqh2sHa4dsB2/Hcgdzx3n -Hfgd+h38Hf4eAB4xHk4eZR5wHoIelh6lHsoe5R7+Hv8fAR8CHwQfBR8HHwkfCx8MHw4fDx8QHyUfOR9C -H0QfVR9XH1kfWx9dH18fYR9jH2Ufcx94H3ofgx+IH50frh+wH7IftB+2H8of6x/1H/8gCSAoICogLCAu -IDAgMiA0IDYgViBcIHUggiCEIIcgiSCMII4grCC1ILogwyDKIOIhAyEFIQchCSELIQ0hDyERITAhSCFV -IVchWiFcIV8hYSF+IYAhgiGEIYYhiCGKIaghtSHDIeAh4iHkIeYh6CHqIewiAiIPIjAiMiI0IjYiOCI6 -IjwiPiJdInUigiKEIociiSKMIo4iryKxIrMitSK3IrkiuyK9Itsi8iL/IwEjBCMGIwkjCyMsIy4jMCMy -IzQjNiM4IzojWSNxI34jgCODI4UjiCOKI6sjrSOvI7EjsyO1I7cjuSPYI/Aj/SP/JAIkBCQHJAkkKiQs -JC4kMCQyJDQkNiQ4JEEkVCRWJFckYCRnJIIkjySzJNAk3STfJOIk5CTnJOklAiUbJTwlPiVAJUIlRCVG -JUglSiVqJYMlkCWSJZUllyWaJZwlpSWnJewl7iXwJfIl9CX2Jfgl+iX8Jf4mACYCJgQmBiYIJgomDCYO -JhAmEiYUJhYmGCYaJhwmHiYgJiImJCYmJigmKiYsJi4mNyY5JjsmSSZSJlcmYCZiJqcmqSarJq0mryax -JrMmtSa3Jrkmuya9Jr8mwSbDJsUmxybJJssmzSbPJtEm0ybVJtcm2SbbJt0m3ybhJuMm5SbnJukm8ib0 -JzsnPSc/J0EnQydFJ0cnSSdLJ00nTydRJ1MnVSdXJ1knWyddJ18nYSdjJ2UnZydpJ2snbSdvJ3Encyd1 -J3cneSd7J30nfyeIJ4on0SfTJ9Un1yfZJ9sn3SffJ+En4yflJ+cn6SfrJ+0n7yfxJ/Mn9Sf3J/kn+yf9 -KAAoAygGKAkoDCgPKBIoFSgYKBsoHighKD4oVShiKHYogiiaKK4oxSjcKPwpGikwKVApcCmOKaQpwSoE -KiUqMipKKmgqfCqGKqgqvirVKvUrFSshK0ErTituK44rlyuZK54roCuiK6srrSuyK7Qrtiu/K8EsKiws -LC4sMCwyLDQsNiw4LDosPCw+LEAsQixELEYsSCxKLEwsTixQLFIsVCxWLFgsWixcLF4sYCxiLGQsZixo -LGosbCxuLHAscix0LHYseCx6LHwsfiyALIIshCyGLIgsiiyMLI4skCyZLJstBC0HLQotDS0QLRMtFi0Z -LRwtHy0iLSUtKC0rLS4tMS0zLTYtOS08LT8tQi1FLUgtSy1OLVEtVC1XLVotXS1gLWMtZi1pLWwtby1y -LXUteC17LX4tgS2ELYctii2NLZAtky2WLZktnC2eLaAtoi2kLaYtqC2qLawtri2wLbIttC22Lbgtui28 -Lb4twC3CLcQtxi3ILcotzC3OLdAt0i3ULdYt2C3aLdwt3i3gLeIt5C3mLegt6i3sLe4t8C35Lfst/S4G -LgguCS4SLhQuFS4eLiAuIS4qLi8AAAAAAAACAgAAAAAAAAWDAAAAAAAAAAAAAAAAAAAuPg +APcCpQKpAqoCrQKxAroCuwLEAsUCygLLAs0C1wLcAt0C3gLiAuMC7gLxAvQC9wALAvgC+gL7Av4DEwMb +Ax4DHwMgAyQDKQMqAy8DMAM1AzYDOwM8Az8DRANaA1sDXANnA2gDagNsA20DcgNzA3gDeQOFA4YDhwOI +A44DjwORA5QDnAOdA54DpAOrA6wDrQOuA7UDtgO3A78DwAPBA8cDzwPQA9ED1wPfA+AD4QPnA+8D8APx +A/cD/wQDBAcECAQJBA8EEAQRBBkEGgQbBCEERQRIBEkESwRvBJQEuQS6BLsEvAS9BL4EvwTABMEEwgTD +BMQExQTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNYE1wTYBNkE2gTbBOAE5QUcBVMFVAVV +BVYFVwVYBVkFWgCLBVsFXAVdBV4FXwVgBWEFYgVjBWQFZQVmAFMFZwVoAoIFaQVqBWsFbAVtBW4FbwVw +BXEFcgFaBXMFdAV1BXYFdwV4BXkFegV7BXwFfQBUBX4FfwWABYEFhAWHBYpVJG51bGzfEBIADQAOAA8A +EAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0A +LgAvADBWTlNSb290ViRjbGFzc11OU09iamVjdHNLZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nl +c3NpYmlsaXR5T2lkc1ZhbHVlc11OU0Nvbm5lY3Rpb25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5T +Q2xhc3Nlc0tleXNaTlNPaWRzS2V5c11OU05hbWVzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVj +dG9yc11OU0ZvbnRNYW5hZ2VyXxAQTlNWaXNpYmxlV2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05T +QWNjZXNzaWJpbGl0eU9pZHNLZXlzWU5TTmV4dE9pZFxOU09pZHNWYWx1ZXOAAoEBSIDlgQEPgQFHgJqA +6oAFgQEOgQEQgOuBAUWAAIAGgOmBAUYQl4EBEdIADgAyADMANFtOU0NsYXNzTmFtZYAEgANfEBlTcG90 +bGlnaHRXaW5kb3dDb250cm9sbGVy0gA3ADgAOQA6WCRjbGFzc2VzWiRjbGFzc25hbWWiADoAO15OU0N1 +c3RvbU9iamVjdFhOU09iamVjdF8QEElCQ29jb2FGcmFtZXdvcmvSAA4APgA/AEBaTlMub2JqZWN0c4CP +oQBBgAfaAEMADgBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAK1xOU1dpbmRvd1ZpZXdc +TlNTY3JlZW5SZWN0XU5TV2luZG93VGl0bGVZTlNXVEZsYWdzXU5TV2luZG93Q2xhc3NcTlNXaW5kb3dS +ZWN0XxAPTlNXaW5kb3dCYWNraW5nXxARTlNXaW5kb3dTdHlsZU1hc2tbTlNWaWV3Q2xhc3OAC4CZgJiA +CRIgAAAAgAqACBACEB+AAF8QGHt7MTk2LCAxOTJ9LCB7NDgwLCAzMTh9fV8QE09wZW4gZnJvbSBTcG90 +bGlnaHRXTlNQYW5lbNcAWgAOAFsAXABdAF4AXwBgAGEAYgBjAGQAYABmXxAPTlNOZXh0UmVzcG9uZGVy +Wk5TU3Vidmlld3NYTlN2RmxhZ3NbTlNGcmFtZVNpemVYTlNXaW5kb3dbTlNTdXBlcnZpZXeADICXgA0R +AQCAlYAMgJbSAA4APgBoAGmAXqUAagBrAGwAbQBugA6AGIBwgISAi9gAWgAOAHAAcQBcAHIAXgBfAEwA +dAB1AHYAdwB4AGAATFdOU0ZyYW1lVk5TQ2VsbFlOU0VuYWJsZWSAC4AXgA+AEBEBCQmADIALXxAXe3sz +MzUsIDI3Mn0sIHsxMzEsIDMyfX3cAH0ADgB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACKAI4A +jwBqAJEAkgCTW05TQ2VsbEZsYWdzXxATTlNBbHRlcm5hdGVDb250ZW50c18QEk5TUGVyaW9kaWNJbnRl +cnZhbF5OU0J1dHRvbkZsYWdzMl8QD05TS2V5RXF1aXZhbGVudFpOU0NvbnRlbnRzWU5TU3VwcG9ydF1O +U0NvbnRyb2xWaWV3XxAPTlNQZXJpb2RpY0RlbGF5XE5TQ2VsbEZsYWdzMl1OU0J1dHRvbkZsYWdzEgQB +/gCAFoAVEBkQgYAVgBGAEoAOEMgSCAAAABP/////hoJA/18QD0FkZCB0byBQbGF5bGlzdNQADgCWAJcA +mACZAJoAmwCcVk5TU2l6ZVZOU05hbWVYTlNmRmxhZ3OAFCNAKgAAAAAAAIATEQQUXEx1Y2lkYUdyYW5k +ZdIANwA4AJ8AoKIAoAA7Vk5TRm9udFDSADcAOACjAKSkAKQApQBxADtcTlNCdXR0b25DZWxsXE5TQWN0 +aW9uQ2VsbNIANwA4AKcAqKUAqACpAKoAqwA7WE5TQnV0dG9uWU5TQ29udHJvbFZOU1ZpZXdbTlNSZXNw +b25kZXLfEA8AWgCtAA4AcACuAK8AsABbALEAXABeAF8AsgCzALQATAC2ALcAuAC5ALoAuwC8AL0AvgBg +AEwAwQDCAMJbTlNIU2Nyb2xsZXJYTlNzRmxhZ3NcTlNDb3JuZXJWaWV3XxAQTlNIZWFkZXJDbGlwVmll +d1xOU1Njcm9sbEFtdHNbTlNWU2Nyb2xsZXJdTlNOZXh0S2V5Vmlld11OU0NvbnRlbnRWaWV3gAuAaoBv +gG4RAjCAJIAhgBlPEBAAAAAAAAAAAEGYAABBmAAAEQESgAyAC4BmgBqAGtIADgA+AGgAxoBepQDCAMEA +tgC7ALqAGoBmgGqAIYAk2wBaAA4AcADNAFsAXADOAF4AzwBfALMAawDRANIAUwDTANQA1QBgANcAawDV +WU5TY3ZGbGFnc1lOU0RvY1ZpZXdZTlNCR0NvbG9ygBiAZYBkgBsRCQCAHIAMgDiAGIAc0gAOAD4AaADc +gF6hANWAHN8QFwBaAN8ADgDgAOEA4gDjAOQArwDlAOYA5wBcAF0AcgDoAF4AMgDpAOoAXwDrAOwAwgDu +AO8A8ADxAPIA1wB4ALoA9gD3APgA+QD6AHgA/ABgAP4A/wEAAMIBAgEDXxAfTlNEcmFnZ2luZ1NvdXJj +ZU1hc2tGb3JOb25Mb2NhbFlOU1R2RmxhZ3NfEBNOU09yaWdpbmFsQ2xhc3NOYW1lXE5TSGVhZGVyVmll +d18QEU5TQmFja2dyb3VuZENvbG9yXxASTlNBbGxvd3NUeXBlU2VsZWN0XxAXTlNJbnRlcmNlbGxTcGFj +aW5nV2lkdGhfEBlOU0NvbHVtbkF1dG9yZXNpemluZ1N0eWxlXxAYTlNJbnRlcmNlbGxTcGFjaW5nSGVp +Z2h0Xk5TQXV0b3NhdmVOYW1lW05TR3JpZENvbG9yXxAcTlNEcmFnZ2luZ1NvdXJjZU1hc2tGb3JMb2Nh +bF5OU1RhYmxlQ29sdW1uc1tOU1Jvd0hlaWdodIAaEACAYxP/////28CAAIAegCCAOAmAJCNACAAAAAAA +ABABI0AAAAAAAAAAERESgB8JgGKADIAdgF8QD4AagCcjQDEAAAAAAABfEBVTcG90bGlnaHRQbGF5bGlz +dFZpZXdbTlNUYWJsZVZpZXdaezQ0MCwgMTk4fdcAWgAOAFwAXQBeAF8BBQC7AQkAYwEKAGAAuwDVgCGA +I4AigAyAIYAc2wBaAA4AzQBbAFwAXQDOAF4AzwBfALMAawDRAREBEgDUARMA8gBgANcAawDygBiAZRAE +gGyAbYAggAyAOIAYgCBZezQ0MCwgMTd90gA3ADgBGwEcpAEcAKoAqwA7XxARTlNUYWJsZUhlYWRlclZp +ZXfWAFoADgBwAFwAXgBfAGsBHwEgASEAYABrgBiAJoAlE/////+AAAEAgAyAGF8QFHt7LTI2LCAwfSwg +ezE2LCAxN3190gA3ADgBJgEnpAEnAKoAqwA7XV9OU0Nvcm5lclZpZXfSAA4APgBoASqAXqcBKwEsAS0B +LgEvATABMYAogD+ARIBKgE+AVIBZ2gEzAA4BNAE1ATYBNwE4ATkBOgEFAHgBPAE9AT4BPwFAAUEBQgFD +ANVeTlNJc1Jlc2l6ZWFibGVcTlNIZWFkZXJDZWxsXE5TSWRlbnRpZmllcldOU1dpZHRoWk5TRGF0YUNl +bGxeTlNSZXNpemluZ01hc2taTlNNaW5XaWR0aFpOU01heFdpZHRoCYA+gCqAKSNAUYAAAAAAAIA2EAMj +QEIAAAAAAAAjQI9AAAAAAACAHFZhcnRpc3TXAH0ADgDjAIIAgwCGAUcAiAFIAUkBSgFLAO4BTFtOU1Rl +eHRDb2xvcoA1gC2AK4AsgDJWQXJ0aXN01AAOAJYAlwCYAJkBUACbAVKAFCNAJgAAAAAAAIATEQwc1QAO +AVQBVQFWAVcBWAFZAVoBWwFcV05TQ29sb3JcTlNDb2xvclNwYWNlW05TQ29sb3JOYW1lXU5TQ2F0YWxv +Z05hbWWAMYAwEAaAL4AuVlN5c3RlbVtoZWFkZXJDb2xvctMADgFVAWABWAFBAWJXTlNXaGl0ZYAxQjEA +0gA3ADgBZAFUogFUADvVAA4BVAFVAVYBVwFYAWcBWgFoAVyAMYA0gDOALl8QD2hlYWRlclRleHRDb2xv +ctMADgFVAWABWAFBAW2AMUIwANIANwA4AW8BcKUBcAFxAKUAcQA7XxARTlNUYWJsZUhlYWRlckNlbGxf +EA9OU1RleHRGaWVsZENlbGzYAH0ADgDjAIIAgwCEAIYBRwFzAXQA1wF2AI8A1QF5AXoSFCH+QIA9gDiA +N4ASgBwRCACAO1lUZXh0IENlbGzVAA4BVAFVAVYBVwFYAX4BWgF/AVyAMYA6gDmALl8QFmNvbnRyb2xC +YWNrZ3JvdW5kQ29sb3LTAA4BVQFgAVgBQQGEgDFLMC42NjY2NjY2OQDVAA4BVAFVAVYBVwFYAWcBWgGI +AVyAMYA0gDyALl8QEGNvbnRyb2xUZXh0Q29sb3LSADcAOAGMAXGkAXEApQBxADvSADcAOAGOAY+iAY8A +O11OU1RhYmxlQ29sdW1u2gEzAA4BNAE1ATYBNwE4ATkBOgEFAHgBPAGTAZQBlQGWAUEBlwFDANUJgD6A +QYBAI0BSQAAAAAAAgEMjQEOAAAAAAACAHFVhbGJ1bdcAfQAOAOMAggCDAIYBRwCIAUgBSQGdAUsA7gFM +gDWALYBCgCyAMlVBbGJ1bdgAfQAOAOMAggCDAIQAhgFHAXMBdADXAXYAjwDVAXkBeoA9gDiAN4ASgByA +O9oBMwAOATQBNQE2ATcBOAE5AToBBQB4ATwBqwGsAa0BrgFBAa8BQwDVCYA+gEaARSNAUsAAAAAAAIBJ +I0BEgAAAAAAAgBxVdGl0bGXXAH0ADgDjAIIAgwCGAUcBswFIAbUBtgFLAO4BTBIEgf4AgDWASIBHgCyA +MlVUaXRsZdMADgFVAWABWAFBAbyAMUswLjMzMzMzMjk5ANgAfQAOAOMAggCDAIQAhgFHAXMBdADXAXYA +jwDVAXkBeoA9gDiAN4ASgByAO9oBMwAOATQBNQE2ATcBOAE5AToBBQB4ATwBxwHIAckBygFBAcsBQwDV +CYA+gEyASyNAUqewAAAAAIBOI0BET2AgAAAAgBxWbGVuZ3Ro1wB9AA4A4wCCAIMAhgFHAIgBSAFJAdEB +SwHTAUyANYAtgE2ALBIEAAAAgDJWTGVuZ3Ro2AB9AA4A4wCCAIMAhACGAUcBcwF0ANcBdgCPANUB3AF6 +gD2AOIA3gBKAHBIEAAgAgDvaATMADgE0ATUBNgE3ATgBOQE6AQUAeAE8AeEB4gHjAeQBQQHlAUMA1QmA +PoBRgFAjQEYAAAAAAACAUyNAJAAAAAAAAIAcVHllYXLXAH0ADgDjAIIAgwCGAUcAiAFIAUkB6wFLAdMB +TIA1gC2AUoAsgDJUWWVhctgAfQAOAOMAggCDAIQAhgFHAXMBdADXAXYAjwDVAdwBeoA9gDiAN4ASgByA +O9oBMwAOATQBNQE2ATcBOAE5AToBBQB4ATwB+QH6AeMB+wFBAeUBQwDVCYA+gFaAVYBYgBxVZ2VucmXX +AH0ADgDjAIIAgwCGAUcAiAFIAUkCAQFLAO4BTIA1gC2AV4AsgDJVR2VucmXYAH0ADgDjAIIAgwCEAIYB +RwFzAXQA1wF2AI8A1QF5AXqAPYA4gDeAEoAcgDvaATMADgE0ATUBNgE3ATgBOQE6AQUAeAE8Ag8CEAIR +AhIBQQITAUMA1QmAPoBbgFojQEMAAAAAAACAXSNAEAAAAAAAAIAcVXRyYWNr1wB9AA4A4wCCAIMAhgFH +AIgBSAFJAhkBSwHTAUyANYAtgFyALIAyVVRyYWNr2AB9AA4A4wCCAIMAhACGAUcBcwF0ANcBdgCPANUB +3AF6gD2AOIA3gBKAHIA70gA3ADgCJQImowImAicAO15OU011dGFibGVBcnJheVdOU0FycmF51QAOAVQB +VQFWAVcBWAIqAVoCKwFcgDGAYYBggC5ZZ3JpZENvbG9y0wAOAVUBYAFYAUECMIAxRDAuNQBfEBRDb2dT +cG90bGlnaHRQbGF5bGlzdNIANwA4AjMCNKICNAA7Xk5TQ2xhc3NTd2FwcGVyXxAVe3swLCAxN30sIHs0 +NDAsIDE5OH190gA3ADgCNwI4pAI4AKoAqwA7Wk5TQ2xpcFZpZXfZAFoCOgAOAHAAXABeAjsAXwI8AGsA +awI/AkABIQBgAkIAawJEWE5TVGFyZ2V0WE5TQWN0aW9uWU5TUGVyY2VudIAYgBiAaYBngAyAaIAYIz/q +N4SgAAAAXxAUe3s4NSwgMTd9LCB7MTUsIDY4fX1cX2RvU2Nyb2xsZXI60gA3ADgCSAJJpQJJAKkAqgCr +ADtaTlNTY3JvbGxlctoAWgI6AA4AcACuAFwAXgI7AF8CPABrAGsCPwJOAPcBIQBgAkIAawJSgBiAGIBp +gGuADIBogBgjP+oGoAAAAABfEBV7ezAsIDIwMH0sIHs0NDAsIDE1fX3SAA4APgBoAlaAXqEA8oAgXxAW +e3syMCwgNDV9LCB7NDQwLCAyMTV9fdIANwA4AloCW6QCWwCqAKsAO1xOU1Njcm9sbFZpZXfYAFoADgBw +AHEAXAByAF4AXwBMAl4CXwJgAmEAeABgAEyAC4CDgHGAchEBCgmADIALXxAWe3syMCwgMjc4fSwgezMx +MywgMjJ9fd0AfQAOAmcA4wCCAIMAhACGAmgCaQJqAmsBRwJsAm0CbgJvAIoAjwBsAnMA9wB4AnUCdgF6 +XxASTlNDYW5jZWxCdXR0b25DZWxsXxAQTlNUZXh0QmV6ZWxTdHlsZV8QEU5TRHJhd3NCYWNrZ3JvdW5k +XxASTlNTZWFyY2hCdXR0b25DZWxsXxAQTlNNYXhpbXVtUmVjZW50cxIUcf5AgIKAeIBzgBWAEoBwEhAA +BAAJgHUQ/4A71QAOAVQBVQFWAVcBWAFZAVoCewFcgDGAMIB0gC5fEBN0ZXh0QmFja2dyb3VuZENvbG9y +3AI6AH0ADgB/AIAAgQCCAIQAhQCGAjsAhwJgAoAAiQKCAO4AigKEAGwChgDuAocCiIByEgAB/gCAFhBL +gBWAdoBwEQGQgHcSCERA/1ZzZWFyY2hfEBNfc2VhcmNoRmllbGRTZWFyY2g63QI6AH0ADgB/AIAAgQKM +AIIAhACFAIYCOwCHAmACgACJAoIA7gCKApACkQBsAoYA7gKTAohfECNOU0FjY2Vzc2liaWxpdHlPdmVy +cmlkZGVuQXR0cmlidXRlc4BygBaAFYB6gHmAcICBVWNsZWFy0gAOAD4AaAKXgF6hApiAe9MADgKaAD4C +mwKcAp9XTlMua2V5c4CAogKdAp6AfIB9ogKgAqGAfoB/XUFYRGVzY3JpcHRpb25fEClOU0FjY2Vzc2li +aWxpdHlFbmNvZGVkQXR0cmlidXRlc1ZhbHVlVHlwZVZjYW5jZWzSADcAOAKmAqejAqcCqAA7XxATTlNN +dXRhYmxlRGljdGlvbmFyeVxOU0RpY3Rpb25hcnlfEBNfc2VhcmNoRmllbGRDYW5jZWw60gA3ADgCqwKs +pQKsAXEApQBxADtfEBFOU1NlYXJjaEZpZWxkQ2VsbNIANwA4Aq4Cr6YCrwKwAKkAqgCrADtdTlNTZWFy +Y2hGaWVsZFtOU1RleHRGaWVsZNgAWgAOAHAAcQBcAHIAXgBfAEwCswK0ArUCtgB4AGAATIALgIqAhYCG +EQEhCYAMgAtfEBR7ezg4LCAyMH0sIHs5NiwgMTd9fdgAfQAOAOMAggCDAIQAhgFHArwBdAK+Ar8AjwBt +AsIBehIEAf5AgD2AiICHgBKAhBIQQAQAgDtcU2VhcmNoIFBhdGg61QAOAVQBVQFWAVcBWAF+AVoCyAFc +gDGAOoCJgC5cY29udHJvbENvbG9y0gA3ADgCzAKwpQKwAKkAqgCrADvZAFoADgBwAHECzgBcAHIAXgBf +AEwC0ALRAtIC0wK2AHgAYABMW05TRHJhZ1R5cGVzgAuAlICQgJGAjAmADIAL0gAOAD4APwLZgI+iAtoC +24CNgI5fEBlBcHBsZSBVUkwgcGFzdGVib2FyZCB0eXBlXxAVTlNGaWxlbmFtZXNQYm9hcmRUeXBl0gA3 +ADgC3wLgowLgAuEAO1xOU011dGFibGVTZXRVTlNTZXRfEBZ7ezE4OSwgMTV9LCB7MjcxLCAyNn192ALk +AH0ADgCDAIQAhgLlAuYAUwLnAugAjwBuAusC7ABuW05TUGF0aFN0eWxlXxAUTlNQYXRoQ29tcG9uZW50 +Q2VsbHNaTlNEZWxlZ2F0ZRIUIf4BgJOAEoCLEYAAgJKAi9IADgA+AGgC8IBeoNIANwA4AvIC86QC8wCl +AHEAO1pOU1BhdGhDZWxs0gA3ADgC9QL2pQL2AKkAqgCrADtdTlNQYXRoQ29udHJvbFp7NDgwLCAzMTh9 +0gA3ADgC+QCqowCqAKsAO18QFXt7MCwgMH0sIHsxMjgwLCA3Nzh9fdIANwA4AvwC/aIC/QA7XxAQTlNX +aW5kb3dUZW1wbGF0ZdIADgA+AGgDAIBerxASAwEDAgMDAwQDBQMGAwcDCAMJAwoDCwMMAw0DDgMPAxAD +EQMSgJuAoICigKSApoCpgLKAtIC2gL6AwoDGgMmAzYDRgNWA2YDh1AAOAxQDFQMWAxcAbgMZAxpdTlNE +ZXN0aW5hdGlvblhOU1NvdXJjZVdOU0xhYmVsgJ+Ai4CcgJ7SAA4AMgAzAx2ABICdXxAZU3BvdGxpZ2h0 +U2VhcmNoQ29udHJvbGxlcltwYXRoQ29udHJvbNIANwA4AyEDIqMDIgMjADtfEBROU05pYk91dGxldENv +bm5lY3Rvcl5OU05pYkNvbm5lY3RvctQADgMUAxUDFgMXAGwAQQMogJ+AcIAHgKFfEBVpbml0aWFsRmly +c3RSZXNwb25kZXLUAA4DFAMVAxYDFwBBAB8DLoCfgAeAAoCjVndpbmRvd9QADgMUAxUDFgMXAB8DGQM0 +gJ+AAoCcgKVfEBlzcG90bGlnaHRXaW5kb3dDb250cm9sbGVy1AAOAxQDFQMWAzcDGQBqAzqAqICcgA6A +p15hZGRUb1BsYXlsaXN0OtIANwA4Az0DPqMDPgMjADtfEBVOU05pYkNvbnRyb2xDb25uZWN0b3LUAA4D +FAMVAxYDFwDVA0IDQ4CfgByAqoCx3ANFAA4DRgDhA0cDSANJA0oDSwAyA0wDTQB4AO8AeANRAHgDUwNU +A1UAeANXAHgAeF8QGk5TRmlsdGVyUmVzdHJpY3RzSW5zZXJ0aW9uXxAUTlNQcmVzZXJ2ZXNTZWxlY3Rp +b25aTlNFZGl0YWJsZV8QD19OU01hbmFnZWRQcm94eV8QEU5TT2JqZWN0Q2xhc3NOYW1lXk5TRGVjbGFy +ZWRLZXlzXxAiTlNDbGVhcnNGaWx0ZXJQcmVkaWNhdGVPbkluc2VydGlvbl8QGE5TU2VsZWN0c0luc2Vy +dGVkT2JqZWN0c18QFk5TQXZvaWRzRW1wdHlTZWxlY3Rpb24JgGMJgKwJgK+AroCtCYCrCQlfEBJQbGF5 +bGlzdENvbnRyb2xsZXJfEBFOU0FycmF5Q29udHJvbGxlctIADgA+AGgDXoBeqAG2AawB4gE+AZQB+gHI +AhCAR4BFgFCAKYBAgFWAS4BaXVBsYXlsaXN0RW50cnnRAA4DaYCw0gA3ADgDawNIogNIADtZdGFibGVW +aWV31AAOAxQDFQMWAxcDQgMZA3GAn4CqgJyAs18QEnBsYXlsaXN0Q29udHJvbGxlctQADgMUAxUDFgM3 +AxkAbgN3gKiAnICLgLVfEBFjaGFuZ2VTZWFyY2hQYXRoOtgADgMUA3oDewMVAxYDfAN9A34DQgOAA4EB +KwODA4QAU1lOU0tleVBhdGhZTlNCaW5kaW5nWU5TT3B0aW9uc18QHE5TTmliQmluZGluZ0Nvbm5lY3Rv +clZlcnNpb26AvYCqgLmAuIAogLeAul8QHXZhbHVlOiBhcnJhbmdlZE9iamVjdHMuYXJ0aXN0VXZhbHVl +XxAWYXJyYW5nZWRPYmplY3RzLmFydGlzdNMADgKaAD4DiQOKA4yAvKEDi4C7oQKhgH9fEBtOU0NvbmRp +dGlvbmFsbHlTZXRzRWRpdGFibGXSADcAOAOQAqiiAqgAO9IANwA4A5IDk6MDkwMjADtfEBVOU05pYkJp +bmRpbmdDb25uZWN0b3LYAA4DFAN6A3sDFQMWA3wDfQN+A0IDlwOBATADmgObAFOAvYCqgMCAuIBUgL+A +wV8QHHZhbHVlOiBhcnJhbmdlZE9iamVjdHMuZ2VucmVfEBVhcnJhbmdlZE9iamVjdHMuZ2VucmXTAA4C +mgA+A4kDoAOigLyhA4uAu6ECoYB/1wAOAxQDegN7AxUDFgN9A34DGQOnA6gDQgOqAFOAvYCcgMWAxICq +gMNfEBtjb250ZW50QXJyYXk6IHF1ZXJ5LnJlc3VsdHNcY29udGVudEFycmF5XXF1ZXJ5LnJlc3VsdHPX +AA4DFAN6A3sDFQMWA30DfgMZA7EDgQJgA7QAU4C9gJyAyIC4gHKAx18QE3ZhbHVlOiBzZWFyY2hTdHJp +bmdcc2VhcmNoU3RyaW5n2AAOAxQDegN7AxUDFgN8A30DfgNCA7oDgQExA70DvgBTgL2AqoDLgLiAWYDK +gMxfEBx2YWx1ZTogYXJyYW5nZWRPYmplY3RzLnRyYWNrXxAVYXJyYW5nZWRPYmplY3RzLnRyYWNr0wAO +ApoAPgOJA8MDxYC8oQOLgLuhAqGAf9gADgMUA3oDewMVAxYDfAN9A34DQgPKA4EBLwPNA84AU4C9gKqA +z4C4gE+AzoDQXxAbdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy55ZWFyXxAUYXJyYW5nZWRPYmplY3RzLnll +YXLTAA4CmgA+A4kD0wPVgLyhA4uAu6ECoYB/2AAOAxQDegN7AxUDFgN8A30DfgNCA9oDgQEsA90D3gBT +gL2AqoDTgLiAP4DSgNRfEBx2YWx1ZTogYXJyYW5nZWRPYmplY3RzLmFsYnVtXxAVYXJyYW5nZWRPYmpl +Y3RzLmFsYnVt0wAOApoAPgOJA+MD5YC8oQOLgLuhAqGAf9gADgMUA3oDewMVAxYDfAN9A34DQgPqA4EB +LQPtA+4AU4C9gKqA14C4gESA1oDYXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy50aXRsZV8QFWFycmFu +Z2VkT2JqZWN0cy50aXRsZdMADgKaAD4DiQPzA/WAvKEDi4C7oQKhgH/YAA4DFAN6A3sDFQMWA3wDfQN+ +A/kD+gOBAG4D/QP+AFOAvYDagN2AuICLgNyA3tIADgQABAEAeF8QEE5TU2hhcmVkSW5zdGFuY2WA2wnS +ADcAOAQEBAWjBAUEBgA7XxAYTlNVc2VyRGVmYXVsdHNDb250cm9sbGVyXE5TQ29udHJvbGxlcl8QIXZh +bHVlOiB2YWx1ZXMuc3BvdGxpZ2h0U2VhcmNoUGF0aF8QGnZhbHVlcy5zcG90bGlnaHRTZWFyY2hQYXRo +0wAOApoAPgOJBAsEDYC8oQQMgN+hBA6A4F8QFk5TVmFsdWVUcmFuc2Zvcm1lck5hbWVfEBZTdHJpbmdU +b1VSTFRyYW5zZm9ybWVy2AAOAxQDegN7AxUDFgN8A30DfgNCBBQDgQEuBBcEGABTgL2AqoDjgLiASoDi +gORfEB12YWx1ZTogYXJyYW5nZWRPYmplY3RzLmxlbmd0aF8QFmFycmFuZ2VkT2JqZWN0cy5sZW5ndGjT +AA4CmgA+A4kEHQQfgLyhA4uAu6ECoYB/0gAOAD4EIgQjgOivECEAbgEwAMEAawEuAS0A8gExAHYB+wHk +AGoDQgBBALYAbQDVArUATAErAxkCYALSA/kBQAEsAS8BlgRAAhIAbAHKAa6Ai4BUgGaAGIBKgESAIIBZ +gBCAWIBTgA6AqoAHgGqAhIAcgIaAC4AogJyAcoCRgNqANoA/gE+AQ4DmgF2AcIBOgEnSAA4AMgAzBEeA +BIDnXU5TQXBwbGljYXRpb27SADcAOARKAieiAicAO9IADgA+BCIETYDorxAhAEwA1QBrAEwA1QDVAGsA +1QBqATABLwBMAB8AHwBrAEwAawBtAEEA1QAfAGwAbgAfASsA1QDVASwAHwExAEwBLgEtgAuAHIAYgAuA +HIAcgBiAHIAOgFSAT4ALgAKAAoAYgAuAGICEgAeAHIACgHCAi4ACgCiAHIAcgD+AAoBZgAuASoBE0gAO +AD4EIgRxgOivECIAbgEwAB8AwQBrAS4A8gEtATEAdgH7A0IAagHkAEEAtgBtANUCtQBMASsDGQJgAtID ++QEvASwCEgFABEABlgBsAcoBroCLgFSAAoBmgBiASoAggESAWYAQgFiAqoAOgFOAB4BqgISAHICGgAuA +KICcgHKAkYDagE+AP4BdgDaA5oBDgHCAToBJ0gAOAD4EIgSWgOivECIElwSYBJkEmgSbBJwEnQSeBJ8E +oAShBKIEowSkBKUEpgSnBKgEqQSqBKsErAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuIDsgO2A7oDvgPCA +8YDygPOA9ID1gPaA94D4gPmA+oD7gPyA/YD+gP+BAQCBAQGBAQKBAQOBAQSBAQWBAQaBAQeBAQiBAQmB +AQqBAQuBAQyBAQ1fEBpQb3AgVXAgUGF0aCBDb250cm9sIFdpZGdldF8QFFRhYmxlIENvbHVtbiAoZ2Vu +cmUpXEZpbGUncyBPd25lcl8QEVZlcnRpY2FsIFNjcm9sbGVyW1Njcm9sbCBWaWV3XxAVVGFibGUgQ29s +dW1uIChsZW5ndGgpXxARVGFibGUgSGVhZGVyIFZpZXdfEBRUYWJsZSBDb2x1bW4gKHRpdGxlKV8QFFRh +YmxlIENvbHVtbiAodHJhY2spXxAdQnV0dG9uIENlbGwgKEFkZCB0byBQbGF5bGlzdClfEBtUZXh0IEZp +ZWxkIENlbGwgKFRleHQgQ2VsbClfEBNQbGF5bGlzdCBDb250cm9sbGVyXxAdUHVzaCBCdXR0b24gKEFk +ZCB0byBQbGF5bGlzdClfEB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktNl8QG1BhbmVsIChPcGVu +IGZyb20gU3BvdGxpZ2h0KV8QE0hvcml6b250YWwgU2Nyb2xsZXJfEBpTdGF0aWMgVGV4dCAoU2VhcmNo +IFBhdGg6KV8QSlNwb3RsaWdodCBQbGF5bGlzdCBWaWV3IChBcnRpc3QsIEFsYnVtLCBUaXRsZSwgTGVu +Z3RoLCBZZWFyLCBHZW5yZSwgVHJhY2spXxAeVGV4dCBGaWVsZCBDZWxsIChTZWFyY2ggUGF0aDopXENv +bnRlbnQgVmlld18QFVRhYmxlIENvbHVtbiAoYXJ0aXN0KV8QG1Nwb3RsaWdodCBTZWFyY2ggQ29udHJv +bGxlcl8QEVNlYXJjaCBGaWVsZCBDZWxsWVBhdGggQ2VsbF8QH1NoYXJlZCBVc2VyIERlZmF1bHRzIENv +bnRyb2xsZXJfEBNUYWJsZSBDb2x1bW4gKHllYXIpXxAUVGFibGUgQ29sdW1uIChhbGJ1bSlfEB1UZXh0 +IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktM18QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS00W0Fw +cGxpY2F0aW9uXxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTVcU2VhcmNoIEZpZWxkXxAdVGV4 +dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTFfEB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMtIA +DgA+BCIE3YDoogDVA0KAHICq0gAOAD4EIgTigOiiAP4DV4AdgKvSAA4APgQiBOeA6K8QNAMSAG4BMAAf +AMEBLgMFAS0A8gExAwoB+wNCAxEDBAMGAEEDDgBtAwwCtQMDAEwDGQJgAwcDDQP5AZYAbAHKAa4DAgMP +AGsDCwB2AeQAagMIALYA1QErAwEDEALSAUABLAEvAhIEQAMJgOGAi4BUgAKAZoBKgKaARIAggFmAvoBY +gKqA2YCkgKmAB4DNgISAxoCGgKKAC4CcgHKAsoDJgNqAQ4BwgE6ASYCggNGAGIDCgBCAU4AOgLSAaoAc +gCiAm4DVgJGANoA/gE+AXYDmgLbSAA4APgQiBR6A6K8QNAUfBSAFIQUiBSMFJAUlBSYFJwUoBSkFKgUr +BSwFLQUuAqEFMAUxBTIFMwU0BTUFNgU3BTgFOQU6BTsFPAU9BT4FPwVABUEFQgVDBUQFRQVGBUcFSAVJ +BUoFSwVMBU0FTgVPBVAFUQVSgQESgQETgQEUgQEVgQEWgQEXgQEYgQEZgQEagQEbgQEcgQEdgQEegQEf +gQEggQEhgH+BASKBASOBASSBASWBASaBASeBASiBASmBASqBASuBASyBAS2BAS6BAS+BATCBATGBATKB +ATOBATSBATWBATaBATeBATiBATmBATqBATuBATyBAT2BAT6BAT+BAUCBAUGBAUKBAUOBAUQQaRBYEB4Q +lhAbECAQShAkEB0QZhArEBAQbhBMEJUQXhBPEDoQUBBIEBEQOBBrEGwQKBA3ECkQJRA9EGUQGBAtECoQ +BRBbEBoQHBAiEFoQXRBZECcQIRAsE//////////9EGjSAA4APgBoBYOAXqDSAA4APgQiBYaA6KDSAA4A +PgQiBYmA6KDSADcAOAWLBYyiBYwAO15OU0lCT2JqZWN0RGF0YQAIABkAIgAnADEAOgA/AEQAUgBUAGYC +/AMCA00DVANbA2kDewOXA6UDsQO9A8sD1gPkBAAEDgQhBDMETQRXBGQEZgRpBGsEbgRxBHMEdQR3BHoE +fQR/BIIEhASGBIgEiwSNBJAEmQSlBKcEqQTFBM4E1wTiBOcE9gT/BRIFGwUmBSgFKwUtBVYFYwVwBX4F +iAWWBaMFtQXJBdUF1wXZBdsF3QXiBeQF5gXoBeoF7AYHBh0GJQZCBlQGXwZoBnQGfQaJBosGjQaPBpIG +lAaWBpgGoQajBq4GsAayBrQGtga4BtkG4QboBvIG9Ab2BvgG+gb9Bv4HAAcCBxwHTQdZB28HhAeTB6UH +sAe6B8gH2gfnB/UH+gf8B/4IAAgCCAQIBggICAoIDAgRCBoILAg9CEQISwhUCFYIXwhhCGQIcQh6CH8I +hgiHCJAImQimCLMIvAjHCNAI2gjhCO0JLAk4CUEJTglhCW4JegmICZYJmAmaCZwJngmhCaMJpQmnCboJ +vQm/CcEJwwnFCccJ0AnSCd0J3wnhCeMJ5QnnChQKHgooCjIKNAo2CjgKOgo9Cj8KQQpDCkUKRwpQClIK +VQpXCrYK2AriCvgLBQsZCy4LSAtkC38LjguaC7kLyAvUC9YL2AvaC+ML5QvnC+kL6gvsC/UL9wwADAMM +BQwGDAgMCgwMDA4MEAwSDBQMHQw1DEEMTAxpDGsMbQxvDHEMcwx1DKIMpAymDKgMqgysDK4MsAyyDLQM +tgzADMkM0gzmDP8NAQ0DDQUNDg0QDRINKQ0yDTsNSQ1SDVQNYw1lDWcNaQ1rDW0Nbw1xDZoNqQ22DcMN +yw3WDeUN8A37DfwN/g4ADgIOCw4NDg8OGA4hDiMOKg5HDlMOVQ5XDlkOWw5dDmQOdQ53DoAOgg6FDpoO +og6vDrsOyQ7LDs0Ozw7RDtMO2g7mDvMO+w79DwAPCQ8ODyMPJQ8nDykPKw89D0oPTA9PD1gPYw93D4kP +qg+vD7EPsw+1D7cPuQ+8D74PyA/dD98P4Q/jD+UP/hALEA0QGRAuEDAQMhA0EDYQSRBSEFsQZBBpEHcQ +oBChEKMQpRCnELAQshC7EL0QwxDgEOIQ5BDmEOgQ6hDwERERExEVERcRGREbER0RRhFHEUkRSxFNEVYR +WBFhEWMRaRGGEYsRjRGPEZERkxGVEZsRqBGqEbYR1xHZEdsR3RHfEeER4xIMEg0SDxIREhMSHBIeEicS +KRIwEk0STxJRElMSVRJaElwSYxKEEoYSiBKKEowSjhKTEpUSvhK/EsESwxLFEs4S0BLZEtsS4BL9Ev8T +ARMDEwUTBxMMEy0TLxMxEzMTNRM3EzkTYhNjE2UTZxNpE2sTbRNzE5ATkhOUE5YTmBOaE6ATwRPDE8UT +xxPJE8sTzRP2E/cT+RP7E/0UBhQIFBEUExQZFDYUOBQ6FDwUPhRAFEYUZxRpFGsUbRRvFHEUcxR8FIMU +khSaFK8UsRSzFLUUtxTBFM4U0BTVFOwU9RT6FQkVIRUqFTMVPhVjFWwVdRV/FYEVgxWFFYcViRWLFY0V +lhWtFboVwxXOFdkWAhYEFgYWCBYKFgwWDhYQFhkWMRY6FjwWPxZBFloWYxZsFnkWmhacFp4WoBaiFqUW +phaoFqoWwxb4Fw0XIBc0F0kXXBdhF2MXZRdnF2kXaxdtF3IXcxd1F3cXeReOF5AXkheUF5YXrBfdF98X +5BfmF+gX6hfsF+4X8RfzF/gX/xgVGEoYcBhyGHQYdhh4GHoYfBh+GIQYjRiPGJIYlBihGKkYqxiwGLIY +tBi5GLsYvRjLGPcY/hkHGQ4ZJBkxGUcZUBlbGW8ZeBmFGZMZnxnAGcIZxBnGGcgZyxnMGc4Z0BnnGgga +DRoPGhEaExoVGhcaHBoeGisaQBpCGkQaRhpIGlUaXhppGo4amhqcGp4aoBqiGqQapRqnGqkashq0Grka +uxq9Gtka8Rr6GwEbDhsUGy0bThtaG3EbfBuBG4MbhRuHG4objBuOG5cbmRuaG6MbrBu3G8AbyxvZG+Qb +7Rv0HAwcFRwaHC0cNhw4HF8cYRxjHGUcZxxpHGscbRxvHHEccxx1HHcceRx7HH0cfxyBHIMclByiHKsc +sxy1HLccuRy7HMQcxhzIHOQc8Bz5HQAdFx0mHTcdOR07HT0dPx1XHWgdah1sHW4dcB13HYgdih2MHY4d +kB2sHb0dvx3BHcMdxR3UHd0d5B38Hg0eDx4RHhMeFR5GHmMeeh6FHpceqx66Ht8e+h8THxQfFh8XHxkf +Gh8cHx4fIB8hHyMfJB8lHzofTh9XH1kfah9sH24fcB9yH3Qfdh94H3ofiB+NH48fmB+dH6cfuB+6H7wf +vh/AH9Uf5h/oH+of7B/uIAIgIyAtIDcgQSBgIGIgZCBmIGggaiBsIG4gjiCUIK0guiC8IL8gwSDEIMYg +5CDtIPIg+yECIRohOyE9IT8hQSFDIUUhRyFJIWghgCGNIY8hkiGUIZchmSG2IbghuiG8Ib4hwCHCIeAh +7SH7IhgiGiIcIh4iICIiIiQiOiJHImgiaiJsIm4icCJyInQidiKVIq0iuiK8Ir8iwSLEIsYi5yLpIusi +7SLvIvEi8yL1IxMjKiM3IzkjPCM+I0EjQyNkI2YjaCNqI2wjbiNwI3IjkSOpI7YjuCO7I70jwCPCI+Mj +5SPnI+kj6yPtI+8j8SQQJCgkNSQ3JDokPCQ/JEEkYiRkJGYkaCRqJGwkbiRwJHkkjCSOJI8kmCSfJLok +xyTrJQglFSUXJRolHCUfJSElOiVTJXQldiV4JXolfCV+JYAlgiWiJbslyCXKJc0lzyXSJdQl3SXfJiQm +JiYoJiomLCYuJjAmMiY0JjYmOCY6JjwmPiZAJkImRCZGJkgmSiZMJk4mUCZSJlQmViZYJlomXCZeJmAm +YiZkJmYmbyZxJnMmgSaKJo8mmCaaJt8m4SbjJuUm5ybpJusm7SbvJvEm8yb1Jvcm+Sb7Jv0m/ycBJwMn +BScHJwknCycNJw8nEScTJxUnFycZJxsnHScfJyEnKicsJ3MndSd3J3kneyd9J38ngSeDJ4UnhyeJJ4sn +jSePJ5EnkyeVJ5cnmSebJ50nnyehJ6MnpSenJ6knqyetJ68nsSezJ7UntyfAJ8IoCSgLKA0oDygRKBMo +FSgXKBkoGygdKB8oISgjKCUoJygpKCsoLSgvKDEoNCg3KDooPShAKEMoRihJKEwoTyhSKFUoWChbKHgo +jyicKLAovCjUKOgo/ykWKTYpVClqKYopqinIKd4p+ypIKmkqdiqOKqwqwCrKKuwrAisZKzkrWStlK4Ur +kiuyK9Ir2yvdK+Ir5CvmK+8r8Sv2K/gr+iwDLAUscCxyLHQsdix4LHosfCx+LIAsgiyELIYsiCyKLIws +jiyQLJIslCyWLJgsmiycLJ4soCyiLKQspiyoLKosrCyuLLAssiy0LLYsuCy6LLwsvizALMIsxCzGLMgs +yizMLM4s0CzSLNQs1izYLOEs4y1OLVEtVC1XLVotXS1gLWMtZi1pLWwtby1yLXUteC17LX4tgC2DLYYt +iS2MLY8tki2VLZgtmy2eLaEtpC2nLaotrS2wLbMtti25Lbwtvy3CLcUtyC3LLc4t0S3ULdct2i3dLeAt +4y3mLekt6y3tLe8t8S3zLfUt9y35Lfst/S3/LgEuAy4FLgcuCS4LLg0uDy4RLhMuFS4XLhkuGy4dLh8u +IS4jLiUuJy4pLisuLS4vLjEuMy41LjcuOS47Lj0uPy5BLkouTC5VLlcuWC5hLmMuZC5tLm8ucC55Ln4A +AAAAAAACAgAAAAAAAAWNAAAAAAAAAAAAAAAAAAAujQ diff --git a/Spotlight/SpotlightPlaylistEntry.m b/Spotlight/SpotlightPlaylistEntry.m index 3c2172cbc..e021c555a 100644 --- a/Spotlight/SpotlightPlaylistEntry.m +++ b/Spotlight/SpotlightPlaylistEntry.m @@ -44,7 +44,7 @@ static NSDictionary * tags; @"length", nil]retain]; extramdKeys = [[NSArray arrayWithObjects: - // @"kMDItemPath", + @"kMDItemPath", @"kMDItemAuthors", nil]retain]; allmdKeys = [[mdKeys arrayByAddingObjectsFromArray:extramdKeys]retain]; @@ -68,9 +68,9 @@ static NSDictionary * tags; forKey:[tags objectForKey:mdKey]]; } + // URL needs to be generated from the simple path stored in kMDItemPath - // Will deal with this complication later. - // [entry setURL: [NSURL fileURLWithPath: [songAttributes objectForKey:@"kMDItemPath"]]]; + [entry setURL: [NSURL fileURLWithPath: [songAttributes objectForKey:@"kMDItemPath"]]]; // Authors is an array, but we only care about the first item in it diff --git a/Spotlight/SpotlightPlaylistView.h b/Spotlight/SpotlightPlaylistView.h new file mode 100644 index 000000000..7e7320099 --- /dev/null +++ b/Spotlight/SpotlightPlaylistView.h @@ -0,0 +1,17 @@ +// +// SpotlightPlaylistView.h +// Cog +// +// Created by Matthew Grinshpun on 12/02/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import +#import "PlaylistView.h" + + +@interface SpotlightPlaylistView : PlaylistView { + +} + +@end \ No newline at end of file diff --git a/Spotlight/SpotlightPlaylistView.m b/Spotlight/SpotlightPlaylistView.m new file mode 100644 index 000000000..48d502091 --- /dev/null +++ b/Spotlight/SpotlightPlaylistView.m @@ -0,0 +1,28 @@ +// +// SpotlightPlaylistView.m +// Cog +// +// Created by Matthew Grinshpun on 12/02/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import "SpotlightPlaylistView.h" + + +@implementation SpotlightPlaylistView + +- (void)awakeFromNib +{ + [super awakeFromNib]; + + // We don't want the font to be bold + NSFontManager *fontManager = [NSFontManager sharedFontManager]; + + for(NSTableColumn *c in self.tableColumns) + { + [c.dataCell setFont:[fontManager convertFont:[c.dataCell font] + toHaveTrait:NSUnboldFontMask]]; + } +} + +@end diff --git a/Spotlight/SpotlightSearchController.h b/Spotlight/SpotlightSearchController.h index 537bc0355..33622df25 100644 --- a/Spotlight/SpotlightSearchController.h +++ b/Spotlight/SpotlightSearchController.h @@ -22,6 +22,7 @@ - (IBAction)changeSearchPath:(id)sender; - (void)performSearch; +- (NSPredicate *)processSearchString; @property(retain) NSMetadataQuery *query; @property(copy) NSString *searchString; diff --git a/Spotlight/SpotlightSearchController.m b/Spotlight/SpotlightSearchController.m index 7d23a657a..6291f36d4 100644 --- a/Spotlight/SpotlightSearchController.m +++ b/Spotlight/SpotlightSearchController.m @@ -45,23 +45,15 @@ static NSPredicate * musicOnlyPredicate = nil; - (void)performSearch { - unsigned options = (NSCaseInsensitivePredicateOption| - NSDiacriticInsensitivePredicateOption); - + // Process the search string into a compound predicate + NSPredicate *searchPredicate = [self processSearchString]; + // Set scope to contents of pathControl [self.query setSearchScopes:[NSArray arrayWithObjects:pathControl.URL, nil]]; - - NSString *processedKey = [NSString stringWithFormat: @"*%@*", self.searchString]; - - NSPredicate *searchPredicate = [NSComparisonPredicate - predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"kMDItemAuthors"] - 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 + // is the union of the (potentially) compound searchPredicate and the static + // musicOnlyPredicate NSPredicate *spotlightPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: [NSArray arrayWithObjects: musicOnlyPredicate, @@ -74,6 +66,44 @@ static NSPredicate * musicOnlyPredicate = nil; NSLog(@"Started query: %@", [self.query.predicate description], [[self.query class]description]); } +- (NSPredicate *)processSearchString +{ + // break the string up into an array of each word + NSArray * searchComponents = [self.searchString + componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + // 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] == 1) + return [subpredicates objectAtIndex: 0]; + + // Create a compound predicate from subPredicates + return [NSCompoundPredicate andPredicateWithSubpredicates: subpredicates]; +} + - (void)dealloc { [self.query stopQuery];