From 6c8ad460644253d808ffe33c68e3ab3bc38cdfb3 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Mon, 9 May 2022 16:48:57 -0700 Subject: [PATCH] net6.0 Ready to test --- .editorconfig | 494 +- .groovy | 267 + EDA Viewer/.vscode/format-report.json | 20 + EDA Viewer/.vscode/launch.json | 33 + EDA Viewer/.vscode/tasks.json | 41 + EDA Viewer/Blazor/Counter.razor | 16 - EDA Viewer/Controllers/HomeController.cs | 167 - EDA Viewer/EDA Viewer.csproj | 39 +- EDA Viewer/GlobalSuppressions.cs | 10 - .../HostedService/TimedHostedService.cs | 233 +- EDA Viewer/IFX/Shared/IsEnvironment.cs | 167 + EDA Viewer/IFX/Shared/RijndaelEncryption.cs | 93 + .../Core/AutoGenerated/BackboneComponent.cs | 6 - .../Core/AutoGenerated/BackboneStatusCache.cs | 6 - .../AutoGenerated/ILoggingSetupManager.cs | 6 - .../Eaf/Core/AutoGenerated/StatusItem.cs | 6 - EDA Viewer/Library/Eaf/Core/Backbone.cs | 48 - .../Library/Eaf/Core/Smtp/EmailMessage.cs | 24 - EDA Viewer/Library/Eaf/Core/Smtp/ISmtp.cs | 9 - .../Library/Eaf/Core/Smtp/MailPriority.cs | 11 - .../ChangeDataCollectionHandler.cs | 6 - .../AutoGenerated/DataCollectionRequest.cs | 6 - .../Control/AutoGenerated/EquipmentEvent.cs | 6 - .../AutoGenerated/EquipmentException.cs | 6 - .../AutoGenerated/EquipmentSelfDescription.cs | 6 - .../GetParameterValuesHandler.cs | 6 - .../AutoGenerated/IConnectionControl.cs | 6 - .../AutoGenerated/IDataTracingHandler.cs | 6 - .../AutoGenerated/IEquipmentCommandService.cs | 6 - .../AutoGenerated/IEquipmentControl.cs | 16 - .../IEquipmentSelfDescriptionBuilder.cs | 6 - .../Control/AutoGenerated/IPackage.cs | 6 - .../AutoGenerated/ISelfDescriptionLookup.cs | 6 - .../IVirtualParameterValuesHandler.cs | 6 - .../SetParameterValuesHandler.cs | 6 - .../Control/AutoGenerated/TraceRequest.cs | 6 - .../Control/IEquipmentDataCollection.cs | 39 - .../EquipmentCore/Control/IPackageSource.cs | 6 - .../Reporting/ParameterValue.cs | 20 - .../ElementDescription/EquipmentParameter.cs | 24 - .../SelfDescription/ParameterTypes/Field.cs | 12 - .../ParameterTypes/ParameterTypeDefinition.cs | 12 - .../ParameterTypes/StructuredType.cs | 12 - .../CellAutomation/IConfigurationObject.cs | 6 - .../ModelObjectParameterDefinition.cs | 26 - .../ModelObjectParameterType.cs | 17 - .../SecsConnectionConfiguration.cs | 44 - .../Common/Configuration/ConnectionSetting.cs | 13 - .../EquipmentConnector/File/Component/File.cs | 19 - .../File/Component/FilePathGenerator.cs | 35 - .../FileConnectorConfiguration.cs | 135 - ...onnectorParameterTypeDefinitionProvider.cs | 14 - .../GCL/Annotations/NotNullAttribute.cs | 10 - .../GCL/SecsDriver/HsmsConnectionMode.cs | 8 - .../GCL/SecsDriver/HsmsSessionMode.cs | 8 - .../GCL/SecsDriver/SecsTransportType.cs | 8 - .../GCL/SecsDriver/SerialBaudRate.cs | 16 - EDA Viewer/Models/AppSettings.cs | 59 +- EDA Viewer/Models/Binder/AppSettings.cs | 38 + EDA Viewer/Models/EdaHtmlDiff.cs | 52 - EDA Viewer/Models/ErrorViewModel.cs | 13 +- EDA Viewer/Models/IBackground.cs | 46 - EDA Viewer/Models/IHomeController.cs | 17 - EDA Viewer/Models/Methods/IBackground.cs | 20 + EDA Viewer/Models/Properties/IBackground.cs | 8 + .../Models/Properties/IBackgroundPage.cs | 10 + EDA Viewer/Models/Stateless/AppSettings.cs | 39 + .../Stateless/Methods/IBackgroundPage.cs | 10 + .../Models/Stateless/Methods/IMethodName.cs | 10 + .../Stateless/Methods/IWorkingDirectory.cs | 8 + .../Stateless/Methods/WorkingDirectory.cs | 50 + .../Stateless/SerilogExtensionMethods.cs | 10 + EDA Viewer/Models/WithEnvironment.cs | 14 - EDA Viewer/Pages/Background.cshtml | 68 + EDA Viewer/Pages/Background.cshtml.cs | 74 + EDA Viewer/Pages/Error.cshtml | 42 + EDA Viewer/Pages/Error.cshtml.cs | 20 + EDA Viewer/Program.cs | 97 +- EDA Viewer/Properties/AssemblyInfo.cs | 2 +- EDA Viewer/Shared/EquipmentType.cs | 53 - EDA Viewer/Shared/IsEnvironment.cs | 171 - EDA Viewer/Shared/RijndaelEncryption.cs | 96 - EDA Viewer/Singleton/Background.cs | 1476 +-- .../Singleton/Helper/BackgroundEDA - A.cs | 5752 ++++---- .../Singleton/Helper/BackgroundEDADatabase.cs | 26 +- .../Singleton/Helper/BackgroundEdaDCP.cs | 763 +- EDA Viewer/Singleton/Helper/Common.cs | 301 +- .../Helper/ModuleInstanceTypeName.cs | 10 +- EDA Viewer/Singleton/IBackground.cs | 28 - EDA Viewer/Startup.cs | 156 - EDA Viewer/Views/Home/Background.cshtml | 47 - EDA Viewer/Views/Home/Index.cshtml | 12 - EDA Viewer/Views/Home/Privacy.cshtml | 6 - EDA Viewer/Views/Home/ViewEdaHtmlDiff.cshtml | 182 - EDA Viewer/Views/Shared/Error.cshtml | 25 - EDA Viewer/Views/Shared/_Layout.cshtml | 71 - .../Shared/_ValidationScriptsPartial.cshtml | 2 - EDA Viewer/Views/_ViewImports.cshtml | 3 - EDA Viewer/Views/_ViewStart.cshtml | 3 - EDA Viewer/appsettings.Development.json | 171 +- EDA Viewer/appsettings.Staging.json | 171 +- EDA Viewer/appsettings.json | 171 +- EDA Viewer/wwwroot/css/app.css | 68 + .../css => css/bootstrap}/bootstrap.min.css | 0 .../bootstrap}/bootstrap.min.css.map | 0 EDA Viewer/wwwroot/css/bundles/css.css | 1 - .../wwwroot/css/open-iconic/FONT-LICENSE | 86 + .../open-iconic/ICON-LICENSE} | 5 +- EDA Viewer/wwwroot/css/open-iconic/README.md | 114 + .../font/css/open-iconic-bootstrap.min.css | 1 + .../open-iconic/font/fonts/open-iconic.eot | Bin 0 -> 28196 bytes .../open-iconic/font/fonts/open-iconic.otf | Bin 0 -> 20996 bytes .../open-iconic/font/fonts/open-iconic.svg | 543 + .../open-iconic/font/fonts/open-iconic.ttf | Bin 0 -> 28028 bytes .../open-iconic/font/fonts/open-iconic.woff | Bin 0 -> 14984 bytes EDA Viewer/wwwroot/css/site.css | 71 - EDA Viewer/wwwroot/images/OnePixel.gif | Bin 807 -> 0 bytes EDA Viewer/wwwroot/index.txt | 1 + EDA Viewer/wwwroot/js/bundles/bootstrap.js | 1 - EDA Viewer/wwwroot/js/bundles/jquery.js | 1 - EDA Viewer/wwwroot/js/bundles/jqueryval.js | 1 - EDA Viewer/wwwroot/js/bundles/modernizr.js | 1 - .../js/html5shiv/3.7.2/html5shiv-printshiv.js | 520 - .../3.7.2/html5shiv-printshiv.min.js | 4 - .../wwwroot/js/html5shiv/3.7.2/html5shiv.js | 322 - .../js/html5shiv/3.7.2/html5shiv.min.js | 4 - .../respond/1.4.2/matchmedia.addListener.js | 76 - .../1.4.2/matchmedia.addListener.min.js | 4 - .../1.4.2/matchmedia.addListener.min.js.map | 8 - .../js/respond/1.4.2/matchmedia.polyfill.js | 36 - .../respond/1.4.2/matchmedia.polyfill.min.js | 4 - .../1.4.2/matchmedia.polyfill.min.js.map | 8 - .../wwwroot/js/respond/1.4.2/respond.js | 341 - .../wwwroot/js/respond/1.4.2/respond.min.js | 4 - .../js/respond/1.4.2/respond.min.js.map | 8 - .../wwwroot/js/respond/1.4.2/respond.proxy.js | 127 - .../js/respond/1.4.2/respond.proxy.min.js | 4 - .../js/respond/1.4.2/respond.proxy.min.js.map | 8 - EDA Viewer/wwwroot/js/site.js | 4 - EDA Viewer/wwwroot/lib/bootstrap/LICENSE | 22 - .../lib/bootstrap/dist/css/bootstrap-grid.css | 3719 ------ .../bootstrap/dist/css/bootstrap-grid.css.map | 1 - .../bootstrap/dist/css/bootstrap-grid.min.css | 7 - .../dist/css/bootstrap-grid.min.css.map | 1 - .../bootstrap/dist/css/bootstrap-reboot.css | 331 - .../dist/css/bootstrap-reboot.css.map | 1 - .../dist/css/bootstrap-reboot.min.css | 8 - .../dist/css/bootstrap-reboot.min.css.map | 1 - .../lib/bootstrap/dist/css/bootstrap.css | 10038 -------------- .../lib/bootstrap/dist/css/bootstrap.css.map | 1 - .../lib/bootstrap/dist/js/bootstrap.bundle.js | 7013 ---------- .../bootstrap/dist/js/bootstrap.bundle.js.map | 1 - .../bootstrap/dist/js/bootstrap.bundle.min.js | 7 - .../dist/js/bootstrap.bundle.min.js.map | 1 - .../lib/bootstrap/dist/js/bootstrap.js | 4435 ------- .../lib/bootstrap/dist/js/bootstrap.js.map | 1 - .../lib/bootstrap/dist/js/bootstrap.min.js | 7 - .../bootstrap/dist/js/bootstrap.min.js.map | 1 - .../jquery-validation-unobtrusive/LICENSE.txt | 12 - .../jquery.validate.unobtrusive.js | 432 - .../jquery.validate.unobtrusive.min.js | 5 - .../dist/additional-methods.js | 1158 -- .../dist/additional-methods.min.js | 4 - .../jquery-validation/dist/jquery.validate.js | 1601 --- .../dist/jquery.validate.min.js | 4 - EDA Viewer/wwwroot/lib/jquery/LICENSE.txt | 36 - EDA Viewer/wwwroot/lib/jquery/dist/jquery.js | 10872 ---------------- .../wwwroot/lib/jquery/dist/jquery.min.js | 2 - .../wwwroot/lib/jquery/dist/jquery.min.map | 1 - Jenkinsfile | 267 + package.json | 7 +- 171 files changed, 6547 insertions(+), 48515 deletions(-) create mode 100644 .groovy create mode 100644 EDA Viewer/.vscode/format-report.json create mode 100644 EDA Viewer/.vscode/launch.json create mode 100644 EDA Viewer/.vscode/tasks.json delete mode 100644 EDA Viewer/Blazor/Counter.razor delete mode 100644 EDA Viewer/Controllers/HomeController.cs delete mode 100644 EDA Viewer/GlobalSuppressions.cs create mode 100644 EDA Viewer/IFX/Shared/IsEnvironment.cs create mode 100644 EDA Viewer/IFX/Shared/RijndaelEncryption.cs delete mode 100644 EDA Viewer/Library/Eaf/Core/AutoGenerated/BackboneComponent.cs delete mode 100644 EDA Viewer/Library/Eaf/Core/AutoGenerated/BackboneStatusCache.cs delete mode 100644 EDA Viewer/Library/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs delete mode 100644 EDA Viewer/Library/Eaf/Core/AutoGenerated/StatusItem.cs delete mode 100644 EDA Viewer/Library/Eaf/Core/Backbone.cs delete mode 100644 EDA Viewer/Library/Eaf/Core/Smtp/EmailMessage.cs delete mode 100644 EDA Viewer/Library/Eaf/Core/Smtp/ISmtp.cs delete mode 100644 EDA Viewer/Library/Eaf/Core/Smtp/MailPriority.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/Control/IPackageSource.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs delete mode 100644 EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs delete mode 100644 EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs delete mode 100644 EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs delete mode 100644 EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs delete mode 100644 EDA Viewer/Library/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs delete mode 100644 EDA Viewer/Library/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs delete mode 100644 EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Component/File.cs delete mode 100644 EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs delete mode 100644 EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs delete mode 100644 EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs delete mode 100644 EDA Viewer/Library/PeerGroup/GCL/Annotations/NotNullAttribute.cs delete mode 100644 EDA Viewer/Library/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs delete mode 100644 EDA Viewer/Library/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs delete mode 100644 EDA Viewer/Library/PeerGroup/GCL/SecsDriver/SecsTransportType.cs delete mode 100644 EDA Viewer/Library/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs create mode 100644 EDA Viewer/Models/Binder/AppSettings.cs delete mode 100644 EDA Viewer/Models/EdaHtmlDiff.cs delete mode 100644 EDA Viewer/Models/IBackground.cs delete mode 100644 EDA Viewer/Models/IHomeController.cs create mode 100644 EDA Viewer/Models/Methods/IBackground.cs create mode 100644 EDA Viewer/Models/Properties/IBackground.cs create mode 100644 EDA Viewer/Models/Properties/IBackgroundPage.cs create mode 100644 EDA Viewer/Models/Stateless/AppSettings.cs create mode 100644 EDA Viewer/Models/Stateless/Methods/IBackgroundPage.cs create mode 100644 EDA Viewer/Models/Stateless/Methods/IMethodName.cs create mode 100644 EDA Viewer/Models/Stateless/Methods/IWorkingDirectory.cs create mode 100644 EDA Viewer/Models/Stateless/Methods/WorkingDirectory.cs create mode 100644 EDA Viewer/Models/Stateless/SerilogExtensionMethods.cs delete mode 100644 EDA Viewer/Models/WithEnvironment.cs create mode 100644 EDA Viewer/Pages/Background.cshtml create mode 100644 EDA Viewer/Pages/Background.cshtml.cs create mode 100644 EDA Viewer/Pages/Error.cshtml create mode 100644 EDA Viewer/Pages/Error.cshtml.cs delete mode 100644 EDA Viewer/Shared/EquipmentType.cs delete mode 100644 EDA Viewer/Shared/IsEnvironment.cs delete mode 100644 EDA Viewer/Shared/RijndaelEncryption.cs delete mode 100644 EDA Viewer/Singleton/IBackground.cs delete mode 100644 EDA Viewer/Startup.cs delete mode 100644 EDA Viewer/Views/Home/Background.cshtml delete mode 100644 EDA Viewer/Views/Home/Index.cshtml delete mode 100644 EDA Viewer/Views/Home/Privacy.cshtml delete mode 100644 EDA Viewer/Views/Home/ViewEdaHtmlDiff.cshtml delete mode 100644 EDA Viewer/Views/Shared/Error.cshtml delete mode 100644 EDA Viewer/Views/Shared/_Layout.cshtml delete mode 100644 EDA Viewer/Views/Shared/_ValidationScriptsPartial.cshtml delete mode 100644 EDA Viewer/Views/_ViewImports.cshtml delete mode 100644 EDA Viewer/Views/_ViewStart.cshtml create mode 100644 EDA Viewer/wwwroot/css/app.css rename EDA Viewer/wwwroot/{lib/bootstrap/dist/css => css/bootstrap}/bootstrap.min.css (100%) rename EDA Viewer/wwwroot/{lib/bootstrap/dist/css => css/bootstrap}/bootstrap.min.css.map (100%) delete mode 100644 EDA Viewer/wwwroot/css/bundles/css.css create mode 100644 EDA Viewer/wwwroot/css/open-iconic/FONT-LICENSE rename EDA Viewer/wwwroot/{lib/jquery-validation/LICENSE.md => css/open-iconic/ICON-LICENSE} (94%) create mode 100644 EDA Viewer/wwwroot/css/open-iconic/README.md create mode 100644 EDA Viewer/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css create mode 100644 EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.eot create mode 100644 EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.otf create mode 100644 EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.svg create mode 100644 EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf create mode 100644 EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.woff delete mode 100644 EDA Viewer/wwwroot/css/site.css delete mode 100644 EDA Viewer/wwwroot/images/OnePixel.gif create mode 100644 EDA Viewer/wwwroot/index.txt delete mode 100644 EDA Viewer/wwwroot/js/bundles/bootstrap.js delete mode 100644 EDA Viewer/wwwroot/js/bundles/jquery.js delete mode 100644 EDA Viewer/wwwroot/js/bundles/jqueryval.js delete mode 100644 EDA Viewer/wwwroot/js/bundles/modernizr.js delete mode 100644 EDA Viewer/wwwroot/js/html5shiv/3.7.2/html5shiv-printshiv.js delete mode 100644 EDA Viewer/wwwroot/js/html5shiv/3.7.2/html5shiv-printshiv.min.js delete mode 100644 EDA Viewer/wwwroot/js/html5shiv/3.7.2/html5shiv.js delete mode 100644 EDA Viewer/wwwroot/js/html5shiv/3.7.2/html5shiv.min.js delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/matchmedia.addListener.js delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/matchmedia.addListener.min.js delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/matchmedia.addListener.min.js.map delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/matchmedia.polyfill.js delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/matchmedia.polyfill.min.js delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/matchmedia.polyfill.min.js.map delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/respond.js delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/respond.min.js delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/respond.min.js.map delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/respond.proxy.js delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/respond.proxy.min.js delete mode 100644 EDA Viewer/wwwroot/js/respond/1.4.2/respond.proxy.min.js.map delete mode 100644 EDA Viewer/wwwroot/js/site.js delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/LICENSE delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap.css delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/js/bootstrap.js delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js delete mode 100644 EDA Viewer/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map delete mode 100644 EDA Viewer/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt delete mode 100644 EDA Viewer/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js delete mode 100644 EDA Viewer/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js delete mode 100644 EDA Viewer/wwwroot/lib/jquery-validation/dist/additional-methods.js delete mode 100644 EDA Viewer/wwwroot/lib/jquery-validation/dist/additional-methods.min.js delete mode 100644 EDA Viewer/wwwroot/lib/jquery-validation/dist/jquery.validate.js delete mode 100644 EDA Viewer/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js delete mode 100644 EDA Viewer/wwwroot/lib/jquery/LICENSE.txt delete mode 100644 EDA Viewer/wwwroot/lib/jquery/dist/jquery.js delete mode 100644 EDA Viewer/wwwroot/lib/jquery/dist/jquery.min.js delete mode 100644 EDA Viewer/wwwroot/lib/jquery/dist/jquery.min.map create mode 100644 Jenkinsfile diff --git a/.editorconfig b/.editorconfig index a3ebdb2..b48db8a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,137 +1,10 @@ -# Remove the line below if you want to inherit .editorconfig settings from higher directories -root = true - -# C# files [*.cs] - -#### Core EditorConfig Options #### - -# Indentation and spacing -indent_size = 4 -indent_style = space -tab_width = 4 - -# New line preferences -end_of_line = crlf -insert_final_newline = false - -#### .NET Coding Conventions #### - -# Organize usings -dotnet_separate_import_directive_groups = false -dotnet_sort_system_directives_first = false -file_header_template = unset - -# this. and Me. preferences -dotnet_style_qualification_for_event = false:error -dotnet_style_qualification_for_field = false -dotnet_style_qualification_for_method = false:error -dotnet_style_qualification_for_property = false:error - -# Language keywords vs BCL types preferences -dotnet_style_predefined_type_for_locals_parameters_members = true -dotnet_style_predefined_type_for_member_access = true - -# Parentheses preferences -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity -dotnet_style_parentheses_in_other_operators = never_if_unnecessary -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity - -# Modifier preferences -dotnet_style_require_accessibility_modifiers = for_non_interface_members - -# Expression-level preferences -dotnet_style_coalesce_expression = true -dotnet_style_collection_initializer = true:warning -dotnet_style_explicit_tuple_names = true:warning -dotnet_style_namespace_match_folder = true -dotnet_style_null_propagation = true:warning -dotnet_style_object_initializer = true:warning -dotnet_style_operator_placement_when_wrapping = beginning_of_line -dotnet_style_prefer_auto_properties = true:warning -dotnet_style_prefer_compound_assignment = true:warning -dotnet_style_prefer_conditional_expression_over_assignment = false -dotnet_style_prefer_conditional_expression_over_return = false -dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning -dotnet_style_prefer_inferred_tuple_names = true:warning -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning -dotnet_style_prefer_simplified_boolean_expressions = true:warning -dotnet_style_prefer_simplified_interpolation = true - -# Field preferences -dotnet_style_readonly_field = true:warning - -# Parameter preferences -dotnet_code_quality_unused_parameters = all - -# Suppression preferences -dotnet_remove_unnecessary_suppression_exclusions = 0 - -# New line preferences -dotnet_style_allow_multiple_blank_lines_experimental = false:warning -dotnet_style_allow_statement_immediately_after_block_experimental = true - -#### C# Coding Conventions #### - -# var preferences -csharp_style_var_elsewhere = false:warning -csharp_style_var_for_built_in_types = false:warning -csharp_style_var_when_type_is_apparent = false:warning - -# Expression-bodied members -csharp_style_expression_bodied_accessors = when_on_single_line:warning -csharp_style_expression_bodied_constructors = when_on_single_line:warning -csharp_style_expression_bodied_indexers = when_on_single_line:warning -csharp_style_expression_bodied_lambdas = when_on_single_line:warning -csharp_style_expression_bodied_local_functions = when_on_single_line:warning -csharp_style_expression_bodied_methods = when_on_single_line:warning -csharp_style_expression_bodied_operators = when_on_single_line:warning -csharp_style_expression_bodied_properties = when_on_single_line:warning - -# Pattern matching preferences -csharp_style_pattern_matching_over_as_with_null_check = true:warning -csharp_style_pattern_matching_over_is_with_cast_check = true:warning -csharp_style_prefer_not_pattern = true:warning -csharp_style_prefer_pattern_matching = true:warning -csharp_style_prefer_switch_expression = true:warning - -# Null-checking preferences -csharp_style_conditional_delegate_call = true - -# Modifier preferences -csharp_prefer_static_local_function = true:warning -csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async - -# Code-block preferences -csharp_prefer_braces = false -csharp_prefer_simple_using_statement = true:warning -csharp_style_namespace_declarations = file_scoped:warning - -# Expression-level preferences -csharp_prefer_simple_default_expression = true:warning -csharp_style_deconstructed_variable_declaration = false -csharp_style_implicit_object_creation_when_type_is_apparent = true:warning -csharp_style_inlined_variable_declaration = false -csharp_style_pattern_local_over_anonymous_function = true:warning -csharp_style_prefer_index_operator = false:warning -csharp_style_prefer_null_check_over_type_check = true -csharp_style_prefer_range_operator = false:warning -csharp_style_throw_expression = true -csharp_style_unused_value_assignment_preference = discard_variable:warning -csharp_style_unused_value_expression_statement_preference = discard_variable:warning - -# 'using' directive preferences -csharp_using_directive_placement = outside_namespace - -# New line preferences -csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true -csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true -csharp_style_allow_embedded_statements_on_same_line_experimental = true - -#### C# Formatting Rules #### - -# New line preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true csharp_new_line_before_catch = true csharp_new_line_before_else = true csharp_new_line_before_finally = true @@ -139,16 +12,13 @@ csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_open_brace = all csharp_new_line_between_query_expression_clauses = true - -# Indentation preferences -csharp_indent_block_contents = true -csharp_indent_braces = false -csharp_indent_case_contents = true -csharp_indent_case_contents_when_block = true -csharp_indent_labels = one_less_than_current -csharp_indent_switch_labels = true - -# Space preferences +csharp_prefer_braces = false +csharp_prefer_simple_default_expression = true:warning +csharp_prefer_simple_using_statement = true:warning +csharp_prefer_static_local_function = true:warning +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = false csharp_space_after_cast = false csharp_space_after_colon_in_inheritance_clause = true csharp_space_after_comma = true @@ -171,166 +41,202 @@ csharp_space_between_method_declaration_name_and_open_parenthesis = false csharp_space_between_method_declaration_parameter_list_parentheses = false csharp_space_between_parentheses = false csharp_space_between_square_brackets = false - -# Wrapping preferences -csharp_preserve_single_line_blocks = true -csharp_preserve_single_line_statements = false - -#### Naming styles #### - -# Naming rules - -dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning -dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface -dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i - -dotnet_naming_rule.types_should_be_pascal_case.severity = warning -dotnet_naming_rule.types_should_be_pascal_case.symbols = types -dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.severity = warning -dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.symbols = private_or_internal_field -dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.style = private_of_internal_field - -dotnet_naming_rule.enum_should_be_pascal_case.severity = warning -dotnet_naming_rule.enum_should_be_pascal_case.symbols = enum -dotnet_naming_rule.enum_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.severity = warning -dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.symbols = public_or_protected_field -dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.style = private_of_internal_field - -dotnet_naming_rule.class_should_be_pascal_case.severity = warning -dotnet_naming_rule.class_should_be_pascal_case.symbols = class -dotnet_naming_rule.class_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.method_should_be_pascal_case.severity = warning -dotnet_naming_rule.method_should_be_pascal_case.symbols = method -dotnet_naming_rule.method_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.severity = warning -dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.symbols = private_or_internal_static_field -dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.style = private_of_internal_field - -dotnet_naming_rule.static_field_should_be_pascal_case.severity = warning -dotnet_naming_rule.static_field_should_be_pascal_case.symbols = static_field -dotnet_naming_rule.static_field_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.property_should_be_pascal_case.severity = warning -dotnet_naming_rule.property_should_be_pascal_case.symbols = property -dotnet_naming_rule.property_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.static_method_should_be_pascal_case.severity = warning -dotnet_naming_rule.static_method_should_be_pascal_case.symbols = static_method -dotnet_naming_rule.static_method_should_be_pascal_case.style = pascal_case - +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true +csharp_style_allow_embedded_statements_on_same_line_experimental = true +csharp_style_conditional_delegate_call = true +csharp_style_deconstructed_variable_declaration = false +csharp_style_expression_bodied_accessors = when_on_single_line:warning +csharp_style_expression_bodied_constructors = when_on_single_line:warning +csharp_style_expression_bodied_indexers = when_on_single_line:warning +csharp_style_expression_bodied_lambdas = when_on_single_line:warning +csharp_style_expression_bodied_local_functions = when_on_single_line:warning +csharp_style_expression_bodied_methods = when_on_single_line:warning +csharp_style_expression_bodied_operators = when_on_single_line:warning +csharp_style_expression_bodied_properties = when_on_single_line:warning +csharp_style_implicit_object_creation_when_type_is_apparent = true:warning +csharp_style_inlined_variable_declaration = false +csharp_style_namespace_declarations = file_scoped:warning +csharp_style_pattern_local_over_anonymous_function = true:warning +csharp_style_pattern_matching_over_as_with_null_check = true:warning +csharp_style_pattern_matching_over_is_with_cast_check = true:warning +csharp_style_prefer_index_operator = true:warning +csharp_style_prefer_not_pattern = true:warning +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_pattern_matching = true:warning +csharp_style_prefer_range_operator = true:warning +csharp_style_prefer_switch_expression = true:warning +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable:warning +csharp_style_unused_value_expression_statement_preference = discard_variable:warning +csharp_style_var_elsewhere = false:warning +csharp_style_var_for_built_in_types = false:warning +csharp_style_var_when_type_is_apparent = false:warning +csharp_using_directive_placement = outside_namespace +dotnet_code_quality_unused_parameters = all +dotnet_code_quality_unused_parameters = non_public # IDE0060: Remove unused parameter +dotnet_code_quality.CAXXXX.api_surface = private, internal +dotnet_diagnostic.CA1825.severity = warning # CA1823: Avoid zero-length array allocations +dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available +dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable +dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name +dotnet_diagnostic.IDE0002.severity = warning # Simplify (member access) System.Version.Equals("1", "2"); Version.Equals("1", "2"); +dotnet_diagnostic.IDE0005.severity = warning # Using directive is unnecessary using System.Text; +dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter dotnet_naming_rule.abstract_method_should_be_pascal_case.severity = warning -dotnet_naming_rule.abstract_method_should_be_pascal_case.symbols = abstract_method dotnet_naming_rule.abstract_method_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.private_method_should_be_pascal_case.severity = warning -dotnet_naming_rule.private_method_should_be_pascal_case.symbols = private_method -dotnet_naming_rule.private_method_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.event_should_be_pascal_case.severity = warning -dotnet_naming_rule.event_should_be_pascal_case.symbols = event -dotnet_naming_rule.event_should_be_pascal_case.style = pascal_case - +dotnet_naming_rule.abstract_method_should_be_pascal_case.symbols = abstract_method +dotnet_naming_rule.class_should_be_pascal_case.severity = warning +dotnet_naming_rule.class_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.class_should_be_pascal_case.symbols = class dotnet_naming_rule.delegate_should_be_pascal_case.severity = warning -dotnet_naming_rule.delegate_should_be_pascal_case.symbols = delegate dotnet_naming_rule.delegate_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.struct_should_be_pascal_case.severity = warning -dotnet_naming_rule.struct_should_be_pascal_case.symbols = struct -dotnet_naming_rule.struct_should_be_pascal_case.style = pascal_case - +dotnet_naming_rule.delegate_should_be_pascal_case.symbols = delegate +dotnet_naming_rule.enum_should_be_pascal_case.severity = warning +dotnet_naming_rule.enum_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.enum_should_be_pascal_case.symbols = enum +dotnet_naming_rule.event_should_be_pascal_case.severity = warning +dotnet_naming_rule.event_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.event_should_be_pascal_case.symbols = event +dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.method_should_be_pascal_case.severity = warning +dotnet_naming_rule.method_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.method_should_be_pascal_case.symbols = method dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning -dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case - -# Symbol specifications - -dotnet_naming_symbols.class.applicable_kinds = class -dotnet_naming_symbols.class.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.class.required_modifiers = - -dotnet_naming_symbols.interface.applicable_kinds = interface -dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.interface.required_modifiers = - -dotnet_naming_symbols.struct.applicable_kinds = struct -dotnet_naming_symbols.struct.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.struct.required_modifiers = - -dotnet_naming_symbols.enum.applicable_kinds = enum -dotnet_naming_symbols.enum.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.enum.required_modifiers = - -dotnet_naming_symbols.delegate.applicable_kinds = delegate -dotnet_naming_symbols.delegate.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.delegate.required_modifiers = - -dotnet_naming_symbols.event.applicable_kinds = event -dotnet_naming_symbols.event.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.event.required_modifiers = - -dotnet_naming_symbols.method.applicable_kinds = method -dotnet_naming_symbols.method.applicable_accessibilities = public -dotnet_naming_symbols.method.required_modifiers = - -dotnet_naming_symbols.private_method.applicable_kinds = method -dotnet_naming_symbols.private_method.applicable_accessibilities = private -dotnet_naming_symbols.private_method.required_modifiers = - -dotnet_naming_symbols.abstract_method.applicable_kinds = method -dotnet_naming_symbols.abstract_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.abstract_method.required_modifiers = abstract - -dotnet_naming_symbols.static_method.applicable_kinds = method -dotnet_naming_symbols.static_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.static_method.required_modifiers = static - -dotnet_naming_symbols.property.applicable_kinds = property -dotnet_naming_symbols.property.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.property.required_modifiers = - -dotnet_naming_symbols.public_or_protected_field.applicable_kinds = field -dotnet_naming_symbols.public_or_protected_field.applicable_accessibilities = public, protected -dotnet_naming_symbols.public_or_protected_field.required_modifiers = - -dotnet_naming_symbols.static_field.applicable_kinds = field -dotnet_naming_symbols.static_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.static_field.required_modifiers = static - -dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field -dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected -dotnet_naming_symbols.private_or_internal_field.required_modifiers = - -dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field -dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected -dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static - -dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum -dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.types.required_modifiers = - -dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method -dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.non_field_members.required_modifiers = - -# Naming styles - -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = -dotnet_naming_style.pascal_case.capitalization = pascal_case - +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.private_method_should_be_pascal_case.severity = warning +dotnet_naming_rule.private_method_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.private_method_should_be_pascal_case.symbols = private_method +dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.severity = warning +dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.style = private_of_internal_field +dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.symbols = private_or_internal_field +dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.severity = warning +dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.style = private_of_internal_field +dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.symbols = private_or_internal_static_field +dotnet_naming_rule.property_should_be_pascal_case.severity = warning +dotnet_naming_rule.property_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.property_should_be_pascal_case.symbols = property +dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.severity = warning +dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.style = private_of_internal_field +dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.symbols = public_or_protected_field +dotnet_naming_rule.static_field_should_be_pascal_case.severity = warning +dotnet_naming_rule.static_field_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.static_field_should_be_pascal_case.symbols = static_field +dotnet_naming_rule.static_method_should_be_pascal_case.severity = warning +dotnet_naming_rule.static_method_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.static_method_should_be_pascal_case.symbols = static_method +dotnet_naming_rule.struct_should_be_pascal_case.severity = warning +dotnet_naming_rule.struct_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.struct_should_be_pascal_case.symbols = struct +dotnet_naming_rule.types_should_be_pascal_case.severity = warning +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_style.begins_with_i.capitalization = pascal_case dotnet_naming_style.begins_with_i.required_prefix = I dotnet_naming_style.begins_with_i.required_suffix = dotnet_naming_style.begins_with_i.word_separator = -dotnet_naming_style.begins_with_i.capitalization = pascal_case - +dotnet_naming_style.pascal_case.capitalization = pascal_case +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.private_of_internal_field.capitalization = pascal_case dotnet_naming_style.private_of_internal_field.required_prefix = _ dotnet_naming_style.private_of_internal_field.required_suffix = dotnet_naming_style.private_of_internal_field.word_separator = -dotnet_naming_style.private_of_internal_field.capitalization = pascal_case +dotnet_naming_symbols.abstract_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.abstract_method.applicable_kinds = method +dotnet_naming_symbols.abstract_method.required_modifiers = abstract +dotnet_naming_symbols.class.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.class.applicable_kinds = class +dotnet_naming_symbols.class.required_modifiers = +dotnet_naming_symbols.delegate.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.delegate.applicable_kinds = delegate +dotnet_naming_symbols.delegate.required_modifiers = +dotnet_naming_symbols.enum.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.enum.applicable_kinds = enum +dotnet_naming_symbols.enum.required_modifiers = +dotnet_naming_symbols.event.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.event.applicable_kinds = event +dotnet_naming_symbols.event.required_modifiers = +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.required_modifiers = +dotnet_naming_symbols.method.applicable_accessibilities = public +dotnet_naming_symbols.method.applicable_kinds = method +dotnet_naming_symbols.method.required_modifiers = +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.required_modifiers = +dotnet_naming_symbols.private_method.applicable_accessibilities = private +dotnet_naming_symbols.private_method.applicable_kinds = method +dotnet_naming_symbols.private_method.required_modifiers = +dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected +dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field +dotnet_naming_symbols.private_or_internal_field.required_modifiers = +dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected +dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field +dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static +dotnet_naming_symbols.property.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.property.applicable_kinds = property +dotnet_naming_symbols.property.required_modifiers = +dotnet_naming_symbols.public_or_protected_field.applicable_accessibilities = public, protected +dotnet_naming_symbols.public_or_protected_field.applicable_kinds = field +dotnet_naming_symbols.public_or_protected_field.required_modifiers = +dotnet_naming_symbols.static_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.static_field.applicable_kinds = field +dotnet_naming_symbols.static_field.required_modifiers = static +dotnet_naming_symbols.static_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.static_method.applicable_kinds = method +dotnet_naming_symbols.static_method.required_modifiers = static +dotnet_naming_symbols.struct.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.struct.applicable_kinds = struct +dotnet_naming_symbols.struct.required_modifiers = +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.required_modifiers = +dotnet_remove_unnecessary_suppression_exclusions = 0 +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = false +dotnet_style_allow_multiple_blank_lines_experimental = false:warning +dotnet_style_allow_statement_immediately_after_block_experimental = true +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true:warning +dotnet_style_explicit_tuple_names = true:warning +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true:warning +dotnet_style_object_initializer = true:warning +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_prefer_compound_assignment = true:warning +dotnet_style_prefer_conditional_expression_over_assignment = false +dotnet_style_prefer_conditional_expression_over_return = false +dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning +dotnet_style_prefer_inferred_tuple_names = true:warning +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning +dotnet_style_prefer_simplified_boolean_expressions = true:warning +dotnet_style_prefer_simplified_interpolation = true +dotnet_style_qualification_for_event = false:error +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false:error +dotnet_style_qualification_for_property = false:error +dotnet_style_readonly_field = true:warning +dotnet_style_require_accessibility_modifiers = for_non_interface_members +end_of_line = crlf +file_header_template = unset +indent_size = 4 +indent_style = space +insert_final_newline = false +root = true +tab_width = 4 +# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1822 +# https://github.com/dotnet/aspnetcore/blob/main/.editorconfig +# https://github.com/dotnet/project-system/blob/main/.editorconfig \ No newline at end of file diff --git a/.groovy b/.groovy new file mode 100644 index 0000000..3cce7fa --- /dev/null +++ b/.groovy @@ -0,0 +1,267 @@ +#!/usr/bin/env groovy +/* groovylint-disable CompileStatic, ConsecutiveStringConcatenation, DuplicateNumberLiteral, DuplicateStringLiteral, LineLength, NestedBlockDepth, NoDef, VariableTypeRequired */ +import groovy.transform.Field + +@Field String _DDrive = 'D:/' +@Field String _ExePath = '...' +@Field String _NGINXFile = '...' +@Field String _PortNumber = '...' +@Field String _AssemblyName = '...' +@Field String _NetVersion = 'net6.0' +@Field String _TargetLocation = '...' +@Field String _GitCommitSeven = '...' +@Field String _GitName = 'EDA-Viewer' +@Field String _FirstBeforePlus = '5000' +@Field String _MonARessource = 'EDA_Viewer' +@Field String _ProjectDirectory = 'EDA Viewer' +@Field String _WorkingDirectoryName = 'IFXApps' +@Field String _AgentStaging = 'mestsa07ec-ecmeseaf' +@Field String _AgentProduction = 'messa08ec-ecmeseaf' +@Field String _DDriveNet = "${_DDrive}${_NetVersion}" +@Field String _CredentialsId = 'EDA-Username-Password' +@Field String _AgentDevelopment = 'mestsa003-mesedasvc' +@Field String _Company = 'Infineon Technologies Americas Corp.' +@Field String _ProgramFilesDotnet = 'C:/program files/dotnet/dotnet.exe' + +pipeline { + agent { + label env.JENKINS_ENVIRONMENT == 'Development' ? _AgentDevelopment : env.JENKINS_ENVIRONMENT == 'Staging' ? _AgentStaging : env.JENKINS_ENVIRONMENT == 'Production' ? _AgentProduction : 'Else' + } + parameters { + string(name: 'MONA_SUFFIX', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? '_IFX' : '_EC', description: 'MonA Suffix') + string(name: 'GIT_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'mestsa003.infineon.com' : 'mestsa07ec.ec.local', description: 'git server') + string(name: 'DEFAULT_FILE_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'messv02ecc1_ec_local' : 'messv02ecc1.ec.local', description: 'Default file server...') + } + stages { + stage('Git') { + steps { + bat(returnStatus: true, script: 'git init') + bat(returnStatus: true, script: 'git remote add origin \\\\' + params.GIT_SERVER + '\\Git\\' + _GitName + '.git') + bat(returnStatus: true, script: 'git pull origin master') + } + } + stage('Setup') { + steps { + script { + _AssemblyName = "${env.JOB_NAME}" + _GitCommitSeven = '1234567' + // _GitCommitSeven = env.GIT_COMMIT.substring(0, 7) + dir(_ProjectDirectory) { + def files = findFiles(glob: '*.csproj') + if (files.length != 1) { + error("Build failed because couldn't find a *.csproj file") + } + echo """ + ${files[0].name} + ${files[0].path} + ${files[0].directory} + ${files[0].length} + ${files[0].lastModified} + """ + _AssemblyName = files[0].name.split('[.]csproj')[0] + } + _TargetLocation = "\\\\${params.DEFAULT_FILE_SERVER}\\EC_EAFRepository\\${env.JENKINS_ENVIRONMENT}\\DeploymentStorage\\Adaptation_${_AssemblyName}" + withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { + dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes") { + _NGINXFile = "C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes/${_AssemblyName}.conf" + def files = findFiles(glob: "${_AssemblyName}.conf") + if (files.length != 1) { + writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_FirstBeforePlus}; }") + } + } + } + } + } + } + stage('Read NGINX') { + steps { + script { + String text = readFile(file: _NGINXFile) + String check = text == null ? _FirstBeforePlus : text.split(';')[0] + String[] segments = check.split(':') + if (segments.length != 3) { + _PortNumber = check + } + else { + _PortNumber = (segments[2].toInteger() + 2).toString() + } + _ExePath = "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}/${_AssemblyName}.exe" + } + } + } + stage('Info') { + steps { + // echo "GIT_URL_N - ${env.GIT_URL_N}" + // echo "BRANCH_NAME ${env.BRANCH_NAME}" + // echo "DEPLOY_VERSION ${env.DEPLOY_VERSION}" + // echo "GIT_AUTHOR_NAME ${env.GIT_AUTHOR_NAME}" + // echo "GIT_LOCAL_BRANCH ${env.GIT_LOCAL_BRANCH}" + // echo "GIT_COMMITTER_EMAIL ${env.GIT_COMMITTER_EMAIL}" + // echo "GIT_PREVIOUS_COMMIT ${env.GIT_PREVIOUS_COMMIT}" + // echo "GIT_PREVIOUS_SUCCESSFUL_COMMIT ${env.GIT_PREVIOUS_SUCCESSFUL_COMMIT}" + echo "_AssemblyName ${_AssemblyName}" // ... + echo "_ExePath ${_ExePath}" // ... + echo "_PortNumber ${_PortNumber}" // ... + echo "BUILD_NUMBER ${env.BUILD_NUMBER}" // 11 + echo "DEFAULT_FILE_SERVER ${params.DEFAULT_FILE_SERVER}" // 11 + echo "GIT_BRANCH ${env.GIT_BRANCH}" // origin/master + echo "GIT_COMMIT ${env.GIT_COMMIT}" // 73b814069f2cf0173a62a8228815a9bc9ba93c41 + echo "GIT_SERVER ${params.GIT_SERVER}" // ... + echo "GIT_URL ${env.GIT_URL}" // D:\ProgramData\Git\....git + echo "JENKINS_ENVIRONMENT ${env.JENKINS_ENVIRONMENT}" // 11 + echo "JENKINS_URL ${env.JENKINS_URL}" // http://localhost:8080/ + echo "JOB_NAME ${env.JOB_NAME}" // ... + echo "WORKSPACE ${env.WORKSPACE}" // D:\.jenkins\_\... + } + } + // stage('Restore') { + // steps { + // bat(returnStatus: true, script: 'dotnet --info') + // } + // } + stage('Safe storage of app secrets') { + steps { + withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { + dir(_ProjectDirectory) { + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'user-secrets init') + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'user-secrets set "Company" "' + _Company + '"') + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'user-secrets set "ServiceUser" "' + username + '"') + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'user-secrets set "BuildNumber" "' + env.BUILD_NUMBER + '"') + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'user-secrets set "GitCommitSeven" "' + _GitCommitSeven + '"') + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'user-secrets set "Server" "' + params.DEFAULT_FILE_SERVER + '"') + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'user-secrets set "URLs" "' + 'http://localhost:' + _PortNumber) + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'user-secrets set "WorkingDirectoryName" "' + _WorkingDirectoryName + '"') + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'user-secrets set "MonARessource" "' + _MonARessource + env.MONA_SUFFIX + '"') + } + } + } + } + // stage('Core Build (packagemanagement.eu.infineon.com)') { + // steps { + // echo "Build number is ${currentBuild.number}" + // dir(_ProjectDirectory) { + // bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + // 'build --runtime win-x64 --self-contained --verbosity quiet --source ' + + // 'https://packagemanagement.eu.infineon.com:4430/api/v2/') + // } + // } + // } + stage('Core Build') { + steps { + echo "Build number is ${currentBuild.number}" + dir(_ProjectDirectory) { + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'build --runtime win-x64 --self-contained --verbosity quiet') + } + } + } + stage('Commit Id') { + steps { + dir(_ProjectDirectory) { + writeFile(file: 'bin/Debug/' + _NetVersion + "/win-x64/${env.GIT_COMMIT}-${env.BUILD_NUMBER}.txt", text: "${env.GIT_URL}") + } + } + } + // stage('Test') { + // options { + // timeout(time: 10, unit: 'MINUTES') + // } + // steps { + // dir(_ProjectDirectory) { + // bat('dotnet --info') + // } + // } + // } + // stage('Version') { + // steps { + // bat('dotnet --info') + // } + // } + stage('Package') { + steps { + dir(_ProjectDirectory) { + fileOperations([fileZipOperation(folderPath: 'bin/Debug/' + _NetVersion + '/win-x64', outputFolderPath: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-Debug")]) + fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*", renameFiles: false, sourceCaptureExpression: '', targetLocation: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-Debug", targetNameExpression: '')]) + } + } + } + stage('Publish') { + steps { + dir(_ProjectDirectory) { + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'remove reference "../Client/' + env.JOB_NAME + '.Client.csproj"') + bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + + 'publish --configuration Release --runtime win-x64 --verbosity quiet ' + + "--self-contained true --p:Version=6.0.202-${_GitCommitSeven}-${env.BUILD_NUMBER} -o " + + '"' + "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}" + '"') + } + } + } + stage('Service') { + steps { + withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { + bat(returnStatus: true, script: 'sc create "' + "${env.JOB_NAME}-${_PortNumber}" + '" ' + + 'start= delayed-auto DisplayName="' + "${env.JOB_NAME}-${_PortNumber}" + '" ' + + 'binPath= "' + _ExePath + '" ' + + 'obj= "' + "${env.USERDOMAIN}\\${username}" + '" password= "' + password + '"') + bat(returnStatus: true, script: 'sc start "' + "${env.JOB_NAME}-${_PortNumber}" + '"') + } + } + } + stage('Upadate NGINX') { + steps { + writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_PortNumber}; }") + } + } + stage('NGINX Test and Reload') { + steps { + withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { + dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1") { + script { + int returnStatus = bat(returnStatus: true, script: 'nginx.exe -t') + println("returnStatus ################ ${returnStatus} ####################") + if (returnStatus == 0) { + bat(returnStatus: true, script: 'nginx.exe -s reload') + } + } + } + } + } + } + // stage('Force Fail') { + // steps { + // error("Build failed because of this and that..") + // } + // } + // stage('Copy Files to: file-share') { + // steps { + // dir(_ProjectDirectory + '/bin/Debug/' + _NetVersion + '/win-x64') { + // fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.txt", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) + // fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.dll", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) + // fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.exe", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) + // fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.pdb", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) + // } + // } + // } + } + post { + always { + dir(_ProjectDirectory + '/bin') { + deleteDir() + } + dir(_ProjectDirectory + '/obj') { + deleteDir() + } + // cleanWs() + } + } +} diff --git a/EDA Viewer/.vscode/format-report.json b/EDA Viewer/.vscode/format-report.json new file mode 100644 index 0000000..30ff645 --- /dev/null +++ b/EDA Viewer/.vscode/format-report.json @@ -0,0 +1,20 @@ +[ + { + "DocumentId": { + "ProjectId": { + "Id": "1c39e10e-5359-42ab-be77-db59c291586c" + }, + "Id": "81852d1e-25b8-4230-9e00-0399608db1e6" + }, + "FileName": "Background.cshtml.cs", + "FilePath": "G:\\Mesa_FI\\EDA-Viewer\\EDA Viewer\\Pages\\Background.cshtml.cs", + "FileChanges": [ + { + "LineNumber": 1, + "CharNumber": 1, + "DiagnosticId": "IMPORTS", + "FormatDescription": "Fix imports ordering." + } + ] + } +] \ No newline at end of file diff --git a/EDA Viewer/.vscode/launch.json b/EDA Viewer/.vscode/launch.json new file mode 100644 index 0000000..cf1e333 --- /dev/null +++ b/EDA Viewer/.vscode/launch.json @@ -0,0 +1,33 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + "program": "${workspaceFolder}/bin/Debug/net6.0/win-x64/EDA Viewer.dll", + "args": [], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + "serverReadyAction": { + "action": "openExternally", + "pattern": "\\bNow listening on:\\s+(https?://\\S+)" + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/EDA Viewer/.vscode/tasks.json b/EDA Viewer/.vscode/tasks.json new file mode 100644 index 0000000..2f27760 --- /dev/null +++ b/EDA Viewer/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/EDA Viewer.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/EDA Viewer.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/EDA Viewer.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/EDA Viewer/Blazor/Counter.razor b/EDA Viewer/Blazor/Counter.razor deleted file mode 100644 index ee23e7a..0000000 --- a/EDA Viewer/Blazor/Counter.razor +++ /dev/null @@ -1,16 +0,0 @@ -

Counter

- -

- Current Count: @i -

- - - -@code { - int i = 0; - - private void IncrementCounter() - { - i += 1; - } -} diff --git a/EDA Viewer/Controllers/HomeController.cs b/EDA Viewer/Controllers/HomeController.cs deleted file mode 100644 index cdd721b..0000000 --- a/EDA Viewer/Controllers/HomeController.cs +++ /dev/null @@ -1,167 +0,0 @@ -using EDAViewer.Models; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Rendering; -using Microsoft.Extensions.Logging; -using Shared; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Web; - -namespace EDAViewer.Controllers -{ - - public class HomeController : Controller, IHomeController - { - - private readonly Log _Log; - private readonly AppSettings _AppSettings; - private readonly IsEnvironment _IsEnvironment; - private readonly Singleton.IBackground _Background; - - public HomeController(ILogger logger, IsEnvironment isEnvironment, Singleton.IBackground background, AppSettings appSettings) - { - _Log = new Log(logger); - _Background = background; - _AppSettings = appSettings; - _IsEnvironment = isEnvironment; - } - - public IActionResult Index() - { - return View(); - } - - public IActionResult Privacy() - { - return View(); - } - - [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] - public IActionResult Error() - { - return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); - } - - public IActionResult Encode(string value = null) - { - string result = string.Empty; - if (!string.IsNullOrEmpty(value)) - result = HttpUtility.UrlEncode(value); - return Content(result, "text/plain"); - } - - public IActionResult Background(bool? message_clear = null, bool? exceptions_clear = null, bool? set_is_primary_instance = null, int? invoke_eda_dcp = null) - { - _Background.SendStatusOk(); - if (message_clear.HasValue && message_clear.Value) - _Background.ClearMessage(); - if (exceptions_clear.HasValue && exceptions_clear.Value) - _Background.Exceptions.Clear(); - if (set_is_primary_instance.HasValue) - { - if (set_is_primary_instance.Value) - _Background.SetIsPrimaryInstance(); - else - _Background.ClearIsPrimaryInstance(); - } - string message; - if (string.IsNullOrWhiteSpace(_Background.Message)) - message = "N/A"; - else - message = _Background.Message; - //Response.AppendToLog(_Background.Message); - List exceptions = new(); - foreach (Exception exception in _Background.Exceptions) - exceptions.Add(exception); - ViewBag.Message = message; - ViewBag.Exceptions = exceptions; - ViewBag.URLs = _AppSettings.URLs; - ViewBag.Profile = _IsEnvironment.Profile; - ViewBag.WorkingDirectory = _Background.WorkingDirectory; - ViewBag.IsPrimaryInstance = _Background.IsPrimaryInstance(); - ViewBag.ExceptionsCount = string.Concat("Exception(s) - ", exceptions.Count); - return View(); - } - - public ActionResult> GetDirectoriesOrFiles(string path = null, bool? upDirectory = null, string filter = null) - { - List results = new(); - //System.Threading.Thread.Sleep(1500); - //path = @"D:\Tmp"; - if (string.IsNullOrEmpty(path)) - path = string.Concat(@"\\", _AppSettings.Server, @"\EC_EDA"); - if (string.IsNullOrEmpty(filter)) - filter = "*"; - if (upDirectory.HasValue && upDirectory.Value && path.Contains('|')) - { - string[] segments = path.Split('|'); - path = segments[^1]; - } - //System.IO.File.AppendAllText(string.Concat(@"\\", _AppSettings.Server, @"\EC_EDA\a.txt"), path); - string gold = "Gold"; - if (System.IO.File.Exists(path)) - { - string[] files = Directory.GetFiles(Path.GetDirectoryName(path), filter, SearchOption.TopDirectoryOnly); - foreach (string item in files) - results.Add(new SelectListItem() { Value = item, Text = Path.GetFileName(item), Group = new SelectListGroup() { Name = "File(s)" } }); - if (results.Count > 1) - results.Insert(0, new SelectListItem() { Value = string.Empty, Text = string.Concat("Select - ", 0, " - ", files.Length) }); - } - else if (Directory.Exists(path)) - { - string[] files = Directory.GetFiles(path, filter, SearchOption.TopDirectoryOnly); - string[] directories = Directory.GetDirectories(path, filter, SearchOption.TopDirectoryOnly).Where(l => Path.GetFileName(l) != gold).ToArray(); - for (short i = 0; i < short.MaxValue; i++) - { - if (directories.Length != 1 || files.Length != 0) - break; - else - { - path = directories[0]; - files = Directory.GetFiles(path, filter, SearchOption.TopDirectoryOnly); - directories = Directory.GetDirectories(path, filter, SearchOption.TopDirectoryOnly).Where(l => Path.GetFileName(l) != gold).ToArray(); - if (directories.Length == 0 && files.Length == 0) - { - directories = new string[] { path }; - break; - } - } - } - foreach (string item in directories) - results.Add(new SelectListItem() { Value = item, Text = Path.GetFileName(item), Group = new SelectListGroup() { Name = "Directorie(s)" } }); - foreach (string item in files) - results.Add(new SelectListItem() { Value = item, Text = Path.GetFileName(item), Group = new SelectListGroup() { Name = "File(s)" } }); - if (results.Count > 1) - results.Insert(0, new SelectListItem() { Value = string.Empty, Text = string.Concat("Select - ", directories.Length, " - ", files.Length) }); - } - //System.IO.File.AppendAllText(string.Concat(@"\\", _AppSettings.Server, @"\EC_EDA\b.txt"), results.Count.ToString()); - if (!results.Any()) - results.Add(new SelectListItem() { Value = path, Text = string.Concat("Nothing Found *{", path, "}") }); - return results; - } - - public IActionResult ViewEdaHtmlDiff(WithEnvironment withEnvironment = null) - { - if (withEnvironment is null) - withEnvironment = new WithEnvironment(); - string path = string.Concat(@"\\", _AppSettings.Server, @"\EC_EDA"); - if (!Directory.Exists(path)) - path = @"C:\"; - EdaHtmlDiff model = new(withEnvironment, path); - ViewBag.message = model.message; - return View(model); - } - - } - -} -// dotnet publish --configuration Release --runtime win-x64 --verbosity normal --self-contained true -o "L:\net5.0\EDAViewer" -// dotnet publish --configuration Release --runtime win-x64 --verbosity normal --self-contained true -o "D:\net5.0\EDAViewer" -// dotnet publish --configuration Release --runtime win-x64 --verbosity normal --self-contained true -o "D:\.jenkins\publish\manual-Mesa-0\EDAViewer" -//http://eaf-dev.mes.infineon.com:8080/job/Mesa/buildWithParameters?token=DotnetRules&projectName=EDA%20Viewer -//http://eaf-prod.mes.infineon.com:8080/job/Mesa/buildWithParameters?token=DotnetRules&projectName=EDA%20Viewer -//sc create EDAViewer_5003 binPath="D:\.jenkins\publish\manual-Mesa-0\EDAViewer\EDA Viewer.exe" \ No newline at end of file diff --git a/EDA Viewer/EDA Viewer.csproj b/EDA Viewer/EDA Viewer.csproj index 3678b76..4d49b32 100644 --- a/EDA Viewer/EDA Viewer.csproj +++ b/EDA Viewer/EDA Viewer.csproj @@ -6,11 +6,16 @@ SAK - 9.0 - net6.0 - EDAViewer OutOfProcess - d71a673c-be39-45b5-ae5f-4c22639be045 + enable + false + 10.0 + enable + EDAViewer + win-x64 + net6.0 + + true true true @@ -26,24 +31,18 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + diff --git a/EDA Viewer/GlobalSuppressions.cs b/EDA Viewer/GlobalSuppressions.cs deleted file mode 100644 index 40157e5..0000000 --- a/EDA Viewer/GlobalSuppressions.cs +++ /dev/null @@ -1,10 +0,0 @@ -// This file is used by Code Analysis to maintain SuppressMessage -// attributes that are applied to this project. -// Project-level suppressions either have no target or are given -// a specific target and scoped to a namespace, type, member, etc. - -using System.Diagnostics.CodeAnalysis; -[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~P:EDAViewer.Models.WithEnvironment.message")] -[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~P:EDAViewer.Models.WithEnvironment.now_ticks")] -[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~P:EDAViewer.Models.WithEnvironment.user_name")] -[assembly: SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "", Scope = "member", Target = "~P:EDAViewer.Models.WithEnvironment.machine_name")] \ No newline at end of file diff --git a/EDA Viewer/HostedService/TimedHostedService.cs b/EDA Viewer/HostedService/TimedHostedService.cs index 85aa0a1..5c8c474 100644 --- a/EDA Viewer/HostedService/TimedHostedService.cs +++ b/EDA Viewer/HostedService/TimedHostedService.cs @@ -1,174 +1,171 @@ +using EDAViewer.Models.Methods; +using EDAViewer.Models.Stateless; +using EDAViewer.Models.Stateless.Methods; using EDAViewer.Singleton; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Shared; -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; +using IFX.Shared; +using Serilog.Context; -namespace EDAViewer.HostedService +namespace EDAViewer.HostedService; + +public class TimedHostedService : IHostedService, IDisposable { - public class TimedHostedService : IHostedService, IDisposable + private readonly Timer _EDAOutputArchiveTimer; + private readonly Timer _LogPathCleanUpByWeekTimer; + private readonly Timer _EdaDataCollectionPlansTimer; + + private readonly int _ExecutionCount; + private readonly Serilog.ILogger _Log; + private readonly IsEnvironment _IsEnvironment; + private readonly IBackground _BackgroundMethods; + private readonly Models.Properties.IBackground _Background; + + public TimedHostedService(IsEnvironment isEnvironment, Background background) { + _ExecutionCount = 0; + _Background = background; + _IsEnvironment = isEnvironment; + _BackgroundMethods = background; + _Log = Serilog.Log.ForContext(); + _EDAOutputArchiveTimer = new Timer(EDAOutputArchiveCallback, null, Timeout.Infinite, Timeout.Infinite); + _LogPathCleanUpByWeekTimer = new Timer(LogPathCleanUpByWeekCallback, null, Timeout.Infinite, Timeout.Infinite); + _EdaDataCollectionPlansTimer = new Timer(EdaDataCollectionPlansCallback, null, Timeout.Infinite, Timeout.Infinite); + } - private readonly int _ExecutionCount; - private readonly Background _Background; - private readonly IsEnvironment _IsEnvironment; - private readonly ILogger _Log; - - private Timer _EDAOutputArchiveTimer; - private Timer _LogPathCleanUpByWeekTimer; - private Timer _EdaDataCollectionPlansTimer; - - public TimedHostedService(IsEnvironment isEnvironment, Background background, IServiceProvider serviceProvider) + public Task StartAsync(CancellationToken stoppingToken) + { + string? methodName = IMethodName.GetActualAsyncMethodName(); + using (LogContext.PushProperty("MethodName", methodName)) { - _ExecutionCount = 0; - _Background = background; - _IsEnvironment = isEnvironment; - _Log = serviceProvider.GetRequiredService>(); - _EDAOutputArchiveTimer = new Timer(EDAOutputArchiveCallback, null, Timeout.Infinite, Timeout.Infinite); - _LogPathCleanUpByWeekTimer = new Timer(LogPathCleanUpByWeekCallback, null, Timeout.Infinite, Timeout.Infinite); - _EdaDataCollectionPlansTimer = new Timer(EdaDataCollectionPlansCallback, null, Timeout.Infinite, Timeout.Infinite); - } - - public Task StartAsync(CancellationToken stoppingToken) - { - _Log.LogInformation(string.Concat("Timed Hosted Service: ", nameof(Background), ":", _IsEnvironment.Profile, ":", Environment.ProcessId, " running.")); - _Background.Update(_Log); + _Log.Info(string.Concat("Timed Hosted Service: ", _IsEnvironment.Profile, ":", Environment.ProcessId, " running.")); + int milliSeconds = 3000; if (_IsEnvironment.Development) { - int milliSeconds = 3000; - _EdaDataCollectionPlansTimer.Change(milliSeconds, Timeout.Infinite); - ; + _BackgroundMethods.Update(milliSeconds); + _ = _EdaDataCollectionPlansTimer.Change(milliSeconds, Timeout.Infinite); _Background.Timers.Add(_EdaDataCollectionPlansTimer); milliSeconds += 2000; } else if (_IsEnvironment.Staging) { - int milliSeconds = 3000; - _LogPathCleanUpByWeekTimer.Change(milliSeconds, Timeout.Infinite); - ; - _Background.Timers.Add(_LogPathCleanUpByWeekTimer); - milliSeconds += 2000; - _EdaDataCollectionPlansTimer.Change(milliSeconds, Timeout.Infinite); - ; + _BackgroundMethods.Update(milliSeconds); + _ = _EdaDataCollectionPlansTimer.Change(milliSeconds, Timeout.Infinite); _Background.Timers.Add(_EdaDataCollectionPlansTimer); milliSeconds += 2000; - _EDAOutputArchiveTimer.Change(milliSeconds, Timeout.Infinite); - ; + _ = _EDAOutputArchiveTimer.Change(milliSeconds, Timeout.Infinite); _Background.Timers.Add(_EDAOutputArchiveTimer); milliSeconds += 2000; + _ = _LogPathCleanUpByWeekTimer.Change(milliSeconds, Timeout.Infinite); + _Background.Timers.Add(_LogPathCleanUpByWeekTimer); + milliSeconds += 2000; } else if (_IsEnvironment.Production) { - int milliSeconds = 3000; - _LogPathCleanUpByWeekTimer.Change(milliSeconds, Timeout.Infinite); - ; - _Background.Timers.Add(_LogPathCleanUpByWeekTimer); - milliSeconds += 2000; - _EdaDataCollectionPlansTimer.Change(milliSeconds, Timeout.Infinite); - ; + _BackgroundMethods.Update(milliSeconds); + _ = _EdaDataCollectionPlansTimer.Change(milliSeconds, Timeout.Infinite); _Background.Timers.Add(_EdaDataCollectionPlansTimer); milliSeconds += 2000; - _EDAOutputArchiveTimer.Change(milliSeconds, Timeout.Infinite); - ; + _ = _EDAOutputArchiveTimer.Change(milliSeconds, Timeout.Infinite); _Background.Timers.Add(_EDAOutputArchiveTimer); milliSeconds += 2000; + _ = _LogPathCleanUpByWeekTimer.Change(milliSeconds, Timeout.Infinite); + _Background.Timers.Add(_LogPathCleanUpByWeekTimer); + milliSeconds += 2000; } else throw new Exception(); if (_IsEnvironment.Staging || _IsEnvironment.Production) { - string countDirectory = _Background.GetCountDirectory("Start"); - string checkDirectory = Path.GetPathRoot(countDirectory); + string countDirectory = _BackgroundMethods.GetCountDirectory("Start"); + string? checkDirectory = Path.GetPathRoot(countDirectory); if (Directory.Exists(checkDirectory)) - Directory.CreateDirectory(countDirectory); + _ = Directory.CreateDirectory(countDirectory); } - return Task.CompletedTask; } + return Task.CompletedTask; + } - public Task StopAsync(CancellationToken stoppingToken) + public Task StopAsync(CancellationToken stoppingToken) + { + string? methodName = IMethodName.GetActualAsyncMethodName(); + using (LogContext.PushProperty("MethodName", methodName)) { - _Log.LogInformation(string.Concat("Timed Hosted Service: ", nameof(Background), ":", _IsEnvironment.Profile, ":", Environment.ProcessId, " is stopping.")); - _Background.Stop(immediate: true); + _Log.Info(string.Concat("Timed Hosted Service: ", _IsEnvironment.Profile, ":", Environment.ProcessId, " is stopping.")); + _BackgroundMethods.Stop(immediate: true); for (short i = 0; i < short.MaxValue; i++) { Thread.Sleep(500); if (_ExecutionCount == 0) break; } - return Task.CompletedTask; } + return Task.CompletedTask; + } - public void Dispose() + public void Dispose() + { + _BackgroundMethods.Dispose(); + GC.SuppressFinalize(this); + } + + private void LogPathCleanUpByWeekCallback(object? state) + { + try { - _Background.Dispose(); + if (!_BackgroundMethods.IsPrimaryInstance()) + _BackgroundMethods.LogPathCleanUpByWeekCallback(); } - - private void LogPathCleanUpByWeekCallback(object state) + catch (Exception e) { _Log.Error(e, "Error: "); } + try { - try - { - if (_Background.IsPrimaryInstance()) - _Background.LogPathCleanUpByWeekCallback(); - } - catch (Exception e) { _Background.Catch(e); } - try - { - TimeSpan timeSpan; - if (!_Background.IsPrimaryInstance()) - timeSpan = new TimeSpan(DateTime.Now.AddSeconds(15).Ticks - DateTime.Now.Ticks); - else - timeSpan = new TimeSpan(DateTime.Now.AddHours(6).Ticks - DateTime.Now.Ticks); - _LogPathCleanUpByWeekTimer.Change((int)timeSpan.TotalMilliseconds, Timeout.Infinite); - } - catch (Exception e) { _Background.Catch(e); } + TimeSpan timeSpan; + if (!_BackgroundMethods.IsPrimaryInstance()) + timeSpan = new TimeSpan(DateTime.Now.AddSeconds(15).Ticks - DateTime.Now.Ticks); + else + timeSpan = new TimeSpan(DateTime.Now.AddHours(6).Ticks - DateTime.Now.Ticks); + _ = _LogPathCleanUpByWeekTimer.Change((int)timeSpan.TotalMilliseconds, Timeout.Infinite); } + catch (Exception e) { _Log.Error(e, "Error: "); } + } - private void EDAOutputArchiveCallback(object state) + private void EDAOutputArchiveCallback(object? state) + { + try { - try - { - if (_Background.IsPrimaryInstance()) - _Background.EDAOutputArchiveCallback(); - } - catch (Exception e) { _Background.Catch(e); } - try - { - TimeSpan timeSpan; - if (!_Background.IsPrimaryInstance()) - timeSpan = new TimeSpan(DateTime.Now.AddSeconds(15).Ticks - DateTime.Now.Ticks); - else - timeSpan = new TimeSpan(DateTime.Now.AddHours(6).Ticks - DateTime.Now.Ticks); - _EDAOutputArchiveTimer.Change((int)timeSpan.TotalMilliseconds, Timeout.Infinite); - } - catch (Exception e) { _Background.Catch(e); } + if (!_BackgroundMethods.IsPrimaryInstance()) + _BackgroundMethods.EDAOutputArchiveCallback(); } - - private void EdaDataCollectionPlansCallback(object state) + catch (Exception e) { _Log.Error(e, "Error: "); } + try { - try - { - if (_Background.IsPrimaryInstance()) - _Background.EdaDataCollectionPlansCallback(); - } - catch (Exception e) { _Background.Catch(e); } - try - { - TimeSpan timeSpan; - if (!_Background.IsPrimaryInstance()) - timeSpan = new TimeSpan(DateTime.Now.AddSeconds(15).Ticks - DateTime.Now.Ticks); - else - timeSpan = new TimeSpan(DateTime.Now.AddHours(2).Ticks - DateTime.Now.Ticks); - _EdaDataCollectionPlansTimer.Change((int)timeSpan.TotalMilliseconds, Timeout.Infinite); - } - catch (Exception e) { _Background.Catch(e); } + TimeSpan timeSpan; + if (!_BackgroundMethods.IsPrimaryInstance()) + timeSpan = new TimeSpan(DateTime.Now.AddSeconds(15).Ticks - DateTime.Now.Ticks); + else + timeSpan = new TimeSpan(DateTime.Now.AddHours(6).Ticks - DateTime.Now.Ticks); + _ = _EDAOutputArchiveTimer.Change((int)timeSpan.TotalMilliseconds, Timeout.Infinite); } + catch (Exception e) { _Log.Error(e, "Error: "); } + } - + private void EdaDataCollectionPlansCallback(object? state) + { + try + { + if (!_BackgroundMethods.IsPrimaryInstance()) + _BackgroundMethods.EdaDataCollectionPlansCallback(); + } + catch (Exception e) { _Log.Error(e, "Error: "); } + try + { + TimeSpan timeSpan; + if (!_BackgroundMethods.IsPrimaryInstance()) + timeSpan = new TimeSpan(DateTime.Now.AddSeconds(15).Ticks - DateTime.Now.Ticks); + else + timeSpan = new TimeSpan(DateTime.Now.AddHours(2).Ticks - DateTime.Now.Ticks); + _ = _EdaDataCollectionPlansTimer.Change((int)timeSpan.TotalMilliseconds, Timeout.Infinite); + } + catch (Exception e) { _Log.Error(e, "Error: "); } } } \ No newline at end of file diff --git a/EDA Viewer/IFX/Shared/IsEnvironment.cs b/EDA Viewer/IFX/Shared/IsEnvironment.cs new file mode 100644 index 0000000..93b802f --- /dev/null +++ b/EDA Viewer/IFX/Shared/IsEnvironment.cs @@ -0,0 +1,167 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace IFX.Shared; + +public class IsEnvironment +{ + + public enum Name + { + LinuxDevelopment, + LinuxProduction, + LinuxStaging, + OSXDevelopment, + OSXProduction, + OSXStaging, + WindowsDevelopment, + WindowsProduction, + WindowsStaging + } + + public bool DebuggerWasAttachedDuringConstructor { get; private set; } + public bool Development { get; private set; } + public bool Linux { get; private set; } + public bool OSX { get; private set; } + public bool Production { get; private set; } + public bool Staging { get; private set; } + public bool Windows { get; private set; } + public string Profile { get; private set; } + public string AppSettingsFileName { get; private set; } + public string? ASPNetCoreEnvironment { get; private set; } + + public IsEnvironment(string testCategory) + { + if (testCategory.EndsWith(".json")) + { + Production = testCategory == "appsettings.json"; + Staging = testCategory.EndsWith(nameof(Staging)); + OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + Development = testCategory.EndsWith(nameof(Development)); + Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; + Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + } + else + { + DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; + OSX = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(OSX)); + ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + Linux = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Linux)); + Staging = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Staging)); + Windows = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Windows)); + Production = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Production)); + Development = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Development)); + } + Profile = GetProfile(); + AppSettingsFileName = GetAppSettingsFileName(processesCount: null); + } + + public IsEnvironment(bool isDevelopment, bool isStaging, bool isProduction) + { + Staging = isStaging; + Production = isProduction; + Development = isDevelopment; + OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; + Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + Profile = GetProfile(); + AppSettingsFileName = GetAppSettingsFileName(processesCount: null); + } + + public IsEnvironment(int? processesCount, bool nullASPNetCoreEnvironmentIsDevelopment, bool nullASPNetCoreEnvironmentIsProduction) + { + OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; + Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); + if (nullASPNetCoreEnvironmentIsDevelopment && nullASPNetCoreEnvironmentIsProduction) + throw new Exception(); + else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsProduction) + Production = true; + else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsDevelopment) + Development = true; + else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && !nullASPNetCoreEnvironmentIsDevelopment && !nullASPNetCoreEnvironmentIsProduction) + throw new Exception(); + else + { + Staging = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Staging)); + Production = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Production)); + Development = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Development)); + } + Profile = GetProfile(); + AppSettingsFileName = GetAppSettingsFileName(processesCount); + } + + private string GetProfile() + { + string result; + if (Windows && Production) + result = nameof(Production); + else if (Windows && Staging) + result = nameof(Staging); + else if (Windows && Development) + result = nameof(Development); + else if (Linux && Production) + result = nameof(Name.LinuxProduction); + else if (Linux && Staging) + result = nameof(Name.LinuxStaging); + else if (Linux && Development) + result = nameof(Name.LinuxDevelopment); + else if (OSX && Production) + result = nameof(Name.OSXProduction); + else if (OSX && Staging) + result = nameof(Name.OSXStaging); + else if (OSX && Development) + result = nameof(Name.OSXDevelopment); + else + throw new Exception(); + return result; + } + + private string GetAppSettingsFileName(int? processesCount) + { + string result; + if (Production) + { + if (processesCount is null) + result = "appsettings.json"; + else + result = $"appsettings.{processesCount}.json"; + } + else + { + string environment; + if (Staging) + environment = nameof(Staging); + else if (Development) + environment = nameof(Development); + else + throw new Exception(); + if (processesCount is null) + result = $"appsettings.{environment}.json"; + else + result = $"appsettings.{environment}.{processesCount}.json"; + } + return result; + } + + public static string GetEnvironmentName(IsEnvironment isEnvironment) + { + string result; + if (isEnvironment.Windows) + result = nameof(Windows); + else if (isEnvironment.Linux) + result = nameof(Linux); + else if (isEnvironment.OSX) + result = nameof(OSX); + else + throw new Exception(); + return result; + } + +} \ No newline at end of file diff --git a/EDA Viewer/IFX/Shared/RijndaelEncryption.cs b/EDA Viewer/IFX/Shared/RijndaelEncryption.cs new file mode 100644 index 0000000..1ebbf72 --- /dev/null +++ b/EDA Viewer/IFX/Shared/RijndaelEncryption.cs @@ -0,0 +1,93 @@ +#pragma warning disable SYSLIB0022 + +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; + +namespace IFX.Shared; + +public static class RijndaelEncryption +{ + /// + /// Change the Inputkey GUID when you use this code in your own program. + /// Keep this inputkey very safe and prevent someone from decoding it some way!! + /// Generated 2021-08-10 + /// + internal const string _Inputkey = "970CCEF6-4307-4F6A-9AC8-377DADB889BD"; + + /// + /// Encrypt the given text and give the byte array back as a BASE64 string + /// + /// The text to encrypt + /// The pasword salt + /// The encrypted text + public static string Encrypt(string text, string salt) + { + string result; + if (string.IsNullOrEmpty(text)) + throw new ArgumentNullException(nameof(text)); + RijndaelManaged aesAlg = NewRijndaelManaged(salt); + ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); + MemoryStream msEncrypt = new(); + using (CryptoStream csEncrypt = new(msEncrypt, encryptor, CryptoStreamMode.Write)) + using (StreamWriter swEncrypt = new(csEncrypt)) + swEncrypt.Write(text); + result = Convert.ToBase64String(msEncrypt.ToArray()); + return result; + } + + /// + /// Checks if a string is base64 encoded + /// + /// The base64 encoded string + /// + public static bool IsBase64String(string base64String) + { + bool result; + base64String = base64String.Trim(); + result = (base64String.Length % 4 == 0) && Regex.IsMatch(base64String, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None); + return result; + } + + /// + /// Decrypts the given text + /// + /// The encrypted BASE64 text + /// The pasword salt + /// De gedecrypte text + public static string Decrypt(string cipherText, string salt) + { + if (string.IsNullOrEmpty(cipherText)) + throw new ArgumentNullException(nameof(cipherText)); + if (!IsBase64String(cipherText)) + throw new Exception("The cipherText input parameter is not base64 encoded"); + string text; + RijndaelManaged aesAlg = NewRijndaelManaged(salt); + ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); + byte[] cipher = Convert.FromBase64String(cipherText); + using (MemoryStream msDecrypt = new(cipher)) + { + using CryptoStream csDecrypt = new(msDecrypt, decryptor, CryptoStreamMode.Read); + using StreamReader srDecrypt = new(csDecrypt); + text = srDecrypt.ReadToEnd(); + } + return text; + } + + /// + /// Create a new RijndaelManaged class and initialize it + /// + /// The pasword salt + /// + private static RijndaelManaged NewRijndaelManaged(string salt) + { + if (salt == null) + throw new ArgumentNullException(nameof(salt)); + byte[] saltBytes = Encoding.ASCII.GetBytes(salt); + Rfc2898DeriveBytes key = new(_Inputkey, saltBytes); + RijndaelManaged aesAlg = new(); + aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8); + aesAlg.IV = key.GetBytes(aesAlg.BlockSize / 8); + return aesAlg; + } +} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Core/AutoGenerated/BackboneComponent.cs b/EDA Viewer/Library/Eaf/Core/AutoGenerated/BackboneComponent.cs deleted file mode 100644 index 02f026c..0000000 --- a/EDA Viewer/Library/Eaf/Core/AutoGenerated/BackboneComponent.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.Core -{ - public class BackboneComponent - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Core/AutoGenerated/BackboneStatusCache.cs b/EDA Viewer/Library/Eaf/Core/AutoGenerated/BackboneStatusCache.cs deleted file mode 100644 index 3f03747..0000000 --- a/EDA Viewer/Library/Eaf/Core/AutoGenerated/BackboneStatusCache.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.Core -{ - public class BackboneStatusCache - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs b/EDA Viewer/Library/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs deleted file mode 100644 index d8de627..0000000 --- a/EDA Viewer/Library/Eaf/Core/AutoGenerated/ILoggingSetupManager.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.Core -{ - public interface ILoggingSetupManager - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Core/AutoGenerated/StatusItem.cs b/EDA Viewer/Library/Eaf/Core/AutoGenerated/StatusItem.cs deleted file mode 100644 index c895fc2..0000000 --- a/EDA Viewer/Library/Eaf/Core/AutoGenerated/StatusItem.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.Core -{ - public class StatusItem - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Core/Backbone.cs b/EDA Viewer/Library/Eaf/Core/Backbone.cs deleted file mode 100644 index 845b46b..0000000 --- a/EDA Viewer/Library/Eaf/Core/Backbone.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Library.PeerGroup.GCL.Annotations; -using System; -using System.Collections.Generic; - -namespace Library.Eaf.Core -{ - public class Backbone - { - public const string STATE_ERROR = "Error"; - public const string STATE_OFFLINE = "Offline"; - public const string STATE_RUNNING = "Running"; - public const string STATE_SHUTDOWN = "Shutting Down"; - public const string STATE_STARTING = "Starting"; - - protected Backbone() { } - - [NotNull] - public static Backbone Instance { get; } - [NotNull] - public ILoggingSetupManager LoggingConfigurationManager { get; set; } - public BackboneStatusCache Status { get; } - public bool IsAutomatedRestartActive { get; } - public bool IsReadyForRestart { get; } - public string StartTime { get; } - public string State { get; } - public string Name { get; } - public string ConfigurationServiceAddress { get; } - public string CellName { get; } - protected bool IsInitialized { get; set; } - protected Dictionary BackboneComponents { get; } - - public void AddBackboneComponent(BackboneComponent backboneComponent) { } - public bool ContainsBackboneComponent(string id) { throw new NotImplementedException(); } - [Obsolete("Use the capabilities exposed via the Status property -> GetAll. Will be removed with next major release.")] - public List GetAllStatuses() { throw new NotImplementedException(); } - public BackboneComponent GetBackboneComponentById(string id) { throw new NotImplementedException(); } - public List GetBackboneComponentsOfType() { throw new NotImplementedException(); } - public List GetBackboneComponentsOfType(Type type) { throw new NotImplementedException(); } - public void RegisterSubprocess(int pid) { } - [Obsolete("Use the capabilities exposed via the Status property -> SetValue. Will be removed with next major release.")] - public void SetStatus(string statusName, string statusValue) { } - [Obsolete("Use the capabilities exposed via the Status property -> SetValue. Will be removed with next major release.")] - public void SetStatus(BackboneComponent source, string statusName, string statusValue) { } - protected void CloseConnectionOfComponents(List components) { } - protected virtual void StopAllComponents() { } - protected void StopComponents(List components) { } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Core/Smtp/EmailMessage.cs b/EDA Viewer/Library/Eaf/Core/Smtp/EmailMessage.cs deleted file mode 100644 index c727cd5..0000000 --- a/EDA Viewer/Library/Eaf/Core/Smtp/EmailMessage.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -namespace Library.Eaf.Core.Smtp -{ - - public class EmailMessage - { - public EmailMessage() { } - public EmailMessage(string subject, string body, MailPriority priority = MailPriority.Normal) { } - - public string Body { get; } - public MailPriority Priority { get; } - public string Subject { get; } - - public EmailMessage PriorityHigh() { throw new NotImplementedException(); } - public EmailMessage PriorityLow() { throw new NotImplementedException(); } - public EmailMessage PriorityNormal() { throw new NotImplementedException(); } - public EmailMessage SetBody(string body) { throw new NotImplementedException(); } - public EmailMessage SetPriority(MailPriority priority) { throw new NotImplementedException(); } - public EmailMessage SetSubject(string subject) { throw new NotImplementedException(); } - - } - -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Core/Smtp/ISmtp.cs b/EDA Viewer/Library/Eaf/Core/Smtp/ISmtp.cs deleted file mode 100644 index d7604c3..0000000 --- a/EDA Viewer/Library/Eaf/Core/Smtp/ISmtp.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Library.Eaf.Core.Smtp -{ - - public interface ISmtp - { - void Send(EmailMessage message); - } - -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Core/Smtp/MailPriority.cs b/EDA Viewer/Library/Eaf/Core/Smtp/MailPriority.cs deleted file mode 100644 index e6d37a0..0000000 --- a/EDA Viewer/Library/Eaf/Core/Smtp/MailPriority.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Library.Eaf.Core.Smtp -{ - - public enum MailPriority - { - Low = 0, - Normal = 1, - High = 2 - } - -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs deleted file mode 100644 index 869066d..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/ChangeDataCollectionHandler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public class ChangeDataCollectionHandler - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs deleted file mode 100644 index e901799..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/DataCollectionRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public class DataCollectionRequest - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs deleted file mode 100644 index 9a2dea9..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentEvent.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public class EquipmentEvent - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs deleted file mode 100644 index 6542474..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentException.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public class EquipmentException - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs deleted file mode 100644 index c325af1..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/EquipmentSelfDescription.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public class EquipmentSelfDescription - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs deleted file mode 100644 index 385ef82..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/GetParameterValuesHandler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public class GetParameterValuesHandler - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs deleted file mode 100644 index b346524..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IConnectionControl.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public interface IConnectionControl - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs deleted file mode 100644 index 3e73a9d..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IDataTracingHandler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public interface IDataTracingHandler - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs deleted file mode 100644 index d00a9ce..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentCommandService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public interface IEquipmentCommandService - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs deleted file mode 100644 index 647d1ec..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentControl.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Library.PeerGroup.GCL.Annotations; - -namespace Library.Eaf.EquipmentCore.Control -{ - public interface IEquipmentControl : IPackageSource - { - [NotNull] - IEquipmentSelfDescriptionBuilder SelfDescriptionBuilder { get; } - [NotNull] - IEquipmentDataCollection DataCollection { get; } - [NotNull] - IEquipmentCommandService Commands { get; } - [NotNull] - IConnectionControl Connection { get; } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs deleted file mode 100644 index 15ca25f..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IEquipmentSelfDescriptionBuilder.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public interface IEquipmentSelfDescriptionBuilder - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs deleted file mode 100644 index 0df5871..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IPackage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public interface IPackage - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs deleted file mode 100644 index 6c04747..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/ISelfDescriptionLookup.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public interface ISelfDescriptionLookup - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs deleted file mode 100644 index 7d8b40e..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/IVirtualParameterValuesHandler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public interface IVirtualParameterValuesHandler - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs deleted file mode 100644 index 6371ae8..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/SetParameterValuesHandler.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public class SetParameterValuesHandler - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs deleted file mode 100644 index cee5da9..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/AutoGenerated/TraceRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public class TraceRequest - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs deleted file mode 100644 index e0f09e8..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/IEquipmentDataCollection.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Library.Eaf.EquipmentCore.DataCollection.Reporting; -using Library.Eaf.EquipmentCore.SelfDescription.ElementDescription; -using System; -using System.Collections.Generic; - -namespace Library.Eaf.EquipmentCore.Control -{ - public interface IEquipmentDataCollection - { - IVirtualParameterValuesHandler VirtualParameterValuesHandler { get; } - ISelfDescriptionLookup SelfDescriptionLookup { get; } - EquipmentSelfDescription SelfDescription { get; } - IEnumerable ActiveRequests { get; } - IDataTracingHandler DataTracingHandler { get; } - - ParameterValue CreateParameterValue(EquipmentParameter parameter, object value); - void NotifyDataTracingAvailable(bool isAvailable); - void RegisterChangeDataCollectionHandler(ChangeDataCollectionHandler handler); - void RegisterDataTracingHandler(IDataTracingHandler handler); - void RegisterGetParameterValuesHandler(GetParameterValuesHandler handler); - void RegisterSetParameterValuesHandler(SetParameterValuesHandler handler); - void TriggerDeactivate(DataCollectionRequest deactivateRequest); - void TriggerEvent(EquipmentEvent equipmentEvent, IEnumerable parameters); - void TriggerEvent(EquipmentEvent equipmentEvent, IEnumerable parameters, IPackage sourcePackage); - void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters); - void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters, IPackage sourcePackage); - void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride); - void TriggerExceptionClear(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); - void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride, IPackage sourcePackage); - void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters, string severityOverride, string descriptionOverride); - void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters, IPackage sourcePackage); - void TriggerExceptionSet(EquipmentException equipmentException, IEnumerable parameters); - void TriggerPerformanceRestored(); - void TriggerPerformanceWarning(); - void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable parameters); - void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable parameters, IPackage sourcePackage); - void TriggerTraceSample(TraceRequest traceRequest, long sampleId, IEnumerable parameters, DateTime equipmentTimeStamp); - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/Control/IPackageSource.cs b/EDA Viewer/Library/Eaf/EquipmentCore/Control/IPackageSource.cs deleted file mode 100644 index 4771a37..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/Control/IPackageSource.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.EquipmentCore.Control -{ - public interface IPackageSource - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs b/EDA Viewer/Library/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs deleted file mode 100644 index ae30878..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/DataCollection/Reporting/ParameterValue.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Library.Eaf.EquipmentCore.SelfDescription.ElementDescription; -using Library.PeerGroup.GCL.Annotations; -using System; - -namespace Library.Eaf.EquipmentCore.DataCollection.Reporting -{ - public class ParameterValue - { - public ParameterValue(EquipmentParameter definition, object value) { } - public ParameterValue(EquipmentParameter definition, object value, DateTime timestamp) { } - - public virtual object Value { get; protected internal set; } - [NotNull] - public EquipmentParameter Definition { get; } - public DateTime Timestamp { get; protected set; } - - public virtual ParameterValue Clone(EquipmentParameter newDefinition) { throw new NotImplementedException(); } - public override string ToString() { return base.ToString(); } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs b/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs deleted file mode 100644 index bcd9b96..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ElementDescription/EquipmentParameter.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Library.Eaf.EquipmentCore.SelfDescription.ParameterTypes; - -namespace Library.Eaf.EquipmentCore.SelfDescription.ElementDescription -{ - public class EquipmentParameter - { - public EquipmentParameter(EquipmentParameter source, ParameterTypeDefinition typeDefinition) { } - public EquipmentParameter(string name, ParameterTypeDefinition typeDefinition, string description, bool isTransient = false, bool isReadOnly = true) { } - public EquipmentParameter(string id, string name, ParameterTypeDefinition typeDefinition, string description, bool isTransient = false, bool isReadOnly = true) { } - - public string Name { get; } - public string Id { get; } - public string Description { get; } - public string SourcePath { get; } - public string SourceEquipment { get; } - public ParameterTypeDefinition TypeDefinition { get; } - public bool IsTransient { get; } - public bool IsReadOnly { get; } - - public override string ToString() { return base.ToString(); } - public string ToStringWithDetails() { return base.ToString(); } - } - -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs b/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs deleted file mode 100644 index a31b67a..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/Field.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Library.Eaf.EquipmentCore.SelfDescription.ParameterTypes -{ - public class Field - { - public Field(string name, string description, bool canBeNull, ParameterTypeDefinition typeDefinition) { } - - public string Name { get; } - public string Description { get; } - public ParameterTypeDefinition TypeDefinition { get; } - public bool CanBeNull { get; } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs b/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs deleted file mode 100644 index 4d32eae..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/ParameterTypeDefinition.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Library.Eaf.EquipmentCore.SelfDescription.ParameterTypes -{ - public abstract class ParameterTypeDefinition - { - public ParameterTypeDefinition(string name, string description) { } - - public string Name { get; } - public string Description { get; } - - public override string ToString() { return base.ToString(); } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs b/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs deleted file mode 100644 index 5913805..0000000 --- a/EDA Viewer/Library/Eaf/EquipmentCore/SelfDescription/ParameterTypes/StructuredType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Generic; - -namespace Library.Eaf.EquipmentCore.SelfDescription.ParameterTypes -{ - public class StructuredType : ParameterTypeDefinition - { - - public StructuredType(string name, string description, IList fields) : base(name, description) { } - - public IList Fields { get; } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs b/EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs deleted file mode 100644 index e7dc564..0000000 --- a/EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/IConfigurationObject.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Library.Eaf.Management.ConfigurationData.CellAutomation -{ - public interface IConfigurationObject - { - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs b/EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs deleted file mode 100644 index 537bbcf..0000000 --- a/EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterDefinition.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; - -namespace Library.Eaf.Management.ConfigurationData.CellAutomation -{ - [System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - public class ModelObjectParameterDefinition : IConfigurationObject - { - public ModelObjectParameterDefinition() { } - public ModelObjectParameterDefinition(string name, ModelObjectParameterType valueType, object defaultValue) { } - public ModelObjectParameterDefinition(string name, Type enumType, object defaultValue) { } - - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long Id { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual string Name { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual string Value { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual ModelObjectParameterType ValueType { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual string EnumType { get; set; } - - public virtual ModelObjectParameterDefinition Clone() { return null; } - public virtual bool IsValidValue(string value) { return false; } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs b/EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs deleted file mode 100644 index 9d25435..0000000 --- a/EDA Viewer/Library/Eaf/Management/ConfigurationData/CellAutomation/ModelObjectParameterType.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Library.Eaf.Management.ConfigurationData.CellAutomation -{ - public enum ModelObjectParameterType - { - String = 0, - Bool = 1, - Byte = 2, - SignedByte = 3, - Integer = 4, - UnsignedInteger = 5, - LongInteger = 6, - UnsignedLongInteger = 7, - Double = 8, - Float = 9, - Enum = 10 - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs b/EDA Viewer/Library/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs deleted file mode 100644 index 91ef359..0000000 --- a/EDA Viewer/Library/Eaf/Management/ConfigurationData/Semiconductor/CellInstances/SecsConnectionConfiguration.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Library.PeerGroup.GCL.SecsDriver; -using System; - -namespace Library.Eaf.Management.ConfigurationData.Semiconductor.CellInstances -{ - [System.Runtime.Serialization.DataContractAttribute] - public class SecsConnectionConfiguration - { - public SecsConnectionConfiguration() { } - - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T6HsmsControlMessage { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T5ConnectionSeperation { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T4InterBlock { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T3MessageReply { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T2Protocol { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T1InterCharacter { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual SerialBaudRate? BaudRate { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual SecsTransportType? PortType { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? Port { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan LinkTestTimer { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual string Host { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? DeviceId { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual HsmsSessionMode? SessionMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual HsmsConnectionMode? ConnectionMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T7ConnectionIdle { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual TimeSpan T8NetworkIntercharacter { get; set; } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs b/EDA Viewer/Library/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs deleted file mode 100644 index eaea75b..0000000 --- a/EDA Viewer/Library/Ifx/Eaf/Common/Configuration/ConnectionSetting.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Library.Ifx.Eaf.Common.Configuration -{ - [System.Runtime.Serialization.DataContractAttribute] - public class ConnectionSetting - { - public ConnectionSetting(string name, string value) { } - - [System.Runtime.Serialization.DataMemberAttribute] - public string Name { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string Value { get; set; } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Component/File.cs b/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Component/File.cs deleted file mode 100644 index 79f855c..0000000 --- a/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Component/File.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Library.Ifx.Eaf.EquipmentConnector.File.Component -{ - public class File - { - public File(string filePath) { throw new NotImplementedException(); } - public File(string filePath, DateTime timeFileFound) { throw new NotImplementedException(); } - - public string Path { get; } - public DateTime TimeFound { get; } - public bool IsErrorFile { get; } - public Dictionary ContentParameters { get; } - - public File UpdateContentParameters(Dictionary contentParameters) { throw new NotImplementedException(); } - public File UpdateParsingStatus(bool isErrorFile) { throw new NotImplementedException(); } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs b/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs deleted file mode 100644 index 8dafbc1..0000000 --- a/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Component/FilePathGenerator.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Library.Ifx.Eaf.EquipmentConnector.File.Configuration; -using System; -using System.Collections.Generic; - -namespace Library.Ifx.Eaf.EquipmentConnector.File.Component -{ - public class FilePathGenerator - { - public const char PLACEHOLDER_IDENTIFIER = '%'; - public const char PLACEHOLDER_SEPARATOR = ':'; - public const string PLACEHOLDER_NOT_AVAILABLE = "NA"; - public const string PLACEHOLDER_ORIGINAL_FILE_NAME = "OriginalFileName"; - public const string PLACEHOLDER_ORIGINAL_FILE_EXTENSION = "OriginalFileExtension"; - public const string PLACEHOLDER_DATE_TIME = "DateTime"; - public const string PLACEHOLDER_SUB_FOLDER = "SubFolder"; - public const string PLACEHOLDER_CELL_NAME = "CellName"; - - public FilePathGenerator(FileConnectorConfiguration config, Dictionary customPattern = null) { throw new NotImplementedException(); } - public FilePathGenerator(FileConnectorConfiguration config, File file, bool isErrorFile = false, Dictionary customPattern = null) { throw new NotImplementedException(); } - public FilePathGenerator(FileConnectorConfiguration config, string sourceFilePath, bool isErrorFile = false, Dictionary customPattern = null) { throw new NotImplementedException(); } - - protected string SubFolderPath { get; } - protected FileConnectorConfiguration Configuration { get; } - protected File File { get; } - protected bool IsErrorFile { get; } - protected string DefaultPlaceHolderValue { get; } - - public string GetFullTargetPath() { throw new NotImplementedException(); } - public virtual string GetTargetFileName() { throw new NotImplementedException(); } - public string GetTargetFolder(bool throwExceptionIfNotExist = true) { throw new NotImplementedException(); } - protected virtual string GetSubFolder(string folderPattern, string subFolderPath) { throw new NotImplementedException(); } - protected virtual string PrepareFolderPath(string targetFolderPath, string subFolderPath) { throw new NotImplementedException(); } - protected string ReplacePlaceholder(string inputPath) { throw new NotImplementedException(); } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs b/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs deleted file mode 100644 index 5dc949d..0000000 --- a/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/Configuration/FileConnectorConfiguration.cs +++ /dev/null @@ -1,135 +0,0 @@ -using Library.Ifx.Eaf.Common.Configuration; -using System; -using System.Collections.Generic; - -namespace Library.Ifx.Eaf.EquipmentConnector.File.Configuration -{ - [System.Runtime.Serialization.DataContractAttribute] - public class FileConnectorConfiguration - { - public const ulong IDLE_EVENT_WAIT_TIME_DEFAULT = 360; - public const ulong FILE_HANDLE_TIMEOUT_DEFAULT = 15; - - [System.Runtime.Serialization.DataMemberAttribute] - public virtual bool? TriggerOnChanged { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? PostProcessingRetries { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual bool? CopySourceFolderStructure { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public IfPostProcessingFailsEnum? IfPostProcessingFailsAction { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string AlternateTargetFolder { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public long? FileHandleTimeout { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public bool? DeleteEmptySourceSubFolders { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public long? IdleEventWaitTimeInSeconds { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string FileAgeThreshold { get; set; } - public bool? FolderAgeCheckIndividualSubFolders { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual ZipModeEnum? ZipMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public FileAgeFilterEnum? FileAgeFilterMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string ZipTargetFileName { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string ZipErrorTargetFileName { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public long? ZipFileSubFolderLevel { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string DefaultPlaceHolderValue { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public bool? UseZip64Mode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public List ConnectionSettings { get; set; } - public string SourceDirectoryCloaking { get; set; } - public string FolderAgeThreshold { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? FileScanningIntervalInSeconds { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual bool? TriggerOnCreated { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? ZipFileTime { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string SourceFileLocation { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string SourceFileFilter { get; set; } - public List SourceFileFilters { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual bool? IncludeSubDirectories { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual FileScanningOptionEnum? FileScanningOption { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string TargetFileLocation { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string ErrorTargetFileLocation { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string TargetFileName { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? FileHandleWaitTime { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public IfFileExistEnum? IfFileExistAction { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public long? ConnectionRetryInterval { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public PreProcessingModeEnum? PreProcessingMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public PostProcessingModeEnum? PostProcessingMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public PostProcessingModeEnum? ErrorPostProcessingMode { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public virtual long? ZipFileAmount { get; set; } - [System.Runtime.Serialization.DataMemberAttribute] - public string ErrorTargetFileName { get; set; } - - public void Initialize() { throw new NotImplementedException(); } - - public enum PostProcessingModeEnum - { - None = 0, - Move = 1, - Copy = 2, - Rename = 3, - Zip = 4, - Delete = 5, - MoveFolder = 6, - CopyFolder = 7, - DeleteFolder = 8 - } - public enum PreProcessingModeEnum - { - None = 0, - Process = 1 - } - public enum IfFileExistEnum - { - Overwrite = 0, - LeaveFiles = 1, - Delete = 2 - } - public enum IfPostProcessingFailsEnum - { - LeaveFiles = 0, - Delete = 1 - } - public enum FileScanningOptionEnum - { - FileWatcher = 0, - TimeBased = 1 - } - public enum ZipModeEnum - { - ZipByAmountOrTime = 0, - ZipByFileName = 1, - ZipBySubFolderName = 2 - } - public enum FileAgeFilterEnum - { - IgnoreNewer = 0, - IgnoreOlder = 1 - } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs b/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs deleted file mode 100644 index 23353cb..0000000 --- a/EDA Viewer/Library/Ifx/Eaf/EquipmentConnector/File/SelfDescription/FileConnectorParameterTypeDefinitionProvider.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Library.Eaf.EquipmentCore.SelfDescription.ParameterTypes; -using System; -using System.Collections.Generic; - -namespace Library.Ifx.Eaf.EquipmentConnector.File.SelfDescription -{ - public class FileConnectorParameterTypeDefinitionProvider - { - public FileConnectorParameterTypeDefinitionProvider() { } - - public IEnumerable GetAllParameterTypeDefinition() { return null; } - public ParameterTypeDefinition GetParameterTypeDefinition(string name) { return null; } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/PeerGroup/GCL/Annotations/NotNullAttribute.cs b/EDA Viewer/Library/PeerGroup/GCL/Annotations/NotNullAttribute.cs deleted file mode 100644 index fa311f4..0000000 --- a/EDA Viewer/Library/PeerGroup/GCL/Annotations/NotNullAttribute.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace Library.PeerGroup.GCL.Annotations -{ - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.Delegate, AllowMultiple = false, Inherited = true)] - public sealed class NotNullAttribute : Attribute - { - public NotNullAttribute() { } - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs b/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs deleted file mode 100644 index 21ecf38..0000000 --- a/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/HsmsConnectionMode.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Library.PeerGroup.GCL.SecsDriver -{ - public enum HsmsConnectionMode - { - Active = 0, - Passive = 1 - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs b/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs deleted file mode 100644 index 6ea9d07..0000000 --- a/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/HsmsSessionMode.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Library.PeerGroup.GCL.SecsDriver -{ - public enum HsmsSessionMode - { - MultiSession = 0, - SingleSession = 1 - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/SecsTransportType.cs b/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/SecsTransportType.cs deleted file mode 100644 index f5afda3..0000000 --- a/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/SecsTransportType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Library.PeerGroup.GCL.SecsDriver -{ - public enum SecsTransportType - { - HSMS = 0, - Serial = 1 - } -} \ No newline at end of file diff --git a/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs b/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs deleted file mode 100644 index c3ffd63..0000000 --- a/EDA Viewer/Library/PeerGroup/GCL/SecsDriver/SerialBaudRate.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Library.PeerGroup.GCL.SecsDriver -{ - public enum SerialBaudRate - { - Baud9600 = 0, - Baud19200 = 1, - Baud4800 = 2, - Baud2400 = 3, - Baud1200 = 4, - Baud300 = 5, - Baud150 = 6, - Baud38400 = 7, - Baud57600 = 8, - Baud115200 = 9 - } -} \ No newline at end of file diff --git a/EDA Viewer/Models/AppSettings.cs b/EDA Viewer/Models/AppSettings.cs index 2fe1229..c3ff1c7 100644 --- a/EDA Viewer/Models/AppSettings.cs +++ b/EDA Viewer/Models/AppSettings.cs @@ -1,15 +1,52 @@ -namespace EDAViewer.Models +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace EDAViewer.Models; + +public class AppSettings { - public class AppSettings + + protected string _BuildNumber; + protected string _Company; + protected string _ECEDADatabasePassword; + protected string _GitCommitSeven; + protected string _IFXEDADatabasePassword; + protected string _MonARessource; + protected string _Server; + protected string _URLs; + protected string _WorkingDirectoryName; + public string BuildNumber => _BuildNumber; + public string Company => _Company; + public string ECEDADatabasePassword => _ECEDADatabasePassword; + public string GitCommitSeven => _GitCommitSeven; + public string IFXEDADatabasePassword => _IFXEDADatabasePassword; + public string MonARessource => _MonARessource; + public string Server => _Server; + public string URLs => _URLs; + public string WorkingDirectoryName => _WorkingDirectoryName; + + // public AppSettings() + // { + // } + + [JsonConstructor] + public AppSettings(string buildNumber, string company, string ecEDADatabasePassword, string gitCommitSeven, string ifxEDADatabasePassword, string monARessource, string server, string urls, string workingDirectoryName) { - public string Company { get; set; } - public string ECEDADatabasePassword { get; set; } - public string EncryptedPassword { get; set; } - public string IFXEDADatabasePassword { get; set; } - public string MonARessource { get; set; } - public string Server { get; set; } - public string ServiceUser { get; set; } - public string URLs { get; set; } - public string WorkingDirectoryName { get; set; } + _BuildNumber = buildNumber; + _Company = company; + _ECEDADatabasePassword = ecEDADatabasePassword; + _GitCommitSeven = gitCommitSeven; + _IFXEDADatabasePassword = ifxEDADatabasePassword; + _MonARessource = monARessource; + _Server = server; + _URLs = urls; + _WorkingDirectoryName = workingDirectoryName; } + + public override string ToString() + { + string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + return result; + } + } \ No newline at end of file diff --git a/EDA Viewer/Models/Binder/AppSettings.cs b/EDA Viewer/Models/Binder/AppSettings.cs new file mode 100644 index 0000000..44755d8 --- /dev/null +++ b/EDA Viewer/Models/Binder/AppSettings.cs @@ -0,0 +1,38 @@ +using System.ComponentModel.DataAnnotations; +using System.Text.Json; + +namespace EDAViewer.Models.Binder; + +public class AppSettings +{ + + [Display(Name = "Build Number"), Required] public string BuildNumber { get; set; } + [Display(Name = "Company"), Required] public string Company { get; set; } + [Display(Name = "EC EDA Database Password"), Required] public string ECEDADatabasePassword { get; set; } + [Display(Name = "Git Commit Seven"), Required] public string GitCommitSeven { get; set; } + [Display(Name = "IFX EDA Database Password"), Required] public string IFXEDADatabasePassword { get; set; } + [Display(Name = "MonA Ressource"), Required] public string MonARessource { get; set; } + [Display(Name = "Server"), Required] public string Server { get; set; } + [Display(Name = "URLs"), Required] public string URLs { get; set; } + [Display(Name = "Working Directory Name"), Required] public string WorkingDirectoryName { get; set; } + + public AppSettings() + { + BuildNumber = string.Empty; + Company = string.Empty; + ECEDADatabasePassword = string.Empty; + GitCommitSeven = string.Empty; + IFXEDADatabasePassword = string.Empty; + MonARessource = string.Empty; + Server = string.Empty; + URLs = string.Empty; + WorkingDirectoryName = string.Empty; + } + + public override string ToString() + { + string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + return result; + } + +} \ No newline at end of file diff --git a/EDA Viewer/Models/EdaHtmlDiff.cs b/EDA Viewer/Models/EdaHtmlDiff.cs deleted file mode 100644 index ef0a35d..0000000 --- a/EDA Viewer/Models/EdaHtmlDiff.cs +++ /dev/null @@ -1,52 +0,0 @@ -using EDAViewer.Models; -using System; -using System.ComponentModel.DataAnnotations; - -namespace EDAViewer.Models -{ - - public class EdaHtmlDiff : WithEnvironment - { - - public string Paths { get; set; } - public string CurrentPath { get; set; } - public string PathAndFileName { get; set; } - - [Display(Name = "FileName")] - [DisplayFormat(ConvertEmptyStringToNull = false)] - [Required(ErrorMessage = "Please select an file name", AllowEmptyStrings = false)] - public string FileName { get; set; } - - public EdaHtmlDiff() - { - Common(path: string.Empty); - } - - public EdaHtmlDiff(WithEnvironment withEnvironment, string path) - { - Common(path); - if (string.IsNullOrEmpty(withEnvironment.user_name)) - user_name = "AUTO"; - else - user_name = withEnvironment.user_name; - if (string.IsNullOrEmpty(withEnvironment.machine_name)) - machine_name = "IFX"; - else - machine_name = withEnvironment.machine_name; - if (withEnvironment.now_ticks == 0) - now_ticks = DateTime.Now.Ticks; - else - now_ticks = withEnvironment.now_ticks; - message = withEnvironment.message; - } - - private void Common(string path) - { - Paths = string.Empty; - CurrentPath = path; - FileName = string.Empty; - } - - } - -} \ No newline at end of file diff --git a/EDA Viewer/Models/ErrorViewModel.cs b/EDA Viewer/Models/ErrorViewModel.cs index ac6c445..7e2d620 100644 --- a/EDA Viewer/Models/ErrorViewModel.cs +++ b/EDA Viewer/Models/ErrorViewModel.cs @@ -1,9 +1,8 @@ -namespace EDAViewer.Models -{ - public class ErrorViewModel - { - public string RequestId { get; set; } +namespace EDAViewer.Models; - public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); - } +public class ErrorViewModel +{ + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); } \ No newline at end of file diff --git a/EDA Viewer/Models/IBackground.cs b/EDA Viewer/Models/IBackground.cs deleted file mode 100644 index 1fbb28f..0000000 --- a/EDA Viewer/Models/IBackground.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace EDAViewer.Models -{ - - public interface IBackground - { - void EdaDataCollectionPlansCallback(); - // public void EdaDataCollectionPlans() - // { - // long ticks = DateTime.Now.Ticks; - // Logic2021Q1 logic2021Q1 = new Logic2021Q1(_Log); - // string server = GetServer(debugIsNotEC: false); - // string cSharpFormat = "yyyy-MM-dd_hh:mm:ss tt"; - // string oracleFormat = "yyyy-MM-dd_hh:mi:ss AM"; - // string edaDataCollectionPlansLastRun = "2020-07-02_10:45:01 AM"; - // logic2021Q1.EdaDataCollectionPlans(server, server.Contains("_ec_"), edaDataCollectionPlansLastRun, cSharpFormat, oracleFormat); - // _Log.Debug(string.Concat("Took ", new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds, " second(s)")); - // } - void EDAOutputArchiveCallback(); - // public void EDAOutputArchive() - // { - // long ticks = DateTime.Now.Ticks; - // string server = GetServer(debugIsNotEC: true); - // string sourceDirectory = string.Concat(@"\\", server, @"\ec_eda\Staging\Traces"); - // if (!Directory.Exists(sourceDirectory)) - // _Log.Debug(string.Concat("// Source directory <", sourceDirectory, "> doesn't exist.")); - // else - // { - // Logic2019Q4 logic2019Q4 = new Logic2019Q4(_Log); - // logic2019Q4.EDAOutputArchive(sourceDirectory); - // } - // _Log.Debug(string.Concat("Took ", new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds, " second(s)")); - // } - void LogPathCleanUpByWeekCallback(); - // public void LogPathCleanUpByWeek() - // { - // long ticks = DateTime.Now.Ticks; - // string server = GetServer(debugIsNotEC: true); - // Logic2019Q3 logic2019Q3 = new Logic2019Q3(_Log); - // logic2019Q3.LogPathCleanUpByWeek(server, isEDA: true); - // logic2019Q3.LogPathCleanUpByWeek(server, isEAFLog: true); - // _Log.Debug(string.Concat("Took ", new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds, " second(s)")); - // } - - } - -} \ No newline at end of file diff --git a/EDA Viewer/Models/IHomeController.cs b/EDA Viewer/Models/IHomeController.cs deleted file mode 100644 index 3030d14..0000000 --- a/EDA Viewer/Models/IHomeController.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Rendering; -using System.Collections.Generic; - -namespace EDAViewer.Models -{ - public interface IHomeController - { - IActionResult Background(bool? message_clear = null, bool? exceptions_clear = null, bool? set_is_primary_instance = null, int? invoke_eda_dcp = null); - IActionResult Encode(string value = null); - IActionResult Error(); - IActionResult Index(); - IActionResult Privacy(); - IActionResult ViewEdaHtmlDiff(WithEnvironment withEnvironment = null); - ActionResult> GetDirectoriesOrFiles(string path = null, bool? upDirectory = null, string filter = null); - } -} \ No newline at end of file diff --git a/EDA Viewer/Models/Methods/IBackground.cs b/EDA Viewer/Models/Methods/IBackground.cs new file mode 100644 index 0000000..c1081f9 --- /dev/null +++ b/EDA Viewer/Models/Methods/IBackground.cs @@ -0,0 +1,20 @@ +namespace EDAViewer.Models.Methods; + +public interface IBackground +{ + + void Catch(Exception exception); + void ClearIsPrimaryInstance(); + void ClearMessage(); + void Dispose(); + bool IsPrimaryInstance(); + void SetIsPrimaryInstance(); + void Stop(bool immediate); + void Update(int milliSeconds); + + string GetCountDirectory(string verb); + + void EDAOutputArchiveCallback(); + void EdaDataCollectionPlansCallback(); + void LogPathCleanUpByWeekCallback(); +} \ No newline at end of file diff --git a/EDA Viewer/Models/Properties/IBackground.cs b/EDA Viewer/Models/Properties/IBackground.cs new file mode 100644 index 0000000..f722458 --- /dev/null +++ b/EDA Viewer/Models/Properties/IBackground.cs @@ -0,0 +1,8 @@ +namespace EDAViewer.Models.Properties; + +public interface IBackground +{ + + public List Timers { get; } + +} \ No newline at end of file diff --git a/EDA Viewer/Models/Properties/IBackgroundPage.cs b/EDA Viewer/Models/Properties/IBackgroundPage.cs new file mode 100644 index 0000000..4de5637 --- /dev/null +++ b/EDA Viewer/Models/Properties/IBackgroundPage.cs @@ -0,0 +1,10 @@ +namespace EDAViewer.Models.Properties; + +public interface IBackgroundPage +{ + + public List Exceptions { get; } + public string Message { get; } + public string WorkingDirectory { get; } + +} \ No newline at end of file diff --git a/EDA Viewer/Models/Stateless/AppSettings.cs b/EDA Viewer/Models/Stateless/AppSettings.cs new file mode 100644 index 0000000..b546bc8 --- /dev/null +++ b/EDA Viewer/Models/Stateless/AppSettings.cs @@ -0,0 +1,39 @@ +using System.Text.Json; + +namespace EDAViewer.Models.Stateless; + +public abstract class AppSettings +{ + + public static Models.AppSettings Get(IConfigurationRoot configurationRoot) + { + Models.AppSettings? result; + Binder.AppSettings appSettings = configurationRoot.Get(); + string json = JsonSerializer.Serialize(appSettings, new JsonSerializerOptions() { WriteIndented = true }); + result = JsonSerializer.Deserialize(json); + if (result is null) + throw new Exception(json); + if (string.IsNullOrEmpty(result.Company)) + throw new Exception(json); + string jsonThis = result.ToString(); + if (jsonThis != json) + { + int? check = null; + int min = new int[] { json.Length, jsonThis.Length }.Min(); + for (int i = 0; i < min; i++) + { + if (json[i] == jsonThis[i]) + continue; + check = i; + break; + } + if (check is null) + throw new Exception(); + string a = json[..check.Value].Split(',')[^1]; + string b = json[check.Value..].Split(',')[0]; + throw new Exception($"{a}{b}"); + } + return result; + } + +} \ No newline at end of file diff --git a/EDA Viewer/Models/Stateless/Methods/IBackgroundPage.cs b/EDA Viewer/Models/Stateless/Methods/IBackgroundPage.cs new file mode 100644 index 0000000..1d59081 --- /dev/null +++ b/EDA Viewer/Models/Stateless/Methods/IBackgroundPage.cs @@ -0,0 +1,10 @@ +namespace EDAViewer.Models.Stateless.Methods; + +public interface IBackgroundPage +{ + + void OnGet(bool? message_clear = null, bool? exceptions_clear = null, bool? set_is_primary_instance = null); + + static string GetRouteName() => nameof(IBackgroundPage).Replace("Page", string.Empty)[1..]; + +} \ No newline at end of file diff --git a/EDA Viewer/Models/Stateless/Methods/IMethodName.cs b/EDA Viewer/Models/Stateless/Methods/IMethodName.cs new file mode 100644 index 0000000..badc839 --- /dev/null +++ b/EDA Viewer/Models/Stateless/Methods/IMethodName.cs @@ -0,0 +1,10 @@ +using System.Runtime.CompilerServices; + +namespace EDAViewer.Models.Stateless.Methods; + +public interface IMethodName +{ + + static string? GetActualAsyncMethodName([CallerMemberName] string? name = null) => name; + +} \ No newline at end of file diff --git a/EDA Viewer/Models/Stateless/Methods/IWorkingDirectory.cs b/EDA Viewer/Models/Stateless/Methods/IWorkingDirectory.cs new file mode 100644 index 0000000..6ae61e3 --- /dev/null +++ b/EDA Viewer/Models/Stateless/Methods/IWorkingDirectory.cs @@ -0,0 +1,8 @@ +namespace EDAViewer.Models.Stateless.Methods; + +public interface IWorkingDirectory +{ + + static string GetWorkingDirectory(string? executingAssemblyName, string subDirectoryName) => WorkingDirectory.GetWorkingDirectory(executingAssemblyName, subDirectoryName); + +} \ No newline at end of file diff --git a/EDA Viewer/Models/Stateless/Methods/WorkingDirectory.cs b/EDA Viewer/Models/Stateless/Methods/WorkingDirectory.cs new file mode 100644 index 0000000..4f1fd80 --- /dev/null +++ b/EDA Viewer/Models/Stateless/Methods/WorkingDirectory.cs @@ -0,0 +1,50 @@ +namespace EDAViewer.Models.Stateless.Methods; + +internal abstract class WorkingDirectory +{ + + internal static string GetWorkingDirectory(string? executingAssemblyName, string subDirectoryName) + { + string result = string.Empty; + if (executingAssemblyName is null) + throw new Exception(); + string traceFile; + List directories = new(); + Environment.SpecialFolder[] specialFolders = new Environment.SpecialFolder[] + { + Environment.SpecialFolder.LocalApplicationData, + Environment.SpecialFolder.ApplicationData, + Environment.SpecialFolder.History, + Environment.SpecialFolder.CommonApplicationData, + Environment.SpecialFolder.InternetCache + }; + foreach (Environment.SpecialFolder specialFolder in specialFolders) + directories.Add(Path.Combine(Environment.GetFolderPath(specialFolder), subDirectoryName, executingAssemblyName)); + foreach (string directory in directories) + { + for (int i = 1; i < 3; i++) + { + if (i == 1) + result = directory; + else + result = string.Concat("D", directory[1..]); + try + { + if (!Directory.Exists(result)) + _ = Directory.CreateDirectory(result); + traceFile = string.Concat(result, @"\", DateTime.Now.Ticks, ".txt"); + File.WriteAllText(traceFile, traceFile); + File.Delete(traceFile); + break; + } + catch (Exception) { result = string.Empty; } + } + if (!string.IsNullOrEmpty(result)) + break; + } + if (string.IsNullOrEmpty(result)) + throw new Exception("Unable to set working directory!"); + return result; + } + +} \ No newline at end of file diff --git a/EDA Viewer/Models/Stateless/SerilogExtensionMethods.cs b/EDA Viewer/Models/Stateless/SerilogExtensionMethods.cs new file mode 100644 index 0000000..13736cf --- /dev/null +++ b/EDA Viewer/Models/Stateless/SerilogExtensionMethods.cs @@ -0,0 +1,10 @@ +namespace EDAViewer.Models.Stateless; + +public static class SerilogExtensionMethods +{ + + internal static void Warn(this Serilog.ILogger log, string messageTemplate) => log.Warning(messageTemplate); + + internal static void Info(this Serilog.ILogger log, string messageTemplate) => log.Information(messageTemplate); + +} \ No newline at end of file diff --git a/EDA Viewer/Models/WithEnvironment.cs b/EDA Viewer/Models/WithEnvironment.cs deleted file mode 100644 index 81980fb..0000000 --- a/EDA Viewer/Models/WithEnvironment.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace EDAViewer.Models -{ - - public class WithEnvironment - { - - public string message { get; set; } - public string user_name { get; set; } - public string machine_name { get; set; } - public long now_ticks { get; set; } - - } - -} \ No newline at end of file diff --git a/EDA Viewer/Pages/Background.cshtml b/EDA Viewer/Pages/Background.cshtml new file mode 100644 index 0000000..e3dccf4 --- /dev/null +++ b/EDA Viewer/Pages/Background.cshtml @@ -0,0 +1,68 @@ +@page +@model EDAViewer.Pages.BackgroundPage +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + + + + + + + + Background + + + + + +
+
+
+

@(nameof(EDAViewer)) - + @(Model.IsPrimaryInstance) - + @(Model.IsEnvironmentProfile) - + @(Model.AppSettingsBuildNumber) - + @(Model.AppSettingsGitCommitSeven) - + @(Model.AppSettingsURLs)

+

@(Model.WorkingDirectory)

+

@(Model.Message)

+

@(string.Concat("Exception(s) - ", Model.Exceptions.Count))

+
+ +

 

+
+
+
+ @if (Model.Exceptions.Any()) + { + int i = 0; + @foreach (Exception exception in Model.Exceptions) + { +

+ @Html.Raw(string.Concat("")); +

+

+ @Html.Raw(string.Concat("")); +

+
+ @(i += 1) + ; + } + } +
+
+
+
+ + + diff --git a/EDA Viewer/Pages/Background.cshtml.cs b/EDA Viewer/Pages/Background.cshtml.cs new file mode 100644 index 0000000..54d78da --- /dev/null +++ b/EDA Viewer/Pages/Background.cshtml.cs @@ -0,0 +1,74 @@ +using EDAViewer.Models.Stateless.Methods; +using IFX.Shared; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Serilog.Context; +using System.Text.Json; + +namespace EDAViewer.Pages; + +public class BackgroundPage : PageModel, Models.Properties.IBackgroundPage, IBackgroundPage +{ + + protected readonly string _AppSettingsBuildNumber; + protected readonly string _AppSettingsGitCommitSeven; + protected readonly string _AppSettingsURLs; + protected readonly List _Exceptions; + protected readonly string _IsEnvironmentProfile; + protected string _IsPrimaryInstance; + protected readonly string _Message; + protected readonly string _WorkingDirectory; + public string AppSettingsBuildNumber => _AppSettingsBuildNumber; + public string AppSettingsGitCommitSeven => _AppSettingsGitCommitSeven; + public string AppSettingsURLs => _AppSettingsURLs; + public List Exceptions => _Exceptions; + public string IsEnvironmentProfile => _IsEnvironmentProfile; + public string IsPrimaryInstance => _IsPrimaryInstance; + public string Message => _Message; + public string WorkingDirectory => _WorkingDirectory; + + private readonly Serilog.ILogger _Log; + private readonly Models.Methods.IBackground _BackgroundMethods; + + public BackgroundPage(IsEnvironment isEnvironment, Models.AppSettings appSettings, Singleton.Background background) + { + _Message = background.Message; + _BackgroundMethods = background; + _AppSettingsURLs = appSettings.URLs; + _Exceptions = background.Exceptions; + _IsEnvironmentProfile = isEnvironment.Profile; + _Log = Serilog.Log.ForContext(); + _WorkingDirectory = background.WorkingDirectory; + _AppSettingsBuildNumber = appSettings.BuildNumber; + _AppSettingsGitCommitSeven = appSettings.GitCommitSeven; + Models.Methods.IBackground backgroundMethods = background; + _IsPrimaryInstance = backgroundMethods.IsPrimaryInstance().ToString(); + } + + public override string ToString() + { + string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + return result; + } + + public void OnGet(bool? message_clear = null, bool? exceptions_clear = null, bool? set_is_primary_instance = null) + { + string? methodName = IMethodName.GetActualAsyncMethodName(); + using (LogContext.PushProperty("MethodName", methodName)) + { + _Log.Debug("() => ..."); + if (message_clear.HasValue && message_clear.Value) + _BackgroundMethods.ClearMessage(); + if (exceptions_clear.HasValue && exceptions_clear.Value) + _Exceptions.Clear(); + if (set_is_primary_instance.HasValue) + { + if (set_is_primary_instance.Value) + _BackgroundMethods.SetIsPrimaryInstance(); + else + _BackgroundMethods.ClearIsPrimaryInstance(); + _IsPrimaryInstance = _BackgroundMethods.IsPrimaryInstance().ToString(); + } + } + } + +} \ No newline at end of file diff --git a/EDA Viewer/Pages/Error.cshtml b/EDA Viewer/Pages/Error.cshtml new file mode 100644 index 0000000..cd86153 --- /dev/null +++ b/EDA Viewer/Pages/Error.cshtml @@ -0,0 +1,42 @@ +@page +@model EDAViewer.Pages.ErrorModel + + + + + + + + Error + + + + + +
+
+

Error.

+

An error occurred while processing your request.

+ + @if (Model.ShowRequestId) + { +

+ Request ID: @Model.RequestId +

+ } + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+
+
+ + + diff --git a/EDA Viewer/Pages/Error.cshtml.cs b/EDA Viewer/Pages/Error.cshtml.cs new file mode 100644 index 0000000..2656e08 --- /dev/null +++ b/EDA Viewer/Pages/Error.cshtml.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using System.Diagnostics; + +namespace EDAViewer.Pages; + +[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] +[IgnoreAntiforgeryToken] +public class ErrorModel : PageModel +{ + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + private readonly ILogger _Logger; + + public ErrorModel(ILogger logger) => _Logger = logger; + + public void OnGet() => RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; +} \ No newline at end of file diff --git a/EDA Viewer/Program.cs b/EDA Viewer/Program.cs index 35a1000..8f69da4 100644 --- a/EDA Viewer/Program.cs +++ b/EDA Viewer/Program.cs @@ -1,33 +1,88 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; -using Shared; -using System.Diagnostics; +using EDAViewer.HostedService; +using EDAViewer.Models; +using EDAViewer.Models.Stateless.Methods; +using IFX.Shared; +using Microsoft.Extensions.Hosting.WindowsServices; +using Serilog; +using System.Reflection; -namespace EDAViewer +namespace EDAViewer; + +public class Program { - public class Program + public static int Main(string[] args) { - - public static void Main(string[] args) + LoggerConfiguration loggerConfiguration = new(); + Assembly assembly = Assembly.GetExecutingAssembly(); + string? assemblyName = assembly.GetName()?.Name; + if (string.IsNullOrEmpty(assemblyName)) + throw new Exception(); + WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(new WebApplicationOptions() { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) + Args = args, + ContentRootPath = Path.GetDirectoryName(assembly.Location) + }); + _ = webApplicationBuilder.Host.UseWindowsService(); + _ = webApplicationBuilder.Configuration.AddUserSecrets(); + AppSettings appSettings = Models.Stateless.AppSettings.Get(webApplicationBuilder.Configuration); + if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName)) + throw new Exception("Working directory name must have a value!"); + string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assemblyName, appSettings.WorkingDirectoryName); + Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); + _ = ConsoleLoggerConfigurationExtensions.Console(loggerConfiguration.WriteTo); + _ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, webApplicationBuilder.Configuration); + _ = SerilogHostBuilderExtensions.UseSerilog(webApplicationBuilder.Host); + Log.Logger = loggerConfiguration.CreateLogger(); + Serilog.ILogger log = Log.ForContext(); + try { - IHostBuilder result; - IsEnvironment isEnvironment = new IsEnvironment(processesCount: null, nullASPNetCoreEnvironmentIsDevelopment: Debugger.IsAttached, nullASPNetCoreEnvironmentIsProduction: !Debugger.IsAttached); - result = Host.CreateDefaultBuilder(args) - .UseWindowsService() - .ConfigureWebHostDefaults(webBuilder => + IsEnvironment isEnvironment = new(webApplicationBuilder.Environment.IsDevelopment(), webApplicationBuilder.Environment.IsStaging(), webApplicationBuilder.Environment.IsProduction()); + Singleton.Background background = new(isEnvironment, appSettings, workingDirectory); + if (isEnvironment.Development && string.IsNullOrEmpty(appSettings.URLs)) + throw new Exception(); + _ = webApplicationBuilder.Services.AddRazorPages(); + _ = webApplicationBuilder.Services.AddSingleton(_ => appSettings); + _ = webApplicationBuilder.Services.AddSingleton(_ => isEnvironment); + _ = webApplicationBuilder.Services.AddSingleton(_ => background); + _ = webApplicationBuilder.Services.AddHostedService(t => new TimedHostedService(isEnvironment, background)); + if (WindowsServiceHelpers.IsWindowsService()) + { + _ = webApplicationBuilder.Services.AddSingleton(); + _ = webApplicationBuilder.Logging.AddEventLog(settings => { - webBuilder.UseStartup(); + if (string.IsNullOrEmpty(settings.SourceName)) + settings.SourceName = webApplicationBuilder.Environment.ApplicationName; }); - return result; - } + } + WebApplication webApplication = webApplicationBuilder.Build(); + if (appSettings.Company == nameof(webApplication.Lifetime.StopApplication)) + { + Environment.ExitCode = -1; + webApplication.Lifetime.StopApplication(); + } + _ = webApplication.UseExceptionHandler("/Error"); + _ = webApplication.Lifetime.ApplicationStopped.Register(Log.CloseAndFlush); + _ = ApplicationBuilderSerilogClientExtensions.UseSerilogIngestion(webApplication); + _ = SerilogApplicationBuilderExtensions.UseSerilogRequestLogging(webApplication); + _ = webApplication.UseDeveloperExceptionPage(); + _ = webApplication.UseStaticFiles(); + _ = webApplication.UseRouting(); + _ = webApplication.MapRazorPages(); + log.Information("Starting Web Application"); + webApplication.Run(); + return 0; + } + catch (Exception ex) + { + log.Fatal(ex, "Host terminated unexpectedly"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } } } \ No newline at end of file diff --git a/EDA Viewer/Properties/AssemblyInfo.cs b/EDA Viewer/Properties/AssemblyInfo.cs index 49c75d0..5025f98 100644 --- a/EDA Viewer/Properties/AssemblyInfo.cs +++ b/EDA Viewer/Properties/AssemblyInfo.cs @@ -1,3 +1,3 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("EDA Viewer.Tests")] \ No newline at end of file +[assembly: InternalsVisibleTo("EDA Viewer.Tests")] \ No newline at end of file diff --git a/EDA Viewer/Shared/EquipmentType.cs b/EDA Viewer/Shared/EquipmentType.cs deleted file mode 100644 index dd1413a..0000000 --- a/EDA Viewer/Shared/EquipmentType.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace Shared -{ - - public enum EquipmentType - { - FileEquipment, - SemiEquipment, - // - DEP08EGANAIXG5, - // - MET08ANLYSDIFAAST230_Semi, - MET08DDUPSFS6420, - MET08DDUPSP1TBI, - MET08RESIHGCV, - MET08RESIMAPCDE, - MET08THFTIRQS408M, - MET08THFTIRSTRATUS, - // - MET08AFMD3100, - MET08BVHGPROBE, - MET08CVHGPROBE802B150, - MET08CVHGPROBE802B150_Monthly, - MET08CVHGPROBE802B150_Weekly, - MET08DDINCAN8620, - MET08DDINCAN8620_Daily, - MET08EBEAMINTEGRITY26, - MET08HALLHL5580, - MET08HALLHL5580_Monthly, - MET08HALLHL5580_Weekly, - MET08MESMICROSCOPE, - MET08NDFRESIMAP151C, - MET08NDFRESIMAP151C_Verification, - MET08PLMAPRPM, - MET08PLMAPRPM_Daily, - MET08PLMAPRPM_Verification, - MET08PLMPPLATO, - MET08PRFUSB4000, - MET08PRFUSB4000_Daily, - MET08PRFUSB4000_Monthly, - MET08PRFUSB4000_Weekly, - MET08PRFUSB4000_Verification, - MET08PRFUSB4000_Villach, - MET08UVH44GS100M, - MET08VPDSUBCON, - MET08WGEOMX203641Q, - MET08WGEOMX203641Q_Verification, - MET08XRDXPERTPROMRDXL, - MET08XRDXPERTPROMRDXL_Monthly, - MET08XRDXPERTPROMRDXL_Weekly, - METBRXRAYJV7300L - } - -} \ No newline at end of file diff --git a/EDA Viewer/Shared/IsEnvironment.cs b/EDA Viewer/Shared/IsEnvironment.cs deleted file mode 100644 index c24b236..0000000 --- a/EDA Viewer/Shared/IsEnvironment.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; - -namespace Shared -{ - - public class IsEnvironment - { - - public enum Name - { - LinuxDevelopment, - LinuxProduction, - LinuxStaging, - OSXDevelopment, - OSXProduction, - OSXStaging, - WindowsDevelopment, - WindowsProduction, - WindowsStaging - } - - public bool DebuggerWasAttachedDuringConstructor { get; private set; } - public bool Development { get; private set; } - public bool Linux { get; private set; } - public bool OSX { get; private set; } - public bool Production { get; private set; } - public bool Staging { get; private set; } - public bool Windows { get; private set; } - public string Profile { get; private set; } - public string AppSettingsFileName { get; private set; } - public string ASPNetCoreEnvironment { get; private set; } - - public IsEnvironment(string testCategory) - { - if (testCategory.EndsWith(".json")) - { - Production = testCategory == "appsettings.json"; - Staging = testCategory.EndsWith(nameof(Staging)); - OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); - Development = testCategory.EndsWith(nameof(Development)); - Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; - Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - } - else - { - DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; - OSX = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(OSX)); - ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - Linux = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Linux)); - Staging = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Staging)); - Windows = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Windows)); - Production = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Production)); - Development = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Development)); - } - Profile = GetProfile(); - AppSettingsFileName = GetAppSettingsFileName(processesCount: null); - } - - public IsEnvironment(bool isDevelopment, bool isStaging, bool isProduction) - { - Staging = isStaging; - Production = isProduction; - Development = isDevelopment; - OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); - Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; - Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - Profile = GetProfile(); - AppSettingsFileName = GetAppSettingsFileName(processesCount: null); - } - - public IsEnvironment(int? processesCount, bool nullASPNetCoreEnvironmentIsDevelopment, bool nullASPNetCoreEnvironmentIsProduction) - { - OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); - Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - DebuggerWasAttachedDuringConstructor = Debugger.IsAttached; - Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - if (nullASPNetCoreEnvironmentIsDevelopment && nullASPNetCoreEnvironmentIsProduction) - throw new Exception(); - else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsProduction) - Production = true; - else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsDevelopment) - Development = true; - else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && !nullASPNetCoreEnvironmentIsDevelopment && !nullASPNetCoreEnvironmentIsProduction) - throw new Exception(); - else - { - Staging = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Staging)); - Production = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Production)); - Development = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Development)); - } - Profile = GetProfile(); - AppSettingsFileName = GetAppSettingsFileName(processesCount); - } - - private string GetProfile() - { - string result; - if (Windows && Production) - result = nameof(Production); - else if (Windows && Staging) - result = nameof(Staging); - else if (Windows && Development) - result = nameof(Development); - else if (Linux && Production) - result = nameof(Name.LinuxProduction); - else if (Linux && Staging) - result = nameof(Name.LinuxStaging); - else if (Linux && Development) - result = nameof(Name.LinuxDevelopment); - else if (OSX && Production) - result = nameof(Name.OSXProduction); - else if (OSX && Staging) - result = nameof(Name.OSXStaging); - else if (OSX && Development) - result = nameof(Name.OSXDevelopment); - else - throw new Exception(); - return result; - } - - private string GetAppSettingsFileName(int? processesCount) - { - string result; - if (Production) - { - if (processesCount is null) - result = "appsettings.json"; - else - result = $"appsettings.{processesCount}.json"; - } - else - { - string environment; - if (Staging) - environment = nameof(Staging); - else if (Development) - environment = nameof(Development); - else - throw new Exception(); - if (processesCount is null) - result = $"appsettings.{environment}.json"; - else - result = $"appsettings.{environment}.{processesCount}.json"; - } - return result; - } - - public static string GetEnvironmentName(IsEnvironment isEnvironment) - { - string result; - if (isEnvironment.Windows) - result = nameof(IsEnvironment.Windows); - else if (isEnvironment.Linux) - result = nameof(IsEnvironment.Linux); - else if (isEnvironment.OSX) - result = nameof(IsEnvironment.OSX); - else - throw new Exception(); - return result; - } - - } - -} \ No newline at end of file diff --git a/EDA Viewer/Shared/RijndaelEncryption.cs b/EDA Viewer/Shared/RijndaelEncryption.cs deleted file mode 100644 index a1e1c6c..0000000 --- a/EDA Viewer/Shared/RijndaelEncryption.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.IO; -using System.Security.Cryptography; -using System.Text; -using System.Text.RegularExpressions; - -namespace Shared -{ - - public static class RijndaelEncryption - { - /// - /// Change the Inputkey GUID when you use this code in your own program. - /// Keep this inputkey very safe and prevent someone from decoding it some way!! - /// Generated 2021-08-10 - /// - internal const string Inputkey = "970CCEF6-4307-4F6A-9AC8-377DADB889BD"; - - /// - /// Encrypt the given text and give the byte array back as a BASE64 string - /// - /// The text to encrypt - /// The pasword salt - /// The encrypted text - public static string Encrypt(string text, string salt) - { - string result; - if (string.IsNullOrEmpty(text)) - throw new ArgumentNullException("text"); - RijndaelManaged aesAlg = NewRijndaelManaged(salt); - ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); - MemoryStream msEncrypt = new MemoryStream(); - using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) - using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) - swEncrypt.Write(text); - result = Convert.ToBase64String(msEncrypt.ToArray()); - return result; - } - - /// - /// Checks if a string is base64 encoded - /// - /// The base64 encoded string - /// - public static bool IsBase64String(string base64String) - { - bool result; - base64String = base64String.Trim(); - result = (base64String.Length % 4 == 0) && Regex.IsMatch(base64String, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None); - return result; - } - - /// - /// Decrypts the given text - /// - /// The encrypted BASE64 text - /// The pasword salt - /// De gedecrypte text - public static string Decrypt(string cipherText, string salt) - { - if (string.IsNullOrEmpty(cipherText)) - throw new ArgumentNullException("cipherText"); - if (!IsBase64String(cipherText)) - throw new Exception("The cipherText input parameter is not base64 encoded"); - string text; - RijndaelManaged aesAlg = NewRijndaelManaged(salt); - ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); - byte[] cipher = Convert.FromBase64String(cipherText); - using (MemoryStream msDecrypt = new MemoryStream(cipher)) - { - using CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read); - using StreamReader srDecrypt = new StreamReader(csDecrypt); - text = srDecrypt.ReadToEnd(); - } - return text; - } - - /// - /// Create a new RijndaelManaged class and initialize it - /// - /// The pasword salt - /// - private static RijndaelManaged NewRijndaelManaged(string salt) - { - if (salt == null) - throw new ArgumentNullException("salt"); - byte[] saltBytes = Encoding.ASCII.GetBytes(salt); - Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(Inputkey, saltBytes); - RijndaelManaged aesAlg = new RijndaelManaged(); - aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8); - aesAlg.IV = key.GetBytes(aesAlg.BlockSize / 8); - return aesAlg; - } - } - -} \ No newline at end of file diff --git a/EDA Viewer/Singleton/Background.cs b/EDA Viewer/Singleton/Background.cs index 74a428a..f65c9aa 100644 --- a/EDA Viewer/Singleton/Background.cs +++ b/EDA Viewer/Singleton/Background.cs @@ -1,367 +1,362 @@ using EDAViewer.Models; +using EDAViewer.Models.Methods; using EDAViewer.Singleton.Helper; -using Infineon.Monitoring.MonA; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; -using Shared; -using System; -using System.Collections.Generic; +using IFX.Shared; using System.Globalization; -using System.IO; using System.IO.Compression; -using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Text.Json; using System.Text.RegularExpressions; -using System.Threading; using System.Xml; using System.Xml.Serialization; -namespace EDAViewer.Singleton +namespace EDAViewer.Singleton; + +public class Background : Models.Properties.IBackground, IBackground, IDisposable { - public partial class Background : IBackground + protected readonly List _Exceptions; + protected readonly List _Timers; + protected readonly string _WorkingDirectory; + protected string _Message; + public List Exceptions => _Exceptions; + public List Timers => _Timers; + public string Message => _Message; + public string WorkingDirectory => _WorkingDirectory; + + private bool _Stop; + private readonly object _Lock; + private readonly Calendar _Calendar; + private readonly Serilog.ILogger _Log; + private DateTime _PrimaryInstanceSetAt; + private readonly AppSettings _AppSettings; + private readonly IsEnvironment _IsEnvironment; + private string _EdaDataCollectionPlansLastRun; + + public Background(IsEnvironment isEnvironment, AppSettings appSettings, string workingDirectory) { + _Stop = false; + _Timers = new(); + _Lock = new object(); + _Message = string.Empty; + _AppSettings = appSettings; + _IsEnvironment = isEnvironment; + _Exceptions = new List(); + _WorkingDirectory = workingDirectory; + _PrimaryInstanceSetAt = DateTime.MinValue; + _Log = Serilog.Log.ForContext(); + _Calendar = new CultureInfo("en-US").Calendar; + _EdaDataCollectionPlansLastRun = string.Empty; + } - public List Timers => _Timers; - public string Message { get; private set; } - public string WorkingDirectory { get; private set; } - public List Exceptions { get; private set; } + void IBackground.Catch(Exception exception) + { + _Exceptions.Add(exception); + _Log.Error(exception, "Error:"); + } - private bool _ShuttingDown; - private readonly object _Lock; - private readonly Calendar _Calendar; - private readonly List _Timers; - private readonly AppSettings _AppSettings; - private readonly string[] _SiEquipmentTypes; - private readonly string[] _GaNEquipmentTypes; - private readonly IsEnvironment _IsEnvironment; + void IBackground.Stop(bool immediate) + { + if (!_Stop) + _Stop = true; + foreach (Timer timer in _Timers) + _ = timer.Change(Timeout.Infinite, 0); + } - private const string _Site = "sjc"; - - private Log _Log; - private DateTime _PrimaryInstanceSetAt; - private string _EdaDataCollectionPlansLastRun; - - public Background(IsEnvironment isEnvironment, AppSettings appSettings, string workingDirectory) - { - _Log = null; - Exceptions = new(); - _IsEnvironment = isEnvironment; - _Lock = new object(); - _ShuttingDown = false; - if (_Lock is null) - { } - Message = string.Empty; - _AppSettings = appSettings; - _Timers = new List(); - _IsEnvironment = isEnvironment; - WorkingDirectory = workingDirectory; - _PrimaryInstanceSetAt = DateTime.MinValue; - _EdaDataCollectionPlansLastRun = string.Empty; - _SiEquipmentTypes = GetEquipmentTypes(isGaN: false, isSi: true); - _GaNEquipmentTypes = GetEquipmentTypes(isGaN: true, isSi: false); - CultureInfo cultureInfo = new CultureInfo("en-US"); - _Calendar = cultureInfo.Calendar; - } - - public void Dispose() - { - foreach (Timer timer in _Timers) - timer.Dispose(); - } - - void IBackground.Update(ILogger logger) - { - Update(logger); - } - - internal void Update(ILogger logger) - { - _Log = new Log(logger); - //https://blog.magnusmontin.net/2018/11/05/platform-conditional-compilation-in-net-core/ - if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - _Log.Debug("Running on Linux!"); - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - _Log.Debug("Running on macOS!"); - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - _Log.Debug("Running on Windows!"); + void IBackground.Update(int milliSeconds) + { + _Log.Debug($"{milliSeconds} milliSecond(s) between timers"); + // https://blog.magnusmontin.net/2018/11/05/platform-conditional-compilation-in-net-core/ + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + _Log.Debug("Running on Linux!"); + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + _Log.Debug("Running on macOS!"); + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + _Log.Debug("Running on Windows!"); #if Linux - _Log.Debug("Built on Linux!"); + _Log.Debug("Built on Linux!"); #elif OSX - _Log.Debug("Built on macOS!"); + _Log.Debug("Built on macOS!"); #elif Windows - _Log.Debug("Built in Windows!"); + _Log.Debug("Built in Windows!"); #else - ()("Built in unkown!"); + ()("Built in Unknown!"); #endif - if (string.IsNullOrEmpty(_AppSettings.URLs) && !_IsEnvironment.Development) - throw new Exception("Invalid Application Settings URLs!"); + if (string.IsNullOrEmpty(_AppSettings.URLs) && !_IsEnvironment.Development) + throw new Exception("Invalid Application Settings URLs!"); + if (_IsEnvironment.Development) + { } + else if (_IsEnvironment.Staging) + { + } + else if (_IsEnvironment.Production) + { + } + else + throw new Exception(); + } - internal void Catch(Exception exception) - { - Exceptions.Add(exception); - _Log.Error(exception); - if (!string.IsNullOrEmpty(_AppSettings.MonARessource)) - { - MonIn monIn = MonIn.GetInstance(); - monIn.SendStatus(_Site, _AppSettings.MonARessource, "Heartbeat", State.Warning); - } - } + void IBackground.ClearMessage() => _Message = string.Empty; - public void SendStatusOk() - { - if (!string.IsNullOrEmpty(_AppSettings.MonARessource)) - { - MonIn monIn = MonIn.GetInstance(); - monIn.SendStatus(_Site, _AppSettings.MonARessource, "Heartbeat", State.Ok); - } - } + void IBackground.SetIsPrimaryInstance() => _PrimaryInstanceSetAt = DateTime.Now; - public string GetCountDirectory(string verb) - { - DateTime dateTime = DateTime.Now; - CultureInfo cultureInfo = new("en-US"); - Calendar calendar = cultureInfo.Calendar; - string weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - //string nameSpace = System.Reflection.Assembly.GetExecutingAssembly().EntryPoint.DeclaringType.Namespace; - string nameSpace = GetType().Namespace.Split('.')[0]; - if (!string.IsNullOrEmpty(_AppSettings.MonARessource)) - { - MonIn monIn = MonIn.GetInstance(); - monIn.SendStatus(_Site, _AppSettings.MonARessource, "Heartbeat", State.Up); - } - return string.Concat(@"\\", _AppSettings.Server, @"\EC_EDA\Counts\", dateTime.ToString("yyyy"), @"\", "Week_", weekOfYear, @"\", dateTime.ToString("yyyy - MM - dd"), @"\", "Application", @"\", nameSpace, @"\", verb, @"\", dateTime.Ticks); - } + void IBackground.ClearIsPrimaryInstance() => _PrimaryInstanceSetAt = DateTime.MinValue; - public void Stop(bool immediate) - { - _ShuttingDown = true; - foreach (Timer timer in _Timers) - timer.Change(Timeout.Infinite, 0); - if (!_IsEnvironment.Development) - { - if (!string.IsNullOrEmpty(_AppSettings.MonARessource)) - { - MonIn monIn = MonIn.GetInstance(); - monIn.SendStatus(_Site, _AppSettings.MonARessource, "Heartbeat", State.Down); - } - string countDirectory = GetCountDirectory("Stop"); - Directory.CreateDirectory(countDirectory); - } - } + void IDisposable.Dispose() + { + foreach (Timer timer in _Timers) + timer.Dispose(); + GC.SuppressFinalize(this); + } - public void ClearMessage() - { - Message = string.Empty; - } + void IBackground.Dispose() + { + IDisposable disposable = this; + disposable.Dispose(); + } - public void SetIsPrimaryInstance() + void IBackground.EDAOutputArchiveCallback() + { + DateTime dateTime = DateTime.Now; + if (dateTime.Hour is > 8 and < 17) { - _PrimaryInstanceSetAt = DateTime.Now; - } - - public void ClearIsPrimaryInstance() - { - _PrimaryInstanceSetAt = DateTime.MinValue; - } - - public bool IsPrimaryInstance() - { - bool result; - DateTime dateTime = DateTime.Now.AddDays(-1); - result = _PrimaryInstanceSetAt > dateTime; - return result; - } - - public void EdaDataCollectionPlansCallback() - { - string cSharpFormat = "yyyy-MM-dd_hh:mm:ss tt"; - string oracleFormat = "yyyy-MM-dd_hh:mi:ss AM"; - _Log.Debug(string.Concat("A) _EdaDataCollectionPlansLastRun = ", _EdaDataCollectionPlansLastRun)); - DataCollectionPlans(_AppSettings, _EdaDataCollectionPlansLastRun, cSharpFormat, oracleFormat); - _EdaDataCollectionPlansLastRun = DateTime.Now.ToString(cSharpFormat); - _Log.Debug(string.Concat("B) _EdaDataCollectionPlansLastRun = ", _EdaDataCollectionPlansLastRun)); - } - private void DeleteEmptyDirectories(string directory) - { - string[] files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories); - string[] directories = Directory.GetDirectories(directory, "*", SearchOption.AllDirectories); - if (files.Length == 0 && directories.Length == 0) - Directory.Delete(directory); + string sourceDirectory = string.Concat(@"\\", _AppSettings.Server, @"\ec_eda\Staging\Traces"); + if (!Directory.Exists(sourceDirectory)) + _Log.Debug(string.Concat("// Source directory <", sourceDirectory, "> doesn't exist.")); else - { - foreach (string subDirectory in Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly)) - { - if (_ShuttingDown) - break; - DeleteEmptyDirectories(subDirectory); - } - } + EDAOutputArchive(sourceDirectory); } - private void ZipFilesByDate(string sourceDirectory, SearchOption searchOption = SearchOption.TopDirectoryOnly, string dayFormat = null) + } + + void IBackground.EdaDataCollectionPlansCallback() + { + string cSharpFormat = "yyyy-MM-dd_hh:mm:ss tt"; + string oracleFormat = "yyyy-MM-dd_hh:mi:ss AM"; + _Log.Debug(string.Concat("A) _EdaDataCollectionPlansLastRun = ", _EdaDataCollectionPlansLastRun)); + DataCollectionPlans(_AppSettings, _EdaDataCollectionPlansLastRun, cSharpFormat, oracleFormat); + _EdaDataCollectionPlansLastRun = DateTime.Now.ToString(cSharpFormat); + _Log.Debug(string.Concat("B) _EdaDataCollectionPlansLastRun = ", _EdaDataCollectionPlansLastRun)); + + } + + string IBackground.GetCountDirectory(string verb) + { + DateTime dateTime = DateTime.Now; + string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + //string nameSpace = System.Reflection.Assembly.GetExecutingAssembly().EntryPoint.DeclaringType.Namespace; + string nameSpace = $"{GetType().Namespace}".Split('.')[0]; + // if (!_IsEnvironment.DebuggerWasAttachedDuringConstructor && !string.IsNullOrEmpty(_AppSettings.MonARessource)) + // { + // MonIn monIn = MonIn.GetInstance(); + // monIn.SendStatus(_Site, _AppSettings.MonARessource, "Heartbeat", State.Up); + // } + return string.Concat(@"\\", _AppSettings.Server, @"\EC_EAF\Counts\", dateTime.ToString("yyyy"), @"\", "Week_", weekOfYear, @"\", dateTime.ToString("yyyy - MM - dd"), @"\", "Application", @"\", nameSpace, @"\", verb, @"\", dateTime.Ticks); + } + + void IBackground.LogPathCleanUpByWeekCallback() + { + DateTime dateTime = DateTime.Now; + if (dateTime.Hour is > 8 and < 17) { - string key; - bool addFile; - string fileName; - string[] segments; - string[] subFiles; - string weekOfYear; - FileInfo fileInfo; - DateTime creationTime; - DateTime lastWriteTime; - Regex regex = new Regex("[a-zA-Z0-9]{1,}"); - DateTime dateTime = DateTime.Now.AddDays(-6); - DateTime firstEmail = new DateTime(2019, 3, 8); - CultureInfo cultureInfo = new CultureInfo("en-US"); - Calendar calendar = cultureInfo.Calendar; - int ticksLength = dateTime.Ticks.ToString().Length; - Dictionary weeks = new Dictionary(); - for (int i = 0; i < 1000; i++) + _Log.Debug(string.Concat("A) ", nameof(LogPathCleanUpByWeek))); + LogPathCleanUpByWeek(_AppSettings.Server, isEDA: true); + _Log.Debug(string.Concat("B) ", nameof(LogPathCleanUpByWeek))); + } + + } + + bool IBackground.IsPrimaryInstance() + { + bool result; + DateTime dateTime = DateTime.Now.AddDays(-1); + result = _PrimaryInstanceSetAt > dateTime; + return result; + } + + public override string ToString() + { + string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + return result; + } + + private void DeleteEmptyDirectories(string directory) + { + string[] files = Directory.GetFiles(directory, "*", SearchOption.AllDirectories); + string[] directories = Directory.GetDirectories(directory, "*", SearchOption.AllDirectories); + if (files.Length == 0 && directories.Length == 0) + Directory.Delete(directory); + else + { + foreach (string subDirectory in Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly)) { - if (_ShuttingDown) + if (_Stop) break; - dateTime = firstEmail.AddDays(i); - weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - key = string.Concat(dateTime.ToString("yyyy"), "_Week_", weekOfYear); - if (!weeks.ContainsKey(key)) - weeks.Add(key, dateTime); + DeleteEmptyDirectories(subDirectory); } - weekOfYear = calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - string skipKey = string.Concat(DateTime.Now.ToString("yyyy"), "_Week_", weekOfYear); - Dictionary> keyValuePairs = new Dictionary>(); - string[] topDirectories = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly); - if (topDirectories.Length == 0) - topDirectories = new string[] { sourceDirectory }; - foreach (string topDirectory in topDirectories) + } + } + + private void ZipFilesByDate(string sourceDirectory, SearchOption searchOption = SearchOption.TopDirectoryOnly, string? dayFormat = null) + { + string key; + bool addFile; + string fileName; + FileInfo fileInfo; + string weekOfYear; + string[] segments; + string[] subFiles; + DateTime creationTime; + DateTime lastWriteTime; + Regex regex = new("[a-zA-Z0-9]{1,}"); + DateTime firstEmail = new(2019, 3, 8); + CultureInfo cultureInfo = new("en-US"); + Calendar calendar = cultureInfo.Calendar; + Dictionary weeks = new(); + DateTime dateTime = DateTime.Now.AddDays(-6); + int ticksLength = dateTime.Ticks.ToString().Length; + for (int i = 0; i < 1000; i++) + { + if (_Stop) + break; + dateTime = firstEmail.AddDays(i); + weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + key = string.Concat(dateTime.ToString("yyyy"), "_Week_", weekOfYear); + if (!weeks.ContainsKey(key)) + weeks.Add(key, dateTime); + } + Dictionary> keyValuePairs = new(); + weekOfYear = calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + string skipKey = string.Concat(DateTime.Now.ToString("yyyy"), "_Week_", weekOfYear); + string[] topDirectories = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly); + if (topDirectories.Length == 0) + topDirectories = new string[] { sourceDirectory }; + foreach (string topDirectory in topDirectories) + { + if (_Stop) + break; + keyValuePairs.Clear(); + subFiles = Directory.GetFiles(topDirectory, "*", searchOption); + foreach (string subFile in subFiles) { - if (_ShuttingDown) + if (_Stop) break; - keyValuePairs.Clear(); - subFiles = Directory.GetFiles(topDirectory, "*", searchOption); - foreach (string subFile in subFiles) + addFile = false; + if (subFile.EndsWith(".zip")) + continue; + fileName = Path.GetFileName(subFile); + fileInfo = new FileInfo(subFile); + creationTime = fileInfo.CreationTime; + if (creationTime > dateTime) + continue; + lastWriteTime = fileInfo.LastWriteTime; + if (fileName.Contains(lastWriteTime.ToString("yyyyMMdd")) || fileName.Contains(lastWriteTime.ToString("yyyy-MM-dd")) || + fileName.Contains(creationTime.ToString("yyyyMMdd")) || fileName.Contains(creationTime.ToString("yyyy-MM-dd")) || + fileName.Contains(lastWriteTime.ToString("yyMMdd")) || fileName.Contains(lastWriteTime.ToString("yy-MM-dd")) || + fileName.Contains(creationTime.ToString("yyMMdd")) || fileName.Contains(creationTime.ToString("yy-MM-dd")) || + fileName.Contains(lastWriteTime.AddDays(-1).ToString("yyyyMMdd")) || fileName.Contains(lastWriteTime.AddDays(-1).ToString("yyyy-MM-dd")) || + fileName.Contains(creationTime.AddDays(-1).ToString("yyyyMMdd")) || fileName.Contains(creationTime.AddDays(-1).ToString("yyyy-MM-dd")) || + fileName.Contains(lastWriteTime.AddDays(-1).ToString("yyMMdd")) || fileName.Contains(lastWriteTime.AddDays(-1).ToString("yy-MM-dd")) || + fileName.Contains(creationTime.AddDays(-1).ToString("yyMMdd")) || fileName.Contains(creationTime.AddDays(-1).ToString("yy-MM-dd"))) + addFile = true; + if (!addFile && fileName.Length > ticksLength) { - if (_ShuttingDown) - break; - addFile = false; - if (subFile.EndsWith(".zip")) - continue; - fileName = Path.GetFileName(subFile); - fileInfo = new FileInfo(subFile); - creationTime = fileInfo.CreationTime; - if (creationTime > dateTime) - continue; - lastWriteTime = fileInfo.LastWriteTime; - if (fileName.Contains(lastWriteTime.ToString("yyyyMMdd")) || fileName.Contains(lastWriteTime.ToString("yyyy-MM-dd")) || - fileName.Contains(creationTime.ToString("yyyyMMdd")) || fileName.Contains(creationTime.ToString("yyyy-MM-dd")) || - fileName.Contains(lastWriteTime.ToString("yyMMdd")) || fileName.Contains(lastWriteTime.ToString("yy-MM-dd")) || - fileName.Contains(creationTime.ToString("yyMMdd")) || fileName.Contains(creationTime.ToString("yy-MM-dd")) || - fileName.Contains(lastWriteTime.AddDays(-1).ToString("yyyyMMdd")) || fileName.Contains(lastWriteTime.AddDays(-1).ToString("yyyy-MM-dd")) || - fileName.Contains(creationTime.AddDays(-1).ToString("yyyyMMdd")) || fileName.Contains(creationTime.AddDays(-1).ToString("yyyy-MM-dd")) || - fileName.Contains(lastWriteTime.AddDays(-1).ToString("yyMMdd")) || fileName.Contains(lastWriteTime.AddDays(-1).ToString("yy-MM-dd")) || - fileName.Contains(creationTime.AddDays(-1).ToString("yyMMdd")) || fileName.Contains(creationTime.AddDays(-1).ToString("yy-MM-dd"))) - addFile = true; - if (!addFile && fileName.Length > ticksLength) + MatchCollection matches = regex.Matches(fileName); + foreach (Match match in matches) { - MatchCollection matches = regex.Matches(fileName); - foreach (Match match in matches) - { - if (_ShuttingDown) - break; - if (match.Value.Length != ticksLength) - continue; - if (!long.TryParse(match.Value, out long ticks)) - continue; - addFile = true; - break; - } - if (addFile) + if (_Stop) break; + if (match.Value.Length != ticksLength) + continue; + if (!long.TryParse(match.Value, out long ticks)) + continue; + addFile = true; + break; } if (addFile) - { - weekOfYear = calendar.GetWeekOfYear(lastWriteTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - if (string.IsNullOrEmpty(dayFormat)) - key = string.Concat(lastWriteTime.ToString("yyyy"), "_Week_", weekOfYear); - else - key = string.Concat(lastWriteTime.ToString("yyyy"), "_Week_", weekOfYear, "_", lastWriteTime.ToString(dayFormat)); - if (key == skipKey) - continue; - if (!keyValuePairs.ContainsKey(key)) - keyValuePairs.Add(key, new List()); - keyValuePairs[key].Add(subFile); - } + break; } - foreach (KeyValuePair> element in keyValuePairs) + if (addFile) { - if (_ShuttingDown) - break; - key = string.Concat(topDirectory, @"\", element.Key, ".zip"); - if (File.Exists(key)) - { - for (short i = 101; i < short.MaxValue; i++) - { - if (_ShuttingDown) - break; - key = string.Concat(topDirectory, @"\", element.Key, "_", i, ".zip"); - if (!File.Exists(key)) - break; - } - } - if (_ShuttingDown) - break; - lock (_Lock) - { - using (ZipArchive zip = ZipFile.Open(key, ZipArchiveMode.Create)) - { - foreach (string file in element.Value) - { - zip.CreateEntryFromFile(file, Path.GetFileName(file)); - File.Delete(file); - } - } - } + weekOfYear = calendar.GetWeekOfYear(lastWriteTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + if (string.IsNullOrEmpty(dayFormat)) + key = string.Concat(lastWriteTime.ToString("yyyy"), "_Week_", weekOfYear); + else + key = string.Concat(lastWriteTime.ToString("yyyy"), "_Week_", weekOfYear, "_", lastWriteTime.ToString(dayFormat)); + if (key == skipKey) + continue; + if (!keyValuePairs.ContainsKey(key)) + keyValuePairs.Add(key, new List()); + keyValuePairs[key].Add(subFile); } - subFiles = Directory.GetFiles(topDirectory, "*.zip", SearchOption.TopDirectoryOnly); - foreach (string subFile in subFiles) - { - if (_ShuttingDown) - break; - fileName = Path.GetFileNameWithoutExtension(subFile); - segments = fileName.Split('_'); - if (segments.Length > 2) - fileName = string.Concat(segments[0], '_', segments[1], '_', segments[2]); - if (weeks.ContainsKey(fileName)) - { - try - { File.SetLastWriteTime(subFile, weeks[fileName]); } - catch (Exception) { } - } - } - if (topDirectory != sourceDirectory) - try - { DeleteEmptyDirectories(topDirectory); } - catch (Exception) { } - //Print(topDirectory); } - } - - public void LogPathCleanUpByWeek(string server, bool isEDA = false, bool isNA = false) - { - if (isEDA && isNA) - throw new Exception(); - else if (!isEDA && !isNA) - throw new Exception(); - string share; - Tuple[] tuples; - if (isEDA) + foreach (KeyValuePair> element in keyValuePairs) { - share = string.Concat(@"\\", server, @"\ec_eda"); - tuples = new Tuple[] + if (_Stop) + break; + key = string.Concat(topDirectory, @"\", element.Key, ".zip"); + if (File.Exists(key)) { + for (short i = 101; i < short.MaxValue; i++) + { + if (_Stop) + break; + key = string.Concat(topDirectory, @"\", element.Key, "_", i, ".zip"); + if (!File.Exists(key)) + break; + } + } + if (_Stop) + break; + lock (_Lock) + { + using ZipArchive zip = ZipFile.Open(key, ZipArchiveMode.Create); + foreach (string file in element.Value) + { + _ = zip.CreateEntryFromFile(file, Path.GetFileName(file)); + File.Delete(file); + } + } + } + subFiles = Directory.GetFiles(topDirectory, "*.zip", SearchOption.TopDirectoryOnly); + foreach (string subFile in subFiles) + { + if (_Stop) + break; + fileName = Path.GetFileNameWithoutExtension(subFile); + segments = fileName.Split('_'); + if (segments.Length > 2) + fileName = string.Concat(segments[0], '_', segments[1], '_', segments[2]); + if (weeks.ContainsKey(fileName)) + { + try + { File.SetLastWriteTime(subFile, weeks[fileName]); } + catch (Exception) { } + } + } + if (topDirectory != sourceDirectory) + try + { DeleteEmptyDirectories(topDirectory); } + catch (Exception) { } + //Print(topDirectory); + } + } + + private void LogPathCleanUpByWeek(string server, bool isEDA = false, bool isNA = false) + { + if (isEDA && isNA) + throw new Exception(); + else if (!isEDA && !isNA) + throw new Exception(); + string share; + Tuple[] tuples; + if (isEDA) + { + share = string.Concat(@"\\", server, @"\ec_eda"); + tuples = new Tuple[] + { new Tuple(@"\Staging\Traces\MET08ANLYSDIFAAST230\LogFile", string.Empty), //new Tuple(@"\Staging\Traces\DEP08EGANAIXG5HT\R69-HSMS\LogFile", "yyyy_MM_dd"), //new Tuple(@"\Staging\Traces\DEP08EGANAIXG5\LogFile\R69-HSMS", "yyyy_MM_dd"), @@ -371,542 +366,465 @@ namespace EDAViewer.Singleton new Tuple(@"\Staging\Traces\MET08XRDXPERTPROMRDXL_Weekly\LogFile", string.Empty), new Tuple(@"\Staging\Traces\MET08DDINCAN8620_Daily\LogFile", string.Empty), new Tuple(@"\Staging\Traces\MET08PRFUSB4000\LogFile", string.Empty), - }; - } + }; + } + else if (isNA) + throw new Exception(); + else + throw new Exception(); + string[] files; + string weekOfYear; + FileInfo fileInfo; + string newDirectroy; + string sourceDirectory; + DateTime lastWriteTime; + string[] topDirectories; + long twoDays = DateTime.Now.AddDays(-2).Ticks; + foreach (Tuple tuple in tuples) + { + if (_Stop) + break; + sourceDirectory = string.Concat(share, tuple.Item1); + if (!Directory.Exists(sourceDirectory)) + continue; + if (isEDA) + topDirectories = new string[] { sourceDirectory }; else if (isNA) throw new Exception(); else throw new Exception(); - string[] files; - string weekOfYear; - FileInfo fileInfo; - string newDirectroy; - string sourceDirectory; - DateTime lastWriteTime; - string[] topDirectories; - long twoDays = DateTime.Now.AddDays(-2).Ticks; - foreach (Tuple tuple in tuples) + if (topDirectories.Length == 0) + topDirectories = new string[] { sourceDirectory }; + foreach (string topDirectory in topDirectories) { - if (_ShuttingDown) + if (_Stop) break; - sourceDirectory = string.Concat(share, tuple.Item1); - if (!Directory.Exists(sourceDirectory)) - continue; - if (isEDA) - topDirectories = new string[] { sourceDirectory }; - else if (isNA) - throw new Exception(); - else - throw new Exception(); - if (topDirectories.Length == 0) - topDirectories = new string[] { sourceDirectory }; - foreach (string topDirectory in topDirectories) + files = Directory.GetFiles(topDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string file in files) { - if (_ShuttingDown) + if (_Stop) break; - files = Directory.GetFiles(topDirectory, "*", SearchOption.TopDirectoryOnly); - foreach (string file in files) + if (file.EndsWith(".zip")) + continue; + fileInfo = new FileInfo(file); + lastWriteTime = fileInfo.LastAccessTime; + if (lastWriteTime.Ticks > twoDays) + continue; + weekOfYear = _Calendar.GetWeekOfYear(lastWriteTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + newDirectroy = string.Concat(topDirectory, @"\", lastWriteTime.ToString("yyyy"), "___Week_", weekOfYear, @"\", lastWriteTime.ToString("yyyy_MM_dd")); + if (!Directory.Exists(newDirectroy)) + _ = Directory.CreateDirectory(newDirectroy); + if (!fileInfo.Exists) + continue; + if (!_Stop) { - if (_ShuttingDown) - break; - if (file.EndsWith(".zip")) - continue; - fileInfo = new FileInfo(file); - lastWriteTime = fileInfo.LastAccessTime; - if (lastWriteTime.Ticks > twoDays) - continue; - weekOfYear = _Calendar.GetWeekOfYear(lastWriteTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - newDirectroy = string.Concat(topDirectory, @"\", lastWriteTime.ToString("yyyy"), "___Week_", weekOfYear, @"\", lastWriteTime.ToString("yyyy_MM_dd")); - if (!Directory.Exists(newDirectroy)) - Directory.CreateDirectory(newDirectroy); - if (!fileInfo.Exists) - continue; - if (!_ShuttingDown) - { - lock (_Lock) - File.Move(file, string.Concat(newDirectroy, @"\", Path.GetFileName(file))); - } + lock (_Lock) + File.Move(file, string.Concat(newDirectroy, @"\", Path.GetFileName(file))); } } } - foreach (Tuple tuple in tuples) - { - if (_ShuttingDown) - break; - sourceDirectory = string.Concat(share, tuple.Item1); - if (!Directory.Exists(sourceDirectory)) - continue; - ZipFilesByDate(sourceDirectory, SearchOption.AllDirectories, tuple.Item2); - } } - - public void LogPathCleanUpByWeekCallback() + foreach (Tuple tuple in tuples) { - DateTime dateTime = DateTime.Now; - if (dateTime.Hour > 8 && dateTime.Hour < 17) - { - _Log.Debug(string.Concat("A) ", nameof(LogPathCleanUpByWeek))); - LogPathCleanUpByWeek(_AppSettings.Server, isEDA: true); - _Log.Debug(string.Concat("B) ", nameof(LogPathCleanUpByWeek))); - } + if (_Stop) + break; + sourceDirectory = string.Concat(share, tuple.Item1); + if (!Directory.Exists(sourceDirectory)) + continue; + ZipFilesByDate(sourceDirectory, SearchOption.AllDirectories, tuple.Item2); } + } - public void EDAOutputArchive(string sourceDirectory) + void EDAOutputArchive(string sourceDirectory) + { + string key; + string[] files; + string[] cellIntaces; + string fileWeekOfYear; + DateTime fileDateTime; + string checkDirectory; + string cellInstancesName; + string emptyFilesDirectory; + int today = DateTime.Now.Day; + string recipeArchiveDirectory; + Dictionary> keyValuePairs = new(); + string[] equipmentTypes = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string equipmentType in equipmentTypes) { - string key; - string[] files; - string[] cellIntaces; - string fileWeekOfYear; - DateTime fileDateTime; - string checkDirectory; - string cellInstancesName; - string emptyFilesDirectory; - int today = DateTime.Now.Day; - string recipeArchiveDirectory; - Dictionary> keyValuePairs = new Dictionary>(); - string[] equipmentTypes = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly); - foreach (string equipmentType in equipmentTypes) + if (_Stop) + break; + if (equipmentType.EndsWith(@"\_ Copy") || equipmentType.EndsWith(@"\_ Empty") || equipmentType.EndsWith(@"\CellInstance") || equipmentType.EndsWith(@"\IQS") || equipmentType.EndsWith(@"\Villach")) + continue; + checkDirectory = string.Concat(equipmentType, @"\Ignore\Recipe"); + if (!Directory.Exists(checkDirectory)) + _ = Directory.CreateDirectory(checkDirectory); + cellIntaces = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string cellIntace in cellIntaces) { - if (_ShuttingDown) + if (_Stop) break; - if (equipmentType.EndsWith(@"\_ Copy") || equipmentType.EndsWith(@"\_ Empty") || equipmentType.EndsWith(@"\CellInstance") || equipmentType.EndsWith(@"\IQS") || equipmentType.EndsWith(@"\Villach")) - continue; - checkDirectory = string.Concat(equipmentType, @"\Ignore\Recipe"); - if (!Directory.Exists(checkDirectory)) - Directory.CreateDirectory(checkDirectory); - cellIntaces = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly); - foreach (string cellIntace in cellIntaces) + keyValuePairs.Clear(); + cellInstancesName = Path.GetFileName(cellIntace); + recipeArchiveDirectory = string.Concat(equipmentType, @"\Ignore\!Archive\Recipe\", cellInstancesName); + if (!Directory.Exists(recipeArchiveDirectory)) + _ = Directory.CreateDirectory(recipeArchiveDirectory); + emptyFilesDirectory = string.Concat(equipmentType, @"\Ignore\!Archive\EmptyFiles\", cellInstancesName); + if (!Directory.Exists(emptyFilesDirectory)) + _ = Directory.CreateDirectory(emptyFilesDirectory); + files = Directory.GetFiles(cellIntace, "*", SearchOption.TopDirectoryOnly); + foreach (string file in files) { - if (_ShuttingDown) + if (_Stop) break; - keyValuePairs.Clear(); - cellInstancesName = Path.GetFileName(cellIntace); - recipeArchiveDirectory = string.Concat(equipmentType, @"\Ignore\!Archive\Recipe\", cellInstancesName); - if (!Directory.Exists(recipeArchiveDirectory)) - Directory.CreateDirectory(recipeArchiveDirectory); - emptyFilesDirectory = string.Concat(equipmentType, @"\Ignore\!Archive\EmptyFiles\", cellInstancesName); - if (!Directory.Exists(emptyFilesDirectory)) - Directory.CreateDirectory(emptyFilesDirectory); - files = Directory.GetFiles(cellIntace, "*", SearchOption.TopDirectoryOnly); - foreach (string file in files) + fileDateTime = new FileInfo(file).LastWriteTime; + if (fileDateTime.Day != today) { - if (_ShuttingDown) - break; - fileDateTime = new FileInfo(file).LastWriteTime; - if (fileDateTime.Day != today) + fileWeekOfYear = _Calendar.GetWeekOfYear(fileDateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); + key = string.Concat(fileDateTime.ToString("yyyy-MM-dd"), "_Week_", fileWeekOfYear); + if (!keyValuePairs.ContainsKey(key)) + keyValuePairs.Add(key, new List()); + keyValuePairs[key].Add(file); + } + } + foreach (KeyValuePair> element in keyValuePairs) + { + if (_Stop) + break; + lock (_Lock) + { + key = string.Concat(recipeArchiveDirectory, @"\", element.Key.Split('-')[0]); + if (!Directory.Exists(key)) + _ = Directory.CreateDirectory(key); + key = string.Concat(recipeArchiveDirectory, @"\", element.Key.Split('-')[0], @"\", element.Key, ".zip"); + if (File.Exists(key)) { - fileWeekOfYear = _Calendar.GetWeekOfYear(fileDateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); - key = string.Concat(fileDateTime.ToString("yyyy-MM-dd"), "_Week_", fileWeekOfYear); - if (!keyValuePairs.ContainsKey(key)) - keyValuePairs.Add(key, new List()); - keyValuePairs[key].Add(file); + for (short i = 101; i < short.MaxValue; i++) + { + key = string.Concat(recipeArchiveDirectory, @"\", element.Key.Split('-')[0], @"\", element.Key, "_", i, ".zip"); + if (!File.Exists(key)) + break; + } } } - foreach (KeyValuePair> element in keyValuePairs) + if (!string.IsNullOrEmpty(key)) { - if (_ShuttingDown) + if (_Stop) break; lock (_Lock) { - key = string.Concat(recipeArchiveDirectory, @"\", element.Key.Split('-')[0]); - if (!Directory.Exists(key)) - Directory.CreateDirectory(key); - key = string.Concat(recipeArchiveDirectory, @"\", element.Key.Split('-')[0], @"\", element.Key, ".zip"); - if (File.Exists(key)) + using ZipArchive zip = ZipFile.Open(key, ZipArchiveMode.Create); + foreach (string file in element.Value) { - for (short i = 101; i < short.MaxValue; i++) - { - key = string.Concat(recipeArchiveDirectory, @"\", element.Key.Split('-')[0], @"\", element.Key, "_", i, ".zip"); - if (!File.Exists(key)) - break; - } - } - } - if (!string.IsNullOrEmpty(key)) - { - if (_ShuttingDown) - break; - lock (_Lock) - { - using ZipArchive zip = ZipFile.Open(key, ZipArchiveMode.Create); - foreach (string file in element.Value) - { - zip.CreateEntryFromFile(file, Path.GetFileName(file)); - File.Delete(file); - } + _ = zip.CreateEntryFromFile(file, Path.GetFileName(file)); + File.Delete(file); } } } } } } + } - public void EDAOutputArchiveCallback() + private Stream ToStream(string @this) + { + MemoryStream? stream = new(); + StreamWriter? writer = new(stream); + writer.Write(@this); + writer.Flush(); + stream.Position = 0; + return stream; + } + + private T? ParseXML(string @this, bool throwExceptions) where T : class + { + object? result = null; + try { - DateTime dateTime = DateTime.Now; - if (dateTime.Hour > 8 && dateTime.Hour < 17) - { - string sourceDirectory = string.Concat(@"\\", _AppSettings.Server, @"\ec_eda\Staging\Traces"); - if (!Directory.Exists(sourceDirectory)) - _Log.Debug(string.Concat("// Source directory <", sourceDirectory, "> doesn't exist.")); - else - EDAOutputArchive(sourceDirectory); - } + Stream stream = ToStream(@this.Trim()); + XmlReader? reader = XmlReader.Create(stream, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document }); + XmlSerializer xmlSerializer = new(typeof(T), typeof(T).GetNestedTypes()); + result = xmlSerializer.Deserialize(reader); + stream.Dispose(); } - - public static string[] GetEquipmentTypes(bool isGaN = false, bool isSi = false) + catch (Exception) { - string[] results; - if (isGaN && isSi) - throw new Exception(); - else if (!isGaN && !isSi) - isGaN = true; - if (isSi) + if (throwExceptions) + throw; + } + return result as T; + } + + private void DataCollectionPlans(AppSettings appSettings, string edaDataCollectionPlansLastRun, string cSharpFormat, string oracleFormat) + { + object _Lock = new(); + bool _ShuttingDown = false; + bool dev = appSettings.Server.Contains("_ec_"); + Dictionary>>> rows = new(); + // + //int moduleinstancetypename = 0; + int unitname = 1; + //int modulename = 2; + int containername = 3; + int configurationstate = 4; + int configurationproductivestate = 5; + //int containermodifiername = 6; + int containermodifieddate = 7; + int containerconfiguration = 8; + int configurationmodifieddate = 9; + string objectTypeDirectory; + string workingDirectory = string.Concat(@"\\", appSettings.Server, @"\EC_EDA"); + // () + { + object @object; + string? @string; + int fieldCount; + List row; + string decrypted; + string connectionName; + string connectionString; + StringBuilder sql = new(); + Array objectTypes = Enum.GetValues(typeof(ModuleInstanceTypeName)); + List> connections = new(); + if (dev) { - results = new string[] - { - Shared.EquipmentType.MET08ANLYSDIFAAST230_Semi.ToString(), - Shared.EquipmentType.MET08DDUPSFS6420.ToString(), - Shared.EquipmentType.MET08DDUPSP1TBI.ToString(), - Shared.EquipmentType.MET08RESIHGCV.ToString(), - Shared.EquipmentType.MET08RESIMAPCDE.ToString(), - Shared.EquipmentType.MET08THFTIRQS408M.ToString(), - Shared.EquipmentType.MET08THFTIRSTRATUS.ToString() - }; - } - else if (isGaN) - { - results = new string[] - { - Shared.EquipmentType.DEP08EGANAIXG5.ToString(), - Shared.EquipmentType.MET08AFMD3100.ToString(), - Shared.EquipmentType.MET08BVHGPROBE.ToString(), - Shared.EquipmentType.MET08CVHGPROBE802B150.ToString(), - Shared.EquipmentType.MET08CVHGPROBE802B150_Monthly.ToString(), - Shared.EquipmentType.MET08CVHGPROBE802B150_Weekly.ToString(), - Shared.EquipmentType.MET08DDINCAN8620.ToString(), - Shared.EquipmentType.MET08DDINCAN8620_Daily.ToString(), - Shared.EquipmentType.MET08EBEAMINTEGRITY26.ToString(), - Shared.EquipmentType.MET08HALLHL5580.ToString(), - Shared.EquipmentType.MET08HALLHL5580_Monthly.ToString(), - Shared.EquipmentType.MET08HALLHL5580_Weekly.ToString(), - Shared.EquipmentType.MET08MESMICROSCOPE.ToString(), - Shared.EquipmentType.MET08NDFRESIMAP151C.ToString(), - Shared.EquipmentType.MET08NDFRESIMAP151C_Verification.ToString(), - Shared.EquipmentType.MET08PLMAPRPM.ToString(), - Shared.EquipmentType.MET08PLMAPRPM_Daily.ToString(), - Shared.EquipmentType.MET08PLMAPRPM_Verification.ToString(), - Shared.EquipmentType.MET08PLMPPLATO.ToString(), - Shared.EquipmentType.MET08PRFUSB4000.ToString(), - Shared.EquipmentType.MET08UVH44GS100M.ToString(), - Shared.EquipmentType.MET08VPDSUBCON.ToString(), - Shared.EquipmentType.MET08WGEOMX203641Q.ToString(), - Shared.EquipmentType.MET08WGEOMX203641Q_Verification.ToString(), - Shared.EquipmentType.METBRXRAYJV7300L.ToString(), - Shared.EquipmentType.MET08XRDXPERTPROMRDXL.ToString(), - Shared.EquipmentType.MET08XRDXPERTPROMRDXL_Monthly.ToString(), - Shared.EquipmentType.MET08XRDXPERTPROMRDXL_Weekly.ToString() - }; + connectionName = @"DEV"; + connectionString = Helper.Background.EDADatabase.GetEdaDevelopment(); + decrypted = RijndaelEncryption.Decrypt(appSettings.IFXEDADatabasePassword, appSettings.Company); + connectionString = string.Concat(connectionString, decrypted, ";"); + connections.Add(new Tuple(connectionName, connectionString)); } else - throw new Exception(); - return results; - } - - private Stream ToStream(string @this) - { - var stream = new MemoryStream(); - var writer = new StreamWriter(stream); - writer.Write(@this); - writer.Flush(); - stream.Position = 0; - return stream; - } - - private T ParseXML(string @this, bool throwExceptions) where T : class - { - object result = null; - try { - Stream stream = ToStream(@this.Trim()); - var reader = XmlReader.Create(stream, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document }); - //XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); - XmlSerializer xmlSerializer = new XmlSerializer(typeof(T), typeof(T).GetNestedTypes()); - result = xmlSerializer.Deserialize(reader); - stream.Dispose(); + connectionName = "Staging"; + connectionString = Helper.Background.EDADatabase.GetEdaStaging(); + decrypted = RijndaelEncryption.Decrypt(appSettings.ECEDADatabasePassword, appSettings.Company); + connectionString = string.Concat(connectionString, decrypted, ";"); + connections.Add(new Tuple(connectionName, connectionString)); + connectionName = "Production"; + connectionString = Helper.Background.EDADatabase.GetEdaProduction(); + connectionString = string.Concat(connectionString, decrypted, ";"); + connections.Add(new Tuple(connectionName, connectionString)); } - catch (Exception) + foreach (Tuple connection in connections) { - if (throwExceptions) - throw; - } - return result as T; - } - - public void DataCollectionPlans(AppSettings appSettings, string edaDataCollectionPlansLastRun, string cSharpFormat, string oracleFormat) - { - bool _ShuttingDown = false; - object _Lock = new object(); - bool dev = appSettings.Server.Contains("_ec_"); - Dictionary>>> rows = new Dictionary>>>(); - // - //int moduleinstancetypename = 0; - int unitname = 1; - //int modulename = 2; - int containername = 3; - int configurationstate = 4; - int configurationproductivestate = 5; - //int containermodifiername = 6; - int containermodifieddate = 7; - int containerconfiguration = 8; - int configurationmodifieddate = 9; - string objectTypeDirectory; - string workingDirectory = string.Concat(@"\\", appSettings.Server, @"\EC_EDA"); - // () - { - object @object; - string @string; - int fieldCount; - List row; - string decrypted; - string connectionName; - string connectionString; - StringBuilder sql = new StringBuilder(); - Array objectTypes = Enum.GetValues(typeof(ModuleInstanceTypeName)); - List> connections = new List>(); - if (dev) - { - connectionName = @"DEV"; - connectionString = EDAViewer.Singleton.Helper.Background.EDADatabase.GetEdaDevelopment(); - decrypted = RijndaelEncryption.Decrypt(appSettings.IFXEDADatabasePassword, appSettings.Company); - connectionString = string.Concat(connectionString, decrypted, ";"); - connections.Add(new Tuple(connectionName, connectionString)); - } - else - { - connectionName = "Staging"; - connectionString = EDAViewer.Singleton.Helper.Background.EDADatabase.GetEdaStaging(); - decrypted = RijndaelEncryption.Decrypt(appSettings.ECEDADatabasePassword, appSettings.Company); - connectionString = string.Concat(connectionString, decrypted, ";"); - connections.Add(new Tuple(connectionName, connectionString)); - connectionName = "Production"; - connectionString = EDAViewer.Singleton.Helper.Background.EDADatabase.GetEdaProduction(); - connectionString = string.Concat(connectionString, decrypted, ";"); - connections.Add(new Tuple(connectionName, connectionString)); - } - foreach (Tuple connection in connections) + if (_ShuttingDown) + break; + rows.Add(connection.Item1, new Dictionary>>()); + foreach (ModuleInstanceTypeName objectType in objectTypes) { if (_ShuttingDown) break; - rows.Add(connection.Item1, new Dictionary>>()); - foreach (ModuleInstanceTypeName objectType in objectTypes) + if (string.IsNullOrEmpty(edaDataCollectionPlansLastRun)) { - if (_ShuttingDown) - break; - if (string.IsNullOrEmpty(edaDataCollectionPlansLastRun)) - { - objectTypeDirectory = string.Concat(workingDirectory, @"\", connection.Item1, @"\", objectType); - if (!Directory.Exists(objectTypeDirectory)) - Directory.CreateDirectory(objectTypeDirectory); - else - edaDataCollectionPlansLastRun = new DirectoryInfo(objectTypeDirectory).LastWriteTime.ToString(cSharpFormat); - } - if (!rows[connection.Item1].ContainsKey(objectType)) - rows[connection.Item1].Add(objectType, new List>()); - using (Oracle.ManagedDataAccess.Client.OracleConnection oracleConnection = new Oracle.ManagedDataAccess.Client.OracleConnection(connection.Item2)) - { - sql.Clear(); - oracleConnection.Open(); - sql.Append(" select v.moduleinstancetypename, v.unitname, "). - Append(" v.modulename, v.containername, v.configurationstate, "). - Append(" v.configurationproductivestate, v.containermodifiername, "). - Append(" v.containermodifieddate, v.containerconfiguration, v.configurationmodifieddate "). - Append(" from veditconfiguration v "). - Append(" where v.moduleinstancetypename = '").Append(objectType.ToString()).Append("' "); - //Append(" and v.containerversion in ('4.80', '4.111') "); - if (!string.IsNullOrEmpty(edaDataCollectionPlansLastRun)) - sql.Append(" and greatest(v.containermodifieddate, v.configurationmodifieddate) >= to_date('").Append(edaDataCollectionPlansLastRun).Append("', '").Append(oracleFormat).Append("') "); - //Print(sql.ToString()); - using (Oracle.ManagedDataAccess.Client.OracleCommand oracleCommand = new Oracle.ManagedDataAccess.Client.OracleCommand(sql.ToString(), oracleConnection)) - { - using (Oracle.ManagedDataAccess.Client.OracleDataReader oracleDataReader = oracleCommand.ExecuteReader()) - { - fieldCount = oracleDataReader.FieldCount; - while (oracleDataReader.Read()) - { - if (_ShuttingDown) - break; - row = new List(); - for (int c = 0; c < fieldCount; c++) - { - @object = oracleDataReader.GetValue(c); - row.Add(@object); - @string = @object.ToString(); - //if (@string.Length < 128) - // _Log.Debug(@string); - } - rows[connection.Item1][objectType].Add(row); - } - } - } - }; + objectTypeDirectory = string.Concat(workingDirectory, @"\", connection.Item1, @"\", objectType); + if (!Directory.Exists(objectTypeDirectory)) + _ = Directory.CreateDirectory(objectTypeDirectory); + else + edaDataCollectionPlansLastRun = new DirectoryInfo(objectTypeDirectory).LastWriteTime.ToString(cSharpFormat); } - } - } - if (rows.Any()) - { - string csv; - string xml; - string json; - string text; - string html; - Common common; - string emptyAPC; - string fileName; - string edaObjectFile; - string goldDirectory; - string unitDirectory; - string replace = "$$$"; - string edaObjectDirectory; - DateTime lastModifiedDate; - DateTime containerModifiedDate; - PDSFConfiguration configuration; - DateTime configurationModifiedDate; - JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { WriteIndented = true }; - foreach (KeyValuePair>>> databaseElement in rows) - { - if (_ShuttingDown) - break; - emptyAPC = string.Concat(workingDirectory, @"\", databaseElement.Key, @"\EmptyAPC.xlsx"); - foreach (KeyValuePair>> tableNameElement in databaseElement.Value) + if (!rows[connection.Item1].ContainsKey(objectType)) + rows[connection.Item1].Add(objectType, new List>()); + using (Oracle.ManagedDataAccess.Client.OracleConnection oracleConnection = new(connection.Item2)) { - if (_ShuttingDown) - break; - objectTypeDirectory = string.Concat(workingDirectory, @"\", databaseElement.Key, @"\", tableNameElement.Key); - foreach (List rowItem in tableNameElement.Value) + _ = sql.Clear(); + oracleConnection.Open(); + _ = sql.Append(" select v.moduleinstancetypename, v.unitname, "). + Append(" v.modulename, v.containername, v.configurationstate, "). + Append(" v.configurationproductivestate, v.containermodifiername, "). + Append(" v.containermodifieddate, v.containerconfiguration, v.configurationmodifieddate "). + Append(" from veditconfiguration v "). + Append(" where v.moduleinstancetypename = '").Append(objectType.ToString()).Append("' "); + //Append(" and v.containerversion in ('4.80', '4.111') "); + if (!string.IsNullOrEmpty(edaDataCollectionPlansLastRun)) + _ = sql.Append(" and greatest(v.containermodifieddate, v.configurationmodifieddate) >= to_date('").Append(edaDataCollectionPlansLastRun).Append("', '").Append(oracleFormat).Append("') "); + //Print(sql.ToString()); + using Oracle.ManagedDataAccess.Client.OracleCommand oracleCommand = new(sql.ToString(), oracleConnection); + using Oracle.ManagedDataAccess.Client.OracleDataReader oracleDataReader = oracleCommand.ExecuteReader(); + fieldCount = oracleDataReader.FieldCount; + while (oracleDataReader.Read()) { if (_ShuttingDown) break; - //foreach (var item in rowItem) - // Print(item.ToString()); - //if (!rowItem[containername].ToString().Contains("Plan_Pdsf_Health_Cp2Mg")) - //if (!rowItem[unitname].ToString().Contains("XRD04") || !rowItem[containername].ToString().Contains("Plan_Pdsf")) - // continue; - containerModifiedDate = DateTime.Parse(rowItem[containermodifieddate].ToString()); - configurationModifiedDate = DateTime.Parse(rowItem[configurationmodifieddate].ToString()); - if (containerModifiedDate < configurationModifiedDate) - lastModifiedDate = configurationModifiedDate; - else - lastModifiedDate = containerModifiedDate; - goldDirectory = string.Concat(objectTypeDirectory, @"\", rowItem[unitname], @"\", rowItem[containername], @"\Gold"); - if (!Directory.Exists(goldDirectory)) - Directory.CreateDirectory(goldDirectory); - edaObjectDirectory = string.Concat(objectTypeDirectory, @"\", rowItem[unitname], @"\", rowItem[containername], @"\", rowItem[configurationstate], @"\", rowItem[configurationproductivestate], @"\", lastModifiedDate.ToString("yyyy-MM-dd_"), new TimeSpan(lastModifiedDate.Ticks - new DateTime(lastModifiedDate.Year, lastModifiedDate.Month, lastModifiedDate.Day).Ticks).TotalSeconds); - if (!Directory.Exists(edaObjectDirectory)) - Directory.CreateDirectory(edaObjectDirectory); - edaObjectFile = string.Concat(edaObjectDirectory, @"\", rowItem[unitname], " ", rowItem[containername], " - ", replace, " - ", rowItem[configurationstate].ToString(), " ", rowItem[configurationproductivestate].ToString()); - xml = rowItem[containerconfiguration].ToString(); - //continue; - lock (_Lock) + row = new List(); + for (int c = 0; c < fieldCount; c++) { - fileName = string.Concat(edaObjectFile.Replace(replace, "Raw"), ".xml"); + @object = oracleDataReader.GetValue(c); + row.Add(@object); + if (@object is null) + continue; + @string = @object.ToString(); + //if (@string.Length < 128) + // _Log.Debug(@string); + } + rows[connection.Item1][objectType].Add(row); + } + }; + } + } + } + if (rows.Any()) + { + string csv; + string? xml; + string json; + string text; + string html; + Common common; + string emptyAPC; + string fileName; + string? modifiedDate; + string edaObjectFile; + string goldDirectory; + string unitDirectory; + string replace = "$$$"; + string edaObjectDirectory; + DateTime lastModifiedDate; + DateTime containerModifiedDate; + PDSFConfiguration? configuration; + DateTime configurationModifiedDate; + JsonSerializerOptions jsonSerializerOptions = new() { WriteIndented = true }; + foreach (KeyValuePair>>> databaseElement in rows) + { + if (_ShuttingDown) + break; + emptyAPC = string.Concat(workingDirectory, @"\", databaseElement.Key, @"\EmptyAPC.xlsx"); + foreach (KeyValuePair>> tableNameElement in databaseElement.Value) + { + if (_ShuttingDown) + break; + objectTypeDirectory = string.Concat(workingDirectory, @"\", databaseElement.Key, @"\", tableNameElement.Key); + foreach (List rowItem in tableNameElement.Value) + { + if (_ShuttingDown) + break; + //foreach (var item in rowItem) + // Print(item.ToString()); + //if (!rowItem[containername].ToString().Contains("Plan_Pdsf_Health_Cp2Mg")) + //if (!rowItem[unitname].ToString().Contains("XRD04") || !rowItem[containername].ToString().Contains("Plan_Pdsf")) + // continue; + modifiedDate = rowItem[containermodifieddate].ToString(); + if (string.IsNullOrEmpty(modifiedDate)) + continue; + containerModifiedDate = DateTime.Parse(modifiedDate); + modifiedDate = rowItem[configurationmodifieddate].ToString(); + if (string.IsNullOrEmpty(modifiedDate)) + continue; + configurationModifiedDate = DateTime.Parse(modifiedDate); + if (containerModifiedDate < configurationModifiedDate) + lastModifiedDate = configurationModifiedDate; + else + lastModifiedDate = containerModifiedDate; + goldDirectory = string.Concat(objectTypeDirectory, @"\", rowItem[unitname], @"\", rowItem[containername], @"\Gold"); + if (!Directory.Exists(goldDirectory)) + _ = Directory.CreateDirectory(goldDirectory); + edaObjectDirectory = string.Concat(objectTypeDirectory, @"\", rowItem[unitname], @"\", rowItem[containername], @"\", rowItem[configurationstate], @"\", rowItem[configurationproductivestate], @"\", lastModifiedDate.ToString("yyyy-MM-dd_"), new TimeSpan(lastModifiedDate.Ticks - new DateTime(lastModifiedDate.Year, lastModifiedDate.Month, lastModifiedDate.Day).Ticks).TotalSeconds); + if (!Directory.Exists(edaObjectDirectory)) + _ = Directory.CreateDirectory(edaObjectDirectory); + edaObjectFile = string.Concat(edaObjectDirectory, @"\", rowItem[unitname], " ", rowItem[containername], " - ", replace, " - ", rowItem[configurationstate].ToString(), " ", rowItem[configurationproductivestate].ToString()); + xml = rowItem[containerconfiguration].ToString(); + if (string.IsNullOrEmpty(xml)) + continue; + //continue; + lock (_Lock) + { + fileName = string.Concat(edaObjectFile.Replace(replace, "Raw"), ".xml"); + File.WriteAllText(fileName, xml); + try + { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } + catch (Exception) { } + common = new Common(ModuleInstanceTypeName.Pdsf, rowItem[unitname], rowItem[containername], rowItem[configurationstate], rowItem[configurationproductivestate]); + configuration = ParseXML(xml, throwExceptions: true); + if (configuration is null) + continue; + if (!Directory.Exists(Path.GetPathRoot(configuration.Settings.StoragePath))) + continue; + else + { + common.Update(configuration); + json = JsonSerializer.Serialize(configuration, configuration.GetType(), jsonSerializerOptions); + if (!Directory.Exists(common.StoragePath)) + _ = Directory.CreateDirectory(common.StoragePath); + if (common?.UnitName is null) + continue; + if (!common.StoragePath.Contains(common.UnitName) && (common.StoragePath.Contains(@"01EquipmentIntegration") || common.StoragePath.Contains(@"02BusinessIntegration"))) + { + common.StoragePath = common.StoragePath.Replace("Traces", "Empty"); + if (!Directory.Exists(common.StoragePath)) + _ = Directory.CreateDirectory(common.StoragePath); + if (common.UnitName != "PRF01") + { + unitDirectory = string.Concat(Path.GetDirectoryName(common.StoragePath), @"\", common.UnitName); + common.StoragePath = string.Concat(unitDirectory, @"\BadPath"); + if (!Directory.Exists(common.StoragePath)) + _ = Directory.CreateDirectory(common.StoragePath); + common.StoragePath = string.Concat(unitDirectory, @"\LogFile"); + if (!Directory.Exists(common.StoragePath)) + _ = Directory.CreateDirectory(common.StoragePath); + common.StoragePath = string.Concat(unitDirectory, @"\PollPath"); + if (!Directory.Exists(common.StoragePath)) + _ = Directory.CreateDirectory(common.StoragePath); + } + } + fileName = string.Concat(edaObjectFile.Replace(replace, "Partial"), ".csv"); + File.WriteAllText(fileName, common.ParametersAsCsv); + try + { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } + catch (Exception) { } + fileName = string.Concat(edaObjectFile.Replace(replace, "Partial"), ".json"); + File.WriteAllText(fileName, json); + text = Helper.Background.EdaDCP.GetText(edaObjectFile, common, json); + fileName = string.Concat(edaObjectFile.Replace(replace, "Partial"), ".txt"); + File.WriteAllText(fileName, text); + try + { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } + catch (Exception) { } + html = Helper.Background.EdaDCP.GetEdaObjectToHtml(edaObjectFile, common); + fileName = string.Concat(edaObjectFile.Replace(replace, "Partial"), ".html"); + File.WriteAllText(fileName, html); + try + { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } + catch (Exception) { } + xml = Helper.Background.EdaDCP.GetEdaObjectToDMSGridFormat(edaObjectFile, common, useAlias: false); + fileName = string.Concat(edaObjectFile.Replace(replace, "DMSGridFormat"), ".xml"); File.WriteAllText(fileName, xml); try { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } catch (Exception) { } - common = new Common(ModuleInstanceTypeName.Pdsf, rowItem[unitname], rowItem[containername], rowItem[configurationstate], rowItem[configurationproductivestate]); - configuration = ParseXML(xml, throwExceptions: true); - if (!Directory.Exists(Path.GetPathRoot(configuration.Settings.StoragePath))) - continue; - if (configuration is null) - continue; - else + xml = Helper.Background.EdaDCP.GetEdaObjectToDMSGridFormat(edaObjectFile, common, useAlias: true); + fileName = string.Concat(edaObjectFile.Replace(replace, "DMSGridFormat - Alias"), ".xml"); + File.WriteAllText(fileName, xml); + try + { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } + catch (Exception) { } + csv = Helper.Background.EdaDCP.GetEdaObjectToAPCParameter(edaObjectFile, common); + fileName = string.Concat(edaObjectFile.Replace(replace, "APCParameter"), ".csv"); + File.WriteAllText(fileName, csv); + try + { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } + catch (Exception) { } + csv = Helper.Background.EdaDCP.GetEdaObjectToAPCRunKeyNumber(edaObjectFile, common); + fileName = string.Concat(edaObjectFile.Replace(replace, "APCRunKeyNumber"), ".csv"); + File.WriteAllText(fileName, csv); + try + { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } + catch (Exception) { } + fileName = string.Concat(edaObjectFile.Replace(replace, "APC"), ".xlsx"); + if (File.Exists(emptyAPC) && !File.Exists(fileName)) { - common.Update(configuration); - json = JsonSerializer.Serialize(configuration, configuration.GetType(), jsonSerializerOptions); - if (!Directory.Exists(common.StoragePath)) - Directory.CreateDirectory(common.StoragePath); - if (!common.StoragePath.Contains(common.UnitName) && (common.StoragePath.Contains(@"01EquipmentIntegration") || common.StoragePath.Contains(@"02BusinessIntegration"))) - { - common.StoragePath = common.StoragePath.Replace("Traces", "Empty"); - if (!Directory.Exists(common.StoragePath)) - Directory.CreateDirectory(common.StoragePath); - if (common.UnitName != "PRF01") - { - unitDirectory = string.Concat(Path.GetDirectoryName(common.StoragePath), @"\", common.UnitName); - common.StoragePath = string.Concat(unitDirectory, @"\BadPath"); - if (!Directory.Exists(common.StoragePath)) - Directory.CreateDirectory(common.StoragePath); - common.StoragePath = string.Concat(unitDirectory, @"\LogFile"); - if (!Directory.Exists(common.StoragePath)) - Directory.CreateDirectory(common.StoragePath); - common.StoragePath = string.Concat(unitDirectory, @"\PollPath"); - if (!Directory.Exists(common.StoragePath)) - Directory.CreateDirectory(common.StoragePath); - } - } - fileName = string.Concat(edaObjectFile.Replace(replace, "Partial"), ".csv"); - File.WriteAllText(fileName, common.ParametersAsCsv); + File.Copy(emptyAPC, fileName); try { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } catch (Exception) { } - fileName = string.Concat(edaObjectFile.Replace(replace, "Partial"), ".json"); - File.WriteAllText(fileName, json); - text = EDAViewer.Singleton.Helper.Background.EdaDCP.GetText(edaObjectFile, common, json); - fileName = string.Concat(edaObjectFile.Replace(replace, "Partial"), ".txt"); - File.WriteAllText(fileName, text); - try - { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } - catch (Exception) { } - html = EDAViewer.Singleton.Helper.Background.EdaDCP.GetEdaObjectToHtml(edaObjectFile, common); - fileName = string.Concat(edaObjectFile.Replace(replace, "Partial"), ".html"); - File.WriteAllText(fileName, html); - try - { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } - catch (Exception) { } - xml = EDAViewer.Singleton.Helper.Background.EdaDCP.GetEdaObjectToDMSGridFormat(edaObjectFile, common, useAlias: false); - fileName = string.Concat(edaObjectFile.Replace(replace, "DMSGridFormat"), ".xml"); - File.WriteAllText(fileName, xml); - try - { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } - catch (Exception) { } - xml = EDAViewer.Singleton.Helper.Background.EdaDCP.GetEdaObjectToDMSGridFormat(edaObjectFile, common, useAlias: true); - fileName = string.Concat(edaObjectFile.Replace(replace, "DMSGridFormat - Alias"), ".xml"); - File.WriteAllText(fileName, xml); - try - { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } - catch (Exception) { } - csv = EDAViewer.Singleton.Helper.Background.EdaDCP.GetEdaObjectToAPCParameter(edaObjectFile, common); - fileName = string.Concat(edaObjectFile.Replace(replace, "APCParameter"), ".csv"); - File.WriteAllText(fileName, csv); - try - { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } - catch (Exception) { } - csv = EDAViewer.Singleton.Helper.Background.EdaDCP.GetEdaObjectToAPCRunKeyNumber(edaObjectFile, common); - fileName = string.Concat(edaObjectFile.Replace(replace, "APCRunKeyNumber"), ".csv"); - File.WriteAllText(fileName, csv); - try - { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } - catch (Exception) { } - fileName = string.Concat(edaObjectFile.Replace(replace, "APC"), ".xlsx"); - if (File.Exists(emptyAPC) && !File.Exists(fileName)) - { - File.Copy(emptyAPC, fileName); - try - { File.SetCreationTime(fileName, lastModifiedDate); File.SetLastWriteTime(fileName, lastModifiedDate); } - catch (Exception) { } - } } } } - try - { Directory.SetLastWriteTime(objectTypeDirectory, DateTime.Now); } - catch (Exception) { } } + try + { Directory.SetLastWriteTime(objectTypeDirectory, DateTime.Now); } + catch (Exception) { } } } } - } } \ No newline at end of file diff --git a/EDA Viewer/Singleton/Helper/BackgroundEDA - A.cs b/EDA Viewer/Singleton/Helper/BackgroundEDA - A.cs index 17eefcc..0bb4878 100644 --- a/EDA Viewer/Singleton/Helper/BackgroundEDA - A.cs +++ b/EDA Viewer/Singleton/Helper/BackgroundEDA - A.cs @@ -1,3821 +1,2501 @@ -namespace EDAViewer.Singleton.Helper +#pragma warning disable IDE1006 +#pragma warning disable CS8618 + +namespace EDAViewer.Singleton.Helper; + +// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0. +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +[System.Xml.Serialization.XmlRoot(Namespace = "", IsNullable = false)] +public partial class PDSFConfiguration { - // NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0. + private PDSFConfigurationSettings settingsField; + + private PDSFConfigurationDataCollection dataCollectionField; + /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] - public partial class PDSFConfiguration + public PDSFConfigurationSettings Settings { - - private PDSFConfigurationSettings settingsField; - - private PDSFConfigurationDataCollection dataCollectionField; - - /// - public PDSFConfigurationSettings Settings - { - get - { - return this.settingsField; - } - set - { - this.settingsField = value; - } - } - - /// - public PDSFConfigurationDataCollection DataCollection - { - get - { - return this.dataCollectionField; - } - set - { - this.dataCollectionField = value; - } - } + get => this.settingsField; + set => this.settingsField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationSettings + public PDSFConfigurationDataCollection DataCollection { + get => this.dataCollectionField; + set => this.dataCollectionField = value; + } +} - private bool logisticsValueTrimField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationSettings +{ - private bool parameterValueTrimField; + private bool logisticsValueTrimField; - private PDSFConfigurationSettingsCeidSettings ceidSettingsField; + private bool parameterValueTrimField; - private bool generateDummyIfMissingMIDField; + private PDSFConfigurationSettingsCeidSettings ceidSettingsField; - private bool requestCSAforTrustedWaferField; + private bool generateDummyIfMissingMIDField; - private string dummyMIDTimeFormatField; + private bool requestCSAforTrustedWaferField; - private PDSFConfigurationSettingsTimePrevDiffSettings timePrevDiffSettingsField; + private string dummyMIDTimeFormatField; - private string storagePathField; + private PDSFConfigurationSettingsTimePrevDiffSettings timePrevDiffSettingsField; - private string filenameField; + private string storagePathField; - private bool isBackwardLogisticsEnabledField; + private string filenameField; - private decimal timeColumnFormatField; + private bool isBackwardLogisticsEnabledField; - private string writeEmptyLogisticsField; + private decimal timeColumnFormatField; - private bool resetLogisticsOnFileCutField; + private string writeEmptyLogisticsField; - private string startTimeFormatField; + private bool resetLogisticsOnFileCutField; - private bool useRawDatabaseField; + private string startTimeFormatField; - private bool usePdsfFileModeField; + private bool useRawDatabaseField; - private bool yodaNotificationRequiredField; + private bool usePdsfFileModeField; - /// - public bool LogisticsValueTrim - { - get - { - return this.logisticsValueTrimField; - } - set - { - this.logisticsValueTrimField = value; - } - } + private bool yodaNotificationRequiredField; - /// - public bool ParameterValueTrim - { - get - { - return this.parameterValueTrimField; - } - set - { - this.parameterValueTrimField = value; - } - } - - /// - public PDSFConfigurationSettingsCeidSettings CeidSettings - { - get - { - return this.ceidSettingsField; - } - set - { - this.ceidSettingsField = value; - } - } - - /// - public bool GenerateDummyIfMissingMID - { - get - { - return this.generateDummyIfMissingMIDField; - } - set - { - this.generateDummyIfMissingMIDField = value; - } - } - - /// - public bool RequestCSAforTrustedWafer - { - get - { - return this.requestCSAforTrustedWaferField; - } - set - { - this.requestCSAforTrustedWaferField = value; - } - } - - /// - public string DummyMIDTimeFormat - { - get - { - return this.dummyMIDTimeFormatField; - } - set - { - this.dummyMIDTimeFormatField = value; - } - } - - /// - public PDSFConfigurationSettingsTimePrevDiffSettings TimePrevDiffSettings - { - get - { - return this.timePrevDiffSettingsField; - } - set - { - this.timePrevDiffSettingsField = value; - } - } - - /// - public string StoragePath - { - get - { - return this.storagePathField; - } - set - { - this.storagePathField = value; - } - } - - /// - public string Filename - { - get - { - return this.filenameField; - } - set - { - this.filenameField = value; - } - } - - /// - public bool IsBackwardLogisticsEnabled - { - get - { - return this.isBackwardLogisticsEnabledField; - } - set - { - this.isBackwardLogisticsEnabledField = value; - } - } - - /// - public decimal TimeColumnFormat - { - get - { - return this.timeColumnFormatField; - } - set - { - this.timeColumnFormatField = value; - } - } - - /// - public string WriteEmptyLogistics - { - get - { - return this.writeEmptyLogisticsField; - } - set - { - this.writeEmptyLogisticsField = value; - } - } - - /// - public bool ResetLogisticsOnFileCut - { - get - { - return this.resetLogisticsOnFileCutField; - } - set - { - this.resetLogisticsOnFileCutField = value; - } - } - - /// - public string StartTimeFormat - { - get - { - return this.startTimeFormatField; - } - set - { - this.startTimeFormatField = value; - } - } - - /// - public bool UseRawDatabase - { - get - { - return this.useRawDatabaseField; - } - set - { - this.useRawDatabaseField = value; - } - } - - /// - public bool UsePdsfFileMode - { - get - { - return this.usePdsfFileModeField; - } - set - { - this.usePdsfFileModeField = value; - } - } - - /// - public bool YodaNotificationRequired - { - get - { - return this.yodaNotificationRequiredField; - } - set - { - this.yodaNotificationRequiredField = value; - } - } + /// + public bool LogisticsValueTrim + { + get => this.logisticsValueTrimField; + set => this.logisticsValueTrimField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationSettingsCeidSettings + public bool ParameterValueTrim { - - private bool isEnabledField; - - private object ceidField; - - /// - public bool IsEnabled - { - get - { - return this.isEnabledField; - } - set - { - this.isEnabledField = value; - } - } - - /// - public object Ceid - { - get - { - return this.ceidField; - } - set - { - this.ceidField = value; - } - } + get => this.parameterValueTrimField; + set => this.parameterValueTrimField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationSettingsTimePrevDiffSettings + public PDSFConfigurationSettingsCeidSettings CeidSettings { - - private bool isEnabledField; - - /// - public bool IsEnabled - { - get - { - return this.isEnabledField; - } - set - { - this.isEnabledField = value; - } - } + get => this.ceidSettingsField; + set => this.ceidSettingsField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollection + public bool GenerateDummyIfMissingMID { - - private PDSFConfigurationDataCollectionStartTriggers startTriggersField; - - private PDSFConfigurationDataCollectionStopTriggers stopTriggersField; - - private PDSFConfigurationDataCollectionFileCutTriggers fileCutTriggersField; - - private PDSFConfigurationDataCollectionParameter[] parametersField; - - private PDSFConfigurationDataCollectionParameter1[] virtualParametersField; - - private PDSFConfigurationDataCollectionLogistics logisticsField; - - private PDSFConfigurationDataCollectionTrigger triggerField; - - private PDSFConfigurationDataCollectionFileWriterSettings fileWriterSettingsField; - - private PDSFConfigurationDataCollectionGeneralTriggers[] generalTriggersField; - - private string sourceField; - - /// - public PDSFConfigurationDataCollectionStartTriggers StartTriggers - { - get - { - return this.startTriggersField; - } - set - { - this.startTriggersField = value; - } - } - - /// - public PDSFConfigurationDataCollectionStopTriggers StopTriggers - { - get - { - return this.stopTriggersField; - } - set - { - this.stopTriggersField = value; - } - } - - /// - public PDSFConfigurationDataCollectionFileCutTriggers FileCutTriggers - { - get - { - return this.fileCutTriggersField; - } - set - { - this.fileCutTriggersField = value; - } - } - - /// - [System.Xml.Serialization.XmlArrayItemAttribute("Parameter", IsNullable = false)] - public PDSFConfigurationDataCollectionParameter[] Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } - - /// - [System.Xml.Serialization.XmlArrayItemAttribute("Parameter", IsNullable = false)] - public PDSFConfigurationDataCollectionParameter1[] VirtualParameters - { - get - { - return this.virtualParametersField; - } - set - { - this.virtualParametersField = value; - } - } - - /// - public PDSFConfigurationDataCollectionLogistics Logistics - { - get - { - return this.logisticsField; - } - set - { - this.logisticsField = value; - } - } - - /// - public PDSFConfigurationDataCollectionTrigger Trigger - { - get - { - return this.triggerField; - } - set - { - this.triggerField = value; - } - } - - /// - public PDSFConfigurationDataCollectionFileWriterSettings FileWriterSettings - { - get - { - return this.fileWriterSettingsField; - } - set - { - this.fileWriterSettingsField = value; - } - } - - /// - [System.Xml.Serialization.XmlElementAttribute("GeneralTriggers")] - public PDSFConfigurationDataCollectionGeneralTriggers[] GeneralTriggers - { - get - { - return this.generalTriggersField; - } - set - { - this.generalTriggersField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Source - { - get - { - return this.sourceField; - } - set - { - this.sourceField = value; - } - } + get => this.generateDummyIfMissingMIDField; + set => this.generateDummyIfMissingMIDField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionStartTriggers + public bool RequestCSAforTrustedWafer { - - private PDSFConfigurationDataCollectionStartTriggersDCP dCPField; - - /// - public PDSFConfigurationDataCollectionStartTriggersDCP DCP - { - get - { - return this.dCPField; - } - set - { - this.dCPField = value; - } - } + get => this.requestCSAforTrustedWaferField; + set => this.requestCSAforTrustedWaferField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionStartTriggersDCP + public string DummyMIDTimeFormat { - - private PDSFConfigurationDataCollectionStartTriggersDCPDataPool dataPoolField; - - private string ruleField; - - private object descriptionField; - - private bool resetGlobalStopSettingsField; - - private string idField; - - private string nameField; - - private bool resolveGlobalVariableBeforeTriggerField; - - /// - public PDSFConfigurationDataCollectionStartTriggersDCPDataPool DataPool - { - get - { - return this.dataPoolField; - } - set - { - this.dataPoolField = value; - } - } - - /// - public string Rule - { - get - { - return this.ruleField; - } - set - { - this.ruleField = value; - } - } - - /// - public object Description - { - get - { - return this.descriptionField; - } - set - { - this.descriptionField = value; - } - } - - /// - public bool ResetGlobalStopSettings - { - get - { - return this.resetGlobalStopSettingsField; - } - set - { - this.resetGlobalStopSettingsField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Id - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool ResolveGlobalVariableBeforeTrigger - { - get - { - return this.resolveGlobalVariableBeforeTriggerField; - } - set - { - this.resolveGlobalVariableBeforeTriggerField = value; - } - } + get => this.dummyMIDTimeFormatField; + set => this.dummyMIDTimeFormatField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionStartTriggersDCPDataPool + public PDSFConfigurationSettingsTimePrevDiffSettings TimePrevDiffSettings { - - private PDSFConfigurationDataCollectionStartTriggersDCPDataPoolScriptEditorDataPoolParameterModel[] parametersField; - - /// - [System.Xml.Serialization.XmlArrayItemAttribute("ScriptEditorDataPoolParameterModel", IsNullable = false)] - public PDSFConfigurationDataCollectionStartTriggersDCPDataPoolScriptEditorDataPoolParameterModel[] Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.timePrevDiffSettingsField; + set => this.timePrevDiffSettingsField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionStartTriggersDCPDataPoolScriptEditorDataPoolParameterModel + public string StoragePath { - - private string nameField; - - private string valueField; - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public string Value - { - get - { - return this.valueField; - } - set - { - this.valueField = value; - } - } + get => this.storagePathField; + set => this.storagePathField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionStopTriggers + public string Filename { - - private PDSFConfigurationDataCollectionStopTriggersDCP dCPField; - - private int durationField; - - private int receiveTimeoutField; - - private int rowCountField; - - /// - public PDSFConfigurationDataCollectionStopTriggersDCP DCP - { - get - { - return this.dCPField; - } - set - { - this.dCPField = value; - } - } - - /// - public int Duration - { - get - { - return this.durationField; - } - set - { - this.durationField = value; - } - } - - /// - public int ReceiveTimeout - { - get - { - return this.receiveTimeoutField; - } - set - { - this.receiveTimeoutField = value; - } - } - - /// - public int RowCount - { - get - { - return this.rowCountField; - } - set - { - this.rowCountField = value; - } - } + get => this.filenameField; + set => this.filenameField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionStopTriggersDCP + public bool IsBackwardLogisticsEnabled { - - private PDSFConfigurationDataCollectionStopTriggersDCPDataPool dataPoolField; - - private string ruleField; - - private object descriptionField; - - private PDSFConfigurationDataCollectionStopTriggersDCPPublishDocumentDataPool publishDocumentDataPoolField; - - private object publishDocumentRuleField; - - private string idField; - - private string nameField; - - private bool resolveGlobalVariableBeforeTriggerField; - - private bool resetGlobalVariablesAfterTriggerField; - - /// - public PDSFConfigurationDataCollectionStopTriggersDCPDataPool DataPool - { - get - { - return this.dataPoolField; - } - set - { - this.dataPoolField = value; - } - } - - /// - public string Rule - { - get - { - return this.ruleField; - } - set - { - this.ruleField = value; - } - } - - /// - public object Description - { - get - { - return this.descriptionField; - } - set - { - this.descriptionField = value; - } - } - - /// - public PDSFConfigurationDataCollectionStopTriggersDCPPublishDocumentDataPool PublishDocumentDataPool - { - get - { - return this.publishDocumentDataPoolField; - } - set - { - this.publishDocumentDataPoolField = value; - } - } - - /// - public object PublishDocumentRule - { - get - { - return this.publishDocumentRuleField; - } - set - { - this.publishDocumentRuleField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Id - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool ResolveGlobalVariableBeforeTrigger - { - get - { - return this.resolveGlobalVariableBeforeTriggerField; - } - set - { - this.resolveGlobalVariableBeforeTriggerField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool ResetGlobalVariablesAfterTrigger - { - get - { - return this.resetGlobalVariablesAfterTriggerField; - } - set - { - this.resetGlobalVariablesAfterTriggerField = value; - } - } + get => this.isBackwardLogisticsEnabledField; + set => this.isBackwardLogisticsEnabledField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionStopTriggersDCPDataPool + public decimal TimeColumnFormat { - - private PDSFConfigurationDataCollectionStopTriggersDCPDataPoolScriptEditorDataPoolParameterModel[] parametersField; - - /// - [System.Xml.Serialization.XmlArrayItemAttribute("ScriptEditorDataPoolParameterModel", IsNullable = false)] - public PDSFConfigurationDataCollectionStopTriggersDCPDataPoolScriptEditorDataPoolParameterModel[] Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.timeColumnFormatField; + set => this.timeColumnFormatField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionStopTriggersDCPDataPoolScriptEditorDataPoolParameterModel + public string WriteEmptyLogistics { - - private string nameField; - - private string valueField; - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public string Value - { - get - { - return this.valueField; - } - set - { - this.valueField = value; - } - } + get => this.writeEmptyLogisticsField; + set => this.writeEmptyLogisticsField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionStopTriggersDCPPublishDocumentDataPool + public bool ResetLogisticsOnFileCut { - - private object parametersField; - - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.resetLogisticsOnFileCutField; + set => this.resetLogisticsOnFileCutField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionFileCutTriggers + public string StartTimeFormat { - - private int intervalField; - - private int rowCountField; - - /// - public int Interval - { - get - { - return this.intervalField; - } - set - { - this.intervalField = value; - } - } - - /// - public int RowCount - { - get - { - return this.rowCountField; - } - set - { - this.rowCountField = value; - } - } + get => this.startTimeFormatField; + set => this.startTimeFormatField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameter + public bool UseRawDatabase { - - private string idField; - - private string nameField; - - private string descriptionField; - - private object childsField; - - private object dataTypeField; - - private string hardWareIdField; - - private bool isArrayField; - - private bool repeatsOnSameLevelField; - - private bool isCyclicalField; - - private string fullNameField; - - private object separatorField; - - private bool isAutoGeneratedField; - - private PDSFConfigurationDataCollectionParameterConditions conditionsField; - - private object localVariablesField; - - private object arithmeticsField; - - private string name1Field; - - private string aliasField; - - private string positionField; - - private int orderField; - - private bool useField; - - /// - public string Id - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public string Description - { - get - { - return this.descriptionField; - } - set - { - this.descriptionField = value; - } - } - - /// - public object Childs - { - get - { - return this.childsField; - } - set - { - this.childsField = value; - } - } - - /// - public object DataType - { - get - { - return this.dataTypeField; - } - set - { - this.dataTypeField = value; - } - } - - /// - public string HardWareId - { - get - { - return this.hardWareIdField; - } - set - { - this.hardWareIdField = value; - } - } - - /// - public bool IsArray - { - get - { - return this.isArrayField; - } - set - { - this.isArrayField = value; - } - } - - /// - public bool RepeatsOnSameLevel - { - get - { - return this.repeatsOnSameLevelField; - } - set - { - this.repeatsOnSameLevelField = value; - } - } - - /// - public bool IsCyclical - { - get - { - return this.isCyclicalField; - } - set - { - this.isCyclicalField = value; - } - } - - /// - public string FullName - { - get - { - return this.fullNameField; - } - set - { - this.fullNameField = value; - } - } - - /// - public object Separator - { - get - { - return this.separatorField; - } - set - { - this.separatorField = value; - } - } - - /// - public bool IsAutoGenerated - { - get - { - return this.isAutoGeneratedField; - } - set - { - this.isAutoGeneratedField = value; - } - } - - /// - public PDSFConfigurationDataCollectionParameterConditions Conditions - { - get - { - return this.conditionsField; - } - set - { - this.conditionsField = value; - } - } - - /// - public object LocalVariables - { - get - { - return this.localVariablesField; - } - set - { - this.localVariablesField = value; - } - } - - /// - public object Arithmetics - { - get - { - return this.arithmeticsField; - } - set - { - this.arithmeticsField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute("Name")] - public string Name1 - { - get - { - return this.name1Field; - } - set - { - this.name1Field = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Alias - { - get - { - return this.aliasField; - } - set - { - this.aliasField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Position - { - get - { - return this.positionField; - } - set - { - this.positionField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public int Order - { - get - { - return this.orderField; - } - set - { - this.orderField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool Use - { - get - { - return this.useField; - } - set - { - this.useField = value; - } - } + get => this.useRawDatabaseField; + set => this.useRawDatabaseField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditions + public bool UsePdsfFileMode { - - private PDSFConfigurationDataCollectionParameterConditionsConditionModel conditionModelField; - - /// - public PDSFConfigurationDataCollectionParameterConditionsConditionModel ConditionModel - { - get - { - return this.conditionModelField; - } - set - { - this.conditionModelField = value; - } - } + get => this.usePdsfFileModeField; + set => this.usePdsfFileModeField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModel + public bool YodaNotificationRequired { + get => this.yodaNotificationRequiredField; + set => this.yodaNotificationRequiredField = value; + } +} - private string idField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationSettingsCeidSettings +{ - private string nameField; + private bool isEnabledField; - private object descriptionField; + private object ceidField; - private object conditionField; - - private PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool conditionDataPoolField; - - private string formulaField; - - private PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool formulaDataPoolField; - - private PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool nameDataPoolField; - - /// - public string Id - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public object Description - { - get - { - return this.descriptionField; - } - set - { - this.descriptionField = value; - } - } - - /// - public object Condition - { - get - { - return this.conditionField; - } - set - { - this.conditionField = value; - } - } - - /// - public PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool ConditionDataPool - { - get - { - return this.conditionDataPoolField; - } - set - { - this.conditionDataPoolField = value; - } - } - - /// - public string Formula - { - get - { - return this.formulaField; - } - set - { - this.formulaField = value; - } - } - - /// - public PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool FormulaDataPool - { - get - { - return this.formulaDataPoolField; - } - set - { - this.formulaDataPoolField = value; - } - } - - /// - public PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool NameDataPool - { - get - { - return this.nameDataPoolField; - } - set - { - this.nameDataPoolField = value; - } - } + /// + public bool IsEnabled + { + get => this.isEnabledField; + set => this.isEnabledField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool + public object Ceid { + get => this.ceidField; + set => this.ceidField = value; + } +} - private object parametersField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationSettingsTimePrevDiffSettings +{ - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + private bool isEnabledField; + + /// + public bool IsEnabled + { + get => this.isEnabledField; + set => this.isEnabledField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollection +{ + + private PDSFConfigurationDataCollectionStartTriggers startTriggersField; + + private PDSFConfigurationDataCollectionStopTriggers stopTriggersField; + + private PDSFConfigurationDataCollectionFileCutTriggers fileCutTriggersField; + + private PDSFConfigurationDataCollectionParameter[] parametersField; + + private PDSFConfigurationDataCollectionParameter1[] virtualParametersField; + + private PDSFConfigurationDataCollectionLogistics logisticsField; + + private PDSFConfigurationDataCollectionTrigger triggerField; + + private PDSFConfigurationDataCollectionFileWriterSettings fileWriterSettingsField; + + private PDSFConfigurationDataCollectionGeneralTriggers[] generalTriggersField; + + private string sourceField; + + /// + public PDSFConfigurationDataCollectionStartTriggers StartTriggers + { + get => this.startTriggersField; + set => this.startTriggersField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool + public PDSFConfigurationDataCollectionStopTriggers StopTriggers { - - private object parametersField; - - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.stopTriggersField; + set => this.stopTriggersField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool + public PDSFConfigurationDataCollectionFileCutTriggers FileCutTriggers { - - private object parametersField; - - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.fileCutTriggersField; + set => this.fileCutTriggersField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameter1 + [System.Xml.Serialization.XmlArrayItem("Parameter", IsNullable = false)] + public PDSFConfigurationDataCollectionParameter[] Parameters { - - private string idField; - - private string nameField; - - private string descriptionField; - - private object childsField; - - private object dataTypeField; - - private string hardWareIdField; - - private bool isArrayField; - - private bool repeatsOnSameLevelField; - - private bool isCyclicalField; - - private string fullNameField; - - private object separatorField; - - private bool isAutoGeneratedField; - - private PDSFConfigurationDataCollectionParameterConditions1 conditionsField; - - private object localVariablesField; - - private object arithmeticsField; - - private string name1Field; - - private string aliasField; - - private string positionField; - - private int orderField; - - private bool useField; - - /// - public string Id - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public string Description - { - get - { - return this.descriptionField; - } - set - { - this.descriptionField = value; - } - } - - /// - public object Childs - { - get - { - return this.childsField; - } - set - { - this.childsField = value; - } - } - - /// - public object DataType - { - get - { - return this.dataTypeField; - } - set - { - this.dataTypeField = value; - } - } - - /// - public string HardWareId - { - get - { - return this.hardWareIdField; - } - set - { - this.hardWareIdField = value; - } - } - - /// - public bool IsArray - { - get - { - return this.isArrayField; - } - set - { - this.isArrayField = value; - } - } - - /// - public bool RepeatsOnSameLevel - { - get - { - return this.repeatsOnSameLevelField; - } - set - { - this.repeatsOnSameLevelField = value; - } - } - - /// - public bool IsCyclical - { - get - { - return this.isCyclicalField; - } - set - { - this.isCyclicalField = value; - } - } - - /// - public string FullName - { - get - { - return this.fullNameField; - } - set - { - this.fullNameField = value; - } - } - - /// - public object Separator - { - get - { - return this.separatorField; - } - set - { - this.separatorField = value; - } - } - - /// - public bool IsAutoGenerated - { - get - { - return this.isAutoGeneratedField; - } - set - { - this.isAutoGeneratedField = value; - } - } - - /// - public PDSFConfigurationDataCollectionParameterConditions1 Conditions - { - get - { - return this.conditionsField; - } - set - { - this.conditionsField = value; - } - } - - /// - public object LocalVariables - { - get - { - return this.localVariablesField; - } - set - { - this.localVariablesField = value; - } - } - - /// - public object Arithmetics - { - get - { - return this.arithmeticsField; - } - set - { - this.arithmeticsField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute("Name")] - public string Name1 - { - get - { - return this.name1Field; - } - set - { - this.name1Field = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Alias - { - get - { - return this.aliasField; - } - set - { - this.aliasField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Position - { - get - { - return this.positionField; - } - set - { - this.positionField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public int Order - { - get - { - return this.orderField; - } - set - { - this.orderField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool Use - { - get - { - return this.useField; - } - set - { - this.useField = value; - } - } + get => this.parametersField; + set => this.parametersField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditions1 + [System.Xml.Serialization.XmlArrayItem("Parameter", IsNullable = false)] + public PDSFConfigurationDataCollectionParameter1[] VirtualParameters { - - private PDSFConfigurationDataCollectionParameterConditionsConditionModel1 conditionModelField; - - /// - public PDSFConfigurationDataCollectionParameterConditionsConditionModel1 ConditionModel - { - get - { - return this.conditionModelField; - } - set - { - this.conditionModelField = value; - } - } + get => this.virtualParametersField; + set => this.virtualParametersField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModel1 + public PDSFConfigurationDataCollectionLogistics Logistics { - - private string idField; - - private string nameField; - - private string descriptionField; - - private object conditionField; - - private PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool1 conditionDataPoolField; - - private string formulaField; - - private PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool1 formulaDataPoolField; - - private PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool1 nameDataPoolField; - - /// - public string Id - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public string Description - { - get - { - return this.descriptionField; - } - set - { - this.descriptionField = value; - } - } - - /// - public object Condition - { - get - { - return this.conditionField; - } - set - { - this.conditionField = value; - } - } - - /// - public PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool1 ConditionDataPool - { - get - { - return this.conditionDataPoolField; - } - set - { - this.conditionDataPoolField = value; - } - } - - /// - public string Formula - { - get - { - return this.formulaField; - } - set - { - this.formulaField = value; - } - } - - /// - public PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool1 FormulaDataPool - { - get - { - return this.formulaDataPoolField; - } - set - { - this.formulaDataPoolField = value; - } - } - - /// - public PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool1 NameDataPool - { - get - { - return this.nameDataPoolField; - } - set - { - this.nameDataPoolField = value; - } - } + get => this.logisticsField; + set => this.logisticsField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool1 + public PDSFConfigurationDataCollectionTrigger Trigger { - - private object parametersField; - - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.triggerField; + set => this.triggerField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool1 + public PDSFConfigurationDataCollectionFileWriterSettings FileWriterSettings { - - private PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPoolScriptEditorDataPoolParameterModel[] parametersField; - - /// - [System.Xml.Serialization.XmlArrayItemAttribute("ScriptEditorDataPoolParameterModel", IsNullable = false)] - public PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPoolScriptEditorDataPoolParameterModel[] Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.fileWriterSettingsField; + set => this.fileWriterSettingsField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPoolScriptEditorDataPoolParameterModel + [System.Xml.Serialization.XmlElement("GeneralTriggers")] + public PDSFConfigurationDataCollectionGeneralTriggers[] GeneralTriggers { - - private string nameField; - - private string valueField; - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public string Value - { - get - { - return this.valueField; - } - set - { - this.valueField = value; - } - } + get => this.generalTriggersField; + set => this.generalTriggersField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool1 + [System.Xml.Serialization.XmlAttribute()] + public string Source { + get => this.sourceField; + set => this.sourceField = value; + } +} - private object parametersField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionStartTriggers +{ - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + private PDSFConfigurationDataCollectionStartTriggersDCP dCPField; + + /// + public PDSFConfigurationDataCollectionStartTriggersDCP DCP + { + get => this.dCPField; + set => this.dCPField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionStartTriggersDCP +{ + + private PDSFConfigurationDataCollectionStartTriggersDCPDataPool dataPoolField; + + private string ruleField; + + private object descriptionField; + + private bool resetGlobalStopSettingsField; + + private string idField; + + private string nameField; + + private bool resolveGlobalVariableBeforeTriggerField; + + /// + public PDSFConfigurationDataCollectionStartTriggersDCPDataPool DataPool + { + get => this.dataPoolField; + set => this.dataPoolField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogistics + public string Rule { - - private PDSFConfigurationDataCollectionLogisticsAttribute[] attributesField; - - private PDSFConfigurationDataCollectionLogisticsColumn[] columnsField; - - private PDSFConfigurationDataCollectionLogisticsTriggers triggersField; - - private string equipmentAliasField; - - /// - [System.Xml.Serialization.XmlArrayItemAttribute("Attribute", IsNullable = false)] - public PDSFConfigurationDataCollectionLogisticsAttribute[] Attributes - { - get - { - return this.attributesField; - } - set - { - this.attributesField = value; - } - } - - /// - [System.Xml.Serialization.XmlArrayItemAttribute("Column", IsNullable = false)] - public PDSFConfigurationDataCollectionLogisticsColumn[] Columns - { - get - { - return this.columnsField; - } - set - { - this.columnsField = value; - } - } - - /// - public PDSFConfigurationDataCollectionLogisticsTriggers Triggers - { - get - { - return this.triggersField; - } - set - { - this.triggersField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string EquipmentAlias - { - get - { - return this.equipmentAliasField; - } - set - { - this.equipmentAliasField = value; - } - } + get => this.ruleField; + set => this.ruleField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsAttribute + public object Description { - - private string keyField; - - private int orderField; - - private string placeholderField; - - private bool useField; - - private bool addAsDataColumnField; - - private string attributeTypeField; - - private string dataColumnAliasField; - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Key - { - get - { - return this.keyField; - } - set - { - this.keyField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public int Order - { - get - { - return this.orderField; - } - set - { - this.orderField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Placeholder - { - get - { - return this.placeholderField; - } - set - { - this.placeholderField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool Use - { - get - { - return this.useField; - } - set - { - this.useField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool AddAsDataColumn - { - get - { - return this.addAsDataColumnField; - } - set - { - this.addAsDataColumnField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string AttributeType - { - get - { - return this.attributeTypeField; - } - set - { - this.attributeTypeField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string DataColumnAlias - { - get - { - return this.dataColumnAliasField; - } - set - { - this.dataColumnAliasField = value; - } - } + get => this.descriptionField; + set => this.descriptionField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsColumn + public bool ResetGlobalStopSettings { - - private int idField; - - private string prefixField; - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public int ID - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Prefix - { - get - { - return this.prefixField; - } - set - { - this.prefixField = value; - } - } + get => this.resetGlobalStopSettingsField; + set => this.resetGlobalStopSettingsField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggers + [System.Xml.Serialization.XmlAttribute()] + public string Id { - - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTrigger updateTriggerField; - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTrigger UpdateTrigger - { - get - { - return this.updateTriggerField; - } - set - { - this.updateTriggerField = value; - } - } + get => this.idField; + set => this.idField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTrigger + [System.Xml.Serialization.XmlAttribute()] + public string Name { - - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequest[] logisticRequestField; - - private bool incrementRuleField; - - private bool resolveGlobalVariableBeforeTriggerField; - - private string dCPField; - - /// - [System.Xml.Serialization.XmlElementAttribute("LogisticRequest")] - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequest[] LogisticRequest - { - get - { - return this.logisticRequestField; - } - set - { - this.logisticRequestField = value; - } - } - - /// - public bool IncrementRule - { - get - { - return this.incrementRuleField; - } - set - { - this.incrementRuleField = value; - } - } - - /// - public bool ResolveGlobalVariableBeforeTrigger - { - get - { - return this.resolveGlobalVariableBeforeTriggerField; - } - set - { - this.resolveGlobalVariableBeforeTriggerField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string DCP - { - get - { - return this.dCPField; - } - set - { - this.dCPField = value; - } - } + get => this.nameField; + set => this.nameField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequest + [System.Xml.Serialization.XmlAttribute()] + public bool ResolveGlobalVariableBeforeTrigger { + get => this.resolveGlobalVariableBeforeTriggerField; + set => this.resolveGlobalVariableBeforeTriggerField = value; + } +} - private int nameField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionStartTriggersDCPDataPool +{ - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinition callDefinitionField; + private PDSFConfigurationDataCollectionStartTriggersDCPDataPoolScriptEditorDataPoolParameterModel[] parametersField; - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPool dataPoolField; + /// + [System.Xml.Serialization.XmlArrayItem("ScriptEditorDataPoolParameterModel", IsNullable = false)] + public PDSFConfigurationDataCollectionStartTriggersDCPDataPoolScriptEditorDataPoolParameterModel[] Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} - private object incrementRuleField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionStartTriggersDCPDataPoolScriptEditorDataPoolParameterModel +{ - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeys keysField; + private string nameField; - private string ruleField; + private string valueField; - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementCondition logisticIncrementConditionField; - - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticsColumn logisticsColumnField; - - /// - public int Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinition CallDefinition - { - get - { - return this.callDefinitionField; - } - set - { - this.callDefinitionField = value; - } - } - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPool DataPool - { - get - { - return this.dataPoolField; - } - set - { - this.dataPoolField = value; - } - } - - /// - public object IncrementRule - { - get - { - return this.incrementRuleField; - } - set - { - this.incrementRuleField = value; - } - } - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeys Keys - { - get - { - return this.keysField; - } - set - { - this.keysField = value; - } - } - - /// - public string Rule - { - get - { - return this.ruleField; - } - set - { - this.ruleField = value; - } - } - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementCondition LogisticIncrementCondition - { - get - { - return this.logisticIncrementConditionField; - } - set - { - this.logisticIncrementConditionField = value; - } - } - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticsColumn LogisticsColumn - { - get - { - return this.logisticsColumnField; - } - set - { - this.logisticsColumnField = value; - } - } + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinition + public string Value { + get => this.valueField; + set => this.valueField = value; + } +} - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttribute[] attributesField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionStopTriggers +{ - /// - [System.Xml.Serialization.XmlArrayItemAttribute("LogisticCallDefinitionAttribute", IsNullable = false)] - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttribute[] Attributes - { - get - { - return this.attributesField; - } - set - { - this.attributesField = value; - } - } + private PDSFConfigurationDataCollectionStopTriggersDCP dCPField; + + private int durationField; + + private int receiveTimeoutField; + + private int rowCountField; + + /// + public PDSFConfigurationDataCollectionStopTriggersDCP DCP + { + get => this.dCPField; + set => this.dCPField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttribute + public int Duration { - - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttributeDataPool dataPoolField; - - private string formulaField; - - private string logisticsKeyField; - - private string mappedParameterNameField; - - private string sourceField; - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttributeDataPool DataPool - { - get - { - return this.dataPoolField; - } - set - { - this.dataPoolField = value; - } - } - - /// - public string Formula - { - get - { - return this.formulaField; - } - set - { - this.formulaField = value; - } - } - - /// - public string LogisticsKey - { - get - { - return this.logisticsKeyField; - } - set - { - this.logisticsKeyField = value; - } - } - - /// - public string MappedParameterName - { - get - { - return this.mappedParameterNameField; - } - set - { - this.mappedParameterNameField = value; - } - } - - /// - public string Source - { - get - { - return this.sourceField; - } - set - { - this.sourceField = value; - } - } + get => this.durationField; + set => this.durationField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttributeDataPool + public int ReceiveTimeout { - - private object parametersField; - - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.receiveTimeoutField; + set => this.receiveTimeoutField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPool + public int RowCount { + get => this.rowCountField; + set => this.rowCountField = value; + } +} - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParameters parametersField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionStopTriggersDCP +{ - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParameters Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + private PDSFConfigurationDataCollectionStopTriggersDCPDataPool dataPoolField; + + private string ruleField; + + private object descriptionField; + + private PDSFConfigurationDataCollectionStopTriggersDCPPublishDocumentDataPool publishDocumentDataPoolField; + + private object publishDocumentRuleField; + + private string idField; + + private string nameField; + + private bool resolveGlobalVariableBeforeTriggerField; + + private bool resetGlobalVariablesAfterTriggerField; + + /// + public PDSFConfigurationDataCollectionStopTriggersDCPDataPool DataPool + { + get => this.dataPoolField; + set => this.dataPoolField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParameters + public string Rule { - - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParametersScriptEditorDataPoolParameterModel scriptEditorDataPoolParameterModelField; - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParametersScriptEditorDataPoolParameterModel ScriptEditorDataPoolParameterModel - { - get - { - return this.scriptEditorDataPoolParameterModelField; - } - set - { - this.scriptEditorDataPoolParameterModelField = value; - } - } + get => this.ruleField; + set => this.ruleField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParametersScriptEditorDataPoolParameterModel + public object Description { - - private string nameField; - - private string valueField; - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public string Value - { - get - { - return this.valueField; - } - set - { - this.valueField = value; - } - } + get => this.descriptionField; + set => this.descriptionField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeys + public PDSFConfigurationDataCollectionStopTriggersDCPPublishDocumentDataPool PublishDocumentDataPool { - - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysEquipmentName equipmentNameField; - - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMapping keyMappingField; - - private int defaultCarrierIndexField; - - private string defaultJobIndexField; - - private int defaultSlotIndexField; - - private string scenarioField; - - private bool useAllRequestedDataField; - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysEquipmentName EquipmentName - { - get - { - return this.equipmentNameField; - } - set - { - this.equipmentNameField = value; - } - } - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMapping KeyMapping - { - get - { - return this.keyMappingField; - } - set - { - this.keyMappingField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public int DefaultCarrierIndex - { - get - { - return this.defaultCarrierIndexField; - } - set - { - this.defaultCarrierIndexField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string DefaultJobIndex - { - get - { - return this.defaultJobIndexField; - } - set - { - this.defaultJobIndexField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public int DefaultSlotIndex - { - get - { - return this.defaultSlotIndexField; - } - set - { - this.defaultSlotIndexField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Scenario - { - get - { - return this.scenarioField; - } - set - { - this.scenarioField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool UseAllRequestedData - { - get - { - return this.useAllRequestedDataField; - } - set - { - this.useAllRequestedDataField = value; - } - } + get => this.publishDocumentDataPoolField; + set => this.publishDocumentDataPoolField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysEquipmentName + public object PublishDocumentRule { - - private string fixedNameField; - - private string parameterNameField; - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string FixedName - { - get - { - return this.fixedNameField; - } - set - { - this.fixedNameField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string ParameterName - { - get - { - return this.parameterNameField; - } - set - { - this.parameterNameField = value; - } - } + get => this.publishDocumentRuleField; + set => this.publishDocumentRuleField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMapping + [System.Xml.Serialization.XmlAttribute()] + public string Id { - - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMappingDataPool dataPoolField; - - private string formulaField; - - private string keyNameField; - - private string parameterNameField; - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMappingDataPool DataPool - { - get - { - return this.dataPoolField; - } - set - { - this.dataPoolField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Formula - { - get - { - return this.formulaField; - } - set - { - this.formulaField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string KeyName - { - get - { - return this.keyNameField; - } - set - { - this.keyNameField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string ParameterName - { - get - { - return this.parameterNameField; - } - set - { - this.parameterNameField = value; - } - } + get => this.idField; + set => this.idField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMappingDataPool + [System.Xml.Serialization.XmlAttribute()] + public string Name { - - private object parametersField; - - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.nameField; + set => this.nameField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementCondition + [System.Xml.Serialization.XmlAttribute()] + public bool ResolveGlobalVariableBeforeTrigger { - - private object ruleField; - - private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementConditionDataPool dataPoolField; - - /// - public object Rule - { - get - { - return this.ruleField; - } - set - { - this.ruleField = value; - } - } - - /// - public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementConditionDataPool DataPool - { - get - { - return this.dataPoolField; - } - set - { - this.dataPoolField = value; - } - } + get => this.resolveGlobalVariableBeforeTriggerField; + set => this.resolveGlobalVariableBeforeTriggerField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementConditionDataPool + [System.Xml.Serialization.XmlAttribute()] + public bool ResetGlobalVariablesAfterTrigger { + get => this.resetGlobalVariablesAfterTriggerField; + set => this.resetGlobalVariablesAfterTriggerField = value; + } +} - private object parametersField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionStopTriggersDCPDataPool +{ - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + private PDSFConfigurationDataCollectionStopTriggersDCPDataPoolScriptEditorDataPoolParameterModel[] parametersField; + + /// + [System.Xml.Serialization.XmlArrayItem("ScriptEditorDataPoolParameterModel", IsNullable = false)] + public PDSFConfigurationDataCollectionStopTriggersDCPDataPoolScriptEditorDataPoolParameterModel[] Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionStopTriggersDCPDataPoolScriptEditorDataPoolParameterModel +{ + + private string nameField; + + private string valueField; + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticsColumn + public string Value { + get => this.valueField; + set => this.valueField = value; + } +} - private int fixedField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionStopTriggersDCPPublishDocumentDataPool +{ - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public int Fixed - { - get - { - return this.fixedField; - } - set - { - this.fixedField = value; - } - } + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionFileCutTriggers +{ + + private int intervalField; + + private int rowCountField; + + /// + public int Interval + { + get => this.intervalField; + set => this.intervalField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionTrigger + public int RowCount { + get => this.rowCountField; + set => this.rowCountField = value; + } +} - private PDSFConfigurationDataCollectionTriggerDataPool dataPoolField; +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameter +{ - private object ruleField; + private string idField; - private object descriptionField; + private string nameField; - private string idField; + private string descriptionField; - private string nameField; + private object childsField; - private bool resolveGlobalVariableBeforeTriggerField; + private object dataTypeField; - /// - public PDSFConfigurationDataCollectionTriggerDataPool DataPool - { - get - { - return this.dataPoolField; - } - set - { - this.dataPoolField = value; - } - } + private string hardWareIdField; - /// - public object Rule - { - get - { - return this.ruleField; - } - set - { - this.ruleField = value; - } - } + private bool isArrayField; - /// - public object Description - { - get - { - return this.descriptionField; - } - set - { - this.descriptionField = value; - } - } + private bool repeatsOnSameLevelField; - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Id - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } + private bool isCyclicalField; - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } + private string fullNameField; - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool ResolveGlobalVariableBeforeTrigger - { - get - { - return this.resolveGlobalVariableBeforeTriggerField; - } - set - { - this.resolveGlobalVariableBeforeTriggerField = value; - } - } + private object separatorField; + + private bool isAutoGeneratedField; + + private PDSFConfigurationDataCollectionParameterConditions conditionsField; + + private object localVariablesField; + + private object arithmeticsField; + + private string name1Field; + + private string aliasField; + + private string positionField; + + private int orderField; + + private bool useField; + + /// + public string Id + { + get => this.idField; + set => this.idField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionTriggerDataPool + public string Name { - - private object parametersField; - - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.nameField; + set => this.nameField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionFileWriterSettings + public string Description { - - private string usedFileWriterField; - - private PDSFConfigurationDataCollectionFileWriterSettingsArrayInRowsSettings arrayInRowsSettingsField; - - private PDSFConfigurationDataCollectionFileWriterSettingsParameterInRowsSettings parameterInRowsSettingsField; - - /// - public string UsedFileWriter - { - get - { - return this.usedFileWriterField; - } - set - { - this.usedFileWriterField = value; - } - } - - /// - public PDSFConfigurationDataCollectionFileWriterSettingsArrayInRowsSettings ArrayInRowsSettings - { - get - { - return this.arrayInRowsSettingsField; - } - set - { - this.arrayInRowsSettingsField = value; - } - } - - /// - public PDSFConfigurationDataCollectionFileWriterSettingsParameterInRowsSettings ParameterInRowsSettings - { - get - { - return this.parameterInRowsSettingsField; - } - set - { - this.parameterInRowsSettingsField = value; - } - } + get => this.descriptionField; + set => this.descriptionField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionFileWriterSettingsArrayInRowsSettings + public object Childs { - - private int logisticChangeExtendTimeField; - - private int extendTimeField; - - private int defaultValueForArrayInLinesField; - - private bool isEnabledField; - - /// - public int LogisticChangeExtendTime - { - get - { - return this.logisticChangeExtendTimeField; - } - set - { - this.logisticChangeExtendTimeField = value; - } - } - - /// - public int ExtendTime - { - get - { - return this.extendTimeField; - } - set - { - this.extendTimeField = value; - } - } - - /// - public int DefaultValueForArrayInLines - { - get - { - return this.defaultValueForArrayInLinesField; - } - set - { - this.defaultValueForArrayInLinesField = value; - } - } - - /// - public bool IsEnabled - { - get - { - return this.isEnabledField; - } - set - { - this.isEnabledField = value; - } - } + get => this.childsField; + set => this.childsField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionFileWriterSettingsParameterInRowsSettings + public object DataType { - - private bool isEnabledField; - - private string dataColumnNameField; - - private string logisticColumnNameField; - - private bool isGenerateHashCodeEnabledField; - - private string hashCodeColumnNameField; - - /// - public bool IsEnabled - { - get - { - return this.isEnabledField; - } - set - { - this.isEnabledField = value; - } - } - - /// - public string DataColumnName - { - get - { - return this.dataColumnNameField; - } - set - { - this.dataColumnNameField = value; - } - } - - /// - public string LogisticColumnName - { - get - { - return this.logisticColumnNameField; - } - set - { - this.logisticColumnNameField = value; - } - } - - /// - public bool IsGenerateHashCodeEnabled - { - get - { - return this.isGenerateHashCodeEnabledField; - } - set - { - this.isGenerateHashCodeEnabledField = value; - } - } - - /// - public string HashCodeColumnName - { - get - { - return this.hashCodeColumnNameField; - } - set - { - this.hashCodeColumnNameField = value; - } - } + get => this.dataTypeField; + set => this.dataTypeField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionGeneralTriggers + public string HardWareId { - - private PDSFConfigurationDataCollectionGeneralTriggersDataPool dataPoolField; - - private object ruleField; - - private object descriptionField; - - private PDSFConfigurationDataCollectionGeneralTriggersVariableModel[] globalVariablesField; - - private string idField; - - private string nameField; - - private bool resolveGlobalVariableBeforeTriggerField; - - /// - public PDSFConfigurationDataCollectionGeneralTriggersDataPool DataPool - { - get - { - return this.dataPoolField; - } - set - { - this.dataPoolField = value; - } - } - - /// - public object Rule - { - get - { - return this.ruleField; - } - set - { - this.ruleField = value; - } - } - - /// - public object Description - { - get - { - return this.descriptionField; - } - set - { - this.descriptionField = value; - } - } - - /// - [System.Xml.Serialization.XmlArrayItemAttribute("VariableModel", IsNullable = false)] - public PDSFConfigurationDataCollectionGeneralTriggersVariableModel[] GlobalVariables - { - get - { - return this.globalVariablesField; - } - set - { - this.globalVariablesField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Id - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - [System.Xml.Serialization.XmlAttributeAttribute()] - public bool ResolveGlobalVariableBeforeTrigger - { - get - { - return this.resolveGlobalVariableBeforeTriggerField; - } - set - { - this.resolveGlobalVariableBeforeTriggerField = value; - } - } + get => this.hardWareIdField; + set => this.hardWareIdField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionGeneralTriggersDataPool + public bool IsArray { - - private object parametersField; - - /// - public object Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.isArrayField; + set => this.isArrayField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionGeneralTriggersVariableModel + public bool RepeatsOnSameLevel { - - private string idField; - - private string nameField; - - private object descriptionField; - - private PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPool dataPoolField; - - private string formulaField; - - private string parameterNameField; - - private string[] resolveBeforeTriggersField; - - /// - public string Id - { - get - { - return this.idField; - } - set - { - this.idField = value; - } - } - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public object Description - { - get - { - return this.descriptionField; - } - set - { - this.descriptionField = value; - } - } - - /// - public PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPool DataPool - { - get - { - return this.dataPoolField; - } - set - { - this.dataPoolField = value; - } - } - - /// - public string Formula - { - get - { - return this.formulaField; - } - set - { - this.formulaField = value; - } - } - - /// - public string ParameterName - { - get - { - return this.parameterNameField; - } - set - { - this.parameterNameField = value; - } - } - - /// - [System.Xml.Serialization.XmlElementAttribute("ResolveBeforeTriggers")] - public string[] ResolveBeforeTriggers - { - get - { - return this.resolveBeforeTriggersField; - } - set - { - this.resolveBeforeTriggersField = value; - } - } + get => this.repeatsOnSameLevelField; + set => this.repeatsOnSameLevelField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPool + public bool IsCyclical { - - private PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPoolScriptEditorDataPoolParameterModel[] parametersField; - - /// - [System.Xml.Serialization.XmlArrayItemAttribute("ScriptEditorDataPoolParameterModel", IsNullable = false)] - public PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPoolScriptEditorDataPoolParameterModel[] Parameters - { - get - { - return this.parametersField; - } - set - { - this.parametersField = value; - } - } + get => this.isCyclicalField; + set => this.isCyclicalField = value; } /// - [System.SerializableAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] - public partial class PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPoolScriptEditorDataPoolParameterModel + public string FullName { - - private string nameField; - - private string valueField; - - /// - public string Name - { - get - { - return this.nameField; - } - set - { - this.nameField = value; - } - } - - /// - public string Value - { - get - { - return this.valueField; - } - set - { - this.valueField = value; - } - } + get => this.fullNameField; + set => this.fullNameField = value; } + /// + public object Separator + { + get => this.separatorField; + set => this.separatorField = value; + } + + /// + public bool IsAutoGenerated + { + get => this.isAutoGeneratedField; + set => this.isAutoGeneratedField = value; + } + + /// + public PDSFConfigurationDataCollectionParameterConditions Conditions + { + get => this.conditionsField; + set => this.conditionsField = value; + } + + /// + public object LocalVariables + { + get => this.localVariablesField; + set => this.localVariablesField = value; + } + + /// + public object Arithmetics + { + get => this.arithmeticsField; + set => this.arithmeticsField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute("Name")] + public string Name1 + { + get => this.name1Field; + set => this.name1Field = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Alias + { + get => this.aliasField; + set => this.aliasField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Position + { + get => this.positionField; + set => this.positionField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public int Order + { + get => this.orderField; + set => this.orderField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public bool Use + { + get => this.useField; + set => this.useField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditions +{ + + private PDSFConfigurationDataCollectionParameterConditionsConditionModel conditionModelField; + + /// + public PDSFConfigurationDataCollectionParameterConditionsConditionModel ConditionModel + { + get => this.conditionModelField; + set => this.conditionModelField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModel +{ + + private string idField; + + private string nameField; + + private object descriptionField; + + private object conditionField; + + private PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool conditionDataPoolField; + + private string formulaField; + + private PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool formulaDataPoolField; + + private PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool nameDataPoolField; + + /// + public string Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public object Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + public object Condition + { + get => this.conditionField; + set => this.conditionField = value; + } + + /// + public PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool ConditionDataPool + { + get => this.conditionDataPoolField; + set => this.conditionDataPoolField = value; + } + + /// + public string Formula + { + get => this.formulaField; + set => this.formulaField = value; + } + + /// + public PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool FormulaDataPool + { + get => this.formulaDataPoolField; + set => this.formulaDataPoolField = value; + } + + /// + public PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool NameDataPool + { + get => this.nameDataPoolField; + set => this.nameDataPoolField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameter1 +{ + + private string idField; + + private string nameField; + + private string descriptionField; + + private object childsField; + + private object dataTypeField; + + private string hardWareIdField; + + private bool isArrayField; + + private bool repeatsOnSameLevelField; + + private bool isCyclicalField; + + private string fullNameField; + + private object separatorField; + + private bool isAutoGeneratedField; + + private PDSFConfigurationDataCollectionParameterConditions1 conditionsField; + + private object localVariablesField; + + private object arithmeticsField; + + private string name1Field; + + private string aliasField; + + private string positionField; + + private int orderField; + + private bool useField; + + /// + public string Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public string Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + public object Childs + { + get => this.childsField; + set => this.childsField = value; + } + + /// + public object DataType + { + get => this.dataTypeField; + set => this.dataTypeField = value; + } + + /// + public string HardWareId + { + get => this.hardWareIdField; + set => this.hardWareIdField = value; + } + + /// + public bool IsArray + { + get => this.isArrayField; + set => this.isArrayField = value; + } + + /// + public bool RepeatsOnSameLevel + { + get => this.repeatsOnSameLevelField; + set => this.repeatsOnSameLevelField = value; + } + + /// + public bool IsCyclical + { + get => this.isCyclicalField; + set => this.isCyclicalField = value; + } + + /// + public string FullName + { + get => this.fullNameField; + set => this.fullNameField = value; + } + + /// + public object Separator + { + get => this.separatorField; + set => this.separatorField = value; + } + + /// + public bool IsAutoGenerated + { + get => this.isAutoGeneratedField; + set => this.isAutoGeneratedField = value; + } + + /// + public PDSFConfigurationDataCollectionParameterConditions1 Conditions + { + get => this.conditionsField; + set => this.conditionsField = value; + } + + /// + public object LocalVariables + { + get => this.localVariablesField; + set => this.localVariablesField = value; + } + + /// + public object Arithmetics + { + get => this.arithmeticsField; + set => this.arithmeticsField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute("Name")] + public string Name1 + { + get => this.name1Field; + set => this.name1Field = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Alias + { + get => this.aliasField; + set => this.aliasField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Position + { + get => this.positionField; + set => this.positionField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public int Order + { + get => this.orderField; + set => this.orderField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public bool Use + { + get => this.useField; + set => this.useField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditions1 +{ + + private PDSFConfigurationDataCollectionParameterConditionsConditionModel1 conditionModelField; + + /// + public PDSFConfigurationDataCollectionParameterConditionsConditionModel1 ConditionModel + { + get => this.conditionModelField; + set => this.conditionModelField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModel1 +{ + + private string idField; + + private string nameField; + + private string descriptionField; + + private object conditionField; + + private PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool1 conditionDataPoolField; + + private string formulaField; + + private PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool1 formulaDataPoolField; + + private PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool1 nameDataPoolField; + + /// + public string Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public string Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + public object Condition + { + get => this.conditionField; + set => this.conditionField = value; + } + + /// + public PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool1 ConditionDataPool + { + get => this.conditionDataPoolField; + set => this.conditionDataPoolField = value; + } + + /// + public string Formula + { + get => this.formulaField; + set => this.formulaField = value; + } + + /// + public PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool1 FormulaDataPool + { + get => this.formulaDataPoolField; + set => this.formulaDataPoolField = value; + } + + /// + public PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool1 NameDataPool + { + get => this.nameDataPoolField; + set => this.nameDataPoolField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelConditionDataPool1 +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPool1 +{ + + private PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPoolScriptEditorDataPoolParameterModel[] parametersField; + + /// + [System.Xml.Serialization.XmlArrayItem("ScriptEditorDataPoolParameterModel", IsNullable = false)] + public PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPoolScriptEditorDataPoolParameterModel[] Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelFormulaDataPoolScriptEditorDataPoolParameterModel +{ + + private string nameField; + + private string valueField; + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public string Value + { + get => this.valueField; + set => this.valueField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionParameterConditionsConditionModelNameDataPool1 +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogistics +{ + + private PDSFConfigurationDataCollectionLogisticsAttribute[] attributesField; + + private PDSFConfigurationDataCollectionLogisticsColumn[] columnsField; + + private PDSFConfigurationDataCollectionLogisticsTriggers triggersField; + + private string equipmentAliasField; + + /// + [System.Xml.Serialization.XmlArrayItem("Attribute", IsNullable = false)] + public PDSFConfigurationDataCollectionLogisticsAttribute[] Attributes + { + get => this.attributesField; + set => this.attributesField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItem("Column", IsNullable = false)] + public PDSFConfigurationDataCollectionLogisticsColumn[] Columns + { + get => this.columnsField; + set => this.columnsField = value; + } + + /// + public PDSFConfigurationDataCollectionLogisticsTriggers Triggers + { + get => this.triggersField; + set => this.triggersField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string EquipmentAlias + { + get => this.equipmentAliasField; + set => this.equipmentAliasField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsAttribute +{ + + private string keyField; + + private int orderField; + + private string placeholderField; + + private bool useField; + + private bool addAsDataColumnField; + + private string attributeTypeField; + + private string dataColumnAliasField; + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Key + { + get => this.keyField; + set => this.keyField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public int Order + { + get => this.orderField; + set => this.orderField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Placeholder + { + get => this.placeholderField; + set => this.placeholderField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public bool Use + { + get => this.useField; + set => this.useField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public bool AddAsDataColumn + { + get => this.addAsDataColumnField; + set => this.addAsDataColumnField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string AttributeType + { + get => this.attributeTypeField; + set => this.attributeTypeField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string DataColumnAlias + { + get => this.dataColumnAliasField; + set => this.dataColumnAliasField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsColumn +{ + + private int idField; + + private string prefixField; + + /// + [System.Xml.Serialization.XmlAttribute()] + public int ID + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Prefix + { + get => this.prefixField; + set => this.prefixField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggers +{ + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTrigger updateTriggerField; + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTrigger UpdateTrigger + { + get => this.updateTriggerField; + set => this.updateTriggerField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTrigger +{ + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequest[] logisticRequestField; + + private bool incrementRuleField; + + private bool resolveGlobalVariableBeforeTriggerField; + + private string dCPField; + + /// + [System.Xml.Serialization.XmlElement("LogisticRequest")] + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequest[] LogisticRequest + { + get => this.logisticRequestField; + set => this.logisticRequestField = value; + } + + /// + public bool IncrementRule + { + get => this.incrementRuleField; + set => this.incrementRuleField = value; + } + + /// + public bool ResolveGlobalVariableBeforeTrigger + { + get => this.resolveGlobalVariableBeforeTriggerField; + set => this.resolveGlobalVariableBeforeTriggerField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string DCP + { + get => this.dCPField; + set => this.dCPField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequest +{ + + private int nameField; + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinition callDefinitionField; + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPool dataPoolField; + + private object incrementRuleField; + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeys keysField; + + private string ruleField; + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementCondition logisticIncrementConditionField; + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticsColumn logisticsColumnField; + + /// + public int Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinition CallDefinition + { + get => this.callDefinitionField; + set => this.callDefinitionField = value; + } + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPool DataPool + { + get => this.dataPoolField; + set => this.dataPoolField = value; + } + + /// + public object IncrementRule + { + get => this.incrementRuleField; + set => this.incrementRuleField = value; + } + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeys Keys + { + get => this.keysField; + set => this.keysField = value; + } + + /// + public string Rule + { + get => this.ruleField; + set => this.ruleField = value; + } + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementCondition LogisticIncrementCondition + { + get => this.logisticIncrementConditionField; + set => this.logisticIncrementConditionField = value; + } + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticsColumn LogisticsColumn + { + get => this.logisticsColumnField; + set => this.logisticsColumnField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinition +{ + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttribute[] attributesField; + + /// + [System.Xml.Serialization.XmlArrayItem("LogisticCallDefinitionAttribute", IsNullable = false)] + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttribute[] Attributes + { + get => this.attributesField; + set => this.attributesField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttribute +{ + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttributeDataPool dataPoolField; + + private string formulaField; + + private string logisticsKeyField; + + private string mappedParameterNameField; + + private string sourceField; + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttributeDataPool DataPool + { + get => this.dataPoolField; + set => this.dataPoolField = value; + } + + /// + public string Formula + { + get => this.formulaField; + set => this.formulaField = value; + } + + /// + public string LogisticsKey + { + get => this.logisticsKeyField; + set => this.logisticsKeyField = value; + } + + /// + public string MappedParameterName + { + get => this.mappedParameterNameField; + set => this.mappedParameterNameField = value; + } + + /// + public string Source + { + get => this.sourceField; + set => this.sourceField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttributeDataPool +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPool +{ + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParameters parametersField; + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParameters Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParameters +{ + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParametersScriptEditorDataPoolParameterModel scriptEditorDataPoolParameterModelField; + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParametersScriptEditorDataPoolParameterModel ScriptEditorDataPoolParameterModel + { + get => this.scriptEditorDataPoolParameterModelField; + set => this.scriptEditorDataPoolParameterModelField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestDataPoolParametersScriptEditorDataPoolParameterModel +{ + + private string nameField; + + private string valueField; + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public string Value + { + get => this.valueField; + set => this.valueField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeys +{ + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysEquipmentName equipmentNameField; + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMapping keyMappingField; + + private int defaultCarrierIndexField; + + private string defaultJobIndexField; + + private int defaultSlotIndexField; + + private string scenarioField; + + private bool useAllRequestedDataField; + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysEquipmentName EquipmentName + { + get => this.equipmentNameField; + set => this.equipmentNameField = value; + } + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMapping KeyMapping + { + get => this.keyMappingField; + set => this.keyMappingField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public int DefaultCarrierIndex + { + get => this.defaultCarrierIndexField; + set => this.defaultCarrierIndexField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string DefaultJobIndex + { + get => this.defaultJobIndexField; + set => this.defaultJobIndexField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public int DefaultSlotIndex + { + get => this.defaultSlotIndexField; + set => this.defaultSlotIndexField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Scenario + { + get => this.scenarioField; + set => this.scenarioField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public bool UseAllRequestedData + { + get => this.useAllRequestedDataField; + set => this.useAllRequestedDataField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysEquipmentName +{ + + private string fixedNameField; + + private string parameterNameField; + + /// + [System.Xml.Serialization.XmlAttribute()] + public string FixedName + { + get => this.fixedNameField; + set => this.fixedNameField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string ParameterName + { + get => this.parameterNameField; + set => this.parameterNameField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMapping +{ + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMappingDataPool dataPoolField; + + private string formulaField; + + private string keyNameField; + + private string parameterNameField; + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMappingDataPool DataPool + { + get => this.dataPoolField; + set => this.dataPoolField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Formula + { + get => this.formulaField; + set => this.formulaField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string KeyName + { + get => this.keyNameField; + set => this.keyNameField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string ParameterName + { + get => this.parameterNameField; + set => this.parameterNameField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestKeysKeyMappingDataPool +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementCondition +{ + + private object ruleField; + + private PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementConditionDataPool dataPoolField; + + /// + public object Rule + { + get => this.ruleField; + set => this.ruleField = value; + } + + /// + public PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementConditionDataPool DataPool + { + get => this.dataPoolField; + set => this.dataPoolField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticIncrementConditionDataPool +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestLogisticsColumn +{ + + private int fixedField; + + /// + [System.Xml.Serialization.XmlAttribute()] + public int Fixed + { + get => this.fixedField; + set => this.fixedField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionTrigger +{ + + private PDSFConfigurationDataCollectionTriggerDataPool dataPoolField; + + private object ruleField; + + private object descriptionField; + + private string idField; + + private string nameField; + + private bool resolveGlobalVariableBeforeTriggerField; + + /// + public PDSFConfigurationDataCollectionTriggerDataPool DataPool + { + get => this.dataPoolField; + set => this.dataPoolField = value; + } + + /// + public object Rule + { + get => this.ruleField; + set => this.ruleField = value; + } + + /// + public object Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public bool ResolveGlobalVariableBeforeTrigger + { + get => this.resolveGlobalVariableBeforeTriggerField; + set => this.resolveGlobalVariableBeforeTriggerField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionTriggerDataPool +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionFileWriterSettings +{ + + private string usedFileWriterField; + + private PDSFConfigurationDataCollectionFileWriterSettingsArrayInRowsSettings arrayInRowsSettingsField; + + private PDSFConfigurationDataCollectionFileWriterSettingsParameterInRowsSettings parameterInRowsSettingsField; + + /// + public string UsedFileWriter + { + get => this.usedFileWriterField; + set => this.usedFileWriterField = value; + } + + /// + public PDSFConfigurationDataCollectionFileWriterSettingsArrayInRowsSettings ArrayInRowsSettings + { + get => this.arrayInRowsSettingsField; + set => this.arrayInRowsSettingsField = value; + } + + /// + public PDSFConfigurationDataCollectionFileWriterSettingsParameterInRowsSettings ParameterInRowsSettings + { + get => this.parameterInRowsSettingsField; + set => this.parameterInRowsSettingsField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionFileWriterSettingsArrayInRowsSettings +{ + + private int logisticChangeExtendTimeField; + + private int extendTimeField; + + private int defaultValueForArrayInLinesField; + + private bool isEnabledField; + + /// + public int LogisticChangeExtendTime + { + get => this.logisticChangeExtendTimeField; + set => this.logisticChangeExtendTimeField = value; + } + + /// + public int ExtendTime + { + get => this.extendTimeField; + set => this.extendTimeField = value; + } + + /// + public int DefaultValueForArrayInLines + { + get => this.defaultValueForArrayInLinesField; + set => this.defaultValueForArrayInLinesField = value; + } + + /// + public bool IsEnabled + { + get => this.isEnabledField; + set => this.isEnabledField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionFileWriterSettingsParameterInRowsSettings +{ + + private bool isEnabledField; + + private string dataColumnNameField; + + private string logisticColumnNameField; + + private bool isGenerateHashCodeEnabledField; + + private string hashCodeColumnNameField; + + /// + public bool IsEnabled + { + get => this.isEnabledField; + set => this.isEnabledField = value; + } + + /// + public string DataColumnName + { + get => this.dataColumnNameField; + set => this.dataColumnNameField = value; + } + + /// + public string LogisticColumnName + { + get => this.logisticColumnNameField; + set => this.logisticColumnNameField = value; + } + + /// + public bool IsGenerateHashCodeEnabled + { + get => this.isGenerateHashCodeEnabledField; + set => this.isGenerateHashCodeEnabledField = value; + } + + /// + public string HashCodeColumnName + { + get => this.hashCodeColumnNameField; + set => this.hashCodeColumnNameField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionGeneralTriggers +{ + + private PDSFConfigurationDataCollectionGeneralTriggersDataPool dataPoolField; + + private object ruleField; + + private object descriptionField; + + private PDSFConfigurationDataCollectionGeneralTriggersVariableModel[] globalVariablesField; + + private string idField; + + private string nameField; + + private bool resolveGlobalVariableBeforeTriggerField; + + /// + public PDSFConfigurationDataCollectionGeneralTriggersDataPool DataPool + { + get => this.dataPoolField; + set => this.dataPoolField = value; + } + + /// + public object Rule + { + get => this.ruleField; + set => this.ruleField = value; + } + + /// + public object Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + [System.Xml.Serialization.XmlArrayItem("VariableModel", IsNullable = false)] + public PDSFConfigurationDataCollectionGeneralTriggersVariableModel[] GlobalVariables + { + get => this.globalVariablesField; + set => this.globalVariablesField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Id + { + get => this.idField; + set => this.idField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + [System.Xml.Serialization.XmlAttribute()] + public bool ResolveGlobalVariableBeforeTrigger + { + get => this.resolveGlobalVariableBeforeTriggerField; + set => this.resolveGlobalVariableBeforeTriggerField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionGeneralTriggersDataPool +{ + + private object parametersField; + + /// + public object Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionGeneralTriggersVariableModel +{ + + private string idField; + + private string nameField; + + private object descriptionField; + + private PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPool dataPoolField; + + private string formulaField; + + private string parameterNameField; + + private string[] resolveBeforeTriggersField; + + /// + public string Id + { + get => this.idField; + set => this.idField = value; + } + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public object Description + { + get => this.descriptionField; + set => this.descriptionField = value; + } + + /// + public PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPool DataPool + { + get => this.dataPoolField; + set => this.dataPoolField = value; + } + + /// + public string Formula + { + get => this.formulaField; + set => this.formulaField = value; + } + + /// + public string ParameterName + { + get => this.parameterNameField; + set => this.parameterNameField = value; + } + + /// + [System.Xml.Serialization.XmlElement("ResolveBeforeTriggers")] + public string[] ResolveBeforeTriggers + { + get => this.resolveBeforeTriggersField; + set => this.resolveBeforeTriggersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPool +{ + + private PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPoolScriptEditorDataPoolParameterModel[] parametersField; + + /// + [System.Xml.Serialization.XmlArrayItem("ScriptEditorDataPoolParameterModel", IsNullable = false)] + public PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPoolScriptEditorDataPoolParameterModel[] Parameters + { + get => this.parametersField; + set => this.parametersField = value; + } +} + +/// +[Serializable()] +[System.ComponentModel.DesignerCategory("code")] +[System.Xml.Serialization.XmlType(AnonymousType = true)] +public partial class PDSFConfigurationDataCollectionGeneralTriggersVariableModelDataPoolScriptEditorDataPoolParameterModel +{ + + private string nameField; + + private string valueField; + + /// + public string Name + { + get => this.nameField; + set => this.nameField = value; + } + + /// + public string Value + { + get => this.valueField; + set => this.valueField = value; + } } \ No newline at end of file diff --git a/EDA Viewer/Singleton/Helper/BackgroundEDADatabase.cs b/EDA Viewer/Singleton/Helper/BackgroundEDADatabase.cs index df7f127..d26258f 100644 --- a/EDA Viewer/Singleton/Helper/BackgroundEDADatabase.cs +++ b/EDA Viewer/Singleton/Helper/BackgroundEDADatabase.cs @@ -1,28 +1,16 @@ -namespace EDAViewer.Singleton.Helper +namespace EDAViewer.Singleton.Helper; + +public partial class Background { - public partial class Background + public partial class EDADatabase { - public partial class EDADatabase - { + public static string GetEdaDevelopment() => "Data Source=(description=(address_list=(address=(protocol=tcp)(host=fimest-db.mes.infineon.com)(port=7001)))(connect_data=(sid=fimest))); User Id=edatest; Password="; - public static string GetEdaDevelopment() - { - return "Data Source=(description=(address_list=(address=(protocol=tcp)(host=fimest-db.mes.infineon.com)(port=7001)))(connect_data=(sid=fimest))); User Id=edatest; Password="; - } + public static string GetEdaStaging() => "Data Source=(description=(address_list=(address=(protocol=tcp)(host=fimess-db.ec.local)(port=7001)))(connect_data=(sid=fimess))); User Id=edastag; Password="; - public static string GetEdaStaging() - { - return "Data Source=(description=(address_list=(address=(protocol=tcp)(host=fimess-db.ec.local)(port=7001)))(connect_data=(sid=fimess))); User Id=edastag; Password="; - } - - public static string GetEdaProduction() - { - return "Data Source=(description=(address_list=(address=(protocol=tcp)(host=fimesp-db.ec.local)(port=7002)))(connect_data=(sid=fimesp))); User Id=edaprod; Password="; - } - - } + public static string GetEdaProduction() => "Data Source=(description=(address_list=(address=(protocol=tcp)(host=fimesp-db.ec.local)(port=7002)))(connect_data=(sid=fimesp))); User Id=edaprod; Password="; } diff --git a/EDA Viewer/Singleton/Helper/BackgroundEdaDCP.cs b/EDA Viewer/Singleton/Helper/BackgroundEdaDCP.cs index 0715d1c..3eb3a25 100644 --- a/EDA Viewer/Singleton/Helper/BackgroundEdaDCP.cs +++ b/EDA Viewer/Singleton/Helper/BackgroundEdaDCP.cs @@ -1,427 +1,430 @@ -using System.Collections.Generic; using System.Dynamic; -using System.IO; using System.Text; using System.Text.Json; -namespace EDAViewer.Singleton.Helper +namespace EDAViewer.Singleton.Helper; + +public partial class Background { - public partial class Background + public class EdaDCP { - public class EdaDCP + internal static string GetEdaObjectToHtml(string edaObjectFile, Common common) { - - internal static string GetEdaObjectToHtml(string edaObjectFile, Common common) + StringBuilder result = new(); + string title = string.Concat(Path.GetFileName(edaObjectFile), " - ", common.Source); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append("").Append(title).AppendLine(""); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + _ = result.AppendLine("
").Append("Unit Name").AppendLine("").Append("Container Name").AppendLine("").Append("Configuration State").AppendLine("").Append("Configuration Productive State").AppendLine("").Append("LogisticsEquipmentAlias").AppendLine("").Append("Source").AppendLine("").Append("StoragePath").AppendLine("").Append("StartTimeFormat").AppendLine("").Append("Filename").AppendLine("
").Append(common.UnitName).AppendLine("").Append(common.ContainerName).AppendLine("").Append(common.ConfigurationState).AppendLine("").Append(common.ConfigurationProductiveState).AppendLine("").Append(common.LogisticsEquipmentAlias).AppendLine("").Append(common.Source).AppendLine("").Append(common.StoragePath).AppendLine("").Append(common.StartTimeFormat).AppendLine("").Append(common.Filename).AppendLine("
"); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + foreach (string[] item in common.LogisticsAttributes) { - StringBuilder result = new StringBuilder(); - string title = string.Concat(Path.GetFileName(edaObjectFile), " - ", common.Source); - result.AppendLine(""); - result.AppendLine(""); - result.AppendLine(""); - result.AppendLine(""); - result.Append("").Append(title).AppendLine(""); - result.AppendLine(""); - result.AppendLine(""); - result.AppendLine("
").Append("Use").AppendLine("").Append("Order").AppendLine("").Append("Key").AppendLine("").Append("Placeholder").AppendLine("
"); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - result.AppendLine("
").Append("Unit Name").AppendLine("").Append("Container Name").AppendLine("").Append("Configuration State").AppendLine("").Append("Configuration Productive State").AppendLine("").Append("LogisticsEquipmentAlias").AppendLine("").Append("Source").AppendLine("").Append("StoragePath").AppendLine("").Append("StartTimeFormat").AppendLine("").Append("Filename").AppendLine("
").Append(common.UnitName).AppendLine("").Append(common.ContainerName).AppendLine("").Append(common.ConfigurationState).AppendLine("").Append(common.ConfigurationProductiveState).AppendLine("").Append(common.LogisticsEquipmentAlias).AppendLine("").Append(common.Source).AppendLine("").Append(common.StoragePath).AppendLine("").Append(common.StartTimeFormat).AppendLine("").Append(common.Filename).AppendLine("
"); - result.AppendLine("
"); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - foreach (string[] item in common.LogisticsAttributes) + if (item.Length > 2 && !item[2].StartsWith("Z_")) { - if (item.Length > 2 && !item[2].StartsWith("Z_")) + _ = result.AppendLine(""); + foreach (string value in item) + _ = result.Append(""); + _ = result.AppendLine(""); + } + } + _ = result.AppendLine("
").Append("Use").AppendLine("").Append("Order").AppendLine("").Append("Key").AppendLine("").Append("Placeholder").AppendLine("
").Append(value).AppendLine("
"); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + foreach (string[] item in common.LogisticsColumns) + { + _ = result.AppendLine(""); + foreach (string value in item) + _ = result.Append(""); + _ = result.AppendLine(""); + } + _ = result.AppendLine("
").Append("ID").AppendLine("").Append("Prefix").AppendLine("
").Append(value).AppendLine("
"); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + foreach (string[] item in common.Parameters) + { + _ = result.AppendLine(""); + foreach (string value in item) + _ = result.Append(""); + _ = result.AppendLine(""); + } + _ = result.AppendLine("
").Append("Use").AppendLine("").Append("Order").AppendLine("").Append("FullName").AppendLine("").Append("Alias").AppendLine("").Append("HardWareId").AppendLine("").Append("Description").AppendLine("").Append("Formula").AppendLine("").Append("Virtual").AppendLine("").Append("Column#").AppendLine("
").Append(value).AppendLine("
"); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + foreach (string[] item in common.GeneralTriggers) + { + _ = result.AppendLine(""); + foreach (string value in item) + _ = result.Append(""); + _ = result.AppendLine(""); + } + _ = result.AppendLine("
").Append("Parent Name").AppendLine("").Append("Name").AppendLine("").Append("ParameterName").AppendLine("").Append("Formula").AppendLine("
").Append(value).AppendLine("
"); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + foreach (string[] item in common.StartTriggersDCP) + { + _ = result.AppendLine(""); + foreach (string value in item) + _ = result.Append(""); + _ = result.AppendLine(""); + } + _ = result.AppendLine("
").Append("Name").AppendLine("").Append("Rule").AppendLine("").Append("ResolveGlobalVariableBeforeTrigger").AppendLine("
").Append(value).AppendLine("
"); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + foreach (string?[] item in common.LogisticsTriggers) + { + if (item is null) + continue; + _ = result.AppendLine(""); + foreach (string? value in item) + _ = result.Append(""); + _ = result.AppendLine(""); + _ = result.AppendLine("
").Append("Name").AppendLine("").Append("Fixed").AppendLine("").Append("Rule").AppendLine("").Append("Scenario").AppendLine("").Append("DefaultJobIndex").AppendLine("").Append("DefaultCarrierIndex").AppendLine("").Append("DefaultSlotIndex").AppendLine("").Append("DataPool").AppendLine("
").Append(value).AppendLine(""); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + foreach (KeyValuePair keyValuePair in common.LogisticsTriggersKeysKeyMapping) + { + _ = result.AppendLine(""); + foreach (string value in keyValuePair.Value) + _ = result.Append(""); + _ = result.AppendLine(""); + } + _ = result.AppendLine("
").Append("KeyName").AppendLine("").Append("ParameterName").AppendLine("").Append("Formula").AppendLine("
").Append(value).AppendLine("
"); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + foreach (KeyValuePair> keyValuePair in common.LogisticsTriggersCallDefinitionAttributes) + { + foreach (string[] values in keyValuePair.Value) { - result.AppendLine(""); - foreach (string value in item) - result.Append(""); - result.AppendLine(""); - } - } - result.AppendLine("
").Append("LogisticsKey").AppendLine("").Append("Source").AppendLine("").Append("MappedParameterName").AppendLine("").Append("Formula").AppendLine("
").Append(value).AppendLine("
"); - result.AppendLine("
"); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - foreach (string[] item in common.LogisticsColumns) - { - result.AppendLine(""); - foreach (string value in item) - result.Append(""); - result.AppendLine(""); - } - result.AppendLine("
").Append("ID").AppendLine("").Append("Prefix").AppendLine("
").Append(value).AppendLine("
"); - result.AppendLine("
"); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - foreach (string[] item in common.Parameters) - { - result.AppendLine(""); - foreach (string value in item) - result.Append(""); - result.AppendLine(""); - } - result.AppendLine("
").Append("Use").AppendLine("").Append("Order").AppendLine("").Append("FullName").AppendLine("").Append("Alias").AppendLine("").Append("HardWareId").AppendLine("").Append("Description").AppendLine("").Append("Formula").AppendLine("").Append("Virtual").AppendLine("").Append("Column#").AppendLine("
").Append(value).AppendLine("
"); - result.AppendLine("
"); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - foreach (string[] item in common.GeneralTriggers) - { - result.AppendLine(""); - foreach (string value in item) - result.Append(""); - result.AppendLine(""); - } - result.AppendLine("
").Append("Parent Name").AppendLine("").Append("Name").AppendLine("").Append("ParameterName").AppendLine("").Append("Formula").AppendLine("
").Append(value).AppendLine("
"); - result.AppendLine("
"); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - foreach (string[] item in common.StartTriggersDCP) - { - result.AppendLine(""); - foreach (string value in item) - result.Append(""); - result.AppendLine(""); - } - result.AppendLine("
").Append("Name").AppendLine("").Append("Rule").AppendLine("").Append("ResolveGlobalVariableBeforeTrigger").AppendLine("
").Append(value).AppendLine("
"); - result.AppendLine("
"); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - foreach (string[] item in common.LogisticsTriggers) - { - result.AppendLine(""); - foreach (string value in item) - result.Append(""); - result.AppendLine(""); - result.AppendLine(""); - result.AppendLine(""); } - result.AppendLine("
").Append("Name").AppendLine("").Append("Fixed").AppendLine("").Append("Rule").AppendLine("").Append("Scenario").AppendLine("").Append("DefaultJobIndex").AppendLine("").Append("DefaultCarrierIndex").AppendLine("").Append("DefaultSlotIndex").AppendLine("").Append("DataPool").AppendLine("
").Append(value).AppendLine(""); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - foreach (KeyValuePair keyValuePair in common.LogisticsTriggersKeysKeyMapping) - { - result.AppendLine(""); - foreach (string value in keyValuePair.Value) - result.Append(""); - result.AppendLine(""); - } - result.AppendLine("
").Append("KeyName").AppendLine("").Append("ParameterName").AppendLine("").Append("Formula").AppendLine("
").Append(value).AppendLine("
"); - result.AppendLine("
"); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - foreach (KeyValuePair> keyValuePair in common.LogisticsTriggersCallDefinitionAttributes) - { - foreach (string[] values in keyValuePair.Value) + if (values.Length > 0 && !values[0].StartsWith("Z_")) { - if (values.Length > 0 && !values[0].StartsWith("Z_")) - { - result.AppendLine(""); - foreach (string value in values) - result.Append(""); - result.AppendLine(""); - } + _ = result.AppendLine(""); + foreach (string value in values) + _ = result.Append(""); + _ = result.AppendLine(""); } } - result.AppendLine("
").Append("LogisticsKey").AppendLine("").Append("Source").AppendLine("").Append("MappedParameterName").AppendLine("").Append("Formula").AppendLine("
").Append(value).AppendLine("
").Append(value).AppendLine("
"); - result.AppendLine("
"); - result.AppendLine("
"); - result.AppendLine(""); - result.AppendLine(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.Append(""); - result.AppendLine(""); - foreach (string[] item in common.StopTriggersDCP) - { - result.AppendLine(""); - foreach (string value in item) - result.Append(""); - result.AppendLine(""); - } - result.AppendLine("
").Append("Name").AppendLine("").Append("Rule").AppendLine("").Append("ResolveGlobalVariableBeforeTrigger").AppendLine("").Append("ResetGlobalVariablesAfterTrigger").AppendLine("
").Append(value).AppendLine("
"); - result.AppendLine("
"); - result.AppendLine(""); - result.AppendLine(""); - return result.ToString(); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); } - - private static string ReplaceNull(object @object) + _ = result.AppendLine(""); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.Append(""); + _ = result.AppendLine(""); + foreach (string[] item in common.StopTriggersDCP) { - if (@object is null) - return string.Empty; + _ = result.AppendLine(""); + foreach (string value in item) + _ = result.Append(""); + _ = result.AppendLine(""); + } + _ = result.AppendLine("
").Append("Name").AppendLine("").Append("Rule").AppendLine("").Append("ResolveGlobalVariableBeforeTrigger").AppendLine("").Append("ResetGlobalVariablesAfterTrigger").AppendLine("
").Append(value).AppendLine("
"); + _ = result.AppendLine("
"); + _ = result.AppendLine(""); + _ = result.AppendLine(""); + return result.ToString(); + } + + private static string? ReplaceNull(object @object) + { + if (@object is null) + return string.Empty; + else + return @object.ToString(); + } + + private static void TextResolveEntry(StringBuilder result, dynamic expandoObject, int level, string super, int? i, bool group) + { + level += 1; + foreach (dynamic entry in expandoObject) + { + if (entry.Value is ExpandoObject) + TextResolveEntry(result, entry.Value, level, string.Concat(super, " : ", entry.Key), i, group); else - return @object.ToString(); - } - - private static void TextResolveEntry(StringBuilder result, dynamic expandoObject, int level, string super, int? i, bool group) - { - level += 1; - foreach (dynamic entry in expandoObject) { - if (entry.Value is ExpandoObject) - TextResolveEntry(result, entry.Value, level, string.Concat(super, " : ", entry.Key), i, group); + if (entry.Value is not ICollection) + { + if (i is null) + result.Append(level).Append(") ").Append(super).Append(" : ").Append(entry.Key).Append("--->").AppendLine(ReplaceNull(entry.Value)); + else + result.Append(level).Append(") ").Append(super).Append(" : ").Append(entry.Key).Append("[").Append(i.Value).Append("]--->").AppendLine(ReplaceNull(entry.Value)); + } else { - if (!(entry.Value is ICollection)) + if (!group) { - if (i is null) - result.Append(level).Append(") ").Append(super).Append(" : ").Append(entry.Key).Append("--->").AppendLine(ReplaceNull(entry.Value)); - else - result.Append(level).Append(") ").Append(super).Append(" : ").Append(entry.Key).Append("[").Append(i.Value).Append("]--->").AppendLine(ReplaceNull(entry.Value)); - } - else - { - if (!group) + for (i = 0; i.Value < entry.Value.Count; i++) { - for (i = 0; i.Value < entry.Value.Count; i++) - { - if (entry.Value[i.Value] is ExpandoObject) - TextResolveEntry(result, entry.Value[i.Value], level, string.Concat(super, " : ", entry.Key), i.Value, group); - else - result.Append(level).Append(") ").Append(super).Append(" : ").Append(entry.Key).Append("[").Append(i.Value).Append("]--->").AppendLine(ReplaceNull(entry.Value[i.Value])); - } + if (entry.Value[i.Value] is ExpandoObject) + TextResolveEntry(result, entry.Value[i.Value], level, string.Concat(super, " : ", entry.Key), i.Value, group); + else + result.Append(level).Append(") ").Append(super).Append(" : ").Append(entry.Key).Append("[").Append(i.Value).Append("]--->").AppendLine(ReplaceNull(entry.Value[i.Value])); } - else - { - for (i = 0; i.Value < entry.Value.Count; i++) - { - if (!(entry.Value[i.Value] is ExpandoObject)) - result.Append(level).Append(") ").Append(super).Append(" : ").Append(entry.Key).Append("[").Append(i.Value).Append("]--->").AppendLine(ReplaceNull(entry.Value[i.Value])); - } - for (i = 0; i.Value < entry.Value.Count; i++) - { - if (entry.Value[i.Value] is ExpandoObject) - TextResolveEntry(result, entry.Value[i.Value], level, string.Concat(super, " : ", entry.Key), i.Value, group); - } - } - i = null; } - } - } - level -= 1; - } - - internal static string GetText(string edaObjectFile, Common common, string json) - { - StringBuilder result = new StringBuilder(); - if (result.Length > 0) //Skipping because System.Text.Json changed the way Expando works - { - string title = string.Concat(Path.GetFileName(edaObjectFile), " - ", common.Source); - dynamic expandoObject = JsonSerializer.Deserialize(json); - result.AppendLine(title); - result.AppendLine("Loop -> \"Normal\""); - result.AppendLine(edaObjectFile); - result.AppendLine(); - TextResolveEntry(result, expandoObject, 0, string.Empty, null, group: false); - result.AppendLine(); - result.AppendLine(); - result.AppendLine(); - result.AppendLine(title); - result.AppendLine("Loop -> \"Grouped\""); - result.AppendLine(edaObjectFile); - result.AppendLine(); - TextResolveEntry(result, expandoObject, 0, string.Empty, null, group: true); - } - return result.ToString(); - } - - internal static string GetEdaObjectToDMSGridFormat(string edaObjectFile, Common common, bool useAlias) - { - StringBuilder result = new StringBuilder(); - string[] segments; - int? recordStart = null; - string name = string.Concat(common.LogisticsEquipmentAlias, "_", common.ContainerName); - result.AppendLine(""); - result.Append("").AppendLine(); - result.AppendLine(" "); - result.AppendLine(" <13><10>"); - result.AppendLine(" <9>"); - result.AppendLine(" "); - result.AppendLine(" "); - for (int i = 0; i < common.Parameters.Count; i++) - { - if (recordStart is null && common.Parameters[i][3] == "RECORD_START") - recordStart = i; - if (recordStart.HasValue && common.Parameters[i][0] == "True") - { - if (useAlias && !string.IsNullOrEmpty(common.Parameters[i][3])) - name = common.Parameters[i][3].Replace("'", string.Empty); else { - segments = common.Parameters[i][2].Split('/'); - name = segments[segments.Length - 1]; + for (i = 0; i.Value < entry.Value.Count; i++) + { + if (entry.Value[i.Value] is not ExpandoObject) + result.Append(level).Append(") ").Append(super).Append(" : ").Append(entry.Key).Append("[").Append(i.Value).Append("]--->").AppendLine(ReplaceNull(entry.Value[i.Value])); + } + for (i = 0; i.Value < entry.Value.Count; i++) + { + if (entry.Value[i.Value] is ExpandoObject) + TextResolveEntry(result, entry.Value[i.Value], level, string.Concat(super, " : ", entry.Key), i.Value, group); + } } - result.Append(" ").AppendLine(); + i = null; } } - result.AppendLine(" "); - result.AppendLine(" "); - result.AppendLine(" "); - result.AppendLine(" "); - result.AppendLine(" "); - result.AppendLine(" 7"); - result.AppendLine(" 0"); - result.AppendLine(" "); - result.AppendLine(" "); - result.AppendLine(" "); - result.AppendLine(" "); - result.AppendLine(" "); - result.AppendLine(""); - return result.ToString(); } + level -= 1; + if (level == 0) + { } + } - internal static string GetEdaObjectToAPCParameter(string edaObjectFile, Common common) + internal static string GetText(string edaObjectFile, Common common, string json) + { + StringBuilder result = new(); + if (result.Length > 0) //Skipping because System.Text.Json changed the way Expando works { - StringBuilder result = new StringBuilder(); - string parameter; - string[] segments; - string parameterSub35; - string name = string.Concat(common.LogisticsEquipmentAlias, "_", common.ContainerName); - result.AppendLine("ExportFileVersion=1.0.6"); - result.AppendLine("ExportFromTabsheet=Para"); - result.AppendLine("FieldName\tLongName\tMatchMode\tEquipment\tName\tPdsfNameConvCol\tPdsfNameDataType\tType\tChamberInfo\tUnifiedPara\tDateFormat\tUsername\tId\tWorkcenterId\tSite\tArea\tWorkcenter\tValidFrom\tValidTo"); - result.AppendLine("TIME_PREV_DIFF\tTIME_PREV_DIFF\tEXACT\t*\tTIME_PREV_DIFF\t\tNUMERIC\tRUN\t\tTIME_PREV_DIFF\t\tPHARES\t95069\t4571\tMesa\t\t\t4/15/2020 6:10 PM"); - result.AppendLine("TIME\tTIME\tEXACT\t*\tTIME\t\tNUMERIC\tRUN\t\tTIME\t\tPHARES\t95070\t4571\tMesa\t\t\t4/15/2020 6:10 PM"); - for (int i = 0; i < common.Parameters.Count; i++) - { - if (common.Parameters[i][0] == "True") - { - segments = common.Parameters[i][2].Split('/'); - parameter = segments[segments.Length - 1]; - if (parameter.Length < 35) - parameterSub35 = parameter; - else - parameterSub35 = parameter.Substring(0, 35); - result.Append(parameterSub35).Append("\tDIVERSE\tEXACT\t*\t").Append(parameterSub35).AppendLine("\t\tNUMERIC\tRUN\t\t\t\tPHARES\t9000000012\t4571\tMesa\t\t\t4/15/2020 6:10 PM"); - } - } - result.AppendLine(); - result.AppendLine(); - result.AppendLine(); - for (int i = 0; i < common.Parameters.Count; i++) - { - if (common.Parameters[i][0] == "True") - { - segments = common.Parameters[i][2].Split('/'); - parameter = segments[segments.Length - 1]; - result.Append(parameter).Append("\tDIVERSE\tEXACT\t*\t").Append(parameter).AppendLine("\t\tNUMERIC\tRUN\t\t\t\tPHARES\t9000000012\t4571\tMesa\t\t\t4/15/2020 6:10 PM"); - } - } - return result.ToString(); + string title = string.Concat(Path.GetFileName(edaObjectFile), " - ", common.Source); + dynamic? expandoObject = JsonSerializer.Deserialize(json); + _ = result.AppendLine(title); + _ = result.AppendLine("Loop -> \"Normal\""); + _ = result.AppendLine(edaObjectFile); + _ = result.AppendLine(); + TextResolveEntry(result, expandoObject, 0, string.Empty, null, group: false); + _ = result.AppendLine(); + _ = result.AppendLine(); + _ = result.AppendLine(); + _ = result.AppendLine(title); + _ = result.AppendLine("Loop -> \"Grouped\""); + _ = result.AppendLine(edaObjectFile); + _ = result.AppendLine(); + TextResolveEntry(result, expandoObject, 0, string.Empty, null, group: true); } + return result.ToString(); + } - internal static string GetEdaObjectToAPCRunKeyNumber(string edaObjectFile, Common common) + internal static string GetEdaObjectToDMSGridFormat(string edaObjectFile, Common common, bool useAlias) + { + StringBuilder result = new(); + if (string.IsNullOrEmpty(edaObjectFile)) + { } + string[] segments; + int? recordStart = null; + string name = string.Concat(common.LogisticsEquipmentAlias, "_", common.ContainerName); + _ = result.AppendLine(""); + _ = result.Append("").AppendLine(); + _ = result.AppendLine(" "); + _ = result.AppendLine(" <13><10>"); + _ = result.AppendLine(" <9>"); + _ = result.AppendLine(" "); + _ = result.AppendLine(" "); + for (int i = 0; i < common.Parameters.Count; i++) { - StringBuilder result = new StringBuilder(); - string parameter; - string[] segments; - string parameterSub21; - string parameterSub35; - string name = string.Concat(common.LogisticsEquipmentAlias, "_", common.ContainerName); - result.AppendLine("ExportFileVersion=1.0.6"); - result.AppendLine("ExportFromTabsheet=Run-Keynumbers"); - result.AppendLine("FeatureName\tShortName\tChamber\tComments\tVarMode\tPara\tExclude0\tTrigOn1\tTrigOn2\tTrigOn3\tTrigOff1\tTrigOff2\tTrigOff3\tTrigDelay\tTrigNorm\tTrigNvl\tTrigTrg\tAddCondOn\tActive\tFilter1\tFilter2\tFilter3\tFilter4\tUnit\tId\tWorkcenterId\tSite\tArea\tWorkcenter\tUsername\tValidFrom\tValidTo"); - for (int i = 0; i < common.Parameters.Count; i++) + if (recordStart is null && common.Parameters[i][3] == "RECORD_START") + recordStart = i; + if (recordStart.HasValue && common.Parameters[i][0] == "True") { - if (common.Parameters[i][0] == "True") + if (useAlias && !string.IsNullOrEmpty(common.Parameters[i][3])) + name = common.Parameters[i][3].Replace("'", string.Empty); + else { segments = common.Parameters[i][2].Split('/'); - parameter = segments[segments.Length - 1]; - if (parameter.Length < 35) - parameterSub35 = parameter; - else - parameterSub35 = parameter.Substring(0, 35); - if (parameter.Length < 21) - parameterSub21 = parameter; - else - parameterSub21 = parameter.Substring(0, 21); - result.Append(parameterSub21).Append("_MIN\t").Append(parameterSub21).Append("_MIN\t\t\tMIN\t").Append(parameterSub35).AppendLine("\t0\tTIME\t=\tRUNSTART\tTIME\t=\tRUNEND\t\t\t\t\t\t1\t\t\t\t\t\t-1\t-1\t\t\t\tECPHARES\t5/2/2017 2:44 PM"); + name = segments[^1]; } + _ = result.Append(" ").AppendLine(); } - result.AppendLine(); - result.AppendLine(); - result.AppendLine(); - for (int i = 0; i < common.Parameters.Count; i++) - { - if (common.Parameters[i][0] == "True") - { - segments = common.Parameters[i][2].Split('/'); - parameter = segments[segments.Length - 1]; - result.Append(parameter).Append("_MIN\t").Append(parameter).Append("_MIN\t\t\tMIN\t").Append(parameter).AppendLine("\t0\tTIME\t=\tRUNSTART\tTIME\t=\tRUNEND\t\t\t\t\t\t1\t\t\t\t\t\t-1\t-1\t\t\t\tECPHARES\t5/2/2017 2:44 PM"); - } - } - return result.ToString(); } + _ = result.AppendLine(" "); + _ = result.AppendLine(" "); + _ = result.AppendLine(" "); + _ = result.AppendLine(" "); + _ = result.AppendLine(" "); + _ = result.AppendLine(" 7"); + _ = result.AppendLine(" 0"); + _ = result.AppendLine(" "); + _ = result.AppendLine(" "); + _ = result.AppendLine(" "); + _ = result.AppendLine(" "); + _ = result.AppendLine(" "); + _ = result.AppendLine(""); + return result.ToString(); + } + internal static string GetEdaObjectToAPCParameter(string edaObjectFile, Common common) + { + StringBuilder result = new(); + if (string.IsNullOrEmpty(edaObjectFile)) + { } + string parameter; + string[] segments; + string parameterSub35; + _ = result.AppendLine("ExportFileVersion=1.0.6"); + _ = result.AppendLine("ExportFromTabsheet=Para"); + _ = result.AppendLine("FieldName\tLongName\tMatchMode\tEquipment\tName\tPdsfNameConvCol\tPdsfNameDataType\tType\tChamberInfo\tUnifiedPara\tDateFormat\tUsername\tId\tWorkcenterId\tSite\tArea\tWorkcenter\tValidFrom\tValidTo"); + _ = result.AppendLine("TIME_PREV_DIFF\tTIME_PREV_DIFF\tEXACT\t*\tTIME_PREV_DIFF\t\tNUMERIC\tRUN\t\tTIME_PREV_DIFF\t\tPHARES\t95069\t4571\tMesa\t\t\t4/15/2020 6:10 PM"); + _ = result.AppendLine("TIME\tTIME\tEXACT\t*\tTIME\t\tNUMERIC\tRUN\t\tTIME\t\tPHARES\t95070\t4571\tMesa\t\t\t4/15/2020 6:10 PM"); + for (int i = 0; i < common.Parameters.Count; i++) + { + if (common.Parameters[i][0] == "True") + { + segments = common.Parameters[i][2].Split('/'); + parameter = segments[^1]; + if (parameter.Length < 35) + parameterSub35 = parameter; + else + parameterSub35 = parameter[..35]; + _ = result.Append(parameterSub35).Append("\tDIVERSE\tEXACT\t*\t").Append(parameterSub35).AppendLine("\t\tNUMERIC\tRUN\t\t\t\tPHARES\t9000000012\t4571\tMesa\t\t\t4/15/2020 6:10 PM"); + } + } + _ = result.AppendLine(); + _ = result.AppendLine(); + _ = result.AppendLine(); + for (int i = 0; i < common.Parameters.Count; i++) + { + if (common.Parameters[i][0] == "True") + { + segments = common.Parameters[i][2].Split('/'); + parameter = segments[^1]; + _ = result.Append(parameter).Append("\tDIVERSE\tEXACT\t*\t").Append(parameter).AppendLine("\t\tNUMERIC\tRUN\t\t\t\tPHARES\t9000000012\t4571\tMesa\t\t\t4/15/2020 6:10 PM"); + } + } + return result.ToString(); + } + + internal static string GetEdaObjectToAPCRunKeyNumber(string edaObjectFile, Common common) + { + StringBuilder result = new(); + if (string.IsNullOrEmpty(edaObjectFile)) + { } + string parameter; + string[] segments; + string parameterSub21; + string parameterSub35; + _ = result.AppendLine("ExportFileVersion=1.0.6"); + _ = result.AppendLine("ExportFromTabsheet=Run-Keynumbers"); + _ = result.AppendLine("FeatureName\tShortName\tChamber\tComments\tVarMode\tPara\tExclude0\tTrigOn1\tTrigOn2\tTrigOn3\tTrigOff1\tTrigOff2\tTrigOff3\tTrigDelay\tTrigNorm\tTrigNvl\tTrigTrg\tAddCondOn\tActive\tFilter1\tFilter2\tFilter3\tFilter4\tUnit\tId\tWorkcenterId\tSite\tArea\tWorkcenter\tUsername\tValidFrom\tValidTo"); + for (int i = 0; i < common.Parameters.Count; i++) + { + if (common.Parameters[i][0] == "True") + { + segments = common.Parameters[i][2].Split('/'); + parameter = segments[^1]; + if (parameter.Length < 35) + parameterSub35 = parameter; + else + parameterSub35 = parameter[..35]; + if (parameter.Length < 21) + parameterSub21 = parameter; + else + parameterSub21 = parameter[..21]; + _ = result.Append(parameterSub21).Append("_MIN\t").Append(parameterSub21).Append("_MIN\t\t\tMIN\t").Append(parameterSub35).AppendLine("\t0\tTIME\t=\tRUNSTART\tTIME\t=\tRUNEND\t\t\t\t\t\t1\t\t\t\t\t\t-1\t-1\t\t\t\tECPHARES\t5/2/2017 2:44 PM"); + } + } + _ = result.AppendLine(); + _ = result.AppendLine(); + _ = result.AppendLine(); + for (int i = 0; i < common.Parameters.Count; i++) + { + if (common.Parameters[i][0] == "True") + { + segments = common.Parameters[i][2].Split('/'); + parameter = segments[^1]; + _ = result.Append(parameter).Append("_MIN\t").Append(parameter).Append("_MIN\t\t\tMIN\t").Append(parameter).AppendLine("\t0\tTIME\t=\tRUNSTART\tTIME\t=\tRUNEND\t\t\t\t\t\t1\t\t\t\t\t\t-1\t-1\t\t\t\tECPHARES\t5/2/2017 2:44 PM"); + } + } + return result.ToString(); } } diff --git a/EDA Viewer/Singleton/Helper/Common.cs b/EDA Viewer/Singleton/Helper/Common.cs index 1a264ba..0cfc99b 100644 --- a/EDA Viewer/Singleton/Helper/Common.cs +++ b/EDA Viewer/Singleton/Helper/Common.cs @@ -1,164 +1,173 @@ -using EDAViewer.Singleton.Helper; -using System; -using System.Collections.Generic; -using System.Linq; using System.Text; -namespace EDAViewer.Singleton.Helper +namespace EDAViewer.Singleton.Helper; + +[Serializable] +public class Common { - [Serializable] - public class Common + public string? ConfigurationProductiveState { get; set; } + public string? ConfigurationState { get; set; } + public string? ContainerName { get; set; } + public ModuleInstanceTypeName? ObjectType { get; set; } + public string? UnitName { get; set; } + // + public string Filename { get; set; } + public string StartTimeFormat { get; set; } + public string StoragePath { get; set; } + // + public List GeneralTriggers { get; set; } + public List LogisticsAttributes { get; set; } + public List LogisticsColumns { get; set; } + public string LogisticsEquipmentAlias { get; set; } + public List LogisticsTriggers { get; set; } + public Dictionary> LogisticsTriggersCallDefinitionAttributes { get; set; } + public Dictionary LogisticsTriggersKeysKeyMapping { get; set; } + public List Parameters { get; set; } + public string ParametersAsCsv { get; set; } + public string Source { get; set; } + public List StartTriggersDCP { get; set; } + public List StopTriggersDCP { get; set; } + + [Obsolete("Only for DeserializeObject")] + public Common() { + ObjectType = null; + Parameters = new(); + Source = string.Empty; + Filename = string.Empty; + GeneralTriggers = new(); + StopTriggersDCP = new(); + UnitName = string.Empty; + LogisticsColumns = new(); + StartTriggersDCP = new(); + LogisticsTriggers = new(); + StoragePath = string.Empty; + LogisticsAttributes = new(); + ContainerName = string.Empty; + ParametersAsCsv = string.Empty; + StartTimeFormat = string.Empty; + ConfigurationState = string.Empty; + LogisticsEquipmentAlias = string.Empty; + ConfigurationProductiveState = string.Empty; + LogisticsTriggersKeysKeyMapping = new Dictionary(); + LogisticsTriggersCallDefinitionAttributes = new Dictionary>(); + } - public ModuleInstanceTypeName? ObjectType { get; set; } - public string ConfigurationState { get; set; } - public string ConfigurationProductiveState { get; set; } - public string UnitName { get; set; } - public string ContainerName { get; set; } + public Common(ModuleInstanceTypeName objectType, object unitName, object containerName, object configurationState, object configurationProductiveState) + { + Parameters = new(); + Source = string.Empty; + Filename = string.Empty; + GeneralTriggers = new(); + ObjectType = objectType; + StopTriggersDCP = new(); + LogisticsColumns = new(); + StartTriggersDCP = new(); + LogisticsTriggers = new(); + StoragePath = string.Empty; + LogisticsAttributes = new(); + ParametersAsCsv = string.Empty; + StartTimeFormat = string.Empty; + UnitName = unitName.ToString(); + LogisticsEquipmentAlias = string.Empty; + ContainerName = containerName.ToString(); + ConfigurationState = configurationState.ToString(); + LogisticsTriggersKeysKeyMapping = new Dictionary(); + ConfigurationProductiveState = configurationProductiveState.ToString(); + LogisticsTriggersCallDefinitionAttributes = new Dictionary>(); + } + + public void Update(PDSFConfiguration configuration) + { + StoragePath = configuration.Settings.StoragePath; + StartTimeFormat = configuration.Settings.StartTimeFormat; + Filename = configuration.Settings.Filename; // - public string StoragePath { get; set; } - public string StartTimeFormat { get; set; } - public string Filename { get; set; } - // - public string Source { get; set; } - public string LogisticsEquipmentAlias { get; set; } - public List LogisticsAttributes { get; set; } - public List LogisticsColumns { get; set; } - public List Parameters { get; set; } - public string ParametersAsCsv { get; set; } - public List GeneralTriggers { get; set; } - public List StartTriggersDCP { get; set; } - public List LogisticsTriggers { get; set; } - public Dictionary LogisticsTriggersKeysKeyMapping { get; set; } - public Dictionary> LogisticsTriggersCallDefinitionAttributes { get; set; } - public List StopTriggersDCP { get; set; } - - [Obsolete("Only for DeserializeObject")] - public Common() + Source = configuration.DataCollection.Source; + LogisticsEquipmentAlias = configuration.DataCollection.Logistics.EquipmentAlias; + //if (LogisticsEquipmentAlias == "R47-PLC") + //{ } + foreach (PDSFConfigurationDataCollectionLogisticsAttribute item in (from l in configuration.DataCollection.Logistics.Attributes orderby l.Use descending, l.Order select l)) + LogisticsAttributes.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.Key, item.Placeholder }); + foreach (PDSFConfigurationDataCollectionLogisticsColumn item in configuration.DataCollection.Logistics.Columns) + LogisticsColumns.Add(new string[] { item.ID.ToString(), item.Prefix }); + foreach (PDSFConfigurationDataCollectionParameter1 item in (from l in configuration.DataCollection.VirtualParameters orderby l.Use descending, l.Order select l)) { - ObjectType = null; - ConfigurationState = string.Empty; - ConfigurationProductiveState = string.Empty; - UnitName = string.Empty; - ContainerName = string.Empty; - CommonLogic(); - } - - public Common(ModuleInstanceTypeName objectType, object unitName, object containerName, object configurationState, object configurationProductiveState) - { - ObjectType = objectType; - ConfigurationState = configurationState.ToString(); - ConfigurationProductiveState = configurationProductiveState.ToString(); - UnitName = unitName.ToString(); - ContainerName = containerName.ToString(); - CommonLogic(configurationState.ToString(), configurationProductiveState.ToString(), unitName.ToString(), containerName.ToString()); - } - - private void CommonLogic(string configurationState = "", string configurationProductiveState = "", string unitName = "", string containerame = "") - { - LogisticsAttributes = new List(); - LogisticsColumns = new List(); - Parameters = new List(); - ParametersAsCsv = string.Empty; - GeneralTriggers = new List(); - StartTriggersDCP = new List(); - LogisticsTriggers = new List(); - LogisticsTriggersKeysKeyMapping = new Dictionary(); - LogisticsTriggersCallDefinitionAttributes = new Dictionary>(); - StopTriggersDCP = new List(); - } - - public void Update(PDSFConfiguration configuration) - { - StoragePath = configuration.Settings.StoragePath; - StartTimeFormat = configuration.Settings.StartTimeFormat; - Filename = configuration.Settings.Filename; - // - Source = configuration.DataCollection.Source; - LogisticsEquipmentAlias = configuration.DataCollection.Logistics.EquipmentAlias; - //if (LogisticsEquipmentAlias == "R47-PLC") - //{ } - foreach (PDSFConfigurationDataCollectionLogisticsAttribute item in (from l in configuration.DataCollection.Logistics.Attributes orderby l.Use descending, l.Order select l)) - LogisticsAttributes.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.Key, item.Placeholder }); - foreach (PDSFConfigurationDataCollectionLogisticsColumn item in configuration.DataCollection.Logistics.Columns) - LogisticsColumns.Add(new string[] { item.ID.ToString(), item.Prefix }); - foreach (PDSFConfigurationDataCollectionParameter1 item in (from l in configuration.DataCollection.VirtualParameters orderby l.Use descending, l.Order select l)) + if (string.IsNullOrEmpty(item.Alias) && !string.IsNullOrEmpty(item.Conditions.ConditionModel.Name)) { - if (string.IsNullOrEmpty(item.Alias) && !string.IsNullOrEmpty(item.Conditions.ConditionModel.Name)) - { - if (item.Use) - Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); - else - Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, string.Empty, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); - } + if (item.Use) + Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); else - { - if (item.Use) - Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); - else - Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, string.Empty, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); - } + Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, string.Empty, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); } - foreach (PDSFConfigurationDataCollectionParameter item in (from l in configuration.DataCollection.Parameters orderby l.Use descending, l.Order select l)) + else { - if (string.IsNullOrEmpty(item?.Alias) && !string.IsNullOrEmpty(item?.Conditions?.ConditionModel?.Name)) - { - if (item.Use) - Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); - else - Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, string.Empty, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); - } + if (item.Use) + Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); else - { - if (item.Use) - Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); - else - Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, string.Empty, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); - } - } - Parameters = (from l in Parameters orderby l[0] descending, l[1] select l).ToList(); - StringBuilder text = new StringBuilder(); - //text.AppendLine("\"AliasName\";\"Condition\";\"EventId\";\"ExceptionId\";\"Formula\";\"HardwareId\";\"OrderId\";\"ParameterName\";\"Remark\";\"ReportName\";\"SourceId\";\"Use\""); - //"Test";"";"";"";"";"";"1";"MICROSCOPE01/MET08MESMICROSCOPE/Test";"";"MICROSCOPE01/MET08MESMICROSCOPE/FileRead";"";"True"" - text.AppendLine("\"Use\";\"OrderId\";\"ReportName\";\"ParameterName\";\"AliasName\";\"HardwareId\";\"Remark\";\"Formula\""); - foreach (string[] item in Parameters) - { - for (int i = 0; i < 7; i++) - text.Append("\"").Append(item[i]).Append("\";"); - text.Remove(text.Length - 1, 1); - text.AppendLine(); - } - ParametersAsCsv = text.ToString(); - foreach (PDSFConfigurationDataCollectionGeneralTriggers item in configuration.DataCollection.GeneralTriggers) - { - foreach (PDSFConfigurationDataCollectionGeneralTriggersVariableModel gv in item.GlobalVariables) - GeneralTriggers.Add(new string[] { item.Name, gv.Name, gv.ParameterName, gv.Formula }); - } - { - PDSFConfigurationDataCollectionStartTriggersDCP item = configuration.DataCollection.StartTriggers.DCP; - if (!(item is null)) - StartTriggersDCP.Add(new string[] { item.Name, item.Rule, item.ResolveGlobalVariableBeforeTrigger.ToString() }); - } - if (!(configuration.DataCollection.Logistics.Triggers.UpdateTrigger is null)) - { - foreach (PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequest item in configuration.DataCollection.Logistics.Triggers.UpdateTrigger.LogisticRequest) - { - LogisticsTriggers.Add(new string[] { item.Name.ToString(), item.LogisticsColumn.Fixed.ToString(), item.Rule, item.Keys.Scenario, item.Keys.DefaultJobIndex.ToString(), item.Keys.DefaultCarrierIndex.ToString(), item.Keys.DefaultSlotIndex.ToString(), item.DataPool.ToString() }); - if (!(item.Keys.KeyMapping is null)) - LogisticsTriggersKeysKeyMapping.Add(item.Name, new string[] { item.Keys.KeyMapping.KeyName, item.Keys.KeyMapping.ParameterName, item.Keys.KeyMapping.Formula }); - LogisticsTriggersCallDefinitionAttributes.Add(item.Name, new List()); - foreach (PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttribute att in item.CallDefinition.Attributes) - LogisticsTriggersCallDefinitionAttributes[item.Name].Add(new string[] { att.LogisticsKey, att.Source, att.MappedParameterName, att.Formula }); - } - } - { - PDSFConfigurationDataCollectionStopTriggersDCP item = configuration.DataCollection.StopTriggers.DCP; - if (!(item is null)) - StopTriggersDCP.Add(new string[] { item.Name, item.Rule, item.ResolveGlobalVariableBeforeTrigger.ToString(), item.ResetGlobalVariablesAfterTrigger.ToString() }); + Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, string.Empty, true.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); } } - + foreach (PDSFConfigurationDataCollectionParameter item in (from l in configuration.DataCollection.Parameters orderby l.Use descending, l.Order select l)) + { + if (string.IsNullOrEmpty(item?.Alias) && !string.IsNullOrEmpty(item?.Conditions?.ConditionModel?.Name)) + { + if (item.Use) + Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); + else + Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Conditions.ConditionModel.Name, item.HardWareId, item.Description, string.Empty, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); + } + else + { + if (item is null) + continue; + if (item.Use) + Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, item.Conditions.ConditionModel.Formula, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); + else + Parameters.Add(new string[] { item.Use.ToString(), item.Order.ToString("000"), item.FullName, item.Alias, item.HardWareId, item.Description, string.Empty, false.ToString(), (configuration.DataCollection.Logistics.Columns.Length + 1 + item.Order).ToString("000") }); + } + } + Parameters = (from l in Parameters orderby l[0] descending, l[1] select l).ToList(); + StringBuilder text = new(); + //text.AppendLine("\"AliasName\";\"Condition\";\"EventId\";\"ExceptionId\";\"Formula\";\"HardwareId\";\"OrderId\";\"ParameterName\";\"Remark\";\"ReportName\";\"SourceId\";\"Use\""); + //"Test";"";"";"";"";"";"1";"MICROSCOPE01/MET08MESMICROSCOPE/Test";"";"MICROSCOPE01/MET08MESMICROSCOPE/FileRead";"";"True"" + _ = text.AppendLine("\"Use\";\"OrderId\";\"ReportName\";\"ParameterName\";\"AliasName\";\"HardwareId\";\"Remark\";\"Formula\""); + foreach (string[] item in Parameters) + { + for (int i = 0; i < 7; i++) + _ = text.Append('"').Append(item[i]).Append("\";"); + _ = text.Remove(text.Length - 1, 1); + _ = text.AppendLine(); + } + ParametersAsCsv = text.ToString(); + foreach (PDSFConfigurationDataCollectionGeneralTriggers item in configuration.DataCollection.GeneralTriggers) + { + foreach (PDSFConfigurationDataCollectionGeneralTriggersVariableModel gv in item.GlobalVariables) + GeneralTriggers.Add(new string[] { item.Name, gv.Name, gv.ParameterName, gv.Formula }); + } + { + PDSFConfigurationDataCollectionStartTriggersDCP item = configuration.DataCollection.StartTriggers.DCP; + if (item is not null) + StartTriggersDCP.Add(new string[] { item.Name, item.Rule, item.ResolveGlobalVariableBeforeTrigger.ToString() }); + } + if (configuration.DataCollection.Logistics.Triggers.UpdateTrigger is not null) + { + foreach (PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequest item in configuration.DataCollection.Logistics.Triggers.UpdateTrigger.LogisticRequest) + { + LogisticsTriggers.Add(new string?[] { item.Name.ToString(), item.LogisticsColumn.Fixed.ToString(), item.Rule, item.Keys.Scenario, item.Keys.DefaultJobIndex.ToString(), item.Keys.DefaultCarrierIndex.ToString(), item.Keys.DefaultSlotIndex.ToString(), item.DataPool.ToString() }); + if (item.Keys.KeyMapping is not null) + LogisticsTriggersKeysKeyMapping.Add(item.Name, new string[] { item.Keys.KeyMapping.KeyName, item.Keys.KeyMapping.ParameterName, item.Keys.KeyMapping.Formula }); + LogisticsTriggersCallDefinitionAttributes.Add(item.Name, new()); + foreach (PDSFConfigurationDataCollectionLogisticsTriggersUpdateTriggerLogisticRequestCallDefinitionLogisticCallDefinitionAttribute att in item.CallDefinition.Attributes) + LogisticsTriggersCallDefinitionAttributes[item.Name].Add(new string[] { att.LogisticsKey, att.Source, att.MappedParameterName, att.Formula }); + } + } + { + PDSFConfigurationDataCollectionStopTriggersDCP item = configuration.DataCollection.StopTriggers.DCP; + if (item is not null) + StopTriggersDCP.Add(new string[] { item.Name, item.Rule, item.ResolveGlobalVariableBeforeTrigger.ToString(), item.ResetGlobalVariablesAfterTrigger.ToString() }); + } } } \ No newline at end of file diff --git a/EDA Viewer/Singleton/Helper/ModuleInstanceTypeName.cs b/EDA Viewer/Singleton/Helper/ModuleInstanceTypeName.cs index 4294df8..109b58c 100644 --- a/EDA Viewer/Singleton/Helper/ModuleInstanceTypeName.cs +++ b/EDA Viewer/Singleton/Helper/ModuleInstanceTypeName.cs @@ -1,8 +1,6 @@ -namespace EDAViewer.Singleton.Helper -{ - public enum ModuleInstanceTypeName - { - Pdsf - } +namespace EDAViewer.Singleton.Helper; +public enum ModuleInstanceTypeName +{ + Pdsf } \ No newline at end of file diff --git a/EDA Viewer/Singleton/IBackground.cs b/EDA Viewer/Singleton/IBackground.cs deleted file mode 100644 index b9bcaac..0000000 --- a/EDA Viewer/Singleton/IBackground.cs +++ /dev/null @@ -1,28 +0,0 @@ -using EDAViewer.Models; -using Microsoft.Extensions.Logging; -using Shared; -using System; -using System.Collections.Generic; -using System.Net; - -namespace EDAViewer.Singleton -{ - - public interface IBackground : Models.IBackground, IDisposable - { - - void ClearMessage(); - void SendStatusOk(); - string Message { get; } - bool IsPrimaryInstance(); - void SetIsPrimaryInstance(); - void ClearIsPrimaryInstance(); - string WorkingDirectory { get; } - List Exceptions { get; } - void Update(ILogger logger); - string GetCountDirectory(string verb); - void LogPathCleanUpByWeek(string server, bool isEDA = false, bool isNA = false); - - } - -} \ No newline at end of file diff --git a/EDA Viewer/Startup.cs b/EDA Viewer/Startup.cs deleted file mode 100644 index 17685d5..0000000 --- a/EDA Viewer/Startup.cs +++ /dev/null @@ -1,156 +0,0 @@ -using EDAViewer.HostedService; -using EDAViewer.Models; -using EDAViewer.Singleton; -using Helper.Log; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Configuration.Json; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.FileProviders; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Microsoft.OpenApi.Models; -using Shared; -using System; -using System.IO; -using System.Net; -using System.Reflection; - -namespace EDAViewer -{ - - public class Startup - { - - private Background _Background; - private AppSettings _AppSettings; - private readonly IsEnvironment _IsEnvironment; - private readonly IConfiguration _Configuration; - private readonly IWebHostEnvironment _WebHostEnvironment; - - public Startup(IConfiguration configuration, IWebHostEnvironment webHostEnvironment) - { - _Configuration = configuration; - _WebHostEnvironment = webHostEnvironment; - _IsEnvironment = new IsEnvironment(webHostEnvironment.IsDevelopment(), webHostEnvironment.IsStaging(), webHostEnvironment.IsProduction()); - } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - LogLevel defaultLogLevel; - LogLevel log4netLogLevel; - IConfigurationSection configurationSection; - configurationSection = _Configuration.GetSection("Logging:LogLevel:Default"); - if (configurationSection is null || configurationSection.Value is null) - defaultLogLevel = LogLevel.Debug; - else if (!Enum.TryParse(configurationSection.Value, out defaultLogLevel)) - defaultLogLevel = LogLevel.Debug; - configurationSection = _Configuration.GetSection("Logging:LogLevel:Log4netProvider"); - if (configurationSection is null || configurationSection.Value is null) - log4netLogLevel = defaultLogLevel; - else if (!Enum.TryParse(configurationSection.Value, out log4netLogLevel)) - log4netLogLevel = defaultLogLevel; - _AppSettings = _Configuration.Get(); - if (!_IsEnvironment.Production) - _AppSettings.Server = _AppSettings.Server.Replace('.', '_'); - if (string.IsNullOrEmpty(_AppSettings.WorkingDirectoryName)) - throw new Exception("Working directory name must have a value!"); - Assembly assembly = Assembly.GetExecutingAssembly(); - string workingDirectory = Log.GetWorkingDirectory(assembly.GetName().Name, _AppSettings.WorkingDirectoryName); - services.AddLogging(logging => - { - logging.AddProvider(new DebugProvider(defaultLogLevel)); - logging.AddProvider(new ConsoleProvider(defaultLogLevel)); - logging.AddProvider(new Log4netProvider(typeof(Startup), log4netLogLevel, workingDirectory)); - }); - - services.AddDirectoryBrowser(); - services.AddControllersWithViews().AddRazorRuntimeCompilation(); - services.AddServerSideBlazor(); - - // services.AddSingleton(); - // services.AddSingleton(); - - _Background = new Background(_IsEnvironment, _AppSettings, workingDirectory); - services.AddSingleton(b => _Background); - services.AddSingleton(appSettings => _AppSettings); - services.AddSingleton(isEnvironment => _IsEnvironment); - services.AddHostedService(t => new TimedHostedService(_IsEnvironment, _Background, t.GetRequiredService())); - - services.AddSwaggerGen(c => - { - c.SwaggerDoc("v1", new OpenApiInfo { Title = "EDAViewer", Version = "v1" }); - }); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime) - { - if (env.IsDevelopment()) - { - if (string.IsNullOrEmpty(_AppSettings.URLs)) - { - Environment.ExitCode = -1; - lifetime.StopApplication(); - } - - app.UseDeveloperExceptionPage(); - - app.UseSwagger(c => - { - c.SerializeAsV2 = true; - }); - - app.UseSwaggerUI(c => - { - c.SwaggerEndpoint("/swagger/v1/swagger.json", "EDA Viewer API V1"); - c.RoutePrefix = string.Empty; - }); - } - else - { - app.UseExceptionHandler("/Home/Error"); - // The default HSTS value is 30 days. - // You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); - - app.UseSwagger(c => - { - c.SerializeAsV2 = true; - }); - - app.UseSwaggerUI(c => - { - c.SwaggerEndpoint("/EDAViewer/swagger/v1/swagger.json", "EDA Viewer API V1"); - c.RoutePrefix = string.Empty; - }); - } - - app.UseDirectoryBrowser(new DirectoryBrowserOptions - { - FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath, "images")), - RequestPath = "/MyImages" - }); - - app.UseHttpsRedirection(); - app.UseStaticFiles(); - - app.UseRouting(); - - app.UseAuthorization(); - - app.UseEndpoints(endpoints => - { - //endpoints.MapBlazorHub(); - endpoints.MapControllerRoute( - name: "default", - pattern: "{controller=Home}/{action=Index}/{id?}"); - }); - } - - } - -} \ No newline at end of file diff --git a/EDA Viewer/Views/Home/Background.cshtml b/EDA Viewer/Views/Home/Background.cshtml deleted file mode 100644 index 37cea16..0000000 --- a/EDA Viewer/Views/Home/Background.cshtml +++ /dev/null @@ -1,47 +0,0 @@ -@using EDAViewer.Controllers -@{ - ViewBag.Title = "Background"; - int i = 0; - string homeController = nameof(HomeController).Replace("Controller", string.Empty); -} - -
-

EDA - @(ViewBag.IsPrimaryInstance) - @(ViewBag.Profile) - @(ViewBag.URLs) - 013

-

@(ViewBag.WorkingDirectory)

-

@(ViewBag.Message)

-

@(ViewBag.ExceptionsCount)

-
- -

 

-
-
-
- @foreach (Exception exception in ViewBag.Exceptions) - { -

- @Html.Raw(string.Concat("")); -

-

- @Html.Raw(string.Concat("")); -

-
- @(i += 1); - } -
-
-@section scripts { - -} diff --git a/EDA Viewer/Views/Home/Index.cshtml b/EDA Viewer/Views/Home/Index.cshtml deleted file mode 100644 index 8b82f86..0000000 --- a/EDA Viewer/Views/Home/Index.cshtml +++ /dev/null @@ -1,12 +0,0 @@ -@{ - ViewData["Title"] = "Home Page"; -} - -
-

Welcome

-

Learn about building Web apps with ASP.NET Core.

-
- -
- -
diff --git a/EDA Viewer/Views/Home/Privacy.cshtml b/EDA Viewer/Views/Home/Privacy.cshtml deleted file mode 100644 index d01477f..0000000 --- a/EDA Viewer/Views/Home/Privacy.cshtml +++ /dev/null @@ -1,6 +0,0 @@ -@{ - ViewData["Title"] = "Privacy Policy"; -} -

@ViewData["Title"]

- -

Use this page to detail your site's privacy policy.

diff --git a/EDA Viewer/Views/Home/ViewEdaHtmlDiff.cshtml b/EDA Viewer/Views/Home/ViewEdaHtmlDiff.cshtml deleted file mode 100644 index ae8e4fc..0000000 --- a/EDA Viewer/Views/Home/ViewEdaHtmlDiff.cshtml +++ /dev/null @@ -1,182 +0,0 @@ -@model EDAViewer.Models.EdaHtmlDiff -@{ - ViewBag.Title = "EDA HTML Diff"; - string idForm = "Form"; - string idSubmit = "Submit"; - string idUp = "Up"; - string idRoot = "Root"; - string idRefresh = "Refresh"; - string background = "Background"; //Background - string viewEdaHtmlDiff = "ViewEdaHtmlDiff"; //ViewEdaHtmlDiff - string actionNameForForm = nameof(EDAViewer.Controllers.HomeController.ViewEdaHtmlDiff); - string actionNameForList = nameof(EDAViewer.Controllers.HomeController.GetDirectoriesOrFiles); - string homeController = nameof(EDAViewer.Controllers.HomeController).Replace("Controller", string.Empty); -} - -
-

@(ViewBag.Message)

-
-
- @Html.Raw(ViewBag.Diff) -
- @Html.Raw(ViewBag.OldText) -
- @Html.Raw(ViewBag.NewText) -
-
- - - -
- @using (Html.BeginForm(actionNameForForm, homeController, FormMethod.Post, new { id = idForm })) - { - @Html.AntiForgeryToken(); - @Html.ValidationSummary(true); - @Html.HiddenFor(m => m.user_name) - @Html.HiddenFor(m => m.machine_name) - @Html.HiddenFor(m => m.now_ticks) - @Html.HiddenFor(m => m.PathAndFileName) - @Html.HiddenFor(m => m.Paths) -

- @Html.LabelFor(m => m.CurrentPath) - @Html.DropDownListFor(m => m.CurrentPath, new SelectList(Enumerable.Empty()), htmlAttributes: new { style = "min-width:600px" }) - @Html.ValidationMessageFor(m => m.CurrentPath) -

-

- @Html.LabelFor(m => m.FileName) - @Html.TextBoxFor(m => m.FileName, htmlAttributes: new { style = "min-width:600px" }) - @Html.ValidationMessageFor(m => m.FileName) -

-
- - } -
- -@section scripts { - -} diff --git a/EDA Viewer/Views/Shared/Error.cshtml b/EDA Viewer/Views/Shared/Error.cshtml deleted file mode 100644 index 0c47bb0..0000000 --- a/EDA Viewer/Views/Shared/Error.cshtml +++ /dev/null @@ -1,25 +0,0 @@ -@model ErrorViewModel -@{ - ViewData["Title"] = "Error"; -} - -

Error.

-

An error occurred while processing your request.

- -@if (Model.ShowRequestId) -{ -

- Request ID: @Model.RequestId -

-} - -

Development Mode

-

- Swapping to Development environment will display more detailed information about the error that occurred. -

-

- The Development environment shouldn't be enabled for deployed applications. - It can result in displaying sensitive information from exceptions to end users. - For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development - and restarting the app. -

diff --git a/EDA Viewer/Views/Shared/_Layout.cshtml b/EDA Viewer/Views/Shared/_Layout.cshtml deleted file mode 100644 index cde019d..0000000 --- a/EDA Viewer/Views/Shared/_Layout.cshtml +++ /dev/null @@ -1,71 +0,0 @@ -@using EDAViewer.Controllers -@{ - string index = nameof(HomeController.Index); - string privacy = nameof(HomeController.Privacy); - string background = nameof(HomeController.Background); - string homeController = nameof(HomeController).Replace("Controller", string.Empty); - string schemeHostURL = string.Concat(Context.Request.Scheme, "://", Context.Request.Host); -} - - - - - - - - @await RenderSectionAsync("Meta", required: false) - @ViewData["Title"] - EDAViewer - - - - - - - - - - - @await RenderSectionAsync("Style", required: false) - - - - -
- -
-
- @RenderBody() -
-
-
- © 2021 - EDAViewer - Privacy -
-
- - - - - @await RenderSectionAsync("Scripts", required: false) - - diff --git a/EDA Viewer/Views/Shared/_ValidationScriptsPartial.cshtml b/EDA Viewer/Views/Shared/_ValidationScriptsPartial.cshtml deleted file mode 100644 index 7d8dd3e..0000000 --- a/EDA Viewer/Views/Shared/_ValidationScriptsPartial.cshtml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/EDA Viewer/Views/_ViewImports.cshtml b/EDA Viewer/Views/_ViewImports.cshtml deleted file mode 100644 index 58d7504..0000000 --- a/EDA Viewer/Views/_ViewImports.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@using EDAViewer -@using EDAViewer.Models -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/EDA Viewer/Views/_ViewStart.cshtml b/EDA Viewer/Views/_ViewStart.cshtml deleted file mode 100644 index 820a2f6..0000000 --- a/EDA Viewer/Views/_ViewStart.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@{ - Layout = "_Layout"; -} diff --git a/EDA Viewer/appsettings.Development.json b/EDA Viewer/appsettings.Development.json index 3db82c4..e9bb139 100644 --- a/EDA Viewer/appsettings.Development.json +++ b/EDA Viewer/appsettings.Development.json @@ -1,7 +1,136 @@ { + "BuildNumber": "1", "Company": "Infineon Technologies Americas Corp.", + "Drives": [ + { + "Use": false, + "Letter": "a", + "Share": "Floppy Disk", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "c", + "Share": "SYSTEM", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "d", + "Share": "DATA", + "User": "", + "Password": "" + }, + { + "Use": true, + "Letter": "g", + "Share": "\\\\10.95.154.12\\testdata", + "User": "10.95.154.12\\Manager", + "Password": "D6QDJ5g6vjqnNyyRbfbj+g==" + }, + { + "Use": false, + "Letter": "h", + "Share": "\\\\10.95.154.13\\COM 5", + "User": "10.95.154.13\\user", + "Password": "tVyC7uPHtScZR8NLInSaxQ==" + }, + { + "Use": true, + "Letter": "i", + "Share": "\\\\messdv002.na.infineon.com\\Candela", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "j", + "Share": "\\\\messdv002.na.infineon.com\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": true, + "Letter": "k", + "Share": "\\\\messdv002.na.infineon.com\\GaN_NEC\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "l", + "Share": "TFS", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "m", + "Share": "\\\\messdv002.na.infineon.com\\MOCVD", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "n", + "Share": "\\\\10.95.154.22\\C", + "User": "10.95.154.22\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "o", + "Share": "\\\\10.95.154.16\\Aixtron", + "User": "10.95.154.16\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "p", + "Share": "\\\\10.95.154.15\\Aixtron", + "User": "10.95.154.15\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "q", + "Share": "\\\\10.95.154.21\\Data", + "User": "10.95.154.21\\XRD04Admin", + "Password": "v1NOsEOCvbnhzKabspPcCQ==" + }, + { + "Use": true, + "Letter": "r", + "Share": "\\\\10.95.154.23\\Data", + "User": "\"10.95.154.23\\infineon us\"", + "Password": "rzXkXdHKetDfsukhZKW0yA==" + }, + { + "Use": true, + "Letter": "s", + "Share": "\\\\messv02ecc1.ec.local\\EC_EAFRepository", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "t", + "Share": "\\\\messv02ecc1.ec.local\\EC_EDA", + "User": "EC\\ECEDASvc", + "Password": "IKsJmRVUH3xlv+RRELRbwoXYKwLvF4Re7k1Rigzpwf4=" + }, + { + "Use": false, + "Letter": "z", + "Share": "DVD Drive", + "User": "", + "Password": "" + } + ], "ECEDADatabasePassword": "8vIs2nEZPkcdBUfXX0hHlA==", - "EncryptedPassword": "K1RyLhaIRyJTDbWutsuWWEiO2hTD3h7fW0BV/Cp+Ftw=", + "GitCommitSeven": "1234567", "Logging": { "LogLevel": { "Default": "Debug", @@ -12,8 +141,44 @@ }, "IFXEDADatabasePassword": "8vIs2nEZPkcdBUfXX0hHlA==", "MonARessource": "EDA_Viewer_IFX", + "Serilog": { + "Using": [ + "Serilog.Sinks.Console", + "Serilog.Sinks.File" + ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "Debug", + "Args": { + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" + } + }, + { + "Name": "Console", + "Args": { + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "%workingDirectory% - Log/log-.txt", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}", + "rollingInterval": "Hour" + } + } + ], + "Enrich": [ + "FromLogContext", + "WithMachineName", + "WithThreadId" + ], + "Properties": { + "Application": "Sample" + } + }, "Server": "messv02ecc1_ec_local", - "ServiceUser": "mesedasvc", - "URLs": "http://localhost:5000;", + "URLs": "http://localhost:5001;", "WorkingDirectoryName": "IFXApps" } diff --git a/EDA Viewer/appsettings.Staging.json b/EDA Viewer/appsettings.Staging.json index ded3e66..15aa3ca 100644 --- a/EDA Viewer/appsettings.Staging.json +++ b/EDA Viewer/appsettings.Staging.json @@ -1,7 +1,136 @@ { + "BuildNumber": "1", "Company": "Infineon Technologies Americas Corp.", + "Drives": [ + { + "Use": false, + "Letter": "a", + "Share": "Floppy Disk", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "c", + "Share": "SYSTEM", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "d", + "Share": "DATA", + "User": "", + "Password": "" + }, + { + "Use": true, + "Letter": "g", + "Share": "\\\\10.95.154.12\\testdata", + "User": "10.95.154.12\\Manager", + "Password": "D6QDJ5g6vjqnNyyRbfbj+g==" + }, + { + "Use": false, + "Letter": "h", + "Share": "\\\\10.95.154.13\\COM 5", + "User": "10.95.154.13\\user", + "Password": "tVyC7uPHtScZR8NLInSaxQ==" + }, + { + "Use": true, + "Letter": "i", + "Share": "\\\\messdv002.na.infineon.com\\Candela", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "j", + "Share": "\\\\messdv002.na.infineon.com\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": true, + "Letter": "k", + "Share": "\\\\messdv002.na.infineon.com\\GaN_NEC\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "l", + "Share": "TFS", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "m", + "Share": "\\\\messdv002.na.infineon.com\\MOCVD", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "n", + "Share": "\\\\10.95.154.22\\C", + "User": "10.95.154.22\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "o", + "Share": "\\\\10.95.154.16\\Aixtron", + "User": "10.95.154.16\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "p", + "Share": "\\\\10.95.154.15\\Aixtron", + "User": "10.95.154.15\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "q", + "Share": "\\\\10.95.154.21\\Data", + "User": "10.95.154.21\\XRD04Admin", + "Password": "v1NOsEOCvbnhzKabspPcCQ==" + }, + { + "Use": true, + "Letter": "r", + "Share": "\\\\10.95.154.23\\Data", + "User": "\"10.95.154.23\\infineon us\"", + "Password": "rzXkXdHKetDfsukhZKW0yA==" + }, + { + "Use": true, + "Letter": "s", + "Share": "\\\\messv02ecc1.ec.local\\EC_EAFRepository", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "t", + "Share": "\\\\messv02ecc1.ec.local\\EC_EDA", + "User": "EC\\ECEDASvc", + "Password": "IKsJmRVUH3xlv+RRELRbwoXYKwLvF4Re7k1Rigzpwf4=" + }, + { + "Use": false, + "Letter": "z", + "Share": "DVD Drive", + "User": "", + "Password": "" + } + ], "ECEDADatabasePassword": "8vIs2nEZPkcdBUfXX0hHlA==", - "EncryptedPassword": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=", + "GitCommitSeven": "1234567", "Logging": { "LogLevel": { "Default": "Information", @@ -12,8 +141,44 @@ }, "IFXEDADatabasePassword": "8vIs2nEZPkcdBUfXX0hHlA==", "MonARessource": "EDA_Viewer_EC", + "Serilog": { + "Using": [ + "Serilog.Sinks.Console", + "Serilog.Sinks.File" + ], + "MinimumLevel": "Information", + "WriteTo": [ + { + "Name": "Debug", + "Args": { + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" + } + }, + { + "Name": "Console", + "Args": { + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "%workingDirectory% - Log/log-.txt", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}", + "rollingInterval": "Hour" + } + } + ], + "Enrich": [ + "FromLogContext", + "WithMachineName", + "WithThreadId" + ], + "Properties": { + "Application": "Sample" + } + }, "Server": "messv02ecc1.ec.local", - "ServiceUser": "ECMESEAF", - "URLs": "http://localhost:5002;", + "URLs": "http://localhost:5001;", "WorkingDirectoryName": "IFXApps" } \ No newline at end of file diff --git a/EDA Viewer/appsettings.json b/EDA Viewer/appsettings.json index ded3e66..15aa3ca 100644 --- a/EDA Viewer/appsettings.json +++ b/EDA Viewer/appsettings.json @@ -1,7 +1,136 @@ { + "BuildNumber": "1", "Company": "Infineon Technologies Americas Corp.", + "Drives": [ + { + "Use": false, + "Letter": "a", + "Share": "Floppy Disk", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "c", + "Share": "SYSTEM", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "d", + "Share": "DATA", + "User": "", + "Password": "" + }, + { + "Use": true, + "Letter": "g", + "Share": "\\\\10.95.154.12\\testdata", + "User": "10.95.154.12\\Manager", + "Password": "D6QDJ5g6vjqnNyyRbfbj+g==" + }, + { + "Use": false, + "Letter": "h", + "Share": "\\\\10.95.154.13\\COM 5", + "User": "10.95.154.13\\user", + "Password": "tVyC7uPHtScZR8NLInSaxQ==" + }, + { + "Use": true, + "Letter": "i", + "Share": "\\\\messdv002.na.infineon.com\\Candela", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "j", + "Share": "\\\\messdv002.na.infineon.com\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": true, + "Letter": "k", + "Share": "\\\\messdv002.na.infineon.com\\GaN_NEC\\Characterization", + "User": "INFINEON\\MESGaNEAF", + "Password": "tLIPgqM6R9hVQOteRnTHwPqIg3Zxv8CohTjFkjkFz8k=" + }, + { + "Use": false, + "Letter": "l", + "Share": "TFS", + "User": "", + "Password": "" + }, + { + "Use": false, + "Letter": "m", + "Share": "\\\\messdv002.na.infineon.com\\MOCVD", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "n", + "Share": "\\\\10.95.154.22\\C", + "User": "10.95.154.22\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "o", + "Share": "\\\\10.95.154.16\\Aixtron", + "User": "10.95.154.16\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "p", + "Share": "\\\\10.95.154.15\\Aixtron", + "User": "10.95.154.15\\Aixtron", + "Password": "DYVBOr2HJdB7KOhd/IFhLA==" + }, + { + "Use": true, + "Letter": "q", + "Share": "\\\\10.95.154.21\\Data", + "User": "10.95.154.21\\XRD04Admin", + "Password": "v1NOsEOCvbnhzKabspPcCQ==" + }, + { + "Use": true, + "Letter": "r", + "Share": "\\\\10.95.154.23\\Data", + "User": "\"10.95.154.23\\infineon us\"", + "Password": "rzXkXdHKetDfsukhZKW0yA==" + }, + { + "Use": true, + "Letter": "s", + "Share": "\\\\messv02ecc1.ec.local\\EC_EAFRepository", + "User": "EC\\ECMESEAF", + "Password": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=" + }, + { + "Use": true, + "Letter": "t", + "Share": "\\\\messv02ecc1.ec.local\\EC_EDA", + "User": "EC\\ECEDASvc", + "Password": "IKsJmRVUH3xlv+RRELRbwoXYKwLvF4Re7k1Rigzpwf4=" + }, + { + "Use": false, + "Letter": "z", + "Share": "DVD Drive", + "User": "", + "Password": "" + } + ], "ECEDADatabasePassword": "8vIs2nEZPkcdBUfXX0hHlA==", - "EncryptedPassword": "CUGygiPwahy4U3j+6KqqoMZ08STyVDR1rKm6MwPpt00=", + "GitCommitSeven": "1234567", "Logging": { "LogLevel": { "Default": "Information", @@ -12,8 +141,44 @@ }, "IFXEDADatabasePassword": "8vIs2nEZPkcdBUfXX0hHlA==", "MonARessource": "EDA_Viewer_EC", + "Serilog": { + "Using": [ + "Serilog.Sinks.Console", + "Serilog.Sinks.File" + ], + "MinimumLevel": "Information", + "WriteTo": [ + { + "Name": "Debug", + "Args": { + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" + } + }, + { + "Name": "Console", + "Args": { + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "%workingDirectory% - Log/log-.txt", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}", + "rollingInterval": "Hour" + } + } + ], + "Enrich": [ + "FromLogContext", + "WithMachineName", + "WithThreadId" + ], + "Properties": { + "Application": "Sample" + } + }, "Server": "messv02ecc1.ec.local", - "ServiceUser": "ECMESEAF", - "URLs": "http://localhost:5002;", + "URLs": "http://localhost:5001;", "WorkingDirectoryName": "IFXApps" } \ No newline at end of file diff --git a/EDA Viewer/wwwroot/css/app.css b/EDA Viewer/wwwroot/css/app.css new file mode 100644 index 0000000..67bc19b --- /dev/null +++ b/EDA Viewer/wwwroot/css/app.css @@ -0,0 +1,68 @@ +@import url("open-iconic/font/css/open-iconic-bootstrap.min.css"); + +html, +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, +.btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type="checkbox"]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) + no-repeat 1rem/1.8rem, + #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + +.blazor-error-boundary::after { + content: "An error has occurred."; +} diff --git a/EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css b/EDA Viewer/wwwroot/css/bootstrap/bootstrap.min.css similarity index 100% rename from EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css rename to EDA Viewer/wwwroot/css/bootstrap/bootstrap.min.css diff --git a/EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map b/EDA Viewer/wwwroot/css/bootstrap/bootstrap.min.css.map similarity index 100% rename from EDA Viewer/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map rename to EDA Viewer/wwwroot/css/bootstrap/bootstrap.min.css.map diff --git a/EDA Viewer/wwwroot/css/bundles/css.css b/EDA Viewer/wwwroot/css/bundles/css.css deleted file mode 100644 index 2fd73fd..0000000 --- a/EDA Viewer/wwwroot/css/bundles/css.css +++ /dev/null @@ -1 +0,0 @@ -html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"*"}.glyphicon-plus:before{content:"+"}.glyphicon-eur:before,.glyphicon-euro:before{content:"€"}.glyphicon-minus:before{content:"−"}.glyphicon-cloud:before{content:"☁"}.glyphicon-envelope:before{content:"✉"}.glyphicon-pencil:before{content:"✏"}.glyphicon-glass:before{content:""}.glyphicon-music:before{content:""}.glyphicon-search:before{content:""}.glyphicon-heart:before{content:""}.glyphicon-star:before{content:""}.glyphicon-star-empty:before{content:""}.glyphicon-user:before{content:""}.glyphicon-film:before{content:""}.glyphicon-th-large:before{content:""}.glyphicon-th:before{content:""}.glyphicon-th-list:before{content:""}.glyphicon-ok:before{content:""}.glyphicon-remove:before{content:""}.glyphicon-zoom-in:before{content:""}.glyphicon-zoom-out:before{content:""}.glyphicon-off:before{content:""}.glyphicon-signal:before{content:""}.glyphicon-cog:before{content:""}.glyphicon-trash:before{content:""}.glyphicon-home:before{content:""}.glyphicon-file:before{content:""}.glyphicon-time:before{content:""}.glyphicon-road:before{content:""}.glyphicon-download-alt:before{content:""}.glyphicon-download:before{content:""}.glyphicon-upload:before{content:""}.glyphicon-inbox:before{content:""}.glyphicon-play-circle:before{content:""}.glyphicon-repeat:before{content:""}.glyphicon-refresh:before{content:""}.glyphicon-list-alt:before{content:""}.glyphicon-lock:before{content:""}.glyphicon-flag:before{content:""}.glyphicon-headphones:before{content:""}.glyphicon-volume-off:before{content:""}.glyphicon-volume-down:before{content:""}.glyphicon-volume-up:before{content:""}.glyphicon-qrcode:before{content:""}.glyphicon-barcode:before{content:""}.glyphicon-tag:before{content:""}.glyphicon-tags:before{content:""}.glyphicon-book:before{content:""}.glyphicon-bookmark:before{content:""}.glyphicon-print:before{content:""}.glyphicon-camera:before{content:""}.glyphicon-font:before{content:""}.glyphicon-bold:before{content:""}.glyphicon-italic:before{content:""}.glyphicon-text-height:before{content:""}.glyphicon-text-width:before{content:""}.glyphicon-align-left:before{content:""}.glyphicon-align-center:before{content:""}.glyphicon-align-right:before{content:""}.glyphicon-align-justify:before{content:""}.glyphicon-list:before{content:""}.glyphicon-indent-left:before{content:""}.glyphicon-indent-right:before{content:""}.glyphicon-facetime-video:before{content:""}.glyphicon-picture:before{content:""}.glyphicon-map-marker:before{content:""}.glyphicon-adjust:before{content:""}.glyphicon-tint:before{content:""}.glyphicon-edit:before{content:""}.glyphicon-share:before{content:""}.glyphicon-check:before{content:""}.glyphicon-move:before{content:""}.glyphicon-step-backward:before{content:""}.glyphicon-fast-backward:before{content:""}.glyphicon-backward:before{content:""}.glyphicon-play:before{content:""}.glyphicon-pause:before{content:""}.glyphicon-stop:before{content:""}.glyphicon-forward:before{content:""}.glyphicon-fast-forward:before{content:""}.glyphicon-step-forward:before{content:""}.glyphicon-eject:before{content:""}.glyphicon-chevron-left:before{content:""}.glyphicon-chevron-right:before{content:""}.glyphicon-plus-sign:before{content:""}.glyphicon-minus-sign:before{content:""}.glyphicon-remove-sign:before{content:""}.glyphicon-ok-sign:before{content:""}.glyphicon-question-sign:before{content:""}.glyphicon-info-sign:before{content:""}.glyphicon-screenshot:before{content:""}.glyphicon-remove-circle:before{content:""}.glyphicon-ok-circle:before{content:""}.glyphicon-ban-circle:before{content:""}.glyphicon-arrow-left:before{content:""}.glyphicon-arrow-right:before{content:""}.glyphicon-arrow-up:before{content:""}.glyphicon-arrow-down:before{content:""}.glyphicon-share-alt:before{content:""}.glyphicon-resize-full:before{content:""}.glyphicon-resize-small:before{content:""}.glyphicon-exclamation-sign:before{content:""}.glyphicon-gift:before{content:""}.glyphicon-leaf:before{content:""}.glyphicon-fire:before{content:""}.glyphicon-eye-open:before{content:""}.glyphicon-eye-close:before{content:""}.glyphicon-warning-sign:before{content:""}.glyphicon-plane:before{content:""}.glyphicon-calendar:before{content:""}.glyphicon-random:before{content:""}.glyphicon-comment:before{content:""}.glyphicon-magnet:before{content:""}.glyphicon-chevron-up:before{content:""}.glyphicon-chevron-down:before{content:""}.glyphicon-retweet:before{content:""}.glyphicon-shopping-cart:before{content:""}.glyphicon-folder-close:before{content:""}.glyphicon-folder-open:before{content:""}.glyphicon-resize-vertical:before{content:""}.glyphicon-resize-horizontal:before{content:""}.glyphicon-hdd:before{content:""}.glyphicon-bullhorn:before{content:""}.glyphicon-bell:before{content:""}.glyphicon-certificate:before{content:""}.glyphicon-thumbs-up:before{content:""}.glyphicon-thumbs-down:before{content:""}.glyphicon-hand-right:before{content:""}.glyphicon-hand-left:before{content:""}.glyphicon-hand-up:before{content:""}.glyphicon-hand-down:before{content:""}.glyphicon-circle-arrow-right:before{content:""}.glyphicon-circle-arrow-left:before{content:""}.glyphicon-circle-arrow-up:before{content:""}.glyphicon-circle-arrow-down:before{content:""}.glyphicon-globe:before{content:""}.glyphicon-wrench:before{content:""}.glyphicon-tasks:before{content:""}.glyphicon-filter:before{content:""}.glyphicon-briefcase:before{content:""}.glyphicon-fullscreen:before{content:""}.glyphicon-dashboard:before{content:""}.glyphicon-paperclip:before{content:""}.glyphicon-heart-empty:before{content:""}.glyphicon-link:before{content:""}.glyphicon-phone:before{content:""}.glyphicon-pushpin:before{content:""}.glyphicon-usd:before{content:""}.glyphicon-gbp:before{content:""}.glyphicon-sort:before{content:""}.glyphicon-sort-by-alphabet:before{content:""}.glyphicon-sort-by-alphabet-alt:before{content:""}.glyphicon-sort-by-order:before{content:""}.glyphicon-sort-by-order-alt:before{content:""}.glyphicon-sort-by-attributes:before{content:""}.glyphicon-sort-by-attributes-alt:before{content:""}.glyphicon-unchecked:before{content:""}.glyphicon-expand:before{content:""}.glyphicon-collapse-down:before{content:""}.glyphicon-collapse-up:before{content:""}.glyphicon-log-in:before{content:""}.glyphicon-flash:before{content:""}.glyphicon-log-out:before{content:""}.glyphicon-new-window:before{content:""}.glyphicon-record:before{content:""}.glyphicon-save:before{content:""}.glyphicon-open:before{content:""}.glyphicon-saved:before{content:""}.glyphicon-import:before{content:""}.glyphicon-export:before{content:""}.glyphicon-send:before{content:""}.glyphicon-floppy-disk:before{content:""}.glyphicon-floppy-saved:before{content:""}.glyphicon-floppy-remove:before{content:""}.glyphicon-floppy-save:before{content:""}.glyphicon-floppy-open:before{content:""}.glyphicon-credit-card:before{content:""}.glyphicon-transfer:before{content:""}.glyphicon-cutlery:before{content:""}.glyphicon-header:before{content:""}.glyphicon-compressed:before{content:""}.glyphicon-earphone:before{content:""}.glyphicon-phone-alt:before{content:""}.glyphicon-tower:before{content:""}.glyphicon-stats:before{content:""}.glyphicon-sd-video:before{content:""}.glyphicon-hd-video:before{content:""}.glyphicon-subtitles:before{content:""}.glyphicon-sound-stereo:before{content:""}.glyphicon-sound-dolby:before{content:""}.glyphicon-sound-5-1:before{content:""}.glyphicon-sound-6-1:before{content:""}.glyphicon-sound-7-1:before{content:""}.glyphicon-copyright-mark:before{content:""}.glyphicon-registration-mark:before{content:""}.glyphicon-cloud-download:before{content:""}.glyphicon-cloud-upload:before{content:""}.glyphicon-tree-conifer:before{content:""}.glyphicon-tree-deciduous:before{content:""}.glyphicon-cd:before{content:""}.glyphicon-save-file:before{content:""}.glyphicon-open-file:before{content:""}.glyphicon-level-up:before{content:""}.glyphicon-copy:before{content:""}.glyphicon-paste:before{content:""}.glyphicon-alert:before{content:""}.glyphicon-equalizer:before{content:""}.glyphicon-king:before{content:""}.glyphicon-queen:before{content:""}.glyphicon-pawn:before{content:""}.glyphicon-bishop:before{content:""}.glyphicon-knight:before{content:""}.glyphicon-baby-formula:before{content:""}.glyphicon-tent:before{content:"⛺"}.glyphicon-blackboard:before{content:""}.glyphicon-bed:before{content:""}.glyphicon-apple:before{content:""}.glyphicon-erase:before{content:""}.glyphicon-hourglass:before{content:"⌛"}.glyphicon-lamp:before{content:""}.glyphicon-duplicate:before{content:""}.glyphicon-piggy-bank:before{content:""}.glyphicon-scissors:before{content:""}.glyphicon-bitcoin:before{content:""}.glyphicon-btc:before{content:""}.glyphicon-xbt:before{content:""}.glyphicon-yen:before{content:"¥"}.glyphicon-jpy:before{content:"¥"}.glyphicon-ruble:before{content:"₽"}.glyphicon-rub:before{content:"₽"}.glyphicon-scale:before{content:""}.glyphicon-ice-lolly:before{content:""}.glyphicon-ice-lolly-tasted:before{content:""}.glyphicon-education:before{content:""}.glyphicon-option-horizontal:before{content:""}.glyphicon-option-vertical:before{content:""}.glyphicon-menu-hamburger:before{content:""}.glyphicon-modal-window:before{content:""}.glyphicon-oil:before{content:""}.glyphicon-grain:before{content:""}.glyphicon-sunglasses:before{content:""}.glyphicon-text-size:before{content:""}.glyphicon-text-color:before{content:""}.glyphicon-text-background:before{content:""}.glyphicon-object-align-top:before{content:""}.glyphicon-object-align-bottom:before{content:""}.glyphicon-object-align-horizontal:before{content:""}.glyphicon-object-align-left:before{content:""}.glyphicon-object-align-vertical:before{content:""}.glyphicon-object-align-right:before{content:""}.glyphicon-triangle-right:before{content:""}.glyphicon-triangle-left:before{content:""}.glyphicon-triangle-bottom:before{content:""}.glyphicon-triangle-top:before{content:""}.glyphicon-console:before{content:""}.glyphicon-superscript:before{content:""}.glyphicon-subscript:before{content:""}.glyphicon-menu-left:before{content:""}.glyphicon-menu-right:before{content:""}.glyphicon-menu-down:before{content:""}.glyphicon-menu-up:before{content:""}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'— '}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:' —'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media(min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media(min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media(min-width:768px){.navbar{border-radius:4px}}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media(max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media(min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/ "}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media(min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'‹'}.carousel-control .icon-next:before{content:'›'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media(max-width:767px){.visible-xs-block{display:block!important}}@media(max-width:767px){.visible-xs-inline{display:inline!important}}@media(max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media(min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media(min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media(min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media(min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media(min-width:1200px){.visible-lg-block{display:block!important}}@media(min-width:1200px){.visible-lg-inline{display:inline!important}}@media(min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media(max-width:767px){.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}body{padding-top:50px;padding-bottom:20px}.body-content{padding-left:15px;padding-right:15px}.dl-horizontal dt{white-space:normal}input,select,textarea{max-width:280px}th,td{padding:10px}ins{background-color:#cfc;text-decoration:inherit}del{color:#999;background-color:#fec8c8}.mod{background-color:#ffe1ac}tr.mod{background-color:#faf3e6}tr.head{background-color:#b8b6b4} \ No newline at end of file diff --git a/EDA Viewer/wwwroot/css/open-iconic/FONT-LICENSE b/EDA Viewer/wwwroot/css/open-iconic/FONT-LICENSE new file mode 100644 index 0000000..a1dc03f --- /dev/null +++ b/EDA Viewer/wwwroot/css/open-iconic/FONT-LICENSE @@ -0,0 +1,86 @@ +SIL OPEN FONT LICENSE Version 1.1 + +Copyright (c) 2014 Waybury + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/EDA Viewer/wwwroot/lib/jquery-validation/LICENSE.md b/EDA Viewer/wwwroot/css/open-iconic/ICON-LICENSE similarity index 94% rename from EDA Viewer/wwwroot/lib/jquery-validation/LICENSE.md rename to EDA Viewer/wwwroot/css/open-iconic/ICON-LICENSE index dc377cc..2199f4a 100644 --- a/EDA Viewer/wwwroot/lib/jquery-validation/LICENSE.md +++ b/EDA Viewer/wwwroot/css/open-iconic/ICON-LICENSE @@ -1,7 +1,6 @@ The MIT License (MIT) -===================== -Copyright Jörn Zaefferer +Copyright (c) 2014 Waybury Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +THE SOFTWARE. \ No newline at end of file diff --git a/EDA Viewer/wwwroot/css/open-iconic/README.md b/EDA Viewer/wwwroot/css/open-iconic/README.md new file mode 100644 index 0000000..6b810e4 --- /dev/null +++ b/EDA Viewer/wwwroot/css/open-iconic/README.md @@ -0,0 +1,114 @@ +[Open Iconic v1.1.1](http://useiconic.com/open) +=========== + +### Open Iconic is the open source sibling of [Iconic](http://useiconic.com). It is a hyper-legible collection of 223 icons with a tiny footprint—ready to use with Bootstrap and Foundation. [View the collection](http://useiconic.com/open#icons) + + + +## What's in Open Iconic? + +* 223 icons designed to be legible down to 8 pixels +* Super-light SVG files - 61.8 for the entire set +* SVG sprite—the modern replacement for icon fonts +* Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats +* Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats +* PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px. + + +## Getting Started + +#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](http://useiconic.com/open#icons) and [Reference](http://useiconic.com/open#reference) sections. + +### General Usage + +#### Using Open Iconic's SVGs + +We like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute). + +``` +icon name +``` + +#### Using Open Iconic's SVG Sprite + +Open Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack. + +Adding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `` *tag and a unique class name for each different icon in the* `` *tag.* + +``` + + + +``` + +Sizing icons only needs basic CSS. All the icons are in a square format, so just set the `` tag with equal width and height dimensions. + +``` +.icon { + width: 16px; + height: 16px; +} +``` + +Coloring icons is even easier. All you need to do is set the `fill` rule on the `` tag. + +``` +.icon-account-login { + fill: #f00; +} +``` + +To learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/). + +#### Using Open Iconic's Icon Font... + + +##### …with Bootstrap + +You can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}` + + +``` + +``` + + +``` + +``` + +##### …with Foundation + +You can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}` + +``` + +``` + + +``` + +``` + +##### …on its own + +You can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}` + +``` + +``` + +``` + +``` + + +## License + +### Icons + +All code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT). + +### Fonts + +All fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web). diff --git a/EDA Viewer/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css b/EDA Viewer/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css new file mode 100644 index 0000000..4664f2e --- /dev/null +++ b/EDA Viewer/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css @@ -0,0 +1 @@ +@font-face{font-family:Icons;src:url(../fonts/open-iconic.eot);src:url(../fonts/open-iconic.eot?#iconic-sm) format('embedded-opentype'),url(../fonts/open-iconic.woff) format('woff'),url(../fonts/open-iconic.ttf) format('truetype'),url(../fonts/open-iconic.otf) format('opentype'),url(../fonts/open-iconic.svg#iconic-sm) format('svg');font-weight:400;font-style:normal}.oi{position:relative;top:1px;display:inline-block;speak:none;font-family:Icons;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.oi:empty:before{width:1em;text-align:center;box-sizing:content-box}.oi.oi-align-center:before{text-align:center}.oi.oi-align-left:before{text-align:left}.oi.oi-align-right:before{text-align:right}.oi.oi-flip-horizontal:before{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.oi.oi-flip-vertical:before{-webkit-transform:scale(1,-1);-ms-transform:scale(-1,1);transform:scale(1,-1)}.oi.oi-flip-horizontal-vertical:before{-webkit-transform:scale(-1,-1);-ms-transform:scale(-1,1);transform:scale(-1,-1)}.oi-account-login:before{content:'\e000'}.oi-account-logout:before{content:'\e001'}.oi-action-redo:before{content:'\e002'}.oi-action-undo:before{content:'\e003'}.oi-align-center:before{content:'\e004'}.oi-align-left:before{content:'\e005'}.oi-align-right:before{content:'\e006'}.oi-aperture:before{content:'\e007'}.oi-arrow-bottom:before{content:'\e008'}.oi-arrow-circle-bottom:before{content:'\e009'}.oi-arrow-circle-left:before{content:'\e00a'}.oi-arrow-circle-right:before{content:'\e00b'}.oi-arrow-circle-top:before{content:'\e00c'}.oi-arrow-left:before{content:'\e00d'}.oi-arrow-right:before{content:'\e00e'}.oi-arrow-thick-bottom:before{content:'\e00f'}.oi-arrow-thick-left:before{content:'\e010'}.oi-arrow-thick-right:before{content:'\e011'}.oi-arrow-thick-top:before{content:'\e012'}.oi-arrow-top:before{content:'\e013'}.oi-audio-spectrum:before{content:'\e014'}.oi-audio:before{content:'\e015'}.oi-badge:before{content:'\e016'}.oi-ban:before{content:'\e017'}.oi-bar-chart:before{content:'\e018'}.oi-basket:before{content:'\e019'}.oi-battery-empty:before{content:'\e01a'}.oi-battery-full:before{content:'\e01b'}.oi-beaker:before{content:'\e01c'}.oi-bell:before{content:'\e01d'}.oi-bluetooth:before{content:'\e01e'}.oi-bold:before{content:'\e01f'}.oi-bolt:before{content:'\e020'}.oi-book:before{content:'\e021'}.oi-bookmark:before{content:'\e022'}.oi-box:before{content:'\e023'}.oi-briefcase:before{content:'\e024'}.oi-british-pound:before{content:'\e025'}.oi-browser:before{content:'\e026'}.oi-brush:before{content:'\e027'}.oi-bug:before{content:'\e028'}.oi-bullhorn:before{content:'\e029'}.oi-calculator:before{content:'\e02a'}.oi-calendar:before{content:'\e02b'}.oi-camera-slr:before{content:'\e02c'}.oi-caret-bottom:before{content:'\e02d'}.oi-caret-left:before{content:'\e02e'}.oi-caret-right:before{content:'\e02f'}.oi-caret-top:before{content:'\e030'}.oi-cart:before{content:'\e031'}.oi-chat:before{content:'\e032'}.oi-check:before{content:'\e033'}.oi-chevron-bottom:before{content:'\e034'}.oi-chevron-left:before{content:'\e035'}.oi-chevron-right:before{content:'\e036'}.oi-chevron-top:before{content:'\e037'}.oi-circle-check:before{content:'\e038'}.oi-circle-x:before{content:'\e039'}.oi-clipboard:before{content:'\e03a'}.oi-clock:before{content:'\e03b'}.oi-cloud-download:before{content:'\e03c'}.oi-cloud-upload:before{content:'\e03d'}.oi-cloud:before{content:'\e03e'}.oi-cloudy:before{content:'\e03f'}.oi-code:before{content:'\e040'}.oi-cog:before{content:'\e041'}.oi-collapse-down:before{content:'\e042'}.oi-collapse-left:before{content:'\e043'}.oi-collapse-right:before{content:'\e044'}.oi-collapse-up:before{content:'\e045'}.oi-command:before{content:'\e046'}.oi-comment-square:before{content:'\e047'}.oi-compass:before{content:'\e048'}.oi-contrast:before{content:'\e049'}.oi-copywriting:before{content:'\e04a'}.oi-credit-card:before{content:'\e04b'}.oi-crop:before{content:'\e04c'}.oi-dashboard:before{content:'\e04d'}.oi-data-transfer-download:before{content:'\e04e'}.oi-data-transfer-upload:before{content:'\e04f'}.oi-delete:before{content:'\e050'}.oi-dial:before{content:'\e051'}.oi-document:before{content:'\e052'}.oi-dollar:before{content:'\e053'}.oi-double-quote-sans-left:before{content:'\e054'}.oi-double-quote-sans-right:before{content:'\e055'}.oi-double-quote-serif-left:before{content:'\e056'}.oi-double-quote-serif-right:before{content:'\e057'}.oi-droplet:before{content:'\e058'}.oi-eject:before{content:'\e059'}.oi-elevator:before{content:'\e05a'}.oi-ellipses:before{content:'\e05b'}.oi-envelope-closed:before{content:'\e05c'}.oi-envelope-open:before{content:'\e05d'}.oi-euro:before{content:'\e05e'}.oi-excerpt:before{content:'\e05f'}.oi-expand-down:before{content:'\e060'}.oi-expand-left:before{content:'\e061'}.oi-expand-right:before{content:'\e062'}.oi-expand-up:before{content:'\e063'}.oi-external-link:before{content:'\e064'}.oi-eye:before{content:'\e065'}.oi-eyedropper:before{content:'\e066'}.oi-file:before{content:'\e067'}.oi-fire:before{content:'\e068'}.oi-flag:before{content:'\e069'}.oi-flash:before{content:'\e06a'}.oi-folder:before{content:'\e06b'}.oi-fork:before{content:'\e06c'}.oi-fullscreen-enter:before{content:'\e06d'}.oi-fullscreen-exit:before{content:'\e06e'}.oi-globe:before{content:'\e06f'}.oi-graph:before{content:'\e070'}.oi-grid-four-up:before{content:'\e071'}.oi-grid-three-up:before{content:'\e072'}.oi-grid-two-up:before{content:'\e073'}.oi-hard-drive:before{content:'\e074'}.oi-header:before{content:'\e075'}.oi-headphones:before{content:'\e076'}.oi-heart:before{content:'\e077'}.oi-home:before{content:'\e078'}.oi-image:before{content:'\e079'}.oi-inbox:before{content:'\e07a'}.oi-infinity:before{content:'\e07b'}.oi-info:before{content:'\e07c'}.oi-italic:before{content:'\e07d'}.oi-justify-center:before{content:'\e07e'}.oi-justify-left:before{content:'\e07f'}.oi-justify-right:before{content:'\e080'}.oi-key:before{content:'\e081'}.oi-laptop:before{content:'\e082'}.oi-layers:before{content:'\e083'}.oi-lightbulb:before{content:'\e084'}.oi-link-broken:before{content:'\e085'}.oi-link-intact:before{content:'\e086'}.oi-list-rich:before{content:'\e087'}.oi-list:before{content:'\e088'}.oi-location:before{content:'\e089'}.oi-lock-locked:before{content:'\e08a'}.oi-lock-unlocked:before{content:'\e08b'}.oi-loop-circular:before{content:'\e08c'}.oi-loop-square:before{content:'\e08d'}.oi-loop:before{content:'\e08e'}.oi-magnifying-glass:before{content:'\e08f'}.oi-map-marker:before{content:'\e090'}.oi-map:before{content:'\e091'}.oi-media-pause:before{content:'\e092'}.oi-media-play:before{content:'\e093'}.oi-media-record:before{content:'\e094'}.oi-media-skip-backward:before{content:'\e095'}.oi-media-skip-forward:before{content:'\e096'}.oi-media-step-backward:before{content:'\e097'}.oi-media-step-forward:before{content:'\e098'}.oi-media-stop:before{content:'\e099'}.oi-medical-cross:before{content:'\e09a'}.oi-menu:before{content:'\e09b'}.oi-microphone:before{content:'\e09c'}.oi-minus:before{content:'\e09d'}.oi-monitor:before{content:'\e09e'}.oi-moon:before{content:'\e09f'}.oi-move:before{content:'\e0a0'}.oi-musical-note:before{content:'\e0a1'}.oi-paperclip:before{content:'\e0a2'}.oi-pencil:before{content:'\e0a3'}.oi-people:before{content:'\e0a4'}.oi-person:before{content:'\e0a5'}.oi-phone:before{content:'\e0a6'}.oi-pie-chart:before{content:'\e0a7'}.oi-pin:before{content:'\e0a8'}.oi-play-circle:before{content:'\e0a9'}.oi-plus:before{content:'\e0aa'}.oi-power-standby:before{content:'\e0ab'}.oi-print:before{content:'\e0ac'}.oi-project:before{content:'\e0ad'}.oi-pulse:before{content:'\e0ae'}.oi-puzzle-piece:before{content:'\e0af'}.oi-question-mark:before{content:'\e0b0'}.oi-rain:before{content:'\e0b1'}.oi-random:before{content:'\e0b2'}.oi-reload:before{content:'\e0b3'}.oi-resize-both:before{content:'\e0b4'}.oi-resize-height:before{content:'\e0b5'}.oi-resize-width:before{content:'\e0b6'}.oi-rss-alt:before{content:'\e0b7'}.oi-rss:before{content:'\e0b8'}.oi-script:before{content:'\e0b9'}.oi-share-boxed:before{content:'\e0ba'}.oi-share:before{content:'\e0bb'}.oi-shield:before{content:'\e0bc'}.oi-signal:before{content:'\e0bd'}.oi-signpost:before{content:'\e0be'}.oi-sort-ascending:before{content:'\e0bf'}.oi-sort-descending:before{content:'\e0c0'}.oi-spreadsheet:before{content:'\e0c1'}.oi-star:before{content:'\e0c2'}.oi-sun:before{content:'\e0c3'}.oi-tablet:before{content:'\e0c4'}.oi-tag:before{content:'\e0c5'}.oi-tags:before{content:'\e0c6'}.oi-target:before{content:'\e0c7'}.oi-task:before{content:'\e0c8'}.oi-terminal:before{content:'\e0c9'}.oi-text:before{content:'\e0ca'}.oi-thumb-down:before{content:'\e0cb'}.oi-thumb-up:before{content:'\e0cc'}.oi-timer:before{content:'\e0cd'}.oi-transfer:before{content:'\e0ce'}.oi-trash:before{content:'\e0cf'}.oi-underline:before{content:'\e0d0'}.oi-vertical-align-bottom:before{content:'\e0d1'}.oi-vertical-align-center:before{content:'\e0d2'}.oi-vertical-align-top:before{content:'\e0d3'}.oi-video:before{content:'\e0d4'}.oi-volume-high:before{content:'\e0d5'}.oi-volume-low:before{content:'\e0d6'}.oi-volume-off:before{content:'\e0d7'}.oi-warning:before{content:'\e0d8'}.oi-wifi:before{content:'\e0d9'}.oi-wrench:before{content:'\e0da'}.oi-x:before{content:'\e0db'}.oi-yen:before{content:'\e0dc'}.oi-zoom-in:before{content:'\e0dd'}.oi-zoom-out:before{content:'\e0de'} \ No newline at end of file diff --git a/EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.eot b/EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.eot new file mode 100644 index 0000000000000000000000000000000000000000..f98177dbf711863eff7c90f84d5d419d02d99ba8 GIT binary patch literal 28196 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 f%X4~$E_2;^J#ifP;CI~=<%5iE_!YyhznS + + + + +Created by FontForge 20120731 at Tue Jul 1 20:39:22 2014 + By P.J. Onori +Created by P.J. Onori with FontForge 2.0 (http://fontforge.sf.net) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf b/EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fab604866cd5e55ef4525ea22e420c411f510b01 GIT binary patch literal 28028 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 literal 0 HcmV?d00001 diff --git a/EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.woff b/EDA Viewer/wwwroot/css/open-iconic/font/fonts/open-iconic.woff new file mode 100644 index 0000000000000000000000000000000000000000..f9309988aeab3868040d3b322658902098eba27f GIT binary patch literal 14984 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 literal 0 HcmV?d00001 diff --git a/EDA Viewer/wwwroot/css/site.css b/EDA Viewer/wwwroot/css/site.css deleted file mode 100644 index e679a8e..0000000 --- a/EDA Viewer/wwwroot/css/site.css +++ /dev/null @@ -1,71 +0,0 @@ -/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification -for details on configuring this project to bundle and minify static web assets. */ - -a.navbar-brand { - white-space: normal; - text-align: center; - word-break: break-all; -} - -/* Provide sufficient contrast against white background */ -a { - color: #0366d6; -} - -.btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.nav-pills .nav-link.active, .nav-pills .show > .nav-link { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -/* Sticky footer styles --------------------------------------------------- */ -html { - font-size: 14px; -} -@media (min-width: 768px) { - html { - font-size: 16px; - } -} - -.border-top { - border-top: 1px solid #e5e5e5; -} -.border-bottom { - border-bottom: 1px solid #e5e5e5; -} - -.box-shadow { - box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); -} - -button.accept-policy { - font-size: 1rem; - line-height: inherit; -} - -/* Sticky footer styles --------------------------------------------------- */ -html { - position: relative; - min-height: 100%; -} - -body { - /* Margin bottom by footer height */ - margin-bottom: 60px; -} -.footer { - position: absolute; - bottom: 0; - width: 100%; - white-space: nowrap; - line-height: 60px; /* Vertically center the text there */ -} diff --git a/EDA Viewer/wwwroot/images/OnePixel.gif b/EDA Viewer/wwwroot/images/OnePixel.gif deleted file mode 100644 index 90fc402120db7529ff65ba1084e7fabcf5380287..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 807 zcmXYwv8^yP5QF`shr}AxN9P7a4`P4}K;t>GhF8ceZZpd-BqWmuf0`&cDd+p_{PE}S zzx?{w2R`r(|1Sap3O;z$LD5 zjT_v)w^5=(jRt)O5F|vH$g6R{Ax9i@!YLQH$R#dwg{$1)CbziF9q#gghdkmjPk71; zUh<09yx}bimaJH_VV{mSHU$Y5@?>eCp+*{OqNx_Ns3k3HMXTD-rna=L9qsBshdR=+ zPIRgZUFu5Ly3wr)m8w*$Q6GXwoQ4b=c|<($&?ApM@ze`m^pcmo;#F^W(_7y5j(2_F zLm&CrCqDIsFMZ`}-}u&rOINPlxR3rbn}Grcd1hpgVMZBel4%yQn58UdC9B!UX121O zo$TfyhdIh|PI8)yT;?j*xyfycl&MmuN&6Lq=f*?wbiLw>!l1*BI_{*?E_AU=UG7R( zyV1>Vb-O#=?LiNF)Z?D?v=_bXRj+%~`_=3P?YaGszq$Ww{yq0^`|0n`58xmC{B`y9 OC-CDZzWwlt-~I*nT7LZi diff --git a/EDA Viewer/wwwroot/index.txt b/EDA Viewer/wwwroot/index.txt new file mode 100644 index 0000000..5b69db7 --- /dev/null +++ b/EDA Viewer/wwwroot/index.txt @@ -0,0 +1 @@ +EDA Viewer \ No newline at end of file diff --git a/EDA Viewer/wwwroot/js/bundles/bootstrap.js b/EDA Viewer/wwwroot/js/bundles/bootstrap.js deleted file mode 100644 index 7133442..0000000 --- a/EDA Viewer/wwwroot/js/bundles/bootstrap.js +++ /dev/null @@ -1 +0,0 @@ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(n){"use strict";var t=n.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1||t[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4");}(jQuery);+function(n){"use strict";function t(){var i=document.createElement("bootstrap"),n={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var t in n)if(void 0!==i.style[t])return{end:n[t]};return!1}n.fn.emulateTransitionEnd=function(t){var i=!1,u=this,r;n(this).one("bsTransitionEnd",function(){i=!0});return r=function(){i||n(u).trigger(n.support.transition.end)},setTimeout(r,t),this};n(function(){n.support.transition=t();n.support.transition&&(n.event.special.bsTransitionEnd={bindType:n.support.transition.end,delegateType:n.support.transition.end,handle:function(t){if(n(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})})}(jQuery);+function(n){"use strict";function u(i){return this.each(function(){var r=n(this),u=r.data("bs.alert");u||r.data("bs.alert",u=new t(this));"string"==typeof i&&u[i].call(r)})}var i='[data-dismiss="alert"]',t=function(t){n(t).on("click",i,this.close)},r;t.VERSION="3.3.7";t.TRANSITION_DURATION=150;t.prototype.close=function(i){function e(){r.detach().trigger("closed.bs.alert").remove()}var f=n(this),u=f.attr("data-target"),r;u||(u=f.attr("href"),u=u&&u.replace(/.*(?=#[^\s]*$)/,""));r=n("#"===u?[]:u);i&&i.preventDefault();r.length||(r=f.closest(".alert"));r.trigger(i=n.Event("close.bs.alert"));i.isDefaultPrevented()||(r.removeClass("in"),n.support.transition&&r.hasClass("fade")?r.one("bsTransitionEnd",e).emulateTransitionEnd(t.TRANSITION_DURATION):e())};r=n.fn.alert;n.fn.alert=u;n.fn.alert.Constructor=t;n.fn.alert.noConflict=function(){return n.fn.alert=r,this};n(document).on("click.bs.alert.data-api",i,t.prototype.close)}(jQuery);+function(n){"use strict";function i(i){return this.each(function(){var u=n(this),r=u.data("bs.button"),f="object"==typeof i&&i;r||u.data("bs.button",r=new t(this,f));"toggle"==i?r.toggle():i&&r.setState(i)})}var t=function(i,r){this.$element=n(i);this.options=n.extend({},t.DEFAULTS,r);this.isLoading=!1},r;t.VERSION="3.3.7";t.DEFAULTS={loadingText:"loading..."};t.prototype.setState=function(t){var i="disabled",r=this.$element,f=r.is("input")?"val":"html",u=r.data();t+="Text";null==u.resetText&&r.data("resetText",r[f]());setTimeout(n.proxy(function(){r[f](null==u[t]?this.options[t]:u[t]);"loadingText"==t?(this.isLoading=!0,r.addClass(i).attr(i,i).prop(i,!0)):this.isLoading&&(this.isLoading=!1,r.removeClass(i).removeAttr(i).prop(i,!1))},this),0)};t.prototype.toggle=function(){var t=!0,i=this.$element.closest('[data-toggle="buttons"]'),n;i.length?(n=this.$element.find("input"),"radio"==n.prop("type")?(n.prop("checked")&&(t=!1),i.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(t=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),t&&n.trigger("change")):(this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active"))};r=n.fn.button;n.fn.button=i;n.fn.button.Constructor=t;n.fn.button.noConflict=function(){return n.fn.button=r,this};n(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(t){var r=n(t.target).closest(".btn");i.call(r,"toggle");n(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),r.is("input,button")?r.trigger("focus"):r.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(t){n(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))})}(jQuery);+function(n){"use strict";function i(i){return this.each(function(){var u=n(this),r=u.data("bs.carousel"),f=n.extend({},t.DEFAULTS,u.data(),"object"==typeof i&&i),e="string"==typeof i?i:f.slide;r||u.data("bs.carousel",r=new t(this,f));"number"==typeof i?r.to(i):e?r[e]():f.interval&&r.pause().cycle()})}var t=function(t,i){this.$element=n(t);this.$indicators=this.$element.find(".carousel-indicators");this.options=i;this.paused=null;this.sliding=null;this.interval=null;this.$active=null;this.$items=null;this.options.keyboard&&this.$element.on("keydown.bs.carousel",n.proxy(this.keydown,this));"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",n.proxy(this.pause,this)).on("mouseleave.bs.carousel",n.proxy(this.cycle,this))},u,r;t.VERSION="3.3.7";t.TRANSITION_DURATION=600;t.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0};t.prototype.keydown=function(n){if(!/input|textarea/i.test(n.target.tagName)){switch(n.which){case 37:this.prev();break;case 39:this.next();break;default:return}n.preventDefault()}};t.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(n.proxy(this.next,this),this.options.interval)),this};t.prototype.getItemIndex=function(n){return this.$items=n.parent().children(".item"),this.$items.index(n||this.$active)};t.prototype.getItemForDirection=function(n,t){var i=this.getItemIndex(t),f="prev"==n&&0===i||"next"==n&&i==this.$items.length-1,r,u;return f&&!this.options.wrap?t:(r="prev"==n?-1:1,u=(i+r)%this.$items.length,this.$items.eq(u))};t.prototype.to=function(n){var i=this,t=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(n>this.$items.length-1||n<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){i.to(n)}):t==n?this.pause().cycle():this.slide(n>t?"next":"prev",this.$items.eq(n))};t.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&n.support.transition&&(this.$element.trigger(n.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this};t.prototype.next=function(){if(!this.sliding)return this.slide("next")};t.prototype.prev=function(){if(!this.sliding)return this.slide("prev")};t.prototype.slide=function(i,r){var e=this.$element.find(".item.active"),u=r||this.getItemForDirection(i,e),l=this.interval,f="next"==i?"left":"right",a=this,o,s,h,c;return u.hasClass("active")?this.sliding=!1:(o=u[0],s=n.Event("slide.bs.carousel",{relatedTarget:o,direction:f}),(this.$element.trigger(s),!s.isDefaultPrevented())?((this.sliding=!0,l&&this.pause(),this.$indicators.length)&&(this.$indicators.find(".active").removeClass("active"),h=n(this.$indicators.children()[this.getItemIndex(u)]),h&&h.addClass("active")),c=n.Event("slid.bs.carousel",{relatedTarget:o,direction:f}),n.support.transition&&this.$element.hasClass("slide")?(u.addClass(i),u[0].offsetWidth,e.addClass(f),u.addClass(f),e.one("bsTransitionEnd",function(){u.removeClass([i,f].join(" ")).addClass("active");e.removeClass(["active",f].join(" "));a.sliding=!1;setTimeout(function(){a.$element.trigger(c)},0)}).emulateTransitionEnd(t.TRANSITION_DURATION)):(e.removeClass("active"),u.addClass("active"),this.sliding=!1,this.$element.trigger(c)),l&&this.cycle(),this):void 0)};u=n.fn.carousel;n.fn.carousel=i;n.fn.carousel.Constructor=t;n.fn.carousel.noConflict=function(){return n.fn.carousel=u,this};r=function(t){var o,r=n(this),u=n(r.attr("data-target")||(o=r.attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,"")),e,f;u.hasClass("carousel")&&(e=n.extend({},u.data(),r.data()),f=r.attr("data-slide-to"),f&&(e.interval=!1),i.call(u,e),f&&u.data("bs.carousel").to(f),t.preventDefault())};n(document).on("click.bs.carousel.data-api","[data-slide]",r).on("click.bs.carousel.data-api","[data-slide-to]",r);n(window).on("load",function(){n('[data-ride="carousel"]').each(function(){var t=n(this);i.call(t,t.data())})})}(jQuery);+function(n){"use strict";function r(t){var i,r=t.attr("data-target")||(i=t.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,"");return n(r)}function i(i){return this.each(function(){var u=n(this),r=u.data("bs.collapse"),f=n.extend({},t.DEFAULTS,u.data(),"object"==typeof i&&i);!r&&f.toggle&&/show|hide/.test(i)&&(f.toggle=!1);r||u.data("bs.collapse",r=new t(this,f));"string"==typeof i&&r[i]()})}var t=function(i,r){this.$element=n(i);this.options=n.extend({},t.DEFAULTS,r);this.$trigger=n('[data-toggle="collapse"][href="#'+i.id+'"],[data-toggle="collapse"][data-target="#'+i.id+'"]');this.transitioning=null;this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger);this.options.toggle&&this.toggle()},u;t.VERSION="3.3.7";t.TRANSITION_DURATION=350;t.DEFAULTS={toggle:!0};t.prototype.dimension=function(){var n=this.$element.hasClass("width");return n?"width":"height"};t.prototype.show=function(){var f,r,e,u,o,s;if(!this.transitioning&&!this.$element.hasClass("in")&&(r=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing"),!(r&&r.length&&(f=r.data("bs.collapse"),f&&f.transitioning))&&(e=n.Event("show.bs.collapse"),this.$element.trigger(e),!e.isDefaultPrevented()))){if(r&&r.length&&(i.call(r,"hide"),f||r.data("bs.collapse",null)),u=this.dimension(),this.$element.removeClass("collapse").addClass("collapsing")[u](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1,o=function(){this.$element.removeClass("collapsing").addClass("collapse in")[u]("");this.transitioning=0;this.$element.trigger("shown.bs.collapse")},!n.support.transition)return o.call(this);s=n.camelCase(["scroll",u].join("-"));this.$element.one("bsTransitionEnd",n.proxy(o,this)).emulateTransitionEnd(t.TRANSITION_DURATION)[u](this.$element[0][s])}};t.prototype.hide=function(){var r,i,u;if(!this.transitioning&&this.$element.hasClass("in")&&(r=n.Event("hide.bs.collapse"),this.$element.trigger(r),!r.isDefaultPrevented()))return i=this.dimension(),this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1,u=function(){this.transitioning=0;this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")},n.support.transition?void this.$element[i](0).one("bsTransitionEnd",n.proxy(u,this)).emulateTransitionEnd(t.TRANSITION_DURATION):u.call(this)};t.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};t.prototype.getParent=function(){return n(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(n.proxy(function(t,i){var u=n(i);this.addAriaAndCollapsedClass(r(u),u)},this)).end()};t.prototype.addAriaAndCollapsedClass=function(n,t){var i=n.hasClass("in");n.attr("aria-expanded",i);t.toggleClass("collapsed",!i).attr("aria-expanded",i)};u=n.fn.collapse;n.fn.collapse=i;n.fn.collapse.Constructor=t;n.fn.collapse.noConflict=function(){return n.fn.collapse=u,this};n(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(t){var u=n(this);u.attr("data-target")||t.preventDefault();var f=r(u),e=f.data("bs.collapse"),o=e?"toggle":u.data();i.call(f,o)})}(jQuery);+function(n){"use strict";function r(t){var i=t.attr("data-target"),r;return i||(i=t.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,"")),r=i&&n(i),r&&r.length?r:t.parent()}function u(t){t&&3===t.which||(n(o).remove(),n(i).each(function(){var u=n(this),i=r(u),f={relatedTarget:this};i.hasClass("open")&&(t&&"click"==t.type&&/input|textarea/i.test(t.target.tagName)&&n.contains(i[0],t.target)||(i.trigger(t=n.Event("hide.bs.dropdown",f)),t.isDefaultPrevented()||(u.attr("aria-expanded","false"),i.removeClass("open").trigger(n.Event("hidden.bs.dropdown",f)))))}))}function e(i){return this.each(function(){var r=n(this),u=r.data("bs.dropdown");u||r.data("bs.dropdown",u=new t(this));"string"==typeof i&&u[i].call(r)})}var o=".dropdown-backdrop",i='[data-toggle="dropdown"]',t=function(t){n(t).on("click.bs.dropdown",this.toggle)},f;t.VERSION="3.3.7";t.prototype.toggle=function(t){var f=n(this),i,o,e;if(!f.is(".disabled, :disabled")){if(i=r(f),o=i.hasClass("open"),u(),!o){if("ontouchstart"in document.documentElement&&!i.closest(".navbar-nav").length&&n(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(n(this)).on("click",u),e={relatedTarget:this},i.trigger(t=n.Event("show.bs.dropdown",e)),t.isDefaultPrevented())return;f.trigger("focus").attr("aria-expanded","true");i.toggleClass("open").trigger(n.Event("shown.bs.dropdown",e))}return!1}};t.prototype.keydown=function(t){var e,o,s,h,f,u;if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)&&(e=n(this),t.preventDefault(),t.stopPropagation(),!e.is(".disabled, :disabled"))){if(o=r(e),s=o.hasClass("open"),!s&&27!=t.which||s&&27==t.which)return 27==t.which&&o.find(i).trigger("focus"),e.trigger("click");h=" li:not(.disabled):visible a";f=o.find(".dropdown-menu"+h);f.length&&(u=f.index(t.target),38==t.which&&u>0&&u--,40==t.which&&udocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&n?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!n?this.scrollbarWidth:""})};t.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})};t.prototype.checkScrollbar=function(){var n=window.innerWidth,t;n||(t=document.documentElement.getBoundingClientRect(),n=t.right-Math.abs(t.left));this.bodyIsOverflowing=document.body.clientWidth

<\/div>
<\/div><\/div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}};t.prototype.init=function(t,i,r){var f,e,u,o,s;if(this.enabled=!0,this.type=t,this.$element=n(i),this.options=this.getOptions(r),this.$viewport=this.options.viewport&&n(n.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(f=this.options.trigger.split(" "),e=f.length;e--;)if(u=f[e],"click"==u)this.$element.on("click."+this.type,this.options.selector,n.proxy(this.toggle,this));else"manual"!=u&&(o="hover"==u?"mouseenter":"focusin",s="hover"==u?"mouseleave":"focusout",this.$element.on(o+"."+this.type,this.options.selector,n.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,n.proxy(this.leave,this)));this.options.selector?this._options=n.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()};t.prototype.getDefaults=function(){return t.DEFAULTS};t.prototype.getOptions=function(t){return t=n.extend({},this.getDefaults(),this.$element.data(),t),t.delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t};t.prototype.getDelegateOptions=function(){var t={},i=this.getDefaults();return this._options&&n.each(this._options,function(n,r){i[n]!=r&&(t[n]=r)}),t};t.prototype.enter=function(t){var i=t instanceof this.constructor?t:n(t.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(t.currentTarget,this.getDelegateOptions()),n(t.currentTarget).data("bs."+this.type,i)),t instanceof n.Event&&(i.inState["focusin"==t.type?"focus":"hover"]=!0),i.tip().hasClass("in")||"in"==i.hoverState?void(i.hoverState="in"):(clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show())};t.prototype.isInStateTrue=function(){for(var n in this.inState)if(this.inState[n])return!0;return!1};t.prototype.leave=function(t){var i=t instanceof this.constructor?t:n(t.currentTarget).data("bs."+this.type);if(i||(i=new this.constructor(t.currentTarget,this.getDelegateOptions()),n(t.currentTarget).data("bs."+this.type,i)),t instanceof n.Event&&(i.inState["focusout"==t.type?"focus":"hover"]=!1),!i.isInStateTrue())return clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide()};t.prototype.show=function(){var c=n.Event("show.bs."+this.type),l,p,e,w,h;if(this.hasContent()&&this.enabled){if(this.$element.trigger(c),l=n.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]),c.isDefaultPrevented()||!l)return;var u=this,r=this.tip(),a=this.getUID(this.type);this.setContent();r.attr("id",a);this.$element.attr("aria-describedby",a);this.options.animation&&r.addClass("fade");var i="function"==typeof this.options.placement?this.options.placement.call(this,r[0],this.$element[0]):this.options.placement,v=/\s?auto?\s?/i,y=v.test(i);y&&(i=i.replace(v,"")||"top");r.detach().css({top:0,left:0,display:"block"}).addClass(i).data("bs."+this.type,this);this.options.container?r.appendTo(this.options.container):r.insertAfter(this.$element);this.$element.trigger("inserted.bs."+this.type);var f=this.getPosition(),o=r[0].offsetWidth,s=r[0].offsetHeight;y&&(p=i,e=this.getPosition(this.$viewport),i="bottom"==i&&f.bottom+s>e.bottom?"top":"top"==i&&f.top-se.width?"left":"left"==i&&f.left-ou.top+u.height&&(f.top=u.top+u.height-s)):(h=t.left-e,c=t.left+e+i,hu.right&&(f.left=u.left+u.width-c)),f):f};t.prototype.getTitle=function(){var t=this.$element,n=this.options;return t.attr("data-original-title")||("function"==typeof n.title?n.title.call(t[0]):n.title)};t.prototype.getUID=function(n){do n+=~~(1e6*Math.random());while(document.getElementById(n));return n};t.prototype.tip=function(){if(!this.$tip&&(this.$tip=n(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip};t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")};t.prototype.enable=function(){this.enabled=!0};t.prototype.disable=function(){this.enabled=!1};t.prototype.toggleEnabled=function(){this.enabled=!this.enabled};t.prototype.toggle=function(t){var i=this;t&&(i=n(t.currentTarget).data("bs."+this.type),i||(i=new this.constructor(t.currentTarget,this.getDelegateOptions()),n(t.currentTarget).data("bs."+this.type,i)));t?(i.inState.click=!i.inState.click,i.isInStateTrue()?i.enter(i):i.leave(i)):i.tip().hasClass("in")?i.leave(i):i.enter(i)};t.prototype.destroy=function(){var n=this;clearTimeout(this.timeout);this.hide(function(){n.$element.off("."+n.type).removeData("bs."+n.type);n.$tip&&n.$tip.detach();n.$tip=null;n.$arrow=null;n.$viewport=null;n.$element=null})};i=n.fn.tooltip;n.fn.tooltip=r;n.fn.tooltip.Constructor=t;n.fn.tooltip.noConflict=function(){return n.fn.tooltip=i,this}}(jQuery);+function(n){"use strict";function r(i){return this.each(function(){var u=n(this),r=u.data("bs.popover"),f="object"==typeof i&&i;!r&&/destroy|hide/.test(i)||(r||u.data("bs.popover",r=new t(this,f)),"string"==typeof i&&r[i]())})}var t=function(n,t){this.init("popover",n,t)},i;if(!n.fn.tooltip)throw new Error("Popover requires tooltip.js");t.VERSION="3.3.7";t.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'