diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 20057c1..95ae038 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -17,8 +17,6 @@ on: pull_request: # The branches below must be a subset of the branches above branches: [ master ] - schedule: - - cron: '19 2 * * 5' jobs: analyze: diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3dbac44..dc5ef9d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,7 +14,7 @@ jobs: build: permissions: contents: write - runs-on: windows-2022 + runs-on: windows-2025-vs2026 # Steps represent a sequence of tasks that will be executed as part of the job steps: @@ -23,7 +23,7 @@ jobs: shell: powershell run: | # Get the commit message - $strVal = '${{ github.event.commits[0].message }}' + $strVal ='${{ github.event. head_commit.message }}' # Convert commit message to a single line if multiline $singleLineStrVal = $strVal -replace "`r`n", " " -replace "`n", " " if ($singleLineStrVal -match '#GITBUILD') { @@ -137,22 +137,44 @@ jobs: Get-Content $proj Write-Host "=== END .vdproj CONTENT ===" - # locate VS 2022 - - name: Locate Visual Studio 2022 + # locate VS 2026 + - name: Locate Visual Studio 2026 id: vswhere shell: pwsh run: | - $installPath = vswhere -latest -products * -requires Microsoft.Component.MSBuild ` - -property installationPath - if (-not $installPath) { throw 'VS 2022 not found' } + $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + if (-not (Test-Path $vswhere)) { + throw "Could not find vswhere.exe at $vswhere" + } + + $installPath = & $vswhere -latest -products * -version "[18.0,19.0)" ` + -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath + + if (-not $installPath) { + Write-Host 'VS 2026 (major 18) not found on runner. Falling back to VS 2022 (major 17).' + $installPath = & $vswhere -latest -products * -version "[17.0,18.0)" ` + -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath + } + + if (-not $installPath) { + throw "Could not find a Visual Studio installation" + } + + "VS=$installPath" >> $env:GITHUB_ENV "installPath=$installPath" >> $env:GITHUB_OUTPUT # download vs installer builder (v2.0.1) - name: Download Installer-Projects VSIX shell: pwsh run: | - $vsixUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/VisualStudioClient/vsextensions/MicrosoftVisualStudio2022InstallerProjects/2.0.1/vspackage" - Invoke-WebRequest $vsixUrl -OutFile installerprojects.vsix + $vsixUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/VisualStudioClient/vsextensions/MicrosoftVisualStudio2026InstallerProjects/2.0.1/vspackage" + $fallbackUrl = "https://marketplace.visualstudio.com/_apis/public/gallery/publishers/VisualStudioClient/vsextensions/MicrosoftVisualStudio2022InstallerProjects/2.0.1/vspackage" + try { + Invoke-WebRequest $vsixUrl -OutFile installerprojects.vsix -ErrorAction Stop + } catch { + Write-Host "VS2026 Installer Projects package not found, falling back to VS2022 feed." + Invoke-WebRequest $fallbackUrl -OutFile installerprojects.vsix -ErrorAction Stop + } # install vs installer builder - name: Install Installer-Projects extension @@ -162,13 +184,16 @@ jobs: Write-Host "Running: $vsixInstaller installerprojects.vsix /quiet" & $vsixInstaller installerprojects.vsix /quiet - # Build MSI installer project using Visual Studio 2022 workaround + # Build MSI installer project using Visual Studio 2026 workaround - name: Build Installer MSI if: env.build_trigger == 'true' shell: cmd run: | + setlocal EnableDelayedExpansion echo === Running BuildInstaller.bat === call .\BuildInstaller.bat || echo WARNING: BuildInstaller.bat exited with %ERRORLEVEL%, continuing... + set "ec=!ERRORLEVEL!" + if not "!ec!"=="0" echo WARNING: BuildInstaller.bat exited with !ec!, continuing... echo === Verifying MSI === if exist "UnityLauncherProInstaller\Release\UnityLauncherPro-Installer.msi" ( echo Success: MSI found at UnityLauncherProInstaller\Release\UnityLauncherPro-Installer.msi diff --git a/Build.cmd b/Build.cmd index 80288d1..817a945 100644 --- a/Build.cmd +++ b/Build.cmd @@ -1,10 +1,13 @@ @echo off REM Default VS paths to check if no Paths.cmd file exists -set VISUAL_STUDIO_PATH_0="%programfiles%\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\msbuild.exe" -set VISUAL_STUDIO_PATH_1="%programfiles%\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\msbuild.exe" -set VISUAL_STUDIO_PATH_2="%programfiles(x86)%\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\msbuild.exe" -set VISUAL_STUDIO_PATH_3="%programfiles(x86)%\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe" +set VISUAL_STUDIO_PATH_0="%programfiles%\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\msbuild.exe" +set VISUAL_STUDIO_PATH_1="%programfiles%\Microsoft Visual Studio\18\Professional\MSBuild\Current\Bin\msbuild.exe" +set VISUAL_STUDIO_PATH_2="%programfiles%\Microsoft Visual Studio\18\Enterprise\MSBuild\Current\Bin\msbuild.exe" +set VISUAL_STUDIO_PATH_3="%programfiles%\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\msbuild.exe" +set VISUAL_STUDIO_PATH_4="%programfiles%\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\msbuild.exe" +set VISUAL_STUDIO_PATH_5="%programfiles(x86)%\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\msbuild.exe" +set VISUAL_STUDIO_PATH_6="%programfiles(x86)%\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe" pushd "%~dp0" if exist Debug rd /s /q Debug @@ -37,6 +40,21 @@ set VISUAL_STUDIO_PATH=%VISUAL_STUDIO_PATH_3% goto build ) +if exist %VISUAL_STUDIO_PATH_4% ( +set VISUAL_STUDIO_PATH=%VISUAL_STUDIO_PATH_4% +goto build +) + +if exist %VISUAL_STUDIO_PATH_5% ( +set VISUAL_STUDIO_PATH=%VISUAL_STUDIO_PATH_5% +goto build +) + +if exist %VISUAL_STUDIO_PATH_6% ( +set VISUAL_STUDIO_PATH=%VISUAL_STUDIO_PATH_6% +goto build +) + REM No default path found. Let the user know what to do. echo No Visual Studio installation found. Please configure it manually. echo 1. Copy 'Paths.cmd.template'. diff --git a/BuildInstaller.bat b/BuildInstaller.bat index 97b0d01..b00a9ec 100644 --- a/BuildInstaller.bat +++ b/BuildInstaller.bat @@ -7,8 +7,7 @@ ECHO === Starting Installer Build Workaround === REM Store current directory SET "current_path=%CD%" -REM Try all known editions of Visual Studio 2022 -SET "vs_base_path=%ProgramFiles%\Microsoft Visual Studio\2022" +SET "vs_base_path=%ProgramFiles%\Microsoft Visual Studio\18" FOR %%E IN (Community Professional Enterprise) DO ( IF EXIST "%vs_base_path%\%%E\Common7\IDE\CommonExtensions\Microsoft\VSI\DisableOutOfProcBuild\DisableOutOfProcBuild.exe" ( SET "buildfix_path=%vs_base_path%\%%E\Common7\IDE\CommonExtensions\Microsoft\VSI\DisableOutOfProcBuild" @@ -18,11 +17,12 @@ FOR %%E IN (Community Professional Enterprise) DO ( ) ) -ECHO [ERROR] Could not find DisableOutOfProcBuild.exe in any known VS2022 edition. + +ECHO [ERROR] Could not find DisableOutOfProcBuild.exe in any known VS2026 edition. EXIT /B 1 :FoundEdition -ECHO Found Visual Studio 2022 Edition: %vs_edition% +ECHO Found Visual Studio 2026 Edition: %vs_edition% CD /D "%buildfix_path%" CALL DisableOutOfProcBuild.exe @@ -52,18 +52,26 @@ IF %error% NEQ 0 ( ECHO: ECHO === Building Installer === -"%devenv_path%" UnityLauncherPro.sln /Rebuild Release /Project UnityLauncherProInstaller > build_output.log 2>&1 -SET "exitCode=%ERRORLEVEL%" +ECHO Current dir: %CD% -TYPE build_output.log -ECHO: -ECHO === devenv.exe exit code: %exitCode% === +IF NOT EXIST "UnityLauncherPro.sln" ( + ECHO [ERROR] Solution file not found: UnityLauncherPro.sln + EXIT /B 1 +) -IF NOT "%exitCode%"=="0" ( - ECHO [ERROR] Installer build failed. Check build_output.log for details. - EXIT /B %exitCode% +SET "installer_project=UnityLauncherProInstaller\UnityLauncherProInstaller.vdproj" + +IF NOT EXIST "%installer_project%" ( + ECHO [ERROR] Installer project not found: %installer_project% + EXIT /B 1 ) +ECHO Running: +ECHO "%devenv_path%" "UnityLauncherPro.sln" /Rebuild "Release" /Project "%installer_project%" + +"%devenv_path%" "UnityLauncherPro.sln" /Rebuild "Release" /Project "%installer_project%" > build_output.log 2>&1 +SET "exitCode=%ERRORLEVEL%" + ECHO: ECHO === Build Complete === diff --git a/README.md b/README.md index f7540b8..45f2a03 100644 --- a/README.md +++ b/README.md @@ -80,3 +80,5 @@ Old (winforms) version is here: https://github.com/unitycoder/UnityLauncher + + diff --git a/UnityLauncherPro.sln b/UnityLauncherPro.sln index 2314601..d5fe6c9 100644 --- a/UnityLauncherPro.sln +++ b/UnityLauncherPro.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.13.35931.197 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.00000.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityLauncherPro", "UnityLauncherPro\UnityLauncherPro.csproj", "{EC78D91A-3E63-4CAA-8BC3-9673A30FDA45}" EndProject diff --git a/UnityLauncherPro/App.xaml b/UnityLauncherPro/App.xaml index 1d882de..aebdd7d 100644 --- a/UnityLauncherPro/App.xaml +++ b/UnityLauncherPro/App.xaml @@ -136,7 +136,7 @@ - + @@ -257,6 +257,7 @@ + @@ -452,6 +453,10 @@ + + + + @@ -530,9 +535,6 @@ - - - diff --git a/UnityLauncherPro/Controls/SearchBoxControl.xaml b/UnityLauncherPro/Controls/SearchBoxControl.xaml new file mode 100644 index 0000000..c9d0fb6 --- /dev/null +++ b/UnityLauncherPro/Controls/SearchBoxControl.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + diff --git a/UnityLauncherPro/Controls/SearchBoxControl.xaml.cs b/UnityLauncherPro/Controls/SearchBoxControl.xaml.cs new file mode 100644 index 0000000..97ab6d4 --- /dev/null +++ b/UnityLauncherPro/Controls/SearchBoxControl.xaml.cs @@ -0,0 +1,52 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; + +namespace UnityLauncherPro.Controls +{ + public partial class SearchBoxControl : UserControl + { + public event TextChangedEventHandler SearchTextChanged; + public event RoutedEventHandler SearchCleared; + + public event KeyEventHandler SearchKeyDown; + + public SearchBoxControl() + { + InitializeComponent(); + } + + public string SearchText + { + get { return txtSearchBox.Text; } + set { txtSearchBox.Text = value; } + } + + public new void Focus() + { + txtSearchBox.Focus(); + txtSearchBox.Select(txtSearchBox.Text.Length, 0); + } + + public void Clear() + { + txtSearchBox.Text = ""; + } + + private void TxtSearchBox_PreviewKeyDown(object sender, KeyEventArgs e) + { + SearchKeyDown?.Invoke(this, e); + } + + private void TxtSearchBox_TextChanged(object sender, TextChangedEventArgs e) + { + SearchTextChanged?.Invoke(this, e); + } + + private void OnClearSearchClick(object sender, RoutedEventArgs e) + { + Clear(); + SearchCleared?.Invoke(this, e); + } + } +} diff --git a/UnityLauncherPro/Converters/ThumbnailConverter.cs b/UnityLauncherPro/Converters/ThumbnailConverter.cs new file mode 100644 index 0000000..955194b --- /dev/null +++ b/UnityLauncherPro/Converters/ThumbnailConverter.cs @@ -0,0 +1,83 @@ +using System; +using System.Globalization; +using System.IO; +using System.Windows; +using System.Windows.Data; +using System.Windows.Media.Imaging; + +namespace UnityLauncherPro.Converters +{ + public class ThumbnailConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + // Return UnsetValue if no project is selected + if (value == null) + { + return DependencyProperty.UnsetValue; + } + + if (value is Project project) + { + if (!string.IsNullOrEmpty(project.Path)) + { + string thumbnailPath = Path.Combine(project.Path, "ProjectSettings", "icon.png"); + + if (File.Exists(thumbnailPath)) + { + try + { + // Check if this is for Width/Height parameter + if (parameter != null && (parameter.ToString() == "Width" || parameter.ToString() == "Height")) + { + return 64.0; // Return default dimension + } + + // For Source binding, load the bitmap + var bitmap = new BitmapImage(); + bitmap.BeginInit(); + bitmap.CacheOption = BitmapCacheOption.OnLoad; + bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache; + bitmap.UriSource = new Uri(thumbnailPath, UriKind.Absolute); + bitmap.DecodePixelWidth = 64; // Match your display size + bitmap.DecodePixelHeight = 64; + + bitmap.EndInit(); + + // Freeze for cross-thread access + if (bitmap.CanFreeze) + { + bitmap.Freeze(); + } + + return bitmap; + } + catch + { + // Ignore and fall back to UnsetValue for Source, or 64.0 for dimensions + if (parameter != null && (parameter.ToString() == "Width" || parameter.ToString() == "Height")) + { + return 1.0; + } + return DependencyProperty.UnsetValue; + } + } + } + + // Project path doesn't exist or no thumbnail found + if (parameter != null && (parameter.ToString() == "Width" || parameter.ToString() == "Height")) + { + return 1.0; // Return default dimension + } + return DependencyProperty.UnsetValue; + } + + return DependencyProperty.UnsetValue; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/UnityLauncherPro/Data/OnlineTemplateItem.cs b/UnityLauncherPro/Data/OnlineTemplateItem.cs new file mode 100644 index 0000000..6fe485f --- /dev/null +++ b/UnityLauncherPro/Data/OnlineTemplateItem.cs @@ -0,0 +1,38 @@ +using System.ComponentModel; +using System.Windows.Media.Imaging; + +namespace UnityLauncherPro.Data +{ + public class OnlineTemplateItem : INotifyPropertyChanged + { + private bool _isDownloaded; + + public string Name { get; set; } + public string Description { get; set; } + public string RenderPipeline { get; set; } + public string Type { get; set; } // Core, Learning, Sample, + public string PreviewImageURL { get; set; } + public BitmapImage PreviewImage { get; set; } + public string TarBallURL { get; set; } + + public bool IsDownloaded + { + get { return _isDownloaded; } + set + { + if (_isDownloaded != value) + { + _isDownloaded = value; + OnPropertyChanged(nameof(IsDownloaded)); + } + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } +} \ No newline at end of file diff --git a/UnityLauncherPro/Data/TemplateGraphQLResponse.cs b/UnityLauncherPro/Data/TemplateGraphQLResponse.cs new file mode 100644 index 0000000..32bdd91 --- /dev/null +++ b/UnityLauncherPro/Data/TemplateGraphQLResponse.cs @@ -0,0 +1,49 @@ +namespace UnityLauncherPro.Data +{ + public class TemplateGraphQLResponse + { + public TemplateData data { get; set; } + } + + public class TemplateData + { + public GetTemplates getTemplates { get; set; } + } + + public class GetTemplates + { + public TemplateEdge[] edges { get; set; } + } + + public class TemplateEdge + { + public TemplateNode node { get; set; } + } + + public class TemplateNode + { + public string name { get; set; } + public string packageName { get; set; } + public string description { get; set; } + public string type { get; set; } + public string renderPipeline { get; set; } + public PreviewImage previewImage { get; set; } + public TemplateVersion[] versions { get; set; } + } + + public class PreviewImage + { + public string url { get; set; } + } + + public class TemplateVersion + { + public string name { get; set; } + public Tarball tarball { get; set; } + } + + public class Tarball + { + public string url { get; set; } + } +} \ No newline at end of file diff --git a/UnityLauncherPro/GetProjects.cs b/UnityLauncherPro/GetProjects.cs index bb3ae29..1fbfa8e 100644 --- a/UnityLauncherPro/GetProjects.cs +++ b/UnityLauncherPro/GetProjects.cs @@ -13,12 +13,90 @@ public static class GetProjects static readonly string[] registryPathsToCheck = new string[] { @"SOFTWARE\Unity Technologies\Unity Editor 5.x", @"SOFTWARE\Unity Technologies\Unity Editor 4.x" }; // convert target platform name into valid buildtarget platform name, NOTE this depends on unity version, now only 2019 and later are supported - public static Dictionary remapPlatformNames = new Dictionary { { "StandaloneWindows64", "Win64" }, { "StandaloneWindows", "Win" }, { "Android", "Android" }, { "WebGL", "WebGL" } }; + public static Dictionary remapPlatformNames = new Dictionary { + { "StandaloneWindows64", "Win64" }, + { "StandaloneWindows", "Win" }, + { "Android", "Android" }, + { "WebGL", "WebGL" } }; public static List Scan(bool getGitBranch = false, bool getPlasticBranch = false, bool getArguments = false, bool showMissingFolders = false, bool showTargetPlatform = false, StringCollection AllProjectPaths = null, bool searchGitbranchRecursively = false, bool showSRP = false) { List projectsFound = new List(); + // first, scan projects from unity hub json file + VisitProjectsInUnityHubJson + ( + getGitBranch, getPlasticBranch, getArguments, + showMissingFolders, showTargetPlatform , searchGitbranchRecursively , showSRP, + project => + { + if (!projectsFound.ContainsProjectWithPath(project.Path)) + projectsFound.Add(project); + + // add found projects to history also (gets added only if its not already there) + Tools.AddProjectToHistory(project.Path); + }); + + // then scan projects from registry + VisitProjectsInRegistry + ( + getGitBranch, getPlasticBranch, getArguments, + showMissingFolders, showTargetPlatform , searchGitbranchRecursively , showSRP, + project => + { + if (!projectsFound.ContainsProjectWithPath(project.Path)) + projectsFound.Add(project); + + // TODO FIXME, this gets called everytime for same projects? + // add found projects to history also (gets added only if its not already there) + Tools.AddProjectToHistory(project.Path); + }); + + // NOTE those 40 projects should be added to custom list, otherwise they will disappear (since last item is not yet added to our list, until its launched once, so need to launch many projects, to start collecting history..) + // but then we would have to loop here again..? or add in the loop above..if doesnt exists on list, and the remove extra items from the end + + // scan info for custom folders (if not already on the list) + if (AllProjectPaths != null) + { + // iterate custom full projects history + foreach (var projectPath in AllProjectPaths) + { + // check if registry list contains this path already + // if not found from registry, add to recent projects list + if (!projectsFound.ContainsProjectWithPath(projectPath)) + { + var p = GetProjectInfo(projectPath, getGitBranch, getPlasticBranch, getArguments, showMissingFolders, showTargetPlatform, searchGitbranchRecursively, showSRP); + if (p != null) projectsFound.Add(p); + } + } + } + + // sometimes projects are in wrong order, seems to be related to messing up your unity registry, the keys are received in created order (so if you had removed/modified them manually, it might return wrong order instead of 0 - 40) + // sort by modified date, projects without modified date are put to last, NOTE: this would remove projects without modified date (if they become last items, before trimming list on next step) + projectsFound.Sort((x, y) => + { + if (x.Modified == null && y.Modified == null) return 0; // cannot be -1, https://stackoverflow.com/a/42821992/5452781 + if (x.Modified == null) return 1; + if (y.Modified == null) return -1; + return y.Modified.Value.CompareTo(x.Modified.Value); + //return x.Modified.Value.CompareTo(y.Modified.Value); // BUG this breaks something, so that last item platform is wrong (for project that is missing from disk) ? + }); + + // trim list to max amount (older ones are dropped) + if (projectsFound.Count > MainWindow.maxProjectCount) + { + //Console.WriteLine("Trimming projects list to " + MainWindow.maxProjectCount + " projects"); + projectsFound.RemoveRange(MainWindow.maxProjectCount, projectsFound.Count - MainWindow.maxProjectCount); + } + return projectsFound; + } // Scan() + + // visits each project stored in the Unity registry, invoking the visitor for each one + private static void VisitProjectsInRegistry( + bool getGitBranch, bool getPlasticBranch, bool getArguments, + bool showMissingFolders, bool showTargetPlatform , bool searchGitbranchRecursively , bool showSRP, + Action visitor) + { var hklm = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64); // check each version path @@ -59,67 +137,104 @@ public static List Scan(bool getGitBranch = false, bool getPlasticBranc // if want to hide project and folder path for screenshot //p.Title = "Example Project"; //p.Path = "C:/Projects/MyProj"; - if (p != null) { - projectsFound.Add(p); - - // TODO FIXME, this gets called everytime for same projects? - // add found projects to history also (gets added only if its not already there) - Tools.AddProjectToHistory(p.Path); + visitor(p); } } // valid key } // each key } // for each registry root + } // VisitProjectsInRegistry() - // NOTE those 40 projects should be added to custom list, otherwise they will disappear (since last item is not yet added to our list, until its launched once, so need to launch many projects, to start collecting history..) - // but then we would have to loop here again..? or add in the loop above..if doesnt exists on list, and the remove extra items from the end + private static void VisitProjectsInUnityHubJson( + bool getGitBranch, bool getPlasticBranch, bool getArguments, + bool showMissingFolders, bool showTargetPlatform , bool searchGitbranchRecursively , bool showSRP, + Action visitor) + { + string hubProjectsFile = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "UnityHub", "projects-v1.json"); - // scan info for custom folders (if not already on the list) - if (AllProjectPaths != null) + if (!File.Exists(hubProjectsFile)) + return; + + string json; + try { json = File.ReadAllText(hubProjectsFile); } + catch { return; } + + int dataIndex = json.IndexOf("\"data\":"); + if (dataIndex == -1) return; + + // find the opening { of the data object + int dataStart = json.IndexOf('{', dataIndex + 7); + if (dataStart == -1) return; + + int searchFrom = dataStart + 1; + while (true) { - // iterate custom full projects history - foreach (var projectPath in AllProjectPaths) + // find the start of the next project entry object + int entryStart = json.IndexOf('{', searchFrom); + if (entryStart == -1) break; + + // find the matching closing } + int entryEnd = JsonParser.FindMatchingBrace(json, entryStart); + if (entryEnd == -1) break; + + string entry = json.Substring(entryStart, entryEnd - entryStart + 1); + + string projectPath = JsonParser.GetStringValue(entry, "path"); + if (!string.IsNullOrEmpty(projectPath)) { - // check if registry list contains this path already, then skip it - bool found = false; - for (int i = 0, len = projectsFound.Count; i < len; i++) + // unescape JSON backslashes and convert to normal path separators + projectPath = projectPath.Replace(@"\\", @"/"); + + // collect project info from disk, but override with hub json data where its more authoritative + // todo: an optimization could be to only get data from disk that is missing from json, + // instead of getting all data and then overriding. + var p = GetProjectInfo(projectPath, getGitBranch, getPlasticBranch, getArguments, showMissingFolders, showTargetPlatform, searchGitbranchRecursively, showSRP); + if (p != null) { - if (projectsFound[i].Path == projectPath) + string title = JsonParser.GetStringValue(entry, "title"); + if (!string.IsNullOrEmpty(title)) p.Title = title; + + // NOTE: this has changed in newer hub versions? (not checking from folder anymore?) + // lastModified is a Unix millisecond timestamp + string lastModifiedStr = JsonParser.GetNumberValue(entry, "lastModified"); + if (long.TryParse(lastModifiedStr, out long lastModifiedMs)) + p.Modified = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(lastModifiedMs).ToLocalTime(); + + string version = JsonParser.GetStringValue(entry, "version"); + if (!string.IsNullOrEmpty(version)) p.Version = version; + + if (showTargetPlatform) { - found = true; - break; + string buildTarget = JsonParser.GetStringValue(entry, "buildTarget"); + p.TargetPlatform = Tools.GetTargetPlatformFromRaw(buildTarget); } - } - // if not found from registry, add to recent projects list - if (found == false) - { - var p = GetProjectInfo(projectPath, getGitBranch, getPlasticBranch, getArguments, showMissingFolders, showTargetPlatform, searchGitbranchRecursively, showSRP); - if (p != null) projectsFound.Add(p); + if (showSRP) + { + string renderPipeline = JsonParser.GetStringValue(entry, "renderPipeline"); + if (!string.IsNullOrEmpty(renderPipeline)) p.SRP = renderPipeline; + } + + visitor(p); } } - } - // sometimes projects are in wrong order, seems to be related to messing up your unity registry, the keys are received in created order (so if you had removed/modified them manually, it might return wrong order instead of 0 - 40) - // sort by modified date, projects without modified date are put to last, NOTE: this would remove projects without modified date (if they become last items, before trimming list on next step) - projectsFound.Sort((x, y) => - { - if (x.Modified == null && y.Modified == null) return 0; // cannot be -1, https://stackoverflow.com/a/42821992/5452781 - if (x.Modified == null) return 1; - if (y.Modified == null) return -1; - return y.Modified.Value.CompareTo(x.Modified.Value); - //return x.Modified.Value.CompareTo(y.Modified.Value); // BUG this breaks something, so that last item platform is wrong (for project that is missing from disk) ? - }); + searchFrom = entryEnd + 1; + } + } - // trim list to max amount (older ones are dropped) - if (projectsFound.Count > MainWindow.maxProjectCount) + private static bool ContainsProjectWithPath(this List projects, string projectPath) + { + foreach (var p in projects) { - //Console.WriteLine("Trimming projects list to " + MainWindow.maxProjectCount + " projects"); - projectsFound.RemoveRange(MainWindow.maxProjectCount, projectsFound.Count - MainWindow.maxProjectCount); + if (string.Equals(p.Path, projectPath, StringComparison.OrdinalIgnoreCase)) + return true; } - return projectsFound; - } // Scan() + return false; + } static Project GetProjectInfo(string projectPath, bool getGitBranch = false, bool getPlasticBranch = false, bool getArguments = false, bool showMissingFolders = false, bool showTargetPlatform = false, bool searchGitbranchRecursively = false, bool showSRP = false) { @@ -221,6 +336,12 @@ public static bool RemoveRecentProject(string projectPathToRemove) { bool result = false; + if (RemoveProjectFromUnityHubJson(projectPathToRemove)) + { + //Console.WriteLine("Deleted Unity Hub project item: " + projectPathToRemove); + result = true; + } + var hklm = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64); // check each version path @@ -282,10 +403,115 @@ public static bool RemoveRecentProject(string projectPathToRemove) result = true; } - return result; } // RemoveRecentProject() + private static bool RemoveProjectFromUnityHubJson(string projectPathToRemove) + { + string hubProjectsFile = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "UnityHub", "projects-v1.json"); + + if (!File.Exists(hubProjectsFile)) + return false; + + string json; + + try + { + json = File.ReadAllText(hubProjectsFile); + } + catch + { + return false; + } + + string wantedPath = NormalizeProjectPath(projectPathToRemove); + + int dataIndex = json.IndexOf("\"data\":"); + if (dataIndex == -1) + return false; + + int dataStart = json.IndexOf('{', dataIndex + 7); + if (dataStart == -1) + return false; + + int searchFrom = dataStart + 1; + + while (true) + { + int entryStart = json.IndexOf('{', searchFrom); + if (entryStart == -1) + break; + + int entryEnd = JsonParser.FindMatchingBrace(json, entryStart); + if (entryEnd == -1) + break; + + string entry = json.Substring(entryStart, entryEnd - entryStart + 1); + string projectPath = JsonParser.GetStringValue(entry, "path"); + + if (!string.IsNullOrEmpty(projectPath)) + { + projectPath = NormalizeProjectPath(projectPath); + + if (string.Equals(projectPath, wantedPath, StringComparison.OrdinalIgnoreCase)) + { + int removeStart = entryStart; + int removeEnd = entryEnd + 1; + + // Prefer removing comma after this object. + int i = removeEnd; + while (i < json.Length && char.IsWhiteSpace(json[i])) + i++; + + if (i < json.Length && json[i] == ',') + { + removeEnd = i + 1; + } + else + { + // Otherwise remove comma before this object. + i = removeStart - 1; + while (i >= 0 && char.IsWhiteSpace(json[i])) + i--; + + if (i >= 0 && json[i] == ',') + removeStart = i; + } + + json = json.Remove(removeStart, removeEnd - removeStart); + + try + { + File.WriteAllText(hubProjectsFile, json); + return true; + } + catch + { + return false; + } + } + } + + searchFrom = entryEnd + 1; + } + + return false; + } + + private static string NormalizeProjectPath(string path) + { + if (string.IsNullOrEmpty(path)) + return ""; + + return path + .Replace(@"\\", "/") + .Replace("\\", "/") + .Trim() + .TrimEnd('/'); + } + } // class } // namespace diff --git a/UnityLauncherPro/GetUnityInstallations.cs b/UnityLauncherPro/GetUnityInstallations.cs index 7f4570d..28a0a31 100644 --- a/UnityLauncherPro/GetUnityInstallations.cs +++ b/UnityLauncherPro/GetUnityInstallations.cs @@ -48,7 +48,23 @@ public static List Scan() var haveUninstaller = File.Exists(uninstallExe); var exePath = Path.Combine(editorFolder, "Unity.exe"); - if (File.Exists(exePath) == false) continue; + +// bool supportTuanjie = true; + if (File.Exists(exePath) == false) + { + //if (supportTuanjie == false) + { + continue; + } + //else + //{ + // exePath = Path.Combine(editorFolder, "Tuanjie.exe"); + // if (File.Exists(exePath) == false) + // { + // continue; + // } + //} + } // get full version number from uninstaller (or try exe, if no uninstaller) var version = Tools.GetFileVersionData(haveUninstaller ? uninstallExe : exePath); diff --git a/UnityLauncherPro/GetUnityUpdates.cs b/UnityLauncherPro/GetUnityUpdates.cs index 8384fcd..692dcef 100644 --- a/UnityLauncherPro/GetUnityUpdates.cs +++ b/UnityLauncherPro/GetUnityUpdates.cs @@ -385,17 +385,54 @@ private static string GetStringValue(string source, string propertyName) private static List LoadCachedVersions() { - string configFilePath = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath; + string configFilePath = ConfigurationManager + .OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal) + .FilePath; + string configDirectory = Path.GetDirectoryName(configFilePath); - if (configDirectory == null) return new List(); + if (string.IsNullOrEmpty(configDirectory)) + return new List(); + + Directory.CreateDirectory(configDirectory); string cacheFilePath = Path.Combine(configDirectory, CacheFileName); - if (!File.Exists(cacheFilePath)) return new List(); - Console.WriteLine("cache file: " + cacheFilePath); + // copy from embedded resource on first run + if (!File.Exists(cacheFilePath)) + { + try + { + string resourceName = $"{typeof(GetUnityUpdates).Namespace}.Resources.{CacheFileName}"; + using (var stream = typeof(GetUnityUpdates).Assembly.GetManifestResourceStream(resourceName)) + { + if (stream != null) + { + using (var fileStream = File.Create(cacheFilePath)) + { + stream.CopyTo(fileStream); + } + } + else + { + return new List(); + } + } + } + catch + { + return new List(); + } + } - string json = File.ReadAllText(cacheFilePath); - return ParseCachedUnityVersions(json); + try + { + string json = File.ReadAllText(cacheFilePath); + return ParseCachedUnityVersions(json); + } + catch + { + return new List(); + } } private static void SaveCachedVersions(List versions) diff --git a/UnityLauncherPro/Helpers/Github.cs b/UnityLauncherPro/Helpers/Github.cs new file mode 100644 index 0000000..b81410b --- /dev/null +++ b/UnityLauncherPro/Helpers/Github.cs @@ -0,0 +1,487 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; +using System.Security.Cryptography; +using System.Diagnostics; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace UnityLauncherPro.Helpers +{ + public class GitHubTokenValidationResult + { + public bool IsValid { get; set; } + public string Login { get; set; } + public string Name { get; set; } + public string Error { get; set; } + public HttpStatusCode StatusCode { get; set; } + } + + public class GitHubCreateRepoResult + { + public bool Success { get; set; } + public string Name { get; set; } + //public string FullName { get; set; } + //public string HtmlUrl { get; set; } + //public string CloneUrl { get; set; } + //public string SshUrl { get; set; } + public string Error { get; set; } + public HttpStatusCode StatusCode { get; set; } + } + + public static class GithubActions + { + + public static async Task CreateRepositoryAsync(string token, string repoName, string description = "", bool isPrivate = true, bool autoInit = false, string organization = null) + { + if (string.IsNullOrWhiteSpace(token)) + { + return new GitHubCreateRepoResult + { + Success = false, + Error = "Token is empty." + }; + } + + if (string.IsNullOrWhiteSpace(repoName)) + { + return new GitHubCreateRepoResult + { + Success = false, + Error = "Repository name is empty." + }; + } + + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + using (var client = new HttpClient()) + { + client.DefaultRequestHeaders.UserAgent.ParseAdd(MainWindow.appName); + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("Bearer", token.Trim()); + + client.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.github+json"); + client.DefaultRequestHeaders.Add("X-GitHub-Api-Version", "2022-11-28"); + + var json = ('{' + + $"\"name\": \"{repoName}\"," + + $"\"description\": \"{description ?? ""}\"," + + $"\"private\": {isPrivate.ToString().ToLower()}," + + $"\"auto_init\": {autoInit.ToString().ToLower()}" + + '}'); + + using (var content = new StringContent(json, Encoding.UTF8, "application/json")) + { + HttpResponseMessage response; + var endpoint = string.IsNullOrWhiteSpace(organization) + ? "https://api.github.com/user/repos" + : "https://api.github.com/orgs/" + Uri.EscapeDataString(organization.Trim()) + "/repos"; + + try + { + response = await client.PostAsync(endpoint, content); + } + catch (Exception ex) + { + return new GitHubCreateRepoResult + { + Success = false, + Error = "Request failed: " + ex.Message + }; + } + + string responseText = await response.Content.ReadAsStringAsync(); + + if (response.IsSuccessStatusCode) + { + return new GitHubCreateRepoResult + { + Success = true, + StatusCode = response.StatusCode + //Name = (string)result["name"], + //FullName = (string)result["full_name"], + //HtmlUrl = (string)result["html_url"], + //CloneUrl = (string)result["clone_url"], + //SshUrl = (string)result["ssh_url"] + }; + } + + return new GitHubCreateRepoResult + { + Success = false, + StatusCode = response.StatusCode, + Error = "GitHub API error: " + + (int)response.StatusCode + " " + + response.ReasonPhrase + "\n" + + responseText + }; + } + } + } + + public static async Task> GetUserOrganizationsAsync(string token) + { + var organizations = new List(); + + if (string.IsNullOrWhiteSpace(token)) return organizations; + + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + using (var client = new HttpClient()) + { + client.DefaultRequestHeaders.UserAgent.ParseAdd(MainWindow.appName); + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("Bearer", token.Trim()); + + client.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.github+json"); + client.DefaultRequestHeaders.Add("X-GitHub-Api-Version", "2022-11-28"); + + HttpResponseMessage response; + + try + { + response = await client.GetAsync("https://api.github.com/user/orgs"); + } + catch + { + return organizations; + } + + if (!response.IsSuccessStatusCode) return organizations; + + string responseText = await response.Content.ReadAsStringAsync(); + var matches = Regex.Matches(responseText, "\"login\"\\s*:\\s*\"([^\"]+)\""); + + for (int i = 0; i < matches.Count; i++) + { + organizations.Add(matches[i].Groups[1].Value); + } + } + + return organizations; + } + + public static async Task InitRepositoryAsync(string baseDir, string projectName, bool initGitLfs = false, string defaultBranch = "main") + { + string projectPath = string.IsNullOrWhiteSpace(projectName) + ? Path.GetFullPath(baseDir) + : Path.GetFullPath(Path.Combine(baseDir, projectName)); + + if (!Directory.Exists(projectPath)) Directory.CreateDirectory(projectPath); + + // Git 2.28+ supports --initial-branch + await RunGitAsync(projectPath, "init --initial-branch=\"" + defaultBranch + "\""); + + string gitignorePath = Path.Combine(projectPath, ".gitignore"); + + if (initGitLfs) + { + try + { + // Local repo setup. Requires Git LFS to be installed on the user's machine. + await RunGitAsync(projectPath, "lfs install --local"); + } + catch + { + // Git repo is still valid even if LFS init fails. + // Log this in your app if you have a logger. + } + } + + return projectPath; + } + + public static async Task RunGitAsync(string workingDirectory, string arguments) + { + await Task.Run(delegate + { + var startInfo = new ProcessStartInfo + { + FileName = "git", + Arguments = arguments, + WorkingDirectory = workingDirectory, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true + }; + + Console.WriteLine("run " + startInfo.FileName + " " + startInfo.Arguments); + + using (var process = new Process()) + { + process.StartInfo = startInfo; + + process.Start(); + + string output = process.StandardOutput.ReadToEnd(); + string error = process.StandardError.ReadToEnd(); + + process.WaitForExit(); + + if (process.ExitCode != 0) + { + Console.WriteLine("failed to run git command: " + error); + throw new Exception( + "Git command failed:\n" + + "git " + arguments + "\n\n" + + "Output:\n" + output + "\n\n" + + "Error:\n" + error); + } + } + }); + } + + + + + // checks if repo is valid and if it already exists in the user's account. Returns null if valid, otherwise an error message. + public static async Task ValidateRepoName(string repoName, string userName) + { + // validate string locally + if (string.IsNullOrEmpty(repoName)) return "Repository name cannot be empty."; + + // regex "The repository name can only contain ASCII letters, digits, and the characters ., -, and _." + if (!System.Text.RegularExpressions.Regex.IsMatch(repoName, @"^[a-zA-Z0-9._-]+$")) return "Repository name can only contain letters, digits, ., -, and _."; + + // check if repo already exists in user's account + var token = GitHubTokenStore.LoadToken(); + if (string.IsNullOrWhiteSpace(token)) return "No GitHub token found. Please set a token first."; + + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + using (var client = new HttpClient()) + { + client.DefaultRequestHeaders.UserAgent.ParseAdd(MainWindow.appName); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Trim()); + client.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.github+json"); + client.DefaultRequestHeaders.Add("X-GitHub-Api-Version", "2022-11-28"); + + HttpResponseMessage response; + try + { + response = await client.GetAsync($"https://api.github.com/repos/{userName}/{repoName}"); + } + catch (Exception ex) + { + return "Request failed: " + ex.Message; + } + + if (response.StatusCode == HttpStatusCode.OK) + return $"Repository '{repoName}' already exists in your account."; + + if (response.StatusCode == HttpStatusCode.NotFound) + return null; // repo does not exist, name is available + + string responseText = await response.Content.ReadAsStringAsync(); + return $"Unexpected GitHub response: {(int)response.StatusCode} {response.ReasonPhrase}\n{responseText}"; + } + } + + + } // GithubActions class + + public static class GitHubAuth + { + public static async Task ValidateTokenAsync(string token) + { + if (string.IsNullOrWhiteSpace(token)) + { + return new GitHubTokenValidationResult + { + IsValid = false, + Error = "Token is empty" + }; + } + + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + using (var client = new HttpClient()) + { + client.DefaultRequestHeaders.UserAgent.ParseAdd(MainWindow.appName); + client.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("Bearer", token.Trim()); + + client.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.github+json"); + client.DefaultRequestHeaders.Add("X-GitHub-Api-Version", "2022-11-28"); + + HttpResponseMessage response; + + try + { + response = await client.GetAsync("https://api.github.com/user"); + } + catch (Exception ex) + { + return new GitHubTokenValidationResult + { + IsValid = false, + Error = "Request failed: " + ex.Message + }; + } + + string responseText = await response.Content.ReadAsStringAsync(); + + if (response.StatusCode == HttpStatusCode.OK) + { + return new GitHubTokenValidationResult + { + IsValid = true, + Login = JsonParser.GetStringValue(responseText, "login"), + Name = JsonParser.GetStringValue(responseText, "name"), + StatusCode = response.StatusCode + }; + } + + if (response.StatusCode == HttpStatusCode.Unauthorized) + { + return new GitHubTokenValidationResult + { + IsValid = false, + StatusCode = response.StatusCode, + Error = "Invalid, expired, or revoked GitHub token" + }; + } + + if (response.StatusCode == HttpStatusCode.Forbidden) + { + return new GitHubTokenValidationResult + { + IsValid = false, + StatusCode = response.StatusCode, + Error = "GitHub rejected the request. This may be a rate limit or permission issue." + }; + } + + return new GitHubTokenValidationResult + { + IsValid = false, + StatusCode = response.StatusCode, + Error = "Unexpected GitHub response: " + (int)response.StatusCode + " " + response.ReasonPhrase + "\n" + responseText + }; + } + } + } // GitHubAuth class + + + public static class GitHubTokenStore + { + private static readonly string FolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), MainWindow.appName); + private static readonly string FilePath = Path.Combine(FolderPath, MainWindow.appName + ".dat"); + + public static void SaveToken(string token, string username) + { + if (string.IsNullOrWhiteSpace(token)) throw new ArgumentException("Token is empty.", "token"); + + if (!Directory.Exists(FolderPath)) Directory.CreateDirectory(FolderPath); + + string payload = BuildPayload(token, username); + byte[] plainBytes = Encoding.UTF8.GetBytes(payload); + byte[] encryptedBytes = ProtectedData.Protect(plainBytes, null, DataProtectionScope.CurrentUser); + File.WriteAllBytes(FilePath, encryptedBytes); + } + + public static string LoadToken() + { + return LoadValue("token"); + } + + public static string LoadUsername() + { + return LoadValue("username"); + } + + private static string LoadValue(string key) + { + string payload = LoadPayload(); + if (string.IsNullOrWhiteSpace(payload)) return null; + + return ReadValue(payload, key); + } + + private static string LoadPayload() + { + if (!File.Exists(FilePath)) + return null; + + try + { + byte[] encryptedBytes = File.ReadAllBytes(FilePath); + + byte[] plainBytes = ProtectedData.Unprotect(encryptedBytes, null, DataProtectionScope.CurrentUser); + return Encoding.UTF8.GetString(plainBytes); + } + catch + { + return null; + } + } + + private static string BuildPayload(string token, string username) + { + return "token=" + EscapeValue(token) + "\nusername=" + EscapeValue(username); + } + + private static string ReadValue(string payload, string key) + { + string prefix = key + "="; + string[] lines = payload.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + + for (int i = 0; i < lines.Length; i++) + { + string line = lines[i]; + if (!line.StartsWith(prefix, StringComparison.Ordinal)) continue; + return UnescapeValue(line.Substring(prefix.Length)); + } + + return null; + } + + private static string EscapeValue(string value) + { + if (value == null) return string.Empty; + return value.Replace("\\", "\\\\").Replace("\r", "\\r").Replace("\n", "\\n"); + } + + private static string UnescapeValue(string value) + { + if (string.IsNullOrEmpty(value)) return value; + + var builder = new StringBuilder(value.Length); + for (int i = 0; i < value.Length; i++) + { + char c = value[i]; + if (c == '\\' && i + 1 < value.Length) + { + i++; + char next = value[i]; + if (next == 'r') builder.Append('\r'); + else if (next == 'n') builder.Append('\n'); + else builder.Append(next); + } + else + { + builder.Append(c); + } + } + + return builder.ToString(); + } + + public static void DeleteToken() + { + if (File.Exists(FilePath)) + File.Delete(FilePath); + } + + public static bool HasToken() + { + return !string.IsNullOrWhiteSpace(LoadToken()); + } + } + +} // namespace diff --git a/UnityLauncherPro/Helpers/JsonParser.cs b/UnityLauncherPro/Helpers/JsonParser.cs new file mode 100644 index 0000000..7ea3c35 --- /dev/null +++ b/UnityLauncherPro/Helpers/JsonParser.cs @@ -0,0 +1,72 @@ +namespace UnityLauncherPro +{ + internal static class JsonParser + { + // finds the index of the closing } matching the opening { at startIndex + internal static int FindMatchingBrace(string json, int startIndex) + { + int depth = 0; + for (int i = startIndex; i < json.Length; i++) + { + if (json[i] == '{') depth++; + else if (json[i] == '}') { depth--; if (depth == 0) return i; } + } + return -1; + } + + // extracts a JSON string value for the given key + internal static string GetStringValue(string json, string key) + { + int keyIndex = json.IndexOf("\"" + key + "\":"); + if (keyIndex == -1) return null; + int valueStart = json.IndexOf('"', keyIndex + key.Length + 2) + 1; + if (valueStart == 0) return null; + int valueEnd = json.IndexOf('"', valueStart); + if (valueEnd == -1) return null; + return json.Substring(valueStart, valueEnd - valueStart); + } + + // extracts a JSON number value for the given key (returned as string for flexibility) + internal static string GetNumberValue(string json, string key) + { + int keyIndex = json.IndexOf("\"" + key + "\":"); + if (keyIndex == -1) return null; + int valueStart = keyIndex + key.Length + 3; // skip past "key": + while (valueStart < json.Length && json[valueStart] == ' ') valueStart++; + int valueEnd = valueStart; + while (valueEnd < json.Length && (char.IsDigit(json[valueEnd]) || json[valueEnd] == '-')) valueEnd++; + return valueEnd > valueStart ? json.Substring(valueStart, valueEnd - valueStart) : null; + } + + internal static string ExtractJsonString(string json, string key) + { + int keyIndex = json.IndexOf(key + ":"); + if (keyIndex == -1) return null; + + int valueStart = json.IndexOf("\"", keyIndex + key.Length + 1); + if (valueStart == -1) return null; + + int valueEnd = json.IndexOf("\"", valueStart + 1); + if (valueEnd == -1) return null; + + return json.Substring(valueStart + 1, valueEnd - valueStart - 1); + } + + internal static string ExtractNestedJsonString(string json, string parentKey, string childKey) + { + int parentIndex = json.IndexOf(parentKey + ":"); + if (parentIndex == -1) return null; + + // Find the object after parentKey + int objectStart = json.IndexOf("{", parentIndex); + if (objectStart == -1) return null; + + int objectEnd = JsonParser.FindMatchingBrace(json, objectStart); + if (objectEnd == -1) return null; + + string nestedJson = json.Substring(objectStart, objectEnd - objectStart + 1); + return ExtractJsonString(nestedJson, childKey); + } + + } // class +} // namespace diff --git a/UnityLauncherPro/Helpers/ProcessHandler.cs b/UnityLauncherPro/Helpers/ProcessHandler.cs index 8728e4d..d350a7a 100644 --- a/UnityLauncherPro/Helpers/ProcessHandler.cs +++ b/UnityLauncherPro/Helpers/ProcessHandler.cs @@ -11,7 +11,7 @@ namespace UnityLauncherPro.Helpers { public static class ProcessHandler { - static Dictionary processes = new Dictionary(); + static Dictionary processes = new Dictionary(); public static void Add(Project proj, Process proc) { @@ -21,11 +21,11 @@ public static void Add(Project proj, Process proc) if (processes.ContainsKey(key)) { // already in the list, maybe trying to launch same project twice? only overwrite if previous process has closed - if (processes[key] == null) processes[key] = proc; + if (processes[key].Item1 == null) processes[key] = (proc, proj); } else { - processes.Add(key, proc); + processes.Add(key, (proc, proj)); } // subscribe to process exit here, so that can update proj details row (if it was changed in Unity) @@ -45,13 +45,35 @@ public static void Add(Project proj, Process proc) public static Process Get(string key) { - if (processes.ContainsKey(key)) return processes[key]; + if (processes.ContainsKey(key) && (processes[key].Item1 != null)) + { + return processes[key].Item1; + } return null; } + // return project for given key + //public static Project GetProject(string key) + //{ + // if (processes.ContainsKey(key) && (processes[key].Item2 != null)) + // { + // return processes[key].Item2; + // } + // return null; + //} + public static bool IsRunning(string key) { - return processes.ContainsKey(key) && (processes[key] != null); + return processes.ContainsKey(key) && (processes[key].Item1 != null); + } + + public static Project GetSingleRunning() + { + if (processes.Count != 1) return null; + var enumerator = processes.Values.GetEnumerator(); + enumerator.MoveNext(); + var entry = enumerator.Current; + return entry.Item1 != null ? entry.Item2 : null; } public static void Remove(string key) diff --git a/UnityLauncherPro/Libraries/ExtractTarGz.cs b/UnityLauncherPro/Libraries/ExtractTarGz.cs index 04517d1..e55e44a 100644 --- a/UnityLauncherPro/Libraries/ExtractTarGz.cs +++ b/UnityLauncherPro/Libraries/ExtractTarGz.cs @@ -1,6 +1,3 @@ -// source https://gist.github.com/Su-s/438be493ae692318c73e30367cbc5c2a -// updated source https://gist.github.com/Matheos96/da8990030dfe3e27b0a48722042d9c0b - using System; using System.IO; using System.IO.Compression; @@ -11,10 +8,8 @@ namespace TarLib public class Tar { /// - /// Extracts a .tar.gz archive to the specified directory. + /// Extracts a .tar.gz archive to the specified directory. /// - /// The .tar.gz to decompress and extract. - /// Output directory to write the files. public static void ExtractTarGz(string filename, string outputDir) { using (var stream = File.OpenRead(filename)) @@ -24,39 +19,29 @@ public static void ExtractTarGz(string filename, string outputDir) } /// - /// Extracts a .tar.gz archive stream to the specified directory. + /// Extracts a .tar.gz archive stream to the specified directory. /// - /// The .tar.gz to decompress and extract. - /// Output directory to write the files. public static void ExtractTarGz(Stream stream, string outputDir) { - int read; - const int chunk = 4096; + const int chunk = 4096*4; var buffer = new byte[chunk]; - // A GZipStream is not seekable, so copy it first to a MemoryStream using (var gzipStream = new GZipStream(stream, CompressionMode.Decompress)) + using (var memStream = new MemoryStream()) { - using (var memStream = new MemoryStream()) + int read; + while ((read = gzipStream.Read(buffer, 0, buffer.Length)) > 0) { - //For .NET 6+ - while ((read = gzipStream.Read(buffer, 0, buffer.Length)) > 0) - { - memStream.Write(buffer, 0, read); - } - memStream.Seek(0, SeekOrigin.Begin); - - //ExtractTar(gzip, outputDir); - ExtractTar(memStream, outputDir); + memStream.Write(buffer, 0, read); } + memStream.Seek(0, SeekOrigin.Begin); + ExtractTar(memStream, outputDir); } } /// - /// Extractes a tar archive to the specified directory. + /// Extracts a tar archive file. /// - /// The .tar to extract. - /// Output directory to write the files. public static void ExtractTar(string filename, string outputDir) { using (var stream = File.OpenRead(filename)) @@ -66,85 +51,206 @@ public static void ExtractTar(string filename, string outputDir) } /// - /// Extractes a tar archive to the specified directory. + /// Extracts a tar archive stream. + /// Fixes path loss caused by ignoring the POSIX 'prefix' field and wrong header offsets. /// - /// The .tar to extract. - /// Output directory to write the files. public static void ExtractTar(Stream stream, string outputDir) { - var buffer = new byte[100]; - var longFileName = string.Empty; + // Tar header constants + const int HeaderSize = 512; + byte[] header = new byte[HeaderSize]; + + string pendingLongName = null; // For GNU long name ('L') entries + while (true) { - stream.Read(buffer, 0, 100); - string name = string.IsNullOrEmpty(longFileName) ? Encoding.ASCII.GetString(buffer).Trim('\0') : longFileName; //Use longFileName if we have one read - - if (String.IsNullOrWhiteSpace(name)) break; - stream.Seek(24, SeekOrigin.Current); - stream.Read(buffer, 0, 12); - var size = Convert.ToInt64(Encoding.UTF8.GetString(buffer, 0, 12).Trim('\0').Trim(), 8); - stream.Seek(20, SeekOrigin.Current); //Move head to typeTag byte - var typeTag = stream.ReadByte(); - stream.Seek(355L, SeekOrigin.Current); //Move head to beginning of data (byte 512) - - if (typeTag == 'L') + int bytesRead = ReadExact(stream, header, 0, HeaderSize); + if (bytesRead == 0) break; // End of stream + if (bytesRead < HeaderSize) throw new EndOfStreamException("Unexpected end of tar stream."); + + // Detect two consecutive zero blocks (end of archive) + bool allZero = IsAllZero(header); + if (allZero) + { + // Peek next block; if also zero -> end + bytesRead = ReadExact(stream, header, 0, HeaderSize); + if (bytesRead == 0 || IsAllZero(header)) break; + if (bytesRead < HeaderSize) throw new EndOfStreamException("Unexpected end of tar stream."); + } + + // Parse fields (POSIX ustar) + string name = GetString(header, 0, 100); + string mode = GetString(header, 100, 8); + string uid = GetString(header, 108, 8); + string gid = GetString(header, 116, 8); + string sizeOctal = GetString(header, 124, 12); + string mtime = GetString(header, 136, 12); + string checksum = GetString(header, 148, 8); + char typeFlag = (char)header[156]; + string linkName = GetString(header, 157, 100); + string magic = GetString(header, 257, 6); // "ustar\0" or "ustar " + string version = GetString(header, 263, 2); + string uname = GetString(header, 265, 32); + string gname = GetString(header, 297, 32); + string prefix = GetString(header, 345, 155); + + // Compose full name using prefix (if present and not using GNU long name override) + if (!string.IsNullOrEmpty(prefix)) + { + name = prefix + "/" + name; + } + + // If we previously read a GNU long name block, override current name + if (!string.IsNullOrEmpty(pendingLongName)) { - //If Type Tag is 'L' we have a filename that is longer than the 100 bytes reserved for it in the header. - //We read it here and save it temporarily as it will be the file name of the next block where the actual data is - var buf = new byte[size]; - stream.Read(buf, 0, buf.Length); - longFileName = Encoding.ASCII.GetString(buf).Trim('\0'); + name = pendingLongName; + pendingLongName = null; } - else + + long size = ParseOctal(sizeOctal); + + // Handle GNU long name extension block: the data of this entry is the filename of next entry. + if (typeFlag == 'L') { - longFileName = string.Empty; //Reset longFileName if current entry is not indicating one + byte[] longNameData = new byte[size]; + ReadExact(stream, longNameData, 0, (int)size); + pendingLongName = Encoding.ASCII.GetString(longNameData).Trim('\0', '\r', '\n'); + SkipPadding(stream, size); + continue; // Move to next header + } + + // Skip PAX extended header (type 'x') - metadata only + if (typeFlag == 'x') + { + SkipData(stream, size); + SkipPadding(stream, size); + continue; + } + + // Normalize name + if (string.IsNullOrWhiteSpace(name)) continue; - var output = Path.Combine(outputDir, name); + // Directory? + bool isDirectory = typeFlag == '5' || name.EndsWith("/"); - // only include these folders - var include = (output.IndexOf("package/ProjectData~/Assets/") > -1); - include |= (output.IndexOf("package/ProjectData~/ProjectSettings/") > -1); - include |= (output.IndexOf("package/ProjectData~/Packages/") > -1); + // Inclusion filter (original logic) + string originalName = name; + bool include = + originalName.IndexOf("package/ProjectData~/Assets/", StringComparison.Ordinal) > -1 || + originalName.IndexOf("package/ProjectData~/ProjectSettings/", StringComparison.Ordinal) > -1 || + originalName.IndexOf("package/ProjectData~/Library/", StringComparison.Ordinal) > -1 || + originalName.IndexOf("package/ProjectData~/Packages/", StringComparison.Ordinal) > -1; - // rename output path from "package/ProjectData~/Assets/" into "Assets/" - output = output.Replace("package/ProjectData~/", ""); + // Strip leading prefix. + string cleanedName = originalName.StartsWith("package/ProjectData~/", StringComparison.Ordinal) + ? originalName.Substring("package/ProjectData~/".Length) + : originalName; + + string finalPath = Path.Combine(outputDir, cleanedName.Replace('/', Path.DirectorySeparatorChar)); + + if (isDirectory) + { + if (include && !Directory.Exists(finalPath)) + Directory.CreateDirectory(finalPath); + // No data to read for directory; continue to next header + SkipData(stream, size); // size should be 0 + SkipPadding(stream, size); + continue; + } + + // Ensure directory exists + if (include) + { + string dir = Path.GetDirectoryName(finalPath); + if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) + Directory.CreateDirectory(dir); + } - if (include == true && !Directory.Exists(Path.GetDirectoryName(output))) Directory.CreateDirectory(Path.GetDirectoryName(output)); + // Read file data (always advance stream even if not included) + byte[] fileData = new byte[size]; + ReadExact(stream, fileData, 0, (int)size); - // not folder - //if (name.Equals("./", StringComparison.InvariantCulture) == false) - if (name.EndsWith("/") == false) //Directories are zero size and don't need anything written + if (include) + { + using (var fs = File.Open(finalPath, FileMode.Create, FileAccess.Write)) { - if (include == true) - { - //Console.WriteLine("output=" + output); - using (var str = File.Open(output, FileMode.OpenOrCreate, FileAccess.ReadWrite)) - { - var buf = new byte[size]; - stream.Read(buf, 0, buf.Length); - // take only data from this folder - str.Write(buf, 0, buf.Length); - } - } - else - { - var buf = new byte[size]; - stream.Read(buf, 0, buf.Length); - } + fs.Write(fileData, 0, fileData.Length); } } - //Move head to next 512 byte block - var pos = stream.Position; - var offset = 512 - (pos % 512); - if (offset == 512) offset = 0; + // Skip padding to 512 boundary + SkipPadding(stream, size); + } + } - stream.Seek(offset, SeekOrigin.Current); + private static string GetString(byte[] buffer, int offset, int length) + { + var s = Encoding.ASCII.GetString(buffer, offset, length); + int nullIndex = s.IndexOf('\0'); + if (nullIndex >= 0) s = s.Substring(0, nullIndex); + return s.Trim(); + } + + private static long ParseOctal(string s) + { + s = s.Trim(); + if (string.IsNullOrEmpty(s)) return 0; + try + { + return Convert.ToInt64(s, 8); + } + catch + { + // Fallback: treat as decimal if malformed + long val; + return long.TryParse(s, out val) ? val : 0; } } - } // class Tar -} // namespace TarLib + private static bool IsAllZero(byte[] buffer) + { + for (int i = 0; i < buffer.Length; i++) + if (buffer[i] != 0) return false; + return true; + } + + private static int ReadExact(Stream stream, byte[] buffer, int offset, int count) + { + int total = 0; + while (total < count) + { + int read = stream.Read(buffer, offset + total, count - total); + if (read <= 0) break; + total += read; + } + return total; + } + + private static void SkipData(Stream stream, long size) + { + if (size <= 0) return; + const int chunk = 8192; + byte[] tmp = new byte[Math.Min(chunk, (int)size)]; + long remaining = size; + while (remaining > 0) + { + int toRead = (int)Math.Min(tmp.Length, remaining); + int read = stream.Read(tmp, 0, toRead); + if (read <= 0) throw new EndOfStreamException("Unexpected end while skipping data."); + remaining -= read; + } + } + + private static void SkipPadding(Stream stream, long size) + { + long padding = (512 - (size % 512)) % 512; + if (padding > 0) + { + stream.Seek(padding, SeekOrigin.Current); + } + } + } +} /* This software is available under 2 licenses-- choose whichever you prefer. @@ -184,4 +290,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 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. -*/ +*/ \ No newline at end of file diff --git a/UnityLauncherPro/MainWindow.xaml b/UnityLauncherPro/MainWindow.xaml index 1e19791..1d02730 100644 --- a/UnityLauncherPro/MainWindow.xaml +++ b/UnityLauncherPro/MainWindow.xaml @@ -5,13 +5,18 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:UnityLauncherPro" xmlns:System="clr-namespace:System;assembly=mscorlib" + xmlns:controls="clr-namespace:UnityLauncherPro.Controls" xmlns:converters="clr-namespace:UnityLauncherPro.Converters" x:Class="UnityLauncherPro.MainWindow" mc:Ignorable="d" Title="UnityLauncherPro" Height="670" Width="880" WindowStartupLocation="CenterScreen" Background="{DynamicResource ThemeDarkestBackground}" MinWidth="780" MinHeight="650" AllowsTransparency="True" WindowStyle="None" Margin="0" KeyDown="OnWindowKeyDown" Closing="Window_Closing" SizeChanged="Window_SizeChanged" Icon="Images/icon.ico" SourceInitialized="Window_SourceInitialized" MouseDown="Window_MouseDown"> + + + + @@ -49,67 +54,24 @@ - - - - - - - - - - - - - + - - + - - + @@ -519,7 +409,7 @@ - - - - - @@ -611,28 +506,28 @@ @@ -641,10 +536,10 @@ @@ -652,7 +547,7 @@ @@ -663,48 +558,16 @@ + @@ -816,7 +679,7 @@ - @@ -835,8 +698,8 @@ - @@ -866,9 +729,9 @@ - diff --git a/UnityLauncherPro/MainWindow.xaml.cs b/UnityLauncherPro/MainWindow.xaml.cs index e965383..9295df4 100644 --- a/UnityLauncherPro/MainWindow.xaml.cs +++ b/UnityLauncherPro/MainWindow.xaml.cs @@ -197,6 +197,19 @@ void Start() if (chkFetchAdditionalInfo.IsChecked == true) Tools.FetchAdditionalInfoForEditors(); + // Subscribe to search box events + searchBoxProjects.SearchTextChanged += SearchBoxProjects_SearchTextChanged; + searchBoxProjects.SearchKeyDown += SearchBoxProjects_SearchKeyDown; + + searchBoxUnitys.SearchTextChanged += searchBoxUnitys_SearchTextChanged; + searchBoxUnitys.SearchKeyDown += searchBoxUnitys_SearchKeyDown; + + searchBoxUpdates.SearchTextChanged += searchBoxUpdates_SearchTextChanged; + searchBoxUpdates.SearchKeyDown += searchBoxUpdates_SearchKeyDown; + + searchBoxBuildReport.SearchTextChanged += searchBoxBuildReport_SearchTextChanged; + searchBoxBuildReport.SearchKeyDown += searchBoxBuildReport_SearchKeyDown; + isInitializing = false; } // Start() @@ -333,7 +346,17 @@ void HandleCommandLineLaunch() { bool useInitScript = (bool)chkUseInitScript.IsChecked; - Tools.DisplayUpgradeDialog(proj, null, useInitScript); + // if not editors found, then dont open commandline? + if (unityInstallationsSource.Count > 0) + { + Tools.DisplayUpgradeDialog(proj, null, useInitScript); + } + else + { + MessageBox.Show("No Unity installations found. Please setup Unity Editor root folders first by running UnityLauncherPro.", "No Unity Installations found", MessageBoxButton.OK, MessageBoxImage.Warning); + // TODO display setup tab + } + } else // no Assets folder here OR Assets folder is empty, then its new project { @@ -398,7 +421,7 @@ private bool LaunchProjectViaPipe(Project proj) void FilterRecentProjects() { // https://www.wpftutorial.net/DataViews.html - _filterString = txtSearchBox.Text; + _filterString = searchBoxProjects.SearchText; if (_filterString.IndexOf(' ') > -1) { @@ -422,7 +445,7 @@ void FilterRecentProjects() void FilterUpdates() { - _filterString = txtSearchBoxUpdates.Text.Trim(); + _filterString = searchBoxUpdates.SearchText.Trim(); ICollectionView collection = CollectionViewSource.GetDefaultView(dataGridUpdates.ItemsSource); if (collection == null) return; @@ -435,7 +458,7 @@ void FilterUpdates() void FilterUnitys() { - _filterString = txtSearchBoxUnity.Text.Trim(); + _filterString = searchBoxUnitys.SearchText.Trim(); ICollectionView collection = CollectionViewSource.GetDefaultView(dataGridUnitys.ItemsSource); collection.Filter = UnitysFilter; if (dataGridUnitys.Items.Count > 0) @@ -446,7 +469,7 @@ void FilterUnitys() void FilterBuildReport() { - _filterString = txtSearchBoxBuildReport.Text; + _filterString = searchBoxBuildReport.SearchText; ICollectionView collection = CollectionViewSource.GetDefaultView(gridBuildReport.ItemsSource); collection.Filter = BuildReportFilter; //if (gridBuildReport.Items.Count > 0) @@ -560,6 +583,7 @@ void LoadSettings() chkAskNameForQuickProject.IsChecked = Settings.Default.askNameForQuickProject; chkEnableProjectRename.IsChecked = Settings.Default.enableProjectRename; chkStreamerMode.IsChecked = Settings.Default.streamerMode; + chkShowRecoveredScenePopup.IsChecked = Settings.Default.showRecoveredScenePopup; chkShowPlatform.IsChecked = Settings.Default.showTargetPlatform; chkCheckSRP.IsChecked = Settings.Default.checkSRP; chkUseCustomTheme.IsChecked = Settings.Default.useCustomTheme; @@ -570,6 +594,7 @@ void LoadSettings() useUnofficialReleaseList.IsChecked = Settings.Default.useUnofficialReleaseList; chkDisableUnityHubLaunch.IsChecked = Settings.Default.disableUnityHubLaunch; chkFetchAdditionalInfo.IsChecked = Settings.Default.fetchAdditionalInfo; + chkFetchOnlineTemplates.IsChecked = Settings.Default.fetchOnlineTemplates; chkEnablePlatformSelection.IsChecked = Settings.Default.enablePlatformSelection; chkRunAutomatically.IsChecked = Settings.Default.runAutomatically; @@ -737,14 +762,16 @@ void LoadSettings() { string filename = ((ConfigurationErrorsException)ex.InnerException).Filename; - if (MessageBox.Show("This may be due to a Windows crash/BSOD.\n" + + var res = MessageBox.Show("This may be due to a Windows crash/BSOD.\n" + "Click 'Yes' to use automatic backup (if exists, otherwise settings are reset), then start application again.\n\n" + - "Click 'No' to exit now (and delete user.config manually)\n\nCorrupted file: " + filename, + "Click 'No' to reset config file (you'll need to setup settings again)\n\n" + + "Click 'Cancel' to exit now (and delete user.config manually)\n\nCorrupted file: " + filename, appName + " - Corrupt user settings", - MessageBoxButton.YesNo, - MessageBoxImage.Error) == MessageBoxResult.Yes) - { + MessageBoxButton.YesNoCancel, + MessageBoxImage.Error); + if (res == MessageBoxResult.Yes) + { // try to use backup string backupFilename = filename + ".bak"; if (File.Exists(backupFilename)) @@ -756,6 +783,15 @@ void LoadSettings() File.Delete(filename); } } + else if (res == MessageBoxResult.No) + { + File.Delete(filename); + } + else if (res == MessageBoxResult.Cancel) + { + Tools.ExploreFolder(Path.GetDirectoryName(filename)); + } + // need to restart, otherwise settings not loaded Process.GetCurrentProcess().Kill(); } @@ -829,8 +865,11 @@ private void SaveSettingsOnExit() File.Copy(FullFileName, FullFileName + ".bak", true); } - void UpdateUnityInstallationsList() + public void UpdateUnityInstallationsList() { + // keep currently selected row + var currentSelection = GetSelectedUnity(); + // Reset preferred string, if user changed it //preferredVersion = "none"; @@ -851,6 +890,21 @@ void UpdateUnityInstallationsList() } lblFoundXInstallations.Content = "Found " + unityInstallationsSource.Count + " installations"; + btnCreateEmptyProject.IsEnabled = unityInstallationsSource.Count > 0; + + // try to select previous selection + if (currentSelection != null) + { + for (int i = 0, len = unityInstallationsSource.Count; i < len; i++) + { + if (unityInstallationsSource[i].Version == currentSelection.Version && unityInstallationsSource[i].Path == currentSelection.Path) + { + dataGridUnitys.SelectedIndex = i; + Tools.SetFocusToGrid(dataGridUnitys); + break; + } + } + } } Project GetSelectedProject() @@ -880,18 +934,25 @@ void AddUnityInstallationRootFolder() var result = dialog.ShowDialog(); var newRoot = dialog.SelectedPath; + + if (lstRootFolders.Items.Contains(newRoot) == true) + { + SetStatus("Folder already exists in the list!", MessageType.Error); + return; + } + if (String.IsNullOrWhiteSpace(newRoot) == false && Directory.Exists(newRoot) == true) { - Properties.Settings.Default.rootFolders.Add(newRoot); + Settings.Default.rootFolders.Add(newRoot); lstRootFolders.Items.Refresh(); - Properties.Settings.Default.Save(); + Settings.Default.Save(); UpdateUnityInstallationsList(); RefreshRecentProjects(); } } // waits for unity update results and assigns to datagrid - async Task CallGetUnityUpdates() + public async Task CallGetUnityUpdates() { dataGridUpdates.ItemsSource = null; var task = GetUnityUpdates.FetchAll((bool)useUnofficialReleaseList.IsChecked); @@ -900,7 +961,7 @@ async Task CallGetUnityUpdates() if (updatesSource == null) return; dataGridUpdates.ItemsSource = updatesSource; // if search string is set, then filter it (after data is loaded) - if (string.IsNullOrEmpty(txtSearchBoxUpdates.Text) == false) + if (string.IsNullOrEmpty(searchBoxUpdates.SearchText) == false) { FilterUpdates(); } @@ -918,19 +979,19 @@ async void GoLookForUpdatesForThisUnity() { tabControl.SelectedIndex = 2; // need to clear old results first - txtSearchBoxUpdates.Text = ""; + searchBoxUpdates.SearchText = ""; // reset filter rdoAll.IsChecked = true; // NOTE for now, just set filter to current version, minus patch version "2021.1.7f1" > "2021.1" - txtSearchBoxUpdates.Text = unity.Version.Substring(0, unity.Version.LastIndexOf('.')); + searchBoxUpdates.SearchText = unity.Version.Substring(0, unity.Version.LastIndexOf('.')); } } public void RefreshRecentProjects() { // clear search - txtSearchBox.Text = ""; + searchBoxProjects.SearchText = ""; // take currently selected project row lastSelectedProjectIndex = gridRecent.SelectedIndex; // rescan recent projects @@ -999,7 +1060,7 @@ private void BtnAddProjectFolder_Click(object sender, RoutedEventArgs e) //AddNewProjectToList(proj); Tools.AddProjectToHistory(proj.Path); // clear search, so can see added project - txtSearchBox.Text = ""; + searchBoxProjects.SearchText = ""; RefreshRecentProjects(); // NOTE 0 works for sort-by-date only Tools.SetFocusToGrid(gridRecent, 0); @@ -1024,8 +1085,8 @@ void AddNewProjectToList(Project proj) gridRecent.SelectedIndex = 0; Tools.SetFocusToGrid(gridRecent); // force refresh - txtSearchBox.Text = proj.Title; - txtSearchBox.Text = ""; + searchBoxProjects.SearchText = proj.Title; + searchBoxProjects.SearchText = ""; } private void BtnClose_Click(object sender, RoutedEventArgs e) @@ -1057,11 +1118,10 @@ private void OnGetUnityUpdatesClick(object sender, RoutedEventArgs e) // refresh installations, if already added some new ones UpdateUnityInstallationsList(); - txtSearchBoxUpdates.Text = ""; + searchBoxUpdates.SearchText = ""; // clear filters, since right now they are not used after updates are loaded rdoAll.IsChecked = true; CallGetUnityUpdates(); - button.IsEnabled = true; } @@ -1084,19 +1144,19 @@ private void OnWindowKeyDown(object sender, KeyEventArgs e) break; case Key.Escape: // clear project search - if (txtSearchBox.Text == "") + if (searchBoxProjects.SearchText == "") { // its already clear } else // we have text in searchbox, clear it { - txtSearchBox.Text = ""; + searchBoxProjects.SearchText = ""; } // try to keep selected row selected and in view Tools.SetFocusToGrid(gridRecent); break; case Key.F5: - txtSearchBox.Text = ""; + searchBoxProjects.SearchText = ""; break; case Key.Up: case Key.Down: @@ -1130,10 +1190,9 @@ private void OnWindowKeyDown(object sender, KeyEventArgs e) if (Keyboard.Modifiers == ModifierKeys.Control) return; // activate searchbar if not active and we are in tab#1 - if (txtSearchBox.IsFocused == false) + if (searchBoxProjects.IsKeyboardFocusWithin == false) { - txtSearchBox.Focus(); - txtSearchBox.Select(txtSearchBox.Text.Length, 0); + searchBoxProjects.Focus(); } break; } @@ -1147,13 +1206,12 @@ private void OnWindowKeyDown(object sender, KeyEventArgs e) UpdateUnityInstallationsList(); break; case Key.Escape: // clear project search - txtSearchBoxUnity.Text = ""; + searchBoxUnitys.SearchText = ""; break; default: - if (txtSearchBoxUnity.IsFocused == false) + if (searchBoxUnitys.IsKeyboardFocusWithin == false) { - txtSearchBoxUnity.Focus(); - txtSearchBoxUnity.Select(txtSearchBoxUnity.Text.Length, 0); + searchBoxUnitys.Focus(); } break; } @@ -1167,7 +1225,7 @@ private void OnWindowKeyDown(object sender, KeyEventArgs e) CallGetUnityUpdates(); break; case Key.Escape: // clear project search - txtSearchBoxUpdates.Text = ""; + searchBoxUpdates.SearchText = ""; break; } break; @@ -1177,7 +1235,7 @@ private void OnWindowKeyDown(object sender, KeyEventArgs e) switch (e.Key) { case Key.Escape: // clear search - txtSearchBoxBuildReport.Text = ""; + searchBoxBuildReport.SearchText = ""; break; } break; @@ -1211,7 +1269,7 @@ private void RemoveProjectFromList(bool confirm = false) projectsSource.Remove(proj); gridRecent.Items.Refresh(); Tools.SetFocusToGrid(gridRecent); - gridRecent.SelectedIndex = 0; + if (gridRecent.Items.Count > 0) gridRecent.SelectedIndex = 0; } // NOTE this doesnt remove from settings list? @@ -1230,10 +1288,11 @@ private async void OnTabSelectionChanged(object sender, SelectionChangedEventArg if (task.IsCompleted == false || task.IsFaulted == true) return; if (items == null) return; updatesSource = items.ToArray(); + SetStatus("Found " + updatesSource.Length + " versions"); if (updatesSource == null) return; dataGridUpdates.ItemsSource = updatesSource; // if search string is set, then filter it (after data is loaded) - if (string.IsNullOrEmpty(txtSearchBoxUpdates.Text) == false) + if (string.IsNullOrEmpty(searchBoxUpdates.SearchText) == false) { FilterUpdates(); } @@ -1243,18 +1302,18 @@ private async void OnTabSelectionChanged(object sender, SelectionChangedEventArg private void OnClearProjectSearchClick(object sender, RoutedEventArgs e) { - txtSearchBox.Text = ""; + searchBoxProjects.SearchText = ""; } private void OnClearUnitySearchClick(object sender, RoutedEventArgs e) { - txtSearchBoxUnity.Text = ""; + searchBoxUnitys.SearchText = ""; } private void OnClearUpdateSearchClick(object sender, RoutedEventArgs e) { // FIXME doesnt hide button, becaus button should have opposite of Text.IsEmpty, or custom style to hide when not empty - txtSearchBoxUpdates.Text = ""; + searchBoxUpdates.SearchText = ""; } private void Window_Closing(object sender, CancelEventArgs e) @@ -1350,6 +1409,14 @@ private void BtnUpgradeProject_Click(object sender, RoutedEventArgs e) if (proj == null) return; Tools.DisplayUpgradeDialog(proj: proj, owner: this, useInitScript: false); + + // update displayed version number now + var updatedVersion = Tools.GetProjectVersion(proj.Path); + if (string.IsNullOrEmpty(updatedVersion) == false) + { + proj.Version = updatedVersion; + gridRecent.Items.Refresh(); + } } private void GridRecent_Loaded(object sender, RoutedEventArgs e) @@ -1413,58 +1480,6 @@ private void BtnUpdateUnity_Click(object sender, RoutedEventArgs e) GoLookForUpdatesForThisUnity(); } - // if press up/down in search box, move to first item in results - private void TxtSearchBox_PreviewKeyDown(object sender, KeyEventArgs e) - { - switch (e.Key) - { - case Key.Return: // open selected project - var proj = GetSelectedProject(); - var proc = Tools.LaunchProject(proj); - //ProcessHandler.Add(proj, proc); - break; - case Key.Tab: - case Key.Up: - //Tools.SetFocusToGrid(gridRecent); - var currentIndex = gridRecent.SelectedIndex - 1; - //Console.WriteLine(currentIndex); - if (currentIndex < 0) currentIndex = gridRecent.Items.Count - 1; - gridRecent.SelectedIndex = currentIndex; - e.Handled = true; - break; - case Key.Down: - // TODO move to 2nd row if first is already selected - //if (GetSelectedProjectIndex() == 0) - //{ - // Tools.SetFocusToGrid(gridRecent, 1); - //} - //else - //{ - //Tools.SetFocusToGrid(gridRecent); - // } - - // if in searchbox, then move selected index up or down - gridRecent.SelectedIndex = ++gridRecent.SelectedIndex % gridRecent.Items.Count; - e.Handled = true; // to stay in first row - break; - default: - break; - } - } - - private void TxtSearchBoxUnity_PreviewKeyDown(object sender, KeyEventArgs e) - { - switch (e.Key) - { - case Key.Up: - case Key.Down: - Tools.SetFocusToGrid(dataGridUnitys); - break; - default: - break; - } - } - private void BtnAddInstallationFolder_Click(object sender, RoutedEventArgs e) { AddUnityInstallationRootFolder(); @@ -1497,12 +1512,15 @@ private void GridRecent_PreviewKeyDown(object sender, KeyEventArgs e) // if edit mode, dont override keys if (IsEditingCell(gridRecent) == true) return; // if in args column, dont jump to end of list, but end of this field - if (gridRecent.CurrentCell.Column.DisplayIndex == 4) + + var currentColumnCell = gridRecent.CurrentCell.Column.Header.ToString(); + if (currentColumnCell == "Arguments") { // start editing this cell gridRecent.BeginEdit(); return; } + gridRecent.SelectedIndex = gridRecent.Items.Count - 1; gridRecent.ScrollIntoView(gridRecent.SelectedItem); e.Handled = true; @@ -1567,34 +1585,31 @@ private void DataGridUpdates_PreviewKeyDown(object sender, KeyEventArgs e) } } - private void TxtSearchBoxUpdates_PreviewKeyDown(object sender, KeyEventArgs e) + private void BtnOpenEditorLogsFolder_Click(object sender, RoutedEventArgs e) { - switch (e.Key) + var proj = ProcessHandler.GetSingleRunning(); + if (proj != null && Tools.IsVersionAtLeast(proj.Version, "6000.5")) { - case Key.Up: - case Key.Down: - Tools.SetFocusToGrid(dataGridUpdates); - e.Handled = true; - break; - default: - break; + var logFolder = Path.Combine(proj.Path, "Logs"); + if (Directory.Exists(logFolder)) + { + Tools.LaunchExplorer(logFolder); + return; + } } - } - private void BtnOpenEditorLogsFolder_Click(object sender, RoutedEventArgs e) - { - var logfolder = Tools.GetEditorLogsFolder(); - if (Directory.Exists(logfolder) == true) + var globalLogFolder = Tools.GetGlobalEditorLogsFolder(); + if (Directory.Exists(globalLogFolder)) { - if (Tools.LaunchExplorer(logfolder) == false) + if (Tools.LaunchExplorer(globalLogFolder) == false) { - Console.WriteLine("Cannot open folder.." + logfolder); - SetStatus("Cannot open folder: " + logfolder); + Console.WriteLine("Cannot open folder.." + globalLogFolder); + SetStatus("Cannot open folder: " + globalLogFolder); } } else { - SetStatus("Folder does not exist: " + logfolder); + SetStatus("Folder does not exist: " + globalLogFolder); } } @@ -1968,16 +1983,6 @@ private void GridRecent_CellEditEnding(object sender, DataGridCellEditEndingEven // TODO select the same row again } - private void TxtSearchBoxUpdates_TextChanged(object sender, TextChangedEventArgs e) - { - FilterUpdates(); - } - - private void TxtSearchBoxUnity_TextChanged(object sender, TextChangedEventArgs e) - { - FilterUnitys(); - } - private void GridRecent_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { // cancel if editing cell, because often try to double click to edit instead @@ -1987,8 +1992,11 @@ private void GridRecent_PreviewMouseDoubleClick(object sender, MouseButtonEventA if (e.OriginalSource.GetType() != typeof(TextBlock)) return; // cancel run if double clicked Arguments or Platform editable field - var currentColumnCell = gridRecent.CurrentCell.Column.DisplayIndex; - if (currentColumnCell == 4 || currentColumnCell == 6) return; + var currentColumnCell = gridRecent.CurrentCell.Column.Header.ToString(); + if (currentColumnCell == "Arguments" || currentColumnCell == "Platform") + { + return; + } var proj = GetSelectedProject(); var proc = Tools.LaunchProject(proj); @@ -2119,6 +2127,21 @@ void CreateNewEmptyProject(string targetFolder = null) } } + string newVersion = null; + + // if in maintab + if (tabControl.SelectedIndex == 0) + { + newVersion = GetSelectedProject()?.Version == null ? preferredVersion : GetSelectedProject().Version; + } + else // unity tab + { + newVersion = (GetSelectedUnity() == null || GetSelectedUnity().Version == null) ? preferredVersion : GetSelectedUnity().Version; + } + + // refresh unity installations (so that latest installs are listed) + UpdateUnityInstallationsList(); + if (string.IsNullOrEmpty(initScriptFileFullPath) == true) { initScriptFileFullPath = Tools.GetSafeFilePath("Scripts", "InitializeProject.cs"); @@ -2127,29 +2150,18 @@ void CreateNewEmptyProject(string targetFolder = null) // for new projects created from explorer, always ask for name if (chkAskNameForQuickProject.IsChecked == true || targetFolder != null) { - string newVersion = null; - - // if in maintab - if (tabControl.SelectedIndex == 0) - { - newVersion = GetSelectedProject()?.Version == null ? preferredVersion : GetSelectedProject().Version; - } - else // unity tab - { - newVersion = (GetSelectedUnity() == null || GetSelectedUnity().Version == null) ? preferredVersion : GetSelectedUnity().Version; - } - if (string.IsNullOrEmpty(newVersion)) { Console.WriteLine("Missing selected Unity version, probably launching from context menu"); newVersion = preferredVersion; // if no preferred version, use latest if (string.IsNullOrEmpty(newVersion)) newVersion = unityInstallationsSource[0].Version; - } - var suggestedName = targetFolder != null ? Path.GetFileName(targetFolder) : Tools.GetSuggestedProjectName(newVersion, rootFolder); - NewProject modalWindow = new NewProject(newVersion, suggestedName, rootFolder, targetFolder != null); + string suggestedName = targetFolder != null ? Path.GetFileName(targetFolder) : Tools.GetSuggestedProjectName(newVersion, rootFolder); + bool fetchOnlineTemplates = chkFetchOnlineTemplates.IsChecked == true; + + NewProject modalWindow = new NewProject(newVersion, suggestedName, rootFolder, targetFolder != null, fetchOnlineTemplates); modalWindow.ShowInTaskbar = this == null; modalWindow.WindowStartupLocation = this == null ? WindowStartupLocation.CenterScreen : WindowStartupLocation.CenterOwner; modalWindow.Topmost = this == null; @@ -2178,22 +2190,10 @@ void CreateNewEmptyProject(string targetFolder = null) } else // use automatic name (project is instantly created, without asking anything) { - string newVersion = null; - // if in maintab - if (tabControl.SelectedIndex == 0) - { - newVersion = GetSelectedProject().Version == null ? preferredVersion : GetSelectedProject().Version; - } - else // unity tab - { - newVersion = GetSelectedUnity().Version == null ? preferredVersion : GetSelectedUnity().Version; - } var p = Tools.FastCreateProject(newVersion, rootFolder, null, null, null, null, (bool)chkUseInitScript.IsChecked, initScriptFileFullPath); - if (p != null) AddNewProjectToList(p); } - - } + } // CreateNewEmptyProject private void ChkAskNameForQuickProject_Checked(object sender, RoutedEventArgs e) { @@ -2232,6 +2232,14 @@ private void ChkStreamerMode_Checked(object sender, RoutedEventArgs e) SetStatus("Streamer mode " + (isChecked ? "enabled" : "disabled"), MessageType.Info); } + private void chkShowRecoveredScenePopup_Checked(object sender, RoutedEventArgs e) + { + var isChecked = (bool)((CheckBox)sender).IsChecked; + + Settings.Default.showRecoveredScenePopup = isChecked; + Settings.Default.Save(); + } + private void ChkShowPlatform_Checked(object sender, RoutedEventArgs e) { if (this.IsActive == false) return; // dont run code on window init @@ -2345,8 +2353,15 @@ private void GridRecent_ContextMenuOpening(object sender, ContextMenuEventArgs e if (tabControl.SelectedIndex == 0) { var proj = GetSelectedProject(); - var proc = ProcessHandler.Get(proj.Path); - menuItemKillProcess.IsEnabled = proc != null; + if (proj != null) + { + var proc = ProcessHandler.Get(proj.Path); + menuItemKillProcess.IsEnabled = proc != null; + } + else + { + menuItemKillProcess.IsEnabled = false; + } } } @@ -2357,6 +2372,12 @@ private void GridRecent_ContextMenuOpening(object sender, ContextMenuEventArgs e new KeyGesture(Key.Q, ModifierKeys.Alt) })); + public static readonly RoutedCommand OpenEditorLogsCommand = new RoutedUICommand("None", "OpenEditorLogsCommand", typeof(MainWindow), new InputGestureCollection(new InputGesture[] + { + new KeyGesture(Key.L, ModifierKeys.Control) + })); + + private void BtnRefreshBuildReport_Click(object sender, RoutedEventArgs e) { RefreshBuildReports(); @@ -2372,7 +2393,7 @@ void RefreshBuildReports() btnPrevBuildReport.IsEnabled = false; btnNextBuildReport.IsEnabled = false; - var logFile = Path.Combine(Tools.GetEditorLogsFolder(), "Editor.log"); + var logFile = Path.Combine(Tools.GetGlobalEditorLogsFolder(), "Editor.log"); if (File.Exists(logFile) == false) return; BuildReport singleReport = null;// new BuildReport(); @@ -2964,8 +2985,8 @@ void ValidateFolderFromTextbox(TextBox textBox) if (Directory.Exists(textBox.Text) == true) { // NOTE this saves for shortcutbat setting, so cannot be used for another fields - Properties.Settings.Default.shortcutBatchFileFolder = textBox.Text; - Properties.Settings.Default.Save(); + Settings.Default.shortcutBatchFileFolder = textBox.Text; + Settings.Default.Save(); textBox.BorderBrush = System.Windows.Media.Brushes.Transparent; } else // invalid format @@ -3021,14 +3042,14 @@ private void ChkHumanFriendlyDateTime_Checked(object sender, RoutedEventArgs e) private void GridRecent_ColumnReordered(object sender, DataGridColumnEventArgs e) { // if amount has changed, need to reset array - if (Properties.Settings.Default.recentColumnsOrder.Length != gridRecent.Columns.Count) Properties.Settings.Default.recentColumnsOrder = new Int32[gridRecent.Columns.Count]; + if (Settings.Default.recentColumnsOrder.Length != gridRecent.Columns.Count) Properties.Settings.Default.recentColumnsOrder = new Int32[gridRecent.Columns.Count]; // get new display indexes for (int i = 0; i < gridRecent.Columns.Count; i++) { - Properties.Settings.Default.recentColumnsOrder[i] = gridRecent.Columns[i].DisplayIndex; + Settings.Default.recentColumnsOrder[i] = gridRecent.Columns[i].DisplayIndex; } - Properties.Settings.Default.Save(); + Settings.Default.Save(); } private void MenuItemExploreBuildItem_Click(object sender, RoutedEventArgs e) @@ -3080,25 +3101,7 @@ private void MenuItemUpdatesReleaseNotes_Click(object sender, RoutedEventArgs e) private void BtnClearBuildReportSearch_Click(object sender, RoutedEventArgs e) { - txtSearchBoxBuildReport.Text = ""; - } - - private void TxtSearchBoxBuildReport_PreviewKeyDown(object sender, KeyEventArgs e) - { - switch (e.Key) - { - case Key.Up: - case Key.Down: - Tools.SetFocusToGrid(gridBuildReport); - break; - default: - break; - } - } - - private void TxtSearchBoxBuildReport_TextChanged(object sender, TextChangedEventArgs e) - { - if (gridBuildReport.ItemsSource != null) FilterBuildReport(); + searchBoxBuildReport.SearchText = ""; } private void TxtLogCatArgs_TextChanged(object sender, TextChangedEventArgs e) @@ -3192,6 +3195,8 @@ private void BtnThemeEditor_Click(object sender, RoutedEventArgs e) private void MenuRemoveProject_Click(object sender, RoutedEventArgs e) { + var proj = GetSelectedProject(); + if (proj == null) return; RemoveProjectFromList(); } @@ -3886,9 +3891,16 @@ private void btnOpenEditorLogsFolder_PreviewMouseDown(object sender, MouseButton { if (e.ChangedButton == MouseButton.Middle) { - var logfolder = Tools.GetEditorLogsFolder(); - var logFile = Path.Combine(logfolder, "Editor.log"); - if (File.Exists(logFile) == true) Tools.LaunchExe(logFile); + var proj = ProcessHandler.GetSingleRunning(); + if (proj != null && Tools.IsVersionAtLeast(proj.Version, "6000.5")) + { + Tools.OpenEditorLogForProject(proj); + return; + } + + var logFolder = Tools.GetGlobalEditorLogsFolder(); + var logFile = Path.Combine(logFolder, "Editor.log"); + if (File.Exists(logFile)) Tools.LaunchExe(logFile); } } @@ -4183,6 +4195,220 @@ private void gridRecent_SelectionChanged(object sender, SelectionChangedEventArg } + private void Image_MouseDown(object sender, MouseButtonEventArgs e) + { + var proj = GetSelectedProject(); + if (proj == null) return; + var thumbnailPath = Path.Combine(proj.Path, "ProjectSettings", "icon.png"); + Tools.LaunchExe(thumbnailPath); + } + + private void chkFetchOnlineTemplates_Checked(object sender, RoutedEventArgs e) + { + if (this.IsActive == false) return; + + Settings.Default.fetchOnlineTemplates = (bool)chkFetchOnlineTemplates.IsChecked; + Settings.Default.Save(); + } + + private void menuOpenReleasesApi_Click(object sender, RoutedEventArgs e) + { + var editor = GetSelectedUnity(); + if (editor == null || editor.Version == null) return; + Tools.OpenReleasesApiForVersion(editor.Version); + } + + private void SearchBoxProjects_SearchTextChanged(object sender, TextChangedEventArgs e) + { + FilterRecentProjects(); + } + + private void SearchBoxProjects_SearchKeyDown(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.Return: // open selected project + var proj = GetSelectedProject(); + var proc = Tools.LaunchProject(proj); + //ProcessHandler.Add(proj, proc); + break; + case Key.Tab: + case Key.Up: + //Tools.SetFocusToGrid(gridRecent); + var currentIndex = gridRecent.SelectedIndex - 1; + //Console.WriteLine(currentIndex); + if (currentIndex < 0) currentIndex = gridRecent.Items.Count - 1; + gridRecent.SelectedIndex = currentIndex; + e.Handled = true; + break; + case Key.Down: + // TODO move to 2nd row if first is already selected + //if (GetSelectedProjectIndex() == 0) + //{ + // Tools.SetFocusToGrid(gridRecent, 1); + //} + //else + //{ + //Tools.SetFocusToGrid(gridRecent); + // } + + // if in searchbox, then move selected index up or down + gridRecent.SelectedIndex = ++gridRecent.SelectedIndex % gridRecent.Items.Count; + e.Handled = true; // to stay in first row + break; + default: + break; + } + } + + private void searchBoxUnitys_SearchTextChanged(object sender, TextChangedEventArgs e) + { + FilterUnitys(); + } + + private void searchBoxUnitys_SearchKeyDown(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.Up: + case Key.Down: + Tools.SetFocusToGrid(dataGridUnitys); + break; + default: + break; + } + } + + private void searchBoxUpdates_SearchTextChanged(object sender, TextChangedEventArgs e) + { + FilterUpdates(); + } + + private void searchBoxUpdates_SearchKeyDown(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.Up: + case Key.Down: + Tools.SetFocusToGrid(dataGridUpdates); + e.Handled = true; + break; + default: + break; + } + } + + private void searchBoxBuildReport_SearchTextChanged(object sender, TextChangedEventArgs e) + { + if (gridBuildReport.ItemsSource != null) FilterBuildReport(); + } + + private void searchBoxBuildReport_SearchKeyDown(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.Up: + case Key.Down: + Tools.SetFocusToGrid(gridBuildReport); + break; + default: + break; + } + } + + private void gridRecent_DragLeave(object sender, DragEventArgs e) + { + gridRecent.BorderBrush = (SolidColorBrush)Application.Current.Resources["ThemeBorderColor"]; + } + + private void gridRecent_DragEnter(object sender, DragEventArgs e) + { + gridRecent.BorderBrush = (SolidColorBrush)Application.Current.Resources["ThemeAccentColor"]; + } + + private void gridRecent_Drop(object sender, DragEventArgs e) + { + var files = (string[])e.Data.GetData(DataFormats.FileDrop); + //MessageBox.Show("files: " + files.Length, "Information", MessageBoxButton.OK, MessageBoxImage.Information); + + bool addedAny = false; + string addedPath = null; + + // check if any of the files is a unity project (has Assets and ProjectSettings folder) + foreach (var file in files) + { + if (Directory.Exists(file) == true) + { + var assetsFolder = Path.Combine(file, "Assets"); + var projectSettingsFolder = Path.Combine(file, "ProjectSettings"); + + if (Directory.Exists(assetsFolder) == true && Directory.Exists(projectSettingsFolder) == true) + { + Tools.AddProjectToHistory(file); + addedPath = file; + addedAny = true; + } + else + { + if ((bool)chkStreamerMode.IsChecked) SetStatus("Not a Unity project: " + file, MessageType.Warning); + } + } + else + { + if ((bool)chkStreamerMode.IsChecked) SetStatus("Not a folder: " + file, MessageType.Warning); + } + } + + if (addedAny) + { + // clear search, so can see added project + searchBoxProjects.SearchText = ""; + RefreshRecentProjects(); + SetStatus("Added project(s) with drag and drop.."); + + // find one of the added items + if (addedPath != null) + { + for (int i = 0, len = gridRecent.Items.Count; i < len; i++) + { + var item = gridRecent.Items[i] as Project; + if (item != null && (item.Path ?? "").Replace('\\', '/') == addedPath.Replace('\\', '/')) + { + gridRecent.SelectedIndex = i; + gridRecent.ScrollIntoView(item); + gridRecent.Focus(); + break; + } + } + } + } + } + + private void gridRecent_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) + { + var dep = e.OriginalSource as DependencyObject; + if (dep == null) return; + + while (dep != null && !(dep is DataGridRow)) + { + dep = VisualTreeHelper.GetParent(dep); + } + + var row = dep as DataGridRow; + if (row == null) return; + + gridRecent.SelectedItem = row.Item; + gridRecent.SelectedIndex = row.GetIndex(); + row.Focus(); + } + + private void MenuOpenEditorLogs_Click(object sender, RoutedEventArgs e) + { + var proj = GetSelectedProject(); + if (proj == null) return; + Tools.OpenEditorLogForProject(proj); + } + //private void menuProjectProperties_Click(object sender, RoutedEventArgs e) //{ // var proj = GetSelectedProject(); diff --git a/UnityLauncherPro/NewProject.xaml b/UnityLauncherPro/NewProject.xaml index c1986db..e88a1e2 100644 --- a/UnityLauncherPro/NewProject.xaml +++ b/UnityLauncherPro/NewProject.xaml @@ -4,13 +4,20 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:UnityLauncherPro" + xmlns:data="clr-namespace:UnityLauncherPro.Data" + d:DataContext="{d:DesignInstance Type=local:NewProject}" mc:Ignorable="d" - Title="Create New Project" Height="480" Width="500" Background="{DynamicResource ThemeDarkestBackground}" PreviewKeyDown="Window_PreviewKeyDown" ResizeMode="NoResize" WindowStartupLocation="CenterOwner" ShowInTaskbar="True"> + Title="Create New Project" Height="680" Width="670" Background="{DynamicResource ThemeDarkestBackground}" PreviewKeyDown="Window_PreviewKeyDown" ResizeMode="NoResize" WindowStartupLocation="CenterOwner" ShowInTaskbar="True"> + + + + + + + + + diff --git a/UnityLauncherPro/NewProject.xaml.cs b/UnityLauncherPro/NewProject.xaml.cs index 3a11f14..404ad45 100644 --- a/UnityLauncherPro/NewProject.xaml.cs +++ b/UnityLauncherPro/NewProject.xaml.cs @@ -1,10 +1,18 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; +using System.Windows.Media.Imaging; +using UnityLauncherPro.Data; +using UnityLauncherPro.Helpers; +using UnityLauncherPro.Properties; namespace UnityLauncherPro { @@ -21,16 +29,32 @@ public partial class NewProject : Window bool isInitializing = true; // to keep OnChangeEvent from firing too early int previousSelectedTemplateIndex = -1; int previousSelectedModuleIndex = -1; + bool loadOnlineTemplates = true; public static string targetFolder { get; private set; } = null; + private CancellationTokenSource _templateLoadCancellation; - public NewProject(string unityVersion, string suggestedName, string targetFolder, bool nameIsLocked = false) + const string githubTokenCreationURL = "https://github.com/settings/tokens/new?description=UnityLauncherPro+Setup+Project+Access&default_expires_at=90&scopes=repo#Remember_to_Copy_Token!"; + + void UpdateOrgUiState() + { + bool orgsEnabled = chkEnableOrgs.IsChecked == true; + btnCreateNewProjectAndRepo.Content = orgsEnabled ? "New Project+Repo at Org" : "New Project+Repo"; + } + + + public NewProject(string unityVersion, string suggestedName, string targetFolder, bool nameIsLocked = false, bool fetchOnlineTemplates = false) { isInitializing = true; InitializeComponent(); + loadOnlineTemplates = fetchOnlineTemplates; + btnFetchTemplates.Visibility = fetchOnlineTemplates ? Visibility.Collapsed : Visibility.Visible; + NewProject.targetFolder = targetFolder; + LoadSettings(); + // get version newVersion = unityVersion; newName = suggestedName; @@ -38,10 +62,25 @@ public NewProject(string unityVersion, string suggestedName, string targetFolder txtNewProjectName.IsEnabled = !nameIsLocked; txtNewProjectName.Text = newName; + + // git + txtRepoName.Text = newName; + txtNewProjectFolder.Text = targetFolder; - // fill available versions - if (gridAvailableVersions.ItemsSource == null) + UpdateCreateButtonsEnabledState(); + + if (MainWindow.unityInstallationsSource.Count == 0) + { + Tools.SetStatus("No Unity installations found! Please add Unity installations first."); + isInitializing = false; + btnCreateNewProject.IsEnabled = false; + btnCreateNewProjectAndRepo.IsEnabled = false; + return; + } + + // fill available versions, only replace if it's a different collection instance + if (!ReferenceEquals(gridAvailableVersions.ItemsSource, MainWindow.unityInstallationsSource)) { gridAvailableVersions.ItemsSource = MainWindow.unityInstallationsSource; } @@ -50,18 +89,27 @@ public NewProject(string unityVersion, string suggestedName, string targetFolder if (MainWindow.unityInstalledVersions.ContainsKey(unityVersion) == true) { // find this unity version, TODO theres probably easier way than looping all - for (int i = 0; i < MainWindow.unityInstallationsSource.Count; i++) + if (MainWindow.unityInstallationsSource != null) { - if (MainWindow.unityInstallationsSource[i].Version == newVersion) + for (int i = 0; i < MainWindow.unityInstallationsSource.Count; i++) { - gridAvailableVersions.SelectedIndex = i; - gridAvailableVersions.ScrollIntoView(gridAvailableVersions.SelectedItem); - break; + if (MainWindow.unityInstallationsSource[i].Version == newVersion) + { + gridAvailableVersions.SelectedIndex = i; + gridAvailableVersions.ScrollIntoView(gridAvailableVersions.SelectedItem); + + string baseVersion = Tools.GetBaseVersion(newVersion); + if (fetchOnlineTemplates) _ = LoadOnlineTemplatesAsync(baseVersion); + break; + } } } - UpdateTemplatesDropDown((gridAvailableVersions.SelectedItem as UnityInstallation).Path); - UpdateModulesDropdown(newVersion); + if (gridAvailableVersions.SelectedItem != null) + { + UpdateTemplatesDropDown((gridAvailableVersions.SelectedItem as UnityInstallation).Path); + UpdateModulesDropdown(newVersion); + } } else // we dont have requested unity version, select first item then { @@ -72,13 +120,64 @@ public NewProject(string unityVersion, string suggestedName, string targetFolder } // select projectname text so can overwrite if needed - txtNewProjectName.Focus(); - txtNewProjectName.SelectAll(); newProjectName = txtNewProjectName.Text; + if (nameIsLocked) + { + Tools.SetFocusToGrid(gridAvailableVersions); + } + else + { + txtNewProjectName.Focus(); + txtNewProjectName.SelectAll(); + } + isInitializing = false; } // NewProject + private async void LoadSettings() + { + chkEnableVersionControl.IsChecked = Settings.Default.gitEnableVersionControl; + + chkForceDX11.IsChecked = Settings.Default.forceDX11; + chkEnableLfs.IsChecked = Settings.Default.gitIEnableLFS; + chkEnableLfs.IsEnabled = chkEnableVersionControl.IsChecked == true; + chkInitialCommit.IsChecked = Settings.Default.gitInitialCommit; + chkInitialCommit.IsEnabled = chkEnableVersionControl.IsChecked == true; + chkAddReadme.IsChecked = Settings.Default.gitAddReadme; + chkAddUnityGitIgnore.IsChecked = Settings.Default.gitAddIgnore; + chkEnableOrgs.IsChecked = Settings.Default.gitEnableOrgs; + UpdateOrgUiState(); + + expVersionControl.IsExpanded = Settings.Default.gitPanelExpanded || chkEnableVersionControl.IsChecked == true; + + string token = GitHubTokenStore.LoadToken(); + string username = GitHubTokenStore.LoadUsername(); + + if (string.IsNullOrWhiteSpace(token)) + { + ShowGitAuthorizedUI(false); + return; + } + + + // TODO no need to validate on every load.. + GitHubTokenValidationResult result = await GitHubAuth.ValidateTokenAsync(token); + + if (result.IsValid) + { + ShowGitAuthorizedUI(true); + await LoadGithubOrgsAsync(token); + } + else + { + GitHubTokenStore.DeleteToken(); + Settings.Default.Save(); + ShowGitAuthorizedUI(false); + } + + } // LoadSettings + void UpdateTemplatesDropDown(string unityPath) { // scan available templates, TODO could cache this at least per session? @@ -87,7 +186,6 @@ void UpdateTemplatesDropDown(string unityPath) lblTemplateTitleAndCount.Content = "Templates: (" + (cmbNewProjectTemplate.Items.Count - 1) + ")"; } - void UpdateModulesDropdown(string version) { // get modules and stick into combobox, NOTE we already have this info from GetProjects.Scan, so could access it @@ -125,34 +223,265 @@ void UpdateModulesDropdown(string version) } } - private void BtnCreateNewProject_Click(object sender, RoutedEventArgs e) + bool isCreatingProject = false; + private async void BtnCreateNewProject_Click(object sender, RoutedEventArgs e) { + await CreateNewProject(withRepo: false); + } + + private async void btnCreateNewProjectAndRepo_Click(object sender, RoutedEventArgs e) + { + await CreateNewProject(withRepo: true); + } + + private async Task CreateNewProject(bool withRepo) + { + if (isCreatingProject) return; + isCreatingProject = true; + + btnCreateNewProject.IsEnabled = false; + btnCreateNewProjectAndRepo.IsEnabled = false; + + try + { + // check if projectname already exists (only if should be automatically created name) var targetPath = Path.Combine(targetFolder, txtNewProjectName.Text); if (txtNewProjectName.IsEnabled == true && Directory.Exists(targetPath) == true) { Tools.SetStatus("Project already exists: " + txtNewProjectName.Text); + isCreatingProject = false; return; } - templateZipPath = ((KeyValuePair)cmbNewProjectTemplate.SelectedValue).Value; - selectedPlatform = cmbNewProjectPlatform.SelectedValue.ToString(); - UpdateSelectedVersion(); + // Check if online template is selected + if (listOnlineTemplates.SelectedItem is OnlineTemplateItem selectedOnlineTemplate) + { + // Use online template path + string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + string templatesPath = Path.Combine(appDataPath, "UnityHub", "Templates"); + + if (!string.IsNullOrEmpty(selectedOnlineTemplate.TarBallURL)) + { + string fileName = Path.GetFileName(new Uri(selectedOnlineTemplate.TarBallURL).LocalPath); + if (string.IsNullOrEmpty(fileName)) + { + string safeFileName = string.Join("_", selectedOnlineTemplate.Name.Split(Path.GetInvalidFileNameChars())); + fileName = $"{safeFileName}.tgz"; + } + + templateZipPath = Path.Combine(templatesPath, fileName); + + // Verify the file exists + if (!File.Exists(templateZipPath)) + { + Tools.SetStatus("Selected online template is not downloaded. Please download it first."); + isCreatingProject = false; + return; + } + } + else + { + Tools.SetStatus("Invalid online template URL"); + isCreatingProject = false; + return; + } + } + else + { + // Use built-in template from dropdown + if (cmbNewProjectTemplate.SelectedValue != null) templateZipPath = ((KeyValuePair)cmbNewProjectTemplate.SelectedValue).Value; + } + + if (cmbNewProjectTemplate.SelectedValue != null) + { + selectedPlatform = cmbNewProjectPlatform.SelectedValue.ToString(); + UpdateSelectedVersion(); + + // save last used value for platform + Settings.Default.newProjectPlatform = cmbNewProjectPlatform.SelectedValue.ToString(); + Settings.Default.Save(); + } + + var repoOwner = GitHubTokenStore.LoadUsername(); + + if (withRepo && chkEnableVersionControl.IsChecked == true) + { + + // setup local git + try + { + string projectPath = await GithubActions.InitRepositoryAsync(baseDir: txtNewProjectFolder.Text, projectName: txtNewProjectName.Text, initGitLfs: (chkEnableLfs.IsChecked == true), defaultBranch: "main"); + + txtNewProjectStatus.Text = "Git repository initialized at: " + projectPath; + } + catch (Exception ex) + { + txtNewProjectStatus.Text = "Git init failed: " + ex.Message; + } + + // create online repo + try + { + string token = GitHubTokenStore.LoadToken(); + + // if invalid repo, add DDMMYYY_HHMMSS + if (lblRepoNameInvalid.Visibility == Visibility.Visible) + { + txtRepoName.Text += "_" + DateTime.Now.ToString("ddMMyyyy_HHmmss"); + } + + string selectedOrg = null; + if (chkEnableOrgs.IsChecked == true) + { + selectedOrg = cmbGithubOrgs.SelectedItem as string; + if (string.IsNullOrWhiteSpace(selectedOrg)) selectedOrg = null; + } + + repoOwner = selectedOrg ?? repoOwner; + + GitHubCreateRepoResult result = await GithubActions.CreateRepositoryAsync(token: token, repoName: txtRepoName.Text, description: txtRepoDescription.Text, isPrivate: rbPrivate.IsChecked == true, autoInit: false, organization: selectedOrg); + + if (result.Success) + { + Console.WriteLine("Created repo successfully."); + + string remoteUrl = $"https://github.com/{repoOwner}/{txtRepoName.Text}.git"; + await GithubActions.RunGitAsync(Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text), $"remote add origin {remoteUrl}"); + } + else + { + Console.WriteLine("Failed to create repo.."); + txtNewProjectStatus.Text = "GitHub repo creation failed: " + (string.IsNullOrWhiteSpace(result.Error) ? "Unknown GitHub error." : result.Error); + } + } + catch (Exception ex) + { + txtNewProjectStatus.Text += " | GitHub repo creation failed: " + ex.Message; + } + + // create .gitattributes if LFS enabled? + if (chkEnableLfs.IsChecked == true) + { + //var gitAttributesUrl = "https://raw.githubusercontent.com/gitattributes/gitattributes/refs/heads/master/Unity.gitattributes"; + + // load from resources + try + { + var assembly = typeof(NewProject).Assembly; + var resourceName = $"{typeof(NewProject).Namespace}.Resources..gitattributes"; + + using var stream = assembly.GetManifestResourceStream(resourceName); + if (stream == null) return; + + var gitattributesPath = Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text, ".gitattributes"); + using var fileStream = File.Create(gitattributesPath); + stream.CopyTo(fileStream); + } + catch + { + Tools.SetStatus("Failed to create .gitattributes file for this project."); + } + } + } // if version control enabled + + // create readme if enabled + if (withRepo && chkAddReadme.IsChecked == true) + { + var readmePath = Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text, "README.md"); + try + { + if (Directory.Exists(Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text)) == false) + { + Directory.CreateDirectory(Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text)); + } + File.WriteAllText(readmePath, "# " + txtRepoName.Text + "\n\n" + txtRepoDescription.Text); + } + catch (Exception ex) + { + Tools.SetStatus("Failed to create README file for this project: " + ex.Message); + } + } + + // download .gitignore if enabled + if (withRepo && chkAddUnityGitIgnore.IsChecked == true) + { + //var gitIgnoreUrl = "https://raw.githubusercontent.com/github/gitignore/refs/heads/main/Unity.gitignore"; + + // load from resources + try + { + var assembly = typeof(NewProject).Assembly; + var resourceName = $"{typeof(NewProject).Namespace}.Resources..gitignore"; + + using var stream = assembly.GetManifestResourceStream(resourceName); + if (stream == null) return; + + var gitignorePath = Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text, ".gitignore"); + using var fileStream = File.Create(gitignorePath); + stream.CopyTo(fileStream); + } + catch + { + Tools.SetStatus("Failed to create .gitignore file for this project."); + } + } // if add gitignore + + if (withRepo && chkEnableVersionControl.IsChecked == true) + { + if (chkInitialCommit.IsChecked == true) + { + try + { + await GithubActions.RunGitAsync(Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text), "add ."); + await GithubActions.RunGitAsync(Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text), "commit -m \"Initial commit from " + MainWindow.appName + "\""); + await GithubActions.RunGitAsync(Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text), "push -u origin main"); + + Console.WriteLine(Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text) + " add ."); + Console.WriteLine(Path.Combine(txtNewProjectFolder.Text, txtNewProjectName.Text) + " commit -m \"Initial commit from " + MainWindow.appName + "\""); + + txtNewProjectStatus.Text += " | Initial commit created"; + } + catch (Exception ex) + { + txtNewProjectStatus.Text += " | Initial commit failed: " + ex.Message; + Console.WriteLine("failed commit"); + } + } + + Tools.OpenURL("https://github.com/" + repoOwner + "/" + txtRepoName.Text); - // save last used value for platform - Properties.Settings.Default.newProjectPlatform = cmbNewProjectPlatform.SelectedValue.ToString(); - Properties.Settings.Default.Save(); + } // if version control enabled + + } + finally + { + isCreatingProject = false; + UpdateCreateButtonsEnabledState(); + } DialogResult = true; } + private void UpdateCreateButtonsEnabledState() + { + bool folderExists = Directory.Exists(txtNewProjectFolder.Text); + bool projectNameAvailable = !string.IsNullOrWhiteSpace(txtNewProjectName.Text) && !Directory.Exists(Path.Combine(targetFolder, txtNewProjectName.Text)); + bool onlineTemplateReady = !(listOnlineTemplates.SelectedItem is OnlineTemplateItem selectedOnlineTemplate) || selectedOnlineTemplate.IsDownloaded; + bool versionControlEnabled = chkEnableVersionControl.IsChecked == true; + + btnCreateNewProject.IsEnabled = folderExists && projectNameAvailable && onlineTemplateReady && !isCreatingProject; + btnCreateNewProjectAndRepo.IsEnabled = btnCreateNewProject.IsEnabled && versionControlEnabled; + } + + private void BtnCancelNewProject_Click(object sender, RoutedEventArgs e) { DialogResult = false; } - private void Window_PreviewKeyDown(object sender, KeyEventArgs e) + private async void Window_PreviewKeyDown(object sender, KeyEventArgs e) { switch (e.Key) { @@ -178,7 +507,7 @@ private void Window_PreviewKeyDown(object sender, KeyEventArgs e) e.Handled = true; // override writing to textbox break; case Key.Enter: // enter, create proj - BtnCreateNewProject_Click(null, null); + await CreateNewProject(withRepo: false); e.Handled = true; break; case Key.Escape: // esc cancel @@ -241,18 +570,19 @@ private void TxtNewProjectName_TextChanged(object sender, TextChangedEventArgs e System.Console.WriteLine("Project already exists"); txtNewProjectName.BorderBrush = Brushes.Red; // not visible if focused txtNewProjectName.ToolTip = "Project folder already exists"; - btnCreateNewProject.IsEnabled = false; } else { txtNewProjectName.BorderBrush = null; - btnCreateNewProject.IsEnabled = true; txtNewProjectName.ToolTip = ""; } + UpdateCreateButtonsEnabledState(); + //System.Console.WriteLine("newProjectName: " + txtNewProjectName.Text); newProjectName = txtNewProjectName.Text; + if (chkEnableVersionControl.IsChecked == true) txtRepoName.Text = newProjectName; } private void TxtNewProjectName_PreviewKeyDown(object sender, KeyEventArgs e) @@ -292,7 +622,19 @@ private void GridAvailableVersions_SelectionChanged(object sender, SelectionChan // hide forceDX11 checkbox if version is below 6000 bool is6000 = k.Version.Contains("6000"); - chkForceDX11.Visibility = is6000 ? Visibility.Visible : Visibility.Collapsed; + lblOverride.Visibility = chkForceDX11.Visibility = is6000 ? Visibility.Visible : Visibility.Collapsed; + //chkForceDX11.IsChecked = chkForceDX11.Visibility == Visibility.Visible ? forceDX11 : false; + forceDX11 = Settings.Default.forceDX11 && is6000; + + listOnlineTemplates.ItemsSource = null; // clear previous items + if (loadOnlineTemplates) + { + string baseVersion = Tools.GetBaseVersion(k.Version); + // Cancel previous request + _templateLoadCancellation?.Cancel(); + _templateLoadCancellation = new CancellationTokenSource(); + _ = LoadOnlineTemplatesAsync(baseVersion, _templateLoadCancellation.Token); + } } private void GridAvailableVersions_Loaded(object sender, RoutedEventArgs e) @@ -317,25 +659,73 @@ private void CmbNewProjectPlatform_DropDownOpened(object sender, System.EventArg previousSelectedModuleIndex = cmbNewProjectPlatform.SelectedIndex; } - private void gridAvailableVersions_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) + private async void gridAvailableVersions_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { // check that we clicked actually on a row var src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource); var srcType = src.GetType(); if (srcType == typeof(ContentPresenter)) { - BtnCreateNewProject_Click(null, null); + await CreateNewProject(withRepo: false); } } private void chkForceDX11_Checked(object sender, RoutedEventArgs e) { - forceDX11 = chkForceDX11.IsChecked == true; + if (isInitializing) return; // Don't save during initialization + + Settings.Default.forceDX11 = forceDX11; + Settings.Default.Save(); + } + + private void chkEnableVersionControl_Checked(object sender, RoutedEventArgs e) + { + bool state = chkEnableVersionControl.IsChecked == true; + + btnCreateNewProjectAndRepo.IsEnabled = state; + + if (isInitializing) return; + + // lock controls + rbPrivate.IsEnabled = state; + rbPublic.IsEnabled = state; + txtRepoName.IsEnabled = state; + txtRepoDescription.IsEnabled = state; + chkEnableLfs.IsEnabled = state; + chkInitialCommit.IsEnabled = state; + //chkAddUnityGitIgnore.IsEnabled = state; + //chkAddReadme.IsEnabled = state; + + Settings.Default.gitEnableVersionControl = state; + Settings.Default.Save(); } private void btnBrowseForProjectFolder_Click(object sender, RoutedEventArgs e) { - var folder = Tools.BrowseForOutputFolder("Select New Project folder"); + string defaultFolder = null; + if (txtNewProjectFolder.Text != null) + { + if (Directory.Exists(txtNewProjectFolder.Text) == true) + { + defaultFolder = txtNewProjectFolder.Text; + } + else + { + // find closest existing parent folder + var dir = new DirectoryInfo(txtNewProjectFolder.Text); + while (dir.Parent != null) + { + dir = dir.Parent; + if (Directory.Exists(dir.FullName) == true) + { + defaultFolder = dir.FullName; + break; + } + } + } + } + + var folder = Tools.BrowseForOutputFolder("Select New Project folder", defaultFolder); if (string.IsNullOrEmpty(folder) == false && Directory.Exists(folder) == true) { txtNewProjectFolder.Text = folder; @@ -349,14 +739,609 @@ private void txtNewProjectFolder_TextChanged(object sender, TextChangedEventArgs if (Directory.Exists(txtNewProjectFolder.Text) == false) { txtNewProjectFolder.BorderBrush = Brushes.Red; // not visible if focused - btnCreateNewProject.IsEnabled = false; + btnCreateMissingFolder.IsEnabled = true; } else { + txtNewProjectFolder.BorderBrush = null; + targetFolder = txtNewProjectFolder.Text; + btnCreateMissingFolder.IsEnabled = false; + } + + UpdateCreateButtonsEnabledState(); + } + + private void btnCreateMissingFolder_Click(object sender, RoutedEventArgs e) + { + try + { + Directory.CreateDirectory(txtNewProjectFolder.Text); txtNewProjectFolder.BorderBrush = null; btnCreateNewProject.IsEnabled = true; targetFolder = txtNewProjectFolder.Text; } + catch (Exception ex) + { + Tools.SetStatus("Failed to create folder: " + ex.Message); + } } - } -} + + private static readonly HttpClient _httpClient = new HttpClient(); + + private async Task LoadGithubOrgsAsync(string token) + { + cmbGithubOrgs.IsEnabled = chkEnableOrgs.IsChecked == true; + if (chkEnableOrgs.IsChecked != true) return; + + var orgs = await GithubActions.GetUserOrganizationsAsync(token); + cmbGithubOrgs.ItemsSource = orgs; + + var lastOrg = Settings.Default.gitLastOrg; + if (!string.IsNullOrWhiteSpace(lastOrg) && orgs.Contains(lastOrg)) + { + cmbGithubOrgs.SelectedItem = lastOrg; + } + else if (orgs.Count > 0) + { + cmbGithubOrgs.SelectedIndex = 0; + } + else + { + cmbGithubOrgs.SelectedIndex = -1; + } + } + + private void cmbGithubOrgs_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (isInitializing) return; + + var selectedOrg = cmbGithubOrgs.SelectedItem as string; + if (string.IsNullOrWhiteSpace(selectedOrg)) return; + + Settings.Default.gitLastOrg = selectedOrg; + Settings.Default.Save(); + } + + private async Task LoadOnlineTemplatesAsync(string baseVersion, CancellationToken cancellationToken = default) + { + try + { + _httpClient.DefaultRequestHeaders.Remove("Accept"); + _httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); + + var graphqlJson = "{\"query\":\"fragment TemplateEntity on Template { __typename name packageName description type buildPlatforms renderPipeline previewImage { url } versions { name tarball { url } } } query HUB__getTemplates($limit: Int! $skip: Int! $orderBy: TemplateOrder! $supportedUnityEditorVersions: [String!]!) { getTemplates(limit: $limit skip: $skip orderBy: $orderBy supportedUnityEditorVersions: $supportedUnityEditorVersions) { edges { node { ...TemplateEntity } } } }\",\"variables\":{\"limit\":40,\"skip\":0,\"orderBy\":\"WEIGHTED_DESC\",\"supportedUnityEditorVersions\":[\"" + baseVersion + "\"]}}"; + + var content = new StringContent(graphqlJson, Encoding.UTF8, "application/json"); + + // Check for cancellation before making request + if (cancellationToken.IsCancellationRequested) return; + + var response = await _httpClient.PostAsync("https://live-platform-api.prd.ld.unity3d.com/graphql", content, cancellationToken); + + // Check for cancellation after request + if (cancellationToken.IsCancellationRequested) return; + + if (response.IsSuccessStatusCode) + { + var responseString = await response.Content.ReadAsStringAsync(); + + // Check for cancellation before parsing + if (cancellationToken.IsCancellationRequested) return; + + var templates = ParseTemplatesFromJson(responseString); + + // Download preview images to bypass WPF's ClickOnce security check on HTTPS URIs + foreach (var template in templates) + { + if (cancellationToken.IsCancellationRequested) return; + + try + { + if (!string.IsNullOrEmpty(template.PreviewImageURL) && !template.PreviewImageURL.StartsWith("pack://")) + { + var imageData = await _httpClient.GetByteArrayAsync(template.PreviewImageURL); + var bitmap = new BitmapImage(); + bitmap.BeginInit(); + bitmap.CacheOption = BitmapCacheOption.OnLoad; + bitmap.StreamSource = new MemoryStream(imageData); + bitmap.EndInit(); + if (bitmap.CanFreeze) bitmap.Freeze(); + template.PreviewImage = bitmap; + } + } + catch + { + // Failed to download preview image, leave PreviewImage as null + } + } + + // Update UI on dispatcher thread only if not cancelled + if (!cancellationToken.IsCancellationRequested) + { + Dispatcher.Invoke(() => + { + // Only set ItemsSource, don't touch Items + listOnlineTemplates.ItemsSource = templates; + }); + } + } + else + { + Console.WriteLine($"GraphQL request failed: {response.StatusCode}"); + } + } + catch (OperationCanceledException) + { + // Request was cancelled, this is expected + Console.WriteLine("Template loading cancelled"); + } + catch (Exception ex) + { + if (!cancellationToken.IsCancellationRequested) + { + Console.WriteLine($"Error loading online templates: {ex.Message}"); + } + } + } + + private void LoadFallbackTemplates() + { + var templates = new List + { + new OnlineTemplateItem + { + Name = "3D Template", + Description = "A great starting point for 3D projects using the Universal Render Pipeline (URP).", + PreviewImageURL = "pack://application:,,,/Images/icon.png", + Type = "CORE", + RenderPipeline = "URP" + } + }; + + Dispatcher.Invoke(() => + { + // Only set ItemsSource, don't use Items.Clear() + listOnlineTemplates.ItemsSource = templates; + }); + } + + private List ParseTemplatesFromJson(string json) + { + var templates = new List(); + + try + { + // Get templates directory path + string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + string templatesPath = Path.Combine(appDataPath, "UnityHub", "Templates"); + + // Find the edges array + int edgesStart = json.IndexOf("\"edges\":"); + if (edgesStart == -1) return templates; + + // Find all node objects + int currentPos = edgesStart; + while (true) + { + int nodeStart = json.IndexOf("{\"__typename\":\"Template\"", currentPos); + if (nodeStart == -1) break; + + // Find the end of this node object (simplified - find matching brace) + int nodeEnd = JsonParser.FindMatchingBrace(json, nodeStart); + if (nodeEnd == -1) break; + + string nodeJson = json.Substring(nodeStart, nodeEnd - nodeStart + 1); + + // Parse individual fields + var tarballUrl = JsonParser.ExtractNestedJsonString(nodeJson, "\"tarball\"", "\"url\""); + var rawDescription = JsonParser.ExtractJsonString(nodeJson, "\"description\""); + var splitDescription = Tools.SplitTextToRows(rawDescription, 3); + + var template = new OnlineTemplateItem + { + Name = JsonParser.ExtractJsonString(nodeJson, "\"name\""), + Description = splitDescription, + Type = JsonParser.ExtractJsonString(nodeJson, "\"type\""), + RenderPipeline = JsonParser.ExtractJsonString(nodeJson, "\"renderPipeline\""), + PreviewImageURL = JsonParser.ExtractNestedJsonString(nodeJson, "\"previewImage\"", "\"url\"") ?? "pack://application:,,,/Images/icon.png", + TarBallURL = tarballUrl, + IsDownloaded = false + }; + + // Check if template file already exists + if (!string.IsNullOrEmpty(tarballUrl) && Directory.Exists(templatesPath)) + { + try + { + string fileName = Path.GetFileName(new Uri(tarballUrl).LocalPath); + if (!string.IsNullOrEmpty(fileName)) + { + string filePath = Path.Combine(templatesPath, fileName); + template.IsDownloaded = File.Exists(filePath); + } + } + catch + { + // If URL parsing fails, keep IsDownloaded as false + } + } + + templates.Add(template); + currentPos = nodeEnd + 1; + } + } + catch (Exception ex) + { + Console.WriteLine($"Error parsing templates: {ex.Message}"); + } + + return templates; + } + + private void listOnlineTemplates_PreviewMouseDown(object sender, MouseButtonEventArgs e) + { + // Get the item that was clicked + var listBox = sender as ListBox; + if (listBox == null) return; + + // Find the ListBoxItem that was clicked + var clickedElement = e.OriginalSource as DependencyObject; + while (clickedElement != null && clickedElement != listBox) + { + if (clickedElement is ListBoxItem) + { + var clickedItem = clickedElement as ListBoxItem; + + // If the clicked item is already selected, deselect it + if (clickedItem.IsSelected) + { + listBox.SelectedItem = null; + e.Handled = true; + return; + } + break; + } + clickedElement = VisualTreeHelper.GetParent(clickedElement); + } + } + + private void listOnlineTemplates_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (listOnlineTemplates.SelectedItem is OnlineTemplateItem selectedTemplate) + { + lblSelectedTemplate.Content = selectedTemplate.Name; + lblSelectedTemplate.BorderThickness = new Thickness(1); + + // Disable built-in template dropdown when online template is selected + cmbNewProjectTemplate.IsEnabled = false; + cmbNewProjectTemplate.SelectedIndex = 0; // Reset to default + + btnCreateNewProject.Content = selectedTemplate.IsDownloaded ? "Create Project" : "Download Template First >"; + } + else + { + lblSelectedTemplate.Content = "None"; + lblSelectedTemplate.BorderThickness = new Thickness(0); + + // Re-enable built-in template dropdown when no online template is selected + cmbNewProjectTemplate.IsEnabled = true; + + // enable create button + btnCreateNewProject.Content = "Create Project"; + } + + UpdateCreateButtonsEnabledState(); + } + + private async void btnDownloadTemplate_Click(object sender, RoutedEventArgs e) + { + var button = sender as Button; + if (button?.Tag is OnlineTemplateItem template) + { + if (string.IsNullOrEmpty(template.TarBallURL)) + { + Tools.SetStatus("No download URL available for this template"); + return; + } + + try + { + // Disable button during download + button.IsEnabled = false; + button.Content = "⏳"; + + // Create templates directory in %APPDATA%\UnityHub\Templates + string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + string templatesPath = Path.Combine(appDataPath, "UnityHub", "Templates"); + + if (!Directory.Exists(templatesPath)) + { + Directory.CreateDirectory(templatesPath); + } + + // Extract original filename from URL + string fileName = Path.GetFileName(new Uri(template.TarBallURL).LocalPath); + if (string.IsNullOrEmpty(fileName)) + { + // Fallback to sanitized template name if URL doesn't have a filename + string safeFileName = string.Join("_", template.Name.Split(Path.GetInvalidFileNameChars())); + fileName = $"{safeFileName}.tgz"; + } + + string targetFilePath = Path.Combine(templatesPath, fileName); + + // Download the template (overwrite if exists) + using (var client = new HttpClient()) + { + var response = await client.GetAsync(template.TarBallURL); + response.EnsureSuccessStatusCode(); + + var fileBytes = await response.Content.ReadAsByteArrayAsync(); + File.WriteAllBytes(targetFilePath, fileBytes); + + // Mark as downloaded + template.IsDownloaded = true; + + Tools.SetStatus($"Template downloaded: {template.Name}"); + + // Refresh no longer needed with INotifyPropertyChanged + // listOnlineTemplates.Items.Refresh(); + } + } + catch (Exception ex) + { + Tools.SetStatus($"Download failed: {ex.Message}"); + Console.WriteLine($"Error downloading template: {ex.Message}"); + } + finally + { + // Re-enable button + button.IsEnabled = true; + button.Content = "⬇"; + } + } + } + + private void btnFetchTemplates_Click(object sender, RoutedEventArgs e) + { + if (gridAvailableVersions.SelectedItem is UnityInstallation selectedInstallation) + { + string baseVersion = Tools.GetBaseVersion(selectedInstallation.Version); + _templateLoadCancellation?.Cancel(); + _templateLoadCancellation = new CancellationTokenSource(); + _ = LoadOnlineTemplatesAsync(baseVersion, _templateLoadCancellation.Token); + } + } + + private void btnCreateToken_Click(object sender, RoutedEventArgs e) + { + string tokenUrl = githubTokenCreationURL; + if (chkEnableOrgs.IsChecked == true) + { + tokenUrl = tokenUrl.Replace("scopes=repo", "scopes=repo,read:org"); + } + Tools.OpenURL(tokenUrl); + } + + + + private void ShowGitAuthorizedUI(bool show) + { + txtTokenInput.Password = null; + + if (show) + { + var username = GitHubTokenStore.LoadUsername(); + + lblGithubUsername.Content = username; + + chkEnableVersionControl.IsChecked = true; + chkEnableVersionControl.IsEnabled = true; + + txtTokenInput.Visibility = Visibility.Collapsed; + btnAuthorizeToken.Visibility = Visibility.Collapsed; + btnDisconnectToken.Visibility = Visibility.Visible; + lblConnected.Visibility = Visibility.Visible; + lblNotConnected.Visibility = Visibility.Collapsed; + btnCreateToken.Visibility = Visibility.Collapsed; + + btnCreateToken.IsEnabled = false; + btnDisconnectToken.IsEnabled = true; + btnAuthorizeToken.IsEnabled = false; + } + else + { + lblGithubUsername.Content = string.Empty; + + chkEnableVersionControl.IsChecked = false; + chkEnableVersionControl.IsEnabled = false; + + txtTokenInput.Visibility = Visibility.Visible; + btnAuthorizeToken.Visibility = Visibility.Visible; + btnDisconnectToken.Visibility = Visibility.Collapsed; + lblConnected.Visibility = Visibility.Collapsed; + lblNotConnected.Visibility = Visibility.Visible; + btnCreateToken.Visibility = Visibility.Visible; + + btnDisconnectToken.IsEnabled = false; + btnAuthorizeToken.IsEnabled = true; + btnCreateToken.IsEnabled = true; + } + } + + private async void btnAuthorizeToken_Click(object sender, RoutedEventArgs e) + { + string token = txtTokenInput.Password.Trim(); + + btnAuthorizeToken.IsEnabled = false; + btnDisconnectToken.IsEnabled = true; + + txtNewProjectStatus.Text = "Validating token..."; + + lblConnected.Visibility = Visibility.Collapsed; + lblNotConnected.Visibility = Visibility.Visible; + + try + { + GitHubTokenValidationResult result = await GitHubAuth.ValidateTokenAsync(token); + + if (result.IsValid) + { + GitHubTokenStore.SaveToken(token, result.Login); + txtNewProjectStatus.Text = "Token valid. Logged in as " + result.Login + "."; + lblGithubUsername.Content = result.Login; + ShowGitAuthorizedUI(true); + await LoadGithubOrgsAsync(token); + } + else + { + txtNewProjectStatus.Text = result.Error; + ShowGitAuthorizedUI(false); + } + } + finally + { + btnAuthorizeToken.IsEnabled = true; + } + + Settings.Default.Save(); + } + + private void chkEnableLfs_Checked(object sender, RoutedEventArgs e) + { + if (isInitializing) return; + + Settings.Default.gitIEnableLFS = chkEnableLfs.IsChecked == true; + Settings.Default.Save(); + } + + private void chkInitialCommit_Checked(object sender, RoutedEventArgs e) + { + if (isInitializing) return; + + Settings.Default.gitInitialCommit = chkInitialCommit.IsChecked == true; + Settings.Default.Save(); + } + + private void chkAddReadme_Checked(object sender, RoutedEventArgs e) + { + if (isInitializing) return; + + Settings.Default.gitAddReadme = chkAddReadme.IsChecked == true; + Settings.Default.Save(); + } + + private void chkAddUnityGitIgnore_Checked(object sender, RoutedEventArgs e) + { + if (isInitializing) return; + + Settings.Default.gitAddIgnore = chkAddUnityGitIgnore.IsChecked == true; + Settings.Default.Save(); + } + + private async void chkEnableOrgs_Checked(object sender, RoutedEventArgs e) + { + if (isInitializing) return; + + Settings.Default.gitEnableOrgs = chkEnableOrgs.IsChecked == true; + Settings.Default.Save(); + UpdateOrgUiState(); + + var enabled = chkEnableOrgs.IsChecked == true; + cmbGithubOrgs.IsEnabled = enabled; + + if (!enabled) + { + var selectedOrg = cmbGithubOrgs.SelectedItem as string; + if (!string.IsNullOrWhiteSpace(selectedOrg)) + { + Settings.Default.gitLastOrg = selectedOrg; + Settings.Default.Save(); + } + + cmbGithubOrgs.ItemsSource = null; + cmbGithubOrgs.SelectedIndex = -1; + return; + } + + var token = GitHubTokenStore.LoadToken(); + if (string.IsNullOrWhiteSpace(token)) return; + + await LoadGithubOrgsAsync(token); + } + + private CancellationTokenSource _repoNameCts; + + private async void txtRepoName_TextChanged(object sender, TextChangedEventArgs e) + { + _repoNameCts?.Cancel(); + _repoNameCts = new CancellationTokenSource(); + var token = _repoNameCts.Token; + lblRepoNameValid.Visibility = Visibility.Collapsed; + lblRepoNameInvalid.Visibility = Visibility.Visible; + + await Task.Delay(750); + + if (token.IsCancellationRequested) return; + + var username = GitHubTokenStore.LoadUsername(); + var res = await GithubActions.ValidateRepoName(txtRepoName.Text, username); + + if (token.IsCancellationRequested) return; + + if (res != null) + { + txtNewProjectStatus.Text = res; + lblRepoNameValid.Visibility = Visibility.Collapsed; + lblRepoNameInvalid.Visibility = Visibility.Visible; + lblRepoNameInvalid.ToolTip = res; + } + else + { + lblRepoNameValid.Visibility = Visibility.Visible; + lblRepoNameInvalid.Visibility = Visibility.Collapsed; + lblRepoNameInvalid.ToolTip = ""; + } + } + + private void expVersionControl_Collapsed(object sender, RoutedEventArgs e) + { + if (isInitializing) return; + + Settings.Default.gitPanelExpanded = expVersionControl.IsExpanded; + Settings.Default.Save(); + } + + private void btnDisconnectToken_Click(object sender, RoutedEventArgs e) + { + GitHubTokenStore.DeleteToken(); + cmbGithubOrgs.ItemsSource = null; + cmbGithubOrgs.SelectedIndex = -1; + Settings.Default.Save(); + ShowGitAuthorizedUI(false); + } + + private void txtTokenInput_PasswordChanged(object sender, RoutedEventArgs e) + { + bool tokenSeemsOK = false; + + if (string.IsNullOrWhiteSpace(txtTokenInput.Password)) return; + + if (txtTokenInput.Password.StartsWith("ghp_") && txtTokenInput.Password.Length == 40) + { + btnAuthorizeToken.IsEnabled = true; + txtTokenInput.BorderBrush = Brushes.Green; + tokenSeemsOK = true; + } + else + { + btnAuthorizeToken.IsEnabled = false; + txtTokenInput.BorderBrush = Brushes.Red; + } + + btnAuthorizeToken.IsEnabled = tokenSeemsOK; + } + + + } // class NewProject +} // namespace UnityLauncherPro diff --git a/UnityLauncherPro/Properties/Settings.Designer.cs b/UnityLauncherPro/Properties/Settings.Designer.cs index 448598d..c107c1f 100644 --- a/UnityLauncherPro/Properties/Settings.Designer.cs +++ b/UnityLauncherPro/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace UnityLauncherPro.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "18.6.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -637,5 +637,137 @@ public bool fetchAdditionalInfo { this["fetchAdditionalInfo"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool forceDX11 { + get { + return ((bool)(this["forceDX11"])); + } + set { + this["forceDX11"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool fetchOnlineTemplates { + get { + return ((bool)(this["fetchOnlineTemplates"])); + } + set { + this["fetchOnlineTemplates"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool gitIEnableLFS { + get { + return ((bool)(this["gitIEnableLFS"])); + } + set { + this["gitIEnableLFS"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool gitInitialCommit { + get { + return ((bool)(this["gitInitialCommit"])); + } + set { + this["gitInitialCommit"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool gitAddReadme { + get { + return ((bool)(this["gitAddReadme"])); + } + set { + this["gitAddReadme"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool gitPanelExpanded { + get { + return ((bool)(this["gitPanelExpanded"])); + } + set { + this["gitPanelExpanded"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool gitEnableVersionControl { + get { + return ((bool)(this["gitEnableVersionControl"])); + } + set { + this["gitEnableVersionControl"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool showRecoveredScenePopup { + get { + return ((bool)(this["showRecoveredScenePopup"])); + } + set { + this["showRecoveredScenePopup"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool gitAddIgnore { + get { + return ((bool)(this["gitAddIgnore"])); + } + set { + this["gitAddIgnore"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool gitEnableOrgs { + get { + return ((bool)(this["gitEnableOrgs"])); + } + set { + this["gitEnableOrgs"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string gitLastOrg { + get { + return ((string)(this["gitLastOrg"])); + } + set { + this["gitLastOrg"] = value; + } + } } } diff --git a/UnityLauncherPro/Properties/Settings.settings b/UnityLauncherPro/Properties/Settings.settings index 6cea055..dfa2553 100644 --- a/UnityLauncherPro/Properties/Settings.settings +++ b/UnityLauncherPro/Properties/Settings.settings @@ -160,5 +160,38 @@ False + + False + + + True + + + True + + + False + + + False + + + False + + + False + + + True + + + True + + + False + + + + \ No newline at end of file diff --git a/UnityLauncherPro/Resources/.gitattributes b/UnityLauncherPro/Resources/.gitattributes new file mode 100644 index 0000000..859c559 --- /dev/null +++ b/UnityLauncherPro/Resources/.gitattributes @@ -0,0 +1,163 @@ +# Define macros (only works in top-level gitattributes files) +[attr]lfs filter=lfs diff=lfs merge=lfs -text +[attr]unity-json eol=lf linguist-language=json +[attr]unity-yaml merge=unityyamlmerge eol=lf linguist-language=yaml + +# Optionally collapse Unity YAML files on GitHub diffs +# [attr]unity-yaml merge=unityyamlmerge text linguist-language=yaml linguist-generated + +# Unity source files +*.cginc text +*.compute text linguist-language=hlsl +*.cs text diff=csharp +*.hlsl text linguist-language=hlsl +*.raytrace text linguist-language=hlsl +*.shader text + +# Unity JSON files +*.asmdef unity-json +*.asmref unity-json +*.index unity-json +*.inputactions unity-json +*.shadergraph unity-json +*.shadersubgraph unity-json + +# Unity UI Toolkit files +*.tss text diff=css linguist-language=css +*.uss text diff=css linguist-language=css +*.uxml text linguist-language=xml linguist-detectable + +# Unity YAML files +*.anim unity-yaml +*.asset unity-yaml +*.brush unity-yaml +*.controller unity-yaml +*.flare unity-yaml +*.fontsettings unity-yaml +*.giparams unity-yaml +*.guiskin unity-yaml +*.lighting unity-yaml +*.mask unity-yaml +*.mat unity-yaml +*.meta unity-yaml +*.mixer unity-yaml +*.overrideController unity-yaml +*.playable unity-yaml +*.prefab unity-yaml +*.preset unity-yaml +*.renderTexture unity-yaml +*.scenetemplate unity-yaml +*.shadervariants unity-yaml +*.signal unity-yaml +*.spriteatlas unity-yaml +*.spriteatlasv2 unity-yaml +*.terrainlayer unity-yaml +*.unity unity-yaml + +# "physic" for 3D but "physics" for 2D +*.physicMaterial unity-yaml +*.physicsMaterial2D unity-yaml + +# Exclude from GitHub stats and diffs: third-party plugins, packages lock file +Assets/Plugins/** linguist-generated +Packages/packages-lock.json linguist-generated + +# Unity LFS +*.cubemap lfs +*.unitypackage lfs + +# 3D models +*.3dm lfs +*.3ds lfs +*.blend lfs +*.blend1 lfs +*.c4d lfs +*.collada lfs +*.dae lfs +*.dxf lfs +*.FBX lfs +*.fbx lfs +*.jas lfs +*.lws lfs +*.lxo lfs +*.ma lfs +*.max lfs +*.mb lfs +*.obj lfs +*.ply lfs +*.skp lfs +*.stl lfs +*.ztl lfs + +# Audio +*.aif lfs +*.aiff lfs +*.it lfs +*.mod lfs +*.mp3 lfs +*.ogg lfs +*.s3m lfs +*.wav lfs +*.xm lfs + +# Video +*.asf lfs +*.avi lfs +*.flv lfs +*.mov lfs +*.mp4 lfs +*.mpeg lfs +*.mpg lfs +*.ogv lfs +*.wmv lfs + +# Images +*.bmp lfs +*.exr lfs +*.gif lfs +*.hdr lfs +*.iff lfs +*.jpeg lfs +*.jpg lfs +*.pict lfs +*.png lfs +*.psd lfs +*.tga lfs +*.tif lfs +*.tiff lfs +*.webp lfs + +# Compressed Archive +*.7z lfs +*.bz2 lfs +*.gz lfs +*.rar lfs +*.tar lfs +*.zip lfs + +# Compiled Dynamic Library +*.dll lfs +*.pdb lfs +*.so lfs + +# Fonts +*.otf lfs +*.ttf lfs + +# Executable/Installer +*.apk lfs +*.exe lfs + +# Documents +*.pdf lfs + +# ETC +*.a lfs +*.reason lfs +*.rns lfs + +# Spine export file for Unity +*.skel.bytes lfs + +# Exceptions for .asset files such as lightning pre-baking +LightingData.asset binary diff --git a/UnityLauncherPro/Resources/.gitignore b/UnityLauncherPro/Resources/.gitignore new file mode 100644 index 0000000..3c335ae --- /dev/null +++ b/UnityLauncherPro/Resources/.gitignore @@ -0,0 +1,106 @@ +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore +# +# Recommended: add any editor/OS/tool-specific ignore rules from the Global/ templates as needed. +# See: https://github.com/github/gitignore/tree/main/Global +# +.utmp/ +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ +*.log + +# By default unity supports Blender asset imports, *.blend1 blender files do not need to be commited to version control. +*.blend1 +*.blend1.meta + +# MemoryCaptures can get excessive in size. +# They also could contain extremely sensitive data +/[Mm]emoryCaptures/ + +# Recordings can get excessive in size +/[Rr]ecordings/ + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + +# Autogenerated Jetbrains Rider plugin +/[Aa]ssets/Plugins/Editor/JetBrains* +# Jetbrains Rider personal-layer settings +*.DotSettings.user + +# Visual Studio cache directory +.vs/ + +# Gradle cache directory +.gradle/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.slnx +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Mono auto generated files +mono_crash.* + +# Builds +*.apk +*.aab +*.unitypackage +*.unitypackage.meta +*.app + +# Crashlytics generated file +crashlytics-build.properties + +# TestRunner generated files +InitTestScene*.unity* + +# Addressables default ignores, before user customizations +/ServerData +/[Aa]ssets/StreamingAssets/aa* +/[Aa]ssets/AddressableAssetsData/link.xml* +/[Aa]ssets/Addressables_Temp* +# By default, Addressables content builds will generate addressables_content_state.bin +# files in platform-specific subfolders, for example: +# /Assets/AddressableAssetsData/OSX/addressables_content_state.bin +/[Aa]ssets/AddressableAssetsData/*/*.bin* + +# Visual Scripting auto-generated files +/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db +/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db.meta +/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers +/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers.meta + +# Auto-generated scenes by play mode tests +/[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity* + +# Auto-generated cache in Assets folder +/[Aa]ssets/[Ss]ceneDependencyCache* diff --git a/UnityLauncherPro/Resources/UnityVersionCache.json b/UnityLauncherPro/Resources/UnityVersionCache.json index 50f65d5..709f738 100644 --- a/UnityLauncherPro/Resources/UnityVersionCache.json +++ b/UnityLauncherPro/Resources/UnityVersionCache.json @@ -1 +1 @@ -[{"version":"6000.3.0b3","releaseDate":"2025-09-30T21:20:55.2365253+03:00","stream":"Beta"},{"version":"6000.3.0b4","releaseDate":"2025-09-30T21:20:55.2365253+03:00","stream":"Beta"},{"version":"6000.3.0b3","releaseDate":"2025-09-25T12:32:28.8700000+03:00","stream":"Tech"},{"version":"6000.2.6f1","releaseDate":"2025-09-25T12:31:26.1340000+03:00","stream":"Tech"},{"version":"6000.3.0b2","releaseDate":"2025-09-17T14:13:50.6420000+03:00","stream":"Tech"},{"version":"6000.2.5f1","releaseDate":"2025-09-17T08:28:37.0430000+03:00","stream":"Tech"},{"version":"6000.0.58f1","releaseDate":"2025-09-17T08:27:16.4870000+03:00","stream":"Tech"},{"version":"6000.2.4f1","releaseDate":"2025-09-12T12:50:41.4540000+03:00","stream":"Tech"},{"version":"6000.3.0b1","releaseDate":"2025-09-09T19:50:04.5110000+03:00","stream":"Tech"},{"version":"6000.2.3f1","releaseDate":"2025-09-04T18:48:31.8630000+03:00","stream":"Tech"},{"version":"6000.0.57f1","releaseDate":"2025-09-03T12:18:47.7990000+03:00","stream":"Tech"},{"version":"6000.2.2f1","releaseDate":"2025-08-26T23:57:12.7490000+03:00","stream":"Tech"},{"version":"6000.3.0a5","releaseDate":"2025-08-21T12:46:22.7360000+03:00","stream":"Tech"},{"version":"6000.2.1f1","releaseDate":"2025-08-20T21:26:03.3440000+03:00","stream":"Tech"},{"version":"6000.0.56f1","releaseDate":"2025-08-20T10:31:57.0100000+03:00","stream":"Tech"},{"version":"6000.1.16f1","releaseDate":"2025-08-13T13:01:50.9500000+03:00","stream":"Tech"},{"version":"6000.2.0f1","releaseDate":"2025-08-12T21:26:22.1900000+03:00","stream":"Tech"},{"version":"6000.2.0b13","releaseDate":"2025-08-08T01:59:59.6800000+03:00","stream":"Tech"},{"version":"6000.1.15f1","releaseDate":"2025-08-05T17:09:59.1050000+03:00","stream":"Tech"},{"version":"6000.0.55f1","releaseDate":"2025-08-05T16:33:24.7270000+03:00","stream":"Tech"},{"version":"6000.1.14f1","releaseDate":"2025-07-30T11:28:59.4950000+03:00","stream":"Tech"},{"version":"6000.2.0b12","releaseDate":"2025-07-29T20:28:17.2950000+03:00","stream":"Tech"},{"version":"6000.2.0b11","releaseDate":"2025-07-24T18:28:42.3790000+03:00","stream":"Tech"},{"version":"6000.3.0a3","releaseDate":"2025-07-23T18:26:41.8870000+03:00","stream":"Tech"},{"version":"6000.0.54f1","releaseDate":"2025-07-23T14:28:35.7140000+03:00","stream":"Tech"},{"version":"6000.1.13f1","releaseDate":"2025-07-23T09:54:37.0260000+03:00","stream":"Tech"},{"version":"6000.3.0a2","releaseDate":"2025-07-17T13:48:27.7620000+03:00","stream":"Tech"},{"version":"6000.2.0b10","releaseDate":"2025-07-16T16:54:47.1060000+03:00","stream":"Tech"},{"version":"6000.1.12f1","releaseDate":"2025-07-15T17:19:15.7530000+03:00","stream":"Tech"},{"version":"6000.2.0b9","releaseDate":"2025-07-09T19:49:32.8200000+03:00","stream":"Tech"},{"version":"6000.1.11f1","releaseDate":"2025-07-09T13:28:05.7180000+03:00","stream":"Tech"},{"version":"6000.0.53f1","releaseDate":"2025-07-09T09:34:27.5310000+03:00","stream":"Tech"},{"version":"6000.1.10f1","releaseDate":"2025-07-02T20:01:29.6990000+03:00","stream":"Tech"},{"version":"6000.2.0b8","releaseDate":"2025-07-02T19:48:35.9940000+03:00","stream":"Tech"},{"version":"6000.0.52f1","releaseDate":"2025-07-02T08:11:11.7010000+03:00","stream":"Tech"},{"version":"6000.2.0b7","releaseDate":"2025-06-24T18:49:01.1870000+03:00","stream":"Tech"},{"version":"6000.1.9f1","releaseDate":"2025-06-24T16:56:32.8380000+03:00","stream":"Tech"},{"version":"6000.1.8f1","releaseDate":"2025-06-18T08:09:52.6810000+03:00","stream":"Tech"},{"version":"6000.2.0b6","releaseDate":"2025-06-14T00:10:42.6505176+03:00","stream":"Beta"},{"version":"6000.1.7f1","releaseDate":"2025-06-11T16:28:11.0210000+03:00","stream":"Tech"},{"version":"6000.0.51f1","releaseDate":"2025-06-11T12:43:13.5700000+03:00","stream":"Tech"},{"version":"6000.2.0b5","releaseDate":"2025-06-05T21:43:56.6458275+03:00","stream":"Beta"},{"version":"6000.1.6f1","releaseDate":"2025-06-05T12:52:49.5640000+03:00","stream":"Tech"},{"version":"6000.2.0b4","releaseDate":"2025-06-04T08:33:17.6990000+03:00","stream":"Tech"},{"version":"6000.0.50f1","releaseDate":"2025-05-28T18:00:23.5230000+03:00","stream":"Tech"},{"version":"6000.1.5f1","releaseDate":"2025-05-28T17:09:19.2710000+03:00","stream":"Tech"},{"version":"6000.2.0b3","releaseDate":"2025-05-23T10:48:51.3054783+03:00","stream":"Beta"},{"version":"6000.1.4f1","releaseDate":"2025-05-21T12:38:18.0710000+03:00","stream":"Tech"},{"version":"6000.2.0b2","releaseDate":"2025-05-20T17:11:12.0840000+03:00","stream":"Tech"},{"version":"6000.2.0b1","releaseDate":"2025-05-15T12:05:37.2680000+03:00","stream":"Tech"},{"version":"6000.0.49f1","releaseDate":"2025-05-14T06:30:14.3260000+03:00","stream":"Tech"},{"version":"6000.1.3f1","releaseDate":"2025-05-14T06:29:42.5580000+03:00","stream":"Tech"},{"version":"2022.3.62f1","releaseDate":"2025-05-07T09:24:12.5330000+03:00","stream":"Tech"},{"version":"6000.1.2f1","releaseDate":"2025-05-06T20:34:03.1050000+03:00","stream":"Tech"},{"version":"6000.2.0a10","releaseDate":"2025-05-01T12:14:47.8870000+03:00","stream":"Tech"},{"version":"6000.1.1f1","releaseDate":"2025-04-29T19:39:51.9700000+03:00","stream":"Tech"},{"version":"6000.0.48f1","releaseDate":"2025-04-29T17:35:44.5230000+03:00","stream":"Tech"},{"version":"6000.1.0f1","releaseDate":"2025-04-23T19:39:14.5990000+03:00","stream":"Tech"},{"version":"6000.0.47f1","releaseDate":"2025-04-16T06:29:12.0920000+03:00","stream":"Tech"},{"version":"6000.1.0b15","releaseDate":"2025-04-16T06:28:31.9490000+03:00","stream":"Tech"},{"version":"6000.1.0b14","releaseDate":"2025-04-10T21:26:49.7290000+03:00","stream":"Tech"},{"version":"6000.0.46f1","releaseDate":"2025-04-10T05:59:39.0190000+03:00","stream":"Tech"},{"version":"6000.2.0a9","releaseDate":"2025-04-10T21:54:23.9518927+03:00","stream":"Alpha"},{"version":"2022.3.61f1","releaseDate":"2025-04-10T11:38:43.5390000+03:00","stream":"Tech"},{"version":"6000.1.0b13","releaseDate":"2025-04-03T17:02:05.1710000+03:00","stream":"Tech"},{"version":"6000.2.0a8","releaseDate":"2025-04-03T14:42:33.5640000+03:00","stream":"Tech"},{"version":"6000.0.45f1","releaseDate":"2025-04-02T20:28:25.2630000+03:00","stream":"Tech"},{"version":"6000.2.0a7","releaseDate":"2025-04-03T00:29:12.5673679+03:00","stream":"Alpha"},{"version":"6000.0.44f1","releaseDate":"2025-03-28T17:42:02.3830000+02:00","stream":"Tech"},{"version":"6000.1.0b12","releaseDate":"2025-03-28T17:41:15.4510000+02:00","stream":"Tech"},{"version":"6000.0.43f1","releaseDate":"2025-03-18T19:24:00.4850000+02:00","stream":"Tech"},{"version":"6000.1.0b11","releaseDate":"2025-03-13T23:12:53.3749487+02:00","stream":"Beta"},{"version":"6000.0.42f1","releaseDate":"2025-03-11T15:58:50.1000000+02:00","stream":"Tech"},{"version":"2022.3.60f1","releaseDate":"2025-03-12T12:34:20.8620000+02:00","stream":"Tech"},{"version":"6000.1.0b10","releaseDate":"2025-03-09T21:03:55.9859232+02:00","stream":"Beta"},{"version":"6000.2.0a6","releaseDate":"2025-03-05T12:38:42.7350000+02:00","stream":"Tech"},{"version":"6000.0.41f1","releaseDate":"2025-03-03T23:59:40.0490000+02:00","stream":"Tech"},{"version":"6000.1.0b9","releaseDate":"2025-02-26T20:38:37.1430029+02:00","stream":"Beta"},{"version":"2022.3.59f1","releaseDate":"2025-02-26T08:46:36.6070000+02:00","stream":"Tech"},{"version":"6000.0.40f1","releaseDate":"2025-02-25T18:31:05.0170000+02:00","stream":"Tech"},{"version":"6000.1.0b8","releaseDate":"2025-02-22T23:05:50.9086693+02:00","stream":"Beta"},{"version":"6000.2.0a4","releaseDate":"2025-02-19T16:48:33.1920000+02:00","stream":"Tech"},{"version":"6000.0.39f1","releaseDate":"2025-02-19T09:25:26.3610000+02:00","stream":"Tech"},{"version":"6000.1.0b7","releaseDate":"2025-02-19T09:25:03.6480000+02:00","stream":"Tech"},{"version":"2022.3.58f1","releaseDate":"2025-02-12T09:38:47.9230000+02:00","stream":"Tech"},{"version":"6000.1.0b6","releaseDate":"2025-02-11T17:27:26.4890000+02:00","stream":"Tech"},{"version":"6000.0.38f1","releaseDate":"2025-02-11T17:26:47.9610000+02:00","stream":"Tech"},{"version":"6000.1.0b5","releaseDate":"2025-02-04T18:57:33.9900000+02:00","stream":"Tech"},{"version":"6000.0.37f1","releaseDate":"2025-02-04T18:57:15.7990000+02:00","stream":"Tech"},{"version":"6000.2.0a1","releaseDate":"2025-01-29T12:20:51.8410000+02:00","stream":"Tech"},{"version":"2022.3.57f1","releaseDate":"2025-01-29T11:35:20.0040000+02:00","stream":"Tech"},{"version":"6000.1.0b4","releaseDate":"2025-01-28T20:18:53.6020000+02:00","stream":"Tech"},{"version":"6000.0.36f1","releaseDate":"2025-01-28T20:18:05.4190000+02:00","stream":"Tech"},{"version":"6000.0.35f1","releaseDate":"2025-01-22T20:20:41.5350000+02:00","stream":"Tech"},{"version":"6000.1.0b3","releaseDate":"2025-01-22T20:18:42.6480000+02:00","stream":"Tech"},{"version":"6000.1.0b2","releaseDate":"2025-01-16T14:57:55.2590000+02:00","stream":"Tech"},{"version":"6000.0.34f1","releaseDate":"2025-01-15T15:46:28.7450000+02:00","stream":"Tech"},{"version":"2022.3.56f1","releaseDate":"2025-01-15T09:37:15.3380000+02:00","stream":"Tech"},{"version":"6000.0.33f1","releaseDate":"2025-01-08T12:15:44.6480000+02:00","stream":"Tech"},{"version":"6000.1.0b1","releaseDate":"2025-01-07T23:50:17.2740000+02:00","stream":"Tech"},{"version":"6000.0.32f1","releaseDate":"2024-12-19T17:34:00.0720000+02:00","stream":"Tech"},{"version":"6000.1.0a9","releaseDate":"2024-12-18T10:40:10.1340000+02:00","stream":"Tech"},{"version":"2022.3.55f1","releaseDate":"2024-12-17T18:21:09.4100000+02:00","stream":"Tech"},{"version":"6000.1.0a8","releaseDate":"2024-12-15T18:28:59.7430639+02:00","stream":"Alpha"},{"version":"6000.0.31f1","releaseDate":"2024-12-10T22:18:02.5280000+02:00","stream":"Tech"},{"version":"6000.1.0a8","releaseDate":"2024-12-10T22:17:32.5920000+02:00","stream":"Tech"},{"version":"6000.1.0a7","releaseDate":"2024-12-05T08:33:50.3480000+02:00","stream":"Tech"},{"version":"6000.0.30f1","releaseDate":"2024-12-04T16:36:24.5510000+02:00","stream":"Tech"},{"version":"2022.3.54f1","releaseDate":"2024-12-04T16:24:52.8920000+02:00","stream":"Tech"},{"version":"6000.1.0a6","releaseDate":"2024-11-28T13:20:00.3060000+02:00","stream":"Tech"},{"version":"6000.0.29f1","releaseDate":"2024-11-28T11:51:13.4500000+02:00","stream":"Tech"},{"version":"6000.0.28f1","releaseDate":"2024-11-20T17:26:35.0740000+02:00","stream":"Tech"},{"version":"6000.1.0a5","releaseDate":"2024-11-20T06:47:45.8140000+02:00","stream":"Tech"},{"version":"2022.3.53f1","releaseDate":"2024-11-19T18:19:05.9770000+02:00","stream":"Tech"},{"version":"6000.0.27f1","releaseDate":"2024-11-14T09:07:52.6160000+02:00","stream":"Tech"},{"version":"6000.1.0a4","releaseDate":"2024-11-14T08:21:53.5470000+02:00","stream":"Tech"},{"version":"6000.1.0a3","releaseDate":"2024-10-31T02:09:14.4710000+02:00","stream":"Tech"},{"version":"6000.0.26f1","releaseDate":"2024-11-07T05:58:16.8120000+02:00","stream":"Tech"},{"version":"2022.3.52f1","releaseDate":"2024-11-06T08:44:56.0460000+02:00","stream":"Tech"},{"version":"6000.0.25f1","releaseDate":"2024-10-31T02:08:57.1640000+02:00","stream":"LTS"},{"version":"6000.1.0a2","releaseDate":"2024-10-31T01:18:23.1720000+02:00","stream":"Alpha"},{"version":"6000.0.24f1","releaseDate":"2024-10-24T07:50:49.7030000+03:00","stream":"LTS"},{"version":"2022.3.51f1","releaseDate":"2024-10-22T19:55:03.7950000+03:00","stream":"LTS"},{"version":"6000.0.23f1","releaseDate":"2024-10-17T02:50:12.5800000+03:00","stream":"LTS"},{"version":"2021.3.45f1","releaseDate":"2024-10-16T11:39:15.9770000+03:00","stream":"LTS"},{"version":"2022.3.50f1","releaseDate":"2024-10-09T12:22:48.6100000+03:00","stream":"LTS"},{"version":"6000.0.22f1","releaseDate":"2024-10-02T22:04:27.2050000+03:00","stream":"Tech"},{"version":"2022.3.49f1","releaseDate":"2024-10-01T17:05:21.8390000+03:00","stream":"LTS"},{"version":"2022.3.48f1","releaseDate":"2024-09-26T21:38:03.7600000+03:00","stream":"LTS"},{"version":"6000.0.21f1","releaseDate":"2024-09-24T19:11:20.5860000+03:00","stream":"Tech"},{"version":"2021.3.44f1","releaseDate":"2024-09-23T17:46:08.5310000+03:00","stream":"LTS"},{"version":"6000.0.20f1","releaseDate":"2024-09-19T18:22:09.9610000+03:00","stream":"Tech"},{"version":"2022.3.47f1","releaseDate":"2024-09-18T09:44:50.2140000+03:00","stream":"LTS"},{"version":"6000.0.19f1","releaseDate":"2024-09-12T04:29:34.6560000+03:00","stream":"Tech"},{"version":"2022.3.46f1","releaseDate":"2024-09-10T19:41:40.2330000+03:00","stream":"LTS"},{"version":"6000.0.18f1","releaseDate":"2024-09-04T09:08:14.6900000+03:00","stream":"Tech"},{"version":"2022.3.45f1","releaseDate":"2024-09-04T01:44:17.3580000+03:00","stream":"LTS"},{"version":"6000.0.17f1","releaseDate":"2024-08-27T19:52:36.7630000+03:00","stream":"Tech"},{"version":"2022.3.44f1","releaseDate":"2024-08-23T09:10:50.9750000+03:00","stream":"LTS"},{"version":"6000.0.16f1","releaseDate":"2024-08-22T21:12:19.7750000+03:00","stream":"Tech"},{"version":"2021.3.43f1","releaseDate":"2024-08-22T13:10:30.8490000+03:00","stream":"LTS"},{"version":"2022.3.43f1","releaseDate":"2024-08-21T17:11:42.7280000+03:00","stream":"LTS"},{"version":"6000.0.15f1","releaseDate":"2024-08-13T21:03:16.7920000+03:00","stream":"Tech"},{"version":"2022.3.42f1","releaseDate":"2024-08-13T12:26:14.2690000+03:00","stream":"LTS"},{"version":"6000.0.14f1","releaseDate":"2024-08-07T08:59:10.6590000+03:00","stream":"Tech"},{"version":"2022.3.41f1","releaseDate":"2024-08-06T13:07:06.8530000+03:00","stream":"LTS"},{"version":"2021.3.42f1","releaseDate":"2024-08-06T12:30:24.6020000+03:00","stream":"LTS"},{"version":"6000.0.13f1","releaseDate":"2024-07-31T21:30:12.3520000+03:00","stream":"Tech"},{"version":"2022.3.40f1","releaseDate":"2024-07-30T17:14:27.5360000+03:00","stream":"LTS"},{"version":"6000.0.12f1","releaseDate":"2024-07-25T19:59:55.9270000+03:00","stream":"Tech"},{"version":"2022.3.39f1","releaseDate":"2024-07-23T19:04:16.2020000+03:00","stream":"LTS"},{"version":"2021.3.41f1","releaseDate":"2024-07-23T17:54:58.7980000+03:00","stream":"LTS"},{"version":"6000.0.11f1","releaseDate":"2024-07-17T13:16:09.0230000+03:00","stream":"Tech"},{"version":"2022.3.38f1","releaseDate":"2024-07-16T16:52:35.9940000+03:00","stream":"LTS"},{"version":"6000.0.10f1","releaseDate":"2024-07-10T19:45:22.4880000+03:00","stream":"Tech"},{"version":"2022.3.37f1","releaseDate":"2024-07-09T15:05:40.0740000+03:00","stream":"LTS"},{"version":"6000.0.9f1","releaseDate":"2024-07-03T17:22:27.3520000+03:00","stream":"Tech"},{"version":"2022.3.36f1","releaseDate":"2024-07-02T20:23:09.1240000+03:00","stream":"LTS"},{"version":"6000.0.8f1","releaseDate":"2024-06-28T18:36:42.0980000+03:00","stream":"Tech"},{"version":"2022.3.35f1","releaseDate":"2024-06-27T20:06:27.0820000+03:00","stream":"LTS"},{"version":"2021.3.40f1","releaseDate":"2024-06-27T05:15:04.4950000+03:00","stream":"LTS"},{"version":"6000.0.7f1","releaseDate":"2024-06-20T19:04:46.2760000+03:00","stream":"Tech"},{"version":"2022.3.34f1","releaseDate":"2024-06-18T14:27:05.7060000+03:00","stream":"LTS"},{"version":"2022.3.33f1","releaseDate":"2024-06-12T09:22:11.9550000+03:00","stream":"LTS"},{"version":"6000.0.5f1","releaseDate":"2024-06-04T21:54:20.5720000+03:00","stream":"Tech"},{"version":"2022.3.32f1","releaseDate":"2024-06-04T20:45:52.3580000+03:00","stream":"LTS"},{"version":"6000.0.4f1","releaseDate":"2024-05-29T19:49:19.3410000+03:00","stream":"Tech"},{"version":"2022.3.31f1","releaseDate":"2024-05-28T20:19:07.2650000+03:00","stream":"LTS"},{"version":"2021.3.39f1","releaseDate":"2024-05-28T19:13:34.5600000+03:00","stream":"LTS"},{"version":"6000.0.3f1","releaseDate":"2024-05-21T19:15:54.9330000+03:00","stream":"Tech"},{"version":"2022.3.30f1","releaseDate":"2024-05-21T15:05:13.7390000+03:00","stream":"LTS"},{"version":"6000.0.2f1","releaseDate":"2024-05-14T22:54:04.4270000+03:00","stream":"Tech"},{"version":"2022.3.29f1","releaseDate":"2024-05-14T18:20:52.9280000+03:00","stream":"LTS"},{"version":"6000.0.1f1","releaseDate":"2024-05-08T18:11:21.9000000+03:00","stream":"Tech"},{"version":"2022.3.28f1","releaseDate":"2024-05-07T18:20:10.5920000+03:00","stream":"LTS"},{"version":"2021.3.38f1","releaseDate":"2024-05-02T21:42:56.7610000+03:00","stream":"LTS"},{"version":"2022.3.27f1","releaseDate":"2024-04-30T20:28:32.4380000+03:00","stream":"LTS"},{"version":"6000.0.0f1","releaseDate":"2024-04-29T21:37:33.4220000+03:00","stream":"Tech"},{"version":"2023.2.20f1","releaseDate":"2024-04-25T22:29:55.5280000+03:00","stream":"Tech"},{"version":"2022.3.26f1","releaseDate":"2024-04-23T20:47:02.1750000+03:00","stream":"LTS"},{"version":"6000.0.0b16","releaseDate":"2024-04-19T18:47:47.0120000+03:00","stream":"Beta"},{"version":"2023.2.19f1","releaseDate":"2024-04-18T11:21:36.2640000+03:00","stream":"Tech"},{"version":"2022.3.25f1","releaseDate":"2024-04-16T15:56:01.9400000+03:00","stream":"LTS"},{"version":"6000.0.0b15","releaseDate":"2024-04-13T03:46:31.3090000+03:00","stream":"Beta"},{"version":"2023.2.18f1","releaseDate":"2024-04-10T00:11:33.7860000+03:00","stream":"Tech"},{"version":"2022.3.24f1","releaseDate":"2024-04-09T14:12:12.5040000+03:00","stream":"LTS"},{"version":"2023.2.17f1","releaseDate":"2024-04-04T04:45:09.5450000+03:00","stream":"Tech"},{"version":"2022.3.23f1","releaseDate":"2024-04-02T18:24:02.3240000+03:00","stream":"LTS"},{"version":"2021.3.37f1","releaseDate":"2024-04-02T16:12:43.5310000+03:00","stream":"LTS"},{"version":"6000.0.0b13","releaseDate":"2024-03-27T03:28:00.3900000+02:00","stream":"Beta"},{"version":"2023.2.16f1","releaseDate":"2024-03-27T03:03:51.3150000+02:00","stream":"Tech"},{"version":"2023.2.15f1","releaseDate":"2024-03-19T23:07:34.0340000+02:00","stream":"Tech"},{"version":"6000.0.0b12","releaseDate":"2024-03-19T21:32:02.8890000+02:00","stream":"Beta"},{"version":"2022.3.22f1","releaseDate":"2024-03-19T13:06:29.3290000+02:00","stream":"LTS"},{"version":"6000.0.0b11","releaseDate":"2024-03-13T23:20:06.4030000+02:00","stream":"Beta"},{"version":"2023.2.14f1","releaseDate":"2024-03-12T20:27:41.7580000+02:00","stream":"Tech"},{"version":"2023.2.13f1","releaseDate":"2024-03-05T22:41:13.8390000+02:00","stream":"Tech"},{"version":"2023.3.0b10","releaseDate":"2024-03-05T21:08:01.4850000+02:00","stream":"Beta"},{"version":"2021.3.36f1","releaseDate":"2024-03-05T20:42:24.1710000+02:00","stream":"LTS"},{"version":"2022.3.21f1","releaseDate":"2024-03-05T18:04:04.8580000+02:00","stream":"LTS"},{"version":"2023.2.12f1","releaseDate":"2024-02-29T01:06:57.2790000+02:00","stream":"Tech"},{"version":"2023.3.0b9","releaseDate":"2024-02-28T23:32:42.6980000+02:00","stream":"Beta"},{"version":"2023.2.11f1","releaseDate":"2024-02-20T23:17:45.0260000+02:00","stream":"Tech"},{"version":"2023.3.0b8","releaseDate":"2024-02-20T21:40:27.1710000+02:00","stream":"Beta"},{"version":"2023.2.10f1","releaseDate":"2024-02-14T21:39:19.8910000+02:00","stream":"Tech"},{"version":"2022.3.20f1","releaseDate":"2024-02-14T13:25:56.5410000+02:00","stream":"LTS"},{"version":"2023.3.0b7","releaseDate":"2024-02-13T21:59:14.7140000+02:00","stream":"Beta"},{"version":"2023.3.0b6","releaseDate":"2024-02-07T09:24:40.2320000+02:00","stream":"Beta"},{"version":"2023.2.9f1","releaseDate":"2024-02-07T08:56:57.6470000+02:00","stream":"Tech"},{"version":"2021.3.35f1","releaseDate":"2024-02-06T17:40:15.5830000+02:00","stream":"LTS"},{"version":"2022.3.19f1","releaseDate":"2024-01-31T13:56:51.6340000+02:00","stream":"LTS"},{"version":"2023.3.0b5","releaseDate":"2024-01-31T02:28:33.7000000+02:00","stream":"Beta"},{"version":"2023.2.8f1","releaseDate":"2024-01-31T02:02:00.5870000+02:00","stream":"Tech"},{"version":"2023.2.7f1","releaseDate":"2024-01-23T22:43:04.8780000+02:00","stream":"Tech"},{"version":"2023.3.0b4","releaseDate":"2024-01-23T21:12:34.8720000+02:00","stream":"Beta"},{"version":"2022.3.18f1","releaseDate":"2024-01-20T18:00:12.2100000+02:00","stream":"LTS"},{"version":"2023.2.6f1","releaseDate":"2024-01-17T07:22:12.1160000+02:00","stream":"Tech"},{"version":"2023.3.0b3","releaseDate":"2024-01-15T07:07:54.4010000+02:00","stream":"Beta"},{"version":"2023.3.0b2","releaseDate":"2024-01-09T23:10:15.9440000+02:00","stream":"Beta"},{"version":"2021.3.34f1","releaseDate":"2024-01-09T17:33:57.0130000+02:00","stream":"LTS"},{"version":"2022.3.17f1","releaseDate":"2024-01-09T15:24:21.3090000+02:00","stream":"LTS"},{"version":"2023.2.5f1","releaseDate":"2024-01-09T10:49:30.8570000+02:00","stream":"Tech"},{"version":"2023.3.0b1","releaseDate":"2024-01-03T04:06:01.1860000+02:00","stream":"Beta"},{"version":"2023.2.4f1","releaseDate":"2023-12-22T13:24:31.4620000+02:00","stream":"Tech"},{"version":"2022.3.16f1","releaseDate":"2023-12-19T12:05:11.7210000+02:00","stream":"LTS"},{"version":"2023.3.0a18","releaseDate":"2023-12-13T23:40:57.5080000+02:00","stream":"Alpha"},{"version":"2023.2.3f1","releaseDate":"2023-12-06T00:03:42.7620000+02:00","stream":"Tech"},{"version":"2023.3.0a17","releaseDate":"2023-12-05T22:29:50.0710000+02:00","stream":"Alpha"},{"version":"2022.3.15f1","releaseDate":"2023-12-05T18:41:51.6760000+02:00","stream":"LTS"},{"version":"2023.2.2f1","releaseDate":"2023-11-28T22:28:30.9510000+02:00","stream":"Tech"},{"version":"2023.3.0a16","releaseDate":"2023-11-28T20:53:03.1050000+02:00","stream":"Alpha"},{"version":"2021.3.33f1","releaseDate":"2023-11-28T17:21:35.6330000+02:00","stream":"LTS"},{"version":"2023.2.1f1","releaseDate":"2023-11-22T00:09:38.4850000+02:00","stream":"Tech"},{"version":"2022.3.14f1","releaseDate":"2023-11-21T22:07:15.6700000+02:00","stream":"LTS"},{"version":"2023.3.0a15","releaseDate":"2023-11-21T19:46:47.0020000+02:00","stream":"Alpha"},{"version":"2023.2.0f1","releaseDate":"2023-11-15T01:22:44.2930000+02:00","stream":"Tech"},{"version":"2023.3.0a14","releaseDate":"2023-11-14T23:47:34.4680000+02:00","stream":"Alpha"},{"version":"2023.1.20f1","releaseDate":"2023-11-09T13:37:53.0800000+02:00","stream":"Tech"},{"version":"2022.3.13f1","releaseDate":"2023-11-07T19:33:11.8460000+02:00","stream":"LTS"},{"version":"2023.3.0a13","releaseDate":"2023-11-07T15:03:31.6360000+02:00","stream":"Alpha"},{"version":"2023.2.0b17","releaseDate":"2023-11-07T03:15:49.7360000+02:00","stream":"Beta"},{"version":"2021.3.32f1","releaseDate":"2023-11-01T17:47:25.8010000+02:00","stream":"LTS"},{"version":"2023.2.0b16","releaseDate":"2023-11-01T09:07:29.0190000+02:00","stream":"Beta"},{"version":"2023.3.0a12","releaseDate":"2023-10-31T22:54:47.4610000+02:00","stream":"Alpha"},{"version":"2023.1.19f1","releaseDate":"2023-10-31T16:12:27.1350000+02:00","stream":"Tech"},{"version":"2023.3.0a11","releaseDate":"2023-10-26T23:42:38.0140000+03:00","stream":"Alpha"},{"version":"2023.2.0b15","releaseDate":"2023-10-26T22:42:17.8000000+03:00","stream":"Beta"},{"version":"2022.3.12f1","releaseDate":"2023-10-26T17:00:14.6020000+03:00","stream":"LTS"},{"version":"2023.1.18f1","releaseDate":"2023-10-24T19:38:46.5580000+03:00","stream":"Tech"},{"version":"2023.1.17f1","releaseDate":"2023-10-17T16:06:27.2150000+03:00","stream":"Tech"},{"version":"2023.2.0b14","releaseDate":"2023-10-16T19:49:19.2110000+03:00","stream":"Beta"},{"version":"2023.3.0a10","releaseDate":"2023-10-16T18:53:09.4090000+03:00","stream":"Alpha"},{"version":"2023.2.0b13","releaseDate":"2023-10-11T02:43:50.4180000+03:00","stream":"Beta"},{"version":"2022.3.11f1","releaseDate":"2023-10-10T18:27:45.5750000+03:00","stream":"LTS"},{"version":"2023.2.0b12","releaseDate":"2023-10-05T08:35:01.2590000+03:00","stream":"Beta"},{"version":"2023.3.0a8","releaseDate":"2023-10-05T07:37:32.5410000+03:00","stream":"Alpha"},{"version":"2023.1.16f1","releaseDate":"2023-10-03T20:51:07.9240000+03:00","stream":"Tech"},{"version":"2021.3.31f1","releaseDate":"2023-10-03T18:50:59.1880000+03:00","stream":"LTS"},{"version":"2023.2.0b11","releaseDate":"2023-09-27T22:03:28.2830000+03:00","stream":"Beta"},{"version":"2023.1.15f1","releaseDate":"2023-09-26T16:26:57.1220000+03:00","stream":"Tech"},{"version":"2023.3.0a6","releaseDate":"2023-09-21T22:57:30.1720000+03:00","stream":"Alpha"},{"version":"2023.2.0b10","releaseDate":"2023-09-21T03:25:39.0680000+03:00","stream":"Beta"},{"version":"2023.3.0a7","releaseDate":"2023-09-21T02:32:03.4860000+03:00","stream":"Alpha"},{"version":"2023.1.14f1","releaseDate":"2023-09-19T16:45:02.8020000+03:00","stream":"Tech"},{"version":"2022.3.10f1","releaseDate":"2023-09-19T14:09:17.9240000+03:00","stream":"LTS"},{"version":"2023.2.0b9","releaseDate":"2023-09-13T19:47:50.2650000+03:00","stream":"Beta"},{"version":"2023.3.0a5","releaseDate":"2023-09-13T11:39:30.3420000+03:00","stream":"Alpha"},{"version":"2023.1.13f1","releaseDate":"2023-09-12T19:45:26.5060000+03:00","stream":"Tech"},{"version":"2023.2.0b8","releaseDate":"2023-09-07T03:06:06.6190000+03:00","stream":"Beta"},{"version":"2023.3.0a4","releaseDate":"2023-09-07T02:09:51.7610000+03:00","stream":"Alpha"},{"version":"2023.1.12f1","releaseDate":"2023-09-05T16:19:07.6000000+03:00","stream":"Tech"},{"version":"2022.3.9f1","releaseDate":"2023-09-05T14:20:42.5520000+03:00","stream":"LTS"},{"version":"2023.3.0a3","releaseDate":"2023-08-30T02:57:28.4560000+03:00","stream":"Alpha"},{"version":"2023.1.11f1","releaseDate":"2023-08-30T02:34:23.2510000+03:00","stream":"Tech"},{"version":"2023.2.0b7","releaseDate":"2023-08-30T01:05:40.2550000+03:00","stream":"Beta"},{"version":"2021.3.30f1","releaseDate":"2023-08-30T01:00:32.9160000+03:00","stream":"LTS"},{"version":"2023.2.0b6","releaseDate":"2023-08-23T19:37:08.1570000+03:00","stream":"Beta"},{"version":"2022.3.8f1","releaseDate":"2023-08-22T19:08:57.6900000+03:00","stream":"LTS"},{"version":"2023.1.10f1","releaseDate":"2023-08-22T12:04:56.8560000+03:00","stream":"Tech"},{"version":"2023.2.0b5","releaseDate":"2023-08-15T22:46:13.9610000+03:00","stream":"Beta"},{"version":"2023.1.9f1","releaseDate":"2023-08-15T11:51:07.4310000+03:00","stream":"Tech"},{"version":"2023.2.0b4","releaseDate":"2023-08-10T19:28:52.9540000+03:00","stream":"Beta"},{"version":"2023.1.8f1","releaseDate":"2023-08-08T13:46:36.3470000+03:00","stream":"Tech"},{"version":"2022.3.7f1","releaseDate":"2023-08-08T12:39:39.2500000+03:00","stream":"LTS"},{"version":"2023.2.0b3","releaseDate":"2023-08-02T00:20:07.9800000+03:00","stream":"Beta"},{"version":"2023.1.7f1","releaseDate":"2023-08-01T14:52:30.6880000+03:00","stream":"Tech"},{"version":"2022.3.6f1","releaseDate":"2023-07-31T21:44:28.3130000+03:00","stream":"LTS"},{"version":"2023.2.0b2","releaseDate":"2023-07-26T18:36:17.0900000+03:00","stream":"Beta"},{"version":"2023.1.6f1","releaseDate":"2023-07-25T17:07:19.6790000+03:00","stream":"Tech"},{"version":"2021.3.29f1","releaseDate":"2023-07-25T15:13:45.7210000+03:00","stream":"LTS"},{"version":"2023.2.0b1","releaseDate":"2023-07-19T20:48:18.0780000+03:00","stream":"Beta"},{"version":"2023.1.5f1","releaseDate":"2023-07-18T12:47:39.8830000+03:00","stream":"Tech"},{"version":"2022.3.5f1","releaseDate":"2023-07-13T19:12:49.1180000+03:00","stream":"LTS"},{"version":"2023.1.4f1","releaseDate":"2023-07-13T12:22:35.2840000+03:00","stream":"Tech"},{"version":"2023.2.0a22","releaseDate":"2023-07-10T13:49:24.5250000+03:00","stream":"Alpha"},{"version":"2023.1.3f1","releaseDate":"2023-07-05T13:38:33.7830000+03:00","stream":"Tech"},{"version":"2021.3.28f1","releaseDate":"2023-07-04T22:41:02.2050000+03:00","stream":"LTS"},{"version":"2023.1.2f1","releaseDate":"2023-06-26T20:35:53.2890000+03:00","stream":"Tech"},{"version":"2022.3.4f1","releaseDate":"2023-06-26T19:47:18.7050000+03:00","stream":"LTS"},{"version":"2023.2.0a20","releaseDate":"2023-06-21T22:58:23.5890000+03:00","stream":"Alpha"},{"version":"2022.3.3f1","releaseDate":"2023-06-21T18:21:19.0310000+03:00","stream":"LTS"},{"version":"2023.1.1f1","releaseDate":"2023-06-21T17:44:26.6940000+03:00","stream":"Tech"},{"version":"2023.2.0a19","releaseDate":"2023-06-13T20:56:46.9020000+03:00","stream":"Alpha"},{"version":"2022.3.2f1","releaseDate":"2023-06-13T20:35:17.0320000+03:00","stream":"LTS"},{"version":"2023.1.0f1","releaseDate":"2023-06-12T23:09:17.9400000+03:00","stream":"Tech"},{"version":"2021.3.27f1","releaseDate":"2023-06-07T19:35:21.2420000+03:00","stream":"LTS"},{"version":"2023.2.0a18","releaseDate":"2023-06-07T18:05:43.8610000+03:00","stream":"Alpha"},{"version":"2023.1.0b20","releaseDate":"2023-06-07T17:07:58.1050000+03:00","stream":"Beta"},{"version":"2022.3.1f1","releaseDate":"2023-06-07T14:44:18.6430000+03:00","stream":"LTS"},{"version":"2023.1.0b19","releaseDate":"2023-06-01T00:22:40.7160000+03:00","stream":"Beta"},{"version":"2023.2.0a17","releaseDate":"2023-05-31T22:36:57.5850000+03:00","stream":"Alpha"},{"version":"2022.3.0f1","releaseDate":"2023-05-30T13:40:13.8580000+03:00","stream":"LTS"},{"version":"2021.3.26f1","releaseDate":"2023-05-25T14:47:02.1500000+03:00","stream":"LTS"},{"version":"2023.2.0a16","releaseDate":"2023-05-24T23:32:01.9930000+03:00","stream":"Alpha"},{"version":"2023.1.0b18","releaseDate":"2023-05-24T17:12:55.4530000+03:00","stream":"Beta"},{"version":"2022.2.21f1","releaseDate":"2023-05-24T14:15:23.9850000+03:00","stream":"Tech"},{"version":"2022.2.20f1","releaseDate":"2023-05-18T12:58:25.7740000+03:00","stream":"Tech"},{"version":"2023.2.0a15","releaseDate":"2023-05-17T23:05:43.2150000+03:00","stream":"Alpha"},{"version":"2020.3.48f1","releaseDate":"2023-05-17T20:23:52.7840000+03:00","stream":"LTS"},{"version":"2023.1.0b17","releaseDate":"2023-05-17T19:32:57.0910000+03:00","stream":"Beta"},{"version":"2021.3.25f1","releaseDate":"2023-05-11T16:55:39.0570000+03:00","stream":"LTS"},{"version":"2022.2.19f1","releaseDate":"2023-05-11T15:02:51.9390000+03:00","stream":"Tech"},{"version":"2023.1.0b16","releaseDate":"2023-05-11T04:23:47.7980000+03:00","stream":"Beta"},{"version":"2023.2.0a14","releaseDate":"2023-05-10T22:50:11.4440000+03:00","stream":"Alpha"},{"version":"2023.1.0b15","releaseDate":"2023-05-04T18:09:21.8720000+03:00","stream":"Beta"},{"version":"2022.2.18f1","releaseDate":"2023-05-04T17:54:59.9510000+03:00","stream":"Tech"},{"version":"2023.2.0a13","releaseDate":"2023-05-03T22:08:00.7610000+03:00","stream":"Alpha"},{"version":"2022.2.17f1","releaseDate":"2023-04-27T20:55:43.2970000+03:00","stream":"Tech"},{"version":"2021.3.24f1","releaseDate":"2023-04-27T20:16:27.5610000+03:00","stream":"LTS"},{"version":"2023.2.0a12","releaseDate":"2023-04-27T17:39:10.7740000+03:00","stream":"Alpha"},{"version":"2023.1.0b14","releaseDate":"2023-04-26T20:38:33.8280000+03:00","stream":"Beta"},{"version":"2023.2.0a11","releaseDate":"2023-04-20T02:11:25.8420000+03:00","stream":"Alpha"},{"version":"2023.1.0b13","releaseDate":"2023-04-19T18:38:30.4380000+03:00","stream":"Beta"},{"version":"2022.2.16f1","releaseDate":"2023-04-19T17:00:29.7910000+03:00","stream":"Tech"},{"version":"2021.3.23f1","releaseDate":"2023-04-14T06:05:53.4110000+03:00","stream":"LTS"},{"version":"2022.2.15f1","releaseDate":"2023-04-13T16:56:06.9490000+03:00","stream":"Tech"},{"version":"2023.2.0a10","releaseDate":"2023-04-12T20:57:27.3950000+03:00","stream":"Alpha"},{"version":"2023.1.0b12","releaseDate":"2023-04-12T19:58:27.1750000+03:00","stream":"Beta"},{"version":"2022.2.14f1","releaseDate":"2023-04-06T01:20:20.9000000+03:00","stream":"Tech"},{"version":"2023.2.0a9","releaseDate":"2023-04-05T20:17:10.3830000+03:00","stream":"Alpha"},{"version":"2020.3.47f1","releaseDate":"2023-04-05T19:12:43.4140000+03:00","stream":"LTS"},{"version":"2023.1.0b11","releaseDate":"2023-04-05T00:58:08.4100000+03:00","stream":"Beta"},{"version":"2022.2.13f1","releaseDate":"2023-03-31T17:48:28.3060000+03:00","stream":"Tech"},{"version":"2021.3.22f1","releaseDate":"2023-03-29T23:44:06.1310000+03:00","stream":"LTS"},{"version":"2023.1.0b10","releaseDate":"2023-03-29T22:31:31.4270000+03:00","stream":"Beta"},{"version":"2023.2.0a8","releaseDate":"2023-03-29T20:45:36.7180000+03:00","stream":"Alpha"},{"version":"2023.2.0a7","releaseDate":"2023-03-22T23:21:49.2770000+02:00","stream":"Alpha"},{"version":"2022.2.12f1","releaseDate":"2023-03-22T21:38:11.7020000+02:00","stream":"Tech"},{"version":"2023.1.0b9","releaseDate":"2023-03-22T19:34:30.5930000+02:00","stream":"Beta"},{"version":"2023.2.0a6","releaseDate":"2023-03-15T19:05:39.9400000+02:00","stream":"Alpha"},{"version":"2023.1.0b8","releaseDate":"2023-03-15T17:20:07.0490000+02:00","stream":"Beta"},{"version":"2021.3.21f1","releaseDate":"2023-03-15T05:07:29.3970000+02:00","stream":"LTS"},{"version":"2022.2.11f1","releaseDate":"2023-03-15T04:33:37.4390000+02:00","stream":"Tech"},{"version":"2022.2.10f1","releaseDate":"2023-03-09T03:37:14.1860000+02:00","stream":"Tech"},{"version":"2020.3.46f1","releaseDate":"2023-03-08T18:13:10.8010000+02:00","stream":"LTS"},{"version":"2023.1.0b7","releaseDate":"2023-03-07T19:21:08.1180000+02:00","stream":"Beta"},{"version":"2022.2.9f1","releaseDate":"2023-03-03T03:54:20.1620000+02:00","stream":"Tech"},{"version":"2021.3.20f1","releaseDate":"2023-03-03T01:34:21.4780000+02:00","stream":"LTS"},{"version":"2023.1.0b6","releaseDate":"2023-03-02T19:05:36.6970000+02:00","stream":"Beta"},{"version":"2022.2.8f1","releaseDate":"2023-02-23T17:21:52.5810000+02:00","stream":"Tech"},{"version":"2023.1.0b5","releaseDate":"2023-02-22T16:43:31.6520000+02:00","stream":"Beta"},{"version":"2021.3.19f1","releaseDate":"2023-02-17T17:24:45.3250000+02:00","stream":"LTS"},{"version":"2023.1.0b4","releaseDate":"2023-02-16T18:12:27.2890000+02:00","stream":"Beta"},{"version":"2022.2.7f1","releaseDate":"2023-02-15T22:59:18.6940000+02:00","stream":"Tech"},{"version":"2020.3.45f1","releaseDate":"2023-02-14T23:48:56.7970000+02:00","stream":"LTS"},{"version":"2022.2.6f1","releaseDate":"2023-02-10T03:46:54.4290000+02:00","stream":"Tech"},{"version":"2023.1.0b3","releaseDate":"2023-02-08T18:02:45.1480000+02:00","stream":"Beta"},{"version":"2021.3.18f1","releaseDate":"2023-02-01T22:10:11.4750000+02:00","stream":"LTS"},{"version":"2023.1.0b2","releaseDate":"2023-02-01T16:26:56.9800000+02:00","stream":"Beta"},{"version":"2022.2.5f1","releaseDate":"2023-01-31T22:58:08.2060000+02:00","stream":"Tech"},{"version":"2022.2.4f1","releaseDate":"2023-01-27T16:41:48.2250000+02:00","stream":"Tech"},{"version":"2023.1.0b1","releaseDate":"2023-01-24T18:35:43.4020000+02:00","stream":"Beta"},{"version":"2021.3.17f1","releaseDate":"2023-01-24T18:26:13.7420000+02:00","stream":"LTS"},{"version":"2022.2.3f1","releaseDate":"2023-01-23T21:50:52.1750000+02:00","stream":"Tech"},{"version":"2023.1.0a26","releaseDate":"2023-01-18T19:32:21.5630000+02:00","stream":"Alpha"},{"version":"2020.3.44f1","releaseDate":"2023-01-18T19:25:53.1090000+02:00","stream":"LTS"},{"version":"2023.1.0a25","releaseDate":"2023-01-11T21:23:37.6860000+02:00","stream":"Alpha"},{"version":"2022.2.2f1","releaseDate":"2023-01-10T05:21:01.4250000+02:00","stream":"Tech"},{"version":"2023.1.0a24","releaseDate":"2022-12-22T03:56:32.4480000+02:00","stream":"Alpha"},{"version":"2020.3.43f1","releaseDate":"2022-12-16T00:02:25.8850000+02:00","stream":"LTS"},{"version":"2021.3.16f1","releaseDate":"2022-12-15T18:05:52.9180000+02:00","stream":"LTS"},{"version":"2023.1.0a23","releaseDate":"2022-12-14T20:58:53.9770000+02:00","stream":"Alpha"},{"version":"2022.2.1f1","releaseDate":"2022-12-12T17:26:11.2260000+02:00","stream":"Tech"},{"version":"2023.1.0a22","releaseDate":"2022-12-07T23:25:31.9420000+02:00","stream":"Alpha"},{"version":"2022.2.0f1","releaseDate":"2022-12-07T16:29:04.8310000+02:00","stream":"Tech"},{"version":"2022.1.24f1","releaseDate":"2022-12-06T20:33:08.7300000+02:00","stream":"Tech"},{"version":"2021.3.15f1","releaseDate":"2022-12-01T19:20:58.3010000+02:00","stream":"LTS"},{"version":"2023.1.0a21","releaseDate":"2022-11-30T17:35:08.6520000+02:00","stream":"Alpha"},{"version":"2023.1.0a20","releaseDate":"2022-11-24T16:54:00.0950000+02:00","stream":"Alpha"},{"version":"2022.2.0b16","releaseDate":"2022-11-18T17:21:52.7500000+02:00","stream":"Beta"},{"version":"2023.1.0a19","releaseDate":"2022-11-17T23:40:42.6370000+02:00","stream":"Alpha"},{"version":"2021.3.14f1","releaseDate":"2022-11-17T19:28:01.6800000+02:00","stream":"LTS"},{"version":"2020.3.42f1","releaseDate":"2022-11-17T18:42:55.7160000+02:00","stream":"LTS"},{"version":"2022.1.23f1","releaseDate":"2022-11-16T13:07:08.5870000+02:00","stream":"Tech"},{"version":"2022.2.0b15","releaseDate":"2022-11-16T11:42:02.4260000+02:00","stream":"Beta"},{"version":"2023.1.0a18","releaseDate":"2022-11-10T17:10:57.7810000+02:00","stream":"Alpha"},{"version":"2022.1.22f1","releaseDate":"2022-11-09T14:42:48.4520000+02:00","stream":"Tech"},{"version":"2022.2.0b14","releaseDate":"2022-11-07T16:57:36.8080000+02:00","stream":"Beta"},{"version":"2021.3.13f1","releaseDate":"2022-11-04T18:42:23.1680000+02:00","stream":"LTS"},{"version":"2023.1.0a17","releaseDate":"2022-11-04T17:52:07.0070000+02:00","stream":"Alpha"},{"version":"2023.1.0a16","releaseDate":"2022-10-27T18:51:25.6730000+03:00","stream":"Alpha"},{"version":"2022.1.21f1","releaseDate":"2022-10-27T17:14:42.0510000+03:00","stream":"Tech"},{"version":"2022.2.0b13","releaseDate":"2022-10-26T23:13:31.6270000+03:00","stream":"Beta"},{"version":"2021.3.12f1","releaseDate":"2022-10-25T18:16:10.9510000+03:00","stream":"LTS"},{"version":"2023.1.0a15","releaseDate":"2022-10-21T18:12:32.3200000+03:00","stream":"Alpha"},{"version":"2020.3.41f1","releaseDate":"2022-10-21T17:22:52.5630000+03:00","stream":"LTS"},{"version":"2022.2.0b12","releaseDate":"2022-10-20T18:21:30.9490000+03:00","stream":"Beta"},{"version":"2022.2.0b11","releaseDate":"2022-10-17T22:47:44.2460000+03:00","stream":"Beta"},{"version":"2023.1.0a14","releaseDate":"2022-10-13T22:56:48.3590000+03:00","stream":"Alpha"},{"version":"2022.1.20f1","releaseDate":"2022-10-12T14:42:58.6240000+03:00","stream":"Tech"},{"version":"2023.1.0a13","releaseDate":"2022-10-06T22:12:22.6230000+03:00","stream":"Alpha"},{"version":"2022.2.0b10","releaseDate":"2022-10-06T18:22:41.4710000+03:00","stream":"Beta"},{"version":"2022.1.19f1","releaseDate":"2022-10-05T15:57:27.6550000+03:00","stream":"Tech"},{"version":"2022.1.18f1","releaseDate":"2022-09-29T17:37:44.5850000+03:00","stream":"Tech"},{"version":"2021.3.11f1","releaseDate":"2022-09-29T13:18:44.5050000+03:00","stream":"LTS"},{"version":"2022.2.0b9","releaseDate":"2022-09-29T06:03:40.7910000+03:00","stream":"Beta"},{"version":"2023.1.0a12","releaseDate":"2022-09-28T22:55:37.0920000+03:00","stream":"Alpha"},{"version":"2020.3.40f1","releaseDate":"2022-09-27T13:08:51.4880000+03:00","stream":"LTS"},{"version":"2023.1.0a11","releaseDate":"2022-09-21T17:43:10.2830000+03:00","stream":"Alpha"},{"version":"2022.1.17f1","releaseDate":"2022-09-21T14:47:30.1360000+03:00","stream":"Tech"},{"version":"2021.3.10f1","releaseDate":"2022-09-16T18:49:10.5930000+03:00","stream":"LTS"},{"version":"2020.3.39f1","releaseDate":"2022-09-15T00:53:29.6050000+03:00","stream":"LTS"},{"version":"2023.1.0a10","releaseDate":"2022-09-12T21:11:46.9380000+03:00","stream":"Alpha"},{"version":"2022.2.0b8","releaseDate":"2022-09-09T19:13:00.3470000+03:00","stream":"Beta"},{"version":"2022.1.16f1","releaseDate":"2022-09-08T16:08:35.0830000+03:00","stream":"Tech"},{"version":"2023.1.0a9","releaseDate":"2022-09-06T21:57:38.9710000+03:00","stream":"Alpha"},{"version":"2021.3.9f1","releaseDate":"2022-09-01T19:32:11.5790000+03:00","stream":"LTS"},{"version":"2022.2.0b7","releaseDate":"2022-09-01T17:23:07.2070000+03:00","stream":"Beta"},{"version":"2022.1.15f1","releaseDate":"2022-09-01T13:40:40.3950000+03:00","stream":"Tech"},{"version":"2022.2.0b6","releaseDate":"2022-08-26T01:40:10.3100000+03:00","stream":"Beta"},{"version":"2022.2.0b5","releaseDate":"2022-08-22T16:46:29.2740000+03:00","stream":"Beta"},{"version":"2022.1.14f1","releaseDate":"2022-08-22T11:56:08.0450000+03:00","stream":"Tech"},{"version":"2023.1.0a6","releaseDate":"2022-08-18T19:45:55.0300000+03:00","stream":"Alpha"},{"version":"2020.3.38f1","releaseDate":"2022-08-17T16:37:37.9830000+03:00","stream":"LTS"},{"version":"2023.1.0a5","releaseDate":"2022-08-11T19:35:17.2190000+03:00","stream":"Alpha"},{"version":"2022.1.13f1","releaseDate":"2022-08-11T10:43:08.2790000+03:00","stream":"Tech"},{"version":"2021.3.8f1","releaseDate":"2022-08-08T18:26:36.9290000+03:00","stream":"LTS"},{"version":"2022.1.12f1","releaseDate":"2022-08-05T13:30:50.9200000+03:00","stream":"Tech"},{"version":"2022.2.0b4","releaseDate":"2022-08-05T05:14:17.7170000+03:00","stream":"Beta"},{"version":"2022.2.0b3","releaseDate":"2022-07-28T20:18:44.5910000+03:00","stream":"Beta"},{"version":"2021.3.7f1","releaseDate":"2022-07-28T12:50:46.7670000+03:00","stream":"LTS"},{"version":"2022.1.11f1","releaseDate":"2022-07-27T15:20:14.4870000+03:00","stream":"Tech"},{"version":"2023.1.0a4","releaseDate":"2022-07-26T19:55:38.5590000+03:00","stream":"Alpha"},{"version":"2022.2.0b2","releaseDate":"2022-07-22T16:54:37.0230000+03:00","stream":"Beta"},{"version":"2020.3.37f1","releaseDate":"2022-07-21T12:53:36.2240000+03:00","stream":"LTS"},{"version":"2022.1.10f1","releaseDate":"2022-07-20T14:35:58.8890000+03:00","stream":"Tech"},{"version":"2022.1.9f1","releaseDate":"2022-07-14T14:39:28.8090000+03:00","stream":"Tech"},{"version":"2022.2.0b1","releaseDate":"2022-07-13T02:24:29.9080000+03:00","stream":"Beta"},{"version":"2021.3.6f1","releaseDate":"2022-07-08T12:48:54.7110000+03:00","stream":"LTS"},{"version":"2022.1.8f1","releaseDate":"2022-07-07T18:05:53.6420000+03:00","stream":"Tech"},{"version":"2022.2.0a18","releaseDate":"2022-07-04T19:35:28.1410000+03:00","stream":"Alpha"},{"version":"2022.1.7f1","releaseDate":"2022-06-29T15:39:55.5870000+03:00","stream":"Tech"},{"version":"2022.1.6f1","releaseDate":"2022-06-23T14:07:14.8560000+03:00","stream":"Tech"},{"version":"2021.3.5f1","releaseDate":"2022-06-22T20:32:31.1470000+03:00","stream":"LTS"},{"version":"2019.4.40f1","releaseDate":"2022-06-16T23:44:08.7430000+03:00","stream":"LTS"},{"version":"2022.2.0a17","releaseDate":"2022-06-16T22:20:11.1080000+03:00","stream":"Alpha"},{"version":"2020.3.36f1","releaseDate":"2022-06-16T18:04:11.6550000+03:00","stream":"LTS"},{"version":"2022.1.5f1","releaseDate":"2022-06-15T19:47:55.4610000+03:00","stream":"Tech"},{"version":"2022.2.0a16","releaseDate":"2022-06-08T23:20:40.3790000+03:00","stream":"Alpha"},{"version":"2022.1.4f1","releaseDate":"2022-06-08T18:53:22.1510000+03:00","stream":"Tech"},{"version":"2022.1.3f1","releaseDate":"2022-05-31T19:42:45.9740000+03:00","stream":"Tech"},{"version":"2021.3.4f1","releaseDate":"2022-05-31T18:14:15.5590000+03:00","stream":"LTS"},{"version":"2020.3.35f1","releaseDate":"2022-05-27T02:30:47.9620000+03:00","stream":"LTS"},{"version":"2022.1.2f1","releaseDate":"2022-05-25T17:32:41.9670000+03:00","stream":"Tech"},{"version":"2021.3.3f1","releaseDate":"2022-05-19T13:01:53.9560000+03:00","stream":"LTS"},{"version":"2022.1.1f1","releaseDate":"2022-05-18T23:43:29.7780000+03:00","stream":"Tech"},{"version":"2022.2.0a13","releaseDate":"2022-05-13T01:47:12.2000000+03:00","stream":"Alpha"},{"version":"2019.4.39f1","releaseDate":"2022-05-12T01:31:15.5880000+03:00","stream":"LTS"},{"version":"2022.1.0f1","releaseDate":"2022-05-09T19:53:20.7220000+03:00","stream":"Tech"},{"version":"2022.2.0a12","releaseDate":"2022-05-05T15:15:24.2770000+03:00","stream":"Alpha"},{"version":"2021.3.2f1","releaseDate":"2022-05-05T13:42:14.7170000+03:00","stream":"LTS"},{"version":"2020.3.34f1","releaseDate":"2022-05-04T17:33:40.9940000+03:00","stream":"LTS"},{"version":"2022.2.0a11","releaseDate":"2022-04-25T17:28:41.0660000+03:00","stream":"Alpha"},{"version":"2021.3.1f1","releaseDate":"2022-04-21T21:19:43.4030000+03:00","stream":"LTS"},{"version":"2022.2.0a10","releaseDate":"2022-04-14T16:22:59.4940000+03:00","stream":"Alpha"},{"version":"2019.4.38f1","releaseDate":"2022-04-13T18:24:10.4100000+03:00","stream":"LTS"},{"version":"2022.1.0b16","releaseDate":"2022-04-12T21:11:34.7660000+03:00","stream":"Beta"},{"version":"2021.3.0f1","releaseDate":"2022-04-11T21:46:28.6540000+03:00","stream":"LTS"},{"version":"2020.3.33f1","releaseDate":"2022-04-07T16:58:00.7880000+03:00","stream":"LTS"},{"version":"2022.1.0b15","releaseDate":"2022-04-07T10:56:08.2280000+03:00","stream":"Beta"},{"version":"2021.2.19f1","releaseDate":"2022-04-05T20:15:08.0160000+03:00","stream":"Tech"},{"version":"2022.2.0a9","releaseDate":"2022-04-01T13:23:18.7140000+03:00","stream":"Alpha"},{"version":"2021.2.18f1","releaseDate":"2022-04-01T10:28:41.0490000+03:00","stream":"Tech"},{"version":"2022.1.0b14","releaseDate":"2022-03-30T12:56:12.7250000+03:00","stream":"Beta"},{"version":"2021.2.17f1","releaseDate":"2022-03-24T23:31:28.9800000+02:00","stream":"Tech"},{"version":"2020.3.32f1","releaseDate":"2022-03-23T17:39:23.9120000+02:00","stream":"LTS"},{"version":"2019.4.37f1","releaseDate":"2022-03-22T20:47:13.8460000+02:00","stream":"LTS"},{"version":"2022.1.0b13","releaseDate":"2022-03-22T19:02:39.2100000+02:00","stream":"Beta"},{"version":"2020.3.31f1","releaseDate":"2022-03-17T20:06:28.2220000+02:00","stream":"LTS"},{"version":"2021.2.16f1","releaseDate":"2022-03-17T19:27:16.4280000+02:00","stream":"Tech"},{"version":"2022.1.0b12","releaseDate":"2022-03-17T17:03:20.4980000+02:00","stream":"Beta"},{"version":"2021.2.15f1","releaseDate":"2022-03-11T19:03:49.6680000+02:00","stream":"Tech"},{"version":"2022.1.0b11","releaseDate":"2022-03-09T09:19:01.6160000+02:00","stream":"Beta"},{"version":"2021.2.14f1","releaseDate":"2022-03-03T19:20:56.9220000+02:00","stream":"Tech"},{"version":"2022.1.0b10","releaseDate":"2022-03-02T14:36:18.0430000+02:00","stream":"Beta"},{"version":"2020.3.30f1","releaseDate":"2022-02-24T19:26:14.6130000+02:00","stream":"LTS"},{"version":"2021.2.13f1","releaseDate":"2022-02-23T21:42:33.3400000+02:00","stream":"Tech"},{"version":"2022.1.0b9","releaseDate":"2022-02-23T15:13:56.5370000+02:00","stream":"Beta"},{"version":"2021.2.12f1","releaseDate":"2022-02-17T22:43:34.6210000+02:00","stream":"Tech"},{"version":"2019.4.36f1","releaseDate":"2022-02-17T18:41:01.3940000+02:00","stream":"LTS"},{"version":"2020.3.29f1","releaseDate":"2022-02-17T17:59:07.5210000+02:00","stream":"LTS"},{"version":"2022.1.0b8","releaseDate":"2022-02-16T13:35:02.2220000+02:00","stream":"Beta"},{"version":"2021.2.11f1","releaseDate":"2022-02-10T19:24:35.6120000+02:00","stream":"Tech"},{"version":"2020.3.28f1","releaseDate":"2022-02-09T23:48:58.6840000+02:00","stream":"LTS"},{"version":"2022.1.0b7","releaseDate":"2022-02-08T13:39:17.9160000+02:00","stream":"Beta"},{"version":"2022.1.0b6","releaseDate":"2022-02-02T10:30:32.4120000+02:00","stream":"Beta"},{"version":"2021.2.10f1","releaseDate":"2022-02-02T00:07:17.8640000+02:00","stream":"Tech"},{"version":"2020.3.27f1","releaseDate":"2022-02-01T01:06:41.6490000+02:00","stream":"LTS"},{"version":"2019.4.35f1","releaseDate":"2022-01-28T16:26:18.8910000+02:00","stream":"LTS"},{"version":"2022.1.0b5","releaseDate":"2022-01-27T19:44:54.5310000+02:00","stream":"Beta"},{"version":"2021.2.9f1","releaseDate":"2022-01-27T19:09:54.1410000+02:00","stream":"Tech"},{"version":"2022.1.0b4","releaseDate":"2022-01-19T13:50:18.8200000+02:00","stream":"Beta"},{"version":"2020.3.26f1","releaseDate":"2022-01-13T22:29:30.1460000+02:00","stream":"LTS"},{"version":"2021.2.8f1","releaseDate":"2022-01-13T18:36:04.5530000+02:00","stream":"Tech"},{"version":"2022.1.0b3","releaseDate":"2022-01-12T14:14:48.4210000+02:00","stream":"Beta"},{"version":"2020.3.25f1","releaseDate":"2021-12-16T20:21:47.6100000+02:00","stream":"LTS"},{"version":"2021.2.7f1","releaseDate":"2021-12-16T19:44:39.8370000+02:00","stream":"Tech"},{"version":"2019.4.34f1","releaseDate":"2021-12-15T19:52:49.4210000+02:00","stream":"LTS"},{"version":"2022.1.0b2","releaseDate":"2021-12-14T20:43:17.2160000+02:00","stream":"Beta"},{"version":"2021.2.6f1","releaseDate":"2021-12-10T18:38:19.6320000+02:00","stream":"Tech"},{"version":"2022.1.0b1","releaseDate":"2021-12-08T21:49:54.8000000+02:00","stream":"Beta"},{"version":"2020.3.24f1","releaseDate":"2021-12-02T22:30:57.1110000+02:00","stream":"LTS"},{"version":"2021.2.5f1","releaseDate":"2021-12-01T18:54:28.0590000+02:00","stream":"Tech"},{"version":"2022.1.0a16","releaseDate":"2021-11-29T14:23:09.8130000+02:00","stream":"Alpha"},{"version":"2019.4.33f1","releaseDate":"2021-11-25T20:53:15.4390000+02:00","stream":"LTS"},{"version":"2021.2.4f1","releaseDate":"2021-11-25T15:45:23.5490000+02:00","stream":"Tech"},{"version":"2020.3.23f1","releaseDate":"2021-11-19T22:08:31.1420000+02:00","stream":"LTS"},{"version":"2022.1.0a15","releaseDate":"2021-11-18T14:23:33.3050000+02:00","stream":"Alpha"},{"version":"2021.2.3f1","releaseDate":"2021-11-18T13:49:58.4170000+02:00","stream":"Tech"},{"version":"2021.2.2f1","releaseDate":"2021-11-11T13:54:38.2890000+02:00","stream":"Tech"},{"version":"2020.3.22f1","releaseDate":"2021-11-05T21:35:33.6640000+02:00","stream":"LTS"},{"version":"2021.1.28f1","releaseDate":"2021-11-04T21:43:00.6120000+02:00","stream":"Tech"},{"version":"2021.2.1f1","releaseDate":"2021-11-04T14:14:00.1790000+02:00","stream":"Tech"},{"version":"2019.4.32f1","releaseDate":"2021-10-28T19:49:13.4530000+03:00","stream":"LTS"},{"version":"2022.1.0a13","releaseDate":"2021-10-28T17:30:14.4590000+03:00","stream":"Alpha"},{"version":"2021.1.27f1","releaseDate":"2021-10-25T22:24:00.3960000+03:00","stream":"Tech"},{"version":"2021.2.0f1","releaseDate":"2021-10-25T17:52:13.0340000+03:00","stream":"Tech"},{"version":"2020.3.21f1","releaseDate":"2021-10-21T19:33:29.3350000+03:00","stream":"LTS"},{"version":"2021.1.26f1","releaseDate":"2021-10-20T18:42:50.4910000+03:00","stream":"Tech"},{"version":"2021.1.25f1","releaseDate":"2021-10-15T00:35:29.3880000+03:00","stream":"Tech"},{"version":"2022.1.0a12","releaseDate":"2021-10-13T22:34:46.2550000+03:00","stream":"Alpha"},{"version":"2021.2.0b16","releaseDate":"2021-10-12T19:42:06.0710000+03:00","stream":"Beta"},{"version":"2020.3.20f1","releaseDate":"2021-10-08T19:38:35.5420000+03:00","stream":"LTS"},{"version":"2021.1.24f1","releaseDate":"2021-10-06T21:29:11.4340000+03:00","stream":"Tech"},{"version":"2022.1.0a11","releaseDate":"2021-10-06T18:14:18.1140000+03:00","stream":"Alpha"},{"version":"2021.2.0b15","releaseDate":"2021-10-06T12:13:13.6910000+03:00","stream":"Beta"},{"version":"2022.1.0a10","releaseDate":"2021-10-01T22:35:39.3300000+03:00","stream":"Alpha"},{"version":"2021.2.0b14","releaseDate":"2021-10-01T14:27:08.4200000+03:00","stream":"Beta"},{"version":"2021.1.23f1","releaseDate":"2021-09-30T20:01:27.1780000+03:00","stream":"Tech"},{"version":"2019.4.31f1","releaseDate":"2021-09-30T19:11:12.7000000+03:00","stream":"LTS"},{"version":"2022.1.0a9","releaseDate":"2021-09-23T19:24:52.9250000+03:00","stream":"Alpha"},{"version":"2020.3.19f1","releaseDate":"2021-09-23T00:58:37.4230000+03:00","stream":"LTS"},{"version":"2021.2.0b13","releaseDate":"2021-09-22T16:58:46.5710000+03:00","stream":"Beta"},{"version":"2021.1.22f1","releaseDate":"2021-09-21T03:25:04.5570000+03:00","stream":"Tech"},{"version":"2021.2.0b12","releaseDate":"2021-09-16T14:41:11.3370000+03:00","stream":"Beta"},{"version":"2022.1.0a8","releaseDate":"2021-09-15T17:02:16.5010000+03:00","stream":"Alpha"},{"version":"2021.1.21f1","releaseDate":"2021-09-15T00:44:40.4000000+03:00","stream":"Tech"},{"version":"2020.3.18f1","releaseDate":"2021-09-09T12:35:05.2550000+03:00","stream":"LTS"},{"version":"2021.1.20f1","releaseDate":"2021-09-08T16:15:22.7130000+03:00","stream":"Tech"},{"version":"2021.2.0b11","releaseDate":"2021-09-07T14:45:52.4140000+03:00","stream":"Beta"},{"version":"2022.1.0a7","releaseDate":"2021-09-06T14:16:46.3500000+03:00","stream":"Alpha"},{"version":"2021.2.0b10","releaseDate":"2021-09-04T04:54:50.1580000+03:00","stream":"Beta"},{"version":"2019.4.30f1","releaseDate":"2021-09-04T01:17:29.3740000+03:00","stream":"LTS"},{"version":"2021.1.19f1","releaseDate":"2021-09-01T13:51:04.9530000+03:00","stream":"Tech"},{"version":"2020.3.17f1","releaseDate":"2021-08-25T21:28:14.2230000+03:00","stream":"LTS"},{"version":"2021.1.18f1","releaseDate":"2021-08-25T20:26:42.2380000+03:00","stream":"Tech"},{"version":"2021.2.0b9","releaseDate":"2021-08-25T14:31:02.2950000+03:00","stream":"Beta"},{"version":"2021.2.0b8","releaseDate":"2021-08-19T12:59:27.4650000+03:00","stream":"Beta"},{"version":"2021.1.17f1","releaseDate":"2021-08-13T21:37:59.3900000+03:00","stream":"Tech"},{"version":"2020.3.16f1","releaseDate":"2021-08-12T18:55:22.6880000+03:00","stream":"LTS"},{"version":"2021.2.0b7","releaseDate":"2021-08-10T13:33:56.9150000+03:00","stream":"Beta"},{"version":"2021.2.0b6","releaseDate":"2021-08-04T16:24:08.9160000+03:00","stream":"Beta"},{"version":"2021.2.0b5","releaseDate":"2021-08-02T18:15:23.1620000+03:00","stream":"Beta"},{"version":"2021.1.16f1","releaseDate":"2021-08-02T17:27:00.4890000+03:00","stream":"Tech"},{"version":"2020.3.15f2","releaseDate":"2021-07-30T19:23:30.2390000+03:00","stream":"LTS"},{"version":"2019.4.29f1","releaseDate":"2021-07-30T18:19:33.1520000+03:00","stream":"LTS"},{"version":"2021.2.0b4","releaseDate":"2021-07-15T13:53:43.7390000+03:00","stream":"Beta"},{"version":"2021.1.15f1","releaseDate":"2021-07-14T14:13:58.1820000+03:00","stream":"Tech"},{"version":"2020.3.14f1","releaseDate":"2021-07-13T19:58:10.4910000+03:00","stream":"LTS"},{"version":"2021.2.0b3","releaseDate":"2021-07-08T13:47:42.2000000+03:00","stream":"Beta"},{"version":"2021.1.14f1","releaseDate":"2021-07-07T04:08:43.8360000+03:00","stream":"Tech"},{"version":"2021.2.0b2","releaseDate":"2021-07-02T16:15:04.4120000+03:00","stream":"Beta"},{"version":"2020.3.13f1","releaseDate":"2021-06-30T21:40:12.8800000+03:00","stream":"LTS"},{"version":"2021.1.13f1","releaseDate":"2021-06-30T08:59:29.1870000+03:00","stream":"Tech"},{"version":"2021.2.0b1","releaseDate":"2021-06-18T22:27:35.5390000+03:00","stream":"Beta"},{"version":"2018.4.36f1","releaseDate":"2021-06-17T19:13:54.0080000+03:00","stream":"LTS"},{"version":"2021.1.12f1","releaseDate":"2021-06-17T18:00:50.5720000+03:00","stream":"Tech"},{"version":"2020.3.12f1","releaseDate":"2021-06-15T21:58:12.2770000+03:00","stream":"LTS"},{"version":"2021.2.0a21","releaseDate":"2021-06-15T19:37:53.0380000+03:00","stream":"Alpha"},{"version":"2021.1.11f1","releaseDate":"2021-06-10T13:04:24.2960000+03:00","stream":"Tech"},{"version":"2021.2.0a20","releaseDate":"2021-06-09T20:17:01.4260000+03:00","stream":"Alpha"},{"version":"2019.4.28f1","releaseDate":"2021-06-03T20:50:56.4390000+03:00","stream":"LTS"},{"version":"2021.1.10f1","releaseDate":"2021-06-03T19:53:09.2760000+03:00","stream":"Tech"},{"version":"2021.2.0a19","releaseDate":"2021-06-03T18:19:41.9870000+03:00","stream":"Alpha"},{"version":"2020.3.11f1","releaseDate":"2021-06-01T20:44:03.0610000+03:00","stream":"LTS"},{"version":"2021.1.9f1","releaseDate":"2021-05-28T15:13:35.9700000+03:00","stream":"Tech"},{"version":"2020.3.10f1","releaseDate":"2021-05-26T21:08:15.2460000+03:00","stream":"LTS"},{"version":"2019.4.27f1","releaseDate":"2021-05-20T16:45:43.0950000+03:00","stream":"LTS"},{"version":"2020.3.9f1","releaseDate":"2021-05-19T20:45:38.0840000+03:00","stream":"LTS"},{"version":"2021.1.7f1","releaseDate":"2021-05-13T17:00:02.5350000+03:00","stream":"Tech"},{"version":"2020.3.8f1","releaseDate":"2021-05-12T23:50:34.7750000+03:00","stream":"LTS"},{"version":"2021.2.0a17","releaseDate":"2021-05-12T21:15:13.4370000+03:00","stream":"Alpha"},{"version":"2018.4.35f1","releaseDate":"2021-05-12T18:16:04.9960000+03:00","stream":"LTS"},{"version":"2021.1.6f1","releaseDate":"2021-05-06T09:42:44.3860000+03:00","stream":"Tech"},{"version":"2019.4.26f1","releaseDate":"2021-05-05T21:28:43.0280000+03:00","stream":"LTS"},{"version":"2020.3.7f1","releaseDate":"2021-05-05T20:05:58.3680000+03:00","stream":"LTS"},{"version":"2021.2.0a16","releaseDate":"2021-05-05T18:00:27.2340000+03:00","stream":"Alpha"},{"version":"2020.3.6f1","releaseDate":"2021-04-28T21:33:45.0410000+03:00","stream":"LTS"},{"version":"2021.2.0a15","releaseDate":"2021-04-28T19:51:06.5220000+03:00","stream":"Alpha"},{"version":"2021.1.5f1","releaseDate":"2021-04-28T14:57:22.3140000+03:00","stream":"Tech"},{"version":"2019.4.25f1","releaseDate":"2021-04-22T21:56:19.4680000+03:00","stream":"LTS"},{"version":"2021.1.4f1","releaseDate":"2021-04-22T11:14:16.9190000+03:00","stream":"Tech"},{"version":"2021.2.0a14","releaseDate":"2021-04-21T19:58:34.0620000+03:00","stream":"Alpha"},{"version":"2020.3.5f1","releaseDate":"2021-04-21T18:58:44.8310000+03:00","stream":"LTS"},{"version":"2018.4.34f1","releaseDate":"2021-04-15T13:28:39.0470000+03:00","stream":"LTS"},{"version":"2021.2.0a13","releaseDate":"2021-04-14T19:07:25.9350000+03:00","stream":"Alpha"},{"version":"2020.3.4f1","releaseDate":"2021-04-13T20:59:16.5940000+03:00","stream":"LTS"},{"version":"2021.1.3f1","releaseDate":"2021-04-13T14:23:53.3800000+03:00","stream":"Tech"},{"version":"2019.4.24f1","releaseDate":"2021-04-09T02:33:06.9090000+03:00","stream":"LTS"},{"version":"2020.3.3f1","releaseDate":"2021-04-07T19:37:40.6130000+03:00","stream":"LTS"},{"version":"2021.1.2f1","releaseDate":"2021-04-07T17:35:36.8280000+03:00","stream":"Tech"},{"version":"2021.2.0a12","releaseDate":"2021-04-06T19:40:54.7470000+03:00","stream":"Alpha"},{"version":"2021.2.0a11","releaseDate":"2021-03-31T20:48:42.9770000+03:00","stream":"Alpha"},{"version":"2021.1.1f1","releaseDate":"2021-03-31T17:04:08.0250000+03:00","stream":"Tech"},{"version":"2020.3.2f1","releaseDate":"2021-03-29T21:24:30.6840000+03:00","stream":"LTS"},{"version":"2021.2.0a10","releaseDate":"2021-03-24T22:41:29.4570000+02:00","stream":"Alpha"},{"version":"2018.4.33f1","releaseDate":"2021-03-24T19:48:21.9510000+02:00","stream":"LTS"},{"version":"2019.4.23f1","releaseDate":"2021-03-24T18:44:56.5610000+02:00","stream":"LTS"},{"version":"2020.3.1f1","releaseDate":"2021-03-22T20:05:51.7280000+02:00","stream":"LTS"},{"version":"2021.1.0f1","releaseDate":"2021-03-22T13:13:57.9050000+02:00","stream":"Tech"},{"version":"2021.2.0a9","releaseDate":"2021-03-17T20:02:06.9710000+02:00","stream":"Alpha"},{"version":"2021.1.0b12","releaseDate":"2021-03-17T13:21:39.6870000+02:00","stream":"Beta"},{"version":"2020.3.0f1","releaseDate":"2021-03-11T01:09:00.0190000+02:00","stream":"LTS"},{"version":"2021.1.0b11","releaseDate":"2021-03-10T20:19:22.0910000+02:00","stream":"Beta"},{"version":"2019.4.22f1","releaseDate":"2021-03-10T18:07:28.3010000+02:00","stream":"LTS"},{"version":"2021.2.0a8","releaseDate":"2021-03-09T17:39:33.3380000+02:00","stream":"Alpha"},{"version":"2021.1.0b10","releaseDate":"2021-03-04T19:23:44.8170000+02:00","stream":"Beta"},{"version":"2020.2.7f1","releaseDate":"2021-03-04T18:43:17.8170000+02:00","stream":"LTS"},{"version":"2021.2.0a6","releaseDate":"2021-02-24T20:59:57.2080000+02:00","stream":"Alpha"},{"version":"2021.1.0b8","releaseDate":"2021-02-24T19:47:25.5060000+02:00","stream":"Beta"},{"version":"2019.4.21f1","releaseDate":"2021-02-24T19:14:33.4900000+02:00","stream":"LTS"},{"version":"2020.2.6f1","releaseDate":"2021-02-24T02:10:19.4960000+02:00","stream":"LTS"},{"version":"2020.2.5f1","releaseDate":"2021-02-19T01:17:13.0170000+02:00","stream":"LTS"},{"version":"2018.4.32f1","releaseDate":"2021-02-18T14:18:22.1450000+02:00","stream":"LTS"},{"version":"2021.2.0a5","releaseDate":"2021-02-17T18:45:52.4040000+02:00","stream":"Alpha"},{"version":"2021.1.0b7","releaseDate":"2021-02-17T17:33:40.3340000+02:00","stream":"Beta"},{"version":"2020.2.4f1","releaseDate":"2021-02-12T22:14:18.5720000+02:00","stream":"LTS"},{"version":"2019.4.20f1","releaseDate":"2021-02-10T19:06:33.6840000+02:00","stream":"LTS"},{"version":"2021.1.0b6","releaseDate":"2021-02-10T17:26:16.3810000+02:00","stream":"Beta"},{"version":"2020.2.3f1","releaseDate":"2021-02-03T22:51:44.0220000+02:00","stream":"LTS"},{"version":"2021.1.0b5","releaseDate":"2021-02-03T13:02:09.2570000+02:00","stream":"Beta"},{"version":"2019.4.19f1","releaseDate":"2021-02-01T19:49:54.7260000+02:00","stream":"LTS"},{"version":"2021.1.0b4","releaseDate":"2021-01-27T14:14:30.6700000+02:00","stream":"Beta"},{"version":"2018.4.31f1","releaseDate":"2021-01-22T16:08:18.4010000+02:00","stream":"LTS"},{"version":"2020.2.2f1","releaseDate":"2021-01-21T22:41:55.7470000+02:00","stream":"LTS"},{"version":"2021.1.0b3","releaseDate":"2021-01-20T18:49:58.0860000+02:00","stream":"Beta"},{"version":"2021.1.0b2","releaseDate":"2021-01-13T17:48:52.7690000+02:00","stream":"Beta"},{"version":"2019.4.18f1","releaseDate":"2021-01-13T17:13:41.1610000+02:00","stream":"LTS"},{"version":"2020.2.1f1","releaseDate":"2020-12-23T19:32:56.7940000+02:00","stream":"LTS"},{"version":"2021.1.0b1","releaseDate":"2020-12-23T17:53:59.2550000+02:00","stream":"Beta"},{"version":"2019.4.17f1","releaseDate":"2020-12-22T17:05:02.0370000+02:00","stream":"LTS"},{"version":"2020.2.0f1","releaseDate":"2020-12-14T22:24:28.6530000+02:00","stream":"LTS"},{"version":"2021.1.0a9","releaseDate":"2020-12-11T11:34:06.1400000+02:00","stream":"Alpha"},{"version":"2020.1.17f1","releaseDate":"2020-12-09T13:39:40.0550000+02:00","stream":"LTS"},{"version":"2020.2.0b14","releaseDate":"2020-12-02T19:45:40.0260000+02:00","stream":"Beta"},{"version":"2021.1.0a8","releaseDate":"2020-12-02T19:15:19.2560000+02:00","stream":"Alpha"},{"version":"2019.4.16f1","releaseDate":"2020-12-02T18:12:41.3440000+02:00","stream":"LTS"},{"version":"2018.4.30f1","releaseDate":"2020-12-01T22:09:28.0830000+02:00","stream":"LTS"},{"version":"2020.1.16f1","releaseDate":"2020-12-01T21:04:30.3740000+02:00","stream":"LTS"},{"version":"2021.1.0a7","releaseDate":"2020-11-25T20:59:24.1580000+02:00","stream":"Alpha"},{"version":"2020.2.0b13","releaseDate":"2020-11-25T19:57:21.5630000+02:00","stream":"Beta"},{"version":"2020.1.15f1","releaseDate":"2020-11-25T13:32:56.2470000+02:00","stream":"LTS"},{"version":"2020.2.0b12","releaseDate":"2020-11-19T20:01:22.4320000+02:00","stream":"Beta"},{"version":"2020.1.14f1","releaseDate":"2020-11-18T21:08:42.0520000+02:00","stream":"LTS"},{"version":"2019.4.15f1","releaseDate":"2020-11-18T20:02:15.0550000+02:00","stream":"LTS"},{"version":"2021.1.0a5","releaseDate":"2020-11-16T10:29:13.8620000+02:00","stream":"Alpha"},{"version":"2021.1.0a6","releaseDate":"2020-11-12T15:53:12.8280000+02:00","stream":"Alpha"},{"version":"2020.2.0b11","releaseDate":"2020-11-11T21:36:00.6590000+02:00","stream":"Beta"},{"version":"2018.4.29f1","releaseDate":"2020-11-11T12:56:28.8090000+02:00","stream":"LTS"},{"version":"2020.1.13f1","releaseDate":"2020-11-11T11:59:32.6030000+02:00","stream":"LTS"},{"version":"2019.4.14f1","releaseDate":"2020-11-05T19:37:50.1760000+02:00","stream":"LTS"},{"version":"2020.2.0b10","releaseDate":"2020-11-04T19:18:58.3930000+02:00","stream":"Beta"},{"version":"2021.1.0a4","releaseDate":"2020-11-04T13:36:41.3270000+02:00","stream":"Alpha"},{"version":"2020.1.12f1","releaseDate":"2020-11-04T13:19:05.1340000+02:00","stream":"LTS"},{"version":"2020.2.0b9","releaseDate":"2020-10-28T18:33:57.6480000+02:00","stream":"Beta"},{"version":"2020.1.11f1","releaseDate":"2020-10-28T13:19:45.3420000+02:00","stream":"LTS"},{"version":"2020.2.0b8","releaseDate":"2020-10-22T18:53:30.1610000+03:00","stream":"Beta"},{"version":"2021.1.0a2","releaseDate":"2020-10-22T13:37:27.7270000+03:00","stream":"Alpha"},{"version":"2019.4.13f1","releaseDate":"2020-10-21T17:49:14.4000000+03:00","stream":"LTS"},{"version":"2020.1.10f1","releaseDate":"2020-10-21T12:46:16.1030000+03:00","stream":"LTS"},{"version":"2020.2.0b7","releaseDate":"2020-10-15T23:12:00.7850000+03:00","stream":"Beta"},{"version":"2020.1.9f1","releaseDate":"2020-10-13T20:07:55.6420000+03:00","stream":"LTS"},{"version":"2020.2.0b6","releaseDate":"2020-10-08T20:11:41.8220000+03:00","stream":"Beta"},{"version":"2019.4.12f1","releaseDate":"2020-10-07T19:30:31.4100000+03:00","stream":"LTS"},{"version":"2020.1.8f1","releaseDate":"2020-10-06T13:51:55.4870000+03:00","stream":"LTS"},{"version":"2018.4.28f1","releaseDate":"2020-10-06T12:51:51.3680000+03:00","stream":"LTS"},{"version":"2020.2.0b5","releaseDate":"2020-10-01T20:28:10.4460000+03:00","stream":"Beta"},{"version":"2020.1.7f1","releaseDate":"2020-09-30T12:51:21.0060000+03:00","stream":"LTS"},{"version":"2020.2.0b4","releaseDate":"2020-09-28T18:04:05.0940000+03:00","stream":"Beta"},{"version":"2019.4.11f1","releaseDate":"2020-09-23T17:50:07.5230000+03:00","stream":"LTS"},{"version":"2020.1.6f1","releaseDate":"2020-09-16T13:37:08.4180000+03:00","stream":"LTS"},{"version":"2019.4.10f1","releaseDate":"2020-09-10T18:00:59.3550000+03:00","stream":"LTS"},{"version":"2020.1.5f1","releaseDate":"2020-09-10T15:29:36.7490000+03:00","stream":"LTS"},{"version":"2020.2.0b2","releaseDate":"2020-09-09T20:06:38.9020000+03:00","stream":"Beta"},{"version":"2018.4.27f1","releaseDate":"2020-09-09T12:04:26.6260000+03:00","stream":"LTS"},{"version":"2020.2.0b1","releaseDate":"2020-09-03T06:50:06.9580000+03:00","stream":"Beta"},{"version":"2020.1.4f1","releaseDate":"2020-08-27T16:54:15.2610000+03:00","stream":"LTS"},{"version":"2019.4.9f1","releaseDate":"2020-08-26T18:12:20.1780000+03:00","stream":"LTS"},{"version":"2020.1.3f1","releaseDate":"2020-08-21T20:25:52.4300000+03:00","stream":"LTS"},{"version":"2020.2.0a21","releaseDate":"2020-08-20T19:08:48.0150000+03:00","stream":"Alpha"},{"version":"2019.4.8f1","releaseDate":"2020-08-12T16:18:43.9270000+03:00","stream":"LTS"},{"version":"2018.4.26f1","releaseDate":"2020-08-12T14:59:47.8120000+03:00","stream":"LTS"},{"version":"2020.1.2f1","releaseDate":"2020-08-12T14:11:53.6620000+03:00","stream":"LTS"},{"version":"2019.4.7f1","releaseDate":"2020-08-05T18:02:13.5720000+03:00","stream":"LTS"},{"version":"2020.1.1f1","releaseDate":"2020-08-05T12:04:55.1630000+03:00","stream":"LTS"},{"version":"2019.4.6f1","releaseDate":"2020-07-30T23:31:02.8270000+03:00","stream":"LTS"},{"version":"2020.2.0a19","releaseDate":"2020-07-28T20:12:37.1260000+03:00","stream":"Alpha"},{"version":"2019.4.5f1","releaseDate":"2020-07-23T11:08:58.2940000+03:00","stream":"LTS"},{"version":"2020.1.0f1","releaseDate":"2020-07-20T13:15:38.9490000+03:00","stream":"LTS"},{"version":"2020.2.0a18","releaseDate":"2020-07-15T18:09:32.2040000+03:00","stream":"Alpha"},{"version":"2019.4.4f1","releaseDate":"2020-07-15T17:33:21.3420000+03:00","stream":"LTS"},{"version":"2018.4.25f1","releaseDate":"2020-07-14T18:59:51.1720000+03:00","stream":"LTS"},{"version":"2020.1.0b16","releaseDate":"2020-07-14T14:16:19.7360000+03:00","stream":"Beta"},{"version":"2019.4.3f1","releaseDate":"2020-07-08T20:17:30.7430000+03:00","stream":"LTS"},{"version":"2020.1.0b15","releaseDate":"2020-07-08T16:16:36.1440000+03:00","stream":"Beta"},{"version":"2020.2.0a17","releaseDate":"2020-07-07T20:13:29.0870000+03:00","stream":"Alpha"},{"version":"2018.4.24f1","releaseDate":"2020-07-02T15:50:59.9690000+03:00","stream":"LTS"},{"version":"2019.4.2f1","releaseDate":"2020-07-01T17:31:49.6530000+03:00","stream":"LTS"},{"version":"2020.2.0a16","releaseDate":"2020-06-30T20:30:06.4050000+03:00","stream":"Alpha"},{"version":"2020.1.0b14","releaseDate":"2020-06-30T16:03:30.1650000+03:00","stream":"Beta"},{"version":"2019.4.1f1","releaseDate":"2020-06-18T17:26:11.2500000+03:00","stream":"LTS"},{"version":"2020.2.0a15","releaseDate":"2020-06-17T01:26:34.6240000+03:00","stream":"Alpha"},{"version":"2020.1.0b13","releaseDate":"2020-06-16T18:13:24.1630000+03:00","stream":"Beta"},{"version":"2020.1.0b12","releaseDate":"2020-06-09T18:59:47.8410000+03:00","stream":"Beta"},{"version":"2019.4.0f1","releaseDate":"2020-06-07T19:09:39.2440000+03:00","stream":"LTS"},{"version":"2020.1.0b11","releaseDate":"2020-06-03T11:04:41.2780000+03:00","stream":"Beta"},{"version":"2020.2.0a13","releaseDate":"2020-06-02T21:22:41.6660000+03:00","stream":"Alpha"},{"version":"2019.3.15f1","releaseDate":"2020-05-28T18:28:05.9350000+03:00","stream":"LTS"},{"version":"2020.1.0b10","releaseDate":"2020-05-27T18:18:15.7610000+03:00","stream":"Beta"},{"version":"2020.2.0a12","releaseDate":"2020-05-27T04:46:13.7030000+03:00","stream":"Alpha"},{"version":"2020.1.0b9","releaseDate":"2020-05-18T22:30:07.6160000+03:00","stream":"Beta"},{"version":"2019.3.14f1","releaseDate":"2020-05-18T22:09:15.4130000+03:00","stream":"LTS"},{"version":"2020.2.0a11","releaseDate":"2020-05-18T20:28:51.3580000+03:00","stream":"Alpha"},{"version":"2018.4.23f1","releaseDate":"2020-05-18T19:26:44.5050000+03:00","stream":"LTS"},{"version":"2017.4.40f1","releaseDate":"2020-05-18T18:54:47.5130000+03:00","stream":"LTS"},{"version":"2019.3.13f1","releaseDate":"2020-05-06T19:28:06.4310000+03:00","stream":"LTS"},{"version":"2020.2.0a10","releaseDate":"2020-05-06T17:34:37.9180000+03:00","stream":"Alpha"},{"version":"2020.1.0b8","releaseDate":"2020-05-05T19:50:03.1040000+03:00","stream":"Beta"},{"version":"2019.3.12f1","releaseDate":"2020-04-29T20:04:13.3180000+03:00","stream":"LTS"},{"version":"2020.2.0a9","releaseDate":"2020-04-28T16:42:11.9750000+03:00","stream":"Alpha"},{"version":"2020.1.0b7","releaseDate":"2020-04-28T13:12:51.1350000+03:00","stream":"Beta"},{"version":"2018.4.22f1","releaseDate":"2020-04-24T14:56:23.0650000+03:00","stream":"LTS"},{"version":"2020.1.0b6","releaseDate":"2020-04-24T00:32:23.4180000+03:00","stream":"Beta"},{"version":"2020.2.0a8","releaseDate":"2020-04-23T23:39:25.3310000+03:00","stream":"Alpha"},{"version":"2019.3.11f1","releaseDate":"2020-04-23T23:12:30.9100000+03:00","stream":"LTS"},{"version":"2019.3.10f1","releaseDate":"2020-04-16T17:51:49.2210000+03:00","stream":"LTS"},{"version":"2020.2.0a7","releaseDate":"2020-04-14T17:50:07.5570000+03:00","stream":"Alpha"},{"version":"2018.4.21f1","releaseDate":"2020-04-09T13:24:27.7520000+03:00","stream":"LTS"},{"version":"2020.1.0b5","releaseDate":"2020-04-09T12:02:00.1780000+03:00","stream":"Beta"},{"version":"2019.3.9f1","releaseDate":"2020-04-08T20:27:11.2330000+03:00","stream":"LTS"},{"version":"2019.3.8f1","releaseDate":"2020-04-06T16:35:43.6360000+03:00","stream":"LTS"},{"version":"2017.4.39f1","releaseDate":"2020-04-03T11:51:34.4000000+03:00","stream":"LTS"},{"version":"2020.1.0b4","releaseDate":"2020-04-01T12:27:53.0680000+03:00","stream":"Beta"},{"version":"2019.3.7f1","releaseDate":"2020-03-26T15:25:09.7460000+02:00","stream":"LTS"},{"version":"2018.4.20f1","releaseDate":"2020-03-26T14:30:57.8620000+02:00","stream":"LTS"},{"version":"2020.1.0b3","releaseDate":"2020-03-26T10:40:28.9370000+02:00","stream":"Beta"},{"version":"2017.4.38f1","releaseDate":"2020-03-20T12:06:20.6150000+02:00","stream":"LTS"},{"version":"2019.3.6f1","releaseDate":"2020-03-19T15:48:25.4900000+02:00","stream":"LTS"},{"version":"2020.1.0b2","releaseDate":"2020-03-18T13:35:10.1890000+02:00","stream":"Beta"},{"version":"2018.4.19f1","releaseDate":"2020-03-13T12:43:07.0330000+02:00","stream":"LTS"},{"version":"2019.3.5f1","releaseDate":"2020-03-12T15:37:50.3680000+02:00","stream":"LTS"},{"version":"2020.1.0b1","releaseDate":"2020-03-11T14:36:55.5980000+02:00","stream":"Beta"},{"version":"2019.3.4f1","releaseDate":"2020-03-06T12:05:37.8940000+02:00","stream":"LTS"},{"version":"2020.1.0a25","releaseDate":"2020-02-27T14:18:33.9680000+02:00","stream":"Alpha"},{"version":"2018.4.18f1","releaseDate":"2020-02-27T13:32:09.7550000+02:00","stream":"LTS"},{"version":"2019.3.3f1","releaseDate":"2020-02-26T15:41:18.4700000+02:00","stream":"LTS"},{"version":"2020.1.0a24","releaseDate":"2020-02-21T12:47:26.5020000+02:00","stream":"Alpha"},{"version":"2019.3.2f1","releaseDate":"2020-02-19T18:29:42.6760000+02:00","stream":"LTS"},{"version":"2017.4.37f1","releaseDate":"2020-02-18T18:24:58.6090000+02:00","stream":"LTS"},{"version":"2020.1.0a23","releaseDate":"2020-02-12T17:20:34.1120000+02:00","stream":"Alpha"},{"version":"2019.3.1f1","releaseDate":"2020-02-12T15:41:59.0190000+02:00","stream":"LTS"},{"version":"2018.4.17f1","releaseDate":"2020-02-11T13:48:12.9240000+02:00","stream":"LTS"},{"version":"2019.2.21f1","releaseDate":"2020-02-08T01:29:05.9630000+02:00","stream":"LTS"},{"version":"2020.1.0a22","releaseDate":"2020-02-05T12:35:10.0980000+02:00","stream":"Alpha"},{"version":"2019.2.20f1","releaseDate":"2020-01-31T15:52:30.5640000+02:00","stream":"LTS"},{"version":"2020.1.0a21","releaseDate":"2020-01-30T13:45:07.1640000+02:00","stream":"Alpha"},{"version":"2018.4.16f1","releaseDate":"2020-01-27T16:58:33.6030000+02:00","stream":"LTS"},{"version":"2019.3.0f6","releaseDate":"2020-01-27T14:06:56.5750000+02:00","stream":"LTS"},{"version":"2020.1.0a20","releaseDate":"2020-01-23T12:37:53.2280000+02:00","stream":"Alpha"},{"version":"2019.2.19f1","releaseDate":"2020-01-22T21:01:38.0230000+02:00","stream":"LTS"},{"version":"2020.1.0a19","releaseDate":"2020-01-16T13:54:15.4740000+02:00","stream":"Alpha"},{"version":"2019.2.18f1","releaseDate":"2020-01-16T01:24:20.6510000+02:00","stream":"LTS"},{"version":"2019.3.0f5","releaseDate":"2020-01-13T19:38:10.2010000+02:00","stream":"LTS"},{"version":"2017.4.36f1","releaseDate":"2020-01-09T16:49:31.0200000+02:00","stream":"LTS"},{"version":"2018.4.15f1","releaseDate":"2020-01-09T16:09:30.0590000+02:00","stream":"LTS"},{"version":"2020.1.0a18","releaseDate":"2020-01-08T13:28:04.1620000+02:00","stream":"Alpha"},{"version":"2020.1.0a17","releaseDate":"2019-12-19T12:21:05.7530000+02:00","stream":"Alpha"},{"version":"2019.2.17f1","releaseDate":"2019-12-18T21:20:41.5950000+02:00","stream":"LTS"},{"version":"2019.2.16f1","releaseDate":"2019-12-13T20:41:32.6580000+02:00","stream":"LTS"},{"version":"2020.1.0a16","releaseDate":"2019-12-12T16:47:22.9460000+02:00","stream":"Alpha"},{"version":"2019.3.0f3","releaseDate":"2019-12-11T22:34:41.7010000+02:00","stream":"LTS"},{"version":"2018.4.14f1","releaseDate":"2019-12-10T13:15:45.5800000+02:00","stream":"LTS"},{"version":"2017.4.35f1","releaseDate":"2019-12-06T16:49:43.1000000+02:00","stream":"LTS"},{"version":"2020.1.0a15","releaseDate":"2019-12-06T12:23:44.0090000+02:00","stream":"Alpha"},{"version":"2019.2.15f1","releaseDate":"2019-12-04T21:50:05.0710000+02:00","stream":"LTS"},{"version":"2019.2.14f1","releaseDate":"2019-11-27T20:40:20.1350000+02:00","stream":"LTS"},{"version":"2019.3.0f1","releaseDate":"2019-11-27T18:46:18.6920000+02:00","stream":"LTS"},{"version":"2019.3.0b12","releaseDate":"2019-11-21T22:46:51.9600000+02:00","stream":"Beta"},{"version":"2020.1.0a14","releaseDate":"2019-11-21T19:18:32.5570000+02:00","stream":"Alpha"},{"version":"2018.4.13f1","releaseDate":"2019-11-21T17:42:03.5440000+02:00","stream":"LTS"},{"version":"2019.2.13f1","releaseDate":"2019-11-20T19:22:07.1550000+02:00","stream":"LTS"},{"version":"2020.1.0a13","releaseDate":"2019-11-15T14:47:40.5570000+02:00","stream":"Alpha"},{"version":"2019.3.0b11","releaseDate":"2019-11-14T23:50:47.1120000+02:00","stream":"Beta"},{"version":"2019.2.12f1","releaseDate":"2019-11-11T20:38:24.9000000+02:00","stream":"LTS"},{"version":"2020.1.0a12","releaseDate":"2019-11-08T12:46:31.2520000+02:00","stream":"Alpha"},{"version":"2019.3.0b10","releaseDate":"2019-11-06T19:42:42.1640000+02:00","stream":"Beta"},{"version":"2019.3.0b9","releaseDate":"2019-11-01T18:37:43.0620000+02:00","stream":"Beta"},{"version":"2019.2.11f1","releaseDate":"2019-11-01T14:01:07.4740000+02:00","stream":"LTS"},{"version":"2020.1.0a11","releaseDate":"2019-10-31T18:32:46.5520000+02:00","stream":"Alpha"},{"version":"2017.4.34f1","releaseDate":"2019-10-30T19:20:05.4810000+02:00","stream":"LTS"},{"version":"2018.4.12f1","releaseDate":"2019-10-28T13:35:32.8840000+02:00","stream":"LTS"},{"version":"2019.2.10f1","releaseDate":"2019-10-24T00:46:43.5750000+03:00","stream":"LTS"},{"version":"2019.3.0b8","releaseDate":"2019-10-23T20:20:42.4990000+03:00","stream":"Beta"},{"version":"2020.1.0a9","releaseDate":"2019-10-17T13:21:00.0530000+03:00","stream":"Alpha"},{"version":"2019.3.0b7","releaseDate":"2019-10-14T20:32:52.8980000+03:00","stream":"Beta"},{"version":"2019.2.9f1","releaseDate":"2019-10-11T21:05:30.4520000+03:00","stream":"LTS"},{"version":"2018.4.11f1","releaseDate":"2019-10-10T16:08:52.3110000+03:00","stream":"LTS"},{"version":"2020.1.0a8","releaseDate":"2019-10-10T12:24:32.0630000+03:00","stream":"Alpha"},{"version":"2017.4.33f1","releaseDate":"2019-10-07T11:27:32.7430000+03:00","stream":"LTS"},{"version":"2019.3.0b6","releaseDate":"2019-10-04T19:50:37.4470000+03:00","stream":"Beta"},{"version":"2019.2.8f1","releaseDate":"2019-10-04T01:11:03.8390000+03:00","stream":"LTS"},{"version":"2020.1.0a7","releaseDate":"2019-10-01T19:22:34.3760000+03:00","stream":"Alpha"},{"version":"2018.4.10f1","releaseDate":"2019-10-01T15:06:54.8160000+03:00","stream":"LTS"},{"version":"2019.2.7f2","releaseDate":"2019-09-30T21:04:28.7120000+03:00","stream":"LTS"},{"version":"2019.3.0b5","releaseDate":"2019-09-30T17:32:45.4310000+03:00","stream":"Beta"},{"version":"2020.1.0a5","releaseDate":"2019-09-25T17:28:57.7470000+03:00","stream":"Alpha"},{"version":"2019.3.0b4","releaseDate":"2019-09-20T18:43:52.3750000+03:00","stream":"Beta"},{"version":"2019.2.6f1","releaseDate":"2019-09-17T22:29:14.5200000+03:00","stream":"LTS"},{"version":"2018.4.9f1","releaseDate":"2019-09-13T15:05:02.2970000+03:00","stream":"LTS"},{"version":"2019.2.5f1","releaseDate":"2019-09-12T18:37:27.5480000+03:00","stream":"LTS"},{"version":"2019.3.0b3","releaseDate":"2019-09-10T19:31:30.3650000+03:00","stream":"Beta"},{"version":"2019.3.0b2","releaseDate":"2019-09-06T20:16:21.5300000+03:00","stream":"Beta"},{"version":"2020.1.0a3","releaseDate":"2019-09-05T18:08:44.2560000+03:00","stream":"Alpha"},{"version":"2019.2.4f1","releaseDate":"2019-09-05T17:17:26.6680000+03:00","stream":"LTS"},{"version":"2017.4.32f1","releaseDate":"2019-09-05T14:50:38.8620000+03:00","stream":"LTS"},{"version":"2018.4.8f1","releaseDate":"2019-08-30T12:24:35.8910000+03:00","stream":"LTS"},{"version":"2019.2.3f1","releaseDate":"2019-08-28T15:57:33.7170000+03:00","stream":"LTS"},{"version":"2019.3.0b1","releaseDate":"2019-08-26T18:03:03.4490000+03:00","stream":"Beta"},{"version":"2019.2.2f1","releaseDate":"2019-08-21T13:42:41.1150000+03:00","stream":"LTS"},{"version":"2018.4.7f1","releaseDate":"2019-08-19T13:07:37.5940000+03:00","stream":"LTS"},{"version":"2019.2.1f1","releaseDate":"2019-08-14T17:28:59.0190000+03:00","stream":"LTS"},{"version":"2019.3.0a12","releaseDate":"2019-08-13T17:24:35.2560000+03:00","stream":"Alpha"},{"version":"2018.4.6f1","releaseDate":"2019-08-08T12:30:29.8390000+03:00","stream":"LTS"},{"version":"2019.1.14f1","releaseDate":"2019-08-08T12:01:21.7260000+03:00","stream":"LTS"},{"version":"2017.4.31f1","releaseDate":"2019-08-02T13:02:34.0640000+03:00","stream":"LTS"},{"version":"2019.1.13f1","releaseDate":"2019-08-01T14:12:43.9510000+03:00","stream":"LTS"},{"version":"2019.3.0a11","releaseDate":"2019-07-31T21:32:46.9870000+03:00","stream":"Alpha"},{"version":"2019.2.0f1","releaseDate":"2019-07-29T13:48:07.1340000+03:00","stream":"LTS"},{"version":"2019.1.12f1","releaseDate":"2019-07-26T16:28:16.0830000+03:00","stream":"LTS"},{"version":"2018.4.5f1","releaseDate":"2019-07-26T14:33:58.8310000+03:00","stream":"LTS"},{"version":"2019.3.0a10","releaseDate":"2019-07-22T21:03:08.9830000+03:00","stream":"Alpha"},{"version":"2019.2.0b10","releaseDate":"2019-07-18T18:39:34.1320000+03:00","stream":"Beta"},{"version":"2019.1.11f1","releaseDate":"2019-07-18T15:29:11.3370000+03:00","stream":"LTS"},{"version":"2018.4.4f1","releaseDate":"2019-07-12T19:20:22.9020000+03:00","stream":"LTS"},{"version":"2019.1.10f1","releaseDate":"2019-07-12T18:54:54.0030000+03:00","stream":"LTS"},{"version":"2019.2.0b9","releaseDate":"2019-07-11T21:56:49.6310000+03:00","stream":"Beta"},{"version":"2017.4.30f1","releaseDate":"2019-07-05T17:27:47.0610000+03:00","stream":"LTS"},{"version":"2019.1.9f1","releaseDate":"2019-07-05T14:47:29.6410000+03:00","stream":"LTS"},{"version":"2019.3.0a8","releaseDate":"2019-07-03T20:30:44.9800000+03:00","stream":"Alpha"},{"version":"2018.4.3f1","releaseDate":"2019-06-28T16:03:41.3670000+03:00","stream":"LTS"},{"version":"2019.3.0a7","releaseDate":"2019-06-26T20:12:40.6830000+03:00","stream":"Alpha"},{"version":"2019.2.0b7","releaseDate":"2019-06-25T23:47:11.2540000+03:00","stream":"Beta"},{"version":"2019.1.8f1","releaseDate":"2019-06-22T11:48:33.7900000+03:00","stream":"LTS"},{"version":"2019.3.0a6","releaseDate":"2019-06-19T06:02:44.0090000+03:00","stream":"Alpha"},{"version":"2019.1.7f1","releaseDate":"2019-06-14T18:44:01.6130000+03:00","stream":"LTS"},{"version":"2019.2.0b6","releaseDate":"2019-06-12T12:40:00.7880000+03:00","stream":"Beta"},{"version":"2017.4.29f1","releaseDate":"2019-06-08T22:03:51.2520000+03:00","stream":"LTS"},{"version":"2018.4.2f1","releaseDate":"2019-06-08T21:07:32.0460000+03:00","stream":"LTS"},{"version":"2019.1.6f1","releaseDate":"2019-06-08T19:58:35.5350000+03:00","stream":"LTS"},{"version":"2019.3.0a5","releaseDate":"2019-06-06T15:22:57.5620000+03:00","stream":"Alpha"},{"version":"2019.2.0b5","releaseDate":"2019-06-05T17:32:16.2730000+03:00","stream":"Beta"},{"version":"2019.1.5f1","releaseDate":"2019-06-03T14:40:25.5010000+03:00","stream":"LTS"},{"version":"2017.4.28f1","releaseDate":"2019-05-30T20:27:14.6810000+03:00","stream":"LTS"},{"version":"2019.3.0a4","releaseDate":"2019-05-30T17:15:42.7070000+03:00","stream":"Alpha"},{"version":"2019.2.0b4","releaseDate":"2019-05-29T20:12:13.2450000+03:00","stream":"Beta"},{"version":"2018.4.1f1","releaseDate":"2019-05-28T19:24:03.8580000+03:00","stream":"LTS"},{"version":"2019.1.4f1","releaseDate":"2019-05-24T20:57:10.7780000+03:00","stream":"LTS"},{"version":"2019.2.0b3","releaseDate":"2019-05-22T17:03:19.4450000+03:00","stream":"Beta"},{"version":"2019.3.0a3","releaseDate":"2019-05-22T14:46:55.0550000+03:00","stream":"Alpha"},{"version":"2019.1.3f1","releaseDate":"2019-05-16T17:47:53.8260000+03:00","stream":"LTS"},{"version":"2019.2.0b2","releaseDate":"2019-05-15T18:44:17.7590000+03:00","stream":"Beta"},{"version":"2019.3.0a2","releaseDate":"2019-05-10T23:36:39.2540000+03:00","stream":"Alpha"},{"version":"2019.1.2f1","releaseDate":"2019-05-10T18:59:18.5200000+03:00","stream":"LTS"},{"version":"2017.4.27f1","releaseDate":"2019-05-10T16:21:41.1350000+03:00","stream":"LTS"},{"version":"2018.4.0f1","releaseDate":"2019-05-10T14:43:31.4210000+03:00","stream":"LTS"},{"version":"2019.2.0b1","releaseDate":"2019-05-09T12:44:58.3510000+03:00","stream":"Beta"},{"version":"2019.1.1f1","releaseDate":"2019-05-03T17:43:43.5970000+03:00","stream":"LTS"},{"version":"2019.2.0a14","releaseDate":"2019-05-01T20:59:12.6880000+03:00","stream":"Alpha"},{"version":"2018.3.14f1","releaseDate":"2019-04-26T14:50:27.0450000+03:00","stream":"LTS"},{"version":"2019.2.0a13","releaseDate":"2019-04-24T20:50:21.0670000+03:00","stream":"Alpha"},{"version":"2017.4.26f1","releaseDate":"2019-04-23T12:36:49.5910000+03:00","stream":"LTS"},{"version":"2018.3.13f1","releaseDate":"2019-04-18T12:14:47.6950000+03:00","stream":"LTS"},{"version":"2019.1.0f2","releaseDate":"2019-04-15T16:28:01.4440000+03:00","stream":"LTS"},{"version":"2019.2.0a11","releaseDate":"2019-04-11T19:48:43.1840000+03:00","stream":"Alpha"},{"version":"2019.1.0f1","releaseDate":"2019-04-08T21:51:36.4080000+03:00","stream":"LTS"},{"version":"2018.3.12f1","releaseDate":"2019-04-08T17:36:53.3460000+03:00","stream":"LTS"},{"version":"2017.4.25f1","releaseDate":"2019-04-08T16:39:05.1910000+03:00","stream":"LTS"},{"version":"2019.1.0b10","releaseDate":"2019-04-03T17:15:22.3850000+03:00","stream":"Beta"},{"version":"2018.3.11f1","releaseDate":"2019-03-29T14:15:27.9350000+02:00","stream":"LTS"},{"version":"2019.1.0b9","releaseDate":"2019-03-26T18:57:04.8470000+02:00","stream":"Beta"},{"version":"2018.3.10f1","releaseDate":"2019-03-25T19:27:03.0350000+02:00","stream":"LTS"},{"version":"2017.4.24f1","releaseDate":"2019-03-22T11:39:13.6670000+02:00","stream":"LTS"},{"version":"2019.2.0a9","releaseDate":"2019-03-20T17:45:22.3090000+02:00","stream":"Alpha"},{"version":"2019.1.0b8","releaseDate":"2019-03-18T19:17:39.0930000+02:00","stream":"Beta"},{"version":"2018.3.9f1","releaseDate":"2019-03-18T14:14:09.6120000+02:00","stream":"LTS"},{"version":"2019.1.0b7","releaseDate":"2019-03-13T18:10:13.3900000+02:00","stream":"Beta"},{"version":"2019.2.0a8","releaseDate":"2019-03-13T16:22:24.9240000+02:00","stream":"Alpha"},{"version":"2017.4.23f1","releaseDate":"2019-03-08T19:28:16.4670000+02:00","stream":"LTS"},{"version":"2019.1.0b6","releaseDate":"2019-03-08T18:41:08.1330000+02:00","stream":"Beta"},{"version":"2018.3.8f1","releaseDate":"2019-03-08T18:15:08.8060000+02:00","stream":"LTS"},{"version":"2019.2.0a7","releaseDate":"2019-03-04T15:52:19.7100000+02:00","stream":"Alpha"},{"version":"2019.1.0b5","releaseDate":"2019-03-01T18:44:15.4080000+02:00","stream":"Beta"},{"version":"5.6.7f1","releaseDate":"2019-02-28T20:35:23.8950000+02:00","stream":"LTS"},{"version":"2018.2.21f1","releaseDate":"2019-02-28T19:57:55.3450000+02:00","stream":"LTS"},{"version":"2017.4.22f1","releaseDate":"2019-02-28T19:01:39.7560000+02:00","stream":"LTS"},{"version":"2018.3.7f1","releaseDate":"2019-02-28T18:07:09.1890000+02:00","stream":"LTS"},{"version":"2019.2.0a6","releaseDate":"2019-02-27T09:50:11.0870000+02:00","stream":"Alpha"},{"version":"2017.4.21f1","releaseDate":"2019-02-21T17:15:49.2140000+02:00","stream":"LTS"},{"version":"2019.1.0b4","releaseDate":"2019-02-19T18:30:33.2540000+02:00","stream":"Beta"},{"version":"2018.3.6f1","releaseDate":"2019-02-15T18:45:14.6840000+02:00","stream":"LTS"},{"version":"2019.1.0b3","releaseDate":"2019-02-11T17:22:34.4640000+02:00","stream":"Beta"},{"version":"2017.4.20f2","releaseDate":"2019-02-11T12:07:10.8110000+02:00","stream":"LTS"},{"version":"2018.3.5f1","releaseDate":"2019-02-08T17:27:29.3790000+02:00","stream":"LTS"},{"version":"2019.2.0a4","releaseDate":"2019-02-06T16:46:04.4100000+02:00","stream":"Alpha"},{"version":"2019.1.0b2","releaseDate":"2019-02-04T15:55:05.8000000+02:00","stream":"Beta"},{"version":"2018.3.4f1","releaseDate":"2019-02-01T18:49:54.5170000+02:00","stream":"LTS"},{"version":"2019.1.0b1","releaseDate":"2019-01-28T17:21:41.6220000+02:00","stream":"Beta"},{"version":"2017.4.19f1","releaseDate":"2019-01-28T16:49:20.9630000+02:00","stream":"LTS"},{"version":"2018.3.3f1","releaseDate":"2019-01-25T16:37:01.8620000+02:00","stream":"LTS"},{"version":"2018.3.2f1","releaseDate":"2019-01-17T11:18:26.5460000+02:00","stream":"LTS"},{"version":"2019.1.0a14","releaseDate":"2019-01-15T20:45:50.0540000+02:00","stream":"Alpha"},{"version":"2018.3.1f1","releaseDate":"2019-01-10T14:42:52.5380000+02:00","stream":"LTS"},{"version":"2017.4.18f1","releaseDate":"2019-01-10T13:37:33.9090000+02:00","stream":"LTS"},{"version":"2019.1.0a13","releaseDate":"2019-01-03T03:39:26.4790000+02:00","stream":"Alpha"},{"version":"2019.1.0a12","releaseDate":"2018-12-14T20:20:29.2790000+02:00","stream":"Alpha"},{"version":"2018.2.20f1","releaseDate":"2018-12-14T13:15:42.9470000+02:00","stream":"LTS"},{"version":"2018.3.0f2","releaseDate":"2018-12-12T14:02:30.5550000+02:00","stream":"LTS"},{"version":"2018.3.0f1","releaseDate":"2018-12-11T17:41:14.3820000+02:00","stream":"LTS"},{"version":"2017.2.5f1","releaseDate":"2018-12-07T20:04:37.5790000+02:00","stream":"LTS"},{"version":"2018.2.19f1","releaseDate":"2018-12-07T18:44:08.5920000+02:00","stream":"LTS"},{"version":"2017.4.17f1","releaseDate":"2018-12-07T17:51:37.3080000+02:00","stream":"LTS"},{"version":"2019.1.0a11","releaseDate":"2018-12-04T22:58:06.1280000+02:00","stream":"Alpha"},{"version":"2018.2.18f1","releaseDate":"2018-11-30T17:10:33.2730000+02:00","stream":"LTS"},{"version":"2018.3.0b12","releaseDate":"2018-11-28T14:03:56.2160000+02:00","stream":"Beta"},{"version":"2019.1.0a10","releaseDate":"2018-11-23T18:56:21.7430000+02:00","stream":"Alpha"},{"version":"2017.4.16f1","releaseDate":"2018-11-23T12:14:00.4550000+02:00","stream":"LTS"},{"version":"2018.2.17f1","releaseDate":"2018-11-21T17:28:51.6180000+02:00","stream":"LTS"},{"version":"2018.3.0b11","releaseDate":"2018-11-21T15:58:06.3430000+02:00","stream":"Beta"},{"version":"2017.2.4p1","releaseDate":"2018-11-16T12:22:37.6740000+02:00","stream":"Tech"},{"version":"2018.2.16f1","releaseDate":"2018-11-15T13:01:20.6050000+02:00","stream":"LTS"},{"version":"2019.1.0a9","releaseDate":"2018-11-14T18:08:29.5040000+02:00","stream":"Alpha"},{"version":"2018.3.0b10","releaseDate":"2018-11-14T15:35:56.4560000+02:00","stream":"Beta"},{"version":"2017.4.15f1","releaseDate":"2018-11-12T16:08:59.6070000+02:00","stream":"LTS"},{"version":"2018.2.15f1","releaseDate":"2018-11-09T12:10:19.0780000+02:00","stream":"LTS"},{"version":"2018.3.0b9","releaseDate":"2018-11-07T13:26:23.7790000+02:00","stream":"Beta"},{"version":"2019.1.0a8","releaseDate":"2018-11-07T01:07:14.7810000+02:00","stream":"Alpha"},{"version":"2019.1.0a7","releaseDate":"2018-10-31T18:36:10.7410000+02:00","stream":"Alpha"},{"version":"2018.3.0b8","releaseDate":"2018-10-31T12:43:25.5420000+02:00","stream":"Beta"},{"version":"2018.2.14f1","releaseDate":"2018-10-26T18:36:58.3850000+03:00","stream":"LTS"},{"version":"2017.4.14f1","releaseDate":"2018-10-26T14:46:14.9670000+03:00","stream":"LTS"},{"version":"2018.3.0b7","releaseDate":"2018-10-24T12:18:44.7430000+03:00","stream":"Beta"},{"version":"2018.2.13f1","releaseDate":"2018-10-18T13:04:17.7440000+03:00","stream":"LTS"},{"version":"2018.3.0b6","releaseDate":"2018-10-18T10:28:58.7650000+03:00","stream":"Beta"},{"version":"2018.2.12f1","releaseDate":"2018-10-12T17:40:28.9550000+03:00","stream":"LTS"},{"version":"2017.4.13f1","releaseDate":"2018-10-12T15:12:23.4990000+03:00","stream":"LTS"},{"version":"2018.3.0b5","releaseDate":"2018-10-10T11:17:14.4800000+03:00","stream":"Beta"},{"version":"2018.2.11f1","releaseDate":"2018-10-04T13:36:18.2630000+03:00","stream":"LTS"},{"version":"2018.3.0b4","releaseDate":"2018-10-03T14:09:35.4250000+03:00","stream":"Beta"},{"version":"2017.2.4f1","releaseDate":"2018-10-03T13:10:22.6970000+03:00","stream":"LTS"},{"version":"2017.4.12f1","releaseDate":"2018-09-27T13:54:38.6660000+03:00","stream":"LTS"},{"version":"2018.2.10f1","releaseDate":"2018-09-26T17:32:56.4460000+03:00","stream":"LTS"},{"version":"2018.3.0b3","releaseDate":"2018-09-26T16:21:30.9390000+03:00","stream":"Beta"},{"version":"2018.2.9f1","releaseDate":"2018-09-21T15:47:59.5780000+03:00","stream":"LTS"},{"version":"2018.3.0b2","releaseDate":"2018-09-20T12:44:45.6210000+03:00","stream":"Beta"},{"version":"2018.2.8f1","releaseDate":"2018-09-14T13:03:11.1630000+03:00","stream":"LTS"},{"version":"2017.4.11f1","releaseDate":"2018-09-13T12:35:24.1460000+03:00","stream":"LTS"},{"version":"2018.3.0b1","releaseDate":"2018-09-11T16:07:05.2700000+03:00","stream":"Beta"},{"version":"2018.2.7f1","releaseDate":"2018-09-06T19:34:51.1710000+03:00","stream":"LTS"},{"version":"2018.2.6f1","releaseDate":"2018-08-30T14:26:23.2890000+03:00","stream":"LTS"},{"version":"2017.2.3p4","releaseDate":"2018-08-29T16:24:14.6370000+03:00","stream":"Tech"},{"version":"2018.1.9f2","releaseDate":"2018-08-29T13:25:53.0360000+03:00","stream":"LTS"},{"version":"2017.4.10f1","releaseDate":"2018-08-24T16:44:21.5260000+03:00","stream":"LTS"},{"version":"2018.2.5f1","releaseDate":"2018-08-22T18:12:22.7900000+03:00","stream":"LTS"},{"version":"2018.2.4f1","releaseDate":"2018-08-17T17:17:08.6950000+03:00","stream":"LTS"},{"version":"2018.2.3f1","releaseDate":"2018-08-10T19:45:34.0780000+03:00","stream":"LTS"},{"version":"2017.4.9f1","releaseDate":"2018-08-10T17:27:28.1310000+03:00","stream":"LTS"},{"version":"2017.2.3p3","releaseDate":"2018-08-03T17:58:35.3170000+03:00","stream":"Tech"},{"version":"2018.2.2f1","releaseDate":"2018-08-03T16:32:08.8780000+03:00","stream":"LTS"},{"version":"2017.4.8f1","releaseDate":"2018-07-26T14:30:32.4430000+03:00","stream":"LTS"},{"version":"2018.2.1f1","releaseDate":"2018-07-26T13:43:51.5190000+03:00","stream":"LTS"},{"version":"2017.1.5f1","releaseDate":"2018-07-23T19:24:20.2750000+03:00","stream":"LTS"},{"version":"2018.1.8f1","releaseDate":"2018-07-13T16:52:59.7910000+03:00","stream":"LTS"},{"version":"2017.4.7f1","releaseDate":"2018-07-13T13:22:49.0920000+03:00","stream":"LTS"},{"version":"2018.2.0f2","releaseDate":"2018-07-09T19:46:12.1340000+03:00","stream":"LTS"},{"version":"2018.2.0f1","releaseDate":"2018-07-06T18:20:59.9000000+03:00","stream":"LTS"},{"version":"2017.2.3p2","releaseDate":"2018-07-05T17:38:35.9270000+03:00","stream":"Tech"},{"version":"2018.1.7f1","releaseDate":"2018-07-05T17:17:37.5460000+03:00","stream":"LTS"},{"version":"2018.2.0b11","releaseDate":"2018-07-03T16:34:59.1560000+03:00","stream":"Beta"},{"version":"2018.2.0b10","releaseDate":"2018-06-26T16:53:45.0430000+03:00","stream":"Beta"},{"version":"2017.4.6f1","releaseDate":"2018-06-22T11:23:54.2190000+03:00","stream":"LTS"},{"version":"2018.1.6f1","releaseDate":"2018-06-21T18:02:57.3560000+03:00","stream":"LTS"},{"version":"2017.1.4p2","releaseDate":"2018-06-20T12:46:38.0700000+03:00","stream":"Tech"},{"version":"2018.2.0b9","releaseDate":"2018-06-19T16:54:09.0660000+03:00","stream":"Beta"},{"version":"2018.1.5f1","releaseDate":"2018-06-15T15:35:07.6220000+03:00","stream":"LTS"},{"version":"2018.2.0b8","releaseDate":"2018-06-13T16:54:30.1710000+03:00","stream":"Beta"},{"version":"2017.1.4p1","releaseDate":"2018-06-13T16:31:38.3930000+03:00","stream":"Tech"},{"version":"2018.1.4f1","releaseDate":"2018-06-11T17:59:27.4260000+03:00","stream":"LTS"},{"version":"2017.4.5f1","releaseDate":"2018-06-07T12:24:13.1100000+03:00","stream":"LTS"},{"version":"2018.2.0b7","releaseDate":"2018-06-06T20:13:56.2500000+03:00","stream":"Beta"},{"version":"2018.1.3f1","releaseDate":"2018-06-04T12:52:38.3090000+03:00","stream":"LTS"},{"version":"2017.2.3p1","releaseDate":"2018-05-31T13:04:31.7460000+03:00","stream":"Tech"},{"version":"2018.2.0b6","releaseDate":"2018-05-29T17:49:22.1680000+03:00","stream":"Beta"},{"version":"2018.1.2f1","releaseDate":"2018-05-25T18:39:42.9360000+03:00","stream":"LTS"},{"version":"2018.2.0b5","releaseDate":"2018-05-24T10:21:44.1020000+03:00","stream":"Beta"},{"version":"2017.1.4f1","releaseDate":"2018-05-23T18:53:36.9910000+03:00","stream":"LTS"},{"version":"2017.4.4f1","releaseDate":"2018-05-23T18:20:18.8730000+03:00","stream":"LTS"},{"version":"2017.2.3f1","releaseDate":"2018-05-18T16:26:34.7630000+03:00","stream":"LTS"},{"version":"2018.1.1f1","releaseDate":"2018-05-18T12:56:06.0720000+03:00","stream":"LTS"},{"version":"2018.2.0b4","releaseDate":"2018-05-11T22:14:37.6770000+03:00","stream":"Beta"},{"version":"2017.4.3f1","releaseDate":"2018-05-11T17:44:04.8180000+03:00","stream":"LTS"},{"version":"5.6.6f2","releaseDate":"2018-05-08T12:03:55.4790000+03:00","stream":"LTS"},{"version":"2017.1.3p4","releaseDate":"2018-05-06T13:03:23.7480000+03:00","stream":"Tech"},{"version":"2018.2.0b3","releaseDate":"2018-05-04T03:29:00.7830000+03:00","stream":"Beta"},{"version":"2018.1.0f2","releaseDate":"2018-05-02T12:32:53.1810000+03:00","stream":"LTS"},{"version":"2017.4.2f2","releaseDate":"2018-04-30T12:57:20.7740000+03:00","stream":"LTS"},{"version":"2017.2.2p4","releaseDate":"2018-04-27T11:09:34.6590000+03:00","stream":"Tech"},{"version":"2018.1.0f1","releaseDate":"2018-04-26T17:34:43.9320000+03:00","stream":"LTS"},{"version":"2018.2.0b2","releaseDate":"2018-04-25T18:46:41.7020000+03:00","stream":"Beta"},{"version":"2018.2.0b1","releaseDate":"2018-04-18T04:14:08.2100000+03:00","stream":"Beta"},{"version":"2017.4.1f1","releaseDate":"2018-04-12T15:46:45.4370000+03:00","stream":"LTS"},{"version":"5.6.5p4","releaseDate":"2018-04-12T13:47:59.7170000+03:00","stream":"Tech"},{"version":"2017.1.3p3","releaseDate":"2018-04-06T13:32:38.6350000+03:00","stream":"Tech"},{"version":"2017.2.2p3","releaseDate":"2018-04-05T13:16:10.2630000+03:00","stream":"Tech"},{"version":"2018.1.0b13","releaseDate":"2018-03-30T13:12:24.9220000+03:00","stream":"Beta"},{"version":"2017.2.2p2","releaseDate":"2018-03-23T15:33:23.0760000+02:00","stream":"Tech"},{"version":"2018.1.0b12","releaseDate":"2018-03-23T10:03:45.3420000+02:00","stream":"Beta"},{"version":"2017.4.0f1","releaseDate":"2018-03-19T13:40:15.8330000+02:00","stream":"LTS"},{"version":"2018.1.0b11","releaseDate":"2018-03-16T15:01:57.6520000+02:00","stream":"Beta"},{"version":"5.6.5p3","releaseDate":"2018-03-16T11:45:19.3630000+02:00","stream":"Tech"},{"version":"2017.3.1p4","releaseDate":"2018-03-13T13:06:06.2160000+02:00","stream":"Tech"},{"version":"2017.2.2p1","releaseDate":"2018-03-09T17:01:16.6870000+02:00","stream":"Tech"},{"version":"2018.1.0b10","releaseDate":"2018-03-08T17:30:14.4980000+02:00","stream":"Beta"},{"version":"2017.3.1p3","releaseDate":"2018-03-06T15:00:52.2380000+02:00","stream":"Tech"},{"version":"2017.1.3p2","releaseDate":"2018-03-02T13:14:31.1230000+02:00","stream":"Tech"},{"version":"2018.1.0b9","releaseDate":"2018-02-27T22:03:39.0920000+02:00","stream":"Beta"},{"version":"2017.3.1p2","releaseDate":"2018-02-26T13:20:31.2290000+02:00","stream":"Tech"},{"version":"2017.2.2f1","releaseDate":"2018-02-26T12:56:15.2980000+02:00","stream":"LTS"},{"version":"2018.1.0b8","releaseDate":"2018-02-21T01:19:54.4560000+02:00","stream":"Beta"},{"version":"5.6.5p2","releaseDate":"2018-02-15T12:54:22.5920000+02:00","stream":"Tech"},{"version":"2017.3.1p1","releaseDate":"2018-02-14T18:32:07.5630000+02:00","stream":"Tech"},{"version":"2018.1.0b7","releaseDate":"2018-02-14T13:12:33.8400000+02:00","stream":"Beta"},{"version":"2017.2.1p4","releaseDate":"2018-02-12T15:46:02.9250000+02:00","stream":"Tech"},{"version":"2018.1.0b6","releaseDate":"2018-02-08T01:26:06.8280000+02:00","stream":"Beta"},{"version":"2017.3.1f1","releaseDate":"2018-02-05T17:31:22.3830000+02:00","stream":"LTS"},{"version":"2017.1.3p1","releaseDate":"2018-02-02T18:03:25.9430000+02:00","stream":"Tech"},{"version":"2018.1.0b5","releaseDate":"2018-01-31T14:56:51.0850000+02:00","stream":"Beta"},{"version":"2017.2.1p3","releaseDate":"2018-01-30T18:14:38.4790000+02:00","stream":"Tech"},{"version":"2017.3.0p4","releaseDate":"2018-01-29T14:43:13.4400000+02:00","stream":"Tech"},{"version":"2018.1.0b4","releaseDate":"2018-01-22T21:10:28.0890000+02:00","stream":"Beta"},{"version":"5.6.5p1","releaseDate":"2018-01-22T12:15:55.2200000+02:00","stream":"Tech"},{"version":"2017.3.0p3","releaseDate":"2018-01-18T18:39:06.6310000+02:00","stream":"Tech"},{"version":"2018.1.0b3","releaseDate":"2018-01-17T14:06:15.8980000+02:00","stream":"Beta"},{"version":"2017.3.0p2","releaseDate":"2018-01-12T20:16:05.8470000+02:00","stream":"Tech"},{"version":"5.5.6f1","releaseDate":"2018-01-12T19:52:32.0940000+02:00","stream":"LTS"},{"version":"2017.2.1p2","releaseDate":"2018-01-12T12:39:16.7060000+02:00","stream":"Tech"},{"version":"2018.1.0b2","releaseDate":"2018-01-09T17:44:00.8450000+02:00","stream":"Beta"},{"version":"2017.1.3f1","releaseDate":"2018-01-04T19:14:40.6550000+02:00","stream":"LTS"},{"version":"2017.3.0p1","releaseDate":"2017-12-22T13:42:56.1700000+02:00","stream":"Tech"},{"version":"5.6.5f1","releaseDate":"2017-12-21T13:08:15.3130000+02:00","stream":"LTS"},{"version":"2017.2.1p1","releaseDate":"2017-12-20T15:53:25.0250000+02:00","stream":"Tech"},{"version":"2017.3.0f3","releaseDate":"2017-12-18T18:24:06.3520000+02:00","stream":"LTS"},{"version":"2017.2.1f1","releaseDate":"2017-12-11T17:44:05.8030000+02:00","stream":"LTS"},{"version":"2017.3.0f2","releaseDate":"2017-12-08T18:45:52.2440000+02:00","stream":"LTS"},{"version":"2017.1.2p4","releaseDate":"2017-12-08T17:51:33.8740000+02:00","stream":"Tech"},{"version":"5.6.4p4","releaseDate":"2017-12-07T14:26:50.5400000+02:00","stream":"Tech"},{"version":"2017.2.0p4","releaseDate":"2017-12-04T12:45:02.9910000+02:00","stream":"Tech"},{"version":"2017.3.0f1","releaseDate":"2017-12-01T20:31:55.9230000+02:00","stream":"LTS"},{"version":"5.5.5p2","releaseDate":"2017-11-28T18:57:54.6100000+02:00","stream":"Tech"},{"version":"2017.3.0b11","releaseDate":"2017-11-28T17:29:29.2860000+02:00","stream":"Beta"},{"version":"2017.2.0p3","releaseDate":"2017-11-27T15:27:46.2180000+02:00","stream":"Tech"},{"version":"2017.1.2p3","releaseDate":"2017-11-21T17:57:28.2100000+02:00","stream":"Tech"},{"version":"2017.3.0b10","releaseDate":"2017-11-20T17:18:14.5740000+02:00","stream":"Beta"},{"version":"5.6.4p3","releaseDate":"2017-11-20T15:49:56.7630000+02:00","stream":"Tech"},{"version":"2017.2.0p2","releaseDate":"2017-11-15T16:24:53.1850000+02:00","stream":"Tech"},{"version":"5.6.4p2","releaseDate":"2017-11-12T21:00:26.6870000+02:00","stream":"Tech"},{"version":"2017.3.0b9","releaseDate":"2017-11-10T19:33:11.8540000+02:00","stream":"Beta"},{"version":"2017.2.0p1","releaseDate":"2017-11-06T19:18:19.4960000+02:00","stream":"Tech"},{"version":"2017.3.0b8","releaseDate":"2017-11-03T17:21:00.7540000+02:00","stream":"Beta"},{"version":"2017.3.0b7","releaseDate":"2017-10-31T17:40:56.2350000+02:00","stream":"Beta"},{"version":"2017.1.2p2","releaseDate":"2017-10-27T14:03:41.0290000+03:00","stream":"Tech"},{"version":"2017.3.0b6","releaseDate":"2017-10-24T19:13:05.0440000+03:00","stream":"Beta"},{"version":"5.6.4p1","releaseDate":"2017-10-20T11:55:09.4280000+03:00","stream":"Tech"},{"version":"2017.3.0b5","releaseDate":"2017-10-17T17:14:21.2300000+03:00","stream":"Beta"},{"version":"5.6.4f1","releaseDate":"2017-10-16T00:45:41.6100000+03:00","stream":"LTS"},{"version":"5.5.5p1","releaseDate":"2017-10-13T18:41:22.6040000+03:00","stream":"Tech"},{"version":"2017.1.2p1","releaseDate":"2017-10-13T17:36:45.0300000+03:00","stream":"Tech"},{"version":"2017.2.0f3","releaseDate":"2017-10-11T20:12:25.4710000+03:00","stream":"LTS"},{"version":"2017.1.1p4","releaseDate":"2017-10-11T01:24:40.4590000+03:00","stream":"Tech"},{"version":"2017.3.0b4","releaseDate":"2017-10-10T18:09:12.8770000+03:00","stream":"Beta"},{"version":"2017.1.2f1","releaseDate":"2017-10-06T15:44:00.5700000+03:00","stream":"LTS"},{"version":"2017.3.0b3","releaseDate":"2017-10-05T17:33:00.3650000+03:00","stream":"Beta"},{"version":"5.5.5f1","releaseDate":"2017-10-03T21:12:06.1320000+03:00","stream":"LTS"},{"version":"2017.2.0f2","releaseDate":"2017-10-02T20:53:40.3960000+03:00","stream":"LTS"},{"version":"2017.3.0b2","releaseDate":"2017-09-26T17:46:30.1710000+03:00","stream":"Beta"},{"version":"2017.1.1p3","releaseDate":"2017-09-22T19:41:25.5110000+03:00","stream":"Tech"},{"version":"2017.2.0f1","releaseDate":"2017-09-22T18:33:23.3090000+03:00","stream":"LTS"},{"version":"5.6.3p4","releaseDate":"2017-09-22T16:54:29.4830000+03:00","stream":"Tech"},{"version":"2017.3.0b1","releaseDate":"2017-09-21T16:38:59.5970000+03:00","stream":"Beta"},{"version":"5.4.6f3","releaseDate":"2017-09-20T11:37:58.9140000+03:00","stream":"LTS"},{"version":"2017.1.1p2","releaseDate":"2017-09-15T13:24:31.5570000+03:00","stream":"Tech"},{"version":"5.5.4p5","releaseDate":"2017-09-14T17:25:05.9100000+03:00","stream":"Tech"},{"version":"2017.2.0b11","releaseDate":"2017-09-12T16:31:58.6150000+03:00","stream":"Beta"},{"version":"2017.1.1p1","releaseDate":"2017-09-08T19:32:50.0560000+03:00","stream":"Tech"},{"version":"5.6.3p3","releaseDate":"2017-09-08T16:29:05.0680000+03:00","stream":"Tech"},{"version":"2017.2.0b10","releaseDate":"2017-09-04T23:19:12.8220000+03:00","stream":"Beta"},{"version":"2017.1.1f1","releaseDate":"2017-09-04T14:34:13.9350000+03:00","stream":"LTS"},{"version":"5.6.3p2","releaseDate":"2017-09-01T19:44:02.7640000+03:00","stream":"Tech"},{"version":"5.5.4p4","releaseDate":"2017-08-31T20:24:23.0240000+03:00","stream":"Tech"},{"version":"2017.2.0b9","releaseDate":"2017-08-29T18:59:23.8640000+03:00","stream":"Beta"},{"version":"2017.1.0p5","releaseDate":"2017-08-25T14:26:12.4730000+03:00","stream":"Tech"},{"version":"2017.2.0b8","releaseDate":"2017-08-18T17:33:35.1850000+03:00","stream":"Beta"},{"version":"5.3.8p2","releaseDate":"2017-08-18T13:53:50.1590000+03:00","stream":"Tech"},{"version":"5.4.5p5","releaseDate":"2017-08-18T03:06:42.9010000+03:00","stream":"Tech"},{"version":"5.5.4p3","releaseDate":"2017-08-18T00:45:42.7300000+03:00","stream":"Tech"},{"version":"5.6.3p1","releaseDate":"2017-08-17T23:56:53.9060000+03:00","stream":"Tech"},{"version":"2017.1.0p4","releaseDate":"2017-08-17T10:16:35.4780000+03:00","stream":"Tech"},{"version":"2017.2.0b7","releaseDate":"2017-08-15T20:42:22.6120000+03:00","stream":"Beta"},{"version":"2017.1.0p3","releaseDate":"2017-08-11T17:09:22.9780000+03:00","stream":"Tech"},{"version":"2017.2.0b6","releaseDate":"2017-08-09T00:09:18.9660000+03:00","stream":"Beta"},{"version":"5.6.3f1","releaseDate":"2017-08-01T20:03:58.0440000+03:00","stream":"LTS"},{"version":"2017.2.0b5","releaseDate":"2017-08-01T12:24:10.5780000+03:00","stream":"Beta"},{"version":"2017.1.0p2","releaseDate":"2017-07-27T15:04:31.4330000+03:00","stream":"Tech"},{"version":"5.5.4p2","releaseDate":"2017-07-26T14:06:59.7850000+03:00","stream":"Tech"},{"version":"5.6.2p4","releaseDate":"2017-07-21T20:06:22.5790000+03:00","stream":"Tech"},{"version":"2017.1.0p1","releaseDate":"2017-07-21T19:18:52.6830000+03:00","stream":"Tech"},{"version":"2017.2.0b4","releaseDate":"2017-07-20T19:07:24.3140000+03:00","stream":"Beta"},{"version":"5.6.2p3","releaseDate":"2017-07-17T17:54:07.4300000+03:00","stream":"Tech"},{"version":"2017.2.0b3","releaseDate":"2017-07-14T16:58:24.2490000+03:00","stream":"Beta"},{"version":"2017.1.0f3","releaseDate":"2017-07-10T14:29:48.3440000+03:00","stream":"LTS"},{"version":"2017.2.0b2","releaseDate":"2017-07-06T17:42:46.1050000+03:00","stream":"Beta"},{"version":"5.6.2p2","releaseDate":"2017-07-06T15:05:04.2550000+03:00","stream":"Tech"},{"version":"2017.1.0f2","releaseDate":"2017-07-05T21:06:25.7100000+03:00","stream":"LTS"},{"version":"5.6.2p1","releaseDate":"2017-06-29T17:08:51.3150000+03:00","stream":"Tech"},{"version":"5.4.5p4","releaseDate":"2017-06-28T14:33:16.4010000+03:00","stream":"Tech"},{"version":"2017.1.0f1","releaseDate":"2017-06-26T21:35:00.1560000+03:00","stream":"LTS"},{"version":"5.5.4p1","releaseDate":"2017-06-22T17:02:21.4330000+03:00","stream":"Tech"},{"version":"5.6.2f1","releaseDate":"2017-06-21T16:10:00.3850000+03:00","stream":"LTS"},{"version":"2017.1.0b10","releaseDate":"2017-06-19T18:48:58.2720000+03:00","stream":"Beta"},{"version":"5.6.1p4","releaseDate":"2017-06-16T18:05:31.4130000+03:00","stream":"Tech"},{"version":"5.3.8f2","releaseDate":"2017-06-13T14:42:19.0780000+03:00","stream":"LTS"},{"version":"2017.1.0b9","releaseDate":"2017-06-09T22:19:53.7480000+03:00","stream":"Beta"},{"version":"5.4.5p3","releaseDate":"2017-06-09T22:08:09.9090000+03:00","stream":"Tech"},{"version":"5.6.1p3","releaseDate":"2017-06-09T20:34:47.4540000+03:00","stream":"Tech"},{"version":"5.5.4f1","releaseDate":"2017-06-06T19:31:53.0570000+03:00","stream":"LTS"},{"version":"2017.1.0b8","releaseDate":"2017-06-02T18:43:21.3940000+03:00","stream":"Beta"},{"version":"5.6.1p2","releaseDate":"2017-06-02T13:52:12.6100000+03:00","stream":"Tech"},{"version":"5.4.5p2","releaseDate":"2017-05-29T11:25:58.9590000+03:00","stream":"Tech"},{"version":"2017.1.0b7","releaseDate":"2017-05-26T19:22:45.2060000+03:00","stream":"Beta"},{"version":"5.5.3p4","releaseDate":"2017-05-24T19:03:02.5850000+03:00","stream":"Tech"},{"version":"2017.1.0b6","releaseDate":"2017-05-19T14:33:20.6370000+03:00","stream":"Beta"},{"version":"5.6.1p1","releaseDate":"2017-05-18T15:38:02.4330000+03:00","stream":"Tech"},{"version":"2017.1.0b5","releaseDate":"2017-05-11T15:55:57.6670000+03:00","stream":"Beta"},{"version":"5.6.1f1","releaseDate":"2017-05-11T13:42:26.0420000+03:00","stream":"LTS"},{"version":"5.5.3p3","releaseDate":"2017-05-10T18:53:39.6190000+03:00","stream":"Tech"},{"version":"2017.1.0b4","releaseDate":"2017-05-08T17:47:09.7280000+03:00","stream":"Beta"},{"version":"5.6.0p4","releaseDate":"2017-05-08T15:16:30.1560000+03:00","stream":"Tech"},{"version":"2017.1.0b3","releaseDate":"2017-05-03T16:29:05.2510000+03:00","stream":"Beta"},{"version":"5.6.0p3","releaseDate":"2017-04-27T22:02:39.4410000+03:00","stream":"Tech"},{"version":"2017.1.0b2","releaseDate":"2017-04-26T16:56:42.4410000+03:00","stream":"Beta"},{"version":"5.5.3p2","releaseDate":"2017-04-25T17:57:56.6830000+03:00","stream":"Tech"},{"version":"5.6.0p2","releaseDate":"2017-04-21T23:03:49.1450000+03:00","stream":"Tech"},{"version":"5.6.0p1","releaseDate":"2017-04-18T16:49:03.9820000+03:00","stream":"Tech"},{"version":"5.5.3p1","releaseDate":"2017-04-13T18:11:15.6120000+03:00","stream":"Tech"},{"version":"2017.1.0b1","releaseDate":"2017-04-11T17:05:40.0040000+03:00","stream":"Beta"},{"version":"5.6.0f3","releaseDate":"2017-03-31T18:00:22.4860000+03:00","stream":"LTS"},{"version":"5.5.3f1","releaseDate":"2017-03-31T13:51:39.1560000+03:00","stream":"LTS"},{"version":"5.4.5p1","releaseDate":"2017-03-30T17:45:22.1890000+03:00","stream":"Tech"},{"version":"5.6.0f2","releaseDate":"2017-03-27T19:28:45.6580000+03:00","stream":"LTS"},{"version":"5.5.2p4","releaseDate":"2017-03-23T12:35:50.2430000+02:00","stream":"Tech"},{"version":"5.5.2p3","releaseDate":"2017-03-17T20:58:40.1640000+02:00","stream":"Tech"},{"version":"5.6.0f1","releaseDate":"2017-03-17T18:41:48.6380000+02:00","stream":"LTS"},{"version":"5.4.5f1","releaseDate":"2017-03-10T16:21:03.7460000+02:00","stream":"LTS"},{"version":"5.6.0b11","releaseDate":"2017-03-08T19:05:35.2990000+02:00","stream":"Beta"},{"version":"5.5.2p2","releaseDate":"2017-03-08T18:29:03.3490000+02:00","stream":"Tech"},{"version":"5.5.2p1","releaseDate":"2017-03-03T14:06:12.3730000+02:00","stream":"Tech"},{"version":"5.6.0b10","releaseDate":"2017-03-02T19:57:00.6420000+02:00","stream":"Beta"},{"version":"5.4.4p4","releaseDate":"2017-03-01T13:11:30.9140000+02:00","stream":"Tech"},{"version":"5.5.2f1","releaseDate":"2017-02-24T11:54:27.4260000+02:00","stream":"LTS"},{"version":"5.5.1p4","releaseDate":"2017-02-17T18:08:36.9750000+02:00","stream":"Tech"},{"version":"5.6.0b9","releaseDate":"2017-02-17T16:41:26.8530000+02:00","stream":"Beta"},{"version":"5.6.0b8","releaseDate":"2017-02-13T17:54:50.1120000+02:00","stream":"Beta"},{"version":"5.5.1p3","releaseDate":"2017-02-09T14:22:29.2650000+02:00","stream":"Tech"},{"version":"5.4.4p3","releaseDate":"2017-02-08T19:25:47.9670000+02:00","stream":"Tech"},{"version":"5.3.7p4","releaseDate":"2017-02-07T19:01:05.9100000+02:00","stream":"Tech"},{"version":"5.6.0b7","releaseDate":"2017-02-07T17:05:04.8950000+02:00","stream":"Beta"},{"version":"5.5.1p2","releaseDate":"2017-02-03T15:27:39.9140000+02:00","stream":"Tech"},{"version":"5.6.0b6","releaseDate":"2017-02-01T17:38:41.3800000+02:00","stream":"Beta"},{"version":"5.5.1p1","releaseDate":"2017-02-01T16:22:21.4140000+02:00","stream":"Tech"},{"version":"5.6.0b5","releaseDate":"2017-01-26T11:26:16.7750000+02:00","stream":"Beta"},{"version":"5.4.4p2","releaseDate":"2017-01-25T17:10:44.2950000+02:00","stream":"Tech"},{"version":"5.5.1f1","releaseDate":"2017-01-24T12:32:21.5040000+02:00","stream":"LTS"},{"version":"5.6.0b4","releaseDate":"2017-01-17T22:17:27.6580000+02:00","stream":"Beta"},{"version":"5.4.4p1","releaseDate":"2017-01-13T18:46:40.7580000+02:00","stream":"Tech"},{"version":"5.5.0p4","releaseDate":"2017-01-11T18:18:53.9900000+02:00","stream":"Tech"},{"version":"5.4.4f1","releaseDate":"2017-01-05T17:53:15.0500000+02:00","stream":"LTS"},{"version":"5.5.0p3","releaseDate":"2017-01-05T11:04:18.8540000+02:00","stream":"Tech"},{"version":"5.6.0b3","releaseDate":"2016-12-23T19:38:00.2460000+02:00","stream":"Beta"},{"version":"5.3.7p3","releaseDate":"2016-12-21T18:13:38.5020000+02:00","stream":"Tech"},{"version":"5.6.0b2","releaseDate":"2016-12-20T15:32:52.8740000+02:00","stream":"Beta"},{"version":"5.5.0p2","releaseDate":"2016-12-16T22:23:56.1000000+02:00","stream":"Tech"},{"version":"5.4.3p4","releaseDate":"2016-12-16T15:59:43.9270000+02:00","stream":"Tech"},{"version":"5.6.0b1","releaseDate":"2016-12-13T12:35:25.7510000+02:00","stream":"Beta"},{"version":"5.4.3p3","releaseDate":"2016-12-07T18:18:47.8600000+02:00","stream":"Tech"},{"version":"5.5.0p1","releaseDate":"2016-12-07T17:25:41.5570000+02:00","stream":"Tech"},{"version":"5.4.3p2","releaseDate":"2016-12-01T15:54:47.9540000+02:00","stream":"Tech"},{"version":"5.5.0f3","releaseDate":"2016-11-30T13:49:48.4400000+02:00","stream":"LTS"},{"version":"5.3.7p2","releaseDate":"2016-11-28T18:06:22.4430000+02:00","stream":"Tech"},{"version":"5.4.3p1","releaseDate":"2016-11-28T12:09:25.4130000+02:00","stream":"Tech"},{"version":"5.5.0f2","releaseDate":"2016-11-25T12:16:50.2830000+02:00","stream":"LTS"},{"version":"5.5.0f1","releaseDate":"2016-11-22T18:14:01.1850000+02:00","stream":"LTS"},{"version":"5.4.3f1","releaseDate":"2016-11-17T14:51:02.0260000+02:00","stream":"LTS"},{"version":"5.3.7p1","releaseDate":"2016-11-11T17:32:03.0220000+02:00","stream":"Tech"},{"version":"5.5.0b11","releaseDate":"2016-11-09T20:04:57.2170000+02:00","stream":"Beta"},{"version":"5.5.0b10","releaseDate":"2016-11-09T17:40:05.1770000+02:00","stream":"Beta"},{"version":"5.4.2p4","releaseDate":"2016-11-09T14:35:14.5410000+02:00","stream":"Tech"},{"version":"5.3.7f1","releaseDate":"2016-11-08T15:22:26.8980000+02:00","stream":"LTS"},{"version":"5.4.2p3","releaseDate":"2016-11-02T17:35:46.0380000+02:00","stream":"Tech"},{"version":"5.4.2p2","releaseDate":"2016-10-28T15:33:11.6310000+03:00","stream":"Tech"},{"version":"5.4.2p1","releaseDate":"2016-10-24T18:58:28.0140000+03:00","stream":"Tech"},{"version":"5.5.0b9","releaseDate":"2016-10-24T18:06:57.1480000+03:00","stream":"Beta"},{"version":"5.3.6p8","releaseDate":"2016-10-24T17:31:38.0530000+03:00","stream":"Tech"},{"version":"5.4.2f2","releaseDate":"2016-10-21T12:41:39.1710000+03:00","stream":"LTS"},{"version":"5.5.0b8","releaseDate":"2016-10-20T16:10:07.3480000+03:00","stream":"Beta"},{"version":"5.5.0b7","releaseDate":"2016-10-11T17:19:07.1390000+03:00","stream":"Beta"},{"version":"5.3.6p7","releaseDate":"2016-10-07T15:14:33.7940000+03:00","stream":"Tech"},{"version":"5.4.1p4","releaseDate":"2016-10-05T19:04:22.6090000+03:00","stream":"Tech"},{"version":"5.5.0b6","releaseDate":"2016-10-03T19:33:15.7800000+03:00","stream":"Beta"},{"version":"5.4.1p3","releaseDate":"2016-09-28T17:50:34.1120000+03:00","stream":"Tech"},{"version":"5.5.0b5","releaseDate":"2016-09-27T11:31:35.7680000+03:00","stream":"Beta"},{"version":"5.3.6p6","releaseDate":"2016-09-23T13:03:44.0380000+03:00","stream":"Tech"},{"version":"5.4.1p2","releaseDate":"2016-09-22T21:37:12.2160000+03:00","stream":"Tech"},{"version":"5.5.0b4","releaseDate":"2016-09-19T18:28:43.2030000+03:00","stream":"Beta"},{"version":"5.3.6p5","releaseDate":"2016-09-16T10:03:24.6470000+03:00","stream":"Tech"},{"version":"5.4.1p1","releaseDate":"2016-09-15T14:18:34.2100000+03:00","stream":"Tech"},{"version":"5.5.0b3","releaseDate":"2016-09-12T16:01:26.0040000+03:00","stream":"Beta"},{"version":"5.4.1f1","releaseDate":"2016-09-07T14:02:30.4590000+03:00","stream":"LTS"},{"version":"5.5.0b2","releaseDate":"2016-09-05T17:30:09.8380000+03:00","stream":"Beta"},{"version":"5.3.6p4","releaseDate":"2016-09-02T17:39:02.8790000+03:00","stream":"Tech"},{"version":"5.4.0p4","releaseDate":"2016-08-31T18:12:19.9330000+03:00","stream":"Tech"},{"version":"5.5.0b1","releaseDate":"2016-08-30T01:26:28.1480000+03:00","stream":"Beta"},{"version":"5.4.0p3","releaseDate":"2016-08-25T19:23:33.9710000+03:00","stream":"Tech"},{"version":"5.3.6p3","releaseDate":"2016-08-23T18:52:41.7170000+03:00","stream":"Tech"},{"version":"5.4.0p2","releaseDate":"2016-08-18T18:13:53.4540000+03:00","stream":"Tech"},{"version":"5.4.0p1","releaseDate":"2016-08-11T19:41:23.0620000+03:00","stream":"Tech"},{"version":"5.3.6p2","releaseDate":"2016-08-03T16:49:58.6420000+03:00","stream":"Tech"},{"version":"5.4.0f3","releaseDate":"2016-07-27T18:33:32.0650000+03:00","stream":"LTS"},{"version":"5.3.6p1","releaseDate":"2016-07-27T16:49:40.4080000+03:00","stream":"Tech"},{"version":"5.4.0f2","releaseDate":"2016-07-21T17:37:50.4920000+03:00","stream":"LTS"},{"version":"5.3.6f1","releaseDate":"2016-07-20T12:42:16.5870000+03:00","stream":"LTS"},{"version":"5.4.0f1","releaseDate":"2016-07-14T17:14:28.9480000+03:00","stream":"LTS"},{"version":"5.3.5p8","releaseDate":"2016-07-13T15:31:43.9130000+03:00","stream":"Tech"},{"version":"5.4.0b25","releaseDate":"2016-07-11T17:27:32.5710000+03:00","stream":"Beta"},{"version":"5.3.5p7","releaseDate":"2016-07-08T12:46:28.2840000+03:00","stream":"Tech"},{"version":"5.4.0b24","releaseDate":"2016-07-01T18:47:18.2330000+03:00","stream":"Beta"},{"version":"5.3.5p6","releaseDate":"2016-06-29T19:20:44.0350000+03:00","stream":"Tech"},{"version":"5.4.0b23","releaseDate":"2016-06-28T14:35:44.6560000+03:00","stream":"Beta"},{"version":"5.4.0b22","releaseDate":"2016-06-20T12:50:01.9180000+03:00","stream":"Beta"},{"version":"5.3.5p5","releaseDate":"2016-06-20T11:56:54.1950000+03:00","stream":"Tech"},{"version":"5.3.5p4","releaseDate":"2016-06-20T11:17:44.2570000+03:00","stream":"Tech"},{"version":"5.3.5p3","releaseDate":"2016-06-10T12:28:48.9900000+03:00","stream":"Tech"},{"version":"5.4.0b21","releaseDate":"2016-06-09T13:10:18.5030000+03:00","stream":"Beta"},{"version":"5.1.5f1","releaseDate":"2016-06-06T14:04:12.1990000+03:00","stream":"LTS"},{"version":"5.3.5p2","releaseDate":"2016-06-03T17:52:11.1590000+03:00","stream":"Tech"},{"version":"5.4.0b20","releaseDate":"2016-06-03T16:53:41.3450000+03:00","stream":"Beta"},{"version":"5.2.5f1","releaseDate":"2016-06-01T14:51:51.5940000+03:00","stream":"LTS"},{"version":"5.3.5p1","releaseDate":"2016-05-31T10:40:56.6820000+03:00","stream":"Tech"},{"version":"5.4.0b19","releaseDate":"2016-05-25T12:23:12.8120000+03:00","stream":"Beta"},{"version":"5.4.0b18","releaseDate":"2016-05-19T18:44:13.0190000+03:00","stream":"Beta"},{"version":"5.3.5f1","releaseDate":"2016-05-19T18:29:29.7780000+03:00","stream":"LTS"},{"version":"5.3.4p6","releaseDate":"2016-05-06T18:28:15.3400000+03:00","stream":"Tech"},{"version":"5.4.0b17","releaseDate":"2016-05-04T01:24:49.7340000+03:00","stream":"Beta"},{"version":"5.3.4p5","releaseDate":"2016-04-27T18:20:06.9680000+03:00","stream":"Tech"},{"version":"5.4.0b16","releaseDate":"2016-04-27T14:25:25.9450000+03:00","stream":"Beta"},{"version":"5.3.4p4","releaseDate":"2016-04-20T13:50:41.9420000+03:00","stream":"Tech"},{"version":"5.4.0b15","releaseDate":"2016-04-18T13:10:26.2100000+03:00","stream":"Beta"},{"version":"5.3.4p3","releaseDate":"2016-04-13T13:24:45.5350000+03:00","stream":"Tech"},{"version":"5.4.0b14","releaseDate":"2016-04-11T14:55:25.2850000+03:00","stream":"Beta"},{"version":"5.3.4p2","releaseDate":"2016-04-08T16:41:06.6810000+03:00","stream":"Tech"},{"version":"5.4.0b13","releaseDate":"2016-04-04T12:27:37.0640000+03:00","stream":"Beta"},{"version":"5.4.0b12","releaseDate":"2016-03-29T19:39:18.7120000+03:00","stream":"Beta"},{"version":"5.3.4p1","releaseDate":"2016-03-24T00:30:26.0740000+02:00","stream":"Tech"},{"version":"5.4.0b11","releaseDate":"2016-03-21T13:52:03.7650000+02:00","stream":"Beta"},{"version":"5.4.0b10","releaseDate":"2016-03-15T15:45:23.9730000+02:00","stream":"Beta"},{"version":"5.3.4f1","releaseDate":"2016-03-15T15:33:58.4510000+02:00","stream":"LTS"},{"version":"5.3.3p3","releaseDate":"2016-03-14T19:48:02.2170000+02:00","stream":"Tech"},{"version":"5.4.0b9","releaseDate":"2016-03-08T12:03:52.2650000+02:00","stream":"Beta"},{"version":"5.3.3p2","releaseDate":"2016-03-04T18:05:49.8740000+02:00","stream":"Tech"},{"version":"5.4.0b8","releaseDate":"2016-03-02T14:14:56.5970000+02:00","stream":"Beta"},{"version":"5.3.3p1","releaseDate":"2016-02-24T18:53:39.5190000+02:00","stream":"Tech"},{"version":"5.3.3f1","releaseDate":"2016-02-23T14:53:03.4530000+02:00","stream":"LTS"},{"version":"5.4.0b7","releaseDate":"2016-02-22T16:29:51.4670000+02:00","stream":"Beta"},{"version":"5.3.2p4","releaseDate":"2016-02-20T21:48:43.6160000+02:00","stream":"Tech"},{"version":"5.4.0b6","releaseDate":"2016-02-15T18:11:52.0550000+02:00","stream":"Beta"},{"version":"5.3.2p3","releaseDate":"2016-02-12T11:22:27.9230000+02:00","stream":"Tech"},{"version":"5.4.0b5","releaseDate":"2016-02-09T18:00:54.0100000+02:00","stream":"Beta"},{"version":"5.3.2p2","releaseDate":"2016-02-03T20:16:50.7640000+02:00","stream":"Tech"},{"version":"5.4.0b4","releaseDate":"2016-01-30T16:05:07.6350000+02:00","stream":"Beta"},{"version":"5.3.2p1","releaseDate":"2016-01-28T18:05:44.7130000+02:00","stream":"Tech"},{"version":"5.3.2f1","releaseDate":"2016-01-27T17:27:25.9430000+02:00","stream":"LTS"},{"version":"5.3.1p4","releaseDate":"2016-01-23T14:12:30.0740000+02:00","stream":"Tech"},{"version":"5.4.0b3","releaseDate":"2016-01-22T19:00:02.9810000+02:00","stream":"Beta"},{"version":"5.4.0b2","releaseDate":"2016-01-15T13:09:43.6900000+02:00","stream":"Beta"},{"version":"5.3.1p3","releaseDate":"2016-01-14T19:48:48.7310000+02:00","stream":"Tech"},{"version":"5.4.0b1","releaseDate":"2016-01-13T00:10:16.2620000+02:00","stream":"Beta"},{"version":"5.3.1p2","releaseDate":"2016-01-08T14:16:04.4350000+02:00","stream":"Tech"},{"version":"5.3.1p1","releaseDate":"2016-01-08T14:10:16.3210000+02:00","stream":"Tech"},{"version":"5.3.1f1","releaseDate":"2015-12-18T16:23:10.2740000+02:00","stream":"LTS"},{"version":"5.2.4f1","releaseDate":"2015-12-15T18:37:45.1050000+02:00","stream":"LTS"},{"version":"5.2.3p3","releaseDate":"2015-12-10T12:23:24.9490000+02:00","stream":"Tech"},{"version":"5.3.0f4","releaseDate":"2015-12-08T00:12:35.0350000+02:00","stream":"LTS"},{"version":"5.2.3p2","releaseDate":"2015-12-03T14:16:45.5710000+02:00","stream":"Tech"},{"version":"5.2.3p1","releaseDate":"2015-11-27T17:42:46.6020000+02:00","stream":"Tech"},{"version":"5.3.0f2","releaseDate":"2015-11-23T17:08:26.3310000+02:00","stream":"LTS"},{"version":"5.2.3f1","releaseDate":"2015-11-19T12:38:36.6940000+02:00","stream":"LTS"},{"version":"5.2.2p4","releaseDate":"2015-11-18T13:12:41.1430000+02:00","stream":"Tech"},{"version":"5.3.0f1","releaseDate":"2015-11-14T17:28:15.8630000+02:00","stream":"LTS"},{"version":"5.2.2p3","releaseDate":"2015-11-10T18:44:28.0350000+02:00","stream":"Tech"},{"version":"5.3.0b6","releaseDate":"2015-11-09T17:44:01.7640000+02:00","stream":"Beta"},{"version":"5.3.0b5","releaseDate":"2015-11-02T19:19:46.6150000+02:00","stream":"Beta"},{"version":"5.2.2p2","releaseDate":"2015-10-30T18:26:48.9590000+02:00","stream":"Tech"},{"version":"5.2.2p1","releaseDate":"2015-10-24T20:00:34.5130000+03:00","stream":"Tech"},{"version":"5.3.0b4","releaseDate":"2015-10-23T15:11:59.0160000+03:00","stream":"Beta"},{"version":"5.2.2f1","releaseDate":"2015-10-21T16:11:59.7920000+03:00","stream":"LTS"},{"version":"5.3.0b3","releaseDate":"2015-10-16T23:48:22.9780000+03:00","stream":"Beta"},{"version":"5.2.1p4","releaseDate":"2015-10-15T09:00:51.3200000+03:00","stream":"Tech"},{"version":"5.3.0b2","releaseDate":"2015-10-10T16:11:44.6410000+03:00","stream":"Beta"},{"version":"5.2.1p3","releaseDate":"2015-10-09T17:49:17.0510000+03:00","stream":"Tech"},{"version":"5.1.4f1","releaseDate":"2015-10-06T11:17:42.7590000+03:00","stream":"LTS"},{"version":"5.3.0b1","releaseDate":"2015-10-02T22:38:07.8510000+03:00","stream":"Beta"},{"version":"5.2.1p2","releaseDate":"2015-10-01T16:15:11.2250000+03:00","stream":"Tech"},{"version":"5.2.1p1","releaseDate":"2015-09-25T16:13:16.8560000+03:00","stream":"Tech"},{"version":"5.2.1f1","releaseDate":"2015-09-22T15:24:32.4680000+03:00","stream":"LTS"},{"version":"5.2.0p1","releaseDate":"2015-09-18T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.1.3p3","releaseDate":"2015-09-11T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.1.3p2","releaseDate":"2015-09-04T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.2.0f3","releaseDate":"2015-09-03T12:33:57.1480000+03:00","stream":"LTS"},{"version":"5.1.3p1","releaseDate":"2015-08-27T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.1.3f1","releaseDate":"2015-08-24T12:50:04.1790000+03:00","stream":"LTS"},{"version":"5.2.0f2","releaseDate":"2015-08-21T18:46:49.9960000+03:00","stream":"LTS"},{"version":"5.2.0f1","releaseDate":"2015-08-16T18:50:39.4690000+03:00","stream":"LTS"},{"version":"5.2.0b6","releaseDate":"2015-08-07T22:27:28.2000000+03:00","stream":"Beta"},{"version":"5.1.2p3","releaseDate":"2015-08-06T18:11:03.9900000+03:00","stream":"Tech"},{"version":"5.2.0b5","releaseDate":"2015-07-31T13:58:16.6300000+03:00","stream":"Beta"},{"version":"5.1.2p2","releaseDate":"2015-07-30T19:04:41.2110000+03:00","stream":"Tech"},{"version":"5.2.0b4","releaseDate":"2015-07-23T18:55:44.2700000+03:00","stream":"Beta"},{"version":"5.1.2p1","releaseDate":"2015-07-23T18:20:51.9840000+03:00","stream":"Tech"},{"version":"5.2.0b3","releaseDate":"2015-07-17T22:58:20.5700000+03:00","stream":"Beta"},{"version":"5.1.2f1","releaseDate":"2015-07-16T11:54:11.0960000+03:00","stream":"LTS"},{"version":"5.2.0b2","releaseDate":"2015-07-10T21:37:49.5390000+03:00","stream":"Beta"},{"version":"5.1.1p4","releaseDate":"2015-07-10T12:08:40.1750000+03:00","stream":"Tech"},{"version":"5.0.4f1","releaseDate":"2015-07-06T15:10:34.2300000+03:00","stream":"LTS"},{"version":"5.1.1p3","releaseDate":"2015-07-03T19:18:12.6150000+03:00","stream":"Tech"},{"version":"5.2.0b1","releaseDate":"2015-07-01T19:26:20.9210000+03:00","stream":"Beta"},{"version":"5.1.1p2","releaseDate":"2015-06-26T00:27:14.0670000+03:00","stream":"Tech"},{"version":"5.0.3p3","releaseDate":"2015-06-24T18:55:13.6440000+03:00","stream":"Tech"},{"version":"5.1.1p1","releaseDate":"2015-06-23T18:05:55.5660000+03:00","stream":"Tech"},{"version":"5.1.1f1","releaseDate":"2015-06-18T13:20:02.2470000+03:00","stream":"LTS"},{"version":"5.0.3p2","releaseDate":"2015-06-18T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.1.0p1","releaseDate":"2015-06-12T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.3p1","releaseDate":"2015-06-11T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.3f2","releaseDate":"2015-06-09T18:36:46.8690000+03:00","stream":"LTS"},{"version":"5.1.0f3","releaseDate":"2015-06-04T00:31:28.2170000+03:00","stream":"LTS"},{"version":"5.0.2p4","releaseDate":"2015-06-03T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.2p3","releaseDate":"2015-05-28T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.2p2","releaseDate":"2015-05-20T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.2p1","releaseDate":"2015-05-15T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.2f1","releaseDate":"2015-05-13T17:05:42.7910000+03:00","stream":"LTS"},{"version":"5.0.1p4","releaseDate":"2015-05-08T13:25:56.9760000+03:00","stream":"Tech"},{"version":"5.0.1p3","releaseDate":"2015-04-29T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.1p2","releaseDate":"2015-04-24T17:14:44.9700000+03:00","stream":"Tech"},{"version":"5.0.1p1","releaseDate":"2015-04-16T11:21:07.0000000+03:00","stream":"Tech"},{"version":"5.0.1f1","releaseDate":"2015-03-31T19:55:08.3760000+03:00","stream":"LTS"},{"version":"5.0.0p3","releaseDate":"2015-03-26T14:03:56.0680000+02:00","stream":"Tech"},{"version":"5.0.0p2","releaseDate":"2015-03-20T18:38:49.5150000+02:00","stream":"Tech"},{"version":"5.0.0p1","releaseDate":"2015-03-16T17:20:13.6040000+02:00","stream":"Tech"},{"version":"5.0.0f4","releaseDate":"2015-02-25T17:49:05.8350000+02:00","stream":"LTS"}] \ No newline at end of file +[{"version":"6000.5.0b8","releaseDate":"2026-05-14T15:39:34.7510000+03:00","stream":"Tech"},{"version":"6000.6.0a5","releaseDate":"2026-05-13T17:25:34.1410000+03:00","stream":"Tech"},{"version":"6000.4.7f1","releaseDate":"2026-05-13T17:24:18.1390000+03:00","stream":"Tech"},{"version":"6000.0.75f1","releaseDate":"2026-05-13T17:51:23.6980000+03:00","stream":"Tech"},{"version":"6000.3.15f1","releaseDate":"2026-05-08T08:39:58.4930000+03:00","stream":"Tech"},{"version":"6000.5.0b7","releaseDate":"2026-05-07T17:14:10.6130000+03:00","stream":"Tech"},{"version":"6000.4.6f1","releaseDate":"2026-05-05T22:06:48.6370000+03:00","stream":"Tech"},{"version":"6000.5.0b6","releaseDate":"2026-04-30T13:10:20.3860000+03:00","stream":"Tech"},{"version":"6000.0.74f1","releaseDate":"2026-04-29T13:05:57.6210000+03:00","stream":"Tech"},{"version":"6000.4.5f1","releaseDate":"2026-04-28T19:38:39.7340000+03:00","stream":"Tech"},{"version":"6000.5.0b5","releaseDate":"2026-04-23T14:17:03.0940000+03:00","stream":"Tech"},{"version":"6000.4.4f1","releaseDate":"2026-04-22T20:33:26.0390000+03:00","stream":"Tech"},{"version":"6000.3.14f1","releaseDate":"2026-04-22T15:21:09.8230000+03:00","stream":"Tech"},{"version":"6000.5.0b4","releaseDate":"2026-04-16T09:32:17.8570000+03:00","stream":"Tech"},{"version":"6000.6.0a3","releaseDate":"2026-04-15T16:42:23.9000000+03:00","stream":"Tech"},{"version":"6000.4.3f1","releaseDate":"2026-04-15T14:05:46.3300000+03:00","stream":"Tech"},{"version":"6000.0.73f1","releaseDate":"2026-04-15T11:22:53.0260000+03:00","stream":"Tech"},{"version":"6000.4.2f1","releaseDate":"2026-04-09T19:40:36.0250000+03:00","stream":"Tech"},{"version":"6000.5.0b3","releaseDate":"2026-04-09T12:53:13.0050000+03:00","stream":"Tech"},{"version":"6000.3.13f1","releaseDate":"2026-04-08T12:59:17.4520000+03:00","stream":"Tech"},{"version":"6000.6.0a2","releaseDate":"2026-04-02T16:34:26.4310000+03:00","stream":"Tech"},{"version":"6000.5.0b2","releaseDate":"2026-04-02T11:36:24.3840000+03:00","stream":"Tech"},{"version":"6000.0.72f1","releaseDate":"2026-04-01T12:38:47.0550000+03:00","stream":"Tech"},{"version":"6000.4.1f1","releaseDate":"2026-03-18T20:39:00.8960000+02:00","stream":"Tech"},{"version":"6000.5.0b1","releaseDate":"2026-03-26T12:10:36.0990000+02:00","stream":"Tech"},{"version":"6000.3.12f1","releaseDate":"2026-03-25T13:55:21.4130000+02:00","stream":"Tech"},{"version":"6000.5.0a9","releaseDate":"2026-03-19T12:10:12.0660000+02:00","stream":"Tech"},{"version":"6000.4.0f1","releaseDate":"2026-03-18T20:43:57.5310000+02:00","stream":"Tech"},{"version":"6000.0.71f1","releaseDate":"2026-03-18T09:40:01.2100000+02:00","stream":"Tech"},{"version":"6000.3.11f1","releaseDate":"2026-03-11T16:52:35.7710000+02:00","stream":"Tech"},{"version":"6000.0.70f1","releaseDate":"2026-03-10T11:16:20.8440000+02:00","stream":"Tech"},{"version":"6000.4.0b11","releaseDate":"2026-03-04T04:30:38.3620000+02:00","stream":"Tech"},{"version":"6000.5.0a8","releaseDate":"2026-03-05T12:01:52.5860000+02:00","stream":"Tech"},{"version":"6000.0.69f1","releaseDate":"2026-03-04T11:50:56.2280000+02:00","stream":"Tech"},{"version":"6000.4.0b10","releaseDate":"2026-02-25T20:07:42.7910000+02:00","stream":"Tech"},{"version":"6000.3.10f1","releaseDate":"2026-02-25T16:01:36.9330000+02:00","stream":"Tech"},{"version":"6000.4.0b8","releaseDate":"2026-02-19T22:56:42.2560000+02:00","stream":"Tech"},{"version":"6000.4.0b9","releaseDate":"2026-02-19T20:25:29.3970000+02:00","stream":"Tech"},{"version":"6000.5.0a7","releaseDate":"2026-02-19T12:32:55.5120000+02:00","stream":"Tech"},{"version":"6000.0.68f1","releaseDate":"2026-02-18T16:49:24.6650000+02:00","stream":"Tech"},{"version":"6000.3.9f1","releaseDate":"2026-02-18T13:29:51.8010000+02:00","stream":"Tech"},{"version":"6000.3.8f1","releaseDate":"2026-02-11T12:40:25.7840000+02:00","stream":"Tech"},{"version":"6000.5.0a6","releaseDate":"2026-02-04T18:26:46.3460000+02:00","stream":"Tech"},{"version":"6000.3.7f1","releaseDate":"2026-02-05T09:53:48.4870000+02:00","stream":"Tech"},{"version":"6000.0.67f1","releaseDate":"2026-02-04T13:53:51.0940000+02:00","stream":"Tech"},{"version":"6000.4.0b7","releaseDate":"2026-02-03T21:49:13.9010000+02:00","stream":"Tech"},{"version":"6000.3.6f1","releaseDate":"2026-01-29T12:44:38.7000000+02:00","stream":"Tech"},{"version":"6000.4.0b6","releaseDate":"2026-01-27T19:40:09.1180000+02:00","stream":"Tech"},{"version":"6000.0.66f2","releaseDate":"2026-01-26T16:47:46.0650000+02:00","stream":"Tech"},{"version":"6000.3.5f2","releaseDate":"2026-01-26T16:40:28.1430000+02:00","stream":"Tech"},{"version":"6000.5.0a5","releaseDate":"2026-01-22T12:38:59.9750000+02:00","stream":"Tech"},{"version":"6000.0.66f1","releaseDate":"2026-01-21T18:47:35.7870000+02:00","stream":"Tech"},{"version":"6000.3.5f1","releaseDate":"2026-01-21T11:47:57.8450000+02:00","stream":"Tech"},{"version":"6000.4.0b5","releaseDate":"2026-01-15T22:51:28.6186105+02:00","stream":"Beta"},{"version":"6000.3.4f1","releaseDate":"2026-01-14T14:54:12.1540000+02:00","stream":"Tech"},{"version":"6000.4.0b4","releaseDate":"2026-01-09T23:27:01.0380215+02:00","stream":"Beta"},{"version":"6000.5.0a4","releaseDate":"2026-01-08T11:11:41.8800000+02:00","stream":"Tech"},{"version":"6000.3.3f1","releaseDate":"2026-01-08T09:54:44.9680000+02:00","stream":"Tech"},{"version":"6000.4.0b3","releaseDate":"2026-01-07T23:47:44.7500000+02:00","stream":"Tech"},{"version":"6000.0.65f1","releaseDate":"2026-01-07T10:41:15.3920000+02:00","stream":"Tech"},{"version":"6000.5.0a3","releaseDate":"2025-12-16T06:44:25.8440000+02:00","stream":"Tech"},{"version":"6000.4.0b2","releaseDate":"2025-12-17T02:22:00.9030000+02:00","stream":"Tech"},{"version":"6000.3.2f1","releaseDate":"2025-12-17T00:09:49.3130000+02:00","stream":"Tech"},{"version":"6000.4.0b1","releaseDate":"2025-12-11T13:25:29.5920000+02:00","stream":"Tech"},{"version":"6000.0.64f1","releaseDate":"2025-12-10T11:19:20.6760000+02:00","stream":"Tech"},{"version":"6000.3.1f1","releaseDate":"2025-12-09T19:55:30.3660000+02:00","stream":"Tech"},{"version":"6000.3.0f1","releaseDate":"2025-12-03T18:52:53.2470000+02:00","stream":"Tech"},{"version":"6000.2.15f1","releaseDate":"2025-12-03T13:49:37.6290000+02:00","stream":"Tech"},{"version":"6000.0.63f1","releaseDate":"2025-11-28T08:25:46.3120000+02:00","stream":"Tech"},{"version":"6000.2.14f1","releaseDate":"2025-11-26T16:26:46.7190000+02:00","stream":"Tech"},{"version":"6000.2.13f1","releaseDate":"2025-11-19T15:11:47.7500000+02:00","stream":"Tech"},{"version":"6000.3.0b10","releaseDate":"2025-11-12T07:27:36.1380000+02:00","stream":"Tech"},{"version":"6000.4.0a5","releaseDate":"2025-11-12T22:12:35.8588381+02:00","stream":"Alpha"},{"version":"6000.2.12f1","releaseDate":"2025-11-12T16:28:37.9120000+02:00","stream":"Tech"},{"version":"6000.3.0b9","releaseDate":"2025-11-06T17:16:36.1760000+02:00","stream":"Tech"},{"version":"6000.2.11f1","releaseDate":"2025-11-05T13:01:47.1570000+02:00","stream":"Tech"},{"version":"6000.4.0a4","releaseDate":"2025-11-05T17:12:05.4680000+02:00","stream":"Tech"},{"version":"6000.0.62f1","releaseDate":"2025-11-05T10:33:28.1580000+02:00","stream":"Tech"},{"version":"6000.0.61f1","releaseDate":"2025-10-30T08:44:03.1510000+02:00","stream":"Tech"},{"version":"6000.2.10f1","releaseDate":"2025-10-29T11:40:31.0020000+02:00","stream":"Tech"},{"version":"2022.3.62f3","releaseDate":"2025-10-28T12:40:42.8600000+02:00","stream":"Tech"},{"version":"6000.3.0b7","releaseDate":"2025-10-22T18:22:20.7580000+03:00","stream":"Tech"},{"version":"6000.3.0b8","releaseDate":"2025-10-23T18:22:23.0845430+03:00","stream":"Beta"},{"version":"6000.2.9f1","releaseDate":"2025-10-22T16:53:40.3120000+03:00","stream":"Tech"},{"version":"6000.0.60f1","releaseDate":"2025-10-16T12:20:46.6530000+03:00","stream":"Tech"},{"version":"6000.4.0a2","releaseDate":"2025-10-16T12:11:25.3990000+03:00","stream":"Tech"},{"version":"2019.4.41f2","releaseDate":"2025-10-15T16:26:35.7050000+03:00","stream":"Tech"},{"version":"6000.2.8f1","releaseDate":"2025-10-15T11:31:36.2450000+03:00","stream":"Tech"},{"version":"6000.3.0b6","releaseDate":"2025-10-09T23:59:53.2387953+03:00","stream":"Beta"},{"version":"6000.3.0b5","releaseDate":"2025-10-09T18:33:40.7540000+03:00","stream":"Tech"},{"version":"6000.2.7f2","releaseDate":"2025-10-08T12:37:04.9950000+03:00","stream":"Tech"},{"version":"6000.0.59f2","releaseDate":"2025-10-08T12:29:47.7630000+03:00","stream":"Tech"},{"version":"6000.1.17f1","releaseDate":"2025-10-03T07:54:02.0830000+03:00","stream":"Tech"},{"version":"2019.1.15f1","releaseDate":"2025-10-03T07:17:50.8610000+03:00","stream":"Tech"},{"version":"2019.2.23f1","releaseDate":"2025-10-03T07:17:32.1480000+03:00","stream":"Tech"},{"version":"2019.3.17f1","releaseDate":"2025-10-03T07:17:11.9430000+03:00","stream":"Tech"},{"version":"2019.4.41f1","releaseDate":"2025-10-03T07:16:52.7010000+03:00","stream":"Tech"},{"version":"2020.1.18f1","releaseDate":"2025-10-03T07:16:32.0710000+03:00","stream":"Tech"},{"version":"2020.2.8f1","releaseDate":"2025-10-03T07:16:16.5430000+03:00","stream":"Tech"},{"version":"2020.3.49f1","releaseDate":"2025-10-03T07:15:57.2050000+03:00","stream":"Tech"},{"version":"2021.1.29f1","releaseDate":"2025-10-03T07:15:36.7810000+03:00","stream":"Tech"},{"version":"2021.2.20f1","releaseDate":"2025-10-03T07:15:18.8740000+03:00","stream":"Tech"},{"version":"2021.3.45f2","releaseDate":"2025-10-03T07:14:55.9440000+03:00","stream":"Tech"},{"version":"2022.1.25f1","releaseDate":"2025-10-03T07:14:10.0200000+03:00","stream":"Tech"},{"version":"2022.2.23f1","releaseDate":"2025-10-03T07:13:47.6470000+03:00","stream":"Tech"},{"version":"2022.3.62f2","releaseDate":"2025-10-03T07:13:21.9340000+03:00","stream":"Tech"},{"version":"2023.1.22f1","releaseDate":"2025-10-03T07:12:29.6750000+03:00","stream":"Tech"},{"version":"2023.2.22f1","releaseDate":"2025-10-03T07:12:10.1900000+03:00","stream":"Tech"},{"version":"6000.0.58f2","releaseDate":"2025-10-03T07:11:47.3060000+03:00","stream":"Tech"},{"version":"6000.2.6f2","releaseDate":"2025-10-03T07:11:06.2630000+03:00","stream":"Tech"},{"version":"6000.3.0b3","releaseDate":"2025-09-30T21:20:55.2365253+03:00","stream":"Beta"},{"version":"6000.3.0b4","releaseDate":"2025-09-30T21:20:55.2365253+03:00","stream":"Beta"},{"version":"6000.3.0b3","releaseDate":"2025-09-25T12:32:28.8700000+03:00","stream":"Tech"},{"version":"6000.2.6f1","releaseDate":"2025-09-25T12:31:26.1340000+03:00","stream":"Tech"},{"version":"6000.3.0b2","releaseDate":"2025-09-17T14:13:50.6420000+03:00","stream":"Tech"},{"version":"6000.2.5f1","releaseDate":"2025-09-17T08:28:37.0430000+03:00","stream":"Tech"},{"version":"6000.0.58f1","releaseDate":"2025-09-17T08:27:16.4870000+03:00","stream":"Tech"},{"version":"6000.2.4f1","releaseDate":"2025-09-12T12:50:41.4540000+03:00","stream":"Tech"},{"version":"6000.3.0b1","releaseDate":"2025-09-09T19:50:04.5110000+03:00","stream":"Tech"},{"version":"6000.2.3f1","releaseDate":"2025-09-04T18:48:31.8630000+03:00","stream":"Tech"},{"version":"6000.0.57f1","releaseDate":"2025-09-03T12:18:47.7990000+03:00","stream":"Tech"},{"version":"6000.2.2f1","releaseDate":"2025-08-26T23:57:12.7490000+03:00","stream":"Tech"},{"version":"6000.3.0a5","releaseDate":"2025-08-21T12:46:22.7360000+03:00","stream":"Tech"},{"version":"6000.2.1f1","releaseDate":"2025-08-20T21:26:03.3440000+03:00","stream":"Tech"},{"version":"6000.0.56f1","releaseDate":"2025-08-20T10:31:57.0100000+03:00","stream":"Tech"},{"version":"6000.1.16f1","releaseDate":"2025-08-13T13:01:50.9500000+03:00","stream":"Tech"},{"version":"6000.2.0f1","releaseDate":"2025-08-12T21:26:22.1900000+03:00","stream":"Tech"},{"version":"6000.2.0b13","releaseDate":"2025-08-08T01:59:59.6800000+03:00","stream":"Tech"},{"version":"6000.1.15f1","releaseDate":"2025-08-05T17:09:59.1050000+03:00","stream":"Tech"},{"version":"6000.0.55f1","releaseDate":"2025-08-05T16:33:24.7270000+03:00","stream":"Tech"},{"version":"6000.1.14f1","releaseDate":"2025-07-30T11:28:59.4950000+03:00","stream":"Tech"},{"version":"6000.2.0b12","releaseDate":"2025-07-29T20:28:17.2950000+03:00","stream":"Tech"},{"version":"6000.2.0b11","releaseDate":"2025-07-24T18:28:42.3790000+03:00","stream":"Tech"},{"version":"6000.3.0a3","releaseDate":"2025-07-23T18:26:41.8870000+03:00","stream":"Tech"},{"version":"6000.0.54f1","releaseDate":"2025-07-23T14:28:35.7140000+03:00","stream":"Tech"},{"version":"6000.1.13f1","releaseDate":"2025-07-23T09:54:37.0260000+03:00","stream":"Tech"},{"version":"6000.3.0a2","releaseDate":"2025-07-17T13:48:27.7620000+03:00","stream":"Tech"},{"version":"6000.2.0b10","releaseDate":"2025-07-16T16:54:47.1060000+03:00","stream":"Tech"},{"version":"6000.1.12f1","releaseDate":"2025-07-15T17:19:15.7530000+03:00","stream":"Tech"},{"version":"6000.2.0b9","releaseDate":"2025-07-09T19:49:32.8200000+03:00","stream":"Tech"},{"version":"6000.1.11f1","releaseDate":"2025-07-09T13:28:05.7180000+03:00","stream":"Tech"},{"version":"6000.0.53f1","releaseDate":"2025-07-09T09:34:27.5310000+03:00","stream":"Tech"},{"version":"6000.1.10f1","releaseDate":"2025-07-02T20:01:29.6990000+03:00","stream":"Tech"},{"version":"6000.2.0b8","releaseDate":"2025-07-02T19:48:35.9940000+03:00","stream":"Tech"},{"version":"6000.0.52f1","releaseDate":"2025-07-02T08:11:11.7010000+03:00","stream":"Tech"},{"version":"6000.2.0b7","releaseDate":"2025-06-24T18:49:01.1870000+03:00","stream":"Tech"},{"version":"6000.1.9f1","releaseDate":"2025-06-24T16:56:32.8380000+03:00","stream":"Tech"},{"version":"6000.1.8f1","releaseDate":"2025-06-18T08:09:52.6810000+03:00","stream":"Tech"},{"version":"6000.2.0b6","releaseDate":"2025-06-14T00:10:42.6505176+03:00","stream":"Beta"},{"version":"6000.1.7f1","releaseDate":"2025-06-11T16:28:11.0210000+03:00","stream":"Tech"},{"version":"6000.0.51f1","releaseDate":"2025-06-11T12:43:13.5700000+03:00","stream":"Tech"},{"version":"6000.2.0b5","releaseDate":"2025-06-05T21:43:56.6458275+03:00","stream":"Beta"},{"version":"6000.1.6f1","releaseDate":"2025-06-05T12:52:49.5640000+03:00","stream":"Tech"},{"version":"6000.2.0b4","releaseDate":"2025-06-04T08:33:17.6990000+03:00","stream":"Tech"},{"version":"6000.0.50f1","releaseDate":"2025-05-28T18:00:23.5230000+03:00","stream":"Tech"},{"version":"6000.1.5f1","releaseDate":"2025-05-28T17:09:19.2710000+03:00","stream":"Tech"},{"version":"6000.2.0b3","releaseDate":"2025-05-23T10:48:51.3054783+03:00","stream":"Beta"},{"version":"6000.1.4f1","releaseDate":"2025-05-21T12:38:18.0710000+03:00","stream":"Tech"},{"version":"6000.2.0b2","releaseDate":"2025-05-20T17:11:12.0840000+03:00","stream":"Tech"},{"version":"6000.2.0b1","releaseDate":"2025-05-15T12:05:37.2680000+03:00","stream":"Tech"},{"version":"6000.0.49f1","releaseDate":"2025-05-14T06:30:14.3260000+03:00","stream":"Tech"},{"version":"6000.1.3f1","releaseDate":"2025-05-14T06:29:42.5580000+03:00","stream":"Tech"},{"version":"2022.3.62f1","releaseDate":"2025-05-07T09:24:12.5330000+03:00","stream":"Tech"},{"version":"6000.1.2f1","releaseDate":"2025-05-06T20:34:03.1050000+03:00","stream":"Tech"},{"version":"6000.2.0a10","releaseDate":"2025-05-01T12:14:47.8870000+03:00","stream":"Tech"},{"version":"6000.1.1f1","releaseDate":"2025-04-29T19:39:51.9700000+03:00","stream":"Tech"},{"version":"6000.0.48f1","releaseDate":"2025-04-29T17:35:44.5230000+03:00","stream":"Tech"},{"version":"6000.1.0f1","releaseDate":"2025-04-23T19:39:14.5990000+03:00","stream":"Tech"},{"version":"6000.0.47f1","releaseDate":"2025-04-16T06:29:12.0920000+03:00","stream":"Tech"},{"version":"6000.1.0b15","releaseDate":"2025-04-16T06:28:31.9490000+03:00","stream":"Tech"},{"version":"6000.1.0b14","releaseDate":"2025-04-10T21:26:49.7290000+03:00","stream":"Tech"},{"version":"6000.0.46f1","releaseDate":"2025-04-10T05:59:39.0190000+03:00","stream":"Tech"},{"version":"6000.2.0a9","releaseDate":"2025-04-10T21:54:23.9518927+03:00","stream":"Alpha"},{"version":"2022.3.61f1","releaseDate":"2025-04-10T11:38:43.5390000+03:00","stream":"Tech"},{"version":"6000.1.0b13","releaseDate":"2025-04-03T17:02:05.1710000+03:00","stream":"Tech"},{"version":"6000.2.0a8","releaseDate":"2025-04-03T14:42:33.5640000+03:00","stream":"Tech"},{"version":"6000.0.45f1","releaseDate":"2025-04-02T20:28:25.2630000+03:00","stream":"Tech"},{"version":"6000.2.0a7","releaseDate":"2025-04-03T00:29:12.5673679+03:00","stream":"Alpha"},{"version":"6000.0.44f1","releaseDate":"2025-03-28T17:42:02.3830000+02:00","stream":"Tech"},{"version":"6000.1.0b12","releaseDate":"2025-03-28T17:41:15.4510000+02:00","stream":"Tech"},{"version":"6000.0.43f1","releaseDate":"2025-03-18T19:24:00.4850000+02:00","stream":"Tech"},{"version":"6000.1.0b11","releaseDate":"2025-03-13T23:12:53.3749487+02:00","stream":"Beta"},{"version":"6000.0.42f1","releaseDate":"2025-03-11T15:58:50.1000000+02:00","stream":"Tech"},{"version":"2022.3.60f1","releaseDate":"2025-03-12T12:34:20.8620000+02:00","stream":"Tech"},{"version":"6000.1.0b10","releaseDate":"2025-03-09T21:03:55.9859232+02:00","stream":"Beta"},{"version":"6000.2.0a6","releaseDate":"2025-03-05T12:38:42.7350000+02:00","stream":"Tech"},{"version":"6000.0.41f1","releaseDate":"2025-03-03T23:59:40.0490000+02:00","stream":"Tech"},{"version":"6000.1.0b9","releaseDate":"2025-02-26T20:38:37.1430029+02:00","stream":"Beta"},{"version":"2022.3.59f1","releaseDate":"2025-02-26T08:46:36.6070000+02:00","stream":"Tech"},{"version":"6000.0.40f1","releaseDate":"2025-02-25T18:31:05.0170000+02:00","stream":"Tech"},{"version":"6000.1.0b8","releaseDate":"2025-02-22T23:05:50.9086693+02:00","stream":"Beta"},{"version":"6000.2.0a4","releaseDate":"2025-02-19T16:48:33.1920000+02:00","stream":"Tech"},{"version":"6000.0.39f1","releaseDate":"2025-02-19T09:25:26.3610000+02:00","stream":"Tech"},{"version":"6000.1.0b7","releaseDate":"2025-02-19T09:25:03.6480000+02:00","stream":"Tech"},{"version":"2022.3.58f1","releaseDate":"2025-02-12T09:38:47.9230000+02:00","stream":"Tech"},{"version":"6000.1.0b6","releaseDate":"2025-02-11T17:27:26.4890000+02:00","stream":"Tech"},{"version":"6000.0.38f1","releaseDate":"2025-02-11T17:26:47.9610000+02:00","stream":"Tech"},{"version":"6000.1.0b5","releaseDate":"2025-02-04T18:57:33.9900000+02:00","stream":"Tech"},{"version":"6000.0.37f1","releaseDate":"2025-02-04T18:57:15.7990000+02:00","stream":"Tech"},{"version":"6000.2.0a1","releaseDate":"2025-01-29T12:20:51.8410000+02:00","stream":"Tech"},{"version":"2022.3.57f1","releaseDate":"2025-01-29T11:35:20.0040000+02:00","stream":"Tech"},{"version":"6000.1.0b4","releaseDate":"2025-01-28T20:18:53.6020000+02:00","stream":"Tech"},{"version":"6000.0.36f1","releaseDate":"2025-01-28T20:18:05.4190000+02:00","stream":"Tech"},{"version":"6000.0.35f1","releaseDate":"2025-01-22T20:20:41.5350000+02:00","stream":"Tech"},{"version":"6000.1.0b3","releaseDate":"2025-01-22T20:18:42.6480000+02:00","stream":"Tech"},{"version":"6000.1.0b2","releaseDate":"2025-01-16T14:57:55.2590000+02:00","stream":"Tech"},{"version":"6000.0.34f1","releaseDate":"2025-01-15T15:46:28.7450000+02:00","stream":"Tech"},{"version":"2022.3.56f1","releaseDate":"2025-01-15T09:37:15.3380000+02:00","stream":"Tech"},{"version":"6000.0.33f1","releaseDate":"2025-01-08T12:15:44.6480000+02:00","stream":"Tech"},{"version":"6000.1.0b1","releaseDate":"2025-01-07T23:50:17.2740000+02:00","stream":"Tech"},{"version":"6000.0.32f1","releaseDate":"2024-12-19T17:34:00.0720000+02:00","stream":"Tech"},{"version":"6000.1.0a9","releaseDate":"2024-12-18T10:40:10.1340000+02:00","stream":"Tech"},{"version":"2022.3.55f1","releaseDate":"2024-12-17T18:21:09.4100000+02:00","stream":"Tech"},{"version":"6000.1.0a8","releaseDate":"2024-12-15T18:28:59.7430639+02:00","stream":"Alpha"},{"version":"6000.0.31f1","releaseDate":"2024-12-10T22:18:02.5280000+02:00","stream":"Tech"},{"version":"6000.1.0a8","releaseDate":"2024-12-10T22:17:32.5920000+02:00","stream":"Tech"},{"version":"6000.1.0a7","releaseDate":"2024-12-05T08:33:50.3480000+02:00","stream":"Tech"},{"version":"6000.0.30f1","releaseDate":"2024-12-04T16:36:24.5510000+02:00","stream":"Tech"},{"version":"2022.3.54f1","releaseDate":"2024-12-04T16:24:52.8920000+02:00","stream":"Tech"},{"version":"6000.1.0a6","releaseDate":"2024-11-28T13:20:00.3060000+02:00","stream":"Tech"},{"version":"6000.0.29f1","releaseDate":"2024-11-28T11:51:13.4500000+02:00","stream":"Tech"},{"version":"6000.0.28f1","releaseDate":"2024-11-20T17:26:35.0740000+02:00","stream":"Tech"},{"version":"6000.1.0a5","releaseDate":"2024-11-20T06:47:45.8140000+02:00","stream":"Tech"},{"version":"2022.3.53f1","releaseDate":"2024-11-19T18:19:05.9770000+02:00","stream":"Tech"},{"version":"6000.0.27f1","releaseDate":"2024-11-14T09:07:52.6160000+02:00","stream":"Tech"},{"version":"6000.1.0a4","releaseDate":"2024-11-14T08:21:53.5470000+02:00","stream":"Tech"},{"version":"6000.1.0a3","releaseDate":"2024-10-31T02:09:14.4710000+02:00","stream":"Tech"},{"version":"6000.0.26f1","releaseDate":"2024-11-07T05:58:16.8120000+02:00","stream":"Tech"},{"version":"2022.3.52f1","releaseDate":"2024-11-06T08:44:56.0460000+02:00","stream":"Tech"},{"version":"6000.0.25f1","releaseDate":"2024-10-31T02:08:57.1640000+02:00","stream":"LTS"},{"version":"6000.1.0a2","releaseDate":"2024-10-31T01:18:23.1720000+02:00","stream":"Alpha"},{"version":"6000.0.24f1","releaseDate":"2024-10-24T07:50:49.7030000+03:00","stream":"LTS"},{"version":"2022.3.51f1","releaseDate":"2024-10-22T19:55:03.7950000+03:00","stream":"LTS"},{"version":"6000.0.23f1","releaseDate":"2024-10-17T02:50:12.5800000+03:00","stream":"LTS"},{"version":"2021.3.45f1","releaseDate":"2024-10-16T11:39:15.9770000+03:00","stream":"LTS"},{"version":"2022.3.50f1","releaseDate":"2024-10-09T12:22:48.6100000+03:00","stream":"LTS"},{"version":"6000.0.22f1","releaseDate":"2024-10-02T22:04:27.2050000+03:00","stream":"Tech"},{"version":"2022.3.49f1","releaseDate":"2024-10-01T17:05:21.8390000+03:00","stream":"LTS"},{"version":"2022.3.48f1","releaseDate":"2024-09-26T21:38:03.7600000+03:00","stream":"LTS"},{"version":"6000.0.21f1","releaseDate":"2024-09-24T19:11:20.5860000+03:00","stream":"Tech"},{"version":"2021.3.44f1","releaseDate":"2024-09-23T17:46:08.5310000+03:00","stream":"LTS"},{"version":"6000.0.20f1","releaseDate":"2024-09-19T18:22:09.9610000+03:00","stream":"Tech"},{"version":"2022.3.47f1","releaseDate":"2024-09-18T09:44:50.2140000+03:00","stream":"LTS"},{"version":"6000.0.19f1","releaseDate":"2024-09-12T04:29:34.6560000+03:00","stream":"Tech"},{"version":"2022.3.46f1","releaseDate":"2024-09-10T19:41:40.2330000+03:00","stream":"LTS"},{"version":"6000.0.18f1","releaseDate":"2024-09-04T09:08:14.6900000+03:00","stream":"Tech"},{"version":"2022.3.45f1","releaseDate":"2024-09-04T01:44:17.3580000+03:00","stream":"LTS"},{"version":"6000.0.17f1","releaseDate":"2024-08-27T19:52:36.7630000+03:00","stream":"Tech"},{"version":"2022.3.44f1","releaseDate":"2024-08-23T09:10:50.9750000+03:00","stream":"LTS"},{"version":"6000.0.16f1","releaseDate":"2024-08-22T21:12:19.7750000+03:00","stream":"Tech"},{"version":"2021.3.43f1","releaseDate":"2024-08-22T13:10:30.8490000+03:00","stream":"LTS"},{"version":"2022.3.43f1","releaseDate":"2024-08-21T17:11:42.7280000+03:00","stream":"LTS"},{"version":"6000.0.15f1","releaseDate":"2024-08-13T21:03:16.7920000+03:00","stream":"Tech"},{"version":"2022.3.42f1","releaseDate":"2024-08-13T12:26:14.2690000+03:00","stream":"LTS"},{"version":"6000.0.14f1","releaseDate":"2024-08-07T08:59:10.6590000+03:00","stream":"Tech"},{"version":"2022.3.41f1","releaseDate":"2024-08-06T13:07:06.8530000+03:00","stream":"LTS"},{"version":"2021.3.42f1","releaseDate":"2024-08-06T12:30:24.6020000+03:00","stream":"LTS"},{"version":"6000.0.13f1","releaseDate":"2024-07-31T21:30:12.3520000+03:00","stream":"Tech"},{"version":"2022.3.40f1","releaseDate":"2024-07-30T17:14:27.5360000+03:00","stream":"LTS"},{"version":"6000.0.12f1","releaseDate":"2024-07-25T19:59:55.9270000+03:00","stream":"Tech"},{"version":"2022.3.39f1","releaseDate":"2024-07-23T19:04:16.2020000+03:00","stream":"LTS"},{"version":"2021.3.41f1","releaseDate":"2024-07-23T17:54:58.7980000+03:00","stream":"LTS"},{"version":"6000.0.11f1","releaseDate":"2024-07-17T13:16:09.0230000+03:00","stream":"Tech"},{"version":"2022.3.38f1","releaseDate":"2024-07-16T16:52:35.9940000+03:00","stream":"LTS"},{"version":"6000.0.10f1","releaseDate":"2024-07-10T19:45:22.4880000+03:00","stream":"Tech"},{"version":"2022.3.37f1","releaseDate":"2024-07-09T15:05:40.0740000+03:00","stream":"LTS"},{"version":"6000.0.9f1","releaseDate":"2024-07-03T17:22:27.3520000+03:00","stream":"Tech"},{"version":"2022.3.36f1","releaseDate":"2024-07-02T20:23:09.1240000+03:00","stream":"LTS"},{"version":"6000.0.8f1","releaseDate":"2024-06-28T18:36:42.0980000+03:00","stream":"Tech"},{"version":"2022.3.35f1","releaseDate":"2024-06-27T20:06:27.0820000+03:00","stream":"LTS"},{"version":"2021.3.40f1","releaseDate":"2024-06-27T05:15:04.4950000+03:00","stream":"LTS"},{"version":"6000.0.7f1","releaseDate":"2024-06-20T19:04:46.2760000+03:00","stream":"Tech"},{"version":"2022.3.34f1","releaseDate":"2024-06-18T14:27:05.7060000+03:00","stream":"LTS"},{"version":"2022.3.33f1","releaseDate":"2024-06-12T09:22:11.9550000+03:00","stream":"LTS"},{"version":"6000.0.5f1","releaseDate":"2024-06-04T21:54:20.5720000+03:00","stream":"Tech"},{"version":"2022.3.32f1","releaseDate":"2024-06-04T20:45:52.3580000+03:00","stream":"LTS"},{"version":"6000.0.4f1","releaseDate":"2024-05-29T19:49:19.3410000+03:00","stream":"Tech"},{"version":"2022.3.31f1","releaseDate":"2024-05-28T20:19:07.2650000+03:00","stream":"LTS"},{"version":"2021.3.39f1","releaseDate":"2024-05-28T19:13:34.5600000+03:00","stream":"LTS"},{"version":"6000.0.3f1","releaseDate":"2024-05-21T19:15:54.9330000+03:00","stream":"Tech"},{"version":"2022.3.30f1","releaseDate":"2024-05-21T15:05:13.7390000+03:00","stream":"LTS"},{"version":"6000.0.2f1","releaseDate":"2024-05-14T22:54:04.4270000+03:00","stream":"Tech"},{"version":"2022.3.29f1","releaseDate":"2024-05-14T18:20:52.9280000+03:00","stream":"LTS"},{"version":"6000.0.1f1","releaseDate":"2024-05-08T18:11:21.9000000+03:00","stream":"Tech"},{"version":"2022.3.28f1","releaseDate":"2024-05-07T18:20:10.5920000+03:00","stream":"LTS"},{"version":"2021.3.38f1","releaseDate":"2024-05-02T21:42:56.7610000+03:00","stream":"LTS"},{"version":"2022.3.27f1","releaseDate":"2024-04-30T20:28:32.4380000+03:00","stream":"LTS"},{"version":"6000.0.0f1","releaseDate":"2024-04-29T21:37:33.4220000+03:00","stream":"Tech"},{"version":"2023.2.20f1","releaseDate":"2024-04-25T22:29:55.5280000+03:00","stream":"Tech"},{"version":"2022.3.26f1","releaseDate":"2024-04-23T20:47:02.1750000+03:00","stream":"LTS"},{"version":"6000.0.0b16","releaseDate":"2024-04-19T18:47:47.0120000+03:00","stream":"Beta"},{"version":"2023.2.19f1","releaseDate":"2024-04-18T11:21:36.2640000+03:00","stream":"Tech"},{"version":"2022.3.25f1","releaseDate":"2024-04-16T15:56:01.9400000+03:00","stream":"LTS"},{"version":"6000.0.0b15","releaseDate":"2024-04-13T03:46:31.3090000+03:00","stream":"Beta"},{"version":"2023.2.18f1","releaseDate":"2024-04-10T00:11:33.7860000+03:00","stream":"Tech"},{"version":"2022.3.24f1","releaseDate":"2024-04-09T14:12:12.5040000+03:00","stream":"LTS"},{"version":"2023.2.17f1","releaseDate":"2024-04-04T04:45:09.5450000+03:00","stream":"Tech"},{"version":"2022.3.23f1","releaseDate":"2024-04-02T18:24:02.3240000+03:00","stream":"LTS"},{"version":"2021.3.37f1","releaseDate":"2024-04-02T16:12:43.5310000+03:00","stream":"LTS"},{"version":"6000.0.0b13","releaseDate":"2024-03-27T03:28:00.3900000+02:00","stream":"Beta"},{"version":"2023.2.16f1","releaseDate":"2024-03-27T03:03:51.3150000+02:00","stream":"Tech"},{"version":"2023.2.15f1","releaseDate":"2024-03-19T23:07:34.0340000+02:00","stream":"Tech"},{"version":"6000.0.0b12","releaseDate":"2024-03-19T21:32:02.8890000+02:00","stream":"Beta"},{"version":"2022.3.22f1","releaseDate":"2024-03-19T13:06:29.3290000+02:00","stream":"LTS"},{"version":"6000.0.0b11","releaseDate":"2024-03-13T23:20:06.4030000+02:00","stream":"Beta"},{"version":"2023.2.14f1","releaseDate":"2024-03-12T20:27:41.7580000+02:00","stream":"Tech"},{"version":"2023.2.13f1","releaseDate":"2024-03-05T22:41:13.8390000+02:00","stream":"Tech"},{"version":"2023.3.0b10","releaseDate":"2024-03-05T21:08:01.4850000+02:00","stream":"Beta"},{"version":"2021.3.36f1","releaseDate":"2024-03-05T20:42:24.1710000+02:00","stream":"LTS"},{"version":"2022.3.21f1","releaseDate":"2024-03-05T18:04:04.8580000+02:00","stream":"LTS"},{"version":"2023.2.12f1","releaseDate":"2024-02-29T01:06:57.2790000+02:00","stream":"Tech"},{"version":"2023.3.0b9","releaseDate":"2024-02-28T23:32:42.6980000+02:00","stream":"Beta"},{"version":"2023.2.11f1","releaseDate":"2024-02-20T23:17:45.0260000+02:00","stream":"Tech"},{"version":"2023.3.0b8","releaseDate":"2024-02-20T21:40:27.1710000+02:00","stream":"Beta"},{"version":"2023.2.10f1","releaseDate":"2024-02-14T21:39:19.8910000+02:00","stream":"Tech"},{"version":"2022.3.20f1","releaseDate":"2024-02-14T13:25:56.5410000+02:00","stream":"LTS"},{"version":"2023.3.0b7","releaseDate":"2024-02-13T21:59:14.7140000+02:00","stream":"Beta"},{"version":"2023.3.0b6","releaseDate":"2024-02-07T09:24:40.2320000+02:00","stream":"Beta"},{"version":"2023.2.9f1","releaseDate":"2024-02-07T08:56:57.6470000+02:00","stream":"Tech"},{"version":"2021.3.35f1","releaseDate":"2024-02-06T17:40:15.5830000+02:00","stream":"LTS"},{"version":"2022.3.19f1","releaseDate":"2024-01-31T13:56:51.6340000+02:00","stream":"LTS"},{"version":"2023.3.0b5","releaseDate":"2024-01-31T02:28:33.7000000+02:00","stream":"Beta"},{"version":"2023.2.8f1","releaseDate":"2024-01-31T02:02:00.5870000+02:00","stream":"Tech"},{"version":"2023.2.7f1","releaseDate":"2024-01-23T22:43:04.8780000+02:00","stream":"Tech"},{"version":"2023.3.0b4","releaseDate":"2024-01-23T21:12:34.8720000+02:00","stream":"Beta"},{"version":"2022.3.18f1","releaseDate":"2024-01-20T18:00:12.2100000+02:00","stream":"LTS"},{"version":"2023.2.6f1","releaseDate":"2024-01-17T07:22:12.1160000+02:00","stream":"Tech"},{"version":"2023.3.0b3","releaseDate":"2024-01-15T07:07:54.4010000+02:00","stream":"Beta"},{"version":"2023.3.0b2","releaseDate":"2024-01-09T23:10:15.9440000+02:00","stream":"Beta"},{"version":"2021.3.34f1","releaseDate":"2024-01-09T17:33:57.0130000+02:00","stream":"LTS"},{"version":"2022.3.17f1","releaseDate":"2024-01-09T15:24:21.3090000+02:00","stream":"LTS"},{"version":"2023.2.5f1","releaseDate":"2024-01-09T10:49:30.8570000+02:00","stream":"Tech"},{"version":"2023.3.0b1","releaseDate":"2024-01-03T04:06:01.1860000+02:00","stream":"Beta"},{"version":"2023.2.4f1","releaseDate":"2023-12-22T13:24:31.4620000+02:00","stream":"Tech"},{"version":"2022.3.16f1","releaseDate":"2023-12-19T12:05:11.7210000+02:00","stream":"LTS"},{"version":"2023.3.0a18","releaseDate":"2023-12-13T23:40:57.5080000+02:00","stream":"Alpha"},{"version":"2023.2.3f1","releaseDate":"2023-12-06T00:03:42.7620000+02:00","stream":"Tech"},{"version":"2023.3.0a17","releaseDate":"2023-12-05T22:29:50.0710000+02:00","stream":"Alpha"},{"version":"2022.3.15f1","releaseDate":"2023-12-05T18:41:51.6760000+02:00","stream":"LTS"},{"version":"2023.2.2f1","releaseDate":"2023-11-28T22:28:30.9510000+02:00","stream":"Tech"},{"version":"2023.3.0a16","releaseDate":"2023-11-28T20:53:03.1050000+02:00","stream":"Alpha"},{"version":"2021.3.33f1","releaseDate":"2023-11-28T17:21:35.6330000+02:00","stream":"LTS"},{"version":"2023.2.1f1","releaseDate":"2023-11-22T00:09:38.4850000+02:00","stream":"Tech"},{"version":"2022.3.14f1","releaseDate":"2023-11-21T22:07:15.6700000+02:00","stream":"LTS"},{"version":"2023.3.0a15","releaseDate":"2023-11-21T19:46:47.0020000+02:00","stream":"Alpha"},{"version":"2023.2.0f1","releaseDate":"2023-11-15T01:22:44.2930000+02:00","stream":"Tech"},{"version":"2023.3.0a14","releaseDate":"2023-11-14T23:47:34.4680000+02:00","stream":"Alpha"},{"version":"2023.1.20f1","releaseDate":"2023-11-09T13:37:53.0800000+02:00","stream":"Tech"},{"version":"2022.3.13f1","releaseDate":"2023-11-07T19:33:11.8460000+02:00","stream":"LTS"},{"version":"2023.3.0a13","releaseDate":"2023-11-07T15:03:31.6360000+02:00","stream":"Alpha"},{"version":"2023.2.0b17","releaseDate":"2023-11-07T03:15:49.7360000+02:00","stream":"Beta"},{"version":"2021.3.32f1","releaseDate":"2023-11-01T17:47:25.8010000+02:00","stream":"LTS"},{"version":"2023.2.0b16","releaseDate":"2023-11-01T09:07:29.0190000+02:00","stream":"Beta"},{"version":"2023.3.0a12","releaseDate":"2023-10-31T22:54:47.4610000+02:00","stream":"Alpha"},{"version":"2023.1.19f1","releaseDate":"2023-10-31T16:12:27.1350000+02:00","stream":"Tech"},{"version":"2023.3.0a11","releaseDate":"2023-10-26T23:42:38.0140000+03:00","stream":"Alpha"},{"version":"2023.2.0b15","releaseDate":"2023-10-26T22:42:17.8000000+03:00","stream":"Beta"},{"version":"2022.3.12f1","releaseDate":"2023-10-26T17:00:14.6020000+03:00","stream":"LTS"},{"version":"2023.1.18f1","releaseDate":"2023-10-24T19:38:46.5580000+03:00","stream":"Tech"},{"version":"2023.1.17f1","releaseDate":"2023-10-17T16:06:27.2150000+03:00","stream":"Tech"},{"version":"2023.2.0b14","releaseDate":"2023-10-16T19:49:19.2110000+03:00","stream":"Beta"},{"version":"2023.3.0a10","releaseDate":"2023-10-16T18:53:09.4090000+03:00","stream":"Alpha"},{"version":"2023.2.0b13","releaseDate":"2023-10-11T02:43:50.4180000+03:00","stream":"Beta"},{"version":"2022.3.11f1","releaseDate":"2023-10-10T18:27:45.5750000+03:00","stream":"LTS"},{"version":"2023.2.0b12","releaseDate":"2023-10-05T08:35:01.2590000+03:00","stream":"Beta"},{"version":"2023.3.0a8","releaseDate":"2023-10-05T07:37:32.5410000+03:00","stream":"Alpha"},{"version":"2023.1.16f1","releaseDate":"2023-10-03T20:51:07.9240000+03:00","stream":"Tech"},{"version":"2021.3.31f1","releaseDate":"2023-10-03T18:50:59.1880000+03:00","stream":"LTS"},{"version":"2023.2.0b11","releaseDate":"2023-09-27T22:03:28.2830000+03:00","stream":"Beta"},{"version":"2023.1.15f1","releaseDate":"2023-09-26T16:26:57.1220000+03:00","stream":"Tech"},{"version":"2023.3.0a6","releaseDate":"2023-09-21T22:57:30.1720000+03:00","stream":"Alpha"},{"version":"2023.2.0b10","releaseDate":"2023-09-21T03:25:39.0680000+03:00","stream":"Beta"},{"version":"2023.3.0a7","releaseDate":"2023-09-21T02:32:03.4860000+03:00","stream":"Alpha"},{"version":"2023.1.14f1","releaseDate":"2023-09-19T16:45:02.8020000+03:00","stream":"Tech"},{"version":"2022.3.10f1","releaseDate":"2023-09-19T14:09:17.9240000+03:00","stream":"LTS"},{"version":"2023.2.0b9","releaseDate":"2023-09-13T19:47:50.2650000+03:00","stream":"Beta"},{"version":"2023.3.0a5","releaseDate":"2023-09-13T11:39:30.3420000+03:00","stream":"Alpha"},{"version":"2023.1.13f1","releaseDate":"2023-09-12T19:45:26.5060000+03:00","stream":"Tech"},{"version":"2023.2.0b8","releaseDate":"2023-09-07T03:06:06.6190000+03:00","stream":"Beta"},{"version":"2023.3.0a4","releaseDate":"2023-09-07T02:09:51.7610000+03:00","stream":"Alpha"},{"version":"2023.1.12f1","releaseDate":"2023-09-05T16:19:07.6000000+03:00","stream":"Tech"},{"version":"2022.3.9f1","releaseDate":"2023-09-05T14:20:42.5520000+03:00","stream":"LTS"},{"version":"2023.3.0a3","releaseDate":"2023-08-30T02:57:28.4560000+03:00","stream":"Alpha"},{"version":"2023.1.11f1","releaseDate":"2023-08-30T02:34:23.2510000+03:00","stream":"Tech"},{"version":"2023.2.0b7","releaseDate":"2023-08-30T01:05:40.2550000+03:00","stream":"Beta"},{"version":"2021.3.30f1","releaseDate":"2023-08-30T01:00:32.9160000+03:00","stream":"LTS"},{"version":"2023.2.0b6","releaseDate":"2023-08-23T19:37:08.1570000+03:00","stream":"Beta"},{"version":"2022.3.8f1","releaseDate":"2023-08-22T19:08:57.6900000+03:00","stream":"LTS"},{"version":"2023.1.10f1","releaseDate":"2023-08-22T12:04:56.8560000+03:00","stream":"Tech"},{"version":"2023.2.0b5","releaseDate":"2023-08-15T22:46:13.9610000+03:00","stream":"Beta"},{"version":"2023.1.9f1","releaseDate":"2023-08-15T11:51:07.4310000+03:00","stream":"Tech"},{"version":"2023.2.0b4","releaseDate":"2023-08-10T19:28:52.9540000+03:00","stream":"Beta"},{"version":"2023.1.8f1","releaseDate":"2023-08-08T13:46:36.3470000+03:00","stream":"Tech"},{"version":"2022.3.7f1","releaseDate":"2023-08-08T12:39:39.2500000+03:00","stream":"LTS"},{"version":"2023.2.0b3","releaseDate":"2023-08-02T00:20:07.9800000+03:00","stream":"Beta"},{"version":"2023.1.7f1","releaseDate":"2023-08-01T14:52:30.6880000+03:00","stream":"Tech"},{"version":"2022.3.6f1","releaseDate":"2023-07-31T21:44:28.3130000+03:00","stream":"LTS"},{"version":"2023.2.0b2","releaseDate":"2023-07-26T18:36:17.0900000+03:00","stream":"Beta"},{"version":"2023.1.6f1","releaseDate":"2023-07-25T17:07:19.6790000+03:00","stream":"Tech"},{"version":"2021.3.29f1","releaseDate":"2023-07-25T15:13:45.7210000+03:00","stream":"LTS"},{"version":"2023.2.0b1","releaseDate":"2023-07-19T20:48:18.0780000+03:00","stream":"Beta"},{"version":"2023.1.5f1","releaseDate":"2023-07-18T12:47:39.8830000+03:00","stream":"Tech"},{"version":"2022.3.5f1","releaseDate":"2023-07-13T19:12:49.1180000+03:00","stream":"LTS"},{"version":"2023.1.4f1","releaseDate":"2023-07-13T12:22:35.2840000+03:00","stream":"Tech"},{"version":"2023.2.0a22","releaseDate":"2023-07-10T13:49:24.5250000+03:00","stream":"Alpha"},{"version":"2023.1.3f1","releaseDate":"2023-07-05T13:38:33.7830000+03:00","stream":"Tech"},{"version":"2021.3.28f1","releaseDate":"2023-07-04T22:41:02.2050000+03:00","stream":"LTS"},{"version":"2023.1.2f1","releaseDate":"2023-06-26T20:35:53.2890000+03:00","stream":"Tech"},{"version":"2022.3.4f1","releaseDate":"2023-06-26T19:47:18.7050000+03:00","stream":"LTS"},{"version":"2023.2.0a20","releaseDate":"2023-06-21T22:58:23.5890000+03:00","stream":"Alpha"},{"version":"2022.3.3f1","releaseDate":"2023-06-21T18:21:19.0310000+03:00","stream":"LTS"},{"version":"2023.1.1f1","releaseDate":"2023-06-21T17:44:26.6940000+03:00","stream":"Tech"},{"version":"2023.2.0a19","releaseDate":"2023-06-13T20:56:46.9020000+03:00","stream":"Alpha"},{"version":"2022.3.2f1","releaseDate":"2023-06-13T20:35:17.0320000+03:00","stream":"LTS"},{"version":"2023.1.0f1","releaseDate":"2023-06-12T23:09:17.9400000+03:00","stream":"Tech"},{"version":"2021.3.27f1","releaseDate":"2023-06-07T19:35:21.2420000+03:00","stream":"LTS"},{"version":"2023.2.0a18","releaseDate":"2023-06-07T18:05:43.8610000+03:00","stream":"Alpha"},{"version":"2023.1.0b20","releaseDate":"2023-06-07T17:07:58.1050000+03:00","stream":"Beta"},{"version":"2022.3.1f1","releaseDate":"2023-06-07T14:44:18.6430000+03:00","stream":"LTS"},{"version":"2023.1.0b19","releaseDate":"2023-06-01T00:22:40.7160000+03:00","stream":"Beta"},{"version":"2023.2.0a17","releaseDate":"2023-05-31T22:36:57.5850000+03:00","stream":"Alpha"},{"version":"2022.3.0f1","releaseDate":"2023-05-30T13:40:13.8580000+03:00","stream":"LTS"},{"version":"2021.3.26f1","releaseDate":"2023-05-25T14:47:02.1500000+03:00","stream":"LTS"},{"version":"2023.2.0a16","releaseDate":"2023-05-24T23:32:01.9930000+03:00","stream":"Alpha"},{"version":"2023.1.0b18","releaseDate":"2023-05-24T17:12:55.4530000+03:00","stream":"Beta"},{"version":"2022.2.21f1","releaseDate":"2023-05-24T14:15:23.9850000+03:00","stream":"Tech"},{"version":"2022.2.20f1","releaseDate":"2023-05-18T12:58:25.7740000+03:00","stream":"Tech"},{"version":"2023.2.0a15","releaseDate":"2023-05-17T23:05:43.2150000+03:00","stream":"Alpha"},{"version":"2020.3.48f1","releaseDate":"2023-05-17T20:23:52.7840000+03:00","stream":"LTS"},{"version":"2023.1.0b17","releaseDate":"2023-05-17T19:32:57.0910000+03:00","stream":"Beta"},{"version":"2021.3.25f1","releaseDate":"2023-05-11T16:55:39.0570000+03:00","stream":"LTS"},{"version":"2022.2.19f1","releaseDate":"2023-05-11T15:02:51.9390000+03:00","stream":"Tech"},{"version":"2023.1.0b16","releaseDate":"2023-05-11T04:23:47.7980000+03:00","stream":"Beta"},{"version":"2023.2.0a14","releaseDate":"2023-05-10T22:50:11.4440000+03:00","stream":"Alpha"},{"version":"2023.1.0b15","releaseDate":"2023-05-04T18:09:21.8720000+03:00","stream":"Beta"},{"version":"2022.2.18f1","releaseDate":"2023-05-04T17:54:59.9510000+03:00","stream":"Tech"},{"version":"2023.2.0a13","releaseDate":"2023-05-03T22:08:00.7610000+03:00","stream":"Alpha"},{"version":"2022.2.17f1","releaseDate":"2023-04-27T20:55:43.2970000+03:00","stream":"Tech"},{"version":"2021.3.24f1","releaseDate":"2023-04-27T20:16:27.5610000+03:00","stream":"LTS"},{"version":"2023.2.0a12","releaseDate":"2023-04-27T17:39:10.7740000+03:00","stream":"Alpha"},{"version":"2023.1.0b14","releaseDate":"2023-04-26T20:38:33.8280000+03:00","stream":"Beta"},{"version":"2023.2.0a11","releaseDate":"2023-04-20T02:11:25.8420000+03:00","stream":"Alpha"},{"version":"2023.1.0b13","releaseDate":"2023-04-19T18:38:30.4380000+03:00","stream":"Beta"},{"version":"2022.2.16f1","releaseDate":"2023-04-19T17:00:29.7910000+03:00","stream":"Tech"},{"version":"2021.3.23f1","releaseDate":"2023-04-14T06:05:53.4110000+03:00","stream":"LTS"},{"version":"2022.2.15f1","releaseDate":"2023-04-13T16:56:06.9490000+03:00","stream":"Tech"},{"version":"2023.2.0a10","releaseDate":"2023-04-12T20:57:27.3950000+03:00","stream":"Alpha"},{"version":"2023.1.0b12","releaseDate":"2023-04-12T19:58:27.1750000+03:00","stream":"Beta"},{"version":"2022.2.14f1","releaseDate":"2023-04-06T01:20:20.9000000+03:00","stream":"Tech"},{"version":"2023.2.0a9","releaseDate":"2023-04-05T20:17:10.3830000+03:00","stream":"Alpha"},{"version":"2020.3.47f1","releaseDate":"2023-04-05T19:12:43.4140000+03:00","stream":"LTS"},{"version":"2023.1.0b11","releaseDate":"2023-04-05T00:58:08.4100000+03:00","stream":"Beta"},{"version":"2022.2.13f1","releaseDate":"2023-03-31T17:48:28.3060000+03:00","stream":"Tech"},{"version":"2021.3.22f1","releaseDate":"2023-03-29T23:44:06.1310000+03:00","stream":"LTS"},{"version":"2023.1.0b10","releaseDate":"2023-03-29T22:31:31.4270000+03:00","stream":"Beta"},{"version":"2023.2.0a8","releaseDate":"2023-03-29T20:45:36.7180000+03:00","stream":"Alpha"},{"version":"2023.2.0a7","releaseDate":"2023-03-22T23:21:49.2770000+02:00","stream":"Alpha"},{"version":"2022.2.12f1","releaseDate":"2023-03-22T21:38:11.7020000+02:00","stream":"Tech"},{"version":"2023.1.0b9","releaseDate":"2023-03-22T19:34:30.5930000+02:00","stream":"Beta"},{"version":"2023.2.0a6","releaseDate":"2023-03-15T19:05:39.9400000+02:00","stream":"Alpha"},{"version":"2023.1.0b8","releaseDate":"2023-03-15T17:20:07.0490000+02:00","stream":"Beta"},{"version":"2021.3.21f1","releaseDate":"2023-03-15T05:07:29.3970000+02:00","stream":"LTS"},{"version":"2022.2.11f1","releaseDate":"2023-03-15T04:33:37.4390000+02:00","stream":"Tech"},{"version":"2022.2.10f1","releaseDate":"2023-03-09T03:37:14.1860000+02:00","stream":"Tech"},{"version":"2020.3.46f1","releaseDate":"2023-03-08T18:13:10.8010000+02:00","stream":"LTS"},{"version":"2023.1.0b7","releaseDate":"2023-03-07T19:21:08.1180000+02:00","stream":"Beta"},{"version":"2022.2.9f1","releaseDate":"2023-03-03T03:54:20.1620000+02:00","stream":"Tech"},{"version":"2021.3.20f1","releaseDate":"2023-03-03T01:34:21.4780000+02:00","stream":"LTS"},{"version":"2023.1.0b6","releaseDate":"2023-03-02T19:05:36.6970000+02:00","stream":"Beta"},{"version":"2022.2.8f1","releaseDate":"2023-02-23T17:21:52.5810000+02:00","stream":"Tech"},{"version":"2023.1.0b5","releaseDate":"2023-02-22T16:43:31.6520000+02:00","stream":"Beta"},{"version":"2021.3.19f1","releaseDate":"2023-02-17T17:24:45.3250000+02:00","stream":"LTS"},{"version":"2023.1.0b4","releaseDate":"2023-02-16T18:12:27.2890000+02:00","stream":"Beta"},{"version":"2022.2.7f1","releaseDate":"2023-02-15T22:59:18.6940000+02:00","stream":"Tech"},{"version":"2020.3.45f1","releaseDate":"2023-02-14T23:48:56.7970000+02:00","stream":"LTS"},{"version":"2022.2.6f1","releaseDate":"2023-02-10T03:46:54.4290000+02:00","stream":"Tech"},{"version":"2023.1.0b3","releaseDate":"2023-02-08T18:02:45.1480000+02:00","stream":"Beta"},{"version":"2021.3.18f1","releaseDate":"2023-02-01T22:10:11.4750000+02:00","stream":"LTS"},{"version":"2023.1.0b2","releaseDate":"2023-02-01T16:26:56.9800000+02:00","stream":"Beta"},{"version":"2022.2.5f1","releaseDate":"2023-01-31T22:58:08.2060000+02:00","stream":"Tech"},{"version":"2022.2.4f1","releaseDate":"2023-01-27T16:41:48.2250000+02:00","stream":"Tech"},{"version":"2023.1.0b1","releaseDate":"2023-01-24T18:35:43.4020000+02:00","stream":"Beta"},{"version":"2021.3.17f1","releaseDate":"2023-01-24T18:26:13.7420000+02:00","stream":"LTS"},{"version":"2022.2.3f1","releaseDate":"2023-01-23T21:50:52.1750000+02:00","stream":"Tech"},{"version":"2023.1.0a26","releaseDate":"2023-01-18T19:32:21.5630000+02:00","stream":"Alpha"},{"version":"2020.3.44f1","releaseDate":"2023-01-18T19:25:53.1090000+02:00","stream":"LTS"},{"version":"2023.1.0a25","releaseDate":"2023-01-11T21:23:37.6860000+02:00","stream":"Alpha"},{"version":"2022.2.2f1","releaseDate":"2023-01-10T05:21:01.4250000+02:00","stream":"Tech"},{"version":"2023.1.0a24","releaseDate":"2022-12-22T03:56:32.4480000+02:00","stream":"Alpha"},{"version":"2020.3.43f1","releaseDate":"2022-12-16T00:02:25.8850000+02:00","stream":"LTS"},{"version":"2021.3.16f1","releaseDate":"2022-12-15T18:05:52.9180000+02:00","stream":"LTS"},{"version":"2023.1.0a23","releaseDate":"2022-12-14T20:58:53.9770000+02:00","stream":"Alpha"},{"version":"2022.2.1f1","releaseDate":"2022-12-12T17:26:11.2260000+02:00","stream":"Tech"},{"version":"2023.1.0a22","releaseDate":"2022-12-07T23:25:31.9420000+02:00","stream":"Alpha"},{"version":"2022.2.0f1","releaseDate":"2022-12-07T16:29:04.8310000+02:00","stream":"Tech"},{"version":"2022.1.24f1","releaseDate":"2022-12-06T20:33:08.7300000+02:00","stream":"Tech"},{"version":"2021.3.15f1","releaseDate":"2022-12-01T19:20:58.3010000+02:00","stream":"LTS"},{"version":"2023.1.0a21","releaseDate":"2022-11-30T17:35:08.6520000+02:00","stream":"Alpha"},{"version":"2023.1.0a20","releaseDate":"2022-11-24T16:54:00.0950000+02:00","stream":"Alpha"},{"version":"2022.2.0b16","releaseDate":"2022-11-18T17:21:52.7500000+02:00","stream":"Beta"},{"version":"2023.1.0a19","releaseDate":"2022-11-17T23:40:42.6370000+02:00","stream":"Alpha"},{"version":"2021.3.14f1","releaseDate":"2022-11-17T19:28:01.6800000+02:00","stream":"LTS"},{"version":"2020.3.42f1","releaseDate":"2022-11-17T18:42:55.7160000+02:00","stream":"LTS"},{"version":"2022.1.23f1","releaseDate":"2022-11-16T13:07:08.5870000+02:00","stream":"Tech"},{"version":"2022.2.0b15","releaseDate":"2022-11-16T11:42:02.4260000+02:00","stream":"Beta"},{"version":"2023.1.0a18","releaseDate":"2022-11-10T17:10:57.7810000+02:00","stream":"Alpha"},{"version":"2022.1.22f1","releaseDate":"2022-11-09T14:42:48.4520000+02:00","stream":"Tech"},{"version":"2022.2.0b14","releaseDate":"2022-11-07T16:57:36.8080000+02:00","stream":"Beta"},{"version":"2021.3.13f1","releaseDate":"2022-11-04T18:42:23.1680000+02:00","stream":"LTS"},{"version":"2023.1.0a17","releaseDate":"2022-11-04T17:52:07.0070000+02:00","stream":"Alpha"},{"version":"2023.1.0a16","releaseDate":"2022-10-27T18:51:25.6730000+03:00","stream":"Alpha"},{"version":"2022.1.21f1","releaseDate":"2022-10-27T17:14:42.0510000+03:00","stream":"Tech"},{"version":"2022.2.0b13","releaseDate":"2022-10-26T23:13:31.6270000+03:00","stream":"Beta"},{"version":"2021.3.12f1","releaseDate":"2022-10-25T18:16:10.9510000+03:00","stream":"LTS"},{"version":"2023.1.0a15","releaseDate":"2022-10-21T18:12:32.3200000+03:00","stream":"Alpha"},{"version":"2020.3.41f1","releaseDate":"2022-10-21T17:22:52.5630000+03:00","stream":"LTS"},{"version":"2022.2.0b12","releaseDate":"2022-10-20T18:21:30.9490000+03:00","stream":"Beta"},{"version":"2022.2.0b11","releaseDate":"2022-10-17T22:47:44.2460000+03:00","stream":"Beta"},{"version":"2023.1.0a14","releaseDate":"2022-10-13T22:56:48.3590000+03:00","stream":"Alpha"},{"version":"2022.1.20f1","releaseDate":"2022-10-12T14:42:58.6240000+03:00","stream":"Tech"},{"version":"2023.1.0a13","releaseDate":"2022-10-06T22:12:22.6230000+03:00","stream":"Alpha"},{"version":"2022.2.0b10","releaseDate":"2022-10-06T18:22:41.4710000+03:00","stream":"Beta"},{"version":"2022.1.19f1","releaseDate":"2022-10-05T15:57:27.6550000+03:00","stream":"Tech"},{"version":"2022.1.18f1","releaseDate":"2022-09-29T17:37:44.5850000+03:00","stream":"Tech"},{"version":"2021.3.11f1","releaseDate":"2022-09-29T13:18:44.5050000+03:00","stream":"LTS"},{"version":"2022.2.0b9","releaseDate":"2022-09-29T06:03:40.7910000+03:00","stream":"Beta"},{"version":"2023.1.0a12","releaseDate":"2022-09-28T22:55:37.0920000+03:00","stream":"Alpha"},{"version":"2020.3.40f1","releaseDate":"2022-09-27T13:08:51.4880000+03:00","stream":"LTS"},{"version":"2023.1.0a11","releaseDate":"2022-09-21T17:43:10.2830000+03:00","stream":"Alpha"},{"version":"2022.1.17f1","releaseDate":"2022-09-21T14:47:30.1360000+03:00","stream":"Tech"},{"version":"2021.3.10f1","releaseDate":"2022-09-16T18:49:10.5930000+03:00","stream":"LTS"},{"version":"2020.3.39f1","releaseDate":"2022-09-15T00:53:29.6050000+03:00","stream":"LTS"},{"version":"2023.1.0a10","releaseDate":"2022-09-12T21:11:46.9380000+03:00","stream":"Alpha"},{"version":"2022.2.0b8","releaseDate":"2022-09-09T19:13:00.3470000+03:00","stream":"Beta"},{"version":"2022.1.16f1","releaseDate":"2022-09-08T16:08:35.0830000+03:00","stream":"Tech"},{"version":"2023.1.0a9","releaseDate":"2022-09-06T21:57:38.9710000+03:00","stream":"Alpha"},{"version":"2021.3.9f1","releaseDate":"2022-09-01T19:32:11.5790000+03:00","stream":"LTS"},{"version":"2022.2.0b7","releaseDate":"2022-09-01T17:23:07.2070000+03:00","stream":"Beta"},{"version":"2022.1.15f1","releaseDate":"2022-09-01T13:40:40.3950000+03:00","stream":"Tech"},{"version":"2022.2.0b6","releaseDate":"2022-08-26T01:40:10.3100000+03:00","stream":"Beta"},{"version":"2022.2.0b5","releaseDate":"2022-08-22T16:46:29.2740000+03:00","stream":"Beta"},{"version":"2022.1.14f1","releaseDate":"2022-08-22T11:56:08.0450000+03:00","stream":"Tech"},{"version":"2023.1.0a6","releaseDate":"2022-08-18T19:45:55.0300000+03:00","stream":"Alpha"},{"version":"2020.3.38f1","releaseDate":"2022-08-17T16:37:37.9830000+03:00","stream":"LTS"},{"version":"2023.1.0a5","releaseDate":"2022-08-11T19:35:17.2190000+03:00","stream":"Alpha"},{"version":"2022.1.13f1","releaseDate":"2022-08-11T10:43:08.2790000+03:00","stream":"Tech"},{"version":"2021.3.8f1","releaseDate":"2022-08-08T18:26:36.9290000+03:00","stream":"LTS"},{"version":"2022.1.12f1","releaseDate":"2022-08-05T13:30:50.9200000+03:00","stream":"Tech"},{"version":"2022.2.0b4","releaseDate":"2022-08-05T05:14:17.7170000+03:00","stream":"Beta"},{"version":"2022.2.0b3","releaseDate":"2022-07-28T20:18:44.5910000+03:00","stream":"Beta"},{"version":"2021.3.7f1","releaseDate":"2022-07-28T12:50:46.7670000+03:00","stream":"LTS"},{"version":"2022.1.11f1","releaseDate":"2022-07-27T15:20:14.4870000+03:00","stream":"Tech"},{"version":"2023.1.0a4","releaseDate":"2022-07-26T19:55:38.5590000+03:00","stream":"Alpha"},{"version":"2022.2.0b2","releaseDate":"2022-07-22T16:54:37.0230000+03:00","stream":"Beta"},{"version":"2020.3.37f1","releaseDate":"2022-07-21T12:53:36.2240000+03:00","stream":"LTS"},{"version":"2022.1.10f1","releaseDate":"2022-07-20T14:35:58.8890000+03:00","stream":"Tech"},{"version":"2022.1.9f1","releaseDate":"2022-07-14T14:39:28.8090000+03:00","stream":"Tech"},{"version":"2022.2.0b1","releaseDate":"2022-07-13T02:24:29.9080000+03:00","stream":"Beta"},{"version":"2021.3.6f1","releaseDate":"2022-07-08T12:48:54.7110000+03:00","stream":"LTS"},{"version":"2022.1.8f1","releaseDate":"2022-07-07T18:05:53.6420000+03:00","stream":"Tech"},{"version":"2022.2.0a18","releaseDate":"2022-07-04T19:35:28.1410000+03:00","stream":"Alpha"},{"version":"2022.1.7f1","releaseDate":"2022-06-29T15:39:55.5870000+03:00","stream":"Tech"},{"version":"2022.1.6f1","releaseDate":"2022-06-23T14:07:14.8560000+03:00","stream":"Tech"},{"version":"2021.3.5f1","releaseDate":"2022-06-22T20:32:31.1470000+03:00","stream":"LTS"},{"version":"2019.4.40f1","releaseDate":"2022-06-16T23:44:08.7430000+03:00","stream":"LTS"},{"version":"2022.2.0a17","releaseDate":"2022-06-16T22:20:11.1080000+03:00","stream":"Alpha"},{"version":"2020.3.36f1","releaseDate":"2022-06-16T18:04:11.6550000+03:00","stream":"LTS"},{"version":"2022.1.5f1","releaseDate":"2022-06-15T19:47:55.4610000+03:00","stream":"Tech"},{"version":"2022.2.0a16","releaseDate":"2022-06-08T23:20:40.3790000+03:00","stream":"Alpha"},{"version":"2022.1.4f1","releaseDate":"2022-06-08T18:53:22.1510000+03:00","stream":"Tech"},{"version":"2022.1.3f1","releaseDate":"2022-05-31T19:42:45.9740000+03:00","stream":"Tech"},{"version":"2021.3.4f1","releaseDate":"2022-05-31T18:14:15.5590000+03:00","stream":"LTS"},{"version":"2020.3.35f1","releaseDate":"2022-05-27T02:30:47.9620000+03:00","stream":"LTS"},{"version":"2022.1.2f1","releaseDate":"2022-05-25T17:32:41.9670000+03:00","stream":"Tech"},{"version":"2021.3.3f1","releaseDate":"2022-05-19T13:01:53.9560000+03:00","stream":"LTS"},{"version":"2022.1.1f1","releaseDate":"2022-05-18T23:43:29.7780000+03:00","stream":"Tech"},{"version":"2022.2.0a13","releaseDate":"2022-05-13T01:47:12.2000000+03:00","stream":"Alpha"},{"version":"2019.4.39f1","releaseDate":"2022-05-12T01:31:15.5880000+03:00","stream":"LTS"},{"version":"2022.1.0f1","releaseDate":"2022-05-09T19:53:20.7220000+03:00","stream":"Tech"},{"version":"2022.2.0a12","releaseDate":"2022-05-05T15:15:24.2770000+03:00","stream":"Alpha"},{"version":"2021.3.2f1","releaseDate":"2022-05-05T13:42:14.7170000+03:00","stream":"LTS"},{"version":"2020.3.34f1","releaseDate":"2022-05-04T17:33:40.9940000+03:00","stream":"LTS"},{"version":"2022.2.0a11","releaseDate":"2022-04-25T17:28:41.0660000+03:00","stream":"Alpha"},{"version":"2021.3.1f1","releaseDate":"2022-04-21T21:19:43.4030000+03:00","stream":"LTS"},{"version":"2022.2.0a10","releaseDate":"2022-04-14T16:22:59.4940000+03:00","stream":"Alpha"},{"version":"2019.4.38f1","releaseDate":"2022-04-13T18:24:10.4100000+03:00","stream":"LTS"},{"version":"2022.1.0b16","releaseDate":"2022-04-12T21:11:34.7660000+03:00","stream":"Beta"},{"version":"2021.3.0f1","releaseDate":"2022-04-11T21:46:28.6540000+03:00","stream":"LTS"},{"version":"2020.3.33f1","releaseDate":"2022-04-07T16:58:00.7880000+03:00","stream":"LTS"},{"version":"2022.1.0b15","releaseDate":"2022-04-07T10:56:08.2280000+03:00","stream":"Beta"},{"version":"2021.2.19f1","releaseDate":"2022-04-05T20:15:08.0160000+03:00","stream":"Tech"},{"version":"2022.2.0a9","releaseDate":"2022-04-01T13:23:18.7140000+03:00","stream":"Alpha"},{"version":"2021.2.18f1","releaseDate":"2022-04-01T10:28:41.0490000+03:00","stream":"Tech"},{"version":"2022.1.0b14","releaseDate":"2022-03-30T12:56:12.7250000+03:00","stream":"Beta"},{"version":"2021.2.17f1","releaseDate":"2022-03-24T23:31:28.9800000+02:00","stream":"Tech"},{"version":"2020.3.32f1","releaseDate":"2022-03-23T17:39:23.9120000+02:00","stream":"LTS"},{"version":"2019.4.37f1","releaseDate":"2022-03-22T20:47:13.8460000+02:00","stream":"LTS"},{"version":"2022.1.0b13","releaseDate":"2022-03-22T19:02:39.2100000+02:00","stream":"Beta"},{"version":"2020.3.31f1","releaseDate":"2022-03-17T20:06:28.2220000+02:00","stream":"LTS"},{"version":"2021.2.16f1","releaseDate":"2022-03-17T19:27:16.4280000+02:00","stream":"Tech"},{"version":"2022.1.0b12","releaseDate":"2022-03-17T17:03:20.4980000+02:00","stream":"Beta"},{"version":"2021.2.15f1","releaseDate":"2022-03-11T19:03:49.6680000+02:00","stream":"Tech"},{"version":"2022.1.0b11","releaseDate":"2022-03-09T09:19:01.6160000+02:00","stream":"Beta"},{"version":"2021.2.14f1","releaseDate":"2022-03-03T19:20:56.9220000+02:00","stream":"Tech"},{"version":"2022.1.0b10","releaseDate":"2022-03-02T14:36:18.0430000+02:00","stream":"Beta"},{"version":"2020.3.30f1","releaseDate":"2022-02-24T19:26:14.6130000+02:00","stream":"LTS"},{"version":"2021.2.13f1","releaseDate":"2022-02-23T21:42:33.3400000+02:00","stream":"Tech"},{"version":"2022.1.0b9","releaseDate":"2022-02-23T15:13:56.5370000+02:00","stream":"Beta"},{"version":"2021.2.12f1","releaseDate":"2022-02-17T22:43:34.6210000+02:00","stream":"Tech"},{"version":"2019.4.36f1","releaseDate":"2022-02-17T18:41:01.3940000+02:00","stream":"LTS"},{"version":"2020.3.29f1","releaseDate":"2022-02-17T17:59:07.5210000+02:00","stream":"LTS"},{"version":"2022.1.0b8","releaseDate":"2022-02-16T13:35:02.2220000+02:00","stream":"Beta"},{"version":"2021.2.11f1","releaseDate":"2022-02-10T19:24:35.6120000+02:00","stream":"Tech"},{"version":"2020.3.28f1","releaseDate":"2022-02-09T23:48:58.6840000+02:00","stream":"LTS"},{"version":"2022.1.0b7","releaseDate":"2022-02-08T13:39:17.9160000+02:00","stream":"Beta"},{"version":"2022.1.0b6","releaseDate":"2022-02-02T10:30:32.4120000+02:00","stream":"Beta"},{"version":"2021.2.10f1","releaseDate":"2022-02-02T00:07:17.8640000+02:00","stream":"Tech"},{"version":"2020.3.27f1","releaseDate":"2022-02-01T01:06:41.6490000+02:00","stream":"LTS"},{"version":"2019.4.35f1","releaseDate":"2022-01-28T16:26:18.8910000+02:00","stream":"LTS"},{"version":"2022.1.0b5","releaseDate":"2022-01-27T19:44:54.5310000+02:00","stream":"Beta"},{"version":"2021.2.9f1","releaseDate":"2022-01-27T19:09:54.1410000+02:00","stream":"Tech"},{"version":"2022.1.0b4","releaseDate":"2022-01-19T13:50:18.8200000+02:00","stream":"Beta"},{"version":"2020.3.26f1","releaseDate":"2022-01-13T22:29:30.1460000+02:00","stream":"LTS"},{"version":"2021.2.8f1","releaseDate":"2022-01-13T18:36:04.5530000+02:00","stream":"Tech"},{"version":"2022.1.0b3","releaseDate":"2022-01-12T14:14:48.4210000+02:00","stream":"Beta"},{"version":"2020.3.25f1","releaseDate":"2021-12-16T20:21:47.6100000+02:00","stream":"LTS"},{"version":"2021.2.7f1","releaseDate":"2021-12-16T19:44:39.8370000+02:00","stream":"Tech"},{"version":"2019.4.34f1","releaseDate":"2021-12-15T19:52:49.4210000+02:00","stream":"LTS"},{"version":"2022.1.0b2","releaseDate":"2021-12-14T20:43:17.2160000+02:00","stream":"Beta"},{"version":"2021.2.6f1","releaseDate":"2021-12-10T18:38:19.6320000+02:00","stream":"Tech"},{"version":"2022.1.0b1","releaseDate":"2021-12-08T21:49:54.8000000+02:00","stream":"Beta"},{"version":"2020.3.24f1","releaseDate":"2021-12-02T22:30:57.1110000+02:00","stream":"LTS"},{"version":"2021.2.5f1","releaseDate":"2021-12-01T18:54:28.0590000+02:00","stream":"Tech"},{"version":"2022.1.0a16","releaseDate":"2021-11-29T14:23:09.8130000+02:00","stream":"Alpha"},{"version":"2019.4.33f1","releaseDate":"2021-11-25T20:53:15.4390000+02:00","stream":"LTS"},{"version":"2021.2.4f1","releaseDate":"2021-11-25T15:45:23.5490000+02:00","stream":"Tech"},{"version":"2020.3.23f1","releaseDate":"2021-11-19T22:08:31.1420000+02:00","stream":"LTS"},{"version":"2022.1.0a15","releaseDate":"2021-11-18T14:23:33.3050000+02:00","stream":"Alpha"},{"version":"2021.2.3f1","releaseDate":"2021-11-18T13:49:58.4170000+02:00","stream":"Tech"},{"version":"2021.2.2f1","releaseDate":"2021-11-11T13:54:38.2890000+02:00","stream":"Tech"},{"version":"2020.3.22f1","releaseDate":"2021-11-05T21:35:33.6640000+02:00","stream":"LTS"},{"version":"2021.1.28f1","releaseDate":"2021-11-04T21:43:00.6120000+02:00","stream":"Tech"},{"version":"2021.2.1f1","releaseDate":"2021-11-04T14:14:00.1790000+02:00","stream":"Tech"},{"version":"2019.4.32f1","releaseDate":"2021-10-28T19:49:13.4530000+03:00","stream":"LTS"},{"version":"2022.1.0a13","releaseDate":"2021-10-28T17:30:14.4590000+03:00","stream":"Alpha"},{"version":"2021.1.27f1","releaseDate":"2021-10-25T22:24:00.3960000+03:00","stream":"Tech"},{"version":"2021.2.0f1","releaseDate":"2021-10-25T17:52:13.0340000+03:00","stream":"Tech"},{"version":"2020.3.21f1","releaseDate":"2021-10-21T19:33:29.3350000+03:00","stream":"LTS"},{"version":"2021.1.26f1","releaseDate":"2021-10-20T18:42:50.4910000+03:00","stream":"Tech"},{"version":"2021.1.25f1","releaseDate":"2021-10-15T00:35:29.3880000+03:00","stream":"Tech"},{"version":"2022.1.0a12","releaseDate":"2021-10-13T22:34:46.2550000+03:00","stream":"Alpha"},{"version":"2021.2.0b16","releaseDate":"2021-10-12T19:42:06.0710000+03:00","stream":"Beta"},{"version":"2020.3.20f1","releaseDate":"2021-10-08T19:38:35.5420000+03:00","stream":"LTS"},{"version":"2021.1.24f1","releaseDate":"2021-10-06T21:29:11.4340000+03:00","stream":"Tech"},{"version":"2022.1.0a11","releaseDate":"2021-10-06T18:14:18.1140000+03:00","stream":"Alpha"},{"version":"2021.2.0b15","releaseDate":"2021-10-06T12:13:13.6910000+03:00","stream":"Beta"},{"version":"2022.1.0a10","releaseDate":"2021-10-01T22:35:39.3300000+03:00","stream":"Alpha"},{"version":"2021.2.0b14","releaseDate":"2021-10-01T14:27:08.4200000+03:00","stream":"Beta"},{"version":"2021.1.23f1","releaseDate":"2021-09-30T20:01:27.1780000+03:00","stream":"Tech"},{"version":"2019.4.31f1","releaseDate":"2021-09-30T19:11:12.7000000+03:00","stream":"LTS"},{"version":"2022.1.0a9","releaseDate":"2021-09-23T19:24:52.9250000+03:00","stream":"Alpha"},{"version":"2020.3.19f1","releaseDate":"2021-09-23T00:58:37.4230000+03:00","stream":"LTS"},{"version":"2021.2.0b13","releaseDate":"2021-09-22T16:58:46.5710000+03:00","stream":"Beta"},{"version":"2021.1.22f1","releaseDate":"2021-09-21T03:25:04.5570000+03:00","stream":"Tech"},{"version":"2021.2.0b12","releaseDate":"2021-09-16T14:41:11.3370000+03:00","stream":"Beta"},{"version":"2022.1.0a8","releaseDate":"2021-09-15T17:02:16.5010000+03:00","stream":"Alpha"},{"version":"2021.1.21f1","releaseDate":"2021-09-15T00:44:40.4000000+03:00","stream":"Tech"},{"version":"2020.3.18f1","releaseDate":"2021-09-09T12:35:05.2550000+03:00","stream":"LTS"},{"version":"2021.1.20f1","releaseDate":"2021-09-08T16:15:22.7130000+03:00","stream":"Tech"},{"version":"2021.2.0b11","releaseDate":"2021-09-07T14:45:52.4140000+03:00","stream":"Beta"},{"version":"2022.1.0a7","releaseDate":"2021-09-06T14:16:46.3500000+03:00","stream":"Alpha"},{"version":"2021.2.0b10","releaseDate":"2021-09-04T04:54:50.1580000+03:00","stream":"Beta"},{"version":"2019.4.30f1","releaseDate":"2021-09-04T01:17:29.3740000+03:00","stream":"LTS"},{"version":"2021.1.19f1","releaseDate":"2021-09-01T13:51:04.9530000+03:00","stream":"Tech"},{"version":"2020.3.17f1","releaseDate":"2021-08-25T21:28:14.2230000+03:00","stream":"LTS"},{"version":"2021.1.18f1","releaseDate":"2021-08-25T20:26:42.2380000+03:00","stream":"Tech"},{"version":"2021.2.0b9","releaseDate":"2021-08-25T14:31:02.2950000+03:00","stream":"Beta"},{"version":"2021.2.0b8","releaseDate":"2021-08-19T12:59:27.4650000+03:00","stream":"Beta"},{"version":"2021.1.17f1","releaseDate":"2021-08-13T21:37:59.3900000+03:00","stream":"Tech"},{"version":"2020.3.16f1","releaseDate":"2021-08-12T18:55:22.6880000+03:00","stream":"LTS"},{"version":"2021.2.0b7","releaseDate":"2021-08-10T13:33:56.9150000+03:00","stream":"Beta"},{"version":"2021.2.0b6","releaseDate":"2021-08-04T16:24:08.9160000+03:00","stream":"Beta"},{"version":"2021.2.0b5","releaseDate":"2021-08-02T18:15:23.1620000+03:00","stream":"Beta"},{"version":"2021.1.16f1","releaseDate":"2021-08-02T17:27:00.4890000+03:00","stream":"Tech"},{"version":"2020.3.15f2","releaseDate":"2021-07-30T19:23:30.2390000+03:00","stream":"LTS"},{"version":"2019.4.29f1","releaseDate":"2021-07-30T18:19:33.1520000+03:00","stream":"LTS"},{"version":"2021.2.0b4","releaseDate":"2021-07-15T13:53:43.7390000+03:00","stream":"Beta"},{"version":"2021.1.15f1","releaseDate":"2021-07-14T14:13:58.1820000+03:00","stream":"Tech"},{"version":"2020.3.14f1","releaseDate":"2021-07-13T19:58:10.4910000+03:00","stream":"LTS"},{"version":"2021.2.0b3","releaseDate":"2021-07-08T13:47:42.2000000+03:00","stream":"Beta"},{"version":"2021.1.14f1","releaseDate":"2021-07-07T04:08:43.8360000+03:00","stream":"Tech"},{"version":"2021.2.0b2","releaseDate":"2021-07-02T16:15:04.4120000+03:00","stream":"Beta"},{"version":"2020.3.13f1","releaseDate":"2021-06-30T21:40:12.8800000+03:00","stream":"LTS"},{"version":"2021.1.13f1","releaseDate":"2021-06-30T08:59:29.1870000+03:00","stream":"Tech"},{"version":"2021.2.0b1","releaseDate":"2021-06-18T22:27:35.5390000+03:00","stream":"Beta"},{"version":"2018.4.36f1","releaseDate":"2021-06-17T19:13:54.0080000+03:00","stream":"LTS"},{"version":"2021.1.12f1","releaseDate":"2021-06-17T18:00:50.5720000+03:00","stream":"Tech"},{"version":"2020.3.12f1","releaseDate":"2021-06-15T21:58:12.2770000+03:00","stream":"LTS"},{"version":"2021.2.0a21","releaseDate":"2021-06-15T19:37:53.0380000+03:00","stream":"Alpha"},{"version":"2021.1.11f1","releaseDate":"2021-06-10T13:04:24.2960000+03:00","stream":"Tech"},{"version":"2021.2.0a20","releaseDate":"2021-06-09T20:17:01.4260000+03:00","stream":"Alpha"},{"version":"2019.4.28f1","releaseDate":"2021-06-03T20:50:56.4390000+03:00","stream":"LTS"},{"version":"2021.1.10f1","releaseDate":"2021-06-03T19:53:09.2760000+03:00","stream":"Tech"},{"version":"2021.2.0a19","releaseDate":"2021-06-03T18:19:41.9870000+03:00","stream":"Alpha"},{"version":"2020.3.11f1","releaseDate":"2021-06-01T20:44:03.0610000+03:00","stream":"LTS"},{"version":"2021.1.9f1","releaseDate":"2021-05-28T15:13:35.9700000+03:00","stream":"Tech"},{"version":"2020.3.10f1","releaseDate":"2021-05-26T21:08:15.2460000+03:00","stream":"LTS"},{"version":"2019.4.27f1","releaseDate":"2021-05-20T16:45:43.0950000+03:00","stream":"LTS"},{"version":"2020.3.9f1","releaseDate":"2021-05-19T20:45:38.0840000+03:00","stream":"LTS"},{"version":"2021.1.7f1","releaseDate":"2021-05-13T17:00:02.5350000+03:00","stream":"Tech"},{"version":"2020.3.8f1","releaseDate":"2021-05-12T23:50:34.7750000+03:00","stream":"LTS"},{"version":"2021.2.0a17","releaseDate":"2021-05-12T21:15:13.4370000+03:00","stream":"Alpha"},{"version":"2018.4.35f1","releaseDate":"2021-05-12T18:16:04.9960000+03:00","stream":"LTS"},{"version":"2021.1.6f1","releaseDate":"2021-05-06T09:42:44.3860000+03:00","stream":"Tech"},{"version":"2019.4.26f1","releaseDate":"2021-05-05T21:28:43.0280000+03:00","stream":"LTS"},{"version":"2020.3.7f1","releaseDate":"2021-05-05T20:05:58.3680000+03:00","stream":"LTS"},{"version":"2021.2.0a16","releaseDate":"2021-05-05T18:00:27.2340000+03:00","stream":"Alpha"},{"version":"2020.3.6f1","releaseDate":"2021-04-28T21:33:45.0410000+03:00","stream":"LTS"},{"version":"2021.2.0a15","releaseDate":"2021-04-28T19:51:06.5220000+03:00","stream":"Alpha"},{"version":"2021.1.5f1","releaseDate":"2021-04-28T14:57:22.3140000+03:00","stream":"Tech"},{"version":"2019.4.25f1","releaseDate":"2021-04-22T21:56:19.4680000+03:00","stream":"LTS"},{"version":"2021.1.4f1","releaseDate":"2021-04-22T11:14:16.9190000+03:00","stream":"Tech"},{"version":"2021.2.0a14","releaseDate":"2021-04-21T19:58:34.0620000+03:00","stream":"Alpha"},{"version":"2020.3.5f1","releaseDate":"2021-04-21T18:58:44.8310000+03:00","stream":"LTS"},{"version":"2018.4.34f1","releaseDate":"2021-04-15T13:28:39.0470000+03:00","stream":"LTS"},{"version":"2021.2.0a13","releaseDate":"2021-04-14T19:07:25.9350000+03:00","stream":"Alpha"},{"version":"2020.3.4f1","releaseDate":"2021-04-13T20:59:16.5940000+03:00","stream":"LTS"},{"version":"2021.1.3f1","releaseDate":"2021-04-13T14:23:53.3800000+03:00","stream":"Tech"},{"version":"2019.4.24f1","releaseDate":"2021-04-09T02:33:06.9090000+03:00","stream":"LTS"},{"version":"2020.3.3f1","releaseDate":"2021-04-07T19:37:40.6130000+03:00","stream":"LTS"},{"version":"2021.1.2f1","releaseDate":"2021-04-07T17:35:36.8280000+03:00","stream":"Tech"},{"version":"2021.2.0a12","releaseDate":"2021-04-06T19:40:54.7470000+03:00","stream":"Alpha"},{"version":"2021.2.0a11","releaseDate":"2021-03-31T20:48:42.9770000+03:00","stream":"Alpha"},{"version":"2021.1.1f1","releaseDate":"2021-03-31T17:04:08.0250000+03:00","stream":"Tech"},{"version":"2020.3.2f1","releaseDate":"2021-03-29T21:24:30.6840000+03:00","stream":"LTS"},{"version":"2021.2.0a10","releaseDate":"2021-03-24T22:41:29.4570000+02:00","stream":"Alpha"},{"version":"2018.4.33f1","releaseDate":"2021-03-24T19:48:21.9510000+02:00","stream":"LTS"},{"version":"2019.4.23f1","releaseDate":"2021-03-24T18:44:56.5610000+02:00","stream":"LTS"},{"version":"2020.3.1f1","releaseDate":"2021-03-22T20:05:51.7280000+02:00","stream":"LTS"},{"version":"2021.1.0f1","releaseDate":"2021-03-22T13:13:57.9050000+02:00","stream":"Tech"},{"version":"2021.2.0a9","releaseDate":"2021-03-17T20:02:06.9710000+02:00","stream":"Alpha"},{"version":"2021.1.0b12","releaseDate":"2021-03-17T13:21:39.6870000+02:00","stream":"Beta"},{"version":"2020.3.0f1","releaseDate":"2021-03-11T01:09:00.0190000+02:00","stream":"LTS"},{"version":"2021.1.0b11","releaseDate":"2021-03-10T20:19:22.0910000+02:00","stream":"Beta"},{"version":"2019.4.22f1","releaseDate":"2021-03-10T18:07:28.3010000+02:00","stream":"LTS"},{"version":"2021.2.0a8","releaseDate":"2021-03-09T17:39:33.3380000+02:00","stream":"Alpha"},{"version":"2021.1.0b10","releaseDate":"2021-03-04T19:23:44.8170000+02:00","stream":"Beta"},{"version":"2020.2.7f1","releaseDate":"2021-03-04T18:43:17.8170000+02:00","stream":"LTS"},{"version":"2021.2.0a6","releaseDate":"2021-02-24T20:59:57.2080000+02:00","stream":"Alpha"},{"version":"2021.1.0b8","releaseDate":"2021-02-24T19:47:25.5060000+02:00","stream":"Beta"},{"version":"2019.4.21f1","releaseDate":"2021-02-24T19:14:33.4900000+02:00","stream":"LTS"},{"version":"2020.2.6f1","releaseDate":"2021-02-24T02:10:19.4960000+02:00","stream":"LTS"},{"version":"2020.2.5f1","releaseDate":"2021-02-19T01:17:13.0170000+02:00","stream":"LTS"},{"version":"2018.4.32f1","releaseDate":"2021-02-18T14:18:22.1450000+02:00","stream":"LTS"},{"version":"2021.2.0a5","releaseDate":"2021-02-17T18:45:52.4040000+02:00","stream":"Alpha"},{"version":"2021.1.0b7","releaseDate":"2021-02-17T17:33:40.3340000+02:00","stream":"Beta"},{"version":"2020.2.4f1","releaseDate":"2021-02-12T22:14:18.5720000+02:00","stream":"LTS"},{"version":"2019.4.20f1","releaseDate":"2021-02-10T19:06:33.6840000+02:00","stream":"LTS"},{"version":"2021.1.0b6","releaseDate":"2021-02-10T17:26:16.3810000+02:00","stream":"Beta"},{"version":"2020.2.3f1","releaseDate":"2021-02-03T22:51:44.0220000+02:00","stream":"LTS"},{"version":"2021.1.0b5","releaseDate":"2021-02-03T13:02:09.2570000+02:00","stream":"Beta"},{"version":"2019.4.19f1","releaseDate":"2021-02-01T19:49:54.7260000+02:00","stream":"LTS"},{"version":"2021.1.0b4","releaseDate":"2021-01-27T14:14:30.6700000+02:00","stream":"Beta"},{"version":"2018.4.31f1","releaseDate":"2021-01-22T16:08:18.4010000+02:00","stream":"LTS"},{"version":"2020.2.2f1","releaseDate":"2021-01-21T22:41:55.7470000+02:00","stream":"LTS"},{"version":"2021.1.0b3","releaseDate":"2021-01-20T18:49:58.0860000+02:00","stream":"Beta"},{"version":"2021.1.0b2","releaseDate":"2021-01-13T17:48:52.7690000+02:00","stream":"Beta"},{"version":"2019.4.18f1","releaseDate":"2021-01-13T17:13:41.1610000+02:00","stream":"LTS"},{"version":"2020.2.1f1","releaseDate":"2020-12-23T19:32:56.7940000+02:00","stream":"LTS"},{"version":"2021.1.0b1","releaseDate":"2020-12-23T17:53:59.2550000+02:00","stream":"Beta"},{"version":"2019.4.17f1","releaseDate":"2020-12-22T17:05:02.0370000+02:00","stream":"LTS"},{"version":"2020.2.0f1","releaseDate":"2020-12-14T22:24:28.6530000+02:00","stream":"LTS"},{"version":"2021.1.0a9","releaseDate":"2020-12-11T11:34:06.1400000+02:00","stream":"Alpha"},{"version":"2020.1.17f1","releaseDate":"2020-12-09T13:39:40.0550000+02:00","stream":"LTS"},{"version":"2020.2.0b14","releaseDate":"2020-12-02T19:45:40.0260000+02:00","stream":"Beta"},{"version":"2021.1.0a8","releaseDate":"2020-12-02T19:15:19.2560000+02:00","stream":"Alpha"},{"version":"2019.4.16f1","releaseDate":"2020-12-02T18:12:41.3440000+02:00","stream":"LTS"},{"version":"2018.4.30f1","releaseDate":"2020-12-01T22:09:28.0830000+02:00","stream":"LTS"},{"version":"2020.1.16f1","releaseDate":"2020-12-01T21:04:30.3740000+02:00","stream":"LTS"},{"version":"2021.1.0a7","releaseDate":"2020-11-25T20:59:24.1580000+02:00","stream":"Alpha"},{"version":"2020.2.0b13","releaseDate":"2020-11-25T19:57:21.5630000+02:00","stream":"Beta"},{"version":"2020.1.15f1","releaseDate":"2020-11-25T13:32:56.2470000+02:00","stream":"LTS"},{"version":"2020.2.0b12","releaseDate":"2020-11-19T20:01:22.4320000+02:00","stream":"Beta"},{"version":"2020.1.14f1","releaseDate":"2020-11-18T21:08:42.0520000+02:00","stream":"LTS"},{"version":"2019.4.15f1","releaseDate":"2020-11-18T20:02:15.0550000+02:00","stream":"LTS"},{"version":"2021.1.0a5","releaseDate":"2020-11-16T10:29:13.8620000+02:00","stream":"Alpha"},{"version":"2021.1.0a6","releaseDate":"2020-11-12T15:53:12.8280000+02:00","stream":"Alpha"},{"version":"2020.2.0b11","releaseDate":"2020-11-11T21:36:00.6590000+02:00","stream":"Beta"},{"version":"2018.4.29f1","releaseDate":"2020-11-11T12:56:28.8090000+02:00","stream":"LTS"},{"version":"2020.1.13f1","releaseDate":"2020-11-11T11:59:32.6030000+02:00","stream":"LTS"},{"version":"2019.4.14f1","releaseDate":"2020-11-05T19:37:50.1760000+02:00","stream":"LTS"},{"version":"2020.2.0b10","releaseDate":"2020-11-04T19:18:58.3930000+02:00","stream":"Beta"},{"version":"2021.1.0a4","releaseDate":"2020-11-04T13:36:41.3270000+02:00","stream":"Alpha"},{"version":"2020.1.12f1","releaseDate":"2020-11-04T13:19:05.1340000+02:00","stream":"LTS"},{"version":"2020.2.0b9","releaseDate":"2020-10-28T18:33:57.6480000+02:00","stream":"Beta"},{"version":"2020.1.11f1","releaseDate":"2020-10-28T13:19:45.3420000+02:00","stream":"LTS"},{"version":"2020.2.0b8","releaseDate":"2020-10-22T18:53:30.1610000+03:00","stream":"Beta"},{"version":"2021.1.0a2","releaseDate":"2020-10-22T13:37:27.7270000+03:00","stream":"Alpha"},{"version":"2019.4.13f1","releaseDate":"2020-10-21T17:49:14.4000000+03:00","stream":"LTS"},{"version":"2020.1.10f1","releaseDate":"2020-10-21T12:46:16.1030000+03:00","stream":"LTS"},{"version":"2020.2.0b7","releaseDate":"2020-10-15T23:12:00.7850000+03:00","stream":"Beta"},{"version":"2020.1.9f1","releaseDate":"2020-10-13T20:07:55.6420000+03:00","stream":"LTS"},{"version":"2020.2.0b6","releaseDate":"2020-10-08T20:11:41.8220000+03:00","stream":"Beta"},{"version":"2019.4.12f1","releaseDate":"2020-10-07T19:30:31.4100000+03:00","stream":"LTS"},{"version":"2020.1.8f1","releaseDate":"2020-10-06T13:51:55.4870000+03:00","stream":"LTS"},{"version":"2018.4.28f1","releaseDate":"2020-10-06T12:51:51.3680000+03:00","stream":"LTS"},{"version":"2020.2.0b5","releaseDate":"2020-10-01T20:28:10.4460000+03:00","stream":"Beta"},{"version":"2020.1.7f1","releaseDate":"2020-09-30T12:51:21.0060000+03:00","stream":"LTS"},{"version":"2020.2.0b4","releaseDate":"2020-09-28T18:04:05.0940000+03:00","stream":"Beta"},{"version":"2019.4.11f1","releaseDate":"2020-09-23T17:50:07.5230000+03:00","stream":"LTS"},{"version":"2020.1.6f1","releaseDate":"2020-09-16T13:37:08.4180000+03:00","stream":"LTS"},{"version":"2019.4.10f1","releaseDate":"2020-09-10T18:00:59.3550000+03:00","stream":"LTS"},{"version":"2020.1.5f1","releaseDate":"2020-09-10T15:29:36.7490000+03:00","stream":"LTS"},{"version":"2020.2.0b2","releaseDate":"2020-09-09T20:06:38.9020000+03:00","stream":"Beta"},{"version":"2018.4.27f1","releaseDate":"2020-09-09T12:04:26.6260000+03:00","stream":"LTS"},{"version":"2020.2.0b1","releaseDate":"2020-09-03T06:50:06.9580000+03:00","stream":"Beta"},{"version":"2020.1.4f1","releaseDate":"2020-08-27T16:54:15.2610000+03:00","stream":"LTS"},{"version":"2019.4.9f1","releaseDate":"2020-08-26T18:12:20.1780000+03:00","stream":"LTS"},{"version":"2020.1.3f1","releaseDate":"2020-08-21T20:25:52.4300000+03:00","stream":"LTS"},{"version":"2020.2.0a21","releaseDate":"2020-08-20T19:08:48.0150000+03:00","stream":"Alpha"},{"version":"2019.4.8f1","releaseDate":"2020-08-12T16:18:43.9270000+03:00","stream":"LTS"},{"version":"2018.4.26f1","releaseDate":"2020-08-12T14:59:47.8120000+03:00","stream":"LTS"},{"version":"2020.1.2f1","releaseDate":"2020-08-12T14:11:53.6620000+03:00","stream":"LTS"},{"version":"2019.4.7f1","releaseDate":"2020-08-05T18:02:13.5720000+03:00","stream":"LTS"},{"version":"2020.1.1f1","releaseDate":"2020-08-05T12:04:55.1630000+03:00","stream":"LTS"},{"version":"2019.4.6f1","releaseDate":"2020-07-30T23:31:02.8270000+03:00","stream":"LTS"},{"version":"2020.2.0a19","releaseDate":"2020-07-28T20:12:37.1260000+03:00","stream":"Alpha"},{"version":"2019.4.5f1","releaseDate":"2020-07-23T11:08:58.2940000+03:00","stream":"LTS"},{"version":"2020.1.0f1","releaseDate":"2020-07-20T13:15:38.9490000+03:00","stream":"LTS"},{"version":"2020.2.0a18","releaseDate":"2020-07-15T18:09:32.2040000+03:00","stream":"Alpha"},{"version":"2019.4.4f1","releaseDate":"2020-07-15T17:33:21.3420000+03:00","stream":"LTS"},{"version":"2018.4.25f1","releaseDate":"2020-07-14T18:59:51.1720000+03:00","stream":"LTS"},{"version":"2020.1.0b16","releaseDate":"2020-07-14T14:16:19.7360000+03:00","stream":"Beta"},{"version":"2019.4.3f1","releaseDate":"2020-07-08T20:17:30.7430000+03:00","stream":"LTS"},{"version":"2020.1.0b15","releaseDate":"2020-07-08T16:16:36.1440000+03:00","stream":"Beta"},{"version":"2020.2.0a17","releaseDate":"2020-07-07T20:13:29.0870000+03:00","stream":"Alpha"},{"version":"2018.4.24f1","releaseDate":"2020-07-02T15:50:59.9690000+03:00","stream":"LTS"},{"version":"2019.4.2f1","releaseDate":"2020-07-01T17:31:49.6530000+03:00","stream":"LTS"},{"version":"2020.2.0a16","releaseDate":"2020-06-30T20:30:06.4050000+03:00","stream":"Alpha"},{"version":"2020.1.0b14","releaseDate":"2020-06-30T16:03:30.1650000+03:00","stream":"Beta"},{"version":"2019.4.1f1","releaseDate":"2020-06-18T17:26:11.2500000+03:00","stream":"LTS"},{"version":"2020.2.0a15","releaseDate":"2020-06-17T01:26:34.6240000+03:00","stream":"Alpha"},{"version":"2020.1.0b13","releaseDate":"2020-06-16T18:13:24.1630000+03:00","stream":"Beta"},{"version":"2020.1.0b12","releaseDate":"2020-06-09T18:59:47.8410000+03:00","stream":"Beta"},{"version":"2019.4.0f1","releaseDate":"2020-06-07T19:09:39.2440000+03:00","stream":"LTS"},{"version":"2020.1.0b11","releaseDate":"2020-06-03T11:04:41.2780000+03:00","stream":"Beta"},{"version":"2020.2.0a13","releaseDate":"2020-06-02T21:22:41.6660000+03:00","stream":"Alpha"},{"version":"2019.3.15f1","releaseDate":"2020-05-28T18:28:05.9350000+03:00","stream":"LTS"},{"version":"2020.1.0b10","releaseDate":"2020-05-27T18:18:15.7610000+03:00","stream":"Beta"},{"version":"2020.2.0a12","releaseDate":"2020-05-27T04:46:13.7030000+03:00","stream":"Alpha"},{"version":"2020.1.0b9","releaseDate":"2020-05-18T22:30:07.6160000+03:00","stream":"Beta"},{"version":"2019.3.14f1","releaseDate":"2020-05-18T22:09:15.4130000+03:00","stream":"LTS"},{"version":"2020.2.0a11","releaseDate":"2020-05-18T20:28:51.3580000+03:00","stream":"Alpha"},{"version":"2018.4.23f1","releaseDate":"2020-05-18T19:26:44.5050000+03:00","stream":"LTS"},{"version":"2017.4.40f1","releaseDate":"2020-05-18T18:54:47.5130000+03:00","stream":"LTS"},{"version":"2019.3.13f1","releaseDate":"2020-05-06T19:28:06.4310000+03:00","stream":"LTS"},{"version":"2020.2.0a10","releaseDate":"2020-05-06T17:34:37.9180000+03:00","stream":"Alpha"},{"version":"2020.1.0b8","releaseDate":"2020-05-05T19:50:03.1040000+03:00","stream":"Beta"},{"version":"2019.3.12f1","releaseDate":"2020-04-29T20:04:13.3180000+03:00","stream":"LTS"},{"version":"2020.2.0a9","releaseDate":"2020-04-28T16:42:11.9750000+03:00","stream":"Alpha"},{"version":"2020.1.0b7","releaseDate":"2020-04-28T13:12:51.1350000+03:00","stream":"Beta"},{"version":"2018.4.22f1","releaseDate":"2020-04-24T14:56:23.0650000+03:00","stream":"LTS"},{"version":"2020.1.0b6","releaseDate":"2020-04-24T00:32:23.4180000+03:00","stream":"Beta"},{"version":"2020.2.0a8","releaseDate":"2020-04-23T23:39:25.3310000+03:00","stream":"Alpha"},{"version":"2019.3.11f1","releaseDate":"2020-04-23T23:12:30.9100000+03:00","stream":"LTS"},{"version":"2019.3.10f1","releaseDate":"2020-04-16T17:51:49.2210000+03:00","stream":"LTS"},{"version":"2020.2.0a7","releaseDate":"2020-04-14T17:50:07.5570000+03:00","stream":"Alpha"},{"version":"2018.4.21f1","releaseDate":"2020-04-09T13:24:27.7520000+03:00","stream":"LTS"},{"version":"2020.1.0b5","releaseDate":"2020-04-09T12:02:00.1780000+03:00","stream":"Beta"},{"version":"2019.3.9f1","releaseDate":"2020-04-08T20:27:11.2330000+03:00","stream":"LTS"},{"version":"2019.3.8f1","releaseDate":"2020-04-06T16:35:43.6360000+03:00","stream":"LTS"},{"version":"2017.4.39f1","releaseDate":"2020-04-03T11:51:34.4000000+03:00","stream":"LTS"},{"version":"2020.1.0b4","releaseDate":"2020-04-01T12:27:53.0680000+03:00","stream":"Beta"},{"version":"2019.3.7f1","releaseDate":"2020-03-26T15:25:09.7460000+02:00","stream":"LTS"},{"version":"2018.4.20f1","releaseDate":"2020-03-26T14:30:57.8620000+02:00","stream":"LTS"},{"version":"2020.1.0b3","releaseDate":"2020-03-26T10:40:28.9370000+02:00","stream":"Beta"},{"version":"2017.4.38f1","releaseDate":"2020-03-20T12:06:20.6150000+02:00","stream":"LTS"},{"version":"2019.3.6f1","releaseDate":"2020-03-19T15:48:25.4900000+02:00","stream":"LTS"},{"version":"2020.1.0b2","releaseDate":"2020-03-18T13:35:10.1890000+02:00","stream":"Beta"},{"version":"2018.4.19f1","releaseDate":"2020-03-13T12:43:07.0330000+02:00","stream":"LTS"},{"version":"2019.3.5f1","releaseDate":"2020-03-12T15:37:50.3680000+02:00","stream":"LTS"},{"version":"2020.1.0b1","releaseDate":"2020-03-11T14:36:55.5980000+02:00","stream":"Beta"},{"version":"2019.3.4f1","releaseDate":"2020-03-06T12:05:37.8940000+02:00","stream":"LTS"},{"version":"2020.1.0a25","releaseDate":"2020-02-27T14:18:33.9680000+02:00","stream":"Alpha"},{"version":"2018.4.18f1","releaseDate":"2020-02-27T13:32:09.7550000+02:00","stream":"LTS"},{"version":"2019.3.3f1","releaseDate":"2020-02-26T15:41:18.4700000+02:00","stream":"LTS"},{"version":"2020.1.0a24","releaseDate":"2020-02-21T12:47:26.5020000+02:00","stream":"Alpha"},{"version":"2019.3.2f1","releaseDate":"2020-02-19T18:29:42.6760000+02:00","stream":"LTS"},{"version":"2017.4.37f1","releaseDate":"2020-02-18T18:24:58.6090000+02:00","stream":"LTS"},{"version":"2020.1.0a23","releaseDate":"2020-02-12T17:20:34.1120000+02:00","stream":"Alpha"},{"version":"2019.3.1f1","releaseDate":"2020-02-12T15:41:59.0190000+02:00","stream":"LTS"},{"version":"2018.4.17f1","releaseDate":"2020-02-11T13:48:12.9240000+02:00","stream":"LTS"},{"version":"2019.2.21f1","releaseDate":"2020-02-08T01:29:05.9630000+02:00","stream":"LTS"},{"version":"2020.1.0a22","releaseDate":"2020-02-05T12:35:10.0980000+02:00","stream":"Alpha"},{"version":"2019.2.20f1","releaseDate":"2020-01-31T15:52:30.5640000+02:00","stream":"LTS"},{"version":"2020.1.0a21","releaseDate":"2020-01-30T13:45:07.1640000+02:00","stream":"Alpha"},{"version":"2018.4.16f1","releaseDate":"2020-01-27T16:58:33.6030000+02:00","stream":"LTS"},{"version":"2019.3.0f6","releaseDate":"2020-01-27T14:06:56.5750000+02:00","stream":"LTS"},{"version":"2020.1.0a20","releaseDate":"2020-01-23T12:37:53.2280000+02:00","stream":"Alpha"},{"version":"2019.2.19f1","releaseDate":"2020-01-22T21:01:38.0230000+02:00","stream":"LTS"},{"version":"2020.1.0a19","releaseDate":"2020-01-16T13:54:15.4740000+02:00","stream":"Alpha"},{"version":"2019.2.18f1","releaseDate":"2020-01-16T01:24:20.6510000+02:00","stream":"LTS"},{"version":"2019.3.0f5","releaseDate":"2020-01-13T19:38:10.2010000+02:00","stream":"LTS"},{"version":"2017.4.36f1","releaseDate":"2020-01-09T16:49:31.0200000+02:00","stream":"LTS"},{"version":"2018.4.15f1","releaseDate":"2020-01-09T16:09:30.0590000+02:00","stream":"LTS"},{"version":"2020.1.0a18","releaseDate":"2020-01-08T13:28:04.1620000+02:00","stream":"Alpha"},{"version":"2020.1.0a17","releaseDate":"2019-12-19T12:21:05.7530000+02:00","stream":"Alpha"},{"version":"2019.2.17f1","releaseDate":"2019-12-18T21:20:41.5950000+02:00","stream":"LTS"},{"version":"2019.2.16f1","releaseDate":"2019-12-13T20:41:32.6580000+02:00","stream":"LTS"},{"version":"2020.1.0a16","releaseDate":"2019-12-12T16:47:22.9460000+02:00","stream":"Alpha"},{"version":"2019.3.0f3","releaseDate":"2019-12-11T22:34:41.7010000+02:00","stream":"LTS"},{"version":"2018.4.14f1","releaseDate":"2019-12-10T13:15:45.5800000+02:00","stream":"LTS"},{"version":"2017.4.35f1","releaseDate":"2019-12-06T16:49:43.1000000+02:00","stream":"LTS"},{"version":"2020.1.0a15","releaseDate":"2019-12-06T12:23:44.0090000+02:00","stream":"Alpha"},{"version":"2019.2.15f1","releaseDate":"2019-12-04T21:50:05.0710000+02:00","stream":"LTS"},{"version":"2019.2.14f1","releaseDate":"2019-11-27T20:40:20.1350000+02:00","stream":"LTS"},{"version":"2019.3.0f1","releaseDate":"2019-11-27T18:46:18.6920000+02:00","stream":"LTS"},{"version":"2019.3.0b12","releaseDate":"2019-11-21T22:46:51.9600000+02:00","stream":"Beta"},{"version":"2020.1.0a14","releaseDate":"2019-11-21T19:18:32.5570000+02:00","stream":"Alpha"},{"version":"2018.4.13f1","releaseDate":"2019-11-21T17:42:03.5440000+02:00","stream":"LTS"},{"version":"2019.2.13f1","releaseDate":"2019-11-20T19:22:07.1550000+02:00","stream":"LTS"},{"version":"2020.1.0a13","releaseDate":"2019-11-15T14:47:40.5570000+02:00","stream":"Alpha"},{"version":"2019.3.0b11","releaseDate":"2019-11-14T23:50:47.1120000+02:00","stream":"Beta"},{"version":"2019.2.12f1","releaseDate":"2019-11-11T20:38:24.9000000+02:00","stream":"LTS"},{"version":"2020.1.0a12","releaseDate":"2019-11-08T12:46:31.2520000+02:00","stream":"Alpha"},{"version":"2019.3.0b10","releaseDate":"2019-11-06T19:42:42.1640000+02:00","stream":"Beta"},{"version":"2019.3.0b9","releaseDate":"2019-11-01T18:37:43.0620000+02:00","stream":"Beta"},{"version":"2019.2.11f1","releaseDate":"2019-11-01T14:01:07.4740000+02:00","stream":"LTS"},{"version":"2020.1.0a11","releaseDate":"2019-10-31T18:32:46.5520000+02:00","stream":"Alpha"},{"version":"2017.4.34f1","releaseDate":"2019-10-30T19:20:05.4810000+02:00","stream":"LTS"},{"version":"2018.4.12f1","releaseDate":"2019-10-28T13:35:32.8840000+02:00","stream":"LTS"},{"version":"2019.2.10f1","releaseDate":"2019-10-24T00:46:43.5750000+03:00","stream":"LTS"},{"version":"2019.3.0b8","releaseDate":"2019-10-23T20:20:42.4990000+03:00","stream":"Beta"},{"version":"2020.1.0a9","releaseDate":"2019-10-17T13:21:00.0530000+03:00","stream":"Alpha"},{"version":"2019.3.0b7","releaseDate":"2019-10-14T20:32:52.8980000+03:00","stream":"Beta"},{"version":"2019.2.9f1","releaseDate":"2019-10-11T21:05:30.4520000+03:00","stream":"LTS"},{"version":"2018.4.11f1","releaseDate":"2019-10-10T16:08:52.3110000+03:00","stream":"LTS"},{"version":"2020.1.0a8","releaseDate":"2019-10-10T12:24:32.0630000+03:00","stream":"Alpha"},{"version":"2017.4.33f1","releaseDate":"2019-10-07T11:27:32.7430000+03:00","stream":"LTS"},{"version":"2019.3.0b6","releaseDate":"2019-10-04T19:50:37.4470000+03:00","stream":"Beta"},{"version":"2019.2.8f1","releaseDate":"2019-10-04T01:11:03.8390000+03:00","stream":"LTS"},{"version":"2020.1.0a7","releaseDate":"2019-10-01T19:22:34.3760000+03:00","stream":"Alpha"},{"version":"2018.4.10f1","releaseDate":"2019-10-01T15:06:54.8160000+03:00","stream":"LTS"},{"version":"2019.2.7f2","releaseDate":"2019-09-30T21:04:28.7120000+03:00","stream":"LTS"},{"version":"2019.3.0b5","releaseDate":"2019-09-30T17:32:45.4310000+03:00","stream":"Beta"},{"version":"2020.1.0a5","releaseDate":"2019-09-25T17:28:57.7470000+03:00","stream":"Alpha"},{"version":"2019.3.0b4","releaseDate":"2019-09-20T18:43:52.3750000+03:00","stream":"Beta"},{"version":"2019.2.6f1","releaseDate":"2019-09-17T22:29:14.5200000+03:00","stream":"LTS"},{"version":"2018.4.9f1","releaseDate":"2019-09-13T15:05:02.2970000+03:00","stream":"LTS"},{"version":"2019.2.5f1","releaseDate":"2019-09-12T18:37:27.5480000+03:00","stream":"LTS"},{"version":"2019.3.0b3","releaseDate":"2019-09-10T19:31:30.3650000+03:00","stream":"Beta"},{"version":"2019.3.0b2","releaseDate":"2019-09-06T20:16:21.5300000+03:00","stream":"Beta"},{"version":"2020.1.0a3","releaseDate":"2019-09-05T18:08:44.2560000+03:00","stream":"Alpha"},{"version":"2019.2.4f1","releaseDate":"2019-09-05T17:17:26.6680000+03:00","stream":"LTS"},{"version":"2017.4.32f1","releaseDate":"2019-09-05T14:50:38.8620000+03:00","stream":"LTS"},{"version":"2018.4.8f1","releaseDate":"2019-08-30T12:24:35.8910000+03:00","stream":"LTS"},{"version":"2019.2.3f1","releaseDate":"2019-08-28T15:57:33.7170000+03:00","stream":"LTS"},{"version":"2019.3.0b1","releaseDate":"2019-08-26T18:03:03.4490000+03:00","stream":"Beta"},{"version":"2019.2.2f1","releaseDate":"2019-08-21T13:42:41.1150000+03:00","stream":"LTS"},{"version":"2018.4.7f1","releaseDate":"2019-08-19T13:07:37.5940000+03:00","stream":"LTS"},{"version":"2019.2.1f1","releaseDate":"2019-08-14T17:28:59.0190000+03:00","stream":"LTS"},{"version":"2019.3.0a12","releaseDate":"2019-08-13T17:24:35.2560000+03:00","stream":"Alpha"},{"version":"2018.4.6f1","releaseDate":"2019-08-08T12:30:29.8390000+03:00","stream":"LTS"},{"version":"2019.1.14f1","releaseDate":"2019-08-08T12:01:21.7260000+03:00","stream":"LTS"},{"version":"2017.4.31f1","releaseDate":"2019-08-02T13:02:34.0640000+03:00","stream":"LTS"},{"version":"2019.1.13f1","releaseDate":"2019-08-01T14:12:43.9510000+03:00","stream":"LTS"},{"version":"2019.3.0a11","releaseDate":"2019-07-31T21:32:46.9870000+03:00","stream":"Alpha"},{"version":"2019.2.0f1","releaseDate":"2019-07-29T13:48:07.1340000+03:00","stream":"LTS"},{"version":"2019.1.12f1","releaseDate":"2019-07-26T16:28:16.0830000+03:00","stream":"LTS"},{"version":"2018.4.5f1","releaseDate":"2019-07-26T14:33:58.8310000+03:00","stream":"LTS"},{"version":"2019.3.0a10","releaseDate":"2019-07-22T21:03:08.9830000+03:00","stream":"Alpha"},{"version":"2019.2.0b10","releaseDate":"2019-07-18T18:39:34.1320000+03:00","stream":"Beta"},{"version":"2019.1.11f1","releaseDate":"2019-07-18T15:29:11.3370000+03:00","stream":"LTS"},{"version":"2018.4.4f1","releaseDate":"2019-07-12T19:20:22.9020000+03:00","stream":"LTS"},{"version":"2019.1.10f1","releaseDate":"2019-07-12T18:54:54.0030000+03:00","stream":"LTS"},{"version":"2019.2.0b9","releaseDate":"2019-07-11T21:56:49.6310000+03:00","stream":"Beta"},{"version":"2017.4.30f1","releaseDate":"2019-07-05T17:27:47.0610000+03:00","stream":"LTS"},{"version":"2019.1.9f1","releaseDate":"2019-07-05T14:47:29.6410000+03:00","stream":"LTS"},{"version":"2019.3.0a8","releaseDate":"2019-07-03T20:30:44.9800000+03:00","stream":"Alpha"},{"version":"2018.4.3f1","releaseDate":"2019-06-28T16:03:41.3670000+03:00","stream":"LTS"},{"version":"2019.3.0a7","releaseDate":"2019-06-26T20:12:40.6830000+03:00","stream":"Alpha"},{"version":"2019.2.0b7","releaseDate":"2019-06-25T23:47:11.2540000+03:00","stream":"Beta"},{"version":"2019.1.8f1","releaseDate":"2019-06-22T11:48:33.7900000+03:00","stream":"LTS"},{"version":"2019.3.0a6","releaseDate":"2019-06-19T06:02:44.0090000+03:00","stream":"Alpha"},{"version":"2019.1.7f1","releaseDate":"2019-06-14T18:44:01.6130000+03:00","stream":"LTS"},{"version":"2019.2.0b6","releaseDate":"2019-06-12T12:40:00.7880000+03:00","stream":"Beta"},{"version":"2017.4.29f1","releaseDate":"2019-06-08T22:03:51.2520000+03:00","stream":"LTS"},{"version":"2018.4.2f1","releaseDate":"2019-06-08T21:07:32.0460000+03:00","stream":"LTS"},{"version":"2019.1.6f1","releaseDate":"2019-06-08T19:58:35.5350000+03:00","stream":"LTS"},{"version":"2019.3.0a5","releaseDate":"2019-06-06T15:22:57.5620000+03:00","stream":"Alpha"},{"version":"2019.2.0b5","releaseDate":"2019-06-05T17:32:16.2730000+03:00","stream":"Beta"},{"version":"2019.1.5f1","releaseDate":"2019-06-03T14:40:25.5010000+03:00","stream":"LTS"},{"version":"2017.4.28f1","releaseDate":"2019-05-30T20:27:14.6810000+03:00","stream":"LTS"},{"version":"2019.3.0a4","releaseDate":"2019-05-30T17:15:42.7070000+03:00","stream":"Alpha"},{"version":"2019.2.0b4","releaseDate":"2019-05-29T20:12:13.2450000+03:00","stream":"Beta"},{"version":"2018.4.1f1","releaseDate":"2019-05-28T19:24:03.8580000+03:00","stream":"LTS"},{"version":"2019.1.4f1","releaseDate":"2019-05-24T20:57:10.7780000+03:00","stream":"LTS"},{"version":"2019.2.0b3","releaseDate":"2019-05-22T17:03:19.4450000+03:00","stream":"Beta"},{"version":"2019.3.0a3","releaseDate":"2019-05-22T14:46:55.0550000+03:00","stream":"Alpha"},{"version":"2019.1.3f1","releaseDate":"2019-05-16T17:47:53.8260000+03:00","stream":"LTS"},{"version":"2019.2.0b2","releaseDate":"2019-05-15T18:44:17.7590000+03:00","stream":"Beta"},{"version":"2019.3.0a2","releaseDate":"2019-05-10T23:36:39.2540000+03:00","stream":"Alpha"},{"version":"2019.1.2f1","releaseDate":"2019-05-10T18:59:18.5200000+03:00","stream":"LTS"},{"version":"2017.4.27f1","releaseDate":"2019-05-10T16:21:41.1350000+03:00","stream":"LTS"},{"version":"2018.4.0f1","releaseDate":"2019-05-10T14:43:31.4210000+03:00","stream":"LTS"},{"version":"2019.2.0b1","releaseDate":"2019-05-09T12:44:58.3510000+03:00","stream":"Beta"},{"version":"2019.1.1f1","releaseDate":"2019-05-03T17:43:43.5970000+03:00","stream":"LTS"},{"version":"2019.2.0a14","releaseDate":"2019-05-01T20:59:12.6880000+03:00","stream":"Alpha"},{"version":"2018.3.14f1","releaseDate":"2019-04-26T14:50:27.0450000+03:00","stream":"LTS"},{"version":"2019.2.0a13","releaseDate":"2019-04-24T20:50:21.0670000+03:00","stream":"Alpha"},{"version":"2017.4.26f1","releaseDate":"2019-04-23T12:36:49.5910000+03:00","stream":"LTS"},{"version":"2018.3.13f1","releaseDate":"2019-04-18T12:14:47.6950000+03:00","stream":"LTS"},{"version":"2019.1.0f2","releaseDate":"2019-04-15T16:28:01.4440000+03:00","stream":"LTS"},{"version":"2019.2.0a11","releaseDate":"2019-04-11T19:48:43.1840000+03:00","stream":"Alpha"},{"version":"2019.1.0f1","releaseDate":"2019-04-08T21:51:36.4080000+03:00","stream":"LTS"},{"version":"2018.3.12f1","releaseDate":"2019-04-08T17:36:53.3460000+03:00","stream":"LTS"},{"version":"2017.4.25f1","releaseDate":"2019-04-08T16:39:05.1910000+03:00","stream":"LTS"},{"version":"2019.1.0b10","releaseDate":"2019-04-03T17:15:22.3850000+03:00","stream":"Beta"},{"version":"2018.3.11f1","releaseDate":"2019-03-29T14:15:27.9350000+02:00","stream":"LTS"},{"version":"2019.1.0b9","releaseDate":"2019-03-26T18:57:04.8470000+02:00","stream":"Beta"},{"version":"2018.3.10f1","releaseDate":"2019-03-25T19:27:03.0350000+02:00","stream":"LTS"},{"version":"2017.4.24f1","releaseDate":"2019-03-22T11:39:13.6670000+02:00","stream":"LTS"},{"version":"2019.2.0a9","releaseDate":"2019-03-20T17:45:22.3090000+02:00","stream":"Alpha"},{"version":"2019.1.0b8","releaseDate":"2019-03-18T19:17:39.0930000+02:00","stream":"Beta"},{"version":"2018.3.9f1","releaseDate":"2019-03-18T14:14:09.6120000+02:00","stream":"LTS"},{"version":"2019.1.0b7","releaseDate":"2019-03-13T18:10:13.3900000+02:00","stream":"Beta"},{"version":"2019.2.0a8","releaseDate":"2019-03-13T16:22:24.9240000+02:00","stream":"Alpha"},{"version":"2017.4.23f1","releaseDate":"2019-03-08T19:28:16.4670000+02:00","stream":"LTS"},{"version":"2019.1.0b6","releaseDate":"2019-03-08T18:41:08.1330000+02:00","stream":"Beta"},{"version":"2018.3.8f1","releaseDate":"2019-03-08T18:15:08.8060000+02:00","stream":"LTS"},{"version":"2019.2.0a7","releaseDate":"2019-03-04T15:52:19.7100000+02:00","stream":"Alpha"},{"version":"2019.1.0b5","releaseDate":"2019-03-01T18:44:15.4080000+02:00","stream":"Beta"},{"version":"5.6.7f1","releaseDate":"2019-02-28T20:35:23.8950000+02:00","stream":"LTS"},{"version":"2018.2.21f1","releaseDate":"2019-02-28T19:57:55.3450000+02:00","stream":"LTS"},{"version":"2017.4.22f1","releaseDate":"2019-02-28T19:01:39.7560000+02:00","stream":"LTS"},{"version":"2018.3.7f1","releaseDate":"2019-02-28T18:07:09.1890000+02:00","stream":"LTS"},{"version":"2019.2.0a6","releaseDate":"2019-02-27T09:50:11.0870000+02:00","stream":"Alpha"},{"version":"2017.4.21f1","releaseDate":"2019-02-21T17:15:49.2140000+02:00","stream":"LTS"},{"version":"2019.1.0b4","releaseDate":"2019-02-19T18:30:33.2540000+02:00","stream":"Beta"},{"version":"2018.3.6f1","releaseDate":"2019-02-15T18:45:14.6840000+02:00","stream":"LTS"},{"version":"2019.1.0b3","releaseDate":"2019-02-11T17:22:34.4640000+02:00","stream":"Beta"},{"version":"2017.4.20f2","releaseDate":"2019-02-11T12:07:10.8110000+02:00","stream":"LTS"},{"version":"2018.3.5f1","releaseDate":"2019-02-08T17:27:29.3790000+02:00","stream":"LTS"},{"version":"2019.2.0a4","releaseDate":"2019-02-06T16:46:04.4100000+02:00","stream":"Alpha"},{"version":"2019.1.0b2","releaseDate":"2019-02-04T15:55:05.8000000+02:00","stream":"Beta"},{"version":"2018.3.4f1","releaseDate":"2019-02-01T18:49:54.5170000+02:00","stream":"LTS"},{"version":"2019.1.0b1","releaseDate":"2019-01-28T17:21:41.6220000+02:00","stream":"Beta"},{"version":"2017.4.19f1","releaseDate":"2019-01-28T16:49:20.9630000+02:00","stream":"LTS"},{"version":"2018.3.3f1","releaseDate":"2019-01-25T16:37:01.8620000+02:00","stream":"LTS"},{"version":"2018.3.2f1","releaseDate":"2019-01-17T11:18:26.5460000+02:00","stream":"LTS"},{"version":"2019.1.0a14","releaseDate":"2019-01-15T20:45:50.0540000+02:00","stream":"Alpha"},{"version":"2018.3.1f1","releaseDate":"2019-01-10T14:42:52.5380000+02:00","stream":"LTS"},{"version":"2017.4.18f1","releaseDate":"2019-01-10T13:37:33.9090000+02:00","stream":"LTS"},{"version":"2019.1.0a13","releaseDate":"2019-01-03T03:39:26.4790000+02:00","stream":"Alpha"},{"version":"2019.1.0a12","releaseDate":"2018-12-14T20:20:29.2790000+02:00","stream":"Alpha"},{"version":"2018.2.20f1","releaseDate":"2018-12-14T13:15:42.9470000+02:00","stream":"LTS"},{"version":"2018.3.0f2","releaseDate":"2018-12-12T14:02:30.5550000+02:00","stream":"LTS"},{"version":"2018.3.0f1","releaseDate":"2018-12-11T17:41:14.3820000+02:00","stream":"LTS"},{"version":"2017.2.5f1","releaseDate":"2018-12-07T20:04:37.5790000+02:00","stream":"LTS"},{"version":"2018.2.19f1","releaseDate":"2018-12-07T18:44:08.5920000+02:00","stream":"LTS"},{"version":"2017.4.17f1","releaseDate":"2018-12-07T17:51:37.3080000+02:00","stream":"LTS"},{"version":"2019.1.0a11","releaseDate":"2018-12-04T22:58:06.1280000+02:00","stream":"Alpha"},{"version":"2018.2.18f1","releaseDate":"2018-11-30T17:10:33.2730000+02:00","stream":"LTS"},{"version":"2018.3.0b12","releaseDate":"2018-11-28T14:03:56.2160000+02:00","stream":"Beta"},{"version":"2019.1.0a10","releaseDate":"2018-11-23T18:56:21.7430000+02:00","stream":"Alpha"},{"version":"2017.4.16f1","releaseDate":"2018-11-23T12:14:00.4550000+02:00","stream":"LTS"},{"version":"2018.2.17f1","releaseDate":"2018-11-21T17:28:51.6180000+02:00","stream":"LTS"},{"version":"2018.3.0b11","releaseDate":"2018-11-21T15:58:06.3430000+02:00","stream":"Beta"},{"version":"2017.2.4p1","releaseDate":"2018-11-16T12:22:37.6740000+02:00","stream":"Tech"},{"version":"2018.2.16f1","releaseDate":"2018-11-15T13:01:20.6050000+02:00","stream":"LTS"},{"version":"2019.1.0a9","releaseDate":"2018-11-14T18:08:29.5040000+02:00","stream":"Alpha"},{"version":"2018.3.0b10","releaseDate":"2018-11-14T15:35:56.4560000+02:00","stream":"Beta"},{"version":"2017.4.15f1","releaseDate":"2018-11-12T16:08:59.6070000+02:00","stream":"LTS"},{"version":"2018.2.15f1","releaseDate":"2018-11-09T12:10:19.0780000+02:00","stream":"LTS"},{"version":"2018.3.0b9","releaseDate":"2018-11-07T13:26:23.7790000+02:00","stream":"Beta"},{"version":"2019.1.0a8","releaseDate":"2018-11-07T01:07:14.7810000+02:00","stream":"Alpha"},{"version":"2019.1.0a7","releaseDate":"2018-10-31T18:36:10.7410000+02:00","stream":"Alpha"},{"version":"2018.3.0b8","releaseDate":"2018-10-31T12:43:25.5420000+02:00","stream":"Beta"},{"version":"2018.2.14f1","releaseDate":"2018-10-26T18:36:58.3850000+03:00","stream":"LTS"},{"version":"2017.4.14f1","releaseDate":"2018-10-26T14:46:14.9670000+03:00","stream":"LTS"},{"version":"2018.3.0b7","releaseDate":"2018-10-24T12:18:44.7430000+03:00","stream":"Beta"},{"version":"2018.2.13f1","releaseDate":"2018-10-18T13:04:17.7440000+03:00","stream":"LTS"},{"version":"2018.3.0b6","releaseDate":"2018-10-18T10:28:58.7650000+03:00","stream":"Beta"},{"version":"2018.2.12f1","releaseDate":"2018-10-12T17:40:28.9550000+03:00","stream":"LTS"},{"version":"2017.4.13f1","releaseDate":"2018-10-12T15:12:23.4990000+03:00","stream":"LTS"},{"version":"2018.3.0b5","releaseDate":"2018-10-10T11:17:14.4800000+03:00","stream":"Beta"},{"version":"2018.2.11f1","releaseDate":"2018-10-04T13:36:18.2630000+03:00","stream":"LTS"},{"version":"2018.3.0b4","releaseDate":"2018-10-03T14:09:35.4250000+03:00","stream":"Beta"},{"version":"2017.2.4f1","releaseDate":"2018-10-03T13:10:22.6970000+03:00","stream":"LTS"},{"version":"2017.4.12f1","releaseDate":"2018-09-27T13:54:38.6660000+03:00","stream":"LTS"},{"version":"2018.2.10f1","releaseDate":"2018-09-26T17:32:56.4460000+03:00","stream":"LTS"},{"version":"2018.3.0b3","releaseDate":"2018-09-26T16:21:30.9390000+03:00","stream":"Beta"},{"version":"2018.2.9f1","releaseDate":"2018-09-21T15:47:59.5780000+03:00","stream":"LTS"},{"version":"2018.3.0b2","releaseDate":"2018-09-20T12:44:45.6210000+03:00","stream":"Beta"},{"version":"2018.2.8f1","releaseDate":"2018-09-14T13:03:11.1630000+03:00","stream":"LTS"},{"version":"2017.4.11f1","releaseDate":"2018-09-13T12:35:24.1460000+03:00","stream":"LTS"},{"version":"2018.3.0b1","releaseDate":"2018-09-11T16:07:05.2700000+03:00","stream":"Beta"},{"version":"2018.2.7f1","releaseDate":"2018-09-06T19:34:51.1710000+03:00","stream":"LTS"},{"version":"2018.2.6f1","releaseDate":"2018-08-30T14:26:23.2890000+03:00","stream":"LTS"},{"version":"2017.2.3p4","releaseDate":"2018-08-29T16:24:14.6370000+03:00","stream":"Tech"},{"version":"2018.1.9f2","releaseDate":"2018-08-29T13:25:53.0360000+03:00","stream":"LTS"},{"version":"2017.4.10f1","releaseDate":"2018-08-24T16:44:21.5260000+03:00","stream":"LTS"},{"version":"2018.2.5f1","releaseDate":"2018-08-22T18:12:22.7900000+03:00","stream":"LTS"},{"version":"2018.2.4f1","releaseDate":"2018-08-17T17:17:08.6950000+03:00","stream":"LTS"},{"version":"2018.2.3f1","releaseDate":"2018-08-10T19:45:34.0780000+03:00","stream":"LTS"},{"version":"2017.4.9f1","releaseDate":"2018-08-10T17:27:28.1310000+03:00","stream":"LTS"},{"version":"2017.2.3p3","releaseDate":"2018-08-03T17:58:35.3170000+03:00","stream":"Tech"},{"version":"2018.2.2f1","releaseDate":"2018-08-03T16:32:08.8780000+03:00","stream":"LTS"},{"version":"2017.4.8f1","releaseDate":"2018-07-26T14:30:32.4430000+03:00","stream":"LTS"},{"version":"2018.2.1f1","releaseDate":"2018-07-26T13:43:51.5190000+03:00","stream":"LTS"},{"version":"2017.1.5f1","releaseDate":"2018-07-23T19:24:20.2750000+03:00","stream":"LTS"},{"version":"2018.1.8f1","releaseDate":"2018-07-13T16:52:59.7910000+03:00","stream":"LTS"},{"version":"2017.4.7f1","releaseDate":"2018-07-13T13:22:49.0920000+03:00","stream":"LTS"},{"version":"2018.2.0f2","releaseDate":"2018-07-09T19:46:12.1340000+03:00","stream":"LTS"},{"version":"2018.2.0f1","releaseDate":"2018-07-06T18:20:59.9000000+03:00","stream":"LTS"},{"version":"2017.2.3p2","releaseDate":"2018-07-05T17:38:35.9270000+03:00","stream":"Tech"},{"version":"2018.1.7f1","releaseDate":"2018-07-05T17:17:37.5460000+03:00","stream":"LTS"},{"version":"2018.2.0b11","releaseDate":"2018-07-03T16:34:59.1560000+03:00","stream":"Beta"},{"version":"2018.2.0b10","releaseDate":"2018-06-26T16:53:45.0430000+03:00","stream":"Beta"},{"version":"2017.4.6f1","releaseDate":"2018-06-22T11:23:54.2190000+03:00","stream":"LTS"},{"version":"2018.1.6f1","releaseDate":"2018-06-21T18:02:57.3560000+03:00","stream":"LTS"},{"version":"2017.1.4p2","releaseDate":"2018-06-20T12:46:38.0700000+03:00","stream":"Tech"},{"version":"2018.2.0b9","releaseDate":"2018-06-19T16:54:09.0660000+03:00","stream":"Beta"},{"version":"2018.1.5f1","releaseDate":"2018-06-15T15:35:07.6220000+03:00","stream":"LTS"},{"version":"2018.2.0b8","releaseDate":"2018-06-13T16:54:30.1710000+03:00","stream":"Beta"},{"version":"2017.1.4p1","releaseDate":"2018-06-13T16:31:38.3930000+03:00","stream":"Tech"},{"version":"2018.1.4f1","releaseDate":"2018-06-11T17:59:27.4260000+03:00","stream":"LTS"},{"version":"2017.4.5f1","releaseDate":"2018-06-07T12:24:13.1100000+03:00","stream":"LTS"},{"version":"2018.2.0b7","releaseDate":"2018-06-06T20:13:56.2500000+03:00","stream":"Beta"},{"version":"2018.1.3f1","releaseDate":"2018-06-04T12:52:38.3090000+03:00","stream":"LTS"},{"version":"2017.2.3p1","releaseDate":"2018-05-31T13:04:31.7460000+03:00","stream":"Tech"},{"version":"2018.2.0b6","releaseDate":"2018-05-29T17:49:22.1680000+03:00","stream":"Beta"},{"version":"2018.1.2f1","releaseDate":"2018-05-25T18:39:42.9360000+03:00","stream":"LTS"},{"version":"2018.2.0b5","releaseDate":"2018-05-24T10:21:44.1020000+03:00","stream":"Beta"},{"version":"2017.1.4f1","releaseDate":"2018-05-23T18:53:36.9910000+03:00","stream":"LTS"},{"version":"2017.4.4f1","releaseDate":"2018-05-23T18:20:18.8730000+03:00","stream":"LTS"},{"version":"2017.2.3f1","releaseDate":"2018-05-18T16:26:34.7630000+03:00","stream":"LTS"},{"version":"2018.1.1f1","releaseDate":"2018-05-18T12:56:06.0720000+03:00","stream":"LTS"},{"version":"2018.2.0b4","releaseDate":"2018-05-11T22:14:37.6770000+03:00","stream":"Beta"},{"version":"2017.4.3f1","releaseDate":"2018-05-11T17:44:04.8180000+03:00","stream":"LTS"},{"version":"5.6.6f2","releaseDate":"2018-05-08T12:03:55.4790000+03:00","stream":"LTS"},{"version":"2017.1.3p4","releaseDate":"2018-05-06T13:03:23.7480000+03:00","stream":"Tech"},{"version":"2018.2.0b3","releaseDate":"2018-05-04T03:29:00.7830000+03:00","stream":"Beta"},{"version":"2018.1.0f2","releaseDate":"2018-05-02T12:32:53.1810000+03:00","stream":"LTS"},{"version":"2017.4.2f2","releaseDate":"2018-04-30T12:57:20.7740000+03:00","stream":"LTS"},{"version":"2017.2.2p4","releaseDate":"2018-04-27T11:09:34.6590000+03:00","stream":"Tech"},{"version":"2018.1.0f1","releaseDate":"2018-04-26T17:34:43.9320000+03:00","stream":"LTS"},{"version":"2018.2.0b2","releaseDate":"2018-04-25T18:46:41.7020000+03:00","stream":"Beta"},{"version":"2018.2.0b1","releaseDate":"2018-04-18T04:14:08.2100000+03:00","stream":"Beta"},{"version":"2017.4.1f1","releaseDate":"2018-04-12T15:46:45.4370000+03:00","stream":"LTS"},{"version":"5.6.5p4","releaseDate":"2018-04-12T13:47:59.7170000+03:00","stream":"Tech"},{"version":"2017.1.3p3","releaseDate":"2018-04-06T13:32:38.6350000+03:00","stream":"Tech"},{"version":"2017.2.2p3","releaseDate":"2018-04-05T13:16:10.2630000+03:00","stream":"Tech"},{"version":"2018.1.0b13","releaseDate":"2018-03-30T13:12:24.9220000+03:00","stream":"Beta"},{"version":"2017.2.2p2","releaseDate":"2018-03-23T15:33:23.0760000+02:00","stream":"Tech"},{"version":"2018.1.0b12","releaseDate":"2018-03-23T10:03:45.3420000+02:00","stream":"Beta"},{"version":"2017.4.0f1","releaseDate":"2018-03-19T13:40:15.8330000+02:00","stream":"LTS"},{"version":"2018.1.0b11","releaseDate":"2018-03-16T15:01:57.6520000+02:00","stream":"Beta"},{"version":"5.6.5p3","releaseDate":"2018-03-16T11:45:19.3630000+02:00","stream":"Tech"},{"version":"2017.3.1p4","releaseDate":"2018-03-13T13:06:06.2160000+02:00","stream":"Tech"},{"version":"2017.2.2p1","releaseDate":"2018-03-09T17:01:16.6870000+02:00","stream":"Tech"},{"version":"2018.1.0b10","releaseDate":"2018-03-08T17:30:14.4980000+02:00","stream":"Beta"},{"version":"2017.3.1p3","releaseDate":"2018-03-06T15:00:52.2380000+02:00","stream":"Tech"},{"version":"2017.1.3p2","releaseDate":"2018-03-02T13:14:31.1230000+02:00","stream":"Tech"},{"version":"2018.1.0b9","releaseDate":"2018-02-27T22:03:39.0920000+02:00","stream":"Beta"},{"version":"2017.3.1p2","releaseDate":"2018-02-26T13:20:31.2290000+02:00","stream":"Tech"},{"version":"2017.2.2f1","releaseDate":"2018-02-26T12:56:15.2980000+02:00","stream":"LTS"},{"version":"2018.1.0b8","releaseDate":"2018-02-21T01:19:54.4560000+02:00","stream":"Beta"},{"version":"5.6.5p2","releaseDate":"2018-02-15T12:54:22.5920000+02:00","stream":"Tech"},{"version":"2017.3.1p1","releaseDate":"2018-02-14T18:32:07.5630000+02:00","stream":"Tech"},{"version":"2018.1.0b7","releaseDate":"2018-02-14T13:12:33.8400000+02:00","stream":"Beta"},{"version":"2017.2.1p4","releaseDate":"2018-02-12T15:46:02.9250000+02:00","stream":"Tech"},{"version":"2018.1.0b6","releaseDate":"2018-02-08T01:26:06.8280000+02:00","stream":"Beta"},{"version":"2017.3.1f1","releaseDate":"2018-02-05T17:31:22.3830000+02:00","stream":"LTS"},{"version":"2017.1.3p1","releaseDate":"2018-02-02T18:03:25.9430000+02:00","stream":"Tech"},{"version":"2018.1.0b5","releaseDate":"2018-01-31T14:56:51.0850000+02:00","stream":"Beta"},{"version":"2017.2.1p3","releaseDate":"2018-01-30T18:14:38.4790000+02:00","stream":"Tech"},{"version":"2017.3.0p4","releaseDate":"2018-01-29T14:43:13.4400000+02:00","stream":"Tech"},{"version":"2018.1.0b4","releaseDate":"2018-01-22T21:10:28.0890000+02:00","stream":"Beta"},{"version":"5.6.5p1","releaseDate":"2018-01-22T12:15:55.2200000+02:00","stream":"Tech"},{"version":"2017.3.0p3","releaseDate":"2018-01-18T18:39:06.6310000+02:00","stream":"Tech"},{"version":"2018.1.0b3","releaseDate":"2018-01-17T14:06:15.8980000+02:00","stream":"Beta"},{"version":"2017.3.0p2","releaseDate":"2018-01-12T20:16:05.8470000+02:00","stream":"Tech"},{"version":"5.5.6f1","releaseDate":"2018-01-12T19:52:32.0940000+02:00","stream":"LTS"},{"version":"2017.2.1p2","releaseDate":"2018-01-12T12:39:16.7060000+02:00","stream":"Tech"},{"version":"2018.1.0b2","releaseDate":"2018-01-09T17:44:00.8450000+02:00","stream":"Beta"},{"version":"2017.1.3f1","releaseDate":"2018-01-04T19:14:40.6550000+02:00","stream":"LTS"},{"version":"2017.3.0p1","releaseDate":"2017-12-22T13:42:56.1700000+02:00","stream":"Tech"},{"version":"5.6.5f1","releaseDate":"2017-12-21T13:08:15.3130000+02:00","stream":"LTS"},{"version":"2017.2.1p1","releaseDate":"2017-12-20T15:53:25.0250000+02:00","stream":"Tech"},{"version":"2017.3.0f3","releaseDate":"2017-12-18T18:24:06.3520000+02:00","stream":"LTS"},{"version":"2017.2.1f1","releaseDate":"2017-12-11T17:44:05.8030000+02:00","stream":"LTS"},{"version":"2017.3.0f2","releaseDate":"2017-12-08T18:45:52.2440000+02:00","stream":"LTS"},{"version":"2017.1.2p4","releaseDate":"2017-12-08T17:51:33.8740000+02:00","stream":"Tech"},{"version":"5.6.4p4","releaseDate":"2017-12-07T14:26:50.5400000+02:00","stream":"Tech"},{"version":"2017.2.0p4","releaseDate":"2017-12-04T12:45:02.9910000+02:00","stream":"Tech"},{"version":"2017.3.0f1","releaseDate":"2017-12-01T20:31:55.9230000+02:00","stream":"LTS"},{"version":"5.5.5p2","releaseDate":"2017-11-28T18:57:54.6100000+02:00","stream":"Tech"},{"version":"2017.3.0b11","releaseDate":"2017-11-28T17:29:29.2860000+02:00","stream":"Beta"},{"version":"2017.2.0p3","releaseDate":"2017-11-27T15:27:46.2180000+02:00","stream":"Tech"},{"version":"2017.1.2p3","releaseDate":"2017-11-21T17:57:28.2100000+02:00","stream":"Tech"},{"version":"2017.3.0b10","releaseDate":"2017-11-20T17:18:14.5740000+02:00","stream":"Beta"},{"version":"5.6.4p3","releaseDate":"2017-11-20T15:49:56.7630000+02:00","stream":"Tech"},{"version":"2017.2.0p2","releaseDate":"2017-11-15T16:24:53.1850000+02:00","stream":"Tech"},{"version":"5.6.4p2","releaseDate":"2017-11-12T21:00:26.6870000+02:00","stream":"Tech"},{"version":"2017.3.0b9","releaseDate":"2017-11-10T19:33:11.8540000+02:00","stream":"Beta"},{"version":"2017.2.0p1","releaseDate":"2017-11-06T19:18:19.4960000+02:00","stream":"Tech"},{"version":"2017.3.0b8","releaseDate":"2017-11-03T17:21:00.7540000+02:00","stream":"Beta"},{"version":"2017.3.0b7","releaseDate":"2017-10-31T17:40:56.2350000+02:00","stream":"Beta"},{"version":"2017.1.2p2","releaseDate":"2017-10-27T14:03:41.0290000+03:00","stream":"Tech"},{"version":"2017.3.0b6","releaseDate":"2017-10-24T19:13:05.0440000+03:00","stream":"Beta"},{"version":"5.6.4p1","releaseDate":"2017-10-20T11:55:09.4280000+03:00","stream":"Tech"},{"version":"2017.3.0b5","releaseDate":"2017-10-17T17:14:21.2300000+03:00","stream":"Beta"},{"version":"5.6.4f1","releaseDate":"2017-10-16T00:45:41.6100000+03:00","stream":"LTS"},{"version":"5.5.5p1","releaseDate":"2017-10-13T18:41:22.6040000+03:00","stream":"Tech"},{"version":"2017.1.2p1","releaseDate":"2017-10-13T17:36:45.0300000+03:00","stream":"Tech"},{"version":"2017.2.0f3","releaseDate":"2017-10-11T20:12:25.4710000+03:00","stream":"LTS"},{"version":"2017.1.1p4","releaseDate":"2017-10-11T01:24:40.4590000+03:00","stream":"Tech"},{"version":"2017.3.0b4","releaseDate":"2017-10-10T18:09:12.8770000+03:00","stream":"Beta"},{"version":"2017.1.2f1","releaseDate":"2017-10-06T15:44:00.5700000+03:00","stream":"LTS"},{"version":"2017.3.0b3","releaseDate":"2017-10-05T17:33:00.3650000+03:00","stream":"Beta"},{"version":"5.5.5f1","releaseDate":"2017-10-03T21:12:06.1320000+03:00","stream":"LTS"},{"version":"2017.2.0f2","releaseDate":"2017-10-02T20:53:40.3960000+03:00","stream":"LTS"},{"version":"2017.3.0b2","releaseDate":"2017-09-26T17:46:30.1710000+03:00","stream":"Beta"},{"version":"2017.1.1p3","releaseDate":"2017-09-22T19:41:25.5110000+03:00","stream":"Tech"},{"version":"2017.2.0f1","releaseDate":"2017-09-22T18:33:23.3090000+03:00","stream":"LTS"},{"version":"5.6.3p4","releaseDate":"2017-09-22T16:54:29.4830000+03:00","stream":"Tech"},{"version":"2017.3.0b1","releaseDate":"2017-09-21T16:38:59.5970000+03:00","stream":"Beta"},{"version":"5.4.6f3","releaseDate":"2017-09-20T11:37:58.9140000+03:00","stream":"LTS"},{"version":"2017.1.1p2","releaseDate":"2017-09-15T13:24:31.5570000+03:00","stream":"Tech"},{"version":"5.5.4p5","releaseDate":"2017-09-14T17:25:05.9100000+03:00","stream":"Tech"},{"version":"2017.2.0b11","releaseDate":"2017-09-12T16:31:58.6150000+03:00","stream":"Beta"},{"version":"2017.1.1p1","releaseDate":"2017-09-08T19:32:50.0560000+03:00","stream":"Tech"},{"version":"5.6.3p3","releaseDate":"2017-09-08T16:29:05.0680000+03:00","stream":"Tech"},{"version":"2017.2.0b10","releaseDate":"2017-09-04T23:19:12.8220000+03:00","stream":"Beta"},{"version":"2017.1.1f1","releaseDate":"2017-09-04T14:34:13.9350000+03:00","stream":"LTS"},{"version":"5.6.3p2","releaseDate":"2017-09-01T19:44:02.7640000+03:00","stream":"Tech"},{"version":"5.5.4p4","releaseDate":"2017-08-31T20:24:23.0240000+03:00","stream":"Tech"},{"version":"2017.2.0b9","releaseDate":"2017-08-29T18:59:23.8640000+03:00","stream":"Beta"},{"version":"2017.1.0p5","releaseDate":"2017-08-25T14:26:12.4730000+03:00","stream":"Tech"},{"version":"2017.2.0b8","releaseDate":"2017-08-18T17:33:35.1850000+03:00","stream":"Beta"},{"version":"5.3.8p2","releaseDate":"2017-08-18T13:53:50.1590000+03:00","stream":"Tech"},{"version":"5.4.5p5","releaseDate":"2017-08-18T03:06:42.9010000+03:00","stream":"Tech"},{"version":"5.5.4p3","releaseDate":"2017-08-18T00:45:42.7300000+03:00","stream":"Tech"},{"version":"5.6.3p1","releaseDate":"2017-08-17T23:56:53.9060000+03:00","stream":"Tech"},{"version":"2017.1.0p4","releaseDate":"2017-08-17T10:16:35.4780000+03:00","stream":"Tech"},{"version":"2017.2.0b7","releaseDate":"2017-08-15T20:42:22.6120000+03:00","stream":"Beta"},{"version":"2017.1.0p3","releaseDate":"2017-08-11T17:09:22.9780000+03:00","stream":"Tech"},{"version":"2017.2.0b6","releaseDate":"2017-08-09T00:09:18.9660000+03:00","stream":"Beta"},{"version":"5.6.3f1","releaseDate":"2017-08-01T20:03:58.0440000+03:00","stream":"LTS"},{"version":"2017.2.0b5","releaseDate":"2017-08-01T12:24:10.5780000+03:00","stream":"Beta"},{"version":"2017.1.0p2","releaseDate":"2017-07-27T15:04:31.4330000+03:00","stream":"Tech"},{"version":"5.5.4p2","releaseDate":"2017-07-26T14:06:59.7850000+03:00","stream":"Tech"},{"version":"5.6.2p4","releaseDate":"2017-07-21T20:06:22.5790000+03:00","stream":"Tech"},{"version":"2017.1.0p1","releaseDate":"2017-07-21T19:18:52.6830000+03:00","stream":"Tech"},{"version":"2017.2.0b4","releaseDate":"2017-07-20T19:07:24.3140000+03:00","stream":"Beta"},{"version":"5.6.2p3","releaseDate":"2017-07-17T17:54:07.4300000+03:00","stream":"Tech"},{"version":"2017.2.0b3","releaseDate":"2017-07-14T16:58:24.2490000+03:00","stream":"Beta"},{"version":"2017.1.0f3","releaseDate":"2017-07-10T14:29:48.3440000+03:00","stream":"LTS"},{"version":"2017.2.0b2","releaseDate":"2017-07-06T17:42:46.1050000+03:00","stream":"Beta"},{"version":"5.6.2p2","releaseDate":"2017-07-06T15:05:04.2550000+03:00","stream":"Tech"},{"version":"2017.1.0f2","releaseDate":"2017-07-05T21:06:25.7100000+03:00","stream":"LTS"},{"version":"5.6.2p1","releaseDate":"2017-06-29T17:08:51.3150000+03:00","stream":"Tech"},{"version":"5.4.5p4","releaseDate":"2017-06-28T14:33:16.4010000+03:00","stream":"Tech"},{"version":"2017.1.0f1","releaseDate":"2017-06-26T21:35:00.1560000+03:00","stream":"LTS"},{"version":"5.5.4p1","releaseDate":"2017-06-22T17:02:21.4330000+03:00","stream":"Tech"},{"version":"5.6.2f1","releaseDate":"2017-06-21T16:10:00.3850000+03:00","stream":"LTS"},{"version":"2017.1.0b10","releaseDate":"2017-06-19T18:48:58.2720000+03:00","stream":"Beta"},{"version":"5.6.1p4","releaseDate":"2017-06-16T18:05:31.4130000+03:00","stream":"Tech"},{"version":"5.3.8f2","releaseDate":"2017-06-13T14:42:19.0780000+03:00","stream":"LTS"},{"version":"2017.1.0b9","releaseDate":"2017-06-09T22:19:53.7480000+03:00","stream":"Beta"},{"version":"5.4.5p3","releaseDate":"2017-06-09T22:08:09.9090000+03:00","stream":"Tech"},{"version":"5.6.1p3","releaseDate":"2017-06-09T20:34:47.4540000+03:00","stream":"Tech"},{"version":"5.5.4f1","releaseDate":"2017-06-06T19:31:53.0570000+03:00","stream":"LTS"},{"version":"2017.1.0b8","releaseDate":"2017-06-02T18:43:21.3940000+03:00","stream":"Beta"},{"version":"5.6.1p2","releaseDate":"2017-06-02T13:52:12.6100000+03:00","stream":"Tech"},{"version":"5.4.5p2","releaseDate":"2017-05-29T11:25:58.9590000+03:00","stream":"Tech"},{"version":"2017.1.0b7","releaseDate":"2017-05-26T19:22:45.2060000+03:00","stream":"Beta"},{"version":"5.5.3p4","releaseDate":"2017-05-24T19:03:02.5850000+03:00","stream":"Tech"},{"version":"2017.1.0b6","releaseDate":"2017-05-19T14:33:20.6370000+03:00","stream":"Beta"},{"version":"5.6.1p1","releaseDate":"2017-05-18T15:38:02.4330000+03:00","stream":"Tech"},{"version":"2017.1.0b5","releaseDate":"2017-05-11T15:55:57.6670000+03:00","stream":"Beta"},{"version":"5.6.1f1","releaseDate":"2017-05-11T13:42:26.0420000+03:00","stream":"LTS"},{"version":"5.5.3p3","releaseDate":"2017-05-10T18:53:39.6190000+03:00","stream":"Tech"},{"version":"2017.1.0b4","releaseDate":"2017-05-08T17:47:09.7280000+03:00","stream":"Beta"},{"version":"5.6.0p4","releaseDate":"2017-05-08T15:16:30.1560000+03:00","stream":"Tech"},{"version":"2017.1.0b3","releaseDate":"2017-05-03T16:29:05.2510000+03:00","stream":"Beta"},{"version":"5.6.0p3","releaseDate":"2017-04-27T22:02:39.4410000+03:00","stream":"Tech"},{"version":"2017.1.0b2","releaseDate":"2017-04-26T16:56:42.4410000+03:00","stream":"Beta"},{"version":"5.5.3p2","releaseDate":"2017-04-25T17:57:56.6830000+03:00","stream":"Tech"},{"version":"5.6.0p2","releaseDate":"2017-04-21T23:03:49.1450000+03:00","stream":"Tech"},{"version":"5.6.0p1","releaseDate":"2017-04-18T16:49:03.9820000+03:00","stream":"Tech"},{"version":"5.5.3p1","releaseDate":"2017-04-13T18:11:15.6120000+03:00","stream":"Tech"},{"version":"2017.1.0b1","releaseDate":"2017-04-11T17:05:40.0040000+03:00","stream":"Beta"},{"version":"5.6.0f3","releaseDate":"2017-03-31T18:00:22.4860000+03:00","stream":"LTS"},{"version":"5.5.3f1","releaseDate":"2017-03-31T13:51:39.1560000+03:00","stream":"LTS"},{"version":"5.4.5p1","releaseDate":"2017-03-30T17:45:22.1890000+03:00","stream":"Tech"},{"version":"5.6.0f2","releaseDate":"2017-03-27T19:28:45.6580000+03:00","stream":"LTS"},{"version":"5.5.2p4","releaseDate":"2017-03-23T12:35:50.2430000+02:00","stream":"Tech"},{"version":"5.5.2p3","releaseDate":"2017-03-17T20:58:40.1640000+02:00","stream":"Tech"},{"version":"5.6.0f1","releaseDate":"2017-03-17T18:41:48.6380000+02:00","stream":"LTS"},{"version":"5.4.5f1","releaseDate":"2017-03-10T16:21:03.7460000+02:00","stream":"LTS"},{"version":"5.6.0b11","releaseDate":"2017-03-08T19:05:35.2990000+02:00","stream":"Beta"},{"version":"5.5.2p2","releaseDate":"2017-03-08T18:29:03.3490000+02:00","stream":"Tech"},{"version":"5.5.2p1","releaseDate":"2017-03-03T14:06:12.3730000+02:00","stream":"Tech"},{"version":"5.6.0b10","releaseDate":"2017-03-02T19:57:00.6420000+02:00","stream":"Beta"},{"version":"5.4.4p4","releaseDate":"2017-03-01T13:11:30.9140000+02:00","stream":"Tech"},{"version":"5.5.2f1","releaseDate":"2017-02-24T11:54:27.4260000+02:00","stream":"LTS"},{"version":"5.5.1p4","releaseDate":"2017-02-17T18:08:36.9750000+02:00","stream":"Tech"},{"version":"5.6.0b9","releaseDate":"2017-02-17T16:41:26.8530000+02:00","stream":"Beta"},{"version":"5.6.0b8","releaseDate":"2017-02-13T17:54:50.1120000+02:00","stream":"Beta"},{"version":"5.5.1p3","releaseDate":"2017-02-09T14:22:29.2650000+02:00","stream":"Tech"},{"version":"5.4.4p3","releaseDate":"2017-02-08T19:25:47.9670000+02:00","stream":"Tech"},{"version":"5.3.7p4","releaseDate":"2017-02-07T19:01:05.9100000+02:00","stream":"Tech"},{"version":"5.6.0b7","releaseDate":"2017-02-07T17:05:04.8950000+02:00","stream":"Beta"},{"version":"5.5.1p2","releaseDate":"2017-02-03T15:27:39.9140000+02:00","stream":"Tech"},{"version":"5.6.0b6","releaseDate":"2017-02-01T17:38:41.3800000+02:00","stream":"Beta"},{"version":"5.5.1p1","releaseDate":"2017-02-01T16:22:21.4140000+02:00","stream":"Tech"},{"version":"5.6.0b5","releaseDate":"2017-01-26T11:26:16.7750000+02:00","stream":"Beta"},{"version":"5.4.4p2","releaseDate":"2017-01-25T17:10:44.2950000+02:00","stream":"Tech"},{"version":"5.5.1f1","releaseDate":"2017-01-24T12:32:21.5040000+02:00","stream":"LTS"},{"version":"5.6.0b4","releaseDate":"2017-01-17T22:17:27.6580000+02:00","stream":"Beta"},{"version":"5.4.4p1","releaseDate":"2017-01-13T18:46:40.7580000+02:00","stream":"Tech"},{"version":"5.5.0p4","releaseDate":"2017-01-11T18:18:53.9900000+02:00","stream":"Tech"},{"version":"5.4.4f1","releaseDate":"2017-01-05T17:53:15.0500000+02:00","stream":"LTS"},{"version":"5.5.0p3","releaseDate":"2017-01-05T11:04:18.8540000+02:00","stream":"Tech"},{"version":"5.6.0b3","releaseDate":"2016-12-23T19:38:00.2460000+02:00","stream":"Beta"},{"version":"5.3.7p3","releaseDate":"2016-12-21T18:13:38.5020000+02:00","stream":"Tech"},{"version":"5.6.0b2","releaseDate":"2016-12-20T15:32:52.8740000+02:00","stream":"Beta"},{"version":"5.5.0p2","releaseDate":"2016-12-16T22:23:56.1000000+02:00","stream":"Tech"},{"version":"5.4.3p4","releaseDate":"2016-12-16T15:59:43.9270000+02:00","stream":"Tech"},{"version":"5.6.0b1","releaseDate":"2016-12-13T12:35:25.7510000+02:00","stream":"Beta"},{"version":"5.4.3p3","releaseDate":"2016-12-07T18:18:47.8600000+02:00","stream":"Tech"},{"version":"5.5.0p1","releaseDate":"2016-12-07T17:25:41.5570000+02:00","stream":"Tech"},{"version":"5.4.3p2","releaseDate":"2016-12-01T15:54:47.9540000+02:00","stream":"Tech"},{"version":"5.5.0f3","releaseDate":"2016-11-30T13:49:48.4400000+02:00","stream":"LTS"},{"version":"5.3.7p2","releaseDate":"2016-11-28T18:06:22.4430000+02:00","stream":"Tech"},{"version":"5.4.3p1","releaseDate":"2016-11-28T12:09:25.4130000+02:00","stream":"Tech"},{"version":"5.5.0f2","releaseDate":"2016-11-25T12:16:50.2830000+02:00","stream":"LTS"},{"version":"5.5.0f1","releaseDate":"2016-11-22T18:14:01.1850000+02:00","stream":"LTS"},{"version":"5.4.3f1","releaseDate":"2016-11-17T14:51:02.0260000+02:00","stream":"LTS"},{"version":"5.3.7p1","releaseDate":"2016-11-11T17:32:03.0220000+02:00","stream":"Tech"},{"version":"5.5.0b11","releaseDate":"2016-11-09T20:04:57.2170000+02:00","stream":"Beta"},{"version":"5.5.0b10","releaseDate":"2016-11-09T17:40:05.1770000+02:00","stream":"Beta"},{"version":"5.4.2p4","releaseDate":"2016-11-09T14:35:14.5410000+02:00","stream":"Tech"},{"version":"5.3.7f1","releaseDate":"2016-11-08T15:22:26.8980000+02:00","stream":"LTS"},{"version":"5.4.2p3","releaseDate":"2016-11-02T17:35:46.0380000+02:00","stream":"Tech"},{"version":"5.4.2p2","releaseDate":"2016-10-28T15:33:11.6310000+03:00","stream":"Tech"},{"version":"5.4.2p1","releaseDate":"2016-10-24T18:58:28.0140000+03:00","stream":"Tech"},{"version":"5.5.0b9","releaseDate":"2016-10-24T18:06:57.1480000+03:00","stream":"Beta"},{"version":"5.3.6p8","releaseDate":"2016-10-24T17:31:38.0530000+03:00","stream":"Tech"},{"version":"5.4.2f2","releaseDate":"2016-10-21T12:41:39.1710000+03:00","stream":"LTS"},{"version":"5.5.0b8","releaseDate":"2016-10-20T16:10:07.3480000+03:00","stream":"Beta"},{"version":"5.5.0b7","releaseDate":"2016-10-11T17:19:07.1390000+03:00","stream":"Beta"},{"version":"5.3.6p7","releaseDate":"2016-10-07T15:14:33.7940000+03:00","stream":"Tech"},{"version":"5.4.1p4","releaseDate":"2016-10-05T19:04:22.6090000+03:00","stream":"Tech"},{"version":"5.5.0b6","releaseDate":"2016-10-03T19:33:15.7800000+03:00","stream":"Beta"},{"version":"5.4.1p3","releaseDate":"2016-09-28T17:50:34.1120000+03:00","stream":"Tech"},{"version":"5.5.0b5","releaseDate":"2016-09-27T11:31:35.7680000+03:00","stream":"Beta"},{"version":"5.3.6p6","releaseDate":"2016-09-23T13:03:44.0380000+03:00","stream":"Tech"},{"version":"5.4.1p2","releaseDate":"2016-09-22T21:37:12.2160000+03:00","stream":"Tech"},{"version":"5.5.0b4","releaseDate":"2016-09-19T18:28:43.2030000+03:00","stream":"Beta"},{"version":"5.3.6p5","releaseDate":"2016-09-16T10:03:24.6470000+03:00","stream":"Tech"},{"version":"5.4.1p1","releaseDate":"2016-09-15T14:18:34.2100000+03:00","stream":"Tech"},{"version":"5.5.0b3","releaseDate":"2016-09-12T16:01:26.0040000+03:00","stream":"Beta"},{"version":"5.4.1f1","releaseDate":"2016-09-07T14:02:30.4590000+03:00","stream":"LTS"},{"version":"5.5.0b2","releaseDate":"2016-09-05T17:30:09.8380000+03:00","stream":"Beta"},{"version":"5.3.6p4","releaseDate":"2016-09-02T17:39:02.8790000+03:00","stream":"Tech"},{"version":"5.4.0p4","releaseDate":"2016-08-31T18:12:19.9330000+03:00","stream":"Tech"},{"version":"5.5.0b1","releaseDate":"2016-08-30T01:26:28.1480000+03:00","stream":"Beta"},{"version":"5.4.0p3","releaseDate":"2016-08-25T19:23:33.9710000+03:00","stream":"Tech"},{"version":"5.3.6p3","releaseDate":"2016-08-23T18:52:41.7170000+03:00","stream":"Tech"},{"version":"5.4.0p2","releaseDate":"2016-08-18T18:13:53.4540000+03:00","stream":"Tech"},{"version":"5.4.0p1","releaseDate":"2016-08-11T19:41:23.0620000+03:00","stream":"Tech"},{"version":"5.3.6p2","releaseDate":"2016-08-03T16:49:58.6420000+03:00","stream":"Tech"},{"version":"5.4.0f3","releaseDate":"2016-07-27T18:33:32.0650000+03:00","stream":"LTS"},{"version":"5.3.6p1","releaseDate":"2016-07-27T16:49:40.4080000+03:00","stream":"Tech"},{"version":"5.4.0f2","releaseDate":"2016-07-21T17:37:50.4920000+03:00","stream":"LTS"},{"version":"5.3.6f1","releaseDate":"2016-07-20T12:42:16.5870000+03:00","stream":"LTS"},{"version":"5.4.0f1","releaseDate":"2016-07-14T17:14:28.9480000+03:00","stream":"LTS"},{"version":"5.3.5p8","releaseDate":"2016-07-13T15:31:43.9130000+03:00","stream":"Tech"},{"version":"5.4.0b25","releaseDate":"2016-07-11T17:27:32.5710000+03:00","stream":"Beta"},{"version":"5.3.5p7","releaseDate":"2016-07-08T12:46:28.2840000+03:00","stream":"Tech"},{"version":"5.4.0b24","releaseDate":"2016-07-01T18:47:18.2330000+03:00","stream":"Beta"},{"version":"5.3.5p6","releaseDate":"2016-06-29T19:20:44.0350000+03:00","stream":"Tech"},{"version":"5.4.0b23","releaseDate":"2016-06-28T14:35:44.6560000+03:00","stream":"Beta"},{"version":"5.4.0b22","releaseDate":"2016-06-20T12:50:01.9180000+03:00","stream":"Beta"},{"version":"5.3.5p5","releaseDate":"2016-06-20T11:56:54.1950000+03:00","stream":"Tech"},{"version":"5.3.5p4","releaseDate":"2016-06-20T11:17:44.2570000+03:00","stream":"Tech"},{"version":"5.3.5p3","releaseDate":"2016-06-10T12:28:48.9900000+03:00","stream":"Tech"},{"version":"5.4.0b21","releaseDate":"2016-06-09T13:10:18.5030000+03:00","stream":"Beta"},{"version":"5.1.5f1","releaseDate":"2016-06-06T14:04:12.1990000+03:00","stream":"LTS"},{"version":"5.3.5p2","releaseDate":"2016-06-03T17:52:11.1590000+03:00","stream":"Tech"},{"version":"5.4.0b20","releaseDate":"2016-06-03T16:53:41.3450000+03:00","stream":"Beta"},{"version":"5.2.5f1","releaseDate":"2016-06-01T14:51:51.5940000+03:00","stream":"LTS"},{"version":"5.3.5p1","releaseDate":"2016-05-31T10:40:56.6820000+03:00","stream":"Tech"},{"version":"5.4.0b19","releaseDate":"2016-05-25T12:23:12.8120000+03:00","stream":"Beta"},{"version":"5.4.0b18","releaseDate":"2016-05-19T18:44:13.0190000+03:00","stream":"Beta"},{"version":"5.3.5f1","releaseDate":"2016-05-19T18:29:29.7780000+03:00","stream":"LTS"},{"version":"5.3.4p6","releaseDate":"2016-05-06T18:28:15.3400000+03:00","stream":"Tech"},{"version":"5.4.0b17","releaseDate":"2016-05-04T01:24:49.7340000+03:00","stream":"Beta"},{"version":"5.3.4p5","releaseDate":"2016-04-27T18:20:06.9680000+03:00","stream":"Tech"},{"version":"5.4.0b16","releaseDate":"2016-04-27T14:25:25.9450000+03:00","stream":"Beta"},{"version":"5.3.4p4","releaseDate":"2016-04-20T13:50:41.9420000+03:00","stream":"Tech"},{"version":"5.4.0b15","releaseDate":"2016-04-18T13:10:26.2100000+03:00","stream":"Beta"},{"version":"5.3.4p3","releaseDate":"2016-04-13T13:24:45.5350000+03:00","stream":"Tech"},{"version":"5.4.0b14","releaseDate":"2016-04-11T14:55:25.2850000+03:00","stream":"Beta"},{"version":"5.3.4p2","releaseDate":"2016-04-08T16:41:06.6810000+03:00","stream":"Tech"},{"version":"5.4.0b13","releaseDate":"2016-04-04T12:27:37.0640000+03:00","stream":"Beta"},{"version":"5.4.0b12","releaseDate":"2016-03-29T19:39:18.7120000+03:00","stream":"Beta"},{"version":"5.3.4p1","releaseDate":"2016-03-24T00:30:26.0740000+02:00","stream":"Tech"},{"version":"5.4.0b11","releaseDate":"2016-03-21T13:52:03.7650000+02:00","stream":"Beta"},{"version":"5.4.0b10","releaseDate":"2016-03-15T15:45:23.9730000+02:00","stream":"Beta"},{"version":"5.3.4f1","releaseDate":"2016-03-15T15:33:58.4510000+02:00","stream":"LTS"},{"version":"5.3.3p3","releaseDate":"2016-03-14T19:48:02.2170000+02:00","stream":"Tech"},{"version":"5.4.0b9","releaseDate":"2016-03-08T12:03:52.2650000+02:00","stream":"Beta"},{"version":"5.3.3p2","releaseDate":"2016-03-04T18:05:49.8740000+02:00","stream":"Tech"},{"version":"5.4.0b8","releaseDate":"2016-03-02T14:14:56.5970000+02:00","stream":"Beta"},{"version":"5.3.3p1","releaseDate":"2016-02-24T18:53:39.5190000+02:00","stream":"Tech"},{"version":"5.3.3f1","releaseDate":"2016-02-23T14:53:03.4530000+02:00","stream":"LTS"},{"version":"5.4.0b7","releaseDate":"2016-02-22T16:29:51.4670000+02:00","stream":"Beta"},{"version":"5.3.2p4","releaseDate":"2016-02-20T21:48:43.6160000+02:00","stream":"Tech"},{"version":"5.4.0b6","releaseDate":"2016-02-15T18:11:52.0550000+02:00","stream":"Beta"},{"version":"5.3.2p3","releaseDate":"2016-02-12T11:22:27.9230000+02:00","stream":"Tech"},{"version":"5.4.0b5","releaseDate":"2016-02-09T18:00:54.0100000+02:00","stream":"Beta"},{"version":"5.3.2p2","releaseDate":"2016-02-03T20:16:50.7640000+02:00","stream":"Tech"},{"version":"5.4.0b4","releaseDate":"2016-01-30T16:05:07.6350000+02:00","stream":"Beta"},{"version":"5.3.2p1","releaseDate":"2016-01-28T18:05:44.7130000+02:00","stream":"Tech"},{"version":"5.3.2f1","releaseDate":"2016-01-27T17:27:25.9430000+02:00","stream":"LTS"},{"version":"5.3.1p4","releaseDate":"2016-01-23T14:12:30.0740000+02:00","stream":"Tech"},{"version":"5.4.0b3","releaseDate":"2016-01-22T19:00:02.9810000+02:00","stream":"Beta"},{"version":"5.4.0b2","releaseDate":"2016-01-15T13:09:43.6900000+02:00","stream":"Beta"},{"version":"5.3.1p3","releaseDate":"2016-01-14T19:48:48.7310000+02:00","stream":"Tech"},{"version":"5.4.0b1","releaseDate":"2016-01-13T00:10:16.2620000+02:00","stream":"Beta"},{"version":"5.3.1p2","releaseDate":"2016-01-08T14:16:04.4350000+02:00","stream":"Tech"},{"version":"5.3.1p1","releaseDate":"2016-01-08T14:10:16.3210000+02:00","stream":"Tech"},{"version":"5.3.1f1","releaseDate":"2015-12-18T16:23:10.2740000+02:00","stream":"LTS"},{"version":"5.2.4f1","releaseDate":"2015-12-15T18:37:45.1050000+02:00","stream":"LTS"},{"version":"5.2.3p3","releaseDate":"2015-12-10T12:23:24.9490000+02:00","stream":"Tech"},{"version":"5.3.0f4","releaseDate":"2015-12-08T00:12:35.0350000+02:00","stream":"LTS"},{"version":"5.2.3p2","releaseDate":"2015-12-03T14:16:45.5710000+02:00","stream":"Tech"},{"version":"5.2.3p1","releaseDate":"2015-11-27T17:42:46.6020000+02:00","stream":"Tech"},{"version":"5.3.0f2","releaseDate":"2015-11-23T17:08:26.3310000+02:00","stream":"LTS"},{"version":"5.2.3f1","releaseDate":"2015-11-19T12:38:36.6940000+02:00","stream":"LTS"},{"version":"5.2.2p4","releaseDate":"2015-11-18T13:12:41.1430000+02:00","stream":"Tech"},{"version":"5.3.0f1","releaseDate":"2015-11-14T17:28:15.8630000+02:00","stream":"LTS"},{"version":"5.2.2p3","releaseDate":"2015-11-10T18:44:28.0350000+02:00","stream":"Tech"},{"version":"5.3.0b6","releaseDate":"2015-11-09T17:44:01.7640000+02:00","stream":"Beta"},{"version":"5.3.0b5","releaseDate":"2015-11-02T19:19:46.6150000+02:00","stream":"Beta"},{"version":"5.2.2p2","releaseDate":"2015-10-30T18:26:48.9590000+02:00","stream":"Tech"},{"version":"5.2.2p1","releaseDate":"2015-10-24T20:00:34.5130000+03:00","stream":"Tech"},{"version":"5.3.0b4","releaseDate":"2015-10-23T15:11:59.0160000+03:00","stream":"Beta"},{"version":"5.2.2f1","releaseDate":"2015-10-21T16:11:59.7920000+03:00","stream":"LTS"},{"version":"5.3.0b3","releaseDate":"2015-10-16T23:48:22.9780000+03:00","stream":"Beta"},{"version":"5.2.1p4","releaseDate":"2015-10-15T09:00:51.3200000+03:00","stream":"Tech"},{"version":"5.3.0b2","releaseDate":"2015-10-10T16:11:44.6410000+03:00","stream":"Beta"},{"version":"5.2.1p3","releaseDate":"2015-10-09T17:49:17.0510000+03:00","stream":"Tech"},{"version":"5.1.4f1","releaseDate":"2015-10-06T11:17:42.7590000+03:00","stream":"LTS"},{"version":"5.3.0b1","releaseDate":"2015-10-02T22:38:07.8510000+03:00","stream":"Beta"},{"version":"5.2.1p2","releaseDate":"2015-10-01T16:15:11.2250000+03:00","stream":"Tech"},{"version":"5.2.1p1","releaseDate":"2015-09-25T16:13:16.8560000+03:00","stream":"Tech"},{"version":"5.2.1f1","releaseDate":"2015-09-22T15:24:32.4680000+03:00","stream":"LTS"},{"version":"5.2.0p1","releaseDate":"2015-09-18T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.1.3p3","releaseDate":"2015-09-11T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.1.3p2","releaseDate":"2015-09-04T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.2.0f3","releaseDate":"2015-09-03T12:33:57.1480000+03:00","stream":"LTS"},{"version":"5.1.3p1","releaseDate":"2015-08-27T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.1.3f1","releaseDate":"2015-08-24T12:50:04.1790000+03:00","stream":"LTS"},{"version":"5.2.0f2","releaseDate":"2015-08-21T18:46:49.9960000+03:00","stream":"LTS"},{"version":"5.2.0f1","releaseDate":"2015-08-16T18:50:39.4690000+03:00","stream":"LTS"},{"version":"5.2.0b6","releaseDate":"2015-08-07T22:27:28.2000000+03:00","stream":"Beta"},{"version":"5.1.2p3","releaseDate":"2015-08-06T18:11:03.9900000+03:00","stream":"Tech"},{"version":"5.2.0b5","releaseDate":"2015-07-31T13:58:16.6300000+03:00","stream":"Beta"},{"version":"5.1.2p2","releaseDate":"2015-07-30T19:04:41.2110000+03:00","stream":"Tech"},{"version":"5.2.0b4","releaseDate":"2015-07-23T18:55:44.2700000+03:00","stream":"Beta"},{"version":"5.1.2p1","releaseDate":"2015-07-23T18:20:51.9840000+03:00","stream":"Tech"},{"version":"5.2.0b3","releaseDate":"2015-07-17T22:58:20.5700000+03:00","stream":"Beta"},{"version":"5.1.2f1","releaseDate":"2015-07-16T11:54:11.0960000+03:00","stream":"LTS"},{"version":"5.2.0b2","releaseDate":"2015-07-10T21:37:49.5390000+03:00","stream":"Beta"},{"version":"5.1.1p4","releaseDate":"2015-07-10T12:08:40.1750000+03:00","stream":"Tech"},{"version":"5.0.4f1","releaseDate":"2015-07-06T15:10:34.2300000+03:00","stream":"LTS"},{"version":"5.1.1p3","releaseDate":"2015-07-03T19:18:12.6150000+03:00","stream":"Tech"},{"version":"5.2.0b1","releaseDate":"2015-07-01T19:26:20.9210000+03:00","stream":"Beta"},{"version":"5.1.1p2","releaseDate":"2015-06-26T00:27:14.0670000+03:00","stream":"Tech"},{"version":"5.0.3p3","releaseDate":"2015-06-24T18:55:13.6440000+03:00","stream":"Tech"},{"version":"5.1.1p1","releaseDate":"2015-06-23T18:05:55.5660000+03:00","stream":"Tech"},{"version":"5.1.1f1","releaseDate":"2015-06-18T13:20:02.2470000+03:00","stream":"LTS"},{"version":"5.0.3p2","releaseDate":"2015-06-18T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.1.0p1","releaseDate":"2015-06-12T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.3p1","releaseDate":"2015-06-11T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.3f2","releaseDate":"2015-06-09T18:36:46.8690000+03:00","stream":"LTS"},{"version":"5.1.0f3","releaseDate":"2015-06-04T00:31:28.2170000+03:00","stream":"LTS"},{"version":"5.0.2p4","releaseDate":"2015-06-03T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.2p3","releaseDate":"2015-05-28T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.2p2","releaseDate":"2015-05-20T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.2p1","releaseDate":"2015-05-15T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.2f1","releaseDate":"2015-05-13T17:05:42.7910000+03:00","stream":"LTS"},{"version":"5.0.1p4","releaseDate":"2015-05-08T13:25:56.9760000+03:00","stream":"Tech"},{"version":"5.0.1p3","releaseDate":"2015-04-29T03:00:00.0000000+03:00","stream":"Tech"},{"version":"5.0.1p2","releaseDate":"2015-04-24T17:14:44.9700000+03:00","stream":"Tech"},{"version":"5.0.1p1","releaseDate":"2015-04-16T11:21:07.0000000+03:00","stream":"Tech"},{"version":"5.0.1f1","releaseDate":"2015-03-31T19:55:08.3760000+03:00","stream":"LTS"},{"version":"5.0.0p3","releaseDate":"2015-03-26T14:03:56.0680000+02:00","stream":"Tech"},{"version":"5.0.0p2","releaseDate":"2015-03-20T18:38:49.5150000+02:00","stream":"Tech"},{"version":"5.0.0p1","releaseDate":"2015-03-16T17:20:13.6040000+02:00","stream":"Tech"},{"version":"5.0.0f4","releaseDate":"2015-02-25T17:49:05.8350000+02:00","stream":"LTS"}] \ No newline at end of file diff --git a/UnityLauncherPro/Tools.cs b/UnityLauncherPro/Tools.cs index d245847..2af5d63 100644 --- a/UnityLauncherPro/Tools.cs +++ b/UnityLauncherPro/Tools.cs @@ -18,7 +18,9 @@ using System.Windows.Input; using System.Windows.Media; using System.Windows.Threading; +using UnityLauncherPro.Data; using UnityLauncherPro.Helpers; +using UnityLauncherPro.Properties; namespace UnityLauncherPro { @@ -26,6 +28,8 @@ public static class Tools { const int SW_RESTORE = 9; + static readonly string initFileDefaultURL = "https://raw.githubusercontent.com/unitycoder/UnityInitializeProject/main/Assets/Editor/InitializeProject.cs"; + [DllImport("user32", CharSet = CharSet.Unicode)] static extern IntPtr FindWindow(string cls, string win); [DllImport("user32")] @@ -226,7 +230,7 @@ public static void AddProjectToHistory(string projectPath) } // NOTE holding alt key (when using alt+o) brings up unity project selector - public static Process LaunchProject(Project proj, DataGrid dataGridRef = null, bool useInitScript = false, bool upgrade = false) + public static Process LaunchProject(Project proj, DataGrid dataGridRef = null, bool useInitScript = false, bool upgrade = false, bool cloneFromTemplate = false) { if (proj == null) return null; @@ -274,6 +278,13 @@ public static Process LaunchProject(Project proj, DataGrid dataGridRef = null, b var unityExePath = GetUnityExePath(proj.Version); if (unityExePath == null) { + // if no editors installed, show message + if (MainWindow.unityInstallationsSource.Count == 0) + { + MessageBox.Show($"No Unity versions installed. Please run {MainWindow.appName} first to setup root folders.", MainWindow.appName, MessageBoxButton.OK, MessageBoxImage.Warning); + return null; + } + DisplayUpgradeDialog(proj, null, useInitScript); return null; } @@ -291,7 +302,7 @@ public static Process LaunchProject(Project proj, DataGrid dataGridRef = null, b var cmd = "\"" + unityExePath + "\""; newProcess.StartInfo.FileName = cmd; - var unitycommandlineparameters = " -projectPath " + "\"" + proj.Path + "\""; + string unitycommandlineparameters = (cloneFromTemplate ? " -createproject " : " -projectPath ") + "\"" + proj.Path + "\""; string customArguments = proj.Arguments; if (string.IsNullOrEmpty(customArguments) == false) @@ -401,45 +412,54 @@ static bool CheckCrashBackupScene(string projectPath) var recoveryFile = Path.Combine(projectPath, "Temp", "__Backupscenes", "0.backup"); if (File.Exists(recoveryFile)) { - var result = MessageBox.Show("Crash recovery scene found, do you want to MOVE it into Assets/_Recovery/-folder?", "UnityLauncherPro - Scene Recovery", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (result == MessageBoxResult.Yes) + if (Settings.Default.showRecoveredScenePopup) { - var restoreFolder = Path.Combine(projectPath, "Assets", "_Recovery"); - if (Directory.Exists(restoreFolder) == false) - { - Directory.CreateDirectory(restoreFolder); - } - if (Directory.Exists(restoreFolder) == true) + var result = MessageBox.Show("Crash recovery scene found, do you want to MOVE it into Assets/_Recovery/-folder?", "UnityLauncherPro - Scene Recovery", MessageBoxButton.YesNo, MessageBoxImage.Question); + if (result == MessageBoxResult.Yes) { - Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; - var uniqueFileName = "Recovered_Scene" + unixTimestamp + ".unity"; + var restoreFolder = Path.Combine(projectPath, "Assets", "_Recovery"); + if (Directory.Exists(restoreFolder) == false) + { + Directory.CreateDirectory(restoreFolder); + } - try + if (Directory.Exists(restoreFolder) == true) { - File.Move(recoveryFile, Path.Combine(restoreFolder, uniqueFileName)); - // remove folder, otherwise unity 6000.2 asks for recovery - Directory.Delete(Path.Combine(projectPath, "Temp", "__Backupscenes"), true); + Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; + var uniqueFileName = "Recovered_Scene" + unixTimestamp + ".unity"; + + try + { + File.Move(recoveryFile, Path.Combine(restoreFolder, uniqueFileName)); + // remove folder, otherwise unity 6000.2 asks for recovery + Directory.Delete(Path.Combine(projectPath, "Temp", "__Backupscenes"), true); - Console.WriteLine("moved file to " + uniqueFileName); + Console.WriteLine("moved file to " + uniqueFileName); + } + catch (IOException) + { + // if move failed, try copy + File.Copy(recoveryFile, Path.Combine(restoreFolder, uniqueFileName)); + Console.WriteLine("copied file"); + } + + Console.WriteLine("Recovered crashed scene into: " + restoreFolder); } - catch (IOException) + else { - // if move failed, try copy - File.Copy(recoveryFile, Path.Combine(restoreFolder, uniqueFileName)); - Console.WriteLine("copied file"); + Console.WriteLine("Error: Failed to create restore folder: " + restoreFolder); + cancelRunningUnity = true; } - - Console.WriteLine("Recovered crashed scene into: " + restoreFolder); } - else + else if (result == MessageBoxResult.Cancel) // dont do restore, but run Unity { - Console.WriteLine("Error: Failed to create restore folder: " + restoreFolder); cancelRunningUnity = true; } } - else if (result == MessageBoxResult.Cancel) // dont do restore, but run Unity + else { - cancelRunningUnity = true; + File.Delete(recoveryFile); + Directory.Delete(Path.GetDirectoryName(recoveryFile)); } } return cancelRunningUnity; @@ -747,7 +767,6 @@ public static async void DownloadAndInstall(string version) string unityHash = ParseHashCodeFromURL(downloadURL); exeURL = ParseDownloadURLFromWebpage(version, unityHash, false, true); } - } Console.WriteLine("download exeURL= (" + exeURL + ")"); @@ -773,6 +792,28 @@ public static async void DownloadAndInstall(string version) string outputVersionFolder = version.Split('.')[0] + "_" + version.Split('.')[1]; string targetPathArgs = " /D=" + lastRootFolder + outputVersionFolder; ; + // NOTE cannot enable same modules as the previously installed version, because it requires elevated permissions.. + // GetPlatformsForUnityVersion.. + //var previousVersion = Tools.FindNearestVersion(version, MainWindow.unityInstalledVersions.Keys.ToList(), true); + //if (previousVersion != null) + //{ + // string[] previousModules = GetPlatformsForUnityVersion(previousVersion); + // if (previousModules != null && previousModules.Length > 0) + // { + // // find registry Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Unity Technologies\Installer + // // then enable dword 1, for example key: "Select_Android", if my modules has "Android" etc. + + // foreach (var module in previousModules) + // { + // Console.WriteLine(previousVersion + " has modules: " + module); + // // 6000.0.66f2 has modules: Android + // // 6000.0.66f2 has modules: iOS + // // 6000.0.66f2 has modules: Win + // // 6000.0.66f2 has modules: Win64 + // } + // } + //} + // if user clicks NO to UAC, this fails (so added try-catch) try { @@ -780,19 +821,21 @@ public static async void DownloadAndInstall(string version) process.StartInfo.FileName = tempFile; process.StartInfo.Arguments = targetPathArgs; process.EnableRaisingEvents = true; - process.Exited += (sender, e) => DeleteTempFile(tempFile); + process.Exited += (sender, e) => InstallationCompleted(tempFile); process.Start(); } catch (Win32Exception ex) when (ex.NativeErrorCode == 1223) // ERROR_CANCELLED { // User declined the UAC prompt Console.WriteLine("User cancelled elevation (UAC)."); - DeleteTempFile(tempFile); + SetStatus("Installation cancelled by user."); + InstallationCompleted(tempFile); } catch (Exception ex) { Console.WriteLine("Failed to run exe: " + tempFile + " - " + ex.Message); - DeleteTempFile(tempFile); + SetStatus("Failed to run installer: " + ex.Message); + InstallationCompleted(tempFile); } // TODO refresh upgrade dialog after installer finished @@ -803,10 +846,10 @@ public static async void DownloadAndInstall(string version) //SetStatus("Error> Cannot find installer executable ... opening website instead"); var url = "https://unity3d.com/get-unity/download/archive"; Process.Start(url + "#installer-not-found---version-" + version); + SetStatus("Error> Cannot find installer executable for version " + version); } - } + } // DownloadAndInstall - static readonly string initFileDefaultURL = "https://raw.githubusercontent.com/unitycoder/UnityInitializeProject/main/Assets/Editor/InitializeProject.cs"; public static async Task DownloadInitScript(string currentInitScriptFullPath, string currentInitScriptLocationOrURL) { @@ -886,12 +929,19 @@ public static async Task DownloadInitScript(string currentInitScriptFullPath, st } } - static void DeleteTempFile(string path) + static void InstallationCompleted(string path) { if (File.Exists(path) == true) { - Console.WriteLine("DeleteTempFile: " + path); + // delete temp installer file File.Delete(path); + + // refresh installed versions list + mainWindow.Dispatcher.Invoke(() => + { + mainWindow.UpdateUnityInstallationsList(); + mainWindow.CallGetUnityUpdates(); + }); } } @@ -1285,7 +1335,7 @@ public static void DisplayUpgradeDialog(Project proj, MainWindow owner, bool use // get selected version to upgrade for Console.WriteLine("Upgrade to " + upgradeToVersion); - // inject new version for this item, TODO inject version to ProjectSettings file, so then no alert from unity wrong version dialog + // inject new version for this item proj.Version = upgradeToVersion; SaveProjectVersion(proj); var proc = LaunchProject(proj, dataGridRef: null, useInitScript: false, upgrade: true); @@ -1445,6 +1495,7 @@ public static void RemoveContextMenuRegistryAPKInstall(string contextRegRoot) /// reads .git/HEAD file from the project to get current branch name /// /// + /// /// public static string ReadGitBranchInfo(string projectPath, bool searchParentFolders) { @@ -1587,6 +1638,11 @@ public static string GetTargetPlatform(string projectPath) { var rawPlatformName = GetTargetPlatformRaw(projectPath); + return GetTargetPlatformFromRaw(rawPlatformName); + } + + public static string GetTargetPlatformFromRaw(string rawPlatformName) + { if (string.IsNullOrEmpty(rawPlatformName) == false && GetProjects.remapPlatformNames.ContainsKey(rawPlatformName)) { return GetProjects.remapPlatformNames[rawPlatformName]; @@ -1665,6 +1721,9 @@ public static void SetFocusToGrid(DataGrid targetGrid, int index = -1) DataGridRow row = (DataGridRow)targetGrid.ItemContainerGenerator.ContainerFromIndex(index); if (row == null) { + // clamp to max items + if (index >= targetGrid.Items.Count) index = targetGrid.Items.Count - 1; + targetGrid.ScrollIntoView(targetGrid.Items[index]); // Defer the focus once row is generated targetGrid.Dispatcher.InvokeAsync(() => @@ -1750,6 +1809,7 @@ public static Project FastCreateProject(string version, string baseFolder, strin // create folder CreateEmptyProjectFolder(newPath, version); + bool cloneFromTemplate = false; // unzip or copy template if (templateZipPath != null) { @@ -1757,9 +1817,11 @@ public static Project FastCreateProject(string version, string baseFolder, strin if (File.Exists(templateZipPath)) { + cloneFromTemplate = true; try { - TarLib.Tar.ExtractTarGz(templateZipPath, newPath); + // NOTE no need to extract, unity can handle it with -cloneFromTemplate + //TarLib.Tar.ExtractTarGz(templateZipPath, newPath); } catch (Exception ex) { @@ -1768,6 +1830,7 @@ public static Project FastCreateProject(string version, string baseFolder, strin } else if (Directory.Exists(templateZipPath)) { + // this is for folder templates, copy files try { CopyDirectory(templateZipPath, newPath); @@ -1803,7 +1866,11 @@ public static Project FastCreateProject(string version, string baseFolder, strin proj.Modified = DateTime.Now; proj.folderExists = true; // have to set this value, so item is green on list proj.Arguments = version.Contains("6000") ? (forceDX11 ? "-force-d3d11" : null) : null; // this gets erased later, since its not saved? would be nice to not add it at all though - var proc = LaunchProject(proj, null, useInitScript); + if (cloneFromTemplate == true) + { + proj.Arguments += " -cloneFromTemplate \"" + templateZipPath + "\""; + } + var proc = LaunchProject(proj, null, useInitScript, false, cloneFromTemplate); ProcessHandler.Add(proj, proc); return proj; @@ -1854,11 +1921,43 @@ static void CreateEmptyProjectFolder(string path, string version) File.WriteAllText(settingsFile, "m_EditorVersion: " + version); } - public static string GetEditorLogsFolder() + public static string GetGlobalEditorLogsFolder() { + // NOTE this is pre 6.5 unity (in 6.5 and later its inside project: MyProj/Logs/Editor.log) return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Unity", "Editor"); } + public static void OpenEditorLogForProject(Project proj) + { + // if version is 6000.5 or higher, then log file is in Proj/Logs, otherwise in Appdata/LocalLow + if (proj.Version != null && Tools.IsVersionAtLeast(proj.Version, "6000.5") == true) + { + var logFolder = Path.Combine(proj.Path, "Logs"); + var logFile = Path.Combine(logFolder, "Editor.log"); + if (File.Exists(logFile) == true) + { + Tools.LaunchExe(logFile); + } + else + { + SetStatus("Log file not found: " + logFile, MessageType.Warning); + } + } + else + { + var logFolder = Tools.GetGlobalEditorLogsFolder(); + var logFile = Path.Combine(logFolder, "Editor.log"); + if (File.Exists(logFile) == true) + { + Tools.LaunchExe(logFile); + } + else + { + SetStatus("Log file not found: " + logFile, MessageType.Warning); + } + } + } + public static string[] GetPlatformsForUnityVersion(string version) { // get platforms array for this unity version @@ -1990,6 +2089,7 @@ public static bool ValidateDateFormat(string format) // https://stackoverflow.com/a/37724335/5452781 public static void BringProcessToFront(Process process) { + if (process == null) return; IntPtr handle = process.MainWindowHandle; if (IsIconic(handle)) { @@ -2246,7 +2346,7 @@ public static void LaunchWebGL(Project proj, string relativeFolder) if (objEndPoints[i].Port == port) { port++; - if (port > 65534) + if (port > 65535) { Console.WriteLine("Failed to find open port.."); isAvailable = false; @@ -2501,9 +2601,9 @@ internal static string GetBytesReadable(long i) public static MainWindow mainWindow; // set status bar in main thread - public static void SetStatus(string text) + public static void SetStatus(string text, MessageType messageType = MessageType.Info) { - mainWindow.Dispatcher.Invoke(() => { mainWindow.SetStatus(text); }); + mainWindow.Dispatcher.Invoke(() => { mainWindow.SetStatus(text, messageType); }); } public static void SetBuildStatus(Color color) @@ -2659,13 +2759,21 @@ internal static void OpenCustomAssetPath() } } - private static async Task DownloadFileAsync(string fileUrl, string destinationPath) + public static async Task DownloadFileAsync(string fileUrl, string destinationPath) { var cancellationTokenSource = new CancellationTokenSource(); var fileName = Path.GetFileName(fileUrl); var progressWindow = new DownloadProgressWindow(fileName, () => cancellationTokenSource.Cancel()); progressWindow.Show(); var result = false; + + // create destination folder, if not exists + var outputFolderPath = Path.GetDirectoryName(destinationPath); + if (Directory.Exists(outputFolderPath) == false) + { + Directory.CreateDirectory(outputFolderPath); + } + try { using (var client = new HttpClient()) @@ -2678,8 +2786,7 @@ private static async Task DownloadFileAsync(string fileUrl, string destina var totalRead = 0; using (var contentStream = await response.Content.ReadAsStreamAsync()) - using (var fileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, - FileShare.None, buffer.Length, true)) + using (var fileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None, buffer.Length, true)) { int bytesRead; while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length, cancellationTokenSource.Token)) > 0) @@ -2704,7 +2811,7 @@ private static async Task DownloadFileAsync(string fileUrl, string destina { if (!result) { - DeleteTempFile(destinationPath); + InstallationCompleted(destinationPath); } progressWindow.Close(); } @@ -2887,6 +2994,11 @@ internal static bool RunExclusionElevated(IEnumerable paths, bool silent } return false; } + catch (Exception ex) + { + MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); + return false; + } return true; } @@ -3131,6 +3243,112 @@ public static string ParseHashCodeFromURL(string url) return url.Substring(hashStart, hashEnd - hashStart); } + internal static void OpenReleasesApiForVersion(string version) + { + string url = $"https://services.api.unity.com/unity/editor/release/v1/releases?limit=1&version={version}"; + LaunchBrowser(url); + } + + private static void LaunchBrowser(string url) + { + try + { + Process.Start(new ProcessStartInfo + { + FileName = url, + UseShellExecute = true + }); + } + catch (Exception ex) + { + MessageBox.Show("Failed to open URL: " + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + + internal static bool IsVersionAtLeast(string version, string v) + { + if (string.IsNullOrEmpty(version) || string.IsNullOrEmpty(v)) return false; + + try + { + var versionParts = version.Split('.'); + var vParts = v.Split('.'); + + int versionMajor = 0; + int vMajor = 0; + int versionMinor = 0; + int vMinor = 0; + + if (versionParts.Length > 0) + { + int i = 0; + while (i < versionParts[0].Length && char.IsDigit(versionParts[0][i])) i++; + int.TryParse(versionParts[0].Substring(0, i), out versionMajor); + } + + if (vParts.Length > 0) + { + int i = 0; + while (i < vParts[0].Length && char.IsDigit(vParts[0][i])) i++; + int.TryParse(vParts[0].Substring(0, i), out vMajor); + } + + if (versionMajor != vMajor) + { + return versionMajor > vMajor; + } + + if (versionParts.Length > 1) + { + int i = 0; + while (i < versionParts[1].Length && char.IsDigit(versionParts[1][i])) i++; + int.TryParse(versionParts[1].Substring(0, i), out versionMinor); + } + + if (vParts.Length > 1) + { + int i = 0; + while (i < vParts[1].Length && char.IsDigit(vParts[1][i])) i++; + int.TryParse(vParts[1].Substring(0, i), out vMinor); + } + + return versionMinor >= vMinor; + } + catch + { + return false; + } + } + + public static string GetBaseVersion(string version) + { + // e.g. 2020.3.15f1 -> 2020.3 + var parts = version.Split('.'); + if (parts.Length >= 2) + { + return parts[0] + "." + parts[1]; + } + return version; + } + + + public static string SplitTextToRows(string description, int rows) + { + if (rows < 2) return description; + if (string.IsNullOrEmpty(description)) return description; + + int len = description.Length; + if (len <= rows) return description; // too short to split meaningfully + + int firstCut = (len / rows); + int secondCut = (len * 2) / rows; + + string part1 = description.Substring(0, firstCut).Trim(); + string part2 = description.Substring(firstCut, secondCut - firstCut).Trim(); + string part3 = description.Substring(secondCut).Trim(); + + return part1 + Environment.NewLine + part2 + Environment.NewLine + part3; + } } // class diff --git a/UnityLauncherPro/UnityLauncherPro.csproj b/UnityLauncherPro/UnityLauncherPro.csproj index 5fe024b..5883d18 100644 --- a/UnityLauncherPro/UnityLauncherPro.csproj +++ b/UnityLauncherPro/UnityLauncherPro.csproj @@ -9,6 +9,7 @@ UnityLauncherPro UnityLauncherPro v4.8 + 8.0 512 {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 4 @@ -64,6 +65,7 @@ + @@ -83,14 +85,20 @@ MSBuild:Compile Designer + + SearchBoxControl.xaml + + + + @@ -101,6 +109,8 @@ + + @@ -119,6 +129,9 @@ UpgradeWindow.xaml + + MSBuild:Compile + Designer @@ -177,6 +190,8 @@ SettingsSingleFileGenerator Settings.Designer.cs + + diff --git a/UnityLauncherPro/UpgradeWindow.xaml.cs b/UnityLauncherPro/UpgradeWindow.xaml.cs index 9c1c48f..0ce7708 100644 --- a/UnityLauncherPro/UpgradeWindow.xaml.cs +++ b/UnityLauncherPro/UpgradeWindow.xaml.cs @@ -19,18 +19,13 @@ public UpgradeWindow(string currentVersion, string projectPath, string commandLi txtCurrentVersion.Text = currentVersion; txtCurrentPlatform.Text = Tools.GetTargetPlatform(projectPath); - if (gridAvailableVersions.ItemsSource == null) + if (!ReferenceEquals(gridAvailableVersions.ItemsSource, MainWindow.unityInstallationsSource)) { gridAvailableVersions.ItemsSource = MainWindow.unityInstallationsSource; } gridAvailableVersions.SelectedItem = null; - // we have current version info in project - // enable release and dl buttons - btnOpenReleasePage.IsEnabled = true; - btnDownload.IsEnabled = true; - // if dont have exact version, show red outline if (currentVersion == null || MainWindow.unityInstalledVersions.ContainsKey(currentVersion) == false) { @@ -40,12 +35,16 @@ public UpgradeWindow(string currentVersion, string projectPath, string commandLi if (currentVersion != null) { - // remove china c1 from version + // we know the version, enable buttons + btnOpenReleasePage.IsEnabled = true; + btnDownload.IsEnabled = true; + + // remove china c1 from version, NOTE not used anymore.. its Tuanjie if (currentVersion.Contains("c")) currentVersion = currentVersion.Replace("c1", ""); // find nearest version string nearestVersion = Tools.FindNearestVersion(currentVersion, MainWindow.unityInstalledVersions.Keys.ToList()); - if (nearestVersion != null) + if (nearestVersion != null && MainWindow.unityInstallationsSource != null) { // select nearest version for (int i = 0; i < MainWindow.unityInstallationsSource.Count; i++) @@ -150,6 +149,13 @@ private void GridAvailableVersions_PreviewMouseDoubleClick(object sender, MouseB void Upgrade() { var k = (UnityInstallation)gridAvailableVersions.SelectedItem; + + if (k == null) + { + DialogResult = false; + return; + } + upgradeVersion = k.Version; DialogResult = true; }