403Webshell
Server IP : 85.158.181.41  /  Your IP : 216.73.217.12
Web Server : Apache
System : Linux cloud9-vm129 6.1.178+1-ph #ph SMP PREEMPT_DYNAMIC Wed Jul 29 09:00:54 UTC 2026 x86_64
User : moncbefd ( 1024)
PHP Version : 7.3.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/moncbefd/www.moneta.at/admin/html/assets/javascript/engine/controllers/app_store/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/moncbefd/www.moneta.at/admin/html/assets/javascript/engine/controllers/app_store/app_store.js
'use strict';

/* --------------------------------------------------------------
 app_store_controller 2019-02-18
 Gambio GmbH
 http://www.gambio.de
 Copyright (c) 2016 Gambio GmbH
 Released under the GNU General Public License (Version 2)
 [http://www.gnu.org/licenses/gpl-2.0.html]
 --------------------------------------------------------------
 */

/**
 * ## AppStore Controller
 *
 * This controller will handles the frontend logic of the AppStore page.
 *
 * @module Controllers/app_store
 */
gx.controllers.module('app_store', ['xhr', gx.source + '/libs/auto_updater'], function (_ref) {
	var appUrl = _ref.appUrl,
	    appToken = _ref.appToken;

	/**
  * Module element
  *
  * @type {HTMLElement}
  */
	var parent = this[0];

	/**
  * Iframe element
  *
  * @type {HTMLIFrameElement}
  */
	var iframe = void 0;

	/**
  * Return shop information
  *
  * @returns {Promise<Object>}
  */
	function fetchShopInfo() {
		function handle(resolve) {
			jse.libs.xhr.get({ url: './admin.php?do=AppStoreAjax/collectShopInformation' }).done(resolve);
		}

		return new Promise(handle);
	}

	/**
  * Return whether the data processing has been accepted.
  *
  * @returns {Promise<Object>}
  */
	function isDataProcessingAccepted() {
		function handle(resolve) {
			jse.libs.xhr.get({ url: './admin.php?do=AppStoreAjax/isDataProcessingAccepted' }).done(resolve);
		}

		return new Promise(handle);
	}

	/**
  * Build Iframe element and resolve returned promise once the content is loaded
  *
  * @param {string} url Iframe URL
  * @returns {Promise<Event>}
  */
	function buildIFrame(url) {
		/**
   * Build element
   *
   * @param {function} resolve
   */
		function handle(resolve) {
			iframe = document.createElement('iframe');

			var language = jse.core.config.get('languageCode');
			appUrl += appUrl.includes('?') ? '&language=' + language : '?language=' + language;

			iframe.src = appUrl;
			iframe.style.width = '100%';
			iframe.style.height = '100%';
			iframe.style.border = 'none';
			iframe.style.overflow = 'hidden';

			iframe.addEventListener('load', resolve);

			parent.appendChild(iframe);
		}

		return new Promise(handle);
	}

	/**
  * Attach message event listener
  */
	function listenToMessages() {
		/**
   * Handle message event
   *
   * @param {MessageEvent} event
   */
		function onMessage(_ref2) {
			var data = _ref2.data;
			var type = data.type,
			    payload = data.payload;


			if (type === 'response_iframe_height') {
				iframe.style.height = payload.height + 'px';
				return;
			}

			if (type === 'updates_counter') {
				setUpdatesCounter(payload.updatesCounter);
				return;
			}

			if (type === 'update_shop_information' || type === 'request_shop_information') {
				fetchShopInfo().then(sendShopInfo);
				return;
			}

			if (type === 'request_app_token') {
				sendMessage('send_app_token', { 'appToken': appToken });
				return;
			}

			if (type === 'send_data_processing_accepted') {
				window.location.href = 'admin.php?do=AppStore/AcceptDataProcessing';
				return;
			}

			if (type === 'start_installation_process') {
				install(payload);
				return;
			}

			if (type === 'uninstall_theme') {
				uninstallTheme(payload);
			}

			if (type === 'reload_page') {
				window.location.reload(true);
			}

			if (type === 'activate_theme') {
				activateTheme(payload);
			}
		}

		window.addEventListener('message', onMessage);
	}

	/**
  * Activate a theme.
  *
  * @param payload
  */
	function activateTheme(payload) {
		jse.libs.xhr.post({
			url: './admin.php?do=AppStore/ActivateTheme',
			data: { 'themeStorageName': payload.themeStorageName }
		}).done(function () {
			sendMessage('activation_succeeded');
		}).fail(function () {
			sendMessage('activation_failed');
		});
	}

	/**
  * Send message to Iframe
  *
  * @param {string} type Message type
  * @param {object} [payload] Message payload
  */
	function sendMessage(type, payload) {
		iframe.contentWindow.postMessage({ type: type, payload: payload }, '*');
	}

	/**
  * Send shop information data to Iframe
  *
  * @param {Object} shopInfo Shop information data
  */
	function sendShopInfo(shopInfo) {
		sendMessage('send_shop_information', { shopInfo: shopInfo });
	}

	/**
  * Install a package
  *
  * @param {Object} data Package data
  */
	function install(data) {
		var $installingPackageModal = $('.installing-package.modal');
		var $progressDescription = $installingPackageModal.find('.progress-description');
		var $progressBar = $installingPackageModal.find('.progress .progress-bar');

		$progressDescription.text(jse.core.lang.translate('PREPARING_PACKAGE', 'app_store'));

		var updateProgressCallback = function updateProgressCallback(_ref3) {
			var progress = _ref3.progress;

			var progressPercentage = Math.ceil(progress * 100);

			if (progressPercentage < 0) {
				progressPercentage = 0;
			} else if (progressPercentage > 100) {
				progressPercentage = 100;
			}

			$progressBar.prop('aria-valuenow', progressPercentage);
			$progressBar.css('width', progressPercentage + '%');
			$progressBar.text(progressPercentage + '%');
		};

		updateProgressCallback({ progress: 0 }); // reset

		$installingPackageModal.modal('show');

		jse.libs.auto_updater.checkAppStorePackageFilePermissions(data).then(function () {
			$progressDescription.text(jse.core.lang.translate('INSTALLING_PACKAGE', 'app_store'));

			jse.libs.auto_updater.installAppStorePackage(data, updateProgressCallback).then(function () {

				// By checking whether a gallery object is present,
				// we can determine if this is a theme or not.
				if (data.details.gallery) {
					// find out if the installed theme was an update of the currently active theme
					jse.libs.xhr.get({
						url: './admin.php?do=AppStoreAjax/IsThemeActive&themeName=' + data.details.fileName
					}).done(function (response) {
						if (response.isActive === true) {
							// and if so, activate it again for the content manager entries
							jse.libs.xhr.post({
								url: './admin.php?do=AppStore/ActivateTheme',
								data: { 'themeStorageName': data.details.fileName }
							}).done(function () {
								sendMessage('installation_succeeded');
							}).fail(function () {
								sendMessage('installation_failed');
							});
						} else {
							sendMessage('installation_succeeded');
						}
					}).fail(function () {
						sendMessage('installation_failed');
					});
				} else {
					sendMessage('installation_succeeded');
				}
			}).catch(function () {
				return sendMessage('installation_failed');
			}).finally(function () {
				updateProgressCallback({ progress: 1 });
				setTimeout(function () {
					$installingPackageModal.modal('hide');
				}, 2000);
			});
		}).catch(function () {
			return sendMessage('ftp_data_requested');
		});
	}

	/**
  * Uninstall a theme
  *
  * @param {Object} data Theme data
  */
	function uninstallTheme(data) {
		jse.libs.auto_updater.uninstallTheme(data.filename).then(function () {
			return sendMessage('uninstall_succeeded');
		}).catch(function (data) {
			return sendMessage('uninstall_failed', data);
		});
	}

	/**
  * Applies a darker background color to the page.
  */
	function adjustBackgroundColor() {
		document.getElementById('main-content').style.background = '#f5f5f5';
	}

	/**
  * Set the updates counter badge in the page navigation row.
  *
  * @param {Number} updatesAvailable
  */
	function setUpdatesCounter(updatesAvailable) {
		var className = 'app-store-updates-counter';

		var updatesCounter = document.getElementsByClassName(className);

		if (updatesAvailable === 0) {
			if (updatesCounter.length && updatesCounter.style) {
				updatesCounter.style.display = "none";
			}
			return;
		} else {
			if (updatesCounter.length && updatesCounter.style) {
				updatesCounter.style.display = "inline";
			}
		}

		if (updatesCounter.length) {
			updatesCounter.innerHTML = updatesAvailable;
			return;
		}

		updatesCounter = document.createElement('span');
		updatesCounter.className = 'app-store-updates-counter';
		updatesCounter.innerHTML = updatesAvailable;

		var navItem = document.querySelector('#main-content .content-navigation .nav-item:last-child');

		if (!navItem) {
			return;
		}

		if (navItem.classList.contains('no-link')) {
			navItem.appendChild(updatesCounter);
		} else {
			navItem.querySelector('a').appendChild(updatesCounter);
		}
	}

	/**
  * Initialize
  *
  * @param {Function} done JSEngine callback function for ready state indication
  */
	function init(done) {
		adjustBackgroundColor();

		function proceed(_ref4) {
			var accepted = _ref4.accepted;

			var url = appUrl + (accepted ? '' : 'dataprocessing');

			listenToMessages();

			return buildIFrame(url);
		}

		isDataProcessingAccepted().then(proceed).then(done);
	}

	return { init: init };
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcF9zdG9yZS9hcHBfc3RvcmUuanMiXSwibmFtZXMiOlsiZ3giLCJjb250cm9sbGVycyIsIm1vZHVsZSIsInNvdXJjZSIsImFwcFVybCIsImFwcFRva2VuIiwicGFyZW50IiwiaWZyYW1lIiwiZmV0Y2hTaG9wSW5mbyIsImhhbmRsZSIsInJlc29sdmUiLCJqc2UiLCJsaWJzIiwieGhyIiwiZ2V0IiwidXJsIiwiZG9uZSIsIlByb21pc2UiLCJpc0RhdGFQcm9jZXNzaW5nQWNjZXB0ZWQiLCJidWlsZElGcmFtZSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImxhbmd1YWdlIiwiY29yZSIsImNvbmZpZyIsImluY2x1ZGVzIiwic3JjIiwic3R5bGUiLCJ3aWR0aCIsImhlaWdodCIsImJvcmRlciIsIm92ZXJmbG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsImFwcGVuZENoaWxkIiwibGlzdGVuVG9NZXNzYWdlcyIsIm9uTWVzc2FnZSIsImRhdGEiLCJ0eXBlIiwicGF5bG9hZCIsInNldFVwZGF0ZXNDb3VudGVyIiwidXBkYXRlc0NvdW50ZXIiLCJ0aGVuIiwic2VuZFNob3BJbmZvIiwic2VuZE1lc3NhZ2UiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJpbnN0YWxsIiwidW5pbnN0YWxsVGhlbWUiLCJyZWxvYWQiLCJhY3RpdmF0ZVRoZW1lIiwicG9zdCIsInRoZW1lU3RvcmFnZU5hbWUiLCJmYWlsIiwiY29udGVudFdpbmRvdyIsInBvc3RNZXNzYWdlIiwic2hvcEluZm8iLCIkaW5zdGFsbGluZ1BhY2thZ2VNb2RhbCIsIiQiLCIkcHJvZ3Jlc3NEZXNjcmlwdGlvbiIsImZpbmQiLCIkcHJvZ3Jlc3NCYXIiLCJ0ZXh0IiwibGFuZyIsInRyYW5zbGF0ZSIsInVwZGF0ZVByb2dyZXNzQ2FsbGJhY2siLCJwcm9ncmVzcyIsInByb2dyZXNzUGVyY2VudGFnZSIsIk1hdGgiLCJjZWlsIiwicHJvcCIsImNzcyIsIm1vZGFsIiwiYXV0b191cGRhdGVyIiwiY2hlY2tBcHBTdG9yZVBhY2thZ2VGaWxlUGVybWlzc2lvbnMiLCJpbnN0YWxsQXBwU3RvcmVQYWNrYWdlIiwiZGV0YWlscyIsImdhbGxlcnkiLCJmaWxlTmFtZSIsInJlc3BvbnNlIiwiaXNBY3RpdmUiLCJjYXRjaCIsImZpbmFsbHkiLCJzZXRUaW1lb3V0IiwiZmlsZW5hbWUiLCJhZGp1c3RCYWNrZ3JvdW5kQ29sb3IiLCJnZXRFbGVtZW50QnlJZCIsImJhY2tncm91bmQiLCJ1cGRhdGVzQXZhaWxhYmxlIiwiY2xhc3NOYW1lIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImxlbmd0aCIsImRpc3BsYXkiLCJpbm5lckhUTUwiLCJuYXZJdGVtIiwicXVlcnlTZWxlY3RvciIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiaW5pdCIsInByb2NlZWQiLCJhY2NlcHRlZCJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7OztBQVVBOzs7Ozs7O0FBT0FBLEdBQUdDLFdBQUgsQ0FBZUMsTUFBZixDQUNDLFdBREQsRUFFQyxDQUFDLEtBQUQsRUFBV0YsR0FBR0csTUFBZCx3QkFGRCxFQUdDLGdCQUE2QjtBQUFBLEtBQW5CQyxNQUFtQixRQUFuQkEsTUFBbUI7QUFBQSxLQUFYQyxRQUFXLFFBQVhBLFFBQVc7O0FBQzVCOzs7OztBQUtBLEtBQU1DLFNBQVMsS0FBSyxDQUFMLENBQWY7O0FBRUE7Ozs7O0FBS0EsS0FBSUMsZUFBSjs7QUFFQTs7Ozs7QUFLQSxVQUFTQyxhQUFULEdBQXlCO0FBQ3hCLFdBQVNDLE1BQVQsQ0FBZ0JDLE9BQWhCLEVBQXlCO0FBQ3hCQyxPQUFJQyxJQUFKLENBQVNDLEdBQVQsQ0FDRUMsR0FERixDQUNNLEVBQUNDLEtBQUssb0RBQU4sRUFETixFQUVFQyxJQUZGLENBRU9OLE9BRlA7QUFHQTs7QUFFRCxTQUFPLElBQUlPLE9BQUosQ0FBWVIsTUFBWixDQUFQO0FBQ0E7O0FBRUQ7Ozs7O0FBS0EsVUFBU1Msd0JBQVQsR0FBb0M7QUFDbkMsV0FBU1QsTUFBVCxDQUFnQkMsT0FBaEIsRUFBeUI7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O0FBRURHLDZCQUNFdUIsSUFERixDQUNPMEQsT0FEUCxFQUVFMUQsSUFGRixDQUVPekIsSUFGUDtBQUdBOztBQUVELFFBQU8sRUFBQ2tGLFVBQUQsRUFBUDtBQUNBLENBblZGIiwiZmlsZSI6ImFwcF9zdG9yZS9hcHBfc3RvcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIGFwcF9zdG9yZV9jb250cm9sbGVyIDIwMTktMDItMThcbiBHYW1iaW8gR21iSFxuIGh0dHA6Ly93d3cuZ2FtYmlvLmRlXG4gQ29weXJpZ2h0IChjKSAyMDE2IEdhbWJpbyBHbWJIXG4gUmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpXG4gW2h0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWxdXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqICMjIEFwcFN0b3JlIENvbnRyb2xsZXJcbiAqXG4gKiBUaGlzIGNvbnRyb2xsZXIgd2lsbCBoYW5kbGVzIHRoZSBmcm9udGVuZCBsb2dpYyBvZiB0aGUgQXBwU3RvcmUgcGFnZS5cbiAqXG4gKiBAbW9kdWxlIENvbnRyb2xsZXJzL2FwcF9zdG9yZVxuICovXG5neC5jb250cm9sbGVycy5tb2R1bGUoXG5cdCdhcHBfc3RvcmUnLFxuXHRbJ3hocicsIGAke2d4LnNvdXJjZX0vbGlicy9hdXRvX3VwZGF0ZXJgXSxcblx0ZnVuY3Rpb24oe2FwcFVybCwgYXBwVG9rZW59KSB7XG5cdFx0LyoqXG5cdFx0ICogTW9kdWxlIGVsZW1lbnRcblx0XHQgKlxuXHRcdCAqIEB0eXBlIHtIVE1MRWxlbWVudH1cblx0XHQgKi9cblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzWzBdO1xuXHRcdFxuXHRcdC8qKlxuXHRcdCAqIElmcmFtZSBlbGVtZW50XG5cdFx0ICpcblx0XHQgKiBAdHlwZSB7SFRNTElGcmFtZUVsZW1lbnR9XG5cdFx0ICovXG5cdFx0bGV0IGlmcmFtZTtcblx0XHRcblx0XHQvKipcblx0XHQgKiBSZXR1cm4gc2hvcCBpbmZvcm1hdGlvblxuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn1cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBmZXRjaFNob3BJbmZvKCkge1xuXHRcdFx0ZnVuY3Rpb24gaGFuZGxlKHJlc29sdmUpIHtcblx0XHRcdFx0anNlLmxpYnMueGhyXG5cdFx0XHRcdFx0LmdldCh7dXJsOiAnLi9hZG1pbi5waHA/ZG89QXBwU3RvcmVBamF4L2NvbGxlY3RTaG9wSW5mb3JtYXRpb24nfSlcblx0XHRcdFx0XHQuZG9uZShyZXNvbHZlKTtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGhhbmRsZSlcblx0XHR9XG5cdFx0XG5cdFx0LyoqXG5cdFx0ICogUmV0dXJuIHdoZXRoZXIgdGhlIGRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBhY2NlcHRlZC5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gaXNEYXRhUHJvY2Vzc2luZ0FjY2VwdGVkKCkge1xuXHRcdFx0ZnVuY3Rpb24gaGFuZGxlKHJlc29sdmUpIHtcblx0XHRcdFx0anNlLmxpYnMueGhyXG5cdFx0XHRcdFx0LmdldCh7dXJsOiAnLi9hZG1pbi5waHA/ZG89QXBwU3RvcmVBamF4L2lzRGF0YVByb2Nlc3NpbmdBY2NlcHRlZCd9KVxuXHRcdFx0XHRcdC5kb25lKHJlc29sdmUpO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoaGFuZGxlKVxuXHRcdH1cblx0XHRcblx0XHQvKipcblx0XHQgKiBCdWlsZCBJZnJhbWUgZWxlbWVudCBhbmQgcmVzb2x2ZSByZXR1cm5lZCBwcm9taXNlIG9uY2UgdGhlIGNvbnRlbnQgaXMgbG9hZGVkXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIElmcmFtZSBVUkxcblx0XHQgKiBAcmV0dXJucyB7UHJvbWlzZTxFdmVudD59XG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gYnVpbGRJRnJhbWUodXJsKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIEJ1aWxkIGVsZW1lbnRcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZXNvbHZlXG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uIGhhbmRsZShyZXNvbHZlKSB7XG5cdFx0XHRcdGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuXHRcdFx0XHRcblx0XHRcdFx0Y29uc3QgbGFuZ3VhZ2UgPSBqc2UuY29yZS5jb25maWcuZ2V0KCdsYW5ndWFnZUNvZGUnKTtcblx0XHRcdFx0YXBwVXJsICs9IGFwcFVybC5pbmNsdWRlcygnPycpID8gJyZsYW5ndWFnZT0nICsgbGFuZ3VhZ2UgOiAnP2xhbmd1YWdlPScgKyBsYW5ndWFnZTtcblx0XHRcdFx0XG5cdFx0XHRcdGlmcmFtZS5zcmMgPSBhcHBVcmw7XG5cdFx0XHRcdGlmcmFtZS5zdHlsZS53aWR0aCA9ICcxMDAlJztcblx0XHRcdFx0aWZyYW1lLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcblx0XHRcdFx0aWZyYW1lLnN0eWxlLmJvcmRlciA9ICdub25lJztcblx0XHRcdFx0aWZyYW1lLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cdFx0XHRcdFxuXHRcdFx0XHRpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlc29sdmUpO1xuXHRcdFx0XHRcblx0XHRcdFx0cGFyZW50LmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShoYW5kbGUpO1xuXHRcdH1cblx0XHRcblx0XHQvKipcblx0XHQgKiBBdHRhY2ggbWVzc2FnZSBldmVudCBsaXN0ZW5lclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGxpc3RlblRvTWVzc2FnZXMoKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIEhhbmRsZSBtZXNzYWdlIGV2ZW50XG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IGV2ZW50XG5cdFx0XHQgKi9cblx0XHRcdGZ1bmN0aW9uIG9uTWVzc2FnZSh7ZGF0YX0pIHtcblx0XHRcdFx0Y29uc3Qge3R5cGUsIHBheWxvYWR9ID0gZGF0YTtcblx0XHRcdFx0XG5cdFx0XHRcdGlmICh0eXBlID09PSAncmVzcG9uc2VfaWZyYW1lX2hlaWdodCcpIHtcblx0XHRcdFx0XHRpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gYCR7cGF5bG9hZC5oZWlnaHR9cHhgO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdFx0aWYgKHR5cGUgPT09ICd1cGRhdGVzX2NvdW50ZXInKSB7XG5cdFx0XHRcdFx0c2V0VXBkYXRlc0NvdW50ZXIocGF5bG9hZC51cGRhdGVzQ291bnRlcik7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ3VwZGF0ZV9zaG9wX2luZm9ybWF0aW9uJyB8fCB0eXBlID09PSAncmVxdWVzdF9zaG9wX2luZm9ybWF0aW9uJykge1xuXHRcdFx0XHRcdGZldGNoU2hvcEluZm8oKS50aGVuKHNlbmRTaG9wSW5mbyk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ3JlcXVlc3RfYXBwX3Rva2VuJykge1xuXHRcdFx0XHRcdHNlbmRNZXNzYWdlKCdzZW5kX2FwcF90b2tlbicsIHsnYXBwVG9rZW4nOiBhcHBUb2tlbn0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdFx0aWYgKHR5cGUgPT09ICdzZW5kX2RhdGFfcHJvY2Vzc2luZ19hY2NlcHRlZCcpIHtcblx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9ICdhZG1pbi5waHA/ZG89QXBwU3RvcmUvQWNjZXB0RGF0YVByb2Nlc3NpbmcnO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdFx0aWYgKHR5cGUgPT09ICdzdGFydF9pbnN0YWxsYXRpb25fcHJvY2VzcycpIHtcblx0XHRcdFx0XHRpbnN0YWxsKHBheWxvYWQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdFx0aWYgKHR5cGUgPT09ICd1bmluc3RhbGxfdGhlbWUnKSB7XG5cdFx0XHRcdFx0dW5pbnN0YWxsVGhlbWUocGF5bG9hZCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0XG5cdFx0XHRcdGlmICh0eXBlID09PSAncmVsb2FkX3BhZ2UnKSB7XG5cdFx0XHRcdFx0d2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdFx0aWYgKHR5cGUgPT09ICdhY3RpdmF0ZV90aGVtZScpIHtcblx0XHRcdFx0XHRhY3RpdmF0ZVRoZW1lKHBheWxvYWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgb25NZXNzYWdlKTtcblx0XHR9XG5cdFx0XG5cdFx0LyoqXG5cdFx0ICogQWN0aXZhdGUgYSB0aGVtZS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBwYXlsb2FkXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gYWN0aXZhdGVUaGVtZShwYXlsb2FkKSB7XG5cdFx0XHRqc2UubGlicy54aHJcblx0XHRcdFx0LnBvc3Qoe1xuXHRcdFx0XHRcdHVybDogJy4vYWRtaW4ucGhwP2RvPUFwcFN0b3JlL0FjdGl2YXRlVGhlbWUnLFxuXHRcdFx0XHRcdGRhdGE6IHsndGhlbWVTdG9yYWdlTmFtZSc6IHBheWxvYWQudGhlbWVTdG9yYWdlTmFtZX1cblx0XHRcdFx0fSkuZG9uZSgoKSA9PiB7XG5cdFx0XHRcdHNlbmRNZXNzYWdlKCdhY3RpdmF0aW9uX3N1Y2NlZWRlZCcpO1xuXHRcdFx0fSkuZmFpbCgoKSA9PiB7XG5cdFx0XHRcdHNlbmRNZXNzYWdlKCdhY3RpdmF0aW9uX2ZhaWxlZCcpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdFxuXHRcdC8qKlxuXHRcdCAqIFNlbmQgbWVzc2FnZSB0byBJZnJhbWVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE1lc3NhZ2UgdHlwZVxuXHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBbcGF5bG9hZF0gTWVzc2FnZSBwYXlsb2FkXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gc2VuZE1lc3NhZ2UodHlwZSwgcGF5bG9hZCkge1xuXHRcdFx0aWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe3R5cGUsIHBheWxvYWR9LCAnKicpO1xuXHRcdH1cblx0XHRcblx0XHQvKipcblx0XHQgKiBTZW5kIHNob3AgaW5mb3JtYXRpb24gZGF0YSB0byBJZnJhbWVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzaG9wSW5mbyBTaG9wIGluZm9ybWF0aW9uIGRhdGFcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBzZW5kU2hvcEluZm8oc2hvcEluZm8pIHtcblx0XHRcdHNlbmRNZXNzYWdlKCdzZW5kX3Nob3BfaW5mb3JtYXRpb24nLCB7c2hvcEluZm99KVxuXHRcdH1cblx0XHRcblx0XHQvKipcblx0XHQgKiBJbnN0YWxsIGEgcGFja2FnZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgUGFja2FnZSBkYXRhXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gaW5zdGFsbChkYXRhKSB7XG5cdFx0XHRjb25zdCAkaW5zdGFsbGluZ1BhY2thZ2VNb2RhbCA9ICQoJy5pbnN0YWxsaW5nLXBhY2thZ2UubW9kYWwnKTtcblx0XHRcdGNvbnN0ICRwcm9ncmVzc0Rlc2NyaXB0aW9uID0gJGluc3RhbGxpbmdQYWNrYWdlTW9kYWwuZmluZCgnLnByb2dyZXNzLWRlc2NyaXB0aW9uJyk7XG5cdFx0XHRjb25zdCAkcHJvZ3Jlc3NCYXIgPSAkaW5zdGFsbGluZ1BhY2thZ2VNb2RhbC5maW5kKCcucHJvZ3Jlc3MgLnByb2dyZXNzLWJhcicpO1xuXHRcdFx0XG5cdFx0XHQkcHJvZ3Jlc3NEZXNjcmlwdGlvbi50ZXh0KGpzZS5jb3JlLmxhbmcudHJhbnNsYXRlKCdQUkVQQVJJTkdfUEFDS0FHRScsICdhcHBfc3RvcmUnKSk7XG5cdFx0XHRcblx0XHRcdGNvbnN0IHVwZGF0ZVByb2dyZXNzQ2FsbGJhY2sgPSAoe3Byb2dyZXNzfSkgPT4ge1xuXHRcdCAgICAgICAgbGV0IHByb2dyZXNzUGVyY2VudGFnZSA9IE1hdGguY2VpbChwcm9ncmVzcyAqIDEwMCk7XG5cdFx0XHRcdFxuXHRcdFx0XHRpZiAocHJvZ3Jlc3NQZXJjZW50YWdlIDwgMCkge1xuXHRcdFx0XHRcdHByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvZ3Jlc3NQZXJjZW50YWdlID4gMTAwKSB7XG5cdFx0XHRcdFx0cHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHQkcHJvZ3Jlc3NCYXIucHJvcCgnYXJpYS12YWx1ZW5vdycsIHByb2dyZXNzUGVyY2VudGFnZSk7XG5cdFx0XHRcdCRwcm9ncmVzc0Jhci5jc3MoJ3dpZHRoJywgcHJvZ3Jlc3NQZXJjZW50YWdlICsgJyUnKTtcblx0XHRcdFx0JHByb2dyZXNzQmFyLnRleHQocHJvZ3Jlc3NQZXJjZW50YWdlICsgJyUnKTtcblx0XHRcdH07XG5cdFx0XHRcblx0XHRcdHVwZGF0ZVByb2dyZXNzQ2FsbGJhY2soe3Byb2dyZXNzOiAwfSk7IC8vIHJlc2V0XG5cdFx0XHRcblx0XHRcdCRpbnN0YWxsaW5nUGFja2FnZU1vZGFsLm1vZGFsKCdzaG93Jyk7XG5cdFx0XHRcblx0XHRcdGpzZS5saWJzLmF1dG9fdXBkYXRlclxuXHRcdFx0XHQuY2hlY2tBcHBTdG9yZVBhY2thZ2VGaWxlUGVybWlzc2lvbnMoZGF0YSlcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0JHByb2dyZXNzRGVzY3JpcHRpb24udGV4dChqc2UuY29yZS5sYW5nLnRyYW5zbGF0ZSgnSU5TVEFMTElOR19QQUNLQUdFJywgJ2FwcF9zdG9yZScpKTtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0anNlLmxpYnMuYXV0b191cGRhdGVyXG5cdFx0XHRcdFx0XHRcdC5pbnN0YWxsQXBwU3RvcmVQYWNrYWdlKGRhdGEsIHVwZGF0ZVByb2dyZXNzQ2FsbGJhY2spXG5cdFx0XHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHQvLyBCeSBjaGVja2luZyB3aGV0aGVyIGEgZ2FsbGVyeSBvYmplY3QgaXMgcHJlc2VudCxcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSB0aGVtZSBvciBub3QuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGRhdGEuZGV0YWlscy5nYWxsZXJ5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBmaW5kIG91dCBpZiB0aGUgaW5zdGFsbGVkIHRoZW1lIHdhcyBhbiB1cGRhdGUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGhlbWVcblx0XHRcdFx0XHRcdFx0XHRcdGpzZS5saWJzLnhoci5nZXQoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR1cmw6ICcuL2FkbWluLnBocD9kbz1BcHBTdG9yZUFqYXgvSXNUaGVtZUFjdGl2ZSZ0aGVtZU5hbWU9JyArIGRhdGEuZGV0YWlscy5maWxlTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0fSkuZG9uZShyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyZXNwb25zZS5pc0FjdGl2ZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBpZiBzbywgYWN0aXZhdGUgaXQgYWdhaW4gZm9yIHRoZSBjb250ZW50IG1hbmFnZXIgZW50cmllc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpzZS5saWJzLnhoclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LnBvc3Qoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1cmw6ICcuL2FkbWluLnBocD9kbz1BcHBTdG9yZS9BY3RpdmF0ZVRoZW1lJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YTogeyd0aGVtZVN0b3JhZ2VOYW1lJzogZGF0YS5kZXRhaWxzLmZpbGVOYW1lfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSkuZG9uZSgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzZW5kTWVzc2FnZSgnaW5zdGFsbGF0aW9uX3N1Y2NlZWRlZCcpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSkuZmFpbCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzZW5kTWVzc2FnZSgnaW5zdGFsbGF0aW9uX2ZhaWxlZCcpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzZW5kTWVzc2FnZSgnaW5zdGFsbGF0aW9uX3N1Y2NlZWRlZCcpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0pLmZhaWwoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzZW5kTWVzc2FnZSgnaW5zdGFsbGF0aW9uX2ZhaWxlZCcpXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2VuZE1lc3NhZ2UoJ2luc3RhbGxhdGlvbl9zdWNjZWVkZWQnKVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmNhdGNoKCgpID0+XG5cdFx0XHRcdFx0XHRcdFx0c2VuZE1lc3NhZ2UoJ2luc3RhbGxhdGlvbl9mYWlsZWQnKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHR1cGRhdGVQcm9ncmVzc0NhbGxiYWNrKHtwcm9ncmVzczogMX0pO1xuXHRcdFx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0JGluc3RhbGxpbmdQYWNrYWdlTW9kYWwubW9kYWwoJ2hpZGUnKTtcblx0XHRcdFx0XHRcdFx0XHR9LCAyMDAwKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHRcdC5jYXRjaCgoKSA9PiBzZW5kTWVzc2FnZSgnZnRwX2RhdGFfcmVxdWVzdGVkJykpO1xuXHRcdH1cblx0XHRcblx0XHQvKipcblx0XHQgKiBVbmluc3RhbGwgYSB0aGVtZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgVGhlbWUgZGF0YVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHVuaW5zdGFsbFRoZW1lKGRhdGEpIHtcblx0XHRcdGpzZS5saWJzLmF1dG9fdXBkYXRlclxuXHRcdFx0XHQudW5pbnN0YWxsVGhlbWUoZGF0YS5maWxlbmFtZSlcblx0XHRcdFx0LnRoZW4oKCkgPT4gc2VuZE1lc3NhZ2UoJ3VuaW5zdGFsbF9zdWNjZWVkZWQnKSlcblx0XHRcdFx0LmNhdGNoKChkYXRhKSA9PiBzZW5kTWVzc2FnZSgndW5pbnN0YWxsX2ZhaWxlZCcsIGRhdGEpKTtcblx0XHR9XG5cdFx0XG5cdFx0LyoqXG5cdFx0ICogQXBwbGllcyBhIGRhcmtlciBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSBwYWdlLlxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGFkanVzdEJhY2tncm91bmRDb2xvcigpIHtcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLWNvbnRlbnQnKS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmNWY1ZjUnO1xuXHRcdH1cblx0XHRcblx0XHQvKipcblx0XHQgKiBTZXQgdGhlIHVwZGF0ZXMgY291bnRlciBiYWRnZSBpbiB0aGUgcGFnZSBuYXZpZ2F0aW9uIHJvdy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSB1cGRhdGVzQXZhaWxhYmxlXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gc2V0VXBkYXRlc0NvdW50ZXIodXBkYXRlc0F2YWlsYWJsZSkge1xuXHRcdFx0Y29uc3QgY2xhc3NOYW1lID0gJ2FwcC1zdG9yZS11cGRhdGVzLWNvdW50ZXInO1xuXHRcdFx0XG5cdFx0XHRsZXQgdXBkYXRlc0NvdW50ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSk7XG5cdFx0XHRcblx0XHRcdGlmICh1cGRhdGVzQXZhaWxhYmxlID09PSAwKSB7XG5cdFx0XHRcdGlmICh1cGRhdGVzQ291bnRlci5sZW5ndGggJiYgdXBkYXRlc0NvdW50ZXIuc3R5bGUpIHtcblx0XHRcdFx0XHR1cGRhdGVzQ291bnRlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHVwZGF0ZXNDb3VudGVyLmxlbmd0aCAmJiB1cGRhdGVzQ291bnRlci5zdHlsZSkge1xuXHRcdFx0XHRcdHVwZGF0ZXNDb3VudGVyLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdGlmICh1cGRhdGVzQ291bnRlci5sZW5ndGgpIHtcblx0XHRcdFx0dXBkYXRlc0NvdW50ZXIuaW5uZXJIVE1MID0gdXBkYXRlc0F2YWlsYWJsZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHR1cGRhdGVzQ291bnRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHRcdHVwZGF0ZXNDb3VudGVyLmNsYXNzTmFtZSA9ICdhcHAtc3RvcmUtdXBkYXRlcy1jb3VudGVyJztcblx0XHRcdHVwZGF0ZXNDb3VudGVyLmlubmVySFRNTCA9IHVwZGF0ZXNBdmFpbGFibGU7XG5cdFx0XHRcblx0XHRcdGNvbnN0IG5hdkl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWFpbi1jb250ZW50IC5jb250ZW50LW5hdmlnYXRpb24gLm5hdi1pdGVtOmxhc3QtY2hpbGQnKTtcblx0XHRcdFxuXHRcdFx0aWYgKCFuYXZJdGVtKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0aWYgKG5hdkl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCduby1saW5rJykpIHtcblx0XHRcdFx0bmF2SXRlbS5hcHBlbmRDaGlsZCh1cGRhdGVzQ291bnRlcik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuYXZJdGVtLnF1ZXJ5U2VsZWN0b3IoJ2EnKS5hcHBlbmRDaGlsZCh1cGRhdGVzQ291bnRlcik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdC8qKlxuXHRcdCAqIEluaXRpYWxpemVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmUgSlNFbmdpbmUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHJlYWR5IHN0YXRlIGluZGljYXRpb25cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBpbml0KGRvbmUpIHtcblx0XHRcdGFkanVzdEJhY2tncm91bmRDb2xvcigpO1xuXHRcdFx0XG5cdFx0XHRmdW5jdGlvbiBwcm9jZWVkKHthY2NlcHRlZH0pIHtcblx0XHRcdFx0bGV0IHVybCA9IGFwcFVybCArIChhY2NlcHRlZCA/ICcnIDogJ2RhdGFwcm9jZXNzaW5nJylcblx0XHRcdFx0XG5cdFx0XHRcdGxpc3RlblRvTWVzc2FnZXMoKTtcblx0XHRcdFx0XG5cdFx0XHRcdHJldHVybiBidWlsZElGcmFtZSh1cmwpO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRpc0RhdGFQcm9jZXNzaW5nQWNjZXB0ZWQoKVxuXHRcdFx0XHQudGhlbihwcm9jZWVkKVxuXHRcdFx0XHQudGhlbihkb25lKTtcblx0XHR9XG5cdFx0XG5cdFx0cmV0dXJuIHtpbml0fTtcblx0fVxuKTtcbiJdfQ==

Youez - 2016 - github.com/yon3zu
LinuXploit