| 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 : |
'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==