Browse Source

update to jquery mobile 1.4.3

Luke Pulverenti 11 năm trước cách đây
mục cha
commit
59dc591f66
63 tập tin đã thay đổi với 623 bổ sung436 xóa
  1. 52 8
      MediaBrowser.Api/ApiEntryPoint.cs
  2. 2 0
      MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs
  3. 2 0
      MediaBrowser.Api/Dlna/DlnaService.cs
  4. 2 0
      MediaBrowser.Api/ItemLookupService.cs
  5. 2 0
      MediaBrowser.Api/ItemRefreshService.cs
  6. 4 2
      MediaBrowser.Api/ItemUpdateService.cs
  7. 2 0
      MediaBrowser.Api/Library/ChapterService.cs
  8. 2 0
      MediaBrowser.Api/Library/FileOrganizationService.cs
  9. 2 26
      MediaBrowser.Api/Library/LibraryStructureService.cs
  10. 2 0
      MediaBrowser.Api/Library/SubtitleService.cs
  11. 2 0
      MediaBrowser.Api/LiveTv/LiveTvService.cs
  12. 2 0
      MediaBrowser.Api/LocalizationService.cs
  13. 2 0
      MediaBrowser.Api/Movies/CollectionService.cs
  14. 2 0
      MediaBrowser.Api/Movies/MoviesService.cs
  15. 2 0
      MediaBrowser.Api/Movies/TrailersService.cs
  16. 2 1
      MediaBrowser.Api/Music/AlbumsService.cs
  17. 2 0
      MediaBrowser.Api/Music/InstantMixService.cs
  18. 2 0
      MediaBrowser.Api/PackageReviewService.cs
  19. 2 0
      MediaBrowser.Api/PackageService.cs
  20. 0 7
      MediaBrowser.Api/Playback/BaseStreamingService.cs
  21. 9 3
      MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
  22. 5 5
      MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
  23. 3 1
      MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
  24. 2 0
      MediaBrowser.Api/PluginService.cs
  25. 2 0
      MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs
  26. 2 0
      MediaBrowser.Api/SearchService.cs
  27. 2 0
      MediaBrowser.Api/TvShowsService.cs
  28. 2 0
      MediaBrowser.Api/UserLibrary/ArtistsService.cs
  29. 2 0
      MediaBrowser.Api/UserLibrary/GameGenresService.cs
  30. 2 0
      MediaBrowser.Api/UserLibrary/GenresService.cs
  31. 2 0
      MediaBrowser.Api/UserLibrary/ItemsService.cs
  32. 2 0
      MediaBrowser.Api/UserLibrary/MusicGenresService.cs
  33. 2 0
      MediaBrowser.Api/UserLibrary/PersonsService.cs
  34. 2 0
      MediaBrowser.Api/UserLibrary/StudiosService.cs
  35. 2 0
      MediaBrowser.Api/UserLibrary/UserLibraryService.cs
  36. 2 0
      MediaBrowser.Api/UserLibrary/YearsService.cs
  37. 12 51
      MediaBrowser.Api/UserService.cs
  38. 2 0
      MediaBrowser.Api/VideosService.cs
  39. 2 2
      MediaBrowser.Controller/Library/IUserManager.cs
  40. 5 0
      MediaBrowser.Controller/Net/AuthorizationInfo.cs
  41. 10 3
      MediaBrowser.Controller/Session/ISessionManager.cs
  42. 12 12
      MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
  43. 12 12
      MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
  44. 2 6
      MediaBrowser.Model/Configuration/ServerConfiguration.cs
  45. 4 4
      MediaBrowser.Model/MediaBrowser.Model.csproj
  46. 3 1
      MediaBrowser.Model/Notifications/NotificationOption.cs
  47. 3 2
      MediaBrowser.Model/Notifications/NotificationOptions.cs
  48. 1 1
      MediaBrowser.Model/Notifications/NotificationType.cs
  49. 1 1
      MediaBrowser.Model/Notifications/SendToUserType.cs
  50. 30 2
      MediaBrowser.Model/Updates/PackageVersionInfo.cs
  51. 6 0
      MediaBrowser.Model/Users/AuthenticationResult.cs
  52. 10 15
      MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs
  53. 2 1
      MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs
  54. 7 4
      MediaBrowser.Server.Implementations/Library/UserManager.cs
  55. 73 52
      MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
  56. 17 1
      MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
  57. 1 0
      MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
  58. 21 0
      MediaBrowser.Server.Implementations/Notifications/NotificationConfigurationFactory.cs
  59. 12 4
      MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs
  60. 27 4
      MediaBrowser.Server.Implementations/Session/SessionManager.cs
  61. 7 0
      MediaBrowser.ServerApplication/ApplicationHost.cs
  62. 2 2
      MediaBrowser.WebDashboard/Api/DashboardService.cs
  63. 206 203
      MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

+ 52 - 8
MediaBrowser.Api/ApiEntryPoint.cs

@@ -37,6 +37,8 @@ namespace MediaBrowser.Api
 
 
         private readonly ISessionManager _sessionManager;
         private readonly ISessionManager _sessionManager;
 
 
+        public readonly SemaphoreSlim TranscodingStartLock = new SemaphoreSlim(1,1);
+
         /// <summary>
         /// <summary>
         /// Initializes a new instance of the <see cref="ApiEntryPoint" /> class.
         /// Initializes a new instance of the <see cref="ApiEntryPoint" /> class.
         /// </summary>
         /// </summary>
@@ -301,8 +303,9 @@ namespace MediaBrowser.Api
         /// </summary>
         /// </summary>
         /// <param name="deviceId">The device id.</param>
         /// <param name="deviceId">The device id.</param>
         /// <param name="deleteMode">The delete mode.</param>
         /// <param name="deleteMode">The delete mode.</param>
+        /// <param name="acquireLock">if set to <c>true</c> [acquire lock].</param>
         /// <exception cref="System.ArgumentNullException">sourcePath</exception>
         /// <exception cref="System.ArgumentNullException">sourcePath</exception>
-        internal void KillTranscodingJobs(string deviceId, FileDeleteMode deleteMode)
+        internal async Task KillTranscodingJobs(string deviceId, FileDeleteMode deleteMode, bool acquireLock)
         {
         {
             if (string.IsNullOrEmpty(deviceId))
             if (string.IsNullOrEmpty(deviceId))
             {
             {
@@ -318,9 +321,29 @@ namespace MediaBrowser.Api
                 jobs.AddRange(_activeTranscodingJobs.Where(i => string.Equals(deviceId, i.DeviceId, StringComparison.OrdinalIgnoreCase)));
                 jobs.AddRange(_activeTranscodingJobs.Where(i => string.Equals(deviceId, i.DeviceId, StringComparison.OrdinalIgnoreCase)));
             }
             }
 
 
-            foreach (var job in jobs)
+            if (jobs.Count == 0)
+            {
+                return;
+            }
+
+            if (acquireLock)
             {
             {
-                KillTranscodingJob(job, deleteMode);
+                await TranscodingStartLock.WaitAsync(CancellationToken.None).ConfigureAwait(false);
+            }
+            
+            try
+            {
+                foreach (var job in jobs)
+                {
+                    KillTranscodingJob(job, deleteMode);
+                }
+            }
+            finally
+            {
+                if (acquireLock)
+                {
+                    TranscodingStartLock.Release();
+                }
             }
             }
         }
         }
 
 
@@ -328,10 +351,11 @@ namespace MediaBrowser.Api
         /// Kills the transcoding jobs.
         /// Kills the transcoding jobs.
         /// </summary>
         /// </summary>
         /// <param name="deviceId">The device identifier.</param>
         /// <param name="deviceId">The device identifier.</param>
-        /// <param name="outputPath">The output path.</param>
+        /// <param name="type">The type.</param>
         /// <param name="deleteMode">The delete mode.</param>
         /// <param name="deleteMode">The delete mode.</param>
+        /// <param name="acquireLock">if set to <c>true</c> [acquire lock].</param>
         /// <exception cref="System.ArgumentNullException">deviceId</exception>
         /// <exception cref="System.ArgumentNullException">deviceId</exception>
-        internal void KillTranscodingJobs(string deviceId, string outputPath, FileDeleteMode deleteMode)
+        internal async Task KillTranscodingJobs(string deviceId, TranscodingJobType type, FileDeleteMode deleteMode, bool acquireLock)
         {
         {
             if (string.IsNullOrEmpty(deviceId))
             if (string.IsNullOrEmpty(deviceId))
             {
             {
@@ -344,12 +368,32 @@ namespace MediaBrowser.Api
             {
             {
                 // This is really only needed for HLS. 
                 // This is really only needed for HLS. 
                 // Progressive streams can stop on their own reliably
                 // Progressive streams can stop on their own reliably
-                jobs.AddRange(_activeTranscodingJobs.Where(i => string.Equals(deviceId, i.DeviceId, StringComparison.OrdinalIgnoreCase) && string.Equals(outputPath, i.Path, StringComparison.OrdinalIgnoreCase)));
+                jobs.AddRange(_activeTranscodingJobs.Where(i => string.Equals(deviceId, i.DeviceId, StringComparison.OrdinalIgnoreCase) && i.Type == type));
             }
             }
 
 
-            foreach (var job in jobs)
+            if (jobs.Count == 0)
             {
             {
-                KillTranscodingJob(job, deleteMode);
+                return;
+            }
+
+            if (acquireLock)
+            {
+                await TranscodingStartLock.WaitAsync(CancellationToken.None).ConfigureAwait(false);
+            }
+
+            try
+            {
+                foreach (var job in jobs)
+                {
+                    KillTranscodingJob(job, deleteMode);
+                }
+            }
+            finally
+            {
+                if (acquireLock)
+                {
+                    TranscodingStartLock.Release();
+                }
             }
             }
         }
         }
 
 

+ 2 - 0
MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs

@@ -5,6 +5,7 @@ using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Logging;
@@ -86,6 +87,7 @@ namespace MediaBrowser.Api.DefaultTheme
         public Guid UserId { get; set; }
         public Guid UserId { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class DefaultThemeService : BaseApiService
     public class DefaultThemeService : BaseApiService
     {
     {
         private readonly IUserManager _userManager;
         private readonly IUserManager _userManager;

+ 2 - 0
MediaBrowser.Api/Dlna/DlnaService.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Controller.Dlna;
 using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Dlna;
 using ServiceStack;
 using ServiceStack;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -42,6 +43,7 @@ namespace MediaBrowser.Api.Dlna
     {
     {
     }
     }
 
 
+    [Authenticated]
     public class DlnaService : BaseApiService
     public class DlnaService : BaseApiService
     {
     {
         private readonly IDlnaManager _dlnaManager;
         private readonly IDlnaManager _dlnaManager;

+ 2 - 0
MediaBrowser.Api/ItemLookupService.cs

@@ -6,6 +6,7 @@ using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Providers;
 using MediaBrowser.Model.Providers;
@@ -104,6 +105,7 @@ namespace MediaBrowser.Api
         public string Id { get; set; }
         public string Id { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class ItemLookupService : BaseApiService
     public class ItemLookupService : BaseApiService
     {
     {
         private readonly IProviderManager _providerManager;
         private readonly IProviderManager _providerManager;

+ 2 - 0
MediaBrowser.Api/ItemRefreshService.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
 using ServiceStack;
 using ServiceStack;
 using System;
 using System;
@@ -30,6 +31,7 @@ namespace MediaBrowser.Api
         public string Id { get; set; }
         public string Id { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class ItemRefreshService : BaseApiService
     public class ItemRefreshService : BaseApiService
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;

+ 4 - 2
MediaBrowser.Api/ItemUpdateService.cs

@@ -1,11 +1,12 @@
-using System.Collections.Generic;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using ServiceStack;
 using ServiceStack;
 using System;
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
@@ -19,6 +20,7 @@ namespace MediaBrowser.Api
         public string ItemId { get; set; }
         public string ItemId { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class ItemUpdateService : BaseApiService
     public class ItemUpdateService : BaseApiService
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;

+ 2 - 0
MediaBrowser.Api/Library/ChapterService.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Controller.Chapters;
 using MediaBrowser.Controller.Chapters;
+using MediaBrowser.Controller.Net;
 using ServiceStack;
 using ServiceStack;
 using System.Linq;
 using System.Linq;
 
 
@@ -9,6 +10,7 @@ namespace MediaBrowser.Api.Library
     {
     {
     }
     }
 
 
+    [Authenticated]
     public class ChapterService : BaseApiService
     public class ChapterService : BaseApiService
     {
     {
         private readonly IChapterManager _chapterManager;
         private readonly IChapterManager _chapterManager;

+ 2 - 0
MediaBrowser.Api/Library/FileOrganizationService.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Controller.FileOrganization;
 using MediaBrowser.Controller.FileOrganization;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.FileOrganization;
 using MediaBrowser.Model.FileOrganization;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
 using ServiceStack;
 using ServiceStack;
@@ -78,6 +79,7 @@ namespace MediaBrowser.Api.Library
         public bool RememberCorrection { get; set; }
         public bool RememberCorrection { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class FileOrganizationService : BaseApiService
     public class FileOrganizationService : BaseApiService
     {
     {
         private readonly IFileOrganizationService _iFileOrganizationService;
         private readonly IFileOrganizationService _iFileOrganizationService;

+ 2 - 26
MediaBrowser.Api/Library/LibraryStructureService.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Common.IO;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Logging;
 using ServiceStack;
 using ServiceStack;
@@ -130,36 +131,11 @@ namespace MediaBrowser.Api.Library
         /// <value><c>true</c> if [refresh library]; otherwise, <c>false</c>.</value>
         /// <value><c>true</c> if [refresh library]; otherwise, <c>false</c>.</value>
         public bool RefreshLibrary { get; set; }
         public bool RefreshLibrary { get; set; }
     }
     }
-
-    [Route("/Library/Downloaded", "POST")]
-    public class ReportContentDownloaded : IReturnVoid
-    {
-        [ApiMember(Name = "Path", Description = "The path being downloaded to.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
-        public string Path { get; set; }
-
-        [ApiMember(Name = "ImageUrl", Description = "Optional thumbnail image url of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
-        public string ImageUrl { get; set; }
-
-        [ApiMember(Name = "Name", Description = "The name of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
-        public string Name { get; set; }
-    }
-
-    [Route("/Library/Downloading", "POST")]
-    public class ReportContentDownloading : IReturnVoid
-    {
-        [ApiMember(Name = "Path", Description = "The path being downloaded to.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
-        public string Path { get; set; }
-
-        [ApiMember(Name = "ImageUrl", Description = "Optional thumbnail image url of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
-        public string ImageUrl { get; set; }
-
-        [ApiMember(Name = "Name", Description = "The name of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
-        public string Name { get; set; }
-    }
     
     
     /// <summary>
     /// <summary>
     /// Class LibraryStructureService
     /// Class LibraryStructureService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class LibraryStructureService : BaseApiService
     public class LibraryStructureService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/Library/SubtitleService.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Subtitles;
 using MediaBrowser.Controller.Subtitles;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
@@ -86,6 +87,7 @@ namespace MediaBrowser.Api.Library
         public string Id { get; set; }
         public string Id { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class SubtitleService : BaseApiService
     public class SubtitleService : BaseApiService
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;

+ 2 - 0
MediaBrowser.Api/LiveTv/LiveTvService.cs

@@ -1,5 +1,6 @@
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.LiveTv;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.LiveTv;
@@ -267,6 +268,7 @@ namespace MediaBrowser.Api.LiveTv
         public string UserId { get; set; }
         public string UserId { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class LiveTvService : BaseApiService
     public class LiveTvService : BaseApiService
     {
     {
         private readonly ILiveTvManager _liveTvManager;
         private readonly ILiveTvManager _liveTvManager;

+ 2 - 0
MediaBrowser.Api/LocalizationService.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Controller.Localization;
 using MediaBrowser.Controller.Localization;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Globalization;
 using MediaBrowser.Model.Globalization;
 using ServiceStack;
 using ServiceStack;
@@ -42,6 +43,7 @@ namespace MediaBrowser.Api
     /// <summary>
     /// <summary>
     /// Class CulturesService
     /// Class CulturesService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class LocalizationService : BaseApiService
     public class LocalizationService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/Movies/CollectionService.cs

@@ -1,5 +1,6 @@
 using MediaBrowser.Controller.Collections;
 using MediaBrowser.Controller.Collections;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Dto;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
 using ServiceStack;
 using ServiceStack;
 using System;
 using System;
@@ -45,6 +46,7 @@ namespace MediaBrowser.Api.Movies
         public Guid Id { get; set; }
         public Guid Id { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class CollectionService : BaseApiService
     public class CollectionService : BaseApiService
     {
     {
         private readonly ICollectionManager _collectionManager;
         private readonly ICollectionManager _collectionManager;

+ 2 - 0
MediaBrowser.Api/Movies/MoviesService.cs

@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
@@ -64,6 +65,7 @@ namespace MediaBrowser.Api.Movies
     /// <summary>
     /// <summary>
     /// Class MoviesService
     /// Class MoviesService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class MoviesService : BaseApiService
     public class MoviesService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/Movies/TrailersService.cs

@@ -2,6 +2,7 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using ServiceStack;
 using ServiceStack;
 
 
@@ -18,6 +19,7 @@ namespace MediaBrowser.Api.Movies
     /// <summary>
     /// <summary>
     /// Class TrailersService
     /// Class TrailersService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class TrailersService : BaseApiService
     public class TrailersService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 1
MediaBrowser.Api/Music/AlbumsService.cs

@@ -2,10 +2,10 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using ServiceStack;
 using ServiceStack;
 using System;
 using System;
-using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 
 
 namespace MediaBrowser.Api.Music
 namespace MediaBrowser.Api.Music
@@ -15,6 +15,7 @@ namespace MediaBrowser.Api.Music
     {
     {
     }
     }
 
 
+    [Authenticated]
     public class AlbumsService : BaseApiService
     public class AlbumsService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/Music/InstantMixService.cs

@@ -2,6 +2,7 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
 using ServiceStack;
 using ServiceStack;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -33,6 +34,7 @@ namespace MediaBrowser.Api.Music
         public string Name { get; set; }
         public string Name { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class InstantMixService : BaseApiService
     public class InstantMixService : BaseApiService
     {
     {
         private readonly IUserManager _userManager;
         private readonly IUserManager _userManager;

+ 2 - 0
MediaBrowser.Api/PackageReviewService.cs

@@ -1,5 +1,6 @@
 using MediaBrowser.Common.Constants;
 using MediaBrowser.Common.Constants;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Serialization;
 using ServiceStack;
 using ServiceStack;
@@ -96,6 +97,7 @@ namespace MediaBrowser.Api
 
 
     }
     }
 
 
+    [Authenticated]
     public class PackageReviewService : BaseApiService
     public class PackageReviewService : BaseApiService
     {
     {
         private readonly IHttpClient _httpClient;
         private readonly IHttpClient _httpClient;

+ 2 - 0
MediaBrowser.Api/PackageService.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Common;
 using MediaBrowser.Common;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Updates;
 using MediaBrowser.Common.Updates;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Updates;
 using MediaBrowser.Model.Updates;
 using ServiceStack;
 using ServiceStack;
 using System;
 using System;
@@ -121,6 +122,7 @@ namespace MediaBrowser.Api
     /// <summary>
     /// <summary>
     /// Class PackageService
     /// Class PackageService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class PackageService : BaseApiService
     public class PackageService : BaseApiService
     {
     {
         private readonly IInstallationManager _installationManager;
         private readonly IInstallationManager _installationManager;

+ 0 - 7
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -13,7 +13,6 @@ using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Library;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.MediaInfo;
 using MediaBrowser.Model.MediaInfo;
 using System;
 using System;
@@ -1955,12 +1954,6 @@ namespace MediaBrowser.Api.Playback
         /// <param name="videoRequest">The video request.</param>
         /// <param name="videoRequest">The video request.</param>
         private void EnforceResolutionLimit(StreamState state, VideoStreamRequest videoRequest)
         private void EnforceResolutionLimit(StreamState state, VideoStreamRequest videoRequest)
         {
         {
-            // If enabled, allow whatever the client asks for
-            if (ServerConfigurationManager.Configuration.AllowVideoUpscaling)
-            {
-                return;
-            }
-
             // Switch the incoming params to be ceilings rather than fixed values
             // Switch the incoming params to be ceilings rather than fixed values
             videoRequest.MaxWidth = videoRequest.MaxWidth ?? videoRequest.Width;
             videoRequest.MaxWidth = videoRequest.MaxWidth ?? videoRequest.Width;
             videoRequest.MaxHeight = videoRequest.MaxHeight ?? videoRequest.Height;
             videoRequest.MaxHeight = videoRequest.MaxHeight ?? videoRequest.Height;

+ 9 - 3
MediaBrowser.Api/Playback/Hls/BaseHlsService.cs

@@ -66,7 +66,6 @@ namespace MediaBrowser.Api.Playback.Hls
             return ProcessRequestAsync(request, isLive).Result;
             return ProcessRequestAsync(request, isLive).Result;
         }
         }
 
 
-        private static readonly SemaphoreSlim FfmpegStartLock = new SemaphoreSlim(1, 1);
         /// <summary>
         /// <summary>
         /// Processes the request async.
         /// Processes the request async.
         /// </summary>
         /// </summary>
@@ -82,6 +81,11 @@ namespace MediaBrowser.Api.Playback.Hls
 
 
             var state = await GetState(request, cancellationTokenSource.Token).ConfigureAwait(false);
             var state = await GetState(request, cancellationTokenSource.Token).ConfigureAwait(false);
 
 
+            if (isLive)
+            {
+                state.Request.StartTimeTicks = null;
+            }
+
             var playlist = state.OutputFilePath;
             var playlist = state.OutputFilePath;
 
 
             if (File.Exists(playlist))
             if (File.Exists(playlist))
@@ -90,7 +94,7 @@ namespace MediaBrowser.Api.Playback.Hls
             }
             }
             else
             else
             {
             {
-                await FfmpegStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
+                await ApiEntryPoint.Instance.TranscodingStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
                 try
                 try
                 {
                 {
                     if (File.Exists(playlist))
                     if (File.Exists(playlist))
@@ -99,6 +103,8 @@ namespace MediaBrowser.Api.Playback.Hls
                     }
                     }
                     else
                     else
                     {
                     {
+                        await ApiEntryPoint.Instance.KillTranscodingJobs(state.Request.DeviceId, TranscodingJobType.Hls, FileDeleteMode.All, false).ConfigureAwait(false);
+                        
                         // If the playlist doesn't already exist, startup ffmpeg
                         // If the playlist doesn't already exist, startup ffmpeg
                         try
                         try
                         {
                         {
@@ -116,7 +122,7 @@ namespace MediaBrowser.Api.Playback.Hls
                 }
                 }
                 finally
                 finally
                 {
                 {
-                    FfmpegStartLock.Release();
+                    ApiEntryPoint.Instance.TranscodingStartLock.Release();
                 }
                 }
             }
             }
 
 

+ 5 - 5
MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs

@@ -65,7 +65,6 @@ namespace MediaBrowser.Api.Playback.Hls
             return GetDynamicSegment(request).Result;
             return GetDynamicSegment(request).Result;
         }
         }
 
 
-        private static readonly SemaphoreSlim FfmpegStartLock = new SemaphoreSlim(1, 1);
         private async Task<object> GetDynamicSegment(GetDynamicHlsVideoSegment request)
         private async Task<object> GetDynamicSegment(GetDynamicHlsVideoSegment request)
         {
         {
             if ((request.StartTimeTicks ?? 0) > 0)
             if ((request.StartTimeTicks ?? 0) > 0)
@@ -90,7 +89,7 @@ namespace MediaBrowser.Api.Playback.Hls
                 return await GetSegmentResult(playlistPath, segmentPath, index, cancellationToken).ConfigureAwait(false);
                 return await GetSegmentResult(playlistPath, segmentPath, index, cancellationToken).ConfigureAwait(false);
             }
             }
 
 
-            await FfmpegStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
+            await ApiEntryPoint.Instance.TranscodingStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
             try
             try
             {
             {
                 if (File.Exists(segmentPath))
                 if (File.Exists(segmentPath))
@@ -107,10 +106,11 @@ namespace MediaBrowser.Api.Playback.Hls
                         // If the playlist doesn't already exist, startup ffmpeg
                         // If the playlist doesn't already exist, startup ffmpeg
                         try
                         try
                         {
                         {
+                            // TODO: Delete files from other jobs, but not this one
+                            await ApiEntryPoint.Instance.KillTranscodingJobs(state.Request.DeviceId, TranscodingJobType.Hls, FileDeleteMode.None, false).ConfigureAwait(false);
+
                             if (currentTranscodingIndex.HasValue)
                             if (currentTranscodingIndex.HasValue)
                             {
                             {
-                                ApiEntryPoint.Instance.KillTranscodingJobs(state.Request.DeviceId, playlistPath, FileDeleteMode.None);
-
                                 DeleteLastFile(playlistPath, 0);
                                 DeleteLastFile(playlistPath, 0);
                             }
                             }
 
 
@@ -131,7 +131,7 @@ namespace MediaBrowser.Api.Playback.Hls
             }
             }
             finally
             finally
             {
             {
-                FfmpegStartLock.Release();
+                ApiEntryPoint.Instance.TranscodingStartLock.Release();
             }
             }
 
 
             Logger.Info("waiting for {0}", segmentPath);
             Logger.Info("waiting for {0}", segmentPath);

+ 3 - 1
MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs

@@ -74,7 +74,9 @@ namespace MediaBrowser.Api.Playback.Hls
 
 
         public void Delete(StopEncodingProcess request)
         public void Delete(StopEncodingProcess request)
         {
         {
-            ApiEntryPoint.Instance.KillTranscodingJobs(request.DeviceId, FileDeleteMode.All);
+            var task = ApiEntryPoint.Instance.KillTranscodingJobs(request.DeviceId, FileDeleteMode.All, true);
+
+            Task.WaitAll(task);
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/PluginService.cs

@@ -2,6 +2,7 @@
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Security;
 using MediaBrowser.Common.Security;
 using MediaBrowser.Common.Updates;
 using MediaBrowser.Common.Updates;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Plugins;
 using MediaBrowser.Model.Plugins;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Serialization;
@@ -100,6 +101,7 @@ namespace MediaBrowser.Api
     /// <summary>
     /// <summary>
     /// Class PluginsService
     /// Class PluginsService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class PluginService : BaseApiService
     public class PluginService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs

@@ -1,5 +1,6 @@
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Tasks;
 using MediaBrowser.Model.Tasks;
 using ServiceStack;
 using ServiceStack;
 using ServiceStack.Text.Controller;
 using ServiceStack.Text.Controller;
@@ -78,6 +79,7 @@ namespace MediaBrowser.Api.ScheduledTasks
     /// <summary>
     /// <summary>
     /// Class ScheduledTasksService
     /// Class ScheduledTasksService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class ScheduledTaskService : BaseApiService
     public class ScheduledTaskService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/SearchService.cs

@@ -4,6 +4,7 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Search;
 using MediaBrowser.Model.Search;
 using ServiceStack;
 using ServiceStack;
@@ -79,6 +80,7 @@ namespace MediaBrowser.Api
     /// <summary>
     /// <summary>
     /// Class SearchService
     /// Class SearchService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class SearchService : BaseApiService
     public class SearchService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/TvShowsService.cs

@@ -4,6 +4,7 @@ using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
@@ -175,6 +176,7 @@ namespace MediaBrowser.Api
     /// <summary>
     /// <summary>
     /// Class TvShowsService
     /// Class TvShowsService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class TvShowsService : BaseApiService
     public class TvShowsService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/UserLibrary/ArtistsService.cs

@@ -2,6 +2,7 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
@@ -46,6 +47,7 @@ namespace MediaBrowser.Api.UserLibrary
     /// <summary>
     /// <summary>
     /// Class ArtistsService
     /// Class ArtistsService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class ArtistsService : BaseItemsByNameService<MusicArtist>
     public class ArtistsService : BaseItemsByNameService<MusicArtist>
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/UserLibrary/GameGenresService.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
@@ -41,6 +42,7 @@ namespace MediaBrowser.Api.UserLibrary
         public Guid? UserId { get; set; }
         public Guid? UserId { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class GameGenresService : BaseItemsByNameService<GameGenre>
     public class GameGenresService : BaseItemsByNameService<GameGenre>
     {
     {
         public GameGenresService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)
         public GameGenresService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)

+ 2 - 0
MediaBrowser.Api/UserLibrary/GenresService.cs

@@ -2,6 +2,7 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
@@ -46,6 +47,7 @@ namespace MediaBrowser.Api.UserLibrary
     /// <summary>
     /// <summary>
     /// Class GenresService
     /// Class GenresService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class GenresService : BaseItemsByNameService<Genre>
     public class GenresService : BaseItemsByNameService<Genre>
     {
     {
         public GenresService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)
         public GenresService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)

+ 2 - 0
MediaBrowser.Api/UserLibrary/ItemsService.cs

@@ -6,6 +6,7 @@ using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Localization;
 using MediaBrowser.Controller.Localization;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
@@ -246,6 +247,7 @@ namespace MediaBrowser.Api.UserLibrary
     /// <summary>
     /// <summary>
     /// Class ItemsService
     /// Class ItemsService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class ItemsService : BaseApiService
     public class ItemsService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/UserLibrary/MusicGenresService.cs

@@ -2,6 +2,7 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
@@ -41,6 +42,7 @@ namespace MediaBrowser.Api.UserLibrary
         public Guid? UserId { get; set; }
         public Guid? UserId { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class MusicGenresService : BaseItemsByNameService<MusicGenre>
     public class MusicGenresService : BaseItemsByNameService<MusicGenre>
     {
     {
         public MusicGenresService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)
         public MusicGenresService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)

+ 2 - 0
MediaBrowser.Api/UserLibrary/PersonsService.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
@@ -51,6 +52,7 @@ namespace MediaBrowser.Api.UserLibrary
     /// <summary>
     /// <summary>
     /// Class PersonsService
     /// Class PersonsService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class PersonsService : BaseItemsByNameService<Person>
     public class PersonsService : BaseItemsByNameService<Person>
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/UserLibrary/StudiosService.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
@@ -43,6 +44,7 @@ namespace MediaBrowser.Api.UserLibrary
     /// <summary>
     /// <summary>
     /// Class StudiosService
     /// Class StudiosService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class StudiosService : BaseItemsByNameService<Studio>
     public class StudiosService : BaseItemsByNameService<Studio>
     {
     {
         public StudiosService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)
         public StudiosService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)

+ 2 - 0
MediaBrowser.Api/UserLibrary/UserLibraryService.cs

@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
@@ -424,6 +425,7 @@ namespace MediaBrowser.Api.UserLibrary
     /// <summary>
     /// <summary>
     /// Class UserLibraryService
     /// Class UserLibraryService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class UserLibraryService : BaseApiService
     public class UserLibraryService : BaseApiService
     {
     {
         /// <summary>
         /// <summary>

+ 2 - 0
MediaBrowser.Api/UserLibrary/YearsService.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
@@ -43,6 +44,7 @@ namespace MediaBrowser.Api.UserLibrary
     /// <summary>
     /// <summary>
     /// Class YearsService
     /// Class YearsService
     /// </summary>
     /// </summary>
+    [Authenticated]
     public class YearsService : BaseItemsByNameService<Year>
     public class YearsService : BaseItemsByNameService<Year>
     {
     {
         public YearsService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)
         public YearsService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IDtoService dtoService)

+ 12 - 51
MediaBrowser.Api/UserService.cs

@@ -268,28 +268,6 @@ namespace MediaBrowser.Api
         /// </summary>
         /// </summary>
         /// <param name="request">The request.</param>
         /// <param name="request">The request.</param>
         public object Post(AuthenticateUser request)
         public object Post(AuthenticateUser request)
-        {
-            // No response needed. Will throw an exception on failure.
-            var result = AuthenticateUser(request).Result;
-
-            return result;
-        }
-
-        public object Post(AuthenticateUserByName request)
-        {
-            var user = _userManager.Users.FirstOrDefault(i => string.Equals(request.Username, i.Name, StringComparison.OrdinalIgnoreCase));
-
-            if (user == null)
-            {
-                throw new ArgumentException(string.Format("User {0} not found.", request.Username));
-            }
-
-            var result = AuthenticateUser(new AuthenticateUser { Id = user.Id, Password = request.Password }).Result;
-
-            return ToOptimizedResult(result);
-        }
-
-        private async Task<AuthenticationResult> AuthenticateUser(AuthenticateUser request)
         {
         {
             var user = _userManager.GetUserById(request.Id);
             var user = _userManager.GetUserById(request.Id);
 
 
@@ -298,38 +276,21 @@ namespace MediaBrowser.Api
                 throw new ResourceNotFoundException("User not found");
                 throw new ResourceNotFoundException("User not found");
             }
             }
 
 
-            var auth = AuthorizationContext.GetAuthorizationInfo(Request);
-
-            // Login in the old way if the header is missing
-            if (string.IsNullOrEmpty(auth.Client) ||
-                string.IsNullOrEmpty(auth.Device) ||
-                string.IsNullOrEmpty(auth.DeviceId) ||
-                string.IsNullOrEmpty(auth.Version))
+            return Post(new AuthenticateUserByName
             {
             {
-                var success = await _userManager.AuthenticateUser(user, request.Password).ConfigureAwait(false);
-
-                if (!success)
-                {
-                    // Unauthorized
-                    throw new UnauthorizedAccessException("Invalid user or password entered.");
-                }
-
-                return new AuthenticationResult
-                {
-                    User = _dtoService.GetUserDto(user)
-                };
-            }
+                Username = user.Name,
+                Password = request.Password
+            });
+        }
 
 
-            var session = await _sessionMananger.AuthenticateNewSession(user, request.Password, auth.Client, auth.Version,
-                        auth.DeviceId, auth.Device, Request.RemoteIp).ConfigureAwait(false);
+        public object Post(AuthenticateUserByName request)
+        {
+            var auth = AuthorizationContext.GetAuthorizationInfo(Request);
 
 
-            var result = new AuthenticationResult
-            {
-                User = _dtoService.GetUserDto(user),
-                SessionInfo = _sessionMananger.GetSessionInfoDto(session)
-            };
+            var result = _sessionMananger.AuthenticateNewSession(request.Username, request.Password, auth.Client, auth.Version,
+                        auth.DeviceId, auth.Device, Request.RemoteIp).Result;
 
 
-            return result;
+            return ToOptimizedResult(result);
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -353,7 +314,7 @@ namespace MediaBrowser.Api
             }
             }
             else
             else
             {
             {
-                var success = _userManager.AuthenticateUser(user, request.CurrentPassword).Result;
+                var success = _userManager.AuthenticateUser(user.Name, request.CurrentPassword).Result;
 
 
                 if (!success)
                 if (!success)
                 {
                 {

+ 2 - 0
MediaBrowser.Api/VideosService.cs

@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
 using ServiceStack;
 using ServiceStack;
@@ -41,6 +42,7 @@ namespace MediaBrowser.Api
         public string Ids { get; set; }
         public string Ids { get; set; }
     }
     }
 
 
+    [Authenticated]
     public class VideosService : BaseApiService
     public class VideosService : BaseApiService
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;

+ 2 - 2
MediaBrowser.Controller/Library/IUserManager.cs

@@ -50,11 +50,11 @@ namespace MediaBrowser.Controller.Library
         /// <summary>
         /// <summary>
         /// Authenticates a User and returns a result indicating whether or not it succeeded
         /// Authenticates a User and returns a result indicating whether or not it succeeded
         /// </summary>
         /// </summary>
-        /// <param name="user">The user.</param>
+        /// <param name="username">The username.</param>
         /// <param name="password">The password.</param>
         /// <param name="password">The password.</param>
         /// <returns>Task{System.Boolean}.</returns>
         /// <returns>Task{System.Boolean}.</returns>
         /// <exception cref="System.ArgumentNullException">user</exception>
         /// <exception cref="System.ArgumentNullException">user</exception>
-        Task<bool> AuthenticateUser(User user, string password);
+        Task<bool> AuthenticateUser(string username, string password);
 
 
         /// <summary>
         /// <summary>
         /// Refreshes metadata for each user
         /// Refreshes metadata for each user

+ 5 - 0
MediaBrowser.Controller/Net/AuthorizationInfo.cs

@@ -28,5 +28,10 @@ namespace MediaBrowser.Controller.Net
         /// </summary>
         /// </summary>
         /// <value>The version.</value>
         /// <value>The version.</value>
         public string Version { get; set; }
         public string Version { get; set; }
+        /// <summary>
+        /// Gets or sets the token.
+        /// </summary>
+        /// <value>The token.</value>
+        public string Token { get; set; }
     }
     }
 }
 }

+ 10 - 3
MediaBrowser.Controller/Session/ISessionManager.cs

@@ -2,6 +2,7 @@
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Session;
 using MediaBrowser.Model.Session;
+using MediaBrowser.Model.Users;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Threading;
 using System.Threading;
@@ -206,11 +207,11 @@ namespace MediaBrowser.Controller.Session
         /// <param name="sessionId">The session identifier.</param>
         /// <param name="sessionId">The session identifier.</param>
         /// <param name="item">The item.</param>
         /// <param name="item">The item.</param>
         void ReportNowViewingItem(string sessionId, BaseItemInfo item);
         void ReportNowViewingItem(string sessionId, BaseItemInfo item);
-        
+
         /// <summary>
         /// <summary>
         /// Authenticates the new session.
         /// Authenticates the new session.
         /// </summary>
         /// </summary>
-        /// <param name="user">The user.</param>
+        /// <param name="username">The username.</param>
         /// <param name="password">The password.</param>
         /// <param name="password">The password.</param>
         /// <param name="clientType">Type of the client.</param>
         /// <param name="clientType">Type of the client.</param>
         /// <param name="appVersion">The application version.</param>
         /// <param name="appVersion">The application version.</param>
@@ -218,7 +219,7 @@ namespace MediaBrowser.Controller.Session
         /// <param name="deviceName">Name of the device.</param>
         /// <param name="deviceName">Name of the device.</param>
         /// <param name="remoteEndPoint">The remote end point.</param>
         /// <param name="remoteEndPoint">The remote end point.</param>
         /// <returns>Task{SessionInfo}.</returns>
         /// <returns>Task{SessionInfo}.</returns>
-        Task<SessionInfo> AuthenticateNewSession(User user, string password, string clientType, string appVersion, string deviceId, string deviceName, string remoteEndPoint);
+        Task<AuthenticationResult> AuthenticateNewSession(string username, string password, string clientType, string appVersion, string deviceId, string deviceName, string remoteEndPoint);
 
 
         /// <summary>
         /// <summary>
         /// Reports the capabilities.
         /// Reports the capabilities.
@@ -248,5 +249,11 @@ namespace MediaBrowser.Controller.Session
         /// <param name="version">The version.</param>
         /// <param name="version">The version.</param>
         /// <returns>SessionInfo.</returns>
         /// <returns>SessionInfo.</returns>
         SessionInfo GetSession(string deviceId, string client, string version);
         SessionInfo GetSession(string deviceId, string client, string version);
+
+        /// <summary>
+        /// Validates the security token.
+        /// </summary>
+        /// <param name="token">The token.</param>
+        void ValidateSecurityToken(string token);
     }
     }
 }
 }

+ 12 - 12
MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj

@@ -137,21 +137,9 @@
     <Compile Include="..\MediaBrowser.Model\Configuration\MetadataPluginType.cs">
     <Compile Include="..\MediaBrowser.Model\Configuration\MetadataPluginType.cs">
       <Link>Configuration\MetadataPluginType.cs</Link>
       <Link>Configuration\MetadataPluginType.cs</Link>
     </Compile>
     </Compile>
-    <Compile Include="..\MediaBrowser.Model\Configuration\NotificationOption.cs">
-      <Link>Configuration\NotificationOption.cs</Link>
-    </Compile>
-    <Compile Include="..\MediaBrowser.Model\Configuration\NotificationOptions.cs">
-      <Link>Configuration\NotificationOptions.cs</Link>
-    </Compile>
-    <Compile Include="..\MediaBrowser.Model\Configuration\NotificationType.cs">
-      <Link>Configuration\NotificationType.cs</Link>
-    </Compile>
     <Compile Include="..\MediaBrowser.Model\Configuration\PathSubstitution.cs">
     <Compile Include="..\MediaBrowser.Model\Configuration\PathSubstitution.cs">
       <Link>Configuration\PathSubstitution.cs</Link>
       <Link>Configuration\PathSubstitution.cs</Link>
     </Compile>
     </Compile>
-    <Compile Include="..\MediaBrowser.Model\Configuration\SendToUserType.cs">
-      <Link>Configuration\SendToUserType.cs</Link>
-    </Compile>
     <Compile Include="..\MediaBrowser.Model\Configuration\ServerConfiguration.cs">
     <Compile Include="..\MediaBrowser.Model\Configuration\ServerConfiguration.cs">
       <Link>Configuration\ServerConfiguration.cs</Link>
       <Link>Configuration\ServerConfiguration.cs</Link>
     </Compile>
     </Compile>
@@ -638,6 +626,12 @@
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationLevel.cs">
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationLevel.cs">
       <Link>Notifications\NotificationLevel.cs</Link>
       <Link>Notifications\NotificationLevel.cs</Link>
     </Compile>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Notifications\NotificationOption.cs">
+      <Link>Notifications\NotificationOption.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Notifications\NotificationOptions.cs">
+      <Link>Notifications\NotificationOptions.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationQuery.cs">
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationQuery.cs">
       <Link>Notifications\NotificationQuery.cs</Link>
       <Link>Notifications\NotificationQuery.cs</Link>
     </Compile>
     </Compile>
@@ -653,9 +647,15 @@
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationsSummary.cs">
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationsSummary.cs">
       <Link>Notifications\NotificationsSummary.cs</Link>
       <Link>Notifications\NotificationsSummary.cs</Link>
     </Compile>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Notifications\NotificationType.cs">
+      <Link>Notifications\NotificationType.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationTypeInfo.cs">
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationTypeInfo.cs">
       <Link>Notifications\NotificationTypeInfo.cs</Link>
       <Link>Notifications\NotificationTypeInfo.cs</Link>
     </Compile>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Notifications\SendToUserType.cs">
+      <Link>Notifications\SendToUserType.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Plugins\BasePluginConfiguration.cs">
     <Compile Include="..\MediaBrowser.Model\Plugins\BasePluginConfiguration.cs">
       <Link>Plugins\BasePluginConfiguration.cs</Link>
       <Link>Plugins\BasePluginConfiguration.cs</Link>
     </Compile>
     </Compile>

+ 12 - 12
MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj

@@ -124,21 +124,9 @@
     <Compile Include="..\MediaBrowser.Model\Configuration\MetadataPluginType.cs">
     <Compile Include="..\MediaBrowser.Model\Configuration\MetadataPluginType.cs">
       <Link>Configuration\MetadataPluginType.cs</Link>
       <Link>Configuration\MetadataPluginType.cs</Link>
     </Compile>
     </Compile>
-    <Compile Include="..\MediaBrowser.Model\Configuration\NotificationOption.cs">
-      <Link>Configuration\NotificationOption.cs</Link>
-    </Compile>
-    <Compile Include="..\MediaBrowser.Model\Configuration\NotificationOptions.cs">
-      <Link>Configuration\NotificationOptions.cs</Link>
-    </Compile>
-    <Compile Include="..\MediaBrowser.Model\Configuration\NotificationType.cs">
-      <Link>Configuration\NotificationType.cs</Link>
-    </Compile>
     <Compile Include="..\MediaBrowser.Model\Configuration\PathSubstitution.cs">
     <Compile Include="..\MediaBrowser.Model\Configuration\PathSubstitution.cs">
       <Link>Configuration\PathSubstitution.cs</Link>
       <Link>Configuration\PathSubstitution.cs</Link>
     </Compile>
     </Compile>
-    <Compile Include="..\MediaBrowser.Model\Configuration\SendToUserType.cs">
-      <Link>Configuration\SendToUserType.cs</Link>
-    </Compile>
     <Compile Include="..\MediaBrowser.Model\Configuration\ServerConfiguration.cs">
     <Compile Include="..\MediaBrowser.Model\Configuration\ServerConfiguration.cs">
       <Link>Configuration\ServerConfiguration.cs</Link>
       <Link>Configuration\ServerConfiguration.cs</Link>
     </Compile>
     </Compile>
@@ -619,6 +607,12 @@
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationLevel.cs">
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationLevel.cs">
       <Link>Notifications\NotificationLevel.cs</Link>
       <Link>Notifications\NotificationLevel.cs</Link>
     </Compile>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Notifications\NotificationOption.cs">
+      <Link>Notifications\NotificationOption.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Notifications\NotificationOptions.cs">
+      <Link>Notifications\NotificationOptions.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationQuery.cs">
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationQuery.cs">
       <Link>Notifications\NotificationQuery.cs</Link>
       <Link>Notifications\NotificationQuery.cs</Link>
     </Compile>
     </Compile>
@@ -634,9 +628,15 @@
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationsSummary.cs">
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationsSummary.cs">
       <Link>Notifications\NotificationsSummary.cs</Link>
       <Link>Notifications\NotificationsSummary.cs</Link>
     </Compile>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Notifications\NotificationType.cs">
+      <Link>Notifications\NotificationType.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationTypeInfo.cs">
     <Compile Include="..\MediaBrowser.Model\Notifications\NotificationTypeInfo.cs">
       <Link>Notifications\NotificationTypeInfo.cs</Link>
       <Link>Notifications\NotificationTypeInfo.cs</Link>
     </Compile>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Notifications\SendToUserType.cs">
+      <Link>Notifications\SendToUserType.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Plugins\BasePluginConfiguration.cs">
     <Compile Include="..\MediaBrowser.Model\Plugins\BasePluginConfiguration.cs">
       <Link>Plugins\BasePluginConfiguration.cs</Link>
       <Link>Plugins\BasePluginConfiguration.cs</Link>
     </Compile>
     </Compile>

+ 2 - 6
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Weather;
+using MediaBrowser.Model.Notifications;
+using MediaBrowser.Model.Weather;
 using System;
 using System;
 
 
 namespace MediaBrowser.Model.Configuration
 namespace MediaBrowser.Model.Configuration
@@ -178,8 +179,6 @@ namespace MediaBrowser.Model.Configuration
         /// <value>The encoding quality.</value>
         /// <value>The encoding quality.</value>
         public EncodingQuality MediaEncodingQuality { get; set; }
         public EncodingQuality MediaEncodingQuality { get; set; }
 
 
-        public bool AllowVideoUpscaling { get; set; }
-
         public MetadataOptions[] MetadataOptions { get; set; }
         public MetadataOptions[] MetadataOptions { get; set; }
 
 
         public bool EnableDebugEncodingLogging { get; set; }
         public bool EnableDebugEncodingLogging { get; set; }
@@ -268,10 +267,7 @@ namespace MediaBrowser.Model.Configuration
                 new MetadataOptions(0, 1280) {ItemType = "Season"}
                 new MetadataOptions(0, 1280) {ItemType = "Season"}
             };
             };
 
 
-            NotificationOptions = new NotificationOptions();
-
             SubtitleOptions = new SubtitleOptions();
             SubtitleOptions = new SubtitleOptions();
-
             LiveTvOptions = new LiveTvOptions();
             LiveTvOptions = new LiveTvOptions();
             TvFileOrganizationOptions = new TvFileOrganizationOptions();
             TvFileOrganizationOptions = new TvFileOrganizationOptions();
         }
         }

+ 4 - 4
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -88,11 +88,11 @@
     <Compile Include="Configuration\MetadataOptions.cs" />
     <Compile Include="Configuration\MetadataOptions.cs" />
     <Compile Include="Configuration\MetadataPluginSummary.cs" />
     <Compile Include="Configuration\MetadataPluginSummary.cs" />
     <Compile Include="Configuration\MetadataPluginType.cs" />
     <Compile Include="Configuration\MetadataPluginType.cs" />
-    <Compile Include="Configuration\NotificationOption.cs" />
-    <Compile Include="Configuration\NotificationOptions.cs" />
-    <Compile Include="Configuration\NotificationType.cs" />
+    <Compile Include="Notifications\NotificationOption.cs" />
+    <Compile Include="Notifications\NotificationOptions.cs" />
+    <Compile Include="Notifications\NotificationType.cs" />
     <Compile Include="Configuration\PathSubstitution.cs" />
     <Compile Include="Configuration\PathSubstitution.cs" />
-    <Compile Include="Configuration\SendToUserType.cs" />
+    <Compile Include="Notifications\SendToUserType.cs" />
     <Compile Include="Configuration\ServerConfiguration.cs" />
     <Compile Include="Configuration\ServerConfiguration.cs" />
     <Compile Include="Configuration\SubtitleOptions.cs" />
     <Compile Include="Configuration\SubtitleOptions.cs" />
     <Compile Include="Configuration\UnratedItem.cs" />
     <Compile Include="Configuration\UnratedItem.cs" />

+ 3 - 1
MediaBrowser.Model/Configuration/NotificationOption.cs → MediaBrowser.Model/Notifications/NotificationOption.cs

@@ -1,4 +1,6 @@
-namespace MediaBrowser.Model.Configuration
+using MediaBrowser.Model.Configuration;
+
+namespace MediaBrowser.Model.Notifications
 {
 {
     public class NotificationOption
     public class NotificationOption
     {
     {

+ 3 - 2
MediaBrowser.Model/Configuration/NotificationOptions.cs → MediaBrowser.Model/Notifications/NotificationOptions.cs

@@ -1,6 +1,7 @@
-using MediaBrowser.Model.Extensions;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Extensions;
 
 
-namespace MediaBrowser.Model.Configuration
+namespace MediaBrowser.Model.Notifications
 {
 {
     public class NotificationOptions
     public class NotificationOptions
     {
     {

+ 1 - 1
MediaBrowser.Model/Configuration/NotificationType.cs → MediaBrowser.Model/Notifications/NotificationType.cs

@@ -1,4 +1,4 @@
-namespace MediaBrowser.Model.Configuration
+namespace MediaBrowser.Model.Notifications
 {
 {
     public enum NotificationType
     public enum NotificationType
     {
     {

+ 1 - 1
MediaBrowser.Model/Configuration/SendToUserType.cs → MediaBrowser.Model/Notifications/SendToUserType.cs

@@ -1,4 +1,4 @@
-namespace MediaBrowser.Model.Configuration
+namespace MediaBrowser.Model.Notifications
 {
 {
     public enum SendToUserType
     public enum SendToUserType
     {
     {

+ 30 - 2
MediaBrowser.Model/Updates/PackageVersionInfo.cs

@@ -1,4 +1,6 @@
-
+using System;
+using System.Runtime.Serialization;
+
 namespace MediaBrowser.Model.Updates
 namespace MediaBrowser.Model.Updates
 {
 {
     /// <summary>
     /// <summary>
@@ -24,6 +26,32 @@ namespace MediaBrowser.Model.Updates
         /// <value>The version STR.</value>
         /// <value>The version STR.</value>
         public string versionStr { get; set; }
         public string versionStr { get; set; }
 
 
+        /// <summary>
+        /// The _version
+        /// </summary>
+        private Version _version;
+        /// <summary>
+        /// Gets or sets the version.
+        /// Had to make this an interpreted property since Protobuf can't handle Version
+        /// </summary>
+        /// <value>The version.</value>
+        [IgnoreDataMember]
+        public Version version
+        {
+            get { return _version ?? (_version = new Version(ValueOrDefault(versionStr, "0.0.0.1"))); }
+        }
+
+        /// <summary>
+        /// Values the or default.
+        /// </summary>
+        /// <param name="str">The STR.</param>
+        /// <param name="def">The def.</param>
+        /// <returns>System.String.</returns>
+        private static string ValueOrDefault(string str, string def)
+        {
+            return string.IsNullOrEmpty(str) ? def : str;
+        }
+
         /// <summary>
         /// <summary>
         /// Gets or sets the classification.
         /// Gets or sets the classification.
         /// </summary>
         /// </summary>
@@ -60,4 +88,4 @@ namespace MediaBrowser.Model.Updates
         /// <value>The target filename.</value>
         /// <value>The target filename.</value>
         public string targetFilename { get; set; }
         public string targetFilename { get; set; }
     }
     }
-}
+}

+ 6 - 0
MediaBrowser.Model/Users/AuthenticationResult.cs

@@ -16,5 +16,11 @@ namespace MediaBrowser.Model.Users
         /// </summary>
         /// </summary>
         /// <value>The session information.</value>
         /// <value>The session information.</value>
         public SessionInfoDto SessionInfo { get; set; }
         public SessionInfoDto SessionInfo { get; set; }
+
+        /// <summary>
+        /// Gets or sets the authentication token.
+        /// </summary>
+        /// <value>The authentication token.</value>
+        public string AuthenticationToken { get; set; }
     }
     }
 }
 }

+ 10 - 15
MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs

@@ -51,13 +51,16 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
 
 
         private void ValidateUser(IRequest req)
         private void ValidateUser(IRequest req)
         {
         {
-            User user = null;
-
             //This code is executed before the service
             //This code is executed before the service
             var auth = AuthorizationContext.GetAuthorizationInfo(req);
             var auth = AuthorizationContext.GetAuthorizationInfo(req);
 
 
-            if (auth != null)
+            if (string.IsNullOrWhiteSpace(auth.Token))
             {
             {
+                // Legacy
+                // TODO: Deprecate this in Oct 2014
+
+                User user = null;
+
                 if (!string.IsNullOrWhiteSpace(auth.UserId))
                 if (!string.IsNullOrWhiteSpace(auth.UserId))
                 {
                 {
                     var userId = auth.UserId;
                     var userId = auth.UserId;
@@ -65,22 +68,14 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
                     user = UserManager.GetUserById(new Guid(userId));
                     user = UserManager.GetUserById(new Guid(userId));
                 }
                 }
 
 
-                string deviceId = auth.DeviceId;
-                string device = auth.Device;
-                string client = auth.Client;
-                string version = auth.Version;
-
-                if (!string.IsNullOrEmpty(client) && !string.IsNullOrEmpty(deviceId) && !string.IsNullOrEmpty(device) && !string.IsNullOrEmpty(version))
+                if (user == null || user.Configuration.IsDisabled)
                 {
                 {
-                    var remoteEndPoint = req.RemoteIp;
-
-                    SessionManager.LogSessionActivity(client, version, deviceId, device, remoteEndPoint, user);
+                    throw new UnauthorizedAccessException("Unauthorized access.");
                 }
                 }
             }
             }
-
-            if (user == null || user.Configuration.IsDisabled)
+            else
             {
             {
-                throw new UnauthorizedAccessException("Unauthorized access.");
+                SessionManager.ValidateSecurityToken(auth.Token);
             }
             }
         }
         }
 
 

+ 2 - 1
MediaBrowser.Server.Implementations/HttpServer/Security/AuthorizationContext.cs

@@ -42,7 +42,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
                 Device = device,
                 Device = device,
                 DeviceId = deviceId,
                 DeviceId = deviceId,
                 UserId = userId,
                 UserId = userId,
-                Version = version
+                Version = version,
+                Token = httpReq.Headers["X-AUTH-TOKEN"]
             };
             };
         }
         }
 
 

+ 7 - 4
MediaBrowser.Server.Implementations/Library/UserManager.cs

@@ -121,17 +121,20 @@ namespace MediaBrowser.Server.Implementations.Library
         /// <summary>
         /// <summary>
         /// Authenticates a User and returns a result indicating whether or not it succeeded
         /// Authenticates a User and returns a result indicating whether or not it succeeded
         /// </summary>
         /// </summary>
-        /// <param name="user">The user.</param>
+        /// <param name="username">The username.</param>
         /// <param name="password">The password.</param>
         /// <param name="password">The password.</param>
         /// <returns>Task{System.Boolean}.</returns>
         /// <returns>Task{System.Boolean}.</returns>
         /// <exception cref="System.ArgumentNullException">user</exception>
         /// <exception cref="System.ArgumentNullException">user</exception>
-        public async Task<bool> AuthenticateUser(User user, string password)
+        /// <exception cref="System.UnauthorizedAccessException"></exception>
+        public async Task<bool> AuthenticateUser(string username, string password)
         {
         {
-            if (user == null)
+            if (string.IsNullOrWhiteSpace(username))
             {
             {
-                throw new ArgumentNullException("user");
+                throw new ArgumentNullException("username");
             }
             }
 
 
+            var user = Users.First(i => string.Equals(username, i.Name, StringComparison.OrdinalIgnoreCase));
+
             if (user.Configuration.IsDisabled)
             if (user.Configuration.IsDisabled)
             {
             {
                 throw new UnauthorizedAccessException(string.Format("The {0} account is currently disabled. Please consult with your administrator.", user.Name));
                 throw new UnauthorizedAccessException(string.Format("The {0} account is currently disabled. Please consult with your administrator.", user.Name));

+ 73 - 52
MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -49,8 +49,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
 
         private readonly List<ILiveTvService> _services = new List<ILiveTvService>();
         private readonly List<ILiveTvService> _services = new List<ILiveTvService>();
 
 
-        private readonly ConcurrentDictionary<string, LiveStreamInfo> _openStreams =
-            new ConcurrentDictionary<string, LiveStreamInfo>();
+        private readonly ConcurrentDictionary<string, LiveStreamData> _openStreams =
+            new ConcurrentDictionary<string, LiveStreamData>();
 
 
         private List<Guid> _channelIdList = new List<Guid>();
         private List<Guid> _channelIdList = new List<Guid>();
         private Dictionary<Guid, LiveTvProgram> _programs = new Dictionary<Guid, LiveTvProgram>();
         private Dictionary<Guid, LiveTvProgram> _programs = new Dictionary<Guid, LiveTvProgram>();
@@ -291,66 +291,69 @@ namespace MediaBrowser.Server.Implementations.LiveTv
         private readonly SemaphoreSlim _liveStreamSemaphore = new SemaphoreSlim(1, 1);
         private readonly SemaphoreSlim _liveStreamSemaphore = new SemaphoreSlim(1, 1);
 
 
         public async Task<LiveStreamInfo> GetRecordingStream(string id, CancellationToken cancellationToken)
         public async Task<LiveStreamInfo> GetRecordingStream(string id, CancellationToken cancellationToken)
+        {
+            return await GetLiveStream(id, false, cancellationToken).ConfigureAwait(false);
+        }
+
+        public async Task<LiveStreamInfo> GetChannelStream(string id, CancellationToken cancellationToken)
+        {
+            return await GetLiveStream(id, true, cancellationToken).ConfigureAwait(false);
+        }
+
+        private async Task<LiveStreamInfo> GetLiveStream(string id, bool isChannel, CancellationToken cancellationToken)
         {
         {
             await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
             await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
 
 
             try
             try
             {
             {
-                var service = ActiveService;
-
-                var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false);
-
-                var recording = recordings.First(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(id));
-
-                var result = await service.GetRecordingStream(recording.Id, cancellationToken).ConfigureAwait(false);
-
-                Sanitize(result);
+                // Avoid implicitly captured closure
+                var itemId = id;
 
 
-                _logger.Debug("Live stream info: " + _json.SerializeToString(result));
+                var stream = _openStreams
+                    .Where(i => string.Equals(i.Value.ItemId, itemId) && isChannel == i.Value.IsChannel)
+                    .Take(1)
+                    .Select(i => i.Value)
+                    .FirstOrDefault();
 
 
-                if (!string.IsNullOrEmpty(result.Id))
+                if (stream != null)
                 {
                 {
-                    _openStreams.AddOrUpdate(result.Id, result, (key, info) => result);
+                    stream.ConsumerCount++;
+                    _logger.Debug("Returning existing live tv stream");
+                    return stream.Info;
                 }
                 }
 
 
-                return result;
-            }
-            catch (Exception ex)
-            {
-                _logger.ErrorException("Error getting recording stream", ex);
-
-                throw;
-            }
-            finally
-            {
-                _liveStreamSemaphore.Release();
-            }
-        }
-
-        public async Task<LiveStreamInfo> GetChannelStream(string id, CancellationToken cancellationToken)
-        {
-            await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
-
-            try
-            {
                 var service = ActiveService;
                 var service = ActiveService;
+                LiveStreamInfo info;
 
 
-                var channel = GetInternalChannel(id);
-
-                _logger.Info("Opening channel stream from {0}, external channel Id: {1}", service.Name, channel.ExternalId);
+                if (isChannel)
+                {
+                    var channel = GetInternalChannel(id);
+                    _logger.Info("Opening channel stream from {0}, external channel Id: {1}", service.Name, channel.ExternalId);
 
 
-                var result = await service.GetChannelStream(channel.ExternalId, cancellationToken).ConfigureAwait(false);
+                    info = await service.GetChannelStream(channel.ExternalId, cancellationToken).ConfigureAwait(false);
+                }
+                else
+                {
+                    var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false);
+                    var recording = recordings.First(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(id));
 
 
-                Sanitize(result);
+                    _logger.Info("Opening recording stream from {0}, external recording Id: {1}", service.Name, recording.Id);
+                    info = await service.GetRecordingStream(recording.Id, cancellationToken).ConfigureAwait(false);
+                }
 
 
-                _logger.Debug("Live stream info: " + _json.SerializeToString(result));
+                Sanitize(info);
 
 
-                if (!string.IsNullOrEmpty(result.Id))
+                var data = new LiveStreamData
                 {
                 {
-                    _openStreams.AddOrUpdate(result.Id, result, (key, info) => result);
-                }
+                    Info = info,
+                    ConsumerCount = 1,
+                    IsChannel = isChannel,
+                    ItemId = id
+                };
 
 
-                return result;
+                _openStreams.AddOrUpdate(info.Id, data, (key, i) => data);
+
+                return info;
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -1597,20 +1600,38 @@ namespace MediaBrowser.Server.Implementations.LiveTv
             };
             };
         }
         }
 
 
+        class LiveStreamData
+        {
+            internal LiveStreamInfo Info;
+            internal int ConsumerCount;
+            internal string ItemId;
+            internal bool IsChannel;
+        }
+
         public async Task CloseLiveStream(string id, CancellationToken cancellationToken)
         public async Task CloseLiveStream(string id, CancellationToken cancellationToken)
         {
         {
             await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
             await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
 
 
-            var service = ActiveService;
-
-            _logger.Info("Closing live stream from {0}, stream Id: {1}", service.Name, id);
-
             try
             try
             {
             {
-                await service.CloseLiveStream(id, cancellationToken).ConfigureAwait(false);
+                var service = ActiveService;
+
+                LiveStreamData data;
+                if (_openStreams.TryGetValue(id, out data))
+                {
+                    if (data.ConsumerCount > 1)
+                    {
+                        data.ConsumerCount--;
+                        _logger.Info("Decrementing live stream client count.");
+                        return;
+                    }
 
 
-                LiveStreamInfo removed;
-                _openStreams.TryRemove(id, out removed);
+                }
+                _openStreams.TryRemove(id, out data);
+
+                _logger.Info("Closing live stream from {0}, stream Id: {1}", service.Name, id);
+
+                await service.CloseLiveStream(id, cancellationToken).ConfigureAwait(false);
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -1662,7 +1683,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
                 {
                 {
                     foreach (var stream in _openStreams.Values.ToList())
                     foreach (var stream in _openStreams.Values.ToList())
                     {
                     {
-                        var task = CloseLiveStream(stream.Id, CancellationToken.None);
+                        var task = CloseLiveStream(stream.Info.Id, CancellationToken.None);
 
 
                         Task.WaitAll(task);
                         Task.WaitAll(task);
                     }
                     }

+ 17 - 1
MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json

@@ -201,5 +201,21 @@
 	"ButtonOpenInNewTab": "Open in new tab",
 	"ButtonOpenInNewTab": "Open in new tab",
 	"ButtonShuffle": "Shuffle",
 	"ButtonShuffle": "Shuffle",
 	"ButtonInstantMix": "Instant mix",
 	"ButtonInstantMix": "Instant mix",
-	"ButtonResume": "Resume"
+	"ButtonResume": "Resume",
+	"HeaderScenes": "Scenes",
+	"HeaderAudioTracks": "Audio Tracks",
+	"LabelUnknownLanguage": "Unknown language",
+	"HeaderSubtitles": "Subtitles",
+	"HeaderVideoQuality": "Video Quality",
+	"MessageErrorPlayingVideo": "There was an error playing the video.",
+	"MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.",
+	"ButtonHome": "Home",
+	"ButtonDashboard": "Dashboard",
+	"ButtonReports": "Reports",
+	"ButtonMetadataManager": "Metadata Manager",
+	"HeaderTime": "Time",
+	"HeaderName": "Name",
+	"HeaderAlbum": "Album",
+	"HeaderAlbumArtist": "Album Artist",
+	"HeaderArtist": "Artist"
 }
 }

+ 1 - 0
MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

@@ -200,6 +200,7 @@
     <Compile Include="News\NewsService.cs" />
     <Compile Include="News\NewsService.cs" />
     <Compile Include="Notifications\CoreNotificationTypes.cs" />
     <Compile Include="Notifications\CoreNotificationTypes.cs" />
     <Compile Include="Notifications\InternalNotificationService.cs" />
     <Compile Include="Notifications\InternalNotificationService.cs" />
+    <Compile Include="Notifications\NotificationConfigurationFactory.cs" />
     <Compile Include="Notifications\NotificationManager.cs" />
     <Compile Include="Notifications\NotificationManager.cs" />
     <Compile Include="Persistence\SqliteChapterRepository.cs" />
     <Compile Include="Persistence\SqliteChapterRepository.cs" />
     <Compile Include="Persistence\SqliteExtensions.cs" />
     <Compile Include="Persistence\SqliteExtensions.cs" />

+ 21 - 0
MediaBrowser.Server.Implementations/Notifications/NotificationConfigurationFactory.cs

@@ -0,0 +1,21 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Model.Notifications;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Server.Implementations.Notifications
+{
+    public class NotificationConfigurationFactory : IConfigurationFactory
+    {
+        public IEnumerable<ConfigurationStore> GetConfigurations()
+        {
+            return new List<ConfigurationStore>
+            {
+                new ConfigurationStore
+                {
+                    Key = "notifications",
+                    ConfigurationType = typeof (NotificationOptions)
+                }
+            };
+        }
+    }
+}

+ 12 - 4
MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
@@ -30,13 +31,18 @@ namespace MediaBrowser.Server.Implementations.Notifications
             _logger = logManager.GetLogger(GetType().Name);
             _logger = logManager.GetLogger(GetType().Name);
         }
         }
 
 
+        private NotificationOptions GetConfiguration()
+        {
+            return _config.GetConfiguration<NotificationOptions>("notifications");
+        }
+
         public Task SendNotification(NotificationRequest request, CancellationToken cancellationToken)
         public Task SendNotification(NotificationRequest request, CancellationToken cancellationToken)
         {
         {
             var notificationType = request.NotificationType;
             var notificationType = request.NotificationType;
 
 
             var options = string.IsNullOrWhiteSpace(notificationType) ?
             var options = string.IsNullOrWhiteSpace(notificationType) ?
                 null :
                 null :
-                _config.Configuration.NotificationOptions.GetOptions(notificationType);
+                GetConfiguration().GetOptions(notificationType);
 
 
             var users = GetUserIds(request, options)
             var users = GetUserIds(request, options)
                 .Except(request.ExcludeUserIds)
                 .Except(request.ExcludeUserIds)
@@ -223,7 +229,7 @@ namespace MediaBrowser.Server.Implementations.Notifications
         private bool IsEnabled(INotificationService service, string notificationType)
         private bool IsEnabled(INotificationService service, string notificationType)
         {
         {
             return string.IsNullOrEmpty(notificationType) ||
             return string.IsNullOrEmpty(notificationType) ||
-                _config.Configuration.NotificationOptions.IsServiceEnabled(service.Name, notificationType);
+                GetConfiguration().IsServiceEnabled(service.Name, notificationType);
         }
         }
 
 
         public void AddParts(IEnumerable<INotificationService> services, IEnumerable<INotificationTypeFactory> notificationTypeFactories)
         public void AddParts(IEnumerable<INotificationService> services, IEnumerable<INotificationTypeFactory> notificationTypeFactories)
@@ -248,9 +254,11 @@ namespace MediaBrowser.Server.Implementations.Notifications
 
 
             }).SelectMany(i => i).ToList();
             }).SelectMany(i => i).ToList();
 
 
+            var config = GetConfiguration();
+
             foreach (var i in list)
             foreach (var i in list)
             {
             {
-                i.Enabled = _config.Configuration.NotificationOptions.IsEnabled(i.Type);
+                i.Enabled = config.IsEnabled(i.Type);
             }
             }
 
 
             return list;
             return list;

+ 27 - 4
MediaBrowser.Server.Implementations/Session/SessionManager.cs

@@ -25,6 +25,7 @@ using System.IO;
 using System.Linq;
 using System.Linq;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using MediaBrowser.Model.Users;
 
 
 namespace MediaBrowser.Server.Implementations.Session
 namespace MediaBrowser.Server.Implementations.Session
 {
 {
@@ -1138,10 +1139,15 @@ namespace MediaBrowser.Server.Implementations.Session
             }
             }
         }
         }
 
 
+        public void ValidateSecurityToken(string token)
+        {
+
+        }
+
         /// <summary>
         /// <summary>
         /// Authenticates the new session.
         /// Authenticates the new session.
         /// </summary>
         /// </summary>
-        /// <param name="user">The user.</param>
+        /// <param name="username">The username.</param>
         /// <param name="password">The password.</param>
         /// <param name="password">The password.</param>
         /// <param name="clientType">Type of the client.</param>
         /// <param name="clientType">Type of the client.</param>
         /// <param name="appVersion">The application version.</param>
         /// <param name="appVersion">The application version.</param>
@@ -1149,17 +1155,34 @@ namespace MediaBrowser.Server.Implementations.Session
         /// <param name="deviceName">Name of the device.</param>
         /// <param name="deviceName">Name of the device.</param>
         /// <param name="remoteEndPoint">The remote end point.</param>
         /// <param name="remoteEndPoint">The remote end point.</param>
         /// <returns>Task{SessionInfo}.</returns>
         /// <returns>Task{SessionInfo}.</returns>
+        /// <exception cref="System.UnauthorizedAccessException">Invalid user or password entered.</exception>
         /// <exception cref="UnauthorizedAccessException"></exception>
         /// <exception cref="UnauthorizedAccessException"></exception>
-        public async Task<SessionInfo> AuthenticateNewSession(User user, string password, string clientType, string appVersion, string deviceId, string deviceName, string remoteEndPoint)
+        public async Task<AuthenticationResult> AuthenticateNewSession(string username, string password, string clientType, string appVersion, string deviceId, string deviceName, string remoteEndPoint)
         {
         {
-            var result = await _userManager.AuthenticateUser(user, password).ConfigureAwait(false);
+            var result = await _userManager.AuthenticateUser(username, password).ConfigureAwait(false);
 
 
             if (!result)
             if (!result)
             {
             {
                 throw new UnauthorizedAccessException("Invalid user or password entered.");
                 throw new UnauthorizedAccessException("Invalid user or password entered.");
             }
             }
 
 
-            return await LogSessionActivity(clientType, appVersion, deviceId, deviceName, remoteEndPoint, user).ConfigureAwait(false);
+            var user = _userManager.Users
+                .First(i => string.Equals(username, i.Name, StringComparison.OrdinalIgnoreCase));
+
+            var session = await LogSessionActivity(clientType,
+                appVersion,
+                deviceId,
+                deviceName,
+                remoteEndPoint,
+                user)
+                .ConfigureAwait(false);
+
+            return new AuthenticationResult
+            {
+                User = _dtoService.GetUserDto(user),
+                SessionInfo = GetSessionInfoDto(session),
+                AuthenticationToken = Guid.NewGuid().ToString("N")
+            };
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 7 - 0
MediaBrowser.ServerApplication/ApplicationHost.cs

@@ -318,6 +318,13 @@ namespace MediaBrowser.ServerApplication
                 saveConfig = true;
                 saveConfig = true;
             }
             }
 
 
+            if (ServerConfigurationManager.Configuration.NotificationOptions != null)
+            {
+                ServerConfigurationManager.SaveConfiguration("notifications", ServerConfigurationManager.Configuration.NotificationOptions);
+                ServerConfigurationManager.Configuration.NotificationOptions = null;
+                saveConfig = true;
+            }
+
             if (saveConfig)
             if (saveConfig)
             {
             {
                 ServerConfigurationManager.SaveConfiguration();
                 ServerConfigurationManager.SaveConfiguration();

+ 2 - 2
MediaBrowser.WebDashboard/Api/DashboardService.cs

@@ -403,7 +403,7 @@ namespace MediaBrowser.WebDashboard.Api
 
 
             var files = new[]
             var files = new[]
                             {
                             {
-                                "thirdparty/jquerymobile-1.4.2/jquery.mobile-1.4.2.min.css",
+                                "thirdparty/jquerymobile-1.4.3/jquery.mobile-1.4.3.min.css",
                                 "css/all.css" + versionString
                                 "css/all.css" + versionString
                             };
                             };
 
 
@@ -449,7 +449,7 @@ namespace MediaBrowser.WebDashboard.Api
 
 
             // jQuery + jQuery mobile
             // jQuery + jQuery mobile
             await AppendResource(memoryStream, "thirdparty/jquery-2.0.3.min.js", newLineBytes).ConfigureAwait(false);
             await AppendResource(memoryStream, "thirdparty/jquery-2.0.3.min.js", newLineBytes).ConfigureAwait(false);
-            await AppendResource(memoryStream, "thirdparty/jquerymobile-1.4.2/jquery.mobile-1.4.2.min.js", newLineBytes).ConfigureAwait(false);
+            await AppendResource(memoryStream, "thirdparty/jquerymobile-1.4.3/jquery.mobile-1.4.3.min.js", newLineBytes).ConfigureAwait(false);
 
 
             await AppendLocalization(memoryStream).ConfigureAwait(false);
             await AppendLocalization(memoryStream).ConfigureAwait(false);
             await memoryStream.WriteAsync(newLineBytes, 0, newLineBytes.Length).ConfigureAwait(false);
             await memoryStream.WriteAsync(newLineBytes, 0, newLineBytes.Length).ConfigureAwait(false);

+ 206 - 203
MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

@@ -815,613 +815,613 @@
     <Content Include="dashboard-ui\thirdparty\jquery.unveil-custom.js">
     <Content Include="dashboard-ui\thirdparty\jquery.unveil-custom.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\ajax-loader.gif">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\ajax-loader.gif">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\action-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\action-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\action-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\action-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\alert-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\alert-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\alert-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\alert-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-d-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-d-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-d-l-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-d-l-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-d-l-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-d-l-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-d-r-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-d-r-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-d-r-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-d-r-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-d-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-d-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-l-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-l-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-l-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-l-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-r-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-r-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-r-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-r-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-u-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-u-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-u-l-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-u-l-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-u-l-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-u-l-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-u-r-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-u-r-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-u-r-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-u-r-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\arrow-u-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\arrow-u-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\audio-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\audio-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\audio-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\audio-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\back-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\back-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\back-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\back-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\bars-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\bars-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\bars-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\bars-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\bullets-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\bullets-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\bullets-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\bullets-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\calendar-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\calendar-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\calendar-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\calendar-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\camera-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\camera-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\camera-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\camera-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\carat-d-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\carat-d-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\carat-d-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\carat-d-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\carat-l-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\carat-l-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\carat-l-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\carat-l-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\carat-r-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\carat-r-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\carat-r-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\carat-r-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\carat-u-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\carat-u-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\carat-u-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\carat-u-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\check-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\check-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\check-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\check-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\clock-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\clock-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\clock-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\clock-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\cloud-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\cloud-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\cloud-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\cloud-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\comment-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\comment-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\comment-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\comment-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\delete-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\delete-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\delete-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\delete-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\edit-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\edit-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\edit-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\edit-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\eye-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\eye-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\eye-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\eye-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\forbidden-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\forbidden-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\forbidden-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\forbidden-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\forward-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\forward-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\forward-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\forward-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\gear-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\gear-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\gear-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\gear-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\grid-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\grid-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\grid-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\grid-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\heart-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\heart-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\heart-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\heart-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\home-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\home-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\home-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\home-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\info-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\info-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\info-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\info-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\location-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\location-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\location-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\location-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\lock-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\lock-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\lock-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\lock-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\mail-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\mail-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\mail-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\mail-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\minus-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\minus-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\minus-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\minus-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\navigation-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\navigation-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\navigation-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\navigation-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\phone-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\phone-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\phone-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\phone-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\plus-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\plus-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\plus-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\plus-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\power-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\power-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\power-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\power-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\recycle-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\recycle-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\recycle-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\recycle-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\refresh-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\refresh-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\refresh-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\refresh-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\search-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\search-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\search-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\search-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\shop-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\shop-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\shop-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\shop-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\star-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\star-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\star-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\star-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\tag-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\tag-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\tag-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\tag-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\user-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\user-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\user-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\user-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\video-black.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\video-black.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-png\video-white.png">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-png\video-white.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\action-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\action-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\action-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\action-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\alert-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\alert-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\alert-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\alert-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-d-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-d-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-d-l-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-d-l-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-d-l-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-d-l-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-d-r-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-d-r-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-d-r-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-d-r-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-d-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-d-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-l-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-l-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-l-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-l-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-r-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-r-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-r-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-r-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-u-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-u-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-u-l-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-u-l-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-u-l-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-u-l-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-u-r-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-u-r-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-u-r-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-u-r-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\arrow-u-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\arrow-u-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\audio-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\audio-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\audio-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\audio-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\back-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\back-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\back-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\back-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\bars-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\bars-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\bars-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\bars-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\bullets-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\bullets-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\bullets-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\bullets-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\calendar-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\calendar-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\calendar-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\calendar-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\camera-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\camera-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\camera-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\camera-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\carat-d-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\carat-d-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\carat-d-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\carat-d-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\carat-l-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\carat-l-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\carat-l-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\carat-l-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\carat-r-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\carat-r-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\carat-r-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\carat-r-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\carat-u-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\carat-u-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\carat-u-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\carat-u-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\check-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\check-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\check-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\check-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\clock-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\clock-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\clock-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\clock-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\cloud-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\cloud-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\cloud-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\cloud-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\comment-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\comment-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\comment-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\comment-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\delete-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\delete-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\delete-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\delete-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\edit-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\edit-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\edit-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\edit-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\eye-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\eye-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\eye-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\eye-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\forbidden-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\forbidden-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\forbidden-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\forbidden-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\forward-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\forward-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\forward-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\forward-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\gear-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\gear-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\gear-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\gear-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\grid-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\grid-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\grid-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\grid-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\heart-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\heart-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\heart-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\heart-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\home-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\home-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\home-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\home-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\info-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\info-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\info-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\info-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\location-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\location-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\location-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\location-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\lock-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\lock-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\lock-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\lock-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\mail-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\mail-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\mail-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\mail-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\minus-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\minus-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\minus-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\minus-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\navigation-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\navigation-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\navigation-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\navigation-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\phone-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\phone-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\phone-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\phone-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\plus-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\plus-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\plus-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\plus-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\power-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\power-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\power-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\power-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\recycle-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\recycle-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\recycle-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\recycle-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\refresh-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\refresh-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\refresh-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\refresh-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\search-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\search-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\search-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\search-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\shop-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\shop-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\shop-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\shop-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\star-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\star-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\star-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\star-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\tag-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\tag-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\tag-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\tag-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\user-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\user-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\user-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\user-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\video-black.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\video-black.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\images\icons-svg\video-white.svg">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\images\icons-svg\video-white.svg">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\jquery.mobile-1.4.2.min.css">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\jquery.mobile-1.4.3.min.css">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
-    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.2\jquery.mobile-1.4.2.min.js">
+    <Content Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\jquery.mobile-1.4.3.min.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     </Content>
     <Content Include="dashboard-ui\thirdparty\jstree1.0\jquery.jstree.min.js">
     <Content Include="dashboard-ui\thirdparty\jstree1.0\jquery.jstree.min.js">
@@ -2144,6 +2144,9 @@
     <None Include="dashboard-ui\css\fonts\RobotoThin.woff">
     <None Include="dashboard-ui\css\fonts\RobotoThin.woff">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     </None>
+    <None Include="dashboard-ui\thirdparty\jquerymobile-1.4.3\jquery.mobile-1.4.3.min.map">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="packages.config" />
     <None Include="packages.config" />
     <None Include="WebMarkupMin.Configuration.xsd">
     <None Include="WebMarkupMin.Configuration.xsd">
       <SubType>Designer</SubType>
       <SubType>Designer</SubType>