internal static RegistrySettings GetRegistry(Boolean isStandart = false)
        {
            if (isStandart)
            {
                return(new RegistrySettings(null));
            }

            try
            {
                RegistryKey currentUserKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(SubKey) ?? throw new NullReferenceException();
                Int32.TryParse(GetRegistryValue(ref currentUserKey, RegKeyMonitorID), out Int32 monitorID);
                RegistrySettings registrySettings = new RegistrySettings(
                    GetRegistryValue(ref currentUserKey, RegKeyID),
                    GetRegistryValue(ref currentUserKey, RegKeyKey),
                    GetRegistryValue(ref currentUserKey, RegKeyLanguageCode),
                    monitorID,
                    ToBoolean(GetRegistryValue(ref currentUserKey, RegKeyIsDisguise)),
                    !ToBoolean(GetRegistryValue(ref currentUserKey, RegKeyUseRegistry)),
                    !ToBoolean(GetRegistryValue(ref currentUserKey, RegKeyShow)),
                    GetRegistryValue(ref currentUserKey, RegKeyBuildDateTimeHash));

                currentUserKey.Close();
                return(registrySettings);
            }
            catch (Exception ex) when
                (ex is NullReferenceException || ex is ObjectDisposedException ||
                ex is SecurityException)
            {
                return(new RegistrySettings(null));
            }
        }
        internal static Boolean SetRegistry(RegistrySettings registrySettings)
        {
            try
            {
                RegistryKey currentUserKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(SubKey) ?? throw new NullReferenceException();
                currentUserKey.SetValue(RegKeyID, registrySettings.ID ?? Licence.FreeID);
                currentUserKey.SetValue(RegKeyKey, registrySettings.Key ?? Licence.FreeKey);
                currentUserKey.SetValue(RegKeyLanguageCode, registrySettings.LanguageCode);
                currentUserKey.SetValue(RegKeyMonitorID, registrySettings.MonitorID.ToString());
                currentUserKey.SetValue(RegKeyIsDisguise, registrySettings.IsDisguise);
                currentUserKey.SetValue(RegKeyUseRegistry, !registrySettings.DontUseRegistry);
                currentUserKey.SetValue(RegKeyShow, !registrySettings.DontShowAnymore);
                currentUserKey.SetValue(RegKeyBuildDateTimeHash, registrySettings.BuildDateTimeHash);

                currentUserKey.Close();
                return(true);
            }
            catch (Exception ex) when
                (ex is ObjectDisposedException || ex is SecurityException ||
                ex is UnauthorizedAccessException || ex is IOException)
            {
                return(false);
            }
        }