personal_options.js revision dc0f95d653279beabeb9817299e2902918ba123e
172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickcr.define('options', function() { 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick var OptionsPage = options.OptionsPage; 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // State variables. 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick var syncEnabled = false; 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick var syncSetupCompleted = false; 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen /** 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * Encapsulated handling of personal options page. 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * @constructor 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen */ 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick function PersonalOptions() { 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen OptionsPage.call(this, 'personal', 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen templateData.personalPageTabTitle, 20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 'personal-page'); 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cr.addSingletonGetter(PersonalOptions); 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick PersonalOptions.prototype = { 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Inherit PersonalOptions from OptionsPage. 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick __proto__: options.OptionsPage.prototype, 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Initialize PersonalOptions page. 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick initializePage: function() { 3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Call base class implementation to start preference initialization. 323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OptionsPage.prototype.initializePage.call(this); 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick var self = this; 354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch $('sync-action-link').onclick = function(event) { 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen chrome.send('showSyncActionDialog'); 374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch }; 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick $('start-stop-sync').onclick = function(event) { 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (self.syncSetupCompleted) 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick self.showStopSyncingOverlay_(); 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else 424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch chrome.send('showSyncLoginDialog'); 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }; 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen $('customize-sync').onclick = function(event) { 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen chrome.send('showCustomizeSyncDialog'); 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }; 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick $('privacy-dashboard-link').onclick = function(event) { 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chrome.send('openPrivacyDashboardTabAndActivate'); 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch $('manage-passwords').onclick = function(event) { 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OptionsPage.navigateToPage('passwords'); 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick OptionsPage.showTab($('passwords-nav-tab')); 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chrome.send('coreOptionsUserMetricsAction', 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ['Options_ShowPasswordManager']); 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen $('autofill-settings').onclick = function(event) { 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OptionsPage.navigateToPage('autofill'); 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chrome.send('coreOptionsUserMetricsAction', 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ['Options_ShowAutoFillSettings']); 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch $('themes-reset').onclick = function(event) { 62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch chrome.send('themesReset'); 63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch }; 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!cr.isChromeOS) { 66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch $('import-data').onclick = function(event) { 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OptionsPage.navigateToPage('importData'); 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick chrome.send('coreOptionsUserMetricsAction', ['Import_ShowDlg']); 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if ($('themes-GTK-button')) { 72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch $('themes-GTK-button').onclick = function(event) { 73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch chrome.send('themesSetGTK'); 74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch }; 75201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 76201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } else { 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick chrome.send('loadAccountPicture'); 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (cr.commandLine.options['--bwsi']) { 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Disable the screen lock checkbox for the guest mode. 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen $('enable-screen-lock').disabled = true; 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (PersonalOptions.disablePasswordManagement()) { 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen $('passwords-offersave').disabled = true; 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen $('passwords-neversave').disabled = true; 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen $('passwords-offersave').value = false; 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen $('passwords-neversave').value = true; 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen $('manage-passwords').disabled = true; 91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }, 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick showStopSyncingOverlay_: function(event) { 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen AlertOverlay.show(localStrings.getString('stop_syncing_title'), 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen localStrings.getString('stop_syncing_explanation'), 9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen localStrings.getString('stop_syncing_confirm'), 9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen localStrings.getString('cancel'), 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen function() { chrome.send('stopSyncing'); }); 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setElementVisible_: function(element, visible) { 1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (visible) 1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch element.classList.remove('hidden'); 1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch else 1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch element.classList.add('hidden'); 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setSyncEnabled_: function(enabled) { 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick this.syncEnabled = enabled; 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setSyncSetupCompleted_: function(completed) { 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick this.syncSetupCompleted = completed; 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen this.setElementVisible_($('customize-sync'), completed); 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setAccountPicture_: function(image) { 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick $('account-picture').src = image; 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setSyncStatus_: function(status) { 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen $('sync-status-text').textContent = status; 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setSyncStatusErrorVisible_: function(visible) { 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen visible ? $('sync-status').classList.add('sync-error') : 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen $('sync-status').classList.remove('sync-error'); 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setSyncActionLinkEnabled_: function(enabled) { 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick $('sync-action-link').disabled = !enabled; 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setSyncActionLinkLabel_: function(status) { 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick $('sync-action-link').textContent = status; 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // link-button does is not zero-area when the contents of the button are 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // empty, so explicitly hide the element. 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick this.setElementVisible_($('sync-action-link'), status.length != 0); 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setStartStopButtonVisible_: function(visible) { 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick this.setElementVisible_($('start-stop-sync'), visible); 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setStartStopButtonEnabled_: function(enabled) { 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick $('start-stop-sync').disabled = !enabled; 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick setStartStopButtonLabel_: function(label) { 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick $('start-stop-sync').textContent = label; 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }, 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick setGtkThemeButtonEnabled_: function(enabled) { 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!cr.isChromeOS && navigator.platform.match(/linux|BSD/i)) { 157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch $('themes-GTK-button').disabled = !enabled; 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }, 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch setThemesResetButtonEnabled_: function(enabled) { 162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch $('themes-reset').disabled = !enabled; 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }, 1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch hideSyncSection_: function() { 1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch this.setElementVisible_($('sync-section'), false); 1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch }, 16821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 16921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen /** 17021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * Toggles the visibility of the data type checkboxes based on whether they 17121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * are enabled on not. 17221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * @param {Object} dict A mapping from data type to a boolean indicating 17321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * whether it is enabled. 17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * @private 17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen */ 17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen setRegisteredDataTypes_: function(dict) { 17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (var type in dict) { 17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (type.match(/Registered$/) && !dict[type]) { 17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen node = $(type.replace(/([a-z]+)Registered$/i, '$1').toLowerCase() 18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen + '-check'); 18121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (node) 18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen node.parentNode.style.display = 'none'; 18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen }, 1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Returns whether the user should be able to manage (view and edit) their 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * stored passwords. Password management is disabled in guest mode. 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @return {boolean} True if password management should be disabled. 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PersonalOptions.disablePasswordManagement = function() { 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return cr.commandLine.options['--bwsi']; 19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }; 19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Forward public APIs to private implementations. 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick [ 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setSyncEnabled', 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setSyncSetupCompleted', 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setAccountPicture', 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setSyncStatus', 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setSyncStatusErrorVisible', 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setSyncActionLinkEnabled', 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setSyncActionLinkLabel', 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setStartStopButtonVisible', 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setStartStopButtonEnabled', 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setStartStopButtonLabel', 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 'setGtkThemeButtonEnabled', 210201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 'setThemesResetButtonEnabled', 2114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 'hideSyncSection', 21221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 'setRegisteredDataTypes', 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ].forEach(function(name) { 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PersonalOptions[name] = function(value) { 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PersonalOptions.getInstance()[name + '_'](value); 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }; 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }); 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Export 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return { 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick PersonalOptions: PersonalOptions 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}); 225