1412 lines
194 KiB
JavaScript
1412 lines
194 KiB
JavaScript
/******/ (function() { // webpackBootstrap
|
||
/******/ var __webpack_modules__ = ({
|
||
|
||
/***/ "../config/instance.js":
|
||
/*!*****************************!*\
|
||
!*** ../config/instance.js ***!
|
||
\*****************************/
|
||
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
||
|
||
const users = __webpack_require__(/*! ./users */ "../config/users.js");
|
||
|
||
const questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js");
|
||
|
||
module.exports = {
|
||
apiUrl: "http://localhost:3000/api",
|
||
siteUrl: "http://localhost:8080",
|
||
adminName: "Fabrice",
|
||
adminEmail: "dev@wikilerni.com",
|
||
senderName: "WikiLerni (local)",
|
||
senderEmail: "bonjour@wikilerni.com",
|
||
adminLang: "fr",
|
||
theme: "wikilerni",
|
||
// le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.
|
||
availableLangs: ["fr"],
|
||
// Languages in which the site is available. The first one is the default one.
|
||
siteName: "WikiLerni (local)",
|
||
beginCodeGodfather: "WL",
|
||
// case-sensitive and can't contain "@" !
|
||
defaultReceiptDays: "147",
|
||
// Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)
|
||
cronTimingAlertInSeconde: 120,
|
||
// for logs
|
||
responseTimingAlertInSeconde: 3,
|
||
// idem
|
||
tokenSignupValidationTimeInHours: "48h",
|
||
// https://github.com/zeit/ms
|
||
tokenLoginLinkTimeInHours: "1h",
|
||
tokenConnexionMinTimeInHours: "24h",
|
||
tokenConnexionMaxTimeInDays: "180 days",
|
||
tokenLoginChangingTimeInHours: "1h",
|
||
// for email & password changing
|
||
tokenDeleteUserTimeInHours: "1h",
|
||
tokenUnsubscribeLinkTimeInDays: "7 days",
|
||
// token send with subscription's emails
|
||
freeAccountTimingInDays: 0,
|
||
// if 0 = unlimited
|
||
freeAccountExpirationNotificationInDays: 3,
|
||
accountExpirationFirstNotificationInDays: 10,
|
||
accountExpirationSecondNotificationInDays: 3,
|
||
inactiveAccountTimeToDeleteInDays: 180,
|
||
// Questionnaires:
|
||
nbQuestionsMin: 1,
|
||
// minimum number of questions for the questionnaire to be publishable
|
||
nbQuestionsMax: 2,
|
||
// if 0 = not maximum
|
||
nbChoicesMax: 10,
|
||
nbNewQuestionnaires: 12,
|
||
// for RSS, etc.
|
||
hourGiveNewQuestionnaireBegin: 7,
|
||
// in user local time
|
||
hourGiveNewQuestionnaireEnd: 21,
|
||
// idem
|
||
maxQuestionnaireSendedAtSameTime: 50,
|
||
// for subscription's e-mailing
|
||
minSearchQuestionnaires: 3,
|
||
fieldNewQuestionnaires: "publishingAt",
|
||
// field to be used to create the list of the last questionnaires, can be "createdAt", "updatedAt" or "publishingAt"
|
||
// Groups :
|
||
nbQuestionnairesByGroupMin: 1,
|
||
nbQuestionnairesByGroupMax: 0,
|
||
// Illustrations:
|
||
nbIllustrationsMin: 1,
|
||
nbIllustrationsMax: 1,
|
||
maxIllustrationSizeinOctet: 1000000,
|
||
// pas contrôlé pour l'instant. À revoir.
|
||
mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"],
|
||
// -- Upload and resize:
|
||
illustrationsWidthMaxInPx: 500,
|
||
illustrationsMiniaturesWidthMaxInPx: 200,
|
||
// Links:
|
||
nbLinksMin: 1,
|
||
nbLinksMax: 0,
|
||
// Questions & responses:
|
||
nbQuestionsMin: 1,
|
||
nbQuestionsMax: 0,
|
||
nbChoicesMax: 10,
|
||
// à supprimer quand tous les "require" à jour:
|
||
passwordMinLength: users.password.minlength,
|
||
dirCacheUsers: users.dirCacheUsers,
|
||
dirCacheUsersAnswers: users.dirCacheUsersAnswers,
|
||
dirCacheQuestionnaires: questionnaires.dirCacheQuestionnaires,
|
||
dirCacheQuestions: questionnaires.dirCacheQuestions,
|
||
dirCacheUsersQuestionnaires: questionnaires.dirCacheUsersQuestionnaires,
|
||
dirHTMLQuestionnaires: questionnaires.dirHTMLQuestionnaires,
|
||
dirWebQuestionnaires: questionnaires.dirWebQuestionnaires
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../config/matomo.js":
|
||
/*!***************************!*\
|
||
!*** ../config/matomo.js ***!
|
||
\***************************/
|
||
/***/ (function(module) {
|
||
|
||
// Si non utilisé, supprimer l'appel des JS front-end puis recompiler.
|
||
// Revoir comment réorganiser cela sous-forme de module indépendant.
|
||
module.exports = {
|
||
// Stats Matomo :
|
||
matomo: {
|
||
url: "https://stats.le-fab-lab.com/",
|
||
siteId: "5"
|
||
}
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../config/questionnaires.js":
|
||
/*!***********************************!*\
|
||
!*** ../config/questionnaires.js ***!
|
||
\***********************************/
|
||
/***/ (function(module) {
|
||
|
||
module.exports = {
|
||
// API'routes (after "apiUrl" defined in instance.js)
|
||
questionnaireRoutes: "/questionnaire",
|
||
// la base à laquelle s'ajoute les routes suivantes
|
||
getListNextQuestionnaires: "/getlistnextquestionnaires/",
|
||
getQuestionnaireRoutes: "/get",
|
||
getRandomQuestionnairesRoute: "/getrandom",
|
||
getStatsQuestionnaires: "/stats/",
|
||
previewQuestionnaireRoutes: "/preview",
|
||
publishedQuestionnaireRoutes: "/quiz/",
|
||
regenerateHTML: "/htmlregenerated",
|
||
searchAdminQuestionnairesRoute: "/searchadmin",
|
||
searchQuestionnairesRoute: "/search",
|
||
// -- groupes :
|
||
groupRoutes: "/group",
|
||
getGroupRoute: "/get/",
|
||
previewGroupRoutes: "/preview",
|
||
searchGroupsRoute: "/search",
|
||
// -- questions & choices :
|
||
questionsRoute: "/question/",
|
||
// -- tags :
|
||
tagsSearchRoute: "/tags/search/",
|
||
// -- answers :
|
||
getAdminStats: "/getadminstats/",
|
||
getPreviousAnswers: "/user/answers/",
|
||
getStatsAnswers: "/user/anwswers/stats/",
|
||
// fonctionne aussi pour les groupes
|
||
saveAnswersRoute: "/answer/",
|
||
// idem
|
||
// forms : à compléter avec valeurs par défaut, etc. cf modèle
|
||
Questionnaire: {
|
||
title: {
|
||
maxlength: 255,
|
||
required: true
|
||
},
|
||
slug: {
|
||
maxlength: 150
|
||
},
|
||
// champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
|
||
introduction: {
|
||
required: true
|
||
}
|
||
},
|
||
searchQuestionnaires: {
|
||
minlength: 3,
|
||
required: true
|
||
},
|
||
Group: {
|
||
title: {
|
||
maxlength: 255,
|
||
required: true
|
||
},
|
||
slug: {
|
||
maxlength: 150
|
||
} // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
|
||
|
||
},
|
||
Question: {
|
||
text: {
|
||
maxlength: 255,
|
||
required: true
|
||
},
|
||
rank: {
|
||
required: true,
|
||
min: 1,
|
||
defaultValue: 1
|
||
}
|
||
},
|
||
Choice: {
|
||
text: {
|
||
maxlength: 255,
|
||
required: true
|
||
}
|
||
},
|
||
search: {
|
||
minlength: 3,
|
||
required: true
|
||
},
|
||
searchGroups: {
|
||
minlength: 3,
|
||
required: true
|
||
},
|
||
// Emplacement des fichiers JSON générés :
|
||
dirCacheGroups: "datas/questionnaires/groups",
|
||
dirCacheQuestionnaires: "datas/questionnaires",
|
||
dirCacheQuestions: "datas/questionnaires/questions",
|
||
dirCacheTags: "datas/questionnaires/tags",
|
||
dirCacheUsersQuestionnaires: "datas/users/questionnaires",
|
||
// Emplacement des fichiers HTML générés :
|
||
dirHTMLGroups: "front/public/quiz/gp",
|
||
dirHTMLQuestionnaires: "front/public/quiz",
|
||
dirHTMLNews: "front/public/quizs",
|
||
dirHTMLTags: "front/public/quizs",
|
||
// Idem mais pour urls :
|
||
dirWebGroups: "quiz/gp",
|
||
dirWebQuestionnaires: "quiz",
|
||
dirWebNews: "quizs/",
|
||
dirWebTags: "quizs/",
|
||
// limite des résultat du moteur de recherche, quand demande de résultats au hasard :
|
||
nbRandomResults: 3,
|
||
|
||
/* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */
|
||
nbQuestionsMin: 1,
|
||
nbQuestionsMax: 0,
|
||
nbChoicesMax: 10,
|
||
nbTagsMin: 0,
|
||
nbTagsMax: 0 // 0 = not max
|
||
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../config/users.js":
|
||
/*!**************************!*\
|
||
!*** ../config/users.js ***!
|
||
\**************************/
|
||
/***/ (function(module) {
|
||
|
||
module.exports = {
|
||
// API'routes (after "apiUrl" defined in instance.js)
|
||
userRoutes: "/user",
|
||
checkDeleteLinkRoute: "/confirmdelete/",
|
||
checkIfIsEmailfreeRoute: "/isemailfree",
|
||
checkLoginRoute: "/checklogin/",
|
||
checkNewLoginLinkRoute: "/confirmnewlogin/",
|
||
checkSubscribeTokenRoute: "/validation/",
|
||
connectionRoute: "/login",
|
||
connectionWithLinkRoute: "/checkloginlink",
|
||
createUserRoute: "/create",
|
||
getAdminStats: "/getadminstats/",
|
||
getGodChilds: "/getgodchilds/",
|
||
getGodfatherRoute: "/getgodfatherid",
|
||
getLoginLinkRoute: "/getloginlink",
|
||
getPayments: "/payment/getforoneuser/",
|
||
getUserInfos: "/get/",
|
||
getUsersQuestionnairesRoute: "/getusersquestionnaires/",
|
||
// les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement
|
||
searchUserRoute: "/search/",
|
||
signupCompletionRoute: "/signupcompletion/",
|
||
subscribeRoute: "/signup",
|
||
unsubscribeRoute: "/subscription/stop/",
|
||
updateUserInfos: "/modify/",
|
||
validateUserRoute: "/validate/",
|
||
// forms : à compléter avec valeurs par défaut, etc. cf modèle
|
||
name: {
|
||
maxlength: 70,
|
||
required: true
|
||
},
|
||
email: {
|
||
maxlength: 255,
|
||
required: true
|
||
},
|
||
password: {
|
||
minlength: 8,
|
||
maxlength: 72,
|
||
required: true
|
||
},
|
||
// https://www.npmjs.com/package/bcrypt#security-issues-and-concerns
|
||
newPassword: {
|
||
minlength: 8,
|
||
maxlength: 72
|
||
},
|
||
codeGodfather: {
|
||
maxlength: 255
|
||
},
|
||
cguOk: {
|
||
value: "true",
|
||
required: true
|
||
},
|
||
search: {
|
||
minlength: 1,
|
||
required: true
|
||
},
|
||
timeDifferenceMin: -720,
|
||
timeDifferenceMax: 840,
|
||
// JSON dir
|
||
dirCacheUsers: "datas/users",
|
||
dirCacheUsersAnswers: "datas/users/questionnaires/answers",
|
||
dirCacheUsersWithoutAnswers: "datas/users/questionnaires/without"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/clientstorage.js":
|
||
/*!************************************!*\
|
||
!*** ./src/tools/clientstorage.js ***!
|
||
\************************************/
|
||
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||
/* harmony export */ "saveLocaly": function() { return /* binding */ saveLocaly; },
|
||
/* harmony export */ "getLocaly": function() { return /* binding */ getLocaly; },
|
||
/* harmony export */ "removeLocaly": function() { return /* binding */ removeLocaly; }
|
||
/* harmony export */ });
|
||
// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
|
||
// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
|
||
const saveLocaly = (name, data) => {
|
||
localStorage.setItem(name, JSON.stringify(data));
|
||
};
|
||
const getLocaly = (name, json = false) => {
|
||
if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
|
||
};
|
||
const removeLocaly = name => {
|
||
localStorage.removeItem(name);
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/dom.js":
|
||
/*!**************************!*\
|
||
!*** ./src/tools/dom.js ***!
|
||
\**************************/
|
||
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||
/* harmony export */ "addElement": function() { return /* binding */ addElement; }
|
||
/* harmony export */ });
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
|
||
// Fonction associant les attributs fournis à un champ de formulaire
|
||
|
||
const addElement = (eltParent, eltType, eltContent = "", eltId = "", eltClass = [], eltAttributes = {}, replace = true) => {
|
||
if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltType) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltParent)) return false;else {
|
||
const newElement = document.createElement(eltType);
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
|
||
newElement.id = eltId;
|
||
|
||
if (Array.isArray(eltClass) && eltClass.length != 0) {
|
||
for (let i in eltClass) newElement.classList.add(eltClass[i]);
|
||
}
|
||
|
||
if (typeof eltAttributes === "object") // !! tous les objets ne sont pas ok
|
||
{
|
||
for (let attributName in eltAttributes) newElement.setAttribute(attributName, eltAttributes[attributName]);
|
||
}
|
||
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "<br>"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.
|
||
|
||
if (replace) eltParent.innerHTML = "";
|
||
eltParent.appendChild(newElement);
|
||
}
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/everywhere.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/tools/everywhere.js ***!
|
||
\*********************************/
|
||
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||
/* harmony export */ "helloDev": function() { return /* binding */ helloDev; },
|
||
/* harmony export */ "updateAccountLink": function() { return /* binding */ updateAccountLink; }
|
||
/* harmony export */ });
|
||
// Ce script fournit des fonctions utilisées sur toutes les pages du site
|
||
const helloDev = () => {
|
||
console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****");
|
||
return true;
|
||
};
|
||
const updateAccountLink = (status, configTemplate) => {
|
||
const link = document.getElementById("accountHeadLink");
|
||
const homePage = status + "HomePage";
|
||
link.href = "/" + configTemplate[homePage];
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/forms.js":
|
||
/*!****************************!*\
|
||
!*** ./src/tools/forms.js ***!
|
||
\****************************/
|
||
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||
/* harmony export */ "setAttributesToInputs": function() { return /* binding */ setAttributesToInputs; },
|
||
/* harmony export */ "getDatasFromInputs": function() { return /* binding */ getDatasFromInputs; },
|
||
/* harmony export */ "empyForm": function() { return /* binding */ empyForm; },
|
||
/* harmony export */ "empyAndHideForm": function() { return /* binding */ empyAndHideForm; }
|
||
/* harmony export */ });
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
|
||
// Fonction associant les attributs fournis à un champ de formulaire
|
||
|
||
const setAttributesToInputs = (inputsConf, myForm) => {
|
||
for (let i in myForm.elements) {
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_0__.isEmpty)(myForm.elements[i].id)) {
|
||
let idInput = myForm.elements[i].id;
|
||
|
||
if (inputsConf[idInput] !== undefined) {
|
||
let inputHTML = document.getElementById(idInput);
|
||
|
||
for (let attribute in inputsConf[idInput]) inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.
|
||
|
||
const getDatasFromInputs = myForm => {
|
||
const datas = {};
|
||
const formData = new FormData(myForm);
|
||
|
||
for (let entrie of formData.entries()) datas[entrie[0]] = entrie[1];
|
||
|
||
return datas;
|
||
}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
|
||
// Revoir pour les select
|
||
|
||
const empyForm = myForm => {
|
||
const formData = new FormData(myForm);
|
||
|
||
for (let entrie of formData.entries()) {
|
||
if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = "";
|
||
}
|
||
|
||
return true;
|
||
}; // Vide et cache le formulaire
|
||
|
||
const empyAndHideForm = myForm => {
|
||
empyForm(myForm);
|
||
myForm.style.display = "none";
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/matomo.js":
|
||
/*!*****************************!*\
|
||
!*** ./src/tools/matomo.js ***!
|
||
\*****************************/
|
||
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||
/* harmony export */ "loadMatomo": function() { return /* binding */ loadMatomo; }
|
||
/* harmony export */ });
|
||
/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/matomo.js */ "../config/matomo.js");
|
||
/* harmony import */ var _config_matomo_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_matomo_js__WEBPACK_IMPORTED_MODULE_0__);
|
||
// Fonction chargeant le code matomo
|
||
|
||
const loadMatomo = () => {
|
||
// chargement de matomo
|
||
var _paq = window._paq = window._paq || []; //ajout cnil :
|
||
|
||
|
||
_paq.push([function () {
|
||
var self = this;
|
||
|
||
function getOriginalVisitorCookieTimeout() {
|
||
var now = new Date(),
|
||
nowTs = Math.round(now.getTime() / 1000),
|
||
visitorInfo = self.getVisitorInfo();
|
||
var createTs = parseInt(visitorInfo[2]);
|
||
var cookieTimeout = 33696000; // 13 mois en secondes
|
||
|
||
var originalTimeout = createTs + cookieTimeout - nowTs;
|
||
return originalTimeout;
|
||
}
|
||
|
||
this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());
|
||
}]); //--fin ajout cnil
|
||
|
||
|
||
_paq.push(['trackPageView']);
|
||
|
||
_paq.push(['enableLinkTracking']);
|
||
|
||
(function () {
|
||
var u = _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.url;
|
||
|
||
_paq.push(['setTrackerUrl', u + 'matomo.php']);
|
||
|
||
_paq.push(['setSiteId', _config_matomo_js__WEBPACK_IMPORTED_MODULE_0__.matomo.siteId]);
|
||
|
||
var d = document,
|
||
g = d.createElement('script'),
|
||
s = d.getElementsByTagName('script')[0];
|
||
g.type = 'text/javascript';
|
||
g.async = true;
|
||
g.src = u + 'matomo.js';
|
||
s.parentNode.insertBefore(g, s);
|
||
})();
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/users.js":
|
||
/*!****************************!*\
|
||
!*** ./src/tools/users.js ***!
|
||
\****************************/
|
||
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||
/* harmony export */ "getTimeDifference": function() { return /* binding */ getTimeDifference; },
|
||
/* harmony export */ "setSession": function() { return /* binding */ setSession; },
|
||
/* harmony export */ "checkAnswerDatas": function() { return /* binding */ checkAnswerDatas; },
|
||
/* harmony export */ "checkSession": function() { return /* binding */ checkSession; }
|
||
/* harmony export */ });
|
||
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js");
|
||
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js");
|
||
/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);
|
||
|
||
const lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];
|
||
|
||
const configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + "/config/" + lang + ".js");
|
||
|
||
|
||
|
||
|
||
const getTimeDifference = () => {
|
||
// multiplier par -1, car c'est ce qu'il faut "ajouter" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse
|
||
const timeLocal = new Date().getTimezoneOffset() * -1;
|
||
if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMax || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__.timeDifferenceMin) return 0;else return timeLocal;
|
||
}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite
|
||
// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.
|
||
|
||
const setSession = (userId, token, durationTS) => {
|
||
const storageUser = {
|
||
id: userId,
|
||
token: token,
|
||
duration: durationTS
|
||
};
|
||
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("user", storageUser);
|
||
}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs
|
||
// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas
|
||
|
||
const checkAnswerDatas = datas => {
|
||
const lastAnswer = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("lastAnswer");
|
||
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(lastAnswer)) {
|
||
const answer = JSON.parse(lastAnswer);
|
||
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.duration) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbCorrectAnswers) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.nbQuestions) && (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId) || !(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.GroupId))) {
|
||
datas.duration = answer.duration;
|
||
datas.nbCorrectAnswers = answer.nbCorrectAnswers;
|
||
datas.nbQuestions = answer.nbQuestions;
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;
|
||
}
|
||
}
|
||
|
||
return datas;
|
||
}; // Cette fonction teste la connexion de l'utilisateur d'une page
|
||
// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté
|
||
|
||
const checkSession = async (status = [], urlRedirection, message, urlWanted) => {
|
||
return new Promise((resolve, reject) => {
|
||
const userDatas = (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("user");
|
||
|
||
if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(userDatas)) {
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
} else {
|
||
const user = JSON.parse(userDatas);
|
||
|
||
if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.id) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.token) || (0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(user.duration) || user.duration < Date.now()) {
|
||
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("user");
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
} else {
|
||
const xhr = new XMLHttpRequest();
|
||
xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.checkLoginRoute + user.token);
|
||
|
||
xhr.onload = () => {
|
||
let response = JSON.parse(xhr.responseText);
|
||
|
||
if (xhr.status === 200 && response.isValid && response.id != undefined) {
|
||
if (response.id === user.id) {
|
||
user.name = response.name;
|
||
user.language = response.language;
|
||
user.timeDifference = response.timeDifference;
|
||
user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API
|
||
|
||
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-)
|
||
|
||
if (response.status === "user" && response.nbDaysOk <= 0) {
|
||
const urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl + "/" + configTemplate.accountPage;
|
||
if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate.accountPage + "#subscribe"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?
|
||
|
||
resolve(true);
|
||
} else {
|
||
if (status.length !== 0 && status.indexOf(response.status) === -1) {
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
} else resolve(true);
|
||
}
|
||
} else {
|
||
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("user");
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
}
|
||
} else {
|
||
(0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("user");
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
}
|
||
};
|
||
|
||
xhr.onerror = () => reject(xhr.statusText);
|
||
|
||
xhr.send();
|
||
}
|
||
}
|
||
});
|
||
}; // Cette fonction sert à la précédente en cas de connexion non valide
|
||
|
||
const redirectUser = (urlRedirection, message, urlWanted) => {
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(message)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("message", message);
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlWanted)) (0,_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("url", urlWanted);
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_3__.isEmpty)(urlRedirection)) window.location.assign(urlRedirection);
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang/fr/general.js":
|
||
/*!*****************************!*\
|
||
!*** ../lang/fr/general.js ***!
|
||
\*****************************/
|
||
/***/ (function(module) {
|
||
|
||
module.exports = {
|
||
addBtnTxt: "Ajouter",
|
||
addOkMessage: "Les données ont bien été enregistrées.",
|
||
alertNewWindow: "nouvelle fenêtre",
|
||
badUrl: "Tentative d'accès à une page n'existant pas :",
|
||
btnLinkToQuestionnaire: "Afficher !",
|
||
btnProposeConnection: "Je me connecte.",
|
||
btnProposeSubscribe: "Je crée mon compte.",
|
||
btnShowOnWebSite: "Lire la suite sur #SITE_NAME",
|
||
deleteBtnTxt: "Supprimer",
|
||
deleteFailMessage: "La suppression de l'enregistrement #ID a échoué.",
|
||
deleteOkMessage: "La suppression a bien été enregistrée.",
|
||
failAuth: "Erreur d'authentification.",
|
||
failAuthCron: "Tentative de lancement d'un cron sans le bon token.",
|
||
failAuthHeader: "Absence de header Authorization.",
|
||
failAuthId: "Identifiant non valide : ",
|
||
failAuthToken: "Token invalide ou utilisateur non trouvé.",
|
||
neededParams: "Des paramètres nécessaires manquants sont manquants.",
|
||
nextPage: "Page suivante",
|
||
notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.",
|
||
notRequired: "Facultatif.",
|
||
notValidFormat: "Format non valide.",
|
||
previousPage: "Page précédente",
|
||
serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",
|
||
serverErrorAdmin: "Bug de l'application :",
|
||
siteHTMLTitle: "WikiLerni : la culture générale en liberté",
|
||
siteMetaDescription: "Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",
|
||
scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
|
||
scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
|
||
statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.<br>En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.<br>Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",
|
||
subscriptionCall: "Inscrivez-vous !",
|
||
updateBtnTxt: "Modifier",
|
||
updateOkMessage: "La mise à jour à jour a bien été enregistrée."
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang/fr/user.js":
|
||
/*!**************************!*\
|
||
!*** ../lang/fr/user.js ***!
|
||
\**************************/
|
||
/***/ (function(module) {
|
||
|
||
module.exports = {
|
||
alreadyConnected: "Vous êtes déjà connecté au site !",
|
||
badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau <a href='#URL'>en cliquant ici</a>.",
|
||
badPassword: "Aucun compte utilisateur ne correspond aux informations saisies.",
|
||
byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.<br>À bientôt !",
|
||
connectionOk: "Connexion réussie.",
|
||
creationOkMessage: "Le nouvel utilisateur a bien été enregistré.",
|
||
cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.",
|
||
deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ",
|
||
deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.",
|
||
deleteOkMessage: "L'utilisateur a bien été supprimé.",
|
||
emailNotFound: "Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",
|
||
failBotTest: "Un problème a été rencontré durant votre inscription. En cas de difficulté, n'hésitez pas contacter l'administrateur du site.",
|
||
failBotTestLog: "Une inscription a été bloquée, parce que le champ email2 était renseigné avec : ",
|
||
formsEmailLabel: "E-mail :",
|
||
formsEmailPlaceholder: "Votre adresse e-mail",
|
||
formsEmail2Placeholder: "Si vous voyez ce champ, laissez-le vide",
|
||
//champ qui ne devrait pas être visible par des humains
|
||
formsCGUOkLabel: "J'accepte <a href=#link target=\"_blank\" rel=\"noopener\" title=\"À lire :)\">les Conditions Générale d'Utilisation</a> du site (requis).",
|
||
formsSubmitTxt: "Je m'abonne !",
|
||
godfatherFound: "Votre \"parrain\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.",
|
||
godfatherNotFound: "Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",
|
||
infosAdminGodfather: "Cet utilisateur a été parrainé par ",
|
||
infosAdminNbGodChilds: "Ses #NB filleuls : ",
|
||
infosUserForAdmin: "Cet utilisateur (id: ID_USER) a <b>créé son compte le DATE_CREA</b>, la dernière mise à jour datant du DATE_UPDATE.<br><b>Date de sa dernière connexion : DATE_CONNECTION.</b>",
|
||
infosUserNbGodChilds: "Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \"parrain\" : ",
|
||
infosUserNoGodchilds: "Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",
|
||
mailDeleteBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.</p>",
|
||
mailDeleteBodyTxt: "Bonjour USER_NAME,\n\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
|
||
mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.",
|
||
mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il a expiré.",
|
||
mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.",
|
||
mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.",
|
||
mailDeleteLinkTxt: "Confirmer.",
|
||
mailDeleteSubject: "Confirmer la suppression de votre compte.",
|
||
mailLoginLinkBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :</p>",
|
||
mailLoginLinkBodyTxt: "Bonjour USER_NAME,\n\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
|
||
mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant *TIMING* !",
|
||
mailLoginLinkSubject: "Votre lien de connexion.",
|
||
mailLoginLinkTxt: "Me connecter.",
|
||
mailThankGodfatherBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.<br>Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.</p><p>Encore merci et à bientôt !</p>",
|
||
mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nSi dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.\nEncore merci et à bientôt !",
|
||
mailThankGodfatherLinkTxt: "Me connecter à mon compte.",
|
||
mailThankGodfatherSubject: "Merci !",
|
||
mailUpdateLoginBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.</p>",
|
||
mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\n\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
|
||
mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (e-mail et/ou mot de passe) et <b>vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement</b>.<br>En attendant, merci de continuer à utiliser vos anciens identifiants.",
|
||
mailUpdateLoginLinkTxt: "Valider.",
|
||
mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.",
|
||
mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.",
|
||
mailValidationLinkSBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.</p>",
|
||
mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider et compléter votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
|
||
mailValidationLinkSubject: "Merci de valider votre inscription",
|
||
mailValidationLinkTxt: "Valider mon compte.",
|
||
mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24 H sur le lien de confirmation qui vient d'être envoyé à votre adresse e-mail (#EMAIL).",
|
||
mailWelcomeBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !<br><br>Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à <b>EMAIL</b>.<br><br>Je vous conseille d'ailleurs d'ajouter <b>EMAIL</b> à votre carnet d'adresses <b>pour éviter que les prochains envois de NOM_SITE n'arrivent en <i>spam</i></b>.<br><br>Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.<br><br>Pour ce faire, utilisez le lien ci-dessous.<br><br>À bientôt sur NOM_SITE.",
|
||
mailWelcomeBodyTxt: "Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",
|
||
mailWelcomeLinkTxt: "Me connecter à mon compte.",
|
||
mailWelcomeSubject: "Bienvenue !",
|
||
needBeConnected: "Vous devez être connecté pour accéder à cette page.",
|
||
needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",
|
||
needEmail: "Merci de saisir votre adresse e-mail.",
|
||
needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",
|
||
needLanguage: "Il manque le code langue.",
|
||
needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",
|
||
needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",
|
||
needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",
|
||
needName: "Merci de choisir un nom d'utilisateur.",
|
||
needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",
|
||
needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",
|
||
needPassWord: "Merci de fournir un mot de passe.",
|
||
needSMTP: "Il manque le serveur SMTP.",
|
||
needSMTPNotFound: "Il manque un serveur SMTP valide.",
|
||
needStatus: "Il manque le statut.",
|
||
needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.",
|
||
needUGCOk: "Merci d'accepter les CGU pour créer votre compte.",
|
||
needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, <a href='/#URL'>cliquez-ici pour vous connecter</a>.",
|
||
needValidationToLogin: "Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",
|
||
needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.",
|
||
passwordCopied: "Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \"coller\" où vous le souhaitez.",
|
||
searchUsersWithoutResult: "L'utilisateur n'a pas été trouvé.",
|
||
tooManyLoginFails: "Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",
|
||
updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",
|
||
updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",
|
||
updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",
|
||
updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",
|
||
updatedNeedValidatedUser: "L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",
|
||
updatedOkMessage: "Vos informations ont bien été mises à jour.",
|
||
validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter <a href='#URL'>en cliquant ici</a>.",
|
||
validationAlreadyMessageAdmin: "Ce compte a déjà été validé.",
|
||
validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !<br>Vous pouvez compléter les informations de votre abonnement ci-dessous.",
|
||
validationMessageAdmin: "Le compte a bien été validé.",
|
||
welcomeMessage: "Bienvenue #NAME !"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../tools/main.js":
|
||
/*!************************!*\
|
||
!*** ../tools/main.js ***!
|
||
\************************/
|
||
/***/ (function(module) {
|
||
|
||
// Quelques fonctions utiles pour les chaînes
|
||
class Tool {
|
||
static isEmpty(myVar) {
|
||
if (myVar === undefined || myVar === null) return true;else {
|
||
myVar += ""; // si autre chose qu'une chaîne envoyé...
|
||
|
||
myVar = myVar.trim();
|
||
if (myVar === "") return true;else return false;
|
||
}
|
||
}
|
||
|
||
static trimIfNotNull(myString) {
|
||
if (Tool.isEmpty(myString)) myString = null;else {
|
||
myString += ""; // si autre chose qu'une chaîne envoyé...
|
||
|
||
myString = myString.trim();
|
||
}
|
||
return myString;
|
||
}
|
||
|
||
static shortenIfLongerThan(myString, max) {
|
||
myString += ""; // au cas où cela ne serait pas une chaîne...
|
||
|
||
if (myString.length > max) myString = myString.substring(0, max - 3) + "…";
|
||
return myString;
|
||
} // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings
|
||
|
||
|
||
static replaceAll(myString, mapObj) {
|
||
const replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi");
|
||
return myString.replace(replaceElts, matched => {
|
||
return mapObj[matched];
|
||
});
|
||
} // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random
|
||
|
||
|
||
static getRandomInt(min, max) {
|
||
min = Math.ceil(min);
|
||
max = Math.floor(max);
|
||
return Math.floor(Math.random() * (max - min)) + min;
|
||
} // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country
|
||
|
||
|
||
static dateFormat(dateString, lang = "fr") {
|
||
if (Tool.isEmpty(dateString)) return "";
|
||
let myDate = new Date(dateString);
|
||
let myDay = myDate.getDate() + "";
|
||
if (myDay.length === 1) myDay = "0" + myDay;
|
||
let myMounth = myDate.getMonth() + 1 + "";
|
||
if (myMounth.length === 1) myMounth = "0" + myMounth;
|
||
let myYear = myDate.getFullYear();
|
||
if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09
|
||
return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear;
|
||
} // On enlève volontairement les 0/O pour éviter les confusions !
|
||
// Et mieux vaut aussi débuter et finir par une lettre simple.
|
||
|
||
|
||
static getPassword(nbCarMin, nbCarMax) {
|
||
const nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));
|
||
const letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz";
|
||
const others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";
|
||
let password = letters[Math.floor(Math.random() * letters.length)];
|
||
|
||
for (let i = 1; i < nbCar - 1; i++) {
|
||
if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];
|
||
}
|
||
|
||
password += letters[Math.floor(Math.random() * letters.length)];
|
||
return password;
|
||
}
|
||
|
||
}
|
||
|
||
module.exports = Tool;
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../views/default/config/fr.js":
|
||
/*!*************************************!*\
|
||
!*** ../views/default/config/fr.js ***!
|
||
\*************************************/
|
||
/***/ (function(module) {
|
||
|
||
module.exports = {
|
||
headLinks: [{
|
||
anchor: "Accueil",
|
||
attributes: {
|
||
href: "/"
|
||
}
|
||
}, {
|
||
anchor: "Mon compte",
|
||
attributes: {
|
||
href: "/connexion.html",
|
||
id: "accountHeadLink"
|
||
}
|
||
}, {
|
||
anchor: "À propos",
|
||
attributes: {
|
||
href: "/a-propos.html"
|
||
}
|
||
}, {
|
||
anchor: "Contact",
|
||
attributes: {
|
||
href: "/contact.html"
|
||
}
|
||
}],
|
||
footLinks: [{
|
||
anchor: "Crédits",
|
||
attributes: {
|
||
href: "/credits.html"
|
||
}
|
||
}, {
|
||
anchor: "Mentions légales",
|
||
attributes: {
|
||
href: "/mentions-legales.html",
|
||
rel: "nofollow"
|
||
}
|
||
}, {
|
||
anchor: "Données personnelles",
|
||
attributes: {
|
||
href: "/donnees.html"
|
||
}
|
||
}, {
|
||
anchor: "C.G.U.",
|
||
attributes: {
|
||
href: "/cgu.html",
|
||
rel: "nofollow"
|
||
}
|
||
}, {
|
||
anchor: "C.G.V.",
|
||
attributes: {
|
||
href: "/cgv.html",
|
||
rel: "nofollow"
|
||
}
|
||
}],
|
||
maxQuestionnairesByPage: 10,
|
||
userHomePage: "accueil.html",
|
||
adminHomePage: "admin.html",
|
||
managerHomePage: "gestion.html",
|
||
subscribePage: "inscription.html",
|
||
connectionPage: "connexion.html",
|
||
accountPage: "compte.html",
|
||
questionnairesManagementPage: "gestion-quizs.html",
|
||
usersManagementPage: "gestion-utilisateurs.html",
|
||
nbQuestionnairesUserHomePage: 10,
|
||
illustrationDir: "/img/quizs/",
|
||
siteSlogan: "Cultivons notre jardin !",
|
||
homeTitle1: "De nature curieuse ?",
|
||
homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.<br>Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.<br>De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".",
|
||
homeTitle2: "La culture en liberté",
|
||
homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.<br>Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.<br>Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.<br>Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.<br><br><small><em>(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.</em></small>",
|
||
newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni",
|
||
newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.",
|
||
explanationTitle: "Vous découvrez WikiLerni ?",
|
||
explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.<br>Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.<br><br>Toutes les réponses se trouvent dans l'article proposé à la lecture. <b>Vous êtes ici pour apprendre de nouvelles choses</b>, mais libre à vous d'essayer d'y répondre immédiatement.<br><br>Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)<br><br>Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.<br>Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.<br><br>Mais <b>la création de ce compte est facultative</b> et <a href='/quizs/' title='Les derniers quizs publiés'>vous pouvez parcourir WikiLerni librement</a>.",
|
||
noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",
|
||
tagsListTxt: "Parcourir les rubriques :"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../views/wikilerni/config/fr.js":
|
||
/*!***************************************!*\
|
||
!*** ../views/wikilerni/config/fr.js ***!
|
||
\***************************************/
|
||
/***/ (function(module) {
|
||
|
||
module.exports = {
|
||
// liens de l'interface
|
||
headLinks: [{
|
||
anchor: "Contact",
|
||
attributes: {
|
||
href: "/contact.html",
|
||
rel: "nofollow"
|
||
}
|
||
}, {
|
||
anchor: "Parcourir",
|
||
attributes: {
|
||
href: "/quizs/",
|
||
id: "indexHeadLink",
|
||
title: "Les dernières publications"
|
||
}
|
||
}, {
|
||
anchor: "Mon compte",
|
||
attributes: {
|
||
href: "/connexion.html",
|
||
id: "accountHeadLink",
|
||
title: "Accéder ou créez votre compte WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "À propos",
|
||
attributes: {
|
||
href: "/a-propos.html",
|
||
title: "En savoir + sur WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "Accueil",
|
||
attributes: {
|
||
href: "/",
|
||
title: "Page d'accueil"
|
||
}
|
||
}],
|
||
footLinks: [{
|
||
anchor: "Blog",
|
||
attributes: {
|
||
href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625",
|
||
title: "Le blog WikiLerni sur diaspora*"
|
||
}
|
||
}, {
|
||
anchor: "Crédits",
|
||
attributes: {
|
||
href: "/credits.html",
|
||
title: "Qui a créé WikiLerni ? Quels sont vos droits ?"
|
||
}
|
||
}, {
|
||
anchor: "Mentions légales",
|
||
attributes: {
|
||
href: "/mentions-legales.html",
|
||
rel: "nofollow"
|
||
}
|
||
}, {
|
||
anchor: "Données personnelles",
|
||
attributes: {
|
||
href: "/donnees.html",
|
||
title: "Vos données personnelles sur WikiLerni"
|
||
}
|
||
}, {
|
||
anchor: "CGV & CGU",
|
||
attributes: {
|
||
href: "/CGV-CGU.html",
|
||
rel: "nofollow"
|
||
}
|
||
}],
|
||
accountPage: "compte.html",
|
||
aboutPage: "a-propos.html",
|
||
adminHomePage: "admin.html",
|
||
cguPage: "CGV-CGU.html",
|
||
connectionPage: "connexion.html",
|
||
deleteLinkPage: "aurevoir.html?t=",
|
||
loginLinkPage: "login.html?t=",
|
||
managerHomePage: "gestion.html",
|
||
newLoginLinkPage: "newlogin.html?t=",
|
||
questionnairesManagementPage: "gestion-quizs.html",
|
||
stopMailPage: "stop-mail.html?t=",
|
||
subscribePage: "inscription.html",
|
||
updateAccountPage: "compte.html",
|
||
userHomePage: "accueil.html",
|
||
userHomePageTxt: "Ma page d'accueil.",
|
||
usersManagementPage: "gestion-utilisateurs.html",
|
||
validationLinkPage: "validation.html?t=",
|
||
|
||
/* Textes (général) */
|
||
siteSlogan: "Cultivons notre jardin !",
|
||
noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",
|
||
mailRecipientTxt: "Message envoyé à :",
|
||
licenceTxt: "@copyleft Le contenu de WikiLerni <a href=\"/credits.html\" title=\"En savoir plus ?\">est libre</a> et vous est offert sans publicité. Vous pouvez <a href=\"/participer-financement.html\" title=\"Financement participatif avec contre-parties\">participer à son financement en cliquant ici</a>.",
|
||
|
||
/* Page d'accueil */
|
||
homePageTxt: "Page d'accueil",
|
||
homeTitle1: "De nature curieuse ?",
|
||
homeP1: "<b>Avec WikiLerni, vous apprenez régulièrement de nouvelles choses</b>.<br>Vous recevez de courts articles, lisibles en quelques minutes.<br>Des quizs vous permettent ensuite de tester ce que vous avez retenu.<br>De jour en jour <b>de nouvelles graines de culture sont ainsi semées dans votre jardin</b>.",
|
||
homeTitle2: "La culture générale en liberté",
|
||
homeP2: "<b>Pas de faits alternatifs</b>, tous les contenus sont <b>sourcés par des articles Wikipédia</b>.<br>Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni <a href=\"/credits.html\" title=\"En savoir plus sur ce sujet\">sont partagés sous licences libres</a>.<br>Le tout sans publicité, ni commercialisation de vos données.<br><b>Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.</b>",
|
||
homeBtnAboutTxt: "En savoir plus sur WikiLerni ?",
|
||
homeBtnSubscribeTxt: "Testez WikiLerni",
|
||
homeSubcriptionFormTitle: "Recevez les prochains articles WikiLerni",
|
||
|
||
/* Page dernières publications... */
|
||
newQuestionnairesTitle: "Culture générale - apprenez de nouvelles choses avec WikiLerni",
|
||
newQuestionnairesIntro: "WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
|
||
newsListTitle: "<p><b>Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau</b><br>Si dessous les dernières publications. Vous pouvez aussi <a href='/quizs/themes.html'>parcourir le site par thèmes ou mots-clés</a>.</p>",
|
||
|
||
/* Plan du site, liste des tags */
|
||
tagListTitle: "Culture générale - des articles et quizs sur de nombreux thèmes !",
|
||
tagListMetaDesc: "WikiLerni : découvrir les différents thèmes abordés par WikiLerni. Inxex du site.",
|
||
tagListIntro: "<h3>Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)</h3><blockquote>Aristote : « L’homme a naturellement la passion de connaître… »</blockquote>",
|
||
|
||
/* Page quizs */
|
||
answersExplanationsLinkText: "Relire",
|
||
quizElementLinksIntro: "En savoir plus",
|
||
quizElementSubcriptionFormTitle: "Recevez les prochains articles WikiLerni",
|
||
explanationTitle: "Vous découvrez WikiLerni ?",
|
||
explanationTxt: "<p>Le principe est simple : <b>vous commencez par lire l’article Wikipédia dont le lien vous est proposé</b>. Puis vous <b>afficher le quiz pour vérifier ce que vous avez retenu de votre lecture</b>. Suivant les questions, <b>une ou plusieurs réponses peuvent être correctes</b> et doivent donc être cochées. C’est toujours <b>le contenu de l’article Wikipédia qui fait foi</b> concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas <a href='/contact.html'>à me signaler une erreur</a>.</p><p><b>WikiLerni vous propose d’autres solutions pour améliorer votre culture générale</b>. Pour en savoir plus, cliquez sur le bouton ci-dessous.</p>",
|
||
explanationElementTxt: "<p>WikiLerni vous propose de <b>recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes</b> et portant sur des sujets très variés de <b>culture générale</b> (arts, histoire, littérature, sciences, etc.).</p><p>Ces articles sont basés sur <b>une ou plusieurs pages de Wikipédia</b> (fournies en lien), dont <b>ils extraient certaines informations</b>.</p><p>Chaque série d’articles est <b>suivie d’un quiz</b> permettant de tester ce que vous en avez retenu.</p><p><b>Vous apprenez ainsi régulièrement de nouvelles choses</b> très simplement.</p>",
|
||
|
||
/* Autres */
|
||
illustrationDir: "/img/quizs/",
|
||
twitterAccount: "WikiLerni",
|
||
maxQuestionnairesByPage: 12,
|
||
maxQuestionnairesSiteHomePage: 3,
|
||
nbQuestionnairesUserHomePage: 3
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang sync recursive ^\\.\\/.*\\/general$":
|
||
/*!***************************************!*\
|
||
!*** ../lang/ sync ^\.\/.*\/general$ ***!
|
||
\***************************************/
|
||
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
||
|
||
var map = {
|
||
"./fr/general": "../lang/fr/general.js"
|
||
};
|
||
|
||
|
||
function webpackContext(req) {
|
||
var id = webpackContextResolve(req);
|
||
return __webpack_require__(id);
|
||
}
|
||
function webpackContextResolve(req) {
|
||
if(!__webpack_require__.o(map, req)) {
|
||
var e = new Error("Cannot find module '" + req + "'");
|
||
e.code = 'MODULE_NOT_FOUND';
|
||
throw e;
|
||
}
|
||
return map[req];
|
||
}
|
||
webpackContext.keys = function webpackContextKeys() {
|
||
return Object.keys(map);
|
||
};
|
||
webpackContext.resolve = webpackContextResolve;
|
||
module.exports = webpackContext;
|
||
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang sync recursive ^\\.\\/.*\\/user$":
|
||
/*!************************************!*\
|
||
!*** ../lang/ sync ^\.\/.*\/user$ ***!
|
||
\************************************/
|
||
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
||
|
||
var map = {
|
||
"./fr/user": "../lang/fr/user.js"
|
||
};
|
||
|
||
|
||
function webpackContext(req) {
|
||
var id = webpackContextResolve(req);
|
||
return __webpack_require__(id);
|
||
}
|
||
function webpackContextResolve(req) {
|
||
if(!__webpack_require__.o(map, req)) {
|
||
var e = new Error("Cannot find module '" + req + "'");
|
||
e.code = 'MODULE_NOT_FOUND';
|
||
throw e;
|
||
}
|
||
return map[req];
|
||
}
|
||
webpackContext.keys = function webpackContextKeys() {
|
||
return Object.keys(map);
|
||
};
|
||
webpackContext.resolve = webpackContextResolve;
|
||
module.exports = webpackContext;
|
||
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../views sync recursive ^\\.\\/.*\\.js$":
|
||
/*!***********************************!*\
|
||
!*** ../views/ sync ^\.\/.*\.js$ ***!
|
||
\***********************************/
|
||
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
||
|
||
var map = {
|
||
"./default/config/fr.js": "../views/default/config/fr.js",
|
||
"./wikilerni/config/fr.js": "../views/wikilerni/config/fr.js"
|
||
};
|
||
|
||
|
||
function webpackContext(req) {
|
||
var id = webpackContextResolve(req);
|
||
return __webpack_require__(id);
|
||
}
|
||
function webpackContextResolve(req) {
|
||
if(!__webpack_require__.o(map, req)) {
|
||
var e = new Error("Cannot find module '" + req + "'");
|
||
e.code = 'MODULE_NOT_FOUND';
|
||
throw e;
|
||
}
|
||
return map[req];
|
||
}
|
||
webpackContext.keys = function webpackContextKeys() {
|
||
return Object.keys(map);
|
||
};
|
||
webpackContext.resolve = webpackContextResolve;
|
||
module.exports = webpackContext;
|
||
webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$";
|
||
|
||
/***/ })
|
||
|
||
/******/ });
|
||
/************************************************************************/
|
||
/******/ // The module cache
|
||
/******/ var __webpack_module_cache__ = {};
|
||
/******/
|
||
/******/ // The require function
|
||
/******/ function __webpack_require__(moduleId) {
|
||
/******/ // Check if module is in cache
|
||
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
||
/******/ if (cachedModule !== undefined) {
|
||
/******/ return cachedModule.exports;
|
||
/******/ }
|
||
/******/ // Create a new module (and put it into the cache)
|
||
/******/ var module = __webpack_module_cache__[moduleId] = {
|
||
/******/ // no module.id needed
|
||
/******/ // no module.loaded needed
|
||
/******/ exports: {}
|
||
/******/ };
|
||
/******/
|
||
/******/ // Execute the module function
|
||
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
||
/******/
|
||
/******/ // Return the exports of the module
|
||
/******/ return module.exports;
|
||
/******/ }
|
||
/******/
|
||
/************************************************************************/
|
||
/******/ /* webpack/runtime/compat get default export */
|
||
/******/ !function() {
|
||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||
/******/ __webpack_require__.n = function(module) {
|
||
/******/ var getter = module && module.__esModule ?
|
||
/******/ function() { return module['default']; } :
|
||
/******/ function() { return module; };
|
||
/******/ __webpack_require__.d(getter, { a: getter });
|
||
/******/ return getter;
|
||
/******/ };
|
||
/******/ }();
|
||
/******/
|
||
/******/ /* webpack/runtime/define property getters */
|
||
/******/ !function() {
|
||
/******/ // define getter functions for harmony exports
|
||
/******/ __webpack_require__.d = function(exports, definition) {
|
||
/******/ for(var key in definition) {
|
||
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
||
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
||
/******/ }
|
||
/******/ }
|
||
/******/ };
|
||
/******/ }();
|
||
/******/
|
||
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
||
/******/ !function() {
|
||
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
|
||
/******/ }();
|
||
/******/
|
||
/******/ /* webpack/runtime/make namespace object */
|
||
/******/ !function() {
|
||
/******/ // define __esModule on exports
|
||
/******/ __webpack_require__.r = function(exports) {
|
||
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
||
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
||
/******/ }
|
||
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
||
/******/ };
|
||
/******/ }();
|
||
/******/
|
||
/************************************************************************/
|
||
var __webpack_exports__ = {};
|
||
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
|
||
!function() {
|
||
"use strict";
|
||
/*!***************************!*\
|
||
!*** ./src/connection.js ***!
|
||
\***************************/
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
|
||
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
|
||
/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/users.js */ "../config/users.js");
|
||
/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);
|
||
/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
|
||
/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
|
||
/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
|
||
/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* harmony import */ var _tools_matomo_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/matomo.js */ "./src/tools/matomo.js");
|
||
/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
|
||
// -- GESTION DU FORMULAIRE PERMETTANT DE SE CONNECTER
|
||
/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page de connexion.
|
||
/// Dans ce cas il faut enregistrer son résultat en même temps, une fois la connexion validée.
|
||
/// Le connexion peut se faire directement ici via la saisie d'un mot de passe ou via l'envoi d'un token par e-mail.
|
||
// Fichier de configuration tirés du backend :
|
||
|
||
const lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.availableLangs[0];
|
||
|
||
|
||
const configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.theme + "/config/" + lang + ".js"); // Importation des fonctions utiles au script :
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// Dictionnaires :
|
||
|
||
const {
|
||
serverError
|
||
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
|
||
|
||
const {
|
||
alreadyConnected,
|
||
needChooseLoginWay
|
||
} = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); // Principaux éléments du DOM manipulés :
|
||
|
||
|
||
const myForm = document.getElementById("connection");
|
||
const divMessage = document.getElementById("message");
|
||
const divResponse = document.getElementById("response");
|
||
(0,_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__.helloDev)(); // Test de connexion de l'utilisateur + affichage formulaire d'inscription.
|
||
|
||
const initialise = async () => {
|
||
try {
|
||
const isConnected = await (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_8__.checkSession)();
|
||
|
||
if (isConnected) {
|
||
(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.saveLocaly)("message", {
|
||
message: alreadyConnected,
|
||
color: "info"
|
||
}); // pour l'afficher sur la page suivante
|
||
|
||
const user = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("user", true);
|
||
const homePage = user.status + "HomePage";
|
||
window.location.assign("/" + configTemplate[homePage]);
|
||
} else {
|
||
(0,_tools_matomo_js__WEBPACK_IMPORTED_MODULE_7__.loadMatomo)();
|
||
myForm.style.display = "block";
|
||
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)((0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("message"))) {
|
||
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divMessage, "p", (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("message", true).message, "", [(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("message", true).color]);
|
||
(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("message");
|
||
}
|
||
}
|
||
} catch (e) {
|
||
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, "p", serverError, "", ["error"]);
|
||
console.error(e);
|
||
}
|
||
};
|
||
|
||
initialise(); // Traitement de l'envoi des données de connexion :
|
||
|
||
myForm.addEventListener("submit", function (e) {
|
||
try {
|
||
e.preventDefault();
|
||
divResponse.innerHTML = ""; // efface d'éventuels messages déjà affichés
|
||
|
||
let datas = (0,_tools_forms_js__WEBPACK_IMPORTED_MODULE_5__.getDatasFromInputs)(myForm);
|
||
if ((0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(datas.password) && (0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(datas.getLoginLink)) (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, "div", needChooseLoginWay, "", ["error"]);else {
|
||
const xhr = new XMLHttpRequest();
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(datas.getLoginLink)) xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.getLoginLinkRoute);else xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__.apiUrl + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.userRoutes + _config_users_js__WEBPACK_IMPORTED_MODULE_1__.connectionRoute);
|
||
|
||
xhr.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
let response = JSON.parse(this.responseText);
|
||
|
||
if (this.status === 200) {
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(response.message)) {
|
||
// cas d'une demande de lien de connexion avec succès.
|
||
myForm.style.display = "none";
|
||
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, "p", response.message, "", ["success"]);
|
||
} else if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(response.userId) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(response.connexionTime) && !(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(response.token)) {
|
||
// cas d'une connexion via mot de passe avec succès : on crée une session de connexion et redirige l'utilisateur.
|
||
let connexionMaxTime = Date.now();
|
||
if (response.connexionTime.endsWith("days")) // l'utilisateur a demandé à rester connecté sur la durée.
|
||
connexionMaxTime += parseInt(response.connexionTime, 10) * 24 * 3600 * 1000;else connexionMaxTime += parseInt(response.connexionTime, 10) * 3600 * 1000;
|
||
(0,_tools_users_js__WEBPACK_IMPORTED_MODULE_8__.setSession)(response.userId, response.token, connexionMaxTime);
|
||
(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("lastAnswer"); // ! important pour ne pas enregister plusieurs fois son éventuel résultat au quiz.
|
||
|
||
myForm.style.display = "none"; // l'utilisateur peut avoir tenté d'accéder à une autre page que sa page d'accueil :
|
||
|
||
let url = (0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.getLocaly)("url", true);
|
||
|
||
if (!(0,_tools_main__WEBPACK_IMPORTED_MODULE_6__.isEmpty)(url) && url.href.indexOf(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__.siteUrl) !== -1) {
|
||
url = url.href;
|
||
(0,_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__.removeLocaly)("url");
|
||
} else url = configTemplate[response.status + "HomePage"];
|
||
|
||
window.location.assign(url);
|
||
} else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, "p", serverError, "", ["error"]);
|
||
} else if (response.errors) {
|
||
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
|
||
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, "p", response.errors, "", ["error"]);
|
||
} else (0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, "p", serverError, "", ["error"]);
|
||
}
|
||
};
|
||
|
||
xhr.setRequestHeader("Content-Type", "application/json");
|
||
|
||
if (datas) {
|
||
datas.timeDifference = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_8__.getTimeDifference)(); // Si l'utilisateur a répondu à un quiz, j'ajoute les infos de son résultat aux données envoyées :
|
||
|
||
datas = (0,_tools_users_js__WEBPACK_IMPORTED_MODULE_8__.checkAnswerDatas)(datas);
|
||
xhr.send(JSON.stringify(datas));
|
||
}
|
||
}
|
||
} catch (e) {
|
||
(0,_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__.addElement)(divResponse, "p", serverError, "", ["error"]);
|
||
console.error(e);
|
||
}
|
||
});
|
||
}();
|
||
/******/ })()
|
||
;
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vY29uZmlnL2luc3RhbmNlLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9jb25maWcvbWF0b21vLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9jb25maWcvcXVlc3Rpb25uYWlyZXMuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL2NvbmZpZy91c2Vycy5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvY2xpZW50c3RvcmFnZS5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvZG9tLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy90b29scy9ldmVyeXdoZXJlLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy90b29scy9mb3Jtcy5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvbWF0b21vLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy90b29scy91c2Vycy5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9sYW5nL2ZyL3VzZXIuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8vaG9tZS9mYWJyaWNlL0RvY3VtZW50cy9CaWRvdWlsbGVzL3dpa2lsZXJuaS9sYW5nfHN5bmN8L15cXC5cXC8uKlxcL2dlbmVyYWwkLyIsIndlYnBhY2s6Ly93aWtpbGVybmkvL2hvbWUvZmFicmljZS9Eb2N1bWVudHMvQmlkb3VpbGxlcy93aWtpbGVybmkvbGFuZ3xzeW5jfC9eXFwuXFwvLipcXC91c2VyJC8iLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy9ob21lL2ZhYnJpY2UvRG9jdW1lbnRzL0JpZG91aWxsZXMvd2lraWxlcm5pL3ZpZXdzfHN5bmN8L15cXC5cXC8uKlxcLmpzJC8iLCJ3ZWJwYWNrOi8vd2lraWxlcm5pL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly93aWtpbGVybmkvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3dpa2lsZXJuaS8uL3NyYy9jb25uZWN0aW9uLmpzIl0sIm5hbWVzIjpbInVzZXJzIiwicmVxdWlyZSIsInF1ZXN0aW9ubmFpcmVzIiwibW9kdWxlIiwiZXhwb3J0cyIsImFwaVVybCIsInNpdGVVcmwiLCJhZG1pbk5hbWUiLCJhZG1pbkVtYWlsIiwic2VuZGVyTmFtZSIsInNlbmRlckVtYWlsIiwiYWRtaW5MYW5nIiwidGhlbWUiLCJhdmFpbGFibGVMYW5ncyIsInNpdGVOYW1lIiwiYmVnaW5Db2RlR29kZmF0aGVyIiwiZGVmYXVsdFJlY2VpcHREYXlzIiwiY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwicmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZSIsInRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzIiwidG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXMiLCJ0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VycyIsInRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzIiwidG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzIiwiZnJlZUFjY291bnRUaW1pbmdJbkRheXMiLCJmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXMiLCJpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXMiLCJuYlF1ZXN0aW9uc01pbiIsIm5iUXVlc3Rpb25zTWF4IiwibmJDaG9pY2VzTWF4IiwibmJOZXdRdWVzdGlvbm5haXJlcyIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kIiwibWF4UXVlc3Rpb25uYWlyZVNlbmRlZEF0U2FtZVRpbWUiLCJtaW5TZWFyY2hRdWVzdGlvbm5haXJlcyIsImZpZWxkTmV3UXVlc3Rpb25uYWlyZXMiLCJuYlF1ZXN0aW9ubmFpcmVzQnlHcm91cE1pbiIsIm5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWF4IiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkTWluTGVuZ3RoIiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZXMiLCJkaXJXZWJRdWVzdGlvbm5haXJlcyIsIm1hdG9tbyIsInVybCIsInNpdGVJZCIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFJhbmRvbVF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwicmVnZW5lcmF0ZUhUTUwiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIiwiZ3JvdXBSb3V0ZXMiLCJnZXRHcm91cFJvdXRlIiwicHJldmlld0dyb3VwUm91dGVzIiwic2VhcmNoR3JvdXBzUm91dGUiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldEFkbWluU3RhdHMiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJHcm91cCIsIlF1ZXN0aW9uIiwidGV4dCIsInJhbmsiLCJtaW4iLCJkZWZhdWx0VmFsdWUiLCJDaG9pY2UiLCJzZWFyY2giLCJzZWFyY2hHcm91cHMiLCJkaXJDYWNoZUdyb3VwcyIsImRpckNhY2hlVGFncyIsImRpckhUTUxHcm91cHMiLCJkaXJIVE1MTmV3cyIsImRpckhUTUxUYWdzIiwiZGlyV2ViR3JvdXBzIiwiZGlyV2ViTmV3cyIsImRpcldlYlRhZ3MiLCJuYlJhbmRvbVJlc3VsdHMiLCJuYlRhZ3NNaW4iLCJuYlRhZ3NNYXgiLCJ1c2VyUm91dGVzIiwiY2hlY2tEZWxldGVMaW5rUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJjb25uZWN0aW9uUm91dGUiLCJjb25uZWN0aW9uV2l0aExpbmtSb3V0ZSIsImNyZWF0ZVVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImdldEdvZGZhdGhlclJvdXRlIiwiZ2V0TG9naW5MaW5rUm91dGUiLCJnZXRQYXltZW50cyIsImdldFVzZXJJbmZvcyIsImdldFVzZXJzUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaFVzZXJSb3V0ZSIsInNpZ251cENvbXBsZXRpb25Sb3V0ZSIsInN1YnNjcmliZVJvdXRlIiwidW5zdWJzY3JpYmVSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInZhbGlkYXRlVXNlclJvdXRlIiwibmFtZSIsImVtYWlsIiwibmV3UGFzc3dvcmQiLCJjb2RlR29kZmF0aGVyIiwiY2d1T2siLCJ2YWx1ZSIsInRpbWVEaWZmZXJlbmNlTWluIiwidGltZURpZmZlcmVuY2VNYXgiLCJkaXJDYWNoZVVzZXJzV2l0aG91dEFuc3dlcnMiLCJzYXZlTG9jYWx5IiwiZGF0YSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0TG9jYWx5IiwianNvbiIsInBhcnNlIiwiZ2V0SXRlbSIsInJlbW92ZUxvY2FseSIsInJlbW92ZUl0ZW0iLCJhZGRFbGVtZW50IiwiZWx0UGFyZW50IiwiZWx0VHlwZSIsImVsdENvbnRlbnQiLCJlbHRJZCIsImVsdENsYXNzIiwiZWx0QXR0cmlidXRlcyIsInJlcGxhY2UiLCJpc0VtcHR5IiwibmV3RWxlbWVudCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlkIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaSIsImNsYXNzTGlzdCIsImFkZCIsImF0dHJpYnV0TmFtZSIsInNldEF0dHJpYnV0ZSIsImlubmVySFRNTCIsImFwcGVuZENoaWxkIiwiaGVsbG9EZXYiLCJjb25zb2xlIiwibG9nIiwidXBkYXRlQWNjb3VudExpbmsiLCJzdGF0dXMiLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJnZXRFbGVtZW50QnlJZCIsImhvbWVQYWdlIiwiaHJlZiIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJlbGVtZW50cyIsImlkSW5wdXQiLCJ1bmRlZmluZWQiLCJpbnB1dEhUTUwiLCJhdHRyaWJ1dGUiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJkYXRhcyIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJlbnRyaWUiLCJlbnRyaWVzIiwiZW1weUZvcm0iLCJ0eXBlIiwiY2hlY2tlZCIsImVtcHlBbmRIaWRlRm9ybSIsInN0eWxlIiwiZGlzcGxheSIsImxvYWRNYXRvbW8iLCJfcGFxIiwid2luZG93IiwicHVzaCIsInNlbGYiLCJnZXRPcmlnaW5hbFZpc2l0b3JDb29raWVUaW1lb3V0Iiwibm93IiwiRGF0ZSIsIm5vd1RzIiwiTWF0aCIsInJvdW5kIiwiZ2V0VGltZSIsInZpc2l0b3JJbmZvIiwiZ2V0VmlzaXRvckluZm8iLCJjcmVhdGVUcyIsInBhcnNlSW50IiwiY29va2llVGltZW91dCIsIm9yaWdpbmFsVGltZW91dCIsInNldFZpc2l0b3JDb29raWVUaW1lb3V0IiwidSIsImQiLCJnIiwicyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXN5bmMiLCJzcmMiLCJwYXJlbnROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibGFuZyIsImdldFRpbWVEaWZmZXJlbmNlIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJzZXRTZXNzaW9uIiwidXNlcklkIiwidG9rZW4iLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIm5iUXVlc3Rpb25zIiwiUXVlc3Rpb25uYWlyZUlkIiwiR3JvdXBJZCIsImNoZWNrU2Vzc2lvbiIsInVybFJlZGlyZWN0aW9uIiwibWVzc2FnZSIsInVybFdhbnRlZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwidXNlciIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInJlc3BvbnNlIiwicmVzcG9uc2VUZXh0IiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidGltZURpZmZlcmVuY2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJhY2NvdW50UGFnZSIsImxvY2F0aW9uIiwiaW5kZXhPZiIsImFzc2lnbiIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImFkZEJ0blR4dCIsImFkZE9rTWVzc2FnZSIsImFsZXJ0TmV3V2luZG93IiwiYmFkVXJsIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsImJ0blByb3Bvc2VDb25uZWN0aW9uIiwiYnRuUHJvcG9zZVN1YnNjcmliZSIsImJ0blNob3dPbldlYlNpdGUiLCJkZWxldGVCdG5UeHQiLCJkZWxldGVGYWlsTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhDcm9uIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhUb2tlbiIsIm5lZWRlZFBhcmFtcyIsIm5leHRQYWdlIiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwibm90VmFsaWRGb3JtYXQiLCJwcmV2aW91c1BhZ2UiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0FsZXJ0Iiwic2NyaXB0VGltaW5nSW5mbyIsInN0YXRzQWRtaW4iLCJzdWJzY3JpcHRpb25DYWxsIiwidXBkYXRlQnRuVHh0IiwidXBkYXRlT2tNZXNzYWdlIiwiYWxyZWFkeUNvbm5lY3RlZCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImJhZFBhc3N3b3JkIiwiYnllYnllTWVzc2FnZSIsImNvbm5lY3Rpb25PayIsImNyZWF0aW9uT2tNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImZhaWxCb3RUZXN0IiwiZmFpbEJvdFRlc3RMb2ciLCJmb3Jtc0VtYWlsTGFiZWwiLCJmb3Jtc0VtYWlsUGxhY2Vob2xkZXIiLCJmb3Jtc0VtYWlsMlBsYWNlaG9sZGVyIiwiZm9ybXNDR1VPa0xhYmVsIiwiZm9ybXNTdWJtaXRUeHQiLCJnb2RmYXRoZXJGb3VuZCIsImdvZGZhdGhlck5vdEZvdW5kIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NVc2VyTmJHb2RDaGlsZHMiLCJpbmZvc1VzZXJOb0dvZGNoaWxkcyIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rVHh0IiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rVHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyTGlua1R4dCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsIm1haWxVcGRhdGVMb2dpbkxpbmtUeHQiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rVHh0IiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lTGlua1R4dCIsIm1haWxXZWxjb21lU3ViamVjdCIsIm5lZWRCZUNvbm5lY3RlZCIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRFbWFpbCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZExhbmd1YWdlIiwibmVlZExvbmdQYXNzV29yZCIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRTdGF0dXMiLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJwYXNzd29yZENvcGllZCIsInNlYXJjaFVzZXJzV2l0aG91dFJlc3VsdCIsInRvb01hbnlMb2dpbkZhaWxzIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE9rTWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwid2VsY29tZU1lc3NhZ2UiLCJUb29sIiwibXlWYXIiLCJ0cmltIiwidHJpbUlmTm90TnVsbCIsIm15U3RyaW5nIiwic2hvcnRlbklmTG9uZ2VyVGhhbiIsIm1heCIsInN1YnN0cmluZyIsInJlcGxhY2VBbGwiLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwibWF0Y2hlZCIsImdldFJhbmRvbUludCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVGb3JtYXQiLCJkYXRlU3RyaW5nIiwibXlEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsInRhZ3NMaXN0VHh0IiwiYWJvdXRQYWdlIiwiY2d1UGFnZSIsImRlbGV0ZUxpbmtQYWdlIiwibG9naW5MaW5rUGFnZSIsIm5ld0xvZ2luTGlua1BhZ2UiLCJzdG9wTWFpbFBhZ2UiLCJ1cGRhdGVBY2NvdW50UGFnZSIsInVzZXJIb21lUGFnZVR4dCIsInZhbGlkYXRpb25MaW5rUGFnZSIsIm1haWxSZWNpcGllbnRUeHQiLCJsaWNlbmNlVHh0IiwiaG9tZVBhZ2VUeHQiLCJob21lQnRuQWJvdXRUeHQiLCJob21lQnRuU3Vic2NyaWJlVHh0IiwiaG9tZVN1YmNyaXB0aW9uRm9ybVRpdGxlIiwibmV3c0xpc3RUaXRsZSIsInRhZ0xpc3RUaXRsZSIsInRhZ0xpc3RNZXRhRGVzYyIsInRhZ0xpc3RJbnRybyIsImFuc3dlcnNFeHBsYW5hdGlvbnNMaW5rVGV4dCIsInF1aXpFbGVtZW50TGlua3NJbnRybyIsInF1aXpFbGVtZW50U3ViY3JpcHRpb25Gb3JtVGl0bGUiLCJleHBsYW5hdGlvbkVsZW1lbnRUeHQiLCJ0d2l0dGVyQWNjb3VudCIsIm1heFF1ZXN0aW9ubmFpcmVzU2l0ZUhvbWVQYWdlIiwiZGl2TWVzc2FnZSIsImRpdlJlc3BvbnNlIiwiaW5pdGlhbGlzZSIsImlzQ29ubmVjdGVkIiwiY29sb3IiLCJlIiwiZXJyb3IiLCJhZGRFdmVudExpc3RlbmVyIiwicHJldmVudERlZmF1bHQiLCJnZXRMb2dpbkxpbmsiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsImNvbm5leGlvblRpbWUiLCJjb25uZXhpb25NYXhUaW1lIiwiZW5kc1dpdGgiLCJlcnJvcnMiLCJzZXRSZXF1ZXN0SGVhZGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxNQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsbUNBQUQsQ0FBckI7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHRCxtQkFBTyxDQUFDLHFEQUFELENBQTlCOztBQUVBRSxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJQyxRQUFNLEVBQUUsMkJBRFo7QUFFSUMsU0FBTyxFQUFFLHVCQUZiO0FBR0lDLFdBQVMsRUFBRSxTQUhmO0FBSUlDLFlB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R2hWLEtBQUssQ0FBQ0MsT0FBTixDQUFja0csUUFBUSxDQUFDNk8sTUFBdkIsQ0FBSCxFQUNJN08sUUFBUSxDQUFDNk8sTUFBVCxHQUFrQjdPLFFBQVEsQ0FBQzZPLE1BQVQsQ0FBZ0J4RixJQUFoQixDQUFxQixNQUFyQixDQUFsQixDQURKLEtBR0lySixRQUFRLENBQUM2TyxNQUFULEdBQWtCek0sV0FBbEI7QUFDSnBKLHFFQUFVLENBQUM4VSxXQUFELEVBQWMsR0FBZCxFQUFtQjlOLFFBQVEsQ0FBQzZPLE1BQTVCLEVBQW9DLEVBQXBDLEVBQXdDLENBQUMsT0FBRCxDQUF4QyxDQUFWO0FBQ0gsV0FQSSxNQVNEN1YseURBQVUsQ0FBQzhVLFdBQUQsRUFBYyxHQUFkLEVBQW1CMUwsV0FBbkIsRUFBZ0MsRUFBaEMsRUFBb0MsQ0FBQyxPQUFELENBQXBDLENBQVY7QUFDUDtBQUNKLE9BL0NEOztBQWdEQXhDLFNBQUcsQ0FBQ2tQLGdCQUFKLENBQXFCLGNBQXJCLEVBQXFDLGtCQUFyQzs7QUFDQSxVQUFHcFQsS0FBSCxFQUNBO0FBQ0lBLGFBQUssQ0FBQzBFLGNBQU4sR0FBcUJsQyxrRUFBaUIsRUFBdEMsQ0FESixDQUVJOztBQUNBeEMsYUFBSyxHQUFDaUQsaUVBQWdCLENBQUNqRCxLQUFELENBQXRCO0FBQ0FrRSxXQUFHLENBQUNpQixJQUFKLENBQVNySSxJQUFJLENBQUNDLFNBQUwsQ0FBZWlELEtBQWYsQ0FBVDtBQUNIO0FBQ0o7QUFDSixHQXZFRCxDQXdFQSxPQUFNd1MsQ0FBTixFQUNBO0FBQ0lsViw2REFBVSxDQUFDOFUsV0FBRCxFQUFjLEdBQWQsRUFBbUIxTCxXQUFuQixFQUFnQyxFQUFoQyxFQUFvQyxDQUFDLE9BQUQsQ0FBcEMsQ0FBVjtBQUNBNUgsV0FBTyxDQUFDMlQsS0FBUixDQUFjRCxDQUFkO0FBQ0g7QUFDSixDQS9FRCxFIiwiZmlsZSI6Ii4vSlMvY29ubmVjdGlvbi5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCB1c2VycyA9IHJlcXVpcmUoXCIuL3VzZXJzXCIpO1xuY29uc3QgcXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi9xdWVzdGlvbm5haXJlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgc2l0ZVVybDogXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIixcbiAgICBhZG1pbk5hbWU6IFwiRmFicmljZVwiLFxuICAgIGFkbWluRW1haWw6IFwiZGV2QHdpa2lsZXJuaS5jb21cIixcbiAgICBzZW5kZXJOYW1lOiBcIldpa2lMZXJuaSAobG9jYWwpXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwid2lraWxlcm5pXCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmkgKGxvY2FsKVwiLFxuICAgIGJlZ2luQ29kZUdvZGZhdGhlcjogXCJXTFwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgZGVmYXVsdFJlY2VpcHREYXlzOiBcIjE0N1wiLCAvLyBQYXIgZMOpZmF1dCwgcXVlbChzKSBqb3VyKHMpIGRlIGxhIHNlbWFpbmUsIGwndXRpbGlzYXRldXIgcmXDp29pdC1pbCBxdWVscXVlIGNob3NlID8gKDE9ZGltYW5jaGUsIDI9bHVuZGkuLi4gNz1zYW1lZGkpXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAwLC8vIGlmIDAgPSB1bmxpbWl0ZWRcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDMsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTAsXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDMsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMiwgLy8gaWYgMCA9IG5vdCBtYXhpbXVtXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYk5ld1F1ZXN0aW9ubmFpcmVzOiAxMiwvLyBmb3IgUlNTLCBldGMuXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW46NywgLy8gaW4gdXNlciBsb2NhbCB0aW1lXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kOjIxLCAvLyBpZGVtXG4gICAgbWF4UXVlc3Rpb25uYWlyZVNlbmRlZEF0U2FtZVRpbWU6IDUwLCAvLyBmb3Igc3Vic2NyaXB0aW9uJ3MgZS1tYWlsaW5nXG4gICAgbWluU2VhcmNoUXVlc3Rpb25uYWlyZXM6IDMsXG4gICAgZmllbGROZXdRdWVzdGlvbm5haXJlcyA6IFwicHVibGlzaGluZ0F0XCIsIC8vIGZpZWxkIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBsaXN0IG9mIHRoZSBsYXN0IHF1ZXN0aW9ubmFpcmVzLCBjYW4gYmUgXCJjcmVhdGVkQXRcIiwgXCJ1cGRhdGVkQXRcIiBvciBcInB1Ymxpc2hpbmdBdFwiXG4gICAgLy8gR3JvdXBzIDpcbiAgICBuYlF1ZXN0aW9ubmFpcmVzQnlHcm91cE1pbjogMSxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzQnlHcm91cE1heDogMCxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMSxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA1MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDAsXG4gICAgLy8gUXVlc3Rpb25zICYgcmVzcG9uc2VzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgcGFzc3dvcmRNaW5MZW5ndGg6IHVzZXJzLnBhc3N3b3JkLm1pbmxlbmd0aCxcbiAgICBkaXJDYWNoZVVzZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzQW5zd2VycyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ucyxcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyV2ViUXVlc3Rpb25uYWlyZXNcbn07IiwiLy8gU2kgbm9uIHV0aWxpc8OpLCBzdXBwcmltZXIgbCdhcHBlbCBkZXMgSlMgZnJvbnQtZW5kIHB1aXMgcmVjb21waWxlci5cbi8vIFJldm9pciBjb21tZW50IHLDqW9yZ2FuaXNlciBjZWxhIHNvdXMtZm9ybWUgZGUgbW9kdWxlIGluZMOpcGVuZGFudC5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBTdGF0cyBNYXRvbW8gOlxuICAgIG1hdG9tbzogeyB1cmw6IFwiaHR0cHM6Ly9zdGF0cy5sZS1mYWItbGFiLmNvbS9cIiwgc2l0ZUlkOiBcIjVcIiB9LFxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsLy8gbGEgYmFzZSDDoCBsYXF1ZWxsZSBzJ2Fqb3V0ZSBsZXMgcm91dGVzIHN1aXZhbnRlc1xuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL2dldHJhbmRvbVwiLCBcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHJlZ2VuZXJhdGVIVE1MOiBcIi9odG1scmVnZW5lcmF0ZWRcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICAvLyAtLSBncm91cGVzIDpcbiAgICBncm91cFJvdXRlczogXCIvZ3JvdXBcIixcbiAgICBnZXRHcm91cFJvdXRlOiBcIi9nZXQvXCIsXG4gICAgcHJldmlld0dyb3VwUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgc2VhcmNoR3JvdXBzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICAvLyAtLSBxdWVzdGlvbnMgJiBjaG9pY2VzIDpcbiAgICBxdWVzdGlvbnNSb3V0ZTogXCIvcXVlc3Rpb24vXCIsXG4gICAgLy8gLS0gdGFncyA6XG4gICAgdGFnc1NlYXJjaFJvdXRlOiBcIi90YWdzL3NlYXJjaC9cIixcbiAgICAvLyAtLSBhbnN3ZXJzIDpcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsLy8gZm9uY3Rpb25uZSBhdXNzaSBwb3VyIGxlcyBncm91cGVzXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLC8vIGlkZW1cbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCBsYWlzc8OpIHZpZGUgZGFucyBsZSBmb3JtdWxhaXJlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIEdyb3VwIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCBsYWlzc8OpIHZpZGUgZGFucyBsZSBmb3JtdWxhaXJlXG4gICAgfSxcbiAgICBRdWVzdGlvbiA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICByYW5rOiB7IHJlcXVpcmVkOiB0cnVlLCBtaW46MSwgZGVmYXVsdFZhbHVlOjEgfVxuICAgIH0sICAgICAgICAgIFxuICAgIENob2ljZSA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2g6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNlYXJjaEdyb3VwczogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgLy8gRW1wbGFjZW1lbnQgZGVzIGZpY2hpZXJzIEpTT04gZ8OpbsOpcsOpcyA6XG4gICAgZGlyQ2FjaGVHcm91cHMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL2dyb3Vwc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICAvLyBFbXBsYWNlbWVudCBkZXMgZmljaGllcnMgSFRNTCBnw6luw6lyw6lzIDpcbiAgICBkaXJIVE1MR3JvdXBzIDogXCJmcm9udC9wdWJsaWMvcXVpei9ncFwiLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlcyA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MTmV3cyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIC8vIElkZW0gbWFpcyBwb3VyIHVybHMgOlxuICAgIGRpcldlYkdyb3VwcyA6IFwicXVpei9ncFwiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmVzIDogXCJxdWl6XCIsXG4gICAgZGlyV2ViTmV3cyA6IFwicXVpenMvXCIsXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenMvXCIsXG4gICAgLy8gbGltaXRlIGRlcyByw6lzdWx0YXQgZHUgbW90ZXVyIGRlIHJlY2hlcmNoZSwgcXVhbmQgZGVtYW5kZSBkZSByw6lzdWx0YXRzIGF1IGhhc2FyZCA6XG4gICAgbmJSYW5kb21SZXN1bHRzIDogMyxcbiAgICAvKiBWYWxldXJzIGVuIGZhaXQgZMOpZmluaWVzIGRhbnMgaW5zdGFuY2UuanMgZG9uYyDDoCBzdXBwcmltZXIgcXVhbmQgcGx1cyB1dGlsaXPDqWVzIGFpbGxldXJzIDogKi9cbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIiwgICBcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLCAgICBcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBnZXRVc2Vyc1F1ZXN0aW9ubmFpcmVzUm91dGU6IFwiL2dldHVzZXJzcXVlc3Rpb25uYWlyZXMvXCIsLy8gbGVzIHF1ZXN0aW9ubmFpcmVzIGF1eHF1ZWxzIGwndXRpbGlzYXRldXIgYSBkw6lqw6AgZXUgYWNjw6hzIHZpYSBzb24gYWJvbm5lbWVudCAgICBcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBzaWdudXBDb21wbGV0aW9uUm91dGU6IFwiL3NpZ251cGNvbXBsZXRpb24vXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNlYXJjaDogeyBtaW5sZW5ndGg6IDEsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6IDg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzV2l0aG91dEFuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL3dpdGhvdXRcIlxufTtcbiIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcblxcbkxlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCB2b3VzIHBvdXZleiBsZSB0cm91dmVyIMOgIGNldHRlIGFkcmVzc2UgOlxcbmh0dHBzOi8vZm9yZ2UuY2hhcHJpbC5vcmcvRmFiX0JsYWIvV2lraUxlcm5pXFxuXFxuUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMgPSAoaW5wdXRzQ29uZiwgbXlGb3JtKSA9Plxue1xuICAgIGZvcihsZXQgaSBpbiBteUZvcm0uZWxlbWVudHMpXG4gICAge1xuICAgICAgICBpZighaXNFbXB0eShteUZvcm0uZWxlbWVudHNbaV0uaWQpKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgaWRJbnB1dD1teUZvcm0uZWxlbWVudHNbaV0uaWQ7XG4gICAgICAgICAgICBpZihpbnB1dHNDb25mW2lkSW5wdXRdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBpbnB1dEhUTUw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRJbnB1dCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIGlucHV0c0NvbmZbaWRJbnB1dF0pXG4gICAgICAgICAgICAgICAgICAgIGlucHV0SFRNTC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBpbnB1dHNDb25mW2lkSW5wdXRdW2F0dHJpYnV0ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBSw6ljdXDDqHJlIHRvdXRlcyBsZXMgdmFsZXVycyBkZSBjaGFtcHMgZW4gb21ldHRhbnQgbGVzIGNoZWNrYm94IG5vbiBjb2Now6llcywgZXRjLlxuZXhwb3J0IGNvbnN0IGdldERhdGFzRnJvbUlucHV0cyA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZGF0YXM9e307XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAgICAgZGF0YXNbZW50cmllWzBdXT1lbnRyaWVbMV07XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBWaWRlIHRvdXMgbGVzIGNoYW1wcyBkJ3VuIGZvcm11bGFpcmUsIHkgY29tcHJpcyBoaWRkZW4sIGNoZWNrYm94LCBldGMuXG4vLyBSZXZvaXIgcG91ciBsZXMgc2VsZWN0XG5leHBvcnQgY29uc3QgZW1weUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgIHtcbiAgICAgICAgaWYobXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJjaGVja2JveFwiIHx8IG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwicmFkaW9cIilcbiAgICAgICAgICAgIG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLmNoZWNrZWQ9ZmFsc2U7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnZhbHVlPVwiXCI7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLy8gVmlkZSBldCBjYWNoZSBsZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgZW1weUFuZEhpZGVGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBlbXB5Rm9ybShteUZvcm0pO1xuICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xufSIsImltcG9ydCB7IG1hdG9tbyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvbWF0b21vLmpzXCI7XG5cbi8vIEZvbmN0aW9uIGNoYXJnZWFudCBsZSBjb2RlIG1hdG9tb1xuZXhwb3J0IGNvbnN0IGxvYWRNYXRvbW8gPSAoKSA9Plxue1xuICAgIC8vIGNoYXJnZW1lbnQgZGUgbWF0b21vXG4gICAgdmFyIF9wYXEgPSB3aW5kb3cuX3BhcSA9IHdpbmRvdy5fcGFxIHx8IFtdO1xuICAgIC8vYWpvdXQgY25pbCAgOlxuICAgIF9wYXEucHVzaChbZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBmdW5jdGlvbiBnZXRPcmlnaW5hbFZpc2l0b3JDb29raWVUaW1lb3V0KClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBub3dUcyA9IE1hdGgucm91bmQobm93LmdldFRpbWUoKSAvIDEwMDApLFxuICAgICAgICAgICAgdmlzaXRvckluZm8gPSBzZWxmLmdldFZpc2l0b3JJbmZvKCk7XG4gICAgICAgICAgICB2YXIgY3JlYXRlVHMgPSBwYXJzZUludCh2aXNpdG9ySW5mb1syXSk7XG4gICAgICAgICAgICB2YXIgY29va2llVGltZW91dCA9IDMzNjk2MDAwOyAvLyAxMyBtb2lzIGVuIHNlY29uZGVzXG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxUaW1lb3V0ID0gY3JlYXRlVHMgKyBjb29raWVUaW1lb3V0IC0gbm93VHM7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxUaW1lb3V0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmlzaXRvckNvb2tpZVRpbWVvdXQoIGdldE9yaWdpbmFsVmlzaXRvckNvb2tpZVRpbWVvdXQoKSApO1xuICAgIH1dKTtcbiAgICAvLy0tZmluIGFqb3V0IGNuaWxcbiAgICBfcGFxLnB1c2goWyd0cmFja1BhZ2VWaWV3J10pO1xuICAgIF9wYXEucHVzaChbJ2VuYWJsZUxpbmtUcmFja2luZyddKTtcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1PW1hdG9tby51cmw7XG4gICAgICAgIF9wYXEucHVzaChbJ3NldFRyYWNrZXJVcmwnLCB1KydtYXRvbW8ucGhwJ10pO1xuICAgICAgICBfcGFxLnB1c2goWydzZXRTaXRlSWQnLCBtYXRvbW8uc2l0ZUlkXSk7XG4gICAgICAgIHZhciBkPWRvY3VtZW50LCBnPWQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JyksIHM9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG4gICAgICAgIGcudHlwZT0ndGV4dC9qYXZhc2NyaXB0JzsgZy5hc3luYz10cnVlOyBnLnNyYz11KydtYXRvbW8uanMnOyBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcscyk7XG4gICAgfSkoKTtcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgLy8gbXVsdGlwbGllciBwYXIgLTEsIGNhciBjJ2VzdCBjZSBxdSdpbCBmYXV0IFwiYWpvdXRlclwiIMOgIGwnaGV1cmUgVVRDIHBvdXIgcmV2ZW5pciBlbiBoZXVyZSBsb2NhbGUgcXVpIG0naW50w6lyZXNzZSBldCBub24gbCdpbnZlcnNlXG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSotMTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXogb3UgZCd1biBncm91cGUgZGUgcXVpenNcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykgJiYgKCFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpIHx8ICFpc0VtcHR5KGFuc3dlci5Hcm91cElkKSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSlcbiAgICAgICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkYXRhcy5Hcm91cElkPWFuc3dlci5Hcm91cElkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGMnZXN0IGxlIHRva2VuIHF1aSBzZXJ0IMOgIHbDqXJpZmllciBsZSBzdGF0dXQgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZS5hY2NvdW50UGFnZStcIiNzdWJzY3JpYmVcIik7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBhZGRPa01lc3NhZ2UgOiBcIkxlcyBkb25uw6llcyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWVzLlwiLFxuICAgIGFsZXJ0TmV3V2luZG93OiBcIm5vdXZlbGxlIGZlbsOqdHJlXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFmZmljaGVyICFcIixcbiAgICBidG5Qcm9wb3NlQ29ubmVjdGlvbjogXCJKZSBtZSBjb25uZWN0ZS5cIixcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIkplIGNyw6llIG1vbiBjb21wdGUuXCIsXG4gICAgYnRuU2hvd09uV2ViU2l0ZTogXCJMaXJlIGxhIHN1aXRlIHN1ciAjU0lURV9OQU1FXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBkZSBsJ2VucmVnaXN0cmVtZW50ICNJRCBhIMOpY2hvdcOpLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIG5leHRQYWdlIDogXCJQYWdlIHN1aXZhbnRlXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgc2VydmVyRXJyb3IgOiBcIkTDqXNvbMOpLiBVbmUgZXJyZXVyIGltcHLDqXZ1ZSBlc3Qgc3VydmVudWUuIFNpIGNlbGEgcGVyc2lzdGUsIG4naMOpc2l0ZXogw6AgcHLDqXZlbmlyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBzZXJ2ZXJFcnJvckFkbWluIDogXCJCdWcgZGUgbCdhcHBsaWNhdGlvbiA6XCIsXG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogbGEgY3VsdHVyZSBnw6luw6lyYWxlIGVuIGxpYmVydMOpXCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQXZlYyBXaWtpTGVybmksIHZvdXMgYXBwcmVuZXogcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBjaG9zZXMuIFZvdXMgcmVjZXZleiBkZSBjb3VydHMgYXJ0aWNsZXMgbGlzaWJsZXMgZW4gcXVlbHF1ZXMgbWludXRlcy4gRGVzIHF1aXpzIHZvdXMgcGVybWV0dGVudCBlbnN1aXRlIGRlIHRlc3RlciBjZSBxdWUgdm91cyBhdmV6IHJldGVudS5cIixcbiAgICBzY3JpcHRUaW1pbmdBbGVydCA6IFwiKioqIFNjcmlwdCBsZW50IDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiLFxuICAgIHN1YnNjcmlwdGlvbkNhbGw6IFwiSW5zY3JpdmV6LXZvdXMgIVwiLFxuICAgIHVwZGF0ZUJ0blR4dDogXCJNb2RpZmllclwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZSA6IFwiTGEgbWlzZSDDoCBqb3VyIMOgIGpvdXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6kgYXUgc2l0ZSAhXCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgYmFkUGFzc3dvcmQ6IFwiQXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG5lIGNvcnJlc3BvbmQgYXV4IGluZm9ybWF0aW9ucyBzYWlzaWVzLlwiLFxuICAgIGJ5ZWJ5ZU1lc3NhZ2U6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgZMOpY29ubmV4aW9uIHMnZXN0IGJpZW4gZMOpcm91bMOpZS48YnI+w4AgYmllbnTDtHQgIVwiLCBcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIGNyZWF0aW9uT2tNZXNzYWdlOiBcIkxlIG5vdXZlbCB1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6kuXCIsXG4gICAgY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgbm9uIHZhbGlkw6lzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBlbWFpbE5vdEZvdW5kOiBcIkF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIGZhaWxCb3RUZXN0OiBcIlVuIHByb2Jsw6htZSBhIMOpdMOpIHJlbmNvbnRyw6kgZHVyYW50IHZvdHJlIGluc2NyaXB0aW9uLiBFbiBjYXMgZGUgZGlmZmljdWx0w6ksIG4naMOpc2l0ZXogcGFzIGNvbnRhY3RlciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgZmFpbEJvdFRlc3RMb2c6IFwiVW5lIGluc2NyaXB0aW9uIGEgw6l0w6kgYmxvcXXDqWUsIHBhcmNlIHF1ZSBsZSBjaGFtcCBlbWFpbDIgw6l0YWl0IHJlbnNlaWduw6kgYXZlYyA6IFwiLFxuICAgIGZvcm1zRW1haWxMYWJlbDogXCJFLW1haWwgOlwiLFxuICAgIGZvcm1zRW1haWxQbGFjZWhvbGRlcjogXCJWb3RyZSBhZHJlc3NlIGUtbWFpbFwiLFxuICAgIGZvcm1zRW1haWwyUGxhY2Vob2xkZXI6IFwiU2kgdm91cyB2b3lleiBjZSBjaGFtcCwgbGFpc3Nlei1sZSB2aWRlXCIsLy9jaGFtcCBxdWkgbmUgZGV2cmFpdCBwYXMgw6p0cmUgdmlzaWJsZSBwYXIgZGVzIGh1bWFpbnNcbiAgICBmb3Jtc0NHVU9rTGFiZWw6IFwiSidhY2NlcHRlIDxhIGhyZWY9I2xpbmsgdGFyZ2V0PVxcXCJfYmxhbmtcXFwiIHJlbD1cXFwibm9vcGVuZXJcXFwiIHRpdGxlPVxcXCLDgCBsaXJlIDopXFxcIj5sZXMgQ29uZGl0aW9ucyBHw6luw6lyYWxlIGQnVXRpbGlzYXRpb248L2E+IGR1IHNpdGUgKHJlcXVpcykuXCIsXG4gICAgZm9ybXNTdWJtaXRUeHQ6IFwiSmUgbSdhYm9ubmUgIVwiLFxuICAgIGdvZGZhdGhlckZvdW5kOiBcIlZvdHJlIFxcXCJwYXJyYWluXFxcIiBhIGJpZW4gw6l0w6kgdHJvdXbDqS4gQ2V0dGUgcGVyc29ubmUgc2VyYSBhdmVydGllIHF1ZSB2b3VzIGwnYXZleiBkw6lzaWduw6llLlwiLFxuICAgIGdvZGZhdGhlck5vdEZvdW5kOiBcIkTDqXNvbMOpIG1haXMgYXVjdW4gdXRpbGlzYXRldXIgbidhIMOpdMOpIHRyb3V2w6kgcG91ciBjZSBjb2RlIC8gZS1tYWlsIGRlIHBhcnJhaW5hZ2UgOihcIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1bHMgOiBcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zVXNlck5iR29kQ2hpbGRzOiBcIlZvaWNpIGxlcyAjTkIgdXRpbGlzYXRldXIocykgaW5zY3JpdChzKSBlbiB2b3VzIGTDqXNpZ25hbnQgY29tbWUgXFxcInBhcnJhaW5cXFwiIDogXCIsXG4gICAgaW5mb3NVc2VyTm9Hb2RjaGlsZHM6IFwiUG91ciBsJ2luc3RhbnQsIGF1Y3VuZSBwZXJzb25uZSBuZSBzJ2VzdCBpbnNjcml0ZSwgZW4gdm91cyBkw6lzaWduYW50IGNvbW1lIFxcXCJwYXJyYWluXFxcIi5cIixcbiAgICBtYWlsRGVsZXRlQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgY29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciBjb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgYSBleHBpcsOpLlwiLFxuICAgIG1haWxEZWxldGVMaW5rTWVzc2FnZTogXCJWb3RyZSBkZW1hbmRlIGRlIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuIE1lcmNpIGRlIGNsaXF1ZXIgc2FucyB0YXJkZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsIHBvdXIgY29uZmlybWVyLlwiLFxuICAgIG1haWxEZWxldGVMaW5rT2tNZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLiBNZXJjaSBkJ2F2b2lyIHV0aWxpc8OpIG5vcyBzZXJ2aWNlcy5cIixcbiAgICBtYWlsRGVsZXRlTGlua1R4dCA6IFwiQ29uZmlybWVyLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgKlRJTUlORyogIVwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIuXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzLCB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS48YnI+U2kgZGFucyBsJ2F2ZW5pciBjZXR0ZSBwZXJzb25uZSBzb3VzY3JpdCB1biBhYm9ubmVtZW50IHByw6ltaXVtLCB2b3RyZSBwcm9wcmUgYWJvbm5lbWVudCBzZXJhIHByb2xvbmfDqSBkZSAzMCBqb3Vycy48L3A+PHA+RW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuR3LDomNlIMOgIHZvdXMsIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcblNpIGRhbnMgbCdhdmVuaXIgY2V0dGUgcGVyc29ubmUgc291c2NyaXQgdW4gYWJvbm5lbWVudCBwcsOpbWl1bSwgdm90cmUgcHJvcHJlIGFib25uZW1lbnQgc2VyYSBwcm9sb25nw6kgZGUgMzAgam91cnMuXFxuRW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIgw6AgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IDogXCJNZXJjaSAhXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZTogXCJDZXBlbmRhbnQsIHZvdXMgYXZleiBtb2RpZmnDqSBhdSBtb2lucyB1biBkZSB2b3MgaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiAoZS1tYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi48YnI+RW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtUeHQgOiBcIlZhbGlkZXIuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIGV0IGNvbXBsw6l0ZXIgdm90cmUgaW5zY3JpcHRpb24sIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gY2ktZGVzc291cyBkYW5zIGxlcyAyNGguPC9wPlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgZXQgY29tcGzDqXRlciB2b3RyZSBpbnNjcmlwdGlvbiwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aCA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rVHh0IDogXCJWYWxpZGVyIG1vbiBjb21wdGUuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNCBIIHN1ciBsZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBxdWkgdmllbnQgZCfDqnRyZSBlbnZvecOpIMOgIHZvdHJlIGFkcmVzc2UgZS1tYWlsICgjRU1BSUwpLlwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdXMgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+PGJyPlNpIHZvdXMgYXZleiBsYSBtb2luZHJlIHF1ZXN0aW9uIG91IHN1Z2dlc3Rpb24gY29uY2VybmFudCBOT01fU0lURSwgbidow6lzaXRleiBwYXMgw6AgbWUgY29udGFjdGVyIGVuIMOpY3JpdmFudCDDoCA8Yj5FTUFJTDwvYj4uPGJyPjxicj5KZSB2b3VzIGNvbnNlaWxsZSBkJ2FpbGxldXJzIGQnYWpvdXRlciA8Yj5FTUFJTDwvYj4gw6Agdm90cmUgY2FybmV0IGQnYWRyZXNzZXMgPGI+cG91ciDDqXZpdGVyIHF1ZSBsZXMgcHJvY2hhaW5zIGVudm9pcyBkZSBOT01fU0lURSBuJ2Fycml2ZW50IGVuIDxpPnNwYW08L2k+PC9iPi48YnI+PGJyPlBhciBhaWxsZXVycywgcG91ciBnw6lyZXIgdm90cmUgYWJvbm5lbWVudCwgYWNjw6lkZXIgw6Agdm9zIGluZm9ybWF0aW9ucyBvdSBlbmNvcmUgY2hlcmNoZXIgcGx1cyBmYWNpbGVtZW50IHBhcm1pIGxlIGNvbnRlbnUgZHUgc2l0ZSwgdm91cyBwb3V2ZXogw6AgdG91dCBtb21lbnQgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlIHV0aWxpc2F0ZXVyLjxicj48YnI+UG91ciBjZSBmYWlyZSwgdXRpbGlzZXogbGUgbGllbiBjaS1kZXNzb3VzLjxicj48YnI+w4AgYmllbnTDtHQgc3VyIE5PTV9TSVRFLlwiLFxuICAgIG1haWxXZWxjb21lQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuVm91cyB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLiBNZXJjaSBldCBiaWVudmVudWUgIVxcblxcblNpIHZvdXMgYXZleiBsYSBtb2luZHJlIHF1ZXN0aW9uIG91IHN1Z2dlc3Rpb24gY29uY2VybmFudCBOT01fU0lURSwgbidow6lzaXRleiBwYXMgw6AgbWUgY29udGFjdGVyIGVuIMOpY3JpdmFudCDDoCBFTUFJTC5cXG5cXG5KZSB2b3VzIGNvbnNlaWxsZSBkJ2FpbGxldXJzIGQnYWpvdXRlciBFTUFJTCDDoCB2b3RyZSBjYXJuZXQgZCdhZHJlc3NlcyBwb3VyIMOpdml0ZXIgcXVlIGxlcyBwcm9jaGFpbnMgZW52b2lzIGRlIE5PTV9TSVRFIG4nYXJyaXZlbnQgZW4gXFxcInNwYW1cXFwiLlxcblxcblBhciBhaWxsZXVycywgcG91ciBnw6lyZXIgdm90cmUgYWJvbm5lbWVudCwgYWNjw6lkZXIgw6Agdm9zIGluZm9ybWF0aW9ucyBvdSBlbmNvcmUgY2hlcmNoZXIgcGx1cyBmYWNpbGVtZW50IHBhcm1pIGxlIGNvbnRlbnUgZHUgc2l0ZSwgdm91cyBwb3V2ZXogw6AgdG91dCBtb21lbnQgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlIHV0aWxpc2F0ZXVyLlxcblxcblBvdXIgY2UgZmFpcmUsIHV0aWxpc2V6IGxlIGxpZW4gc3VpdmFudCA6IExJTktfVVJMXFxuXFxuw4AgYmllbnTDtHQgc3VyIE5PTV9TSVRFLlwiLFxuICAgIG1haWxXZWxjb21lTGlua1R4dCA6IFwiTWUgY29ubmVjdGVyIMOgIG1vbiBjb21wdGUuXCIsXG4gICAgbWFpbFdlbGNvbWVTdWJqZWN0IDogXCJCaWVudmVudWUgIVwiLFxuICAgIG5lZWRCZUNvbm5lY3RlZDogXCJWb3VzIGRldmV6IMOqdHJlIGNvbm5lY3TDqSBwb3VyIGFjY8OpZGVyIMOgIGNldHRlIHBhZ2UuXCIsXG4gICAgbmVlZENob29zZUxvZ2luV2F5OiBcIlZvdXMgZGV2ZXogc29pdCBzYWlzaXIgdm90cmUgbW90IGRlIHBhc3NlLCBzb2l0IGNvY2hlciBsYSBjYXNlIHZvdXMgcGVybWV0dGFudCBkZSByZWNldm9pciB1biBsaWVuIGRlIGNvbm5leGlvbiBwYXIgZS1tYWlsLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZEtub3dOZXdzbGV0dGVyT2sgOiBcIklsIGZhdXQgc2F2b2lyIHNpIGwndXRpbGlzYXRldXIgYWNjZXB0ZSBvdSByZWZ1c2UgZGUgcmVjZXZvaXIgbGEgbmV3c2xldHRlci5cIixcbiAgICBuZWVkTGFuZ3VhZ2UgOiBcIklsIG1hbnF1ZSBsZSBjb2RlIGxhbmd1ZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZE1heFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgYWpvdXRlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA4NDAuXCIsXG4gICAgbmVlZE1pblRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgZW5sZXZlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA3MjAuXCIsXG4gICAgbmVlZE5hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ci5cIixcbiAgICBuZWVkTm90VG9vTG9uZ05hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ciBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSA3MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkTm90VG9vTG9uZ0VtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB1bmUgYWRyZXNzZSBlLW1haWwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIHVuIHNlcnZldXIgU01UUCB2YWxpZGUuXCIsXG4gICAgbmVlZFN0YXR1cyA6IFwiSWwgbWFucXVlIGxlIHN0YXR1dC5cIixcbiAgICBuZWVkVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgY29ubmHDrnRyZSBsZSBub21icmUgZGUgbWludXRlcyBkdSBkw6ljYWxhZ2UgaG9yYWlyZS5cIixcbiAgICBuZWVkVUdDT2sgOiBcIk1lcmNpIGQnYWNjZXB0ZXIgbGVzIENHVSBwb3VyIGNyw6llciB2b3RyZSBjb21wdGUuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBjb21wdGUgdXRpbGlzYXRldXIuIFNpIHZvdXMgYXZleiBkw6lqw6AgdW4gY29tcHRlLCA8YSBocmVmPScvI1VSTCc+Y2xpcXVlei1pY2kgcG91ciB2b3VzIGNvbm5lY3RlcjwvYT4uXCIsXG4gICAgbmVlZFZhbGlkYXRpb25Ub0xvZ2luIDogXCJWb3VzIGRldmV6IGQnYWJvcmQgdmFsaWRlciB2b3RyZSBjb21wdGUgYXZhbnQgZGUgcG91dm9pciB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbm91dmVhdSBsaWVuIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIgZGUgdm90cmUgb3JkaW5hdGV1ciAob3UgbW9iaWxlKS4gVm91cyBwb3V2ZXogbGUgXFxcImNvbGxlclxcXCIgb8O5IHZvdXMgbGUgc291aGFpdGV6LlwiLFxuICAgIHNlYXJjaFVzZXJzV2l0aG91dFJlc3VsdDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiRMOpc29sw6kgbWFpcyBpbCB5IGEgZXUgdHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIHVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCA6IFwiTCdpZGVudGlmaWFudCBmb3VybmkgcG91ciBsZSBwYXJyYWluIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gdXRpbGlzYXRldXIuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgbidhIHBhcyB1biBmb3JtYXQgY29ycmVjdC5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIgOiBcIk1haXMgbGUgbm91dmVhdSBjb2RlIHBhcnJhaW4gbidhIHB1IMOqdHJlIHJldGVudSwgY2FyIGlsIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG91IMOgIGwndXRpbGlzYXRldXIgbHVpLW3Dqm1lLlwiLFxuICAgIHVwZGF0ZWROZWVkVW5pcXVlRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgc2Fpc2llIChORVdfRU1BSUwpIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gYXV0cmUgY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlcjogXCJMJ3V0aWxpc2F0ZXVyIHF1ZSB2b3VzIHNvdWhhaXRleiBtb2RpZmllciBuJ2V4aXN0ZSBwYXMvcGx1cyBvdSBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJWb3MgaW5mb3JtYXRpb25zIG9udCBiaWVuIMOpdMOpIG1pc2VzIMOgIGpvdXIuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIHZvdHJlIGNvbXB0ZS4gVm91cyBwb3V2ZXogdm91cyB5IGNvbm5lY3RlciA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogY29tcGzDqXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIHZvdHJlIGFib25uZW1lbnQgY2ktZGVzc291cy5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB3ZWxjb21lTWVzc2FnZTogXCJCaWVudmVudWUgI05BTUUgIVwiXG59OyIsIi8vIFF1ZWxxdWVzIGZvbmN0aW9ucyB1dGlsZXMgcG91ciBsZXMgY2hhw65uZXNcblxuY2xhc3MgVG9vbFxue1xuICAgIHN0YXRpYyBpc0VtcHR5KG15VmFyKVxuICAgIHtcbiAgICAgICAgaWYobXlWYXI9PT11bmRlZmluZWQgfHwgbXlWYXI9PT1udWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlWYXIrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlWYXI9bXlWYXIudHJpbSgpO1xuICAgICAgICAgICAgaWYobXlWYXI9PT1cIlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgdHJpbUlmTm90TnVsbChteVN0cmluZylcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShteVN0cmluZykpXG4gICAgICAgICAgICBteVN0cmluZz1udWxsO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgc2hvcnRlbklmTG9uZ2VyVGhhbihteVN0cmluZywgbWF4KVxuICAgIHtcbiAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gYXUgY2FzIG/DuSBjZWxhIG5lIHNlcmFpdCBwYXMgdW5lIGNoYcOubmUuLi5cbiAgICAgICBpZihteVN0cmluZy5sZW5ndGggPiBtYXgpXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy5zdWJzdHJpbmcoMCwgKG1heC0zKSkrXCLigKZcIjtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE1NjA0MTQwL3JlcGxhY2UtbXVsdGlwbGUtc3RyaW5ncy13aXRoLW11bHRpcGxlLW90aGVyLXN0cmluZ3NcbiAgICBzdGF0aWMgcmVwbGFjZUFsbChteVN0cmluZywgbWFwT2JqKVxuICAgIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZUVsdHMgPSBuZXcgUmVnRXhwKE9iamVjdC5rZXlzKG1hcE9iaikuam9pbihcInxcIiksXCJnaVwiKTtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nLnJlcGxhY2UocmVwbGFjZUVsdHMsIChtYXRjaGVkKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbWFwT2JqW21hdGNoZWRdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PYmpldHNfZ2xvYmF1eC9NYXRoL3JhbmRvbVxuICAgIHN0YXRpYyBnZXRSYW5kb21JbnQobWluLCBtYXgpXG4gICAge1xuICAgICAgICBtaW4gPSBNYXRoLmNlaWwobWluKTtcbiAgICAgICAgbWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluO1xuICAgIH1cblxuICAgIC8vIMOgIGNvbXBsw6l0ZXIgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EYXRlX2Zvcm1hdF9ieV9jb3VudHJ5XG4gICAgc3RhdGljIGRhdGVGb3JtYXQoZGF0ZVN0cmluZywgbGFuZz1cImZyXCIpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkoZGF0ZVN0cmluZykpXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG15RGF0ZT1uZXcgRGF0ZShkYXRlU3RyaW5nKTtcbiAgICAgICAgbGV0IG15RGF5PW15RGF0ZS5nZXREYXRlKCkrXCJcIjtcbiAgICAgICAgaWYobXlEYXkubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15RGF5PVwiMFwiK215RGF5O1xuICAgICAgICBsZXQgbXlNb3VudGg9KG15RGF0ZS5nZXRNb250aCgpKzEpK1wiXCI7XG4gICAgICAgIGlmKG15TW91bnRoLmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteU1vdW50aD1cIjBcIitteU1vdW50aDtcbiAgICAgICAgbGV0IG15WWVhcj1teURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgaWYobGFuZz09PVwiZnJcIilcbiAgICAgICAgICAgIHJldHVybiBteURheStcIi9cIitteU1vdW50aCtcIi9cIitteVllYXI7XG4gICAgICAgIGVsc2UgaWYgKGxhbmc9PT1cImZvcm1cIikvLyAyMDE0LTAyLTA5XG4gICAgICAgICAgICByZXR1cm4gbXlZZWFyK1wiLVwiK215TW91bnRoK1wiLVwiK215RGF5O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbXlNb3VudGgrXCIvXCIrbXlEYXkrXCIvXCIrbXlZZWFyO1xuICAgIH1cblxuICAgIC8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuICAgIC8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuICAgIHN0YXRpYyBnZXRQYXNzd29yZCAobmJDYXJNaW4sIG5iQ2FyTWF4KVxuICAgIHtcbiAgICAgICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgICAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICAgICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICAgICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICAgICAgfVxuICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICAgICAgcmV0dXJuIHBhc3N3b3JkO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUb29sOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbiAgICB0YWdzTGlzdFR4dDogXCJQYXJjb3VyaXIgbGVzIHJ1YnJpcXVlcyA6XCIsXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBsaWVucyBkZSBsJ2ludGVyZmFjZVxuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIlBhcmNvdXJpclwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvcXVpenMvXCIsIGlkOlwiaW5kZXhIZWFkTGlua1wiLCB0aXRsZTpcIkxlcyBkZXJuacOocmVzIHB1YmxpY2F0aW9uc1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmh0bWxcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIsIHRpdGxlOlwiQWNjw6lkZXIgb3UgY3LDqWV6IHZvdHJlIGNvbXB0ZSBXaWtpTGVybmlcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiLCB0aXRsZTpcIkVuIHNhdm9pciArIHN1ciBXaWtpTGVybmlcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiLCB0aXRsZTpcIlBhZ2UgZCdhY2N1ZWlsXCIgfSB9XG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJCbG9nXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcImh0dHBzOi8vZnJhbWFzcGhlcmUub3JnL3Blb3BsZS83ZTU0YjdhMGI1MzIwMTM4OWVlZjJhMDAwMDA1MzYyNVwiLCB0aXRsZTpcIkxlIGJsb2cgV2lraUxlcm5pIHN1ciBkaWFzcG9yYSpcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiwgdGl0bGU6XCJRdWkgYSBjcsOpw6kgV2lraUxlcm5pID8gUXVlbHMgc29udCB2b3MgZHJvaXRzID9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiLCB0aXRsZTpcIlZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMgc3VyIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ0dWICYgQ0dVXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9DR1YtQ0dVLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9XG4gICAgXSxcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIGFib3V0UGFnZTogXCJhLXByb3Bvcy5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZTogXCJhZG1pbi5odG1sXCIsXG4gICAgY2d1UGFnZTogXCJDR1YtQ0dVLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBkZWxldGVMaW5rUGFnZSA6IFwiYXVyZXZvaXIuaHRtbD90PVwiLFxuICAgIGxvZ2luTGlua1BhZ2UgOiBcImxvZ2luLmh0bWw/dD1cIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIG5ld0xvZ2luTGlua1BhZ2UgOiBcIm5ld2xvZ2luLmh0bWw/dD1cIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLCAgICBcbiAgICBzdG9wTWFpbFBhZ2UgOiBcInN0b3AtbWFpbC5odG1sP3Q9XCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIHVwZGF0ZUFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICB1c2VySG9tZVBhZ2VUeHQgOiBcIk1hIHBhZ2UgZCdhY2N1ZWlsLlwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIHZhbGlkYXRpb25MaW5rUGFnZSA6IFwidmFsaWRhdGlvbi5odG1sP3Q9XCIsXG4gICAgLyogVGV4dGVzIChnw6luw6lyYWwpICovXG4gICAgc2l0ZVNsb2dhbjogXCJDdWx0aXZvbnMgbm90cmUgamFyZGluICFcIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxuICAgIG1haWxSZWNpcGllbnRUeHQ6IFwiTWVzc2FnZSBlbnZvecOpIMOgIDpcIixcbiAgICBsaWNlbmNlVHh0OiBcIkBjb3B5bGVmdCBMZSBjb250ZW51IGRlIFdpa2lMZXJuaSA8YSBocmVmPVxcXCIvY3JlZGl0cy5odG1sXFxcIiB0aXRsZT1cXFwiRW4gc2F2b2lyIHBsdXMgP1xcXCI+ZXN0IGxpYnJlPC9hPiBldCB2b3VzIGVzdCBvZmZlcnQgc2FucyBwdWJsaWNpdMOpLiBWb3VzIHBvdXZleiA8YSBocmVmPVxcXCIvcGFydGljaXBlci1maW5hbmNlbWVudC5odG1sXFxcIiB0aXRsZT1cXFwiRmluYW5jZW1lbnQgcGFydGljaXBhdGlmIGF2ZWMgY29udHJlLXBhcnRpZXNcXFwiPnBhcnRpY2lwZXIgw6Agc29uIGZpbmFuY2VtZW50IGVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgLyogUGFnZSBkJ2FjY3VlaWwgKi9cbiAgICBob21lUGFnZVR4dDogXCJQYWdlIGQnYWNjdWVpbFwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiPGI+QXZlYyBXaWtpTGVybmksIHZvdXMgYXBwcmVuZXogcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+Ljxicj5Wb3VzIHJlY2V2ZXogZGUgY291cnRzIGFydGljbGVzLCBsaXNpYmxlcyBlbiBxdWVscXVlcyBtaW51dGVzLjxicj5EZXMgcXVpenMgdm91cyBwZXJtZXR0ZW50IGVuc3VpdGUgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgPGI+ZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgY3VsdHVyZSBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBqYXJkaW48L2I+LlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBnw6luw6lyYWxlIGVuIGxpYmVydMOpXCIsXG4gICAgaG9tZVAyOiBcIjxiPlBhcyBkZSBmYWl0cyBhbHRlcm5hdGlmczwvYj4sIHRvdXMgbGVzIGNvbnRlbnVzIHNvbnQgPGI+c291cmPDqXMgcGFyIGRlcyBhcnRpY2xlcyBXaWtpcMOpZGlhPC9iPi48YnI+RXQgdG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwdWJsacOpIHN1ciBXaWtpTGVybmkgPGEgaHJlZj1cXFwiL2NyZWRpdHMuaHRtbFxcXCIgdGl0bGU9XFxcIkVuIHNhdm9pciBwbHVzIHN1ciBjZSBzdWpldFxcXCI+c29udCBwYXJ0YWfDqXMgc291cyBsaWNlbmNlcyBsaWJyZXM8L2E+Ljxicj5MZSB0b3V0IHNhbnMgcHVibGljaXTDqSwgbmkgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzLjxicj48Yj5TdXIgV2lraUxlcm5pLCB2b3VzIGN1bHRpdmV6IHZvdHJlIGphcmRpbiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLjwvYj5cIixcbiAgICBob21lQnRuQWJvdXRUeHQ6IFwiRW4gc2F2b2lyIHBsdXMgc3VyIFdpa2lMZXJuaSA/XCIsXG4gICAgaG9tZUJ0blN1YnNjcmliZVR4dDogIFwiVGVzdGV6IFdpa2lMZXJuaVwiLFxuICAgIGhvbWVTdWJjcmlwdGlvbkZvcm1UaXRsZTogIFwiUmVjZXZleiBsZXMgcHJvY2hhaW5zIGFydGljbGVzIFdpa2lMZXJuaVwiLFxuICAgIC8qIFBhZ2UgZGVybmnDqHJlcyBwdWJsaWNhdGlvbnMuLi4gKi8gICBcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkN1bHR1cmUgZ8OpbsOpcmFsZSAtIGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIldpa2lMZXJuaSA6IHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgV2lraUxlcm5pLlwiLFxuICAgIG5ld3NMaXN0VGl0bGU6IFwiPHA+PGI+QXZlYyBXaWtpTGVybmksIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgcXVlbHF1ZSBjaG9zZSBkZSBub3V2ZWF1PC9iPjxicj5TaSBkZXNzb3VzIGxlcyBkZXJuacOocmVzIHB1YmxpY2F0aW9ucy4gVm91cyBwb3V2ZXogYXVzc2kgPGEgaHJlZj0nL3F1aXpzL3RoZW1lcy5odG1sJz5wYXJjb3VyaXIgbGUgc2l0ZSBwYXIgdGjDqG1lcyBvdSBtb3RzLWNsw6lzPC9hPi48L3A+XCIsXG4gICAgLyogUGxhbiBkdSBzaXRlLCBsaXN0ZSBkZXMgdGFncyAqLyAgIFxuICAgIHRhZ0xpc3RUaXRsZTogXCJDdWx0dXJlIGfDqW7DqXJhbGUgLSBkZXMgYXJ0aWNsZXMgZXQgcXVpenMgc3VyIGRlIG5vbWJyZXV4IHRow6htZXMgIVwiLFxuICAgIHRhZ0xpc3RNZXRhRGVzYzogXCJXaWtpTGVybmkgOiBkw6ljb3V2cmlyIGxlcyBkaWZmw6lyZW50cyB0aMOobWVzIGFib3Jkw6lzIHBhciBXaWtpTGVybmkuIElueGV4IGR1IHNpdGUuXCIsXG4gICAgdGFnTGlzdEludHJvOiBcIjxoMz5BdmVjIFdpa2lMZXJuaSwgZGV2ZW5leiBmb3J0IGVuIHRow6htZXMuLi4gT3VpIG1haXMgcXVlbHMgdGjDqG1lcyA/IDopPC9oMz48YmxvY2txdW90ZT5BcmlzdG90ZeKArzogwqvigK9M4oCZaG9tbWUgYSBuYXR1cmVsbGVtZW50IGxhIHBhc3Npb24gZGUgY29ubmHDrnRyZeKApuKAr8K7PC9ibG9ja3F1b3RlPlwiLFxuICAgIC8qIFBhZ2UgcXVpenMgKi9cbiAgICBhbnN3ZXJzRXhwbGFuYXRpb25zTGlua1RleHQ6IFwiUmVsaXJlXCIsXG4gICAgcXVpekVsZW1lbnRMaW5rc0ludHJvOiBcIkVuIHNhdm9pciBwbHVzXCIsXG4gICAgcXVpekVsZW1lbnRTdWJjcmlwdGlvbkZvcm1UaXRsZTogXCJSZWNldmV6IGxlcyBwcm9jaGFpbnMgYXJ0aWNsZXMgV2lraUxlcm5pXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5p4oCvP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIjxwPkxlIHByaW5jaXBlIGVzdCBzaW1wbGXigK86IDxiPnZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGzigJlhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpPC9iPi4gUHVpcyB2b3VzIDxiPmFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZTwvYj4uIFN1aXZhbnQgbGVzIHF1ZXN0aW9ucywgPGI+dW5lIG91IHBsdXNpZXVycyByw6lwb25zZXMgcGV1dmVudCDDqnRyZSBjb3JyZWN0ZXM8L2I+IGV0IGRvaXZlbnQgZG9uYyDDqnRyZSBjb2Now6llcy4gQ+KAmWVzdCB0b3Vqb3VycyA8Yj5sZSBjb250ZW51IGRlIGzigJlhcnRpY2xlIFdpa2lww6lkaWEgcXVpIGZhaXQgZm9pPC9iPiBjb25jZXJuYW50IGxlcyDCq+KAr2Jvbm5lc+KAr8K7IHLDqXBvbnNlcy4gQ+KAmWVzdCB1bmUgZmHDp29uIGRlIHRlc3RlciDDoCBsYSBmb2lzIHZvdHJlIGNhcGFjaXTDqSBk4oCZYXR0ZW50aW9uIGV0IHZvdHJlIG3DqW1vaXJlLiBMZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBwZXV2ZW50IMOpdm9sdWVyLCBkb25jIG7igJlow6lzaXRleiBwYXMgPGEgaHJlZj0nL2NvbnRhY3QuaHRtbCc+w6AgbWUgc2lnbmFsZXIgdW5lIGVycmV1cjwvYT4uPC9wPjxwPjxiPldpa2lMZXJuaSB2b3VzIHByb3Bvc2UgZOKAmWF1dHJlcyBzb2x1dGlvbnMgcG91ciBhbcOpbGlvcmVyIHZvdHJlIGN1bHR1cmUgZ8OpbsOpcmFsZTwvYj4uIFBvdXIgZW4gc2F2b2lyIHBsdXMsIGNsaXF1ZXogc3VyIGxlIGJvdXRvbiBjaS1kZXNzb3VzLjwvcD5cIixcbiAgICBleHBsYW5hdGlvbkVsZW1lbnRUeHQ6IFwiPHA+V2lraUxlcm5pIHZvdXMgcHJvcG9zZSBkZSA8Yj5yZWNldm9pciBwYXIgZS1tYWlsIMOgIGxhIGZyw6lxdWVuY2UgY2hvaXNpZSwgZGUgY291cnRzIGFydGljbGVzIGxpc2libGVzIGVuIHF1ZWxxdWVzIG1pbnV0ZXM8L2I+IGV0IHBvcnRhbnQgc3VyIGRlcyBzdWpldHMgdHLDqHMgdmFyacOpcyBkZSA8Yj5jdWx0dXJlIGfDqW7DqXJhbGU8L2I+IChhcnRzLCBoaXN0b2lyZSwgbGl0dMOpcmF0dXJlLCBzY2llbmNlcywgZXRjLikuPC9wPjxwPkNlcyBhcnRpY2xlcyBzb250IGJhc8OpcyBzdXIgPGI+dW5lIG91IHBsdXNpZXVycyBwYWdlcyBkZSBXaWtpcMOpZGlhPC9iPiAoZm91cm5pZXMgZW4gbGllbiksIGRvbnQgPGI+aWxzIGV4dHJhaWVudCBjZXJ0YWluZXMgaW5mb3JtYXRpb25zPC9iPi48L3A+PHA+Q2hhcXVlIHPDqXJpZSBk4oCZYXJ0aWNsZXMgZXN0IDxiPnN1aXZpZSBk4oCZdW4gcXVpejwvYj4gcGVybWV0dGFudCBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUuPC9wPjxwPjxiPlZvdXMgYXBwcmVuZXogYWluc2kgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+IHRyw6hzIHNpbXBsZW1lbnQuPC9wPlwiLFxuICAgIC8qIEF1dHJlcyAqL1xuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICB0d2l0dGVyQWNjb3VudDogXCJXaWtpTGVybmlcIixcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogMTIsXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNTaXRlSG9tZVBhZ2U6IDMsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDMsXG59OyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIixcblx0XCIuL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvLyAtLSBHRVNUSU9OIERVIEZPUk1VTEFJUkUgUEVSTUVUVEFOVCBERSBTRSBDT05ORUNURVJcblxuLy8vIEwndXRpbGlzYXRldXIgcGV1dCBhdm9pciByw6lwb25kdSDDoCB1biBxdWl6IGF2YW50IGQnYXJyaXZlciBzdXIgbGEgcGFnZSBkZSBjb25uZXhpb24uXG4vLy8gRGFucyBjZSBjYXMgaWwgZmF1dCBlbnJlZ2lzdHJlciBzb24gcsOpc3VsdGF0IGVuIG3Dqm1lIHRlbXBzLCB1bmUgZm9pcyBsYSBjb25uZXhpb24gdmFsaWTDqWUuXG5cbi8vLyBMZSBjb25uZXhpb24gcGV1dCBzZSBmYWlyZSBkaXJlY3RlbWVudCBpY2kgdmlhIGxhIHNhaXNpZSBkJ3VuIG1vdCBkZSBwYXNzZSBvdSB2aWEgbCdlbnZvaSBkJ3VuIHRva2VuIHBhciBlLW1haWwuXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiB0aXLDqXMgZHUgYmFja2VuZCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmltcG9ydCB7IGNvbm5lY3Rpb25Sb3V0ZSwgZ2V0TG9naW5MaW5rUm91dGUsIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZXMgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgYWRkRWxlbWVudCB9IGZyb20gXCIuL3Rvb2xzL2RvbS5qc1wiO1xuaW1wb3J0IHsgaGVsbG9EZXYgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBnZXREYXRhc0Zyb21JbnB1dHMgfSBmcm9tIFwiLi90b29scy9mb3Jtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi90b29scy9tYWluXCI7XG5pbXBvcnQgeyBsb2FkTWF0b21vIH0gZnJvbSBcIi4vdG9vbHMvbWF0b21vLmpzXCI7XG5pbXBvcnQgeyBjaGVja0Fuc3dlckRhdGFzLCBjaGVja1Nlc3Npb24sIGdldFRpbWVEaWZmZXJlbmNlLCBzZXRTZXNzaW9uIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB7IHNlcnZlckVycm9yIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2dlbmVyYWxcIik7XG5jb25zdCB7IGFscmVhZHlDb25uZWN0ZWQsIG5lZWRDaG9vc2VMb2dpbldheSB9ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG4vLyBQcmluY2lwYXV4IMOpbMOpbWVudHMgZHUgRE9NIG1hbmlwdWzDqXMgOlxuY29uc3QgbXlGb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb25uZWN0aW9uXCIpO1xuY29uc3QgZGl2TWVzc2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWVzc2FnZVwiKTtcbmNvbnN0IGRpdlJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcblxuaGVsbG9EZXYoKTtcblxuLy8gVGVzdCBkZSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciArIGFmZmljaGFnZSBmb3JtdWxhaXJlIGQnaW5zY3JpcHRpb24uXG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbigpO1xuICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAge1xuICAgICAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgeyBtZXNzYWdlOiBhbHJlYWR5Q29ubmVjdGVkLCBjb2xvcjpcImluZm9cIiB9KTsvLyBwb3VyIGwnYWZmaWNoZXIgc3VyIGxhIHBhZ2Ugc3VpdmFudGVcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxvYWRNYXRvbW8oKTtcbiAgICAgICAgICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIGlmKCFpc0VtcHR5KGdldExvY2FseShcIm1lc3NhZ2VcIikpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIGdldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkubWVzc2FnZSwgXCJcIiwgW2dldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkuY29sb3JdKTtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJtZXNzYWdlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTtcblxuLy8gVHJhaXRlbWVudCBkZSBsJ2Vudm9pIGRlcyBkb25uw6llcyBkZSBjb25uZXhpb24gOlxubXlGb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZGl2UmVzcG9uc2UuaW5uZXJIVE1MPVwiXCI7Ly8gZWZmYWNlIGQnw6l2ZW50dWVscyBtZXNzYWdlcyBkw6lqw6AgYWZmaWNow6lzXG4gICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMobXlGb3JtKTtcbiAgICAgICAgaWYoaXNFbXB0eShkYXRhcy5wYXNzd29yZCkgJiYgaXNFbXB0eShkYXRhcy5nZXRMb2dpbkxpbmspKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJkaXZcIiwgbmVlZENob29zZUxvZ2luV2F5LCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5nZXRMb2dpbkxpbmspKVxuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrdXNlclJvdXRlcytnZXRMb2dpbkxpbmtSb3V0ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIGFwaVVybCt1c2VyUm91dGVzK2Nvbm5lY3Rpb25Sb3V0ZSk7XG4gICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KHJlc3BvbnNlLm1lc3NhZ2UpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgICAvLyBjYXMgZCd1bmUgZGVtYW5kZSBkZSBsaWVuIGRlIGNvbm5leGlvbiBhdmVjIHN1Y2PDqHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZighaXNFbXB0eShyZXNwb25zZS51c2VySWQpICYmICFpc0VtcHR5KHJlc3BvbnNlLmNvbm5leGlvblRpbWUpICYmICFpc0VtcHR5KHJlc3BvbnNlLnRva2VuKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgICAvLyBjYXMgZCd1bmUgY29ubmV4aW9uIHZpYSBtb3QgZGUgcGFzc2UgYXZlYyBzdWNjw6hzIDogb24gY3LDqWUgdW5lIHNlc3Npb24gZGUgY29ubmV4aW9uIGV0IHJlZGlyaWdlIGwndXRpbGlzYXRldXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbm5leGlvbk1heFRpbWU9RGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5jb25uZXhpb25UaW1lLmVuZHNXaXRoKFwiZGF5c1wiKSkvLyBsJ3V0aWxpc2F0ZXVyIGEgZGVtYW5kw6kgw6AgcmVzdGVyIGNvbm5lY3TDqSBzdXIgbGEgZHVyw6llLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZXhpb25NYXhUaW1lKz1wYXJzZUludChyZXNwb25zZS5jb25uZXhpb25UaW1lLDEwKSoyNCozNjAwKjEwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZXhpb25NYXhUaW1lKz1wYXJzZUludChyZXNwb25zZS5jb25uZXhpb25UaW1lLDEwKSozNjAwKjEwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2Vzc2lvbihyZXNwb25zZS51c2VySWQsIHJlc3BvbnNlLnRva2VuLCBjb25uZXhpb25NYXhUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJsYXN0QW5zd2VyXCIpOy8vICEgaW1wb3J0YW50IHBvdXIgbmUgcGFzIGVucmVnaXN0ZXIgcGx1c2lldXJzIGZvaXMgc29uIMOpdmVudHVlbCByw6lzdWx0YXQgYXUgcXVpei4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsJ3V0aWxpc2F0ZXVyIHBldXQgYXZvaXIgdGVudMOpIGQnYWNjw6lkZXIgw6AgdW5lIGF1dHJlIHBhZ2UgcXVlIHNhIHBhZ2UgZCdhY2N1ZWlsIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsPWdldExvY2FseShcInVybFwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighaXNFbXB0eSh1cmwpICYmIHVybC5ocmVmLmluZGV4T2Yoc2l0ZVVybCkhPT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybD11cmwuaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXJsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybD1jb25maWdUZW1wbGF0ZVtyZXNwb25zZS5zdGF0dXMrXCJIb21lUGFnZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgIGlmKGRhdGFzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGFzLnRpbWVEaWZmZXJlbmNlPWdldFRpbWVEaWZmZXJlbmNlKCk7XG4gICAgICAgICAgICAgICAgLy8gU2kgbCd1dGlsaXNhdGV1ciBhIHLDqXBvbmR1IMOgIHVuIHF1aXosIGonYWpvdXRlIGxlcyBpbmZvcyBkZSBzb24gcsOpc3VsdGF0IGF1eCBkb25uw6llcyBlbnZvecOpZXMgOlxuICAgICAgICAgICAgICAgIGRhdGFzPWNoZWNrQW5zd2VyRGF0YXMoZGF0YXMpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=
|