Browse Source

32/64 bit os switch

v0.25
pbca26 7 years ago
parent
commit
535c42f728
  1. 31
      assets/mainWindow/js/loading.js
  2. 28
      react/src/components/addcoin/addcoin.render.js
  3. 7
      react/src/components/addcoin/addcoinOptionsAC.js
  4. 11
      react/src/components/addcoin/addcoinOptionsCrypto.js
  5. 71
      react/src/components/addcoin/coin-selectors.render.js
  6. 41
      react/src/components/dashboard/settings/settings.appInfoPanel.js
  7. 16
      react/src/components/dashboard/settings/settings.appSettingsPanel.js
  8. 111
      react/src/components/dashboard/settings/settings.render.js
  9. 3
      react/src/components/dashboard/settings/settings.scss
  10. 2
      react/src/components/main/main.js

31
assets/mainWindow/js/loading.js

@ -288,15 +288,26 @@ function init() {
const remote = require('electron').remote; const remote = require('electron').remote;
var window = remote.getCurrentWindow(); var window = remote.getCurrentWindow();
var appConf = remote.getCurrentWindow().appConfig; var appConf = remote.getCurrentWindow().appConfig;
var arch = remote.getCurrentWindow().arch;
if (!appConf.experimentalFeatures) {
$('#kmdPassiveMode').hide(); if (arch !== 'x64') {
$('#spvBtn').hide(); $('.settings-help').hide();
$('#spvBtnCarret').hide(); $('#agamaModeStatusText').html('Choose a shortcut or custom selection');
$('.dropdown-menu.native').css('right', '165px'); $('#settingsBtn').hide();
$('#nativeOnlyBtnCarret').css('margin-right', '0'); $('.mode-desc.native').hide();
$('#settingsBtn').css('margin', '0'); $('#nativeOnlyBtn').hide();
$('.mode-desc.spv').hide(); $('#nativeOnlyBtnCarret').hide();
$('.mode-desc.native').css('left', '180px'); $('.mode-desc.spv').css('left', '200px');
$('.dropdown-menu.lite').css('left', '180px');
} else {
if (!appConf.experimentalFeatures) {
$('#spvBtn').hide();
$('#spvBtnCarret').hide();
$('.dropdown-menu.native').css('right', '165px');
$('#nativeOnlyBtnCarret').css('margin-right', '0');
$('#settingsBtn').css('margin', '0');
$('.mode-desc.spv').hide();
$('.mode-desc.native').css('left', '180px');
}
} }
} }

28
react/src/components/addcoin/addcoin.render.js

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { translate } from '../../translate/translate'; import { translate } from '../../translate/translate';
import mainWindow from '../../util/mainWindow';
// TODO: add modal close on modal overlay click evt // TODO: add modal close on modal overlay click evt
const AddCoinRender = function() { const AddCoinRender = function() {
@ -50,19 +50,21 @@ const AddCoinRender = function() {
{ translate('ADD_COIN.ACTIVATE_ALL') } { translate('ADD_COIN.ACTIVATE_ALL') }
</button> </button>
</div> </div>
<div className="col-sm-12"> { mainWindow.arch === 'x64' &&
<p> <div className="col-sm-12">
<strong>{ translate('INDEX.NATIVE_MODE') }:</strong> { translate('INDEX.NATIVE_MODE_DESC1') }&nbsp; <p>
<strong>Komodo Daemon</strong> { translate('INDEX.NATIVE_MODE_DESC2') }&nbsp; <strong>{ translate('INDEX.NATIVE_MODE') }:</strong> { translate('INDEX.NATIVE_MODE_DESC1') }&nbsp;
<i>Iguana Daemon</i> { translate('INDEX.NATIVE_MODE_DESC3') }. <strong>Komodo Daemon</strong> { translate('INDEX.NATIVE_MODE_DESC2') }&nbsp;
</p> <i>Iguana Daemon</i> { translate('INDEX.NATIVE_MODE_DESC3') }.
<div className="alert alert-icon alert-primary margin-top-20"> </p>
<i className="icon md-info-outline"></i> <div className="alert alert-icon alert-primary margin-top-20">
<strong>{ translate('INDEX.NATIVE_MODE') }</strong> { translate('INDEX.NATIVE_MODE_DESC4') }&nbsp; <i className="icon md-info-outline"></i>
<strong>{ translate('INDEX.NATIVE_MODE_DESC5') }</strong>,&nbsp; <strong>{ translate('INDEX.NATIVE_MODE') }</strong> { translate('INDEX.NATIVE_MODE_DESC4') }&nbsp;
<i>{ translate('INDEX.NATIVE_MODE_DESC5') }</i>. <strong>{ translate('INDEX.NATIVE_MODE_DESC5') }</strong>,&nbsp;
<i>{ translate('INDEX.NATIVE_MODE_DESC5') }</i>.
</div>
</div> </div>
</div> }
</div> </div>
</div> </div>
</div> </div>

7
react/src/components/addcoin/addcoinOptionsAC.js

@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import { translate } from '../../translate/translate'; import { translate } from '../../translate/translate';
import mainWindow from '../../util/mainWindow';
class AddCoinOptionsAC extends React.Component { class AddCoinOptionsAC extends React.Component {
render() { render() {
@ -25,7 +26,11 @@ class AddCoinOptionsAC extends React.Component {
let _items = []; let _items = [];
for (let i = 0; i < _assetChains.length; i++) { for (let i = 0; i < _assetChains.length; i++) {
const availableModes = _assetChains[i] !== 'kv' && _assetChains[i] !== 'mgw' ? 'native|spv' : 'native'; let availableModes = _assetChains[i] !== 'kv' && _assetChains[i] !== 'mgw' ? 'native|spv' : 'native';
if (mainWindow.arch !== 'x64') {
availableModes = 'spv';
}
_items.push( _items.push(
<option <option

11
react/src/components/addcoin/addcoinOptionsCrypto.js

@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import { translate } from '../../translate/translate'; import { translate } from '../../translate/translate';
import mainWindow from '../../util/mainWindow';
class AddCoinOptionsCrypto extends React.Component { class AddCoinOptionsCrypto extends React.Component {
constructor() { constructor() {
@ -10,11 +11,7 @@ class AddCoinOptionsCrypto extends React.Component {
} }
componentWillMount() { componentWillMount() {
let appConfig; const appConfig = mainWindow.appConfig;
try {
appConfig = window.require('electron').remote.getCurrentWindow().appConfig;
} catch (e) {}
this.setState({ this.setState({
isExperimentalOn: appConfig.experimentalFeatures, isExperimentalOn: appConfig.experimentalFeatures,
@ -22,9 +19,11 @@ class AddCoinOptionsCrypto extends React.Component {
} }
render() { render() {
let availableKMDModes = mainWindow.arch === 'x64' ? 'native|spv' : 'spv';
return ( return (
<optgroup label={ translate('ADD_COIN.CRYPTO_CURRENCIES') }> <optgroup label={ translate('ADD_COIN.CRYPTO_CURRENCIES') }>
<option value="KMD|native|spv">Komodo (KMD)</option> <option value={ `KMD|${availableKMDModes}` }>Komodo (KMD)</option>
<option <option
value="CHIPS|spv" value="CHIPS|spv"
className={ this.state.isExperimentalOn ? '' : 'hide' }>Chips (CHIPS)</option> className={ this.state.isExperimentalOn ? '' : 'hide' }>Chips (CHIPS)</option>

71
react/src/components/addcoin/coin-selectors.render.js

@ -3,6 +3,7 @@ import { translate } from '../../translate/translate';
import AddCoinOptionsCrypto from '../addcoin/addcoinOptionsCrypto'; import AddCoinOptionsCrypto from '../addcoin/addcoinOptionsCrypto';
import AddCoinOptionsAC from '../addcoin/addcoinOptionsAC'; import AddCoinOptionsAC from '../addcoin/addcoinOptionsAC';
import AddCoinOptionsACFiat from '../addcoin/addcoinOptionsACFiat'; import AddCoinOptionsACFiat from '../addcoin/addcoinOptionsACFiat';
import mainWindow from '../../util/mainWindow';
const CoinSelectorsRender = function(item, coin, i) { const CoinSelectorsRender = function(item, coin, i) {
return ( return (
@ -24,7 +25,9 @@ const CoinSelectorsRender = function(item, coin, i) {
<option>{ translate('INDEX.SELECT') }</option> <option>{ translate('INDEX.SELECT') }</option>
<AddCoinOptionsCrypto appSettings={ this.props.Settings } /> <AddCoinOptionsCrypto appSettings={ this.props.Settings } />
<AddCoinOptionsAC appSettings={ this.props.Settings } /> <AddCoinOptionsAC appSettings={ this.props.Settings } />
<AddCoinOptionsACFiat appSettings={ this.props.Settings } /> { mainWindow.arch === 'x64' &&
<AddCoinOptionsACFiat appSettings={ this.props.Settings } />
}
</select> </select>
</div> </div>
<div className={ this.hasMoreThanOneCoin() && (item.mode === '-1' || item.mode === -1) ? 'col-sm-6' : 'hide' }> <div className={ this.hasMoreThanOneCoin() && (item.mode === '-1' || item.mode === -1) ? 'col-sm-6' : 'hide' }>
@ -82,38 +85,40 @@ const CoinSelectorsRender = function(item, coin, i) {
</span> </span>
</label> </label>
</div> </div>
<div { mainWindow.arch === 'x64' &&
className="form-group col-lg-4 col-md-4 col-sm-6 col-xs-6" <div
style={{ paddingLeft: '0' }}> className="form-group col-lg-4 col-md-4 col-sm-6 col-xs-6"
<input style={{ paddingLeft: '0' }}>
type="radio" <input
className="to-labelauty labelauty" type="radio"
name={ `mode-${i}` } className="to-labelauty labelauty"
id={ `addcoin_mdl_native_mode_login-${i}` } name={ `mode-${i}` }
disabled={ item.nativeMode.disabled } id={ `addcoin_mdl_native_mode_login-${i}` }
checked={ item.nativeMode.checked } /> disabled={ item.nativeMode.disabled }
<label checked={ item.nativeMode.checked } />
htmlFor={ `addcoin_mdl_native_mode_login-${i}` } <label
onClick={ () => this.updateSelectedMode('-1', i) } htmlFor={ `addcoin_mdl_native_mode_login-${i}` }
style={{ pointerEvents: item.nativeMode.disabled ? 'none' : 'all' }}> onClick={ () => this.updateSelectedMode('-1', i) }
<span style={{ pointerEvents: item.nativeMode.disabled ? 'none' : 'all' }}>
className="labelauty-unchecked-image" <span
style={{ display: item.nativeMode.checked ? 'none' : 'inline-block' }}></span> className="labelauty-unchecked-image"
<span style={{ display: item.nativeMode.checked ? 'none' : 'inline-block' }}></span>
className="labelauty-unchecked" <span
style={{ display: item.nativeMode.checked ? 'none' : 'inline-block' }}> className="labelauty-unchecked"
{ translate('INDEX.NATIVE_MODE') } style={{ display: item.nativeMode.checked ? 'none' : 'inline-block' }}>
</span> { translate('INDEX.NATIVE_MODE') }
<span </span>
className="labelauty-checked-image" <span
style={{ display: item.nativeMode.checked ? 'inline-block' : 'none' }}></span> className="labelauty-checked-image"
<span style={{ display: item.nativeMode.checked ? 'inline-block' : 'none' }}></span>
className="labelauty-checked" <span
style={{ display: item.nativeMode.checked ? 'inline-block' : 'none' }}> className="labelauty-checked"
{ translate('INDEX.NATIVE_MODE') } style={{ display: item.nativeMode.checked ? 'inline-block' : 'none' }}>
</span> { translate('INDEX.NATIVE_MODE') }
</label> </span>
</div> </label>
</div>
}
</div> </div>
<div className={ this.hasMoreThanOneCoin() && i !== 0 ? 'col-sm-1' : 'hide' }> <div className={ this.hasMoreThanOneCoin() && i !== 0 ? 'col-sm-1' : 'hide' }>
<button <button

41
react/src/components/dashboard/settings/settings.appInfoPanel.js

@ -1,6 +1,7 @@
import React from 'react'; import React from 'react';
import { translate } from '../../../translate/translate'; import { translate } from '../../../translate/translate';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import mainWindow from '../../../util/mainWindow';
class AppInfoPanel extends React.Component { class AppInfoPanel extends React.Component {
constructor() { constructor() {
@ -9,7 +10,7 @@ class AppInfoPanel extends React.Component {
render() { render() {
const releaseInfo = this.props.Settings.appInfo && this.props.Settings.appInfo.releaseInfo; const releaseInfo = this.props.Settings.appInfo && this.props.Settings.appInfo.releaseInfo;
if (!releaseInfo) { if (!releaseInfo) {
return null return null
} else { } else {
@ -20,7 +21,7 @@ class AppInfoPanel extends React.Component {
<p> <p>
{ translate('SETTINGS.NAME') }: { this.props.Settings.appInfo.releaseInfo.name } { translate('SETTINGS.NAME') }: { this.props.Settings.appInfo.releaseInfo.name }
<br /> <br />
{ translate('SETTINGS.VERSION') }: { `${this.props.Settings.appInfo.releaseInfo.version.replace('version=', '')}-beta` } { translate('SETTINGS.VERSION') }: { `${this.props.Settings.appInfo.releaseInfo.version.replace('version=', '')}${mainWindow.arch === 'x64' ? '' : '-32bit'}-beta` }
<br /> <br />
{ translate('SETTINGS.APP_SESSION') }: { this.props.Settings.appInfo.appSession } { translate('SETTINGS.APP_SESSION') }: { this.props.Settings.appInfo.appSession }
</p> </p>
@ -40,22 +41,26 @@ class AppInfoPanel extends React.Component {
<br /> <br />
{ translate('SETTINGS.MEM') }: { this.props.Settings.appInfo.sysInfo.totalmem_readable } { translate('SETTINGS.MEM') }: { this.props.Settings.appInfo.sysInfo.totalmem_readable }
</p> </p>
<h5>{ translate('SETTINGS.LOCATIONS') }</h5> { mainWindow.arch === 'x64' &&
<p> <h5>{ translate('SETTINGS.LOCATIONS') }</h5>
{ translate('SETTINGS.CACHE') }: { this.props.Settings.appInfo.dirs.cacheLocation } }
<br /> { mainWindow.arch === 'x64' &&
{ translate('SETTINGS.CONFIG') }: { this.props.Settings.appInfo.dirs.configLocation } <p>
<br /> { translate('SETTINGS.CACHE') }: { this.props.Settings.appInfo.dirs.cacheLocation }
Iguana { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.iguanaBin } <br />
<br /> { translate('SETTINGS.CONFIG') }: { this.props.Settings.appInfo.dirs.configLocation }
Iguana { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.iguanaDir } <br />
<br /> Iguana { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.iguanaBin }
Komodo { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.komododBin } <br />
<br /> Iguana { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.iguanaDir }
Komodo { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.komodoDir } <br />
<br /> Komodo { translate('SETTINGS.BIN') }: { this.props.Settings.appInfo.dirs.komododBin }
Komodo wallet.dat: { this.props.Settings.appInfo.dirs.komodoDir } <br />
</p> Komodo { translate('SETTINGS.DIR') }: { this.props.Settings.appInfo.dirs.komodoDir }
<br />
Komodo wallet.dat: { this.props.Settings.appInfo.dirs.komodoDir }
</p>
}
</div> </div>
</div> </div>
); );

16
react/src/components/dashboard/settings/settings.appSettingsPanel.js

@ -11,6 +11,7 @@ import {
triggerToaster, triggerToaster,
} from '../../../actions/actionCreators'; } from '../../../actions/actionCreators';
import Store from '../../../store'; import Store from '../../../store';
import mainWindow from '../../../util/mainWindow';
class AppSettingsPanel extends React.Component { class AppSettingsPanel extends React.Component {
constructor() { constructor() {
@ -26,15 +27,13 @@ class AppSettingsPanel extends React.Component {
} }
componentWillMount() { componentWillMount() {
try { const _appConfigSchema = mainWindow.appConfigSchema;
const _appConfigSchema = window.require('electron').remote.getCurrentWindow().appConfigSchema; const _appSettings = this.props.Settings.appSettings ? this.props.Settings.appSettings : Object.assign({}, mainWindow.appConfig);
const _appSettings = this.props.Settings.appSettings ? this.props.Settings.appSettings : Object.assign({}, window.require('electron').remote.getCurrentWindow().appConfig);
this.setState(Object.assign({}, this.state, { this.setState(Object.assign({}, this.state, {
appConfigSchema: _appConfigSchema, appConfigSchema: _appConfigSchema,
appSettings: _appSettings, appSettings: _appSettings,
})); }));
} catch(e) {}
} }
componentDidMount(props) { componentDidMount(props) {
@ -119,6 +118,7 @@ class AppSettingsPanel extends React.Component {
renderConfigEditForm() { renderConfigEditForm() {
let items = []; let items = [];
const _appConfig = this.state.appSettings; const _appConfig = this.state.appSettings;
for (let key in _appConfig) { for (let key in _appConfig) {
if (this.state.appConfigSchema[key] && typeof _appConfig[key] === 'object') { if (this.state.appConfigSchema[key] && typeof _appConfig[key] === 'object') {
if (this.state.appConfigSchema[key].display) { if (this.state.appConfigSchema[key].display) {

111
react/src/components/dashboard/settings/settings.render.js

@ -17,6 +17,7 @@ import SPVServersPanel from './settings.spvServersPanel';
import DaemonStdoutPanel from './settings.daemonStdoutPanel'; import DaemonStdoutPanel from './settings.daemonStdoutPanel';
import NativeWalletDatKeysPanel from './settings.nativeWalletDatKeysPanel'; import NativeWalletDatKeysPanel from './settings.nativeWalletDatKeysPanel';
import CoindClearDataDirPanel from './settings.coindClearDataDirPanel'; import CoindClearDataDirPanel from './settings.coindClearDataDirPanel';
import mainWindow from '../../../util/mainWindow';
// import WalletInfoPanel from './settings.walletInfoPanel'; // import WalletInfoPanel from './settings.walletInfoPanel';
// import WalletBackupPanel from './settings.walletBackupPanel'; // import WalletBackupPanel from './settings.walletBackupPanel';
@ -71,82 +72,90 @@ export const SettingsRender = function() {
<Panel <Panel
uniqId={'SettingsAccordion'} uniqId={'SettingsAccordion'}
singleOpen={true}> singleOpen={true}>
{ mainWindow.arch === 'x64' &&
<PanelSection <PanelSection
title={ translate('INDEX.DEBUG_LOG') } title={ translate('INDEX.DEBUG_LOG') }
icon="icon fa-bug" icon="icon fa-bug"
openByDefault={this.props.disableWalletSpecificUI}> openByDefault={this.props.disableWalletSpecificUI}>
<DebugLogPanel /> <DebugLogPanel />
</PanelSection> </PanelSection>
{ this.props.Main.coins && }
this.props.Main.coins.native && { this.props.Main.coins &&
Object.keys(this.props.Main.coins.native).length > 0 && this.props.Main.coins.native &&
<PanelSection Object.keys(this.props.Main.coins.native).length > 0 &&
title={ 'Komodod stdout' } <PanelSection
icon="icon fa-bug"> title={ 'Komodod stdout' }
<DaemonStdoutPanel /> icon="icon fa-bug">
</PanelSection> <DaemonStdoutPanel />
} </PanelSection>
}
{ mainWindow.arch === 'x64' &&
<PanelSection <PanelSection
title={ translate('SETTINGS.APP_CONFIG') + ' (config.json)' } title={ translate('SETTINGS.APP_CONFIG') + ' (config.json)' }
icon="icon fa-wrench"> icon="icon fa-wrench">
<AppSettingsPanel /> <AppSettingsPanel />
</PanelSection> </PanelSection>
}
<PanelSection
title={ translate('SETTINGS.APP_INFO') }
icon="icon md-info">
<AppInfoPanel />
</PanelSection>
{ this.props.Main.coins &&
this.props.Main.coins.spv &&
Object.keys(this.props.Main.coins.spv).length &&
this.props.Main.isLoggedIn &&
<PanelSection <PanelSection
title={ translate('SETTINGS.APP_INFO') } title={ translate('INDEX.EXPORT_KEYS') }
icon="icon md-info"> icon="icon md-key">
<AppInfoPanel /> <ExportKeysPanel />
</PanelSection> </PanelSection>
{ this.props.Main.coins && }
this.props.Main.coins.spv && { mainWindow.arch === 'x64' &&
Object.keys(this.props.Main.coins.spv).length &&
this.props.Main.isLoggedIn &&
<PanelSection
title={ translate('INDEX.EXPORT_KEYS') }
icon="icon md-key">
<ExportKeysPanel />
</PanelSection>
}
<PanelSection <PanelSection
title={ 'Wallet.dat keys' } title={ 'Wallet.dat keys' }
icon="icon md-key"> icon="icon md-key">
<NativeWalletDatKeysPanel /> <NativeWalletDatKeysPanel />
</PanelSection> </PanelSection>
}
{ mainWindow.arch === 'x64' &&
<PanelSection <PanelSection
title={ 'Clear native coin data dir' } title={ 'Clear native coin data dir' }
icon="icon fa-trash"> icon="icon fa-trash">
<CoindClearDataDirPanel /> <CoindClearDataDirPanel />
</PanelSection> </PanelSection>
{ this.props.Main.coins && }
this.props.Main.coins.spv && { this.props.Main.coins &&
Object.keys(this.props.Main.coins.spv).length && this.props.Main.coins.spv &&
this.displaySPVServerListTab() && Object.keys(this.props.Main.coins.spv).length &&
<PanelSection this.displaySPVServerListTab() &&
title={ translate('SETTINGS.SPV_SERVERS') } <PanelSection
icon="icon fa-server"> title={ translate('SETTINGS.SPV_SERVERS') }
<SPVServersPanel /> icon="icon fa-server">
</PanelSection> <SPVServersPanel />
} </PanelSection>
{ this.props.Main.coins && }
this.props.Main.coins.native && { this.props.Main.coins &&
Object.keys(this.props.Main.coins.native).length > 0 && this.props.Main.coins.native &&
<PanelSection Object.keys(this.props.Main.coins.native).length > 0 &&
title="CLI"
icon="icon fa-code">
<CliPanel />
</PanelSection>
}
{ this.state.isExperimentalOn &&
<PanelSection
title={ translate('INDEX.UPDATE') }
icon="icon fa fa-cloud-download">
<AppUpdatePanel />
</PanelSection>
}
<PanelSection <PanelSection
title={ translate('SETTINGS.SUPPORT') } title="CLI"
icon="icon fa fa-life-ring"> icon="icon fa-code">
<SupportPanel /> <CliPanel />
</PanelSection> </PanelSection>
}
{ this.state.isExperimentalOn &&
<PanelSection
title={ translate('INDEX.UPDATE') }
icon="icon fa fa-cloud-download">
<AppUpdatePanel />
</PanelSection>
}
<PanelSection
title={ translate('SETTINGS.SUPPORT') }
icon="icon fa fa-life-ring">
<SupportPanel />
</PanelSection>
</Panel> </Panel>
</div> </div>
</div> </div>

3
react/src/components/dashboard/settings/settings.scss

@ -93,7 +93,7 @@
#SettingsAccordion { #SettingsAccordion {
.panel { .panel {
.panel-collapse { .panel-collapse {
&.collapse { &.collapse {
max-height: 0; max-height: 0;
overflow: hidden; overflow: hidden;
@ -111,6 +111,7 @@
#section-iguana-wallet-settings { #section-iguana-wallet-settings {
background: #f3f4f5; background: #f3f4f5;
height: 100%;
.panel-title { .panel-title {
cursor: pointer; cursor: pointer;

2
react/src/components/main/main.js

@ -21,7 +21,7 @@ class Main extends React.Component {
const appConfig = mainWindow.appConfig; const appConfig = mainWindow.appConfig;
if (appVersion) { if (appVersion) {
document.title = `${appVersion.name} (v${appVersion.version.replace('version=', '')}-beta)`; document.title = `${appVersion.name} (v${appVersion.version.replace('version=', '')}${mainWindow.arch === 'x64' ? '' : '-32bit'}-beta)`;
} }
} }

Loading…
Cancel
Save