From fd3f98384c52a79738aa45af5f55892e204c35cc Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 2 Nov 2019 01:40:41 +0000 Subject: [PATCH] Move server to separate folder. --- DiscImageChef.Server.Task/App.config | 29 + .../DiscImageChef.Server.Task.csproj | 105 + DiscImageChef.Server.Task/Program.cs | 435 + .../Properties/AssemblyInfo.cs | 35 + DiscImageChef.Server.sln | 61 + DiscImageChef.Server/App_Start/Ata.cs | 1498 +++ DiscImageChef.Server/App_Start/RouteConfig.cs | 50 + DiscImageChef.Server/App_Start/ScsiEvpd.cs | 93 + DiscImageChef.Server/App_Start/ScsiInquiry.cs | 1703 +++ .../App_Start/ScsiMmcFeatures.cs | 290 + DiscImageChef.Server/App_Start/ScsiMmcMode.cs | 172 + .../App_Start/ScsiModeSense.cs | 381 + .../App_Start/SscTestedMedia.cs | 70 + .../App_Start/StatsConverter.cs | 364 + DiscImageChef.Server/App_Start/TestedMedia.cs | 306 + .../App_Start/WebApiConfig.cs | 61 + .../Controllers/HomeController.cs | 199 + .../Controllers/ReportController.cs | 474 + .../Controllers/StatsController.cs | 531 + .../Controllers/UpdateController.cs | 98 + .../Controllers/UploadReportController.cs | 195 + .../Controllers/UploadStatsController.cs | 254 + .../DiscImageChef.Server.csproj | 480 + DiscImageChef.Server/Global.asax | 1 + DiscImageChef.Server/Global.asax.cs | 47 + ...1812201613369_InitialMigration.Designer.cs | 29 + .../201812201613369_InitialMigration.cs | 584 + .../201812201613369_InitialMigration.resx | 126 + .../201812220029427_AddStatistics.Designer.cs | 29 + .../201812220029427_AddStatistics.cs | 75 + .../201812220029427_AddStatistics.resx | 126 + ...606592_LinkDeviceStatsToReport.Designer.cs | 29 + ...201812221606592_LinkDeviceStatsToReport.cs | 21 + ...1812221606592_LinkDeviceStatsToReport.resx | 126 + ...812231612080_FixUnsignedFields.Designer.cs | 29 + .../201812231612080_FixUnsignedFields.cs | 81 + .../201812231612080_FixUnsignedFields.resx | 126 + ...entifyInquiryAndModesInReports.Designer.cs | 29 + ...DataForIdentifyInquiryAndModesInReports.cs | 74 + ...taForIdentifyInquiryAndModesInReports.resx | 126 + ...40552109_StoreUsbIdsInDatabase.Designer.cs | 29 + .../201812240552109_StoreUsbIdsInDatabase.cs | 39 + ...201812240552109_StoreUsbIdsInDatabase.resx | 126 + ...2241719441_FixUsbIdsAndIndexes.Designer.cs | 29 + .../201812241719441_FixUsbIdsAndIndexes.cs | 25 + .../201812241719441_FixUsbIdsAndIndexes.resx | 126 + .../201812250223002_AddCdOffsets.Designer.cs | 29 + .../201812250223002_AddCdOffsets.cs | 40 + .../201812250223002_AddCdOffsets.resx | 126 + ...oreMmcGetConfigurationResponse.Designer.cs | 29 + ...556377_StoreMmcGetConfigurationResponse.cs | 17 + ...6377_StoreMmcGetConfigurationResponse.resx | 126 + ...oreReadResultsInReportDatabase.Designer.cs | 29 + ...219066_StoreReadResultsInReportDatabase.cs | 139 + ...9066_StoreReadResultsInReportDatabase.resx | 126 + ...133012_AddMultisessionLeadTest.Designer.cs | 29 + ...201901022133012_AddMultisessionLeadTest.cs | 23 + ...1901022133012_AddMultisessionLeadTest.resx | 126 + ...56_AddOptimalReadMultipleCount.Designer.cs | 29 + ...01030344456_AddOptimalReadMultipleCount.cs | 17 + ...030344456_AddOptimalReadMultipleCount.resx | 126 + ...1359499_AddChangeableScsiModes.Designer.cs | 29 + .../201901081359499_AddChangeableScsiModes.cs | 23 + ...01901081359499_AddChangeableScsiModes.resx | 126 + ...1905252122267_IdForDensityCode.Designer.cs | 29 + .../201905252122267_IdForDensityCode.cs | 34 + .../201905252122267_IdForDensityCode.resx | 126 + ...45072_MakeEntityFrameworkHappy.Designer.cs | 29 + ...01905252245072_MakeEntityFrameworkHappy.cs | 11 + ...905252245072_MakeEntityFrameworkHappy.resx | 32 + .../Migrations/Configuration.cs | 53 + DiscImageChef.Server/Models/CdOffset.cs | 70 + DiscImageChef.Server/Models/Command.cs | 44 + DiscImageChef.Server/Models/Context.cs | 56 + DiscImageChef.Server/Models/Device.cs | 73 + DiscImageChef.Server/Models/DeviceItem.cs | 43 + DiscImageChef.Server/Models/DeviceStat.cs | 47 + DiscImageChef.Server/Models/Filesystem.cs | 44 + DiscImageChef.Server/Models/Filter.cs | 44 + DiscImageChef.Server/Models/Media.cs | 45 + DiscImageChef.Server/Models/MediaFormat.cs | 44 + DiscImageChef.Server/Models/MediaItem.cs | 41 + .../Models/OperatingSystem.cs | 45 + DiscImageChef.Server/Models/Partition.cs | 44 + DiscImageChef.Server/Models/UploadedReport.cs | 65 + DiscImageChef.Server/Models/UsbProduct.cs | 65 + DiscImageChef.Server/Models/UsbVendor.cs | 64 + DiscImageChef.Server/Models/Version.cs | 44 + .../Properties/AssemblyInfo.cs | 35 + DiscImageChef.Server/Reports/.htaccess | 1 + .../Views/Home/CODE_OF_CONDUCT.cshtml | 42 + .../Views/Home/CONTRIBUTING.cshtml | 42 + .../Views/Home/Changelog.cshtml | 42 + .../Views/Home/DONATING.cshtml | 42 + .../Views/Home/ISSUE_TEMPLATE.cshtml | 42 + DiscImageChef.Server/Views/Home/Index.cshtml | 47 + .../Views/Home/PULL_REQUEST_TEMPLATE.cshtml | 42 + DiscImageChef.Server/Views/Home/TODO.cshtml | 42 + DiscImageChef.Server/Views/Report/View.cshtml | 265 + .../Views/Shared/_Layout.cshtml | 110 + DiscImageChef.Server/Views/Stats/Index.cshtml | 706 ++ DiscImageChef.Server/Views/Web.config | 43 + DiscImageChef.Server/Web.Debug.config | 30 + DiscImageChef.Server/Web.Release.config | 31 + DiscImageChef.Server/Web.config | 98 + DiscImageChef.Server/docs/CODE_OF_CONDUCT.md | 1 + DiscImageChef.Server/docs/CONTRIBUTING.md | 1 + DiscImageChef.Server/docs/Changelog.md | 857 ++ DiscImageChef.Server/docs/DONATING.md | 174 + DiscImageChef.Server/docs/ISSUE_TEMPLATE.md | 1 + DiscImageChef.Server/docs/NEEDINFO.md | 1 + .../docs/PULL_REQUEST_TEMPLATE.md | 1 + DiscImageChef.Server/docs/README.md | 254 + DiscImageChef.Server/docs/TODO.md | 83 + DiscImageChef.Server/fonts/.htaccess | 1 + DiscImageChef.Server/fonts/ChicagoFLF.eot | Bin 0 -> 48740 bytes DiscImageChef.Server/fonts/ChicagoFLF.ttf | Bin 0 -> 48580 bytes DiscImageChef.Server/fonts/ChicagoFLF.woff | Bin 0 -> 23560 bytes DiscImageChef.Server/fonts/ChicagoFLF.woff2 | Bin 0 -> 16816 bytes DiscImageChef.Server/fonts/vga_squarepx.eot | Bin 0 -> 72394 bytes DiscImageChef.Server/fonts/vga_squarepx.ttf | Bin 0 -> 72180 bytes DiscImageChef.Server/fonts/vga_squarepx.woff | Bin 0 -> 22724 bytes DiscImageChef.Server/fonts/vga_squarepx.woff2 | Bin 0 -> 15080 bytes DiscImageChef.Server/package-lock.json | 12 + DiscImageChef.Server/package.json | 5 + DiscImageChef.Server/packages.config | 35 + DiscImageChef.Server/styles/_highcharts.scss | 788 ++ DiscImageChef.Server/styles/dos/_colors.scss | 90 + DiscImageChef.Server/styles/dos/_font.scss | 51 + .../styles/dos/_fontstyles.scss | 51 + DiscImageChef.Server/styles/dos/dicserver.css | 9596 +++++++++++++++++ .../styles/dos/dicserver.scss | 87 + .../styles/dos/dicserver_highcharts.css | 930 ++ .../styles/dos/dicserver_highcharts.scss | 55 + DiscImageChef.Server/styles/mac/_colors.scss | 89 + DiscImageChef.Server/styles/mac/_font.scss | 51 + .../styles/mac/_fontstyles.scss | 49 + DiscImageChef.Server/styles/mac/dicserver.css | 9595 ++++++++++++++++ .../styles/mac/dicserver.scss | 88 + .../styles/mac/dicserver_highcharts.css | 933 ++ .../styles/mac/dicserver_highcharts.scss | 55 + 141 files changed, 37891 insertions(+) create mode 100644 DiscImageChef.Server.Task/App.config create mode 100644 DiscImageChef.Server.Task/DiscImageChef.Server.Task.csproj create mode 100644 DiscImageChef.Server.Task/Program.cs create mode 100644 DiscImageChef.Server.Task/Properties/AssemblyInfo.cs create mode 100644 DiscImageChef.Server.sln create mode 100644 DiscImageChef.Server/App_Start/Ata.cs create mode 100644 DiscImageChef.Server/App_Start/RouteConfig.cs create mode 100644 DiscImageChef.Server/App_Start/ScsiEvpd.cs create mode 100644 DiscImageChef.Server/App_Start/ScsiInquiry.cs create mode 100644 DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs create mode 100644 DiscImageChef.Server/App_Start/ScsiMmcMode.cs create mode 100644 DiscImageChef.Server/App_Start/ScsiModeSense.cs create mode 100644 DiscImageChef.Server/App_Start/SscTestedMedia.cs create mode 100644 DiscImageChef.Server/App_Start/StatsConverter.cs create mode 100644 DiscImageChef.Server/App_Start/TestedMedia.cs create mode 100644 DiscImageChef.Server/App_Start/WebApiConfig.cs create mode 100644 DiscImageChef.Server/Controllers/HomeController.cs create mode 100644 DiscImageChef.Server/Controllers/ReportController.cs create mode 100644 DiscImageChef.Server/Controllers/StatsController.cs create mode 100644 DiscImageChef.Server/Controllers/UpdateController.cs create mode 100644 DiscImageChef.Server/Controllers/UploadReportController.cs create mode 100644 DiscImageChef.Server/Controllers/UploadStatsController.cs create mode 100644 DiscImageChef.Server/DiscImageChef.Server.csproj create mode 100644 DiscImageChef.Server/Global.asax create mode 100644 DiscImageChef.Server/Global.asax.cs create mode 100644 DiscImageChef.Server/Migrations/201812201613369_InitialMigration.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812201613369_InitialMigration.cs create mode 100644 DiscImageChef.Server/Migrations/201812201613369_InitialMigration.resx create mode 100644 DiscImageChef.Server/Migrations/201812220029427_AddStatistics.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812220029427_AddStatistics.cs create mode 100644 DiscImageChef.Server/Migrations/201812220029427_AddStatistics.resx create mode 100644 DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.cs create mode 100644 DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.resx create mode 100644 DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.cs create mode 100644 DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.resx create mode 100644 DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs create mode 100644 DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.resx create mode 100644 DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs create mode 100644 DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx create mode 100644 DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs create mode 100644 DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx create mode 100644 DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs create mode 100644 DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx create mode 100644 DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs create mode 100644 DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx create mode 100644 DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.cs create mode 100644 DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.resx create mode 100644 DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.cs create mode 100644 DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.resx create mode 100644 DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.cs create mode 100644 DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.resx create mode 100644 DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.cs create mode 100644 DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.resx create mode 100644 DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.cs create mode 100644 DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.resx create mode 100644 DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.cs create mode 100644 DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.resx create mode 100644 DiscImageChef.Server/Migrations/Configuration.cs create mode 100644 DiscImageChef.Server/Models/CdOffset.cs create mode 100644 DiscImageChef.Server/Models/Command.cs create mode 100644 DiscImageChef.Server/Models/Context.cs create mode 100644 DiscImageChef.Server/Models/Device.cs create mode 100644 DiscImageChef.Server/Models/DeviceItem.cs create mode 100644 DiscImageChef.Server/Models/DeviceStat.cs create mode 100644 DiscImageChef.Server/Models/Filesystem.cs create mode 100644 DiscImageChef.Server/Models/Filter.cs create mode 100644 DiscImageChef.Server/Models/Media.cs create mode 100644 DiscImageChef.Server/Models/MediaFormat.cs create mode 100644 DiscImageChef.Server/Models/MediaItem.cs create mode 100644 DiscImageChef.Server/Models/OperatingSystem.cs create mode 100644 DiscImageChef.Server/Models/Partition.cs create mode 100644 DiscImageChef.Server/Models/UploadedReport.cs create mode 100644 DiscImageChef.Server/Models/UsbProduct.cs create mode 100644 DiscImageChef.Server/Models/UsbVendor.cs create mode 100644 DiscImageChef.Server/Models/Version.cs create mode 100644 DiscImageChef.Server/Properties/AssemblyInfo.cs create mode 100644 DiscImageChef.Server/Reports/.htaccess create mode 100644 DiscImageChef.Server/Views/Home/CODE_OF_CONDUCT.cshtml create mode 100644 DiscImageChef.Server/Views/Home/CONTRIBUTING.cshtml create mode 100644 DiscImageChef.Server/Views/Home/Changelog.cshtml create mode 100644 DiscImageChef.Server/Views/Home/DONATING.cshtml create mode 100644 DiscImageChef.Server/Views/Home/ISSUE_TEMPLATE.cshtml create mode 100644 DiscImageChef.Server/Views/Home/Index.cshtml create mode 100644 DiscImageChef.Server/Views/Home/PULL_REQUEST_TEMPLATE.cshtml create mode 100644 DiscImageChef.Server/Views/Home/TODO.cshtml create mode 100644 DiscImageChef.Server/Views/Report/View.cshtml create mode 100644 DiscImageChef.Server/Views/Shared/_Layout.cshtml create mode 100644 DiscImageChef.Server/Views/Stats/Index.cshtml create mode 100644 DiscImageChef.Server/Views/Web.config create mode 100644 DiscImageChef.Server/Web.Debug.config create mode 100644 DiscImageChef.Server/Web.Release.config create mode 100644 DiscImageChef.Server/Web.config create mode 120000 DiscImageChef.Server/docs/CODE_OF_CONDUCT.md create mode 120000 DiscImageChef.Server/docs/CONTRIBUTING.md create mode 100644 DiscImageChef.Server/docs/Changelog.md create mode 100644 DiscImageChef.Server/docs/DONATING.md create mode 120000 DiscImageChef.Server/docs/ISSUE_TEMPLATE.md create mode 120000 DiscImageChef.Server/docs/NEEDINFO.md create mode 120000 DiscImageChef.Server/docs/PULL_REQUEST_TEMPLATE.md create mode 100644 DiscImageChef.Server/docs/README.md create mode 100644 DiscImageChef.Server/docs/TODO.md create mode 100644 DiscImageChef.Server/fonts/.htaccess create mode 100644 DiscImageChef.Server/fonts/ChicagoFLF.eot create mode 100644 DiscImageChef.Server/fonts/ChicagoFLF.ttf create mode 100644 DiscImageChef.Server/fonts/ChicagoFLF.woff create mode 100644 DiscImageChef.Server/fonts/ChicagoFLF.woff2 create mode 100644 DiscImageChef.Server/fonts/vga_squarepx.eot create mode 100644 DiscImageChef.Server/fonts/vga_squarepx.ttf create mode 100644 DiscImageChef.Server/fonts/vga_squarepx.woff create mode 100644 DiscImageChef.Server/fonts/vga_squarepx.woff2 create mode 100644 DiscImageChef.Server/package-lock.json create mode 100644 DiscImageChef.Server/package.json create mode 100644 DiscImageChef.Server/packages.config create mode 100644 DiscImageChef.Server/styles/_highcharts.scss create mode 100644 DiscImageChef.Server/styles/dos/_colors.scss create mode 100644 DiscImageChef.Server/styles/dos/_font.scss create mode 100644 DiscImageChef.Server/styles/dos/_fontstyles.scss create mode 100644 DiscImageChef.Server/styles/dos/dicserver.css create mode 100644 DiscImageChef.Server/styles/dos/dicserver.scss create mode 100644 DiscImageChef.Server/styles/dos/dicserver_highcharts.css create mode 100644 DiscImageChef.Server/styles/dos/dicserver_highcharts.scss create mode 100644 DiscImageChef.Server/styles/mac/_colors.scss create mode 100644 DiscImageChef.Server/styles/mac/_font.scss create mode 100644 DiscImageChef.Server/styles/mac/_fontstyles.scss create mode 100644 DiscImageChef.Server/styles/mac/dicserver.css create mode 100644 DiscImageChef.Server/styles/mac/dicserver.scss create mode 100644 DiscImageChef.Server/styles/mac/dicserver_highcharts.css create mode 100644 DiscImageChef.Server/styles/mac/dicserver_highcharts.scss diff --git a/DiscImageChef.Server.Task/App.config b/DiscImageChef.Server.Task/App.config new file mode 100644 index 00000000..4980456b --- /dev/null +++ b/DiscImageChef.Server.Task/App.config @@ -0,0 +1,29 @@ + + + + + +
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server.Task/DiscImageChef.Server.Task.csproj b/DiscImageChef.Server.Task/DiscImageChef.Server.Task.csproj new file mode 100644 index 00000000..8821ad18 --- /dev/null +++ b/DiscImageChef.Server.Task/DiscImageChef.Server.Task.csproj @@ -0,0 +1,105 @@ + + + + + Debug + AnyCPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2} + Exe + Properties + DiscImageChef.Server.Task + DiscImageChef.Server.Task + v4.7.1 + true + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\..\..\tmp\claunia-temp-aspnet-0\e277a754\assembly\shadow\34ef13c2\840cc539_b0e3d6fb_00000001\DiscImageChef.CommonTypes.dll + + + ..\..\..\..\..\tmp\claunia-temp-aspnet-0\e277a754\assembly\shadow\3a88f867\8a6b2e9c_b0e3d6fb_00000001\DiscImageChef.Decoders.dll + + + ..\..\..\.nuget\packages\entityframework\6.2.0\lib\net45\EntityFramework.dll + + + + + + + + + + + + + {f8bdf57b-1571-4cd0-84b3-b422088d359a} + DiscImageChef.Helpers + + + {911addf5-e5fa-445d-88cd-c7f8ffdbe645} + DiscImageChef.Server + + + + + + + + + + + + LICENSE.LGPL + + + + + + + + + /Library/Frameworks/Mono.framework/Versions/Current/lib/mono + /usr/lib/mono + /usr/local/lib/mono + + $(BaseFrameworkPathOverrideForMono)/4.0-api + $(BaseFrameworkPathOverrideForMono)/4.5-api + $(BaseFrameworkPathOverrideForMono)/4.5.1-api + $(BaseFrameworkPathOverrideForMono)/4.5.2-api + $(BaseFrameworkPathOverrideForMono)/4.6-api + $(BaseFrameworkPathOverrideForMono)/4.6.1-api + $(BaseFrameworkPathOverrideForMono)/4.6.2-api + $(BaseFrameworkPathOverrideForMono)/4.7-api + $(BaseFrameworkPathOverrideForMono)/4.7.1-api + true + + $(FrameworkPathOverride)/Facades;$(AssemblySearchPaths) + + \ No newline at end of file diff --git a/DiscImageChef.Server.Task/Program.cs b/DiscImageChef.Server.Task/Program.cs new file mode 100644 index 00000000..5041ec53 --- /dev/null +++ b/DiscImageChef.Server.Task/Program.cs @@ -0,0 +1,435 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Program.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server Task. +// +// --[ Description ] ---------------------------------------------------------- +// +// Runs time consuming server tasks. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Data.Entity.Migrations; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using DiscImageChef.Server.Migrations; +using DiscImageChef.Server.Models; +using HtmlAgilityPack; + +namespace DiscImageChef.Server.Task +{ + class Program + { + public static void Main(string[] args) + { + DateTime start, end; + Console.WriteLine("{0}: Migrating database to latest version...", DateTime.UtcNow); + start = DateTime.UtcNow; + Configuration migratorConfig = new Configuration(); + DbMigrator dbMigrator = new DbMigrator(migratorConfig); + dbMigrator.Update(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", DateTime.UtcNow, (end - start).TotalSeconds); + + start = DateTime.UtcNow; + Console.WriteLine("{0}: Connecting to database...", DateTime.UtcNow); + DicServerContext ctx = new DicServerContext(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + WebClient client; + + try + { + Console.WriteLine("{0}: Retrieving USB IDs from Linux USB...", DateTime.UtcNow); + start = DateTime.UtcNow; + client = new WebClient(); + StringReader sr = new StringReader(client.DownloadString("http://www.linux-usb.org/usb.ids")); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + UsbVendor vendor = null; + int newVendors = 0; + int newProducts = 0; + int modifiedVendors = 0; + int modifiedProducts = 0; + int counter = 0; + + start = DateTime.UtcNow; + Console.WriteLine("{0}: Adding and updating database entries...", DateTime.UtcNow); + do + { + if(counter == 1000) + { + DateTime start2 = DateTime.UtcNow; + Console.WriteLine("{0}: Saving changes", start2); + ctx.SaveChanges(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start2).TotalSeconds); + counter = 0; + } + + string line = sr.ReadLine(); + + if(line is null) break; + + if(line.Length == 0 || line[0] == '#') continue; + + ushort number; + string name; + if(line[0] == '\t') + { + try { number = Convert.ToUInt16(line.Substring(1, 4), 16); } + catch(FormatException) { continue; } + + if(number == 0) continue; + + name = line.Substring(7); + + UsbProduct product = + ctx.UsbProducts.FirstOrDefault(p => p.ProductId == number && p.Vendor != null && + p.Vendor.VendorId == vendor.VendorId); + + if(product is null) + { + product = new UsbProduct(vendor, number, name); + ctx.UsbProducts.Add(product); + Console.WriteLine("{0}: Will add product {1} with ID {2:X4} and vendor {3} ({4:X4})", + DateTime.UtcNow, product.Product, product.ProductId, + product.Vendor?.Vendor ?? "null", product.Vendor?.VendorId ?? 0); + newProducts++; + counter++; + } + else if(name != product.Product) + { + Console + .WriteLine("{0}: Will modify product with ID {1:X4} and vendor {2} ({3:X4}) from \"{4}\" to \"{5}\"", + DateTime.UtcNow, product.ProductId, product.Vendor?.Vendor ?? "null", + product.Vendor?.VendorId ?? 0, + product.Product, name); + product.Product = name; + product.ModifiedWhen = DateTime.UtcNow; + modifiedProducts++; + counter++; + } + + continue; + } + + try { number = Convert.ToUInt16(line.Substring(0, 4), 16); } + catch(FormatException) { continue; } + + if(number == 0) continue; + + name = line.Substring(6); + + vendor = ctx.UsbVendors.FirstOrDefault(v => v.VendorId == number); + + if(vendor is null) + { + vendor = new UsbVendor(number, name); + ctx.UsbVendors.Add(vendor); + Console.WriteLine("{0}: Will add vendor {1} with ID {2:X4}", DateTime.UtcNow, vendor.Vendor, + vendor.VendorId); + newVendors++; + counter++; + } + else if(name != vendor.Vendor) + { + Console.WriteLine("{0}: Will modify vendor with ID {1:X4} from \"{2}\" to \"{3}\"", + DateTime.UtcNow, vendor.VendorId, vendor.Vendor, name); + vendor.Vendor = name; + vendor.ModifiedWhen = DateTime.UtcNow; + modifiedVendors++; + counter++; + } + } + while(true); + + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Saving database changes...", DateTime.UtcNow); + start = DateTime.UtcNow; + ctx.SaveChanges(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: {1} vendors added.", DateTime.UtcNow, newVendors); + Console.WriteLine("{0}: {1} products added.", DateTime.UtcNow, newProducts); + Console.WriteLine("{0}: {1} vendors modified.", DateTime.UtcNow, modifiedVendors); + Console.WriteLine("{0}: {1} products modified.", DateTime.UtcNow, modifiedProducts); + + Console.WriteLine("{0}: Looking up a vendor", DateTime.UtcNow); + start = DateTime.UtcNow; + vendor = ctx.UsbVendors.FirstOrDefault(v => v.VendorId == 0x8086); + if(vendor is null) Console.WriteLine("{0}: Error, could not find vendor.", DateTime.UtcNow); + else + Console.WriteLine("{0}: Found {1}.", DateTime.UtcNow, + vendor.Vendor); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Looking up a product", DateTime.UtcNow); + start = DateTime.UtcNow; + UsbProduct prd = + ctx.UsbProducts.FirstOrDefault(p => p.ProductId == 0x0001 && p.Vendor.VendorId == 0x8086); + if(prd is null) Console.WriteLine("{0}: Error, could not find product.", DateTime.UtcNow); + else Console.WriteLine("{0}: Found {1}.", DateTime.UtcNow, prd.Product); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + } + catch(Exception ex) + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + Console.WriteLine("{0}: Exception {1} filling USB IDs...", DateTime.UtcNow, ex); + } + + Console.WriteLine("{0}: Fixing all devices without modification time...", DateTime.UtcNow); + start = DateTime.UtcNow; + foreach(Device device in ctx.Devices.Where(d => d.ModifiedWhen == null)) + device.ModifiedWhen = device.AddedWhen; + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Committing changes...", DateTime.UtcNow); + start = DateTime.UtcNow; + ctx.SaveChanges(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + try + { + Console.WriteLine("{0}: Retrieving CompactDisc read offsets from AccurateRip...", DateTime.UtcNow); + start = DateTime.UtcNow; + + client = new WebClient(); + string html = client.DownloadString("http://www.accuraterip.com/driveoffsets.htm"); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + // The HTML is too malformed to process easily, so find start of table + html = "" + + html.Substring(html.IndexOf("
", StringComparison.Ordinal)); + + HtmlDocument doc = new HtmlDocument(); + doc.LoadHtml(html); + HtmlNode firstTable = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/table[1]"); + + bool firstRow = true; + + int addedOffsets = 0; + int modifiedOffsets = 0; + + Console.WriteLine("{0}: Processing offsets...", DateTime.UtcNow); + start = DateTime.UtcNow; + foreach(HtmlNode row in firstTable.Descendants("tr")) + { + HtmlNode[] columns = row.Descendants("td").ToArray(); + + if(columns.Length != 4) + { + Console.WriteLine("{0}: Row does not have correct number of columns...", DateTime.UtcNow); + continue; + } + + string column0 = columns[0].InnerText; + string column1 = columns[1].InnerText; + string column2 = columns[2].InnerText; + string column3 = columns[3].InnerText; + + if(firstRow) + { + if(column0.ToLowerInvariant() != "cd drive") + { + Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow, + columns[0].InnerText); + break; + } + + if(column1.ToLowerInvariant() != "correction offset") + { + Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow, + columns[1].InnerText); + break; + } + + if(column2.ToLowerInvariant() != "submitted by") + { + Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow, + columns[2].InnerText); + break; + } + + if(column3.ToLowerInvariant() != "percentage agree") + { + Console.WriteLine("{0}: Unexpected header \"{1}\" found...", DateTime.UtcNow, + columns[3].InnerText); + break; + } + + firstRow = false; + continue; + } + + string manufacturer; + string model; + + if(column0[0] == '-' && column0[1] == ' ') + { + manufacturer = null; + model = column0.Substring(2).Trim(); + } + else + { + int cutOffset = column0.IndexOf(" - ", StringComparison.Ordinal); + + if(cutOffset == -1) + { + manufacturer = null; + model = column0; + } + else + { + manufacturer = column0.Substring(0, cutOffset).Trim(); + model = column0.Substring(cutOffset + 3).Trim(); + } + } + + switch(manufacturer) + { + case "Lite-ON": + manufacturer = "JLMS"; + break; + case "LG Electronics": + manufacturer = "HL-DT-ST"; + break; + case "Panasonic": + manufacturer = "MATSHITA"; + break; + } + + CompactDiscOffset cdOffset = + ctx.CdOffsets.FirstOrDefault(o => o.Manufacturer == manufacturer && o.Model == model); + + if(column1.ToLowerInvariant() == "[purged]") + { + if(cdOffset != null) ctx.CdOffsets.Remove(cdOffset); + continue; + } + + if(!short.TryParse(column1, out short offset)) continue; + if(!int.TryParse(column2, out int submissions)) continue; + + if(column3[column3.Length - 1] != '%') continue; + + column3 = column3.Substring(0, column3.Length - 1); + + if(!float.TryParse(column3, out float percentage)) continue; + + percentage /= 100; + + if(cdOffset is null) + { + cdOffset = new CompactDiscOffset + { + AddedWhen = DateTime.UtcNow, + ModifiedWhen = DateTime.UtcNow, + Agreement = percentage, + Manufacturer = manufacturer, + Model = model, + Offset = offset, + Submissions = submissions + }; + + ctx.CdOffsets.Add(cdOffset); + addedOffsets++; + } + else + { + if(Math.Abs(cdOffset.Agreement - percentage) > 0) + { + cdOffset.Agreement = percentage; + cdOffset.ModifiedWhen = DateTime.UtcNow; + } + + if(cdOffset.Offset != offset) + { + cdOffset.Offset = offset; + cdOffset.ModifiedWhen = DateTime.UtcNow; + } + + if(cdOffset.Submissions != submissions) + { + cdOffset.Submissions = submissions; + cdOffset.ModifiedWhen = DateTime.UtcNow; + } + + if(Math.Abs(cdOffset.Agreement - percentage) > 0 || cdOffset.Offset != offset || + cdOffset.Submissions != submissions) modifiedOffsets++; + } + + foreach(Device device in ctx + .Devices + .Where(d => d.Manufacturer == null && d.Model != null && + d.Model.Trim() == model) + .Union(ctx.Devices.Where(d => d.Manufacturer != null && + d.Manufacturer.Trim() == manufacturer && + d.Model != null && + d.Model == model))) + { + if(device.CdOffset == cdOffset && device.ModifiedWhen == cdOffset.ModifiedWhen) continue; + + device.CdOffset = cdOffset; + device.ModifiedWhen = cdOffset.ModifiedWhen; + } + } + + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Committing changes...", DateTime.UtcNow); + start = DateTime.UtcNow; + ctx.SaveChanges(); + end = DateTime.UtcNow; + Console.WriteLine("{0}: Took {1:F2} seconds", end, (end - start).TotalSeconds); + + Console.WriteLine("{0}: Added {1} offsets", end, addedOffsets); + Console.WriteLine("{0}: Modified {1} offsets", end, modifiedOffsets); + } + catch(Exception ex) + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + Console.WriteLine("{0}: Exception {1} filling CompactDisc read offsets...", DateTime.UtcNow, ex); + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server.Task/Properties/AssemblyInfo.cs b/DiscImageChef.Server.Task/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..0952c4ca --- /dev/null +++ b/DiscImageChef.Server.Task/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DiscImageChef.Server.Task")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DiscImageChef.Server.Task")] +[assembly: AssemblyCopyright("Copyright © 2011-2019 Natalia Portillo")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("4.5.99.1693")] +[assembly: AssemblyFileVersion("4.5.99.1693")] \ No newline at end of file diff --git a/DiscImageChef.Server.sln b/DiscImageChef.Server.sln new file mode 100644 index 00000000..e532070e --- /dev/null +++ b/DiscImageChef.Server.sln @@ -0,0 +1,61 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28922.388 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Server", "DiscImageChef.Server\DiscImageChef.Server.csproj", "{911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.CommonTypes", "DiscImageChef.CommonTypes\DiscImageChef.CommonTypes.csproj", "{F2B84194-26EB-4227-B1C5-6602517E85AE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.Decoders", "DiscImageChef.Decoders\DiscImageChef.Decoders.csproj", "{0BEB3088-B634-4289-AE17-CDF2D25D00D5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.Dto", "DiscImageChef.Dto\DiscImageChef.Dto.csproj", "{F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.Helpers", "DiscImageChef.Helpers\DiscImageChef.Helpers.csproj", "{F8BDF57B-1571-4CD0-84B3-B422088D359A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DiscImageChef.Console", "DiscImageChef.Console\DiscImageChef.Console.csproj", "{CCAA7AFE-C094-4D82-A66D-630DE8A3F545}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Server.Task", "DiscImageChef.Server.Task\DiscImageChef.Server.Task.csproj", "{79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}.Debug|Any CPU.Build.0 = Debug|Any CPU + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}.Release|Any CPU.ActiveCfg = Release|Any CPU + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645}.Release|Any CPU.Build.0 = Release|Any CPU + {F2B84194-26EB-4227-B1C5-6602517E85AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2B84194-26EB-4227-B1C5-6602517E85AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2B84194-26EB-4227-B1C5-6602517E85AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2B84194-26EB-4227-B1C5-6602517E85AE}.Release|Any CPU.Build.0 = Release|Any CPU + {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0BEB3088-B634-4289-AE17-CDF2D25D00D5}.Release|Any CPU.Build.0 = Release|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Release|Any CPU.Build.0 = Release|Any CPU + {F8BDF57B-1571-4CD0-84B3-B422088D359A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8BDF57B-1571-4CD0-84B3-B422088D359A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8BDF57B-1571-4CD0-84B3-B422088D359A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8BDF57B-1571-4CD0-84B3-B422088D359A}.Release|Any CPU.Build.0 = Release|Any CPU + {CCAA7AFE-C094-4D82-A66D-630DE8A3F545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCAA7AFE-C094-4D82-A66D-630DE8A3F545}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCAA7AFE-C094-4D82-A66D-630DE8A3F545}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCAA7AFE-C094-4D82-A66D-630DE8A3F545}.Release|Any CPU.Build.0 = Release|Any CPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8A988A8F-0588-4935-AAB6-64E34A68CE30} + EndGlobalSection +EndGlobal diff --git a/DiscImageChef.Server/App_Start/Ata.cs b/DiscImageChef.Server/App_Start/Ata.cs new file mode 100644 index 00000000..fb793c88 --- /dev/null +++ b/DiscImageChef.Server/App_Start/Ata.cs @@ -0,0 +1,1498 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Ata.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes ATA information from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.ATA; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + public static class Ata + { + /// + /// Takes the ATA part of a device report and prints it as a list of values and another list of key=value pairs to be + /// sequenced by ASP.NET in the rendering + /// + /// ATA part of a device report + /// true if compact flash device + /// true if atapi device + /// true if removable device + /// List to put values on + /// List to put key=value pairs on + /// List of tested media + public static void Report(CommonTypes.Metadata.Ata ataReport, bool cfa, bool atapi, + ref bool removable, + ref List ataOneValue, ref Dictionary ataTwoValue, + ref List testedMedia) + { + uint logicalsectorsize = 0; + + Identify.IdentifyDevice? ataIdentifyNullable = Identify.Decode(ataReport.Identify); + if(!ataIdentifyNullable.HasValue) return; + + Identify.IdentifyDevice ataIdentify = ataIdentifyNullable.Value; + + if(!string.IsNullOrEmpty(ataIdentify.Model)) ataTwoValue.Add("Model", ataIdentify.Model); + if(!string.IsNullOrEmpty(ataIdentify.FirmwareRevision)) + ataTwoValue.Add("Firmware revision", ataIdentify.FirmwareRevision); + if(!string.IsNullOrEmpty(ataIdentify.AdditionalPID)) + ataTwoValue.Add("Additional product ID", ataIdentify.AdditionalPID); + + bool ata1 = false, + ata2 = false, + ata3 = false, + ata4 = false, + ata5 = false, + ata6 = false, + ata7 = false, + acs = false, + acs2 = false, + acs3 = false, + acs4 = false; + + if((ushort)ataIdentify.MajorVersion == 0x0000 || (ushort)ataIdentify.MajorVersion == 0xFFFF) + { + // Obsolete in ATA-2, if present, device supports ATA-1 + ata1 |= ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.FastIDE) || + ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SlowIDE) || + ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.UltraFastIDE); + + ata2 |= ataIdentify.ExtendedIdentify.HasFlag(Identify.ExtendedIdentifyBit.Words54to58Valid) || + ataIdentify.ExtendedIdentify.HasFlag(Identify.ExtendedIdentifyBit.Words64to70Valid) || + ataIdentify.ExtendedIdentify.HasFlag(Identify.ExtendedIdentifyBit.Word88Valid); + + if(!ata1 && !ata2 && !atapi && !cfa) ata2 = true; + + ata4 |= atapi; + ata3 |= cfa; + + if(cfa && ata1) ata1 = false; + if(cfa && ata2) ata2 = false; + } + else + { + ata1 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata1); + ata2 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata2); + ata3 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata3); + ata4 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi4); + ata5 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi5); + ata6 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi6); + ata7 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.AtaAtapi7); + acs |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.Ata8ACS); + acs2 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.ACS2); + acs3 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.ACS3); + acs4 |= ataIdentify.MajorVersion.HasFlag(Identify.MajorVersionBit.ACS4); + } + + int maxatalevel = 0; + int minatalevel = 255; + string tmpString = ""; + if(ata1) + { + tmpString += "ATA-1 "; + maxatalevel = 1; + if(minatalevel > 1) minatalevel = 1; + } + + if(ata2) + { + tmpString += "ATA-2 "; + maxatalevel = 2; + if(minatalevel > 2) minatalevel = 2; + } + + if(ata3) + { + tmpString += "ATA-3 "; + maxatalevel = 3; + if(minatalevel > 3) minatalevel = 3; + } + + if(ata4) + { + tmpString += "ATA/ATAPI-4 "; + maxatalevel = 4; + if(minatalevel > 4) minatalevel = 4; + } + + if(ata5) + { + tmpString += "ATA/ATAPI-5 "; + maxatalevel = 5; + if(minatalevel > 5) minatalevel = 5; + } + + if(ata6) + { + tmpString += "ATA/ATAPI-6 "; + maxatalevel = 6; + if(minatalevel > 6) minatalevel = 6; + } + + if(ata7) + { + tmpString += "ATA/ATAPI-7 "; + maxatalevel = 7; + if(minatalevel > 7) minatalevel = 7; + } + + if(acs) + { + tmpString += "ATA8-ACS "; + maxatalevel = 8; + if(minatalevel > 8) minatalevel = 8; + } + + if(acs2) + { + tmpString += "ATA8-ACS2 "; + maxatalevel = 9; + if(minatalevel > 9) minatalevel = 9; + } + + if(acs3) + { + tmpString += "ATA8-ACS3 "; + maxatalevel = 10; + if(minatalevel > 10) minatalevel = 10; + } + + if(acs4) + { + tmpString += "ATA8-ACS4 "; + maxatalevel = 11; + if(minatalevel > 11) minatalevel = 11; + } + + if(tmpString != "") ataTwoValue.Add("Supported ATA versions", tmpString); + + if(maxatalevel >= 3) + { + switch(ataIdentify.MinorVersion) + { + case 0x0000: + case 0xFFFF: + tmpString = "Minor ATA version not specified"; + break; + case 0x0001: + tmpString = "ATA (ATA-1) X3T9.2 781D prior to revision 4"; + break; + case 0x0002: + tmpString = "ATA-1 published, ANSI X3.221-1994"; + break; + case 0x0003: + tmpString = "ATA (ATA-1) X3T9.2 781D revision 4"; + break; + case 0x0004: + tmpString = "ATA-2 published, ANSI X3.279-1996"; + break; + case 0x0005: + tmpString = "ATA-2 X3T10 948D prior to revision 2k"; + break; + case 0x0006: + tmpString = "ATA-3 X3T10 2008D revision 1"; + break; + case 0x0007: + tmpString = "ATA-2 X3T10 948D revision 2k"; + break; + case 0x0008: + tmpString = "ATA-3 X3T10 2008D revision 0"; + break; + case 0x0009: + tmpString = "ATA-2 X3T10 948D revision 3"; + break; + case 0x000A: + tmpString = "ATA-3 published, ANSI X3.298-1997"; + break; + case 0x000B: + tmpString = "ATA-3 X3T10 2008D revision 6"; + break; + case 0x000C: + tmpString = "ATA-3 X3T13 2008D revision 7"; + break; + case 0x000D: + tmpString = "ATA/ATAPI-4 X3T13 1153D revision 6"; + break; + case 0x000E: + tmpString = "ATA/ATAPI-4 T13 1153D revision 13"; + break; + case 0x000F: + tmpString = "ATA/ATAPI-4 X3T13 1153D revision 7"; + break; + case 0x0010: + tmpString = "ATA/ATAPI-4 T13 1153D revision 18"; + break; + case 0x0011: + tmpString = "ATA/ATAPI-4 T13 1153D revision 15"; + break; + case 0x0012: + tmpString = "ATA/ATAPI-4 published, ANSI INCITS 317-1998"; + break; + case 0x0013: + tmpString = "ATA/ATAPI-5 T13 1321D revision 3"; + break; + case 0x0014: + tmpString = "ATA/ATAPI-4 T13 1153D revision 14"; + break; + case 0x0015: + tmpString = "ATA/ATAPI-5 T13 1321D revision 1"; + break; + case 0x0016: + tmpString = "ATA/ATAPI-5 published, ANSI INCITS 340-2000"; + break; + case 0x0017: + tmpString = "ATA/ATAPI-4 T13 1153D revision 17"; + break; + case 0x0018: + tmpString = "ATA/ATAPI-6 T13 1410D revision 0"; + break; + case 0x0019: + tmpString = "ATA/ATAPI-6 T13 1410D revision 3a"; + break; + case 0x001A: + tmpString = "ATA/ATAPI-7 T13 1532D revision 1"; + break; + case 0x001B: + tmpString = "ATA/ATAPI-6 T13 1410D revision 2"; + break; + case 0x001C: + tmpString = "ATA/ATAPI-6 T13 1410D revision 1"; + break; + case 0x001D: + tmpString = "ATA/ATAPI-7 published ANSI INCITS 397-2005"; + break; + case 0x001E: + tmpString = "ATA/ATAPI-7 T13 1532D revision 0"; + break; + case 0x001F: + tmpString = "ACS-3 Revision 3b"; + break; + case 0x0021: + tmpString = "ATA/ATAPI-7 T13 1532D revision 4a"; + break; + case 0x0022: + tmpString = "ATA/ATAPI-6 published, ANSI INCITS 361-2002"; + break; + case 0x0027: + tmpString = "ATA8-ACS revision 3c"; + break; + case 0x0028: + tmpString = "ATA8-ACS revision 6"; + break; + case 0x0029: + tmpString = "ATA8-ACS revision 4"; + break; + case 0x0031: + tmpString = "ACS-2 Revision 2"; + break; + case 0x0033: + tmpString = "ATA8-ACS Revision 3e"; + break; + case 0x0039: + tmpString = "ATA8-ACS Revision 4c"; + break; + case 0x0042: + tmpString = "ATA8-ACS Revision 3f"; + break; + case 0x0052: + tmpString = "ATA8-ACS revision 3b"; + break; + case 0x006D: + tmpString = "ACS-3 Revision 5"; + break; + case 0x0082: + tmpString = "ACS-2 published, ANSI INCITS 482-2012"; + break; + case 0x0107: + tmpString = "ATA8-ACS revision 2d"; + break; + case 0x0110: + tmpString = "ACS-2 Revision 3"; + break; + case 0x011B: + tmpString = "ACS-3 Revision 4"; + break; + default: + tmpString = $"Unknown ATA revision 0x{ataIdentify.MinorVersion:X4}"; + break; + } + + ataTwoValue.Add("Maximum ATA revision supported", tmpString); + } + + tmpString = ""; + switch((ataIdentify.TransportMajorVersion & 0xF000) >> 12) + { + case 0x0: + if((ataIdentify.TransportMajorVersion & 0x0002) == 0x0002) tmpString += "ATA/ATAPI-7 "; + if((ataIdentify.TransportMajorVersion & 0x0001) == 0x0001) tmpString += "ATA8-APT "; + ataTwoValue.Add("Parallel ATA device", tmpString); + break; + case 0x1: + if((ataIdentify.TransportMajorVersion & 0x0001) == 0x0001) tmpString += "ATA8-AST "; + if((ataIdentify.TransportMajorVersion & 0x0002) == 0x0002) tmpString += "SATA 1.0a "; + if((ataIdentify.TransportMajorVersion & 0x0004) == 0x0004) tmpString += "SATA II Extensions "; + if((ataIdentify.TransportMajorVersion & 0x0008) == 0x0008) tmpString += "SATA 2.5 "; + if((ataIdentify.TransportMajorVersion & 0x0010) == 0x0010) tmpString += "SATA 2.6 "; + if((ataIdentify.TransportMajorVersion & 0x0020) == 0x0020) tmpString += "SATA 3.0 "; + if((ataIdentify.TransportMajorVersion & 0x0040) == 0x0040) tmpString += "SATA 3.1 "; + ataTwoValue.Add("Serial ATA device: ", tmpString); + break; + case 0xE: + ataTwoValue.Add("SATA Express device", "No version"); + break; + default: + ataTwoValue.Add("Unknown transport type", + $"0x{(ataIdentify.TransportMajorVersion & 0xF000) >> 12:X1}"); + break; + } + + if(atapi) + { + // Bits 12 to 8, SCSI Peripheral Device Type + switch((PeripheralDeviceTypes)(((ushort)ataIdentify.GeneralConfiguration & 0x1F00) >> 8)) + { + case PeripheralDeviceTypes.DirectAccess: //0x00, + ataOneValue.Add("ATAPI Direct-access device"); + break; + case PeripheralDeviceTypes.SequentialAccess: //0x01, + ataOneValue.Add("ATAPI Sequential-access device"); + break; + case PeripheralDeviceTypes.PrinterDevice: //0x02, + ataOneValue.Add("ATAPI Printer device"); + break; + case PeripheralDeviceTypes.ProcessorDevice: //0x03, + ataOneValue.Add("ATAPI Processor device"); + break; + case PeripheralDeviceTypes.WriteOnceDevice: //0x04, + ataOneValue.Add("ATAPI Write-once device"); + break; + case PeripheralDeviceTypes.MultiMediaDevice: //0x05, + ataOneValue.Add("ATAPI CD-ROM/DVD/etc device"); + break; + case PeripheralDeviceTypes.ScannerDevice: //0x06, + ataOneValue.Add("ATAPI Scanner device"); + break; + case PeripheralDeviceTypes.OpticalDevice: //0x07, + ataOneValue.Add("ATAPI Optical memory device"); + break; + case PeripheralDeviceTypes.MediumChangerDevice: //0x08, + ataOneValue.Add("ATAPI Medium change device"); + break; + case PeripheralDeviceTypes.CommsDevice: //0x09, + ataOneValue.Add("ATAPI Communications device"); + break; + case PeripheralDeviceTypes.PrePressDevice1: //0x0A, + ataOneValue.Add("ATAPI Graphics arts pre-press device (defined in ASC IT8)"); + break; + case PeripheralDeviceTypes.PrePressDevice2: //0x0B, + ataOneValue.Add("ATAPI Graphics arts pre-press device (defined in ASC IT8)"); + break; + case PeripheralDeviceTypes.ArrayControllerDevice: //0x0C, + ataOneValue.Add("ATAPI Array controller device"); + break; + case PeripheralDeviceTypes.EnclosureServiceDevice: //0x0D, + ataOneValue.Add("ATAPI Enclosure services device"); + break; + case PeripheralDeviceTypes.SimplifiedDevice: //0x0E, + ataOneValue.Add("ATAPI Simplified direct-access device"); + break; + case PeripheralDeviceTypes.OCRWDevice: //0x0F, + ataOneValue.Add("ATAPI Optical card reader/writer device"); + break; + case PeripheralDeviceTypes.BridgingExpander: //0x10, + ataOneValue.Add("ATAPI Bridging Expanders"); + break; + case PeripheralDeviceTypes.ObjectDevice: //0x11, + ataOneValue.Add("ATAPI Object-based Storage Device"); + break; + case PeripheralDeviceTypes.ADCDevice: //0x12, + ataOneValue.Add("ATAPI Automation/Drive Interface"); + break; + case PeripheralDeviceTypes.WellKnownDevice: //0x1E, + ataOneValue.Add("ATAPI Well known logical unit"); + break; + case PeripheralDeviceTypes.UnknownDevice: //0x1F + ataOneValue.Add("ATAPI Unknown or no device type"); + break; + default: + ataOneValue + .Add($"ATAPI Unknown device type field value 0x{((ushort)ataIdentify.GeneralConfiguration & 0x1F00) >> 8:X2}"); + break; + } + + // ATAPI DRQ behaviour + switch(((ushort)ataIdentify.GeneralConfiguration & 0x60) >> 5) + { + case 0: + ataOneValue.Add("Device shall set DRQ within 3 ms of receiving PACKET"); + break; + case 1: + ataOneValue.Add("Device shall assert INTRQ when DRQ is set to one"); + break; + case 2: + ataOneValue.Add("Device shall set DRQ within 50 µs of receiving PACKET"); + break; + default: + ataOneValue + .Add($"Unknown ATAPI DRQ behaviour code {((ushort)ataIdentify.GeneralConfiguration & 0x60) >> 5}"); + break; + } + + // ATAPI PACKET size + switch((ushort)ataIdentify.GeneralConfiguration & 0x03) + { + case 0: + ataOneValue.Add("ATAPI device uses 12 byte command packet"); + break; + case 1: + ataOneValue.Add("ATAPI device uses 16 byte command packet"); + break; + default: + ataOneValue + .Add($"Unknown ATAPI packet size code {(ushort)ataIdentify.GeneralConfiguration & 0x03}"); + break; + } + } + else if(!cfa) + { + if(minatalevel >= 5) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.IncompleteResponse)) + ataOneValue.Add("Incomplete identify response"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.NonMagnetic)) + ataOneValue.Add("Device uses non-magnetic media"); + + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.Removable)) + ataOneValue.Add("Device is removable"); + + if(minatalevel <= 5) + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.Fixed)) + ataOneValue.Add("Device is fixed"); + + if(ata1) + { + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SlowIDE)) + ataOneValue.Add("Device transfer rate is <= 5 Mb/s"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.FastIDE)) + ataOneValue.Add("Device transfer rate is > 5 Mb/s but <= 10 Mb/s"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.UltraFastIDE)) + ataOneValue.Add("Device transfer rate is > 10 Mb/s"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SoftSector)) + ataOneValue.Add("Device is soft sectored"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.HardSector)) + ataOneValue.Add("Device is hard sectored"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.NotMFM)) + ataOneValue.Add("Device is not MFM encoded"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.FormatGapReq)) + ataOneValue.Add("Format speed tolerance gap is required"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.TrackOffset)) + ataOneValue.Add("Track offset option is available"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.DataStrobeOffset)) + ataOneValue.Add("Data strobe offset option is available"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit + .RotationalSpeedTolerance)) + ataOneValue.Add("Rotational speed tolerance is higher than 0,5%"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.SpindleControl)) + ataOneValue.Add("Spindle motor control is implemented"); + if(ataIdentify.GeneralConfiguration.HasFlag(Identify.GeneralConfigurationBit.HighHeadSwitch)) + ataOneValue.Add("Head switch time is bigger than 15 µs."); + } + } + + if((ushort)ataIdentify.SpecificConfiguration != 0x0000 && + (ushort)ataIdentify.SpecificConfiguration != 0xFFFF) + switch(ataIdentify.SpecificConfiguration) + { + case Identify.SpecificConfigurationEnum.RequiresSetIncompleteResponse: + ataOneValue + .Add("Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete."); + break; + case Identify.SpecificConfigurationEnum.RequiresSetCompleteResponse: + ataOneValue + .Add("Device requires SET FEATURES to spin up and IDENTIFY DEVICE response is complete."); + break; + case Identify.SpecificConfigurationEnum.NotRequiresSetIncompleteResponse: + ataOneValue + .Add("Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is incomplete."); + break; + case Identify.SpecificConfigurationEnum.NotRequiresSetCompleteResponse: + ataOneValue + .Add("Device does not require SET FEATURES to spin up and IDENTIFY DEVICE response is complete."); + break; + default: + ataOneValue + .Add($"Unknown device specific configuration 0x{(ushort)ataIdentify.SpecificConfiguration:X4}"); + break; + } + + // Obsolete since ATA-2, however, it is yet used in ATA-8 devices + if(ataIdentify.BufferSize != 0x0000 && ataIdentify.BufferSize != 0xFFFF && + ataIdentify.BufferType != 0x0000 && ataIdentify.BufferType != 0xFFFF) + switch(ataIdentify.BufferType) + { + case 1: + ataOneValue + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of single ported single sector buffer"); + break; + case 2: + ataOneValue + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of dual ported multi sector buffer"); + break; + case 3: + ataOneValue + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of dual ported multi sector buffer with read caching"); + break; + default: + ataOneValue + .Add($"{ataIdentify.BufferSize * logicalsectorsize / 1024} KiB of unknown type {ataIdentify.BufferType} buffer"); + break; + } + + ataOneValue.Add("Device capabilities:"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.StandardStanbyTimer)) + ataOneValue.Add("Standby time values are standard"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.IORDY)) + ataOneValue.Add(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.CanDisableIORDY) + ? "IORDY is supported and can be disabled" + : "IORDY is supported"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.DMASupport)) + ataOneValue.Add("DMA is supported"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.PhysicalAlignment1) || + ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.PhysicalAlignment0)) + ataOneValue.Add($"Long Physical Alignment setting is {(ushort)ataIdentify.Capabilities & 0x03}"); + if(atapi) + { + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.InterleavedDMA)) + ataOneValue.Add("ATAPI device supports interleaved DMA"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.CommandQueue)) + ataOneValue.Add("ATAPI device supports command queueing"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.OverlapOperation)) + ataOneValue.Add("ATAPI device supports overlapped operations"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.RequiresATASoftReset)) + ataOneValue.Add("ATAPI device requires ATA software reset"); + } + + if(ataIdentify.Capabilities2.HasFlag(Identify.CapabilitiesBit2.MustBeSet) && + !ataIdentify.Capabilities2.HasFlag(Identify.CapabilitiesBit2.MustBeClear)) + if(ataIdentify.Capabilities2.HasFlag(Identify.CapabilitiesBit2.SpecificStandbyTimer)) + ataOneValue.Add("Device indicates a specific minimum standby timer value"); + + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.MultipleValid)) + { + ataOneValue.Add($"A maximum of {ataIdentify.MultipleSectorNumber} sectors can be transferred per interrupt on READ/WRITE MULTIPLE"); + ataOneValue.Add($"Device supports setting a maximum of {ataIdentify.MultipleMaxSectors} sectors"); + } + + if(ata1) + if(ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.TrustedComputing)) + ataOneValue.Add("Device supports doubleword I/O"); + + if(minatalevel <= 3) + { + if(ataIdentify.PIOTransferTimingMode > 0) + ataTwoValue.Add("PIO timing mode", $"{ataIdentify.PIOTransferTimingMode}"); + if(ataIdentify.DMATransferTimingMode > 0) + ataTwoValue.Add("DMA timing mode", $"{ataIdentify.DMATransferTimingMode}"); + } + + tmpString = ""; + + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode0)) tmpString += "PIO0 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode1)) tmpString += "PIO1 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode2)) tmpString += "PIO2 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode3)) tmpString += "PIO3 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode4)) tmpString += "PIO4 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode5)) tmpString += "PIO5 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode6)) tmpString += "PIO6 "; + if(ataIdentify.APIOSupported.HasFlag(Identify.TransferMode.Mode7)) tmpString += "PIO7 "; + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Advanced PIO", tmpString); + + if(minatalevel <= 3 && !atapi) + { + tmpString = ""; + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode0)) + { + tmpString += "DMA0 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode0)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode1)) + { + tmpString += "DMA1 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode1)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode2)) + { + tmpString += "DMA2 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode2)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode3)) + { + tmpString += "DMA3 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode3)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode4)) + { + tmpString += "DMA4 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode4)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode5)) + { + tmpString += "DMA5 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode5)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode6)) + { + tmpString += "DMA6 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode6)) tmpString += "(active) "; + } + + if(ataIdentify.DMASupported.HasFlag(Identify.TransferMode.Mode7)) + { + tmpString += "DMA7 "; + if(ataIdentify.DMAActive.HasFlag(Identify.TransferMode.Mode7)) tmpString += "(active) "; + } + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Single-word DMA", tmpString); + } + + tmpString = ""; + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode0)) + { + tmpString += "MDMA0 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode0)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode1)) + { + tmpString += "MDMA1 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode1)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode2)) + { + tmpString += "MDMA2 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode2)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode3)) + { + tmpString += "MDMA3 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode3)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode4)) + { + tmpString += "MDMA4 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode4)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode5)) + { + tmpString += "MDMA5 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode5)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode6)) + { + tmpString += "MDMA6 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode6)) tmpString += "(active) "; + } + + if(ataIdentify.MDMASupported.HasFlag(Identify.TransferMode.Mode7)) + { + tmpString += "MDMA7 "; + if(ataIdentify.MDMAActive.HasFlag(Identify.TransferMode.Mode7)) tmpString += "(active) "; + } + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Multi-word DMA", tmpString); + + tmpString = ""; + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode0)) + { + tmpString += "UDMA0 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode0)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode1)) + { + tmpString += "UDMA1 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode1)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode2)) + { + tmpString += "UDMA2 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode2)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode3)) + { + tmpString += "UDMA3 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode3)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode4)) + { + tmpString += "UDMA4 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode4)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode5)) + { + tmpString += "UDMA5 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode5)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode6)) + { + tmpString += "UDMA6 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode6)) tmpString += "(active) "; + } + + if(ataIdentify.UDMASupported.HasFlag(Identify.TransferMode.Mode7)) + { + tmpString += "UDMA7 "; + if(ataIdentify.UDMAActive.HasFlag(Identify.TransferMode.Mode7)) tmpString += "(active) "; + } + + if(!string.IsNullOrEmpty(tmpString)) ataTwoValue.Add("Ultra DMA", tmpString); + + if(ataIdentify.MinMDMACycleTime != 0 && ataIdentify.RecMDMACycleTime != 0) + ataOneValue.Add($"At minimum {ataIdentify.MinMDMACycleTime} ns. transfer cycle time per word in MDMA, " + + $"{ataIdentify.RecMDMACycleTime} ns. recommended"); + if(ataIdentify.MinPIOCycleTimeNoFlow != 0) + ataOneValue.Add($"At minimum {ataIdentify.MinPIOCycleTimeNoFlow} ns. transfer cycle time per word in PIO, " + + "without flow control"); + if(ataIdentify.MinPIOCycleTimeFlow != 0) + ataOneValue.Add($"At minimum {ataIdentify.MinPIOCycleTimeFlow} ns. transfer cycle time per word in PIO, " + + "with IORDY flow control"); + + if(ataIdentify.MaxQueueDepth != 0) + ataOneValue.Add($"{ataIdentify.MaxQueueDepth + 1} depth of queue maximum"); + + if(atapi) + { + if(ataIdentify.PacketBusRelease != 0) + ataOneValue + .Add($"{ataIdentify.PacketBusRelease} ns. typical to release bus from receipt of PACKET"); + if(ataIdentify.ServiceBusyClear != 0) + ataOneValue + .Add($"{ataIdentify.ServiceBusyClear} ns. typical to clear BSY bit from receipt of SERVICE"); + } + + if((ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0x1 || + (ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0xE) + { + if(!ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Clear)) + { + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Gen1Speed)) + ataOneValue.Add("SATA 1.5Gb/s is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Gen2Speed)) + ataOneValue.Add("SATA 3.0Gb/s is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Gen3Speed)) + ataOneValue.Add("SATA 6.0Gb/s is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.PowerReceipt)) + ataOneValue.Add("Receipt of host initiated power management requests is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.PHYEventCounter)) + ataOneValue.Add("PHY Event counters are supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.HostSlumbTrans)) + ataOneValue.Add("Supports host automatic partial to slumber transitions is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.DevSlumbTrans)) + ataOneValue.Add("Supports device automatic partial to slumber transitions is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.NCQ)) + { + ataOneValue.Add("NCQ is supported"); + + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.NCQPriority)) + ataOneValue.Add("NCQ priority is supported"); + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.UnloadNCQ)) + ataOneValue.Add("Unload is supported with outstanding NCQ commands"); + } + } + + if(!ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.Clear)) + { + if(!ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Clear) && + ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.NCQ)) + { + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.NCQMgmt)) + ataOneValue.Add("NCQ queue management is supported"); + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.NCQStream)) + ataOneValue.Add("NCQ streaming is supported"); + } + + if(atapi) + { + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.HostEnvDetect)) + ataOneValue.Add("ATAPI device supports host environment detection"); + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.DevAttSlimline)) + ataOneValue.Add("ATAPI device supports attention on slimline connected devices"); + } + } + } + + if(ataIdentify.InterseekDelay != 0x0000 && ataIdentify.InterseekDelay != 0xFFFF) + ataOneValue.Add($"{ataIdentify.InterseekDelay} microseconds of interseek delay for ISO-7779 accoustic testing"); + + if((ushort)ataIdentify.DeviceFormFactor != 0x0000 && (ushort)ataIdentify.DeviceFormFactor != 0xFFFF) + switch(ataIdentify.DeviceFormFactor) + { + case Identify.DeviceFormFactorEnum.FiveAndQuarter: + ataOneValue.Add("Device nominal size is 5.25\""); + break; + case Identify.DeviceFormFactorEnum.ThreeAndHalf: + ataOneValue.Add("Device nominal size is 3.5\""); + break; + case Identify.DeviceFormFactorEnum.TwoAndHalf: + ataOneValue.Add("Device nominal size is 2.5\""); + break; + case Identify.DeviceFormFactorEnum.OnePointEight: + ataOneValue.Add("Device nominal size is 1.8\""); + break; + case Identify.DeviceFormFactorEnum.LessThanOnePointEight: + ataOneValue.Add("Device nominal size is smaller than 1.8\""); + break; + default: + ataOneValue.Add($"Device nominal size field value {ataIdentify.DeviceFormFactor} is unknown"); + break; + } + + if(atapi) + if(ataIdentify.ATAPIByteCount > 0) + ataOneValue.Add($"{ataIdentify.ATAPIByteCount} bytes count limit for ATAPI"); + + if(cfa) + if((ataIdentify.CFAPowerMode & 0x8000) == 0x8000) + { + ataOneValue.Add("CompactFlash device supports power mode 1"); + if((ataIdentify.CFAPowerMode & 0x2000) == 0x2000) + ataOneValue.Add("CompactFlash power mode 1 required for one or more commands"); + if((ataIdentify.CFAPowerMode & 0x1000) == 0x1000) + ataOneValue.Add("CompactFlash power mode 1 is disabled"); + + ataOneValue.Add($"CompactFlash device uses a maximum of {ataIdentify.CFAPowerMode & 0x0FFF} mA"); + } + + ataOneValue.Add("Command set and features:"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Nop)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Nop) + ? "NOP is supported and enabled" + : "NOP is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.ReadBuffer)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.ReadBuffer) + ? "READ BUFFER is supported and enabled" + : "READ BUFFER is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.WriteBuffer)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.WriteBuffer) + ? "WRITE BUFFER is supported and enabled" + : "WRITE BUFFER is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.HPA)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.HPA) + ? "Host Protected Area is supported and enabled" + : "Host Protected Area is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.DeviceReset)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.DeviceReset) + ? "DEVICE RESET is supported and enabled" + : "DEVICE RESET is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Service)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Service) + ? "SERVICE interrupt is supported and enabled" + : "SERVICE interrupt is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Release)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Release) + ? "Release is supported and enabled" + : "Release is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.LookAhead)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.LookAhead) + ? "Look-ahead read is supported and enabled" + : "Look-ahead read is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.WriteCache)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.WriteCache) + ? "Write cache is supported and enabled" + : "Write cache is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.Packet)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.Packet) + ? "PACKET is supported and enabled" + : "PACKET is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.PowerManagement)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.PowerManagement) + ? "Power management is supported and enabled" + : "Power management is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.RemovableMedia)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.RemovableMedia) + ? "Removable media feature set is supported and enabled" + : "Removable media feature set is supported"); + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.SecurityMode)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.SecurityMode) + ? "Security mode is supported and enabled" + : "Security mode is supported"); + if(ataIdentify.Capabilities.HasFlag(Identify.CapabilitiesBit.LBASupport)) + ataOneValue.Add("28-bit LBA is supported"); + + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.MustBeSet) && + !ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.MustBeClear)) + { + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.LBA48)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.LBA48) + ? "48-bit LBA is supported and enabled" + : "48-bit LBA is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.FlushCache)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.FlushCache) + ? "FLUSH CACHE is supported and enabled" + : "FLUSH CACHE is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.FlushCacheExt)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.FlushCacheExt) + ? "FLUSH CACHE EXT is supported and enabled" + : "FLUSH CACHE EXT is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.DCO)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.DCO) + ? "Device Configuration Overlay feature set is supported and enabled" + : "Device Configuration Overlay feature set is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.AAM)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.AAM) + ? $"Automatic Acoustic Management is supported and enabled with value {ataIdentify.CurrentAAM} (vendor recommends {ataIdentify.RecommendedAAM}" + : "Automatic Acoustic Management is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.SetMax)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.SetMax) + ? "SET MAX security extension is supported and enabled" + : "SET MAX security extension is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.AddressOffsetReservedAreaBoot)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2 + .AddressOffsetReservedAreaBoot) + ? "Address Offset Reserved Area Boot is supported and enabled" + : "Address Offset Reserved Area Boot is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.SetFeaturesRequired)) + ataOneValue.Add("SET FEATURES is required before spin-up"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.PowerUpInStandby)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.PowerUpInStandby) + ? "Power-up in standby is supported and enabled" + : "Power-up in standby is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.RemovableNotification)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2 + .RemovableNotification) + ? "Removable Media Status Notification is supported and enabled" + : "Removable Media Status Notification is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.APM)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.APM) + ? $"Advanced Power Management is supported and enabled with value {ataIdentify.CurrentAPM}" + : "Advanced Power Management is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.CompactFlash)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.CompactFlash) + ? "CompactFlash feature set is supported and enabled" + : "CompactFlash feature set is supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.RWQueuedDMA)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.RWQueuedDMA) + ? "READ DMA QUEUED and WRITE DMA QUEUED are supported and enabled" + : "READ DMA QUEUED and WRITE DMA QUEUED are supported"); + if(ataIdentify.CommandSet2.HasFlag(Identify.CommandSetBit2.DownloadMicrocode)) + ataOneValue.Add(ataIdentify.EnabledCommandSet2.HasFlag(Identify.CommandSetBit2.DownloadMicrocode) + ? "DOWNLOAD MICROCODE is supported and enabled" + : "DOWNLOAD MICROCODE is supported"); + } + + if(ataIdentify.CommandSet.HasFlag(Identify.CommandSetBit.SMART)) + ataOneValue.Add(ataIdentify.EnabledCommandSet.HasFlag(Identify.CommandSetBit.SMART) + ? "S.M.A.R.T. is supported and enabled" + : "S.M.A.R.T. is supported"); + + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.Supported)) + ataOneValue.Add("S.M.A.R.T. Command Transport is supported"); + + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeSet) && + !ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeClear)) + { + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.SMARTSelfTest)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.SMARTSelfTest) + ? "S.M.A.R.T. self-testing is supported and enabled" + : "S.M.A.R.T. self-testing is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.SMARTLog)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.SMARTLog) + ? "S.M.A.R.T. error logging is supported and enabled" + : "S.M.A.R.T. error logging is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.IdleImmediate)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.IdleImmediate) + ? "IDLE IMMEDIATE with UNLOAD FEATURE is supported and enabled" + : "IDLE IMMEDIATE with UNLOAD FEATURE is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.WriteURG)) + ataOneValue.Add("URG bit is supported in WRITE STREAM DMA EXT and WRITE STREAM EXT"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.ReadURG)) + ataOneValue.Add("URG bit is supported in READ STREAM DMA EXT and READ STREAM EXT"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.WWN)) + ataOneValue.Add("Device has a World Wide Name"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.FUAWriteQ)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.FUAWriteQ) + ? "WRITE DMA QUEUED FUA EXT is supported and enabled" + : "WRITE DMA QUEUED FUA EXT is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.FUAWrite)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.FUAWrite) + ? "WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported and enabled" + : "WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.GPL)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.GPL) + ? "General Purpose Logging is supported and enabled" + : "General Purpose Logging is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.Streaming)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.Streaming) + ? "Streaming feature set is supported and enabled" + : "Streaming feature set is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MCPT)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MCPT) + ? "Media Card Pass Through command set is supported and enabled" + : "Media Card Pass Through command set is supported"); + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial)) + ataOneValue.Add(ataIdentify.EnabledCommandSet3.HasFlag(Identify.CommandSetBit3.MediaSerial) + ? "Media Serial is supported and valid" + : "Media Serial is supported"); + } + + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.MustBeSet) && + !ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.MustBeClear)) + { + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.DSN)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.DSN) + ? "DSN feature set is supported and enabled" + : "DSN feature set is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.AMAC)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.AMAC) + ? "Accessible Max Address Configuration is supported and enabled" + : "Accessible Max Address Configuration is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.ExtPowerCond)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.ExtPowerCond) + ? "Extended Power Conditions are supported and enabled" + : "Extended Power Conditions are supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.ExtStatusReport)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.ExtStatusReport) + ? "Extended Status Reporting is supported and enabled" + : "Extended Status Reporting is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.FreeFallControl)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.FreeFallControl) + ? "Free-fall control feature set is supported and enabled" + : "Free-fall control feature set is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.SegmentedDownloadMicrocode)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4 + .SegmentedDownloadMicrocode) + ? "Segmented feature in DOWNLOAD MICROCODE is supported and enabled" + : "Segmented feature in DOWNLOAD MICROCODE is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.RWDMAExtGpl)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.RWDMAExtGpl) + ? "READ/WRITE DMA EXT GPL are supported and enabled" + : "READ/WRITE DMA EXT GPL are supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.WriteUnc)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.WriteUnc) + ? "WRITE UNCORRECTABLE is supported and enabled" + : "WRITE UNCORRECTABLE is supported"); + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.WRV)) + { + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.WRV) + ? "Write/Read/Verify is supported and enabled" + : "Write/Read/Verify is supported"); + ataOneValue.Add($"{ataIdentify.WRVSectorCountMode2} sectors for Write/Read/Verify mode 2"); + ataOneValue.Add($"{ataIdentify.WRVSectorCountMode3} sectors for Write/Read/Verify mode 3"); + if(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.WRV)) + ataOneValue.Add($"Current Write/Read/Verify mode: {ataIdentify.WRVMode}"); + } + + if(ataIdentify.CommandSet4.HasFlag(Identify.CommandSetBit4.DT1825)) + ataOneValue.Add(ataIdentify.EnabledCommandSet4.HasFlag(Identify.CommandSetBit4.DT1825) + ? "DT1825 is supported and enabled" + : "DT1825 is supported"); + } + + if(true) + { + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.BlockErase)) + ataOneValue.Add("BLOCK ERASE EXT is supported"); + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.Overwrite)) + ataOneValue.Add("OVERWRITE EXT is supported"); + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.CryptoScramble)) + ataOneValue.Add("CRYPTO SCRAMBLE EXT is supported"); + } + + if(true) + { + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.DeviceConfDMA)) + ataOneValue.Add("DEVICE CONFIGURATION IDENTIFY DMA and DEVICE CONFIGURATION SET DMA are supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ReadBufferDMA)) + ataOneValue.Add("READ BUFFER DMA is supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.WriteBufferDMA)) + ataOneValue.Add("WRITE BUFFER DMA is supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.DownloadMicroCodeDMA)) + ataOneValue.Add("DOWNLOAD MICROCODE DMA is supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.SetMaxDMA)) + ataOneValue.Add("SET PASSWORD DMA and SET UNLOCK DMA are supported"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.Ata28)) + ataOneValue.Add("Not all 28-bit commands are supported"); + + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.CFast)) + ataOneValue.Add("Device follows CFast specification"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.IEEE1667)) + ataOneValue.Add("Device follows IEEE-1667"); + + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.DeterministicTrim)) + { + ataOneValue.Add("Read after TRIM is deterministic"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ReadZeroTrim)) + ataOneValue.Add("Read after TRIM returns empty data"); + } + + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.LongPhysSectorAligError)) + ataOneValue.Add("Device supports Long Physical Sector Alignment Error Reporting Control"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.Encrypted)) + ataOneValue.Add("Device encrypts all user data"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.AllCacheNV)) + ataOneValue.Add("Device's write cache is non-volatile"); + if(ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ZonedBit0) || + ataIdentify.CommandSet5.HasFlag(Identify.CommandSetBit5.ZonedBit1)) + ataOneValue.Add("Device is zoned"); + } + + if(true) + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.Sanitize)) + { + ataOneValue.Add("Sanitize feature set is supported"); + ataOneValue.Add(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.SanitizeCommands) + ? "Sanitize commands are specified by ACS-3 or higher" + : "Sanitize commands are specified by ACS-2"); + + if(ataIdentify.Capabilities3.HasFlag(Identify.CapabilitiesBit3.SanitizeAntifreeze)) + ataOneValue.Add("SANITIZE ANTIFREEZE LOCK EXT is supported"); + } + + if(!ata1 && maxatalevel >= 8) + if(ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.Set) && + !ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.Clear) && + ataIdentify.TrustedComputing.HasFlag(Identify.TrustedComputingBit.TrustedComputing)) + ataOneValue.Add("Trusted Computing feature set is supported"); + + if((ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0x1 || + (ataIdentify.TransportMajorVersion & 0xF000) >> 12 == 0xE) + { + if(true) + if(!ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.Clear)) + if(ataIdentify.SATACapabilities.HasFlag(Identify.SATACapabilitiesBit.ReadLogDMAExt)) + ataOneValue.Add("READ LOG DMA EXT is supported"); + + if(true) + if(!ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.Clear)) + if(ataIdentify.SATACapabilities2.HasFlag(Identify.SATACapabilitiesBit2.FPDMAQ)) + ataOneValue.Add("RECEIVE FPDMA QUEUED and SEND FPDMA QUEUED are supported"); + + if(true) + if(!ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.Clear)) + { + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.NonZeroBufferOffset)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit + .NonZeroBufferOffset) + ? "Non-zero buffer offsets are supported and enabled" + : "Non-zero buffer offsets are supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.DMASetup)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.DMASetup) + ? "DMA Setup auto-activation is supported and enabled" + : "DMA Setup auto-activation is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.InitPowerMgmt)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit + .InitPowerMgmt) + ? "Device-initiated power management is supported and enabled" + : "Device-initiated power management is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.InOrderData)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures + .HasFlag(Identify.SATAFeaturesBit.InOrderData) + ? "In-order data delivery is supported and enabled" + : "In-order data delivery is supported"); + if(!atapi) + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.HardwareFeatureControl)) + ataOneValue.Add(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit + .HardwareFeatureControl) + ? "Hardware Feature Control is supported and enabled" + : "Hardware Feature Control is supported"); + if(atapi) + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.AsyncNotification)) + if(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.AsyncNotification)) + ataOneValue.Add("Asynchronous notification is supported"); + else + ataOneValue.Add("Asynchronous notification is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.SettingsPreserve)) + if(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.SettingsPreserve)) + ataOneValue.Add("Software Settings Preservation is supported"); + else + ataOneValue.Add("Software Settings Preservation is supported"); + if(ataIdentify.SATAFeatures.HasFlag(Identify.SATAFeaturesBit.NCQAutoSense)) + ataOneValue.Add("NCQ Autosense is supported"); + if(ataIdentify.EnabledSATAFeatures.HasFlag(Identify.SATAFeaturesBit.EnabledSlumber)) + ataOneValue.Add("Automatic Partial to Slumber transitions are enabled"); + } + } + + if((ataIdentify.RemovableStatusSet & 0x03) > 0) + ataOneValue.Add("Removable Media Status Notification feature set is supported"); + + if(ataIdentify.FreeFallSensitivity != 0x00 && ataIdentify.FreeFallSensitivity != 0xFF) + ataOneValue.Add($"Free-fall sensitivity set to {ataIdentify.FreeFallSensitivity}"); + + if(ataIdentify.DataSetMgmt.HasFlag(Identify.DataSetMgmtBit.Trim)) ataOneValue.Add("TRIM is supported"); + if(ataIdentify.DataSetMgmtSize > 0) + ataOneValue.Add($"DATA SET MANAGEMENT can receive a maximum of {ataIdentify.DataSetMgmtSize} blocks of 512 bytes"); + + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Supported)) + { + ataOneValue.Add("Security:"); + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Enabled)) + { + ataOneValue.Add("Security is enabled"); + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Locked) + ? "Security is locked" + : "Security is not locked"); + + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Frozen) + ? "Security is frozen" + : "Security is not frozen"); + + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Expired) + ? "Security count has expired" + : "Security count has notexpired"); + + ataOneValue.Add(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Maximum) + ? "Security level is maximum" + : "Security level is high"); + } + else ataOneValue.Add("Security is not enabled"); + + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Enhanced)) + ataOneValue.Add("Supports enhanced security erase"); + + ataOneValue.Add($"{ataIdentify.SecurityEraseTime * 2} minutes to complete secure erase"); + if(ataIdentify.SecurityStatus.HasFlag(Identify.SecurityStatusBit.Enhanced)) + ataOneValue + .Add($"{ataIdentify.EnhancedSecurityEraseTime * 2} minutes to complete enhanced secure erase"); + + ataOneValue.Add($"Master password revision code: {ataIdentify.MasterPasswordRevisionCode}"); + } + + if(ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeSet) && + !ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.MustBeClear) && + ataIdentify.CommandSet3.HasFlag(Identify.CommandSetBit3.Streaming)) + { + ataOneValue.Add("Streaming:"); + ataOneValue.Add($"Minimum request size is {ataIdentify.StreamMinReqSize}"); + ataOneValue.Add($"Streaming transfer time in PIO is {ataIdentify.StreamTransferTimePIO}"); + ataOneValue.Add($"Streaming transfer time in DMA is {ataIdentify.StreamTransferTimeDMA}"); + ataOneValue.Add($"Streaming access latency is {ataIdentify.StreamAccessLatency}"); + ataOneValue.Add($"Streaming performance granularity is {ataIdentify.StreamPerformanceGranularity}"); + } + + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.Supported)) + { + ataOneValue.Add("S.M.A.R.T. Command Transport (SCT):"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.LongSectorAccess)) + ataOneValue.Add("SCT Long Sector Address is supported"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.WriteSame)) + ataOneValue.Add("SCT Write Same is supported"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.ErrorRecoveryControl)) + ataOneValue.Add("SCT Error Recovery Control is supported"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.FeaturesControl)) + ataOneValue.Add("SCT Features Control is supported"); + if(ataIdentify.SCTCommandTransport.HasFlag(Identify.SCTCommandTransportBit.DataTables)) + ataOneValue.Add("SCT Data Tables are supported"); + } + + if((ataIdentify.NVCacheCaps & 0x0010) == 0x0010) + { + ataOneValue.Add("Non-Volatile Cache:"); + ataOneValue.Add($"Version {(ataIdentify.NVCacheCaps & 0xF000) >> 12}"); + if((ataIdentify.NVCacheCaps & 0x0001) == 0x0001) + { + ataOneValue.Add((ataIdentify.NVCacheCaps & 0x0002) == 0x0002 + ? "Power mode feature set is supported and enabled" + : "Power mode feature set is supported"); + + ataOneValue.Add($"Version {(ataIdentify.NVCacheCaps & 0x0F00) >> 8}"); + } + + ataOneValue.Add($"Non-Volatile Cache is {ataIdentify.NVCacheSize * logicalsectorsize} bytes"); + } + + if(ataReport.ReadCapabilities != null) + { + removable = false; + ataOneValue.Add(""); + + if(ataReport.ReadCapabilities.NominalRotationRate != null && + ataReport.ReadCapabilities.NominalRotationRate != 0x0000 && + ataReport.ReadCapabilities.NominalRotationRate != 0xFFFF) + ataOneValue.Add(ataReport.ReadCapabilities.NominalRotationRate == 0x0001 + ? "Device does not rotate." + : $"Device rotates at {ataReport.ReadCapabilities.NominalRotationRate} rpm"); + + if(!atapi) + { + if(ataReport.ReadCapabilities.BlockSize != null) + { + ataTwoValue.Add("Logical sector size", $"{ataReport.ReadCapabilities.BlockSize} bytes"); + logicalsectorsize = ataReport.ReadCapabilities.BlockSize.Value; + } + + if(ataReport.ReadCapabilities.PhysicalBlockSize != null) + ataTwoValue.Add("Physical sector size", + $"{ataReport.ReadCapabilities.PhysicalBlockSize} bytes"); + if(ataReport.ReadCapabilities.LongBlockSize != null) + ataTwoValue.Add("READ LONG sector size", $"{ataReport.ReadCapabilities.LongBlockSize} bytes"); + + if(ataReport.ReadCapabilities.BlockSize != null && + ataReport.ReadCapabilities.PhysicalBlockSize != null && + ataReport.ReadCapabilities.BlockSize.Value != + ataReport.ReadCapabilities.PhysicalBlockSize.Value && + (ataReport.ReadCapabilities.LogicalAlignment & 0x8000) == 0x0000 && + (ataReport.ReadCapabilities.LogicalAlignment & 0x4000) == 0x4000) + ataOneValue + .Add($"Logical sector starts at offset {ataReport.ReadCapabilities.LogicalAlignment & 0x3FFF} from physical sector"); + + if(ataReport.ReadCapabilities.CHS != null && ataReport.ReadCapabilities.CurrentCHS != null) + { + int currentSectors = ataReport.ReadCapabilities.CurrentCHS.Cylinders * + ataReport.ReadCapabilities.CurrentCHS.Heads * + ataReport.ReadCapabilities.CurrentCHS.Sectors; + ataTwoValue.Add("Cylinders", + $"{ataReport.ReadCapabilities.CHS.Cylinders} max., {ataReport.ReadCapabilities.CurrentCHS.Cylinders} current"); + ataTwoValue.Add("Heads", + $"{ataReport.ReadCapabilities.CHS.Heads} max., {ataReport.ReadCapabilities.CurrentCHS.Heads} current"); + ataTwoValue.Add("Sectors per track", + $"{ataReport.ReadCapabilities.CHS.Sectors} max., {ataReport.ReadCapabilities.CurrentCHS.Sectors} current"); + ataTwoValue.Add("Sectors addressable in CHS mode", + $"{ataReport.ReadCapabilities.CHS.Cylinders * ataReport.ReadCapabilities.CHS.Heads * ataReport.ReadCapabilities.CHS.Sectors} max., {currentSectors} current"); + ataTwoValue.Add("Device size in CHS mode", + $"{(ulong)currentSectors * logicalsectorsize} bytes, {(ulong)currentSectors * logicalsectorsize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); + } + else if(ataReport.ReadCapabilities.CHS != null) + { + int currentSectors = ataReport.ReadCapabilities.CHS.Cylinders * + ataReport.ReadCapabilities.CHS.Heads * + ataReport.ReadCapabilities.CHS.Sectors; + ataTwoValue.Add("Cylinders", + $"{ataReport.ReadCapabilities.CHS.Cylinders}"); + ataTwoValue.Add("Heads", $"{ataReport.ReadCapabilities.CHS.Heads}"); + ataTwoValue.Add("Sectors per track", $"{ataReport.ReadCapabilities.CHS.Sectors}"); + ataTwoValue.Add("Sectors addressable in CHS mode", $"{currentSectors}"); + ataTwoValue.Add("Device size in CHS mode", + $"{(ulong)currentSectors * logicalsectorsize} bytes, {(ulong)currentSectors * logicalsectorsize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); + } + + if(ataReport.ReadCapabilities.LBASectors != null) + { + ataTwoValue.Add("Sectors addressable in sectors in 28-bit LBA mode", + $"{ataReport.ReadCapabilities.LBASectors}"); + + if((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1024 / 1024 > 1000000) + ataTwoValue.Add("Device size in 28-bit LBA mode", + $"{(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize} bytes, {(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000} Tb, {(double)((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1024 / 1024 > 1000) + ataTwoValue.Add("Device size in 28-bit LBA mode", + $"{(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize} bytes, {(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1000 / 1000 / 1000} Gb, {(double)((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize) / 1024 / 1024 / 1024:F2} GiB"); + else + ataTwoValue.Add("Device size in 28-bit LBA mode", + $"{(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize} bytes, {(ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize / 1000 / 1000} Mb, {(double)((ulong)ataReport.ReadCapabilities.LBASectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); + } + + if(ataReport.ReadCapabilities.LBA48Sectors != null) + { + ataTwoValue.Add("Sectors addressable in sectors in 48-bit LBA mode", + $"{ataReport.ReadCapabilities.LBA48Sectors}"); + + if(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1024 / 1024 > 1000000) + ataTwoValue.Add("Device size in 48-bit LBA mode", + $"{ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize} bytes, {ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1000 / 1000 / 1000 / 1000} Tb, {(double)(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1024 / 1024 > 1000) + ataTwoValue.Add("Device size in 48-bit LBA mode", + $"{ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize} bytes, {ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1000 / 1000 / 1000} Gb, {(double)(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize) / 1024 / 1024 / 1024:F2} GiB"); + else + ataTwoValue.Add("Device size in 48-bit LBA mode", + $"{ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize} bytes, {ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize / 1000 / 1000} Mb, {(double)(ataReport.ReadCapabilities.LBA48Sectors * logicalsectorsize) / 1024 / 1024:F2} MiB"); + } + + if(ata1 || cfa) + { + if(ataReport.ReadCapabilities.UnformattedBPT > 0) + ataTwoValue.Add("Bytes per unformatted track", + $"{ataReport.ReadCapabilities.UnformattedBPT}"); + if(ataReport.ReadCapabilities.UnformattedBPS > 0) + ataTwoValue.Add("Bytes per unformatted sector", + $"{ataReport.ReadCapabilities.UnformattedBPS}"); + } + } + + if(ataReport.ReadCapabilities.SupportsReadSectors == true) + ataOneValue.Add("Device supports READ SECTOR(S) command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadRetry == true) + ataOneValue.Add("Device supports READ SECTOR(S) RETRY command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadDma == true) + ataOneValue.Add("Device supports READ DMA command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadDmaRetry == true) + ataOneValue.Add("Device supports READ DMA RETRY command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadLong == true) + ataOneValue.Add("Device supports READ LONG command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsReadLongRetry == true) + ataOneValue.Add("Device supports READ LONG RETRY command in CHS mode"); + + if(ataReport.ReadCapabilities.SupportsReadLba == true) + ataOneValue.Add("Device supports READ SECTOR(S) command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadRetryLba == true) + ataOneValue.Add("Device supports READ SECTOR(S) RETRY command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadDmaLba == true) + ataOneValue.Add("Device supports READ DMA command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadDmaRetryLba == true) + ataOneValue.Add("Device supports READ DMA RETRY command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadLongLba == true) + ataOneValue.Add("Device supports READ LONG command in 28-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadLongRetryLba == true) + ataOneValue.Add("Device supports READ LONG RETRY command in 28-bit LBA mode"); + + if(ataReport.ReadCapabilities.SupportsReadLba48 == true) + ataOneValue.Add("Device supports READ SECTOR(S) command in 48-bit LBA mode"); + if(ataReport.ReadCapabilities.SupportsReadDmaLba48 == true) + ataOneValue.Add("Device supports READ DMA command in 48-bit LBA mode"); + + if(ataReport.ReadCapabilities.SupportsSeek == true) + ataOneValue.Add("Device supports SEEK command in CHS mode"); + if(ataReport.ReadCapabilities.SupportsSeekLba == true) + ataOneValue.Add("Device supports SEEK command in 28-bit LBA mode"); + } + else testedMedia = ataReport.RemovableMedias; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/RouteConfig.cs b/DiscImageChef.Server/App_Start/RouteConfig.cs new file mode 100644 index 00000000..1c7e5413 --- /dev/null +++ b/DiscImageChef.Server/App_Start/RouteConfig.cs @@ -0,0 +1,50 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : RouteConfig.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets ASP.NET routing information. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Web.Mvc; +using System.Web.Routing; + +namespace DiscImageChef.Server +{ + public class RouteConfig + { + public static void RegisterRoutes(RouteCollection routes) + { + routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); + + routes.MapMvcAttributeRoutes(); + + routes.MapRoute("Default", "{controller}/{action}/{id}", + new {controller = "Home", action = "Index", id = UrlParameter.Optional}); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiEvpd.cs b/DiscImageChef.Server/App_Start/ScsiEvpd.cs new file mode 100644 index 00000000..9a290e8e --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiEvpd.cs @@ -0,0 +1,93 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiEvpd.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI EVPDs from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + public static class ScsiEvpd + { + /// + /// Takes the SCSI EVPD part of a device report and prints it as a list key=value pairs to be sequenced by ASP.NET in + /// the rendering + /// + /// EVPD pages + /// SCSI vendor string + /// List to put the key=value pairs on + public static void Report(IEnumerable pages, string vendor, ref Dictionary evpdPages) + { + foreach(ScsiPage evpd in pages) + { + string decoded; + if(evpd.page >= 0x01 && evpd.page <= 0x7F) decoded = EVPD.DecodeASCIIPage(evpd.value); + else if(evpd.page == 0x81) decoded = EVPD.PrettifyPage_81(evpd.value); + else if(evpd.page == 0x82) decoded = EVPD.DecodePage82(evpd.value); + else if(evpd.page == 0x83) decoded = EVPD.PrettifyPage_83(evpd.value); + else if(evpd.page == 0x84) decoded = EVPD.PrettifyPage_84(evpd.value); + else if(evpd.page == 0x85) decoded = EVPD.PrettifyPage_85(evpd.value); + else if(evpd.page == 0x86) decoded = EVPD.PrettifyPage_86(evpd.value); + else if(evpd.page == 0x89) decoded = EVPD.PrettifyPage_89(evpd.value); + else if(evpd.page == 0xB0) decoded = EVPD.PrettifyPage_B0(evpd.value); + else if(evpd.page == 0xB2) + decoded = + $"TapeAlert Supported Flags Bitmap: 0x{EVPD.DecodePageB2(evpd.value):X16}
"; + else if(evpd.page == 0xB4) decoded = EVPD.DecodePageB4(evpd.value); + else if(evpd.page == 0xC0 && vendor.Trim() == "quantum") + decoded = EVPD.PrettifyPage_C0_Quantum(evpd.value); + else if(evpd.page == 0xC0 && vendor.Trim() == "seagate") + decoded = + EVPD.PrettifyPage_C0_Seagate(evpd.value); + else if(evpd.page == 0xC0 && vendor.Trim() == "ibm") + decoded = EVPD.PrettifyPage_C0_IBM(evpd.value); + else if(evpd.page == 0xC1 && vendor.Trim() == "ibm") + decoded = EVPD.PrettifyPage_C1_IBM(evpd.value); + else if((evpd.page == 0xC0 || evpd.page == 0xC1) && vendor.Trim() == "certance") + decoded = EVPD.PrettifyPage_C0_C1_Certance(evpd.value); + else if((evpd.page == 0xC2 || evpd.page == 0xC3 || evpd.page == 0xC4 || evpd.page == 0xC5 || + evpd.page == 0xC6) && + vendor.Trim() == "certance") decoded = EVPD.PrettifyPage_C2_C3_C4_C5_C6_Certance(evpd.value); + else if((evpd.page == 0xC0 || evpd.page == 0xC1 || evpd.page == 0xC2 || evpd.page == 0xC3 || + evpd.page == 0xC4 || evpd.page == 0xC5) && + vendor.Trim() == "hp") decoded = EVPD.PrettifyPage_C0_to_C5_HP(evpd.value); + else if(evpd.page == 0xDF && vendor.Trim() == "certance") + decoded = EVPD.PrettifyPage_DF_Certance(evpd.value); + else decoded = "Undecoded"; + + if(!string.IsNullOrEmpty(decoded)) decoded = decoded.Replace("\n", "
"); + + evpdPages.Add($"EVPD page {evpd.page:X2}h", decoded); + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiInquiry.cs b/DiscImageChef.Server/App_Start/ScsiInquiry.cs new file mode 100644 index 00000000..5701e276 --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiInquiry.cs @@ -0,0 +1,1703 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiInquiry.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI INQUIRY from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + static class ScsiInquiry + { + /// + /// Takes the SCSI INQUIRY part of a device report and prints it as a list of values to be sequenced by ASP.NET in the + /// rendering + /// + /// INQUIRY part of the report + /// List of values + internal static IEnumerable Report(Inquiry.SCSIInquiry? inquiryNullable) + { + List scsiOneValue = new List(); + + if(!inquiryNullable.HasValue) return scsiOneValue; + + Inquiry.SCSIInquiry inquiry = inquiryNullable.Value; + + switch((PeripheralQualifiers)inquiry.PeripheralQualifier) + { + case PeripheralQualifiers.Supported: + scsiOneValue.Add("Device is connected and supported."); + break; + case PeripheralQualifiers.Unconnected: + scsiOneValue.Add("Device is supported but not connected."); + break; + case PeripheralQualifiers.Reserved: + scsiOneValue.Add("Reserved value set in Peripheral Qualifier field."); + break; + case PeripheralQualifiers.Unsupported: + scsiOneValue.Add("Device is connected but unsupported."); + break; + default: + scsiOneValue.Add($"Vendor value {inquiry.PeripheralQualifier} set in Peripheral Qualifier field."); + break; + } + + switch((PeripheralDeviceTypes)inquiry.PeripheralDeviceType) + { + case PeripheralDeviceTypes.DirectAccess: //0x00, + scsiOneValue.Add("Direct-access device"); + break; + case PeripheralDeviceTypes.SequentialAccess: //0x01, + scsiOneValue.Add("Sequential-access device"); + break; + case PeripheralDeviceTypes.PrinterDevice: //0x02, + scsiOneValue.Add("Printer device"); + break; + case PeripheralDeviceTypes.ProcessorDevice: //0x03, + scsiOneValue.Add("Processor device"); + break; + case PeripheralDeviceTypes.WriteOnceDevice: //0x04, + scsiOneValue.Add("Write-once device"); + break; + case PeripheralDeviceTypes.MultiMediaDevice: //0x05, + scsiOneValue.Add("CD-ROM/DVD/etc device"); + break; + case PeripheralDeviceTypes.ScannerDevice: //0x06, + scsiOneValue.Add("Scanner device"); + break; + case PeripheralDeviceTypes.OpticalDevice: //0x07, + scsiOneValue.Add("Optical memory device"); + break; + case PeripheralDeviceTypes.MediumChangerDevice: //0x08, + scsiOneValue.Add("Medium change device"); + break; + case PeripheralDeviceTypes.CommsDevice: //0x09, + scsiOneValue.Add("Communications device"); + break; + case PeripheralDeviceTypes.PrePressDevice1: //0x0A, + scsiOneValue.Add("Graphics arts pre-press device (defined in ASC IT8)"); + break; + case PeripheralDeviceTypes.PrePressDevice2: //0x0B, + scsiOneValue.Add("Graphics arts pre-press device (defined in ASC IT8)"); + break; + case PeripheralDeviceTypes.ArrayControllerDevice: //0x0C, + scsiOneValue.Add("Array controller device"); + break; + case PeripheralDeviceTypes.EnclosureServiceDevice: //0x0D, + scsiOneValue.Add("Enclosure services device"); + break; + case PeripheralDeviceTypes.SimplifiedDevice: //0x0E, + scsiOneValue.Add("Simplified direct-access device"); + break; + case PeripheralDeviceTypes.OCRWDevice: //0x0F, + scsiOneValue.Add("Optical card reader/writer device"); + break; + case PeripheralDeviceTypes.BridgingExpander: //0x10, + scsiOneValue.Add("Bridging Expanders"); + break; + case PeripheralDeviceTypes.ObjectDevice: //0x11, + scsiOneValue.Add("Object-based Storage Device"); + break; + case PeripheralDeviceTypes.ADCDevice: //0x12, + scsiOneValue.Add("Automation/Drive Interface"); + break; + case PeripheralDeviceTypes.SCSISecurityManagerDevice: //0x13, + scsiOneValue.Add("Security Manager Device"); + break; + case PeripheralDeviceTypes.SCSIZonedBlockDevice: //0x14 + scsiOneValue.Add("Host managed zoned block device"); + break; + case PeripheralDeviceTypes.WellKnownDevice: //0x1E, + scsiOneValue.Add("Well known logical unit"); + break; + case PeripheralDeviceTypes.UnknownDevice: //0x1F + scsiOneValue.Add("Unknown or no device type"); + break; + default: + scsiOneValue.Add($"Unknown device type field value 0x{inquiry.PeripheralDeviceType:X2}"); + break; + } + + switch((ANSIVersions)inquiry.ANSIVersion) + { + case ANSIVersions.ANSINoVersion: + scsiOneValue.Add("Device does not claim to comply with any SCSI ANSI standard"); + break; + case ANSIVersions.ANSI1986Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.131:1986 (SCSI-1)"); + break; + case ANSIVersions.ANSI1994Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.131:1994 (SCSI-2)"); + break; + case ANSIVersions.ANSI1997Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.301:1997 (SPC-1)"); + break; + case ANSIVersions.ANSI2001Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.351:2001 (SPC-2)"); + break; + case ANSIVersions.ANSI2005Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.408:2005 (SPC-3)"); + break; + case ANSIVersions.ANSI2008Version: + scsiOneValue.Add("Device claims to comply with ANSI X3.408:2005 (SPC-4)"); + break; + default: + scsiOneValue + .Add($"Device claims to comply with unknown SCSI ANSI standard value 0x{inquiry.ANSIVersion:X2})"); + break; + } + + switch((ECMAVersions)inquiry.ECMAVersion) + { + case ECMAVersions.ECMANoVersion: + scsiOneValue.Add("Device does not claim to comply with any SCSI ECMA standard"); + break; + case ECMAVersions.ECMA111: + scsiOneValue.Add("Device claims to comply ECMA-111: Small Computer System Interface SCSI"); + break; + default: + scsiOneValue + .Add($"Device claims to comply with unknown SCSI ECMA standard value 0x{inquiry.ECMAVersion:X2})"); + break; + } + + switch((ISOVersions)inquiry.ISOVersion) + { + case ISOVersions.ISONoVersion: + scsiOneValue.Add("Device does not claim to comply with any SCSI ISO/IEC standard"); + break; + case ISOVersions.ISO1995Version: + scsiOneValue.Add("Device claims to comply with ISO/IEC 9316:1995"); + break; + default: + scsiOneValue + .Add($"Device claims to comply with unknown SCSI ISO/IEC standard value 0x{inquiry.ISOVersion:X2})"); + break; + } + + if(inquiry.RMB) scsiOneValue.Add("Device is removable"); + if(inquiry.AERC) scsiOneValue.Add("Device supports Asynchronous Event Reporting Capability"); + if(inquiry.TrmTsk) scsiOneValue.Add("Device supports TERMINATE TASK command"); + if(inquiry.NormACA) scsiOneValue.Add("Device supports setting Normal ACA"); + if(inquiry.HiSup) scsiOneValue.Add("Device supports LUN hierarchical addressing"); + if(inquiry.SCCS) scsiOneValue.Add("Device contains an embedded storage array controller"); + if(inquiry.ACC) scsiOneValue.Add("Device contains an Access Control Coordinator"); + if(inquiry.ThreePC) scsiOneValue.Add("Device supports third-party copy commands"); + if(inquiry.Protect) scsiOneValue.Add("Device supports protection information"); + if(inquiry.BQue) scsiOneValue.Add("Device supports basic queueing"); + if(inquiry.EncServ) scsiOneValue.Add("Device contains an embedded enclosure services component"); + if(inquiry.MultiP) scsiOneValue.Add("Multi-port device"); + if(inquiry.MChngr) scsiOneValue.Add("Device contains or is attached to a medium changer"); + if(inquiry.ACKREQQ) scsiOneValue.Add("Device supports request and acknowledge handshakes"); + if(inquiry.Addr32) scsiOneValue.Add("Device supports 32-bit wide SCSI addresses"); + if(inquiry.Addr16) scsiOneValue.Add("Device supports 16-bit wide SCSI addresses"); + if(inquiry.RelAddr) scsiOneValue.Add("Device supports relative addressing"); + if(inquiry.WBus32) scsiOneValue.Add("Device supports 32-bit wide data transfers"); + if(inquiry.WBus16) scsiOneValue.Add("Device supports 16-bit wide data transfers"); + if(inquiry.Sync) scsiOneValue.Add("Device supports synchronous data transfer"); + if(inquiry.Linked) scsiOneValue.Add("Device supports linked commands"); + if(inquiry.TranDis) scsiOneValue.Add("Device supports CONTINUE TASK and TARGET TRANSFER DISABLE commands"); + if(inquiry.QAS) scsiOneValue.Add("Device supports Quick Arbitration and Selection"); + if(inquiry.CmdQue) scsiOneValue.Add("Device supports TCQ queue"); + if(inquiry.IUS) scsiOneValue.Add("Device supports information unit transfers"); + if(inquiry.SftRe) scsiOneValue.Add("Device implements RESET as a soft reset"); + + switch((TGPSValues)inquiry.TPGS) + { + case TGPSValues.NotSupported: + scsiOneValue.Add("Device does not support assymetrical access"); + break; + case TGPSValues.OnlyImplicit: + scsiOneValue.Add("Device only supports implicit assymetrical access"); + break; + case TGPSValues.OnlyExplicit: + scsiOneValue.Add("Device only supports explicit assymetrical access"); + break; + case TGPSValues.Both: + scsiOneValue.Add("Device supports implicit and explicit assymetrical access"); + break; + default: + scsiOneValue.Add($"Unknown value in TPGS field 0x{inquiry.TPGS:X2}"); + break; + } + + switch((SPIClocking)inquiry.Clocking) + { + case SPIClocking.ST: + scsiOneValue.Add("Device supports only ST clocking"); + break; + case SPIClocking.DT: + scsiOneValue.Add("Device supports only DT clocking"); + break; + case SPIClocking.Reserved: + scsiOneValue.Add("Reserved value 0x02 found in SPI clocking field"); + break; + case SPIClocking.STandDT: + scsiOneValue.Add("Device supports ST and DT clocking"); + break; + default: + scsiOneValue.Add($"Unknown value in SPI clocking field 0x{inquiry.Clocking:X2}"); + break; + } + + if(inquiry.VersionDescriptors == null) return scsiOneValue; + + foreach(ushort versionDescriptor in inquiry.VersionDescriptors) + switch(versionDescriptor) + { + case 0xFFFF: + case 0x0000: break; + case 0x0020: + scsiOneValue.Add("Device complies with SAM (no version claimed)"); + break; + case 0x003B: + scsiOneValue.Add("Device complies with SAM T10/0994-D revision 18"); + break; + case 0x003C: + scsiOneValue.Add("Device complies with SAM ANSI INCITS 270-1996"); + break; + case 0x0040: + scsiOneValue.Add("Device complies with SAM-2 (no version claimed)"); + break; + case 0x0054: + scsiOneValue.Add("Device complies with SAM-2 T10/1157-D revision 23"); + break; + case 0x0055: + scsiOneValue.Add("Device complies with SAM-2 T10/1157-D revision 24"); + break; + case 0x005C: + scsiOneValue.Add("Device complies with SAM-2 ANSI INCITS 366-2003"); + break; + case 0x005E: + scsiOneValue.Add("Device complies with SAM-2 ISO/IEC 14776-412"); + break; + case 0x0060: + scsiOneValue.Add("Device complies with SAM-3 (no version claimed)"); + break; + case 0x0062: + scsiOneValue.Add("Device complies with SAM-3 T10/1561-D revision 7"); + break; + case 0x0075: + scsiOneValue.Add("Device complies with SAM-3 T10/1561-D revision 13"); + break; + case 0x0076: + scsiOneValue.Add("Device complies with SAM-3 T10/1561-D revision 14"); + break; + case 0x0077: + scsiOneValue.Add("Device complies with SAM-3 ANSI INCITS 402-2005"); + break; + case 0x0080: + scsiOneValue.Add("Device complies with SAM-4 (no version claimed)"); + break; + case 0x0087: + scsiOneValue.Add("Device complies with SAM-4 T10/1683-D revision 13"); + break; + case 0x008B: + scsiOneValue.Add("Device complies with SAM-4 T10/1683-D revision 14"); + break; + case 0x0090: + scsiOneValue.Add("Device complies with SAM-4 ANSI INCITS 447-2008"); + break; + case 0x0092: + scsiOneValue.Add("Device complies with SAM-4 ISO/IEC 14776-414"); + break; + case 0x00A0: + scsiOneValue.Add("Device complies with SAM-5 (no version claimed)"); + break; + case 0x00A2: + scsiOneValue.Add("Device complies with SAM-5 T10/2104-D revision 4"); + break; + case 0x00A4: + scsiOneValue.Add("Device complies with SAM-5 T10/2104-D revision 20"); + break; + case 0x00A6: + scsiOneValue.Add("Device complies with SAM-5 T10/2104-D revision 21"); + break; + case 0x00C0: + scsiOneValue.Add("Device complies with SAM-6 (no version claimed)"); + break; + case 0x0120: + scsiOneValue.Add("Device complies with SPC (no version claimed)"); + break; + case 0x013B: + scsiOneValue.Add("Device complies with SPC T10/0995-D revision 11a"); + break; + case 0x013C: + scsiOneValue.Add("Device complies with SPC ANSI INCITS 301-1997"); + break; + case 0x0140: + scsiOneValue.Add("Device complies with MMC (no version claimed)"); + break; + case 0x015B: + scsiOneValue.Add("Device complies with MMC T10/1048-D revision 10a"); + break; + case 0x015C: + scsiOneValue.Add("Device complies with MMC ANSI INCITS 304-1997"); + break; + case 0x0160: + scsiOneValue.Add("Device complies with SCC (no version claimed)"); + break; + case 0x017B: + scsiOneValue.Add("Device complies with SCC T10/1047-D revision 06c"); + break; + case 0x017C: + scsiOneValue.Add("Device complies with SCC ANSI INCITS 276-1997"); + break; + case 0x0180: + scsiOneValue.Add("Device complies with SBC (no version claimed)"); + break; + case 0x019B: + scsiOneValue.Add("Device complies with SBC T10/0996-D revision 08c"); + break; + case 0x019C: + scsiOneValue.Add("Device complies with SBC ANSI INCITS 306-1998"); + break; + case 0x01A0: + scsiOneValue.Add("Device complies with SMC (no version claimed)"); + break; + case 0x01BB: + scsiOneValue.Add("Device complies with SMC T10/0999-D revision 10a"); + break; + case 0x01BC: + scsiOneValue.Add("Device complies with SMC ANSI INCITS 314-1998"); + break; + case 0x01BE: + scsiOneValue.Add("Device complies with SMC ISO/IEC 14776-351"); + break; + case 0x01C0: + scsiOneValue.Add("Device complies with SES (no version claimed)"); + break; + case 0x01DB: + scsiOneValue.Add("Device complies with SES T10/1212-D revision 08b"); + break; + case 0x01DC: + scsiOneValue.Add("Device complies with SES ANSI INCITS 305-1998"); + break; + case 0x01DD: + scsiOneValue + .Add("Device complies with SES T10/1212 revision 08b w/ Amendment ANSI INCITS.305/AM1-2000"); + break; + case 0x01DE: + scsiOneValue + .Add("Device complies with SES ANSI INCITS 305-1998 w/ Amendment ANSI INCITS.305/AM1-2000"); + break; + case 0x01E0: + scsiOneValue.Add("Device complies with SCC-2 (no version claimed)"); + break; + case 0x01FB: + scsiOneValue.Add("Device complies with SCC-2 T10/1125-D revision 04"); + break; + case 0x01FC: + scsiOneValue.Add("Device complies with SCC-2 ANSI INCITS 318-1998"); + break; + case 0x0200: + scsiOneValue.Add("Device complies with SSC (no version claimed)"); + break; + case 0x0201: + scsiOneValue.Add("Device complies with SSC T10/0997-D revision 17"); + break; + case 0x0207: + scsiOneValue.Add("Device complies with SSC T10/0997-D revision 22"); + break; + case 0x021C: + scsiOneValue.Add("Device complies with SSC ANSI INCITS 335-2000"); + break; + case 0x0220: + scsiOneValue.Add("Device complies with RBC (no version claimed)"); + break; + case 0x0238: + scsiOneValue.Add("Device complies with RBC T10/1240-D revision 10a"); + break; + case 0x023C: + scsiOneValue.Add("Device complies with RBC ANSI INCITS 330-2000"); + break; + case 0x0240: + scsiOneValue.Add("Device complies with MMC-2 (no version claimed)"); + break; + case 0x0255: + scsiOneValue.Add("Device complies with MMC-2 T10/1228-D revision 11"); + break; + case 0x025B: + scsiOneValue.Add("Device complies with MMC-2 T10/1228-D revision 11a"); + break; + case 0x025C: + scsiOneValue.Add("Device complies with MMC-2 ANSI INCITS 333-2000"); + break; + case 0x0260: + scsiOneValue.Add("Device complies with SPC-2 (no version claimed)"); + break; + case 0x0267: + scsiOneValue.Add("Device complies with SPC-2 T10/1236-D revision 12"); + break; + case 0x0269: + scsiOneValue.Add("Device complies with SPC-2 T10/1236-D revision 18"); + break; + case 0x0275: + scsiOneValue.Add("Device complies with SPC-2 T10/1236-D revision 19"); + break; + case 0x0276: + scsiOneValue.Add("Device complies with SPC-2 T10/1236-D revision 20"); + break; + case 0x0277: + scsiOneValue.Add("Device complies with SPC-2 ANSI INCITS 351-2001"); + break; + case 0x0278: + scsiOneValue.Add("Device complies with SPC-2 ISO/IEC 14776-452"); + break; + case 0x0280: + scsiOneValue.Add("Device complies with OCRW (no version claimed)"); + break; + case 0x029E: + scsiOneValue.Add("Device complies with OCRW ISO/IEC 14776-381"); + break; + case 0x02A0: + scsiOneValue.Add("Device complies with MMC-3 (no version claimed)"); + break; + case 0x02B5: + scsiOneValue.Add("Device complies with MMC-3 T10/1363-D revision 9"); + break; + case 0x02B6: + scsiOneValue.Add("Device complies with MMC-3 T10/1363-D revision 10g"); + break; + case 0x02B8: + scsiOneValue.Add("Device complies with MMC-3 ANSI INCITS 360-2002"); + break; + case 0x02E0: + scsiOneValue.Add("Device complies with SMC-2 (no version claimed)"); + break; + case 0x02F5: + scsiOneValue.Add("Device complies with SMC-2 T10/1383-D revision 5"); + break; + case 0x02FC: + scsiOneValue.Add("Device complies with SMC-2 T10/1383-D revision 6"); + break; + case 0x02FD: + scsiOneValue.Add("Device complies with SMC-2 T10/1383-D revision 7"); + break; + case 0x02FE: + scsiOneValue.Add("Device complies with SMC-2 ANSI INCITS 382-2004"); + break; + case 0x0300: + scsiOneValue.Add("Device complies with SPC-3 (no version claimed)"); + break; + case 0x0301: + scsiOneValue.Add("Device complies with SPC-3 T10/1416-D revision 7"); + break; + case 0x0307: + scsiOneValue.Add("Device complies with SPC-3 T10/1416-D revision 21"); + break; + case 0x030F: + scsiOneValue.Add("Device complies with SPC-3 T10/1416-D revision 22"); + break; + case 0x0312: + scsiOneValue.Add("Device complies with SPC-3 T10/1416-D revision 23"); + break; + case 0x0314: + scsiOneValue.Add("Device complies with SPC-3 ANSI INCITS 408-2005"); + break; + case 0x0316: + scsiOneValue.Add("Device complies with SPC-3 ISO/IEC 14776-453"); + break; + case 0x0320: + scsiOneValue.Add("Device complies with SBC-2 (no version claimed)"); + break; + case 0x0322: + scsiOneValue.Add("Device complies with SBC-2 T10/1417-D revision 5a"); + break; + case 0x0324: + scsiOneValue.Add("Device complies with SBC-2 T10/1417-D revision 15"); + break; + case 0x033B: + scsiOneValue.Add("Device complies with SBC-2 T10/1417-D revision 16"); + break; + case 0x033D: + scsiOneValue.Add("Device complies with SBC-2 ANSI INCITS 405-2005"); + break; + case 0x033E: + scsiOneValue.Add("Device complies with SBC-2 ISO/IEC 14776-322"); + break; + case 0x0340: + scsiOneValue.Add("Device complies with OSD (no version claimed)"); + break; + case 0x0341: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 0"); + break; + case 0x0342: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 7a"); + break; + case 0x0343: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 8"); + break; + case 0x0344: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 9"); + break; + case 0x0355: + scsiOneValue.Add("Device complies with OSD T10/1355-D revision 10"); + break; + case 0x0356: + scsiOneValue.Add("Device complies with OSD ANSI INCITS 400-2004"); + break; + case 0x0360: + scsiOneValue.Add("Device complies with SSC-2 (no version claimed)"); + break; + case 0x0374: + scsiOneValue.Add("Device complies with SSC-2 T10/1434-D revision 7"); + break; + case 0x0375: + scsiOneValue.Add("Device complies with SSC-2 T10/1434-D revision 9"); + break; + case 0x037D: + scsiOneValue.Add("Device complies with SSC-2 ANSI INCITS 380-2003"); + break; + case 0x0380: + scsiOneValue.Add("Device complies with BCC (no version claimed)"); + break; + case 0x03A0: + scsiOneValue.Add("Device complies with MMC-4 (no version claimed)"); + break; + case 0x03B0: + scsiOneValue.Add("Device complies with MMC-4 T10/1545-D revision 5"); + break; + case 0x03B1: + scsiOneValue.Add("Device complies with MMC-4 T10/1545-D revision 5a"); + break; + case 0x03BD: + scsiOneValue.Add("Device complies with MMC-4 T10/1545-D revision 3"); + break; + case 0x03BE: + scsiOneValue.Add("Device complies with MMC-4 T10/1545-D revision 3d"); + break; + case 0x03BF: + scsiOneValue.Add("Device complies with MMC-4 ANSI INCITS 401-2005"); + break; + case 0x03C0: + scsiOneValue.Add("Device complies with ADC (no version claimed)"); + break; + case 0x03D5: + scsiOneValue.Add("Device complies with ADC T10/1558-D revision 6"); + break; + case 0x03D6: + scsiOneValue.Add("Device complies with ADC T10/1558-D revision 7"); + break; + case 0x03D7: + scsiOneValue.Add("Device complies with ADC ANSI INCITS 403-2005"); + break; + case 0x03E0: + scsiOneValue.Add("Device complies with SES-2 (no version claimed)"); + break; + case 0x03E1: + scsiOneValue.Add("Device complies with SES-2 T10/1559-D revision 16"); + break; + case 0x03E7: + scsiOneValue.Add("Device complies with SES-2 T10/1559-D revision 19"); + break; + case 0x03EB: + scsiOneValue.Add("Device complies with SES-2 T10/1559-D revision 20"); + break; + case 0x03F0: + scsiOneValue.Add("Device complies with SES-2 ANSI INCITS 448-2008"); + break; + case 0x03F2: + scsiOneValue.Add("Device complies with SES-2 ISO/IEC 14776-372"); + break; + case 0x0400: + scsiOneValue.Add("Device complies with SSC-3 (no version claimed)"); + break; + case 0x0403: + scsiOneValue.Add("Device complies with SSC-3 T10/1611-D revision 04a"); + break; + case 0x0407: + scsiOneValue.Add("Device complies with SSC-3 T10/1611-D revision 05"); + break; + case 0x0409: + scsiOneValue.Add("Device complies with SSC-3 ANSI INCITS 467-2011"); + break; + case 0x040B: + scsiOneValue.Add("Device complies with SSC-3 ISO/IEC 14776-333:2013"); + break; + case 0x0420: + scsiOneValue.Add("Device complies with MMC-5 (no version claimed)"); + break; + case 0x042F: + scsiOneValue.Add("Device complies with MMC-5 T10/1675-D revision 03"); + break; + case 0x0431: + scsiOneValue.Add("Device complies with MMC-5 T10/1675-D revision 03b"); + break; + case 0x0432: + scsiOneValue.Add("Device complies with MMC-5 T10/1675-D revision 04"); + break; + case 0x0434: + scsiOneValue.Add("Device complies with MMC-5 ANSI INCITS 430-2007"); + break; + case 0x0440: + scsiOneValue.Add("Device complies with OSD-2 (no version claimed)"); + break; + case 0x0444: + scsiOneValue.Add("Device complies with OSD-2 T10/1729-D revision 4"); + break; + case 0x0446: + scsiOneValue.Add("Device complies with OSD-2 T10/1729-D revision 5"); + break; + case 0x0448: + scsiOneValue.Add("Device complies with OSD-2 ANSI INCITS 458-2011"); + break; + case 0x0460: + scsiOneValue.Add("Device complies with SPC-4 (no version claimed)"); + break; + case 0x0461: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 16"); + break; + case 0x0462: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 18"); + break; + case 0x0463: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 23"); + break; + case 0x0466: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 36"); + break; + case 0x0468: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 37"); + break; + case 0x0469: + scsiOneValue.Add("Device complies with SPC-4 T10/BSR INCITS 513 revision 37a"); + break; + case 0x046C: + scsiOneValue.Add("Device complies with SPC-4 ANSI INCITS 513-2015"); + break; + case 0x0480: + scsiOneValue.Add("Device complies with SMC-3 (no version claimed)"); + break; + case 0x0482: + scsiOneValue.Add("Device complies with SMC-3 T10/1730-D revision 15"); + break; + case 0x0484: + scsiOneValue.Add("Device complies with SMC-3 T10/1730-D revision 16"); + break; + case 0x0486: + scsiOneValue.Add("Device complies with SMC-3 ANSI INCITS 484-2012"); + break; + case 0x04A0: + scsiOneValue.Add("Device complies with ADC-2 (no version claimed)"); + break; + case 0x04A7: + scsiOneValue.Add("Device complies with ADC-2 T10/1741-D revision 7"); + break; + case 0x04AA: + scsiOneValue.Add("Device complies with ADC-2 T10/1741-D revision 8"); + break; + case 0x04AC: + scsiOneValue.Add("Device complies with ADC-2 ANSI INCITS 441-2008"); + break; + case 0x04C0: + scsiOneValue.Add("Device complies with SBC-3 (no version claimed)"); + break; + case 0x04C3: + scsiOneValue.Add("Device complies with SBC-3 T10/BSR INCITS 514 revision 35"); + break; + case 0x04C5: + scsiOneValue.Add("Device complies with SBC-3 T10/BSR INCITS 514 revision 36"); + break; + case 0x04C8: + scsiOneValue.Add("Device complies with SBC-3 ANSI INCITS 514-2014"); + break; + case 0x04E0: + scsiOneValue.Add("Device complies with MMC-6 (no version claimed)"); + break; + case 0x04E3: + scsiOneValue.Add("Device complies with MMC-6 T10/1836-D revision 02b"); + break; + case 0x04E5: + scsiOneValue.Add("Device complies with MMC-6 T10/1836-D revision 02g"); + break; + case 0x04E6: + scsiOneValue.Add("Device complies with MMC-6 ANSI INCITS 468-2010"); + break; + case 0x04E7: + scsiOneValue + .Add("Device complies with MMC-6 ANSI INCITS 468-2010 + MMC-6/AM1 ANSI INCITS 468-2010/AM 1"); + break; + case 0x0500: + scsiOneValue.Add("Device complies with ADC-3 (no version claimed)"); + break; + case 0x0502: + scsiOneValue.Add("Device complies with ADC-3 T10/1895-D revision 04"); + break; + case 0x0504: + scsiOneValue.Add("Device complies with ADC-3 T10/1895-D revision 05"); + break; + case 0x0506: + scsiOneValue.Add("Device complies with ADC-3 T10/1895-D revision 05a"); + break; + case 0x050A: + scsiOneValue.Add("Device complies with ADC-3 ANSI INCITS 497-2012"); + break; + case 0x0520: + scsiOneValue.Add("Device complies with SSC-4 (no version claimed)"); + break; + case 0x0523: + scsiOneValue.Add("Device complies with SSC-4 T10/BSR INCITS 516 revision 2"); + break; + case 0x0525: + scsiOneValue.Add("Device complies with SSC-4 T10/BSR INCITS 516 revision 3"); + break; + case 0x0527: + scsiOneValue.Add("Device complies with SSC-4 ANSI INCITS 516-2013"); + break; + case 0x0560: + scsiOneValue.Add("Device complies with OSD-3 (no version claimed)"); + break; + case 0x0580: + scsiOneValue.Add("Device complies with SES-3 (no version claimed)"); + break; + case 0x05A0: + scsiOneValue.Add("Device complies with SSC-5 (no version claimed)"); + break; + case 0x05C0: + scsiOneValue.Add("Device complies with SPC-5 (no version claimed)"); + break; + case 0x05E0: + scsiOneValue.Add("Device complies with SFSC (no version claimed)"); + break; + case 0x05E3: + scsiOneValue.Add("Device complies with SFSC BSR INCITS 501 revision 01"); + break; + case 0x0600: + scsiOneValue.Add("Device complies with SBC-4 (no version claimed)"); + break; + case 0x0620: + scsiOneValue.Add("Device complies with ZBC (no version claimed)"); + break; + case 0x0622: + scsiOneValue.Add("Device complies with ZBC BSR INCITS 536 revision 02"); + break; + case 0x0640: + scsiOneValue.Add("Device complies with ADC-4 (no version claimed)"); + break; + case 0x0820: + scsiOneValue.Add("Device complies with SSA-TL2 (no version claimed)"); + break; + case 0x083B: + scsiOneValue.Add("Device complies with SSA-TL2 T10.1/1147-D revision 05b"); + break; + case 0x083C: + scsiOneValue.Add("Device complies with SSA-TL2 ANSI INCITS 308-1998"); + break; + case 0x0840: + scsiOneValue.Add("Device complies with SSA-TL1 (no version claimed)"); + break; + case 0x085B: + scsiOneValue.Add("Device complies with SSA-TL1 T10.1/0989-D revision 10b"); + break; + case 0x085C: + scsiOneValue.Add("Device complies with SSA-TL1 ANSI INCITS 295-1996"); + break; + case 0x0860: + scsiOneValue.Add("Device complies with SSA-S3P (no version claimed)"); + break; + case 0x087B: + scsiOneValue.Add("Device complies with SSA-S3P T10.1/1051-D revision 05b"); + break; + case 0x087C: + scsiOneValue.Add("Device complies with SSA-S3P ANSI INCITS 309-1998"); + break; + case 0x0880: + scsiOneValue.Add("Device complies with SSA-S2P (no version claimed)"); + break; + case 0x089B: + scsiOneValue.Add("Device complies with SSA-S2P T10.1/1121-D revision 07b"); + break; + case 0x089C: + scsiOneValue.Add("Device complies with SSA-S2P ANSI INCITS 294-1996"); + break; + case 0x08A0: + scsiOneValue.Add("Device complies with SIP (no version claimed)"); + break; + case 0x08BB: + scsiOneValue.Add("Device complies with SIP T10/0856-D revision 10"); + break; + case 0x08BC: + scsiOneValue.Add("Device complies with SIP ANSI INCITS 292-1997"); + break; + case 0x08C0: + scsiOneValue.Add("Device complies with FCP (no version claimed)"); + break; + case 0x08DB: + scsiOneValue.Add("Device complies with FCP T10/0993-D revision 12"); + break; + case 0x08DC: + scsiOneValue.Add("Device complies with FCP ANSI INCITS 269-1996"); + break; + case 0x08E0: + scsiOneValue.Add("Device complies with SBP-2 (no version claimed)"); + break; + case 0x08FB: + scsiOneValue.Add("Device complies with SBP-2 T10/1155-D revision 04"); + break; + case 0x08FC: + scsiOneValue.Add("Device complies with SBP-2 ANSI INCITS 325-1998"); + break; + case 0x0900: + scsiOneValue.Add("Device complies with FCP-2 (no version claimed)"); + break; + case 0x0901: + scsiOneValue.Add("Device complies with FCP-2 T10/1144-D revision 4"); + break; + case 0x0915: + scsiOneValue.Add("Device complies with FCP-2 T10/1144-D revision 7"); + break; + case 0x0916: + scsiOneValue.Add("Device complies with FCP-2 T10/1144-D revision 7a"); + break; + case 0x0917: + scsiOneValue.Add("Device complies with FCP-2 ANSI INCITS 350-2003"); + break; + case 0x0918: + scsiOneValue.Add("Device complies with FCP-2 T10/1144-D revision 8"); + break; + case 0x0920: + scsiOneValue.Add("Device complies with SST (no version claimed)"); + break; + case 0x0935: + scsiOneValue.Add("Device complies with SST T10/1380-D revision 8b"); + break; + case 0x0940: + scsiOneValue.Add("Device complies with SRP (no version claimed)"); + break; + case 0x0954: + scsiOneValue.Add("Device complies with SRP T10/1415-D revision 10"); + break; + case 0x0955: + scsiOneValue.Add("Device complies with SRP T10/1415-D revision 16a"); + break; + case 0x095C: + scsiOneValue.Add("Device complies with SRP ANSI INCITS 365-2002"); + break; + case 0x0960: + scsiOneValue.Add("Device complies with iSCSI (no version claimed)"); + break; + case 0x0961: + case 0x0962: + case 0x0963: + case 0x0964: + case 0x0965: + case 0x0966: + case 0x0967: + case 0x0968: + case 0x0969: + case 0x096A: + case 0x096B: + case 0x096C: + case 0x096D: + case 0x096E: + case 0x096F: + case 0x0970: + case 0x0971: + case 0x0972: + case 0x0973: + case 0x0974: + case 0x0975: + case 0x0976: + case 0x0977: + case 0x0978: + case 0x0979: + case 0x097A: + case 0x097B: + case 0x097C: + case 0x097D: + case 0x097E: + case 0x097F: + scsiOneValue.Add($"Device complies with iSCSI revision {versionDescriptor & 0x1F}"); + break; + case 0x0980: + scsiOneValue.Add("Device complies with SBP-3 (no version claimed)"); + break; + case 0x0982: + scsiOneValue.Add("Device complies with SBP-3 T10/1467-D revision 1f"); + break; + case 0x0994: + scsiOneValue.Add("Device complies with SBP-3 T10/1467-D revision 3"); + break; + case 0x099A: + scsiOneValue.Add("Device complies with SBP-3 T10/1467-D revision 4"); + break; + case 0x099B: + scsiOneValue.Add("Device complies with SBP-3 T10/1467-D revision 5"); + break; + case 0x099C: + scsiOneValue.Add("Device complies with SBP-3 ANSI INCITS 375-2004"); + break; + case 0x09C0: + scsiOneValue.Add("Device complies with ADP (no version claimed)"); + break; + case 0x09E0: + scsiOneValue.Add("Device complies with ADT (no version claimed)"); + break; + case 0x09F9: + scsiOneValue.Add("Device complies with ADT T10/1557-D revision 11"); + break; + case 0x09FA: + scsiOneValue.Add("Device complies with ADT T10/1557-D revision 14"); + break; + case 0x09FD: + scsiOneValue.Add("Device complies with ADT ANSI INCITS 406-2005"); + break; + case 0x0A00: + scsiOneValue.Add("Device complies with FCP-3 (no version claimed)"); + break; + case 0x0A07: + scsiOneValue.Add("Device complies with FCP-3 T10/1560-D revision 3f"); + break; + case 0x0A0F: + scsiOneValue.Add("Device complies with FCP-3 T10/1560-D revision 4"); + break; + case 0x0A11: + scsiOneValue.Add("Device complies with FCP-3 ANSI INCITS 416-2006"); + break; + case 0x0A1C: + scsiOneValue.Add("Device complies with FCP-3 ISO/IEC 14776-223"); + break; + case 0x0A20: + scsiOneValue.Add("Device complies with ADT-2 (no version claimed)"); + break; + case 0x0A22: + scsiOneValue.Add("Device complies with ADT-2 T10/1742-D revision 06"); + break; + case 0x0A27: + scsiOneValue.Add("Device complies with ADT-2 T10/1742-D revision 08"); + break; + case 0x0A28: + scsiOneValue.Add("Device complies with ADT-2 T10/1742-D revision 09"); + break; + case 0x0A2B: + scsiOneValue.Add("Device complies with ADT-2 ANSI INCITS 472-2011"); + break; + case 0x0A40: + scsiOneValue.Add("Device complies with FCP-4 (no version claimed)"); + break; + case 0x0A42: + scsiOneValue.Add("Device complies with FCP-4 T10/1828-D revision 01"); + break; + case 0x0A44: + scsiOneValue.Add("Device complies with FCP-4 T10/1828-D revision 02"); + break; + case 0x0A45: + scsiOneValue.Add("Device complies with FCP-4 T10/1828-D revision 02b"); + break; + case 0x0A46: + scsiOneValue.Add("Device complies with FCP-4 ANSI INCITS 481-2012"); + break; + case 0x0A60: + scsiOneValue.Add("Device complies with ADT-3 (no version claimed)"); + break; + case 0x0AA0: + scsiOneValue.Add("Device complies with SPI (no version claimed)"); + break; + case 0x0AB9: + scsiOneValue.Add("Device complies with SPI T10/0855-D revision 15a"); + break; + case 0x0ABA: + scsiOneValue.Add("Device complies with SPI ANSI INCITS 253-1995"); + break; + case 0x0ABB: + scsiOneValue.Add("Device complies with SPI T10/0855-D revision 15a with SPI Amnd revision 3a"); + break; + case 0x0ABC: + scsiOneValue + .Add("Device complies with SPI ANSI INCITS 253-1995 with SPI Amnd ANSI INCITS 253/AM1-1998"); + break; + case 0x0AC0: + scsiOneValue.Add("Device complies with Fast-20 (no version claimed)"); + break; + case 0x0ADB: + scsiOneValue.Add("Device complies with Fast-20 T10/1071 revision 06"); + break; + case 0x0ADC: + scsiOneValue.Add("Device complies with Fast-20 ANSI INCITS 277-1996"); + break; + case 0x0AE0: + scsiOneValue.Add("Device complies with SPI-2 (no version claimed)"); + break; + case 0x0AFB: + scsiOneValue.Add("Device complies with SPI-2 T10/1142-D revision 20b"); + break; + case 0x0AFC: + scsiOneValue.Add("Device complies with SPI-2 ANSI INCITS 302-1999"); + break; + case 0x0B00: + scsiOneValue.Add("Device complies with SPI-3 (no version claimed)"); + break; + case 0x0B18: + scsiOneValue.Add("Device complies with SPI-3 T10/1302-D revision 10"); + break; + case 0x0B19: + scsiOneValue.Add("Device complies with SPI-3 T10/1302-D revision 13a"); + break; + case 0x0B1A: + scsiOneValue.Add("Device complies with SPI-3 T10/1302-D revision 14"); + break; + case 0x0B1C: + scsiOneValue.Add("Device complies with SPI-3 ANSI INCITS 336-2000"); + break; + case 0x0B20: + scsiOneValue.Add("Device complies with EPI (no version claimed)"); + break; + case 0x0B3B: + scsiOneValue.Add("Device complies with EPI T10/1134 revision 16"); + break; + case 0x0B3C: + scsiOneValue.Add("Device complies with EPI ANSI INCITS TR-23 1999"); + break; + case 0x0B40: + scsiOneValue.Add("Device complies with SPI-4 (no version claimed)"); + break; + case 0x0B54: + scsiOneValue.Add("Device complies with SPI-4 T10/1365-D revision 7"); + break; + case 0x0B55: + scsiOneValue.Add("Device complies with SPI-4 T10/1365-D revision 9"); + break; + case 0x0B56: + scsiOneValue.Add("Device complies with SPI-4 ANSI INCITS 362-2002"); + break; + case 0x0B59: + scsiOneValue.Add("Device complies with SPI-4 T10/1365-D revision 10"); + break; + case 0x0B60: + scsiOneValue.Add("Device complies with SPI-5 (no version claimed)"); + break; + case 0x0B79: + scsiOneValue.Add("Device complies with SPI-5 T10/1525-D revision 3"); + break; + case 0x0B7A: + scsiOneValue.Add("Device complies with SPI-5 T10/1525-D revision 5"); + break; + case 0x0B7B: + scsiOneValue.Add("Device complies with SPI-5 T10/1525-D revision 6"); + break; + case 0x0B7C: + scsiOneValue.Add("Device complies with SPI-5 ANSI INCITS 367-2003"); + break; + case 0x0BE0: + scsiOneValue.Add("Device complies with SAS (no version claimed)"); + break; + case 0x0BE1: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 01"); + break; + case 0x0BF5: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 03"); + break; + case 0x0BFA: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 04"); + break; + case 0x0BFB: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 04"); + break; + case 0x0BFC: + scsiOneValue.Add("Device complies with SAS T10/1562-D revision 05"); + break; + case 0x0BFD: + scsiOneValue.Add("Device complies with SAS ANSI INCITS 376-2003"); + break; + case 0x0C00: + scsiOneValue.Add("Device complies with SAS-1.1 (no version claimed)"); + break; + case 0x0C07: + scsiOneValue.Add("Device complies with SAS-1.1 T10/1601-D revision 9"); + break; + case 0x0C0F: + scsiOneValue.Add("Device complies with SAS-1.1 T10/1601-D revision 10"); + break; + case 0x0C11: + scsiOneValue.Add("Device complies with SAS-1.1 ANSI INCITS 417-2006"); + break; + case 0x0C12: + scsiOneValue.Add("Device complies with SAS-1.1 ISO/IEC 14776-151"); + break; + case 0x0C20: + scsiOneValue.Add("Device complies with SAS-2 (no version claimed)"); + break; + case 0x0C23: + scsiOneValue.Add("Device complies with SAS-2 T10/1760-D revision 14"); + break; + case 0x0C27: + scsiOneValue.Add("Device complies with SAS-2 T10/1760-D revision 15"); + break; + case 0x0C28: + scsiOneValue.Add("Device complies with SAS-2 T10/1760-D revision 16"); + break; + case 0x0C2A: + scsiOneValue.Add("Device complies with SAS-2 ANSI INCITS 457-2010"); + break; + case 0x0C40: + scsiOneValue.Add("Device complies with SAS-2.1 (no version claimed)"); + break; + case 0x0C48: + scsiOneValue.Add("Device complies with SAS-2.1 T10/2125-D revision 04"); + break; + case 0x0C4A: + scsiOneValue.Add("Device complies with SAS-2.1 T10/2125-D revision 06"); + break; + case 0x0C4B: + scsiOneValue.Add("Device complies with SAS-2.1 T10/2125-D revision 07"); + break; + case 0x0C4E: + scsiOneValue.Add("Device complies with SAS-2.1 ANSI INCITS 478-2011"); + break; + case 0x0C4F: + scsiOneValue + .Add("Device complies with SAS-2.1 ANSI INCITS 478-2011 w/ Amnd 1 ANSI INCITS 478/AM1-2014"); + break; + case 0x0C52: + scsiOneValue.Add("Device complies with SAS-2.1 ISO/IEC 14776-153"); + break; + case 0x0C60: + scsiOneValue.Add("Device complies with SAS-3 (no version claimed)"); + break; + case 0x0C63: + scsiOneValue.Add("Device complies with SAS-3 T10/BSR INCITS 519 revision 05a"); + break; + case 0x0C65: + scsiOneValue.Add("Device complies with SAS-3 T10/BSR INCITS 519 revision 06"); + break; + case 0x0C68: + scsiOneValue.Add("Device complies with SAS-3 ANSI INCITS 519-2014"); + break; + case 0x0C80: + scsiOneValue.Add("Device complies with SAS-4 (no version claimed)"); + break; + case 0x0D20: + scsiOneValue.Add("Device complies with FC-PH (no version claimed)"); + break; + case 0x0D3B: + scsiOneValue.Add("Device complies with FC-PH ANSI INCITS 230-1994"); + break; + case 0x0D3C: + scsiOneValue + .Add("Device complies with FC-PH ANSI INCITS 230-1994 with Amnd 1 ANSI INCITS 230/AM1-1996"); + break; + case 0x0D40: + scsiOneValue.Add("Device complies with FC-AL (no version claimed)"); + break; + case 0x0D5C: + scsiOneValue.Add("Device complies with FC-AL ANSI INCITS 272-1996"); + break; + case 0x0D60: + scsiOneValue.Add("Device complies with FC-AL-2 (no version claimed)"); + break; + case 0x0D61: + scsiOneValue.Add("Device complies with FC-AL-2 T11/1133-D revision 7.0"); + break; + case 0x0D63: + scsiOneValue.Add("Device complies with FC-AL-2 ANSI INCITS 332-1999 with AM1-2003 & AM2-2006"); + break; + case 0x0D64: + scsiOneValue.Add("Device complies with FC-AL-2 ANSI INCITS 332-1999 with Amnd 2 AM2-2006"); + break; + case 0x0D65: + scsiOneValue.Add("Device complies with FC-AL-2 ISO/IEC 14165-122 with AM1 & AM2"); + break; + case 0x0D7C: + scsiOneValue.Add("Device complies with FC-AL-2 ANSI INCITS 332-1999"); + break; + case 0x0D7D: + scsiOneValue.Add("Device complies with FC-AL-2 ANSI INCITS 332-1999 with Amnd 1 AM1-2003"); + break; + case 0x0D80: + scsiOneValue.Add("Device complies with FC-PH-3 (no version claimed)"); + break; + case 0x0D9C: + scsiOneValue.Add("Device complies with FC-PH-3 ANSI INCITS 303-1998"); + break; + case 0x0DA0: + scsiOneValue.Add("Device complies with FC-FS (no version claimed)"); + break; + case 0x0DB7: + scsiOneValue.Add("Device complies with FC-FS T11/1331-D revision 1.2"); + break; + case 0x0DB8: + scsiOneValue.Add("Device complies with FC-FS T11/1331-D revision 1.7"); + break; + case 0x0DBC: + scsiOneValue.Add("Device complies with FC-FS ANSI INCITS 373-2003"); + break; + case 0x0DBD: + scsiOneValue.Add("Device complies with FC-FS ISO/IEC 14165-251"); + break; + case 0x0DC0: + scsiOneValue.Add("Device complies with FC-PI (no version claimed)"); + break; + case 0x0DDC: + scsiOneValue.Add("Device complies with FC-PI ANSI INCITS 352-2002"); + break; + case 0x0DE0: + scsiOneValue.Add("Device complies with FC-PI-2 (no version claimed)"); + break; + case 0x0DE2: + scsiOneValue.Add("Device complies with FC-PI-2 T11/1506-D revision 5.0"); + break; + case 0x0DE4: + scsiOneValue.Add("Device complies with FC-PI-2 ANSI INCITS 404-2006"); + break; + case 0x0E00: + scsiOneValue.Add("Device complies with FC-FS-2 (no version claimed)"); + break; + case 0x0E02: + scsiOneValue.Add("Device complies with FC-FS-2 ANSI INCITS 242-2007"); + break; + case 0x0E03: + scsiOneValue + .Add("Device complies with FC-FS-2 ANSI INCITS 242-2007 with AM1 ANSI INCITS 242/AM1-2007"); + break; + case 0x0E20: + scsiOneValue.Add("Device complies with FC-LS (no version claimed)"); + break; + case 0x0E21: + scsiOneValue.Add("Device complies with FC-LS T11/1620-D revision 1.62"); + break; + case 0x0E29: + scsiOneValue.Add("Device complies with FC-LS ANSI INCITS 433-2007"); + break; + case 0x0E40: + scsiOneValue.Add("Device complies with FC-SP (no version claimed)"); + break; + case 0x0E42: + scsiOneValue.Add("Device complies with FC-SP T11/1570-D revision 1.6"); + break; + case 0x0E45: + scsiOneValue.Add("Device complies with FC-SP ANSI INCITS 426-2007"); + break; + case 0x0E60: + scsiOneValue.Add("Device complies with FC-PI-3 (no version claimed)"); + break; + case 0x0E62: + scsiOneValue.Add("Device complies with FC-PI-3 T11/1625-D revision 2.0"); + break; + case 0x0E68: + scsiOneValue.Add("Device complies with FC-PI-3 T11/1625-D revision 2.1"); + break; + case 0x0E6A: + scsiOneValue.Add("Device complies with FC-PI-3 T11/1625-D revision 4.0"); + break; + case 0x0E6E: + scsiOneValue.Add("Device complies with FC-PI-3 ANSI INCITS 460-2011"); + break; + case 0x0E80: + scsiOneValue.Add("Device complies with FC-PI-4 (no version claimed)"); + break; + case 0x0E82: + scsiOneValue.Add("Device complies with FC-PI-4 T11/1647-D revision 8.0"); + break; + case 0x0E88: + scsiOneValue.Add("Device complies with FC-PI-4 ANSI INCITS 450-2009"); + break; + case 0x0EA0: + scsiOneValue.Add("Device complies with FC 10GFC (no version claimed)"); + break; + case 0x0EA2: + scsiOneValue.Add("Device complies with FC 10GFC ANSI INCITS 364-2003"); + break; + case 0x0EA3: + scsiOneValue.Add("Device complies with FC 10GFC ISO/IEC 14165-116"); + break; + case 0x0EA5: + scsiOneValue.Add("Device complies with FC 10GFC ISO/IEC 14165-116 with AM1"); + break; + case 0x0EA6: + scsiOneValue + .Add("Device complies with FC 10GFC ANSI INCITS 364-2003 with AM1 ANSI INCITS 364/AM1-2007"); + break; + case 0x0EC0: + scsiOneValue.Add("Device complies with FC-SP-2 (no version claimed)"); + break; + case 0x0EE0: + scsiOneValue.Add("Device complies with FC-FS-3 (no version claimed)"); + break; + case 0x0EE2: + scsiOneValue.Add("Device complies with FC-FS-3 T11/1861-D revision 0.9"); + break; + case 0x0EE7: + scsiOneValue.Add("Device complies with FC-FS-3 T11/1861-D revision 1.0"); + break; + case 0x0EE9: + scsiOneValue.Add("Device complies with FC-FS-3 T11/1861-D revision 1.10"); + break; + case 0x0EEB: + scsiOneValue.Add("Device complies with FC-FS-3 ANSI INCITS 470-2011"); + break; + case 0x0F00: + scsiOneValue.Add("Device complies with FC-LS-2 (no version claimed)"); + break; + case 0x0F03: + scsiOneValue.Add("Device complies with FC-LS-2 T11/2103-D revision 2.11"); + break; + case 0x0F05: + scsiOneValue.Add("Device complies with FC-LS-2 T11/2103-D revision 2.21"); + break; + case 0x0F07: + scsiOneValue.Add("Device complies with FC-LS-2 ANSI INCITS 477-2011"); + break; + case 0x0F20: + scsiOneValue.Add("Device complies with FC-PI-5 (no version claimed)"); + break; + case 0x0F27: + scsiOneValue.Add("Device complies with FC-PI-5 T11/2118-D revision 2.00"); + break; + case 0x0F28: + scsiOneValue.Add("Device complies with FC-PI-5 T11/2118-D revision 3.00"); + break; + case 0x0F2A: + scsiOneValue.Add("Device complies with FC-PI-5 T11/2118-D revision 6.00"); + break; + case 0x0F2B: + scsiOneValue.Add("Device complies with FC-PI-5 T11/2118-D revision 6.10"); + break; + case 0x0F2E: + scsiOneValue.Add("Device complies with FC-PI-5 ANSI INCITS 479-2011"); + break; + case 0x0F40: + scsiOneValue.Add("Device complies with FC-PI-6 (no version claimed)"); + break; + case 0x0F60: + scsiOneValue.Add("Device complies with FC-FS-4 (no version claimed)"); + break; + case 0x0F80: + scsiOneValue.Add("Device complies with FC-LS-3 (no version claimed)"); + break; + case 0x12A0: + scsiOneValue.Add("Device complies with FC-SCM (no version claimed)"); + break; + case 0x12A3: + scsiOneValue.Add("Device complies with FC-SCM T11/1824DT revision 1.0"); + break; + case 0x12A5: + scsiOneValue.Add("Device complies with FC-SCM T11/1824DT revision 1.1"); + break; + case 0x12A7: + scsiOneValue.Add("Device complies with FC-SCM T11/1824DT revision 1.4"); + break; + case 0x12AA: + scsiOneValue.Add("Device complies with FC-SCM INCITS TR-47 2012"); + break; + case 0x12C0: + scsiOneValue.Add("Device complies with FC-DA-2 (no version claimed)"); + break; + case 0x12C3: + scsiOneValue.Add("Device complies with FC-DA-2 T11/1870DT revision 1.04"); + break; + case 0x12C5: + scsiOneValue.Add("Device complies with FC-DA-2 T11/1870DT revision 1.06"); + break; + case 0x12C9: + scsiOneValue.Add("Device complies with FC-DA-2 INCITS TR-49 2012"); + break; + case 0x12E0: + scsiOneValue.Add("Device complies with FC-DA (no version claimed)"); + break; + case 0x12E2: + scsiOneValue.Add("Device complies with FC-DA T11/1513-DT revision 3.1"); + break; + case 0x12E8: + scsiOneValue.Add("Device complies with FC-DA ANSI INCITS TR-36 2004"); + break; + case 0x12E9: + scsiOneValue.Add("Device complies with FC-DA ISO/IEC 14165-341"); + break; + case 0x1300: + scsiOneValue.Add("Device complies with FC-Tape (no version claimed)"); + break; + case 0x1301: + scsiOneValue.Add("Device complies with FC-Tape T11/1315 revision 1.16"); + break; + case 0x131B: + scsiOneValue.Add("Device complies with FC-Tape T11/1315 revision 1.17"); + break; + case 0x131C: + scsiOneValue.Add("Device complies with FC-Tape ANSI INCITS TR-24 1999"); + break; + case 0x1320: + scsiOneValue.Add("Device complies with FC-FLA (no version claimed)"); + break; + case 0x133B: + scsiOneValue.Add("Device complies with FC-FLA T11/1235 revision 7"); + break; + case 0x133C: + scsiOneValue.Add("Device complies with FC-FLA ANSI INCITS TR-20 1998"); + break; + case 0x1340: + scsiOneValue.Add("Device complies with FC-PLDA (no version claimed)"); + break; + case 0x135B: + scsiOneValue.Add("Device complies with FC-PLDA T11/1162 revision 2.1"); + break; + case 0x135C: + scsiOneValue.Add("Device complies with FC-PLDA ANSI INCITS TR-19 1998"); + break; + case 0x1360: + scsiOneValue.Add("Device complies with SSA-PH2 (no version claimed)"); + break; + case 0x137B: + scsiOneValue.Add("Device complies with SSA-PH2 T10.1/1145-D revision 09c"); + break; + case 0x137C: + scsiOneValue.Add("Device complies with SSA-PH2 ANSI INCITS 293-1996"); + break; + case 0x1380: + scsiOneValue.Add("Device complies with SSA-PH3 (no version claimed)"); + break; + case 0x139B: + scsiOneValue.Add("Device complies with SSA-PH3 T10.1/1146-D revision 05b"); + break; + case 0x139C: + scsiOneValue.Add("Device complies with SSA-PH3 ANSI INCITS 307-1998"); + break; + case 0x14A0: + scsiOneValue.Add("Device complies with IEEE 1394 (no version claimed)"); + break; + case 0x14BD: + scsiOneValue.Add("Device complies with ANSI IEEE 1394-1995"); + break; + case 0x14C0: + scsiOneValue.Add("Device complies with IEEE 1394a (no version claimed)"); + break; + case 0x14E0: + scsiOneValue.Add("Device complies with IEEE 1394b (no version claimed)"); + break; + case 0x15E0: + scsiOneValue.Add("Device complies with ATA/ATAPI-6 (no version claimed)"); + break; + case 0x15FD: + scsiOneValue.Add("Device complies with ATA/ATAPI-6 ANSI INCITS 361-2002"); + break; + case 0x1600: + scsiOneValue.Add("Device complies with ATA/ATAPI-7 (no version claimed)"); + break; + case 0x1602: + scsiOneValue.Add("Device complies with ATA/ATAPI-7 T13/1532-D revision 3"); + break; + case 0x161C: + scsiOneValue.Add("Device complies with ATA/ATAPI-7 ANSI INCITS 397-2005"); + break; + case 0x161E: + scsiOneValue.Add("Device complies with ATA/ATAPI-7 ISO/IEC 24739"); + break; + case 0x1620: + scsiOneValue.Add("Device complies with ATA/ATAPI-8 ATA8-AAM (no version claimed)"); + break; + case 0x1621: + scsiOneValue + .Add("Device complies with ATA/ATAPI-8 ATA8-APT Parallel Transport (no version claimed)"); + break; + case 0x1622: + scsiOneValue + .Add("Device complies with ATA/ATAPI-8 ATA8-AST Serial Transport (no version claimed)"); + break; + case 0x1623: + scsiOneValue + .Add("Device complies with ATA/ATAPI-8 ATA8-ACS ATA/ATAPI Command Set (no version claimed)"); + break; + case 0x1628: + scsiOneValue.Add("Device complies with ATA/ATAPI-8 ATA8-AAM ANSI INCITS 451-2008"); + break; + case 0x162A: + scsiOneValue + .Add("Device complies with ATA/ATAPI-8 ATA8-ACS ANSI INCITS 452-2009 w/ Amendment 1"); + break; + case 0x1728: + scsiOneValue.Add("Device complies with Universal Serial Bus Specification, Revision 1.1"); + break; + case 0x1729: + scsiOneValue.Add("Device complies with Universal Serial Bus Specification, Revision 2.0"); + break; + case 0x1730: + scsiOneValue + .Add("Device complies with USB Mass Storage Class Bulk-Only Transport, Revision 1.0"); + break; + case 0x1740: + scsiOneValue.Add("Device complies with UAS (no version claimed)"); + break; + case 0x1743: + scsiOneValue.Add("Device complies with UAS T10/2095-D revision 02"); + break; + case 0x1747: + scsiOneValue.Add("Device complies with UAS T10/2095-D revision 04"); + break; + case 0x1748: + scsiOneValue.Add("Device complies with UAS ANSI INCITS 471-2010"); + break; + case 0x1749: + scsiOneValue.Add("Device complies with UAS ISO/IEC 14776-251:2014"); + break; + case 0x1761: + scsiOneValue.Add("Device complies with ACS-2 (no version claimed)"); + break; + case 0x1762: + scsiOneValue.Add("Device complies with ACS-2 ANSI INCITS 482-2013"); + break; + case 0x1765: + scsiOneValue.Add("Device complies with ACS-3 (no version claimed)"); + break; + case 0x1780: + scsiOneValue.Add("Device complies with UAS-2 (no version claimed)"); + break; + case 0x1EA0: + scsiOneValue.Add("Device complies with SAT (no version claimed)"); + break; + case 0x1EA7: + scsiOneValue.Add("Device complies with SAT T10/1711-D revision 8"); + break; + case 0x1EAB: + scsiOneValue.Add("Device complies with SAT T10/1711-D revision 9"); + break; + case 0x1EAD: + scsiOneValue.Add("Device complies with SAT ANSI INCITS 431-2007"); + break; + case 0x1EC0: + scsiOneValue.Add("Device complies with SAT-2 (no version claimed)"); + break; + case 0x1EC4: + scsiOneValue.Add("Device complies with SAT-2 T10/1826-D revision 06"); + break; + case 0x1EC8: + scsiOneValue.Add("Device complies with SAT-2 T10/1826-D revision 09"); + break; + case 0x1ECA: + scsiOneValue.Add("Device complies with SAT-2 ANSI INCITS 465-2010"); + break; + case 0x1EE0: + scsiOneValue.Add("Device complies with SAT-3 (no version claimed)"); + break; + case 0x1EE2: + scsiOneValue.Add("Device complies with SAT-3 T10/BSR INCITS 517 revision 4"); + break; + case 0x1EE4: + scsiOneValue.Add("Device complies with SAT-3 T10/BSR INCITS 517 revision 7"); + break; + case 0x1EE8: + scsiOneValue.Add("Device complies with SAT-3 ANSI INCITS 517-2015"); + break; + case 0x1F00: + scsiOneValue.Add("Device complies with SAT-4 (no version claimed)"); + break; + case 0x20A0: + scsiOneValue.Add("Device complies with SPL (no version claimed)"); + break; + case 0x20A3: + scsiOneValue.Add("Device complies with SPL T10/2124-D revision 6a"); + break; + case 0x20A5: + scsiOneValue.Add("Device complies with SPL T10/2124-D revision 7"); + break; + case 0x20A7: + scsiOneValue.Add("Device complies with SPL ANSI INCITS 476-2011"); + break; + case 0x20A8: + scsiOneValue.Add("Device complies with SPL ANSI INCITS 476-2011 + SPL AM1 INCITS 476/AM1 2012"); + break; + case 0x20AA: + scsiOneValue.Add("Device complies with SPL ISO/IEC 14776-261:2012"); + break; + case 0x20C0: + scsiOneValue.Add("Device complies with SPL-2 (no version claimed)"); + break; + case 0x20C2: + scsiOneValue.Add("Device complies with SPL-2 T10/BSR INCITS 505 revision 4"); + break; + case 0x20C4: + scsiOneValue.Add("Device complies with SPL-2 T10/BSR INCITS 505 revision 5"); + break; + case 0x20C8: + scsiOneValue.Add("Device complies with SPL-2 ANSI INCITS 505-2013"); + break; + case 0x20E0: + scsiOneValue.Add("Device complies with SPL-3 (no version claimed)"); + break; + case 0x20E4: + scsiOneValue.Add("Device complies with SPL-3 T10/BSR INCITS 492 revision 6"); + break; + case 0x20E6: + scsiOneValue.Add("Device complies with SPL-3 T10/BSR INCITS 492 revision 7"); + break; + case 0x20E8: + scsiOneValue.Add("Device complies with SPL-3 ANSI INCITS 492-2015"); + break; + case 0x2100: + scsiOneValue.Add("Device complies with SPL-4 (no version claimed)"); + break; + case 0x21E0: + scsiOneValue.Add("Device complies with SOP (no version claimed)"); + break; + case 0x21E4: + scsiOneValue.Add("Device complies with SOP T10/BSR INCITS 489 revision 4"); + break; + case 0x21E6: + scsiOneValue.Add("Device complies with SOP T10/BSR INCITS 489 revision 5"); + break; + case 0x21E8: + scsiOneValue.Add("Device complies with SOP ANSI INCITS 489-2014"); + break; + case 0x2200: + scsiOneValue.Add("Device complies with PQI (no version claimed)"); + break; + case 0x2204: + scsiOneValue.Add("Device complies with PQI T10/BSR INCITS 490 revision 6"); + break; + case 0x2206: + scsiOneValue.Add("Device complies with PQI T10/BSR INCITS 490 revision 7"); + break; + case 0x2208: + scsiOneValue.Add("Device complies with PQI ANSI INCITS 490-2014"); + break; + case 0x2220: + scsiOneValue.Add("Device complies with SOP-2 (no version claimed)"); + break; + case 0x2240: + scsiOneValue.Add("Device complies with PQI-2 (no version claimed)"); + break; + case 0xFFC0: + scsiOneValue.Add("Device complies with IEEE 1667 (no version claimed)"); + break; + case 0xFFC1: + scsiOneValue.Add("Device complies with IEEE 1667-2006"); + break; + case 0xFFC2: + scsiOneValue.Add("Device complies with IEEE 1667-2009"); + break; + default: + scsiOneValue.Add($"Device complies with unknown standard code 0x{versionDescriptor:X4}"); + break; + } + + return scsiOneValue; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs b/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs new file mode 100644 index 00000000..b9e8fbb1 --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiMmcFeatures.cs @@ -0,0 +1,290 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiMmcFeatures.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MMC features from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.SCSI.MMC; + +namespace DiscImageChef.Server +{ + public static class ScsiMmcFeatures + { + /// + /// Takes the MMC FEATURES part of a device report and prints it as a list of values to be sequenced by ASP.NET in the + /// rendering + /// + /// FEATURES part of the report + /// List to put the values on + public static void Report(MmcFeatures ftr, ref List mmcOneValue) + { + if(ftr.SupportsAACS && ftr.AACSVersion.HasValue) + mmcOneValue.Add($"Drive supports AACS version {ftr.AACSVersion}"); + else if(ftr.SupportsAACS) mmcOneValue.Add("Drive supports AACS"); + if(ftr.AGIDs.HasValue) mmcOneValue.Add($"Drive supports {ftr.AGIDs} AGIDs concurrently"); + if(ftr.CanGenerateBindingNonce) + { + mmcOneValue.Add("Drive supports generating the binding nonce"); + if(ftr.BindingNonceBlocks.HasValue) + mmcOneValue.Add($"{ftr.BindingNonceBlocks} media blocks are required for the binding nonce"); + } + + if(ftr.BlocksPerReadableUnit > 1) + mmcOneValue.Add($"{ftr.BlocksPerReadableUnit} logical blocks per media writable unit"); + if(ftr.BufferUnderrunFreeInDVD) mmcOneValue.Add("Drive supports zero loss linking writing DVDs"); + if(ftr.BufferUnderrunFreeInSAO) mmcOneValue.Add("Drive supports zero loss linking in Session at Once Mode"); + if(ftr.BufferUnderrunFreeInTAO) mmcOneValue.Add("Drive supports zero loss linking in Track at Once Mode"); + if(ftr.CanAudioScan) mmcOneValue.Add("Drive supports the SCAN command"); + if(ftr.CanEject) mmcOneValue.Add("Drive can eject media"); + if(ftr.CanEraseSector) mmcOneValue.Add("Drive supports media that require erasing before writing"); + if(ftr.CanExpandBDRESpareArea) mmcOneValue.Add("Drive can expand the spare area on a formatted BD-RE disc"); + if(ftr.CanFormat) mmcOneValue.Add("Drive can format media into logical blocks"); + if(ftr.CanFormatBDREWithoutSpare) mmcOneValue.Add("Drive can format BD-RE with no spares allocated"); + if(ftr.CanFormatQCert) mmcOneValue.Add("Drive can format BD-RE discs with quick certification"); + if(ftr.CanFormatCert) mmcOneValue.Add("Drive can format BD-RE discs with full certification"); + if(ftr.CanFormatFRF) mmcOneValue.Add("Drive can fast re-format BD-RE discs"); + if(ftr.CanFormatRRM) mmcOneValue.Add("Drive can format BD-R discs with RRM format"); + if(ftr.CanLoad) mmcOneValue.Add("Drive can load media"); + if(ftr.CanMuteSeparateChannels) mmcOneValue.Add("Drive is able to mute channels separately"); + if(ftr.CanOverwriteSAOTrack) mmcOneValue.Add("Drive can overwrite a SAO track with another in CD-RWs"); + if(ftr.CanOverwriteTAOTrack) mmcOneValue.Add("Drive can overwrite a TAO track with another in CD-RWs"); + if(ftr.CanPlayCDAudio) mmcOneValue.Add("Drive has an analogue audio output"); + if(ftr.CanPseudoOverwriteBDR) mmcOneValue.Add("Drive can write BD-R on Pseudo-OVerwrite SRM mode"); + if(ftr.CanReadAllDualR) mmcOneValue.Add("Drive can read DVD-R DL from all recording modes"); + if(ftr.CanReadAllDualRW) mmcOneValue.Add("Drive can read DVD-RW DL from all recording modes"); + if(ftr.CanReadBD) mmcOneValue.Add("Drive can read BD-ROM"); + if(ftr.CanReadBDR) mmcOneValue.Add("Drive can read BD-R Ver.1"); + if(ftr.CanReadBDRE1) mmcOneValue.Add("Drive can read BD-RE Ver.1"); + if(ftr.CanReadBDRE2) mmcOneValue.Add("Drive can read BD-RE Ver.2"); + if(ftr.CanReadBDROM) mmcOneValue.Add("Drive can read BD-ROM Ver.1"); + if(ftr.CanReadBluBCA) mmcOneValue.Add("Drive can read BD's Burst Cutting Area"); + if(ftr.CanReadCD) mmcOneValue.Add("Drive can read CD-ROM"); + if(ftr.CanWriteCDMRW && ftr.CanReadDVDPlusMRW && ftr.CanWriteDVDPlusMRW) + mmcOneValue.Add("Drive can read and write CD-MRW and DVD+MRW"); + else if(ftr.CanReadDVDPlusMRW && ftr.CanWriteDVDPlusMRW) + mmcOneValue.Add("Drive can read and write DVD+MRW"); + else if(ftr.CanWriteCDMRW && ftr.CanReadDVDPlusMRW) + mmcOneValue.Add("Drive and read DVD+MRW and read and write CD-MRW"); + else if(ftr.CanWriteCDMRW) mmcOneValue.Add("Drive can read and write CD-MRW"); + else if(ftr.CanReadDVDPlusMRW) mmcOneValue.Add("Drive can read CD-MRW and DVD+MRW"); + else if(ftr.CanReadCDMRW) mmcOneValue.Add("Drive can read CD-MRW"); + if(ftr.CanReadCPRM_MKB) mmcOneValue.Add("Drive supports reading Media Key Block of CPRM"); + if(ftr.CanReadDDCD) mmcOneValue.Add("Drive can read DDCDs"); + if(ftr.CanReadDVD) mmcOneValue.Add("Drive can read DVD"); + if(ftr.CanWriteDVDPlusRW) mmcOneValue.Add("Drive can read and write DVD+RW"); + else if(ftr.CanReadDVDPlusRW) mmcOneValue.Add("Drive can read DVD+RW"); + if(ftr.CanWriteDVDPlusR) mmcOneValue.Add("Drive can read and write DVD+R"); + else if(ftr.CanReadDVDPlusR) mmcOneValue.Add("Drive can read DVD+R"); + if(ftr.CanWriteDVDPlusRDL) mmcOneValue.Add("Drive can read and write DVD+R DL"); + else if(ftr.CanReadDVDPlusRDL) mmcOneValue.Add("Drive can read DVD+R DL"); + if(ftr.CanReadDriveAACSCertificate) mmcOneValue.Add("Drive supports reading the Drive Certificate"); + if(ftr.CanReadHDDVD && ftr.CanReadHDDVDR && ftr.CanReadHDDVDRAM) + mmcOneValue.Add("Drive can read HD DVD-ROM, HD DVD-RW, HD DVD-R and HD DVD-RAM"); + else if(ftr.CanReadHDDVD && ftr.CanReadHDDVDR) + mmcOneValue.Add("Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-R"); + else if(ftr.CanReadHDDVD && ftr.CanReadHDDVDRAM) + mmcOneValue.Add("Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-RAM"); + else if(ftr.CanReadHDDVD) mmcOneValue.Add("Drive can read HD DVD-ROM and HD DVD-RW"); + if(ftr.CanReadLeadInCDText) mmcOneValue.Add("Drive can return CD-Text from Lead-In"); + if(ftr.CanReadOldBDR) mmcOneValue.Add("Drive can read BD-R pre-1.0"); + if(ftr.CanReadOldBDRE) mmcOneValue.Add("Drive can read BD-RE pre-1.0"); + if(ftr.CanReadOldBDROM) mmcOneValue.Add("Drive can read BD-ROM pre-1.0"); + if(ftr.CanReadSpareAreaInformation) mmcOneValue.Add("Drive can return Spare Area Information"); + if(ftr.CanReportDriveSerial) mmcOneValue.Add("Drive is to report drive serial number"); + if(ftr.CanReportMediaSerial) mmcOneValue.Add("Drive is to read media serial number"); + if(ftr.CanTestWriteDDCDR) mmcOneValue.Add("Drive can do a test writing with DDCD-R"); + if(ftr.CanTestWriteDVD) mmcOneValue.Add("Drive can do a test writing with DVDs"); + if(ftr.CanTestWriteInSAO) mmcOneValue.Add("Drive can do a test writing in Session at Once Mode"); + if(ftr.CanTestWriteInTAO) mmcOneValue.Add("Drive can do a test writing in Track at Once Mode"); + if(ftr.CanUpgradeFirmware) mmcOneValue.Add("Drive supports Microcode Upgrade"); + if(ftr.ErrorRecoveryPage) mmcOneValue.Add("Drive shall report Read/Write Error Recovery mode page"); + if(ftr.Locked) mmcOneValue.Add("Drive can lock media"); + if(ftr.LogicalBlockSize > 0) mmcOneValue.Add($"{ftr.LogicalBlockSize} bytes per logical block"); + if(ftr.MultiRead) + mmcOneValue.Add("Drive claims capability to read all CD formats according to OSTA Multi-Read Specification"); + + if(ftr.PhysicalInterfaceStandard.HasValue) + switch(ftr.PhysicalInterfaceStandard) + { + case PhysicalInterfaces.Unspecified: + mmcOneValue.Add("Drive uses an unspecified physical interface"); + break; + case PhysicalInterfaces.SCSI: + mmcOneValue.Add("Drive uses SCSI interface"); + break; + case PhysicalInterfaces.ATAPI: + mmcOneValue.Add("Drive uses ATAPI interface"); + break; + case PhysicalInterfaces.IEEE1394: + mmcOneValue.Add("Drive uses IEEE-1394 interface"); + break; + case PhysicalInterfaces.IEEE1394A: + mmcOneValue.Add("Drive uses IEEE-1394A interface"); + break; + case PhysicalInterfaces.FC: + mmcOneValue.Add("Drive uses Fibre Channel interface"); + break; + case PhysicalInterfaces.IEEE1394B: + mmcOneValue.Add("Drive uses IEEE-1394B interface"); + break; + case PhysicalInterfaces.SerialATAPI: + mmcOneValue.Add("Drive uses Serial ATAPI interface"); + break; + case PhysicalInterfaces.USB: + mmcOneValue.Add("Drive uses USB interface"); + break; + case PhysicalInterfaces.Vendor: + mmcOneValue.Add("Drive uses a vendor unique interface"); + break; + default: + mmcOneValue + .Add($"Drive uses an unknown interface with code {(uint)ftr.PhysicalInterfaceStandard}"); + break; + } + + if(ftr.PreventJumper) mmcOneValue.Add("Drive power ups locked"); + if(ftr.SupportsBusEncryption) mmcOneValue.Add("Drive supports bus encryption"); + if(ftr.CanWriteBD) mmcOneValue.Add("Drive can write BD-R or BD-RE"); + if(ftr.CanWriteBDR) mmcOneValue.Add("Drive can write BD-R Ver.1"); + if(ftr.CanWriteBDRE1) mmcOneValue.Add("Drive can write BD-RE Ver.1"); + if(ftr.CanWriteBDRE2) mmcOneValue.Add("Drive can write BD-RE Ver.2"); + if(ftr.CanWriteBusEncryptedBlocks) mmcOneValue.Add("Drive supports writing with bus encryption"); + if(ftr.CanWriteCDRW) mmcOneValue.Add("Drive can write CD-RW"); + if(ftr.CanWriteCDRWCAV) mmcOneValue.Add("Drive can write High-Speed CD-RW"); + if(ftr.CanWriteCDSAO && !ftr.CanWriteRaw) + mmcOneValue.Add("Drive can write CDs in Session at Once Mode:"); + else if(!ftr.CanWriteCDSAO && ftr.CanWriteRaw) mmcOneValue.Add("Drive can write CDs in raw Mode:"); + else if(ftr.CanWriteCDSAO && ftr.CanWriteRaw) + mmcOneValue.Add("Drive can write CDs in Session at Once and in Raw Modes:"); + if(ftr.CanWriteCDTAO) mmcOneValue.Add("Drive can write CDs in Track at Once Mode:"); + if(ftr.CanWriteCSSManagedDVD) mmcOneValue.Add("Drive can write CSS managed DVDs"); + if(ftr.CanWriteDDCDR) mmcOneValue.Add("Drive supports writing DDCD-R"); + if(ftr.CanWriteDDCDRW) mmcOneValue.Add("Drive supports writing DDCD-RW"); + if(ftr.CanWriteDVDPlusRWDL) mmcOneValue.Add("Drive can read and write DVD+RW DL"); + else if(ftr.CanReadDVDPlusRWDL) mmcOneValue.Add("Drive can read DVD+RW DL"); + if(ftr.CanWriteDVDR && ftr.CanWriteDVDRW && ftr.CanWriteDVDRDL) + mmcOneValue.Add("Drive supports writing DVD-R, DVD-RW and DVD-R DL"); + else if(ftr.CanWriteDVDR && ftr.CanWriteDVDRDL) + mmcOneValue.Add("Drive supports writing DVD-R and DVD-R DL"); + else if(ftr.CanWriteDVDR && ftr.CanWriteDVDRW) mmcOneValue.Add("Drive supports writing DVD-R and DVD-RW"); + else if(ftr.CanWriteDVDR) mmcOneValue.Add("Drive supports writing DVD-R"); + if(ftr.CanWriteHDDVDR && ftr.CanWriteHDDVDRAM) + mmcOneValue.Add("Drive can write HD DVD-RW, HD DVD-R and HD DVD-RAM"); + else if(ftr.CanWriteHDDVDR) mmcOneValue.Add("Drive can write HD DVD-RW and HD DVD-R"); + else if(ftr.CanWriteHDDVDRAM) mmcOneValue.Add("Drive can write HD DVD-RW and HD DVD-RAM"); + // TODO: Write HD DVD-RW + /* + else + mmcOneValue.Add("Drive can write HD DVD-RW"); + */ + if(ftr.CanWriteOldBDR) mmcOneValue.Add("Drive can write BD-R pre-1.0"); + if(ftr.CanWriteOldBDRE) mmcOneValue.Add("Drive can write BD-RE pre-1.0"); + if(ftr.CanWriteRWSubchannelInTAO) + { + mmcOneValue.Add("Drive can write user provided data in the R-W subchannels in Track at Once Mode"); + if(ftr.CanWriteRawSubchannelInTAO) + mmcOneValue.Add("Drive accepts RAW R-W subchannel data in Track at Once Mode"); + if(ftr.CanWritePackedSubchannelInTAO) + mmcOneValue.Add("Drive accepts Packed R-W subchannel data in Track at Once Mode"); + } + + if(ftr.CanWriteRWSubchannelInSAO) + mmcOneValue.Add("Drive can write user provided data in the R-W subchannels in Session at Once Mode"); + if(ftr.CanWriteRaw && ftr.CanWriteRawMultiSession) + mmcOneValue.Add("Drive can write multi-session CDs in raw mode"); + if(ftr.EmbeddedChanger) + { + mmcOneValue.Add("Drive contains an embedded changer"); + + if(ftr.ChangerIsSideChangeCapable) mmcOneValue.Add("Drive can change disc side"); + if(ftr.ChangerSupportsDiscPresent) + mmcOneValue.Add("Drive is able to report slots contents after a reset or change"); + + mmcOneValue.Add($"Drive has {ftr.ChangerSlots + 1} slots"); + } + + if(ftr.SupportsCSS && ftr.CSSVersion.HasValue) + mmcOneValue.Add($"Drive supports DVD CSS/CPPM version {ftr.CSSVersion}"); + else if(ftr.SupportsCSS) mmcOneValue.Add("Drive supports DVD CSS/CPRM"); + if(ftr.SupportsCPRM && ftr.CPRMVersion.HasValue) + mmcOneValue.Add($"Drive supports DVD CPPM version {ftr.CPRMVersion}"); + else if(ftr.SupportsCPRM) mmcOneValue.Add("Drive supports DVD CPRM"); + if(ftr.DBML) mmcOneValue.Add("Drive reports Device Busy Class events during medium loading/unloading"); + if(ftr.DVDMultiRead) mmcOneValue.Add("Drive conforms to DVD Multi Drive Read-only Specifications"); + if(ftr.FirmwareDate.HasValue) mmcOneValue.Add($"Drive firmware is dated {ftr.FirmwareDate}"); + if(ftr.SupportsC2) mmcOneValue.Add("Drive supports C2 Error Pointers"); + if(ftr.SupportsDAP) mmcOneValue.Add("Drive supports the DAP bit in the READ CD and READ CD MSF commands"); + if(ftr.SupportsDeviceBusyEvent) mmcOneValue.Add("Drive supports Device Busy events"); + + if(ftr.LoadingMechanismType.HasValue) + switch(ftr.LoadingMechanismType) + { + case 0: + mmcOneValue.Add("Drive uses media caddy"); + break; + case 1: + mmcOneValue.Add("Drive uses a tray"); + break; + case 2: + mmcOneValue.Add("Drive is pop-up"); + break; + case 4: + mmcOneValue.Add("Drive is a changer with individually changeable discs"); + break; + case 5: + mmcOneValue.Add("Drive is a changer using cartridges"); + break; + default: + mmcOneValue.Add($"Drive uses unknown loading mechanism type {ftr.LoadingMechanismType}"); + break; + } + + if(ftr.SupportsHybridDiscs) mmcOneValue.Add("Drive is able to access Hybrid discs"); + if(ftr.SupportsModePage1Ch) + mmcOneValue.Add("Drive supports the Informational Exceptions Control mode page 1Ch"); + if(ftr.SupportsOSSC) + mmcOneValue.Add("Drive supports the Trusted Computing Group Optical Security Subsystem Class"); + if(ftr.SupportsPWP) mmcOneValue.Add("Drive supports set/release of PWP status"); + if(ftr.SupportsSWPP) mmcOneValue.Add("Drive supports the SWPP bit of the Timeout and Protect mode page"); + if(ftr.SupportsSecurDisc) mmcOneValue.Add("Drive supports SecurDisc"); + if(ftr.SupportsSeparateVolume) mmcOneValue.Add("Drive supports separate volume per channel"); + if(ftr.SupportsVCPS) mmcOneValue.Add("Drive supports VCPS"); + if(ftr.VolumeLevels.HasValue) mmcOneValue.Add($"Drive has {ftr.VolumeLevels + 1} volume levels"); + if(ftr.SupportsWriteProtectPAC) + mmcOneValue.Add("Drive supports reading/writing the Disc Write Protect PAC on BD-R/-RE media"); + if(ftr.SupportsWriteInhibitDCB) + mmcOneValue.Add("Drive supports writing the Write Inhibit DCB on DVD+RW media"); + + mmcOneValue.Sort(); + mmcOneValue.Add(""); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiMmcMode.cs b/DiscImageChef.Server/App_Start/ScsiMmcMode.cs new file mode 100644 index 00000000..7c557828 --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiMmcMode.cs @@ -0,0 +1,172 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiMmcMode.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGE 2Ah from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using System.Linq; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + public static class ScsiMmcMode + { + /// + /// Takes the MODE PAGE 2Ah part of a device report and prints it as a list of values to be sequenced by ASP.NET in the + /// rendering + /// + /// MODE PAGE 2Ah part of the report + /// List to put the values on + public static void Report(Modes.ModePage_2A mode, ref List mmcOneValue) + { + if(mode.AudioPlay) mmcOneValue.Add("Drive can play audio"); + if(mode.Mode2Form1) mmcOneValue.Add("Drive can read sectors in Mode 2 Form 1 format"); + if(mode.Mode2Form2) mmcOneValue.Add("Drive can read sectors in Mode 2 Form 2 format"); + if(mode.MultiSession) mmcOneValue.Add("Drive supports multi-session discs and/or Photo-CD"); + + if(mode.CDDACommand) mmcOneValue.Add("Drive can read digital audio"); + if(mode.AccurateCDDA) mmcOneValue.Add("Drive can continue from streaming loss"); + if(mode.Subchannel) mmcOneValue.Add("Drive can read uncorrected and interleaved R-W subchannels"); + if(mode.DeinterlaveSubchannel) mmcOneValue.Add("Drive can read, deinterleave and correct R-W subchannels"); + if(mode.C2Pointer) mmcOneValue.Add("Drive supports C2 pointers"); + if(mode.UPC) mmcOneValue.Add("Drive can read Media Catalogue Number"); + if(mode.ISRC) mmcOneValue.Add("Drive can read ISRC"); + + switch(mode.LoadingMechanism) + { + case 0: + mmcOneValue.Add("Drive uses media caddy"); + break; + case 1: + mmcOneValue.Add("Drive uses a tray"); + break; + case 2: + mmcOneValue.Add("Drive is pop-up"); + break; + case 4: + mmcOneValue.Add("Drive is a changer with individually changeable discs"); + break; + case 5: + mmcOneValue.Add("Drive is a changer using cartridges"); + break; + default: + mmcOneValue.Add($"Drive uses unknown loading mechanism type {mode.LoadingMechanism}"); + break; + } + + if(mode.Lock) mmcOneValue.Add("Drive can lock media"); + if(mode.PreventJumper) + { + mmcOneValue.Add("Drive power ups locked"); + mmcOneValue.Add(mode.LockState + ? "Drive is locked, media cannot be ejected or inserted" + : "Drive is not locked, media can be ejected and inserted"); + } + else + mmcOneValue.Add(mode.LockState + ? "Drive is locked, media cannot be ejected, but if empty, can be inserted" + : "Drive is not locked, media can be ejected and inserted"); + + if(mode.Eject) mmcOneValue.Add("Drive can eject media"); + + if(mode.SeparateChannelMute) mmcOneValue.Add("Each channel can be muted independently"); + if(mode.SeparateChannelVolume) mmcOneValue.Add("Each channel's volume can be controlled independently"); + + if(mode.SupportedVolumeLevels > 0) + mmcOneValue.Add($"Drive supports {mode.SupportedVolumeLevels} volume levels"); + if(mode.BufferSize > 0) mmcOneValue.Add($"Drive has {mode.BufferSize} Kbyte of buffer"); + if(mode.MaximumSpeed > 0) + mmcOneValue.Add($"Drive's maximum reading speed is {mode.MaximumSpeed} Kbyte/sec."); + if(mode.CurrentSpeed > 0) + mmcOneValue.Add($"Drive's current reading speed is {mode.CurrentSpeed} Kbyte/sec."); + + if(mode.ReadCDR) + { + mmcOneValue.Add(mode.WriteCDR ? "Drive can read and write CD-R" : "Drive can read CD-R"); + + if(mode.Method2) mmcOneValue.Add("Drive supports reading CD-R packet media"); + } + + if(mode.ReadCDRW) + mmcOneValue.Add(mode.WriteCDRW ? "Drive can read and write CD-RW" : "Drive can read CD-RW"); + + if(mode.ReadDVDROM) mmcOneValue.Add("Drive can read DVD-ROM"); + if(mode.ReadDVDR) + mmcOneValue.Add(mode.WriteDVDR ? "Drive can read and write DVD-R" : "Drive can read DVD-R"); + if(mode.ReadDVDRAM) + mmcOneValue.Add(mode.WriteDVDRAM ? "Drive can read and write DVD-RAM" : "Drive can read DVD-RAM"); + + if(mode.Composite) mmcOneValue.Add("Drive can deliver a composite audio and video data stream"); + if(mode.DigitalPort1) mmcOneValue.Add("Drive supports IEC-958 digital output on port 1"); + if(mode.DigitalPort2) mmcOneValue.Add("Drive supports IEC-958 digital output on port 2"); + + if(mode.SDP) mmcOneValue.Add("Drive contains a changer that can report the exact contents of the slots"); + if(mode.CurrentWriteSpeedSelected > 0) + { + if(mode.RotationControlSelected == 0) + mmcOneValue + .Add($"Drive's current writing speed is {mode.CurrentWriteSpeedSelected} Kbyte/sec. in CLV mode"); + else if(mode.RotationControlSelected == 1) + mmcOneValue + .Add($"Drive's current writing speed is {mode.CurrentWriteSpeedSelected} Kbyte/sec. in pure CAV mode"); + } + else + { + if(mode.MaxWriteSpeed > 0) + mmcOneValue.Add($"Drive's maximum writing speed is {mode.MaxWriteSpeed} Kbyte/sec."); + if(mode.CurrentWriteSpeed > 0) + mmcOneValue.Add($"Drive's current writing speed is {mode.CurrentWriteSpeed} Kbyte/sec."); + } + + if(mode.WriteSpeedPerformanceDescriptors != null) + foreach(Modes.ModePage_2A_WriteDescriptor descriptor in + mode.WriteSpeedPerformanceDescriptors.Where(descriptor => descriptor.WriteSpeed > 0)) + if(descriptor.RotationControl == 0) + mmcOneValue.Add($"Drive supports writing at {descriptor.WriteSpeed} Kbyte/sec. in CLV mode"); + else if(descriptor.RotationControl == 1) + mmcOneValue + .Add($"Drive supports writing at is {descriptor.WriteSpeed} Kbyte/sec. in pure CAV mode"); + + if(mode.TestWrite) mmcOneValue.Add("Drive supports test writing"); + + if(mode.ReadBarcode) mmcOneValue.Add("Drive can read barcode"); + + if(mode.SCC) mmcOneValue.Add("Drive can read both sides of a disc"); + if(mode.LeadInPW) mmcOneValue.Add("Drive an read raw R-W subchannel from the Lead-In"); + + if(mode.CMRSupported == 1) mmcOneValue.Add("Drive supports DVD CSS and/or DVD CPPM"); + + if(mode.BUF) mmcOneValue.Add("Drive supports buffer under-run free recording"); + + mmcOneValue.Sort(); + mmcOneValue.Add(""); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/ScsiModeSense.cs b/DiscImageChef.Server/App_Start/ScsiModeSense.cs new file mode 100644 index 00000000..3a512445 --- /dev/null +++ b/DiscImageChef.Server/App_Start/ScsiModeSense.cs @@ -0,0 +1,381 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ScsiModeSense.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI MODE PAGEs from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.SCSI; + +namespace DiscImageChef.Server +{ + public static class ScsiModeSense + { + /// + /// Takes the MODE PAGEs part of a device report and prints it as a list of values and another list of key=value pairs + /// to be sequenced by ASP.NET in the rendering + /// + /// MODE PAGEs part of a device report + /// SCSI vendor string + /// SCSI peripheral device type + /// List to put values on + /// List to put key=value pairs on + public static void Report(ScsiMode modeSense, string vendor, + PeripheralDeviceTypes deviceType, + ref List scsiOneValue, ref Dictionary modePages) + { + if(modeSense.MediumType.HasValue) scsiOneValue.Add($"Medium type is {modeSense.MediumType:X2}h"); + if(modeSense.WriteProtected) scsiOneValue.Add("Device is write protected."); + if(modeSense.BlockDescriptors != null) + foreach(BlockDescriptor descriptor in modeSense.BlockDescriptors) + if(descriptor.Blocks.HasValue && descriptor.BlockLength.HasValue) + scsiOneValue + .Add($"Density code {descriptor.Density:X2}h has {descriptor.Blocks} blocks of {descriptor.BlockLength} bytes each"); + else + scsiOneValue.Add($"Density code {descriptor.Density:X2}h"); + + if(modeSense.DPOandFUA) scsiOneValue.Add("Drive supports DPO and FUA bits"); + if(modeSense.BlankCheckEnabled) scsiOneValue.Add("Blank checking during write is enabled"); + if(modeSense.BufferedMode.HasValue) + switch(modeSense.BufferedMode) + { + case 0: + scsiOneValue.Add("Device writes directly to media"); + break; + case 1: + scsiOneValue.Add("Device uses a write cache"); + break; + case 2: + scsiOneValue.Add("Device uses a write cache but doesn't return until cache is flushed"); + break; + default: + scsiOneValue.Add($"Unknown buffered mode code 0x{modeSense.BufferedMode:X2}"); + break; + } + + if(modeSense.ModePages == null) return; + + foreach(ScsiPage page in modeSense.ModePages) + switch(page.page) + { + case 0x00: + { + if(deviceType == PeripheralDeviceTypes.MultiMediaDevice && page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_00_SFF(page.value)); + else + modePages + .Add(page.subpage != 0 ? $"MODE page {page.page:X2}h subpage {page.subpage:X2}h" : $"MODE page {page.page:X2}h", + "Unknown vendor mode page"); + break; + } + case 0x01: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", + deviceType == PeripheralDeviceTypes.MultiMediaDevice + ? Modes.PrettifyModePage_01_MMC(page.value) + : Modes.PrettifyModePage_01(page.value)); + else goto default; + + break; + } + case 0x02: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_02(page.value)); + else goto default; + + break; + } + case 0x03: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_03(page.value)); + else goto default; + + break; + } + case 0x04: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_04(page.value)); + else goto default; + + break; + } + case 0x05: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_05(page.value)); + else goto default; + + break; + } + case 0x06: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_06(page.value)); + else goto default; + + break; + } + case 0x07: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", + deviceType == PeripheralDeviceTypes.MultiMediaDevice + ? Modes.PrettifyModePage_07_MMC(page.value) + : Modes.PrettifyModePage_07(page.value)); + else goto default; + + break; + } + case 0x08: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_08(page.value)); + else goto default; + + break; + } + case 0x0A: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0A(page.value)); + else if(page.subpage == 1) + modePages.Add($"MODE page {page.page:X2}h subpage {page.subpage:X2}h", + Modes.PrettifyModePage_0A_S01(page.value)); + else goto default; + + break; + } + case 0x0B: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0B(page.value)); + else goto default; + + break; + } + case 0x0D: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0D(page.value)); + else goto default; + + break; + } + case 0x0E: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0E(page.value)); + else goto default; + + break; + } + case 0x0F: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_0F(page.value)); + else goto default; + + break; + } + case 0x10: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", + deviceType == PeripheralDeviceTypes.SequentialAccess + ? Modes.PrettifyModePage_10_SSC(page.value) + : Modes.PrettifyModePage_10(page.value)); + else goto default; + + break; + } + case 0x11: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_11(page.value)); + else goto default; + + break; + } + case 0x12: + case 0x13: + case 0x14: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_12_13_14(page.value)); + else goto default; + + break; + } + case 0x1A: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_1A(page.value)); + else if(page.subpage == 1) + modePages.Add($"MODE page {page.page:X2}h subpage {page.subpage:X2}h", + Modes.PrettifyModePage_1A_S01(page.value)); + else goto default; + + break; + } + case 0x1B: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_1B(page.value)); + else goto default; + + break; + } + case 0x1C: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", + deviceType == PeripheralDeviceTypes.MultiMediaDevice + ? Modes.PrettifyModePage_1C_SFF(page.value) + : Modes.PrettifyModePage_1C(page.value)); + else if(page.subpage == 1) + modePages.Add($"MODE page {page.page:X2}h subpage {page.subpage:X2}h", + Modes.PrettifyModePage_1C_S01(page.value)); + else goto default; + + break; + } + case 0x1D: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_1D(page.value)); + else goto default; + + break; + } + case 0x21: + { + if(vendor == "CERTANCE") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyCertanceModePage_21(page.value)); + else goto default; + + break; + } + case 0x22: + { + if(vendor == "CERTANCE") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyCertanceModePage_22(page.value)); + else goto default; + + break; + } + case 0x24: + { + if(vendor == "IBM") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyIBMModePage_24(page.value)); + else goto default; + + break; + } + case 0x2A: + { + if(page.subpage == 0) + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyModePage_2A(page.value)); + else goto default; + + break; + } + case 0x2F: + { + if(vendor == "IBM") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyIBMModePage_2F(page.value)); + else goto default; + + break; + } + case 0x30: + { + if(Modes.IsAppleModePage_30(page.value)) + modePages.Add("MODE page 30h", "Drive identifies as an Apple OEM drive"); + else goto default; + + break; + } + case 0x3B: + { + if(vendor == "HP") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyHPModePage_3B(page.value)); + else goto default; + + break; + } + case 0x3C: + { + if(vendor == "HP") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyHPModePage_3C(page.value)); + else goto default; + + break; + } + case 0x3D: + { + if(vendor == "IBM") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyIBMModePage_3D(page.value)); + else if(vendor == "HP") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyHPModePage_3D(page.value)); + else goto default; + + break; + } + case 0x3E: + { + if(vendor == "FUJITSU") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyFujitsuModePage_3E(page.value)); + else if(vendor == "HP") + modePages.Add($"MODE page {page.page:X2}h", Modes.PrettifyHPModePage_3E(page.value)); + else goto default; + + break; + } + default: + { + modePages.Add(page.subpage != 0 ? $"MODE page {page.page:X2}h subpage {page.subpage:X2}h" : $"MODE page {page.page:X2}h", + "Unknown mode page"); + } + break; + } + + Dictionary newModePages = new Dictionary(); + foreach(KeyValuePair kvp in modePages) + newModePages.Add(kvp.Key, + string.IsNullOrWhiteSpace(kvp.Value) ? "Undecoded" : kvp.Value.Replace("\n", "
")); + + modePages = newModePages; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/SscTestedMedia.cs b/DiscImageChef.Server/App_Start/SscTestedMedia.cs new file mode 100644 index 00000000..6b6b2eec --- /dev/null +++ b/DiscImageChef.Server/App_Start/SscTestedMedia.cs @@ -0,0 +1,70 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : SscTestedMedia.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes SCSI Streaming media tests from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Server +{ + public static class SscTestedMedia + { + /// + /// Takes the tested media from SCSI Streaming devices of a device report and prints it as a list of values + /// + /// List to put values on + /// List of tested media + public static void Report(IEnumerable testedMedia, ref List mediaOneValue) + { + foreach(TestedSequentialMedia media in testedMedia) + { + if(!string.IsNullOrWhiteSpace(media.MediumTypeName)) + { + mediaOneValue.Add($"Information for medium named \"{media.MediumTypeName}\""); + if(media.MediumType.HasValue) mediaOneValue.Add($"Medium type code: {media.MediumType:X2}h"); + } + else if(media.MediumType.HasValue) + mediaOneValue.Add($"Information for medium type {media.MediumType:X2}h"); + else mediaOneValue.Add("Information for unknown medium type"); + + if(!string.IsNullOrWhiteSpace(media.Manufacturer)) + mediaOneValue.Add($"Medium manufactured by: {media.Manufacturer}"); + if(!string.IsNullOrWhiteSpace(media.Model)) mediaOneValue.Add($"Medium model: {media.Model}"); + + if(media.Density.HasValue) mediaOneValue.Add($"Medium has density code {media.Density:X2}h"); + if(media.CanReadMediaSerial == true) mediaOneValue.Add("Drive can read medium serial number."); + if(media.MediaIsRecognized) mediaOneValue.Add("Drive recognizes this medium."); + + mediaOneValue.Add(""); + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/StatsConverter.cs b/DiscImageChef.Server/App_Start/StatsConverter.cs new file mode 100644 index 00000000..da99fb37 --- /dev/null +++ b/DiscImageChef.Server/App_Start/StatsConverter.cs @@ -0,0 +1,364 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : StatsConverter.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Reads a statistics XML and stores it in the database context. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Linq; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Server.Models; +using Version = DiscImageChef.Server.Models.Version; + +namespace DiscImageChef.Server +{ + public static class StatsConverter + { + public static void Convert(Stats newStats) + { + DicServerContext ctx = new DicServerContext(); + + if(newStats.Commands != null) + { + if(newStats.Commands.Analyze > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "analyze"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Analyze, Name = "analyze"}); + else existing.Count += newStats.Commands.Analyze; + } + + if(newStats.Commands.Benchmark > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "benchmark"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Benchmark, Name = "benchmark"}); + else existing.Count += newStats.Commands.Benchmark; + } + + if(newStats.Commands.Checksum > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "checksum"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Checksum, Name = "checksum"}); + else existing.Count += newStats.Commands.Checksum; + } + + if(newStats.Commands.Compare > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "compare"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Compare, Name = "compare"}); + else existing.Count += newStats.Commands.Compare; + } + + if(newStats.Commands.CreateSidecar > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "create-sidecar"); + + if(existing == null) + ctx.Commands.Add(new Command + { + Count = newStats.Commands.CreateSidecar, Name = "create-sidecar" + }); + else existing.Count += newStats.Commands.CreateSidecar; + } + + if(newStats.Commands.Decode > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "decode"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Decode, Name = "decode"}); + else existing.Count += newStats.Commands.Decode; + } + + if(newStats.Commands.DeviceInfo > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "device-info"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.DeviceInfo, Name = "device-info"}); + else existing.Count += newStats.Commands.DeviceInfo; + } + + if(newStats.Commands.DeviceReport > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "device-report"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.DeviceReport, Name = "device-report"}); + else existing.Count += newStats.Commands.DeviceReport; + } + + if(newStats.Commands.DumpMedia > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "dump-media"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.DumpMedia, Name = "dump-media"}); + else existing.Count += newStats.Commands.DumpMedia; + } + + if(newStats.Commands.Entropy > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "entropy"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Entropy, Name = "entropy"}); + else existing.Count += newStats.Commands.Entropy; + } + + if(newStats.Commands.Formats > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "formats"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Formats, Name = "formats"}); + else existing.Count += newStats.Commands.Formats; + } + + if(newStats.Commands.MediaInfo > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "media-info"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.MediaInfo, Name = "media-info"}); + else existing.Count += newStats.Commands.MediaInfo; + } + + if(newStats.Commands.MediaScan > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "media-scan"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.MediaScan, Name = "media-scan"}); + else existing.Count += newStats.Commands.MediaScan; + } + + if(newStats.Commands.PrintHex > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "printhex"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.PrintHex, Name = "printhex"}); + else existing.Count += newStats.Commands.PrintHex; + } + + if(newStats.Commands.Verify > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "verify"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.Verify, Name = "verify"}); + else existing.Count += newStats.Commands.Verify; + } + + if(newStats.Commands.Ls > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "ls"); + + if(existing == null) ctx.Commands.Add(new Command {Count = newStats.Commands.Ls, Name = "ls"}); + else existing.Count += newStats.Commands.Ls; + } + + if(newStats.Commands.ExtractFiles > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "extract-files"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.ExtractFiles, Name = "extract-files"}); + else existing.Count += newStats.Commands.ExtractFiles; + } + + if(newStats.Commands.ListDevices > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "list-devices"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.ListDevices, Name = "list-devices"}); + else existing.Count += newStats.Commands.ListDevices; + } + + if(newStats.Commands.ListEncodings > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "list-encodings"); + + if(existing == null) + ctx.Commands.Add(new Command + { + Count = newStats.Commands.ListEncodings, Name = "list-encodings" + }); + else existing.Count += newStats.Commands.ListEncodings; + } + + if(newStats.Commands.ConvertImage > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "convert-image"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.ConvertImage, Name = "convert-image"}); + else existing.Count += newStats.Commands.ConvertImage; + } + + if(newStats.Commands.ImageInfo > 0) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == "image-info"); + + if(existing == null) + ctx.Commands.Add(new Command {Count = newStats.Commands.ImageInfo, Name = "image-info"}); + else existing.Count += newStats.Commands.ImageInfo; + } + } + + if(newStats.OperatingSystems != null) + foreach(OsStats operatingSystem in newStats.OperatingSystems) + { + if(string.IsNullOrWhiteSpace(operatingSystem.name) || + string.IsNullOrWhiteSpace(operatingSystem.version)) continue; + + OperatingSystem existing = + ctx.OperatingSystems.FirstOrDefault(c => c.Name == operatingSystem.name && + c.Version == operatingSystem.version); + + if(existing == null) + ctx.OperatingSystems.Add(new OperatingSystem + { + Count = operatingSystem.Value, + Name = operatingSystem.name, + Version = operatingSystem.version + }); + else existing.Count += operatingSystem.Value; + } + else + { + OperatingSystem existing = + ctx.OperatingSystems.FirstOrDefault(c => c.Name == "Linux" && c.Version == null); + + if(existing == null) ctx.OperatingSystems.Add(new OperatingSystem {Count = 1, Name = "Linux"}); + else existing.Count++; + } + + if(newStats.Versions != null) + foreach(NameValueStats nvs in newStats.Versions) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Version existing = ctx.Versions.FirstOrDefault(c => c.Value == nvs.name); + + if(existing == null) ctx.Versions.Add(new Version {Count = nvs.Value, Value = nvs.name}); + else existing.Count += nvs.Value; + } + else + { + Version existing = ctx.Versions.FirstOrDefault(c => c.Value == "previous"); + + if(existing == null) ctx.Versions.Add(new Version {Count = 1, Value = "previous"}); + else existing.Count++; + } + + if(newStats.Filesystems != null) + foreach(NameValueStats nvs in newStats.Filesystems) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filesystem existing = ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Filesystems.Add(new Filesystem {Count = nvs.Value, Name = nvs.name}); + else existing.Count += nvs.Value; + } + + if(newStats.Partitions != null) + foreach(NameValueStats nvs in newStats.Partitions) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Partition existing = ctx.Partitions.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Partitions.Add(new Partition {Count = nvs.Value, Name = nvs.name}); + else existing.Count += nvs.Value; + } + + if(newStats.MediaImages != null) + foreach(NameValueStats nvs in newStats.MediaImages) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + MediaFormat existing = ctx.MediaFormats.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.MediaFormats.Add(new MediaFormat {Count = nvs.Value, Name = nvs.name}); + else existing.Count += nvs.Value; + } + + if(newStats.Filters != null) + foreach(NameValueStats nvs in newStats.Filters) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filter existing = ctx.Filters.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Filters.Add(new Filter {Count = nvs.Value, Name = nvs.name}); + else existing.Count += nvs.Value; + } + + if(newStats.Devices != null) + foreach(DeviceStats device in newStats.Devices) + { + if(string.IsNullOrWhiteSpace(device.Model)) continue; + + if(!ctx.DeviceStats.Any(c => c.Bus == device.Bus && c.Manufacturer == device.Manufacturer && + c.Model == device.Model && c.Revision == device.Revision)) + ctx.DeviceStats.Add(new DeviceStat + { + Bus = device.Bus, + Manufacturer = device.Manufacturer, + Model = device.Model, + Revision = device.Revision + }); + } + + if(newStats.Medias != null) + foreach(MediaStats media in newStats.Medias) + { + if(string.IsNullOrWhiteSpace(media.type)) continue; + + Media existing = ctx.Medias.FirstOrDefault(c => c.Type == media.type && c.Real == media.real); + + if(existing == null) + ctx.Medias.Add(new Media {Count = media.Value, Real = media.real, Type = media.type}); + else existing.Count += media.Value; + } + + ctx.SaveChanges(); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/TestedMedia.cs b/DiscImageChef.Server/App_Start/TestedMedia.cs new file mode 100644 index 00000000..70ab174a --- /dev/null +++ b/DiscImageChef.Server/App_Start/TestedMedia.cs @@ -0,0 +1,306 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : TestedMedia.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Decodes media tests from reports. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; + +namespace DiscImageChef.Server.App_Start +{ + public static class TestedMedia + { + /// + /// Takes the tested media from a device report and prints it as a list of values + /// + /// true if device report is from an ATA device + /// List to put values on + /// List of tested media + public static void Report(List testedMedias, ref List mediaOneValue) + { + foreach(CommonTypes.Metadata.TestedMedia testedMedia in testedMedias) + { + if(!string.IsNullOrWhiteSpace(testedMedia.MediumTypeName)) + { + mediaOneValue.Add($"Information for medium named \"{testedMedia.MediumTypeName}\""); + if(testedMedia.MediumType != null) + mediaOneValue.Add($"Medium type code: {testedMedia.MediumType:X2}h"); + } + else if(testedMedia.MediumType != null) + mediaOneValue.Add($"Information for medium type {testedMedia.MediumType:X2}h"); + else mediaOneValue.Add("Information for unknown medium type"); + + mediaOneValue.Add(testedMedia.MediaIsRecognized + ? "Drive recognizes this medium." + : "Drive does not recognize this medium."); + + if(!string.IsNullOrWhiteSpace(testedMedia.Manufacturer)) + mediaOneValue.Add($"Medium manufactured by: {testedMedia.Manufacturer}"); + if(!string.IsNullOrWhiteSpace(testedMedia.Model)) + mediaOneValue.Add($"Medium model: {testedMedia.Model}"); + if(testedMedia.Density != null) mediaOneValue.Add($"Density code: {testedMedia.Density:X2}h"); + + if(testedMedia.BlockSize != null) + mediaOneValue.Add($"Logical sector size: {testedMedia.BlockSize} bytes"); + if(testedMedia.PhysicalBlockSize != null) + mediaOneValue.Add($"Physical sector size: {testedMedia.PhysicalBlockSize} bytes"); + if(testedMedia.LongBlockSize != null) + mediaOneValue.Add($"READ LONG sector size: {testedMedia.LongBlockSize} bytes"); + + if(testedMedia.Blocks != null && testedMedia.BlockSize != null) + { + mediaOneValue.Add($"Medium has {testedMedia.Blocks} blocks of {testedMedia.BlockSize} bytes each"); + + if(testedMedia.Blocks * testedMedia.BlockSize / 1024 / 1024 > 1000000) + mediaOneValue + .Add($"Medium size: {testedMedia.Blocks * testedMedia.BlockSize} bytes, {testedMedia.Blocks * testedMedia.BlockSize / 1000 / 1000 / 1000 / 1000} Tb, {(double)(testedMedia.Blocks * testedMedia.BlockSize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if(testedMedia.Blocks * testedMedia.BlockSize / 1024 / 1024 > 1000) + mediaOneValue + .Add($"Medium size: {testedMedia.Blocks * testedMedia.BlockSize} bytes, {testedMedia.Blocks * testedMedia.BlockSize / 1000 / 1000 / 1000} Gb, {(double)(testedMedia.Blocks * testedMedia.BlockSize) / 1024 / 1024 / 1024:F2} GiB"); + else + mediaOneValue + .Add($"Medium size: {testedMedia.Blocks * testedMedia.BlockSize} bytes, {testedMedia.Blocks * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)(testedMedia.Blocks * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(testedMedia.CHS != null && testedMedia.CurrentCHS != null) + { + int currentSectors = testedMedia.CurrentCHS.Cylinders * testedMedia.CurrentCHS.Heads * + testedMedia.CurrentCHS.Sectors; + mediaOneValue + .Add($"Cylinders: {testedMedia.CHS.Cylinders} max., {testedMedia.CurrentCHS.Cylinders} current"); + mediaOneValue.Add($"Heads: {testedMedia.CHS.Heads} max., {testedMedia.CurrentCHS.Heads} current"); + mediaOneValue + .Add($"Sectors per track: {testedMedia.CHS.Sectors} max., {testedMedia.CurrentCHS.Sectors} current"); + mediaOneValue + .Add($"Sectors addressable in CHS mode: {testedMedia.CHS.Cylinders * testedMedia.CHS.Heads * testedMedia.CHS.Sectors} max., {currentSectors} current"); + mediaOneValue + .Add($"Medium size in CHS mode: {(ulong)currentSectors * testedMedia.BlockSize} bytes, {(ulong)currentSectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + else if(testedMedia.CHS != null) + { + int currentSectors = testedMedia.CHS.Cylinders * testedMedia.CHS.Heads * testedMedia.CHS.Sectors; + mediaOneValue.Add($"Cylinders: {testedMedia.CHS.Cylinders}"); + mediaOneValue.Add($"Heads: {testedMedia.CHS.Heads}"); + mediaOneValue.Add($"Sectors per track: {testedMedia.CHS.Sectors}"); + mediaOneValue.Add($"Sectors addressable in CHS mode: {currentSectors}"); + mediaOneValue + .Add($"Medium size in CHS mode: {(ulong)currentSectors * testedMedia.BlockSize} bytes, {(ulong)currentSectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)((ulong)currentSectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(testedMedia.LBASectors != null) + { + mediaOneValue.Add($"Sectors addressable in sectors in 28-bit LBA mode: {testedMedia.LBASectors}"); + + if((ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1024 / 1024 > 1000000) + mediaOneValue + .Add($"Medium size in 28-bit LBA mode: {(ulong)testedMedia.LBASectors * testedMedia.BlockSize} bytes, {(ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1000 / 1000 / 1000 / 1000} Tb, {(double)((ulong)testedMedia.LBASectors * testedMedia.BlockSize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if((ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1024 / 1024 > 1000) + mediaOneValue + .Add($"Medium size in 28-bit LBA mode: {(ulong)testedMedia.LBASectors * testedMedia.BlockSize} bytes, {(ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1000 / 1000 / 1000} Gb, {(double)((ulong)testedMedia.LBASectors * testedMedia.BlockSize) / 1024 / 1024 / 1024:F2} GiB"); + else + mediaOneValue + .Add($"Medium size in 28-bit LBA mode: {(ulong)testedMedia.LBASectors * testedMedia.BlockSize} bytes, {(ulong)testedMedia.LBASectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)((ulong)testedMedia.LBASectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(testedMedia.LBA48Sectors != null) + { + mediaOneValue.Add($"Sectors addressable in sectors in 48-bit LBA mode: {testedMedia.LBA48Sectors}"); + + if(testedMedia.LBA48Sectors * testedMedia.BlockSize / 1024 / 1024 > 1000000) + mediaOneValue + .Add($"Medium size in 48-bit LBA mode: {testedMedia.LBA48Sectors * testedMedia.BlockSize} bytes, {testedMedia.LBA48Sectors * testedMedia.BlockSize / 1000 / 1000 / 1000 / 1000} Tb, {(double)(testedMedia.LBA48Sectors * testedMedia.BlockSize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if(testedMedia.LBA48Sectors * testedMedia.BlockSize / 1024 / 1024 > 1000) + mediaOneValue + .Add($"Medium size in 48-bit LBA mode: {testedMedia.LBA48Sectors * testedMedia.BlockSize} bytes, {testedMedia.LBA48Sectors * testedMedia.BlockSize / 1000 / 1000 / 1000} Gb, {(double)(testedMedia.LBA48Sectors * testedMedia.BlockSize) / 1024 / 1024 / 1024:F2} GiB"); + else + mediaOneValue + .Add($"Medium size in 48-bit LBA mode: {testedMedia.LBA48Sectors * testedMedia.BlockSize} bytes, {testedMedia.LBA48Sectors * testedMedia.BlockSize / 1000 / 1000} Mb, {(double)(testedMedia.LBA48Sectors * testedMedia.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(testedMedia.NominalRotationRate != null && testedMedia.NominalRotationRate != 0x0000 && + testedMedia.NominalRotationRate != 0xFFFF) + mediaOneValue.Add(testedMedia.NominalRotationRate == 0x0001 + ? "Medium does not rotate." + : $"Medium rotates at {testedMedia.NominalRotationRate} rpm"); + + if(testedMedia.BlockSize != null && + testedMedia.PhysicalBlockSize != null && + testedMedia.BlockSize.Value != testedMedia.PhysicalBlockSize.Value && + (testedMedia.LogicalAlignment & 0x8000) == 0x0000 && + (testedMedia.LogicalAlignment & 0x4000) == 0x4000) + mediaOneValue + .Add($"Logical sector starts at offset {testedMedia.LogicalAlignment & 0x3FFF} from physical sector"); + + if(testedMedia.SupportsReadSectors == true) + mediaOneValue.Add("Device can use the READ SECTOR(S) command in CHS mode with this medium"); + if(testedMedia.SupportsReadRetry == true) + mediaOneValue.Add("Device can use the READ SECTOR(S) RETRY command in CHS mode with this medium"); + if(testedMedia.SupportsReadDma == true) + mediaOneValue.Add("Device can use the READ DMA command in CHS mode with this medium"); + if(testedMedia.SupportsReadDmaRetry == true) + mediaOneValue.Add("Device can use the READ DMA RETRY command in CHS mode with this medium"); + if(testedMedia.SupportsReadLong == true) + mediaOneValue.Add("Device can use the READ LONG command in CHS mode with this medium"); + if(testedMedia.SupportsReadLongRetry == true) + mediaOneValue.Add("Device can use the READ LONG RETRY command in CHS mode with this medium"); + + if(testedMedia.SupportsReadLba == true) + mediaOneValue.Add("Device can use the READ SECTOR(S) command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadRetryLba == true) + mediaOneValue + .Add("Device can use the READ SECTOR(S) RETRY command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadDmaLba == true) + mediaOneValue.Add("Device can use the READ DMA command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadDmaRetryLba == true) + mediaOneValue.Add("Device can use the READ DMA RETRY command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadLongLba == true) + mediaOneValue.Add("Device can use the READ LONG command in 28-bit LBA mode with this medium"); + if(testedMedia.SupportsReadLongRetryLba == true) + mediaOneValue.Add("Device can use the READ LONG RETRY command in 28-bit LBA mode with this medium"); + + if(testedMedia.SupportsReadLba48 == true) + mediaOneValue.Add("Device can use the READ SECTOR(S) command in 48-bit LBA mode with this medium"); + if(testedMedia.SupportsReadDmaLba48 == true) + mediaOneValue.Add("Device can use the READ DMA command in 48-bit LBA mode with this medium"); + + if(testedMedia.SupportsSeek == true) + mediaOneValue.Add("Device can use the SEEK command in CHS mode with this medium"); + if(testedMedia.SupportsSeekLba == true) + mediaOneValue.Add("Device can use the SEEK command in 28-bit LBA mode with this medium"); + + if(testedMedia.SupportsReadCapacity == true) + mediaOneValue.Add("Device can use the READ CAPACITY (10) command with this medium"); + if(testedMedia.SupportsReadCapacity16 == true) + mediaOneValue.Add("Device can use the READ CAPACITY (16) command with this medium"); + if(testedMedia.SupportsRead6 == true) + mediaOneValue.Add("Device can use the READ (6) command with this medium"); + if(testedMedia.SupportsRead10 == true) + mediaOneValue.Add("Device can use the READ (10) command with this medium"); + if(testedMedia.SupportsRead12 == true) + mediaOneValue.Add("Device can use the READ (12) command with this medium"); + if(testedMedia.SupportsRead16 == true) + mediaOneValue.Add("Device can use the READ (16) command with this medium"); + if(testedMedia.SupportsReadLong == true) + mediaOneValue.Add("Device can use the READ LONG (10) command with this medium"); + if(testedMedia.SupportsReadLong16 == true) + mediaOneValue.Add("Device can use the READ LONG (16) command with this medium"); + + if(testedMedia.SupportsReadCd == true) + mediaOneValue.Add("Device can use the READ CD command with LBA addressing with this medium"); + if(testedMedia.SupportsReadCdMsf == true) + mediaOneValue.Add("Device can use the READ CD command with MM:SS:FF addressing with this medium"); + if(testedMedia.SupportsReadCdRaw == true) + mediaOneValue + .Add("Device can use the READ CD command with LBA addressing with this medium to read raw sector"); + if(testedMedia.SupportsReadCdMsfRaw == true) + mediaOneValue + .Add("Device can use the READ CD command with MM:SS:FF addressing with this medium read raw sector"); + + if(testedMedia.SupportsHLDTSTReadRawDVD == true) + mediaOneValue.Add("Device can use the HL-DT-ST vendor READ DVD (RAW) command with this medium"); + if(testedMedia.SupportsNECReadCDDA == true) + mediaOneValue.Add("Device can use the NEC vendor READ CD-DA command with this medium"); + if(testedMedia.SupportsPioneerReadCDDA == true) + mediaOneValue.Add("Device can use the PIONEER vendor READ CD-DA command with this medium"); + if(testedMedia.SupportsPioneerReadCDDAMSF == true) + mediaOneValue.Add("Device can use the PIONEER vendor READ CD-DA MSF command with this medium"); + if(testedMedia.SupportsPlextorReadCDDA == true) + mediaOneValue.Add("Device can use the PLEXTOR vendor READ CD-DA command with this medium"); + if(testedMedia.SupportsPlextorReadRawDVD == true) + mediaOneValue.Add("Device can use the PLEXOR vendor READ DVD (RAW) command with this medium"); + + if(testedMedia.CanReadAACS == true) + mediaOneValue.Add("Device can read the Advanced Access Content System from this medium"); + if(testedMedia.CanReadADIP == true) + mediaOneValue.Add("Device can read the DVD ADress-In-Pregroove from this medium"); + if(testedMedia.CanReadATIP == true) + mediaOneValue.Add("Device can read the CD Absolute-Time-In-Pregroove from this medium"); + if(testedMedia.CanReadBCA == true) + mediaOneValue.Add("Device can read the Burst Cutting Area from this medium"); + if(testedMedia.CanReadC2Pointers == true) + mediaOneValue.Add("Device can report the C2 pointers when reading from this medium"); + if(testedMedia.CanReadCMI == true) + mediaOneValue.Add("Device can read the Copyright Management Information from this medium"); + if(testedMedia.CanReadCorrectedSubchannel == true) + mediaOneValue.Add("Device can correct subchannels when reading from this medium"); + if(testedMedia.CanReadCorrectedSubchannelWithC2 == true) + mediaOneValue + .Add("Device can correct subchannels and report the C2 pointers when reading from this medium"); + if(testedMedia.CanReadDCB == true) + mediaOneValue.Add("Device can read the Disc Control Blocks from this medium"); + if(testedMedia.CanReadDDS == true) + mediaOneValue.Add("Device can read the Disc Definition Structure from this medium"); + if(testedMedia.CanReadDMI == true) + mediaOneValue.Add("Device can read the Disc Manufacurer Information from this medium"); + if(testedMedia.CanReadDiscInformation == true) + mediaOneValue.Add("Device can read the Disc Information from this medium"); + if(testedMedia.CanReadFullTOC == true) + mediaOneValue.Add("Device can read the Table of Contents from this medium, without processing it"); + if(testedMedia.CanReadHDCMI == true) + mediaOneValue.Add("Device can read the HD DVD Copyright Management Information from this medium"); + if(testedMedia.CanReadLayerCapacity == true) + mediaOneValue.Add("Device can read the layer capacity from this medium"); + if(testedMedia.CanReadFirstTrackPreGap == true) + mediaOneValue.Add("Device can read the first track's pregap data"); + if(testedMedia.CanReadLeadIn == true) mediaOneValue.Add("Device can read the Lead-In from this medium"); + if(testedMedia.CanReadLeadOut == true) + mediaOneValue.Add("Device can read the Lead-Out from this medium"); + if(testedMedia.CanReadMediaID == true) + mediaOneValue.Add("Device can read the Media ID from this medium"); + if(testedMedia.CanReadMediaSerial == true) + mediaOneValue.Add("Device can read the Media Serial Number from this medium"); + if(testedMedia.CanReadPAC == true) mediaOneValue.Add("Device can read the PAC from this medium"); + if(testedMedia.CanReadPFI == true) + mediaOneValue.Add("Device can read the Physical Format Information from this medium"); + if(testedMedia.CanReadPMA == true) + mediaOneValue.Add("Device can read the Power Management Area from this medium"); + if(testedMedia.CanReadPQSubchannel == true) + mediaOneValue.Add("Device can read the P to Q subchannels from this medium"); + if(testedMedia.CanReadPQSubchannelWithC2 == true) + mediaOneValue + .Add("Device can read the P to Q subchannels from this medium reporting the C2 pointers"); + if(testedMedia.CanReadPRI == true) + mediaOneValue.Add("Device can read the Pre-Recorded Information from this medium"); + if(testedMedia.CanReadRWSubchannel == true) + mediaOneValue.Add("Device can read the R to W subchannels from this medium"); + if(testedMedia.CanReadRWSubchannelWithC2 == true) + mediaOneValue + .Add("Device can read the R to W subchannels from this medium reporting the C2 pointers"); + if(testedMedia.CanReadRecordablePFI == true) + mediaOneValue.Add("Device can read the Physical Format Information from Lead-In from this medium"); + if(testedMedia.CanReadSpareAreaInformation == true) + mediaOneValue.Add("Device can read the Spare Area Information from this medium"); + if(testedMedia.CanReadTOC == true) + mediaOneValue.Add("Device can read the Table of Contents from this medium"); + + mediaOneValue.Add(""); + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/App_Start/WebApiConfig.cs b/DiscImageChef.Server/App_Start/WebApiConfig.cs new file mode 100644 index 00000000..e0cecbf5 --- /dev/null +++ b/DiscImageChef.Server/App_Start/WebApiConfig.cs @@ -0,0 +1,61 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : WebApiConfig.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Configures Web API +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +// This is verbatim from ASP.NET so left as is +// ReSharper disable All + +using System.Data.Entity.Migrations; +using System.Web.Http; +using DiscImageChef.Server.Migrations; +using DiscImageChef.Server.Models; + +namespace DiscImageChef.Server +{ + public static class WebApiConfig + { + public static void Register(HttpConfiguration config) + { + // Web API configuration and services + + // Web API routes + config.MapHttpAttributeRoutes(); + + config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", + defaults: new {id = RouteParameter.Optional}); + + //DicServerContext ctx = new DicServerContext(); + Configuration migratorConfig = new Migrations.Configuration(); + DbMigrator dbMigrator = new DbMigrator(migratorConfig); + dbMigrator.Update(); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/HomeController.cs b/DiscImageChef.Server/Controllers/HomeController.cs new file mode 100644 index 00000000..bbb25e28 --- /dev/null +++ b/DiscImageChef.Server/Controllers/HomeController.cs @@ -0,0 +1,199 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : HomeController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Provides documentation data for razor views. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.IO; +using System.Reflection; +using System.Web.Hosting; +using System.Web.Mvc; +using Markdig; + +namespace DiscImageChef.Server.Controllers +{ + [RoutePrefix("Home")] + public class HomeController : Controller + { + [Route("")] + [Route("~/")] + [Route("README")] + [Route("~/README")] + public ActionResult Index() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "README.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")"); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("Changelog")] + [Route("~/Changelog")] + public ActionResult Changelog() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "Changelog.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")"); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("CODE_OF_CONDUCT")] + [Route("~/CODE_OF_CONDUCT")] + public ActionResult CODE_OF_CONDUCT() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "CODE_OF_CONDUCT.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")").Replace("(.github/", "("); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("PULL_REQUEST_TEMPLATE")] + [Route("~/PULL_REQUEST_TEMPLATE")] + public ActionResult PULL_REQUEST_TEMPLATE() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "PULL_REQUEST_TEMPLATE.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")").Replace("(.github/", "("); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("ISSUE_TEMPLATE")] + [Route("~/ISSUE_TEMPLATE")] + public ActionResult ISSUE_TEMPLATE() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "ISSUE_TEMPLATE.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")").Replace("(.github/", "("); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("CONTRIBUTING")] + [Route("~/CONTRIBUTING")] + public ActionResult CONTRIBUTING() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "CONTRIBUTING.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")").Replace("(.github/", "("); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("DONATING")] + [Route("~/DONATING")] + public ActionResult DONATING() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "DONATING.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")"); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + + [Route("TODO")] + [Route("~/TODO")] + public ActionResult TODO() + { + StreamReader sr = + new StreamReader(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "docs", "TODO.md")); + string mdcontent = sr.ReadToEnd(); + sr.Close(); + + mdcontent = mdcontent.Replace(".md)", ")"); + + ViewBag.Markdown = Markdown.ToHtml(mdcontent); + + ViewBag.lblVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + return View(); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/ReportController.cs b/DiscImageChef.Server/Controllers/ReportController.cs new file mode 100644 index 00000000..5f599a50 --- /dev/null +++ b/DiscImageChef.Server/Controllers/ReportController.cs @@ -0,0 +1,474 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ReportController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Fetches reports from database for Razor views. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web.Mvc; +using System.Web.Routing; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Decoders.PCMCIA; +using DiscImageChef.Decoders.SCSI; +using DiscImageChef.Server.Models; +using Tuple = DiscImageChef.Decoders.PCMCIA.Tuple; + +namespace DiscImageChef.Server.Controllers +{ + public class ReportController : Controller + { + public ActionResult Index() => RedirectToAction("View", "Report", new RouteValueDictionary {{"id", 1}}); + + public ActionResult View(int? id) + { + if(id == null || id <= 0) return Content("Incorrect device report request"); + + try + { + DicServerContext ctx = new DicServerContext(); + Device report = ctx.Devices.FirstOrDefault(d => d.Id == id); + + if(report is null) return Content("Cannot find requested report"); + + ViewBag.lblManufacturer = report.Manufacturer; + ViewBag.lblModel = report.Model; + ViewBag.lblRevision = report.Revision; + + if(report.USB != null) + { + string usbVendorDescription = null; + string usbProductDescription = null; + + UsbProduct dbProduct = + ctx.UsbProducts.FirstOrDefault(p => p.ProductId == report.USB.ProductID && + p.Vendor != null && + p.Vendor.VendorId == report.USB.VendorID); + + if(dbProduct is null) + { + UsbVendor dbVendor = ctx.UsbVendors.FirstOrDefault(v => v.VendorId == report.USB.VendorID); + + if(!(dbVendor is null)) usbVendorDescription = dbVendor.Vendor; + } + else + { + usbProductDescription = dbProduct.Product; + usbVendorDescription = dbProduct.Vendor.Vendor; + } + + ViewBag.UsbItem = new Item + { + Manufacturer = report.USB.Manufacturer, + Product = report.USB.Product, + VendorDescription = + usbVendorDescription != null + ? $"0x{report.USB.VendorID:x4} ({usbVendorDescription})" + : $"0x{report.USB.VendorID:x4}", + ProductDescription = usbProductDescription != null + ? $"0x{report.USB.ProductID:x4} ({usbProductDescription})" + : $"0x{report.USB.ProductID:x4}" + }; + } + + if(report.FireWire != null) + ViewBag.FireWireItem = new Item + { + Manufacturer = report.FireWire.Manufacturer, + Product = report.FireWire.Product, + VendorDescription = $"0x{report.FireWire.VendorID:x8}", + ProductDescription = $"0x{report.FireWire.ProductID:x8}" + }; + + if(report.PCMCIA != null) + { + ViewBag.PcmciaItem = new PcmciaItem + { + Manufacturer = report.PCMCIA.Manufacturer, + Product = report.PCMCIA.ProductName, + VendorDescription = $"0x{report.PCMCIA.ManufacturerCode:x4}", + ProductDescription = $"0x{report.PCMCIA.CardCode:x4}", + Compliance = report.PCMCIA.Compliance + }; + + Tuple[] tuples = CIS.GetTuples(report.PCMCIA.CIS); + if(tuples != null) + { + Dictionary decodedTuples = new Dictionary(); + foreach(Tuple tuple in tuples) + switch(tuple.Code) + { + case TupleCodes.CISTPL_NULL: + case TupleCodes.CISTPL_END: + case TupleCodes.CISTPL_MANFID: + case TupleCodes.CISTPL_VERS_1: break; + case TupleCodes.CISTPL_DEVICEGEO: + case TupleCodes.CISTPL_DEVICEGEO_A: + DeviceGeometryTuple geom = CIS.DecodeDeviceGeometryTuple(tuple.Data); + if(geom?.Geometries != null) + foreach(DeviceGeometry geometry in geom.Geometries) + { + decodedTuples.Add("Device width", + $"{(1 << (geometry.CardInterface - 1)) * 8} bits"); + decodedTuples.Add("Erase block", + $"{(1 << (geometry.EraseBlockSize - 1)) * (1 << (geometry.Interleaving - 1))} bytes"); + decodedTuples.Add("Read block", + $"{(1 << (geometry.ReadBlockSize - 1)) * (1 << (geometry.Interleaving - 1))} bytes"); + decodedTuples.Add("Write block", + $"{(1 << (geometry.WriteBlockSize - 1)) * (1 << (geometry.Interleaving - 1))} bytes"); + decodedTuples.Add("Partition alignment", + $"{(1 << (geometry.EraseBlockSize - 1)) * (1 << (geometry.Interleaving - 1)) * (1 << (geometry.Partitions - 1))} bytes"); + } + + break; + case TupleCodes.CISTPL_ALTSTR: + case TupleCodes.CISTPL_BAR: + case TupleCodes.CISTPL_BATTERY: + case TupleCodes.CISTPL_BYTEORDER: + case TupleCodes.CISTPL_CFTABLE_ENTRY: + case TupleCodes.CISTPL_CFTABLE_ENTRY_CB: + case TupleCodes.CISTPL_CHECKSUM: + case TupleCodes.CISTPL_CONFIG: + case TupleCodes.CISTPL_CONFIG_CB: + case TupleCodes.CISTPL_DATE: + case TupleCodes.CISTPL_DEVICE: + case TupleCodes.CISTPL_DEVICE_A: + case TupleCodes.CISTPL_DEVICE_OA: + case TupleCodes.CISTPL_DEVICE_OC: + case TupleCodes.CISTPL_EXTDEVIC: + case TupleCodes.CISTPL_FORMAT: + case TupleCodes.CISTPL_FORMAT_A: + case TupleCodes.CISTPL_FUNCE: + case TupleCodes.CISTPL_FUNCID: + case TupleCodes.CISTPL_GEOMETRY: + case TupleCodes.CISTPL_INDIRECT: + case TupleCodes.CISTPL_JEDEC_A: + case TupleCodes.CISTPL_JEDEC_C: + case TupleCodes.CISTPL_LINKTARGET: + case TupleCodes.CISTPL_LONGLINK_A: + case TupleCodes.CISTPL_LONGLINK_C: + case TupleCodes.CISTPL_LONGLINK_CB: + case TupleCodes.CISTPL_LONGLINK_MFC: + case TupleCodes.CISTPL_NO_LINK: + case TupleCodes.CISTPL_ORG: + case TupleCodes.CISTPL_PWR_MGMNT: + case TupleCodes.CISTPL_SPCL: + case TupleCodes.CISTPL_SWIL: + case TupleCodes.CISTPL_VERS_2: + decodedTuples.Add("Undecoded tuple ID", tuple.Code.ToString()); + break; + default: + decodedTuples.Add("Unknown tuple ID", $"0x{(byte)tuple.Code:X2}"); + break; + } + + if(decodedTuples.Count > 0) ViewBag.repPcmciaTuples = decodedTuples; + } + } + + bool removable = true; + List testedMedia = null; + bool ata = false; + bool atapi = false; + bool sscMedia = false; + + if(report.ATA != null || report.ATAPI != null) + { + ata = true; + List ataOneValue = new List(); + Dictionary ataTwoValue = new Dictionary(); + CommonTypes.Metadata.Ata ataReport; + + if(report.ATAPI != null) + { + ViewBag.AtaItem = "ATAPI"; + ataReport = report.ATAPI; + atapi = true; + } + else + { + ViewBag.AtaItem = "ATA"; + ataReport = report.ATA; + } + + bool cfa = report.CompactFlash; + + if(atapi && !cfa) ViewBag.lblAtaDeviceType = "ATAPI device"; + else if(!atapi && cfa) ViewBag.lblAtaDeviceType = "CompactFlash device"; + else ViewBag.lblAtaDeviceType = "ATA device"; + + Ata.Report(ataReport, cfa, atapi, ref removable, ref ataOneValue, ref ataTwoValue, ref testedMedia); + + ViewBag.repAtaOne = ataOneValue; + ViewBag.repAtaTwo = ataTwoValue; + } + + if(report.SCSI != null) + { + List scsiOneValue = new List(); + Dictionary modePages = new Dictionary(); + Dictionary evpdPages = new Dictionary(); + + string vendorId = StringHandlers.CToString(report.SCSI.Inquiry?.VendorIdentification); + if(report.SCSI.Inquiry != null) + { + Inquiry.SCSIInquiry inq = report.SCSI.Inquiry.Value; + ViewBag.lblScsiVendor = VendorString.Prettify(vendorId) != vendorId + ? $"{vendorId} ({VendorString.Prettify(vendorId)})" + : vendorId; + ViewBag.lblScsiProduct = StringHandlers.CToString(inq.ProductIdentification); + ViewBag.lblScsiRevision = StringHandlers.CToString(inq.ProductRevisionLevel); + } + + scsiOneValue.AddRange(ScsiInquiry.Report(report.SCSI.Inquiry)); + + if(report.SCSI.SupportsModeSense6) scsiOneValue.Add("Device supports MODE SENSE (6)"); + if(report.SCSI.SupportsModeSense10) scsiOneValue.Add("Device supports MODE SENSE (10)"); + if(report.SCSI.SupportsModeSubpages) scsiOneValue.Add("Device supports MODE SENSE subpages"); + + if(report.SCSI.ModeSense != null) + { + PeripheralDeviceTypes devType = PeripheralDeviceTypes.DirectAccess; + if(report.SCSI.Inquiry != null) + devType = (PeripheralDeviceTypes)report.SCSI.Inquiry.Value.PeripheralDeviceType; + ScsiModeSense.Report(report.SCSI.ModeSense, vendorId, devType, ref scsiOneValue, ref modePages); + } + + if(modePages.Count > 0) ViewBag.repModeSense = modePages; + + if(report.SCSI.EVPDPages != null) ScsiEvpd.Report(report.SCSI.EVPDPages, vendorId, ref evpdPages); + + if(evpdPages.Count > 0) ViewBag.repEvpd = evpdPages; + + if(report.SCSI.MultiMediaDevice != null) + { + testedMedia = report.SCSI.MultiMediaDevice.TestedMedia; + + if(report.SCSI.MultiMediaDevice.ModeSense2A != null) + { + List mmcModeOneValue = new List(); + ScsiMmcMode.Report(report.SCSI.MultiMediaDevice.ModeSense2A, ref mmcModeOneValue); + if(mmcModeOneValue.Count > 0) ViewBag.repScsiMmcMode = mmcModeOneValue; + } + + if(report.SCSI.MultiMediaDevice.Features != null) + { + List mmcFeaturesOneValue = new List(); + ScsiMmcFeatures.Report(report.SCSI.MultiMediaDevice.Features, ref mmcFeaturesOneValue); + if(mmcFeaturesOneValue.Count > 0) ViewBag.repScsiMmcFeatures = mmcFeaturesOneValue; + } + } + else if(report.SCSI.SequentialDevice != null) + { + ViewBag.divScsiSscVisible = true; + + ViewBag.lblScsiSscGranularity = + report.SCSI.SequentialDevice.BlockSizeGranularity?.ToString() ?? "Unspecified"; + + ViewBag.lblScsiSscMaxBlock = + report.SCSI.SequentialDevice.MaxBlockLength?.ToString() ?? "Unspecified"; + + ViewBag.lblScsiSscMinBlock = + report.SCSI.SequentialDevice.MinBlockLength?.ToString() ?? "Unspecified"; + + if(report.SCSI.SequentialDevice.SupportedDensities != null) + ViewBag.repScsiSscDensities = report.SCSI.SequentialDevice.SupportedDensities; + + if(report.SCSI.SequentialDevice.SupportedMediaTypes != null) + ViewBag.repScsiSscMedias = report.SCSI.SequentialDevice.SupportedMediaTypes; + + if(report.SCSI.SequentialDevice.TestedMedia != null) + { + List mediaOneValue = new List(); + SscTestedMedia.Report(report.SCSI.SequentialDevice.TestedMedia, ref mediaOneValue); + if(mediaOneValue.Count > 0) + { + sscMedia = true; + ViewBag.repTestedMedia = mediaOneValue; + } + } + } + else if(report.SCSI.ReadCapabilities != null) + { + removable = false; + scsiOneValue.Add(""); + + if(report.SCSI.ReadCapabilities.Blocks.HasValue && + report.SCSI.ReadCapabilities.BlockSize.HasValue) + { + scsiOneValue + .Add($"Device has {report.SCSI.ReadCapabilities.Blocks} blocks of {report.SCSI.ReadCapabilities.BlockSize} bytes each"); + + if(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / 1024 / + 1024 > 1000000) + scsiOneValue + .Add($"Device size: {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize} bytes, {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / 1000 / 1000 / 1000 / 1000} Tb, {(double)(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize) / 1024 / 1024 / 1024 / 1024:F2} TiB"); + else if(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / + 1024 / + 1024 > 1000) + scsiOneValue + .Add($"Device size: {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize} bytes, {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / 1000 / 1000 / 1000} Gb, {(double)(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize) / 1024 / 1024 / 1024:F2} GiB"); + else + scsiOneValue + .Add($"Device size: {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize} bytes, {report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize / 1000 / 1000} Mb, {(double)(report.SCSI.ReadCapabilities.Blocks * report.SCSI.ReadCapabilities.BlockSize) / 1024 / 1024:F2} MiB"); + } + + if(report.SCSI.ReadCapabilities.MediumType.HasValue) + scsiOneValue.Add($"Medium type code: {report.SCSI.ReadCapabilities.MediumType:X2}h"); + if(report.SCSI.ReadCapabilities.Density.HasValue) + scsiOneValue.Add($"Density code: {report.SCSI.ReadCapabilities.Density:X2}h"); + if((report.SCSI.ReadCapabilities.SupportsReadLong == true || + report.SCSI.ReadCapabilities.SupportsReadLong16 == true) && + report.SCSI.ReadCapabilities.LongBlockSize.HasValue) + scsiOneValue.Add($"Long block size: {report.SCSI.ReadCapabilities.LongBlockSize} bytes"); + if(report.SCSI.ReadCapabilities.SupportsReadCapacity == true) + scsiOneValue.Add("Device supports READ CAPACITY (10) command."); + if(report.SCSI.ReadCapabilities.SupportsReadCapacity16 == true) + scsiOneValue.Add("Device supports READ CAPACITY (16) command."); + if(report.SCSI.ReadCapabilities.SupportsRead6 == true) + scsiOneValue.Add("Device supports READ (6) command."); + if(report.SCSI.ReadCapabilities.SupportsRead10 == true) + scsiOneValue.Add("Device supports READ (10) command."); + if(report.SCSI.ReadCapabilities.SupportsRead12 == true) + scsiOneValue.Add("Device supports READ (12) command."); + if(report.SCSI.ReadCapabilities.SupportsRead16 == true) + scsiOneValue.Add("Device supports READ (16) command."); + if(report.SCSI.ReadCapabilities.SupportsReadLong == true) + scsiOneValue.Add("Device supports READ LONG (10) command."); + if(report.SCSI.ReadCapabilities.SupportsReadLong16 == true) + scsiOneValue.Add("Device supports READ LONG (16) command."); + } + else testedMedia = report.SCSI.RemovableMedias; + + ViewBag.repScsi = scsiOneValue; + } + + if(report.MultiMediaCard != null) + { + List mmcOneValue = new List(); + + if(report.MultiMediaCard.CID != null) + { + mmcOneValue.Add(Decoders.MMC.Decoders.PrettifyCID(report.MultiMediaCard.CID) + .Replace("\n", "
")); + mmcOneValue.Add(""); + } + + if(report.MultiMediaCard.CSD != null) + { + mmcOneValue.Add(Decoders.MMC.Decoders.PrettifyCSD(report.MultiMediaCard.CSD) + .Replace("\n", "
")); + mmcOneValue.Add(""); + } + + if(report.MultiMediaCard.ExtendedCSD != null) + { + mmcOneValue.Add(Decoders.MMC.Decoders.PrettifyExtendedCSD(report.MultiMediaCard.ExtendedCSD) + .Replace("\n", "
")); + mmcOneValue.Add(""); + } + + if(report.MultiMediaCard.OCR != null) + { + mmcOneValue.Add(Decoders.MMC.Decoders.PrettifyCSD(report.MultiMediaCard.OCR) + .Replace("\n", "
")); + mmcOneValue.Add(""); + } + + ViewBag.repMMC = mmcOneValue; + } + + if(report.SecureDigital != null) + { + List sdOneValue = new List(); + + if(report.SecureDigital.CID != null) + { + sdOneValue.Add(Decoders.SecureDigital.Decoders.PrettifyCID(report.SecureDigital.CID) + .Replace("\n", "
")); + sdOneValue.Add(""); + } + + if(report.SecureDigital.CSD != null) + { + sdOneValue.Add(Decoders.SecureDigital.Decoders.PrettifyCSD(report.SecureDigital.CSD) + .Replace("\n", "
")); + sdOneValue.Add(""); + } + + if(report.SecureDigital.SCR != null) + { + sdOneValue.Add(Decoders.SecureDigital.Decoders.PrettifySCR(report.SecureDigital.SCR) + .Replace("\n", "
")); + sdOneValue.Add(""); + } + + if(report.SecureDigital.OCR != null) + { + sdOneValue.Add(Decoders.SecureDigital.Decoders.PrettifyCSD(report.SecureDigital.OCR) + .Replace("\n", "
")); + sdOneValue.Add(""); + } + + ViewBag.repSD = sdOneValue; + } + + if(removable && !sscMedia && testedMedia != null) + { + List mediaOneValue = new List(); + App_Start.TestedMedia.Report(testedMedia, ref mediaOneValue); + if(mediaOneValue.Count > 0) ViewBag.repTestedMedia = mediaOneValue; + } + } + catch(Exception) + { + #if DEBUG + throw; + #endif + return Content("Could not load device report"); + } + + return View(); + } + } + + public class Item + { + public string Manufacturer; + public string Product; + public string ProductDescription; + public string VendorDescription; + } + + public class PcmciaItem : Item + { + public string Compliance; + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/StatsController.cs b/DiscImageChef.Server/Controllers/StatsController.cs new file mode 100644 index 00000000..44da8683 --- /dev/null +++ b/DiscImageChef.Server/Controllers/StatsController.cs @@ -0,0 +1,531 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : StatsController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Fetches statistics for Razor views. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Web.Hosting; +using System.Web.Mvc; +using System.Xml; +using System.Xml.Serialization; +using DiscImageChef.CommonTypes.Interop; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Server.Models; +using Highsoft.Web.Mvc.Charts; +using Filter = DiscImageChef.Server.Models.Filter; +using OperatingSystem = DiscImageChef.Server.Models.OperatingSystem; +using PlatformID = DiscImageChef.CommonTypes.Interop.PlatformID; +using Version = DiscImageChef.Server.Models.Version; + +namespace DiscImageChef.Server.Controllers +{ + /// + /// Renders a page with statistics, list of media type, devices, etc + /// + public class StatsController : Controller + { + DicServerContext ctx = new DicServerContext(); + List devices; + List operatingSystems; + List realMedia; + List versions; + List virtualMedia; + + public ActionResult Index() + { + ViewBag.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); + + try + { + if( + System.IO.File + .Exists(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "Statistics", "Statistics.xml"))) + try + { + Stats statistics = new Stats(); + + XmlSerializer xs = new XmlSerializer(statistics.GetType()); + FileStream fs = + WaitForFile(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml"), + FileMode.Open, FileAccess.Read, FileShare.Read); + statistics = (Stats)xs.Deserialize(fs); + fs.Close(); + + StatsConverter.Convert(statistics); + + System.IO.File + .Delete(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "Statistics", "Statistics.xml")); + } + catch(XmlException) + { + // Do nothing + } + + if(ctx.OperatingSystems.Any()) + { + operatingSystems = new List(); + foreach(OperatingSystem nvs in ctx.OperatingSystems) + operatingSystems.Add(new NameValueStats + { + name = + $"{DetectOS.GetPlatformName((PlatformID)Enum.Parse(typeof(PlatformID), nvs.Name), nvs.Version)}{(string.IsNullOrEmpty(nvs.Version) ? "" : " ")}{nvs.Version}", + Value = nvs.Count + }); + + ViewBag.repOperatingSystems = operatingSystems.OrderBy(os => os.name).ToList(); + + List osPieData = new List(); + + decimal totalOsCount = ctx.OperatingSystems.Sum(o => o.Count); + foreach(string os in ctx.OperatingSystems.Select(o => o.Name).Distinct().ToList()) + { + decimal osCount = ctx.OperatingSystems.Where(o => o.Name == os).Sum(o => o.Count); + + osPieData.Add(new PieSeriesData + { + Name = + DetectOS.GetPlatformName((PlatformID)Enum.Parse(typeof(PlatformID), + os)), + Y = (double?)(osCount / totalOsCount), + Sliced = os == "Linux", + Selected = os == "Linux" + }); + } + + ViewData["osPieData"] = osPieData; + + List linuxPieData = new List(); + + decimal linuxCount = ctx.OperatingSystems.Where(o => o.Name == PlatformID.Linux.ToString()) + .Sum(o => o.Count); + foreach(OperatingSystem version in + ctx.OperatingSystems.Where(o => o.Name == PlatformID.Linux.ToString())) + linuxPieData.Add(new PieSeriesData + { + Name = + $"{DetectOS.GetPlatformName(PlatformID.Linux, version.Version)}{(string.IsNullOrEmpty(version.Version) ? "" : " ")}{version.Version}", + Y = (double?)(version.Count / linuxCount) + }); + + ViewData["linuxPieData"] = linuxPieData; + + List macosPieData = new List(); + + decimal macosCount = ctx.OperatingSystems.Where(o => o.Name == PlatformID.MacOSX.ToString()) + .Sum(o => o.Count); + foreach(OperatingSystem version in + ctx.OperatingSystems.Where(o => o.Name == PlatformID.MacOSX.ToString())) + macosPieData.Add(new PieSeriesData + { + Name = + $"{DetectOS.GetPlatformName(PlatformID.MacOSX, version.Version)}{(string.IsNullOrEmpty(version.Version) ? "" : " ")}{version.Version}", + Y = (double?)(version.Count / macosCount) + }); + + ViewData["macosPieData"] = macosPieData; + + List windowsPieData = new List(); + + decimal windowsCount = ctx.OperatingSystems.Where(o => o.Name == PlatformID.Win32NT.ToString()) + .Sum(o => o.Count); + foreach(OperatingSystem version in + ctx.OperatingSystems.Where(o => o.Name == PlatformID.Win32NT.ToString())) + windowsPieData.Add(new PieSeriesData + { + Name = + $"{DetectOS.GetPlatformName(PlatformID.Win32NT, version.Version)}{(string.IsNullOrEmpty(version.Version) ? "" : " ")}{version.Version}", + Y = (double?)(version.Count / windowsCount) + }); + + ViewData["windowsPieData"] = windowsPieData; + } + + if(ctx.Versions.Any()) + { + versions = new List(); + foreach(Version nvs in ctx.Versions) + versions.Add(new NameValueStats + { + name = nvs.Value == "previous" ? "Previous than 3.4.99.0" : nvs.Value, + Value = nvs.Count + }); + + ViewBag.repVersions = versions.OrderBy(ver => ver.name).ToList(); + + decimal totalVersionCount = ctx.Versions.Sum(o => o.Count); + + ViewData["versionsPieData"] = ctx.Versions.Select(version => new PieSeriesData + { + Name = + version.Value == "previous" + ? "Previous than 3.4.99.0" + : version.Value, + Y = (double?)(version.Count / + totalVersionCount), + Sliced = version.Value == "previous", + Selected = version.Value == "previous" + }).ToList(); + } + + if(ctx.Commands.Any()) + { + ViewBag.repCommands = ctx.Commands.OrderBy(c => c.Name).ToList(); + + decimal totalCommandCount = ctx.Commands.Sum(o => o.Count); + + ViewData["commandsPieData"] = ctx + .Commands.Select(command => new PieSeriesData + { + Name = command.Name, + Y = (double?)(command.Count / + totalCommandCount), + Sliced = command.Name == "analyze", + Selected = command.Name == "analyze" + }).ToList(); + } + + if(ctx.Filters.Any()) + { + ViewBag.repFilters = ctx.Filters.OrderBy(filter => filter.Name).ToList(); + + List filtersPieData = new List(); + + decimal totalFiltersCount = ctx.Filters.Sum(o => o.Count); + foreach(Filter filter in ctx.Filters.ToList()) + filtersPieData.Add(new PieSeriesData + { + Name = filter.Name, + Y = (double?)(filter.Count / totalFiltersCount), + Sliced = filter.Name == "No filter", + Selected = filter.Name == "No filter" + }); + + ViewData["filtersPieData"] = filtersPieData; + } + + if(ctx.MediaFormats.Any()) + { + ViewBag.repMediaImages = ctx.MediaFormats.OrderBy(filter => filter.Name).ToList(); + + List formatsPieData = new List(); + + decimal totalFormatsCount = ctx.MediaFormats.Sum(o => o.Count); + decimal top10FormatCount = 0; + + foreach(MediaFormat format in ctx.MediaFormats.OrderByDescending(o => o.Count).Take(10)) + { + top10FormatCount += format.Count; + + formatsPieData.Add(new PieSeriesData + { + Name = format.Name, Y = (double?)(format.Count / totalFormatsCount) + }); + } + + formatsPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?)((totalFormatsCount - top10FormatCount) / + totalFormatsCount), + Sliced = true, + Selected = true + }); + + ViewData["formatsPieData"] = formatsPieData; + } + + if(ctx.Partitions.Any()) + { + ViewBag.repPartitions = ctx.Partitions.OrderBy(filter => filter.Name).ToList(); + + List partitionsPieData = new List(); + + decimal totalPartitionsCount = ctx.Partitions.Sum(o => o.Count); + decimal top10PartitionCount = 0; + + foreach(Partition partition in ctx.Partitions.OrderByDescending(o => o.Count).Take(10)) + { + top10PartitionCount += partition.Count; + + partitionsPieData.Add(new PieSeriesData + { + Name = partition.Name, + Y = (double?)(partition.Count / totalPartitionsCount) + }); + } + + partitionsPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?)((totalPartitionsCount - top10PartitionCount) / + totalPartitionsCount), + Sliced = true, + Selected = true + }); + + ViewData["partitionsPieData"] = partitionsPieData; + } + + if(ctx.Filesystems.Any()) + { + ViewBag.repFilesystems = ctx.Filesystems.OrderBy(filter => filter.Name).ToList(); + + List filesystemsPieData = new List(); + + decimal totalFilesystemsCount = ctx.Filesystems.Sum(o => o.Count); + decimal top10FilesystemCount = 0; + + foreach(Filesystem filesystem in ctx.Filesystems.OrderByDescending(o => o.Count).Take(10)) + { + top10FilesystemCount += filesystem.Count; + + filesystemsPieData.Add(new PieSeriesData + { + Name = filesystem.Name, + Y = (double?)(filesystem.Count / totalFilesystemsCount) + }); + } + + filesystemsPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?)((totalFilesystemsCount - top10FilesystemCount) / + totalFilesystemsCount), + Sliced = true, + Selected = true + }); + + ViewData["filesystemsPieData"] = filesystemsPieData; + } + + if(ctx.Medias.Any()) + { + realMedia = new List(); + virtualMedia = new List(); + foreach(Media nvs in ctx.Medias) + try + { + MediaType + .MediaTypeToString((CommonTypes.MediaType)Enum.Parse(typeof(CommonTypes.MediaType), nvs.Type), + out string type, out string subtype); + + if(nvs.Real) + realMedia.Add(new MediaItem {Type = type, SubType = subtype, Count = nvs.Count}); + else virtualMedia.Add(new MediaItem {Type = type, SubType = subtype, Count = nvs.Count}); + } + catch + { + if(nvs.Real) + realMedia.Add(new MediaItem {Type = nvs.Type, SubType = null, Count = nvs.Count}); + else virtualMedia.Add(new MediaItem {Type = nvs.Type, SubType = null, Count = nvs.Count}); + } + + if(realMedia.Count > 0) + { + ViewBag.repRealMedia = + realMedia.OrderBy(media => media.Type).ThenBy(media => media.SubType).ToList(); + + List realMediaPieData = new List(); + + decimal totalRealMediaCount = realMedia.Sum(o => o.Count); + decimal top10RealMediaCount = 0; + + foreach(MediaItem realMediaItem in realMedia.OrderByDescending(o => o.Count).Take(10)) + { + top10RealMediaCount += realMediaItem.Count; + + realMediaPieData.Add(new PieSeriesData + { + Name = $"{realMediaItem.Type} ({realMediaItem.SubType})", + Y = (double?)(realMediaItem.Count / totalRealMediaCount) + }); + } + + realMediaPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?)((totalRealMediaCount - top10RealMediaCount) / + totalRealMediaCount), + Sliced = true, + Selected = true + }); + + ViewData["realMediaPieData"] = realMediaPieData; + } + + if(virtualMedia.Count > 0) + { + ViewBag.repVirtualMedia = + virtualMedia.OrderBy(media => media.Type).ThenBy(media => media.SubType).ToList(); + + List virtualMediaPieData = new List(); + + decimal totalVirtualMediaCount = virtualMedia.Sum(o => o.Count); + decimal top10VirtualMediaCount = 0; + + foreach(MediaItem virtualMediaItem in virtualMedia.OrderByDescending(o => o.Count).Take(10)) + { + top10VirtualMediaCount += virtualMediaItem.Count; + + virtualMediaPieData.Add(new PieSeriesData + { + Name = + $"{virtualMediaItem.Type} ({virtualMediaItem.SubType})", + Y = (double?)(virtualMediaItem.Count / + totalVirtualMediaCount) + }); + } + + virtualMediaPieData.Add(new PieSeriesData + { + Name = "Other", + Y = (double?) + ((totalVirtualMediaCount - top10VirtualMediaCount) / + totalVirtualMediaCount), + Sliced = true, + Selected = true + }); + + ViewData["virtualMediaPieData"] = virtualMediaPieData; + } + } + + if(ctx.DeviceStats.Any()) + { + devices = new List(); + foreach(DeviceStat device in ctx.DeviceStats.ToList()) + { + string xmlFile; + if(!string.IsNullOrWhiteSpace(device.Manufacturer) && + !string.IsNullOrWhiteSpace(device.Model) && + !string.IsNullOrWhiteSpace(device.Revision)) + xmlFile = device.Manufacturer + "_" + device.Model + "_" + device.Revision + ".xml"; + else if(!string.IsNullOrWhiteSpace(device.Manufacturer) && + !string.IsNullOrWhiteSpace(device.Model)) + xmlFile = device.Manufacturer + "_" + device.Model + ".xml"; + else if(!string.IsNullOrWhiteSpace(device.Model) && !string.IsNullOrWhiteSpace(device.Revision)) + xmlFile = device.Model + "_" + device.Revision + ".xml"; + else xmlFile = device.Model + ".xml"; + + xmlFile = xmlFile.Replace('/', '_').Replace('\\', '_').Replace('?', '_'); + + if(System.IO.File.Exists(Path.Combine(HostingEnvironment.MapPath("~"), "Reports", xmlFile))) + { + DeviceReport deviceReport = new DeviceReport(); + + XmlSerializer xs = new XmlSerializer(deviceReport.GetType()); + FileStream fs = + WaitForFile(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Reports", xmlFile), + FileMode.Open, FileAccess.Read, FileShare.Read); + deviceReport = (DeviceReport)xs.Deserialize(fs); + fs.Close(); + + DeviceReportV2 deviceReportV2 = new DeviceReportV2(deviceReport); + + device.Report = ctx.Devices.Add(new Device(deviceReportV2)); + ctx.SaveChanges(); + + System.IO.File + .Delete(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "Reports", xmlFile)); + } + + devices.Add(new DeviceItem + { + Manufacturer = device.Manufacturer, + Model = device.Model, + Revision = device.Revision, + Bus = device.Bus, + ReportId = device.Report != null && device.Report.Id != 0 + ? device.Report.Id + : 0 + }); + } + + ViewBag.repDevices = devices.OrderBy(device => device.Manufacturer).ThenBy(device => device.Model) + .ThenBy(device => device.Revision).ThenBy(device => device.Bus) + .ToList(); + + ViewData["devicesBusPieData"] = (from deviceBus in devices.Select(d => d.Bus).Distinct() + let deviceBusCount = devices.Count(d => d.Bus == deviceBus) + select new PieSeriesData + { + Name = deviceBus, + Y = deviceBusCount / (double)devices.Count + }).ToList(); + + ViewData["devicesManufacturerPieData"] = + (from manufacturer in + devices.Where(d => d.Manufacturer != null).Select(d => d.Manufacturer.ToLowerInvariant()) + .Distinct() + let manufacturerCount = devices.Count(d => d.Manufacturer?.ToLowerInvariant() == manufacturer) + select new PieSeriesData {Name = manufacturer, Y = manufacturerCount / (double)devices.Count}) + .ToList(); + } + } + catch(Exception) + { + #if DEBUG + throw; + #endif + return Content("Could not read statistics"); + } + + return View(); + } + + static FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access, FileShare share) + { + for(int numTries = 0; numTries < 100; numTries++) + { + FileStream fs = null; + try + { + fs = new FileStream(fullPath, mode, access, share); + return fs; + } + catch(IOException) + { + fs?.Dispose(); + Thread.Sleep(50); + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/UpdateController.cs b/DiscImageChef.Server/Controllers/UpdateController.cs new file mode 100644 index 00000000..423f5502 --- /dev/null +++ b/DiscImageChef.Server/Controllers/UpdateController.cs @@ -0,0 +1,98 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UploadReportController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Handles report uploads. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Web.Http; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Dto; +using DiscImageChef.Server.Models; +using Newtonsoft.Json; + +namespace DiscImageChef.Server.Controllers +{ + public class UpdateController : ApiController + { + /// + /// Receives a report from DiscImageChef.Core, verifies it's in the correct format and stores it on the server + /// + /// HTTP response + [Route("api/update")] + [HttpGet] + public HttpResponseMessage UploadReport(long timestamp) + { + DicServerContext ctx = new DicServerContext(); + + SyncDto sync = new SyncDto(); + DateTime lastSync = DateHandlers.UnixToDateTime(timestamp); + + sync.UsbVendors = new List(); + foreach(UsbVendor vendor in ctx.UsbVendors.Where(v => v.ModifiedWhen > lastSync)) + sync.UsbVendors.Add(new UsbVendorDto {VendorId = (ushort)vendor.VendorId, Vendor = vendor.Vendor}); + + sync.UsbProducts = new List(); + foreach(UsbProduct product in ctx.UsbProducts.Where(p => p.ModifiedWhen > lastSync)) + sync.UsbProducts.Add(new UsbProductDto + { + Id = product.Id, + Product = product.Product, + ProductId = (ushort)product.ProductId, + VendorId = (ushort)product.Vendor.VendorId + }); + + sync.Offsets = new List(); + foreach(CompactDiscOffset offset in ctx.CdOffsets.Where(o => o.ModifiedWhen > lastSync)) + sync.Offsets.Add(new CdOffsetDto(offset, offset.Id)); + + sync.Devices = new List(); + foreach(Device device in ctx.Devices.Where(d => d.ModifiedWhen > lastSync).ToList()) + sync.Devices.Add(new + DeviceDto(JsonConvert.DeserializeObject(JsonConvert.SerializeObject(device, Formatting.None, new JsonSerializerSettings {ReferenceLoopHandling = ReferenceLoopHandling.Ignore})), + device.Id, device.OptimalMultipleSectorsRead)); + + JsonSerializer js = JsonSerializer.Create(); + StringWriter sw = new StringWriter(); + js.Serialize(sw, sync); + + return new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent(sw.ToString(), Encoding.UTF8, "application/json") + }; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/UploadReportController.cs b/DiscImageChef.Server/Controllers/UploadReportController.cs new file mode 100644 index 00000000..7cbe3be7 --- /dev/null +++ b/DiscImageChef.Server/Controllers/UploadReportController.cs @@ -0,0 +1,195 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UploadReportController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Handles report uploads. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Web; +using System.Web.Hosting; +using System.Web.Http; +using System.Xml.Serialization; +using Cinchoo.PGP; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Server.Models; +using MailKit.Net.Smtp; +using MimeKit; +using Newtonsoft.Json; + +namespace DiscImageChef.Server.Controllers +{ + public class UploadReportController : ApiController + { + DicServerContext ctx = new DicServerContext(); + + /// + /// Receives a report from DiscImageChef.Core, verifies it's in the correct format and stores it on the server + /// + /// HTTP response + [Route("api/uploadreport")] + [HttpPost] + public HttpResponseMessage UploadReport() + { + HttpResponseMessage response = new HttpResponseMessage {StatusCode = HttpStatusCode.OK}; + + try + { + DeviceReport newReport = new DeviceReport(); + HttpRequest request = HttpContext.Current.Request; + + XmlSerializer xs = new XmlSerializer(newReport.GetType()); + newReport = (DeviceReport)xs.Deserialize(request.InputStream); + + if(newReport == null) + { + response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); + return response; + } + + DeviceReportV2 reportV2 = new DeviceReportV2(newReport); + StringWriter jsonSw = new StringWriter(); + jsonSw.Write(JsonConvert.SerializeObject(reportV2, Formatting.Indented, + new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + })); + string reportV2String = jsonSw.ToString(); + jsonSw.Close(); + + ctx.Reports.Add(new UploadedReport(reportV2)); + ctx.SaveChanges(); + + MemoryStream pgpIn = new MemoryStream(Encoding.UTF8.GetBytes(reportV2String)); + MemoryStream pgpOut = new MemoryStream(); + ChoPGPEncryptDecrypt pgp = new ChoPGPEncryptDecrypt(); + pgp.Encrypt(pgpIn, pgpOut, + Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "public.asc"), true); + pgpOut.Position = 0; + reportV2String = Encoding.UTF8.GetString(pgpOut.ToArray()); + + MimeMessage message = new MimeMessage + { + Subject = "New device report (old version)", + Body = new TextPart("plain") {Text = reportV2String} + }; + message.From.Add(new MailboxAddress("DiscImageChef", "dic@claunia.com")); + message.To.Add(new MailboxAddress("Natalia Portillo", "claunia@claunia.com")); + + using(SmtpClient client = new SmtpClient()) + { + client.Connect("mail.claunia.com", 25, false); + client.Send(message); + client.Disconnect(true); + } + + response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); + return response; + } + // ReSharper disable once RedundantCatchClause + catch + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); + return response; + } + } + + /// + /// Receives a report from DiscImageChef.Core, verifies it's in the correct format and stores it on the server + /// + /// HTTP response + [Route("api/uploadreportv2")] + [HttpPost] + public HttpResponseMessage UploadReportV2() + { + HttpResponseMessage response = new HttpResponseMessage {StatusCode = HttpStatusCode.OK}; + + try + { + HttpRequest request = HttpContext.Current.Request; + + StreamReader sr = new StreamReader(request.InputStream); + string reportJson = sr.ReadToEnd(); + DeviceReportV2 newReport = JsonConvert.DeserializeObject(reportJson); + + if(newReport == null) + { + response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); + return response; + } + + ctx.Reports.Add(new UploadedReport(newReport)); + ctx.SaveChanges(); + + MemoryStream pgpIn = new MemoryStream(Encoding.UTF8.GetBytes(reportJson)); + MemoryStream pgpOut = new MemoryStream(); + ChoPGPEncryptDecrypt pgp = new ChoPGPEncryptDecrypt(); + pgp.Encrypt(pgpIn, pgpOut, + Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), + "public.asc"), true); + pgpOut.Position = 0; + reportJson = Encoding.UTF8.GetString(pgpOut.ToArray()); + + MimeMessage message = new MimeMessage + { + Subject = "New device report", Body = new TextPart("plain") {Text = reportJson} + }; + message.From.Add(new MailboxAddress("DiscImageChef", "dic@claunia.com")); + message.To.Add(new MailboxAddress("Natalia Portillo", "claunia@claunia.com")); + + using(SmtpClient client = new SmtpClient()) + { + client.Connect("mail.claunia.com", 25, false); + client.Send(message); + client.Disconnect(true); + } + + response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); + return response; + } + // ReSharper disable once RedundantCatchClause + catch + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); + return response; + } + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/UploadStatsController.cs b/DiscImageChef.Server/Controllers/UploadStatsController.cs new file mode 100644 index 00000000..cfadf535 --- /dev/null +++ b/DiscImageChef.Server/Controllers/UploadStatsController.cs @@ -0,0 +1,254 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UploadStatsController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Handles statistics uploads. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Web; +using System.Web.Http; +using System.Xml.Serialization; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Server.Models; +using Newtonsoft.Json; +using OperatingSystem = DiscImageChef.Server.Models.OperatingSystem; +using Version = DiscImageChef.Server.Models.Version; + +namespace DiscImageChef.Server.Controllers +{ + public class UploadStatsController : ApiController + { + /// + /// Receives statistics from DiscImageChef.Core, processes them and adds them to a server-side global statistics XML + /// + /// HTTP response + [Route("api/uploadstats")] + [HttpPost] + public HttpResponseMessage UploadStats() + { + HttpResponseMessage response = new HttpResponseMessage {StatusCode = HttpStatusCode.OK}; + + try + { + Stats newStats = new Stats(); + HttpRequest request = HttpContext.Current.Request; + + XmlSerializer xs = new XmlSerializer(newStats.GetType()); + newStats = (Stats)xs.Deserialize(request.InputStream); + + if(newStats == null) + { + response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); + return response; + } + + StatsConverter.Convert(newStats); + + response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); + return response; + } + catch(Exception ex) + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); + return response; + } + } + + /// + /// Receives a report from DiscImageChef.Core, verifies it's in the correct format and stores it on the server + /// + /// HTTP response + [Route("api/uploadstatsv2")] + [HttpPost] + public HttpResponseMessage UploadStatsV2() + { + HttpResponseMessage response = new HttpResponseMessage {StatusCode = HttpStatusCode.OK}; + + try + { + HttpRequest request = HttpContext.Current.Request; + + StreamReader sr = new StreamReader(request.InputStream); + StatsDto newstats = JsonConvert.DeserializeObject(sr.ReadToEnd()); + + if(newstats == null) + { + response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); + return response; + } + + DicServerContext ctx = new DicServerContext(); + + if(newstats.Commands != null) + foreach(NameValueStats nvs in newstats.Commands) + { + Command existing = ctx.Commands.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Commands.Add(new Command {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.Versions != null) + foreach(NameValueStats nvs in newstats.Versions) + { + Version existing = ctx.Versions.FirstOrDefault(c => c.Value == nvs.name); + + if(existing == null) ctx.Versions.Add(new Version {Value = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.Filesystems != null) + foreach(NameValueStats nvs in newstats.Filesystems) + { + Filesystem existing = ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Filesystems.Add(new Filesystem {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.Partitions != null) + foreach(NameValueStats nvs in newstats.Partitions) + { + Partition existing = ctx.Partitions.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Partitions.Add(new Partition {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.MediaFormats != null) + foreach(NameValueStats nvs in newstats.MediaFormats) + { + MediaFormat existing = ctx.MediaFormats.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.MediaFormats.Add(new MediaFormat {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.Filters != null) + foreach(NameValueStats nvs in newstats.Filters) + { + Filter existing = ctx.Filters.FirstOrDefault(c => c.Name == nvs.name); + + if(existing == null) ctx.Filters.Add(new Filter {Name = nvs.name, Count = nvs.Value}); + else existing.Count += nvs.Value; + } + + if(newstats.OperatingSystems != null) + foreach(OsStats operatingSystem in newstats.OperatingSystems) + { + OperatingSystem existing = + ctx.OperatingSystems.FirstOrDefault(c => c.Name == operatingSystem.name && + c.Version == operatingSystem.version); + + if(existing == null) + ctx.OperatingSystems.Add(new OperatingSystem + { + Name = operatingSystem.name, + Version = operatingSystem.version, + Count = operatingSystem.Value + }); + else existing.Count += operatingSystem.Value; + } + + if(newstats.Medias != null) + foreach(MediaStats media in newstats.Medias) + { + Media existing = ctx.Medias.FirstOrDefault(c => c.Type == media.type && c.Real == media.real); + + if(existing == null) + ctx.Medias.Add(new Media {Type = media.type, Real = media.real, Count = media.Value}); + else existing.Count += media.Value; + } + + if(newstats.Devices != null) + foreach(DeviceStats device in newstats.Devices) + { + DeviceStat existing = + ctx.DeviceStats.FirstOrDefault(c => c.Bus == device.Bus && + c.Manufacturer == device.Manufacturer && + c.Model == device.Model && + c.Revision == device.Revision); + + if(existing == null) + ctx.DeviceStats.Add(new DeviceStat + { + Bus = device.Bus, + Manufacturer = device.Manufacturer, + Model = device.Model, + Revision = device.Revision + }); + } + + ctx.SaveChanges(); + + response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); + return response; + } + // ReSharper disable once RedundantCatchClause + catch + { + #if DEBUG + if(Debugger.IsAttached) throw; + #endif + response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); + return response; + } + } + + FileStream WaitForFile(string fullPath, FileMode mode, FileAccess access, FileShare share) + { + for(int numTries = 0; numTries < 100; numTries++) + { + FileStream fs = null; + try + { + fs = new FileStream(fullPath, mode, access, share); + return fs; + } + catch(IOException) + { + if(fs != null) fs.Dispose(); + Thread.Sleep(50); + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/DiscImageChef.Server.csproj b/DiscImageChef.Server/DiscImageChef.Server.csproj new file mode 100644 index 00000000..1d015547 --- /dev/null +++ b/DiscImageChef.Server/DiscImageChef.Server.csproj @@ -0,0 +1,480 @@ + + + + + + + Debug + AnyCPU + + + 2.0 + {911ADDF5-E5FA-445D-88CD-C7F8FFDBE645} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + DiscImageChef.Server + DiscImageChef.Server + v4.6.1 + false + true + + + + + + + + + false + 4.5.99.1693 + $(Version) + true + 4.5.99.1693 + Claunia.com + Copyright © 2011-2019 Natalia Portillo + The Disc Image Chef + DiscImageChef.Server + $(Version) + + + $(Version)-{chash:8} built by {mname} in $(Configuration){!:, modified} + true + true + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + true + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll + True + + + ..\packages\ChoPGP.1.0.1.2\lib\ChoPGP.dll + True + + + ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll + True + + + ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll + True + + + ..\packages\Google.Protobuf.3.7.0\lib\net45\Google.Protobuf.dll + True + + + ..\packages\Highsoft.Highcharts.7.0.3.11\lib\net40\Highcharts.Web.Mvc.dll + True + + + ..\packages\MailKit.2.1.4\lib\net45\MailKit.dll + True + + + ..\packages\Markdig.0.16.0\lib\net40\Markdig.dll + True + + + ..\packages\Microsoft.AspNet.TelemetryCorrelation.1.0.5\lib\net45\Microsoft.AspNet.TelemetryCorrelation.dll + True + + + ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll + + + + ..\packages\MimeKit.2.1.4\lib\net45\MimeKit.dll + True + + + + ..\packages\MySql.Data.8.0.15\lib\net452\MySql.Data.dll + True + + + ..\packages\MySql.Data.EntityFramework.8.0.15\lib\net452\MySql.Data.EntityFramework.dll + True + + + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + True + + + + + + + ..\packages\System.Diagnostics.DiagnosticSource.4.5.1\lib\net46\System.Diagnostics.DiagnosticSource.dll + True + + + + + + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.7\lib\net45\System.Net.Http.Formatting.dll + True + + + + + + + + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.7\lib\net45\System.Web.Http.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.7\lib\net45\System.Web.Http.WebHost.dll + True + + + ..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll + True + + + ..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll + True + + + ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll + True + + + + + + + + + + True + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + + + + + + + ..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll + + + True + ..\packages\WebGrease.1.6.0\lib\WebGrease.dll + + + True + ..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll + + + + + + + + + + + + + + + + + + + + + + Global.asax + + + + 201812201613369_InitialMigration.cs + + + + 201812220029427_AddStatistics.cs + + + + 201812221606592_LinkDeviceStatsToReport.cs + + + + 201812231612080_FixUnsignedFields.cs + + + + 201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs + + + + 201812240552109_StoreUsbIdsInDatabase.cs + + + + 201812241719441_FixUsbIdsAndIndexes.cs + + + + 201812250223002_AddCdOffsets.cs + + + + 201812251556377_StoreMmcGetConfigurationResponse.cs + + + + 201812252219066_StoreReadResultsInReportDatabase.cs + + + + 201901022133012_AddMultisessionLeadTest.cs + + + + 201901030344456_AddOptimalReadMultipleCount.cs + + + + 201901081359499_AddChangeableScsiModes.cs + + + + 201905252122267_IdForDensityCode.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dicserver.scss + + + dicserver.css + + + + dicserver_highcharts.scss + + + dicserver_highcharts.css + + + + + + + + + + + + + + + + + + Web.config + + + Web.config + + + + + + + + + + + + + + {f2b84194-26eb-4227-b1c5-6602517e85ae} + DiscImageChef.CommonTypes + + + {0beb3088-b634-4289-ae17-cdf2d25d00d5} + DiscImageChef.Decoders + + + {f4399ff5-9bd0-475a-9ea7-3dae45291fe2} + DiscImageChef.Dto + + + {f8bdf57b-1571-4cd0-84b3-b422088d359a} + DiscImageChef.Helpers + + + + + LICENSE.LGPL + + + 201812201613369_InitialMigration.cs + + + 201812220029427_AddStatistics.cs + + + 201812221606592_LinkDeviceStatsToReport.cs + + + 201812231612080_FixUnsignedFields.cs + + + 201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs + + + 201812240552109_StoreUsbIdsInDatabase.cs + + + 201812241719441_FixUsbIdsAndIndexes.cs + + + 201812250223002_AddCdOffsets.cs + + + 201812251556377_StoreMmcGetConfigurationResponse.cs + + + 201812252219066_StoreReadResultsInReportDatabase.cs + + + 201901022133012_AddMultisessionLeadTest.cs + + + 201901030344456_AddOptimalReadMultipleCount.cs + + + 201901081359499_AddChangeableScsiModes.cs + + + 201905252122267_IdForDensityCode.cs + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + + + + True + True + 22810 + / + http://localhost:22810/ + False + False + + + False + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server/Global.asax b/DiscImageChef.Server/Global.asax new file mode 100644 index 00000000..189743a3 --- /dev/null +++ b/DiscImageChef.Server/Global.asax @@ -0,0 +1 @@ +<%@ Application Inherits="DiscImageChef.Server.Global" %> \ No newline at end of file diff --git a/DiscImageChef.Server/Global.asax.cs b/DiscImageChef.Server/Global.asax.cs new file mode 100644 index 00000000..a13a6894 --- /dev/null +++ b/DiscImageChef.Server/Global.asax.cs @@ -0,0 +1,47 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Global.asax.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// ASP.NET global definitions. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Web; +using System.Web.Http; +using System.Web.Routing; + +namespace DiscImageChef.Server +{ + public class Global : HttpApplication + { + protected void Application_Start() + { + GlobalConfiguration.Configure(WebApiConfig.Register); + RouteConfig.RegisterRoutes(RouteTable.Routes); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.Designer.cs b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.Designer.cs new file mode 100644 index 00000000..129eb91c --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class InitialMigration : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(InitialMigration)); + + string IMigrationMetadata.Id + { + get { return "201812201613369_InitialMigration"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.cs b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.cs new file mode 100644 index 00000000..ddf62c28 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.cs @@ -0,0 +1,584 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class InitialMigration : DbMigration + { + public override void Up() + { + CreateTable("dbo.Devices", + c => new + { + Id = c.Int(false, true), + AddedWhen = c.DateTime(false, 0), + CompactFlash = c.Boolean(false), + Manufacturer = c.String(unicode: false), + Model = c.String(unicode: false), + Revision = c.String(unicode: false), + Type = c.Int(false), + ATA_Id = c.Int(), + ATAPI_Id = c.Int(), + FireWire_Id = c.Int(), + MultiMediaCard_Id = c.Int(), + PCMCIA_Id = c.Int(), + SCSI_Id = c.Int(), + SecureDigital_Id = c.Int(), + USB_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Atas", t => t.ATA_Id) + .ForeignKey("dbo.Atas", t => t.ATAPI_Id).ForeignKey("dbo.FireWires", t => t.FireWire_Id) + .ForeignKey("dbo.MmcSds", t => t.MultiMediaCard_Id) + .ForeignKey("dbo.Pcmcias", t => t.PCMCIA_Id).ForeignKey("dbo.Scsis", t => t.SCSI_Id) + .ForeignKey("dbo.MmcSds", t => t.SecureDigital_Id).ForeignKey("dbo.Usbs", t => t.USB_Id) + .Index(t => t.ATA_Id).Index(t => t.ATAPI_Id).Index(t => t.FireWire_Id) + .Index(t => t.MultiMediaCard_Id).Index(t => t.PCMCIA_Id).Index(t => t.SCSI_Id) + .Index(t => t.SecureDigital_Id).Index(t => t.USB_Id); + + CreateTable("dbo.Atas", + c => new {Id = c.Int(false, true), Identify = c.Binary(), ReadCapabilities_Id = c.Int()}) + .PrimaryKey(t => t.Id).ForeignKey("dbo.TestedMedias", t => t.ReadCapabilities_Id) + .Index(t => t.ReadCapabilities_Id); + + CreateTable("dbo.TestedMedias", + c => new + { + Id = c.Int(false, true), + IdentifyData = c.Binary(), + CanReadAACS = c.Boolean(), + CanReadADIP = c.Boolean(), + CanReadATIP = c.Boolean(), + CanReadBCA = c.Boolean(), + CanReadC2Pointers = c.Boolean(), + CanReadCMI = c.Boolean(), + CanReadCorrectedSubchannel = c.Boolean(), + CanReadCorrectedSubchannelWithC2 = c.Boolean(), + CanReadDCB = c.Boolean(), + CanReadDDS = c.Boolean(), + CanReadDMI = c.Boolean(), + CanReadDiscInformation = c.Boolean(), + CanReadFullTOC = c.Boolean(), + CanReadHDCMI = c.Boolean(), + CanReadLayerCapacity = c.Boolean(), + CanReadFirstTrackPreGap = c.Boolean(), + CanReadLeadIn = c.Boolean(), + CanReadLeadOut = c.Boolean(), + CanReadMediaID = c.Boolean(), + CanReadMediaSerial = c.Boolean(), + CanReadPAC = c.Boolean(), + CanReadPFI = c.Boolean(), + CanReadPMA = c.Boolean(), + CanReadPQSubchannel = c.Boolean(), + CanReadPQSubchannelWithC2 = c.Boolean(), + CanReadPRI = c.Boolean(), + CanReadRWSubchannel = c.Boolean(), + CanReadRWSubchannelWithC2 = c.Boolean(), + CanReadRecordablePFI = c.Boolean(), + CanReadSpareAreaInformation = c.Boolean(), + CanReadTOC = c.Boolean(), + Density = c.Byte(), + Manufacturer = c.String(unicode: false), + MediaIsRecognized = c.Boolean(false), + MediumType = c.Byte(), + MediumTypeName = c.String(unicode: false), + Model = c.String(unicode: false), + SupportsHLDTSTReadRawDVD = c.Boolean(), + SupportsNECReadCDDA = c.Boolean(), + SupportsPioneerReadCDDA = c.Boolean(), + SupportsPioneerReadCDDAMSF = c.Boolean(), + SupportsPlextorReadCDDA = c.Boolean(), + SupportsPlextorReadRawDVD = c.Boolean(), + SupportsRead10 = c.Boolean(), + SupportsRead12 = c.Boolean(), + SupportsRead16 = c.Boolean(), + SupportsRead6 = c.Boolean(), + SupportsReadCapacity16 = c.Boolean(), + SupportsReadCapacity = c.Boolean(), + SupportsReadCd = c.Boolean(), + SupportsReadCdMsf = c.Boolean(), + SupportsReadCdRaw = c.Boolean(), + SupportsReadCdMsfRaw = c.Boolean(), + SupportsReadLong16 = c.Boolean(), + SupportsReadLong = c.Boolean(), + ModeSense6Data = c.Binary(), + ModeSense10Data = c.Binary(), + SolidStateDevice = c.Boolean(), + SupportsReadDmaLba = c.Boolean(), + SupportsReadDmaRetryLba = c.Boolean(), + SupportsReadLba = c.Boolean(), + SupportsReadRetryLba = c.Boolean(), + SupportsReadLongLba = c.Boolean(), + SupportsReadLongRetryLba = c.Boolean(), + SupportsSeekLba = c.Boolean(), + SupportsReadDmaLba48 = c.Boolean(), + SupportsReadLba48 = c.Boolean(), + SupportsReadDma = c.Boolean(), + SupportsReadDmaRetry = c.Boolean(), + SupportsReadRetry = c.Boolean(), + SupportsReadSectors = c.Boolean(), + SupportsReadLongRetry = c.Boolean(), + SupportsSeek = c.Boolean(), + CHS_Id = c.Int(), + CurrentCHS_Id = c.Int(), + Ata_Id = c.Int(), + Mmc_Id = c.Int(), + Scsi_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Chs", t => t.CHS_Id) + .ForeignKey("dbo.Chs", t => t.CurrentCHS_Id).ForeignKey("dbo.Atas", t => t.Ata_Id) + .ForeignKey("dbo.Mmcs", t => t.Mmc_Id).ForeignKey("dbo.Scsis", t => t.Scsi_Id) + .Index(t => t.CHS_Id).Index(t => t.CurrentCHS_Id).Index(t => t.Ata_Id) + .Index(t => t.Mmc_Id).Index(t => t.Scsi_Id); + + CreateTable("dbo.Chs", c => new {Id = c.Int(false, true)}).PrimaryKey(t => t.Id); + + CreateTable("dbo.FireWires", + c => new + { + Id = c.Int(false, true), + Manufacturer = c.String(unicode: false), + Product = c.String(unicode: false), + RemovableMedia = c.Boolean(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.MmcSds", + c => new + { + Id = c.Int(false, true), + CID = c.Binary(), + CSD = c.Binary(), + OCR = c.Binary(), + SCR = c.Binary(), + ExtendedCSD = c.Binary() + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Pcmcias", + c => new + { + Id = c.Int(false, true), + CIS = c.Binary(), + Compliance = c.String(unicode: false), + Manufacturer = c.String(unicode: false), + ProductName = c.String(unicode: false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Scsis", + c => new + { + Id = c.Int(false, true), + InquiryData = c.Binary(), + SupportsModeSense6 = c.Boolean(false), + SupportsModeSense10 = c.Boolean(false), + SupportsModeSubpages = c.Boolean(false), + ModeSense6Data = c.Binary(), + ModeSense10Data = c.Binary(), + ModeSense_Id = c.Int(), + MultiMediaDevice_Id = c.Int(), + ReadCapabilities_Id = c.Int(), + SequentialDevice_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.ScsiModes", t => t.ModeSense_Id) + .ForeignKey("dbo.Mmcs", t => t.MultiMediaDevice_Id) + .ForeignKey("dbo.TestedMedias", t => t.ReadCapabilities_Id) + .ForeignKey("dbo.Sscs", t => t.SequentialDevice_Id).Index(t => t.ModeSense_Id) + .Index(t => t.MultiMediaDevice_Id).Index(t => t.ReadCapabilities_Id) + .Index(t => t.SequentialDevice_Id); + + CreateTable("dbo.ScsiPages", + c => new + { + Id = c.Int(false, true), + page = c.Byte(false), + subpage = c.Byte(), + value = c.Binary(), + Scsi_Id = c.Int(), + ScsiMode_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Scsis", t => t.Scsi_Id) + .ForeignKey("dbo.ScsiModes", t => t.ScsiMode_Id).Index(t => t.Scsi_Id) + .Index(t => t.ScsiMode_Id); + + CreateTable("dbo.ScsiModes", + c => new + { + Id = c.Int(false, true), + MediumType = c.Byte(), + WriteProtected = c.Boolean(false), + Speed = c.Byte(), + BufferedMode = c.Byte(), + BlankCheckEnabled = c.Boolean(false), + DPOandFUA = c.Boolean(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.BlockDescriptors", + c => new {Id = c.Int(false, true), Density = c.Byte(false), ScsiMode_Id = c.Int()}) + .PrimaryKey(t => t.Id).ForeignKey("dbo.ScsiModes", t => t.ScsiMode_Id).Index(t => t.ScsiMode_Id); + + CreateTable("dbo.Mmcs", c => new {Id = c.Int(false, true), Features_Id = c.Int(), ModeSense2A_Id = c.Int()}) + .PrimaryKey(t => t.Id).ForeignKey("dbo.MmcFeatures", t => t.Features_Id) + .ForeignKey("dbo.ModePage_2A", t => t.ModeSense2A_Id).Index(t => t.Features_Id) + .Index(t => t.ModeSense2A_Id); + + CreateTable("dbo.MmcFeatures", + c => new + { + Id = c.Int(false, true), + AACSVersion = c.Byte(), + AGIDs = c.Byte(), + BindingNonceBlocks = c.Byte(), + BufferUnderrunFreeInDVD = c.Boolean(false), + BufferUnderrunFreeInSAO = c.Boolean(false), + BufferUnderrunFreeInTAO = c.Boolean(false), + CanAudioScan = c.Boolean(false), + CanEject = c.Boolean(false), + CanEraseSector = c.Boolean(false), + CanExpandBDRESpareArea = c.Boolean(false), + CanFormat = c.Boolean(false), + CanFormatBDREWithoutSpare = c.Boolean(false), + CanFormatCert = c.Boolean(false), + CanFormatFRF = c.Boolean(false), + CanFormatQCert = c.Boolean(false), + CanFormatRRM = c.Boolean(false), + CanGenerateBindingNonce = c.Boolean(false), + CanLoad = c.Boolean(false), + CanMuteSeparateChannels = c.Boolean(false), + CanOverwriteSAOTrack = c.Boolean(false), + CanOverwriteTAOTrack = c.Boolean(false), + CanPlayCDAudio = c.Boolean(false), + CanPseudoOverwriteBDR = c.Boolean(false), + CanReadAllDualR = c.Boolean(false), + CanReadAllDualRW = c.Boolean(false), + CanReadBD = c.Boolean(false), + CanReadBDR = c.Boolean(false), + CanReadBDRE1 = c.Boolean(false), + CanReadBDRE2 = c.Boolean(false), + CanReadBDROM = c.Boolean(false), + CanReadBluBCA = c.Boolean(false), + CanReadCD = c.Boolean(false), + CanReadCDMRW = c.Boolean(false), + CanReadCPRM_MKB = c.Boolean(false), + CanReadDDCD = c.Boolean(false), + CanReadDVD = c.Boolean(false), + CanReadDVDPlusMRW = c.Boolean(false), + CanReadDVDPlusR = c.Boolean(false), + CanReadDVDPlusRDL = c.Boolean(false), + CanReadDVDPlusRW = c.Boolean(false), + CanReadDVDPlusRWDL = c.Boolean(false), + CanReadDriveAACSCertificate = c.Boolean(false), + CanReadHDDVD = c.Boolean(false), + CanReadHDDVDR = c.Boolean(false), + CanReadHDDVDRAM = c.Boolean(false), + CanReadLeadInCDText = c.Boolean(false), + CanReadOldBDR = c.Boolean(false), + CanReadOldBDRE = c.Boolean(false), + CanReadOldBDROM = c.Boolean(false), + CanReadSpareAreaInformation = c.Boolean(false), + CanReportDriveSerial = c.Boolean(false), + CanReportMediaSerial = c.Boolean(false), + CanTestWriteDDCDR = c.Boolean(false), + CanTestWriteDVD = c.Boolean(false), + CanTestWriteInSAO = c.Boolean(false), + CanTestWriteInTAO = c.Boolean(false), + CanUpgradeFirmware = c.Boolean(false), + CanWriteBD = c.Boolean(false), + CanWriteBDR = c.Boolean(false), + CanWriteBDRE1 = c.Boolean(false), + CanWriteBDRE2 = c.Boolean(false), + CanWriteBusEncryptedBlocks = c.Boolean(false), + CanWriteCDMRW = c.Boolean(false), + CanWriteCDRW = c.Boolean(false), + CanWriteCDRWCAV = c.Boolean(false), + CanWriteCDSAO = c.Boolean(false), + CanWriteCDTAO = c.Boolean(false), + CanWriteCSSManagedDVD = c.Boolean(false), + CanWriteDDCDR = c.Boolean(false), + CanWriteDDCDRW = c.Boolean(false), + CanWriteDVDPlusMRW = c.Boolean(false), + CanWriteDVDPlusR = c.Boolean(false), + CanWriteDVDPlusRDL = c.Boolean(false), + CanWriteDVDPlusRW = c.Boolean(false), + CanWriteDVDPlusRWDL = c.Boolean(false), + CanWriteDVDR = c.Boolean(false), + CanWriteDVDRDL = c.Boolean(false), + CanWriteDVDRW = c.Boolean(false), + CanWriteHDDVDR = c.Boolean(false), + CanWriteHDDVDRAM = c.Boolean(false), + CanWriteOldBDR = c.Boolean(false), + CanWriteOldBDRE = c.Boolean(false), + CanWritePackedSubchannelInTAO = c.Boolean(false), + CanWriteRWSubchannelInSAO = c.Boolean(false), + CanWriteRWSubchannelInTAO = c.Boolean(false), + CanWriteRaw = c.Boolean(false), + CanWriteRawMultiSession = c.Boolean(false), + CanWriteRawSubchannelInTAO = c.Boolean(false), + ChangerIsSideChangeCapable = c.Boolean(false), + ChangerSlots = c.Byte(false), + ChangerSupportsDiscPresent = c.Boolean(false), + CPRMVersion = c.Byte(), + CSSVersion = c.Byte(), + DBML = c.Boolean(false), + DVDMultiRead = c.Boolean(false), + EmbeddedChanger = c.Boolean(false), + ErrorRecoveryPage = c.Boolean(false), + FirmwareDate = c.DateTime(precision: 0), + LoadingMechanismType = c.Byte(), + Locked = c.Boolean(false), + MultiRead = c.Boolean(false), + PreventJumper = c.Boolean(false), + SupportsAACS = c.Boolean(false), + SupportsBusEncryption = c.Boolean(false), + SupportsC2 = c.Boolean(false), + SupportsCPRM = c.Boolean(false), + SupportsCSS = c.Boolean(false), + SupportsDAP = c.Boolean(false), + SupportsDeviceBusyEvent = c.Boolean(false), + SupportsHybridDiscs = c.Boolean(false), + SupportsModePage1Ch = c.Boolean(false), + SupportsOSSC = c.Boolean(false), + SupportsPWP = c.Boolean(false), + SupportsSWPP = c.Boolean(false), + SupportsSecurDisc = c.Boolean(false), + SupportsSeparateVolume = c.Boolean(false), + SupportsVCPS = c.Boolean(false), + SupportsWriteInhibitDCB = c.Boolean(false), + SupportsWriteProtectPAC = c.Boolean(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.ModePage_2A", + c => new + { + Id = c.Int(false, true), + PS = c.Boolean(false), + MultiSession = c.Boolean(false), + Mode2Form2 = c.Boolean(false), + Mode2Form1 = c.Boolean(false), + AudioPlay = c.Boolean(false), + ISRC = c.Boolean(false), + UPC = c.Boolean(false), + C2Pointer = c.Boolean(false), + DeinterlaveSubchannel = c.Boolean(false), + Subchannel = c.Boolean(false), + AccurateCDDA = c.Boolean(false), + CDDACommand = c.Boolean(false), + LoadingMechanism = c.Byte(false), + Eject = c.Boolean(false), + PreventJumper = c.Boolean(false), + LockState = c.Boolean(false), + Lock = c.Boolean(false), + SeparateChannelMute = c.Boolean(false), + SeparateChannelVolume = c.Boolean(false), + Method2 = c.Boolean(false), + ReadCDRW = c.Boolean(false), + ReadCDR = c.Boolean(false), + WriteCDRW = c.Boolean(false), + WriteCDR = c.Boolean(false), + DigitalPort2 = c.Boolean(false), + DigitalPort1 = c.Boolean(false), + Composite = c.Boolean(false), + SSS = c.Boolean(false), + SDP = c.Boolean(false), + Length = c.Byte(false), + LSBF = c.Boolean(false), + RCK = c.Boolean(false), + BCK = c.Boolean(false), + TestWrite = c.Boolean(false), + ReadBarcode = c.Boolean(false), + ReadDVDRAM = c.Boolean(false), + ReadDVDR = c.Boolean(false), + ReadDVDROM = c.Boolean(false), + WriteDVDRAM = c.Boolean(false), + WriteDVDR = c.Boolean(false), + LeadInPW = c.Boolean(false), + SCC = c.Boolean(false), + BUF = c.Boolean(false), + RotationControlSelected = c.Byte(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Sscs", c => new {Id = c.Int(false, true), BlockSizeGranularity = c.Byte()}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.SupportedDensities", + c => new + { + Id = c.Int(false, true), + PrimaryCode = c.Byte(false), + SecondaryCode = c.Byte(false), + Writable = c.Boolean(false), + Duplicate = c.Boolean(false), + DefaultDensity = c.Boolean(false), + Organization = c.String(unicode: false), + Name = c.String(unicode: false), + Description = c.String(unicode: false), + Ssc_Id = c.Int(), + TestedSequentialMedia_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Sscs", t => t.Ssc_Id) + .ForeignKey("dbo.TestedSequentialMedias", t => t.TestedSequentialMedia_Id) + .Index(t => t.Ssc_Id).Index(t => t.TestedSequentialMedia_Id); + + CreateTable("dbo.SscSupportedMedias", + c => new + { + Id = c.Int(false, true), + MediumType = c.Byte(false), + Organization = c.String(unicode: false), + Name = c.String(unicode: false), + Description = c.String(unicode: false), + Ssc_Id = c.Int(), + TestedSequentialMedia_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Sscs", t => t.Ssc_Id) + .ForeignKey("dbo.TestedSequentialMedias", t => t.TestedSequentialMedia_Id) + .Index(t => t.Ssc_Id).Index(t => t.TestedSequentialMedia_Id); + + CreateTable("dbo.DensityCodes", c => new {Code = c.Int(false, true), SscSupportedMedia_Id = c.Int()}) + .PrimaryKey(t => t.Code).ForeignKey("dbo.SscSupportedMedias", t => t.SscSupportedMedia_Id) + .Index(t => t.SscSupportedMedia_Id); + + CreateTable("dbo.TestedSequentialMedias", + c => new + { + Id = c.Int(false, true), + CanReadMediaSerial = c.Boolean(), + Density = c.Byte(), + Manufacturer = c.String(unicode: false), + MediaIsRecognized = c.Boolean(false), + MediumType = c.Byte(), + MediumTypeName = c.String(unicode: false), + Model = c.String(unicode: false), + ModeSense6Data = c.Binary(), + ModeSense10Data = c.Binary(), + Ssc_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Sscs", t => t.Ssc_Id).Index(t => t.Ssc_Id); + + CreateTable("dbo.Usbs", + c => new + { + Id = c.Int(false, true), + Manufacturer = c.String(unicode: false), + Product = c.String(unicode: false), + RemovableMedia = c.Boolean(false), + Descriptors = c.Binary() + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.UploadedReports", + c => new + { + Id = c.Int(false, true), + UploadedWhen = c.DateTime(false, 0), + CompactFlash = c.Boolean(false), + Manufacturer = c.String(unicode: false), + Model = c.String(unicode: false), + Revision = c.String(unicode: false), + Type = c.Int(false), + ATA_Id = c.Int(), + ATAPI_Id = c.Int(), + FireWire_Id = c.Int(), + MultiMediaCard_Id = c.Int(), + PCMCIA_Id = c.Int(), + SCSI_Id = c.Int(), + SecureDigital_Id = c.Int(), + USB_Id = c.Int() + }).PrimaryKey(t => t.Id).ForeignKey("dbo.Atas", t => t.ATA_Id) + .ForeignKey("dbo.Atas", t => t.ATAPI_Id).ForeignKey("dbo.FireWires", t => t.FireWire_Id) + .ForeignKey("dbo.MmcSds", t => t.MultiMediaCard_Id) + .ForeignKey("dbo.Pcmcias", t => t.PCMCIA_Id).ForeignKey("dbo.Scsis", t => t.SCSI_Id) + .ForeignKey("dbo.MmcSds", t => t.SecureDigital_Id).ForeignKey("dbo.Usbs", t => t.USB_Id) + .Index(t => t.ATA_Id).Index(t => t.ATAPI_Id).Index(t => t.FireWire_Id) + .Index(t => t.MultiMediaCard_Id).Index(t => t.PCMCIA_Id).Index(t => t.SCSI_Id) + .Index(t => t.SecureDigital_Id).Index(t => t.USB_Id); + } + + public override void Down() + { + DropForeignKey("dbo.UploadedReports", "USB_Id", "dbo.Usbs"); + DropForeignKey("dbo.UploadedReports", "SecureDigital_Id", "dbo.MmcSds"); + DropForeignKey("dbo.UploadedReports", "SCSI_Id", "dbo.Scsis"); + DropForeignKey("dbo.UploadedReports", "PCMCIA_Id", "dbo.Pcmcias"); + DropForeignKey("dbo.UploadedReports", "MultiMediaCard_Id", "dbo.MmcSds"); + DropForeignKey("dbo.UploadedReports", "FireWire_Id", "dbo.FireWires"); + DropForeignKey("dbo.UploadedReports", "ATAPI_Id", "dbo.Atas"); + DropForeignKey("dbo.UploadedReports", "ATA_Id", "dbo.Atas"); + DropForeignKey("dbo.Devices", "USB_Id", "dbo.Usbs"); + DropForeignKey("dbo.Devices", "SecureDigital_Id", "dbo.MmcSds"); + DropForeignKey("dbo.Devices", "SCSI_Id", "dbo.Scsis"); + DropForeignKey("dbo.Scsis", "SequentialDevice_Id", "dbo.Sscs"); + DropForeignKey("dbo.TestedSequentialMedias", "Ssc_Id", "dbo.Sscs"); + DropForeignKey("dbo.SscSupportedMedias", "TestedSequentialMedia_Id", "dbo.TestedSequentialMedias"); + DropForeignKey("dbo.SupportedDensities", "TestedSequentialMedia_Id", "dbo.TestedSequentialMedias"); + DropForeignKey("dbo.SscSupportedMedias", "Ssc_Id", "dbo.Sscs"); + DropForeignKey("dbo.DensityCodes", "SscSupportedMedia_Id", "dbo.SscSupportedMedias"); + DropForeignKey("dbo.SupportedDensities", "Ssc_Id", "dbo.Sscs"); + DropForeignKey("dbo.TestedMedias", "Scsi_Id", "dbo.Scsis"); + DropForeignKey("dbo.Scsis", "ReadCapabilities_Id", "dbo.TestedMedias"); + DropForeignKey("dbo.Scsis", "MultiMediaDevice_Id", "dbo.Mmcs"); + DropForeignKey("dbo.TestedMedias", "Mmc_Id", "dbo.Mmcs"); + DropForeignKey("dbo.Mmcs", "ModeSense2A_Id", "dbo.ModePage_2A"); + DropForeignKey("dbo.Mmcs", "Features_Id", "dbo.MmcFeatures"); + DropForeignKey("dbo.Scsis", "ModeSense_Id", "dbo.ScsiModes"); + DropForeignKey("dbo.ScsiPages", "ScsiMode_Id", "dbo.ScsiModes"); + DropForeignKey("dbo.BlockDescriptors", "ScsiMode_Id", "dbo.ScsiModes"); + DropForeignKey("dbo.ScsiPages", "Scsi_Id", "dbo.Scsis"); + DropForeignKey("dbo.Devices", "PCMCIA_Id", "dbo.Pcmcias"); + DropForeignKey("dbo.Devices", "MultiMediaCard_Id", "dbo.MmcSds"); + DropForeignKey("dbo.Devices", "FireWire_Id", "dbo.FireWires"); + DropForeignKey("dbo.Devices", "ATAPI_Id", "dbo.Atas"); + DropForeignKey("dbo.Devices", "ATA_Id", "dbo.Atas"); + DropForeignKey("dbo.TestedMedias", "Ata_Id", "dbo.Atas"); + DropForeignKey("dbo.Atas", "ReadCapabilities_Id", "dbo.TestedMedias"); + DropForeignKey("dbo.TestedMedias", "CurrentCHS_Id", "dbo.Chs"); + DropForeignKey("dbo.TestedMedias", "CHS_Id", "dbo.Chs"); + DropIndex("dbo.UploadedReports", new[] {"USB_Id"}); + DropIndex("dbo.UploadedReports", new[] {"SecureDigital_Id"}); + DropIndex("dbo.UploadedReports", new[] {"SCSI_Id"}); + DropIndex("dbo.UploadedReports", new[] {"PCMCIA_Id"}); + DropIndex("dbo.UploadedReports", new[] {"MultiMediaCard_Id"}); + DropIndex("dbo.UploadedReports", new[] {"FireWire_Id"}); + DropIndex("dbo.UploadedReports", new[] {"ATAPI_Id"}); + DropIndex("dbo.UploadedReports", new[] {"ATA_Id"}); + DropIndex("dbo.TestedSequentialMedias", new[] {"Ssc_Id"}); + DropIndex("dbo.DensityCodes", new[] {"SscSupportedMedia_Id"}); + DropIndex("dbo.SscSupportedMedias", new[] {"TestedSequentialMedia_Id"}); + DropIndex("dbo.SscSupportedMedias", new[] {"Ssc_Id"}); + DropIndex("dbo.SupportedDensities", new[] {"TestedSequentialMedia_Id"}); + DropIndex("dbo.SupportedDensities", new[] {"Ssc_Id"}); + DropIndex("dbo.Mmcs", new[] {"ModeSense2A_Id"}); + DropIndex("dbo.Mmcs", new[] {"Features_Id"}); + DropIndex("dbo.BlockDescriptors", new[] {"ScsiMode_Id"}); + DropIndex("dbo.ScsiPages", new[] {"ScsiMode_Id"}); + DropIndex("dbo.ScsiPages", new[] {"Scsi_Id"}); + DropIndex("dbo.Scsis", new[] {"SequentialDevice_Id"}); + DropIndex("dbo.Scsis", new[] {"ReadCapabilities_Id"}); + DropIndex("dbo.Scsis", new[] {"MultiMediaDevice_Id"}); + DropIndex("dbo.Scsis", new[] {"ModeSense_Id"}); + DropIndex("dbo.TestedMedias", new[] {"Scsi_Id"}); + DropIndex("dbo.TestedMedias", new[] {"Mmc_Id"}); + DropIndex("dbo.TestedMedias", new[] {"Ata_Id"}); + DropIndex("dbo.TestedMedias", new[] {"CurrentCHS_Id"}); + DropIndex("dbo.TestedMedias", new[] {"CHS_Id"}); + DropIndex("dbo.Atas", new[] {"ReadCapabilities_Id"}); + DropIndex("dbo.Devices", new[] {"USB_Id"}); + DropIndex("dbo.Devices", new[] {"SecureDigital_Id"}); + DropIndex("dbo.Devices", new[] {"SCSI_Id"}); + DropIndex("dbo.Devices", new[] {"PCMCIA_Id"}); + DropIndex("dbo.Devices", new[] {"MultiMediaCard_Id"}); + DropIndex("dbo.Devices", new[] {"FireWire_Id"}); + DropIndex("dbo.Devices", new[] {"ATAPI_Id"}); + DropIndex("dbo.Devices", new[] {"ATA_Id"}); + DropTable("dbo.UploadedReports"); + DropTable("dbo.Usbs"); + DropTable("dbo.TestedSequentialMedias"); + DropTable("dbo.DensityCodes"); + DropTable("dbo.SscSupportedMedias"); + DropTable("dbo.SupportedDensities"); + DropTable("dbo.Sscs"); + DropTable("dbo.ModePage_2A"); + DropTable("dbo.MmcFeatures"); + DropTable("dbo.Mmcs"); + DropTable("dbo.BlockDescriptors"); + DropTable("dbo.ScsiModes"); + DropTable("dbo.ScsiPages"); + DropTable("dbo.Scsis"); + DropTable("dbo.Pcmcias"); + DropTable("dbo.MmcSds"); + DropTable("dbo.FireWires"); + DropTable("dbo.Chs"); + DropTable("dbo.TestedMedias"); + DropTable("dbo.Atas"); + DropTable("dbo.Devices"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.resx b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.resx new file mode 100644 index 00000000..d6aece3f --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812201613369_InitialMigration.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO193XLcOLLm/UbsOyh0OTtHstwzHdMd9jlRIqW2plUWuyhZe6egWJDEMYusJllqqzf2yfZiH2lfYQHwD78k/lhV8igcdrgI4EMikUgkEgng//2f//vhv76t0oNnUJRJnn08PDl6d3gAsjhfJtnjx8NN9fAf/zj8r//87//tw9ly9e3gS5vvB5QPlszKj4dPVbX++fi4jJ/AKiqPVklc5GX+UB3F+eo4WubH79+9++n45OQYQIhDiHVw8GGxyapkBfAP+NPLsxisq02UzvMlSMvmO0wJMerB52gFynUUg4+HflLGF6voEXhP4OEoBAUk/qgudngwS5MIkhSC9OHwIMqyvIoqSPDPNyUIqyLPHsM1/BCl1y9rAPM9RGkJmob83GdXbdO796hNx33BFirelFW+0gQ8+aFh0jFb3IjVhx0TIRvPILurF9RqzErIRfCcxLDpbFU/e2mBsg3y+agu/dcDUZ6/dlLy7gj/+euBt0mrTQE+ZmBTFVH614Ngc58m8a/g5Tr/CrKP2SZNSXIhwTCN+gA/BUW+BkX1sgAPTSMulocHx3S5Y7ZgV4woUzfwIqt+eH948BlWHt2noJMGghlhlRfgF5CBIqrAMoiqChQZwgCYn1ztTF2z5RIsb59A1lbpQ5hrKPeCWoeRvHwFpb86T6PyqQU7zfMURJk21jzKNg8QDPZI0WLBwQEH/OHBPPp2CbLH6gll+3Z4cJ58A8v2S4N+kyVQP8BCVbEZrwwJzOS1LKA8lnigTFwRgu8qgUqmGQn157F++Bw9J49YsFg5uZ4dHixAitPKp2RNgd/h5PMiXy3ytBu66OtdmG8KNIqvcy7pOioeQaVFQ3AxQgXKIKIjuBigBCbq0nKeFOAW/h0ip8/DUdQmyYjq0nXpmkM9lszBMom8qFgOUcfm5GikM8goZXLp0ht4c+9iULTaHBx9dYKMriZVl57QCwdFrE7naEGfZZTgNG06QAyVn588JlWUDhJEZ+QpI9OlJFKZdGm9CU+HKMTJHF3wq4walCSi4cNxbyMMWg6zKlI3G+C8tcozbG0dzUEVLaMqOoIIrOlA5Ovth78d/f3op5+OTn786Yd/Xxuizvfw0s36SRYVL2pTm6qMLUC09KJ1dJ+kSZWAUihwsNfu+Iy96InSOSEUZtIdEguwyp8Ru7FmHKKWyccSSyVLaKXzWI2ca1BCCcBIliOIQHobSbojCRrhkYPRxFroUYYEezbzQs5AVyvpXwSGJa9NS556M7OC3vsgTzLI/9Kw/PzCsGBeFCCG3R9u7uMnKBz96sIa6Dapnrz3ZnC+d2pY0DeUF9+UhVhfZA95sWqcCyYg53CcXl95ZoU/+cb9fxm9gALNHjEe8UakJ0VZXRdR/DWA6iRaGxIC/14YMg+VvdpUZoWx1r/wLQqHoEgiw2ETzAz7PDg37PFgbqijgt9sdQSJYKMcgoVh2xe3tk0gEWyasABxXizRzGzckeE6KsCsAJG18tFXPD7ISlJhvFR75ibDg7pEXH7Mkj/BkmufrpMPAm5WpLtKqc1dKfT7O3EOhpv1Oi+q8tOlfx1eY2GO/vC/6GrQFubzmYftB9/X1UstQgAFH4DCLco8PDcFSsE3aFnbktOjWLEXAZy8symsq+Gowj9aFLYp25o0VgQY2kUUBK95dArPywer8lB0bOu3g7jMs0erPkAAmsWRGgzhBAV+nGZp2uGfvJumgjBPk2UIV+mg3VY0Zp+/ii7vIzuABaiKFzsUu9IuCIBiZI9gSUgIwFfr3oAAf/uHXVdYlYckOBAnW2mwKB+CGE6suo4WoShYyMFYUam31vsUCj20hA/zDufpvbNMEueZZdN1HcjepihAVilRRmSVENjlGKazz2blRPaeSkvnMUR4cxqLncbKvdDvPlt1RQvz1h+qTvytrsrhz+Umriavh95l0lv6K4vsfBWHS0t5xRhvwqoqrB7hpnW30RROAHrlLSZYFkwBevatAtkSLB2wQXnoBPEqtt6zrUHeBo/64AknGDz5ap0mURZvwbm5g5lqAq+t8iAJ4zKxHCII4m2AKMczZL9vkmKicIZ26df7pmx3JDhEgZfXBnJzv4Yywy+TdTdOXp0zTrrMPfsS+EHNE8EqFw22OyJLv7qlU7hVLZOsHUTbMkBOFZGFoapLEVPVJ5uH9rYuTClxXE6WRiaDhFQ2l34UnELQHq5qKGpPmEFM8Vbi9pqapIF7onQZueOhe0PUhuD3DVLEUTomEXxOhl42g5hgLpeVnwhBogHqYEpGMG/Tsuq0vMZMJ/fcNWegsp7JdPbtn6N0A7a2HEIygTStA9FCMG+ipez8MgrquC2SCsBvFQ53tLa51oAAUaj+dPPwAAqwrCVGo1waZV+hQMRfzzJEnzXlfnAVZcvzGz7Cwfjg1mmax199UMZFsq73aCRzBGr8HZ+bnieEmYRzhTiniSU2bB/ieohsAnq7VDmhfRarGY1pr6X2YdDelJCqEhKG0jlzUds7qN96UtqT8gOXIEIcECsCyNO7PkOvAsjv3OCnEo2XiO/FhxcROJWHJopIEtJFpuuSRp3hkZBG5aFJI3eERaSR6VbKEoL1fWY7pFqkt6GlfPJ/5oUNQ3RsntkvF36pZSQlGbqp4zO6PwPPaHqlsWl2ky1BUWyy8wKAi0wUualpaIlgw9nVFLDX9rBelM02yyQP44gPR9fHOvsXiPmTHQY4RVSCOvTHBdq3NbR9T/3FWReF7wD1HIfxOwNC5KEzCvmmwlQ6A/bgR2dg5ws+0NoU6zenlC0WcwdYrdIjVYsD2Ms8sl7BQZj5poKjAkoHpNCrj7VYu/wh7NUzKP5A62Sop/DRMJeY1+4wgzR68Xysr1yglWCzzDs64fhzAIpPpKapv4lS13C3jvBOrae4DshVE5HuO3GIxR+CMMa6cqFVMFa6ER04NgPzXPWh58+dCZYXLOZ381/5o8BmcL7vrJUOzLoeKUg3pTumNYCuRlIL5186BnTd3lt3FBbJM0BLDmROJA9JHFUupuz6qLY7ycFYrrq5Bpu50k31cW7PvwbfXBhkCPIqdTg/1GBnTtGcKXalk70m0Ci6Awu35Mi6KebQMXh9TOS0wZssSF+76PAe0MnY6+CcLMNpQDcL8Jv1YxEtwXlSrP5ws/C7rQ1ad0gu+rWFcmLpdWAuTL0abFOeZXHxsq7AknEmWSK7srEaMLdY3uyLOzg3A6wBczO4arAwnEdZ9AgcWYJO9V0P5qxjnVqpJKK79rq0UylE5012Y6m2kC456JZ77jjnzNQl0JzYuhjPmWVKoLkwTetIlSj+St7K5crGwODkdTiurCEBsEuKBdcZmEPhqNMQlKUbC72Fdd12iPUIiosyTJag/oEDT1N7y7BGDtO8YnbKDIGaCHS0LxoUoASZ/eoxWMwNtg7hBG9Qyj+dWytQqJuwWKGVoC3W2eoeoEvTG/ZawxUFupImzp9B8RKQQZWGgO0KxSc8LP2l7sNl0Q5Ikj3OARoqSakdx3eZI8Vofb7BVVdBcX+G4v7PzWpt31HtOBJen2mI1S9nHCi7FlRwf5opUmC/Xddhhc645s/4u0RNoXAYO+yGl7NnB4qxu8fr5b5I8C2W1utT8gARUg8nnvXrCi3kVRjyl9QZYgW3zvokvA3cYaGLzVE/uAOsN3a/5OlmZa2rW9QvXuBsdDRer6fkPqlEV77awAZ1iLbohk1H4ZWNlN+hkDnVmDAfoJOhRXmEbtrH77+U/4MAYkPC2uxv8WD0ZGktgS4td9R/71HMiPVk1iFZezRxTAMKb7AFuggX1or3JrCG6G7ItjavAYZJo2cwcBmstuJxhTSL4SSAgnFEV0fq8gxioJjSKLO2Tllj22qx5ySmz6m9jNYC+MI9F0DWwkTHY6EQLceQbgyCOaie8qW1zquDRux9hQ2OLYyzPZEWyFph1S/dBNCwseY1gWW/Z5av1nmZOBBOB6st39oKr09yWum1y/DUOpZ14f1qC3FqD9HtSLsYlKdREZOHFS2g3PjtWyRXOPaBH92OiX3jnG0L1SE8gbUeDD1r4+/0xn5cNSsPL8+qIk9DkNLHdx0euwtL22N3EOHtbJDqWhCHVoTJn+CXIoJtjIqxhwnkV1TU7gOwrM9kSi8BKeM7UVbiNK8wB3+iV5xN+2aNFgKHYWERGaebzCshvM8yTDmRz/XxP1SP5PgfkyQk0dnxP6aXXmzHNwP3NtiVHT9FsoqKF4+7/EB7QRTn2dIFEppvXWyl+pt16iTS2AcPEZQO9ly5IdpV8QgX/H9SMaiTXbuH/p28kvaSAvcN0rEQaO1pby/QeG8KxfYOmLdhMtkwGTIIGq2FtLLUiKFF/Y4uQhkIAzlF9sJQdivzgUCyHOkE0v6M8bpduqOcnHl3dvF8bSH2V8W5e02Wwdyf3tp3jWz9tOLb43T/vo/TfUfXzSp6I4TaZsQ/oVpG8gKLQsGpfBgjBIi9GsqFdNs74vlQnoVuynvLOQcivM0wb4+eIIYZPHoit/7Jh7Kmvgf1Zp3m0RIs6zOl6gMCGgnPoMCxVGl5RKOwg6LO24+Hd0f4z7/vWGjZdfsEunVeH4FtsCUMx9V5GpXWgZ/bNcm2YpwswHNSbsNBQJqCeNqsQ4frz2P9IJ2jZ9fi6wPpEXeHs/WTL5/KzbKCLLr2AywTXChShzIO0RdcKFAIM+nS2D9yNk5mn1dKaZtljNgun/kd/l5ULFWoZktIaaczjrWAya3bjsCbexdKotvmlNJdZxijt8mlbQN7oZII1/mkNKLkMQpxHv0b/GOojJsQIiVC6QJyisl8o6RTmXXbcBOeqlCOs0nphaljVKIsekuCeinemV+9vr4o4Xz6WHbq2mSdgOBLYhaYaK1wgG+TTF/grEbaL3TfzMHqHhRtf2Rfs/wPOCN+QVfufzx8x3UllR3PLU3Wk9GsSNE3md8PZ66HVJP3h5G8tFQ3hf42XGg+97qsfx/O+vnLHHR5f+TFpxYU8uOsLPM4wcLA76vjx2Dp6s6y5cHIy7C96UBtv2NNjPYpoQh/PPwL1xA5cjsYCGT89CqN+O7o6IRtMdE6jUb378wqUSh4dNYtC/jnaifkxKyK+FdqZGSKMou4MKu0Wi+EFbR9gLkOeEA/fDNMq+QRnEEO8CSOAuvx4C/GDGhevUEqU0Zen0XU3Pb1HfU+J/AErVRin1EDoaIfJ4k06900klgDTN/MbkUwQhe/LHDQWG4NQYD2SxX3jWYWFCNUylYVDhggWYIQ0M17wO550CxKRghkVyYO2swsYwjI9gFXh41lns+TkSZ7S6+nrX43U0tLS17gY0Dr+w5caWf5KzZDVI48aUMTXL8QpM2J4cdwiDq4B2Sc86Z/KmeUYMG7Oe64wb+4M7lsEI82Doqt4AXH4bEwNPAljz4acVKjvdSLKDLaxM+jUPpXp6nCB1VouP7BD8dtJd9aGaJP+PCKVYtFT7WQiOSJdseNJm3cIRKFMd2DjR4ZxbJ3YKa2v8Wvmw4PPelTp7ZjWvY6qi5ndduvvAodeTjVsv27XIgKn2AdoXZ0KWpq5exqMSo5MyOldeQADcGIUlcfjJy6IbG5Ux8O2TEUxTpAulJIK8UeNtJcl1kqUbHUcoOIdZ1EfIggH6U+FsX3OBMgQQiQDvvNWaIc9zXsntQJAmN1BBc2q8VG7ViyrYxM9QAzw3YNS+MWGLsziWUP8w2NrxEr0GzQKlmBI7y3tAe5t80HZ2v5Q+eW9pD0bXRdHuu7s/BW24jnid7CduDKova7tc0og0ZSe4RjxIm3v100W7hXvg2nJdpAHyGO2kV30Fhyy53Aw7G1DhsoiHaSETYU+kQQyIQ9qjd8IG5qwv0IYUCVOonibRiXTNjOtowsYEuRzqFtGmfM2Pq2zXA8mCLV49s4zhi0i20dccyZIsHybR5nPNnqto8otE2RTpmR4IwRWzMaBsPmVIkdMyLcsWX7RoUgOk+RWImR4YwZkxgddYgguqkoSrIuLsxP4vr0AkrAz6pxkYA3JWiCAcsmUJxtBgIOQUUZa+XhQR+UyFhhHB9oADipikrjuXakKLEYE0FQXsgRKBw+xSHgryMl20lQVL6fIEdAsLyLEJqBMFK81qqi8q2+HQFA+khUvNZTCoXrLVYxQL2zqQAyr8/fC0HmogPiLAi3Ec5jcTvO4z0j6ReVov3+nwihTx1DIjfVeCQydYzNpbA5eKE+VlRwHpQH4rxq4wTRziIJeaxHaQSWvtFBoJsID7OSlmF8OnJ9wzl/RuChnheBYfU/UrSeQISlmcmJASImDaE2xQG/B0QuXqPyMcECByIfFdw1gdXex+pY7WRJYIkU9THdSl0O9NG/Y4yQxAnL28BHCluzhY8Nds4dYUSwgDfjkcNUMwZjh4lG1HbCAD8Go4UVGWzMFnprVsqVgR1cQVvEW7j6PBHv107HEiJsWMAJWVCxyCFH+rsIejujc6DpgkDiEc5ZtRQdFBlqK+vgktBKuLaM20s4ryZrcW/ZShstdmeJaOYcWWZN51xVBAxhpbtiAXtSUcqIIReWqB0S55UZUyTuKQKsXXu44kt7AlLKD5G7SkQ646gyaz/jiiJAukWTdcOZwGNBy4dCk/mtNT44mSC7WaoNtFwSi8xgNLQ6abw4ClnCB4WQZa45w0HLTMuaZeQIh4ZjlAlIvl3ueNZHJw8xSxLDLG4SH8Vszh4+aHlCISLClWUjSBLQzEs/H9KsP4L4IGYVRho0nopdFjRdHttMES2Mbqb1/HCrhfHMNIDUY2HWajKKWdJwaaAzR7oo1Fm3+aLgZhJjwNNixgHKRynmgDTehaNeFPGiywFRgMt0KwVxgLN0+A9GQgtGsCwW2kAZyKKfR/hryhOVhbZCdDTfEJWltiJPdrDYFgZCy1mjutweDJk2Ycy2V9yy9wQEnFGIoqZbNBxHTXKnHNEvI2HTJJSgLS6YNHjvr5BZyjHWbEtVoqxp5nF+8GFWqgRVU2smsq1uJY68M3FE5GTRr3JBEUS7GgudIHBVqw+Mncoql2vK3My6AdoCL7FGiDanpPidj1GntEZE9tSDXuO2T23+K8myfiz3pD2wgxHAvcAiVhFqdq4ssltXJSjZuWOMN7VguBBumQkzHOvNWx7SaG99I0Ya3z3CaXPHYX2DktRtyAd2ifx9VEiXmcuQCtoaY5xFc+lLoOTtlsdyCakXRnEZckIYpzWh7xhfmiblBBe0JaKZDNcyazUZkEUg1Bv11i0VXXXJt3gsRJyieyBInKC/ixYY4MBAOLj7rSTxtZoqvBjcTBuMF7fmx6Sba9IbPEeZorDZNhY9bseabW2+jVwXOsoo5c04tYhyO6ZtcXNOck3pKL9GN+uGo8vt+LONzTvhzaijbBkxRobizO1YMrVxMnz/6jhfFI0VpdBzS05tzXgR3fw6yqlhY2YgBt2OK26Mm/YO2i7AvEv7cBzGT2AVNR8+HMMsMVhXG7iGwrfrtwnzaL1OsseyL9l8OQjXUQwJ9/4jPDz4tkqz8uPhU1Wtfz4+LjF0ebRK4iIv84fqKM5Xx9EyP37/7t1Pxycnx6sa4zimluRsOHxXU5UX0SNgUut3peCkVVbogZb7CO1IessVl40Lp6fZ17G3rY6OmOe7rA3ibPOj/7eB+/LXCsQrw56f57CJK7iSw60FnEnMF4RFwzhKo0LwpoCXp5tVJnuXYKj0bNk9EUCCEJ/VsehHAkg4OkUdkX4qgESkUzQQ6/cAKKj6kzpGf9s/CdN/VUeq74EmUeovPMKHY0ZuWDk95gSV0Rqs3CuNCmxBuxoS6PCI/ngQlppmMNRPazy8sBjt173pFmqfylX3DHj6FLppsPS03VW/1yXqsjpFQ4PVL9TNZl7IKDAyQR/PvwjEeDhBH+9ahndthHfqzYRw+Ls2mvc+yBM486KYLAEomayPPb8Qg6Lv+mh5UYAYeZQ39/FTlGXs1DCUz0Vtt0n15L1XrbPNrV2z750K68Df9dF88eDA3/XRJD3qG/Uo1m/ZQ16ssHksRmbzaNdyvknT6ytPiN6laaN+8mXS3aRoI15GL9AKjqDphc98CZCZHPqcQOb4dRHFX4MC/BKtxSzhMum3BP69EHdnm2SEebWppKA4TRsVz4AXvhC1SzNDbd9MlSG36drowUwsy/i7Ptq5WIrxd320uXhuwt/10X4bUfV0Biv8AeUuyqZf10LC54UJnxe3I5yhM1jhD3BGlE2/LhDnxRKFeslkkcmhXUO4jgowK0A0NtmIM2rXJ5ttNGea7vgvCSU5EzyEM8G6HKtG6ulkCpZP1sNuX1FmQdvvJmjotwyxTtuuX6KJESk/XfrX4TUW8+gP/wszF8lz6df0+czDtqrvz8SVUBn08QM4WgAohuvgMlnXMw/PlarC+QxqS8E3uHoeaRWbyaqeIUEQZNOvC5U+eSeuoE0zRH0/gKo1O1AlfxxA/dEUdQDUGLO1zocoJvPY1TJeh3ENywFsLX1Ol5yXD0PAONkUG46HIWycbEH3CHybw6yGyzx7HJKZNt0cfRhbd/bDB3x+5H15bJoB6sm7Adg2UYMPeZoswyqqQBsnSPGBSzXjsL+KLu8jOY/bdGP0BaiKl7Eq+kyGcjKEb4E7Trw15VCGh6lvM5jjj7eCzqVfUwjAV2kFXaKNhP7tH2MyinIYS88QvBU2pG2QcNuRNT6srGR/RPBNsUMQ16epZehdBkupVxB5U3mXC/sebeGh239c7dwJsBR27ISl7HbqdsTLPpLRFUdlgZsKbJUXnWYX1L0vBv5cbmLGMd591ImTIA9cstESdNreyFITfuZKkOqbIvWlSFJuGhHyuP0KzU2KkC0fapW/8hZ0efxBQ/mz5UO98mffKpAtwZJrB5WwNyLaRtm6ktHmNlJ9IZUVnEpK2X3nC70N53y1TpMoYxds5Pc9ULu8V5lK2BsprEObXckgvtJWXwLFxSYKN8p+3ySFKNqITNA3WXsHh9hwJdMt0GXeWSqDIf7mfl1fOSStoMvx2p1COxxtssumzEccvgPabNSJi04z8tb4qmqy/FpwefUQQlnLHw3SfVTHeY7SDYPSfNorSZlLLsIwlxR80beZpIiLTrQYcrrVe1skFYDfKhyIRyOyaRqacw1YsOaTOsbp5uEBFGBZ379OQtEpGohplH2FnR9/PcvQuoyhUJCsEXYQXEXZ8vyG2eokPu/N6FG4AdFsELE33OuPpVGEaYaUbszI7tbtTlftZmv278ShRt4p6JCnMkw13spLTyP4KNj/Cyj4kz5UggbeLxc+YyI3nzS0dJItIZs+o9N7WB8wgKJ03VnlJluCothk5wUAFxkXNiLNZFdPOLsarwdnsqvnWqWea716vCibbZZJDhP5KEAiRQvx7F+A9cH2X/WQiqgE9b4Nj0em6aF+W8PZ+9RfnHUxjjy6KI9WLec4aJIDbj8bYCFqUGRpvqkwURJsPptBXR4oZLTXSQaY54tzCSROMUD8bYDM34zpXCzmEkycooX4C8hAEVWAVG8cuDiTVj2XebTkcOuPWjjzTQUHFRQbSI5XBzPzh6HEmbTquYLz6x9oIQIVIz5gwVUiyGFWw/VoDddmNQRp9OL5WEty2FSaHmoJNsu8ow2OZh5ckEU7MHuWpv4mSnl0OtEY93YQ+NYA+VR8NuXU5FiKiK3ddxO0sxMZ3hn3BrgiovicQZNignjF6zUiRR8x3UjPXzZJ2pieuI89kz72/LlECpsUfcRgMb+b/yo+k9gnauP6vqTddYI+Hmv6kt9N0IJ0U8qYSSabYosHY59ojOtfDiKjZGPsQXZYceN2hOxbM7qL5BmgJSCyjJKHJIbTt7gaYUbt+j75MjlsUswQxbLSJhlizsSqsU/Uxq1Pd3r+NX4XVYBNZ9DGv0qlk1ibZIh5NgB6ZowqmXz6RG3c7R5lQzuCeGBID7NyOQxqGD4uy+XQqgFddIGd/2hW4SWHTTbEFgx5OtEMV+BnESSbYnO+FUGyFvbN+rGI8KVPqz9ES3UuXQv9tjb7OdTuuwkaLxG3ZquLtpjAJCaTzDB5o5hMMsDclGdZXLysK7AU+SWH8unXJjZJySQTTDmkOaI3+yIHxYkmuKIxTCaZYIrGLplkgBmG8yiLHoHQkBZl0a9DrION9W9fUCILbZoBqtz859KN0WWsMFsBUGUFtjSXbo4+zBQ7noiWAXwGI3w5v015PcRncx4P8NeMt5IlBJVmiipYRDCp+sgSM59KM0XlDX06UR83iOKv5MVPYstqKKt+neTFG2IrUZbNti5p2wTZDOpiz9hSCUZ4+H7oEJT8zrA0k1E9akwS5NOoDZZ7BMVFGSZLUP/Ab4elrK09kE+7tjDNK9Y+pFL0EZtQUxR/EBSgBBnrLBjIp1FbsJgLIwKoBJ1zE+IAA/K7RqDO6ZyZO+ovGghffCy2aLXPIFEpGicrVvcAXSXb8J85XcEmauAWBbqxIs6fQfEScJGdgmR17HY16XOOPTpFHRHtICbZ4xygYZqUgvhEcQ6dGtA0wGLW3zSiJ8Wdb9TzcHg9w+H1z81qzfY7k6Qfc87fz0mn6CP261JuMEqy6NfB3nhFfjdAC9j9dTrFADGUMBUn6OP5s0CMhxMM8PB1CrAbXs6eOQUvzaRfz6eX+yLBt0RKDjRQGcxOTCCddOI9ifGpDPr4V2HoiYHrFH3E4FbSkzhBHy+8DSSAdYoBInpVAPWIBLZPNsGuYzS+IGD2sg9JHv1avniBZPjVKfqIjdf1KblPKu4GWGkmw3qaSHjuJklppv2JdSVej3YW6yrHVIl1HSo9TawrK3t6EidfEJmughAL3qNoMWbOJL8boJ1I0LT86DgcCUUmMbG8/Wd1rItwwQyY+os6wk3AAOAPGmuQ9jpuZgnSf9ZYPwBcJI2egewyUUkWHa0jBjZDm8VwYkDxd9w9fHSKBj9hfi9fraKMjSQkE8zXDsPrBq01FB9grB1dPIWVj9Yt+P4sfjnTfNbD4mG05I2O0ERBm4zgiTIY4wuNDHEWDf0Hqqd8yarS9qM6Th30xTqT+6/aSEIgHRzJ1p3Rvl1bSAylpQfr160CaPgwTKdTjBBPpIh6u8H5ap2XCRe71H/WkGFu5ai5YvTZ5YCvtQq4BNljxSym2m8aKOEpE1lff9GQau9XRqLRB/Xyp2z5U73yXawFjUJ81huhp1ERcwdMqQQ9PNHuDvldH02MZYLEBlaR3zV1iKiZVIIBngRNb5SgSLnglh0n7VeN8eqxqzxPy+Y8vWEGGv6g0Wd5haPP0ANvRZ6GIBUc0JZm2puVJ36n29WSE4KZnM8XlZpmiYnDfcLkT/BLEWUbmM4dKhbn2J/uql0ZYFkffk5c3rBAQ7+Y9OQoxESegyJZRcWLx80TVIKOPRzn2VKIyCTpaVF+T7P/qmGHbdapIOKb+KyzWn6INmklOV9Pp6mjXhWPcCX4pyCMl05RR0T/0kj1F52W1pcWcCRRCfsz0Mu4G02O39jjoM109hjGNEPd7eUqb4LKp2sKaqMePKe3/RCgRq/XDpSWr0VZVS/T8Dt9bzMEv2/Qu5JROsnLmwy88RucozjTaAdv0pfK3l4uste4+/ty0dtVf4SywY++u1ItEMxAkQhLTWRUfKfXV4+ZGNwl+1TC3ghjfVrOoTyu0zxagmWNayKaIwDTSGlb6+0TYCxDOkXP/w6F+zyNyifW9iFTdjq1OVDtC/Cc8HEB/VcN7zY3DcomwKnHyqws8zjB65Ohp9nvvE/hof7j63UxjffV4WBcCnYCCLi766h4BKLhpjRWEIJovCA+dTXrExXmmyIWLTKMB/AgQV6eLRPUZwcX5edNmn48fIjSkl14CJv64VjY5YZSsSkKKJOmwkGUdigjHaqtqPRAriWmR95LwRlquLX8zKrorn2E7z5Ja++zovSIy7KyA3MpyIwIy1JiODgHciMkcx+lRqHxjmSHtFc1RYcpaqd1BJCWPYMQnckMTZidZE8jMuLmWktJHTh/N7ueqQoHWYJ3A+KnD8e53oNYMhshOJACgp591BfiVjrs/OBCv/tRGQcCEFzYiwDEcCoEEG9PxUDYUleC0L1hpicLfTFbcWiRLCWig3EnFB3kPsrFQHtdiQaO6MfToxcVS00BYQvbigmNZyksDJg7kWGA91FwRtvuSnwCb+5d6JoYbSFbcalxLMWkAXEnHg3gPoqFtK3W4oAehrk7+xL49aNGGi/RkKVUHyYSMJ+GsuQ+BnMgEQxR+7j8kDTViUCgXr7jXmDRfKVIAKD5koqkY4TgDgQH4zoSHjGN+ypHkpa7k6X2JKW+EBElLZUMDbeP8tIT9+8oKHddJIDWLESUUnmUUqbsOxhb47XDcTUN9Yj7aJkMtddaLOar+K57bUj9eSOijMLTUAK+kxi2K98WxoE4UGTtozAMNNaJLHTC9l555cIVM5cIAsaVknjvZP3CErePojHcZCfSQe5/aEgHVcxuT4WBs+wIhOZIOkii9tG2EDfVkVnRuVQaN4WWdcEVtjIyGDRnjrIGzpnJwQLvpUYZb70bATLd75cUthGgV7DlL6ZzHwVoG3v+DTeMNv3FZe1mKBHmPvncXsPG/2SetzK+E5xtVT/RJiytez5V1DNCaFuxKZ1YNxLa9lJuhC12ITb0McQ76jia6YFIBkXjfJm4lwbQ7SWJAXcjV0MU68mX6rk6JzI2ygu3igrXgmTMTFORxbUP2I7pgx58D5UVQdy/kbYSHo20mPbU8RxMhKqVWUqbuBpnYdwK9O+jQKpyZWoR1Vd4GoAuVKByda9UTPdccW5NTpGGNvB5csWMTq9LZjd33k+HU+6+ez+nWhigdWrfjQbeT76wjfOKRbPsCw7OlQ+CA95H55VC612FCoZeqBuMXhexDRNEKLZCgiDchQhiuL0UB3E7nYkAurcfNFec6soCXdZaKEg4axVCYjkUEwp3L+VlpOWuBOcmPNUUF1zCVkggiKVoIAR3AoHQ9lEMxK207nz6bgids2yikno3Twg6gQfdjzNuArr2UUgmOuvGt179zJu47ASCsj9n4YS07am4THMmjuGA7tk4aXHXYrOHZ+ZkFO6j/Ex5do7hg9kZuhEQ1+K052frhqndRwGb/owdwxO9s3aSwq7Fas/O4Imp20fxme4sHsMDHb+LsKhrkdkjf4yIsn0Ulqn8Mmz7TfwzwxjOhWef/TaDtO6lXE3tv2E4ouHHEZV0LUx7498R0LWP4mLq52kvYERvt0RJBgo2S3fDY/Ol+122H1DXQ0GphaMvF8ZPYBVhJpTrKAZ1SBS0/csKXQN8H5WgznJ4AFv+nCxBAS23l/D39AilH+H/emmC3xZuc8yjLHkAZXWdfwXZx8O/H/398GCWJlGJBkz6cHjwbZVm5c/xpqzyVZRlzcs0Hw+fqmr98/FxiWssj1ZJXORl/lAdxfnqOFrmx+/fnfxwfHJyDJarY7Z4A6uE8u6nFqUslykpJMRNrpTvkBakD78CTgJayViAhwOZEH04Zgt+EAgiqvzjYYJYikfsLwB2eVSBZRBVFSgylAtgMg8PkKyhQN1O3o4H4WfL7m7WupYlxK0SdMV1UIAYX0L68fCdNi59SWsNfZ/nqTYQfTdrDZTm2WMFvlUkWFVsxrHqy1ntQPqrWe1w6stZia7V7bnG/UcgsCPg54tsCb59PPxfuMjPBxf/864u9deDqwKOy58P3h38b126ez+Sds24nE3dlA9Cr3qiqA0FgkWqHh0cgA01xJpHj4quoE3tnRGtV3dTzKpmzszSJIEpb0NLO4frUVCXUq+XvJJ5cHbi7il9tVNTXfDhhVS092l+r6+wBeeJ9HpLADFB10mPDL36LqxfkLDrxuZ9lNnMC2UGhQ6MfxG4gLl2AnPqzRygeO2b5KULsPmFC5S8KPCzkuTz41Og3ibVk/feAbbvnbpA8V0Iqe+kD7BTIHvIi1WzLLJGPIeFrq88B0iffDdydhm9gAJp6BirKfsWogXvdRHFX+Eq6Jdo7YJE/JCsI6CrTeUAqX57yXeF1L5aZY0WzFzIVnDuQrKCuQvVHPzmVAGScM40X7Bwwa/FrdOWknDOWooeGyuWqJgbGQnXUQFmBYjcqllLFdu9/lZDbKoke2EcDUorXpcOGP6xNxvXEPHKm2Ubmdfd9sDN1ByrKT9d+tfhNZba6A//i5WybjE/n3nYjPJ9K93WwgVQ3AEoJoSch+dOUFPYEblbQntId/2D0E7eOUOyUpkU0o+ukJwBtTafO9JcWJEUnlTJ6SPNywd3YFBenVLmEO8SKk13PYrQbLDYFzbt/Bjcw5p2cGGeJsuwiipAHiSzZ5q/ii7vI4doC1AVLw4hHUI5Jw32pWM4lySGAHx127cQ7W//cNix7sD8lXMZdip1rsBCEPeXgTsUOVfyZrUcat6M0/PZ16VsdnaYJ+s0qycLW+23Nu9Zae624lJWO53N3Y+a25u4lNXeXnuNl+aWXl1sgm0Z76l8ldsxyg3sjly8xlZO67AI2mexbWNG6OewlZ0eyn0Ix124/E460Otd0sabhaE1xJW3sLbN7SHOvlUA6rqldoOUJSeIV/F3s+HsXYTWopOv1mkSZf1SytgP6F4R6bsnleWAvzLk1UrBRfb7JimcRB20NmzvA7ByWXNwcjefPt7mft2/5WLqU99nXwf9qIWmYUqUdRMASFzwYhoC2EHYULTr+CaBVIouwdGN0OMgJjDtxU8VvVq9h4b/0FaYEkhZqxHbLbXnKN0Aa+27pbWguObuVSX92puiE4nsnLvd99WKrLs93NsiqQD8VuHIMLtZdQ16BFN6TjcPD6AAS9xZtlhplH31nkD89SxDpeya5wdXUbY8v5FugNosRAffDny1YqoQS6EmWfuqVrjnll5tV1GPXemxmChqZSIybyoZGqrv9c5n6HR19xDb99HlKCb8CyjIU1mmmnb2y4VfWqvrJFsm2ePnPIsB1of2iHgyuYHCUhSb7LwA4CIbCDZR4poIM5xdOce8tsT0omy2WSZ5GEfSqDpVoLN/gd6bawxSoFOweMPNGurbGk7Fp/7irIshtIU8xxGIblAQYSjqMt9UmD43qB786AbpfCGNC9MD+s0dTYvF3BaoVY2kHrHFvMwjO6sRYsw3FZR7KAiQNq+OybXzNkHMq2dQ/IFMd6h6cMC9M8BrR4BBGr14PlZB1lAl2CzzjkI4vGwR8SGkNPU3UeoU69YF2KndBNWhOGkZ0mUnroCkIZWaQFfWugIDpZuBE2Q6SJ6THvP8uRsB8oLF/G7+q/RElg6W77tpnK3Z1cME6aZ0xKgGzclAabH8S5doTpt564i2InkGaPGAZv/kIYnhvOYC95PvSEgwkJNOrZFmTtRNfZLN86/x5qM93lXqSsfXSGfuoNzoZ53zQeq4aOMPS/DwuTs9QIWDfKqA6Dg7dsoizWvdvT2a/dDqsOwXvDSag6XuzfqxiPCNS6s/HKy4bms70xGMdS+2OPaWWIdkbYrVSJvyLIuLl3UFlrTLxgrWiSXUIDkE8mZfHGE5GD8NkoOxUyOF4TzKokfgwlJzp796JDfd6M5+JOEcNdOZBUnBuW2pAxuyxXPGNYccc8QtNxYoAWVvgmIwNzYjAWVtNNb7z1H8lbyWxIlJgJHJg/BOzBYBqjNa5ScBdXFwrFQIytKBydxiOm0yBHoExUUZJktQ/8CBVKml5VbDhmleDe4daYE1sYLoPpigACW+otOGxmAxd7TrBudsR0j+6dxOhUIdhWUOrdusgM5W9wBdrtlw3w6rKNAZ8zh/BsVLQERnGaG1awufcHeMX/upwn20yZBkj3OAxldSOonrucyRSrULanXSoZAxz3DM/HOzWlt2ZzsSh+4y0wLqVy+2arJFlN+zogcTWO6GdUChG075M+l9bXo4OCoV8v3l7NlWkXZXfbzcFwm+rstu8UkGhSNlceLZXcHb4l2FofRCGi2g4NZNJ4S3gSMgdB8oYrwjtHqL9Au66dtOVbeQX7zAjfw3jqqn5D6pBq6608cM6sjLgau7rI63NaJ89372ncQsWfanM7sYcfY9ilywU/gdjJ1jD++yow13K5SLcGGnqG4Cu/LdTZx2pijAGGn0DMbvVFMcsU5gZjFUlygGZOASJTU+QQAvX62izM40Y+1O6yWTfZyYO2sRGcD4ghdrFDvZoQN/UCyQSzwHk+UcVE/50k6P1eELls6zBsQKw43Tv0Wx00P1PekBnOvtmEsAWe7/5Kt1Xia2Emi7pvDtrM9LkD1WT9a66jI8tYuCXHi/WpU/tSzfbaBaD7rTqIiJ4zbGOA4c1S2MExDLMIRuT8CyTW72O+rwkcBOsYWenYV2emM5ZpoDHOgFpiJPQ5BSx84UB7P6qb/yezmegzfXw+RP8EsRZZs0KrSvqFVnWr0+Bcv29Nb3wcGgSFZR8eKNnCtUNMLiPFu6QkP6wXrrw9+sU/tIPB88RHCJzJzbM4K6Kh7houJPKmrL9BoP9K8tRnu40gE5UK2YnEQsbe/4ql866c/446gzA0pkOFOcuy7jTp98T0+0qB3AfhsobwNFcaA0KtczvKOgnoh0Bwk5fU0yTLjhbyYOHMZkz0gxff2daCu3z428vZCgRdeevZCw11dVbWfCUNYJN+X9d6IBvqfbPeUmC3GVs+PrHoee+H61QtE26u0hYy2xfXvI+O0h47eHjN8eMm6U6E4fMp6VZR4nuBZqHVMvlLxPITNVnWXLg0WO6kD3szdEhyB9OMK/sXQiRyKsCqr9o6MTrvk9AvnwLolEfacR/8LBwQkSFPWKy8uzsioiyEJ+Nk2yOFlHKUE7k0dxzkWc7NDYFB+s0a3RWSVooEp17ZMHfJUdMmMAjLX+wzHRwRr93r2i8Nb9W+x++uGLnUgBesCCvZZWKgMGPTgiE7OKRsK/J5EB3c6xlAXufXhJNcJbhXcoCeQSSy4ICt22t8pAtWe2rAza92d20vfN5c/Q5J6wy+mH0zBI++k1d3TTBqU+bpZgO+7j4OKtl6ft5WbBu8t+lrw21HdUl4Hsqv7jXne6uHE773nK3bDLzqedBlIRqF8zInut+bLXnS94g2nnPS9w8+yy/2t3jbTfm7eIyB5rP+11z4veUNp51xM+tZ10OX6F4exL4Af4VRpZX+F3h8ieqj9o9Xf3jgeLU3+cpM/595Km6XHxGyWSuroHM3bW4/iKeuYRgOHOJx9I6Dqu/qglBOzLAyQklzaZSPBvc0wjFoPvLAxIR/f6wG4lpD3QuR3R2JV+2JYwaOuI3UtB/87B1iRgdJZ5pT2vZghSb6ftpNvR28CSlyco07/LwywA+u9aXY+eNmGQplsAiNs3Td9zb7ZIqqFeRNlZzxPvmsg7nzjmT3UZ+X1fO192RcFuO599jGZn/S/1O+v11t6671U7ZMvu+/YZ9x1O9MxzlxP2/jZn+S31t/oEL3qYdHe9vsO9221KwZZ3b5WlYX+2bxtpUNu/deEM2t0UsC2XkK7Q7dgrVMZ3zFHcIX0QlvQsgH/rjX/23C8FxyVOIwrsge1pJGH4iLNMHMpdmgTcISjiwNigVDDHLxkZYVM19wv6M2v0pgHxfSo5GTpWOo3USI/oyQVGcPht98oE04K6a1JtYid5r0yfGInjThWK+GirxoQjPi/JWw5cjlc3KSmcDJ1IrEymKfnZ532UMwVdtCVB2wt9tTtRM9JgeyZrSKGq+MvsZzdHMvm6Zjlz4dyt6YyWcT3VI940B5bPNvfMtmTfqK7QWTbvPHIKHTab1G2y7ZipbTlLNCKmunOAO+1o8kjfW4Tk9J3OHcHcZe/fhKfSPkeXOJBdhX/vdX9z107svLfbQ6476WP67oWJT7UwFz1QgsMkvebzD0P3WUhq3OlpF14GJj318iYFA1Kwy9MwjBxs9VTMroVim6dkDCRj96dlGOHY6qmZXQvH1mxEA8nYl9M0jHxs6VTNriVje6dsDERj16dtGJGY3F2wa2HYlvvAQBR260ZgBWGL7oRdy8Q+Tx174mZgpGNad8Ou5WFL7gcDadiiG+IMX7eF3qmAJUDRXvGTLwG0c8sKXXZ6HwlO4aBSIago99ThwVl3eRfjPwrjJ7CKPh4u73PY0fXtX3VaKZAQGhwvazlk/FUECxPGMaloPw6bShXVQWQYrwtfOcXVgb+KsHHCCGS/suNw+yQReJs6XkWj4Tn85rsIHCeNI7fWJQfdJoiw67Rx8NpW4aDrzyJglKIGW58GFELXSTL4+iSjShX10TVhFXWSrIo5Do8bq4I758rVxOUQVcid31WQJbEkSeVICbM/8SXC7lMldfQZxqoizxfxVZGpwqrIDGNCUIo4hb8Ku75U4BQfPsRXwGUR1sZHTSm0hw0oEbWOzSNpK51tvHYqQFMwNxGp4gmKCD1Vm1G4QAjJ3MLlk88yTNZxSrAlxtWLv4pqgQkKmIxBxsMzGYQ1UXn4SgkTRThT43s+D4hc/HTNXwVKmZzEVAxrEM61VH6BmYDLUd+ZVhzTzdBtYn+l5VhLJZdfvoIGC29vFDR3/JZHW+L5/RSiHP7tqLH0ARdpWwfOweiSuoN+Je7jE7RQdlufVcPolQcu0n5y2JzgYrhB7CbdvjepXyRIWyXbhRFuOhGk9h9320RmV0Te0KHtE5EXjKC5+bLbhjbufXkDRf5/4Q4AQWT7aUdNYy6HErRt6PoogTebILL+MNAwdq3Xlao/Ommc+B4kSTsVLk3iGkCuJLsGzAWvZ1ElJQtEDMCluWNEf93PEAcklwI5avo2ep241UYm0pJ7bxw2cnQwGDSOurtF0DT53S6shmXX9K2elS3W2fJsOUeNI68nkbRPeoMJTSLvS6hJlTsJttREyhQUN3HgZLEeiTuwTcWXTUiH4eCtFFbNnWoMiu9VkDVwi8uqiRs8urIav2LA0mDYkgCLD8qLGqxwpJ5uckmLMP491KMSj2JdmEt00fShU+FiFiifI2dZIXZYtoxhUwctZM792JjJxHe3ckGcMxwTDNmRRDvJsGOfsfNM4YCv1J2mezhYMPYlbl9CC3A59mh4qZ9d1eehkpRNwsStSyJ7LFMyANWMKN2B54iFptMwd+5QNg8PH1C00z0T2RnkETu5l4UPqbO0KrbgOqKjvwbaJo8Sew0eMhTGJG8cF+REkUdspmHa8O8dNUdwQEjQrLFjRFa+afE+YM0ZJmmC5ord8ONnZl5rk4fc9EonRBy563fIgnE3vsZpCGtltUNGyN38CuH+Dtz9O2y6bOYdDWq3nIF32eSxmVk9jvs1C71k5h4LU7aawadobvusbRdn26V9OK4jZZoP8GeVF9EjwG94l/jrh+PFJkNvlde/fFAmjz3EB4iZgZiK6+3yXGQPeRtezFDUZmEffgZVtIyqaFZUCXqPHCbHoCyT7PHw4EuUbmCWs9U9WF5kV5tqvalgk8HqPqWWoShMeaj+D8cczR+u1uhX6aIJkMwEPe9+lZ1uknTZ0X3OPzcug0CumeYBetSXFXqI/vGlQ/qcZ4pADfu6sO1rsFqnEKy8ysLoGZjQdlOCS/AYxS/w+3OyRM/Fy0DGO4Jm+wc/iR6LaFU2GH15+BPK8HL17T//PzQBeZbNuwIA + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.Designer.cs b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.Designer.cs new file mode 100644 index 00000000..0005e624 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddStatistics : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddStatistics)); + + string IMigrationMetadata.Id + { + get { return "201812220029427_AddStatistics"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.cs b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.cs new file mode 100644 index 00000000..05a482fe --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.cs @@ -0,0 +1,75 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddStatistics : DbMigration + { + public override void Up() + { + CreateTable("dbo.Commands", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.DeviceStats", + c => new + { + Id = c.Int(false, true), + Manufacturer = c.String(unicode: false), + Model = c.String(unicode: false), + Revision = c.String(unicode: false), + Bus = c.String(unicode: false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Filesystems", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.Filters", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.MediaFormats", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.Media", + c => new + { + Id = c.Int(false, true), + Type = c.String(unicode: false), + Real = c.Boolean(false), + Count = c.Long(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.OperatingSystems", + c => new + { + Id = c.Int(false, true), + Name = c.String(unicode: false), + Version = c.String(unicode: false), + Count = c.Long(false) + }).PrimaryKey(t => t.Id); + + CreateTable("dbo.Partitions", + c => new {Id = c.Int(false, true), Name = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + + CreateTable("dbo.Versions", + c => new {Id = c.Int(false, true), Value = c.String(unicode: false), Count = c.Long(false)}) + .PrimaryKey(t => t.Id); + } + + public override void Down() + { + DropTable("dbo.Versions"); + DropTable("dbo.Partitions"); + DropTable("dbo.OperatingSystems"); + DropTable("dbo.Media"); + DropTable("dbo.MediaFormats"); + DropTable("dbo.Filters"); + DropTable("dbo.Filesystems"); + DropTable("dbo.DeviceStats"); + DropTable("dbo.Commands"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.resx b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.resx new file mode 100644 index 00000000..94fe9d0f --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812220029427_AddStatistics.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.Designer.cs b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.Designer.cs new file mode 100644 index 00000000..903de801 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class LinkDeviceStatsToReport : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(LinkDeviceStatsToReport)); + + string IMigrationMetadata.Id + { + get { return "201812221606592_LinkDeviceStatsToReport"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.cs b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.cs new file mode 100644 index 00000000..256d53bb --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.cs @@ -0,0 +1,21 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class LinkDeviceStatsToReport : DbMigration + { + public override void Up() + { + AddColumn("dbo.DeviceStats", "Report_Id", c => c.Int()); + CreateIndex("dbo.DeviceStats", "Report_Id"); + AddForeignKey("dbo.DeviceStats", "Report_Id", "dbo.Devices", "Id"); + } + + public override void Down() + { + DropForeignKey("dbo.DeviceStats", "Report_Id", "dbo.Devices"); + DropIndex("dbo.DeviceStats", new[] {"Report_Id"}); + DropColumn("dbo.DeviceStats", "Report_Id"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.resx b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.resx new file mode 100644 index 00000000..18422e8e --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812221606592_LinkDeviceStatsToReport.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.Designer.cs b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.Designer.cs new file mode 100644 index 00000000..7d34e147 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class FixUnsignedFields : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(FixUnsignedFields)); + + string IMigrationMetadata.Id + { + get { return "201812231612080_FixUnsignedFields"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.cs b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.cs new file mode 100644 index 00000000..1133b9de --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.cs @@ -0,0 +1,81 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class FixUnsignedFields : DbMigration + { + public override void Up() + { + AddColumn("dbo.TestedMedias", "BlocksSql", c => c.Long()); + AddColumn("dbo.TestedMedias", "BlockSizeSql", c => c.Int()); + AddColumn("dbo.TestedMedias", "LongBlockSizeSql", c => c.Int()); + AddColumn("dbo.TestedMedias", "LBASectorsSql", c => c.Int()); + AddColumn("dbo.TestedMedias", "LBA48SectorsSql", c => c.Long()); + AddColumn("dbo.TestedMedias", "LogicalAlignmentSql", c => c.Short()); + AddColumn("dbo.TestedMedias", "NominalRotationRateSql", c => c.Short()); + AddColumn("dbo.TestedMedias", "PhysicalBlockSizeSql", c => c.Int()); + AddColumn("dbo.TestedMedias", "UnformattedBPTSql", c => c.Short()); + AddColumn("dbo.TestedMedias", "UnformattedBPSSql", c => c.Short()); + AddColumn("dbo.Chs", "CylindersSql", c => c.Short(false)); + AddColumn("dbo.Chs", "HeadsSql", c => c.Short(false)); + AddColumn("dbo.Chs", "SectorsSql", c => c.Short(false)); + AddColumn("dbo.FireWires", "VendorIDSql", c => c.Int(false)); + AddColumn("dbo.FireWires", "ProductIDSql", c => c.Int(false)); + AddColumn("dbo.Pcmcias", "ManufacturerCodeSql", c => c.Short()); + AddColumn("dbo.Pcmcias", "CardCodeSql", c => c.Short()); + AddColumn("dbo.BlockDescriptors", "BlocksSql", c => c.Long()); + AddColumn("dbo.BlockDescriptors", "BlockLengthSql", c => c.Int()); + AddColumn("dbo.MmcFeatures", "BlocksPerReadableUnitSql", c => c.Short()); + AddColumn("dbo.MmcFeatures", "LogicalBlockSizeSql", c => c.Int()); + AddColumn("dbo.MmcFeatures", "PhysicalInterfaceStandardNumberSql", c => c.Int()); + AddColumn("dbo.MmcFeatures", "VolumeLevelsSql", c => c.Short()); + AddColumn("dbo.Sscs", "MaxBlockLengthSql", c => c.Int()); + AddColumn("dbo.Sscs", "MinBlockLengthSql", c => c.Int()); + AddColumn("dbo.SupportedDensities", "BitsPerMmSql", c => c.Int(false)); + AddColumn("dbo.SupportedDensities", "WidthSql", c => c.Short(false)); + AddColumn("dbo.SupportedDensities", "TracksSql", c => c.Short(false)); + AddColumn("dbo.SupportedDensities", "CapacitySql", c => c.Int(false)); + AddColumn("dbo.SscSupportedMedias", "WidthSql", c => c.Short(false)); + AddColumn("dbo.SscSupportedMedias", "LengthSql", c => c.Short(false)); + AddColumn("dbo.Usbs", "VendorIDSql", c => c.Short(false)); + AddColumn("dbo.Usbs", "ProductIDSql", c => c.Short(false)); + } + + public override void Down() + { + DropColumn("dbo.Usbs", "ProductIDSql"); + DropColumn("dbo.Usbs", "VendorIDSql"); + DropColumn("dbo.SscSupportedMedias", "LengthSql"); + DropColumn("dbo.SscSupportedMedias", "WidthSql"); + DropColumn("dbo.SupportedDensities", "CapacitySql"); + DropColumn("dbo.SupportedDensities", "TracksSql"); + DropColumn("dbo.SupportedDensities", "WidthSql"); + DropColumn("dbo.SupportedDensities", "BitsPerMmSql"); + DropColumn("dbo.Sscs", "MinBlockLengthSql"); + DropColumn("dbo.Sscs", "MaxBlockLengthSql"); + DropColumn("dbo.MmcFeatures", "VolumeLevelsSql"); + DropColumn("dbo.MmcFeatures", "PhysicalInterfaceStandardNumberSql"); + DropColumn("dbo.MmcFeatures", "LogicalBlockSizeSql"); + DropColumn("dbo.MmcFeatures", "BlocksPerReadableUnitSql"); + DropColumn("dbo.BlockDescriptors", "BlockLengthSql"); + DropColumn("dbo.BlockDescriptors", "BlocksSql"); + DropColumn("dbo.Pcmcias", "CardCodeSql"); + DropColumn("dbo.Pcmcias", "ManufacturerCodeSql"); + DropColumn("dbo.FireWires", "ProductIDSql"); + DropColumn("dbo.FireWires", "VendorIDSql"); + DropColumn("dbo.Chs", "SectorsSql"); + DropColumn("dbo.Chs", "HeadsSql"); + DropColumn("dbo.Chs", "CylindersSql"); + DropColumn("dbo.TestedMedias", "UnformattedBPSSql"); + DropColumn("dbo.TestedMedias", "UnformattedBPTSql"); + DropColumn("dbo.TestedMedias", "PhysicalBlockSizeSql"); + DropColumn("dbo.TestedMedias", "NominalRotationRateSql"); + DropColumn("dbo.TestedMedias", "LogicalAlignmentSql"); + DropColumn("dbo.TestedMedias", "LBA48SectorsSql"); + DropColumn("dbo.TestedMedias", "LBASectorsSql"); + DropColumn("dbo.TestedMedias", "LongBlockSizeSql"); + DropColumn("dbo.TestedMedias", "BlockSizeSql"); + DropColumn("dbo.TestedMedias", "BlocksSql"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.resx b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.resx new file mode 100644 index 00000000..30fac7b7 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812231612080_FixUnsignedFields.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.Designer.cs b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.Designer.cs new file mode 100644 index 00000000..0232012c --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class UseBinaryDataForIdentifyInquiryAndModesInReports : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(UseBinaryDataForIdentifyInquiryAndModesInReports)); + + string IMigrationMetadata.Id + { + get { return "201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs new file mode 100644 index 00000000..7477669a --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs @@ -0,0 +1,74 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class UseBinaryDataForIdentifyInquiryAndModesInReports : DbMigration + { + public override void Up() + { + DropForeignKey("Mmcs", "ModeSense2A_Id", "ModePage_2A"); + DropIndex("dbo.Mmcs", new[] {"ModeSense2A_Id"}); + AddColumn("dbo.Mmcs", "ModeSense2AData", c => c.Binary()); + DropColumn("dbo.Mmcs", "ModeSense2A_Id"); + DropTable("dbo.ModePage_2A"); + } + + public override void Down() + { + CreateTable("dbo.ModePage_2A", + c => new + { + Id = c.Int(false, true), + PS = c.Boolean(false), + MultiSession = c.Boolean(false), + Mode2Form2 = c.Boolean(false), + Mode2Form1 = c.Boolean(false), + AudioPlay = c.Boolean(false), + ISRC = c.Boolean(false), + UPC = c.Boolean(false), + C2Pointer = c.Boolean(false), + DeinterlaveSubchannel = c.Boolean(false), + Subchannel = c.Boolean(false), + AccurateCDDA = c.Boolean(false), + CDDACommand = c.Boolean(false), + LoadingMechanism = c.Byte(false), + Eject = c.Boolean(false), + PreventJumper = c.Boolean(false), + LockState = c.Boolean(false), + Lock = c.Boolean(false), + SeparateChannelMute = c.Boolean(false), + SeparateChannelVolume = c.Boolean(false), + Method2 = c.Boolean(false), + ReadCDRW = c.Boolean(false), + ReadCDR = c.Boolean(false), + WriteCDRW = c.Boolean(false), + WriteCDR = c.Boolean(false), + DigitalPort2 = c.Boolean(false), + DigitalPort1 = c.Boolean(false), + Composite = c.Boolean(false), + SSS = c.Boolean(false), + SDP = c.Boolean(false), + Length = c.Byte(false), + LSBF = c.Boolean(false), + RCK = c.Boolean(false), + BCK = c.Boolean(false), + TestWrite = c.Boolean(false), + ReadBarcode = c.Boolean(false), + ReadDVDRAM = c.Boolean(false), + ReadDVDR = c.Boolean(false), + ReadDVDROM = c.Boolean(false), + WriteDVDRAM = c.Boolean(false), + WriteDVDR = c.Boolean(false), + LeadInPW = c.Boolean(false), + SCC = c.Boolean(false), + BUF = c.Boolean(false), + RotationControlSelected = c.Byte(false) + }).PrimaryKey(t => t.Id); + + AddColumn("dbo.Mmcs", "ModeSense2A_Id", c => c.Int()); + DropColumn("dbo.Mmcs", "ModeSense2AData"); + CreateIndex("dbo.Mmcs", "ModeSense2A_Id"); + AddForeignKey("dbo.Mmcs", "ModeSense2A_Id", "dbo.ModePage_2A", "Id"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.resx b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.resx new file mode 100644 index 00000000..9952f177 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs new file mode 100644 index 00000000..d65fe029 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class StoreUsbIdsInDatabase : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(StoreUsbIdsInDatabase)); + + string IMigrationMetadata.Id + { + get { return "201812240552109_StoreUsbIdsInDatabase"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs new file mode 100644 index 00000000..79303481 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs @@ -0,0 +1,39 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class StoreUsbIdsInDatabase : DbMigration + { + public override void Up() + { + CreateTable("dbo.UsbProducts", + c => new + { + Id = c.Int(false, true), + ProductId = c.Int(false), + Product = c.String(unicode: false), + AddedWhen = c.DateTime(false, 0), + ModifiedWhen = c.DateTime(false, 0), + VendorId = c.Int(false) + }).PrimaryKey(t => t.Id).ForeignKey("dbo.UsbVendors", t => t.VendorId, true) + .Index(t => t.VendorId); + + CreateTable("dbo.UsbVendors", + c => new + { + Id = c.Int(false, true), + Vendor = c.String(unicode: false), + AddedWhen = c.DateTime(false, 0), + ModifiedWhen = c.DateTime(false, 0) + }).PrimaryKey(t => t.Id); + } + + public override void Down() + { + DropForeignKey("dbo.UsbProducts", "VendorId", "dbo.UsbVendors"); + DropIndex("dbo.UsbProducts", new[] {"VendorId"}); + DropTable("dbo.UsbVendors"); + DropTable("dbo.UsbProducts"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx new file mode 100644 index 00000000..8bf29e47 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO19W3PcOLLm+0bsf1Do8cSsZHl6Ono67HOiRErtOqOyOEXJ2jcFVYQkHrPIapLltmZjf9k+7E/av7AAeMOVxI1VJbeiw24XAXxIJBKJW2bi//2f//vhP76v06NvoCiTPPt4fHby7vgIZKs8TrKnj8fb6vF//HL8H//+3//bh4t4/f3oS5vvrygfLJmVH4+fq2rz6+lpuXoG66g8WSerIi/zx+pkla9Pozg/ff/u3d9Pz85OAYQ4hlhHRx+W26xK1gD/gD+9PFuBTbWN0kUeg7RsvsOUEKMefY7WoNxEK/Dx2E/K1XwdPQHvGTyehKCAxJ/UxY6PZmkSQZJCkD4eH0VZlldRBQn+9bYEYVXk2VO4gR+i9OZlA2C+xygtQdOQX/vsqm169x616bQv2EKttmWVrzUBz/7aMOmULW7E6uOOiZCNF5Dd1QtqNWblx2MvX8MK4uMjtq5fvbRA+QYZfdIU/8uRKNNfOjl5d4L/+8uRt02rbQE+ZmBbFVH6l6Ng+5Amq3+Al5v8K8g+Zts0JQmGJMM06gP8FBT5BhTVyxI8Ns2Ywxac0uVO2YJdMaJM3cJ5Vv31/fHRZ1h59JCCTh4IboRVXoDfQAaKqAJxEFUVKDKEATBHudqZutDfbW1QAOGgOj5aRN+vQPZUPX88hv88PrpMvoO4/dJQcJslcAzCQlWxBWOVeDkcTUSbfv5J0CYS4sNpLw+DUuKDb8kKmApJXfpNRka6bxbHIL57BllbpQ9hbhIkOIO9KBKENdSR1WUalc8t2HmepyDKtLEWUbZ9hGCwR4rJJRgLzOS1LKE8llidTlwRgu8qgVNRMxLqz2P98Dn6ljxhwWLl5GZ2fLQEKU4rn5MNBX6Pky+LfL3M027ooq/3Yb4t0Ci+ybmkm6h4ApUWDcF8hAqUQURHMB+gBCbq0nKZFOAO/hkip8/DUdQmyYjq0nXpWkA9lixAnEReVMRD1LE5ORrpDDJKmVy69AbewpsPilabg6OvTpDR1aTq0hN64aCI1ekcLeizjBKcpk0HWEHl5ydPSRWlgwTRGXnKyHQpiVQmXVpvw/MhCnEyRxf8KqMGJYloUF45zKpIfdmAVpN5htfkJwtQRXFURScQgV06EPn69cNPJ387+fvfT85+/vtf/7xriDrf40s36ydZVLyoTW2qMrYEUexFm+ghSZMqAaVQ4GCv3fMZe9ETpXNCKMykOySWYJ1/Q+zGmnGIWiYfSyyVLKGVzmM1cm5ACSUAI1mOIALpbSTpjiS4CI8cjCZ2hR5lSLBnMy/kFuhqJf15YFjyxrTkuTczK+i9D/Ikg/wvDcsv5oYF86IAK9j94fZh9QyFo99dWAPdJdWz994MzvfODQv6hvLim7IQ64vsMS/WzRGUCcglHKc3155Z4U++cf9fRS+gQLPHCo94I9KToqxuimj1NYDqJNoYEgL/zA2Zh8pebyuzwljrz32LwiEokshw2AQzwz4PLg17PFgY6qjgn7Y6gkSwUQ7B0rDtyzvbJpAINk1YglVexGhmNu7IcBMVYFaAyFr56CseH2QlqTBeqgM7JsODukRcfsqSf4GYa5/uIR8E3K7J4yqlNneldnK8vZvDwXC72eRFVX668m/CGyzM0R/+F10N2sJ8vvDw+sH3dfVSixBAwQegcIuyCC9NgVLwHa6sbcnpUazYiwDO3tkU1tVwVOGfLQrblG2XNFYEGK6LKAhe8+gUXpSPVuWh6NjWbwdxlWdPVn2AADSLIzUYwgkK/DzN1rTDP3s3TQVhniZxCHfpoL1WNGafv46uHiI7gCWoihc7FLvSLgiAYmSPYElICMBX696AAD/9YtcVVuUhCQ7EyVYaLMqHYAUnVt2DFqEoWMiBZtHzNF99LcPfu+VdY72gUCqE61+6IDoYHC6IWmhe+HzW8Nig5E+/CMuOt/Uqf0pWUTpLk6dsDbKKLo/moBEDlHwNFXi6bE5Hl1D76kIEzy8losGYc7fNTq4C8Xlwo1s9VTocLS29D/A+hcI7AOKU/B7n6c//mSTu7J9N172i8LZFAftUiTIiq4TALscwnX02q2sK77m0vJ6ACG/XEqrXEt5LmmQxYBUIGgCae/5PUNXbowjV2SiOsnT1dhtWItbCvMmZqpzt9DwL/oy3q2ryeuj7WdtDsy8gi/Ni7vPToCZQ03xtJOVRtFivQg0TX+EQwhhv40dZTxN3Lu5ujcMJQK+95QR7/ClAL75XcMiB2AEblIdOsFqvrA0wapC3waM+eMIJBk++3qRJlK12cFOxh8lzN1cwRMM8dE6ouYdDdqnj5ZQHZ7gqE8uhiSDeBqayUVT2+zYpJrKJas+P+gNu2xUahyi4KrKB3D5soMzwZ226t6+v7kRfepJx8SXwg5ongoMMNNjuiSz9AQadwh1cMMnalvgtA+RUEVkYqroUMVV9srl/QHsPIiWOy8nSyGSQkMrm0jelVbD8xVUNmf4KM4gp3onxb1OT1PpXlC4jd9z+d4jaEPy+RYo4Ssckgs/J0MtmEBPM5bI6CkSQaIA6mJIRzNu0rDotbzDTScMdzRmorGcyHeOfb1G6BTvbhiGZQJrWgWghmDfRUj4HNLIMuyuSCsBvFbaZtl5zbQABolD9+fbxERQgriVGo1waZV+hQKy+XmSIPmvK/eA6yuLLW95Mytj7E9+++aBcFcmmvuiVzBGo8fd8bnqeEGYSzhXinCYrseH1Ia6HyCagt0uVE9pnsZrRmPZaah8G7U0JqSohoT2u5lC0MDGoJ7Dh226ds3j7k/g30VGev9rt2fvZ1HvfSxAhFotVG+y0+z5Dr9TI75w6oxJ1VS3lPyihiMpDE0XaCojoItOtdCwE6xljOzBapLcBohx1ZOaFDUN0lkqz3+Z+qbW2SjIUS+ozivBU62L9Fd0tsnwottllAcA8E1mN604KAthwdj0F7I09rBdls22c5OEq4l1h9LEu/guseK8yA5wiKkFtB+IC7fsGLpnP/eVF5wHkAPUSm445A0LkIf+ofFthKp0Be/CjM7DLJe/kYYr1T6eULZcLB1it0iNViwPYqzyy3vhBmMW2gqMCSgek0Ktd6qxvCiDs9TdQ/IG211BPYbdUl5g37jCDNHrxfKyvXKCVYBvnHZ1w/DkAxd7waepvo9Q13J0jvHPrKa4DctVEpPvOHGLxDljGWNcutArGSreiYAdmYJ6rPvT8hTPB8oLl4n7xDz4MgRmc7ztrpYNlXY8UpNvSHdMaQFcjqYXzrxwDum7vnTsKi+QbQFsOtJxIHpNVVLmYsuswEe4kB2O56uYabOZKN9WhJDz/Bnx3sSBDkNepw/mhBrtwiuZMsStFFTCBRkYhWLgl4TJMMYdCcOhjokMbfDeD9LWLDu8BnYy9Ds7JNpwGdLMBv908FVEMLpNi/Yebjd9dvaB1h+SiX1soJyu9DszFUq8G25YX2ap42SBnMPowyRLZ1RqrAXOL5c2+uINzM8AaMDeDqwYLw0WURU/A0UrQqb7rwZx1rNNVKonorr0u16kUovMmu1mptpAuOeiWe+4452ypS6A5WetiPGcrUwLNxdK0NnCJVl/JiICu1hgYnAzF5Wo1JAB2SbEglIo5FDZWDUFZulmht7Cu2w6xnkAxL8MkBvUPbK+a2q8Ma+QwzSvmpswQqDFcR/eiQQFKkNnvHoPlwuDqEE7wBqX884W1AoW6CYsV2gnaYl2sHwB6sKFhrzVcUaBwWKv8GyheAtIW0xCw3aH4xAlL/6DEcFl0A5JkTwuAhkpSapv/XeVIMdq2wFlXQXH/BsX9P7frjX1HteNIGLrXEKvfzjhQdi2oIHajKVJgf13XYYXOuObP+DjGplDY+h12w8vFNweKsYsh+PJQJDiCrvX+lPQ7QurhzLN+2aWFvA5DPkCmIVZw56xPwrvAHRZ6VAH1gzvA+mL3S55u19a6ukX94gXORkdz6vWcPCSVKNy0DWxQW3aLovsaWWUGdWBKVO42S7RjGzWxkYzjErWBjeYoRPljtAJhFWVxVMSft3CSL3Thapm4gnNOKoiLYmQjF5a2RqMQ4c0mTtUmrpOk34oItjEqtIMBf1c2HBaUTjKd0nJvsnrIgrg2n5b665Wre1FWwvBemIM3vhdn03aCayHw1QcWz3G6ybwSwvssw5QT+Vyb3KJ6JCa3TJKQRGcmt0wvvdjqFgbuTdGoKpqgSNZR8eJxfkq6szPcOKIZyx4Jze8uji/87SZ1crvvg8cISgfrAmKIdl08wR3tv6h738miZaC/J6+k9SfaRYPOkwqt1RZr65BXd0nMTm0GweewraJ9DLs2EPZU4beg7qZnF/u1HI33pnBt3Vnf1MgO1YibwS9aHqvASFdvzRSDplDpipMed/d0EWo1N5BTtLgbym611iOQLNUOgXQ4Cqdul67KIZdJrpWO5gN/fQgOd0/9MZiH01uHPj1Yv3v19nLQn/floB8ojJfi0ZFQ24wcJqmWkQQvVyg41YHTCAHiIyjlQrrtHTmmUp6FbssHyzkHIrzNMG9xtRHDnMTVpsLVuFai4qDdBtuPQBy0213o+/pOGr2TpD4+4ZrlGyhO8HxXnvQI7Pis8/VD890J/u9tWO5mEbaT5cgS9n65k1PBbem+joGIjmj+E07Qvbzft7n6iZhL5CZcPofVxHqZpKB8gXP42nT89ghv4/cQzsi8fNvbBjXho9zoetjTFdAIL8bJSQW4cGJvMvJjyQheW7VxTMwEhYB4k5Y/gbRYycmbhIzdPhKHXhOu4hw4/k4mZdcbxDvY8tBqocPAvEneIegmxkfjFerAICrgF9wGM7nsAN4k8hAkcjpJud2keRSDuN02mokLjfImMyPd2bLr7hl0Wqb3UNKe49abaFVdplFp7RjxdhhkXhG1KOoPZerPxqYZs5uZ8MSHHnH3OFt/5MOncmc+giy610ewTDBXpA5lHKIvmCtQCDPp0tg/ozpOZp9XSmmbZYzYLp/50zjoxTAVqtkSUtrpjGMtYHLrtiPwFt5cSXTbnFK66wxj9Da5tK9AvVBJhOt8UhpR8hiFOI/+wzgrqIz95Cmp0HZIgVC6gJxiMt8o6VRm3TbchucqlONsUnph6hiVKIvtjXB3cWi4EOoQ3hZBiteIo1Uexk3vLHa1YIOikjwmjsCaW11dJkrHao0nHq7lQ5163/CcMvfgU7ux2A1XPks7ok2Ha0uu8WitAd4Gq5KY/WkGmXxZ00m+iwHCzWfyMWQ0QLqDLLPh0RR/Gxxjg4N8EO41nAHVBqiUtU29TZ2Xl2n0VHZwJtZxCL4kNr8TWcgd4Ucm0hfIbLKfaRYuAHJjb6eL7GuW/wFHA+6vj8fvOI5T2fGWusl6NpoV7W+bzLyjMpW53kk0ef86kpdezDeF+LebqEKLhddl/dtw1s9fFqDLK3DRrwWF/Dgry3yVYGGgjPlrG03vU8j0wEUWH5FWnV2+Xvn1JyaUhzDegCJXSijCH4//jWuIHLlbd/TI3nPJIr47OTljW0y0TqPR26KAikK57V32qVjQV7ADTsyqiH/zVkamKLOIC7NKq/VCWEHbB5jrgAf0M7rDtEqe1B3kAE/iKLAeD/7NmAHNG7pIZcrI67OImtu+5ave5wSeoJVK7DNqIFT04ySRp5luGkkcfU7fzO4gdIQu/jTUQWO5o1MCtD+hdd9o5hx1hErZYaoDBkhOXgnoxXoVxlPwoDmLHSGQPZB10Gbm9JaADFbrlWN1jR8Av/gS+PVDqzLS6Gyi5qIcmlqaARU0uH9L3JV2lr+JO0TlyAO5NMH1e8PanBh+Wpeog3uO1jlv+od3RwkWvMLrjhv8+72Ty8Z95183PBa6bKpjYWjgM4iSxqpxUqO91GukMtrET5NS+lenqcLHTGm4/h1Qx20ll3tD9AkjMA22eESgZS+lTr0UreWqm0KbGWlYCpnc7sSbBRZ3vvvJTXlDJsztrP373JM1BKhtykSZXU74+9qXSSLcSWkdCXdHMKLU1QcjMfJIbC5Gm0N2DIUxGSBdKaYJxR427pEus1TColArbyLYySTiQ3h5K/WxyMHbmQAJfMB12G/OEmXH/+GTOp0oAKyO4OKmaLFRO5jATkameoQBw3YNS+MOGLs3iWVDbw6Nr5FVoNmgVVoFjvDecj3Yo6usB9ncztZDHLBYEqY42cG3TiOHMLQRm4NTHcriTXsZZdBI6rpsjDixAZyLZgut5XZxfodM6EaIo+zoHDSWNLoj8HBwFecNJD3ch+kSuruzza1DTOg2WeQnP8pJq8YLjL1lJA5ZfhO9w3h9qLNgwGx8wnsJoT25Ooni6xiXTNjN9YzMXl2RzqHrGmfM2Pn1zbA5vCLV49c5zhi0j+sdscm9IsHy6x5nPNnp9Y/Isl+RTtkKyRkjdrZiGvQaUCV2bAXlji27X1EJnBMUiZWssJwxY0crLoE1q5TAAdNWisDWjJgm84wGhtDXmQ9SUIGj2QpRhMKTlqtIFO8WEqFBlZhtnQvBWJcswSMo6g2cl2dlVURJVrG0B0WSrZJNlI4yhyl5pGb7ilrd1cGm+GAD64IkjvJApfLeuYAnoauJ6ZAxHkklsDZWhWUqWKKzUPSTVW1vjBLAd5Fjzm0JGrPUsrGkZSUCAYeg6h1mYfG4PD7q7WNb47g6STAWaYh6jS9CaFf/IwBwZSgqjReMI0WJ4xQRBHWPMAKFbQF5JqCvIyXblZyofL/KGwHBSluE0GjzkeL10kBUvl00jACgSVVUvJ5sFQrX9gJigPqaXgFkUYdQF4IsRDG+WRDOqoPH4swnxntG0i8qRfvLbBFCnzrGnFJIBD4gGysqCMTLA3Gn2eME0Ye0EvLYk9xRZUKG0hdoFOJmR0k3MGepci3BHbqOwMPZRASGVx5KGhMdnci1Zn0cM6p52tCAYt3Thx4cB6qAcLS0MenGJL2PKSYUdTJqmQqUFGS0OBNFSATExSsaU65tABihfu3Dy4zA1EtWodAwy+Fx0eudqkQS2C3ixoHqZY0Ep12ijsA0jisikM7rioEg1j3C2Rx7TxwRufgZnXewEFxB8S4WHfHs6oFb1o07VRBYooXCKd1KXQ70rhRjjJA4XcjbwLtdWLOFd7Rwzh2he4WAN+NuGFQzBh0xiEbU69QBfgy6Xigy2JgttHGPlCsDNkCCtoiNgPR5Irb4mY4lhA+GgBMyDw3RlQ55aUDQ2216Bpou8MoY4ZxVS5HX3VBb2VsCCa3E/YBxe4kbgMla3O+spI0W3wmIaOZuA8yazp33EzDELtEVC9hoN1JGDN0DiNohuQEwY4rkjJ8Aa/e+rvjSRtGR8kN05i8inTntN2s/c55PgHSbduuGM14cgpYP+XlQVEs8PQiym6OCgZZLHDsYjIZWJ40Xu3RI+KDg/8E1Z9gDhGlZc4wxwqFhhw8Ckm+XO571rh5DzJI4hIibxLuEmLOH9wCZUIgI3w/ZCJJ4h/DSz/uH6I8g3iNEhZEGjaccQQRNlzuKUEQLXUVoPT/caqFzCA0gPTEzazV1QixuuNRekCNdZDGo23yRgeB062Sxg4hU+Ac9SQTyK/MlMRgKMu+REf6a8kRlm6ngXcI3RGWjqciTPWw1hY4kctaobjYHXU5MGLPr/abEt0TEGQUvFLpFw34oJHfKEf0y4nZCQgna4oJJgw/nCpml7KPCtlTFS4VmHnefMcxKFacUasdAttWtxJGPDo6InMx7QC4oAm8BY6ETGP5r9YHxkarK65SyQ1ZdBxfBGamGiwunpPgbrNEjWQ2PlqkHvcZzmdr8V5JlfV+YSXtgDyOAdXqRqAi1da7MM0ZXJSitc8cYb7qC4VxgZEuYYV8ZfuUh9ZbRX8RI/WNGOG1+bFYHY5MemvG2oaLTLsoq1OzAjLL7HGOcRXPpeHLydsvNQYXUCw1BDTkhNPWc8OQUh52WcoKz+xTRTFp8mrWatOkkEGqDC0ctpZ6HlDVY6mEjoFrkY8M1vzH5GGWByKtmnJcGzBC9nMBzY8zlhmrBgNMN0YTOFmKAFwPuNe5vlcSvNKjwYvBebdD/xpofk96zSR+EGGWKwr3bmDeOHWt2dQ838vrEKKOU7+XUPHTsmLbDezrJqxej/Bq9txv21rHjzy7u8YQPbYyyZWRlNuS3Y8eSqVdqw895jPNFceWm5MpjyamdreRED4mMcmp4ZTfg02PHlWlXeqIQ9AJOjLj20PTLnXto+juzyiFmyH1yaLCefGWetPHOOxeSLu3Dabh6Buuo+fDhFGZZgU21hZtsHOq+TVhEm02SPZV9yebLUbiJVpB+73+Ex0ff12lWfjx+rqrNr6enJYYuT9bJqsjL/LE6WeXr0yjOT9+/e/f307Oz03WNcbqi2Mw6vHQ1VXkRPQEmFbmtxABO5GXlR1X0EKELWy9ec9k4hxmafR2X2+oYnxi+61rr1rYA+nfrmyN/O6D1pGHweo5ewkau4WYftxeQdpOykrBsuIrSqBCE+vfydLvO5C5T8tLob7p8/UUdoQnMT0I0n3iMD6dM81l+n3IMZ8Sf7UCl7m13T656V3wypNC5soLT9C3xnAgJQnzW6WXymUW6s8kUdUT6sUUSkU7RQKxfVKSg6k/qGP17iSRM/1UdCYkSjVJ/OZhRgTeNroYEct3THw/CUtMMhvo1k8cXFqP9ejDdQt1Tu+qegZN+hW4aLD1td6HZXtxldYqGBosyZD4xm3kho8DIBH08fx6I8XCCPt6NDO/GCO/cmwnh8HdtNO99kCdZ7TgmACWT9bEXczEo+q6PlhcFWKEbpe3D6jnKMnZqGMrnora7pHr23qvW2ebWrtn3zoV14O/6aL54cODv+miSHvWNehTrt+wRuxRyM7Qsj3Ytl9s0vbn2hOhdmjbqJ18m3U2KNuJV9AI3ORFceiXVixCZyaHPCbTbuimi1degAL9FGzFLuEz6LYF/5uLubJOMMK+37LaESdNGxTPg3BeidmlmqHC6TiKxhqLStdGDmViW8Xd9tEuxFOPv+mgL8dyEv+uj/XNE1dMZrPAHlLsom35dSwmflyZ8Xt6NcIbOYIU/wBlRNv26wCovYmTqKZNFJod2DeEmKsCsANHYZCPOqF2fbLbRnGm6MA4klCS2wxDOBPtyrBpL1C9PWfIvwGwMBMl62PUzfTxo+90EjT8XY9N2ey7R2IiVn678m/AGi3n0h/+FmYvkufRr+nzh4bWq78/ElVAZ9PEDOFoAKIbr4DJZ17MIL5WqwvkMakvBd7h7HmkVm8mqniFBEGTTrwuVPnsnrqBNM0R9P4CqNTtQJX8eQP3ZFHUA1BizXZ0PUUzmsatlvA7jGuIBbC19TpdclI9DwDjZFBuOhyFsnGxB9wh8m8Oshqs8exqSmTbdHH0YW3f2wy6NP/NneWyaAerZuwHYNlGDD3maxMgYD7R2whQfuFQzDvvr6OohkvO4TTdGX4KqeBmros9kKCdD+Ba448RbUw5leJj6NoM5/ngr6Fz6NYUAfJVW0CXaSOhPv4zJKMphLD1D8FbYkLZBwm1H1viwspL9EcE3xQ7Bqo4lIEPvMlhKvYLIm8q7XNh1EHF4hTL8ndmVEZ81sUK4bxXDdSnqiIhJclQ+VQP5fNb0MQ9LJ2lh/vTLACqdqMOFpwR+n6XJU4ZuJQWMEGTQsHzJ10kWpcsmju4STupcFbI86rUEzy8lolLen+Ic6jXcNodPFYjPgxsOXpBsiB0OY4cS7D1do6P4c86suXgsFUsuUalpbsu9lzTJYiAYgHSKOuInqKx5tP6rhvaWqIZhrbAnqeldBVzJjswzQkGA5EWnkSL3J79dVFJK4YlDlQ7h0OEdWNssOk0dtYnv7nOiSSVot1YASKccjLQ3FuiuRL2OW64v55JyE6lK7v5W89I2ZMuHWuWvvSVdHn/QUKds+VCv/MX3Cj1cEHPtoBIORkRbRxtXMtrExtcXUlnBqaSUtcOZ6xng5OtNmkQZe4BFfj+AiQH9EGrKOsGMQuQpwGlgYQadq9oiFuJSCQczampvLFdjBj8IoT9ixMWmGS/z7PdtUoisRckE/SOH/oBafPBAplugy27XqAyG+NuHTR0wUVpBl+O1H+rvcbTJQmWajzj8gorZqBMXnWbkbfBDL2T5jeDplyGEspY/GqT7qI7zLUq3DErz6aAkZSEJZGYuKfiZHDNJERedaHvp1FTnrkgqAL9V2JCaRmTTNDTnBrBgzSeNA+HtI3oDLK5fL6IOhKkUnSPmKPsKO3/19SJDO12GQkGyhtlYcB1l8eUtY6pCfD6Y0aMQv9lsELHvQ+mPpVGEaYaUK5s/5/chVyB7qp7FgETawYgWDiTr8BzE7BRkZ5q4XUq9nw2ss9rEQ+qkgZDUxn0lw1TrM3npafoOual1TyyRMFSCBt5vc5/ZHDSfNIZ8ksWQTZ9RWIFaZzDDXpCuO5/eoluMYptdFgDMM87gUZrJrp5wdj1eD85kV8+NSj03evV4UTbbxkkOE3n7dSJFC/HivwB7nt9/1UMqohLUl0A8Hpmmh/p9A9ct5/7yorPO59FFebRqad+1Y4DFz90pYSFqkE9Evq0wURJsPptBXR4oZLTXSQaYl8tLCSROMUD85wCZ/zSmc7lcSDBxihbibyBDrwoCUr1x4OJMWvVc5VHM4dYftXAW2woOKig2kByvdsPh3XjFmbTquYbz6x9oCwYVI3YN5CoR5DCr4Wa0hhuzGoI0evF8rCU5bCpND7UE2zjvaIOjmQcXZNF2KZqlqb+NUh6dTjTGvRsEvjNAPhd7VZ6bOFSK2Np9N0G7OJPhXZwZIoo95JoUE8RrXq8RKfqI6VYaOaBJ0sb0xH3smfSx5y8kUtik6CMGy8X94h9ib/o+URvX9yXtrhP08dilL/ndBC1It6WMmWSyKbZ4MPaJxrj+1SAySjbGHmSHFTfuRsi+M6O7SL4BtAVEK6PkMVnB6VtcjTCjdn2ffJkcNilmiGJZaZMMMWdi1dgnauPWcQk8/wZFmBNh0xm08a9T6STWJhliXgyAXhijSiafPlEbd7dO2OguFA8MaRgGLodBDcOBHrgcWjWgEE342gPNKrzksMmG2IIhTyea4QrOWQTJptjc2YogWQv7dvNURDga5foP0VadS9dCv6uX/Rxq990EjZeIO7PdRVtMsCQmk8ww+UUxmWSAuS0vslXxskEG6oJzyaF8+rWJl6RkkgmmHNIc0Zt9kYPiRBNc0Rgmk0wwRWOXTDLADMNFlEVPQLiQFmXRr0Osg431b19QIgttmgGqfPnPpRujy1hhtgOgygrW0ly6OfowU+x4ItoG8BmM8OX8NuX1EJ/NeTzAXzPeSrYQVJopqmATwaTqI0uW+VSaKSq/0KcT9XGDaPWVDFkoXlkNZdWvkwwZJV4lyrLZ1iVtmyCbQV1sdAgqwQgPP+YRgpK/GZZmMqpHjUmCfBq1wXJPoJiXYRKD+gd+9TZl19oD+bRrC9O8YteHVIo+YmNki+wPggKUgIuTPpBPo7ZguRBaBFAJOh4uYgMD8ruGidL5gpk76i8aCF98LLZot88gUSkaPjDrB4CCoDf8Z/xg2EQN3KJAsZZW+TdQvAScTasgWR273U363MEenaKOiG4Qk+xpAdAwTUqBZaY4h04NaBpgMetvGtZK4s436nk4vL7B4fWf2/WG7XcmSd/ano8sTafoI/b7Um4wSrLo18HGaiS/G6AF7P06nWKAGEqYihP08fxZIMbDCQZ4OBAQ7IaXi2+cgpdm0q/n08tDkeD4xhJXDiqDPj6yh0M66cx7FuNTGfTxr8PQEwPXKfqIwZ2kJ3GCPl54F0gA6xQDRPQEFOoRCWyfbIJd22h8QcBsmCpJHv1avniBZPjVKfqIzanrc/KQVFzscmkmw3qC2geAi4EszaRrMh3UASPRkvM2S/gYJfJcOrPo03AEEWEGjTmxCUAyR4H7HyP8FmkWR0X8eQuXQoU0YMlQfvXaa9m8gnNvyhugc4kHY4uM32FmqzJ24ilNDMaFpWRstjM67kTrtyLKtjCdczoQ59BY5EXfhxwHBMka2Ek2iM0nH46YtU/D104diUvPMRr6xUQCRyGmEcegSNZR8eJxDlZUgsacAfdkSIMJEJkkdUw0tfAnFv1Xjf3vdpMK7DmIzxpY4DGC+yaJ3xCdpo56XTzB/eG/BJf0dIo6IvqbRqq/6LS0dsbiSKISNFRgUqF5fLHm53gqRUNCkligjfqv6kjYwJWfPYnPOid9dShgQaQDIuFwFGS56rSQ4zezOGizOXoMYxoV6dbZ9s8wwN0NR8k64xDXF42y95z6pBOgRm9kDpSWai1u4pbN13t91S8Ev2/R63VROsn7fgy88Ut/ozjT6Cxv0veQ3t5HsZ8HDvd9lLeANISywa+pu1ItEMxAkQhLTbTU+ZOFrSQjYAgXPpohvP/0YTDr2xn0rIPrJ8IRpvEz4eLCr2UMHdZj3OdbNiTBVjhG9hZ2OAXlC1x6rV0GHm4xjUIPywtPI4H2G0Iv33IGNvWnQ+pn/Diywz6GeGb9Kyz41rfGfYvn8TqUgMPwND2oSXiaodJvXW3X1Y472bR7d9Wx/BZSd/MI9+4pO5Nr+rkdvmhcb1C0D/g7dDydM8AG4jKKcKgaQWiNamLYevjiE0QF/A7b5TDieQtpEvRcXvZQheUVdHLt6+vwhGaT5lEM4hrX5LBmBGCavm5rvXsGzNimU3T6fr2BW9XLNCqfWREgU972xfqz+v6OMptTI6cnmu1hntHBprTwNOOkPTVjQIjPuz/ZnMXCgUt81hoRyWMigqNTtE80Y3bF0H49JOmuqXIq3DWkmWzLyk4j2k1tgm56fcK4JxFq1sHuBKhdWOuLj7TkRMLDx/v/Iov3/xpWi7OyzFcJtqSRmA/gDf+99yk81jILIIqJ7/uFBwlQgGJ2tUDD3d9ExRMQTaJKvY0QRD2O+NTVrE9UmG+LlcjwxFgEBwny8izGW6Sjefl5m6Yfjx+jtGSNUYRN/XAq7HJDqdgWBZRJU+EgSjuUkQ7VVlR6INcS0yMfpOAMNdxafmZVdI+jGyKn6SSt7csVpUdclpUdmEtBZkRYlhLDwTmQGyGZhyg1Co13JDukDYOm6DBF7bSOANKyZxCiM5mhCbOT7GlERtxcaympLRnuZzczVeEgS4jtIhTEoQexZDZCcCAFBD2HqC/ErXTY+cFcv/tRGQcCEMztRQBiOBUCiHegYiBsqStB6N6z1pOFvpitOLRIlhLRwbgTig7yEOVioL2uRAMH88DTI3pQVVNA2MK2YkLjWQoLA+ZOZBjgQxSc0ba7Ep/AW3hz3SVGW8hWXGocSzFpQNyJRwN4iGIhbau1OKAnLe8vvgR+/RyrxhuaZCnVJ1UFzKehLLmPwRxIBEPUIW4/JE11IhCol++5tyM131cVAGi+ASnpGCG4A8HBuI6ER0zjocqRpOXuZKmNhKQvRERJSyVDwx2ivPTE/RkF5b7zDtOahYhSIgFRnYE6GNvFa4fjahrqEQ9xZTLUXmuxWKxX991roerPkxJlFJ6MFfCdxLDd+bYwDsSBIusQhWGgsU5kgTzh1hAHqpjdqTkDZ9kLCM2RXJBEHeLsIW6qo4mj2zQ3G1Gt+YMrbDWNMGjOjkIaOGeTCgt8iOpEofVuBMj0RldS2EaAXsGlrpjOQxSgXdzqNtwwutYVl7WboUSYh3Sq8hqudic7WylX94L4hOrRtYSldWMMinpGCG0rNqWT1Y2EtoOUG2GLXYgNHRLtngpCZRqcjUHRiCol7qUBdHtJYsDdyNUQxXrypRpNy4mMjfLCraLCtSAZM9NUZHHtYH9j+qAHP0BlRRD3J9JWwoBoFtOeOp6DiVC1MktpE1fjzFBXgf5DFEhVrkwtovoKTwPQhQpUru6ViumBK86dySnS0AZnnlwxo5iVktnN3emnwyn30E8/p9oYoH1q340Gp598YZvDKxbNsi84OFdnEBzwIR5eKbTelTFY6IW65sZ1EVtDMIRiKyQIwp0RGIY7SHEQt9OZCKCXlYCfPCUVijCkJwt0WWuhIOGsVQiJ5VBMKNyDlJeRlrsSnNvwXFNccAlbIYEglqKBENwJBEI7RDEQt9JR56N4q/dNCBztKK9dQfVYrlL2E3jWF2YYxJlgkJQdonxI22stInSIJB2HNlFJvQBMgu7gQQ/D0U1A1yHKyUQOb3zr1R3fxGUnEJTDcYgT0nag4jKNYxzDAV0HOWlx12JzgI5zMgoPUX6mdKBj+GDmSDcC4lqcDtzBbpjaQxSw6R3tGJ7oOdxJCrsWqwNzxBNTd4jiM51DHsMDnaM5YVHXInNAR3Yiyg5RWKY6umPbb3KEN4zhXHgO+WhvkNaDlKupj/gYjmgc9YlKuhamgzkCFNB1iOJiehTYRmGElVRRkoGCzdKFeWy+dL/L9gPqeigotXD05cLVM1hHmAnlJlqB2moOrv3LCr0P9xCVoM5yfARb/i2JQQFXbug93ROUfoL/6aUJQOEn2xyLKEseQVnd5F9B9vH4byd/Oz6apUlUogGTPh4ffV+nWfnraltW+TrKsrzCTf94/FxVm19PT0tcY3myTlZFXuaP1ckqX59GcX76/t3ZX0/Pzk5BvD5lizewSijv/t6ilGWckkJChCDtDAvXsJaYlqQP/wCcCLSisQSPRzIp+nDKFvwgkERU+8fjJGuPZn8DGXoGAcRBVFWgyFAugOk8PkLChoy5O4E7HYRHf7cVpHn2VIHvFQlSFXwwUhajiTZagzxA5ZdVI3SQYUYHmS26hHi1vCaC+da1xBC3SlAHBAVY4cDnH4/faePSgeGbbsjzVBuIjgdvJxRNQHg7kD4cvB1OHRCe6FrdnmvOWgkEVt38Os9i8P3j8f/CRX49mv/P+7rUX46uC6gEfz16d/S/denuD+20a8blbOqmDnz0qieK2lAgOBHQo4MDsKGG2GDqUdEVtKm927Ho1d0Us6qZW9NqksCUt6GlXTDpUVCXUq9XeXbiIsO+2qmpLvj4QirahzR/0FfYAv8+vd4SQEzQdVIXvlffhfU7znbd2LxSPpt5oWxBoQPjzwMXMDdOYM69mQMU732Qw24EbRQmO7DF3AVKXsBVJDIj3j6snuEY69dfblHvkurZe+8A2/fOXaD4LoTUd9IH+AQme8TPVRLrVgvES1jo5tpzgPTJdyNnV9ELKJCGXmE1Zd9CdLpwU0Srr3AX9Fu0cUEi/DN3wX0EdL2tHCDhqWbuu0IKQZFELsZ3MHMhW8GlC8kKFi5Uc/BPpwqQhHOm+YKlC34t75y2lIRz1tIlWOVFjIq5kZFwExVgVoDIrZq1VLGtP2MDsa2S7IU5aFDa8bo8gMEKp0T8f8qSf4FY1j61oyGItl2T5yjGbeyQXJw9Ojlmatzcyk9X/k14g6U2+sP/YqWsW8zPFx5eRvm+lW5r4QIo7gAUE0IuwksnqCnsiNwtoT2ku/5BaGfvnCFZqUwK6WdXSM6A2jWfO9JcrCIpPKmS00dalI/uwKC8OqXMId4VVJruehSh2WB10St/dnGO0aGdvXMBF+ZpEiP/AUA6dtozzV9HVw+RQ7QlqIoXh5AOoZyTBvvSMZxLEkMAvrrtW4j20y8OO9YdmL92LsNOpc4VWAhWffh1hyLnSt5scHCE9DL8vd9Pcvf5yjAh3HUQSAYwiDWuoM5nTb9Z4/z0C49kxqar/ClZReksTZ4y9BorAViuozQ1gPycr5MsSpfNBcsSTlYOUIPnlxJR6qgzbpu9ewXi8+DGAX0UYOgAsH2tUu/uqi5lc8PJPJapWT1Z2MruoHlJT9PqAJeyuvFvYhJrXvPjUlZ33G14Sc2r7brYBNeT3nP5g1xLei9w+EHulCODUgnsE5wunQDxClwRSrkHO0e2H6MbXZ5Mwp/xdlXZwtBxa61ON7+ALM6LuS+f1ZRgmoZp4iiLFNRz4Y9id+r1V2HGRgqhNcS1t7Q+E7CHuPheQfkDsXaDlCUnWK1XP4yhizcPrUUnX2/SJMr6Ixzj+wf3etHJtQhBFrLgd7EijorYCEpZSvnAZq9WRufZ79ukcGKL1e7s+5NRq6mOg5NffujjbR82/ZtipjeNh3wCTD+upLlNIcq6MYsmwtBpksJD2FC0b6tP0fpeEKpPc3PHQ0yw0RM/mfdq9R4a/kMGAkogZa1GbA0NvkXpFlhr3x2dDIhr7l7306+9KTqRyC64Nwherci6s2y5K5IKwG8Vtpe1m1U3oEcwped8+/gIChDjzrLFSqPsq/cMVl8vMlTKrnl+cB1l8eWt1CzEZps8+IbtqxVTBQszJRyXFzxXAO5Onu2uAg5WzXEPU75a0ekWnu9nLtbA1JuSej1GFJ2mx7p3Rn+MnkMOOF9AQbrAmirw2W9zv7SeBZIsTrKnz3m2ArUicTNH3aIbgmKbXRYAzLMByz41FSfADGfXzjFvLDG9KJtt4yQPV5HUhFkV6OK/QH+ibgxSoPgO+GrEGur7Bs7w5/7yojPYtoW8xDe8blAQYcjEPd9WmD43qB4oHNF3uZQa4eoB/dMdTcvlwhaoVY2kHrHFvMoju8UoxFhsKyj3UBAgbV7tAGF3iAUxr7+B4g+0I4CqB3s3OQO8cQQYpNGL52MVZA1Vgm2cdxTC4WWLiD0+09TfRqlTrDsXYOd2E1SH4qRlSJeduQKS2q9rAl1b6woMlG4H3HV1kDwnPeb5CzcC5AXLxf3iH1L3Vx0s33fTONtlVw8TpNvSEaMaNCcDpcXyr1yiOW3mnSPaiuQbQJsHNPsnj8kKzmsucD/5joQEAznp1Bpp5kTd1G7Dnn+Db1zt8a5TVzq+RrpwB+VGP+s4Y6rjovtELMHDTs56gApe06qAKHYIPutFmte6e3s0+6HVYdlveGk0B1vd281TEeFYgus/HOy47up1piMY615scexXYh2S9VKsRtqWF9mqeNkg02jqyMYK1slKqEFyCOTNvjjCcjB+GiQHY6dGCsNFlEVPwMVKzZ3+6pHcdKO79SMJ56iZzlaQFJzbljpYQ7Z4zrjmkGOOuOVmBUpA2S9BMZibNSMBZb1orK+1o9VXMgaUkyUBRiajjjhZtghQndEqd7vWxcEmWCEoSwdL5hbTaZMh0BMo5mWYxKD+ge2zUsuVWw0bpnk1eHekBdaYIKLgW0EBSpBZ7t6C5cLRrRucsx0h+ecLOxUKdRSWObRvswK6WD8AFMm44b4dVlGggB6r/BsoXgLC6MsIrd1b+MRxx3iMZTVHzQhdWCwAGl9J6cRc6CpHKtXOVtZJh0LGfINj5j+3641ld7YjcShwpBZQv3uxVZMtojyolR5MYHkb1gGFbjjlz6TBMfVwsLEr5PvLxTdbRdrFVXp5KBIcG9Fu80namiNlcebZxTtv8a7DUBr9SwsouHPTCeFd4AgIBV9GjHeEVl+RfkFvWNip6hbyixe4kf/moOo5eUiqgbii+phBbdA5ECdRw+4uqONsoXK3WeLC378JIeDIMb/185+j0LaPEX4tN4ujIv68hbN+YQdei80VnGzSMc9bG/Pk8kex2+v69LciyrZpVDiJMPjdmenmIskMsdQ7sx6JIG7NX3+Mng2KZB0VL96IYbaasoKrZzRE3aAhlWe9yfO3m9T+ztEHjxFc3zKGz0ZQ18UTXLb/i7qfMnWtRH/bYrTW6Q7IOU8qNKss1pa+63dJTI1h49AK2DTJSZCGNjqgZcvghGBiXF7aBhWpnxjo3cjwDaQBJTKcKVx7ylWncX+ktxHUfHz+7KrEmQrgFgTmcVrexq76U2l4nvQMPfPq1YPuuCXXHJOMXE4jmYkDhzHZkzJMX/8gCtTt0wNv0dK16DqwaOkHHaBhNxOGsk64LR9+EA3wYwcA692FS1sJFMQSM17+BIKAYq4D1dUH/iiq9ZukTqMwXb1ier4t7UnBD2KbxGdpCk6gJC+TFJQvcPG0/kEk0MVUPeGjypDfsIFvvN4Fr/HU1HiuvjF8Vwz/QVhNbiDMNb6tw8N0fXW9QZxKsqfwTfuzi8jCxYphwr4LogJ+QTS+9doO2H27SfMoBnG9DvtBeN426u4ZdKI+bq+nqLXWG7gHuEyj0s5G6IfdTZCTi8nedHYzM3kjAJeyepvgZhbMzWrG5WzqboO6m4Q+6ou6Cf6J4vFahf5sAGyoCbyFNzcRg66gVYRELzQRhKaYXXjRFdQHPtTwVZQaxRaly9vQchueG1BQl5rmxLM93vsxJqn2DC62UZaOTjxn8TSzJZyYksdkEujmOFRbQNtyMhG1WkyVDzX8DyKiTWN+dOFS7t929/SD9C4bx3i/W5NZWearBA9b6uK7vln3PoUM2y+y+GiZo0rQo0YNBSFIH0/wb7weQeaCsCooAicnZ1xTegSiJgqJ+k4j/hsHBzsbFPUVvZdnZVVEkBm8ZCTZKtlEKUE7k0dRfhAnOzQ2xQcb9PRHVgkaqFJd+04YX2WHzAjzWOs/nBIdrNHv3dNjb92/w+6nX4vbixSgV9/Y6P1SGTDowRGZmFU0Ev49iQzodo6lLKCGqFQjfHxhj5JA3snLBUGh2w5WGaj2zI6VQfto4176vnkjY3Yzm7DL6Ve3MUj76TV3dNMGpT5uDt323MfB/K2Xp+3l5ohzn/0secGy76guA9lV/ceD7nRx4/be89QB8z47nz4mlopA/SQl2WvNl4PufMFDmnvvecHB/j77vz6gl/Z786Ak2WPtp4PuedFDmHvveuIWZS9djh+ruvgS+AF+vE/WV/h5RrKn6g9a/d09d8bi1B8n6XP+Wclpelz8lJukru5dsb31OH45h3krabjzyXekuo6rP2oJAftAEwnJpU0mEvwTZtOIxeBzVAPS0T2KtF8JaWOt7EY09qUfdiUM2jpi/1LQv1u6MwkYnWVeac+rLQSpJ2b30u1wfXwveUmLWvp3eZgNQP9dq+vRi2sM0nQbAHH7pul77ik5STXUy2p763npuaNeVx3s8a1qb+z4+Baxfs+KnnkVesLe36WW31F/qyt40fvd++v1Pd7d7VIKdnx7pywNh3N910iD2v2di8OA/U0BuzoS0BW6PZ8KlKt7JuDakD4IS3oWwL/1xj8b3Y2C4xKnEQU2XOA0kjAcyE4mDuU+lwRc1BQiwsygVDAhpBgZYVM1z4v7IDf0oTHxfSo5GQqNNY3USGP6yAVGEC1n/8oE04K6a1JtYid5r0yfGInjXhWKOBaWxoQjDrDErxy4HK9uUlIIJTWRWJlMU/JgaYcoZwq6aEeCdhD6an+iZqTBDkzWkEJVOS+zn90cyeTrmuXMhXO/S2e0jeupHjlNc7Dy2eWdyY7WN6o7dJbNe7ecQe6lkx6b7NpmZleHJRoWM53n7147mnTifbOQm77TOafrffb+bXgu7XMU9ZHsKvz7oPubi1O5995u3dr32McoJuK9MOCKQUcpdTiOwshj1Z8n6XiNHnHS93ycSUltRKTCvYgAHXBnYscWJroPpTuYpNfsAjEUxEhS414dXngZmNTx5U0KBqRgnw4xjBzs1DFm30KxS0cZA8nYv8MMIxw7dZzZt3DsbJtgIBmH4lDDyMeOHGv2LRm7c7QxEI19O9wwIjH5idG+hWFXJ0gGorDfkyRWEHZ4orRvmTjkqeNATpoY6Zj2xGnf8rCjEygDadjrSVQXqu6+CSEov7Xuo9oxktB+pfvtjG38h+vMBymowNFsVeGAbF5UriLRs2Cw0gEqmGCHLRnd56nkRxTTbyIpkgS5lNTWx0DcgQxd4KhtsEwFS4Cii/8WA7hXKiv0yNJDJHDmQqVCUHX51+sogxRfdEHgmp7sUsLVM1hHH4/jhxx2dR1HrkksBYqGxm8PSTn4NkGEXqeNg+OjFw4ZfxXBwoRxTMoomcOmUkV1EBnG68KR0XjGo69Cpj+PQ/anDxxunyQCb1PHq2hWIRx+810EjpPGkdsdEAfdJoiw67Rx8Ho9zUHXn0XAKEUNtnZaFULXSTL42uFWpYraw1JYRZ0kq2KBrXjHquDcsbmauByiCjk3cwVZEkuSVI6UMHvHRBF2nyqpo88w1jOliHz8VdgfpQL5vOkhXwGXRVgbb3Gp0B7WGE3UOjaPpK10NpW5gjDuFkwYRKp41iDM1tXUPGdEJVH4XD656meyjlOCl/BcvfirqBaYoDrr1teJkpm3TpTPvihdZbrpnvQSTTh9onjKadOVKkJvWQkrwQmSCmCagsYgHm8SaAwyVagx+gyKdclqGcAfBWYf2eGr4HKIKmMyKUza3QMxgnm7TxNO3W2ywihh9qb8gGEyCMcOlUdpaHabGdEI7RIlA7XbyilU1G7eRPW0aZJq6uTxWrrHhrg6uhRRDU0ij09sTITrZxwk+ojIxS+i+TjS1CaTWCDDGoQrYCq/YPGOy1Hf2U0u3QzdJvbxkMdaKomc/AoaLAz9K2jueIhgW+Kp8sT2D5fDvx01lvaOlbZ1wIlWl9Q99CsRzFXQQlmoV6uG0ecBuEj7yWFzgvlwg1jzjkNvUr91l7ZKdn8vNFcgSO0/7reJzH26vKFDF++i+xOC5ubLfhvaXAzLGyi6ORbeHRNEtp/21DQmsqCgbUOxBwX3oASR9YeBhrEnMF2p+qOTxomD6EnaqRBxj2sAeb7TNaD+ONB0ybENBuDS3DGijxU3xAFJRDlHTd9FrxMh0WQiLQma5rCRo4PBoHFU4C9B0+SBwVgNy560tXpWdoTGlmfLOWoctU4St28gZoceiXtYuInDOElldDDek1VzpxJQccQiWQN3uOeYuMGj247x4D2Ws+mOBFgcgkbUYIVgNXSTS1qE8e+hHpWct9eFuUQXTR+KtyJmgXKEFpYV4uP8ljFs6uDykTucb9aQxHe3ckF48I8JhszZ304y7NhnfLKkEDpDetakG3ZDMPYllyKEFuByHNDwUo8Koc9DJSmbhIk7l0Q24IFkAKotonQHniMWmk7DnEe/bB4edv230z0TrTNI53X5EQRvqWy5qtjBuQptVDvQNrnx7Ws4PkLWofLGcbajFHnEVTOmDf/ea3NI11tpq6T+uWbECkqRN+VEyfqzdVMFLqaCto45olqdUYuvT2shYJImaK74OH7c6/K1NnnouF7Jx9DRsf0eWTB+nK/hT2etl/fICPlxv4LDmINj/z02XbbIGHWLslxs7LPJY4sQdU+g1yz0kkXKmKOL1WJlp83lvTVEzR3x6WCbS5sAtY1uvw41nbNTagt3n5Wb3D4H3zkWdGkfTmvroOYD/FnlRfQE0C1GWuKvH06XW1h6XT8k/8EHZfLUQ3yAmBlYUY4MXZ559pi3HhUMRW0W5qn7BaiiOKqiWVElj9GqgskrUJZJ9nR89CVKtzDLxfoBxPPselttthVsMlg/pNQhA/LLGKr/wylH84frDTZZc9EESGYCmwCus/NtksYd3ZdRWjJTuwwCHbz9BjJstAf7soL/B08vHdLnPFMEatjX+ancgPUmhWDldRZG34AJbbcluAJP0eoFfv+WxMhMUwYy3hE02z/4SfRUROuywejLw59QhuP193///9YoAF8yBAMA + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs new file mode 100644 index 00000000..57d3375c --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class FixUsbIdsAndIndexes : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(FixUsbIdsAndIndexes)); + + string IMigrationMetadata.Id + { + get { return "201812241719441_FixUsbIdsAndIndexes"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs new file mode 100644 index 00000000..b90c1908 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs @@ -0,0 +1,25 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class FixUsbIdsAndIndexes : DbMigration + { + public override void Up() + { + AddColumn("dbo.UsbVendors", "VendorId", c => c.Int(false)); + CreateIndex("dbo.UsbProducts", "ProductId"); + CreateIndex("dbo.UsbProducts", "ModifiedWhen"); + CreateIndex("dbo.UsbVendors", "VendorId", true); + CreateIndex("dbo.UsbVendors", "ModifiedWhen"); + } + + public override void Down() + { + DropIndex("dbo.UsbVendors", new[] {"ModifiedWhen"}); + DropIndex("dbo.UsbVendors", new[] {"VendorId"}); + DropIndex("dbo.UsbProducts", new[] {"ModifiedWhen"}); + DropIndex("dbo.UsbProducts", new[] {"ProductId"}); + DropColumn("dbo.UsbVendors", "VendorId"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx new file mode 100644 index 00000000..18616cd2 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs new file mode 100644 index 00000000..5505506e --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddCdOffsets : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddCdOffsets)); + + string IMigrationMetadata.Id + { + get { return "201812250223002_AddCdOffsets"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs new file mode 100644 index 00000000..3a0a7e13 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.cs @@ -0,0 +1,40 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddCdOffsets : DbMigration + { + public override void Up() + { + CreateTable("dbo.CompactDiscOffsets", + c => new + { + Id = c.Int(false, true), + AddedWhen = c.DateTime(false, 0), + ModifiedWhen = c.DateTime(false, 0), + Manufacturer = c.String(unicode: false), + Model = c.String(unicode: false), + Offset = c.Short(false), + Submissions = c.Int(false), + Agreement = c.Single(false) + }).PrimaryKey(t => t.Id).Index(t => t.ModifiedWhen); + + AddColumn("dbo.Devices", "ModifiedWhen", c => c.DateTime(precision: 0)); + AddColumn("dbo.Devices", "CdOffset_Id", c => c.Int()); + CreateIndex("dbo.Devices", "ModifiedWhen"); + CreateIndex("dbo.Devices", "CdOffset_Id"); + AddForeignKey("dbo.Devices", "CdOffset_Id", "dbo.CompactDiscOffsets", "Id"); + } + + public override void Down() + { + DropForeignKey("dbo.Devices", "CdOffset_Id", "dbo.CompactDiscOffsets"); + DropIndex("dbo.Devices", new[] {"CdOffset_Id"}); + DropIndex("dbo.Devices", new[] {"ModifiedWhen"}); + DropIndex("dbo.CompactDiscOffsets", new[] {"ModifiedWhen"}); + DropColumn("dbo.Devices", "CdOffset_Id"); + DropColumn("dbo.Devices", "ModifiedWhen"); + DropTable("dbo.CompactDiscOffsets"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx new file mode 100644 index 00000000..84ac80a6 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812250223002_AddCdOffsets.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs new file mode 100644 index 00000000..26501faf --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class StoreMmcGetConfigurationResponse : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(StoreMmcGetConfigurationResponse)); + + string IMigrationMetadata.Id + { + get { return "201812251556377_StoreMmcGetConfigurationResponse"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs new file mode 100644 index 00000000..682c8c7f --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.cs @@ -0,0 +1,17 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class StoreMmcGetConfigurationResponse : DbMigration + { + public override void Up() + { + AddColumn("dbo.MmcFeatures", "BinaryData", c => c.Binary()); + } + + public override void Down() + { + DropColumn("dbo.MmcFeatures", "BinaryData"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx new file mode 100644 index 00000000..18531502 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812251556377_StoreMmcGetConfigurationResponse.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.Designer.cs b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.Designer.cs new file mode 100644 index 00000000..c732f1da --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class StoreReadResultsInReportDatabase : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(StoreReadResultsInReportDatabase)); + + string IMigrationMetadata.Id + { + get { return "201812252219066_StoreReadResultsInReportDatabase"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.cs b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.cs new file mode 100644 index 00000000..90e4c360 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.cs @@ -0,0 +1,139 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class StoreReadResultsInReportDatabase : DbMigration + { + public override void Up() + { + AddColumn("dbo.TestedMedias", "Read6Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "Read10Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "Read12Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "Read16Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLong10Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLong16Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadSectorsData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadSectorsRetryData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaRetryData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadRetryLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaRetryLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLba48Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadDmaLba48Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLongData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLongRetryData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLongLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadLongRetryLbaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "TocData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "FullTocData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "AtipData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PmaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadCdData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadCdMsfData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadCdFullData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "ReadCdMsfFullData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "Track1PregapData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "LeadInData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "LeadOutData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "C2PointersData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PQSubchannelData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "RWSubchannelData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "CorrectedSubchannelData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PQSubchannelWithC2Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "RWSubchannelWithC2Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "CorrectedSubchannelWithC2Data", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PfiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DmiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "CmiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdBcaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdAacsData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdDdsData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdSaiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PriData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "EmbossedPfiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "AdipData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DcbData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "HdCmiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "DvdLayerData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluBcaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluDdsData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluSaiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluDiData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "BluPacData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PlextorReadCddaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PioneerReadCddaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PioneerReadCddaMsfData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "NecReadCddaData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "PlextorReadRawDVDData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "HLDTSTReadRawDVDData", c => c.Binary()); + } + + public override void Down() + { + DropColumn("dbo.TestedMedias", "HLDTSTReadRawDVDData"); + DropColumn("dbo.TestedMedias", "PlextorReadRawDVDData"); + DropColumn("dbo.TestedMedias", "NecReadCddaData"); + DropColumn("dbo.TestedMedias", "PioneerReadCddaMsfData"); + DropColumn("dbo.TestedMedias", "PioneerReadCddaData"); + DropColumn("dbo.TestedMedias", "PlextorReadCddaData"); + DropColumn("dbo.TestedMedias", "BluPacData"); + DropColumn("dbo.TestedMedias", "BluDiData"); + DropColumn("dbo.TestedMedias", "BluSaiData"); + DropColumn("dbo.TestedMedias", "BluDdsData"); + DropColumn("dbo.TestedMedias", "BluBcaData"); + DropColumn("dbo.TestedMedias", "DvdLayerData"); + DropColumn("dbo.TestedMedias", "HdCmiData"); + DropColumn("dbo.TestedMedias", "DcbData"); + DropColumn("dbo.TestedMedias", "AdipData"); + DropColumn("dbo.TestedMedias", "EmbossedPfiData"); + DropColumn("dbo.TestedMedias", "PriData"); + DropColumn("dbo.TestedMedias", "DvdSaiData"); + DropColumn("dbo.TestedMedias", "DvdDdsData"); + DropColumn("dbo.TestedMedias", "DvdAacsData"); + DropColumn("dbo.TestedMedias", "DvdBcaData"); + DropColumn("dbo.TestedMedias", "CmiData"); + DropColumn("dbo.TestedMedias", "DmiData"); + DropColumn("dbo.TestedMedias", "PfiData"); + DropColumn("dbo.TestedMedias", "CorrectedSubchannelWithC2Data"); + DropColumn("dbo.TestedMedias", "RWSubchannelWithC2Data"); + DropColumn("dbo.TestedMedias", "PQSubchannelWithC2Data"); + DropColumn("dbo.TestedMedias", "CorrectedSubchannelData"); + DropColumn("dbo.TestedMedias", "RWSubchannelData"); + DropColumn("dbo.TestedMedias", "PQSubchannelData"); + DropColumn("dbo.TestedMedias", "C2PointersData"); + DropColumn("dbo.TestedMedias", "LeadOutData"); + DropColumn("dbo.TestedMedias", "LeadInData"); + DropColumn("dbo.TestedMedias", "Track1PregapData"); + DropColumn("dbo.TestedMedias", "ReadCdMsfFullData"); + DropColumn("dbo.TestedMedias", "ReadCdFullData"); + DropColumn("dbo.TestedMedias", "ReadCdMsfData"); + DropColumn("dbo.TestedMedias", "ReadCdData"); + DropColumn("dbo.TestedMedias", "PmaData"); + DropColumn("dbo.TestedMedias", "AtipData"); + DropColumn("dbo.TestedMedias", "FullTocData"); + DropColumn("dbo.TestedMedias", "TocData"); + DropColumn("dbo.TestedMedias", "ReadLongRetryLbaData"); + DropColumn("dbo.TestedMedias", "ReadLongLbaData"); + DropColumn("dbo.TestedMedias", "ReadLongRetryData"); + DropColumn("dbo.TestedMedias", "ReadLongData"); + DropColumn("dbo.TestedMedias", "ReadDmaLba48Data"); + DropColumn("dbo.TestedMedias", "ReadLba48Data"); + DropColumn("dbo.TestedMedias", "ReadDmaRetryLbaData"); + DropColumn("dbo.TestedMedias", "ReadDmaLbaData"); + DropColumn("dbo.TestedMedias", "ReadRetryLbaData"); + DropColumn("dbo.TestedMedias", "ReadLbaData"); + DropColumn("dbo.TestedMedias", "ReadDmaRetryData"); + DropColumn("dbo.TestedMedias", "ReadDmaData"); + DropColumn("dbo.TestedMedias", "ReadSectorsRetryData"); + DropColumn("dbo.TestedMedias", "ReadSectorsData"); + DropColumn("dbo.TestedMedias", "ReadLong16Data"); + DropColumn("dbo.TestedMedias", "ReadLong10Data"); + DropColumn("dbo.TestedMedias", "Read16Data"); + DropColumn("dbo.TestedMedias", "Read12Data"); + DropColumn("dbo.TestedMedias", "Read10Data"); + DropColumn("dbo.TestedMedias", "Read6Data"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.resx b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.resx new file mode 100644 index 00000000..7e119a0e --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812252219066_StoreReadResultsInReportDatabase.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.Designer.cs b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.Designer.cs new file mode 100644 index 00000000..c9a83ba8 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddMultisessionLeadTest : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddMultisessionLeadTest)); + + string IMigrationMetadata.Id + { + get { return "201901022133012_AddMultisessionLeadTest"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.cs b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.cs new file mode 100644 index 00000000..7052bdf3 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.cs @@ -0,0 +1,23 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddMultisessionLeadTest : DbMigration + { + public override void Up() + { + AddColumn("dbo.TestedMedias", "CanReadingIntersessionLeadIn", c => c.Boolean()); + AddColumn("dbo.TestedMedias", "CanReadingIntersessionLeadOut", c => c.Boolean()); + AddColumn("dbo.TestedMedias", "IntersessionLeadInData", c => c.Binary()); + AddColumn("dbo.TestedMedias", "IntersessionLeadOutData", c => c.Binary()); + } + + public override void Down() + { + DropColumn("dbo.TestedMedias", "IntersessionLeadOutData"); + DropColumn("dbo.TestedMedias", "IntersessionLeadInData"); + DropColumn("dbo.TestedMedias", "CanReadingIntersessionLeadOut"); + DropColumn("dbo.TestedMedias", "CanReadingIntersessionLeadIn"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.resx b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.resx new file mode 100644 index 00000000..cffbecc1 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.Designer.cs b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.Designer.cs new file mode 100644 index 00000000..24c06798 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddOptimalReadMultipleCount : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddOptimalReadMultipleCount)); + + string IMigrationMetadata.Id + { + get { return "201901030344456_AddOptimalReadMultipleCount"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.cs b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.cs new file mode 100644 index 00000000..006d3676 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.cs @@ -0,0 +1,17 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddOptimalReadMultipleCount : DbMigration + { + public override void Up() + { + AddColumn("dbo.Devices", "OptimalMultipleSectorsRead", c => c.Int(false, defaultValue: 0)); + } + + public override void Down() + { + DropColumn("dbo.Devices", "OptimalMultipleSectorsRead"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.resx b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.resx new file mode 100644 index 00000000..c9bff226 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901030344456_AddOptimalReadMultipleCount.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.Designer.cs b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.Designer.cs new file mode 100644 index 00000000..6a8bc447 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class AddChangeableScsiModes : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddChangeableScsiModes)); + + string IMigrationMetadata.Id + { + get { return "201901081359499_AddChangeableScsiModes"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.cs b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.cs new file mode 100644 index 00000000..b1900d28 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.cs @@ -0,0 +1,23 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class AddChangeableScsiModes : DbMigration + { + public override void Up() + { + AddColumn("dbo.Scsis", "ModeSense6CurrentData", c => c.Binary()); + AddColumn("dbo.Scsis", "ModeSense10CurrentData", c => c.Binary()); + AddColumn("dbo.Scsis", "ModeSense6ChangeableData", c => c.Binary()); + AddColumn("dbo.Scsis", "ModeSense10ChangeableData", c => c.Binary()); + } + + public override void Down() + { + DropColumn("dbo.Scsis", "ModeSense10ChangeableData"); + DropColumn("dbo.Scsis", "ModeSense6ChangeableData"); + DropColumn("dbo.Scsis", "ModeSense10CurrentData"); + DropColumn("dbo.Scsis", "ModeSense6CurrentData"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.resx b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.resx new file mode 100644 index 00000000..992a39a7 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201901081359499_AddChangeableScsiModes.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.Designer.cs b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.Designer.cs new file mode 100644 index 00000000..34fb94d1 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class IdForDensityCode : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(IdForDensityCode)); + + string IMigrationMetadata.Id + { + get { return "201905252122267_IdForDensityCode"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.cs b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.cs new file mode 100644 index 00000000..91b8896f --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.cs @@ -0,0 +1,34 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class IdForDensityCode : DbMigration + { + public override void Up() + { + RenameTable("DensityCodes", "DensityCodes_old"); + + CreateTable("dbo.DensityCodes", + c => new {Code = c.Int(false), SscSupportedMedia_Id = c.Int(), Id = c.Int(false, true)}) + .PrimaryKey(t => t.Id).ForeignKey("dbo.SscSupportedMedias", t => t.SscSupportedMedia_Id) + .Index(t => t.SscSupportedMedia_Id); + + Sql("INSERT INTO DensityCodes (Code, SscSupportedMedia_Id) SELECT Code, SscSupportedMedia_Id FROM DensityCodes_old"); + + DropTable("DensityCodes_old"); + } + + public override void Down() + { + RenameTable("DensityCodes", "DensityCodes_old"); + + CreateTable("dbo.DensityCodes", c => new {Code = c.Int(false, true), SscSupportedMedia_Id = c.Int()}) + .PrimaryKey(t => t.Code).ForeignKey("dbo.SscSupportedMedias", t => t.SscSupportedMedia_Id) + .Index(t => t.SscSupportedMedia_Id); + + Sql("INSERT INTO DensityCodes (Code, SscSupportedMedia_Id) SELECT Code, SscSupportedMedia_Id FROM DensityCodes_old"); + + DropTable("DensityCodes_old"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.resx b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.resx new file mode 100644 index 00000000..42e2995b --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252122267_IdForDensityCode.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.Designer.cs b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.Designer.cs new file mode 100644 index 00000000..af276328 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class MakeEntityFrameworkHappy : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(MakeEntityFrameworkHappy)); + + string IMigrationMetadata.Id + { + get { return "201905252245072_MakeEntityFrameworkHappy"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.cs b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.cs new file mode 100644 index 00000000..597b4f77 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.cs @@ -0,0 +1,11 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class MakeEntityFrameworkHappy : DbMigration + { + public override void Up() { } + + public override void Down() { } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.resx b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.resx new file mode 100644 index 00000000..3974ce03 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201905252245072_MakeEntityFrameworkHappy.resx @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +text/microsoft-resx1.3System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=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 + dbo + \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/Configuration.cs b/DiscImageChef.Server/Migrations/Configuration.cs new file mode 100644 index 00000000..db98de2a --- /dev/null +++ b/DiscImageChef.Server/Migrations/Configuration.cs @@ -0,0 +1,53 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Configuration.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Provides database context configuration. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Data.Entity.Migrations; +using DiscImageChef.Server.Models; + +namespace DiscImageChef.Server.Migrations +{ + public sealed class Configuration : DbMigrationsConfiguration + { + public Configuration() + { + AutomaticMigrationsEnabled = false; + } + + protected override void Seed(DicServerContext context) + { + // This method will be called after migrating to the latest version. + + // You can use the DbSet.AddOrUpdate() helper extension method + // to avoid creating duplicate seed data. + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/CdOffset.cs b/DiscImageChef.Server/Models/CdOffset.cs new file mode 100644 index 00000000..b17c858a --- /dev/null +++ b/DiscImageChef.Server/Models/CdOffset.cs @@ -0,0 +1,70 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : CdOffset.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing Compact Disc read offsets in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Server.Models +{ + public class CompactDiscOffset : CdOffset + { + public CompactDiscOffset() { } + + public CompactDiscOffset(string manufacturer, string model, short offset, int submissions, float agreement) + { + Manufacturer = manufacturer; + Model = model; + Offset = offset; + Submissions = submissions; + Agreement = agreement; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + public CompactDiscOffset(CdOffset offset) + { + Manufacturer = offset.Manufacturer; + Model = offset.Model; + Offset = offset.Offset; + Submissions = offset.Submissions; + Agreement = offset.Agreement; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + public int Id { get; set; } + public DateTime AddedWhen { get; set; } + [Index] + public DateTime ModifiedWhen { get; set; } + public virtual ICollection Devices { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Command.cs b/DiscImageChef.Server/Models/Command.cs new file mode 100644 index 00000000..fc756d9c --- /dev/null +++ b/DiscImageChef.Server/Models/Command.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Command.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing command statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Command + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Context.cs b/DiscImageChef.Server/Models/Context.cs new file mode 100644 index 00000000..d174b09b --- /dev/null +++ b/DiscImageChef.Server/Models/Context.cs @@ -0,0 +1,56 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Context.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Entity framework database context. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Data.Entity; +using MySql.Data.EntityFramework; + +namespace DiscImageChef.Server.Models +{ + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public sealed class DicServerContext : DbContext + { + public DbSet Devices { get; set; } + public DbSet Reports { get; set; } + public DbSet Commands { get; set; } + public DbSet DeviceStats { get; set; } + public DbSet Filesystems { get; set; } + public DbSet Filters { get; set; } + public DbSet Medias { get; set; } + public DbSet MediaFormats { get; set; } + public DbSet OperatingSystems { get; set; } + public DbSet Partitions { get; set; } + public DbSet Versions { get; set; } + public DbSet UsbVendors { get; set; } + public DbSet UsbProducts { get; set; } + public DbSet CdOffsets { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Device.cs b/DiscImageChef.Server/Models/Device.cs new file mode 100644 index 00000000..68fcf333 --- /dev/null +++ b/DiscImageChef.Server/Models/Device.cs @@ -0,0 +1,73 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Device.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing processed device reports in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations.Schema; +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Server.Models +{ + public class Device : DeviceReportV2 + { + public Device() + { + AddedWhen = DateTime.UtcNow; + } + + public Device(DeviceReportV2 report) + { + ATA = report.ATA; + ATAPI = report.ATAPI; + CompactFlash = report.CompactFlash; + FireWire = report.FireWire; + AddedWhen = DateTime.UtcNow; + ModifiedWhen = DateTime.UtcNow; + MultiMediaCard = report.MultiMediaCard; + PCMCIA = report.PCMCIA; + SCSI = report.SCSI; + SecureDigital = report.SecureDigital; + USB = report.USB; + Manufacturer = report.Manufacturer; + Model = report.Model; + Revision = report.Revision; + Type = report.Type; + } + + public DateTime AddedWhen { get; set; } + [Index] + public DateTime? ModifiedWhen { get; set; } + public virtual CompactDiscOffset CdOffset { get; set; } + [DefaultValue(0)] + public int OptimalMultipleSectorsRead { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/DeviceItem.cs b/DiscImageChef.Server/Models/DeviceItem.cs new file mode 100644 index 00000000..2be4ec8b --- /dev/null +++ b/DiscImageChef.Server/Models/DeviceItem.cs @@ -0,0 +1,43 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : DeviceItem.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for showing device statistics. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +namespace DiscImageChef.Server.Models +{ + public class DeviceItem + { + public string Manufacturer { get; set; } + public string Model { get; set; } + public string Revision { get; set; } + public string Bus { get; set; } + public int ReportId { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/DeviceStat.cs b/DiscImageChef.Server/Models/DeviceStat.cs new file mode 100644 index 00000000..21500617 --- /dev/null +++ b/DiscImageChef.Server/Models/DeviceStat.cs @@ -0,0 +1,47 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : DeviceStat.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing device statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class DeviceStat + { + [Key] + public int Id { get; set; } + public string Manufacturer { get; set; } + public string Model { get; set; } + public string Revision { get; set; } + public string Bus { get; set; } + public virtual Device Report { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Filesystem.cs b/DiscImageChef.Server/Models/Filesystem.cs new file mode 100644 index 00000000..9bcfb744 --- /dev/null +++ b/DiscImageChef.Server/Models/Filesystem.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Filesystem.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing filesystem statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Filesystem + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Filter.cs b/DiscImageChef.Server/Models/Filter.cs new file mode 100644 index 00000000..1d150e66 --- /dev/null +++ b/DiscImageChef.Server/Models/Filter.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Filter.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing filter statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Filter + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Media.cs b/DiscImageChef.Server/Models/Media.cs new file mode 100644 index 00000000..3fc7d393 --- /dev/null +++ b/DiscImageChef.Server/Models/Media.cs @@ -0,0 +1,45 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Media.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing media type statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Media + { + [Key] + public int Id { get; set; } + public string Type { get; set; } + public bool Real { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/MediaFormat.cs b/DiscImageChef.Server/Models/MediaFormat.cs new file mode 100644 index 00000000..83342b81 --- /dev/null +++ b/DiscImageChef.Server/Models/MediaFormat.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : MediaFormat.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing media image format statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class MediaFormat + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/MediaItem.cs b/DiscImageChef.Server/Models/MediaItem.cs new file mode 100644 index 00000000..3063e3a6 --- /dev/null +++ b/DiscImageChef.Server/Models/MediaItem.cs @@ -0,0 +1,41 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : MediaItem.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for showing media type statistics. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +namespace DiscImageChef.Server.Models +{ + public class MediaItem + { + public string Type { get; set; } + public string SubType { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/OperatingSystem.cs b/DiscImageChef.Server/Models/OperatingSystem.cs new file mode 100644 index 00000000..3c2b8be8 --- /dev/null +++ b/DiscImageChef.Server/Models/OperatingSystem.cs @@ -0,0 +1,45 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : OperatingSystem.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing operating system statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class OperatingSystem + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public string Version { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Partition.cs b/DiscImageChef.Server/Models/Partition.cs new file mode 100644 index 00000000..83e64ef3 --- /dev/null +++ b/DiscImageChef.Server/Models/Partition.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Partition.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing partition statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Partition + { + [Key] + public int Id { get; set; } + public string Name { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UploadedReport.cs b/DiscImageChef.Server/Models/UploadedReport.cs new file mode 100644 index 00000000..3e818be6 --- /dev/null +++ b/DiscImageChef.Server/Models/UploadedReport.cs @@ -0,0 +1,65 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UploadedReport.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing uploaded device reports in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Server.Models +{ + public class UploadedReport : DeviceReportV2 + { + public UploadedReport() + { + UploadedWhen = DateTime.UtcNow; + } + + public UploadedReport(DeviceReportV2 report) + { + ATA = report.ATA; + ATAPI = report.ATAPI; + CompactFlash = report.CompactFlash; + FireWire = report.FireWire; + UploadedWhen = DateTime.UtcNow; + MultiMediaCard = report.MultiMediaCard; + PCMCIA = report.PCMCIA; + SCSI = report.SCSI; + SecureDigital = report.SecureDigital; + USB = report.USB; + Manufacturer = report.Manufacturer; + Model = report.Model; + Revision = report.Revision; + Type = report.Type; + } + + public DateTime UploadedWhen { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UsbProduct.cs b/DiscImageChef.Server/Models/UsbProduct.cs new file mode 100644 index 00000000..5ac8948d --- /dev/null +++ b/DiscImageChef.Server/Models/UsbProduct.cs @@ -0,0 +1,65 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UsbProduct.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing USB product identifiers in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; + +namespace DiscImageChef.Server.Models +{ + public class UsbProduct + { + public UsbProduct() { } + + public UsbProduct(UsbVendor vendor, ushort id, string product) + { + ProductId = id; + Product = product; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + Vendor = vendor; + } + + [Key] + public int Id { get; set; } + [Index] + public int ProductId { get; set; } + public string Product { get; set; } + public DateTime AddedWhen { get; set; } + [Index] + public DateTime ModifiedWhen { get; set; } + [Index] + public int VendorId { get; set; } + [JsonIgnore] + public virtual UsbVendor Vendor { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UsbVendor.cs b/DiscImageChef.Server/Models/UsbVendor.cs new file mode 100644 index 00000000..3ad9766c --- /dev/null +++ b/DiscImageChef.Server/Models/UsbVendor.cs @@ -0,0 +1,64 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UsbVendor.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing USB vendor identifiers in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; + +namespace DiscImageChef.Server.Models +{ + public class UsbVendor + { + public UsbVendor() { } + + public UsbVendor(ushort id, string vendor) + { + VendorId = id; + Vendor = vendor; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + [Key] + public int Id { get; set; } + [Index(IsUnique = true)] + public int VendorId { get; set; } + public string Vendor { get; set; } + public DateTime AddedWhen { get; set; } + [Index] + public DateTime ModifiedWhen { get; set; } + + [JsonIgnore] + public virtual ICollection Products { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Models/Version.cs b/DiscImageChef.Server/Models/Version.cs new file mode 100644 index 00000000..c94b67ef --- /dev/null +++ b/DiscImageChef.Server/Models/Version.cs @@ -0,0 +1,44 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Version.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing version statistics in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class Version + { + [Key] + public int Id { get; set; } + public string Value { get; set; } + public long Count { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Properties/AssemblyInfo.cs b/DiscImageChef.Server/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..2eaab14a --- /dev/null +++ b/DiscImageChef.Server/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DiscImageChef.Server")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DiscImageChef.Server")] +[assembly: AssemblyCopyright("Copyright © 2011-2019 Natalia Portillo")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("A893FA0E-6952-4517-B4AA-658E421737C1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("4.5.99.1693")] +[assembly: AssemblyFileVersion("4.5.99.1693")] \ No newline at end of file diff --git a/DiscImageChef.Server/Reports/.htaccess b/DiscImageChef.Server/Reports/.htaccess new file mode 100644 index 00000000..4114709c --- /dev/null +++ b/DiscImageChef.Server/Reports/.htaccess @@ -0,0 +1 @@ +IndexIgnore * \ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/CODE_OF_CONDUCT.cshtml b/DiscImageChef.Server/Views/Home/CODE_OF_CONDUCT.cshtml new file mode 100644 index 00000000..6b6bda17 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/CODE_OF_CONDUCT.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : CODE_OF_CONDUCT.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders code of conduct. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef's code of conduct: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/CONTRIBUTING.cshtml b/DiscImageChef.Server/Views/Home/CONTRIBUTING.cshtml new file mode 100644 index 00000000..65d75687 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/CONTRIBUTING.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : CONTRIBUTING.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders contributing guidelines. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ How to contribute to DiscImageChef: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/Changelog.cshtml b/DiscImageChef.Server/Views/Home/Changelog.cshtml new file mode 100644 index 00000000..82cd302b --- /dev/null +++ b/DiscImageChef.Server/Views/Home/Changelog.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : Changelog.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders changelog. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef list of changes: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/DONATING.cshtml b/DiscImageChef.Server/Views/Home/DONATING.cshtml new file mode 100644 index 00000000..18538340 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/DONATING.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : DONATING.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders list of needed donations. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef list of things to be donated: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/ISSUE_TEMPLATE.cshtml b/DiscImageChef.Server/Views/Home/ISSUE_TEMPLATE.cshtml new file mode 100644 index 00000000..c29d744d --- /dev/null +++ b/DiscImageChef.Server/Views/Home/ISSUE_TEMPLATE.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : ISSUE_TEMPLATE.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders issue's template. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef's template for issue reports: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/Index.cshtml b/DiscImageChef.Server/Views/Home/Index.cshtml new file mode 100644 index 00000000..9b98e8ab --- /dev/null +++ b/DiscImageChef.Server/Views/Home/Index.cshtml @@ -0,0 +1,47 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : Index.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders readme. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +
+ Welcome to + + + DiscImageChef + + Server version @ViewBag.lblVersion +
+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/PULL_REQUEST_TEMPLATE.cshtml b/DiscImageChef.Server/Views/Home/PULL_REQUEST_TEMPLATE.cshtml new file mode 100644 index 00000000..b613a629 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/PULL_REQUEST_TEMPLATE.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : PULL_REQUEST_TEMPLATE.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders pull request's template. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef's template for pull requests: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Home/TODO.cshtml b/DiscImageChef.Server/Views/Home/TODO.cshtml new file mode 100644 index 00000000..db382d34 --- /dev/null +++ b/DiscImageChef.Server/Views/Home/TODO.cshtml @@ -0,0 +1,42 @@ +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : TODO.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders todo list. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +

+ @Html.ActionLink("Return to main page.", "Index")
+ DiscImageChef list of things to do: +

+
@Html.Raw(ViewBag.Markdown)
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Report/View.cshtml b/DiscImageChef.Server/Views/Report/View.cshtml new file mode 100644 index 00000000..03c594b5 --- /dev/null +++ b/DiscImageChef.Server/Views/Report/View.cshtml @@ -0,0 +1,265 @@ +@using DiscImageChef.CommonTypes.Metadata +@{ + Layout = "~/Views/Shared/_Layout.cshtml"; + ViewBag.Title = "DiscImageChef Device Report"; +} +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : View.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders device report. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +
+DiscImageChef Report for +@ViewBag.lblManufacturer +@ViewBag.lblModel +@ViewBag.lblRevision + +@if(ViewBag.UsbItem != null) +{ +
+
+ USB characteristics:
+ Manufacturer: @ViewBag.UsbItem.Manufacturer
+ Product: @ViewBag.UsbItem.Product
+ Vendor ID: @ViewBag.UsbItem.VendorDescription
+ Product ID: @ViewBag.UsbItem.ProductDescription +
+} + +@if(ViewBag.FireWireItem != null) +{ +
+
+ FireWire characteristics:
+ Manufacturer: @ViewBag.FireWire.Manufacturer
+ Product: @ViewBag.FireWire.Product
+ Vendor ID: @ViewBag.FireWire.VendorDescription
+ Product ID: @ViewBag.FireWire.ProductDescription +
+} + +@if(ViewBag.PcmciaItem != null) +{ +
+
+ PCMCIA characteristics:
+ Manufacturer: @ViewBag.PcmciaItem.Manufacturer
+ Product: @ViewBag.PcmciaItem.ProductName
+ Manufacturer code: @ViewBag.PcmciaItem.VendorDescription
+ Card code: @ViewBag.PcmciaItem.CardCode
+ Compliance: @ViewBag.PcmciaItem.Compliance
+ @if(ViewBag.repPcmciaTuples != null) + { + foreach(KeyValuePair kvp in ViewBag.repPcmciaTuples) + { + @kvp.Key: @kvp.Value
+ } + } +
+} + +@if(ViewBag.AtaItem != null) +{ +
+
+ + @ViewBag.AtaItem characteristics: +
+ @ViewBag.lblAtaDeviceType
+ @foreach(KeyValuePair kvp in ViewBag.repAtaTwo) + { + @kvp.Key: @kvp.Value
+ } +
+ @foreach(string item in ViewBag.repAtaOne) + { + @Html.Raw(item)
+ } +
+} +@if(ViewBag.repScsi != null) +{ +
+
+ SCSI characteristics:
+ Vendor: @ViewBag.lblScsiVendor
+ Product: @ViewBag.lblScsiProduct
+ Revision: @ViewBag.lblScsiRevision
+ @foreach(string item in ViewBag.repScsi) + { + @Html.Raw(item)
+ } + @if(ViewBag.repModeSense != null) + { +
+
SCSI mode sense pages: + + + + + + @foreach(KeyValuePair kvp in ViewBag.repModeSense) + { + + + + + } +
ModeContents
+ @kvp.Key + + @Html.Raw(kvp.Value) +
+
+ } + @if(ViewBag.repEvpd != null) + { +
+
SCSI extended vital product data pages: + + + + + + @foreach(KeyValuePair kvp in ViewBag.repEvpd) + { + + + + + } +
EVPDContents
+ @kvp.Key + + @Html.Raw(kvp.Value) +
+
+ } + @if(ViewBag.repScsiMmcMode != null) + { +
+
SCSI CD-ROM capabilities:
+ @foreach(string item in ViewBag.repScsiMmcMode) + { + @Html.Raw(item)
+ } +
+ } + @if(ViewBag.repScsiMmcFeatures != null) + { +
+
SCSI MMC features:
+ @foreach(string item in ViewBag.repScsiMmcFeatures) + { + @Html.Raw(item)
+ } +
+ } + @if(ViewBag.divScsiSscVisible == true) + { +
+
SCSI Streaming device capabilities:
+ Block size granularity: @ViewBag.lblScsiSscGranularity
+ Maximum block length: @ViewBag.lblScsiSscMaxBlock bytes
+ Minimum block length: @ViewBag.lblScsiSscMinBlock bytes
+ @if(ViewBag.repScsiSscDensities != null) + { + foreach(SupportedDensity density in ViewBag.repScsiSscDensities) + { + +
+ + Information for supported density with primary code @($"{density.PrimaryCode:X2h}") and secondary code @($"{density.SecondaryCode:X2h}") +
+ Drive can write this density: @density.Writable
+ Duplicate density: @density.Duplicate
+ Default density: @density.DefaultDensity
+ Density has @density.BitsPerMm bits per mm, with @density.Tracks tracks in a @density.Width mm width tape + Name: @density.Name
+ Organization: @density.Organization
+ Description: @density.Description
+ Maximum capacity: @density.Capacity megabytes
+
+ } + } + @if(ViewBag.repScsiSscMedias != null) + { + foreach(SscSupportedMedia media in ViewBag.repScsiSscMedias) + { + +
+ + Information for supported media with type code @($"{media.MediumType:X2h}") +
+ Media is @media.Length m long in a @media.Width mm width tape + Name: @media.Name
+ Organization: @media.Organization
+ Description: @media.Description
+
+ } + } +
+ } +
+} +@if(ViewBag.repTestedMedia != null) +{ +
+
Tested media:
+ @foreach(string item in ViewBag.repTestedMedia) + { + @Html.Raw(item)
+ } +
+} +@if(ViewBag.repMMC != null) +{ +
+
+ MultiMediaCard device:
+ @foreach(string item in ViewBag.repMMC) + { + @Html.Raw(item)
+ } +
+} +@if(ViewBag.repSD != null) +{ +
+
+ SecureDigital device:
+ @foreach(string item in ViewBag.repSD) + { + @Html.Raw(item)
+ } +
+} +
\ No newline at end of file diff --git a/DiscImageChef.Server/Views/Shared/_Layout.cshtml b/DiscImageChef.Server/Views/Shared/_Layout.cshtml new file mode 100644 index 00000000..37f16ec9 --- /dev/null +++ b/DiscImageChef.Server/Views/Shared/_Layout.cshtml @@ -0,0 +1,110 @@ +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : _Layout.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Contains layout. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} + + + + + @switch(DateTime.UtcNow.DayOfYear) + { + // 24th January, Macintosh launch + case 24: + + + break; + default: + + + break; + } + + @ViewBag.Title + + + + + +@RenderBody() + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server/Views/Stats/Index.cshtml b/DiscImageChef.Server/Views/Stats/Index.cshtml new file mode 100644 index 00000000..201becc7 --- /dev/null +++ b/DiscImageChef.Server/Views/Stats/Index.cshtml @@ -0,0 +1,706 @@ +@using System.Collections +@using DiscImageChef.CommonTypes.Metadata +@using DiscImageChef.Server.Models +@using Highsoft.Web.Mvc.Charts +@using Chart = Highsoft.Web.Mvc.Charts.Chart +@using Filter = DiscImageChef.Server.Models.Filter +@{ + // /*************************************************************************** + // The Disc Image Chef + // ---------------------------------------------------------------------------- + // + // Filename : Index.cshtml + // Author(s) : Natalia Portillo + // + // Component : DiscImageChef Server. + // + // --[ Description ] ---------------------------------------------------------- + // + // Renders statistics. + // + // --[ License ] -------------------------------------------------------------- + // + // This library is free software; you can redistribute it and/or modify + // it under the terms of the GNU Lesser General Public License as + // published by the Free Software Foundation; either version 2.1 of the + // License, or (at your option) any later version. + // + // This library is distributed in the hope that it will be useful, but + // WITHOUT ANY WARRANTY; without even the implied warranty of + // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + // Lesser General Public License for more details. + // + // You should have received a copy of the GNU Lesser General Public + // License along with this library; if not, see . + // + // ---------------------------------------------------------------------------- + // Copyright © 2011-2019 Natalia Portillo + // ****************************************************************************/ +} +@{ + ViewBag.Title = "DiscImageChef Statistics"; + Layout = "~/Views/Shared/_Layout.cshtml"; +} +
+ Welcome to + + + DiscImageChef + + Server version @ViewBag.Version +
+
+@if(ViewBag.repOperatingSystems != null) +{ +
+ +
+
+
+

+ +

+
+ +
+
+ + @foreach(NameValueStats os in ViewBag.repOperatingSystems) + { + + + + } +
+ DiscImageChef has run on @os.name @os.Value times. +
+
+
+
+
+
+
+} +@if(ViewBag.repVersions != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + @foreach(NameValueStats version in ViewBag.repVersions) + { + + + + } +
+ DiscImageChef version @version.name has been used @version.Value times. +
+
+
+
+
+
+
+} +@if(ViewBag.repCommands != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + @foreach(Command command in ViewBag.repCommands) + { + + + + } +
+ @command.Name has been run @command.Count times. +
+
+
+
+
+
+
+} +@if(ViewBag.repFilters != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + @foreach(Filter filter in ViewBag.repFilters) + { + + + + + } +
FilterTimes
+ @filter.Name + + @($"{filter.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repMediaImages != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + @foreach(MediaFormat format in ViewBag.repMediaImages) + { + + + + + } +
Media image formatTimes
+ @format.Name + + @($"{format.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repPartitions != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + @foreach(Partition partition in ViewBag.repPartitions) + { + + + + + } +
Partitioning schemeTimes
+ @partition.Name + + @($"{partition.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repFilesystems != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + @foreach(Filesystem filesystem in ViewBag.repFilesystems) + { + + + + + } +
Filesystem nameTimes
+ @filesystem.Name + + @($"{filesystem.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repVirtualMedia != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + + @foreach(MediaItem media in ViewBag.repVirtualMedia) + { + + + + + + } +
Physical typeLogical typeTimes
+ @media.Type + + @media.SubType + + @($"{media.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repRealMedia != null) +{ +
+
+
+
+
+
+

+ +

+
+ +
+
+ + + + + + + @foreach(MediaItem media in ViewBag.repRealMedia) + { + + + + + + } +
Physical typeLogical typeTimes
+ @media.Type + + @media.SubType + + @($"{media.Count}") +
+
+
+
+
+
+} +@if(ViewBag.repDevices != null) +{ +
+ +
+
+

+

+ All devices found... +

+ +
+
+ + + + + + + + + @foreach(DeviceItem device in ViewBag.repDevices) + { + + + + + + + + } +
ManufacturerModelRevisionBusReport
+ @device.Manufacturer + + @device.Model + + @device.Revision + + @device.Bus + + @if(device.ReportId != 0) + { + @Html.ActionLink("Yes", "View", "Report", new {id = device.ReportId}, new {target = "_blank"}) + } + else + { No } +
+
+
+
+} +
+ + +@{ + string highChartsTitleColor; + string highChartsDataLabelColor; + + switch(DateTime.UtcNow.DayOfYear) + { + // 24th January, Macintosh launch + case 24: + highChartsTitleColor = "#000000"; + highChartsDataLabelColor = "#000000"; + break; + default: + highChartsTitleColor = "#AAAAAA"; + highChartsDataLabelColor = "#FFFFFF"; + break; + } + + Hashtable highChartsTitleStyle = new Hashtable {{"color", highChartsTitleColor}}; + PlotOptionsPieDataLabelsStyle highChartsDataLabelStyle = new PlotOptionsPieDataLabelsStyle {Color = highChartsDataLabelColor, TextOutline = "0px"}; + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Operating system usage", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["osPieData"] as List}}}, "osChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Linux versions", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["linuxPieData"] as List}}}, "linuxChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "macOS versions", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["macosPieData"] as List}}}, "macosChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Windows versions", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["windowsPieData"] as List}}}, "windowsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "DiscImageChef versions", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["versionsPieData"] as List}}}, "versionsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Commands run", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["commandsPieData"] as List}}}, "commandsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Filters found", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["filtersPieData"] as List}}}, "filtersChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 media image formats found", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["formatsPieData"] as List}}}, "formatsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 partitioning schemes found", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["partitionsPieData"] as List}}}, "partitionsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 filesystems found", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["filesystemsPieData"] as List}}}, "filesystemsChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 media types found in images", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["virtualMediaPieData"] as List}}}, "virtualMediaChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Top 10 media types found in real devices", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["realMediaPieData"] as List}}}, "realMediaChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Devices found by bus", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["devicesBusPieData"] as List}}}, "devicesBusChart", false)) + + @(Html.Highsoft().GetHighcharts(new Highcharts {Chart = new Chart {PlotBackgroundColor = null, PlotBorderWidth = null, PlotShadow = new Shadow {Enabled = true}}, Title = new Title {Text = "Devices found by manufacturer", Style = highChartsTitleStyle}, Tooltip = new Tooltip {PointFormat = "{series.name}: {point.percentage:.1f}%"}, PlotOptions = new PlotOptions {Pie = new PlotOptionsPie {AllowPointSelect = true, Cursor = PlotOptionsPieCursor.Pointer, DataLabels = new PlotOptionsPieDataLabels {Style = highChartsDataLabelStyle, Enabled = true, Format = "{point.name}: {point.percentage:.1f} %"}}}, Series = new List {new PieSeries {Name = "Percentage:", Data = ViewData["devicesManufacturerPieData"] as List}}}, "devicesManufacturerChart", false)) +} \ No newline at end of file diff --git a/DiscImageChef.Server/Views/Web.config b/DiscImageChef.Server/Views/Web.config new file mode 100644 index 00000000..15e5a56e --- /dev/null +++ b/DiscImageChef.Server/Views/Web.config @@ -0,0 +1,43 @@ + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DiscImageChef.Server/Web.Debug.config b/DiscImageChef.Server/Web.Debug.config new file mode 100644 index 00000000..d7712aaf --- /dev/null +++ b/DiscImageChef.Server/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/DiscImageChef.Server/Web.Release.config b/DiscImageChef.Server/Web.Release.config new file mode 100644 index 00000000..28a4d5fc --- /dev/null +++ b/DiscImageChef.Server/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/DiscImageChef.Server/Web.config b/DiscImageChef.Server/Web.config new file mode 100644 index 00000000..7af7836a --- /dev/null +++ b/DiscImageChef.Server/Web.config @@ -0,0 +1,98 @@ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server/docs/CODE_OF_CONDUCT.md b/DiscImageChef.Server/docs/CODE_OF_CONDUCT.md new file mode 120000 index 00000000..7d5eea0c --- /dev/null +++ b/DiscImageChef.Server/docs/CODE_OF_CONDUCT.md @@ -0,0 +1 @@ +../../.github/CODE_OF_CONDUCT.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/CONTRIBUTING.md b/DiscImageChef.Server/docs/CONTRIBUTING.md new file mode 120000 index 00000000..f939e75f --- /dev/null +++ b/DiscImageChef.Server/docs/CONTRIBUTING.md @@ -0,0 +1 @@ +../../CONTRIBUTING.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/Changelog.md b/DiscImageChef.Server/docs/Changelog.md new file mode 100644 index 00000000..23515063 --- /dev/null +++ b/DiscImageChef.Server/docs/Changelog.md @@ -0,0 +1,857 @@ +# [4.5.1.1692] - 2018-07-19 +## Fixed +### - Alcohol 120% disc image +- Correct writing images of Compact Disc >= 60 min +- Correct writing MODE2 tracks to image +- Correct writing TOC to image +- Generation of multisession images +- Generation of pregaps changing tracks + +# [4.5.0.1663] - 2018-06-24 +## Added +### - Alcohol 120% disc image +- 010editor template. +- Support for creating images. + +### - Apple New Disk Image Format +- Support RLE compressed images. + +### - Blindwrite 4 disc image +- 010editor template. +- Information about why this format cannot support writing. + +### - Blindwrite 5 disc image +- 010editor template. +- Information about why this format cannot support writing. + +### - DART disk image +- Support RLE compressed images. + +### - Decoders +- Added Blu-ray DI decoders. +- Support decoding 2048 bytes PFI. + +### - Devices +- On Linux try to open in read/write and exclusive mode, if not retry in readonly. +- On Linux use direct SG_IO. +- Workaround some Blu-ray drives not reporting correct size on READ DISC STRUCTURE. + +### - DiscJuggler disc image +- Information about why this format cannot support writing. + +### - Dumping +- Added support for CD drives that don't return a TOC. +- Added support for CD drives that don't support READ CD command. +- Added support for Compact Disc that don't report tracks. +- Add support for dumping media in any of the now supported writable formats. +- Dump ISRC. +- Dump MCN. +- Fix reading PW subchannels. +- Separate trimming from error retry. +- When dumping CDs in persistent mode, try disabling L-EC check if drive doesn't support TB bit, or doesn't return data with TB bit enabled. +- When dumping, print bad sectors to dump log. + +### - FAT filesystem +- Add list of known boot sector hashes. +- Support Human68k FAT16 BPB. + +### - Filesystems +- Detecting High Performance Optical File System (HPOFS). +- Detecting Microsoft Resilient filesystem (ReFS). +- Detecting PC-FX executable tracks. +- Detecting Xia filesystem. + +### - Apple 2IMG disk image +- Support for creating images. + +### - Anex86 disk image +- Support for creating images. + +### - Apple II interleaved disk image +- Support for creating images. + +### - Apple Universal Disk Image Format +- Support for creating images. +- Support RLE compressed images. + +### - Apridisk disk image +- Support for creating images. + +### - Basic Lisa Utility disk image +- Support for creating images. + +### - cdrdao disc image +- Support for creating images. + +### - CDRWin cuesheet disc image +- Support for creating images. + +### - CisCopy disk image +- Support for creating images. + +### - CloneCD disc image +- Support for creating images. + +### - Digital Research DISKCOPY disk image +- Support for creating images. + +### - DiskCopy 4.2 disk image +- Support for creating images. + +### - IBM SaveDskF disk image +- Support for creating images. + +### - MaxiDisk disk image +- Support for creating images. + +### - NHDr0 disk image +- Support for creating images. + +### - Parallels disk image +- Support for creating images. + +### - QEMU Copy-On-Write disk image +- Support for creating images. + +### - QEMU Copy-On-Write v2 disk image +- Support for creating images. + +### - QEMU Enhanced Disk image +- Support for creating images. + +### - RAW (sector by sector) disk image +- Added geometry and size for ZIP100 and ZIP250. +- Support 2448 bytes/sector and 2352 bytes/sector CD images. +- Support media tags. + +### - Ray Arachelian's disk image +- Support for creating images. + +### - RS-IDE disk image +- Support for creating images. + +### - T98 Hard Disk Image +- Support for creating images. + +### - Virtual98 disk image +- Support for creating images. + +### - VirtualBox disk image +- Added image type and flags. +- Support for creating images. + +### - VirtualPC disk image +- Support for creating images. + +### - VMware disk image +- Support for creating images. + +## Fixes +### - Apple DOS filesystem +- Use Apple II character set encoding. + +### - Apple ProDOS filesystem +- Use Apple IIc character set encoding. + +### - BlindWrite 4 disc image +- Fix incorrect pregap calculation preventing images from showing correct data. + +### - CICM metadata +- Can now get dump hardware information from images. + +### - cdrdao disc image +- Fix audio track endian. +- Fix when disc catalog number uses whole ASCII and not only numeric digits. + +### - CDRWin disc image +- Fix when disc catalog number uses whole ASCII and not only numeric digits. + +### - CloneCD disc image +- Fix when disc catalog number uses whole ASCII and not only numeric digits. + +### - Checksums +- Correct CD ECC. +- Correct CD EDC. +- Fix CRC16 returning a 32-bit value. +- Fix CRC64 endian. +- Fix Fletcher-16. +- Fix Fletcher-32. + +### - Create sidecar +- Add filesystems only to the appropriate partition and track. +- Fix CD Lead-in, TOC and XGD tags. +- Fix diameter setting. +- Fix SCSI MODE SENSE. +- Fix USB descriptors. + +### - DART disk image +- Fixed endian. + +### - Devices +- Fix sending READ LONG commands to ATA devices. +- Fixed crashing with some rogue SCSI MMC firmwares. + +### - Dumping +- Correctly detect CD-i, CD+ and CD-ROM XA. +- Correctly detect Mode 2 Form 1 and Form 2. +- Do not retry when retry passes are zero. +- Do not try to read multisession lead-out/lead-in as they result in errors that are not really there. +- Get correct track flags. +- Retry only the number of times requested. +- Return drive to previous error correction status. +- Send error recovery MODE before retrying sectors. + +### - HDCopy disk image +- Fix sector calculation. + +### - Image comparison +- Fix when sessions are null. + +### - Image verification +- Corrected status printing. + +### - ISO9660 filesystem +- Do not try to read past partition if El Torito indicates image goes beyond limits. +- Fix when root directory is outside of device. +- Skip null terminated strings in ISO9660 fields. + +### - Lisa filesystem +- Corrected character set encoding. + +### - Macintosh filesystem +- Corrected character set encoding. + +### - PC-98 Partition Table +- Prevent some FAT BPBs to false positive as PC-98 partition tables. + +### - RT-11 filesystem +- Use Radix-50 character set encoding. + +### - System V filesystem +- Fix partition bounds. + +### - VirtualPC disk image +- Corrected reading non-allocated blocks. + +## Changes +- Added command to convert disc images. +- Added command to get information about an image and its contents. +- Added D/CAS-25, D/CAS-85 and D/CAS-103 formats. +- Added IRC notifications for Travis CI. +- Added measured dimensions from an UMD. +- Added media types for NEO GEO CD, PC-FX. +- Added new image format designed to store as much information about media as a drive returns: dicformat. +- Added numeric values to media types. +- Added project to create test filesystems on 16-bit OS/2. +- Added project to create test filesystems on 32-bit OS/2. +- Added project to create test filesystems on DOS. +- Added project to create test filesystems on Mac OS. +- Added size of 640MiB magneto-optical disk. +- Added support for writing disc images. +- Compliant with GDPR. +- Corrected floptical geometry to data according to IRIX. +- Do not assume pointers are 32-bit in several Windows device calls. +- Fixed when statistics settings are null. +- Minimum .NET Framework version is now 4.6.1. +- Sort verbs list. +- Support newest XDG Base Directory Specification for Linux. + +# [4.0.1.0] - 2018-01-06 +## Fixes +### Apple DOS and ProDOS interleaved disk images +- Fixed interleaving values. + +### Apple Nibble disk image +- Fixed detection of DOS vs ProDOS sector order. + +### Apple 2IMG disk image +- Fixed deinterleaving of DOS and ProDOS sector order. +- Fixed denibblizing images. + +### Apple ProDOS filesystem +- Fixed detection on Apple II disks. + +### UCSD Pascal filesystem +- Added support for Apple II variants (two physical sectors per logical sector and little endian fields). + +# [4.0.0.0] - 2017-12-25 +## Added +### - Advanced Disc Filing System +- Added support for ADFS-S, ADFS-M, ADFS-L, ADFS-D, ADFS-E, ADFS-E+, ADFS-F, ADFS-F+ and ADFS-G. + +### - Apple Partition Map +- Added support for decoding Driver Description Map. +- Added support for maps without Driver Description Map. +- Added support for old partition table. + +### - Commands +- Added separate application to debug commands sent to devices. +- list-devices: Lists devices that can be used for device dependent commands. +- list-encodings: Lists supported character encodings. + +### - Create Sidecar command +- Added support for hashing DiscFerret flux images. +- Added support for hashing KryoFlux STREAM flux images. +- Added support for hashing SuperCardPro flux images. +- Added support for tape dumps where each tape-file is a separate dumped file. +- Calculate checksum of contents not only of image file. +- Consider each optical disc track as a separate partition. +- Store superblock modification time on sidecar. +- Support tracks. +- Use dump drive information from images that support it. + +### - Decoders +- Xbox DMI. +- Xbox Security Sectors. + +### - Devices +- MMC. +- PCMCIA block devices. +- SCSI Streaming Devices (aka "tapes"). +- SecureDigital. + +### - Device commands +- Add ATA and SCSI commands support for FreeBSD. +- Add ATA commands support for Windows. +- Add retrieval of USB information on Windows. +- Add SecureDigital/MMC commands support for Windows. + +### - Disc images. +- Alcohol 120%. +- Anex86. +- Apple DOS interleaved (.do). +- Apple New Disk Image Format (aka NDIF, aka img, aka DiskCopy 6). +- Apple Nibble (aka NIB). +- Apple ProDOS interleaved (.po). +- Apple Universal Disk Image Format (aka UDIF, aka dmg). +- BlindWrite 4. +- BlindWrite 5. +- CisCopy (aka DC-File or DCF). +- CloneCD. +- CopyQM. +- CPCEMU Disk File. +- CPCEMU Extended Disk File. +- D64. +- D71. +- D81. +- Digital Research's DiskCopy. +- DiscJuggler. +- HD-Copy. +- IBM SaveDskF. +- IMD. +- MAME Compressed Hunks of Data (aka CHD). +- Parallels Hard Disk Image (aka HDD). +- Partclone disk images +- Partimage disk images +- QEMU Copy-On-Write (aka QCOW). +- QEMU Copy-On-Write v2. +- QEMU Enhanced Disk (aka QED). +- Quasi88 (.D77/.D88). +- Ray Arachelian's Disk IMage (.DIM). +- RS-IDE hard disk images. +- Spectrum floppy disk image (.FDI) +- T98. +- VHDX. +- Virtual98. +- VMware. +- X68k .DIM. + +### - DiskCopy 4.2 disk image +- Added support for invalid images that use little-endian values. +- Added support for images created by macOS that don't have a format byte set. +- Use resource fork to get DiskCopy version used to create them. + +### - Dumping +- Added the ability to resume a partially done dump, even on a separate drive. +- Added the ability to skip dumping the Lead-in. +- Allow creation of a separate subchannel file. +- Create dump log. +- Dumping optical media creates an Alcohol 120% descriptor file. +- Raw dump of DVD with Matshita recorders. +- XGD with Kreon drives. + +### - ext2/3/4 filesystem +- Added new superblock fields. +- Added support for devices with sectors bigger than 512 bytes. + +### - FAT filesystem +- Added DEC Rainbow's hard-wired BPB. +- Added support for volumes with 256 bytes/sector. +- Added support for ACT Apricot BPB. +- Gets volume label, creation time and modification time from root directory if available. + +### - Filesystems +- Apple DOS. +- CP/M. +- Detecting AO-DOS. +- Detecting AtheOS. +- Detecting CD-i. +- Detecting Commodore 1540/1541/1571/1581. +- Detecting cram. +- Detecting Cray UNICOS. +- Detecting dump(8) (Old historic BSD, AIX, UFS and UFS2 types). +- Detecting ECMA-67. +- Detecting exFAT. +- Detecting Extent File System (aka SGI EFS). +- Detecting F2FS. +- Detecting FAT+. +- Detecting fossil. +- Detecting HAMMER. +- Detecting High Sierra Format. +- Detecting HP Logical Interchange Format. +- Detecting IBM JFS. +- Detecting Locus. +- Detecting MicroDOS file system. +- Detecting NILFS2. +- Detecting OS-9 Random Block File (aka RBF). +- Detecting Professional File System (aka PFS). +- Detecting QNX 4. +- Detecting QNX 6. +- Detecting Reiser. +- Detecting Reiser4. +- Detecting RT-11. +- Detecting SmartFileSystem (aka SFS, aka Standard File System). +- Detecting Squash. +- Detecting Universal Disk Format (aka UDF). +- Detecting Veritas. +- Detecting VMware. +- Detecting Xbox. +- Detecting XFS. +- Detecting Zettabyte File System (aka ZFS). +- UCSD Pascal. + +### - Filters +- AppleDouble. +- Apple PCExchange. +- AppleSingle. +- BZIP2. +- GZIP. +- LZIP. +- MacBinary. +- XZ. + +### - GUID Partition Table +- New type GUIDs. + +### - ISO9660 filesystem +- Added detection of AAIP extensions. +- Added detection of Apple extensions. +- Added detection of EFI Platform ID for El Torito. +- Added detection of RRIP extensions. +- Added detection of SUSP extensions. +- Added detection of XA extensions. +- Added detection of ziso extensions. + +### - Lisa filesystem +- Full read-only support. + +### - Media types +- DDS, DDS-2, DDS-3, DDS-4. +- HiFD. +- IOMEGA Clik! (aka PocketZip). +- IOMEGA JAZ. +- LS-120, LS-240, FD32MB. +- NEC floppies. +- Old DEC hard disks +- SHARP floppies. +- XGD3. + +### - Partitions +- Acorn FileCore. +- ACT Apricot. +- BSD disklabels. +- DEC disklabels. +- DragonFly BSD. +- Human68k. +- MINIX subpartitions. +- NEC PC-9800. +- Plan9 partition table. +- Rio Karma. +- SGI Disk Volume Headers. +- UNIX hardwired partition tables. +- UNIX VTOC. +- XENIX partition table. + +### - SCSI decoding +- Handling of EVPDs smaller than length field. +- Handling of modes 02h, 04h and 1Ch smaller than expected. +- Prettyfying of mode 0Bh. + +### - SmartFileSystem +- Added support for version 2. + +### - Statistics +- Added version and operating system statistics. + +### - Sun disklabel +- Added bound checks. +- Added support for 16-entries VTOC. +- Added support for pre-VTOC disklabels. +- Corrected structures for 8-entries VTOC. + +### - System V filesystem +- Added COHERENT offsets. +- Check for it starting on second cylinder. +- Corrected cluster size calculation. +- Corrected detection between Release 2 and Release 4. +- Corrected Release 2 superblock parameters. +- Enlarged NICFREE for Version 7. + +### TeleDisk images +- Added support for Advanced Compression. +- Added support for floppy lead-out. +- Added variable sectors per track support. + +## Fixes +### - AmigaDOS filesystem +- Corrected checksum calculation. +- Corrected cluster size calculation. +- Corrected root block location. +- Corrected support for AROS i386 variant that has a PC bootblock before the AmigaDOS bootblock itself. +- Detection on hard disks or with clusters bigger than 1 sector. +- Tested FFS2. + +### - Apple Partition Map +- Added bound checks. +- Added support for decoding Driver Description Map. +- Added support for maps without Driver Description Map. +- Added support for old partition table. +- Corrected partition start when map it's not on start of device. +- Corrected support for misaligned maps, like on CDs. +- Cut partitions that span outside the device. + +### - cdrdao +- Audio track matching. +- Corrected images that start with comments. +- Prevent reading binary files. + +### - CDRWin +- CD-Text detection. +- CD+G data return. +- Fixed composer parsing. +- Prevent reading binary files. + +### - CP/M filesystem +- Corrected cluster count calculation. +- Corrected directory location on CP/M-86. +- Corrected sector reading. +- Skip media types that were never used as a CP/M disk. + +### - Create Sidecar command +- Corrected creation when path is absolute. + +### - Device commands +- Do not send SCSI INQUIRY to non-SCSI paths on Linux. + +### - Device reports +- Call ATA READ LONG last, as it confuses some drives. +- Try SCSI READ LONG (10) until max block size (65535). + +### - DiskCopy 4.2 +- Corrected track order for Lisa and Macintosh Twiggy. + +### - Dreamcast GDI images +- Prevent reading binary files. + +### - Dumping +- Calculation of streaming device dumping speed. +- Corrected dumping CD-R and CD-RW. +- Optical media with 2048 bytes/sector now get ".iso" file extension. +- Retry when SCSI devices return reset status. +- Streaming Devices now store block size changes in metadata sidecar. +- Wait for SCSI devices to exit ASC 28h (MEDIUM CHANGE) status. + +### - ext2/3/4 filesystem +- Use os type as XML system identifier. + +### - FAT filesystem +- Behaviour with some non-compliant media descriptors. +- Corrected 5.25" MD1DD detection. +- Corrected boot code detection. +- Corrected misaligned volumes on optical media. +- Rewritten to better detect Atari, MSX, *-DOS and ANDOS variants. +- Use OEM name as XML system identifier. + +### - Guid Partition Table +- Added bound checks. +- Corrected misaligned tables on optical media. +- Corrected when table is smaller than one sector. + +### - HFS filesystem +- Corrected detection of a PowerPC only bootable volume (no boot sector). +- Corrected misaligned volumes on optical media. +- Corrected volume serial number case. + +### - HFS+ filesystem +- Corrected misaligned volumes on optical media. +- Corrected misalignment of fields in Volume Header. +- Use last mount version as XML system identifier. + +### - HPFS filesystem +- Corrected cluster size. +- Detect boot code. +- Show NT flags. +- Use OEM name as XML system identifier. + +### - ISO9660 filesystem +- Complete rewrite. +- Check that date fields start with a number. + +### - Master Boot Record partitioning scheme +- Check real presence of a GPT. +- Corrected infinite looping on extended partitions. +- Remove disklabels support. +- Support misaligned MBRs on optical media. +- Support NEC extensions. +- Support OnTrack extensions. + +### - MINIX filesystem +- Added support for v1 and v2 created on MINIX 3. +- Corrected misaligned volumes on optical media. + +### - Nero Burning ROM +- Corrected track handling. +- Corrected typo on parsing v2 images. +- Disc types. +- Do not identify positively if footer version is unknown. +- Lead-In handling. +- Mode2 RAW sectors. +- Session count. + +### - NeXT partition table +- Added missing fields. +- Corrected offsets. +- Cut partitions that span outside the device. + +### - ODS filesystem +- Corrected cluster size calculation. +- Corrected misaligned volumes on optical media. + +### - ProDOS filesystem +- Corrected cluster size calculation. +- Corrected misaligned volumes on optical media. +- Volume size. + +### - Rigid Disk Block partition scheme +- Corrected AMIX mappings. + +### - SCSI decoding +- Handling of EVPDs smaller than length field. +- Handling of modes 02h, 04h and 1Ch smaller than expected. +- Prevented overflow on MMC FEATURES decoding. +- Prevented overflow on SCSI MODE PAGE decoding. + +### - SmartFileSystem +- Added support for version 2. + +### - Sun disklabel +- Added bound checks. +- Corrected structures for 8-entries VTOC. + +### - System V filesystem +- Check for it starting on second cylinder. +- Corrected cluster size calculation. +- Corrected detection between Release 2 and Release 4. +- Corrected Release 2 superblock parameters. +- Enlarged NICFREE for Version 7. + +### - UFS filesystem +- Corrected superblock locations. +- Move superblock to a single structure and marshal it, corrects detection of several variants. + +## Changes +- Added a public changelog. +- Added a side application to create device reports under Linux without a .NET environment. +- Added operating system version statistics. +- Added partitioning scheme name to partition structures. +- Added several internal tests to prevent regression on changes. +- Added support for different character encodings. +- Added support for filters. +- Added support for nested partitioning schemes. +- Added support for propagating disk geometry, needed by PC-98 partitions and old MBRs. +- Better support for decoding multibyte encodings from C, Pascal and space-padded strings. +- Changed handling of compressed files, using temporary files and caching. +- Corrected casting on big-endian marshalling that was failing on some .NET Framework versions. +- Corrected filter list reuse. +- Disabled EDC check on CDs because it is not working (TODO). +- Filesystems now have access to full partition structure. +- Filters no longer return their own extension when requested for filename. +- Moved Claunia.RsrcFork to NuGet. +- Priam tags. +- Support drive firmware inside disc images. +- Support subchannel with only Q channel. + +# [3.0.0.0] - 2016-07-19 +## Added +### - Commands +- benchmark: Tests speed for checksum algorithms. +- create-sidecar: Creates an XML sidecar with metadata. +- decode: Decodes and prints a disk tag present on the image. +- device-info: Prints device information. +- dump-media: Dumps media to a disk image. +- entropy: Calculates disk entropy. +- media-info: Prints media information. +- scan-media: Scans media for errors. + +### - Checksums +- Adler-32 +- SpamSum + +### - Devices +- ATA on Linux. +- ATA on Windows (untested). +- FireWire on Linux. +- SCSI on Linux. +- SCSI on Windows (untested). +- USB on Linux. + +### - Disc images +- Apple 2IMG. +- CDRDAO. +- Dreamcast GDI. +- VirtualPC. + +### - Fast File System (FFS) +- Atari UNIX variant. + +### - Filesystems +- Acorn ADFS. +- AmigaDOS. +- Apple File System, aka APFS. +- Apple ProDOS. +- btrfs. +- Nintendo Gamecube. +- Nintendo Wii. + +### - Partitions +- Amiga Rigid Disk Block (aka RDB). +- Atari. +- Sun. +- (U)EFI GPT. + +## Changes +### - PrintHex command +- Allow to print several sectors. + +## Fixes +### - Be filesystem +- Endianness. +- Support for Be CDs. + +### - CDRWin disk image +- Behaviour on .NET Framework. +- Detection of CD-ROM XA. +- Flags. +- Partition calculations. + +### - Fast File System (FFS) +- False positives with 7th Edition. + +### - ISO9660 +- Dreamcast IP.BIN decoding. +- Sega CD IP.BIN decoding. + +### - System V Filesystem +- Big endian support + +# [2.20] - 2014-08-28 +## Added +### - Checksums +- Reed Solomon. + +## Fixes +### - Apple Partition Map +- Disks with 2048 bytes/sector but a 512 bytes/sector map. + +### - HFS +- Disks with 2048 bytes/sector but a 512 bytes/sector filesystem. + +# [2.10] - 2014-08-25 +## Added +### - Checksums +- CD EDC and ECC. +- CRC16. + +### - Commands +- Verify: Verifies disk image contents, if supported. + +### - Disc images +- Nero Burning ROM. + +# [2.0] - 2014-07-03 +## Added +### - Commands +- analyze: Gives informatio about disk image contents as well as detecting partitions and filesystems. +- checksum: Generates CRC32, CRC64, RIPEMD160, MD5, SHA1, SHA256, SHA384 and SHA512 checksums of disk image contents. +- compare: Compares two media images. +- printhex: Prints a hexadecimal output of a sector. + +### - Disc images +- RAW (sector by sector). + +### - Media types +- BD-R. +- BD-RE XL. +- FDFORMAT. + +## Fixes +### - FAT filesystem +- Workaround FAT12 without BIOS Parameter Block. + +### - MBR partitions +- Do not search for them on disks with less than 512 bytes/sector. + +### - ODS-11 filesystem +- Do not search for them on disks with less than 512 bytes/sector. + +# [1.10] - 2014-04-21 +## Added +### - Disc images +- Sydex TeleDisk. + +# [1.0] - 2014-04-17 +## Added +### - Filesystems +- Detecting BeFS. +- Detecting ext. +- Detecting ext2. +- Detecting ext3. +- Detecting ext4. +- Detecting FAT12. +- Detecting FAT16. +- Detecting FAT32. +- Detecting FFS. +- Detecting HFS+. +- Detecting HFS. +- Detecting HPFS. +- Detecting ISO9660. +- Detecting LisaFS. +- Detecting MFS. +- Detecting MinixFS. +- Detecting NTFS. +- Detecting ODS-11. +- Detecting Opera. +- Detecting PCEngine. +- Detecting SolarFS. +- Detecting System V. +- Detecting UFS. +- Detecting UFS2. +- Detecting UnixWare boot. + +### - Disc images +- Apple DiskCopy 4.2. +- CDRWin. + +### - Partitions +- Apple Partition Map (aka APM). +- Master Boot Record (aka MBR). +- NeXT disklabels. + +[4.5.1.1692]: https://github.com/claunia/DiscImageChef/releases/tag/v4.5.1.1692 +[4.5.0.1663]: https://github.com/claunia/DiscImageChef/releases/tag/v4.5.0.1663 +[4.0.1.0]: https://github.com/claunia/DiscImageChef/releases/tag/v4.0.1.0 +[4.0.0.0]: https://github.com/claunia/DiscImageChef/releases/tag/v4.0.0.0 +[3.0.0.0]: https://github.com/claunia/DiscImageChef/releases/tag/v3.0.0.0 +[2.20]: https://github.com/claunia/DiscImageChef/releases/tag/v2.2 +[2.10]: https://github.com/claunia/DiscImageChef/releases/tag/v2.1 +[2.0]: https://github.com/claunia/DiscImageChef/releases/tag/v2.0 diff --git a/DiscImageChef.Server/docs/DONATING.md b/DiscImageChef.Server/docs/DONATING.md new file mode 100644 index 00000000..0349792f --- /dev/null +++ b/DiscImageChef.Server/docs/DONATING.md @@ -0,0 +1,174 @@ +Hardware donations +================== + +This is a list of hardware that I'm searching but is too rare or too expensive for me to get them. +The reason I want this hardware is because having it is the only way to add enhanced support for them (e.g. media detection, ECC support, raw dumping, etc.). +After adding enhanced support all drives will be given to the Canary Islands Computer Museum. + +- 3.5" magneto-optical media: 540MiB, 1.3GiB +- 5.25" magneto-optical drive and media +- 8" shugart drive +- ADR drive and tapes +- AIT drive and tapes +- Apple twiggy and media +- Caleb UHD144 drive +- Castlewood Orb 2.2 and 5.7 +- DLT drive and tapes +- DiscFerret +- HD-DVD media +- Host-aware and host-controller SAS and SATA zoned hard disks +- Insite floptical drive +- Iomega Bernoulli +- Iomega Ditto drive and tapes +- Iomega JAZ and JAZ 2 +- Iomega REV +- Iomega ZIP750 drive +- LD-ROM drive and media +- LTO drive and tapes +- LV-ROM drive and media +- Mammoth drive and tapes +- Panasonic Blu-ray recorder +- Plasmon UDO and UDO2 drives and media +- SCSI floppy drive (e.g. Teac FD235JS806-U) +- SLR drive and tapes +- Sony Hi-MD and media +- Sony HiFD +- Sony MD-DATA and media +- Sony Professional Disc for DATA +- Stringy floppy +- Syquest EZ135 drive and media +- Syquest EZFlyer drive and media +- Syquest Quest drive and media +- Syquest SQ2542 drive and media +- Syquest SQ306RD drive and SQ100 media +- Syquest SQ3105 drive and SQ310 media +- Syquest SQ312RD drive and SQ200 media +- Syquest SQ319RD drive and SQ300 media +- Syquest SQ3270 drive and SQ327 media +- Syquest SQ5110 drive and SQ800 media +- Syquest SQ5200C drive and SQ2000 media +- Syquest SQ555 drive and SQ400 media +- Syquest SparQ drive and media +- Syquest SyJet drive and media +- T9840, T9940, T10000 drive and tapes +- Travan drive and tapes +- Triton drive and media +- VXA drive and tapes + + +Software donations +================== +This is a list of software whose physical media has some characteristics that needs +to be investigated to allow correct dumping of such characteristics. Usually those +are copy protections. + +- CD-V +- CD-i Ready + - A Christmas Songbook + - Accelerator + - Alien Gate + - Beyond Limits + - Escape + - Lucky Luke + - Louis Armstrong + - Dark Fables of Aesop + - More Dark Fables of Aesop + - Mozart + - Opera Imaginaire + - Pavarotti + - Steel Machine + - The Apprentice + - Dimo's Quest + - The Worlds of... +- SafeDisc + - Age of Wonders II: The Wizard's Throne + - Beowulf + - Black & White 2 + - Brothers in Arms: Road to Hill 30 + - Call of Duty: World at War + - Carmageddon II: Carpocalypse Now + - Close Combat: Invasion Normandy + - Codename: Eagle + - Command & Conquer: Generals + - FIFA Football 2002 + - Football Manager 2007 +- SecuROM + - Arabian Nights + - Arcania: Gothic 4 + - Boiling Point: Road to Hell + - Caesar IV + - Cars 2 + - Clive Barker's Jericho + - Colin McRae Rally 04 + - Colin McRae Rally 2.0 + - Colin McRae Rally 3 + - Command & Conquer: Red Alert 3 - Uprising + - Commandos: Strike Force + - Devil May Cry 4 + - Die Hard: Nakatomi Plaza + - Disney Planes + - Divinity II: Developer's Cut +- StarForce + - Anno 1701 + - Black Mirror 3 + - BloodRayne 2 + - Chronostorm: Siberian Border + - Codename: Outbreak + - Dead to Rights + - Disciples III: Renaissance + - Game of Thrones + - Gothic 3 + - Gothic 3: Forsaken Gods + - Mass Effect + - Mount & Blade + - Pac-Man World 2 +- Tages + - Act of War: High Treason + - Anno 1701 + - Beyond Good & Evil + - Codename: Panzers - Cold War + - Darkstar One + - Desperados 2: Cooper's Revenge + - Driver: Parallel Lines + - Faery: Legends of Avalon + - Fahrenheit + - Fantasy Wars + - Glory of the Roman Empire + - Gothic 3 + - Hard to Be a God + - Helldorado + - Moto Racer 3 + - Nail'd + - Nostradamus: The Last Prophecy + - Rag Doll Kung Fu + - Rayman Origins + - RoboCop (2003) + - Runaway 2: The Dream of the Turtle + - S.T.A.L.K.E.R.: Shadow of Chernobyl + - Secret Files: Tunguska + - Silverfall + - SpellForce 2: Shadow Wars + - Still Life 2 + - The Chronicles of Riddick: Assault on Dark Athena + - War Front: Turning Point + - XIII +- Solidshield + - A-Train 8 + - Anno 2070 + - Assassin's Creed: Brotherhood + - Crysis 2 + - Dead Mountaineer's Hotel + - Dead Space 2 + - Hard to Be a God + - Helldorado + - I Am Alive + - Jack Keane + - James Cameron's Avatar: The Game + - Medal of Honor: Airborne + - Need for Speed: Hot Pursuit + - ObsCure II + - Risen + - Shift 2 Unleashed + - Still Life 2 + - Warfare + - X3: Terran Conflict \ No newline at end of file diff --git a/DiscImageChef.Server/docs/ISSUE_TEMPLATE.md b/DiscImageChef.Server/docs/ISSUE_TEMPLATE.md new file mode 120000 index 00000000..cc358d41 --- /dev/null +++ b/DiscImageChef.Server/docs/ISSUE_TEMPLATE.md @@ -0,0 +1 @@ +../../.github/ISSUE_TEMPLATE.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/NEEDINFO.md b/DiscImageChef.Server/docs/NEEDINFO.md new file mode 120000 index 00000000..2765be7e --- /dev/null +++ b/DiscImageChef.Server/docs/NEEDINFO.md @@ -0,0 +1 @@ +../../NEEDINFO.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/PULL_REQUEST_TEMPLATE.md b/DiscImageChef.Server/docs/PULL_REQUEST_TEMPLATE.md new file mode 120000 index 00000000..2a746206 --- /dev/null +++ b/DiscImageChef.Server/docs/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1 @@ +../../.github/PULL_REQUEST_TEMPLATE.md \ No newline at end of file diff --git a/DiscImageChef.Server/docs/README.md b/DiscImageChef.Server/docs/README.md new file mode 100644 index 00000000..e3d58cbb --- /dev/null +++ b/DiscImageChef.Server/docs/README.md @@ -0,0 +1,254 @@ +DiscImageChef v4.5.99.1693 + +Disc Image Chef (because "swiss-army-knife" is used too much) + +Copyright © 2011-2018 Natalia Portillo + +[![Build status](https://dev.azure.com/DiscImageChef/DiscImageChef/_apis/build/status/DiscImageChef-.NET%20Desktop-CI)](https://dev.azure.com/DiscImageChef/DiscImageChef/_build/latest?definitionId=4) +[![Build Status](https://travis-ci.org/claunia/DiscImageChef.svg?branch=master)](https://travis-ci.org/claunia/DiscImageChef) +[![Build status](https://ci.appveyor.com/api/projects/status/vim4c8h028pn5oys?svg=true)](https://ci.appveyor.com/project/claunia/discimagechef) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fclaunia%2FDiscImageChef.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fclaunia%2FDiscImageChef?ref=badge_shield) + +You can see statistics and device reports [here](https://www.discimagechef.app/Statistics.aspx) + +DiscImageChef is a fully featured media dump management solution. You usually know media dumps +as disc images, disk images, tape images, etc. + +With DiscImageChef you can analyze a media dump, extract files from it (for supported +filesystems), compare two of them, create them from real media using the appropriate drive, +create a sidecar metadata with information about the media dump, and a lot of other features +that commonly would require you to use separate applications. + +To see last changes, check the [changelog](Changelog.md). +To see list of pending things to do, check the [TODO list](TODO.md). + +If you want to contribute in any way please read the [contributing guide](CONTRIBUTING.md). + +System requirements +=================== +DiscImageChef should work under any operating system where there is [Mono](http://www.mono-project.com/) +or [.NET Framework](https://www.microsoft.com/net/download). +It has been tested using Mono 5.0 and .NET Framework 4.6.1. However recommended versions are +Mono 5.8 and .NET Framework 4.7.1. .NET Core is unsupported. + +Usage +===== + +DiscImageChef.exe + +And read help. + +Or read the [wiki](https://github.com/claunia/DiscImageChef/wiki). + +Features +======== +* Analyzes a disk image getting information about the disk itself and analyzes partitions and filesystems inside them +* Can checksum the disks (and if optical disc, separate tracks) user-data (tags and metadata coming soon) +* Can compare two disk images, even different formats, for different sectors and/or metadata +* Can list and extract contents from filesystems that support that +* Can read several disk image formats. +* Can read several known sector by sector formats with variable bytes per sector. +* Can read standard sector by sector copies for optical and magnetic discs with constant bytes per sector. +* Can verify sectors or disk images if supported by the underlying format + +Supported disk image formats (read-only) +======================================== +* Apple Disk Archival/Retrieval Tool (DART) +* Apple II nibble images (NIB) +* BlindWrite 4 TOC files (.BWT/.BWI/.BWS) +* BlindWrite 5/6 TOC files (.B5T/.B5I and .B6T/.B6I) +* CopyQM +* CPCEMU Disk file and Extended Disk File +* Dave Dunfield IMD +* DiscJuggler images +* Dreamcast GDI +* HD-Copy disk images +* MAME Compressed Hunks of Data (CHD) +* Microsoft VHDX +* Nero Burning ROM (both image formats) +* Partclone disk images +* Partimage disk images +* Quasi88 disk images (.D77/.D88) +* Spectrum floppy disk image (.FDI) +* TeleDisk +* X68k DIM disk image files (.DIM) + +Supported disk image formats (read and write) +============================================= +* Alcohol 120% Media Descriptor Structure (.MDS/.MDF) +* Anex86 disk images (.FDI for floppies, .HDI for hard disks) +* Any 512 bytes/sector disk image format (sector by sector copy, aka raw) +* Apple 2IMG (used with Apple // emulators) +* Apple DiskCopy 4.2 +* Apple ][ Interleaved Disk Image +* Apple Universal Disk Image Format (UDIF), including obsolete (previous than DiskCopy 6) versions +* Apridisk disk image formats (for ACT Apricot disks) +* Basic Lisa Utility +* CDRDAO TOC sheets +* CDRWin cue/bin cuesheets, including ones with ISOBuster extensions +* CisCopy disk image (aka DC-File, .DCF) +* CloneCD +* DataPackRat's d2f/f2d disk image format ("WC DISK IMAGE") +* Digital Research DiskCopy +* DiscImageChef format +* IBM SaveDskF +* MAXI Disk disk images (HDK) +* Most known sector by sector copies of floppies with 128, 256, 319 and 1024 bytes/sector. +* Most known sector by sector copies with different bytes/sector on track 0. +* Parallels Hard Disk Image (HDD) version 2 +* QEMU Copy-On-Write versions 1, 2 and 3 (QCOW and QCOW2) +* QEMU Enhanced Disk (QED) +* Ray Arachelian's Disk IMage (.DIM) +* RS-IDE hard disk images +* Sector by sector copies of Microsoft's DMF floppies +* T98 hard disk images (.THD) +* T98-Next hard disk images (.NHD) +* Virtual98 disk images +* VirtualBox Disk Image (VDI) +* Virtual PC fixed size, dynamic size and differencing (undo) disk images +* VMware VMDK and COWD images +* XDF disk images (as created by IBM's XDFCOPY) + +Supported partitioning schemes +============================== +* Acorn Linux and RISCiX partitions +* ACT Apricot partitions +* Amiga Rigid Disk Block (RDB) +* Apple Partition Map +* Atari AHDI and ICDPro +* BSD disklabels +* BSD slices inside MBR +* DEC disklabels +* DragonFly BSD 64-bit disklabel +* EFI GUID Partition Table (GPT) +* Human68k (Sharp X68000) partitions table +* Microsoft/IBM/Intel Master Boot Record (MBR) +* Minix subpartitions inside MBR +* NEC PC9800 partitions +* NeXT disklabel +* Plan9 partition table +* Rio Karma partitions +* SGI volume headers +* Solaris slices inside MBR +* Sun disklabel +* UNIX VTOC and disklabel +* UNIX VTOC inside MBR +* Xbox 360 hard coded partitions +* XENIX partition table + +Supported file systems for read-only operations +=============================================== +* Apple DOS file system +* Apple Lisa file system +* Apple Macintosh File System (MFS) +* CP/M file system +* U.C.S.D Pascal file system + +Supported file systems for identification and information only +============================================================== +* 3DO Opera file system +* Acorn Advanced Disc Filing System +* Alexander Osipov DOS (AO-DOS for Electronika BK-0011) file system +* Amiga Fast File System v2, untested +* Amiga Fast File System, with international characters, directory cache and multi-user patches +* Amiga Original File System, with international characters, directory cache and multi-user patches +* Apple File System (preliminary detection until on-disk layout is stable) +* Apple Hierarchical File System (HFS) +* Apple Hierarchical File System+ (HFS+) +* Apple ProDOS / SOS file system +* AtheOS file system +* BeOS filesystem +* BSD Fast File System (FFS) / Unix File System (UFS) +* BSD Unix File System 2 (UFS2) +* B-tree file system (btrfs) +* CD-i file system +* Coherent UNIX file system +* Commodore 1540/1541/1571/1581 filesystems +* Cram file system +* DEC Files-11 (only checked with On Disk Structure 2, ODS-2) +* DEC RT-11 file system +* dump(8) (Old historic BSD, AIX, UFS and UFS2 types) +* ECMA-67: 130mm Flexible Disk Cartridge Labelling and File Structure for Information Interchange +* Flash-Friendly File System (F2FS) +* Fossil file system (from Plan9) +* HAMMER file system +* High Performance Optical File System (HPOFS) +* High Sierra Format +* HP Logical Interchange Format +* IBM Journaling File System (JFS) +* ISO9660 +* Linux extended file system +* Linux extended file system 2 +* Linux extended file system 3 +* Linux extended file system 4 +* Locus file system +* MicroDOS file system +* Microsoft 12-bit File Allocation Table (FAT12), including Atari ST extensions +* Microsoft 16-bit File Allocation Table (FAT16) +* Microsoft 32-bit File Allocation Table (FAT32), including FAT+ extension +* Microsoft Extended File Allocation Table (exFAT) +* Microsoft/IBM High Performance File System (HPFS) +* Microsoft New Technology File System (NTFS) +* Microsoft Resilient File System (ReFS) +* Minix v2 file system +* Minix v3 file system +* NEC PC-Engine executable +* NEC PC-FX executable +* NILFS2 +* Nintendo optical filesystems (GameCube and Wii) +* OS-9 Random Block File +* Professional File System +* QNX4 and QNX6 filesystems +* Reiser file systems +* SGI Extent File System (EFS) +* SGI XFS +* SmartFileSystem +* SolarOS file system +* Squash file system +* UNICOS file system +* Universal Disk Format (UDF) +* UNIX System V file system +* UNIX Version 7 file system +* UnixWare boot file system +* Veritas file system +* VMware file system (VMFS) +* Xbox filesystems +* Xenix file system +* Xia filesystem +* Zettabyte File System (ZFS) + +Supported checksums +=================== +* Adler-32 +* CRC-16 +* CRC-32 +* CRC-64 +* Fletcher-16 +* Fletcher-32 +* MD5 +* RMD160 +* SHA-1 +* SHA-2 (256, 384 and 512 bits) +* SpamSum (fuzzy hashing) + +Supported filters +================= +* Apple PCExchange (FINDER.DAT & RESOURCE.FRK) +* AppleDouble +* AppleSingle +* BZip2 +* GZip +* LZip +* MacBinary I, II, III +* XZ + +Partially supported disk image formats +====================================== +These disk image formats cannot be read, but their contents can be checksummed on sidecar creation +* DiscFerret +* KryoFlux STREAM +* SuperCardPro + + +## License +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fclaunia%2FDiscImageChef.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fclaunia%2FDiscImageChef?ref=badge_large) \ No newline at end of file diff --git a/DiscImageChef.Server/docs/TODO.md b/DiscImageChef.Server/docs/TODO.md new file mode 100644 index 00000000..1a4f4fb3 --- /dev/null +++ b/DiscImageChef.Server/docs/TODO.md @@ -0,0 +1,83 @@ +* Add checksum support for Apple NIB images. (https://github.com/claunia/DiscImageChef/issues/105) +* Add checksum support for NDIF images. (https://github.com/claunia/DiscImageChef/issues/88) +* Add checksum support for partclone images. (https://github.com/claunia/DiscImageChef/issues/89) +* Add checksum support for partimage images. (https://github.com/claunia/DiscImageChef/issues/90) +* Add detection of bootable UDF filesystems. (https://github.com/claunia/DiscImageChef/issues/91) +* Add filter for 7-Zip archives. (https://github.com/claunia/DiscImageChef/issues/92) +* Add filter for ZIP archives. (https://github.com/claunia/DiscImageChef/issues/93) +* Add flux decoding for DiscFerret images. (https://github.com/claunia/DiscImageChef/issues/49) +* Add flux decoding for KryoFlux images. (https://github.com/claunia/DiscImageChef/issues/50) +* Add flux decoding for SuperCardPro images. (https://github.com/claunia/DiscImageChef/issues/99) +* Add interface for floppy bitstream decoding. (https://github.com/claunia/DiscImageChef/issues/94) +* Add raw dump for Plextor recorders. (https://github.com/claunia/DiscImageChef/issues/100) +* Add support for 82077 floppy controllers. (https://github.com/claunia/DiscImageChef/issues/101) +* Add support for AIX partitioning scheme. (https://github.com/claunia/DiscImageChef/issues/7) +* Add support for CD-Text in Nero images. (https://github.com/claunia/DiscImageChef/issues/104) +* Add support for compressed Ciscopy images. (https://github.com/claunia/DiscImageChef/issues/127) +* Add support for compressed DART images. (https://github.com/claunia/DiscImageChef/issues/68) +* Add support for compressed MAME CHD version 5 images. (https://github.com/claunia/DiscImageChef/issues/106) +* Add support for compressed MAME CompactDisc images. (https://github.com/claunia/DiscImageChef/issues/107) +* Add support for compressed NDIF images. (https://github.com/claunia/DiscImageChef/issues/68) +* Add support for compressed SaveDskF images. (https://github.com/claunia/DiscImageChef/issues/108) +* Add support for compressed UDIF images. (https://github.com/claunia/DiscImageChef/issues/70) +* Add support for compressed VMware images. (https://github.com/claunia/DiscImageChef/issues/109) +* Add support for CSS encrypted DVD dumping. (https://github.com/claunia/DiscImageChef/issues/110) +* Add support for decoding Apple GCR bitstreams. (https://github.com/claunia/DiscImageChef/issues/95) +* Add support for decoding Commodore GCR bitstreams. (https://github.com/claunia/DiscImageChef/issues/96) +* Add support for decoding FM bitstreams. (https://github.com/claunia/DiscImageChef/issues/97) +* Add support for decoding MFM bitstreams. (https://github.com/claunia/DiscImageChef/issues/98) +* Add support for detecting FireWire devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/111) +* Add support for detecting FireWire devices in Windows. (https://github.com/claunia/DiscImageChef/issues/125) +* Add support for detecting USB devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/112) +* Add support for differencing QCOW2 images. (https://github.com/claunia/DiscImageChef/issues/142) +* Add support for differencing QCOW images. (https://github.com/claunia/DiscImageChef/issues/143) +* Add support for differencing QED images. (https://github.com/claunia/DiscImageChef/issues/144) +* Add support for DiscFerret devices. (https://github.com/claunia/DiscImageChef/issues/140) +* Add support for dumping CD Lead-In in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/113) +* Add support for encrypted NDIF images. (https://github.com/claunia/DiscImageChef/issues/149) +* Add support for encrypted QCOW2 images. (https://github.com/claunia/DiscImageChef/issues/145) +* Add support for encrypted QCOW images. (https://github.com/claunia/DiscImageChef/issues/146) +* Add support for encrypted VMware images. (https://github.com/claunia/DiscImageChef/issues/147) +* Add support for KryoFlux devices. (https://github.com/claunia/DiscImageChef/issues/141) +* Add support for Linear Media PCMCIA devices. (https://github.com/claunia/DiscImageChef/issues/148) +* Add support for MAME CHD images of PCMCIA devices. (https://github.com/claunia/DiscImageChef/issues/150) +* Add support for NetApp WAFL filesystem. (https://github.com/claunia/DiscImageChef/issues/61) +* Add support for NetWare 286 filesystem. (https://github.com/claunia/DiscImageChef/issues/117) +* Add support for NetWare 386 filesystem. (https://github.com/claunia/DiscImageChef/issues/118) +* Add support for Novell Storage Services filesystem. (https://github.com/claunia/DiscImageChef/issues/119) +* Add support for NVMe devices. (https://github.com/claunia/DiscImageChef/issues/151) +* Add support for OCFS2 filesystem. (https://github.com/claunia/DiscImageChef/issues/153) +* Add support for packed subchannel in BlindWrite 4 images. (https://github.com/claunia/DiscImageChef/issues/154) +* Add support for packed subchannel in BlindWrite 5 images. (https://github.com/claunia/DiscImageChef/issues/155) +* Add support for Parallel ATA devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/114) +* Add support for PCMCIA devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/115) +* Add support for PCMCIA devices in Windows. (https://github.com/claunia/DiscImageChef/issues/126) +* Add support for reading resource fork in macOS. (https://github.com/claunia/DiscImageChef/issues/156) +* Add support for reading resource fork in Windows. (https://github.com/claunia/DiscImageChef/issues/157) +* Add support for SecureDigital and MultiMediaCard devices in FreeBSD. (https://github.com/claunia/DiscImageChef/issues/116) +* Add support for SuperCardPro devices. (https://github.com/claunia/DiscImageChef/issues/139) +* Add support for XPACK images. (https://github.com/claunia/DiscImageChef/issues/45) +* Checksum disk tags +* Checksum long sectors +* Checksum sector tags +* Compare sector tags +* Finish support for reading sectors of variable bytes/sector images +* Graphical User Interface +* Handle UDIF image comments. (https://github.com/claunia/DiscImageChef/issues/137) +* Implement Apple KenCode compression algorithm. (https://github.com/claunia/DiscImageChef/issues/122) +* Implement Apple LZFSE compression algorithm. (https://github.com/claunia/DiscImageChef/issues/124) +* Implement Apple LZH compression algorithm. (https://github.com/claunia/DiscImageChef/issues/121) +* Implement COLUMBIA ordering in CP/M filesystem. (https://github.com/claunia/DiscImageChef/issues/133) +* Implement CYLINDERS ordering in CP/M filesystem. (https://github.com/claunia/DiscImageChef/issues/132) +* Implement dumping GameCube discs. (https://github.com/claunia/DiscImageChef/issues/135) +* Implement dumping Wii discs. (https://github.com/claunia/DiscImageChef/issues/136) +* Implement EAGLE ordering in CP/M filesystem. (https://github.com/claunia/DiscImageChef/issues/131) +* Implement ODS checksum. (https://github.com/claunia/DiscImageChef/issues/130) +* Implement StuffIt compression algorithm. (https://github.com/claunia/DiscImageChef/issues/123) +* Offer the option to see differing values +* Optimize and multithread image comparison +* Optimize current checksum multithreading +* Support AAP extensions in MBR. (https://github.com/claunia/DiscImageChef/issues/159) +* Support IBM boot manager in MBR. (https://github.com/claunia/DiscImageChef/issues/128) +* Support MMC feature codes FF33h +* Support SCSI mode pages 18h, 1Dh, 20h, 31h, 32h \ No newline at end of file diff --git a/DiscImageChef.Server/fonts/.htaccess b/DiscImageChef.Server/fonts/.htaccess new file mode 100644 index 00000000..4114709c --- /dev/null +++ b/DiscImageChef.Server/fonts/.htaccess @@ -0,0 +1 @@ +IndexIgnore * \ No newline at end of file diff --git a/DiscImageChef.Server/fonts/ChicagoFLF.eot b/DiscImageChef.Server/fonts/ChicagoFLF.eot new file mode 100644 index 0000000000000000000000000000000000000000..d4b6a6efd383c01cad96875ccc691697d196c2ef GIT binary patch literal 48740 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 BigW+~ literal 0 HcmV?d00001 diff --git a/DiscImageChef.Server/fonts/ChicagoFLF.woff b/DiscImageChef.Server/fonts/ChicagoFLF.woff new file mode 100644 index 0000000000000000000000000000000000000000..f720602628f539c199e8113401ee75cdbf6e96dd GIT binary patch literal 23560 zcmXT-cXMN4WME)mh~Z!m0MUEDfJkiE%`L>2fg$=00|SE$2q(3!$a8mbbz@+NKEuGk zAP2_kOj-WH`bG>4j4v1%7=joW7!pi$|A;5&CKfO-uy!yoaPDPb5SaJjueMimS&0Gz zgMb4A1A_zzb6jJLODjmvWnkdHij!hL|G)ZQ{Kh&X2GTl?EXz74A3>(eMaf}iCVK%W@*16gmrKM?zq5Zr zL}|`rEobF5%J*%~u&=zzo8dEeVP5d;uucvI6 zr@}ln;p=tF1MaS@-uAV2=daK6tnfU*|E!Ar++78s$`EhK+i{O(&$;n0u=D2}&i(Ftm6Shs7VPu;x#Rt##e4a8*{NRq zo}Cjm$#m1U8S$O7j{Tgv{$%aN8v^^n%Y`gWwsL=t^Ld`7n;vofo8H%*eQzsrr@#83 zTbahRb1Q8!@UsZh3}ZWw%=P>_y9NPw~b& z(E#-e$1Yv-t|}Ma%Kd2H&4`=tjbb1CP*G18Jiq6~REdxCI=_0aIsBLT#LDRv+w-0O z^YX6Hw0d_oQ2xTBcNa9@Gx!?c+5N@CG-&sA4`-Y3*(NO2Z%;Uy?=X2&yCflg`Hv~z zqh3t-vA6YS*c!7H&A(dA7wK>WrBwK<#EaG*zcMjG_S=KG_g8=aQ(ymkg?)+h*-Msh z-X|9D&be-K=6^jS=R*_8id%1|mzRiK7d`fVuH;2#BiV(uXU=4WdoV?Q5wcQpNMT+i z5umZ?mXWKgBen%lx7{2$cZ|jX4WVC`$oblm9p?jirXe%cyz(U`sY2n zK7YTWnos`!&dmF4egEpZvU6v?@2kEat<+`Re zzrOu7w#woD^7)s}zxw{Q{a12xFPGbzz`H9_k4SENXnd(h%#D5V=8IQfq@_qT_cR~# zd_1Y}tcF3}(E^{T68-L{dum>4#La6N+Q(<5_-;#!C|>jQn$_zSrFVYa z+LcLd%NygtiL~d(u1#SKR*54_tWm{-EYT# zt^U1THOz0#L>tqi(~H&x=4AzCeZF$7aap5T4(5*IWOq04bOqh8>g zcPMvE->tUqxA=T*j{P3O zvM%+8-e*KBlcq-K`*l`7S{QkFP4=*6-Mtmdq?E@ z>ucq&ca|#kE0rrRov1zWypp`Dp9`P+HxVj}Y*v5g*7@nHANDNYWi@y1H$Us;YbQT5DH4)dpKLuX`1s1m zvSn{PZa&-8n<{-OPJ4Eg*}j~Lm)c8%y^c@4rnNT2Xmd)$$pw?1dqqtT(eKn<84|S6 zMW0VxUgI49dam^x&s(RrPj7kNvb=S9Tk&DxL&?ssoz}O9wNGnLYfo!k*5=l_$=TT{ za$)1bx`k%~z6bmcXb!0P5ceVPgWm>)3fl_PAE_UT7d?<~THb8kbh}x*sq)}0bFO@m zJ39&e&5&l<%fj9`$9U(A zw@)2hugE(Tvaaj;rJN!2VZlF^SqwER{FLR*YI+-q5H z$$oK&Wq8ZYwm`3mkI6Z(ec{anmRHdiE^_^1`z3V3@vm-)(t*F1;ulOl=yRpM`5fCP z$^Gr?0xvMXP-C@inHPLP`9v8Ab8cUYnN?<*m-4kfAZs}7kiPy`{25exBU6UX^ zi#=@7H>d3yH~9ZboJjX>iDPxmn)}6)t4?f}!@hDGkn;=d^D1zMzA; z3s*OO5kJ3dKjXF4rq|6IdRN?bG}qq2T%vuWZBxji1;qKbpt9V^FPI@EPJN~unCj2zc z()_`iF{g>$X`^4;+D(~1L~LYcEt_Cz8l{mE*UQJ{<}W$7;mlu+jBwWE*xo!YIqs?7 zr*!^uU9qR%QS1IOM^^uac_AnENQ)m(om%~PR#QE%ZommUg9*{j&&s&YWv_XVc|nV7 z9^cW=M-|F@Y${D!-$?trw!V?~_hnVqo>#~O=&v%E5;mcy;Q_g+S zme@BtldDd;%V+kCTo$ci>6)4L&E>D2N$|nB~~@juzhXH zgeIxiS*D=|^Nu^k>3m`N&o^sb!jpTa0u0hNwf>1Lva92eUHjm^bFoNIWNt6}XV++XmpCg(+exId}*fw9K5V^Mv-ykA(c#<$3Yp7@y|8*cC^eQMMC!1%U%K?Z3( zt&+JXZ}!AI+PK)DC{sD!?3;{UOH%#D(~I{pu4UWcC)0E-&|qEm^*lcTc zI+rT_?`Ch{f5}_U2k$!?i}chUZ1Xq!HR(T>tNg8^b@$p%{hshy;O56`p&#xqEab9$ zz4ylBJx2Wh8n#(&)MWouIjjF6Aivthmcz@J1shCydw{W4p^iwU9FX>v}7KeOU z)^@*OGPEt`(K~_QN5#wat|C!Doh|^$-6s%~;rYZ$-BA#pR4&_Ok6~deMF$ z@ydtSobP^fz6Z(8;Tj#4Q z*{&{$3Yq;XAa<2|VaWVPC!L$59&AZbJQU}pApcWyqEwKOYA{zFulcf&s%e*2aGEYn zyD}##z&p!z?MmLQOXmk!XZg#nP%d3`?n>*fAgj{F^8?FYIocK;I=$fei^^B7dsp(O z2F1T}|C`CM*MT`xfOnbBFIL`#3r%|3g3V4EUvP?Y@y?K3yYTClnRVW`GuhuRn!9E8 zw+nHnme*Pwm0iO8#Y}cl`HNU9C-;}OR&MGqS>`UfJR^7il8Yv7ML!sP53kgpek@VW zcj5GlqTQLyRWHMTtgVpD9_x%Ob^of&F{Lh8j_XCH**9pU}YDb8ZD2i*U%?X%@N zc)^ zKW{bIDSr2m-O`!`)9>#V-~P|Lr1e&wTbu{8fp+jD>$s>k{?4@JJSj^aulglD5{^ zh+WGBeS>?pv`Oye_I_`2sbdb;>}6}FZwfDeSMc0G@-Ks8uS*rEKX?1=fddB)9XN7e z!P>pj9-PJ}j5jbvp5ck%VM-8Vj_H}$IJr^Xk<2M!%r$IEa+j4gyAm|;0XFvBt? zcLpY=cMM!izrnp+mWo@p2kTuH*D^4Cczg4GdiL7fwOg-!yRt3){JiJC-#jnhpH;o@ zyl>H@Vk1wr;z>S5MkhV}ii|ANizdxfnK^mRn_twjYTpup`;83BpM|6UbMR__vpe$A%(rk76;fr zX4Zf*j{f`ft8koCEZg!9Ff|VDxtlqZ5{c8Rd%dcyH zt-N{P=7!DXn4Ei=`>uGHM)59vdC?~`%!GZ`?r9#UD^5q9o+);D-xa;=Y%8DX7nYWC z?^?8O(e4Yeum8Q`t@5*9t^cxq+p6f`wLh=*UaRLxV$PK?IwQ^1*7a~9@0Q-}qPO4m z<~`o@ans!!c31XYs>?d$n>P9Om2|I}*L<(?Rl55hFLB@b_}&_$@3Ym(^G|F#KCo058I()OB-GEq|3I!cdN<=@>X7tz1gevPS<55uB<3B|MynLwp) z9o&z?r|-$$k-al}>+3D6Z~2xqzuWn)Ryr;Cc1H9uvuy3#|8DJm`}bQ|;x8=w4mpkd+FXX}3VqsJ;w;h&RyCVD?%FPgh%(*Bdtn;uTF+Io)h z`3B?HHLvfK)-7e3(#3Q|z|<{uMXHv+=nCDe=~fH+Rv54H`n%}Wm1gfZmv--2H$(gN zsh!_q)Yr+c^S&;Bow@g7)-9jQTjsx8DEx)N)}{Z_`WHO5&d*=i?DfmPH2(!#v!TV} zRG~8r#z%UL*3aNEKD;MUY^KcQ^lLMHp9z0%{dr2paQPX_&%!Gj86y}t?Q6nY5q5M zML#y%ty#Xm`q13s`jYTF>2e$0AAhX2@V{mJ^kj9{Jn!>U!{4#qTT*_u`uXCT3)8;b1uyJ>~^6t=ww=Oq};;MHR( zZ~A?3_Jd>&{+G_r1SDVat2!qyJbB^vh2#ifvvx-d(R&>7t=SK&Tm%eVIyhu4`yT}g z__~QNj$h<{@$$W#_et-o^0$6hOY1p%ENkQK2<5)xz8_nE6xEpS6Z|i7zgzy8|KqDa z-v7wmbI{XLH~nD-Uy;oBIns~r6|m-Y-+uUQhf(>NxrO2}y}KXf?O=b$**THxOiNnxE-+U;I=ZLp`scKJ z=a}U_8Sd+se=@nIOaA%tA3FBu^*?I=xx0B{`pfj|oO*^cHPqJqV-3=-(XY7mwzjfH z`s&sXcO-9rT6Oi-_q&@^Be&^jf1D?9yi-_xo9gk%$hgeIL0(>&+)KAy*f51@;nJl# zoGm$F5vQ*O?OOKw_3szjOSVkWyKsFj6Yp%z&d%faEx(`hP`+7o>3iM&@4x^3m~-RO znLAJKRG+UqxA*YJn7+p+IO=rna!G{xq0JWW7Q=! zS@&jaJzDiAvflrUnVg4DWYn*wFG|w9sk0ZgOW!>f_36pqYu`Fb53^OTxqe;5y6Ug& zzkgxXYRUcI*_GDn^W78dob=XwrEi(34`=wn)Wi$_pWJ_B64UYeQ5d63ub$n_d&ieE zNW@Q-Y;^Px@X`M$yuVvQAna(ZD8tP41>t)yuDoj1`?auN{hxbr@bcStZ>E^JTg9gI z|2X=6;@0igul+fCSMp$V-pkEvudXhgB`p+}Q84>j;+lK|E0cNGc3eL?Z}$Su(`#m( zH{Eq~edMf9UpHi)&YgFS?Zu_*x40fFme{;!lGADIW^uadwBTwSQ^7V>i9L5&*dD0- zn{uC{d$so~fgdU&PtR{S`ir@|{nsL~-N*U<>t5V<;cnx<8E-FKxp5;T?RSu~+O5mZ z$M{;=lESL9_y3=KabCl=Tlen0dEIZVv+>`D3%1`=j{H8k!tRcIYHK)}uQ!S7cEkj*^1cu#J!utY zP-<~nUfRCpDVwKozDUj-KE04c2gOheS-;tgyDz1Q=J(W8{y9BSzkX)zg!w%AH9sEq z9-eK+oBQKbxEW9GqT=!npU=)QvRBvx7BDVRUa%-8Pv+m`TH&2{j))vTW@3KwEW_2% z;yIEDUdb0{c0N6Qe3{zu7E+SBlow z>PdT;lUskMO;U;6q^E2brpV&|Z`xv$p4Zkaud~^>o=)m$w5s&%wQ@PN<=lGV+SzkZ!tY7tdkD{5)|N445!?^?g~?Dg(8;`457{&V3?FpnHdh5VN2);rG2y_QZ+ zk=F_7yKii0sP|CxTXu6%or-Hc zb;8bJzUIe|XL#y;Y>I2ro)uj3pYwC;!sJ%(!%Yt=N(~;&Y%Z$*uAq~Aa#`)8$4^Q> zdVbobeewCd)h%s3DI(eG1$+lmBGey+OL|*fxY+spncnVy4SUL}3r+j&rzpNYa{Nc= z^Rwr)FjQR+m?ug78Ti_TByRC}{^>$Mp>ULWaH+Ow=UnPHiVO5?I8 z`&9pg{Y)=1o?i23j0;dT0HwwBPSuGiA;E+D}pIHE-SDW6t3J_T#>WA6tbh zXFW`7Shwo0G_Lu|x|g4S?QwqjNyOIFHB)Ls>bLu!O70%5?fNrif6MA6 zHQuS;%Jegf6Qi| zUoFotzBGsDRB@Bh-33NL2fALI=lC(ny24<3@)hL=k zi|(o%wNEXa<>a~iM~|_jiQgK9=p(adyYH&~w{$gAiq4*G>PyV3zdY()sKWH|T=7G< z!=c7@r%l)OZ8$0NuE2JC(bcr`lePvPGGFgmz2{}(2&XPuo88>{a&VcXIb$ zYi9qM?BH?lX1D=HoSe~Q`Yuz(s#$-(hF+sV?3<|0^4@uRC<_N$+51U2AG4kTloiXxjdJ37;gIY75Nm1eCV_{1q+h`epI6 zFP}7eIAxpTo}Zs|^`6}mwc2~k92@s;J+EHJ@RO^9VP<{98*8^z`B$tb9z75)$ab@t zeaCvTva))@JR^0H)a(s9K6_(|x~4XB+D)4o_(4T}3bSI2$(_8XIZIBQ=rO$}zDqp) zfY|%b?^*j^N$~I3KTr9!nxDcPhYNK@)7d{tRAi}`{l4NOcz?0cY$c{F69!%Z^FPn~ z&%Tm$c_dtEdHhStl;RNQHf<+y?&B@Hn%5opK1oAsS>nB#^52O}#Q_!HW*fb~`&mq2 zA`A0mV+Lp5kL@e9oR<|p+WLem!7#vcPw<|avT62ZL6+A&zFS;ADLLcuN*}holgUE+ zjvPx_v2gJ!M!^-kn`)Y3G@X$fB;WC5q>d()O z5?Zdkn{Y$vJ6ohW=2;X{_XtN zaJAuuEbb?2>SuNT`to=zQTli%pnUUMr=}pz#d8m8ObN1WvT=UM)7X;el&9tX?fjW} z-kOFxR;fN+llx&=be!9pN!PyQW^9&?(m4^-_TZRXxa&&3iLW}sQyg3Qco^eu9uMw( zdhm;bRYvdE_As^sNhi0NuH{`eeQ9%zFMklLak|~IOuw?P-*#7NaviJwyYPtmm$kCq zyQdX#$%F--=Jix$_2_V!FtgTvzxCoJ;b+r<}$PD+}^#q zYciyl)<`VbBe}q+X%>sftdmTe6&APqb?j$-ty1x5!VeF|d0&O<4ZXVbR)qhl`p9Uc z7l-@&F@_`5!l=j|Fv=7^PIOI8)8&0%bj;%^I=R7oOZ*Z zVsg3XX4To&3zyjQrZ2da?s)vd!CAl4zp*=do4B*jI;g(a3Y*otzMFss&>^0)I zWi()$*e>Q7+IX7=h z^t}%aTJN)@89t_8KifQYN>BXsC+$a;FX-alx~|qzD{n%~vb`7hz5H6`%vm-|GGz2V zJy1HyVAb{AU+rd>$t=9v`^)%K^s21qeCK>jXT((H`>&Rrw@Y({#lhdk?flv)KkNgU z9dxG^Dk^XO`>s^g^Dk@()WtAv(Y^T%*MTezTmm)6gn;bW{ zsd8t4W9)B}jdv>|<`;PEGPq`CntLl5Rp1*nbELArx z+dJRkxrwRB#T`$o|=E}bpdU!3J`64I&u*+EExA3t1iNaIQ8_nN8z;(aI68TK<*wv1_dUmjGoS50n^UmC z)BDNJJ{b#zeJ(Y>-yhdIDt=U4j=|vQ`V-r1E^7)HX?@_fDd@O-sw${%LEV*UKW;m2 z+{pZ0>2i{-eTxSlbKCn?ODU%~SFWoiPxM6i0@zOl-%2XoskH0t=@Qkvr>RvOQ`|3X zblCpJ{q83FkeSZUZ%ErMQ}}i7z|=F7ss$?r_02AtY5tqdT_m(5s!MCy>Vl&ezHXlX z>QF}No`-IqAKNNine=O_tA*-^~NMY-5|Ad*@|w*X_@HX74##(Xuc^Wp=OXrx{$2r-n!z zcYb`lo5gVFp3~F$%x@*z?hD8{ssAhR*R4mk{{sH-?3}+l@#NPj_q}E2cZD1{*u3CI z>bq;d*UY*Y=0!9W|<` zxP3+cs6A8EwfUa=bm|_m9_e8EH+AB{{d4c~PBBw4^KoF`{+Dlmp{qgV&59r|$vIBq zr;>~+UL5JnUcA?F?Y7L&UyEkW?7p;m)|Oid`BN@k6}q)9dS!BOAJgae=lkc$J3T8G zf5e)qQT?6um%ww!-8-c7m6pDWS=MGP^D$0;r&Erq`_xTU8G(_uTY_tj%)aS*toQMx zIe!^WMDk~?epz63_2NvEU#sT0u>MGFTCbTfJ6ZT+LVdk~-B&lW&zF9!y}9i|N&Nra z3oF#xza6>be5XfX$v>+lwGlZFjc&c$8B(`cEGJA-di5VolP#AMON5u->NV~vJ2`#R zWBuN|xgIUcfB*g`+1KyA$=aLm!|FtvvSZAX-p&oldEoPNWyrh7oP}?$h+63P1vuV)vAB?p+kN*>&u@HcXE47yRY$6?Se8}$RC5Ji=`PY zUrU}n&#>2)>GKV?)EUtX*FC01U$H*FhmrNV?E#bI?=MzseT}O=_Vzl5q;ElFb(+m> ziI>?YkFd`wndvq6`pNK&yMe!t&kbCD>p|~~*=^H*xw+f#c>C(bt0~&Ezn1g1OV6%d zcBtx}UP$p-hwo=H7ccJW;QS!)+dII?xsvOZ$>E@SF|h@UpPu(!>EpWhYDJw{_5AD0 z>nu`pUQ(+v-IJ7hRrd#5Uho`KQDV+b1gfc`QPsB-sz#4Ey}D zY_er;*iMJp>w{*7CYpZy?UWd5A=`e=`r`RJ?sA3|Q99Se`Wfxkiv9RAW54(IEnB@8 zn`i8bo*rdYGq3O1(vMrD9DI*n-ldwtKIPi$giH+b?s^?fUszk8?l#ieF1q^E6J z<~!Fef7iy%TQ@Hhe4c81q15(+wCAaZM_MMQ^_)I&XxBY0Khgl(7%3Pk3 z>Q$T*Etwv)BsDHrFl$%4>Nmxf+N>m_S&4g{QlfIdO4jA`SZtA8cra_vv5a-fkA%aP zUwyTy%;le$-^JVWjiRJkjGDI3y>`Zb%`&Zr(Ph!PD|cLYur({7K6-Ka%-65a>eaTG zJbMron$8ztFXFTGhSl}vV^0L)ck*+ENZ;{QsWG@PE#!V?_ZH9WbM;egI4q_uZ&&!^ z*ViwcSQE3N?PY_y-Hi7fQw$3d^L!>9@A}an(4?6rq2l9|uF+!=$+}s<>!p)Vvm3iy zkKDV^nP;9{xN-LR_iyv+Ki|;!{l__}#{K_+z8s~AcMUJ>Pqz6eu4FPp-^BDo%9gvu zH)gBkE@WowU)k6rwC`ZaLdj=tD~_=}Y5NfT=g5IRAEk*m4HatdIhL?B_o-}aYdR>v zSnQPi@r9f48@(R=!?{YEopi7I&z3lE>e z88y5#4%XSWJZ8IH-is^R>_Su52^M5`9oAf>CDHKylK%3z^|zP5e6^+8rZaK%!(Y)~ ztoFW}b~!@vqi>OfxT+kF>mT!XIVN}fEq1$Q&tLHP&M|wBc_J5z`HOf{ZcTnP%gn}+Yw=gYo5m=Ki9`0w$y6|GrEh3!{4^0Qc5HC6Sy z^16QdrF!)+%Y|n<6dWc^Q%X5e;vi`I+l5W%rA&mx%`+krS2EJqsfSMr{bQ2usHe=S z>!}=?xHaV0+`ze;J#!0RyKTwqes*D@aPXhYVso!$w)Mr{TKBt0H2eDSEZY5lbv@v)?LduXX?27dXw&- zx-@R#srJ72=9{+#_RT*k-)y+sfo-9H|Kbf3r7_X(%$Xl{{FwUUhq!swEH&x1y&vK;!>=Vw;dJp7EnX=-mCIbCAz{oKw_L9k?OU=E8wTjrwVczfLf2TDQ~k z&_)ZP?VaJAQm@>bO+A@;*-l5uMxV6%n3}%oWKN!!rTzP)_?Xc0yi+N1+f7O>{-wOn z*c3I}>P>x7iAiMJiQ`A5CC;sV@{0A){KFM28``8MnOxYRX z3S~PNH@Z!FRKLmp31i}hr*R8EUWqz)A~G^0R7!ARhxg$bCy7C3>3eoW|wr zZ%j{5)BLq-%D1Ued-Ma+Vp&q0tvai8wyKBxv)fego^NjK+Ktz*zFa*mY-{_LwD#5e z{NiV>>Y2{?qV?9QRaRRSr-ZCr{kl}qtDR>X_tKwyI$W_57dSsVinXPsRQz~<_;Bj3 zy0nUl8QNdITi=SG^Ezsay_(r-ucd0sKI`xtYIEBkyW51R-c)M${kKL^u|J~O)QlKf zrIfw5eh^eEv8_p0SSt8tTO{C5A*War-RO+pE$ zRh)u@Ply=3XgJZ$=DkMW<=ctGza2_4Gq3YEEPEATAK)g)s&chPEZQTX8*EMLBy zczZBn!IK$Bc;qI$tmB??m-R#P?9!l2$vln!(_9R~jcz@d$RBvux%Jb920jLf0&Y*w z#AK;|&U3u?-?$gYA=B;O6nc{XtdGxxiB5kauBDbS-(Puf8uvu^pth49f}S7SpWf&) z3e${nH2lGr-wjuzSM<-HTPI(B$!B61ijD6KVgg5Xx z>K$5;5!`yY(&5&nw9v)f1{FM-`_Fk!+BJD!UqfBNgPQ0y=j(4=eRZ)^H~#$RzH5yR zUz7VIW2Tkfl~;{-N#Aj9MfA25>zot$;WqQSmk!Qz#izP% zb&#BC>-5tlv&8JYxmd0?$Bk7v-7)(-l56DbOE*|?A8P#>(R!`VyJqE6fRY*e}DtAwmZ*DIyWQxoq#56BU5EpP2Em~bkFLD)?wb03q{ z2ktBr;eEkRHcZ)6@X7Y$#@|1Z*|{aTPsvPBh&bjMJL6e=aJ%YJ`N>9$SFCECP&@PM zYkv9jCT>-S;$!zV?mV|Sdt1X(w`0Yd-=F_v+7~i8HOE2rU4eOq&D(v|$ILXIU6_1* zky!7!pq+IZRw>oov?D998XLz?c_jq%qF5Gcj;>xSTR$JF5?y1|d_@;Ql%C}#WMb8zi z(Mj>Ya`noqo^Agc-6kJ=lkxTC)IFP`qPmv_AA6>npB8!INcqh9n{8xX{Gams?8Q3k z9gV@~FC2=~Smi&xS@pF?o6oX$9AD*`H%2O&7OrPgwD5>WAN-m5pZ}l({wi^u&oVXKmNLYYDFT zv*23t)gDXXyLy4mRtBq%vGcdxKE7>@{fiDWlOqnAHibVv^k`pvebc_xF4N!tPG;}7 zU)w8oE!wt5*TY_cnl%M9i zDcs4mJ@<9qy_W2l?9Z>RZO&<%*Rp)k_1mwmEx6=2nRSmuYVP#UQWEF*nPRY^Xq|XJWT>VLN9p;^W`cJx6iCO>t^XUIh^KG}Be|A|~-DB&gy?sIRHbv}TZ@f+E z;@Jfv(HV~xwf<--;L>=PR$>_{$0IdMfL+|14e z#{>S_7KI&d{2WtjQrQ@9d^1%!Ywoc}SG%LmWS&U3%z3j(^Vd4IyNV%mQYY#ifBf`K zH~XniUmor0d9Qom1h-LWVzkZ^W7n740=Bua>iEv=>HS&sTckGNcWR^EJ*&TVRa3s5 zZmKo-o!S^DVL0`5`n;NBbwS-wy^0JjV?6Cx%r!G6WxvjjSwf;ZEN9K!#8P)J zJEF9qV!F!ZR}nfVa=t9*aXa%_Q5iK`uS`1f_?jz*j*NXDwd}COLXhS;I3j0=j4+bDSNf-C-LU|?TT8oF?rt8 zJqIE*@^q$sZK~NG^Xzow6v^pl>wa#v$v3&q^?8ENjMb{C*E|iYr>#3G^yW#4?!#>{ zh5M!{9E{d|d^$;heQBiz`__t}XWvp4rypTB;P>4#V1L96*N118-_ZTYZ17U3`^^jo z=J%Job7sw$oout7$A zb7pEeZ*T49KQoq^T4>H$%{y_KLn3d=FXsxL7qtljg00O$+qZfsbVzq^+kPR=-*4Kx zqKSWx+*sz97Z~uXDtXIRvzwQ_Z_l*V$gNJ?&}8SHDC-sxUKlfR{*pxJ3Z~t=2H1+){^D6ahrH^gsyLVEjzTS&aX`a65^x^K*k6Opqoc_M% zPW@qyN37ep+aK;rQt#VTw>TzV;}q+(s2?ll2>IN$_?cChW^lfiBdb2HtFrK^&5RXm z|3$nGSS`Et>#tR+FE*N3#(e$ytLxmVAIu95OtYHlf6wLnqcdmE{uR2lKW0UnY5&_} zruEZ;-`roi$zuLz>lO>9IS~~z?U(Tu8{R2hzt(B5d?EX_EYZF8hh&$0zrJZss%BZB z=f*kboKs)^Q#R#}p0oZ&o66aYlVK{B?6V%VxL&*JUA|uJ|Diuhv%8EJN>26=f9fRu z$jF4Ru_khX^|TYd2kNdr+NSzsv-*Fnx3Ni2r=R%9tJ7cXKh5FgE6uQP-6iWMIo?`* z>A;_cOdi>0yTx9q%k}n2+=_L(^F;Dvw0Ql8N8!f(`nxBbv%F^Md`tZ3s~3N^9D8*& z_;g3Njdor2SJ%}?-*5g@6vLF5IUzy+h*}(T$Fm3priDV`+S}bdx9}B7Uwggy&R3ar ze`YN5eWEyvDg4y-s;jcnVSRnw;oiK;%!1Nfy3cPfwMkifC#z8A!m&3B#q%zzaZPmC z^u9oKmuq1Clkfx$gTw1*{jFl#er3|_y9z1B@AE435C2&HL3P&o^@nWt?I;Xy4Y}&B zviC}KN^{$xtRR&{ABT)!%e-~lj&5eRefQ{bb+29aVF{u8a_L*PZ8I&%-=Uv&F!tH^ zUr~kqe>g+JPJX_cCgS{i`IfTz_slQ6Gh4Z;;q({Qdv2Y{A;-c5%(nN0rj{iJTJA5t z7pAi-ZDrBzjVe2h&ZbnepZk2oW@k{dS@)Kv)avOhJr?o|S~7l9nj0QnDB@y{ef^kK zLZWw%@A3JQ-0EjZA3GsyAo=L!8>z*gH$OKi?>qVVtJv)IYdK!GDMd`QU;4S`SINS! zLHkT=qCNyQn%C}P_$;)?b=RbVQ!@3Bmd#n8J29mG6zkFF;wQgPfBwX7ovi;&i??^{ z*t)WoZ+-sWT;#Q1@pE}YX0;;L+G&qwhwp5QiF=$vJbB+eVkn^JO2d- z+0{CSa>b-QJkvWtXv=-wIqNpo-|IWUq+>b3H*d<96v6x39W$N#rhF~;c3V0@`}uvl zpUsPW6@AKTIxnqoT-dGoy?RgS-L9w1r*D6<)>r+yFys5uJAUVt-tKW++iUvsuJV+q zZDQ{g0$-K=+GDq-=Zxp7*x4d;lDFKC-Ss_a+g!nU4{Gja?6dW1n;BR9`_MCu=B5VFW_r`?sz{svjAKsMO1HdOCT;Xi;%rJ-tF`)x*)#V(?DO%H zQ-3FTEo%qMt26E@eo(X@r%;epWpu3 zedXNbFLlxT=I-D8$>XBy_x(Cs|BLOlUv^@nbKEPP7yPR}9S<~MeYCfA(+P>gu|E>H zTKS?bh=zOo`NQ<$`-UZlpS+D&;CJlw_J(=7(Fe}7RmytBp1frlvLSKGt_evxPBZ^- zM~X%%{B?S@?$1dE?w-^=C(8EuZ>rZ|nYz@+dVP!L43oLLHyJIyz&}-T)7x|WjO*4u zdjF)oPvraEDe`|c-;}YP3O{x0ZHTtbmKk^T9=@3Hfssp@-+<5CVA0!e#caQM4*0!c zy`deqaL0}AFu4awJD&X87JNru>(o?%j6Kb-=63f_`*q_~pQyz3H}a?WOzr)a@|x~x zh-IsZO`IOf9(%7+sw}d@S~+&Z{26;U$86G+36iUynd4Q*kZYe8=eIN^c*>Jdr}-w+ z&Kz@mR3h^te{F)L^A`Uzl3kv~RZ%mYOS0C->C|@IJhgnf3yX>0-#@O!e?vHHUvk~? zdbm81W3TI{%Lc1vya_b^?pWd#};v4hN zZs}Qra?9_Le&5yzX4-!j$P%3Txx7fcTHncQe`}9=$Tpp$d*&!t-dSjqzged2;H9*P|+*k zv0W`nICH-EEt{KU^g{Eo>y({9#>+=%&9qnj;rER1yXKi!x$SDv^*_L`{`k1b)#RivQMZy=uFFrY_$%|DdrA1D z8M~P(wsbAoIXlIYK{ht@OHSs+&Ck2$m1@tQm@RsKmB;x>t*^i6U%DsxGyT%cXolj3 zIPdh-gQW)f`I`*Qo>qRYs=6Ef;OduMt=iY#F8cX=_sh~fPj;+R`h zuXx>@Z6kkAGhgwXwedRp-u#(9rK_yEUrxVye#Y$SzxK(+%>4HAl6Ld`ugjU*&ZpI9 zZZr$IY8q6rbWeW6_s?86JFe#!dfhv`MYl;V{o&$2!dITV)z(i5E7h9g^22$1?IXU5 zf9ibe_Z0=t)fTPi{Cqspy4Yn;w{e6zmzdg`Um zs+T^mRsFhM%AMB2nn#R~id~m(=N%~2)O?>N7ABXD`i+UdXni%{bRx@_J<^#r~ zle0xjn%~NvTK~By>R(lr?o*+xmG`zU(A^lZE_~IO9ao%6*v;R1?u>g9vNNt+XVU9X zm*3l`_q;qg$x=dVXWq1HZ|q*~TAb3mS#`(#qnf2NwDO8C%4F`C^I?0FpYwI!!)sMv zb6H6oQ+;sHd%^ED=kD*G`l^2Q368DdW?IJ(7t-+*|zFAE6&ZG^2mGn{>z-D z?@k53FH4&B{pFj=NhP<+pUN;b{3)22d-mHC2??_WzdaS_wlqn?_z7}eLH)XO{vs?c_hAHcR1Ha6T)jKlm z&OeA-lzeB8!)=4vs}^m0+4a`u?KXR_ML)MKwOHoD?6&Q)MCO7W?3)rReoTG%aBr)f zgsGuvHe-yvNy{9=@XgehU!)QOPKfWnQY?`tN1q>PEV~0#V?fJI;2^< z*|k!1s@MCE8mC!*^c-sRsr~8dF7WL3OU>Kote$D#Uz^eX>v(sc`=oDf_jJ$pt~D@U zRrx$7cj4#4^^dk_oAJA<$DMqA@{#JsqmNZpvu)lcY!ql;ZJS`kdP}(I$dXM0eHzln zKhq0)oX!;|7kts@JHE)U{Zrwb(9}Z$PZM?IXHWQSFrlAC>~yhait*mKzKJ&T&*y8U zs&3w|ceYgP!^B51>Pt#>53hc7!q0lbuBg7(3z|RppJM1-BdztPJbLG)h~y16^L5^> zwpl%eafbPU`=abKKYb86wsY#~`3oJtZQT6(dDQ`!u(ziott^gro6XTyDVZhmuc6e>k4Naw$GGdE(>FtdFzV(lIQx(yz{R; ztXZTN^(~%1(Rh@2spZ&DgugPER+GF!NkviBg%TgJzk zUn`^ktG`$Ld18+{L#p#XRaKVrwMxfd?DW61(m(ge|H_Zom%J_hWayvs*Eq&@{nGUP z9_sr)M1B0e+r#0{&F4=R$EDaeZ0LElK{V)GEbChN8P#3?J0GN_f1dbc>+=uV=j4Pw z{c=0%y``^z|Kw{QpMIUNf77q4~E$*b%cG_Z@!TO#8H8 zL*R<3Tk4OL94NYy6s)z1W48RMIVV0$oq6VJcyDj4tDMT$$B!SGSO(wuf2s8PpT0Sj z-A9`L`~78auB_%*Z<-SDBJ{_Wsdij1?{M$fx9-I9g%6cp{I)nG`t#WAsrw37#=K^F zTGdta;{By+(?e2w*pox&ZCq>h*M=FP=~%p>t0Ar{4pskRZF5 zbK#4>C~DLQ%|7*0W67u2;@=9-Y+tTgT`@&_o^|rYJG`I&H&mgBjpxsKWL{iWL{a{cRWcXPCbQ$u1wRbjeCztO|UtnD!aM7 zGhaaW{yB3wd%qHw|9Zcatai*WI9M-qYfb9!1I?P7xeou{v6b^x+hw;ur^;pQ^@^IV zKb|?)x~``0^BtujaX1IQ$lj(%{{r zkfQl7RO8l^W8Sw-tF-rO=3kh7Xq&d<$JDp>I(`$_U%Xd8xy^q=-nLHm6J|w=WC^yB+2EG{5~0IJv~bpZ#l~d#ru`gLP-8EzEt( zFYnt^Vs&A2@%yE{_e!nShpygOS>msHKI*Q}`Ksybx;yiKOjo@dxqjk|hn?Fx^kz%M zI{m+({om?;=?^zcvk=ERXl(C+EnIrb*)QDt&L>1TP6?*=;;s^u9>_q?5jr zL>8P@dT)EGpZ%}P^aB+$=4VX!Et3DFJR`J2xL8`_eVqH-7Gr_Ud+HoT{iH8^QQqEr zcazSReD#kHsvK8rpS8|ptGTtEgU-cmQ(m6$wOhSQ z`O}K+`xl?|=-9n@_3n@M%9>lR-v2Sb_ie83wE7(LO*6t2-~`#rqu#m1n&9GJoa9s;}7}CwQ;mGF_3k zqx0F_j3+x*lo)88IUlvvG+~eO<%^rDlO&=pr2N?5YHc*Bp6R-!Ph6Uv*{4l!wkP~F zeUkc5Z-@M$-%+C4uIE=<^6c2axusVBgWw%m-_O;zUS6E`uiz!`CNmk?_>Es)RFoaP zG+%t*ITKU&DmJ6DcTevV>^!i&@W<4zIz5}~dbi!Lv$CC&H@$0pxp^Oh(L5G)$&3jnBu=B4uuC{>DCTHT?=S-6n`7hbBnZDU`R6*;z z)~5v(@{%|Hz1e(w{>ik>i{0!06`!=L@rk_Fz*Q;rcG`nV_x^e1B3qwiYG^-Iy?n#8 z(pY{s+wZ~pKPTq&M5 zWxv<%bCbAaw~5c#L* zjf$%JGx46sm7vDK7G0!>R?%Oy|Oxx|Ip2B-$*E_%d zv23~2;H&!U>$?umH$D7cwmh``bT@YQrROte+qN~PWQX6nb4U0{+S-e9_glq(RV{GO zFuQR%=U!@82|Kf`;c8vBvrGntvrVrFbCkLJ*k7_Z^z2E)!OJ;z@1K-qc;BCI(*AbV z(zPe+Z13FB`#E#cpY0aL&zIM!tvAe^;`gDsK5l}1#kyJ}rxod}5$pKW1kTPqyu?bX z^SE;0#|m$iOHQjE3jcFkJiE;A)BRswpP%(gC-K`$sE2M8`}XAGwATyl9o}}u?&*Bi zY3gCMC7xq3|B2O)ws*__)5(A4Yrf{xMCp6gJvC)GjyGq`nJv1g zM*nCAZ;O_9FUw-}m=VE|y=v`(ca4-zRTVuD_M9 ze^OXUPBv9j53#w|6%NQJ1tiW}(O}6fI=xGOevRjc zzoBzVKi3P)uh!X^?*HoK`jUH9(bhNh?wz#PzURl5wq7awNd1TP`?#w7uXgKinky`N z)9LmNliYX(ldatG69w4}l`8!I#r=`?{7^rqwDZZTZMXB@*8Ip`Xx(dS6)VqM#MzZgRxo%n`pk36*W0+?lMdw!XVO?UR&3 z5AE5J&HG(u;nt@0zCQCFN$qFRr@b~|X5OB$PO4$PGV{;=3v1ri z|J{~g_tVAr|M{D@=FOAabJMy0S-td+`d7=j>rU0aK9n5Oz*iA>^!$T$ZBmOKhdwfW z68y;YPvJ80?H}r&{8xKx%f0%{F{yd~f82h*M^{cI{m_2t<>~ReC*-I+?`mIBBRkJp z>5s>YWzU_@e;1iLhxhFDoV)cmPfeZv_WrJ~2c9}RPnQ??@BhC&?`%)~!{)z#<^LS2 zcy^8dEB9S(`;GOpV{&f)^Isz}z4w0A#RCUiw;w9jDc61*ep39?mhc0LnJ*_i4`J%@ z=Z;^Ny1HTYRpYsHKAB3`{kHBgJ*l{g#+|Ty zd*jz3|2F9LE?2myE3SCq$cYkP(Vwdnu4HBV*#%yYh}7hG@_OncKc|X)>n7QUMFu-o zd^Bcxb2~43_vwjSX5G!(eDk$vPpP{6y0C2RmaM7EqE1}NotrDN>Zg{|s!-8C+BH|N zA4%W6%j1wLpF?H;ah<0PTMw%2J5|rT`O)4N!c+dMa^G`2>3-rw=(G)MT#SzHdtU#t zx?u9A@{2E~FERR~EITp7+vJ+e%^P=YB)fC>SX~p!?K~2_=;AbsKX-5JF_fC0(`mMS z%Mr6s&d;w-X3OQ?{Bqm9?)z-dA3M#YT9-wc znLREO?AgY(`iJ<<>hQyw#)gwpUI*`gpnU&__9Qjw3Kie-^`o^Q=rF2$RW$ zs@48WVW{cKm7BM&n!fAI)o)gNZ!a)g`86+g?((qrWh=I>bASDH)v2oR=5L1kUfnR< z_;c&^JL@xT{Jf`L%h=PAb8Uw1D|_MixmWKf?E7-PYIUUUIlE^8tB*=;U$}4ED#yiT z`WcIZcRx$3>wnO?bEWd@7jv!_9{v7$>F=+XVxH}g+{BmWfBZ{+RM?bvnOxsj`2W&) zagu*R?V()vCI4EZSLPcyv}Mj_yjkv08<4mz_Ea{9$j`1rcXpK2yL$dqO+A&b6I_=$ z^V96EQ>X1VGTFRMeIWV#)GwCjW)JtJ@7O+XP4JU-@0LA%^djG4(HYB21(|ydQehJy24&Dp|DpaqvO^iyCupo?_Z^hUw$0KPghLH!nLO zn{Y4Hct@(1@uKfhS7-RuSy?77f0(XwR&w$>W$x!U=P0RfGD**El-Z(W|H8>KGqqSl z{6y!R>E9>U&xWGy=1RlN1t^9f?lmu>viy!`ca-Lt8O%a|PuN4TG# zdboSVgQ`tS{`NlobI-Lh=JTHi+)qBOU4H$x*R#_Tjz6#cvTNg$ofG4{-~VpQ4(8l9 z%llNc*SfW;*UdQXe(7cJ*f!lJ{r%Cu2ksa?OnfMFAnX7;^H<*!8=u-Wo#QNa;;owB zogW;2s`8=9vzSJ^yCu6lmx_giF61{^dt=g>$3~OtDNR7+qO(= zv-zx7pY=H<_hh+mwafa*H}|6O=82l&H7ob}DKyzmDp`?zg8B4$$qyM@tL9!?aQS6U zo^NuAtI}4ZMWNeu-}>!Xv~1Tdx7yFAbf3?0o^)a0NhjsVhcBgkEq42gwfo5%ybhAPUR1rd@jJ_#siFrv zwp-oVYc}m$ShVz&X<50GPu{$L`DTh@_>EbUuSH38t4eIYc74KXEAuZE(p#d|Myfu{)I3(n+){dMPEBs_+Pz0(RaX?wz4csA zbl!veSHnK0AGCV;Bzx9pQKmS_Rgvybado1B^cUaRY}|10Gv=kr?Ymwyzm+N7WO(Vkf@Ana3D z*Dlk84`%gu{(pYpRzkts+=H@Dq*bK2T8~64Pn?*~TK*;?`(jM%gawp?bh4?H4~qzl3x¼oov1%O*x`xaw)-`ED~)%%e3`QEa>Enzik%^au+r~ zsXZe7MdhbJA=Cfm9l;Ou1@kY3ebRlT`=j1%kMH@*XFJMYxLPeLUgar#nNjv};;h42 zM}tp<2ey}US}$k4cm2bbloNsea@!7VXKrscztN_nC0*ftP_)K4q-ukS$wV&g8ubqU zrI%X`!V+F;2wP`ta!5|8wpse+-qB)>RZbz7IlfK&a@r-IS=4UT+eb0lY4XcAA4rsH z?OK_#%lhZ*&ncH4{?j{l!r+5e!S364b=9T0!xPR6?(O_|pj5Lu`DWq^v(C#pp$>G)mg+S!X&mA74bdg1cn=urLflr-6LZ2j2#`sSuboVQrI?!9&}PJUY1c;n8G zs2y{@F1w=Jq_^aZtlGr3@Y;Jbn!L?}kEI=cICEV{^skE_&OA-CBsPUzVs({W@<+!eo;Gb4{&nN!k;ihD>5^)ipLY z&b_T`{C=9`wlimXx^u%X_K5tA_9bP5al4jAlpNZb-~d z2+nCcyODLrg{)6p!lH8{m{fr_3M^q(_ z)I~H1osw{3<=)5JKSeh{QjRzSDgFgLSk8PrX1+s`PEk zIkGYb{mKe0_Z*ujbM)y>Cii03nvVV*LgCM}Vnod!rmZ`6btl{PCs8r8Ul+vI^!V?P zyZ)T*&IIYg#4X9{$V7uu*7D5)2U`#lr!d%AAUv6piW&b-rm_s-nSAFS*SL{~_^ ze^9%p@w>(B>H`0FNB8dJ|DHOn_{QP5XBN|I-=xp`Y%!meZ^H@4m@}+*`c>zgH`11Q z!BPX9sco(}QPLUE@~S6HrpFm+E?_~-L`+OB`H`qz5>Guyorvn!1A zAFkcgyZtlYy_35u%-=uUyQlyAXGXgd`#nY@$Www?Vq^+nKA!EaNV)J|n{G}*V(v)&z^Ifz8gQ!N>Wd)ZqwSittn~Kq73D?i&o57c5YJA zEGzG>m#=iLU$ETkx%$o$Q|IRNtZHY|E$4KecGs?T_TF#3d$y3c>CMfv-l+PrrmueU z&-BVSvpF179FM$^e0;3MF!M|A*F94VbI)i5D<ph3R4O<(xpZc&=?e4Yo06x` zMU)-eWISzdr_|cpK8tK;Ub~uFylZFhsn(pG@ox{Nmg(N(T;6+Y>*FK6yRy_5?S8mp z)ngZDx7qzO?bCkF`}ug9IDe1k;+LvZ1obaRN$T)Tb64T!{?vFvCvGnC z>cqLT&krwr6?bjzirX6&@oHb&uxFQOT$-v>=$tmu_0bdC+*IytkSd(mmbYY~bmj{; zsa+G>+}0SrHq|;lJ+k-IN4KXH%7^*x^_o4}Tjl?7!sQK0yr**`s;1sq632V}di%3m zhYR06-0`j8PDrfryJKgPB{QX$Z=If@k#ps=1h0DUzK!qJ$6k7My0nKg^+xEinx)~Z zrTy9;x%GNm8!kR;ZT9{~jYco<7V^p{p?UiH5E zWzUwy8z!#q&`RR+7YtVs@jM#z)#r$>_Ow^2cPe(Y-I|uZ=;4nQ2a~=srg~p(H(U10 zPCNE$Vf{9P?Pe0OFZG|ky8Lw3>-sdQqLZLQq8b1HXJBFgo#V~Jz`!8JzyRhkG9@!G YGO&PoAXN-t6%1FGsDsYYMmcvH0OJQ>`v3p{ literal 0 HcmV?d00001 diff --git a/DiscImageChef.Server/fonts/ChicagoFLF.woff2 b/DiscImageChef.Server/fonts/ChicagoFLF.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bb1dd4b360d5b43378e0d2d679b77d43436bfa71 GIT binary patch literal 16816 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ⅆgdPd~6IK!S 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
_aiPN3G1I&{qv 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 brZo&K%v?-s8Mv8wnRyww|NsC0pMe1Y-j%JH literal 0 HcmV?d00001 diff --git a/DiscImageChef.Server/fonts/vga_squarepx.ttf b/DiscImageChef.Server/fonts/vga_squarepx.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9fe3e4aecd84c498563c3af03fe7050924915f60 GIT binary patch literal 72180 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 =OagbTa31 z1i1{NDG|R}GoW$Y`2sP@I{Q zp9dD^a4mt#d*(w~JpQ?vpu!0(&l8HIn9DymH65Z{Ff+d-5ydW6uw5)psU?Z5?uog% ziC_;HTbi)DLX2REN-arbb}dO{4arC?Nn`<8$m*R~P>{&xlbD;7lE~y+%H&td6p_ge zbpcaACUa0mK5KAhdTt_fNMb2F)HTcj8JWz^8JWxh#hDOm94&c3=D}RV4^;@`b0xw9 zf+rQ?9I*E|QlXya1o;OnBvJ~IhiL^1vV!%qB!N7a4)PppN@`9?B0JP9mMW0fK$0b3 zuYn9>%?5id2kbS7Bb}U?@=BR1GTHMXAm^$()># z$y`vJ$(j!ecpi|kFlX^YmBIKtP&2{K<$+3qIb2}PU?#*FE|B`k*bP!2niv>xCZ=U( z8X6cF8N*nnhH#bllg;5Ko5M{uhns8xH`xO2UkkV$7H~T( z;C5KR?XZB`VF90VD>u1DYB@VsJa4sln9T44N81EVv!e)BqBL+W}1tAThWa;?xwVMsNqi$iT>)EjKd{)FdrV zP0r7Q${L$;rdA~9B<7|h|G-R zb8zA}GJrHPj10`diP6Zw9NZx?GB5{sh>Q#%9UdbC3vfYhWMBdA=olGTfP>S>zyfN% z1=M^CsQDI9^DV%^Z)9KrHQxeizJ(J@PG(UeTS01ZYDpqEgiOuNjLleFON;WsTr)!> zXjx}wXavpsW`@S5Mx3d|C7HR2CD0%G8M2rDVSBm=@KElA1Z0V@Qtl8RF~QgaJR zDvMJ~*i&;-b5rw5zz#Qp^ka>T3@y3xi%K#;&ECWuo=ngfb#ZDkXpovawXig^EHNiF zFF6&W#}eWhV*>-$jQrB#RNkW0vYh<%%;dzJy!;X_kmmHF#GH}>I5Vk)BiPLl)VntT zF~BU2U^fFe!x$t75;1}?OkfNP7{e0AFoQA7VGL6!!vtoI5lp)&%nDPO$;L2qj9?;0 zFf~RnbHFsnsU|SR#xQ3X!5J{yjbQFEhBIJNCNL`uVdj7ZKqec(oN5AB3^UmT<{lHU zJ2-;fOkgI1y#>;43TANxyP3kx0gJGg79{25Cuf6W%GAP;JtYs!X9bh&IcX5Os02di zloV$qrlhihN%oX%FwL2knUj;6l9XS;=3!)HU~bIjVQ67$0-;O|xggR-smUemB}JKu z>7@k_x(Lco$%F87(%3*ngkCB;|ff2NV z8#L<-mW9o0fayytBCH_Ymx3)mfa#qVUcgl{F|aW>Gd3`=F$gg*GB7f5GcYkQF>o<( zF@V;{@G)>Ra4{$_@H22TC^9HAa4{$|C^2v|s4=K8urg>cs55XgXfkLDax-W#XvuRk zXftRta5LyI=rFJ_=rZUsuruf}=rOP`7%=EFurpXO7&0(3STk5Nurt^&*f4N2*fQ7( zaWmL4*fDT3*fZG6aWgnFI52QC#4yANaWlj+#4>O*#4*IlaWf<`#4~U+)G*WtaWm91 z)G}~0)G^e_aWgb9)H851G%_?Yuro9usOkn6?;AWV_Fp+_k zVG6@!24;q-3{x4n8D=s}XW(X-#W0J3nPC9~=#0G`3_BRO8E!D#VBlt~W-MUfW~^nb zW#DFVV^U*aWJ+ZUX5ePZU`k_PWy)mAWZ-7XV#*TaX3A#Dmgi>5XUbvVW-4GRU|?q| zWGZCfW-4bYVqj*fWU63bVQOZoW?*J&WoltyVd`RPV_;?KX6k0(X6j?=W#DF-z%+q@ km1#B8Lc+qj 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

t~0b4gK@$q`>l9B^#3T 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

7`_Z#!5)S+hd&nBrI_ZLn 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 literal 0 HcmV?d00001 diff --git a/DiscImageChef.Server/fonts/vga_squarepx.woff2 b/DiscImageChef.Server/fonts/vga_squarepx.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a7a5b60aee2efce90275b485517be179b99d5a85 GIT binary patch literal 15080 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 literal 0 HcmV?d00001 diff --git a/DiscImageChef.Server/package-lock.json b/DiscImageChef.Server/package-lock.json new file mode 100644 index 00000000..7699daa2 --- /dev/null +++ b/DiscImageChef.Server/package-lock.json @@ -0,0 +1,12 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "bootstrap": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.2.1.tgz", + "integrity": "sha512-tt/7vIv3Gm2mnd/WeDx36nfGGHleil0Wg8IeB7eMrVkY0fZ5iTaBisSh8oNANc2IBsCc6vCgCNTIM/IEN0+50Q==", + "dev": true + } + } +} diff --git a/DiscImageChef.Server/package.json b/DiscImageChef.Server/package.json new file mode 100644 index 00000000..efc3d42f --- /dev/null +++ b/DiscImageChef.Server/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "bootstrap": "4.2.1" + } +} diff --git a/DiscImageChef.Server/packages.config b/DiscImageChef.Server/packages.config new file mode 100644 index 00000000..e678a976 --- /dev/null +++ b/DiscImageChef.Server/packages.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Server/styles/_highcharts.scss b/DiscImageChef.Server/styles/_highcharts.scss new file mode 100644 index 00000000..c3f6b965 --- /dev/null +++ b/DiscImageChef.Server/styles/_highcharts.scss @@ -0,0 +1,788 @@ +/** + * @license Highcharts + * + * (c) 2009-2016 Torstein Honsi + * + * License: www.highcharts.com/license + */ + +// Colors for data series and points. +$colors: #7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1 !default; + +// Chart background, point stroke for markers and columns etc +$background-color: #ffffff !default; + +// Neutral colors, grayscale by default. The default colors are defined by mixing the +// background-color with neutral, with a weight corresponding to the number in the name. +$neutral-color-100: #000000 !default; // Strong text. +$neutral-color-80: #333333 !default; // Main text and some strokes. +$neutral-color-60: #666666 !default; // Axis labels, axis title, connector fallback. +$neutral-color-40: #999999 !default; // Credits text, export menu stroke. +$neutral-color-20: #cccccc !default; // Disabled texts, button strokes, crosshair etc. +$neutral-color-10: #e6e6e6 !default; // Grid lines etc. +$neutral-color-5: #f2f2f2 !default; // Minor grid lines etc. +$neutral-color-3: #f7f7f7 !default; // Tooltip backgroud, button fills, map null points. + +// Colored, shades of blue by default +$highlight-color-100: #003399 !default; // Drilldown clickable labels, color axis max color. +$highlight-color-80: #335cad !default; // Selection marker, menu hover, button hover, chart border, navigator series. +$highlight-color-60: #6685c2 !default; // Navigator mask fill. +$highlight-color-20: #ccd6eb !default; // Ticks and axis line. +$highlight-color-10: #e6ebf5 !default; // Pressed button, color axis min color. + +// Fonts +$font-family: "Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif !default; +$title-font-size: 1.5em !default; +$subtitle-font-size: 1em !default; +$legend-font-size: 1em !default; +$axis-labels-font-size: 0.9em !default; + +// Tooltip +$tooltip-border: 1px !default; +$tooltip-background: $neutral-color-3 !default; + +// Axes +$xaxis-grid-line: 0px !default; + +// Range-selector +$range-selector-button-border: 0px !default; +$range-selector-input-text: $neutral-color-80 !default; +$range-selector-input-border: $neutral-color-20 !default; + +// Data-labels +$data-label-color: $neutral-color-80 !default; + +// Buttons +$context-button-background: $background-color !default; + +$highcharts-button-background: $neutral-color-3 !default; +$highcharts-button-border: $neutral-color-20 !default; +$highcharts-button-text: $neutral-color-80 !default; + +$highcharts-button-pressed-background: $highlight-color-10 !default; +$highcharts-button-pressed-border: $neutral-color-20 !default; +$highcharts-button-pressed-text: $neutral-color-80 !default; + +$highcharts-button-hover-background: $neutral-color-10 !default; +$highcharts-button-hover-border: $neutral-color-20 !default; +$highcharts-button-hover-text: $neutral-color-80 !default; + +// Navigator +$navigator-series-fill: $highlight-color-80 !default; +$navigator-series-border: $highlight-color-80 !default; + +// Scrollbar +$scrollbar-track-background: $neutral-color-5 !default; +$scrollbar-track-border: $neutral-color-5 !default; + +// Indicators +$indicator-positive-line: #06B535; +$indicator-negative-line: #F21313; + +.highcharts-container { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; + text-align: left; + line-height: normal; + z-index: 0; /* #1072 */ + -webkit-tap-highlight-color: rgba(0,0,0,0); + font-family: $font-family; + font-size: 12px; +} +.highcharts-root { + display: block; +} +.highcharts-root text { + stroke-width: 0; +} +.highcharts-strong { + font-weight: bold; +} +.highcharts-emphasized { + font-style: italic; +} +.highcharts-anchor { + cursor: pointer; +} +.highcharts-background { + fill: $background-color; +} +.highcharts-plot-border, .highcharts-plot-background { + fill: none; +} +.highcharts-label-box { + fill: none; +} +.highcharts-button-box { + fill: inherit; +} +.highcharts-tracker-line { + stroke-linejoin: round; + stroke: rgba(192, 192, 192, 0.0001); + stroke-width: 22; + fill: none; +} +.highcharts-tracker-area { + fill: rgba(192, 192, 192, 0.0001); + stroke-width: 0; +} + +/* Titles */ +.highcharts-title { + fill: $neutral-color-80; + font-size: $title-font-size; +} +.highcharts-subtitle { + fill: $neutral-color-60; +} + +/* Axes */ +.highcharts-axis-line { + fill: none; + stroke: $highlight-color-20; +} +.highcharts-yaxis .highcharts-axis-line { + stroke-width: 0; +} +.highcharts-axis-title { + fill: $neutral-color-60; +} +.highcharts-axis-labels { + fill: $neutral-color-60; + cursor: default; + font-size: $axis-labels-font-size; +} +.highcharts-grid-line { + fill: none; + stroke: $neutral-color-10; +} +.highcharts-xaxis-grid .highcharts-grid-line { + stroke-width: $xaxis-grid-line; +} +.highcharts-tick { + stroke: $highlight-color-20; +} +.highcharts-yaxis .highcharts-tick { + stroke-width: 0; +} +.highcharts-minor-grid-line { + stroke: $neutral-color-5; +} +.highcharts-crosshair-thin { + stroke-width: 1px; + stroke: $neutral-color-20; +} +.highcharts-crosshair-category { + stroke: $highlight-color-20; + stroke-opacity: 0.25; +} + + +/* Credits */ +.highcharts-credits { + cursor: pointer; + fill: $neutral-color-40; + font-size: 0.7em; + transition: fill 250ms, font-size 250ms; +} +.highcharts-credits:hover { + fill: black; + font-size: 1em; +} + +/* Tooltip */ +.highcharts-tooltip { + cursor: default; + pointer-events: none; + white-space: nowrap; + transition: stroke 150ms; +} +.highcharts-tooltip text { + fill: $neutral-color-80; +} +.highcharts-tooltip .highcharts-header { + font-size: 0.85em; +} +.highcharts-tooltip-box { + stroke-width: $tooltip-border; + fill: $tooltip-background; + fill-opacity: 0.85; +} +.highcharts-tooltip-box .highcharts-label-box { + fill: $tooltip-background; + fill-opacity: 0.85; +} + +.highcharts-selection-marker { + fill: $highlight-color-80; + fill-opacity: 0.25; +} + +.highcharts-graph { + fill: none; + stroke-width: 2px; + stroke-linecap: round; + stroke-linejoin: round; +} +.highcharts-state-hover .highcharts-graph { + stroke-width: 3; +} +.highcharts-state-hover path { + transition: stroke-width 50; /* quick in */ +} +.highcharts-state-normal path { + transition: stroke-width 250ms; /* slow out */ +} + +/* Legend hover affects points and series */ +g.highcharts-series, +.highcharts-point, +.highcharts-markers, +.highcharts-data-labels { + transition: opacity 250ms; +} +.highcharts-legend-series-active g.highcharts-series:not(.highcharts-series-hover), +.highcharts-legend-point-active .highcharts-point:not(.highcharts-point-hover), +.highcharts-legend-series-active .highcharts-markers:not(.highcharts-series-hover), +.highcharts-legend-series-active .highcharts-data-labels:not(.highcharts-series-hover) { + opacity: 0.2; +} + +/* Series options */ + +/* Default colors */ +@for $i from 1 through length($colors) { + $color: nth($colors, $i); + .highcharts-color-#{$i - 1} { + fill: $color; + stroke: $color; + } +} + +.highcharts-area { + fill-opacity: 0.75; + stroke-width: 0; +} +.highcharts-markers { + stroke-width: 1px; + stroke: $background-color; +} +.highcharts-point { + stroke-width: 1px; +} +.highcharts-dense-data .highcharts-point { + stroke-width: 0; +} + +.highcharts-data-label { + font-size: 0.9em; + font-weight: bold; +} +.highcharts-data-label-box { + fill: none; + stroke-width: 0; +} +.highcharts-data-label text, text.highcharts-data-label { + fill: $data-label-color; +} +.highcharts-data-label-connector { + fill: none; +} +.highcharts-halo { + fill-opacity: 0.25; + stroke-width: 0; +} +.highcharts-series:not(.highcharts-pie-series) .highcharts-point-select, +.highcharts-markers .highcharts-point-select { + fill: $neutral-color-20; + stroke: $neutral-color-100; +} +.highcharts-column-series rect.highcharts-point { + // rect to prevent stroke on 3D columns + stroke: $background-color; +} +.highcharts-column-series .highcharts-point { + transition: fill-opacity 250ms; +} +.highcharts-column-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} +.highcharts-pie-series .highcharts-point { + stroke-linejoin: round; + stroke: $background-color; +} +.highcharts-pie-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} +.highcharts-funnel-series .highcharts-point { + stroke-linejoin: round; + stroke: $background-color; +} +.highcharts-funnel-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} +.highcharts-funnel-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} +.highcharts-pyramid-series .highcharts-point { + stroke-linejoin: round; + stroke: $background-color; +} +.highcharts-pyramid-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} +.highcharts-pyramid-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} +.highcharts-solidgauge-series .highcharts-point { + stroke-width: 0; +} +.highcharts-treemap-series .highcharts-point { + stroke-width: 1px; + stroke: $neutral-color-10; + transition: stroke 250ms, fill 250ms, fill-opacity 250ms; +} +.highcharts-treemap-series .highcharts-point-hover { + stroke: $neutral-color-40; + transition: stroke 25ms, fill 25ms, fill-opacity 25ms; +} + +.highcharts-treemap-series .highcharts-above-level { + display: none; +} +.highcharts-treemap-series .highcharts-internal-node { + fill: none; +} +.highcharts-treemap-series .highcharts-internal-node-interactive { + fill-opacity: 0.15; + cursor: pointer; +} +.highcharts-treemap-series .highcharts-internal-node-interactive:hover { + fill-opacity: 0.75; +} + + + +/* Legend */ +.highcharts-legend-box { + fill: none; + stroke-width: 0; +} +.highcharts-legend-item > text { + fill: $neutral-color-80; + font-weight: bold; + font-size: $legend-font-size; + cursor: pointer; + stroke-width: 0; +} +.highcharts-legend-item:hover text { + fill: $neutral-color-100; +} +.highcharts-legend-item-hidden * { + fill: $neutral-color-20 !important; + stroke: $neutral-color-20 !important; + transition: fill 250ms; +} +.highcharts-legend-nav-active { + fill: $highlight-color-100; + cursor: pointer; +} +.highcharts-legend-nav-inactive { + fill: $neutral-color-20; +} +.highcharts-legend-title-box { + fill: none; + stroke-width: 0; +} + +/* Bubble legend */ +.highcharts-bubble-legend-symbol { + stroke-width: 2; + fill-opacity: 0.5; +} +.highcharts-bubble-legend-connectors { + stroke-width: 1; +} +.highcharts-bubble-legend-labels { + fill: $neutral-color-80; +} + +/* Loading */ +.highcharts-loading { + position: absolute; + background-color: $background-color; + opacity: 0.5; + text-align: center; + z-index: 10; + transition: opacity 250ms; +} +.highcharts-loading-hidden { + height: 0 !important; + opacity: 0; + overflow: hidden; + transition: opacity 250ms, height 250ms step-end; +} +.highcharts-loading-inner { + font-weight: bold; + position: relative; + top: 45%; +} + +/* Plot bands and polar pane backgrounds */ +.highcharts-plot-band, .highcharts-pane { + fill: $neutral-color-100; + fill-opacity: 0.05; +} +.highcharts-plot-line { + fill: none; + stroke: $neutral-color-40; + stroke-width: 1px; +} + +/* Highcharts More and modules */ +.highcharts-boxplot-box { + fill: $background-color; +} +.highcharts-boxplot-median { + stroke-width: 2px; +} +.highcharts-bubble-series .highcharts-point { + fill-opacity: 0.5; +} +.highcharts-errorbar-series .highcharts-point { + stroke: $neutral-color-100; +} +.highcharts-gauge-series .highcharts-data-label-box { + stroke: $neutral-color-20; + stroke-width: 1px; +} +.highcharts-gauge-series .highcharts-dial { + fill: $neutral-color-100; + stroke-width: 0; +} +.highcharts-polygon-series .highcharts-graph { + fill: inherit; + stroke-width: 0; +} +.highcharts-waterfall-series .highcharts-graph { + stroke: $neutral-color-80; + stroke-dasharray: 1, 3; +} +.highcharts-sankey-series .highcharts-point { + stroke-width: 0; +} +.highcharts-sankey-series .highcharts-link { + transition: fill 250ms, fill-opacity 250ms; + fill-opacity: 0.5; +} +.highcharts-sankey-series .highcharts-point-hover.highcharts-link { + transition: fill 50ms, fill-opacity 50ms; + fill-opacity: 1; +} +.highcharts-venn-series .highcharts-point { + fill-opacity: 0.75; + stroke: $neutral-color-20; + transition: stroke 250ms, fill-opacity 250ms; +} +.highcharts-venn-series .highcharts-point-hover { + fill-opacity: 1; + stroke: $neutral-color-20; +} + +/* Highstock */ +.highcharts-navigator-mask-outside { + fill-opacity: 0; +} +.highcharts-navigator-mask-inside { + fill: $highlight-color-60; /* navigator.maskFill option */ + fill-opacity: 0.25; + cursor: ew-resize; +} +.highcharts-navigator-outline { + stroke: $neutral-color-20; + fill: none; +} +.highcharts-navigator-handle { + stroke: $neutral-color-20; + fill: $neutral-color-5; + cursor: ew-resize; +} +.highcharts-navigator-series { + fill: $navigator-series-fill; + stroke: $navigator-series-border; +} +.highcharts-navigator-series .highcharts-graph { + stroke-width: 1px; +} +.highcharts-navigator-series .highcharts-area { + fill-opacity: 0.05; +} +.highcharts-navigator-xaxis .highcharts-axis-line { + stroke-width: 0; +} +.highcharts-navigator-xaxis .highcharts-grid-line { + stroke-width: 1px; + stroke: $neutral-color-10; +} +.highcharts-navigator-xaxis.highcharts-axis-labels { + fill: $neutral-color-40; +} +.highcharts-navigator-yaxis .highcharts-grid-line { + stroke-width: 0; +} +.highcharts-scrollbar-thumb { + fill: $neutral-color-20; + stroke: $neutral-color-20; + stroke-width: 1px; +} +.highcharts-scrollbar-button { + fill: $neutral-color-10; + stroke: $neutral-color-20; + stroke-width: 1px; +} +.highcharts-scrollbar-arrow { + fill: $neutral-color-60; +} +.highcharts-scrollbar-rifles { + stroke: $neutral-color-60; + stroke-width: 1px; +} +.highcharts-scrollbar-track { + fill: $scrollbar-track-background; + stroke: $scrollbar-track-border; + stroke-width: 1px; +} +.highcharts-button { + fill: $highcharts-button-background; + stroke: $highcharts-button-border; + cursor: default; + stroke-width: 1px; + transition: fill 250ms; +} +.highcharts-button text { + fill: $highcharts-button-text; +} +.highcharts-button-hover { + transition: fill 0ms; + fill: $highcharts-button-hover-background; + stroke: $highcharts-button-hover-border; +} +.highcharts-button-hover text { + fill: $highcharts-button-hover-text; +} +.highcharts-button-pressed { + font-weight: bold; + fill: $highcharts-button-pressed-background; + stroke: $highcharts-button-pressed-border; +} +.highcharts-button-pressed text { + fill: $highcharts-button-pressed-text; + font-weight: bold; +} +.highcharts-button-disabled text { + fill: $highcharts-button-text; +} +.highcharts-range-selector-buttons .highcharts-button { + stroke-width: $range-selector-button-border; +} +.highcharts-range-label rect { + fill: none; +} +.highcharts-range-label text { + fill: $neutral-color-60; +} +.highcharts-range-input rect { + fill: none; +} +.highcharts-range-input text { + fill: $range-selector-input-text; +} +.highcharts-range-input { + stroke-width:1px; + stroke: $range-selector-input-border; +} +input.highcharts-range-selector { + position: absolute; + border: 0; + width: 1px; /* Chrome needs a pixel to see it */ + height: 1px; + padding: 0; + text-align: center; + left: -9em; /* #4798 */ +} +.highcharts-crosshair-label text { + fill: $background-color; + font-size: 1.1em; +} +.highcharts-crosshair-label .highcharts-label-box { + fill: inherit; +} + + +.highcharts-candlestick-series .highcharts-point { + stroke: $neutral-color-100; + stroke-width: 1px; +} +.highcharts-candlestick-series .highcharts-point-up { + fill: $background-color; +} +.highcharts-ohlc-series .highcharts-point-hover { + stroke-width: 3px; +} +.highcharts-flags-series .highcharts-point .highcharts-label-box { + stroke: $neutral-color-40; + fill: $background-color; + transition: fill 250ms; +} +.highcharts-flags-series .highcharts-point-hover .highcharts-label-box { + stroke: $neutral-color-100; + fill: $highlight-color-20; +} +.highcharts-flags-series .highcharts-point text { + fill: $neutral-color-100; + font-size: 0.9em; + font-weight: bold; +} + +/* Highmaps */ +.highcharts-map-series .highcharts-point { + transition: fill 500ms, fill-opacity 500ms, stroke-width 250ms; + stroke: $neutral-color-20; +} +.highcharts-map-series .highcharts-point-hover { + transition: fill 0ms, fill-opacity 0ms; + fill-opacity: 0.5; + stroke-width: 2px; +} +.highcharts-mapline-series .highcharts-point { + fill: none; +} +.highcharts-heatmap-series .highcharts-point { + stroke-width: 0; +} +.highcharts-map-navigation { + font-size: 1.3em; + font-weight: bold; + text-align: center; +} +.highcharts-coloraxis { + stroke-width: 0; +} +.highcharts-coloraxis-marker { + fill: $neutral-color-40; +} +.highcharts-null-point { + fill: $neutral-color-3; +} + +/* 3d charts */ +.highcharts-3d-frame { + fill: transparent; +} + +/* Exporting module */ +.highcharts-contextbutton { + fill: $context-button-background; /* needed to capture hover */ + stroke: none; + stroke-linecap: round; +} +.highcharts-contextbutton:hover { + fill: $neutral-color-10; + stroke: $neutral-color-10; +} +.highcharts-button-symbol { + stroke: $neutral-color-60; + stroke-width: 3px; +} +.highcharts-menu { + border: 1px solid $neutral-color-40; + background: $background-color; + padding: 5px 0; + box-shadow: 3px 3px 10px #888; +} +.highcharts-menu-item { + padding: 0.5em 1em; + background: none; + color: $neutral-color-80; + cursor: pointer; + transition: background 250ms, color 250ms; +} +.highcharts-menu-item:hover { + background: $highlight-color-80; + color: $background-color; +} + +/* Drilldown module */ +.highcharts-drilldown-point { + cursor: pointer; +} +.highcharts-drilldown-data-label text, +text.highcharts-drilldown-data-label, +.highcharts-drilldown-axis-label { + cursor: pointer; + fill: $highlight-color-100; + font-weight: bold; + text-decoration: underline; +} + +/* No-data module */ +.highcharts-no-data text { + font-weight: bold; + font-size: 12px; + fill: $neutral-color-60; +} + +/* Drag-panes module */ +.highcharts-axis-resizer { + cursor: ns-resize; + stroke: black; + stroke-width: 2px; +} + +/* Bullet type series */ +.highcharts-bullet-target { + stroke-width: 0; +} + +/* Lineargauge type series */ +.highcharts-lineargauge-target { + stroke-width: 1px; + stroke: $neutral-color-80; +} +.highcharts-lineargauge-target-line { + stroke-width: 1px; + stroke: $neutral-color-80; +} + +/* Annotations module */ +.highcharts-annotation-label-box { + stroke-width: 1px; + stroke: $neutral-color-100; + fill: $neutral-color-100; + fill-opacity: 0.75; +} +.highcharts-annotation-label text { + fill: $neutral-color-10; +} + +/* Gantt */ +.highcharts-treegrid-node-collapsed, .highcharts-treegrid-node-expanded { + cursor: pointer; +} +.highcharts-point-connecting-path { + fill: none; +} +.highcharts-grid-axis .highcharts-tick { + stroke-width: 1px; +} +.highcharts-grid-axis .highcharts-axis-line { + stroke-width: 1px; +} \ No newline at end of file diff --git a/DiscImageChef.Server/styles/dos/_colors.scss b/DiscImageChef.Server/styles/dos/_colors.scss new file mode 100644 index 00000000..81d0f725 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/_colors.scss @@ -0,0 +1,90 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _colors.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets colors for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +/* Sets the grayscale for Bootstrap */ +$white: #AAAAAA; +$darkgray: #555555; +$gray-100: #AAAAAA; +$gray-200: #AAAAAA; +$gray-300: #AAAAAA; +$gray-400: #AAAAAA; +$gray-500: #555555; +$gray-600: #555555; +$gray-700: #555555; +$gray-800: #555555; +$gray-900: #555555; +$black: #000; + +/* Sets color palette, using EGA colors */ +$blue: #0000AA; +$indigo: #AA55AA; +$purple: #AA00FF; +$pink: #FF55FF; +$red: #AA0000; +$orange: #FF5555; +$yellow: #FFFF55; +$green: #00AA00; +$teal: #55FFFF; +$cyan: #00AAAA; +$brown: #AA5500; +$brightwhite: #FFFFFF; + +/* Bootstrap color aliases */ +$primary: $blue; +$secondary: $gray-600; +$success: $green; +$info: $cyan; +$warning: $yellow; +$danger: $red; +$light: $gray-100; +$dark: $gray-800; + +/* Colors for */ +$body-bg: $black; +$body-color: $white; + +/* Colors for */ +$link-color: $teal; +$link-hover-color: $yellow; + +/* Colors for cards */ +$card-border-color: rgba($darkgray, .125); +$card-cap-bg: rgba($darkgray, .03); +$card-cap-color: inherit; +$card-bg: $blue; + +/* Colors for tables */ +$table-dark-bg: $cyan; +$table-dark-accent-bg: rgba($white, .05) !default; +$table-dark-hover-bg: rgba($white, .075) !default; +$table-dark-border-color: lighten($yellow, 7.5%) !default; +$table-dark-color: $yellow !default; diff --git a/DiscImageChef.Server/styles/dos/_font.scss b/DiscImageChef.Server/styles/dos/_font.scss new file mode 100644 index 00000000..5bc8a839 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/_font.scss @@ -0,0 +1,51 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _font.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets font for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +/* Sets font to VGA square */ +@font-face +{ + font-family: 'VGAsquarePx'; + src: url(../../fonts/vga_squarepx.eot); + src: url(../../fonts/vga_squarepx.eot?#iefix) format('embedded-opentype'), + url(../../fonts/vga_squarepx.woff2) format('woff2'), + url(../../fonts/vga_squarepx.woff) format('woff'), + url(../../fonts/vga_squarepx.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} + +$font-family-sans-serif: 'VGAsquarePx'; +$font-family-monospace: 'VGAsquarePx'; +$font-family-base: 'VGAsquarePx'; +$font-size-base: 1.75rem; + +$line-height-base: 1; diff --git a/DiscImageChef.Server/styles/dos/_fontstyles.scss b/DiscImageChef.Server/styles/dos/_fontstyles.scss new file mode 100644 index 00000000..b0338784 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/_fontstyles.scss @@ -0,0 +1,51 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _fontstyles.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets font styles for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; + +/* Sets the style for emphasis/italics */ +em, i +{ + color: $green; + font-style: normal; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong +{ + color: $brightwhite; + font-size: 1em; + font-style: normal; + font-weight: normal; + margin: 0; +} diff --git a/DiscImageChef.Server/styles/dos/dicserver.css b/DiscImageChef.Server/styles/dos/dicserver.css new file mode 100644 index 00000000..b26517b6 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/dicserver.css @@ -0,0 +1,9596 @@ +@charset "UTF-8"; +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using EGA colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets font to VGA square */ +@font-face { + font-family: "VGAsquarePx"; + src: url(../../fonts/vga_squarepx.eot); + src: url(../../fonts/vga_squarepx.eot?#iefix) format("embedded-opentype"), url(../../fonts/vga_squarepx.woff2) format("woff2"), url(../../fonts/vga_squarepx.woff) format("woff"), url(../../fonts/vga_squarepx.ttf) format("truetype"); + font-weight: normal; + font-style: normal; +} +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using EGA colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets the style for emphasis/italics */ +em, i { + color: #00AA00; + font-style: normal; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong { + color: #FFFFFF; + font-size: 1em; + font-style: normal; + font-weight: normal; + margin: 0; +} + +/*! + * Bootstrap v4.2.1 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #0000AA; + --indigo: #AA55AA; + --purple: #AA00FF; + --pink: #FF55FF; + --red: #AA0000; + --orange: #FF5555; + --yellow: #FFFF55; + --green: #00AA00; + --teal: #55FFFF; + --cyan: #00AAAA; + --white: #AAAAAA; + --gray: #555555; + --gray-dark: #555555; + --primary: #0000AA; + --secondary: #555555; + --success: #00AA00; + --info: #00AAAA; + --warning: #FFFF55; + --danger: #AA0000; + --light: #AAAAAA; + --dark: #555555; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: "VGAsquarePx"; + --font-family-monospace: "VGAsquarePx"; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: "VGAsquarePx"; + font-size: 1.75rem; + font-weight: 400; + line-height: 1; + color: #AAAAAA; + text-align: left; + background-color: #000; +} + +[tabindex="-1"]:focus { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: #55FFFF; + text-decoration: none; + background-color: transparent; +} +a:hover { + color: #FFFF55; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: "VGAsquarePx"; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #555555; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type=radio], +input[type=checkbox] { + box-sizing: border-box; + padding: 0; +} + +input[type=date], +input[type=time], +input[type=datetime-local], +input[type=month] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 500; + line-height: 1.2; + color: inherit; +} + +h1, .h1 { + font-size: 4.375rem; +} + +h2, .h2 { + font-size: 3.5rem; +} + +h3, .h3 { + font-size: 3.0625rem; +} + +h4, .h4 { + font-size: 2.625rem; +} + +h5, .h5 { + font-size: 2.1875rem; +} + +h6, .h6 { + font-size: 1.75rem; +} + +.lead { + font-size: 2.1875rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 2.1875rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #555555; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #000; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #555555; +} + +code { + font-size: 87.5%; + color: #FF55FF; + word-break: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #AAAAAA; + background-color: #555555; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #555555; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.row { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} +.no-gutters > .col, +.no-gutters > [class*=col-] { + padding-right: 0; + padding-left: 0; +} + +.col-xl, +.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg, +.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md, +.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm, +.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col, +.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; +} + +.col-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; +} + +.col-3 { + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; +} + +.col-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; +} + +.col-6 { + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; +} + +.col-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; +} + +.col-9 { + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; +} + +.col-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; +} + +.col-12 { + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + order: -1; +} + +.order-last { + order: 13; +} + +.order-0 { + order: 0; +} + +.order-1 { + order: 1; +} + +.order-2 { + order: 2; +} + +.order-3 { + order: 3; +} + +.order-4 { + order: 4; +} + +.order-5 { + order: 5; +} + +.order-6 { + order: 6; +} + +.order-7 { + order: 7; +} + +.order-8 { + order: 8; +} + +.order-9 { + order: 9; +} + +.order-10 { + order: 10; +} + +.order-11 { + order: 11; +} + +.order-12 { + order: 12; +} + +.offset-1 { + margin-left: 8.3333333333%; +} + +.offset-2 { + margin-left: 16.6666666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.3333333333%; +} + +.offset-5 { + margin-left: 41.6666666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.3333333333%; +} + +.offset-8 { + margin-left: 66.6666666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.3333333333%; +} + +.offset-11 { + margin-left: 91.6666666667%; +} + +@media (min-width: 576px) { + .col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-sm-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-sm-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-sm-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-sm-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-sm-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-sm-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-sm-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-sm-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-sm-first { + order: -1; + } + + .order-sm-last { + order: 13; + } + + .order-sm-0 { + order: 0; + } + + .order-sm-1 { + order: 1; + } + + .order-sm-2 { + order: 2; + } + + .order-sm-3 { + order: 3; + } + + .order-sm-4 { + order: 4; + } + + .order-sm-5 { + order: 5; + } + + .order-sm-6 { + order: 6; + } + + .order-sm-7 { + order: 7; + } + + .order-sm-8 { + order: 8; + } + + .order-sm-9 { + order: 9; + } + + .order-sm-10 { + order: 10; + } + + .order-sm-11 { + order: 11; + } + + .order-sm-12 { + order: 12; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.3333333333%; + } + + .offset-sm-2 { + margin-left: 16.6666666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.3333333333%; + } + + .offset-sm-5 { + margin-left: 41.6666666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.3333333333%; + } + + .offset-sm-8 { + margin-left: 66.6666666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.3333333333%; + } + + .offset-sm-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 768px) { + .col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-md-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-md-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-md-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-md-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-md-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-md-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-md-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-md-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-md-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-md-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-md-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-md-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-md-first { + order: -1; + } + + .order-md-last { + order: 13; + } + + .order-md-0 { + order: 0; + } + + .order-md-1 { + order: 1; + } + + .order-md-2 { + order: 2; + } + + .order-md-3 { + order: 3; + } + + .order-md-4 { + order: 4; + } + + .order-md-5 { + order: 5; + } + + .order-md-6 { + order: 6; + } + + .order-md-7 { + order: 7; + } + + .order-md-8 { + order: 8; + } + + .order-md-9 { + order: 9; + } + + .order-md-10 { + order: 10; + } + + .order-md-11 { + order: 11; + } + + .order-md-12 { + order: 12; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.3333333333%; + } + + .offset-md-2 { + margin-left: 16.6666666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.3333333333%; + } + + .offset-md-5 { + margin-left: 41.6666666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.3333333333%; + } + + .offset-md-8 { + margin-left: 66.6666666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.3333333333%; + } + + .offset-md-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 992px) { + .col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-lg-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-lg-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-lg-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-lg-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-lg-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-lg-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-lg-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-lg-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-lg-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-lg-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-lg-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-lg-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-lg-first { + order: -1; + } + + .order-lg-last { + order: 13; + } + + .order-lg-0 { + order: 0; + } + + .order-lg-1 { + order: 1; + } + + .order-lg-2 { + order: 2; + } + + .order-lg-3 { + order: 3; + } + + .order-lg-4 { + order: 4; + } + + .order-lg-5 { + order: 5; + } + + .order-lg-6 { + order: 6; + } + + .order-lg-7 { + order: 7; + } + + .order-lg-8 { + order: 8; + } + + .order-lg-9 { + order: 9; + } + + .order-lg-10 { + order: 10; + } + + .order-lg-11 { + order: 11; + } + + .order-lg-12 { + order: 12; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.3333333333%; + } + + .offset-lg-2 { + margin-left: 16.6666666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.3333333333%; + } + + .offset-lg-5 { + margin-left: 41.6666666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.3333333333%; + } + + .offset-lg-8 { + margin-left: 66.6666666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.3333333333%; + } + + .offset-lg-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 1200px) { + .col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-xl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-xl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-xl-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-xl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-xl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-xl-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-xl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-xl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-xl-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-xl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-xl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-xl-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-xl-first { + order: -1; + } + + .order-xl-last { + order: 13; + } + + .order-xl-0 { + order: 0; + } + + .order-xl-1 { + order: 1; + } + + .order-xl-2 { + order: 2; + } + + .order-xl-3 { + order: 3; + } + + .order-xl-4 { + order: 4; + } + + .order-xl-5 { + order: 5; + } + + .order-xl-6 { + order: 6; + } + + .order-xl-7 { + order: 7; + } + + .order-xl-8 { + order: 8; + } + + .order-xl-9 { + order: 9; + } + + .order-xl-10 { + order: 10; + } + + .order-xl-11 { + order: 11; + } + + .order-xl-12 { + order: 12; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.3333333333%; + } + + .offset-xl-2 { + margin-left: 16.6666666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.3333333333%; + } + + .offset-xl-5 { + margin-left: 41.6666666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.3333333333%; + } + + .offset-xl-8 { + margin-left: 66.6666666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.3333333333%; + } + + .offset-xl-11 { + margin-left: 91.6666666667%; + } +} +.table { + width: 100%; + margin-bottom: 1rem; + background-color: transparent; +} +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #AAAAAA; +} +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #AAAAAA; +} +.table tbody + tbody { + border-top: 2px solid #AAAAAA; +} +.table .table { + background-color: #000; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #AAAAAA; +} +.table-bordered th, +.table-bordered td { + border: 1px solid #AAAAAA; +} +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #7a7aaa; +} +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #5252aa; +} + +.table-hover .table-primary:hover { + background-color: #6a6aa0; +} +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #6a6aa0; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #929292; +} +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #7e7e7e; +} + +.table-hover .table-secondary:hover { + background-color: #858585; +} +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #858585; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #7aaa7a; +} +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #52aa52; +} + +.table-hover .table-success:hover { + background-color: #6aa06a; +} +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #6aa06a; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #7aaaaa; +} +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #52aaaa; +} + +.table-hover .table-info:hover { + background-color: #6aa0a0; +} +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #6aa0a0; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #c2c292; +} +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #d6d67e; +} + +.table-hover .table-warning:hover { + background-color: #b9b982; +} +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #b9b982; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #aa7a7a; +} +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #aa5252; +} + +.table-hover .table-danger:hover { + background-color: #a06a6a; +} +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #a06a6a; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #aaaaaa; +} +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #aaaaaa; +} + +.table-hover .table-light:hover { + background-color: #9d9d9d; +} +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #9d9d9d; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #929292; +} +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #7e7e7e; +} + +.table-hover .table-dark:hover { + background-color: #858585; +} +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #858585; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #FFFF55; + background-color: #00AAAA; + border-color: #ffff7b; +} +.table .thead-light th { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} + +.table-dark { + color: #FFFF55; + background-color: #00AAAA; +} +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #ffff7b; +} +.table-dark.table-bordered { + border: 0; +} +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(170, 170, 170, 0.05); +} +.table-dark.table-hover tbody tr:hover { + background-color: rgba(170, 170, 170, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; +} +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + height: calc(2.5rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1.75rem; + font-weight: 400; + line-height: 1; + color: #555555; + background-color: #AAAAAA; + background-clip: padding-box; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control:focus { + color: #555555; + background-color: #AAAAAA; + border-color: #2b2bff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.form-control::placeholder { + color: #555555; + opacity: 1; +} +.form-control:disabled, .form-control[readonly] { + background-color: #AAAAAA; + opacity: 1; +} + +select.form-control:focus::-ms-value { + color: #555555; + background-color: #AAAAAA; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 2.1875rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 1.53125rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1; + color: #AAAAAA; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(2.796875rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 1.53125rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.form-control-lg { + height: calc(4.28125rem + 2px); + padding: 0.5rem 1rem; + font-size: 2.1875rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} +.form-row > .col, +.form-row > [class*=col-] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} +.form-check-input:disabled ~ .form-check-label { + color: #555555; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #00AA00; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 1.53125rem; + line-height: 1; + color: #AAAAAA; + background-color: rgba(0, 170, 0, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #00AA00; + padding-right: 2.5rem; + background-repeat: no-repeat; + background-position: center right calc(2.5rem / 4); + background-size: calc(2.5rem / 2) calc(2.5rem / 2); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300AA00' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #00AA00; + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.25); +} +.was-validated .form-control:valid ~ .valid-feedback, +.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, +.form-control.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: 2.5rem; + background-position: top calc(2.5rem / 4) right calc(2.5rem / 4); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #00AA00; + padding-right: 3.625rem; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23555555' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300AA00' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") no-repeat center right 1.75rem/1.25rem 1.25rem; +} +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #00AA00; + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.25); +} +.was-validated .custom-select:valid ~ .valid-feedback, +.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, +.custom-select.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control-file:valid ~ .valid-feedback, +.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback, +.form-control-file.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #00AA00; +} +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #00AA00; +} +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #00AA00; +} +.was-validated .custom-control-input:valid ~ .valid-feedback, +.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, +.custom-control-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #00dd00; + background-color: #00dd00; +} +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.25); +} +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #00AA00; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #00AA00; +} +.was-validated .custom-file-input:valid ~ .valid-feedback, +.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, +.custom-file-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #00AA00; + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #AA0000; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 1.53125rem; + line-height: 1; + color: #AAAAAA; + background-color: rgba(170, 0, 0, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #AA0000; + padding-right: 2.5rem; + background-repeat: no-repeat; + background-position: center right calc(2.5rem / 4); + background-size: calc(2.5rem / 2) calc(2.5rem / 2); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23AA0000' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #AA0000; + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.25); +} +.was-validated .form-control:invalid ~ .invalid-feedback, +.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, +.form-control.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: 2.5rem; + background-position: top calc(2.5rem / 4) right calc(2.5rem / 4); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #AA0000; + padding-right: 3.625rem; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23555555' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23AA0000' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") no-repeat center right 1.75rem/1.25rem 1.25rem; +} +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #AA0000; + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.25); +} +.was-validated .custom-select:invalid ~ .invalid-feedback, +.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, +.custom-select.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control-file:invalid ~ .invalid-feedback, +.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback, +.form-control-file.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #AA0000; +} +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #AA0000; +} +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #AA0000; +} +.was-validated .custom-control-input:invalid ~ .invalid-feedback, +.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, +.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #dd0000; + background-color: #dd0000; +} +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.25); +} +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #AA0000; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #AA0000; +} +.was-validated .custom-file-input:invalid ~ .invalid-feedback, +.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, +.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #AA0000; + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.25); +} + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center; +} +.form-inline .form-check { + width: 100%; +} +@media (min-width: 576px) { + .form-inline label { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, +.form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + align-items: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #AAAAAA; + text-align: center; + vertical-align: middle; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1.75rem; + line-height: 1; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: #AAAAAA; + text-decoration: none; +} +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.btn.disabled, .btn:disabled { + opacity: 0.65; +} +.btn:not(:disabled):not(.disabled) { + cursor: pointer; +} +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.btn-primary:hover { + color: #AAAAAA; + background-color: #000084; + border-color: #000077; +} +.btn-primary:focus, .btn-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(26, 26, 170, 0.5); +} +.btn-primary.disabled, .btn-primary:disabled { + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { + color: #AAAAAA; + background-color: #000077; + border-color: #00006a; +} +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(26, 26, 170, 0.5); +} + +.btn-secondary { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-secondary:hover { + color: #AAAAAA; + background-color: #424242; + border-color: #3c3c3c; +} +.btn-secondary:focus, .btn-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(98, 98, 98, 0.5); +} +.btn-secondary.disabled, .btn-secondary:disabled { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { + color: #AAAAAA; + background-color: #3c3c3c; + border-color: #353535; +} +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(98, 98, 98, 0.5); +} + +.btn-success { + color: #AAAAAA; + background-color: #00AA00; + border-color: #00AA00; +} +.btn-success:hover { + color: #AAAAAA; + background-color: #008400; + border-color: #007700; +} +.btn-success:focus, .btn-success.focus { + box-shadow: 0 0 0 0.2rem rgba(26, 170, 26, 0.5); +} +.btn-success.disabled, .btn-success:disabled { + color: #AAAAAA; + background-color: #00AA00; + border-color: #00AA00; +} +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { + color: #AAAAAA; + background-color: #007700; + border-color: #006a00; +} +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(26, 170, 26, 0.5); +} + +.btn-info { + color: #AAAAAA; + background-color: #00AAAA; + border-color: #00AAAA; +} +.btn-info:hover { + color: #AAAAAA; + background-color: #008484; + border-color: #007777; +} +.btn-info:focus, .btn-info.focus { + box-shadow: 0 0 0 0.2rem rgba(26, 170, 170, 0.5); +} +.btn-info.disabled, .btn-info:disabled { + color: #AAAAAA; + background-color: #00AAAA; + border-color: #00AAAA; +} +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { + color: #AAAAAA; + background-color: #007777; + border-color: #006a6a; +} +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(26, 170, 170, 0.5); +} + +.btn-warning { + color: #555555; + background-color: #FFFF55; + border-color: #FFFF55; +} +.btn-warning:hover { + color: #555555; + background-color: #ffff2f; + border-color: #ffff22; +} +.btn-warning:focus, .btn-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(230, 230, 85, 0.5); +} +.btn-warning.disabled, .btn-warning:disabled { + color: #555555; + background-color: #FFFF55; + border-color: #FFFF55; +} +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle { + color: #555555; + background-color: #ffff22; + border-color: #ffff15; +} +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(230, 230, 85, 0.5); +} + +.btn-danger { + color: #AAAAAA; + background-color: #AA0000; + border-color: #AA0000; +} +.btn-danger:hover { + color: #AAAAAA; + background-color: #840000; + border-color: #770000; +} +.btn-danger:focus, .btn-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(170, 26, 26, 0.5); +} +.btn-danger.disabled, .btn-danger:disabled { + color: #AAAAAA; + background-color: #AA0000; + border-color: #AA0000; +} +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { + color: #AAAAAA; + background-color: #770000; + border-color: #6a0000; +} +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(170, 26, 26, 0.5); +} + +.btn-light { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-light:hover { + color: #555555; + background-color: #979797; + border-color: #919191; +} +.btn-light:focus, .btn-light.focus { + box-shadow: 0 0 0 0.2rem rgba(157, 157, 157, 0.5); +} +.btn-light.disabled, .btn-light:disabled { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { + color: #AAAAAA; + background-color: #919191; + border-color: #8a8a8a; +} +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(157, 157, 157, 0.5); +} + +.btn-dark { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-dark:hover { + color: #AAAAAA; + background-color: #424242; + border-color: #3c3c3c; +} +.btn-dark:focus, .btn-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(98, 98, 98, 0.5); +} +.btn-dark.disabled, .btn-dark:disabled { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { + color: #AAAAAA; + background-color: #3c3c3c; + border-color: #353535; +} +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(98, 98, 98, 0.5); +} + +.btn-outline-primary { + color: #0000AA; + border-color: #0000AA; +} +.btn-outline-primary:hover { + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.5); +} +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #0000AA; + background-color: transparent; +} +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.5); +} + +.btn-outline-secondary { + color: #555555; + border-color: #555555; +} +.btn-outline-secondary:hover { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(85, 85, 85, 0.5); +} +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #555555; + background-color: transparent; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(85, 85, 85, 0.5); +} + +.btn-outline-success { + color: #00AA00; + border-color: #00AA00; +} +.btn-outline-success:hover { + color: #AAAAAA; + background-color: #00AA00; + border-color: #00AA00; +} +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.5); +} +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #00AA00; + background-color: transparent; +} +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { + color: #AAAAAA; + background-color: #00AA00; + border-color: #00AA00; +} +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 0, 0.5); +} + +.btn-outline-info { + color: #00AAAA; + border-color: #00AAAA; +} +.btn-outline-info:hover { + color: #AAAAAA; + background-color: #00AAAA; + border-color: #00AAAA; +} +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 170, 0.5); +} +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #00AAAA; + background-color: transparent; +} +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { + color: #AAAAAA; + background-color: #00AAAA; + border-color: #00AAAA; +} +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 170, 170, 0.5); +} + +.btn-outline-warning { + color: #FFFF55; + border-color: #FFFF55; +} +.btn-outline-warning:hover { + color: #555555; + background-color: #FFFF55; + border-color: #FFFF55; +} +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(255, 255, 85, 0.5); +} +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #FFFF55; + background-color: transparent; +} +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { + color: #555555; + background-color: #FFFF55; + border-color: #FFFF55; +} +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 255, 85, 0.5); +} + +.btn-outline-danger { + color: #AA0000; + border-color: #AA0000; +} +.btn-outline-danger:hover { + color: #AAAAAA; + background-color: #AA0000; + border-color: #AA0000; +} +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.5); +} +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #AA0000; + background-color: transparent; +} +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { + color: #AAAAAA; + background-color: #AA0000; + border-color: #AA0000; +} +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(170, 0, 0, 0.5); +} + +.btn-outline-light { + color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-outline-light:hover { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(170, 170, 170, 0.5); +} +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #AAAAAA; + background-color: transparent; +} +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { + color: #555555; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(170, 170, 170, 0.5); +} + +.btn-outline-dark { + color: #555555; + border-color: #555555; +} +.btn-outline-dark:hover { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(85, 85, 85, 0.5); +} +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #555555; + background-color: transparent; +} +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { + color: #AAAAAA; + background-color: #555555; + border-color: #555555; +} +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(85, 85, 85, 0.5); +} + +.btn-link { + font-weight: 400; + color: #55FFFF; +} +.btn-link:hover { + color: #FFFF55; + text-decoration: underline; +} +.btn-link:focus, .btn-link.focus { + text-decoration: underline; + box-shadow: none; +} +.btn-link:disabled, .btn-link.disabled { + color: #555555; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 2.1875rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 1.53125rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type=submit].btn-block, +input[type=reset].btn-block, +input[type=button].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} +@media screen and (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1.75rem; + color: #AAAAAA; + text-align: left; + list-style: none; + background-color: #AAAAAA; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} +.dropdown-menu-left { + right: auto; + left: 0; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } +} +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropleft .dropdown-toggle::after { + display: none; +} +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^=top], .dropdown-menu[x-placement^=right], .dropdown-menu[x-placement^=bottom], .dropdown-menu[x-placement^=left] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #AAAAAA; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #555555; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:first-child { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.dropdown-item:last-child { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.dropdown-item:hover, .dropdown-item:focus { + color: #484848; + text-decoration: none; + background-color: #AAAAAA; +} +.dropdown-item.active, .dropdown-item:active { + color: #AAAAAA; + text-decoration: none; + background-color: #0000AA; +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: #555555; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 1.53125rem; + color: #555555; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #555555; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after { + margin-left: 0; +} +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} +.btn-group-toggle > .btn input[type=radio], +.btn-group-toggle > .btn input[type=checkbox], +.btn-group-toggle > .btn-group > .btn input[type=radio], +.btn-group-toggle > .btn-group > .btn input[type=checkbox] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; +} +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} +.input-group > .form-control:not(:last-child), +.input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .custom-file { + display: flex; + align-items: center; +} +.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: flex; +} +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1.75rem; + font-weight: 400; + line-height: 1; + color: #555555; + text-align: center; + white-space: nowrap; + background-color: #AAAAAA; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; +} +.input-group-text input[type=radio], +.input-group-text input[type=checkbox] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(4.28125rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 2.1875rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(2.796875rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 1.53125rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + display: block; + min-height: 1.75rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; +} +.custom-control-input:checked ~ .custom-control-label::before { + color: #AAAAAA; + border-color: #0000AA; + background-color: #0000AA; +} +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #2b2bff; +} +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #AAAAAA; + background-color: #5e5eff; + border-color: #5e5eff; +} +.custom-control-input:disabled ~ .custom-control-label { + color: #555555; +} +.custom-control-input:disabled ~ .custom-control-label::before { + background-color: #AAAAAA; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} +.custom-control-label::before { + position: absolute; + top: 0.375rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #AAAAAA; + border: #555555 solid 1px; +} +.custom-control-label::after { + position: absolute; + top: 0.375rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background-repeat: no-repeat; + background-position: center center; + background-size: 50% 50%; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; +} +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23AAAAAA' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #0000AA; + background-color: #0000AA; +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23AAAAAA' d='M0 2h4'/%3e%3c/svg%3e"); +} +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 170, 0.5); +} +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 0, 170, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23AAAAAA'/%3e%3c/svg%3e"); +} +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 170, 0.5); +} + +.custom-switch { + padding-left: 2.25rem; +} +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} +.custom-switch .custom-control-label::after { + top: calc(0.375rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #555555; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #AAAAAA; + transform: translateX(0.75rem); +} +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 170, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(2.5rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-weight: 400; + line-height: 1; + color: #555555; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23555555' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #AAAAAA; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; + appearance: none; +} +.custom-select:focus { + border-color: #2b2bff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(43, 43, 255, 0.5); +} +.custom-select:focus::-ms-value { + color: #555555; + background-color: #AAAAAA; +} +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} +.custom-select:disabled { + color: #555555; + background-color: #AAAAAA; +} +.custom-select::-ms-expand { + opacity: 0; +} + +.custom-select-sm { + height: calc(2.796875rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 1.53125rem; +} + +.custom-select-lg { + height: calc(4.28125rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 2.1875rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(2.5rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(2.5rem + 2px); + margin: 0; + opacity: 0; +} +.custom-file-input:focus ~ .custom-file-label { + border-color: #2b2bff; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-file-input:disabled ~ .custom-file-label { + background-color: #AAAAAA; +} +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(2.5rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1; + color: #555555; + background-color: #AAAAAA; + border: 1px solid #AAAAAA; + border-radius: 0.25rem; +} +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: 2.5rem; + padding: 0.375rem 0.75rem; + line-height: 1; + color: #555555; + content: "Browse"; + background-color: #AAAAAA; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; +} + +.custom-range { + width: 100%; + height: calc(1rem + 0.4rem); + padding: 0; + background-color: transparent; + appearance: none; +} +.custom-range:focus { + outline: none; +} +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #000, 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #000, 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #000, 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.custom-range::-moz-focus-outer { + border: 0; +} +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0000AA; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; + } +} +.custom-range::-webkit-slider-thumb:active { + background-color: #5e5eff; +} +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #AAAAAA; + border-color: transparent; + border-radius: 1rem; +} +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0000AA; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; + } +} +.custom-range::-moz-range-thumb:active { + background-color: #5e5eff; +} +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #AAAAAA; + border-color: transparent; + border-radius: 1rem; +} +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #0000AA; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; + } +} +.custom-range::-ms-thumb:active { + background-color: #5e5eff; +} +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; +} +.custom-range::-ms-fill-lower { + background-color: #AAAAAA; + border-radius: 1rem; +} +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #AAAAAA; + border-radius: 1rem; +} +.custom-range:disabled::-webkit-slider-thumb { + background-color: #555555; +} +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} +.custom-range:disabled::-moz-range-thumb { + background-color: #555555; +} +.custom-range:disabled::-moz-range-track { + cursor: default; +} +.custom-range:disabled::-ms-thumb { + background-color: #555555; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-control-label::before, +.custom-file-label, +.custom-select { + transition: none; + } +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} +.nav-link.disabled { + color: #555555; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #AAAAAA; +} +.nav-tabs .nav-item { + margin-bottom: -1px; +} +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #AAAAAA #AAAAAA #AAAAAA; +} +.nav-tabs .nav-link.disabled { + color: #555555; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #555555; + background-color: #000; + border-color: #AAAAAA #AAAAAA #000; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #AAAAAA; + background-color: #0000AA; +} + +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 0.5rem 1rem; +} +.navbar > .container, +.navbar > .container-fluid { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.28125rem; + padding-bottom: 0.28125rem; + margin-right: 1rem; + font-size: 2.1875rem; + line-height: inherit; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 2.1875rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} +.navbar-toggler:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, +.navbar-expand-sm > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, +.navbar-expand-sm > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} +@media (max-width: 767.98px) { + .navbar-expand-md > .container, +.navbar-expand-md > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, +.navbar-expand-md > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, +.navbar-expand-lg > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, +.navbar-expand-lg > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, +.navbar-expand-xl > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, +.navbar-expand-xl > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + padding-right: 0; + padding-left: 0; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + flex-wrap: nowrap; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #AAAAAA; +} +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #AAAAAA; +} +.navbar-dark .navbar-nav .nav-link { + color: rgba(170, 170, 170, 0.5); +} +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(170, 170, 170, 0.75); +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(170, 170, 170, 0.25); +} +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #AAAAAA; +} +.navbar-dark .navbar-toggler { + color: rgba(170, 170, 170, 0.5); + border-color: rgba(170, 170, 170, 0.1); +} +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(170, 170, 170, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-dark .navbar-text { + color: rgba(170, 170, 170, 0.5); +} +.navbar-dark .navbar-text a { + color: #AAAAAA; +} +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #AAAAAA; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #0000AA; + background-clip: border-box; + border: 1px solid rgba(85, 85, 85, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-body { + flex: 1 1 auto; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + color: inherit; + background-color: rgba(85, 85, 85, 0.03); + border-bottom: 1px solid rgba(85, 85, 85, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(85, 85, 85, 0.03); + border-top: 1px solid rgba(85, 85, 85, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img { + width: 100%; + border-radius: calc(0.25rem - 1px); +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck { + display: flex; + flex-direction: column; +} +.card-deck .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-deck { + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + display: flex; + flex: 1 0 0%; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group { + display: flex; + flex-direction: column; +} +.card-group > .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-group { + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:first-child .card-img-top, +.card-group > .card:first-child .card-header { + border-top-right-radius: 0; + } + .card-group > .card:first-child .card-img-bottom, +.card-group > .card:first-child .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:last-child .card-img-top, +.card-group > .card:last-child .card-header { + border-top-left-radius: 0; + } + .card-group > .card:last-child .card-img-bottom, +.card-group > .card:last-child .card-footer { + border-bottom-left-radius: 0; + } + .card-group > .card:only-child { + border-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-top, +.card-group > .card:only-child .card-header { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-bottom, +.card-group > .card:only-child .card-footer { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) { + border-radius: 0; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer { + border-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-columns { + column-count: 3; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion .card { + overflow: hidden; +} +.accordion .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; +} +.accordion .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; +} +.accordion .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.accordion .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.accordion .card .card-header { + margin-bottom: -1px; +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #AAAAAA; + border-radius: 0.25rem; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #555555; + content: "/"; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} +.breadcrumb-item.active { + color: #555555; +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #55FFFF; + background-color: #AAAAAA; + border: 1px solid #AAAAAA; +} +.page-link:hover { + z-index: 2; + color: #FFFF55; + text-decoration: none; + background-color: #AAAAAA; + border-color: #AAAAAA; +} +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 170, 0.25); +} +.page-link:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} +.page-item.active .page-link { + z-index: 1; + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} +.page-item.disabled .page-link { + color: #555555; + pointer-events: none; + cursor: auto; + background-color: #AAAAAA; + border-color: #AAAAAA; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 2.1875rem; + line-height: 1.5; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 1.53125rem; + line-height: 1.5; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #AAAAAA; + background-color: #0000AA; +} +a.badge-primary:hover, a.badge-primary:focus { + color: #AAAAAA; + background-color: #000077; +} + +.badge-secondary { + color: #AAAAAA; + background-color: #555555; +} +a.badge-secondary:hover, a.badge-secondary:focus { + color: #AAAAAA; + background-color: #3c3c3c; +} + +.badge-success { + color: #AAAAAA; + background-color: #00AA00; +} +a.badge-success:hover, a.badge-success:focus { + color: #AAAAAA; + background-color: #007700; +} + +.badge-info { + color: #AAAAAA; + background-color: #00AAAA; +} +a.badge-info:hover, a.badge-info:focus { + color: #AAAAAA; + background-color: #007777; +} + +.badge-warning { + color: #555555; + background-color: #FFFF55; +} +a.badge-warning:hover, a.badge-warning:focus { + color: #555555; + background-color: #ffff22; +} + +.badge-danger { + color: #AAAAAA; + background-color: #AA0000; +} +a.badge-danger:hover, a.badge-danger:focus { + color: #AAAAAA; + background-color: #770000; +} + +.badge-light { + color: #555555; + background-color: #AAAAAA; +} +a.badge-light:hover, a.badge-light:focus { + color: #555555; + background-color: #919191; +} + +.badge-dark { + color: #AAAAAA; + background-color: #555555; +} +a.badge-dark:hover, a.badge-dark:focus { + color: #AAAAAA; + background-color: #3c3c3c; +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #AAAAAA; + border-radius: 0.3rem; +} +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 5.125rem; +} +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #000058; + background-color: #8888aa; + border-color: #7a7aaa; +} +.alert-primary hr { + border-top-color: #6a6aa0; +} +.alert-primary .alert-link { + color: #000025; +} + +.alert-secondary { + color: #2c2c2c; + background-color: #999999; + border-color: #929292; +} +.alert-secondary hr { + border-top-color: #858585; +} +.alert-secondary .alert-link { + color: #131313; +} + +.alert-success { + color: #005800; + background-color: #88aa88; + border-color: #7aaa7a; +} +.alert-success hr { + border-top-color: #6aa06a; +} +.alert-success .alert-link { + color: #002500; +} + +.alert-info { + color: #005858; + background-color: #88aaaa; + border-color: #7aaaaa; +} +.alert-info hr { + border-top-color: #6aa0a0; +} +.alert-info .alert-link { + color: #002525; +} + +.alert-warning { + color: #85852c; + background-color: #bbbb99; + border-color: #c2c292; +} +.alert-warning hr { + border-top-color: #b9b982; +} +.alert-warning .alert-link { + color: #5f5f1f; +} + +.alert-danger { + color: #580000; + background-color: #aa8888; + border-color: #aa7a7a; +} +.alert-danger hr { + border-top-color: #a06a6a; +} +.alert-danger .alert-link { + color: #250000; +} + +.alert-light { + color: #585858; + background-color: #aaaaaa; + border-color: #aaaaaa; +} +.alert-light hr { + border-top-color: #9d9d9d; +} +.alert-light .alert-link { + color: #3f3f3f; +} + +.alert-dark { + color: #2c2c2c; + background-color: #999999; + border-color: #929292; +} +.alert-dark hr { + border-top-color: #858585; +} +.alert-dark .alert-link { + color: #131313; +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 1.3125rem; + background-color: #AAAAAA; + border-radius: 0.25rem; +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + color: #AAAAAA; + text-align: center; + white-space: nowrap; + background-color: #0000AA; + transition: width 0.6s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(170, 170, 170, 0.15) 25%, transparent 25%, transparent 50%, rgba(170, 170, 170, 0.15) 50%, rgba(170, 170, 170, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + animation: progress-bar-stripes 1s linear infinite; +} + +.media { + display: flex; + align-items: flex-start; +} + +.media-body { + flex: 1; +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #555555; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + color: #555555; + text-decoration: none; + background-color: #AAAAAA; +} +.list-group-item-action:active { + color: #AAAAAA; + background-color: #AAAAAA; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #AAAAAA; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.list-group-item:hover, .list-group-item:focus { + z-index: 1; + text-decoration: none; +} +.list-group-item.disabled, .list-group-item:disabled { + color: #555555; + pointer-events: none; + background-color: #AAAAAA; +} +.list-group-item.active { + z-index: 2; + color: #AAAAAA; + background-color: #0000AA; + border-color: #0000AA; +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.list-group-flush .list-group-item:last-child { + margin-bottom: -1px; +} +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; +} +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0; +} + +.list-group-item-primary { + color: #000058; + background-color: #7a7aaa; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #000058; + background-color: #6a6aa0; +} +.list-group-item-primary.list-group-item-action.active { + color: #AAAAAA; + background-color: #000058; + border-color: #000058; +} + +.list-group-item-secondary { + color: #2c2c2c; + background-color: #929292; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #2c2c2c; + background-color: #858585; +} +.list-group-item-secondary.list-group-item-action.active { + color: #AAAAAA; + background-color: #2c2c2c; + border-color: #2c2c2c; +} + +.list-group-item-success { + color: #005800; + background-color: #7aaa7a; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #005800; + background-color: #6aa06a; +} +.list-group-item-success.list-group-item-action.active { + color: #AAAAAA; + background-color: #005800; + border-color: #005800; +} + +.list-group-item-info { + color: #005858; + background-color: #7aaaaa; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #005858; + background-color: #6aa0a0; +} +.list-group-item-info.list-group-item-action.active { + color: #AAAAAA; + background-color: #005858; + border-color: #005858; +} + +.list-group-item-warning { + color: #85852c; + background-color: #c2c292; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #85852c; + background-color: #b9b982; +} +.list-group-item-warning.list-group-item-action.active { + color: #AAAAAA; + background-color: #85852c; + border-color: #85852c; +} + +.list-group-item-danger { + color: #580000; + background-color: #aa7a7a; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #580000; + background-color: #a06a6a; +} +.list-group-item-danger.list-group-item-action.active { + color: #AAAAAA; + background-color: #580000; + border-color: #580000; +} + +.list-group-item-light { + color: #585858; + background-color: #aaaaaa; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #585858; + background-color: #9d9d9d; +} +.list-group-item-light.list-group-item-action.active { + color: #AAAAAA; + background-color: #585858; + border-color: #585858; +} + +.list-group-item-dark { + color: #2c2c2c; + background-color: #929292; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #2c2c2c; + background-color: #858585; +} +.list-group-item-dark.list-group-item-action.active { + color: #AAAAAA; + background-color: #2c2c2c; + border-color: #2c2c2c; +} + +.close { + float: right; + font-size: 2.625rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #AAAAAA; + opacity: 0.5; +} +.close:hover { + color: #000; + text-decoration: none; +} +.close:not(:disabled):not(.disabled) { + cursor: pointer; +} +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: 0.75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + appearance: none; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(170, 170, 170, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + opacity: 0; +} +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} +.toast.showing { + opacity: 1; +} +.toast.show { + display: block; + opacity: 1; +} +.toast.hide { + display: none; +} + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #555555; + background-color: rgba(170, 170, 170, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media screen and (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - (0.5rem * 2)); +} +.modal-dialog-centered::before { + display: block; + height: calc(100vh - (0.5rem * 2)); + content: ""; +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #AAAAAA; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #AAAAAA; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem; +} +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1; +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #AAAAAA; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.modal-footer > :not(:first-child) { + margin-left: 0.25rem; +} +.modal-footer > :not(:last-child) { + margin-right: 0.25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + + .modal-dialog-centered { + min-height: calc(100% - (1.75rem * 2)); + } + .modal-dialog-centered::before { + height: calc(100vh - (1.75rem * 2)); + } + + .modal-sm { + max-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, +.modal-xl { + max-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: "VGAsquarePx"; + font-style: normal; + font-weight: 400; + line-height: 1; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 1.53125rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top] { + padding: 0.4rem 0; +} +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow { + bottom: 0; +} +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right] { + padding: 0 0.4rem; +} +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom] { + padding: 0.4rem 0; +} +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow { + top: 0; +} +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left] { + padding: 0 0.4rem; +} +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #AAAAAA; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: "VGAsquarePx"; + font-style: normal; + font-weight: 400; + line-height: 1; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 1.53125rem; + word-wrap: break-word; + background-color: #AAAAAA; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^=top] { + margin-bottom: 0.5rem; +} +.bs-popover-top .arrow, .bs-popover-auto[x-placement^=top] .arrow { + bottom: calc((0.5rem + 1px) * -1); +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=top] .arrow::before, +.bs-popover-top .arrow::after, +.bs-popover-auto[x-placement^=top] .arrow::after { + border-width: 0.5rem 0.5rem 0; +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=top] .arrow::before { + bottom: 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-top .arrow::after, .bs-popover-auto[x-placement^=top] .arrow::after { + bottom: 1px; + border-top-color: #AAAAAA; +} + +.bs-popover-right, .bs-popover-auto[x-placement^=right] { + margin-left: 0.5rem; +} +.bs-popover-right .arrow, .bs-popover-auto[x-placement^=right] .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=right] .arrow::before, +.bs-popover-right .arrow::after, +.bs-popover-auto[x-placement^=right] .arrow::after { + border-width: 0.5rem 0.5rem 0.5rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=right] .arrow::before { + left: 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-right .arrow::after, .bs-popover-auto[x-placement^=right] .arrow::after { + left: 1px; + border-right-color: #AAAAAA; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^=bottom] { + margin-top: 0.5rem; +} +.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^=bottom] .arrow { + top: calc((0.5rem + 1px) * -1); +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=bottom] .arrow::before, +.bs-popover-bottom .arrow::after, +.bs-popover-auto[x-placement^=bottom] .arrow::after { + border-width: 0 0.5rem 0.5rem 0.5rem; +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=bottom] .arrow::before { + top: 0; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-bottom .arrow::after, .bs-popover-auto[x-placement^=bottom] .arrow::after { + top: 1px; + border-bottom-color: #AAAAAA; +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #a2a2a2; +} + +.bs-popover-left, .bs-popover-auto[x-placement^=left] { + margin-right: 0.5rem; +} +.bs-popover-left .arrow, .bs-popover-auto[x-placement^=left] .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=left] .arrow::before, +.bs-popover-left .arrow::after, +.bs-popover-auto[x-placement^=left] .arrow::after { + border-width: 0.5rem 0 0.5rem 0.5rem; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=left] .arrow::before { + right: 0; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-left .arrow::after, .bs-popover-auto[x-placement^=left] .arrow::after { + right: 1px; + border-left-color: #AAAAAA; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1.75rem; + color: inherit; + background-color: #a2a2a2; + border-bottom: 1px solid #969696; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #AAAAAA; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: 0s 0.6s opacity; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + color: #AAAAAA; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-control-prev, +.carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #AAAAAA; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: transparent no-repeat center center; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23AAAAAA' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23AAAAAA' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} +.carousel-indicators li { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #AAAAAA; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #AAAAAA; + text-align: center; +} + +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: spinner-border 0.75s linear infinite; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + } +} +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + animation: spinner-grow 0.75s linear infinite; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #0000AA !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #000077 !important; +} + +.bg-secondary { + background-color: #555555 !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #3c3c3c !important; +} + +.bg-success { + background-color: #00AA00 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #007700 !important; +} + +.bg-info { + background-color: #00AAAA !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #007777 !important; +} + +.bg-warning { + background-color: #FFFF55 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #ffff22 !important; +} + +.bg-danger { + background-color: #AA0000 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #770000 !important; +} + +.bg-light { + background-color: #AAAAAA !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #919191 !important; +} + +.bg-dark { + background-color: #555555 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #3c3c3c !important; +} + +.bg-white { + background-color: #AAAAAA !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #AAAAAA !important; +} + +.border-top { + border-top: 1px solid #AAAAAA !important; +} + +.border-right { + border-right: 1px solid #AAAAAA !important; +} + +.border-bottom { + border-bottom: 1px solid #AAAAAA !important; +} + +.border-left { + border-left: 1px solid #AAAAAA !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #0000AA !important; +} + +.border-secondary { + border-color: #555555 !important; +} + +.border-success { + border-color: #00AA00 !important; +} + +.border-info { + border-color: #00AAAA !important; +} + +.border-warning { + border-color: #FFFF55 !important; +} + +.border-danger { + border-color: #AA0000 !important; +} + +.border-light { + border-color: #AAAAAA !important; +} + +.border-dark { + border-color: #555555 !important; +} + +.border-white { + border-color: #AAAAAA !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: flex !important; + } + + .d-sm-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: flex !important; + } + + .d-md-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: flex !important; + } + + .d-lg-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: flex !important; + } + + .d-xl-inline-flex { + display: inline-flex !important; + } +} +@media print { + .d-print-none { + display: none !important; + } + + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: flex !important; + } + + .d-print-inline-flex { + display: inline-flex !important; + } +} +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} +.embed-responsive::before { + display: block; + content: ""; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.8571428571%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-3by4::before { + padding-top: 133.3333333333%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction: row !important; + } + + .flex-sm-column { + flex-direction: column !important; + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-sm-wrap { + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-sm-fill { + flex: 1 1 auto !important; + } + + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-sm-start { + justify-content: flex-start !important; + } + + .justify-content-sm-end { + justify-content: flex-end !important; + } + + .justify-content-sm-center { + justify-content: center !important; + } + + .justify-content-sm-between { + justify-content: space-between !important; + } + + .justify-content-sm-around { + justify-content: space-around !important; + } + + .align-items-sm-start { + align-items: flex-start !important; + } + + .align-items-sm-end { + align-items: flex-end !important; + } + + .align-items-sm-center { + align-items: center !important; + } + + .align-items-sm-baseline { + align-items: baseline !important; + } + + .align-items-sm-stretch { + align-items: stretch !important; + } + + .align-content-sm-start { + align-content: flex-start !important; + } + + .align-content-sm-end { + align-content: flex-end !important; + } + + .align-content-sm-center { + align-content: center !important; + } + + .align-content-sm-between { + align-content: space-between !important; + } + + .align-content-sm-around { + align-content: space-around !important; + } + + .align-content-sm-stretch { + align-content: stretch !important; + } + + .align-self-sm-auto { + align-self: auto !important; + } + + .align-self-sm-start { + align-self: flex-start !important; + } + + .align-self-sm-end { + align-self: flex-end !important; + } + + .align-self-sm-center { + align-self: center !important; + } + + .align-self-sm-baseline { + align-self: baseline !important; + } + + .align-self-sm-stretch { + align-self: stretch !important; + } +} +@media (min-width: 768px) { + .flex-md-row { + flex-direction: row !important; + } + + .flex-md-column { + flex-direction: column !important; + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-md-wrap { + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-md-fill { + flex: 1 1 auto !important; + } + + .flex-md-grow-0 { + flex-grow: 0 !important; + } + + .flex-md-grow-1 { + flex-grow: 1 !important; + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-md-start { + justify-content: flex-start !important; + } + + .justify-content-md-end { + justify-content: flex-end !important; + } + + .justify-content-md-center { + justify-content: center !important; + } + + .justify-content-md-between { + justify-content: space-between !important; + } + + .justify-content-md-around { + justify-content: space-around !important; + } + + .align-items-md-start { + align-items: flex-start !important; + } + + .align-items-md-end { + align-items: flex-end !important; + } + + .align-items-md-center { + align-items: center !important; + } + + .align-items-md-baseline { + align-items: baseline !important; + } + + .align-items-md-stretch { + align-items: stretch !important; + } + + .align-content-md-start { + align-content: flex-start !important; + } + + .align-content-md-end { + align-content: flex-end !important; + } + + .align-content-md-center { + align-content: center !important; + } + + .align-content-md-between { + align-content: space-between !important; + } + + .align-content-md-around { + align-content: space-around !important; + } + + .align-content-md-stretch { + align-content: stretch !important; + } + + .align-self-md-auto { + align-self: auto !important; + } + + .align-self-md-start { + align-self: flex-start !important; + } + + .align-self-md-end { + align-self: flex-end !important; + } + + .align-self-md-center { + align-self: center !important; + } + + .align-self-md-baseline { + align-self: baseline !important; + } + + .align-self-md-stretch { + align-self: stretch !important; + } +} +@media (min-width: 992px) { + .flex-lg-row { + flex-direction: row !important; + } + + .flex-lg-column { + flex-direction: column !important; + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-lg-wrap { + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-lg-fill { + flex: 1 1 auto !important; + } + + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-lg-start { + justify-content: flex-start !important; + } + + .justify-content-lg-end { + justify-content: flex-end !important; + } + + .justify-content-lg-center { + justify-content: center !important; + } + + .justify-content-lg-between { + justify-content: space-between !important; + } + + .justify-content-lg-around { + justify-content: space-around !important; + } + + .align-items-lg-start { + align-items: flex-start !important; + } + + .align-items-lg-end { + align-items: flex-end !important; + } + + .align-items-lg-center { + align-items: center !important; + } + + .align-items-lg-baseline { + align-items: baseline !important; + } + + .align-items-lg-stretch { + align-items: stretch !important; + } + + .align-content-lg-start { + align-content: flex-start !important; + } + + .align-content-lg-end { + align-content: flex-end !important; + } + + .align-content-lg-center { + align-content: center !important; + } + + .align-content-lg-between { + align-content: space-between !important; + } + + .align-content-lg-around { + align-content: space-around !important; + } + + .align-content-lg-stretch { + align-content: stretch !important; + } + + .align-self-lg-auto { + align-self: auto !important; + } + + .align-self-lg-start { + align-self: flex-start !important; + } + + .align-self-lg-end { + align-self: flex-end !important; + } + + .align-self-lg-center { + align-self: center !important; + } + + .align-self-lg-baseline { + align-self: baseline !important; + } + + .align-self-lg-stretch { + align-self: stretch !important; + } +} +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction: row !important; + } + + .flex-xl-column { + flex-direction: column !important; + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xl-wrap { + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-xl-fill { + flex: 1 1 auto !important; + } + + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-xl-start { + justify-content: flex-start !important; + } + + .justify-content-xl-end { + justify-content: flex-end !important; + } + + .justify-content-xl-center { + justify-content: center !important; + } + + .justify-content-xl-between { + justify-content: space-between !important; + } + + .justify-content-xl-around { + justify-content: space-around !important; + } + + .align-items-xl-start { + align-items: flex-start !important; + } + + .align-items-xl-end { + align-items: flex-end !important; + } + + .align-items-xl-center { + align-items: center !important; + } + + .align-items-xl-baseline { + align-items: baseline !important; + } + + .align-items-xl-stretch { + align-items: stretch !important; + } + + .align-content-xl-start { + align-content: flex-start !important; + } + + .align-content-xl-end { + align-content: flex-end !important; + } + + .align-content-xl-center { + align-content: center !important; + } + + .align-content-xl-between { + align-content: space-between !important; + } + + .align-content-xl-around { + align-content: space-around !important; + } + + .align-content-xl-stretch { + align-content: stretch !important; + } + + .align-self-xl-auto { + align-self: auto !important; + } + + .align-self-xl-start { + align-self: flex-start !important; + } + + .align-self-xl-end { + align-self: flex-end !important; + } + + .align-self-xl-center { + align-self: center !important; + } + + .align-self-xl-baseline { + align-self: baseline !important; + } + + .align-self-xl-stretch { + align-self: stretch !important; + } +} +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + + .float-sm-right { + float: right !important; + } + + .float-sm-none { + float: none !important; + } +} +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + + .float-md-right { + float: right !important; + } + + .float-md-none { + float: none !important; + } +} +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + + .float-lg-right { + float: right !important; + } + + .float-lg-none { + float: none !important; + } +} +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + + .float-xl-right { + float: right !important; + } + + .float-xl-none { + float: none !important; + } +} +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports (position: sticky) { + .sticky-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + + .mt-sm-0, +.my-sm-0 { + margin-top: 0 !important; + } + + .mr-sm-0, +.mx-sm-0 { + margin-right: 0 !important; + } + + .mb-sm-0, +.my-sm-0 { + margin-bottom: 0 !important; + } + + .ml-sm-0, +.mx-sm-0 { + margin-left: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .mt-sm-1, +.my-sm-1 { + margin-top: 0.25rem !important; + } + + .mr-sm-1, +.mx-sm-1 { + margin-right: 0.25rem !important; + } + + .mb-sm-1, +.my-sm-1 { + margin-bottom: 0.25rem !important; + } + + .ml-sm-1, +.mx-sm-1 { + margin-left: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .mt-sm-2, +.my-sm-2 { + margin-top: 0.5rem !important; + } + + .mr-sm-2, +.mx-sm-2 { + margin-right: 0.5rem !important; + } + + .mb-sm-2, +.my-sm-2 { + margin-bottom: 0.5rem !important; + } + + .ml-sm-2, +.mx-sm-2 { + margin-left: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .mt-sm-3, +.my-sm-3 { + margin-top: 1rem !important; + } + + .mr-sm-3, +.mx-sm-3 { + margin-right: 1rem !important; + } + + .mb-sm-3, +.my-sm-3 { + margin-bottom: 1rem !important; + } + + .ml-sm-3, +.mx-sm-3 { + margin-left: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .mt-sm-4, +.my-sm-4 { + margin-top: 1.5rem !important; + } + + .mr-sm-4, +.mx-sm-4 { + margin-right: 1.5rem !important; + } + + .mb-sm-4, +.my-sm-4 { + margin-bottom: 1.5rem !important; + } + + .ml-sm-4, +.mx-sm-4 { + margin-left: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .mt-sm-5, +.my-sm-5 { + margin-top: 3rem !important; + } + + .mr-sm-5, +.mx-sm-5 { + margin-right: 3rem !important; + } + + .mb-sm-5, +.my-sm-5 { + margin-bottom: 3rem !important; + } + + .ml-sm-5, +.mx-sm-5 { + margin-left: 3rem !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .pt-sm-0, +.py-sm-0 { + padding-top: 0 !important; + } + + .pr-sm-0, +.px-sm-0 { + padding-right: 0 !important; + } + + .pb-sm-0, +.py-sm-0 { + padding-bottom: 0 !important; + } + + .pl-sm-0, +.px-sm-0 { + padding-left: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .pt-sm-1, +.py-sm-1 { + padding-top: 0.25rem !important; + } + + .pr-sm-1, +.px-sm-1 { + padding-right: 0.25rem !important; + } + + .pb-sm-1, +.py-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pl-sm-1, +.px-sm-1 { + padding-left: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .pt-sm-2, +.py-sm-2 { + padding-top: 0.5rem !important; + } + + .pr-sm-2, +.px-sm-2 { + padding-right: 0.5rem !important; + } + + .pb-sm-2, +.py-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pl-sm-2, +.px-sm-2 { + padding-left: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .pt-sm-3, +.py-sm-3 { + padding-top: 1rem !important; + } + + .pr-sm-3, +.px-sm-3 { + padding-right: 1rem !important; + } + + .pb-sm-3, +.py-sm-3 { + padding-bottom: 1rem !important; + } + + .pl-sm-3, +.px-sm-3 { + padding-left: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .pt-sm-4, +.py-sm-4 { + padding-top: 1.5rem !important; + } + + .pr-sm-4, +.px-sm-4 { + padding-right: 1.5rem !important; + } + + .pb-sm-4, +.py-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pl-sm-4, +.px-sm-4 { + padding-left: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .pt-sm-5, +.py-sm-5 { + padding-top: 3rem !important; + } + + .pr-sm-5, +.px-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-5, +.py-sm-5 { + padding-bottom: 3rem !important; + } + + .pl-sm-5, +.px-sm-5 { + padding-left: 3rem !important; + } + + .m-sm-n1 { + margin: -0.25rem !important; + } + + .mt-sm-n1, +.my-sm-n1 { + margin-top: -0.25rem !important; + } + + .mr-sm-n1, +.mx-sm-n1 { + margin-right: -0.25rem !important; + } + + .mb-sm-n1, +.my-sm-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-sm-n1, +.mx-sm-n1 { + margin-left: -0.25rem !important; + } + + .m-sm-n2 { + margin: -0.5rem !important; + } + + .mt-sm-n2, +.my-sm-n2 { + margin-top: -0.5rem !important; + } + + .mr-sm-n2, +.mx-sm-n2 { + margin-right: -0.5rem !important; + } + + .mb-sm-n2, +.my-sm-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-sm-n2, +.mx-sm-n2 { + margin-left: -0.5rem !important; + } + + .m-sm-n3 { + margin: -1rem !important; + } + + .mt-sm-n3, +.my-sm-n3 { + margin-top: -1rem !important; + } + + .mr-sm-n3, +.mx-sm-n3 { + margin-right: -1rem !important; + } + + .mb-sm-n3, +.my-sm-n3 { + margin-bottom: -1rem !important; + } + + .ml-sm-n3, +.mx-sm-n3 { + margin-left: -1rem !important; + } + + .m-sm-n4 { + margin: -1.5rem !important; + } + + .mt-sm-n4, +.my-sm-n4 { + margin-top: -1.5rem !important; + } + + .mr-sm-n4, +.mx-sm-n4 { + margin-right: -1.5rem !important; + } + + .mb-sm-n4, +.my-sm-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-sm-n4, +.mx-sm-n4 { + margin-left: -1.5rem !important; + } + + .m-sm-n5 { + margin: -3rem !important; + } + + .mt-sm-n5, +.my-sm-n5 { + margin-top: -3rem !important; + } + + .mr-sm-n5, +.mx-sm-n5 { + margin-right: -3rem !important; + } + + .mb-sm-n5, +.my-sm-n5 { + margin-bottom: -3rem !important; + } + + .ml-sm-n5, +.mx-sm-n5 { + margin-left: -3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mt-sm-auto, +.my-sm-auto { + margin-top: auto !important; + } + + .mr-sm-auto, +.mx-sm-auto { + margin-right: auto !important; + } + + .mb-sm-auto, +.my-sm-auto { + margin-bottom: auto !important; + } + + .ml-sm-auto, +.mx-sm-auto { + margin-left: auto !important; + } +} +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + + .mt-md-0, +.my-md-0 { + margin-top: 0 !important; + } + + .mr-md-0, +.mx-md-0 { + margin-right: 0 !important; + } + + .mb-md-0, +.my-md-0 { + margin-bottom: 0 !important; + } + + .ml-md-0, +.mx-md-0 { + margin-left: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .mt-md-1, +.my-md-1 { + margin-top: 0.25rem !important; + } + + .mr-md-1, +.mx-md-1 { + margin-right: 0.25rem !important; + } + + .mb-md-1, +.my-md-1 { + margin-bottom: 0.25rem !important; + } + + .ml-md-1, +.mx-md-1 { + margin-left: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .mt-md-2, +.my-md-2 { + margin-top: 0.5rem !important; + } + + .mr-md-2, +.mx-md-2 { + margin-right: 0.5rem !important; + } + + .mb-md-2, +.my-md-2 { + margin-bottom: 0.5rem !important; + } + + .ml-md-2, +.mx-md-2 { + margin-left: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .mt-md-3, +.my-md-3 { + margin-top: 1rem !important; + } + + .mr-md-3, +.mx-md-3 { + margin-right: 1rem !important; + } + + .mb-md-3, +.my-md-3 { + margin-bottom: 1rem !important; + } + + .ml-md-3, +.mx-md-3 { + margin-left: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .mt-md-4, +.my-md-4 { + margin-top: 1.5rem !important; + } + + .mr-md-4, +.mx-md-4 { + margin-right: 1.5rem !important; + } + + .mb-md-4, +.my-md-4 { + margin-bottom: 1.5rem !important; + } + + .ml-md-4, +.mx-md-4 { + margin-left: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .mt-md-5, +.my-md-5 { + margin-top: 3rem !important; + } + + .mr-md-5, +.mx-md-5 { + margin-right: 3rem !important; + } + + .mb-md-5, +.my-md-5 { + margin-bottom: 3rem !important; + } + + .ml-md-5, +.mx-md-5 { + margin-left: 3rem !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .pt-md-0, +.py-md-0 { + padding-top: 0 !important; + } + + .pr-md-0, +.px-md-0 { + padding-right: 0 !important; + } + + .pb-md-0, +.py-md-0 { + padding-bottom: 0 !important; + } + + .pl-md-0, +.px-md-0 { + padding-left: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .pt-md-1, +.py-md-1 { + padding-top: 0.25rem !important; + } + + .pr-md-1, +.px-md-1 { + padding-right: 0.25rem !important; + } + + .pb-md-1, +.py-md-1 { + padding-bottom: 0.25rem !important; + } + + .pl-md-1, +.px-md-1 { + padding-left: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .pt-md-2, +.py-md-2 { + padding-top: 0.5rem !important; + } + + .pr-md-2, +.px-md-2 { + padding-right: 0.5rem !important; + } + + .pb-md-2, +.py-md-2 { + padding-bottom: 0.5rem !important; + } + + .pl-md-2, +.px-md-2 { + padding-left: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .pt-md-3, +.py-md-3 { + padding-top: 1rem !important; + } + + .pr-md-3, +.px-md-3 { + padding-right: 1rem !important; + } + + .pb-md-3, +.py-md-3 { + padding-bottom: 1rem !important; + } + + .pl-md-3, +.px-md-3 { + padding-left: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .pt-md-4, +.py-md-4 { + padding-top: 1.5rem !important; + } + + .pr-md-4, +.px-md-4 { + padding-right: 1.5rem !important; + } + + .pb-md-4, +.py-md-4 { + padding-bottom: 1.5rem !important; + } + + .pl-md-4, +.px-md-4 { + padding-left: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .pt-md-5, +.py-md-5 { + padding-top: 3rem !important; + } + + .pr-md-5, +.px-md-5 { + padding-right: 3rem !important; + } + + .pb-md-5, +.py-md-5 { + padding-bottom: 3rem !important; + } + + .pl-md-5, +.px-md-5 { + padding-left: 3rem !important; + } + + .m-md-n1 { + margin: -0.25rem !important; + } + + .mt-md-n1, +.my-md-n1 { + margin-top: -0.25rem !important; + } + + .mr-md-n1, +.mx-md-n1 { + margin-right: -0.25rem !important; + } + + .mb-md-n1, +.my-md-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-md-n1, +.mx-md-n1 { + margin-left: -0.25rem !important; + } + + .m-md-n2 { + margin: -0.5rem !important; + } + + .mt-md-n2, +.my-md-n2 { + margin-top: -0.5rem !important; + } + + .mr-md-n2, +.mx-md-n2 { + margin-right: -0.5rem !important; + } + + .mb-md-n2, +.my-md-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-md-n2, +.mx-md-n2 { + margin-left: -0.5rem !important; + } + + .m-md-n3 { + margin: -1rem !important; + } + + .mt-md-n3, +.my-md-n3 { + margin-top: -1rem !important; + } + + .mr-md-n3, +.mx-md-n3 { + margin-right: -1rem !important; + } + + .mb-md-n3, +.my-md-n3 { + margin-bottom: -1rem !important; + } + + .ml-md-n3, +.mx-md-n3 { + margin-left: -1rem !important; + } + + .m-md-n4 { + margin: -1.5rem !important; + } + + .mt-md-n4, +.my-md-n4 { + margin-top: -1.5rem !important; + } + + .mr-md-n4, +.mx-md-n4 { + margin-right: -1.5rem !important; + } + + .mb-md-n4, +.my-md-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-md-n4, +.mx-md-n4 { + margin-left: -1.5rem !important; + } + + .m-md-n5 { + margin: -3rem !important; + } + + .mt-md-n5, +.my-md-n5 { + margin-top: -3rem !important; + } + + .mr-md-n5, +.mx-md-n5 { + margin-right: -3rem !important; + } + + .mb-md-n5, +.my-md-n5 { + margin-bottom: -3rem !important; + } + + .ml-md-n5, +.mx-md-n5 { + margin-left: -3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mt-md-auto, +.my-md-auto { + margin-top: auto !important; + } + + .mr-md-auto, +.mx-md-auto { + margin-right: auto !important; + } + + .mb-md-auto, +.my-md-auto { + margin-bottom: auto !important; + } + + .ml-md-auto, +.mx-md-auto { + margin-left: auto !important; + } +} +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + + .mt-lg-0, +.my-lg-0 { + margin-top: 0 !important; + } + + .mr-lg-0, +.mx-lg-0 { + margin-right: 0 !important; + } + + .mb-lg-0, +.my-lg-0 { + margin-bottom: 0 !important; + } + + .ml-lg-0, +.mx-lg-0 { + margin-left: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .mt-lg-1, +.my-lg-1 { + margin-top: 0.25rem !important; + } + + .mr-lg-1, +.mx-lg-1 { + margin-right: 0.25rem !important; + } + + .mb-lg-1, +.my-lg-1 { + margin-bottom: 0.25rem !important; + } + + .ml-lg-1, +.mx-lg-1 { + margin-left: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .mt-lg-2, +.my-lg-2 { + margin-top: 0.5rem !important; + } + + .mr-lg-2, +.mx-lg-2 { + margin-right: 0.5rem !important; + } + + .mb-lg-2, +.my-lg-2 { + margin-bottom: 0.5rem !important; + } + + .ml-lg-2, +.mx-lg-2 { + margin-left: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .mt-lg-3, +.my-lg-3 { + margin-top: 1rem !important; + } + + .mr-lg-3, +.mx-lg-3 { + margin-right: 1rem !important; + } + + .mb-lg-3, +.my-lg-3 { + margin-bottom: 1rem !important; + } + + .ml-lg-3, +.mx-lg-3 { + margin-left: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .mt-lg-4, +.my-lg-4 { + margin-top: 1.5rem !important; + } + + .mr-lg-4, +.mx-lg-4 { + margin-right: 1.5rem !important; + } + + .mb-lg-4, +.my-lg-4 { + margin-bottom: 1.5rem !important; + } + + .ml-lg-4, +.mx-lg-4 { + margin-left: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .mt-lg-5, +.my-lg-5 { + margin-top: 3rem !important; + } + + .mr-lg-5, +.mx-lg-5 { + margin-right: 3rem !important; + } + + .mb-lg-5, +.my-lg-5 { + margin-bottom: 3rem !important; + } + + .ml-lg-5, +.mx-lg-5 { + margin-left: 3rem !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .pt-lg-0, +.py-lg-0 { + padding-top: 0 !important; + } + + .pr-lg-0, +.px-lg-0 { + padding-right: 0 !important; + } + + .pb-lg-0, +.py-lg-0 { + padding-bottom: 0 !important; + } + + .pl-lg-0, +.px-lg-0 { + padding-left: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .pt-lg-1, +.py-lg-1 { + padding-top: 0.25rem !important; + } + + .pr-lg-1, +.px-lg-1 { + padding-right: 0.25rem !important; + } + + .pb-lg-1, +.py-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pl-lg-1, +.px-lg-1 { + padding-left: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .pt-lg-2, +.py-lg-2 { + padding-top: 0.5rem !important; + } + + .pr-lg-2, +.px-lg-2 { + padding-right: 0.5rem !important; + } + + .pb-lg-2, +.py-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pl-lg-2, +.px-lg-2 { + padding-left: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .pt-lg-3, +.py-lg-3 { + padding-top: 1rem !important; + } + + .pr-lg-3, +.px-lg-3 { + padding-right: 1rem !important; + } + + .pb-lg-3, +.py-lg-3 { + padding-bottom: 1rem !important; + } + + .pl-lg-3, +.px-lg-3 { + padding-left: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .pt-lg-4, +.py-lg-4 { + padding-top: 1.5rem !important; + } + + .pr-lg-4, +.px-lg-4 { + padding-right: 1.5rem !important; + } + + .pb-lg-4, +.py-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pl-lg-4, +.px-lg-4 { + padding-left: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .pt-lg-5, +.py-lg-5 { + padding-top: 3rem !important; + } + + .pr-lg-5, +.px-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-5, +.py-lg-5 { + padding-bottom: 3rem !important; + } + + .pl-lg-5, +.px-lg-5 { + padding-left: 3rem !important; + } + + .m-lg-n1 { + margin: -0.25rem !important; + } + + .mt-lg-n1, +.my-lg-n1 { + margin-top: -0.25rem !important; + } + + .mr-lg-n1, +.mx-lg-n1 { + margin-right: -0.25rem !important; + } + + .mb-lg-n1, +.my-lg-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-lg-n1, +.mx-lg-n1 { + margin-left: -0.25rem !important; + } + + .m-lg-n2 { + margin: -0.5rem !important; + } + + .mt-lg-n2, +.my-lg-n2 { + margin-top: -0.5rem !important; + } + + .mr-lg-n2, +.mx-lg-n2 { + margin-right: -0.5rem !important; + } + + .mb-lg-n2, +.my-lg-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-lg-n2, +.mx-lg-n2 { + margin-left: -0.5rem !important; + } + + .m-lg-n3 { + margin: -1rem !important; + } + + .mt-lg-n3, +.my-lg-n3 { + margin-top: -1rem !important; + } + + .mr-lg-n3, +.mx-lg-n3 { + margin-right: -1rem !important; + } + + .mb-lg-n3, +.my-lg-n3 { + margin-bottom: -1rem !important; + } + + .ml-lg-n3, +.mx-lg-n3 { + margin-left: -1rem !important; + } + + .m-lg-n4 { + margin: -1.5rem !important; + } + + .mt-lg-n4, +.my-lg-n4 { + margin-top: -1.5rem !important; + } + + .mr-lg-n4, +.mx-lg-n4 { + margin-right: -1.5rem !important; + } + + .mb-lg-n4, +.my-lg-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-lg-n4, +.mx-lg-n4 { + margin-left: -1.5rem !important; + } + + .m-lg-n5 { + margin: -3rem !important; + } + + .mt-lg-n5, +.my-lg-n5 { + margin-top: -3rem !important; + } + + .mr-lg-n5, +.mx-lg-n5 { + margin-right: -3rem !important; + } + + .mb-lg-n5, +.my-lg-n5 { + margin-bottom: -3rem !important; + } + + .ml-lg-n5, +.mx-lg-n5 { + margin-left: -3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mt-lg-auto, +.my-lg-auto { + margin-top: auto !important; + } + + .mr-lg-auto, +.mx-lg-auto { + margin-right: auto !important; + } + + .mb-lg-auto, +.my-lg-auto { + margin-bottom: auto !important; + } + + .ml-lg-auto, +.mx-lg-auto { + margin-left: auto !important; + } +} +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + + .mt-xl-0, +.my-xl-0 { + margin-top: 0 !important; + } + + .mr-xl-0, +.mx-xl-0 { + margin-right: 0 !important; + } + + .mb-xl-0, +.my-xl-0 { + margin-bottom: 0 !important; + } + + .ml-xl-0, +.mx-xl-0 { + margin-left: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .mt-xl-1, +.my-xl-1 { + margin-top: 0.25rem !important; + } + + .mr-xl-1, +.mx-xl-1 { + margin-right: 0.25rem !important; + } + + .mb-xl-1, +.my-xl-1 { + margin-bottom: 0.25rem !important; + } + + .ml-xl-1, +.mx-xl-1 { + margin-left: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .mt-xl-2, +.my-xl-2 { + margin-top: 0.5rem !important; + } + + .mr-xl-2, +.mx-xl-2 { + margin-right: 0.5rem !important; + } + + .mb-xl-2, +.my-xl-2 { + margin-bottom: 0.5rem !important; + } + + .ml-xl-2, +.mx-xl-2 { + margin-left: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .mt-xl-3, +.my-xl-3 { + margin-top: 1rem !important; + } + + .mr-xl-3, +.mx-xl-3 { + margin-right: 1rem !important; + } + + .mb-xl-3, +.my-xl-3 { + margin-bottom: 1rem !important; + } + + .ml-xl-3, +.mx-xl-3 { + margin-left: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .mt-xl-4, +.my-xl-4 { + margin-top: 1.5rem !important; + } + + .mr-xl-4, +.mx-xl-4 { + margin-right: 1.5rem !important; + } + + .mb-xl-4, +.my-xl-4 { + margin-bottom: 1.5rem !important; + } + + .ml-xl-4, +.mx-xl-4 { + margin-left: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .mt-xl-5, +.my-xl-5 { + margin-top: 3rem !important; + } + + .mr-xl-5, +.mx-xl-5 { + margin-right: 3rem !important; + } + + .mb-xl-5, +.my-xl-5 { + margin-bottom: 3rem !important; + } + + .ml-xl-5, +.mx-xl-5 { + margin-left: 3rem !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .pt-xl-0, +.py-xl-0 { + padding-top: 0 !important; + } + + .pr-xl-0, +.px-xl-0 { + padding-right: 0 !important; + } + + .pb-xl-0, +.py-xl-0 { + padding-bottom: 0 !important; + } + + .pl-xl-0, +.px-xl-0 { + padding-left: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .pt-xl-1, +.py-xl-1 { + padding-top: 0.25rem !important; + } + + .pr-xl-1, +.px-xl-1 { + padding-right: 0.25rem !important; + } + + .pb-xl-1, +.py-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pl-xl-1, +.px-xl-1 { + padding-left: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .pt-xl-2, +.py-xl-2 { + padding-top: 0.5rem !important; + } + + .pr-xl-2, +.px-xl-2 { + padding-right: 0.5rem !important; + } + + .pb-xl-2, +.py-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pl-xl-2, +.px-xl-2 { + padding-left: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .pt-xl-3, +.py-xl-3 { + padding-top: 1rem !important; + } + + .pr-xl-3, +.px-xl-3 { + padding-right: 1rem !important; + } + + .pb-xl-3, +.py-xl-3 { + padding-bottom: 1rem !important; + } + + .pl-xl-3, +.px-xl-3 { + padding-left: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .pt-xl-4, +.py-xl-4 { + padding-top: 1.5rem !important; + } + + .pr-xl-4, +.px-xl-4 { + padding-right: 1.5rem !important; + } + + .pb-xl-4, +.py-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pl-xl-4, +.px-xl-4 { + padding-left: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .pt-xl-5, +.py-xl-5 { + padding-top: 3rem !important; + } + + .pr-xl-5, +.px-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-5, +.py-xl-5 { + padding-bottom: 3rem !important; + } + + .pl-xl-5, +.px-xl-5 { + padding-left: 3rem !important; + } + + .m-xl-n1 { + margin: -0.25rem !important; + } + + .mt-xl-n1, +.my-xl-n1 { + margin-top: -0.25rem !important; + } + + .mr-xl-n1, +.mx-xl-n1 { + margin-right: -0.25rem !important; + } + + .mb-xl-n1, +.my-xl-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-xl-n1, +.mx-xl-n1 { + margin-left: -0.25rem !important; + } + + .m-xl-n2 { + margin: -0.5rem !important; + } + + .mt-xl-n2, +.my-xl-n2 { + margin-top: -0.5rem !important; + } + + .mr-xl-n2, +.mx-xl-n2 { + margin-right: -0.5rem !important; + } + + .mb-xl-n2, +.my-xl-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-xl-n2, +.mx-xl-n2 { + margin-left: -0.5rem !important; + } + + .m-xl-n3 { + margin: -1rem !important; + } + + .mt-xl-n3, +.my-xl-n3 { + margin-top: -1rem !important; + } + + .mr-xl-n3, +.mx-xl-n3 { + margin-right: -1rem !important; + } + + .mb-xl-n3, +.my-xl-n3 { + margin-bottom: -1rem !important; + } + + .ml-xl-n3, +.mx-xl-n3 { + margin-left: -1rem !important; + } + + .m-xl-n4 { + margin: -1.5rem !important; + } + + .mt-xl-n4, +.my-xl-n4 { + margin-top: -1.5rem !important; + } + + .mr-xl-n4, +.mx-xl-n4 { + margin-right: -1.5rem !important; + } + + .mb-xl-n4, +.my-xl-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-xl-n4, +.mx-xl-n4 { + margin-left: -1.5rem !important; + } + + .m-xl-n5 { + margin: -3rem !important; + } + + .mt-xl-n5, +.my-xl-n5 { + margin-top: -3rem !important; + } + + .mr-xl-n5, +.mx-xl-n5 { + margin-right: -3rem !important; + } + + .mb-xl-n5, +.my-xl-n5 { + margin-bottom: -3rem !important; + } + + .ml-xl-n5, +.mx-xl-n5 { + margin-left: -3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mt-xl-auto, +.my-xl-auto { + margin-top: auto !important; + } + + .mr-xl-auto, +.mx-xl-auto { + margin-right: auto !important; + } + + .mb-xl-auto, +.my-xl-auto { + margin-bottom: auto !important; + } + + .ml-xl-auto, +.mx-xl-auto { + margin-left: auto !important; + } +} +.text-monospace { + font-family: "VGAsquarePx"; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + + .text-sm-right { + text-align: right !important; + } + + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + + .text-md-right { + text-align: right !important; + } + + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + + .text-lg-right { + text-align: right !important; + } + + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + + .text-xl-right { + text-align: right !important; + } + + .text-xl-center { + text-align: center !important; + } +} +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #AAAAAA !important; +} + +.text-primary { + color: #0000AA !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #00005e !important; +} + +.text-secondary { + color: #555555 !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #2f2f2f !important; +} + +.text-success { + color: #00AA00 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #005e00 !important; +} + +.text-info { + color: #00AAAA !important; +} + +a.text-info:hover, a.text-info:focus { + color: #005e5e !important; +} + +.text-warning { + color: #FFFF55 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #ffff09 !important; +} + +.text-danger { + color: #AA0000 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #5e0000 !important; +} + +.text-light { + color: #AAAAAA !important; +} + +a.text-light:hover, a.text-light:focus { + color: #848484 !important; +} + +.text-dark { + color: #555555 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #2f2f2f !important; +} + +.text-body { + color: #AAAAAA !important; +} + +.text-muted { + color: #555555 !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(170, 170, 170, 0.5) !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, +*::before, +*::after { + text-shadow: none !important; + box-shadow: none !important; + } + + a:not(.btn) { + text-decoration: underline; + } + + abbr[title]::after { + content: " (" attr(title) ")"; + } + + pre { + white-space: pre-wrap !important; + } + + pre, +blockquote { + border: 1px solid #555555; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, +img { + page-break-inside: avoid; + } + + p, +h2, +h3 { + orphans: 3; + widows: 3; + } + + h2, +h3 { + page-break-after: avoid; + } + + @page { + size: a3; + } + body { + min-width: 992px !important; + } + + .container { + min-width: 992px !important; + } + + .navbar { + display: none; + } + + .badge { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + } + .table td, +.table th { + background-color: #AAAAAA !important; + } + + .table-bordered th, +.table-bordered td { + border: 1px solid #AAAAAA !important; + } + + .table-dark { + color: inherit; + } + .table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #AAAAAA; + } + + .table .thead-dark th { + color: inherit; + border-color: #AAAAAA; + } +} +footer { + background-color: #AA5500; + color: #000; +} + +header { + background-color: #55FFFF; + color: #000; + text-align: center; +} + +header a { + color: #FF55FF; +} + +header a:hover { + color: #FF5555; + text-decoration: none; +} + +footer a:hover { + text-decoration: none; +} + +.table-centered { + margin-left: auto; + margin-right: auto; +} + +.card-button { + color: #FFFF55; +} + +.table-dark-em { + color: #AA5500; + font-style: normal; +} + +.table-dark-header { + color: #AA5500; + font-style: normal; + text-align: center; +} + +/*# sourceMappingURL=dicserver.css.map */ diff --git a/DiscImageChef.Server/styles/dos/dicserver.scss b/DiscImageChef.Server/styles/dos/dicserver.scss new file mode 100644 index 00000000..3821099f --- /dev/null +++ b/DiscImageChef.Server/styles/dos/dicserver.scss @@ -0,0 +1,87 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : dicserver.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; +@import "_font"; +@import "_fontstyles"; + +@import "../../node_modules/bootstrap/scss/bootstrap"; + +footer +{ + background-color: $brown; + color: $black; +} + +header +{ + background-color: $teal; + color: $black; + text-align: center; +} + +header a +{ + color: $pink; +} + +header a:hover +{ + color: $orange; + text-decoration: none; +} + +footer a:hover +{ + text-decoration: none; +} + +.table-centered +{ + margin-left:auto; + margin-right:auto; +} + +.card-button{color:$yellow} + +.table-dark-em +{ + color: $brown; + font-style: normal; +} + +.table-dark-header +{ + color: $brown; + font-style: normal; + text-align: center; +} \ No newline at end of file diff --git a/DiscImageChef.Server/styles/dos/dicserver_highcharts.css b/DiscImageChef.Server/styles/dos/dicserver_highcharts.css new file mode 100644 index 00000000..f82985aa --- /dev/null +++ b/DiscImageChef.Server/styles/dos/dicserver_highcharts.css @@ -0,0 +1,930 @@ +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using EGA colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets font to VGA square */ +@font-face { + font-family: "VGAsquarePx"; + src: url(../../fonts/vga_squarepx.eot); + src: url(../../fonts/vga_squarepx.eot?#iefix) format("embedded-opentype"), url(../../fonts/vga_squarepx.woff2) format("woff2"), url(../../fonts/vga_squarepx.woff) format("woff"), url(../../fonts/vga_squarepx.ttf) format("truetype"); + font-weight: normal; + font-style: normal; +} +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using EGA colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets the style for emphasis/italics */ +em, i { + color: #00AA00; + font-style: normal; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong { + color: #FFFFFF; + font-size: 1em; + font-style: normal; + font-weight: normal; + margin: 0; +} + +/** + * @license Highcharts + * + * (c) 2009-2016 Torstein Honsi + * + * License: www.highcharts.com/license + */ +.highcharts-container { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; + text-align: left; + line-height: normal; + z-index: 0; + /* #1072 */ + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-family: "VGAsquarePx"; + font-size: 12px; +} + +.highcharts-root { + display: block; +} + +.highcharts-root text { + stroke-width: 0; +} + +.highcharts-strong { + font-weight: bold; +} + +.highcharts-emphasized { + font-style: italic; +} + +.highcharts-anchor { + cursor: pointer; +} + +.highcharts-background { + fill: #000; +} + +.highcharts-plot-border, .highcharts-plot-background { + fill: none; +} + +.highcharts-label-box { + fill: none; +} + +.highcharts-button-box { + fill: inherit; +} + +.highcharts-tracker-line { + stroke-linejoin: round; + stroke: rgba(192, 192, 192, 0.0001); + stroke-width: 22; + fill: none; +} + +.highcharts-tracker-area { + fill: rgba(192, 192, 192, 0.0001); + stroke-width: 0; +} + +/* Titles */ +.highcharts-title { + fill: #AAAAAA; + font-size: 1.5em; +} + +.highcharts-subtitle { + fill: #AAAAAA; +} + +/* Axes */ +.highcharts-axis-line { + fill: none; + stroke: #ccd6eb; +} + +.highcharts-yaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-axis-title { + fill: #AAAAAA; +} + +.highcharts-axis-labels { + fill: #AAAAAA; + cursor: default; + font-size: 0.9em; +} + +.highcharts-grid-line { + fill: none; + stroke: #555555; +} + +.highcharts-xaxis-grid .highcharts-grid-line { + stroke-width: 0px; +} + +.highcharts-tick { + stroke: #ccd6eb; +} + +.highcharts-yaxis .highcharts-tick { + stroke-width: 0; +} + +.highcharts-minor-grid-line { + stroke: #555555; +} + +.highcharts-crosshair-thin { + stroke-width: 1px; + stroke: #555555; +} + +.highcharts-crosshair-category { + stroke: #ccd6eb; + stroke-opacity: 0.25; +} + +/* Credits */ +.highcharts-credits { + cursor: pointer; + fill: #AAAAAA; + font-size: 0.7em; + transition: fill 250ms, font-size 250ms; +} + +.highcharts-credits:hover { + fill: black; + font-size: 1em; +} + +/* Tooltip */ +.highcharts-tooltip { + cursor: default; + pointer-events: none; + white-space: nowrap; + transition: stroke 150ms; +} + +.highcharts-tooltip text { + fill: #AAAAAA; +} + +.highcharts-tooltip .highcharts-header { + font-size: 0.85em; +} + +.highcharts-tooltip-box { + stroke-width: 1px; + fill: #FFFFFF; + fill-opacity: 0.85; +} + +.highcharts-tooltip-box .highcharts-label-box { + fill: #FFFFFF; + fill-opacity: 0.85; +} + +.highcharts-selection-marker { + fill: #335cad; + fill-opacity: 0.25; +} + +.highcharts-graph { + fill: none; + stroke-width: 2px; + stroke-linecap: round; + stroke-linejoin: round; +} + +.highcharts-state-hover .highcharts-graph { + stroke-width: 3; +} + +.highcharts-state-hover path { + transition: stroke-width 50; + /* quick in */ +} + +.highcharts-state-normal path { + transition: stroke-width 250ms; + /* slow out */ +} + +/* Legend hover affects points and series */ +g.highcharts-series, +.highcharts-point, +.highcharts-markers, +.highcharts-data-labels { + transition: opacity 250ms; +} + +.highcharts-legend-series-active g.highcharts-series:not(.highcharts-series-hover), +.highcharts-legend-point-active .highcharts-point:not(.highcharts-point-hover), +.highcharts-legend-series-active .highcharts-markers:not(.highcharts-series-hover), +.highcharts-legend-series-active .highcharts-data-labels:not(.highcharts-series-hover) { + opacity: 0.2; +} + +/* Series options */ +/* Default colors */ +.highcharts-color-0 { + fill: #FF5555; + stroke: #FF5555; +} + +.highcharts-color-1 { + fill: #00AA00; + stroke: #00AA00; +} + +.highcharts-color-2 { + fill: #AA5500; + stroke: #AA5500; +} + +.highcharts-color-3 { + fill: #AA55AA; + stroke: #AA55AA; +} + +.highcharts-color-4 { + fill: #FF55FF; + stroke: #FF55FF; +} + +.highcharts-color-5 { + fill: #55FFFF; + stroke: #55FFFF; +} + +.highcharts-color-6 { + fill: #FFFF55; + stroke: #FFFF55; +} + +.highcharts-color-7 { + fill: #AA00FF; + stroke: #AA00FF; +} + +.highcharts-color-8 { + fill: #00AAAA; + stroke: #00AAAA; +} + +.highcharts-color-9 { + fill: #AAAAAA; + stroke: #AAAAAA; +} + +.highcharts-area { + fill-opacity: 0.75; + stroke-width: 0; +} + +.highcharts-markers { + stroke-width: 1px; + stroke: #000; +} + +.highcharts-point { + stroke-width: 1px; +} + +.highcharts-dense-data .highcharts-point { + stroke-width: 0; +} + +.highcharts-data-label { + font-size: 0.9em; + font-weight: bold; +} + +.highcharts-data-label-box { + fill: none; + stroke-width: 0; +} + +.highcharts-data-label text, text.highcharts-data-label { + fill: #FFFF55; +} + +.highcharts-data-label-connector { + fill: none; +} + +.highcharts-halo { + fill-opacity: 0.25; + stroke-width: 0; +} + +.highcharts-series:not(.highcharts-pie-series) .highcharts-point-select, +.highcharts-markers .highcharts-point-select { + fill: #555555; + stroke: #FFFFFF; +} + +.highcharts-column-series rect.highcharts-point { + stroke: #000; +} + +.highcharts-column-series .highcharts-point { + transition: fill-opacity 250ms; +} + +.highcharts-column-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pie-series .highcharts-point { + stroke-linejoin: round; + stroke: #000; +} + +.highcharts-pie-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point { + stroke-linejoin: round; + stroke: #000; +} + +.highcharts-funnel-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-pyramid-series .highcharts-point { + stroke-linejoin: round; + stroke: #000; +} + +.highcharts-pyramid-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pyramid-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-solidgauge-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-treemap-series .highcharts-point { + stroke-width: 1px; + stroke: #555555; + transition: stroke 250ms, fill 250ms, fill-opacity 250ms; +} + +.highcharts-treemap-series .highcharts-point-hover { + stroke: #AAAAAA; + transition: stroke 25ms, fill 25ms, fill-opacity 25ms; +} + +.highcharts-treemap-series .highcharts-above-level { + display: none; +} + +.highcharts-treemap-series .highcharts-internal-node { + fill: none; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive { + fill-opacity: 0.15; + cursor: pointer; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive:hover { + fill-opacity: 0.75; +} + +/* Legend */ +.highcharts-legend-box { + fill: none; + stroke-width: 0; +} + +.highcharts-legend-item > text { + fill: #AAAAAA; + font-weight: bold; + font-size: 1em; + cursor: pointer; + stroke-width: 0; +} + +.highcharts-legend-item:hover text { + fill: #FFFFFF; +} + +.highcharts-legend-item-hidden * { + fill: #555555 !important; + stroke: #555555 !important; + transition: fill 250ms; +} + +.highcharts-legend-nav-active { + fill: #003399; + cursor: pointer; +} + +.highcharts-legend-nav-inactive { + fill: #555555; +} + +.highcharts-legend-title-box { + fill: none; + stroke-width: 0; +} + +/* Bubble legend */ +.highcharts-bubble-legend-symbol { + stroke-width: 2; + fill-opacity: 0.5; +} + +.highcharts-bubble-legend-connectors { + stroke-width: 1; +} + +.highcharts-bubble-legend-labels { + fill: #AAAAAA; +} + +/* Loading */ +.highcharts-loading { + position: absolute; + background-color: #000; + opacity: 0.5; + text-align: center; + z-index: 10; + transition: opacity 250ms; +} + +.highcharts-loading-hidden { + height: 0 !important; + opacity: 0; + overflow: hidden; + transition: opacity 250ms, height 250ms step-end; +} + +.highcharts-loading-inner { + font-weight: bold; + position: relative; + top: 45%; +} + +/* Plot bands and polar pane backgrounds */ +.highcharts-plot-band, .highcharts-pane { + fill: #FFFFFF; + fill-opacity: 0.05; +} + +.highcharts-plot-line { + fill: none; + stroke: #AAAAAA; + stroke-width: 1px; +} + +/* Highcharts More and modules */ +.highcharts-boxplot-box { + fill: #000; +} + +.highcharts-boxplot-median { + stroke-width: 2px; +} + +.highcharts-bubble-series .highcharts-point { + fill-opacity: 0.5; +} + +.highcharts-errorbar-series .highcharts-point { + stroke: #FFFFFF; +} + +.highcharts-gauge-series .highcharts-data-label-box { + stroke: #555555; + stroke-width: 1px; +} + +.highcharts-gauge-series .highcharts-dial { + fill: #FFFFFF; + stroke-width: 0; +} + +.highcharts-polygon-series .highcharts-graph { + fill: inherit; + stroke-width: 0; +} + +.highcharts-waterfall-series .highcharts-graph { + stroke: #AAAAAA; + stroke-dasharray: 1, 3; +} + +.highcharts-sankey-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-sankey-series .highcharts-link { + transition: fill 250ms, fill-opacity 250ms; + fill-opacity: 0.5; +} + +.highcharts-sankey-series .highcharts-point-hover.highcharts-link { + transition: fill 50ms, fill-opacity 50ms; + fill-opacity: 1; +} + +.highcharts-venn-series .highcharts-point { + fill-opacity: 0.75; + stroke: #555555; + transition: stroke 250ms, fill-opacity 250ms; +} + +.highcharts-venn-series .highcharts-point-hover { + fill-opacity: 1; + stroke: #555555; +} + +/* Highstock */ +.highcharts-navigator-mask-outside { + fill-opacity: 0; +} + +.highcharts-navigator-mask-inside { + fill: #6685c2; + /* navigator.maskFill option */ + fill-opacity: 0.25; + cursor: ew-resize; +} + +.highcharts-navigator-outline { + stroke: #555555; + fill: none; +} + +.highcharts-navigator-handle { + stroke: #555555; + fill: #555555; + cursor: ew-resize; +} + +.highcharts-navigator-series { + fill: #335cad; + stroke: #335cad; +} + +.highcharts-navigator-series .highcharts-graph { + stroke-width: 1px; +} + +.highcharts-navigator-series .highcharts-area { + fill-opacity: 0.05; +} + +.highcharts-navigator-xaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-navigator-xaxis .highcharts-grid-line { + stroke-width: 1px; + stroke: #555555; +} + +.highcharts-navigator-xaxis.highcharts-axis-labels { + fill: #AAAAAA; +} + +.highcharts-navigator-yaxis .highcharts-grid-line { + stroke-width: 0; +} + +.highcharts-scrollbar-thumb { + fill: #555555; + stroke: #555555; + stroke-width: 1px; +} + +.highcharts-scrollbar-button { + fill: #555555; + stroke: #555555; + stroke-width: 1px; +} + +.highcharts-scrollbar-arrow { + fill: #AAAAAA; +} + +.highcharts-scrollbar-rifles { + stroke: #AAAAAA; + stroke-width: 1px; +} + +.highcharts-scrollbar-track { + fill: #555555; + stroke: #555555; + stroke-width: 1px; +} + +.highcharts-button { + fill: #555555; + stroke: #555555; + cursor: default; + stroke-width: 1px; + transition: fill 250ms; +} + +.highcharts-button text { + fill: #AAAAAA; +} + +.highcharts-button-hover { + transition: fill 0ms; + fill: #555555; + stroke: #555555; +} + +.highcharts-button-hover text { + fill: #AAAAAA; +} + +.highcharts-button-pressed { + font-weight: bold; + fill: #e6ebf5; + stroke: #555555; +} + +.highcharts-button-pressed text { + fill: #AAAAAA; + font-weight: bold; +} + +.highcharts-button-disabled text { + fill: #AAAAAA; +} + +.highcharts-range-selector-buttons .highcharts-button { + stroke-width: 0px; +} + +.highcharts-range-label rect { + fill: none; +} + +.highcharts-range-label text { + fill: #AAAAAA; +} + +.highcharts-range-input rect { + fill: none; +} + +.highcharts-range-input text { + fill: #AAAAAA; +} + +.highcharts-range-input { + stroke-width: 1px; + stroke: #555555; +} + +input.highcharts-range-selector { + position: absolute; + border: 0; + width: 1px; + /* Chrome needs a pixel to see it */ + height: 1px; + padding: 0; + text-align: center; + left: -9em; + /* #4798 */ +} + +.highcharts-crosshair-label text { + fill: #000; + font-size: 1.1em; +} + +.highcharts-crosshair-label .highcharts-label-box { + fill: inherit; +} + +.highcharts-candlestick-series .highcharts-point { + stroke: #FFFFFF; + stroke-width: 1px; +} + +.highcharts-candlestick-series .highcharts-point-up { + fill: #000; +} + +.highcharts-ohlc-series .highcharts-point-hover { + stroke-width: 3px; +} + +.highcharts-flags-series .highcharts-point .highcharts-label-box { + stroke: #AAAAAA; + fill: #000; + transition: fill 250ms; +} + +.highcharts-flags-series .highcharts-point-hover .highcharts-label-box { + stroke: #FFFFFF; + fill: #ccd6eb; +} + +.highcharts-flags-series .highcharts-point text { + fill: #FFFFFF; + font-size: 0.9em; + font-weight: bold; +} + +/* Highmaps */ +.highcharts-map-series .highcharts-point { + transition: fill 500ms, fill-opacity 500ms, stroke-width 250ms; + stroke: #555555; +} + +.highcharts-map-series .highcharts-point-hover { + transition: fill 0ms, fill-opacity 0ms; + fill-opacity: 0.5; + stroke-width: 2px; +} + +.highcharts-mapline-series .highcharts-point { + fill: none; +} + +.highcharts-heatmap-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-map-navigation { + font-size: 1.3em; + font-weight: bold; + text-align: center; +} + +.highcharts-coloraxis { + stroke-width: 0; +} + +.highcharts-coloraxis-marker { + fill: #AAAAAA; +} + +.highcharts-null-point { + fill: #555555; +} + +/* 3d charts */ +.highcharts-3d-frame { + fill: transparent; +} + +/* Exporting module */ +.highcharts-contextbutton { + fill: #000; + /* needed to capture hover */ + stroke: none; + stroke-linecap: round; +} + +.highcharts-contextbutton:hover { + fill: #555555; + stroke: #555555; +} + +.highcharts-button-symbol { + stroke: #AAAAAA; + stroke-width: 3px; +} + +.highcharts-menu { + border: 1px solid #AAAAAA; + background: #000; + padding: 5px 0; + box-shadow: 3px 3px 10px #888; +} + +.highcharts-menu-item { + padding: 0.5em 1em; + background: none; + color: #AAAAAA; + cursor: pointer; + transition: background 250ms, color 250ms; +} + +.highcharts-menu-item:hover { + background: #335cad; + color: #000; +} + +/* Drilldown module */ +.highcharts-drilldown-point { + cursor: pointer; +} + +.highcharts-drilldown-data-label text, +text.highcharts-drilldown-data-label, +.highcharts-drilldown-axis-label { + cursor: pointer; + fill: #003399; + font-weight: bold; + text-decoration: underline; +} + +/* No-data module */ +.highcharts-no-data text { + font-weight: bold; + font-size: 12px; + fill: #AAAAAA; +} + +/* Drag-panes module */ +.highcharts-axis-resizer { + cursor: ns-resize; + stroke: black; + stroke-width: 2px; +} + +/* Bullet type series */ +.highcharts-bullet-target { + stroke-width: 0; +} + +/* Lineargauge type series */ +.highcharts-lineargauge-target { + stroke-width: 1px; + stroke: #AAAAAA; +} + +.highcharts-lineargauge-target-line { + stroke-width: 1px; + stroke: #AAAAAA; +} + +/* Annotations module */ +.highcharts-annotation-label-box { + stroke-width: 1px; + stroke: #FFFFFF; + fill: #FFFFFF; + fill-opacity: 0.75; +} + +.highcharts-annotation-label text { + fill: #555555; +} + +/* Gantt */ +.highcharts-treegrid-node-collapsed, .highcharts-treegrid-node-expanded { + cursor: pointer; +} + +.highcharts-point-connecting-path { + fill: none; +} + +.highcharts-grid-axis .highcharts-tick { + stroke-width: 1px; +} + +.highcharts-grid-axis .highcharts-axis-line { + stroke-width: 1px; +} + +/*# sourceMappingURL=dicserver_highcharts.css.map */ diff --git a/DiscImageChef.Server/styles/dos/dicserver_highcharts.scss b/DiscImageChef.Server/styles/dos/dicserver_highcharts.scss new file mode 100644 index 00000000..13da6985 --- /dev/null +++ b/DiscImageChef.Server/styles/dos/dicserver_highcharts.scss @@ -0,0 +1,55 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : dicserver_highcharts.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets style for server's charts. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; +@import "_font"; +@import "_fontstyles"; + +$colors: $orange $green $brown $indigo $pink $teal $yellow $purple $cyan $white; +$background-color: $body-bg; + +$neutral-color-100: $brightwhite; // Strong text. +$neutral-color-80: $white; // Main text and some strokes. +$neutral-color-60: $white; // Axis labels, axis title, connector fallback. +$neutral-color-40: $white; // Credits text, export menu stroke. +$neutral-color-20: $darkgray; // Disabled texts, button strokes, crosshair etc. +$neutral-color-10: $darkgray; // Grid lines etc. +$neutral-color-5: $darkgray; // Minor grid lines etc. +$neutral-color-3: $darkgray; // Tooltip backgroud, button fills, map null points. + +$font-family: $font-family-base; + +$tooltip-background: $brightwhite; + +$data-label-color: $yellow; + +@import "../_highcharts"; \ No newline at end of file diff --git a/DiscImageChef.Server/styles/mac/_colors.scss b/DiscImageChef.Server/styles/mac/_colors.scss new file mode 100644 index 00000000..87c9aa0a --- /dev/null +++ b/DiscImageChef.Server/styles/mac/_colors.scss @@ -0,0 +1,89 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _colors.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets colors for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +/* Sets the grayscale for Bootstrap */ +$white: #FFFFFF; +$darkgray: #404040; +$gray-100: #C0C0C0; +$gray-200: #C0C0C0; +$gray-300: #C0C0C0; +$gray-400: #808080; +$gray-500: #808080; +$gray-600: #808080; +$gray-700: #404040; +$gray-800: #404040; +$gray-900: #404040; +$black: #000000; + +/* Sets color palette, using Macintosh II colors */ +$green: #1FB714; +$yellow: #FBF305; +$darkgreen: #006412; +$orange: #FF6403; +$brown: #562C05; +$red: #DD0907; +$tan:#90713A; +$magenta:#F20884; +$purple:#4700A5; +$blue:#0000D3; +$cyan:#02ABEA; + +/* Bootstrap color aliases */ +$primary: $blue; +$secondary: $gray-600; +$success: $green; +$info: $cyan; +$warning: $yellow; +$danger: $red; +$light: $gray-100; +$dark: $gray-800; + +/* Colors for */ +$body-bg: $white; +$body-color: $black; + +/* Colors for */ +$link-color: $cyan; +$link-hover-color: $magenta; + +/* Colors for cards */ +$card-border-color: rgba($gray-300, .125); +$card-cap-bg: rgba($gray-300, .03); +$card-cap-color: inherit; +$card-bg: $gray-300; + +/* Colors for tables */ +$table-dark-bg: $gray-300; +$table-dark-accent-bg: rgba($white, .05); +$table-dark-hover-bg: rgba($white, .075); +$table-dark-border-color: lighten($tan, 7.5%); +$table-dark-color: $darkgray; diff --git a/DiscImageChef.Server/styles/mac/_font.scss b/DiscImageChef.Server/styles/mac/_font.scss new file mode 100644 index 00000000..5ba7c7db --- /dev/null +++ b/DiscImageChef.Server/styles/mac/_font.scss @@ -0,0 +1,51 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _font.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets font for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +/* Sets font to Macintosh Chicago clone font */ +@font-face +{ + font-family: 'ChicagoFLF'; + src: url(../../fonts/ChicagoFLF.eot); + src: url(../../fonts/ChicagoFLF.eot?#iefix) format('embedded-opentype'), + url(../../fonts/ChicagoFLF.woff2) format('woff2'), + url(../../fonts/ChicagoFLF.woff) format('woff'), + url(../../fonts/ChicagoFLF.ttf) format('truetype'); + font-weight: normal; + font-style: normal; +} + +$font-family-sans-serif: 'ChicagoFLF'; +$font-family-monospace: 'ChicagoFLF'; +$font-family-base: 'ChicagoFLF'; +$font-size-base: 1rem; + +$line-height-base: 1; diff --git a/DiscImageChef.Server/styles/mac/_fontstyles.scss b/DiscImageChef.Server/styles/mac/_fontstyles.scss new file mode 100644 index 00000000..71a5a78c --- /dev/null +++ b/DiscImageChef.Server/styles/mac/_fontstyles.scss @@ -0,0 +1,49 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : _fontstyles.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets font styles for server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; + +/* Sets the style for emphasis/italics */ +em, i +{ + font-style: italic; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong +{ + font-size: 1em; + font-style: normal; + font-weight: bold; + margin: 0; +} diff --git a/DiscImageChef.Server/styles/mac/dicserver.css b/DiscImageChef.Server/styles/mac/dicserver.css new file mode 100644 index 00000000..d0d7b4ef --- /dev/null +++ b/DiscImageChef.Server/styles/mac/dicserver.css @@ -0,0 +1,9595 @@ +@charset "UTF-8"; +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using Macintosh II colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets font to Macintosh Chicago clone font */ +@font-face { + font-family: "ChicagoFLF"; + src: url(../../fonts/ChicagoFLF.eot); + src: url(../../fonts/ChicagoFLF.eot?#iefix) format("embedded-opentype"), url(../../fonts/ChicagoFLF.woff2) format("woff2"), url(../../fonts/ChicagoFLF.woff) format("woff"), url(../../fonts/ChicagoFLF.ttf) format("truetype"); + font-weight: normal; + font-style: normal; +} +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using Macintosh II colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets the style for emphasis/italics */ +em, i { + font-style: italic; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong { + font-size: 1em; + font-style: normal; + font-weight: bold; + margin: 0; +} + +/*! + * Bootstrap v4.2.1 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #0000D3; + --indigo: #6610f2; + --purple: #4700A5; + --pink: #e83e8c; + --red: #DD0907; + --orange: #FF6403; + --yellow: #FBF305; + --green: #1FB714; + --teal: #20c997; + --cyan: #02ABEA; + --white: #FFFFFF; + --gray: #808080; + --gray-dark: #404040; + --primary: #0000D3; + --secondary: #808080; + --success: #1FB714; + --info: #02ABEA; + --warning: #FBF305; + --danger: #DD0907; + --light: #C0C0C0; + --dark: #404040; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: "ChicagoFLF"; + --font-family-monospace: "ChicagoFLF"; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: "ChicagoFLF"; + font-size: 1rem; + font-weight: 400; + line-height: 1; + color: #000000; + text-align: left; + background-color: #FFFFFF; +} + +[tabindex="-1"]:focus { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: #02ABEA; + text-decoration: none; + background-color: transparent; +} +a:hover { + color: #F20884; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: "ChicagoFLF"; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #808080; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type=radio], +input[type=checkbox] { + box-sizing: border-box; + padding: 0; +} + +input[type=date], +input[type=time], +input[type=datetime-local], +input[type=month] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-family: inherit; + font-weight: 500; + line-height: 1.2; + color: inherit; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #808080; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #FFFFFF; + border: 1px solid #C0C0C0; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #808080; +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-break: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #FFFFFF; + background-color: #404040; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #404040; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.row { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} +.no-gutters > .col, +.no-gutters > [class*=col-] { + padding-right: 0; + padding-left: 0; +} + +.col-xl, +.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg, +.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md, +.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm, +.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col, +.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; +} + +.col-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; +} + +.col-3 { + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; +} + +.col-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; +} + +.col-6 { + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; +} + +.col-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; +} + +.col-9 { + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; +} + +.col-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; +} + +.col-12 { + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + order: -1; +} + +.order-last { + order: 13; +} + +.order-0 { + order: 0; +} + +.order-1 { + order: 1; +} + +.order-2 { + order: 2; +} + +.order-3 { + order: 3; +} + +.order-4 { + order: 4; +} + +.order-5 { + order: 5; +} + +.order-6 { + order: 6; +} + +.order-7 { + order: 7; +} + +.order-8 { + order: 8; +} + +.order-9 { + order: 9; +} + +.order-10 { + order: 10; +} + +.order-11 { + order: 11; +} + +.order-12 { + order: 12; +} + +.offset-1 { + margin-left: 8.3333333333%; +} + +.offset-2 { + margin-left: 16.6666666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.3333333333%; +} + +.offset-5 { + margin-left: 41.6666666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.3333333333%; +} + +.offset-8 { + margin-left: 66.6666666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.3333333333%; +} + +.offset-11 { + margin-left: 91.6666666667%; +} + +@media (min-width: 576px) { + .col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-sm-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-sm-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-sm-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-sm-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-sm-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-sm-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-sm-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-sm-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-sm-first { + order: -1; + } + + .order-sm-last { + order: 13; + } + + .order-sm-0 { + order: 0; + } + + .order-sm-1 { + order: 1; + } + + .order-sm-2 { + order: 2; + } + + .order-sm-3 { + order: 3; + } + + .order-sm-4 { + order: 4; + } + + .order-sm-5 { + order: 5; + } + + .order-sm-6 { + order: 6; + } + + .order-sm-7 { + order: 7; + } + + .order-sm-8 { + order: 8; + } + + .order-sm-9 { + order: 9; + } + + .order-sm-10 { + order: 10; + } + + .order-sm-11 { + order: 11; + } + + .order-sm-12 { + order: 12; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.3333333333%; + } + + .offset-sm-2 { + margin-left: 16.6666666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.3333333333%; + } + + .offset-sm-5 { + margin-left: 41.6666666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.3333333333%; + } + + .offset-sm-8 { + margin-left: 66.6666666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.3333333333%; + } + + .offset-sm-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 768px) { + .col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-md-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-md-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-md-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-md-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-md-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-md-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-md-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-md-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-md-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-md-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-md-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-md-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-md-first { + order: -1; + } + + .order-md-last { + order: 13; + } + + .order-md-0 { + order: 0; + } + + .order-md-1 { + order: 1; + } + + .order-md-2 { + order: 2; + } + + .order-md-3 { + order: 3; + } + + .order-md-4 { + order: 4; + } + + .order-md-5 { + order: 5; + } + + .order-md-6 { + order: 6; + } + + .order-md-7 { + order: 7; + } + + .order-md-8 { + order: 8; + } + + .order-md-9 { + order: 9; + } + + .order-md-10 { + order: 10; + } + + .order-md-11 { + order: 11; + } + + .order-md-12 { + order: 12; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.3333333333%; + } + + .offset-md-2 { + margin-left: 16.6666666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.3333333333%; + } + + .offset-md-5 { + margin-left: 41.6666666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.3333333333%; + } + + .offset-md-8 { + margin-left: 66.6666666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.3333333333%; + } + + .offset-md-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 992px) { + .col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-lg-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-lg-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-lg-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-lg-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-lg-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-lg-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-lg-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-lg-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-lg-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-lg-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-lg-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-lg-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-lg-first { + order: -1; + } + + .order-lg-last { + order: 13; + } + + .order-lg-0 { + order: 0; + } + + .order-lg-1 { + order: 1; + } + + .order-lg-2 { + order: 2; + } + + .order-lg-3 { + order: 3; + } + + .order-lg-4 { + order: 4; + } + + .order-lg-5 { + order: 5; + } + + .order-lg-6 { + order: 6; + } + + .order-lg-7 { + order: 7; + } + + .order-lg-8 { + order: 8; + } + + .order-lg-9 { + order: 9; + } + + .order-lg-10 { + order: 10; + } + + .order-lg-11 { + order: 11; + } + + .order-lg-12 { + order: 12; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.3333333333%; + } + + .offset-lg-2 { + margin-left: 16.6666666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.3333333333%; + } + + .offset-lg-5 { + margin-left: 41.6666666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.3333333333%; + } + + .offset-lg-8 { + margin-left: 66.6666666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.3333333333%; + } + + .offset-lg-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 1200px) { + .col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-xl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-xl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-xl-3 { + flex: 0 0 25%; + max-width: 25%; + } + + .col-xl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-xl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-xl-6 { + flex: 0 0 50%; + max-width: 50%; + } + + .col-xl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-xl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-xl-9 { + flex: 0 0 75%; + max-width: 75%; + } + + .col-xl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-xl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-xl-12 { + flex: 0 0 100%; + max-width: 100%; + } + + .order-xl-first { + order: -1; + } + + .order-xl-last { + order: 13; + } + + .order-xl-0 { + order: 0; + } + + .order-xl-1 { + order: 1; + } + + .order-xl-2 { + order: 2; + } + + .order-xl-3 { + order: 3; + } + + .order-xl-4 { + order: 4; + } + + .order-xl-5 { + order: 5; + } + + .order-xl-6 { + order: 6; + } + + .order-xl-7 { + order: 7; + } + + .order-xl-8 { + order: 8; + } + + .order-xl-9 { + order: 9; + } + + .order-xl-10 { + order: 10; + } + + .order-xl-11 { + order: 11; + } + + .order-xl-12 { + order: 12; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.3333333333%; + } + + .offset-xl-2 { + margin-left: 16.6666666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.3333333333%; + } + + .offset-xl-5 { + margin-left: 41.6666666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.3333333333%; + } + + .offset-xl-8 { + margin-left: 66.6666666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.3333333333%; + } + + .offset-xl-11 { + margin-left: 91.6666666667%; + } +} +.table { + width: 100%; + margin-bottom: 1rem; + background-color: transparent; +} +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #C0C0C0; +} +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #C0C0C0; +} +.table tbody + tbody { + border-top: 2px solid #C0C0C0; +} +.table .table { + background-color: #FFFFFF; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #C0C0C0; +} +.table-bordered th, +.table-bordered td { + border: 1px solid #C0C0C0; +} +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #b8b8f3; +} +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #7a7ae8; +} + +.table-hover .table-primary:hover { + background-color: #a2a2ef; +} +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #a2a2ef; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #dbdbdb; +} +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #bdbdbd; +} + +.table-hover .table-secondary:hover { + background-color: #cecece; +} +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #cecece; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #c0ebbd; +} +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8bda85; +} + +.table-hover .table-success:hover { + background-color: #ade5a9; +} +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #ade5a9; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #b8e7f9; +} +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #7bd3f4; +} + +.table-hover .table-info:hover { + background-color: #a0dff7; +} +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #a0dff7; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #fefcb9; +} +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #fdf97d; +} + +.table-hover .table-warning:hover { + background-color: #fefba0; +} +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #fefba0; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f5baba; +} +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ed7f7e; +} + +.table-hover .table-danger:hover { + background-color: #f2a4a4; +} +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #f2a4a4; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #ededed; +} +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #dedede; +} + +.table-hover .table-light:hover { + background-color: #e0e0e0; +} +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #e0e0e0; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #cacaca; +} +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #9c9c9c; +} + +.table-hover .table-dark:hover { + background-color: #bdbdbd; +} +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #bdbdbd; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #404040; + background-color: #C0C0C0; + border-color: #ab8645; +} +.table .thead-light th { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} + +.table-dark { + color: #404040; + background-color: #C0C0C0; +} +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #ab8645; +} +.table-dark.table-bordered { + border: 0; +} +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); +} +.table-dark.table-hover tbody tr:hover { + background-color: rgba(255, 255, 255, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; +} +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + height: calc(1.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1; + color: #404040; + background-color: #FFFFFF; + background-clip: padding-box; + border: 1px solid #808080; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control:focus { + color: #404040; + background-color: #FFFFFF; + border-color: #5454ff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.form-control::placeholder { + color: #808080; + opacity: 1; +} +.form-control:disabled, .form-control[readonly] { + background-color: #C0C0C0; + opacity: 1; +} + +select.form-control:focus::-ms-value { + color: #404040; + background-color: #FFFFFF; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1; + color: #000000; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(1.8125rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.form-control-lg { + height: calc(2.875rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} +.form-row > .col, +.form-row > [class*=col-] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} +.form-check-input:disabled ~ .form-check-label { + color: #808080; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #1FB714; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + line-height: 1; + color: #FFFFFF; + background-color: rgba(31, 183, 20, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #1FB714; + padding-right: 1.75rem; + background-repeat: no-repeat; + background-position: center right calc(1.75rem / 4); + background-size: calc(1.75rem / 2) calc(1.75rem / 2); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231FB714' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #1FB714; + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.25); +} +.was-validated .form-control:valid ~ .valid-feedback, +.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, +.form-control.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: 1.75rem; + background-position: top calc(1.75rem / 4) right calc(1.75rem / 4); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #1FB714; + padding-right: 3.0625rem; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23404040' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231FB714' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") no-repeat center right 1.75rem/0.875rem 0.875rem; +} +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #1FB714; + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.25); +} +.was-validated .custom-select:valid ~ .valid-feedback, +.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, +.custom-select.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control-file:valid ~ .valid-feedback, +.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback, +.form-control-file.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #1FB714; +} +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #1FB714; +} +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #1FB714; +} +.was-validated .custom-control-input:valid ~ .valid-feedback, +.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, +.custom-control-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #27e519; + background-color: #27e519; +} +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.25); +} +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #1FB714; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #1FB714; +} +.was-validated .custom-file-input:valid ~ .valid-feedback, +.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, +.custom-file-input.is-valid ~ .valid-tooltip { + display: block; +} +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #1FB714; + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #DD0907; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + line-height: 1; + color: #FFFFFF; + background-color: rgba(221, 9, 7, 0.9); + border-radius: 0.25rem; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #DD0907; + padding-right: 1.75rem; + background-repeat: no-repeat; + background-position: center right calc(1.75rem / 4); + background-size: calc(1.75rem / 2) calc(1.75rem / 2); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23DD0907' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #DD0907; + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.25); +} +.was-validated .form-control:invalid ~ .invalid-feedback, +.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, +.form-control.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: 1.75rem; + background-position: top calc(1.75rem / 4) right calc(1.75rem / 4); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #DD0907; + padding-right: 3.0625rem; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23404040' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23DD0907' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") no-repeat center right 1.75rem/0.875rem 0.875rem; +} +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #DD0907; + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.25); +} +.was-validated .custom-select:invalid ~ .invalid-feedback, +.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, +.custom-select.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control-file:invalid ~ .invalid-feedback, +.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback, +.form-control-file.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #DD0907; +} +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #DD0907; +} +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #DD0907; +} +.was-validated .custom-control-input:invalid ~ .invalid-feedback, +.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, +.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #f8211f; + background-color: #f8211f; +} +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.25); +} +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #DD0907; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #DD0907; +} +.was-validated .custom-file-input:invalid ~ .invalid-feedback, +.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, +.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block; +} +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #DD0907; + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.25); +} + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center; +} +.form-inline .form-check { + width: 100%; +} +@media (min-width: 576px) { + .form-inline label { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, +.form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + align-items: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #000000; + text-align: center; + vertical-align: middle; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: #000000; + text-decoration: none; +} +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.btn.disabled, .btn:disabled { + opacity: 0.65; +} +.btn:not(:disabled):not(.disabled) { + cursor: pointer; +} +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.btn-primary:hover { + color: #FFFFFF; + background-color: #0000ad; + border-color: #0000a0; +} +.btn-primary:focus, .btn-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(38, 38, 218, 0.5); +} +.btn-primary.disabled, .btn-primary:disabled { + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { + color: #FFFFFF; + background-color: #0000a0; + border-color: #000093; +} +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(38, 38, 218, 0.5); +} + +.btn-secondary { + color: #FFFFFF; + background-color: #808080; + border-color: #808080; +} +.btn-secondary:hover { + color: #FFFFFF; + background-color: #6d6d6d; + border-color: #676767; +} +.btn-secondary:focus, .btn-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(147, 147, 147, 0.5); +} +.btn-secondary.disabled, .btn-secondary:disabled { + color: #FFFFFF; + background-color: #808080; + border-color: #808080; +} +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { + color: #FFFFFF; + background-color: #676767; + border-color: #606060; +} +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(147, 147, 147, 0.5); +} + +.btn-success { + color: #FFFFFF; + background-color: #1FB714; + border-color: #1FB714; +} +.btn-success:hover { + color: #FFFFFF; + background-color: #199510; + border-color: #17890f; +} +.btn-success:focus, .btn-success.focus { + box-shadow: 0 0 0 0.2rem rgba(65, 194, 55, 0.5); +} +.btn-success.disabled, .btn-success:disabled { + color: #FFFFFF; + background-color: #1FB714; + border-color: #1FB714; +} +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { + color: #FFFFFF; + background-color: #17890f; + border-color: #157e0e; +} +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(65, 194, 55, 0.5); +} + +.btn-info { + color: #FFFFFF; + background-color: #02ABEA; + border-color: #02ABEA; +} +.btn-info:hover { + color: #FFFFFF; + background-color: #028fc4; + border-color: #0286b7; +} +.btn-info:focus, .btn-info.focus { + box-shadow: 0 0 0 0.2rem rgba(40, 184, 237, 0.5); +} +.btn-info.disabled, .btn-info:disabled { + color: #FFFFFF; + background-color: #02ABEA; + border-color: #02ABEA; +} +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { + color: #FFFFFF; + background-color: #0286b7; + border-color: #017dab; +} +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(40, 184, 237, 0.5); +} + +.btn-warning { + color: #404040; + background-color: #FBF305; + border-color: #FBF305; +} +.btn-warning:hover { + color: #404040; + background-color: #d6cf03; + border-color: #cac303; +} +.btn-warning:focus, .btn-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(223, 216, 14, 0.5); +} +.btn-warning.disabled, .btn-warning:disabled { + color: #404040; + background-color: #FBF305; + border-color: #FBF305; +} +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle { + color: #404040; + background-color: #cac303; + border-color: #bdb703; +} +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(223, 216, 14, 0.5); +} + +.btn-danger { + color: #FFFFFF; + background-color: #DD0907; + border-color: #DD0907; +} +.btn-danger:hover { + color: #FFFFFF; + background-color: #b80706; + border-color: #ac0705; +} +.btn-danger:focus, .btn-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(226, 46, 44, 0.5); +} +.btn-danger.disabled, .btn-danger:disabled { + color: #FFFFFF; + background-color: #DD0907; + border-color: #DD0907; +} +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { + color: #FFFFFF; + background-color: #ac0705; + border-color: #9f0605; +} +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(226, 46, 44, 0.5); +} + +.btn-light { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-light:hover { + color: #404040; + background-color: #adadad; + border-color: #a7a7a7; +} +.btn-light:focus, .btn-light.focus { + box-shadow: 0 0 0 0.2rem rgba(173, 173, 173, 0.5); +} +.btn-light.disabled, .btn-light:disabled { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { + color: #404040; + background-color: #a7a7a7; + border-color: #a0a0a0; +} +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(173, 173, 173, 0.5); +} + +.btn-dark { + color: #FFFFFF; + background-color: #404040; + border-color: #404040; +} +.btn-dark:hover { + color: #FFFFFF; + background-color: #2d2d2d; + border-color: #272727; +} +.btn-dark:focus, .btn-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(93, 93, 93, 0.5); +} +.btn-dark.disabled, .btn-dark:disabled { + color: #FFFFFF; + background-color: #404040; + border-color: #404040; +} +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { + color: #FFFFFF; + background-color: #272727; + border-color: #202020; +} +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(93, 93, 93, 0.5); +} + +.btn-outline-primary { + color: #0000D3; + border-color: #0000D3; +} +.btn-outline-primary:hover { + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.5); +} +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #0000D3; + background-color: transparent; +} +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.5); +} + +.btn-outline-secondary { + color: #808080; + border-color: #808080; +} +.btn-outline-secondary:hover { + color: #FFFFFF; + background-color: #808080; + border-color: #808080; +} +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(128, 128, 128, 0.5); +} +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #808080; + background-color: transparent; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { + color: #FFFFFF; + background-color: #808080; + border-color: #808080; +} +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(128, 128, 128, 0.5); +} + +.btn-outline-success { + color: #1FB714; + border-color: #1FB714; +} +.btn-outline-success:hover { + color: #FFFFFF; + background-color: #1FB714; + border-color: #1FB714; +} +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.5); +} +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #1FB714; + background-color: transparent; +} +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { + color: #FFFFFF; + background-color: #1FB714; + border-color: #1FB714; +} +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(31, 183, 20, 0.5); +} + +.btn-outline-info { + color: #02ABEA; + border-color: #02ABEA; +} +.btn-outline-info:hover { + color: #FFFFFF; + background-color: #02ABEA; + border-color: #02ABEA; +} +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(2, 171, 234, 0.5); +} +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #02ABEA; + background-color: transparent; +} +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { + color: #FFFFFF; + background-color: #02ABEA; + border-color: #02ABEA; +} +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(2, 171, 234, 0.5); +} + +.btn-outline-warning { + color: #FBF305; + border-color: #FBF305; +} +.btn-outline-warning:hover { + color: #404040; + background-color: #FBF305; + border-color: #FBF305; +} +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(251, 243, 5, 0.5); +} +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #FBF305; + background-color: transparent; +} +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { + color: #404040; + background-color: #FBF305; + border-color: #FBF305; +} +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(251, 243, 5, 0.5); +} + +.btn-outline-danger { + color: #DD0907; + border-color: #DD0907; +} +.btn-outline-danger:hover { + color: #FFFFFF; + background-color: #DD0907; + border-color: #DD0907; +} +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.5); +} +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #DD0907; + background-color: transparent; +} +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { + color: #FFFFFF; + background-color: #DD0907; + border-color: #DD0907; +} +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(221, 9, 7, 0.5); +} + +.btn-outline-light { + color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-outline-light:hover { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(192, 192, 192, 0.5); +} +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #C0C0C0; + background-color: transparent; +} +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { + color: #404040; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(192, 192, 192, 0.5); +} + +.btn-outline-dark { + color: #404040; + border-color: #404040; +} +.btn-outline-dark:hover { + color: #FFFFFF; + background-color: #404040; + border-color: #404040; +} +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(64, 64, 64, 0.5); +} +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #404040; + background-color: transparent; +} +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { + color: #FFFFFF; + background-color: #404040; + border-color: #404040; +} +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(64, 64, 64, 0.5); +} + +.btn-link { + font-weight: 400; + color: #02ABEA; +} +.btn-link:hover { + color: #F20884; + text-decoration: underline; +} +.btn-link:focus, .btn-link.focus { + text-decoration: underline; + box-shadow: none; +} +.btn-link:disabled, .btn-link.disabled { + color: #808080; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type=submit].btn-block, +input[type=reset].btn-block, +input[type=button].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} +@media screen and (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #000000; + text-align: left; + list-style: none; + background-color: #FFFFFF; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} +.dropdown-menu-left { + right: auto; + left: 0; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } +} +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropleft .dropdown-toggle::after { + display: none; +} +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^=top], .dropdown-menu[x-placement^=right], .dropdown-menu[x-placement^=bottom], .dropdown-menu[x-placement^=left] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #C0C0C0; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #404040; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:first-child { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.dropdown-item:last-child { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.dropdown-item:hover, .dropdown-item:focus { + color: #333333; + text-decoration: none; + background-color: #C0C0C0; +} +.dropdown-item.active, .dropdown-item:active { + color: #FFFFFF; + text-decoration: none; + background-color: #0000D3; +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: #808080; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #808080; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #404040; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after { + margin-left: 0; +} +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} +.btn-group-toggle > .btn input[type=radio], +.btn-group-toggle > .btn input[type=checkbox], +.btn-group-toggle > .btn-group > .btn input[type=radio], +.btn-group-toggle > .btn-group > .btn input[type=checkbox] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; +} +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} +.input-group > .form-control:not(:last-child), +.input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .custom-file { + display: flex; + align-items: center; +} +.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: flex; +} +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1; + color: #404040; + text-align: center; + white-space: nowrap; + background-color: #C0C0C0; + border: 1px solid #808080; + border-radius: 0.25rem; +} +.input-group-text input[type=radio], +.input-group-text input[type=checkbox] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(2.875rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.8125rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + display: block; + min-height: 1rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; +} +.custom-control-input:checked ~ .custom-control-label::before { + color: #FFFFFF; + border-color: #0000D3; + background-color: #0000D3; +} +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #5454ff; +} +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #FFFFFF; + background-color: #8787ff; + border-color: #8787ff; +} +.custom-control-input:disabled ~ .custom-control-label { + color: #808080; +} +.custom-control-input:disabled ~ .custom-control-label::before { + background-color: #C0C0C0; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} +.custom-control-label::before { + position: absolute; + top: 0rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #FFFFFF; + border: #808080 solid 1px; +} +.custom-control-label::after { + position: absolute; + top: 0rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background-repeat: no-repeat; + background-position: center center; + background-size: 50% 50%; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; +} +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23FFFFFF' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #0000D3; + background-color: #0000D3; +} +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23FFFFFF' d='M0 2h4'/%3e%3c/svg%3e"); +} +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 211, 0.5); +} +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 0, 211, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23FFFFFF'/%3e%3c/svg%3e"); +} +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 211, 0.5); +} + +.custom-switch { + padding-left: 2.25rem; +} +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} +.custom-switch .custom-control-label::after { + top: calc(0rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #808080; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #FFFFFF; + transform: translateX(0.75rem); +} +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 0, 211, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-weight: 400; + line-height: 1; + color: #404040; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23404040' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #FFFFFF; + border: 1px solid #808080; + border-radius: 0.25rem; + appearance: none; +} +.custom-select:focus { + border-color: #5454ff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(84, 84, 255, 0.5); +} +.custom-select:focus::-ms-value { + color: #404040; + background-color: #FFFFFF; +} +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} +.custom-select:disabled { + color: #808080; + background-color: #C0C0C0; +} +.custom-select::-ms-expand { + opacity: 0; +} + +.custom-select-sm { + height: calc(1.8125rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.custom-select-lg { + height: calc(2.875rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.75rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.75rem + 2px); + margin: 0; + opacity: 0; +} +.custom-file-input:focus ~ .custom-file-label { + border-color: #5454ff; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-file-input:disabled ~ .custom-file-label { + background-color: #C0C0C0; +} +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.75rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1; + color: #404040; + background-color: #FFFFFF; + border: 1px solid #808080; + border-radius: 0.25rem; +} +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: 1.75rem; + padding: 0.375rem 0.75rem; + line-height: 1; + color: #404040; + content: "Browse"; + background-color: #C0C0C0; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; +} + +.custom-range { + width: 100%; + height: calc(1rem + 0.4rem); + padding: 0; + background-color: transparent; + appearance: none; +} +.custom-range:focus { + outline: none; +} +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #FFFFFF, 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #FFFFFF, 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #FFFFFF, 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.custom-range::-moz-focus-outer { + border: 0; +} +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0000D3; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; + } +} +.custom-range::-webkit-slider-thumb:active { + background-color: #8787ff; +} +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #C0C0C0; + border-color: transparent; + border-radius: 1rem; +} +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0000D3; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; + } +} +.custom-range::-moz-range-thumb:active { + background-color: #8787ff; +} +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #C0C0C0; + border-color: transparent; + border-radius: 1rem; +} +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #0000D3; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; + } +} +.custom-range::-ms-thumb:active { + background-color: #8787ff; +} +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; +} +.custom-range::-ms-fill-lower { + background-color: #C0C0C0; + border-radius: 1rem; +} +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #C0C0C0; + border-radius: 1rem; +} +.custom-range:disabled::-webkit-slider-thumb { + background-color: #808080; +} +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} +.custom-range:disabled::-moz-range-thumb { + background-color: #808080; +} +.custom-range:disabled::-moz-range-track { + cursor: default; +} +.custom-range:disabled::-ms-thumb { + background-color: #808080; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .custom-control-label::before, +.custom-file-label, +.custom-select { + transition: none; + } +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} +.nav-link.disabled { + color: #808080; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #C0C0C0; +} +.nav-tabs .nav-item { + margin-bottom: -1px; +} +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #C0C0C0 #C0C0C0 #C0C0C0; +} +.nav-tabs .nav-link.disabled { + color: #808080; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #404040; + background-color: #FFFFFF; + border-color: #C0C0C0 #C0C0C0 #FFFFFF; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #FFFFFF; + background-color: #0000D3; +} + +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 0.5rem 1rem; +} +.navbar > .container, +.navbar > .container-fluid { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} +.navbar-toggler:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, +.navbar-expand-sm > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, +.navbar-expand-sm > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} +@media (max-width: 767.98px) { + .navbar-expand-md > .container, +.navbar-expand-md > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, +.navbar-expand-md > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, +.navbar-expand-lg > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, +.navbar-expand-lg > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, +.navbar-expand-xl > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, +.navbar-expand-xl > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + padding-right: 0; + padding-left: 0; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand > .container, +.navbar-expand > .container-fluid { + flex-wrap: nowrap; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #FFFFFF; +} +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #FFFFFF; +} +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #FFFFFF; +} +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} +.navbar-dark .navbar-text a { + color: #FFFFFF; +} +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #FFFFFF; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #C0C0C0; + background-clip: border-box; + border: 1px solid rgba(192, 192, 192, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.card-body { + flex: 1 1 auto; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + color: inherit; + background-color: rgba(192, 192, 192, 0.03); + border-bottom: 1px solid rgba(192, 192, 192, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(192, 192, 192, 0.03); + border-top: 1px solid rgba(192, 192, 192, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img { + width: 100%; + border-radius: calc(0.25rem - 1px); +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck { + display: flex; + flex-direction: column; +} +.card-deck .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-deck { + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + display: flex; + flex: 1 0 0%; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group { + display: flex; + flex-direction: column; +} +.card-group > .card { + margin-bottom: 15px; +} +@media (min-width: 576px) { + .card-group { + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:first-child .card-img-top, +.card-group > .card:first-child .card-header { + border-top-right-radius: 0; + } + .card-group > .card:first-child .card-img-bottom, +.card-group > .card:first-child .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:last-child .card-img-top, +.card-group > .card:last-child .card-header { + border-top-left-radius: 0; + } + .card-group > .card:last-child .card-img-bottom, +.card-group > .card:last-child .card-footer { + border-bottom-left-radius: 0; + } + .card-group > .card:only-child { + border-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-top, +.card-group > .card:only-child .card-header { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + } + .card-group > .card:only-child .card-img-bottom, +.card-group > .card:only-child .card-footer { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) { + border-radius: 0; + } + .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header, +.card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer { + border-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-columns { + column-count: 3; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion .card { + overflow: hidden; +} +.accordion .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; +} +.accordion .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; +} +.accordion .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.accordion .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.accordion .card .card-header { + margin-bottom: -1px; +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #C0C0C0; + border-radius: 0.25rem; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #808080; + content: "/"; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} +.breadcrumb-item.active { + color: #808080; +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #02ABEA; + background-color: #FFFFFF; + border: 1px solid #C0C0C0; +} +.page-link:hover { + z-index: 2; + color: #F20884; + text-decoration: none; + background-color: #C0C0C0; + border-color: #C0C0C0; +} +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 0, 211, 0.25); +} +.page-link:not(:disabled):not(.disabled) { + cursor: pointer; +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} +.page-item.active .page-link { + z-index: 1; + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} +.page-item.disabled .page-link { + color: #808080; + pointer-events: none; + cursor: auto; + background-color: #FFFFFF; + border-color: #C0C0C0; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #FFFFFF; + background-color: #0000D3; +} +a.badge-primary:hover, a.badge-primary:focus { + color: #FFFFFF; + background-color: #0000a0; +} + +.badge-secondary { + color: #FFFFFF; + background-color: #808080; +} +a.badge-secondary:hover, a.badge-secondary:focus { + color: #FFFFFF; + background-color: #676767; +} + +.badge-success { + color: #FFFFFF; + background-color: #1FB714; +} +a.badge-success:hover, a.badge-success:focus { + color: #FFFFFF; + background-color: #17890f; +} + +.badge-info { + color: #FFFFFF; + background-color: #02ABEA; +} +a.badge-info:hover, a.badge-info:focus { + color: #FFFFFF; + background-color: #0286b7; +} + +.badge-warning { + color: #404040; + background-color: #FBF305; +} +a.badge-warning:hover, a.badge-warning:focus { + color: #404040; + background-color: #cac303; +} + +.badge-danger { + color: #FFFFFF; + background-color: #DD0907; +} +a.badge-danger:hover, a.badge-danger:focus { + color: #FFFFFF; + background-color: #ac0705; +} + +.badge-light { + color: #404040; + background-color: #C0C0C0; +} +a.badge-light:hover, a.badge-light:focus { + color: #404040; + background-color: #a7a7a7; +} + +.badge-dark { + color: #FFFFFF; + background-color: #404040; +} +a.badge-dark:hover, a.badge-dark:focus { + color: #FFFFFF; + background-color: #272727; +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #C0C0C0; + border-radius: 0.3rem; +} +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 4rem; +} +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #00006e; + background-color: #ccccf6; + border-color: #b8b8f3; +} +.alert-primary hr { + border-top-color: #a2a2ef; +} +.alert-primary .alert-link { + color: #00003b; +} + +.alert-secondary { + color: #434343; + background-color: #e6e6e6; + border-color: #dbdbdb; +} +.alert-secondary hr { + border-top-color: #cecece; +} +.alert-secondary .alert-link { + color: #2a2a2a; +} + +.alert-success { + color: #105f0a; + background-color: #d2f1d0; + border-color: #c0ebbd; +} +.alert-success hr { + border-top-color: #ade5a9; +} +.alert-success .alert-link { + color: #083105; +} + +.alert-info { + color: #01597a; + background-color: #cceefb; + border-color: #b8e7f9; +} +.alert-info hr { + border-top-color: #a0dff7; +} +.alert-info .alert-link { + color: #013447; +} + +.alert-warning { + color: #837e03; + background-color: #fefdcd; + border-color: #fefcb9; +} +.alert-warning hr { + border-top-color: #fefba0; +} +.alert-warning .alert-link { + color: #514e02; +} + +.alert-danger { + color: #730504; + background-color: #f8cecd; + border-color: #f5baba; +} +.alert-danger hr { + border-top-color: #f2a4a4; +} +.alert-danger .alert-link { + color: #420302; +} + +.alert-light { + color: #646464; + background-color: #f2f2f2; + border-color: #ededed; +} +.alert-light hr { + border-top-color: #e0e0e0; +} +.alert-light .alert-link { + color: #4b4b4b; +} + +.alert-dark { + color: #212121; + background-color: #d9d9d9; + border-color: #cacaca; +} +.alert-dark hr { + border-top-color: #bdbdbd; +} +.alert-dark .alert-link { + color: #080808; +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #C0C0C0; + border-radius: 0.25rem; +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + color: #FFFFFF; + text-align: center; + white-space: nowrap; + background-color: #0000D3; + transition: width 0.6s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + animation: progress-bar-stripes 1s linear infinite; +} + +.media { + display: flex; + align-items: flex-start; +} + +.media-body { + flex: 1; +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #404040; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + color: #404040; + text-decoration: none; + background-color: #C0C0C0; +} +.list-group-item-action:active { + color: #000000; + background-color: #C0C0C0; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #FFFFFF; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.list-group-item:hover, .list-group-item:focus { + z-index: 1; + text-decoration: none; +} +.list-group-item.disabled, .list-group-item:disabled { + color: #808080; + pointer-events: none; + background-color: #FFFFFF; +} +.list-group-item.active { + z-index: 2; + color: #FFFFFF; + background-color: #0000D3; + border-color: #0000D3; +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.list-group-flush .list-group-item:last-child { + margin-bottom: -1px; +} +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; +} +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0; +} + +.list-group-item-primary { + color: #00006e; + background-color: #b8b8f3; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #00006e; + background-color: #a2a2ef; +} +.list-group-item-primary.list-group-item-action.active { + color: #FFFFFF; + background-color: #00006e; + border-color: #00006e; +} + +.list-group-item-secondary { + color: #434343; + background-color: #dbdbdb; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #434343; + background-color: #cecece; +} +.list-group-item-secondary.list-group-item-action.active { + color: #FFFFFF; + background-color: #434343; + border-color: #434343; +} + +.list-group-item-success { + color: #105f0a; + background-color: #c0ebbd; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #105f0a; + background-color: #ade5a9; +} +.list-group-item-success.list-group-item-action.active { + color: #FFFFFF; + background-color: #105f0a; + border-color: #105f0a; +} + +.list-group-item-info { + color: #01597a; + background-color: #b8e7f9; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #01597a; + background-color: #a0dff7; +} +.list-group-item-info.list-group-item-action.active { + color: #FFFFFF; + background-color: #01597a; + border-color: #01597a; +} + +.list-group-item-warning { + color: #837e03; + background-color: #fefcb9; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #837e03; + background-color: #fefba0; +} +.list-group-item-warning.list-group-item-action.active { + color: #FFFFFF; + background-color: #837e03; + border-color: #837e03; +} + +.list-group-item-danger { + color: #730504; + background-color: #f5baba; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #730504; + background-color: #f2a4a4; +} +.list-group-item-danger.list-group-item-action.active { + color: #FFFFFF; + background-color: #730504; + border-color: #730504; +} + +.list-group-item-light { + color: #646464; + background-color: #ededed; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #646464; + background-color: #e0e0e0; +} +.list-group-item-light.list-group-item-action.active { + color: #FFFFFF; + background-color: #646464; + border-color: #646464; +} + +.list-group-item-dark { + color: #212121; + background-color: #cacaca; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #212121; + background-color: #bdbdbd; +} +.list-group-item-dark.list-group-item-action.active { + color: #FFFFFF; + background-color: #212121; + border-color: #212121; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #FFFFFF; + opacity: 0.5; +} +.close:hover { + color: #000000; + text-decoration: none; +} +.close:not(:disabled):not(.disabled) { + cursor: pointer; +} +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: 0.75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + appearance: none; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + opacity: 0; +} +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} +.toast.showing { + opacity: 1; +} +.toast.show { + display: block; + opacity: 1; +} +.toast.hide { + display: none; +} + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #808080; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media screen and (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - (0.5rem * 2)); +} +.modal-dialog-centered::before { + display: block; + height: calc(100vh - (0.5rem * 2)); + content: ""; +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #FFFFFF; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #C0C0C0; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem; +} +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1; +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #C0C0C0; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.modal-footer > :not(:first-child) { + margin-left: 0.25rem; +} +.modal-footer > :not(:last-child) { + margin-right: 0.25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + + .modal-dialog-centered { + min-height: calc(100% - (1.75rem * 2)); + } + .modal-dialog-centered::before { + height: calc(100vh - (1.75rem * 2)); + } + + .modal-sm { + max-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, +.modal-xl { + max-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: "ChicagoFLF"; + font-style: normal; + font-weight: 400; + line-height: 1; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top] { + padding: 0.4rem 0; +} +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow { + bottom: 0; +} +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right] { + padding: 0 0.4rem; +} +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom] { + padding: 0.4rem 0; +} +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow { + top: 0; +} +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left] { + padding: 0 0.4rem; +} +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #FFFFFF; + text-align: center; + background-color: #000000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: "ChicagoFLF"; + font-style: normal; + font-weight: 400; + line-height: 1; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #FFFFFF; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^=top] { + margin-bottom: 0.5rem; +} +.bs-popover-top .arrow, .bs-popover-auto[x-placement^=top] .arrow { + bottom: calc((0.5rem + 1px) * -1); +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=top] .arrow::before, +.bs-popover-top .arrow::after, +.bs-popover-auto[x-placement^=top] .arrow::after { + border-width: 0.5rem 0.5rem 0; +} +.bs-popover-top .arrow::before, .bs-popover-auto[x-placement^=top] .arrow::before { + bottom: 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-top .arrow::after, .bs-popover-auto[x-placement^=top] .arrow::after { + bottom: 1px; + border-top-color: #FFFFFF; +} + +.bs-popover-right, .bs-popover-auto[x-placement^=right] { + margin-left: 0.5rem; +} +.bs-popover-right .arrow, .bs-popover-auto[x-placement^=right] .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=right] .arrow::before, +.bs-popover-right .arrow::after, +.bs-popover-auto[x-placement^=right] .arrow::after { + border-width: 0.5rem 0.5rem 0.5rem 0; +} +.bs-popover-right .arrow::before, .bs-popover-auto[x-placement^=right] .arrow::before { + left: 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-right .arrow::after, .bs-popover-auto[x-placement^=right] .arrow::after { + left: 1px; + border-right-color: #FFFFFF; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^=bottom] { + margin-top: 0.5rem; +} +.bs-popover-bottom .arrow, .bs-popover-auto[x-placement^=bottom] .arrow { + top: calc((0.5rem + 1px) * -1); +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=bottom] .arrow::before, +.bs-popover-bottom .arrow::after, +.bs-popover-auto[x-placement^=bottom] .arrow::after { + border-width: 0 0.5rem 0.5rem 0.5rem; +} +.bs-popover-bottom .arrow::before, .bs-popover-auto[x-placement^=bottom] .arrow::before { + top: 0; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-bottom .arrow::after, .bs-popover-auto[x-placement^=bottom] .arrow::after { + top: 1px; + border-bottom-color: #FFFFFF; +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.bs-popover-left, .bs-popover-auto[x-placement^=left] { + margin-right: 0.5rem; +} +.bs-popover-left .arrow, .bs-popover-auto[x-placement^=left] .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=left] .arrow::before, +.bs-popover-left .arrow::after, +.bs-popover-auto[x-placement^=left] .arrow::after { + border-width: 0.5rem 0 0.5rem 0.5rem; +} +.bs-popover-left .arrow::before, .bs-popover-auto[x-placement^=left] .arrow::before { + right: 0; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-left .arrow::after, .bs-popover-auto[x-placement^=left] .arrow::after { + right: 1px; + border-left-color: #FFFFFF; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + color: inherit; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #000000; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: 0s 0.6s opacity; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + color: #FFFFFF; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-control-prev, +.carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #FFFFFF; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: transparent no-repeat center center; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFFFFF' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFFFFF' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} +.carousel-indicators li { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #FFFFFF; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media screen and (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #FFFFFF; + text-align: center; +} + +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + animation: spinner-border 0.75s linear infinite; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + } +} +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + animation: spinner-grow 0.75s linear infinite; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #0000D3 !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #0000a0 !important; +} + +.bg-secondary { + background-color: #808080 !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #676767 !important; +} + +.bg-success { + background-color: #1FB714 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #17890f !important; +} + +.bg-info { + background-color: #02ABEA !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #0286b7 !important; +} + +.bg-warning { + background-color: #FBF305 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #cac303 !important; +} + +.bg-danger { + background-color: #DD0907 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #ac0705 !important; +} + +.bg-light { + background-color: #C0C0C0 !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #a7a7a7 !important; +} + +.bg-dark { + background-color: #404040 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #272727 !important; +} + +.bg-white { + background-color: #FFFFFF !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #C0C0C0 !important; +} + +.border-top { + border-top: 1px solid #C0C0C0 !important; +} + +.border-right { + border-right: 1px solid #C0C0C0 !important; +} + +.border-bottom { + border-bottom: 1px solid #C0C0C0 !important; +} + +.border-left { + border-left: 1px solid #C0C0C0 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #0000D3 !important; +} + +.border-secondary { + border-color: #808080 !important; +} + +.border-success { + border-color: #1FB714 !important; +} + +.border-info { + border-color: #02ABEA !important; +} + +.border-warning { + border-color: #FBF305 !important; +} + +.border-danger { + border-color: #DD0907 !important; +} + +.border-light { + border-color: #C0C0C0 !important; +} + +.border-dark { + border-color: #404040 !important; +} + +.border-white { + border-color: #FFFFFF !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: flex !important; + } + + .d-sm-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: flex !important; + } + + .d-md-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: flex !important; + } + + .d-lg-inline-flex { + display: inline-flex !important; + } +} +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: flex !important; + } + + .d-xl-inline-flex { + display: inline-flex !important; + } +} +@media print { + .d-print-none { + display: none !important; + } + + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: flex !important; + } + + .d-print-inline-flex { + display: inline-flex !important; + } +} +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} +.embed-responsive::before { + display: block; + content: ""; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.8571428571%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-3by4::before { + padding-top: 133.3333333333%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction: row !important; + } + + .flex-sm-column { + flex-direction: column !important; + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-sm-wrap { + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-sm-fill { + flex: 1 1 auto !important; + } + + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-sm-start { + justify-content: flex-start !important; + } + + .justify-content-sm-end { + justify-content: flex-end !important; + } + + .justify-content-sm-center { + justify-content: center !important; + } + + .justify-content-sm-between { + justify-content: space-between !important; + } + + .justify-content-sm-around { + justify-content: space-around !important; + } + + .align-items-sm-start { + align-items: flex-start !important; + } + + .align-items-sm-end { + align-items: flex-end !important; + } + + .align-items-sm-center { + align-items: center !important; + } + + .align-items-sm-baseline { + align-items: baseline !important; + } + + .align-items-sm-stretch { + align-items: stretch !important; + } + + .align-content-sm-start { + align-content: flex-start !important; + } + + .align-content-sm-end { + align-content: flex-end !important; + } + + .align-content-sm-center { + align-content: center !important; + } + + .align-content-sm-between { + align-content: space-between !important; + } + + .align-content-sm-around { + align-content: space-around !important; + } + + .align-content-sm-stretch { + align-content: stretch !important; + } + + .align-self-sm-auto { + align-self: auto !important; + } + + .align-self-sm-start { + align-self: flex-start !important; + } + + .align-self-sm-end { + align-self: flex-end !important; + } + + .align-self-sm-center { + align-self: center !important; + } + + .align-self-sm-baseline { + align-self: baseline !important; + } + + .align-self-sm-stretch { + align-self: stretch !important; + } +} +@media (min-width: 768px) { + .flex-md-row { + flex-direction: row !important; + } + + .flex-md-column { + flex-direction: column !important; + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-md-wrap { + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-md-fill { + flex: 1 1 auto !important; + } + + .flex-md-grow-0 { + flex-grow: 0 !important; + } + + .flex-md-grow-1 { + flex-grow: 1 !important; + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-md-start { + justify-content: flex-start !important; + } + + .justify-content-md-end { + justify-content: flex-end !important; + } + + .justify-content-md-center { + justify-content: center !important; + } + + .justify-content-md-between { + justify-content: space-between !important; + } + + .justify-content-md-around { + justify-content: space-around !important; + } + + .align-items-md-start { + align-items: flex-start !important; + } + + .align-items-md-end { + align-items: flex-end !important; + } + + .align-items-md-center { + align-items: center !important; + } + + .align-items-md-baseline { + align-items: baseline !important; + } + + .align-items-md-stretch { + align-items: stretch !important; + } + + .align-content-md-start { + align-content: flex-start !important; + } + + .align-content-md-end { + align-content: flex-end !important; + } + + .align-content-md-center { + align-content: center !important; + } + + .align-content-md-between { + align-content: space-between !important; + } + + .align-content-md-around { + align-content: space-around !important; + } + + .align-content-md-stretch { + align-content: stretch !important; + } + + .align-self-md-auto { + align-self: auto !important; + } + + .align-self-md-start { + align-self: flex-start !important; + } + + .align-self-md-end { + align-self: flex-end !important; + } + + .align-self-md-center { + align-self: center !important; + } + + .align-self-md-baseline { + align-self: baseline !important; + } + + .align-self-md-stretch { + align-self: stretch !important; + } +} +@media (min-width: 992px) { + .flex-lg-row { + flex-direction: row !important; + } + + .flex-lg-column { + flex-direction: column !important; + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-lg-wrap { + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-lg-fill { + flex: 1 1 auto !important; + } + + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-lg-start { + justify-content: flex-start !important; + } + + .justify-content-lg-end { + justify-content: flex-end !important; + } + + .justify-content-lg-center { + justify-content: center !important; + } + + .justify-content-lg-between { + justify-content: space-between !important; + } + + .justify-content-lg-around { + justify-content: space-around !important; + } + + .align-items-lg-start { + align-items: flex-start !important; + } + + .align-items-lg-end { + align-items: flex-end !important; + } + + .align-items-lg-center { + align-items: center !important; + } + + .align-items-lg-baseline { + align-items: baseline !important; + } + + .align-items-lg-stretch { + align-items: stretch !important; + } + + .align-content-lg-start { + align-content: flex-start !important; + } + + .align-content-lg-end { + align-content: flex-end !important; + } + + .align-content-lg-center { + align-content: center !important; + } + + .align-content-lg-between { + align-content: space-between !important; + } + + .align-content-lg-around { + align-content: space-around !important; + } + + .align-content-lg-stretch { + align-content: stretch !important; + } + + .align-self-lg-auto { + align-self: auto !important; + } + + .align-self-lg-start { + align-self: flex-start !important; + } + + .align-self-lg-end { + align-self: flex-end !important; + } + + .align-self-lg-center { + align-self: center !important; + } + + .align-self-lg-baseline { + align-self: baseline !important; + } + + .align-self-lg-stretch { + align-self: stretch !important; + } +} +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction: row !important; + } + + .flex-xl-column { + flex-direction: column !important; + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xl-wrap { + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .flex-xl-fill { + flex: 1 1 auto !important; + } + + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + + .justify-content-xl-start { + justify-content: flex-start !important; + } + + .justify-content-xl-end { + justify-content: flex-end !important; + } + + .justify-content-xl-center { + justify-content: center !important; + } + + .justify-content-xl-between { + justify-content: space-between !important; + } + + .justify-content-xl-around { + justify-content: space-around !important; + } + + .align-items-xl-start { + align-items: flex-start !important; + } + + .align-items-xl-end { + align-items: flex-end !important; + } + + .align-items-xl-center { + align-items: center !important; + } + + .align-items-xl-baseline { + align-items: baseline !important; + } + + .align-items-xl-stretch { + align-items: stretch !important; + } + + .align-content-xl-start { + align-content: flex-start !important; + } + + .align-content-xl-end { + align-content: flex-end !important; + } + + .align-content-xl-center { + align-content: center !important; + } + + .align-content-xl-between { + align-content: space-between !important; + } + + .align-content-xl-around { + align-content: space-around !important; + } + + .align-content-xl-stretch { + align-content: stretch !important; + } + + .align-self-xl-auto { + align-self: auto !important; + } + + .align-self-xl-start { + align-self: flex-start !important; + } + + .align-self-xl-end { + align-self: flex-end !important; + } + + .align-self-xl-center { + align-self: center !important; + } + + .align-self-xl-baseline { + align-self: baseline !important; + } + + .align-self-xl-stretch { + align-self: stretch !important; + } +} +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + + .float-sm-right { + float: right !important; + } + + .float-sm-none { + float: none !important; + } +} +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + + .float-md-right { + float: right !important; + } + + .float-md-none { + float: none !important; + } +} +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + + .float-lg-right { + float: right !important; + } + + .float-lg-none { + float: none !important; + } +} +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + + .float-xl-right { + float: right !important; + } + + .float-xl-none { + float: none !important; + } +} +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports (position: sticky) { + .sticky-top { + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + + .mt-sm-0, +.my-sm-0 { + margin-top: 0 !important; + } + + .mr-sm-0, +.mx-sm-0 { + margin-right: 0 !important; + } + + .mb-sm-0, +.my-sm-0 { + margin-bottom: 0 !important; + } + + .ml-sm-0, +.mx-sm-0 { + margin-left: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .mt-sm-1, +.my-sm-1 { + margin-top: 0.25rem !important; + } + + .mr-sm-1, +.mx-sm-1 { + margin-right: 0.25rem !important; + } + + .mb-sm-1, +.my-sm-1 { + margin-bottom: 0.25rem !important; + } + + .ml-sm-1, +.mx-sm-1 { + margin-left: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .mt-sm-2, +.my-sm-2 { + margin-top: 0.5rem !important; + } + + .mr-sm-2, +.mx-sm-2 { + margin-right: 0.5rem !important; + } + + .mb-sm-2, +.my-sm-2 { + margin-bottom: 0.5rem !important; + } + + .ml-sm-2, +.mx-sm-2 { + margin-left: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .mt-sm-3, +.my-sm-3 { + margin-top: 1rem !important; + } + + .mr-sm-3, +.mx-sm-3 { + margin-right: 1rem !important; + } + + .mb-sm-3, +.my-sm-3 { + margin-bottom: 1rem !important; + } + + .ml-sm-3, +.mx-sm-3 { + margin-left: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .mt-sm-4, +.my-sm-4 { + margin-top: 1.5rem !important; + } + + .mr-sm-4, +.mx-sm-4 { + margin-right: 1.5rem !important; + } + + .mb-sm-4, +.my-sm-4 { + margin-bottom: 1.5rem !important; + } + + .ml-sm-4, +.mx-sm-4 { + margin-left: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .mt-sm-5, +.my-sm-5 { + margin-top: 3rem !important; + } + + .mr-sm-5, +.mx-sm-5 { + margin-right: 3rem !important; + } + + .mb-sm-5, +.my-sm-5 { + margin-bottom: 3rem !important; + } + + .ml-sm-5, +.mx-sm-5 { + margin-left: 3rem !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .pt-sm-0, +.py-sm-0 { + padding-top: 0 !important; + } + + .pr-sm-0, +.px-sm-0 { + padding-right: 0 !important; + } + + .pb-sm-0, +.py-sm-0 { + padding-bottom: 0 !important; + } + + .pl-sm-0, +.px-sm-0 { + padding-left: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .pt-sm-1, +.py-sm-1 { + padding-top: 0.25rem !important; + } + + .pr-sm-1, +.px-sm-1 { + padding-right: 0.25rem !important; + } + + .pb-sm-1, +.py-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pl-sm-1, +.px-sm-1 { + padding-left: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .pt-sm-2, +.py-sm-2 { + padding-top: 0.5rem !important; + } + + .pr-sm-2, +.px-sm-2 { + padding-right: 0.5rem !important; + } + + .pb-sm-2, +.py-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pl-sm-2, +.px-sm-2 { + padding-left: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .pt-sm-3, +.py-sm-3 { + padding-top: 1rem !important; + } + + .pr-sm-3, +.px-sm-3 { + padding-right: 1rem !important; + } + + .pb-sm-3, +.py-sm-3 { + padding-bottom: 1rem !important; + } + + .pl-sm-3, +.px-sm-3 { + padding-left: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .pt-sm-4, +.py-sm-4 { + padding-top: 1.5rem !important; + } + + .pr-sm-4, +.px-sm-4 { + padding-right: 1.5rem !important; + } + + .pb-sm-4, +.py-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pl-sm-4, +.px-sm-4 { + padding-left: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .pt-sm-5, +.py-sm-5 { + padding-top: 3rem !important; + } + + .pr-sm-5, +.px-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-5, +.py-sm-5 { + padding-bottom: 3rem !important; + } + + .pl-sm-5, +.px-sm-5 { + padding-left: 3rem !important; + } + + .m-sm-n1 { + margin: -0.25rem !important; + } + + .mt-sm-n1, +.my-sm-n1 { + margin-top: -0.25rem !important; + } + + .mr-sm-n1, +.mx-sm-n1 { + margin-right: -0.25rem !important; + } + + .mb-sm-n1, +.my-sm-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-sm-n1, +.mx-sm-n1 { + margin-left: -0.25rem !important; + } + + .m-sm-n2 { + margin: -0.5rem !important; + } + + .mt-sm-n2, +.my-sm-n2 { + margin-top: -0.5rem !important; + } + + .mr-sm-n2, +.mx-sm-n2 { + margin-right: -0.5rem !important; + } + + .mb-sm-n2, +.my-sm-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-sm-n2, +.mx-sm-n2 { + margin-left: -0.5rem !important; + } + + .m-sm-n3 { + margin: -1rem !important; + } + + .mt-sm-n3, +.my-sm-n3 { + margin-top: -1rem !important; + } + + .mr-sm-n3, +.mx-sm-n3 { + margin-right: -1rem !important; + } + + .mb-sm-n3, +.my-sm-n3 { + margin-bottom: -1rem !important; + } + + .ml-sm-n3, +.mx-sm-n3 { + margin-left: -1rem !important; + } + + .m-sm-n4 { + margin: -1.5rem !important; + } + + .mt-sm-n4, +.my-sm-n4 { + margin-top: -1.5rem !important; + } + + .mr-sm-n4, +.mx-sm-n4 { + margin-right: -1.5rem !important; + } + + .mb-sm-n4, +.my-sm-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-sm-n4, +.mx-sm-n4 { + margin-left: -1.5rem !important; + } + + .m-sm-n5 { + margin: -3rem !important; + } + + .mt-sm-n5, +.my-sm-n5 { + margin-top: -3rem !important; + } + + .mr-sm-n5, +.mx-sm-n5 { + margin-right: -3rem !important; + } + + .mb-sm-n5, +.my-sm-n5 { + margin-bottom: -3rem !important; + } + + .ml-sm-n5, +.mx-sm-n5 { + margin-left: -3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mt-sm-auto, +.my-sm-auto { + margin-top: auto !important; + } + + .mr-sm-auto, +.mx-sm-auto { + margin-right: auto !important; + } + + .mb-sm-auto, +.my-sm-auto { + margin-bottom: auto !important; + } + + .ml-sm-auto, +.mx-sm-auto { + margin-left: auto !important; + } +} +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + + .mt-md-0, +.my-md-0 { + margin-top: 0 !important; + } + + .mr-md-0, +.mx-md-0 { + margin-right: 0 !important; + } + + .mb-md-0, +.my-md-0 { + margin-bottom: 0 !important; + } + + .ml-md-0, +.mx-md-0 { + margin-left: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .mt-md-1, +.my-md-1 { + margin-top: 0.25rem !important; + } + + .mr-md-1, +.mx-md-1 { + margin-right: 0.25rem !important; + } + + .mb-md-1, +.my-md-1 { + margin-bottom: 0.25rem !important; + } + + .ml-md-1, +.mx-md-1 { + margin-left: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .mt-md-2, +.my-md-2 { + margin-top: 0.5rem !important; + } + + .mr-md-2, +.mx-md-2 { + margin-right: 0.5rem !important; + } + + .mb-md-2, +.my-md-2 { + margin-bottom: 0.5rem !important; + } + + .ml-md-2, +.mx-md-2 { + margin-left: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .mt-md-3, +.my-md-3 { + margin-top: 1rem !important; + } + + .mr-md-3, +.mx-md-3 { + margin-right: 1rem !important; + } + + .mb-md-3, +.my-md-3 { + margin-bottom: 1rem !important; + } + + .ml-md-3, +.mx-md-3 { + margin-left: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .mt-md-4, +.my-md-4 { + margin-top: 1.5rem !important; + } + + .mr-md-4, +.mx-md-4 { + margin-right: 1.5rem !important; + } + + .mb-md-4, +.my-md-4 { + margin-bottom: 1.5rem !important; + } + + .ml-md-4, +.mx-md-4 { + margin-left: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .mt-md-5, +.my-md-5 { + margin-top: 3rem !important; + } + + .mr-md-5, +.mx-md-5 { + margin-right: 3rem !important; + } + + .mb-md-5, +.my-md-5 { + margin-bottom: 3rem !important; + } + + .ml-md-5, +.mx-md-5 { + margin-left: 3rem !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .pt-md-0, +.py-md-0 { + padding-top: 0 !important; + } + + .pr-md-0, +.px-md-0 { + padding-right: 0 !important; + } + + .pb-md-0, +.py-md-0 { + padding-bottom: 0 !important; + } + + .pl-md-0, +.px-md-0 { + padding-left: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .pt-md-1, +.py-md-1 { + padding-top: 0.25rem !important; + } + + .pr-md-1, +.px-md-1 { + padding-right: 0.25rem !important; + } + + .pb-md-1, +.py-md-1 { + padding-bottom: 0.25rem !important; + } + + .pl-md-1, +.px-md-1 { + padding-left: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .pt-md-2, +.py-md-2 { + padding-top: 0.5rem !important; + } + + .pr-md-2, +.px-md-2 { + padding-right: 0.5rem !important; + } + + .pb-md-2, +.py-md-2 { + padding-bottom: 0.5rem !important; + } + + .pl-md-2, +.px-md-2 { + padding-left: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .pt-md-3, +.py-md-3 { + padding-top: 1rem !important; + } + + .pr-md-3, +.px-md-3 { + padding-right: 1rem !important; + } + + .pb-md-3, +.py-md-3 { + padding-bottom: 1rem !important; + } + + .pl-md-3, +.px-md-3 { + padding-left: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .pt-md-4, +.py-md-4 { + padding-top: 1.5rem !important; + } + + .pr-md-4, +.px-md-4 { + padding-right: 1.5rem !important; + } + + .pb-md-4, +.py-md-4 { + padding-bottom: 1.5rem !important; + } + + .pl-md-4, +.px-md-4 { + padding-left: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .pt-md-5, +.py-md-5 { + padding-top: 3rem !important; + } + + .pr-md-5, +.px-md-5 { + padding-right: 3rem !important; + } + + .pb-md-5, +.py-md-5 { + padding-bottom: 3rem !important; + } + + .pl-md-5, +.px-md-5 { + padding-left: 3rem !important; + } + + .m-md-n1 { + margin: -0.25rem !important; + } + + .mt-md-n1, +.my-md-n1 { + margin-top: -0.25rem !important; + } + + .mr-md-n1, +.mx-md-n1 { + margin-right: -0.25rem !important; + } + + .mb-md-n1, +.my-md-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-md-n1, +.mx-md-n1 { + margin-left: -0.25rem !important; + } + + .m-md-n2 { + margin: -0.5rem !important; + } + + .mt-md-n2, +.my-md-n2 { + margin-top: -0.5rem !important; + } + + .mr-md-n2, +.mx-md-n2 { + margin-right: -0.5rem !important; + } + + .mb-md-n2, +.my-md-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-md-n2, +.mx-md-n2 { + margin-left: -0.5rem !important; + } + + .m-md-n3 { + margin: -1rem !important; + } + + .mt-md-n3, +.my-md-n3 { + margin-top: -1rem !important; + } + + .mr-md-n3, +.mx-md-n3 { + margin-right: -1rem !important; + } + + .mb-md-n3, +.my-md-n3 { + margin-bottom: -1rem !important; + } + + .ml-md-n3, +.mx-md-n3 { + margin-left: -1rem !important; + } + + .m-md-n4 { + margin: -1.5rem !important; + } + + .mt-md-n4, +.my-md-n4 { + margin-top: -1.5rem !important; + } + + .mr-md-n4, +.mx-md-n4 { + margin-right: -1.5rem !important; + } + + .mb-md-n4, +.my-md-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-md-n4, +.mx-md-n4 { + margin-left: -1.5rem !important; + } + + .m-md-n5 { + margin: -3rem !important; + } + + .mt-md-n5, +.my-md-n5 { + margin-top: -3rem !important; + } + + .mr-md-n5, +.mx-md-n5 { + margin-right: -3rem !important; + } + + .mb-md-n5, +.my-md-n5 { + margin-bottom: -3rem !important; + } + + .ml-md-n5, +.mx-md-n5 { + margin-left: -3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mt-md-auto, +.my-md-auto { + margin-top: auto !important; + } + + .mr-md-auto, +.mx-md-auto { + margin-right: auto !important; + } + + .mb-md-auto, +.my-md-auto { + margin-bottom: auto !important; + } + + .ml-md-auto, +.mx-md-auto { + margin-left: auto !important; + } +} +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + + .mt-lg-0, +.my-lg-0 { + margin-top: 0 !important; + } + + .mr-lg-0, +.mx-lg-0 { + margin-right: 0 !important; + } + + .mb-lg-0, +.my-lg-0 { + margin-bottom: 0 !important; + } + + .ml-lg-0, +.mx-lg-0 { + margin-left: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .mt-lg-1, +.my-lg-1 { + margin-top: 0.25rem !important; + } + + .mr-lg-1, +.mx-lg-1 { + margin-right: 0.25rem !important; + } + + .mb-lg-1, +.my-lg-1 { + margin-bottom: 0.25rem !important; + } + + .ml-lg-1, +.mx-lg-1 { + margin-left: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .mt-lg-2, +.my-lg-2 { + margin-top: 0.5rem !important; + } + + .mr-lg-2, +.mx-lg-2 { + margin-right: 0.5rem !important; + } + + .mb-lg-2, +.my-lg-2 { + margin-bottom: 0.5rem !important; + } + + .ml-lg-2, +.mx-lg-2 { + margin-left: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .mt-lg-3, +.my-lg-3 { + margin-top: 1rem !important; + } + + .mr-lg-3, +.mx-lg-3 { + margin-right: 1rem !important; + } + + .mb-lg-3, +.my-lg-3 { + margin-bottom: 1rem !important; + } + + .ml-lg-3, +.mx-lg-3 { + margin-left: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .mt-lg-4, +.my-lg-4 { + margin-top: 1.5rem !important; + } + + .mr-lg-4, +.mx-lg-4 { + margin-right: 1.5rem !important; + } + + .mb-lg-4, +.my-lg-4 { + margin-bottom: 1.5rem !important; + } + + .ml-lg-4, +.mx-lg-4 { + margin-left: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .mt-lg-5, +.my-lg-5 { + margin-top: 3rem !important; + } + + .mr-lg-5, +.mx-lg-5 { + margin-right: 3rem !important; + } + + .mb-lg-5, +.my-lg-5 { + margin-bottom: 3rem !important; + } + + .ml-lg-5, +.mx-lg-5 { + margin-left: 3rem !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .pt-lg-0, +.py-lg-0 { + padding-top: 0 !important; + } + + .pr-lg-0, +.px-lg-0 { + padding-right: 0 !important; + } + + .pb-lg-0, +.py-lg-0 { + padding-bottom: 0 !important; + } + + .pl-lg-0, +.px-lg-0 { + padding-left: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .pt-lg-1, +.py-lg-1 { + padding-top: 0.25rem !important; + } + + .pr-lg-1, +.px-lg-1 { + padding-right: 0.25rem !important; + } + + .pb-lg-1, +.py-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pl-lg-1, +.px-lg-1 { + padding-left: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .pt-lg-2, +.py-lg-2 { + padding-top: 0.5rem !important; + } + + .pr-lg-2, +.px-lg-2 { + padding-right: 0.5rem !important; + } + + .pb-lg-2, +.py-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pl-lg-2, +.px-lg-2 { + padding-left: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .pt-lg-3, +.py-lg-3 { + padding-top: 1rem !important; + } + + .pr-lg-3, +.px-lg-3 { + padding-right: 1rem !important; + } + + .pb-lg-3, +.py-lg-3 { + padding-bottom: 1rem !important; + } + + .pl-lg-3, +.px-lg-3 { + padding-left: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .pt-lg-4, +.py-lg-4 { + padding-top: 1.5rem !important; + } + + .pr-lg-4, +.px-lg-4 { + padding-right: 1.5rem !important; + } + + .pb-lg-4, +.py-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pl-lg-4, +.px-lg-4 { + padding-left: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .pt-lg-5, +.py-lg-5 { + padding-top: 3rem !important; + } + + .pr-lg-5, +.px-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-5, +.py-lg-5 { + padding-bottom: 3rem !important; + } + + .pl-lg-5, +.px-lg-5 { + padding-left: 3rem !important; + } + + .m-lg-n1 { + margin: -0.25rem !important; + } + + .mt-lg-n1, +.my-lg-n1 { + margin-top: -0.25rem !important; + } + + .mr-lg-n1, +.mx-lg-n1 { + margin-right: -0.25rem !important; + } + + .mb-lg-n1, +.my-lg-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-lg-n1, +.mx-lg-n1 { + margin-left: -0.25rem !important; + } + + .m-lg-n2 { + margin: -0.5rem !important; + } + + .mt-lg-n2, +.my-lg-n2 { + margin-top: -0.5rem !important; + } + + .mr-lg-n2, +.mx-lg-n2 { + margin-right: -0.5rem !important; + } + + .mb-lg-n2, +.my-lg-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-lg-n2, +.mx-lg-n2 { + margin-left: -0.5rem !important; + } + + .m-lg-n3 { + margin: -1rem !important; + } + + .mt-lg-n3, +.my-lg-n3 { + margin-top: -1rem !important; + } + + .mr-lg-n3, +.mx-lg-n3 { + margin-right: -1rem !important; + } + + .mb-lg-n3, +.my-lg-n3 { + margin-bottom: -1rem !important; + } + + .ml-lg-n3, +.mx-lg-n3 { + margin-left: -1rem !important; + } + + .m-lg-n4 { + margin: -1.5rem !important; + } + + .mt-lg-n4, +.my-lg-n4 { + margin-top: -1.5rem !important; + } + + .mr-lg-n4, +.mx-lg-n4 { + margin-right: -1.5rem !important; + } + + .mb-lg-n4, +.my-lg-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-lg-n4, +.mx-lg-n4 { + margin-left: -1.5rem !important; + } + + .m-lg-n5 { + margin: -3rem !important; + } + + .mt-lg-n5, +.my-lg-n5 { + margin-top: -3rem !important; + } + + .mr-lg-n5, +.mx-lg-n5 { + margin-right: -3rem !important; + } + + .mb-lg-n5, +.my-lg-n5 { + margin-bottom: -3rem !important; + } + + .ml-lg-n5, +.mx-lg-n5 { + margin-left: -3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mt-lg-auto, +.my-lg-auto { + margin-top: auto !important; + } + + .mr-lg-auto, +.mx-lg-auto { + margin-right: auto !important; + } + + .mb-lg-auto, +.my-lg-auto { + margin-bottom: auto !important; + } + + .ml-lg-auto, +.mx-lg-auto { + margin-left: auto !important; + } +} +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + + .mt-xl-0, +.my-xl-0 { + margin-top: 0 !important; + } + + .mr-xl-0, +.mx-xl-0 { + margin-right: 0 !important; + } + + .mb-xl-0, +.my-xl-0 { + margin-bottom: 0 !important; + } + + .ml-xl-0, +.mx-xl-0 { + margin-left: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .mt-xl-1, +.my-xl-1 { + margin-top: 0.25rem !important; + } + + .mr-xl-1, +.mx-xl-1 { + margin-right: 0.25rem !important; + } + + .mb-xl-1, +.my-xl-1 { + margin-bottom: 0.25rem !important; + } + + .ml-xl-1, +.mx-xl-1 { + margin-left: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .mt-xl-2, +.my-xl-2 { + margin-top: 0.5rem !important; + } + + .mr-xl-2, +.mx-xl-2 { + margin-right: 0.5rem !important; + } + + .mb-xl-2, +.my-xl-2 { + margin-bottom: 0.5rem !important; + } + + .ml-xl-2, +.mx-xl-2 { + margin-left: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .mt-xl-3, +.my-xl-3 { + margin-top: 1rem !important; + } + + .mr-xl-3, +.mx-xl-3 { + margin-right: 1rem !important; + } + + .mb-xl-3, +.my-xl-3 { + margin-bottom: 1rem !important; + } + + .ml-xl-3, +.mx-xl-3 { + margin-left: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .mt-xl-4, +.my-xl-4 { + margin-top: 1.5rem !important; + } + + .mr-xl-4, +.mx-xl-4 { + margin-right: 1.5rem !important; + } + + .mb-xl-4, +.my-xl-4 { + margin-bottom: 1.5rem !important; + } + + .ml-xl-4, +.mx-xl-4 { + margin-left: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .mt-xl-5, +.my-xl-5 { + margin-top: 3rem !important; + } + + .mr-xl-5, +.mx-xl-5 { + margin-right: 3rem !important; + } + + .mb-xl-5, +.my-xl-5 { + margin-bottom: 3rem !important; + } + + .ml-xl-5, +.mx-xl-5 { + margin-left: 3rem !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .pt-xl-0, +.py-xl-0 { + padding-top: 0 !important; + } + + .pr-xl-0, +.px-xl-0 { + padding-right: 0 !important; + } + + .pb-xl-0, +.py-xl-0 { + padding-bottom: 0 !important; + } + + .pl-xl-0, +.px-xl-0 { + padding-left: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .pt-xl-1, +.py-xl-1 { + padding-top: 0.25rem !important; + } + + .pr-xl-1, +.px-xl-1 { + padding-right: 0.25rem !important; + } + + .pb-xl-1, +.py-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pl-xl-1, +.px-xl-1 { + padding-left: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .pt-xl-2, +.py-xl-2 { + padding-top: 0.5rem !important; + } + + .pr-xl-2, +.px-xl-2 { + padding-right: 0.5rem !important; + } + + .pb-xl-2, +.py-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pl-xl-2, +.px-xl-2 { + padding-left: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .pt-xl-3, +.py-xl-3 { + padding-top: 1rem !important; + } + + .pr-xl-3, +.px-xl-3 { + padding-right: 1rem !important; + } + + .pb-xl-3, +.py-xl-3 { + padding-bottom: 1rem !important; + } + + .pl-xl-3, +.px-xl-3 { + padding-left: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .pt-xl-4, +.py-xl-4 { + padding-top: 1.5rem !important; + } + + .pr-xl-4, +.px-xl-4 { + padding-right: 1.5rem !important; + } + + .pb-xl-4, +.py-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pl-xl-4, +.px-xl-4 { + padding-left: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .pt-xl-5, +.py-xl-5 { + padding-top: 3rem !important; + } + + .pr-xl-5, +.px-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-5, +.py-xl-5 { + padding-bottom: 3rem !important; + } + + .pl-xl-5, +.px-xl-5 { + padding-left: 3rem !important; + } + + .m-xl-n1 { + margin: -0.25rem !important; + } + + .mt-xl-n1, +.my-xl-n1 { + margin-top: -0.25rem !important; + } + + .mr-xl-n1, +.mx-xl-n1 { + margin-right: -0.25rem !important; + } + + .mb-xl-n1, +.my-xl-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-xl-n1, +.mx-xl-n1 { + margin-left: -0.25rem !important; + } + + .m-xl-n2 { + margin: -0.5rem !important; + } + + .mt-xl-n2, +.my-xl-n2 { + margin-top: -0.5rem !important; + } + + .mr-xl-n2, +.mx-xl-n2 { + margin-right: -0.5rem !important; + } + + .mb-xl-n2, +.my-xl-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-xl-n2, +.mx-xl-n2 { + margin-left: -0.5rem !important; + } + + .m-xl-n3 { + margin: -1rem !important; + } + + .mt-xl-n3, +.my-xl-n3 { + margin-top: -1rem !important; + } + + .mr-xl-n3, +.mx-xl-n3 { + margin-right: -1rem !important; + } + + .mb-xl-n3, +.my-xl-n3 { + margin-bottom: -1rem !important; + } + + .ml-xl-n3, +.mx-xl-n3 { + margin-left: -1rem !important; + } + + .m-xl-n4 { + margin: -1.5rem !important; + } + + .mt-xl-n4, +.my-xl-n4 { + margin-top: -1.5rem !important; + } + + .mr-xl-n4, +.mx-xl-n4 { + margin-right: -1.5rem !important; + } + + .mb-xl-n4, +.my-xl-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-xl-n4, +.mx-xl-n4 { + margin-left: -1.5rem !important; + } + + .m-xl-n5 { + margin: -3rem !important; + } + + .mt-xl-n5, +.my-xl-n5 { + margin-top: -3rem !important; + } + + .mr-xl-n5, +.mx-xl-n5 { + margin-right: -3rem !important; + } + + .mb-xl-n5, +.my-xl-n5 { + margin-bottom: -3rem !important; + } + + .ml-xl-n5, +.mx-xl-n5 { + margin-left: -3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mt-xl-auto, +.my-xl-auto { + margin-top: auto !important; + } + + .mr-xl-auto, +.mx-xl-auto { + margin-right: auto !important; + } + + .mb-xl-auto, +.my-xl-auto { + margin-bottom: auto !important; + } + + .ml-xl-auto, +.mx-xl-auto { + margin-left: auto !important; + } +} +.text-monospace { + font-family: "ChicagoFLF"; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + + .text-sm-right { + text-align: right !important; + } + + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + + .text-md-right { + text-align: right !important; + } + + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + + .text-lg-right { + text-align: right !important; + } + + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + + .text-xl-right { + text-align: right !important; + } + + .text-xl-center { + text-align: center !important; + } +} +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #FFFFFF !important; +} + +.text-primary { + color: #0000D3 !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #000087 !important; +} + +.text-secondary { + color: #808080 !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #5a5a5a !important; +} + +.text-success { + color: #1FB714 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #13720c !important; +} + +.text-info { + color: #02ABEA !important; +} + +a.text-info:hover, a.text-info:focus { + color: #01749e !important; +} + +.text-warning { + color: #FBF305 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #b1ab03 !important; +} + +.text-danger { + color: #DD0907 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #930605 !important; +} + +.text-light { + color: #C0C0C0 !important; +} + +a.text-light:hover, a.text-light:focus { + color: #9a9a9a !important; +} + +.text-dark { + color: #404040 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #1a1a1a !important; +} + +.text-body { + color: #000000 !important; +} + +.text-muted { + color: #808080 !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, +*::before, +*::after { + text-shadow: none !important; + box-shadow: none !important; + } + + a:not(.btn) { + text-decoration: underline; + } + + abbr[title]::after { + content: " (" attr(title) ")"; + } + + pre { + white-space: pre-wrap !important; + } + + pre, +blockquote { + border: 1px solid #808080; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, +img { + page-break-inside: avoid; + } + + p, +h2, +h3 { + orphans: 3; + widows: 3; + } + + h2, +h3 { + page-break-after: avoid; + } + + @page { + size: a3; + } + body { + min-width: 992px !important; + } + + .container { + min-width: 992px !important; + } + + .navbar { + display: none; + } + + .badge { + border: 1px solid #000000; + } + + .table { + border-collapse: collapse !important; + } + .table td, +.table th { + background-color: #FFFFFF !important; + } + + .table-bordered th, +.table-bordered td { + border: 1px solid #C0C0C0 !important; + } + + .table-dark { + color: inherit; + } + .table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #C0C0C0; + } + + .table .thead-dark th { + color: inherit; + border-color: #C0C0C0; + } +} +footer { + background-color: #C0C0C0; + color: #000000; +} + +header { + background-color: #C0C0C0; + color: #000000; + text-align: center; +} + +header a { + color: #4700A5; +} + +header a:hover { + color: #02ABEA; + text-decoration: none; +} + +footer a:hover { + text-decoration: none; +} + +.table-centered { + margin-left: auto; + margin-right: auto; +} + +.card-button { + color: #000000; +} + +.table-dark-em { + color: #404040; + font-style: normal; + font-weight: bold; +} + +.table-dark-header { + color: #000000; + font-style: normal; + text-align: center; +} + +/*# sourceMappingURL=dicserver.css.map */ diff --git a/DiscImageChef.Server/styles/mac/dicserver.scss b/DiscImageChef.Server/styles/mac/dicserver.scss new file mode 100644 index 00000000..cddfa3e4 --- /dev/null +++ b/DiscImageChef.Server/styles/mac/dicserver.scss @@ -0,0 +1,88 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : dicserver.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets server styling. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; +@import "_font"; +@import "_fontstyles"; + +@import "../../node_modules/bootstrap/scss/bootstrap"; + +footer +{ + background-color: $gray-100; + color: $black; +} + +header +{ + background-color: $gray-100; + color: $black; + text-align: center; +} + +header a +{ + color: $purple; +} + +header a:hover +{ + color: $cyan; + text-decoration: none; +} + +footer a:hover +{ + text-decoration: none; +} + +.table-centered +{ + margin-left:auto; + margin-right:auto; +} + +.card-button{color:$black} + +.table-dark-em +{ + color: $darkgray; + font-style: normal; + font-weight: bold; +} + +.table-dark-header +{ + color: $black; + font-style: normal; + text-align: center; +} \ No newline at end of file diff --git a/DiscImageChef.Server/styles/mac/dicserver_highcharts.css b/DiscImageChef.Server/styles/mac/dicserver_highcharts.css new file mode 100644 index 00000000..039a4774 --- /dev/null +++ b/DiscImageChef.Server/styles/mac/dicserver_highcharts.css @@ -0,0 +1,933 @@ +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using Macintosh II colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets font to Macintosh Chicago clone font */ +@font-face { + font-family: "ChicagoFLF"; + src: url(../../fonts/ChicagoFLF.eot); + src: url(../../fonts/ChicagoFLF.eot?#iefix) format("embedded-opentype"), url(../../fonts/ChicagoFLF.woff2) format("woff2"), url(../../fonts/ChicagoFLF.woff) format("woff"), url(../../fonts/ChicagoFLF.ttf) format("truetype"); + font-weight: normal; + font-style: normal; +} +/* Sets the grayscale for Bootstrap */ +/* Sets color palette, using Macintosh II colors */ +/* Bootstrap color aliases */ +/* Colors for */ +/* Colors for */ +/* Colors for cards */ +/* Colors for tables */ +/* Sets the style for emphasis/italics */ +em, i { + font-style: italic; +} + +/* Headings and bold text are bright white */ +h1, h2, h3, h4, +b, strong { + font-size: 1em; + font-style: normal; + font-weight: bold; + margin: 0; +} + +/** + * @license Highcharts + * + * (c) 2009-2016 Torstein Honsi + * + * License: www.highcharts.com/license + */ +.highcharts-container { + position: relative; + overflow: hidden; + width: 100%; + height: 100%; + text-align: left; + line-height: normal; + z-index: 0; + /* #1072 */ + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-family: "ChicagoFLF"; + font-size: 12px; +} + +.highcharts-root { + display: block; +} + +.highcharts-root text { + stroke-width: 0; +} + +.highcharts-strong { + font-weight: bold; +} + +.highcharts-emphasized { + font-style: italic; +} + +.highcharts-anchor { + cursor: pointer; +} + +.highcharts-background { + fill: #FFFFFF; +} + +.highcharts-plot-border, .highcharts-plot-background { + fill: none; +} + +.highcharts-label-box { + fill: none; +} + +.highcharts-button-box { + fill: inherit; +} + +.highcharts-tracker-line { + stroke-linejoin: round; + stroke: rgba(192, 192, 192, 0.0001); + stroke-width: 22; + fill: none; +} + +.highcharts-tracker-area { + fill: rgba(192, 192, 192, 0.0001); + stroke-width: 0; +} + +/* Titles */ +.highcharts-title { + fill: #404040; + font-size: 1.5em; +} + +.highcharts-subtitle { + fill: #808080; +} + +/* Axes */ +.highcharts-axis-line { + fill: none; + stroke: #ccd6eb; +} + +.highcharts-yaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-axis-title { + fill: #808080; +} + +.highcharts-axis-labels { + fill: #808080; + cursor: default; + font-size: 0.9em; +} + +.highcharts-grid-line { + fill: none; + stroke: #C0C0C0; +} + +.highcharts-xaxis-grid .highcharts-grid-line { + stroke-width: 0px; +} + +.highcharts-tick { + stroke: #ccd6eb; +} + +.highcharts-yaxis .highcharts-tick { + stroke-width: 0; +} + +.highcharts-minor-grid-line { + stroke: #C0C0C0; +} + +.highcharts-crosshair-thin { + stroke-width: 1px; + stroke: #C0C0C0; +} + +.highcharts-crosshair-category { + stroke: #ccd6eb; + stroke-opacity: 0.25; +} + +/* Credits */ +.highcharts-credits { + cursor: pointer; + fill: #808080; + font-size: 0.7em; + transition: fill 250ms, font-size 250ms; +} + +.highcharts-credits:hover { + fill: black; + font-size: 1em; +} + +/* Tooltip */ +.highcharts-tooltip { + cursor: default; + pointer-events: none; + white-space: nowrap; + transition: stroke 150ms; +} + +.highcharts-tooltip text { + fill: #404040; +} + +.highcharts-tooltip .highcharts-header { + font-size: 0.85em; +} + +.highcharts-tooltip-box { + stroke-width: 1px; + fill: #FFFFFF; + fill-opacity: 0.85; +} + +.highcharts-tooltip-box .highcharts-label-box { + fill: #FFFFFF; + fill-opacity: 0.85; +} + +.highcharts-selection-marker { + fill: #335cad; + fill-opacity: 0.25; +} + +.highcharts-graph { + fill: none; + stroke-width: 2px; + stroke-linecap: round; + stroke-linejoin: round; +} + +.highcharts-state-hover .highcharts-graph { + stroke-width: 3; +} + +.highcharts-state-hover path { + transition: stroke-width 50; + /* quick in */ +} + +.highcharts-state-normal path { + transition: stroke-width 250ms; + /* slow out */ +} + +/* Legend hover affects points and series */ +g.highcharts-series, +.highcharts-point, +.highcharts-markers, +.highcharts-data-labels { + transition: opacity 250ms; +} + +.highcharts-legend-series-active g.highcharts-series:not(.highcharts-series-hover), +.highcharts-legend-point-active .highcharts-point:not(.highcharts-point-hover), +.highcharts-legend-series-active .highcharts-markers:not(.highcharts-series-hover), +.highcharts-legend-series-active .highcharts-data-labels:not(.highcharts-series-hover) { + opacity: 0.2; +} + +/* Series options */ +/* Default colors */ +.highcharts-color-0 { + fill: #1FB714; + stroke: #1FB714; +} + +.highcharts-color-1 { + fill: #FBF305; + stroke: #FBF305; +} + +.highcharts-color-2 { + fill: #FF6403; + stroke: #FF6403; +} + +.highcharts-color-3 { + fill: #562C05; + stroke: #562C05; +} + +.highcharts-color-4 { + fill: #DD0907; + stroke: #DD0907; +} + +.highcharts-color-5 { + fill: #F20884; + stroke: #F20884; +} + +.highcharts-color-6 { + fill: #4700A5; + stroke: #4700A5; +} + +.highcharts-color-7 { + fill: #0000D3; + stroke: #0000D3; +} + +.highcharts-color-8 { + fill: #02ABEA; + stroke: #02ABEA; +} + +.highcharts-color-9 { + fill: #90713A; + stroke: #90713A; +} + +.highcharts-color-10 { + fill: #006412; + stroke: #006412; +} + +.highcharts-area { + fill-opacity: 0.75; + stroke-width: 0; +} + +.highcharts-markers { + stroke-width: 1px; + stroke: #FFFFFF; +} + +.highcharts-point { + stroke-width: 1px; +} + +.highcharts-dense-data .highcharts-point { + stroke-width: 0; +} + +.highcharts-data-label { + font-size: 0.9em; + font-weight: bold; +} + +.highcharts-data-label-box { + fill: none; + stroke-width: 0; +} + +.highcharts-data-label text, text.highcharts-data-label { + fill: #FBF305; +} + +.highcharts-data-label-connector { + fill: none; +} + +.highcharts-halo { + fill-opacity: 0.25; + stroke-width: 0; +} + +.highcharts-series:not(.highcharts-pie-series) .highcharts-point-select, +.highcharts-markers .highcharts-point-select { + fill: #C0C0C0; + stroke: #000000; +} + +.highcharts-column-series rect.highcharts-point { + stroke: #FFFFFF; +} + +.highcharts-column-series .highcharts-point { + transition: fill-opacity 250ms; +} + +.highcharts-column-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pie-series .highcharts-point { + stroke-linejoin: round; + stroke: #FFFFFF; +} + +.highcharts-pie-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point { + stroke-linejoin: round; + stroke: #FFFFFF; +} + +.highcharts-funnel-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-funnel-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-pyramid-series .highcharts-point { + stroke-linejoin: round; + stroke: #FFFFFF; +} + +.highcharts-pyramid-series .highcharts-point-hover { + fill-opacity: 0.75; + transition: fill-opacity 50ms; +} + +.highcharts-pyramid-series .highcharts-point-select { + fill: inherit; + stroke: inherit; +} + +.highcharts-solidgauge-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-treemap-series .highcharts-point { + stroke-width: 1px; + stroke: #C0C0C0; + transition: stroke 250ms, fill 250ms, fill-opacity 250ms; +} + +.highcharts-treemap-series .highcharts-point-hover { + stroke: #808080; + transition: stroke 25ms, fill 25ms, fill-opacity 25ms; +} + +.highcharts-treemap-series .highcharts-above-level { + display: none; +} + +.highcharts-treemap-series .highcharts-internal-node { + fill: none; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive { + fill-opacity: 0.15; + cursor: pointer; +} + +.highcharts-treemap-series .highcharts-internal-node-interactive:hover { + fill-opacity: 0.75; +} + +/* Legend */ +.highcharts-legend-box { + fill: none; + stroke-width: 0; +} + +.highcharts-legend-item > text { + fill: #404040; + font-weight: bold; + font-size: 1em; + cursor: pointer; + stroke-width: 0; +} + +.highcharts-legend-item:hover text { + fill: #000000; +} + +.highcharts-legend-item-hidden * { + fill: #C0C0C0 !important; + stroke: #C0C0C0 !important; + transition: fill 250ms; +} + +.highcharts-legend-nav-active { + fill: #003399; + cursor: pointer; +} + +.highcharts-legend-nav-inactive { + fill: #C0C0C0; +} + +.highcharts-legend-title-box { + fill: none; + stroke-width: 0; +} + +/* Bubble legend */ +.highcharts-bubble-legend-symbol { + stroke-width: 2; + fill-opacity: 0.5; +} + +.highcharts-bubble-legend-connectors { + stroke-width: 1; +} + +.highcharts-bubble-legend-labels { + fill: #404040; +} + +/* Loading */ +.highcharts-loading { + position: absolute; + background-color: #FFFFFF; + opacity: 0.5; + text-align: center; + z-index: 10; + transition: opacity 250ms; +} + +.highcharts-loading-hidden { + height: 0 !important; + opacity: 0; + overflow: hidden; + transition: opacity 250ms, height 250ms step-end; +} + +.highcharts-loading-inner { + font-weight: bold; + position: relative; + top: 45%; +} + +/* Plot bands and polar pane backgrounds */ +.highcharts-plot-band, .highcharts-pane { + fill: #000000; + fill-opacity: 0.05; +} + +.highcharts-plot-line { + fill: none; + stroke: #808080; + stroke-width: 1px; +} + +/* Highcharts More and modules */ +.highcharts-boxplot-box { + fill: #FFFFFF; +} + +.highcharts-boxplot-median { + stroke-width: 2px; +} + +.highcharts-bubble-series .highcharts-point { + fill-opacity: 0.5; +} + +.highcharts-errorbar-series .highcharts-point { + stroke: #000000; +} + +.highcharts-gauge-series .highcharts-data-label-box { + stroke: #C0C0C0; + stroke-width: 1px; +} + +.highcharts-gauge-series .highcharts-dial { + fill: #000000; + stroke-width: 0; +} + +.highcharts-polygon-series .highcharts-graph { + fill: inherit; + stroke-width: 0; +} + +.highcharts-waterfall-series .highcharts-graph { + stroke: #404040; + stroke-dasharray: 1, 3; +} + +.highcharts-sankey-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-sankey-series .highcharts-link { + transition: fill 250ms, fill-opacity 250ms; + fill-opacity: 0.5; +} + +.highcharts-sankey-series .highcharts-point-hover.highcharts-link { + transition: fill 50ms, fill-opacity 50ms; + fill-opacity: 1; +} + +.highcharts-venn-series .highcharts-point { + fill-opacity: 0.75; + stroke: #C0C0C0; + transition: stroke 250ms, fill-opacity 250ms; +} + +.highcharts-venn-series .highcharts-point-hover { + fill-opacity: 1; + stroke: #C0C0C0; +} + +/* Highstock */ +.highcharts-navigator-mask-outside { + fill-opacity: 0; +} + +.highcharts-navigator-mask-inside { + fill: #6685c2; + /* navigator.maskFill option */ + fill-opacity: 0.25; + cursor: ew-resize; +} + +.highcharts-navigator-outline { + stroke: #C0C0C0; + fill: none; +} + +.highcharts-navigator-handle { + stroke: #C0C0C0; + fill: #C0C0C0; + cursor: ew-resize; +} + +.highcharts-navigator-series { + fill: #335cad; + stroke: #335cad; +} + +.highcharts-navigator-series .highcharts-graph { + stroke-width: 1px; +} + +.highcharts-navigator-series .highcharts-area { + fill-opacity: 0.05; +} + +.highcharts-navigator-xaxis .highcharts-axis-line { + stroke-width: 0; +} + +.highcharts-navigator-xaxis .highcharts-grid-line { + stroke-width: 1px; + stroke: #C0C0C0; +} + +.highcharts-navigator-xaxis.highcharts-axis-labels { + fill: #808080; +} + +.highcharts-navigator-yaxis .highcharts-grid-line { + stroke-width: 0; +} + +.highcharts-scrollbar-thumb { + fill: #C0C0C0; + stroke: #C0C0C0; + stroke-width: 1px; +} + +.highcharts-scrollbar-button { + fill: #C0C0C0; + stroke: #C0C0C0; + stroke-width: 1px; +} + +.highcharts-scrollbar-arrow { + fill: #808080; +} + +.highcharts-scrollbar-rifles { + stroke: #808080; + stroke-width: 1px; +} + +.highcharts-scrollbar-track { + fill: #C0C0C0; + stroke: #C0C0C0; + stroke-width: 1px; +} + +.highcharts-button { + fill: #C0C0C0; + stroke: #C0C0C0; + cursor: default; + stroke-width: 1px; + transition: fill 250ms; +} + +.highcharts-button text { + fill: #404040; +} + +.highcharts-button-hover { + transition: fill 0ms; + fill: #C0C0C0; + stroke: #C0C0C0; +} + +.highcharts-button-hover text { + fill: #404040; +} + +.highcharts-button-pressed { + font-weight: bold; + fill: #e6ebf5; + stroke: #C0C0C0; +} + +.highcharts-button-pressed text { + fill: #404040; + font-weight: bold; +} + +.highcharts-button-disabled text { + fill: #404040; +} + +.highcharts-range-selector-buttons .highcharts-button { + stroke-width: 0px; +} + +.highcharts-range-label rect { + fill: none; +} + +.highcharts-range-label text { + fill: #808080; +} + +.highcharts-range-input rect { + fill: none; +} + +.highcharts-range-input text { + fill: #404040; +} + +.highcharts-range-input { + stroke-width: 1px; + stroke: #C0C0C0; +} + +input.highcharts-range-selector { + position: absolute; + border: 0; + width: 1px; + /* Chrome needs a pixel to see it */ + height: 1px; + padding: 0; + text-align: center; + left: -9em; + /* #4798 */ +} + +.highcharts-crosshair-label text { + fill: #FFFFFF; + font-size: 1.1em; +} + +.highcharts-crosshair-label .highcharts-label-box { + fill: inherit; +} + +.highcharts-candlestick-series .highcharts-point { + stroke: #000000; + stroke-width: 1px; +} + +.highcharts-candlestick-series .highcharts-point-up { + fill: #FFFFFF; +} + +.highcharts-ohlc-series .highcharts-point-hover { + stroke-width: 3px; +} + +.highcharts-flags-series .highcharts-point .highcharts-label-box { + stroke: #808080; + fill: #FFFFFF; + transition: fill 250ms; +} + +.highcharts-flags-series .highcharts-point-hover .highcharts-label-box { + stroke: #000000; + fill: #ccd6eb; +} + +.highcharts-flags-series .highcharts-point text { + fill: #000000; + font-size: 0.9em; + font-weight: bold; +} + +/* Highmaps */ +.highcharts-map-series .highcharts-point { + transition: fill 500ms, fill-opacity 500ms, stroke-width 250ms; + stroke: #C0C0C0; +} + +.highcharts-map-series .highcharts-point-hover { + transition: fill 0ms, fill-opacity 0ms; + fill-opacity: 0.5; + stroke-width: 2px; +} + +.highcharts-mapline-series .highcharts-point { + fill: none; +} + +.highcharts-heatmap-series .highcharts-point { + stroke-width: 0; +} + +.highcharts-map-navigation { + font-size: 1.3em; + font-weight: bold; + text-align: center; +} + +.highcharts-coloraxis { + stroke-width: 0; +} + +.highcharts-coloraxis-marker { + fill: #808080; +} + +.highcharts-null-point { + fill: #C0C0C0; +} + +/* 3d charts */ +.highcharts-3d-frame { + fill: transparent; +} + +/* Exporting module */ +.highcharts-contextbutton { + fill: #FFFFFF; + /* needed to capture hover */ + stroke: none; + stroke-linecap: round; +} + +.highcharts-contextbutton:hover { + fill: #C0C0C0; + stroke: #C0C0C0; +} + +.highcharts-button-symbol { + stroke: #808080; + stroke-width: 3px; +} + +.highcharts-menu { + border: 1px solid #808080; + background: #FFFFFF; + padding: 5px 0; + box-shadow: 3px 3px 10px #888; +} + +.highcharts-menu-item { + padding: 0.5em 1em; + background: none; + color: #404040; + cursor: pointer; + transition: background 250ms, color 250ms; +} + +.highcharts-menu-item:hover { + background: #335cad; + color: #FFFFFF; +} + +/* Drilldown module */ +.highcharts-drilldown-point { + cursor: pointer; +} + +.highcharts-drilldown-data-label text, +text.highcharts-drilldown-data-label, +.highcharts-drilldown-axis-label { + cursor: pointer; + fill: #003399; + font-weight: bold; + text-decoration: underline; +} + +/* No-data module */ +.highcharts-no-data text { + font-weight: bold; + font-size: 12px; + fill: #808080; +} + +/* Drag-panes module */ +.highcharts-axis-resizer { + cursor: ns-resize; + stroke: black; + stroke-width: 2px; +} + +/* Bullet type series */ +.highcharts-bullet-target { + stroke-width: 0; +} + +/* Lineargauge type series */ +.highcharts-lineargauge-target { + stroke-width: 1px; + stroke: #404040; +} + +.highcharts-lineargauge-target-line { + stroke-width: 1px; + stroke: #404040; +} + +/* Annotations module */ +.highcharts-annotation-label-box { + stroke-width: 1px; + stroke: #000000; + fill: #000000; + fill-opacity: 0.75; +} + +.highcharts-annotation-label text { + fill: #C0C0C0; +} + +/* Gantt */ +.highcharts-treegrid-node-collapsed, .highcharts-treegrid-node-expanded { + cursor: pointer; +} + +.highcharts-point-connecting-path { + fill: none; +} + +.highcharts-grid-axis .highcharts-tick { + stroke-width: 1px; +} + +.highcharts-grid-axis .highcharts-axis-line { + stroke-width: 1px; +} + +/*# sourceMappingURL=dicserver_highcharts.css.map */ diff --git a/DiscImageChef.Server/styles/mac/dicserver_highcharts.scss b/DiscImageChef.Server/styles/mac/dicserver_highcharts.scss new file mode 100644 index 00000000..0238da74 --- /dev/null +++ b/DiscImageChef.Server/styles/mac/dicserver_highcharts.scss @@ -0,0 +1,55 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : dicserver_highcharts.scss +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Sets style for server's charts. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +@import "_colors"; +@import "_font"; +@import "_fontstyles"; + +$colors: $green $yellow $orange $brown $red $magenta $purple $blue $cyan $tan $darkgreen; +$background-color: $body-bg; + +$neutral-color-100: $black; // Strong text. +$neutral-color-80: $gray-800; // Main text and some strokes. +$neutral-color-60: $gray-600; // Axis labels, axis title, connector fallback. +$neutral-color-40: $gray-400; // Credits text, export menu stroke. +$neutral-color-20: $gray-200; // Disabled texts, button strokes, crosshair etc. +$neutral-color-10: $gray-100; // Grid lines etc. +$neutral-color-5: $gray-100; // Minor grid lines etc. +$neutral-color-3: $gray-100; // Tooltip backgroud, button fills, map null points. + +$font-family: $font-family-base; + +$tooltip-background: $white; + +$data-label-color: $yellow; + +@import "../_highcharts"; \ No newline at end of file