1684 lines
234 KiB
JavaScript
1684 lines
234 KiB
JavaScript
/******/ (function(modules) { // webpackBootstrap
|
||
/******/ // The module cache
|
||
/******/ var installedModules = {};
|
||
/******/
|
||
/******/ // The require function
|
||
/******/ function __webpack_require__(moduleId) {
|
||
/******/
|
||
/******/ // Check if module is in cache
|
||
/******/ if(installedModules[moduleId]) {
|
||
/******/ return installedModules[moduleId].exports;
|
||
/******/ }
|
||
/******/ // Create a new module (and put it into the cache)
|
||
/******/ var module = installedModules[moduleId] = {
|
||
/******/ i: moduleId,
|
||
/******/ l: false,
|
||
/******/ exports: {}
|
||
/******/ };
|
||
/******/
|
||
/******/ // Execute the module function
|
||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||
/******/
|
||
/******/ // Flag the module as loaded
|
||
/******/ module.l = true;
|
||
/******/
|
||
/******/ // Return the exports of the module
|
||
/******/ return module.exports;
|
||
/******/ }
|
||
/******/
|
||
/******/
|
||
/******/ // expose the modules object (__webpack_modules__)
|
||
/******/ __webpack_require__.m = modules;
|
||
/******/
|
||
/******/ // expose the module cache
|
||
/******/ __webpack_require__.c = installedModules;
|
||
/******/
|
||
/******/ // define getter function for harmony exports
|
||
/******/ __webpack_require__.d = function(exports, name, getter) {
|
||
/******/ if(!__webpack_require__.o(exports, name)) {
|
||
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
||
/******/ }
|
||
/******/ };
|
||
/******/
|
||
/******/ // 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 });
|
||
/******/ };
|
||
/******/
|
||
/******/ // create a fake namespace object
|
||
/******/ // mode & 1: value is a module id, require it
|
||
/******/ // mode & 2: merge all properties of value into the ns
|
||
/******/ // mode & 4: return value when already ns object
|
||
/******/ // mode & 8|1: behave like require
|
||
/******/ __webpack_require__.t = function(value, mode) {
|
||
/******/ if(mode & 1) value = __webpack_require__(value);
|
||
/******/ if(mode & 8) return value;
|
||
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
||
/******/ var ns = Object.create(null);
|
||
/******/ __webpack_require__.r(ns);
|
||
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
||
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
||
/******/ return ns;
|
||
/******/ };
|
||
/******/
|
||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||
/******/ __webpack_require__.n = function(module) {
|
||
/******/ var getter = module && module.__esModule ?
|
||
/******/ function getDefault() { return module['default']; } :
|
||
/******/ function getModuleExports() { return module; };
|
||
/******/ __webpack_require__.d(getter, 'a', getter);
|
||
/******/ return getter;
|
||
/******/ };
|
||
/******/
|
||
/******/ // Object.prototype.hasOwnProperty.call
|
||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
||
/******/
|
||
/******/ // __webpack_public_path__
|
||
/******/ __webpack_require__.p = "";
|
||
/******/
|
||
/******/
|
||
/******/ // Load entry module and return exports
|
||
/******/ return __webpack_require__(__webpack_require__.s = "./src/accountUser.js");
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ({
|
||
|
||
/***/ "../config/instance.js":
|
||
/*!*****************************!*\
|
||
!*** ../config/instance.js ***!
|
||
\*****************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var _module$exports;
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
var users = __webpack_require__(/*! ./users */ "../config/users.js");
|
||
|
||
var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js");
|
||
|
||
module.exports = (_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: 15,
|
||
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: 2,
|
||
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: 1
|
||
}, _defineProperty(_module$exports, "nbQuestionsMin", 1), _defineProperty(_module$exports, "nbQuestionsMax", 0), _defineProperty(_module$exports, "nbChoicesMax", 10), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaires", questionnaires.dirHTMLQuestionnaires), _defineProperty(_module$exports, "dirWebQuestionnaires", questionnaires.dirWebQuestionnaires), _module$exports);
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../config/questionnaires.js":
|
||
/*!***********************************!*\
|
||
!*** ../config/questionnaires.js ***!
|
||
\***********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
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 ***!
|
||
\**************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
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"
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang sync recursive ^\\.\\/.*\\/general$":
|
||
/*!**************************************!*\
|
||
!*** ../lang sync ^\.\/.*\/general$ ***!
|
||
\**************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, 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 ^\\.\\/.*\\/subscription$":
|
||
/*!*******************************************!*\
|
||
!*** ../lang sync ^\.\/.*\/subscription$ ***!
|
||
\*******************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports, __webpack_require__) {
|
||
|
||
var map = {
|
||
"./fr/subscription": "../lang/fr/subscription.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 ^\\.\\/.*\\/subscription$";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang sync recursive ^\\.\\/.*\\/user$":
|
||
/*!***********************************!*\
|
||
!*** ../lang sync ^\.\/.*\/user$ ***!
|
||
\***********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, 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$";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang/fr/general.js":
|
||
/*!*****************************!*\
|
||
!*** ../lang/fr/general.js ***!
|
||
\*****************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
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: "Voir 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 chaque jour 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/subscription.js":
|
||
/*!**********************************!*\
|
||
!*** ../lang/fr/subscription.js ***!
|
||
\**********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
module.exports = {
|
||
allSubscriptionProcessed: "Tous les abonnés ont été traités pour le moment.",
|
||
infosExpirated: "Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées.<br>Pour ce faire, suivez sans tarder les indications ci-dessous :",
|
||
infosExpiratedAdmin: "Cet abonnement a expiré.",
|
||
infosNbDays: "Votre abonnement est encore valable <b>pendant NB_DAYS jours</b>.<br>Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :",
|
||
infosNbDaysAdmin: "Cet abonnement est encore valable <b>pendant NB_DAYS jours</b>.",
|
||
infosPaymentsAdmin: "DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME.",
|
||
isNotValided: "Cet utilisateur n'a pas encore validé son compte.<br>Vous pouvez le faire à sa place <a href='#validationOk'>en cochant la case indiquée</a> et enregistrant.",
|
||
mailEndFreeTimeBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.<br><br>Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement sans tarder en cliquant sur le lien ci-dessous.</p>",
|
||
mailEndFreeTimeBodyTxt: "Bonjour USER_NAME,\n\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\n\nPour continuer à utiliser le site, vous pouvez sans attendre souscrire à un abonnement :\nLINK_URL",
|
||
mailEndFreeTimeLinkTxt: "M'abonner.",
|
||
mailEndFreeTimeMessage: " relances envoyées.",
|
||
mailEndFreeTimeSubject: "Votre abonnement gratuit va expirer",
|
||
mailExpirationBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Votre abonnement à SITE_NAME va expirer d'ici quelques jours.<br><br>Pour continuer à utiliser SITE_NAME, vous pouvez le prolonger dès aujourd'hui en cliquant sur le lien ci-dessous.</p>",
|
||
mailExpirationBodyTxt: "Bonjour USER_NAME,\n\nVotre abonnement à SITE_NAME va expirer d'ici quelques jours.\n\nPour continuer à utiliser SITE_NAME, vous pouvez le prolonger dès aujourd'hui :\nLINK_URL",
|
||
mailExpirationLinkTxt: "Prolonger mon abonnement.",
|
||
mailExpirationMessage: "FIRST premières et SECOND deuxièmes relances envoyées pour des abonnements expirant d'ici peu.",
|
||
mailExpirationRelaunchTxt: "[Rappel] ",
|
||
mailExpirationSubject: "Votre abonnement va bientôt expirer",
|
||
mailNewElementForGroupTxt: "Bonjour USER_NAME,\n\nVoici le lien vers le nouvel article à lire :\n\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL",
|
||
mailNewQuestionnaireBodyTxt: "Bonjour USER_NAME,\n\nVoici le lien vers le nouveau quiz :\n\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL",
|
||
mailStopMailLinkTxt: "Stopper les envois.",
|
||
needKnowIfNoticeOk: "Il manque l'information sur l'acceptation ou non de recevoir des notifications.",
|
||
needIntegerNumberOfDays: "Le nombre de jours de l'abonnement doit être un nombre entier.",
|
||
needMinNumberOfDays: "Le nombre de jours de l'abonnement ne peut être négatif !",
|
||
needNotTooLongDaysList: "La liste de jours sélectionnés n'a pas le bon format (trop longue).",
|
||
needNumberOfDays: "Il faut un nombre de jours pour l'abonnement.",
|
||
needUniqueDaysList: "La liste de jours sélectionnés n'a pas le bon format. Doublon : ",
|
||
needValidDaysList: "La liste de jours sélectionnés n'a pas le bon format. Caractère non valide : ",
|
||
noNewQuestionnaireForUser: "Aucun nouveau questionnaire trouvé pour un abonné : ",
|
||
unsubscriptionOk: "Votre demande a bien été prise en compte. Vous ne recevrez plus de messages venant du site, sauf pour vous signaler la fin de votre abonnement.<br>N'hésitez pas <a href='/#URL'>à accéder à votre compte</a> pour de nouveau autoriser certains envois.",
|
||
unsubscriptionFail: "Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas.<br>Vous pouvez <a href='/#URL'>accéder à votre compte</a> pour désactiver les envois manuellement."
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../lang/fr/user.js":
|
||
/*!**************************!*\
|
||
!*** ../lang/fr/user.js ***!
|
||
\**************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
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.",
|
||
formsEmailLabel: "E-mail :",
|
||
formsEmailPlaceholder: "Votre adresse e-mail",
|
||
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 de vous être envoyé par e-mail.",
|
||
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 ***!
|
||
\************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
||
|
||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
||
|
||
// Quelques fonctions utiles pour les chaînes
|
||
var Tool = /*#__PURE__*/function () {
|
||
function Tool() {
|
||
_classCallCheck(this, Tool);
|
||
}
|
||
|
||
_createClass(Tool, null, [{
|
||
key: "isEmpty",
|
||
value: function 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;
|
||
}
|
||
}
|
||
}, {
|
||
key: "trimIfNotNull",
|
||
value: function trimIfNotNull(myString) {
|
||
if (Tool.isEmpty(myString)) myString = null;else {
|
||
myString += ""; // si autre chose qu'une chaîne envoyé...
|
||
|
||
myString = myString.trim();
|
||
}
|
||
return myString;
|
||
}
|
||
}, {
|
||
key: "shortenIfLongerThan",
|
||
value: function 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
|
||
|
||
}, {
|
||
key: "replaceAll",
|
||
value: function replaceAll(myString, mapObj) {
|
||
var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi");
|
||
return myString.replace(replaceElts, function (matched) {
|
||
return mapObj[matched];
|
||
});
|
||
} // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random
|
||
|
||
}, {
|
||
key: "getRandomInt",
|
||
value: function 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
|
||
|
||
}, {
|
||
key: "dateFormat",
|
||
value: function dateFormat(dateString) {
|
||
var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr";
|
||
if (Tool.isEmpty(dateString)) return "";
|
||
var myDate = new Date(dateString);
|
||
var myDay = myDate.getDate() + "";
|
||
if (myDay.length === 1) myDay = "0" + myDay;
|
||
var myMounth = myDate.getMonth() + 1 + "";
|
||
if (myMounth.length === 1) myMounth = "0" + myMounth;
|
||
var 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.
|
||
|
||
}, {
|
||
key: "getPassword",
|
||
value: function getPassword(nbCarMin, nbCarMax) {
|
||
var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));
|
||
var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz";
|
||
var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";
|
||
var password = letters[Math.floor(Math.random() * letters.length)];
|
||
|
||
for (var 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;
|
||
}
|
||
}]);
|
||
|
||
return Tool;
|
||
}();
|
||
|
||
module.exports = Tool;
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../views sync recursive ^\\.\\/.*\\.js$":
|
||
/*!**********************************!*\
|
||
!*** ../views sync ^\.\/.*\.js$ ***!
|
||
\**********************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, 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$";
|
||
|
||
/***/ }),
|
||
|
||
/***/ "../views/default/config/fr.js":
|
||
/*!*************************************!*\
|
||
!*** ../views/default/config/fr.js ***!
|
||
\*************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
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 ***!
|
||
\***************************************/
|
||
/*! no static exports found */
|
||
/***/ (function(module, exports) {
|
||
|
||
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 ce site <a href=\"/credits.html\" title=\"En savoir plus ?\">est libre</a> et vous offert sans publicité. Vous pouvez <a href=\"/participer-financement.html\" title=\"Financement participatif\">participer à son financement en cliquant ici</a>.",
|
||
|
||
/* Page d'accueil */
|
||
homePageTxt: "Page d'accueil",
|
||
homeTitle1: "De nature curieuse ?",
|
||
homeP1: "<b>Avec WikiLerni, vous allez apprendre chaque jour de nouvelles choses</b>.<br>Vous recevrez de courts articles, lisibles en quelques minutes.<br>Des quizs vous permettront ensuite de tester ce que vous aurez 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: "Sur WikiLerni <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: "Tester WikiLerni gratuitement.",
|
||
|
||
/* 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 */
|
||
quizElementLinksIntro: "Source(s)",
|
||
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 culture générale (arts, histoire, littérature, sciences, etc.).</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 de nouvelles choses très simplement.</b></p><p>L’inscription est gratuite et vous permet de tester le site sans engagement.</p>",
|
||
|
||
/* Autres */
|
||
illustrationDir: "/img/quizs/",
|
||
twitterAccount: "WikiLerni",
|
||
maxQuestionnairesByPage: 12,
|
||
maxQuestionnairesSiteHomePage: 3,
|
||
nbQuestionnairesUserHomePage: 3
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/accountUser.js":
|
||
/*!****************************!*\
|
||
!*** ./src/accountUser.js ***!
|
||
\****************************/
|
||
/*! no exports provided */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__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 _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
|
||
/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
|
||
/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
|
||
/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);
|
||
/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
|
||
/* harmony import */ var _tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/webportage.js */ "./src/tools/webportage.js");
|
||
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
||
|
||
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
||
|
||
// -- GESTION DES FORMULAIRES PERMETTANT AUX UTILISATEURS DE METTRE À JOUR LEURS INFORMATIONS + LEUR ABONNEMENT
|
||
/// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas.
|
||
/// Si c'est ok, on récupère les infos de son compte et son abonnement et les affiche dans le formulaire.
|
||
/// Une information est affichée concernant la possibilité de parrainage et liste les filleuls existants.
|
||
/// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, etc.
|
||
/// Des boutons de paiement sont aussi affichés suivant le choix de l'utilisateur pour lui permettre de prolonger son abonnement.
|
||
/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement.
|
||
// Fichier de configuration côté client :
|
||
|
||
var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
|
||
|
||
var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // besoin de toutes les déclarations pour la fonction : updateAccountLink()
|
||
|
||
|
||
var _require = __webpack_require__(/*! ../../config/instance */ "../config/instance.js"),
|
||
beginCodeGodfather = _require.beginCodeGodfather;
|
||
|
||
var configUsers = __webpack_require__(/*! ../../config/users */ "../config/users.js"); // besoin de tous le fichier pour configurer le formulaire
|
||
// Fonctions utiles au script
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// Spécifique WebPortage pour paiements:
|
||
|
||
// Dictionnaires :
|
||
|
||
var _require2 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"),
|
||
serverError = _require2.serverError;
|
||
|
||
var _require3 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"),
|
||
infosUserNbGodChilds = _require3.infosUserNbGodChilds,
|
||
infosUserNoGodchilds = _require3.infosUserNoGodchilds,
|
||
needBeConnected = _require3.needBeConnected;
|
||
|
||
var _require4 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/subscription$")("./" + lang + "/subscription"),
|
||
infosExpirated = _require4.infosExpirated,
|
||
infosNbDays = _require4.infosNbDays; // Principaux éléments du DOM manipulés :
|
||
|
||
|
||
var divCrash = document.getElementById("crash");
|
||
var divMain = document.getElementById("main-content");
|
||
var divMessage = document.getElementById("message");
|
||
var divResponse = document.getElementById("response");
|
||
var divGodchilds = document.getElementById("godchilds");
|
||
var divSubscribeIntro = document.getElementById("subscribeIntro");
|
||
var formAccount = document.getElementById("accountUpdate");
|
||
var newPassword = document.getElementById("newPassword");
|
||
var showGFEmail = document.getElementById("godfatherEmail");
|
||
var showGFCode = document.getElementById("godfatherCode");
|
||
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
|
||
|
||
var initialise = /*#__PURE__*/function () {
|
||
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
||
var isConnected, user, getInfos, abo9, abo18, abo36, abo54, CGV, divWPBtns, xhrGetGodchilds;
|
||
return regeneratorRuntime.wrap(function _callee$(_context) {
|
||
while (1) {
|
||
switch (_context.prev = _context.next) {
|
||
case 0:
|
||
_context.prev = 0;
|
||
_context.next = 3;
|
||
return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(["user"], "/" + configTemplate.connectionPage, {
|
||
message: needBeConnected,
|
||
color: "error"
|
||
}, window.location);
|
||
|
||
case 3:
|
||
isConnected = _context.sent;
|
||
|
||
if (isConnected) {
|
||
divMain.style.display = "block"; // l'éventuelle ancre est ignorée, car absente du DOM avant d'avoir vérifié la connexion
|
||
|
||
if (window.location.hash !== undefined) window.location.assign(window.location.hash);
|
||
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) {
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false);
|
||
Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
|
||
}
|
||
|
||
user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
|
||
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configTemplate); // Initialise le formulaire permettant de mettre à jour les infos :
|
||
|
||
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configUsers, formAccount); // Certains navigateurs remplissent les champs password :
|
||
|
||
newPassword.value = ""; // Fonction affichant les infos connues au premier affichage, puis après envoi mise à jour
|
||
|
||
getInfos = function getInfos() {
|
||
var xhrGetInfos = new XMLHttpRequest();
|
||
xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.getUserInfos + user.id);
|
||
|
||
xhrGetInfos.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
var response = JSON.parse(this.responseText);
|
||
|
||
if (this.status === 200 && response.User != undefined && response.Subscription != undefined) {
|
||
for (var data in response.User) {
|
||
if (formAccount.elements[data] !== undefined) {
|
||
if (response.User[data] !== true && response.User[data] !== false) // booléen = case à cocher !
|
||
formAccount.elements[data].value = response.User[data];else if (response.User[data] == true) // si false, on ne fait rien
|
||
formAccount.elements["" + data].checked = "checked";
|
||
}
|
||
} // jours de réception
|
||
|
||
|
||
for (var i in response.Subscription.receiptDays) {
|
||
formAccount.elements["d" + response.Subscription.receiptDays[i]].checked = "checked";
|
||
} // "codes" possibles à transmettre pour parrainer d'autres utilisateurs
|
||
|
||
|
||
showGFEmail.innerHTML = response.User.email;
|
||
showGFCode.innerHTML = beginCodeGodfather + response.User.id;
|
||
}
|
||
|
||
var beginSubTS = new Date(response.Subscription.createdAt).getTime();
|
||
var nbDaysOk = response.Subscription.numberOfDays - Math.round((Date.now() - beginSubTS) / 1000 / 3600 / 24);
|
||
if (nbDaysOk > 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", infosNbDays.replace("NB_DAYS", nbDaysOk), "", ["info"]);else {
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", infosExpirated.replace("NB_DAYS", nbDaysOk), "", ["error"]);
|
||
window.location.assign("#subscribe");
|
||
}
|
||
}
|
||
};
|
||
|
||
xhrGetInfos.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
xhrGetInfos.send();
|
||
}; // Remonte les infos déjà enregistrées :
|
||
|
||
|
||
getInfos(); // Traitement de l'envoi d'une mise à jour des infos
|
||
|
||
formAccount.addEventListener("submit", function (e) {
|
||
e.preventDefault();
|
||
divResponse.innerHTML = "";
|
||
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formAccount); // recomposition des jours valables pour l'abonnement :
|
||
|
||
datas.receiptDays = "";
|
||
|
||
for (var i = 1; i <= 7; i++) {
|
||
if (datas["d" + i] !== undefined) datas.receiptDays += "" + i;
|
||
}
|
||
|
||
datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getTimeDifference"])();
|
||
var xhrUserUpdate = new XMLHttpRequest();
|
||
if (datas.deleteOk !== undefined) xhrUserUpdate.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + "/" + user.id);else xhrUserUpdate.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.updateUserInfos + user.id);
|
||
|
||
xhrUserUpdate.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
var response = JSON.parse(this.responseText);
|
||
|
||
if (this.status === 200 && response.message != undefined) {
|
||
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]);
|
||
} else if (response.errors) {
|
||
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
|
||
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", serverError, "", ["error"]); // dans tous les cas, je mets à jour le contenu du formulaire :
|
||
|
||
|
||
getInfos();
|
||
}
|
||
};
|
||
|
||
xhrUserUpdate.setRequestHeader("Content-Type", "application/json");
|
||
xhrUserUpdate.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
|
||
if (datas) {
|
||
datas.output = "html";
|
||
xhrUserUpdate.send(JSON.stringify(datas));
|
||
}
|
||
}); // on passe à la caisse ?
|
||
|
||
abo9 = document.getElementById("abo9");
|
||
abo18 = document.getElementById("abo18");
|
||
abo36 = document.getElementById("abo36");
|
||
abo54 = document.getElementById("abo54");
|
||
CGV = document.getElementById("CGVOk");
|
||
divWPBtns = document.getElementById("WPBtns");
|
||
divWPBtns.style.display = "none";
|
||
abo9.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["unCheckAllOthers"])("abo9");
|
||
});
|
||
abo18.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["unCheckAllOthers"])("abo18");
|
||
});
|
||
abo36.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["unCheckAllOthers"])("abo36");
|
||
});
|
||
abo54.addEventListener("change", function (e) {
|
||
Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["unCheckAllOthers"])("abo54");
|
||
});
|
||
CGV.addEventListener("change", function (e) {
|
||
if (CGV.checked === true) {
|
||
divWPBtns.style.display = "block";
|
||
if (abo9.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["showBtnPayment"])("btn9");else if (abo18.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["showBtnPayment"])("btn18");else if (abo36.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["showBtnPayment"])("btn36");else if (abo54.checked === true) Object(_tools_webportage_js__WEBPACK_IMPORTED_MODULE_7__["showBtnPayment"])("btn54");else {
|
||
divWPBtns.style.display = "none";
|
||
CGV.checked = false;
|
||
}
|
||
} else divWPBtns.style.display = "none";
|
||
}); // Liste des filleuls, si il y en a
|
||
|
||
xhrGetGodchilds = new XMLHttpRequest();
|
||
xhrGetGodchilds.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.getGodChilds);
|
||
|
||
xhrGetGodchilds.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
var response = JSON.parse(this.responseText),
|
||
txtGodchilds = "";
|
||
|
||
if (this.status === 200) {
|
||
var nbGodchilds = response.length;
|
||
if (nbGodchilds === 0) txtGodchilds = infosUserNoGodchilds;else {
|
||
txtGodchilds = infosUserNbGodChilds.replace("#NB", nbGodchilds);
|
||
|
||
for (var i in response) {
|
||
txtGodchilds += response[i].name + " (" + response[i].email + ") ";
|
||
}
|
||
}
|
||
}
|
||
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divGodchilds, "p", txtGodchilds, "", ["info"]);
|
||
}
|
||
};
|
||
|
||
xhrGetGodchilds.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
xhrGetGodchilds.send();
|
||
}
|
||
|
||
_context.next = 11;
|
||
break;
|
||
|
||
case 7:
|
||
_context.prev = 7;
|
||
_context.t0 = _context["catch"](0);
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divCrash, "p", serverError, "", ["error"]);
|
||
console.error(_context.t0);
|
||
|
||
case 11:
|
||
case "end":
|
||
return _context.stop();
|
||
}
|
||
}
|
||
}, _callee, null, [[0, 7]]);
|
||
}));
|
||
|
||
return function initialise() {
|
||
return _ref.apply(this, arguments);
|
||
};
|
||
}();
|
||
|
||
initialise();
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/clientstorage.js":
|
||
/*!************************************!*\
|
||
!*** ./src/tools/clientstorage.js ***!
|
||
\************************************/
|
||
/*! exports provided: saveLocaly, getLocaly, removeLocaly */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
|
||
// 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
|
||
var saveLocaly = function saveLocaly(name, data) {
|
||
localStorage.setItem(name, JSON.stringify(data));
|
||
};
|
||
var getLocaly = function getLocaly(name) {
|
||
var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
||
if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
|
||
};
|
||
var removeLocaly = function removeLocaly(name) {
|
||
localStorage.removeItem(name);
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/dom.js":
|
||
/*!**************************!*\
|
||
!*** ./src/tools/dom.js ***!
|
||
\**************************/
|
||
/*! exports provided: addElement */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
|
||
/* 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__);
|
||
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
|
||
// Fonction associant les attributs fournis à un champ de formulaire
|
||
|
||
var addElement = function addElement(eltParent, eltType) {
|
||
var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
|
||
var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
|
||
var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
|
||
var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
|
||
var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
|
||
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
|
||
var newElement = document.createElement(eltType);
|
||
if (!Object(_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 (var i in eltClass) {
|
||
newElement.classList.add(eltClass[i]);
|
||
}
|
||
}
|
||
|
||
if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
|
||
{
|
||
for (var attributName in eltAttributes) {
|
||
newElement.setAttribute(attributName, eltAttributes[attributName]);
|
||
}
|
||
}
|
||
|
||
if (!Object(_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 ***!
|
||
\*********************************/
|
||
/*! exports provided: helloDev, updateAccountLink */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; });
|
||
// Ce script fournit des fonctions utilisées sur toutes les pages du site
|
||
var helloDev = function helloDev() {
|
||
console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver si Gitlab :\nhttps://gitlab.com/lefablab/wikilerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****");
|
||
return true;
|
||
};
|
||
var updateAccountLink = function updateAccountLink(status, configTemplate) {
|
||
var link = document.getElementById("accountHeadLink");
|
||
var homePage = status + "HomePage";
|
||
link.href = "/" + configTemplate[homePage];
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/forms.js":
|
||
/*!****************************!*\
|
||
!*** ./src/tools/forms.js ***!
|
||
\****************************/
|
||
/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; });
|
||
/* 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__);
|
||
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
||
|
||
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
||
|
||
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
||
|
||
// Fonction associant les attributs fournis à un champ de formulaire
|
||
|
||
var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) {
|
||
for (var i in myForm.elements) {
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) {
|
||
var idInput = myForm.elements[i].id;
|
||
|
||
if (inputsConf[idInput] !== undefined) {
|
||
var inputHTML = document.getElementById(idInput);
|
||
|
||
for (var 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.
|
||
|
||
var getDatasFromInputs = function getDatasFromInputs(myForm) {
|
||
var datas = {};
|
||
var formData = new FormData(myForm);
|
||
|
||
var _iterator = _createForOfIteratorHelper(formData.entries()),
|
||
_step;
|
||
|
||
try {
|
||
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
||
var entrie = _step.value;
|
||
datas[entrie[0]] = entrie[1];
|
||
}
|
||
} catch (err) {
|
||
_iterator.e(err);
|
||
} finally {
|
||
_iterator.f();
|
||
}
|
||
|
||
return datas;
|
||
}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
|
||
// Revoir pour les select
|
||
|
||
var empyForm = function empyForm(myForm) {
|
||
var formData = new FormData(myForm);
|
||
|
||
var _iterator2 = _createForOfIteratorHelper(formData.entries()),
|
||
_step2;
|
||
|
||
try {
|
||
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
||
var entrie = _step2.value;
|
||
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 = "";
|
||
}
|
||
} catch (err) {
|
||
_iterator2.e(err);
|
||
} finally {
|
||
_iterator2.f();
|
||
}
|
||
|
||
return true;
|
||
}; // Vide et cache le formulaire
|
||
|
||
var empyAndHideForm = function empyAndHideForm(myForm) {
|
||
empyForm(myForm);
|
||
myForm.style.display = "none";
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/users.js":
|
||
/*!****************************!*\
|
||
!*** ./src/tools/users.js ***!
|
||
\****************************/
|
||
/*! exports provided: getTimeDifference, setSession, checkAnswerDatas, checkSession */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; });
|
||
/* 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__);
|
||
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
||
|
||
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
||
|
||
|
||
var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
|
||
|
||
var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js");
|
||
|
||
|
||
|
||
|
||
var getTimeDifference = function 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
|
||
var 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.
|
||
|
||
var setSession = function setSession(userId, token, durationTS) {
|
||
var storageUser = {
|
||
id: userId,
|
||
token: token,
|
||
duration: durationTS
|
||
};
|
||
Object(_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
|
||
|
||
var checkAnswerDatas = function checkAnswerDatas(datas) {
|
||
var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer");
|
||
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) {
|
||
var answer = JSON.parse(lastAnswer);
|
||
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions) && (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) || !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.GroupId))) {
|
||
datas.duration = answer.duration;
|
||
datas.nbCorrectAnswers = answer.nbCorrectAnswers;
|
||
datas.nbQuestions = answer.nbQuestions;
|
||
if (!Object(_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é
|
||
|
||
var checkSession = /*#__PURE__*/function () {
|
||
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
||
var status,
|
||
urlRedirection,
|
||
message,
|
||
urlWanted,
|
||
_args = arguments;
|
||
return regeneratorRuntime.wrap(function _callee$(_context) {
|
||
while (1) {
|
||
switch (_context.prev = _context.next) {
|
||
case 0:
|
||
status = _args.length > 0 && _args[0] !== undefined ? _args[0] : [];
|
||
urlRedirection = _args.length > 1 ? _args[1] : undefined;
|
||
message = _args.length > 2 ? _args[2] : undefined;
|
||
urlWanted = _args.length > 3 ? _args[3] : undefined;
|
||
return _context.abrupt("return", new Promise(function (resolve, reject) {
|
||
var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user");
|
||
|
||
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) {
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
} else {
|
||
var user = JSON.parse(userDatas);
|
||
|
||
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) {
|
||
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
} else {
|
||
var 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 = function () {
|
||
var 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
|
||
|
||
Object(_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) {
|
||
var 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 {
|
||
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
}
|
||
} else {
|
||
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
|
||
redirectUser(urlRedirection, message, urlWanted);
|
||
resolve(false);
|
||
}
|
||
};
|
||
|
||
xhr.onerror = function () {
|
||
return reject(xhr.statusText);
|
||
};
|
||
|
||
xhr.send();
|
||
}
|
||
}
|
||
}));
|
||
|
||
case 5:
|
||
case "end":
|
||
return _context.stop();
|
||
}
|
||
}
|
||
}, _callee);
|
||
}));
|
||
|
||
return function checkSession() {
|
||
return _ref.apply(this, arguments);
|
||
};
|
||
}(); // Cette fonction sert à la précédente en cas de connexion non valide
|
||
|
||
var redirectUser = function redirectUser(urlRedirection, message, urlWanted) {
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message);
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted);
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection);
|
||
};
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./src/tools/webportage.js":
|
||
/*!*********************************!*\
|
||
!*** ./src/tools/webportage.js ***!
|
||
\*********************************/
|
||
/*! exports provided: unCheckAllOthers, showBtnPayment */
|
||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||
|
||
"use strict";
|
||
__webpack_require__.r(__webpack_exports__);
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unCheckAllOthers", function() { return unCheckAllOthers; });
|
||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showBtnPayment", function() { return showBtnPayment; });
|
||
var checkBoxes = {
|
||
"CGV": document.getElementById("CGVOk"),
|
||
"abo9": document.getElementById("abo9"),
|
||
"abo18": document.getElementById("abo18"),
|
||
"abo36": document.getElementById("abo36"),
|
||
"abo54": document.getElementById("abo54")
|
||
};
|
||
var divWPBtns = document.getElementById("WPBtns"); // Lorsque l'on sélectionne un montant, les autres options + les CGV sont désélectionnés
|
||
|
||
var unCheckAllOthers = function unCheckAllOthers(choice) {
|
||
for (var id in checkBoxes) {
|
||
if (id !== choice) checkBoxes[id].checked = false;
|
||
divWPBtns.style.display = "none";
|
||
}
|
||
};
|
||
var btns = {
|
||
"btn9": document.getElementById("WPBtn9"),
|
||
"btn18": document.getElementById("WPBtn18"),
|
||
"btn36": document.getElementById("WPBtn36"),
|
||
"btn54": document.getElementById("WPBtn54")
|
||
}; // Affiche le bon bouton de paiement et cache les autres
|
||
|
||
var showBtnPayment = function showBtnPayment(choice) {
|
||
for (var id in btns) {
|
||
if (id !== choice) btns[id].style.display = "none";else btns[id].style.display = "block";
|
||
}
|
||
};
|
||
|
||
/***/ })
|
||
|
||
/******/ });
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3N1YnNjcmlwdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC91c2VyJCIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci91c2VyLmpzIiwid2VicGFjazovLy8uLi90b29scy9tYWluLmpzIiwid2VicGFjazovLy8uLi92aWV3cyBzeW5jIF5cXC5cXC8uKlxcLmpzJCIsIndlYnBhY2s6Ly8vLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL3dpa2lsZXJuaS9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FjY291bnRVc2VyLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Zvcm1zLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvd2VicG9ydGFnZS5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImRlZmF1bHRSZWNlaXB0RGF5cyIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm1heFF1ZXN0aW9ubmFpcmVTZW5kZWRBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJmaWVsZE5ld1F1ZXN0aW9ubmFpcmVzIiwibmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNaW4iLCJuYlF1ZXN0aW9ubmFpcmVzQnlHcm91cE1heCIsIm5iSWxsdXN0cmF0aW9uc01pbiIsIm5iSWxsdXN0cmF0aW9uc01heCIsIm1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0IiwibWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uIiwiaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeCIsImlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4IiwibmJMaW5rc01pbiIsIm5iTGlua3NNYXgiLCJwYXNzd29yZCIsIm1pbmxlbmd0aCIsImRpckNhY2hlVXNlcnMiLCJkaXJDYWNoZVVzZXJzQW5zd2VycyIsImRpckNhY2hlUXVlc3Rpb25uYWlyZXMiLCJkaXJDYWNoZVF1ZXN0aW9ucyIsImRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyIsImRpckhUTUxRdWVzdGlvbm5haXJlcyIsImRpcldlYlF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJyZWdlbmVyYXRlSFRNTCIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJncm91cFJvdXRlcyIsImdldEdyb3VwUm91dGUiLCJwcmV2aWV3R3JvdXBSb3V0ZXMiLCJzZWFyY2hHcm91cHNSb3V0ZSIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0QWRtaW5TdGF0cyIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsInNhdmVBbnN3ZXJzUm91dGUiLCJRdWVzdGlvbm5haXJlIiwidGl0bGUiLCJtYXhsZW5ndGgiLCJyZXF1aXJlZCIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIkdyb3VwIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsInNlYXJjaCIsInNlYXJjaEdyb3VwcyIsImRpckNhY2hlR3JvdXBzIiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTEdyb3VwcyIsImRpckhUTUxOZXdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJHcm91cHMiLCJkaXJXZWJOZXdzIiwiZGlyV2ViVGFncyIsIm5iUmFuZG9tUmVzdWx0cyIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsInVzZXJSb3V0ZXMiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiY3JlYXRlVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwiZ2V0VXNlckluZm9zIiwiZ2V0VXNlcnNRdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoVXNlclJvdXRlIiwic2lnbnVwQ29tcGxldGlvblJvdXRlIiwic3Vic2NyaWJlUm91dGUiLCJ1bnN1YnNjcmliZVJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwidmFsaWRhdGVVc2VyUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsImRpckNhY2hlVXNlcnNXaXRob3V0QW5zd2VycyIsImFkZEJ0blR4dCIsImFkZE9rTWVzc2FnZSIsImFsZXJ0TmV3V2luZG93IiwiYmFkVXJsIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsImJ0blByb3Bvc2VDb25uZWN0aW9uIiwiYnRuUHJvcG9zZVN1YnNjcmliZSIsImJ0blNob3dPbldlYlNpdGUiLCJkZWxldGVCdG5UeHQiLCJkZWxldGVGYWlsTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhDcm9uIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhUb2tlbiIsIm5lZWRlZFBhcmFtcyIsIm5leHRQYWdlIiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwibm90VmFsaWRGb3JtYXQiLCJwcmV2aW91c1BhZ2UiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0FsZXJ0Iiwic2NyaXB0VGltaW5nSW5mbyIsInN0YXRzQWRtaW4iLCJzdWJzY3JpcHRpb25DYWxsIiwidXBkYXRlQnRuVHh0IiwidXBkYXRlT2tNZXNzYWdlIiwiYWxsU3Vic2NyaXB0aW9uUHJvY2Vzc2VkIiwiaW5mb3NFeHBpcmF0ZWQiLCJpbmZvc0V4cGlyYXRlZEFkbWluIiwiaW5mb3NOYkRheXMiLCJpbmZvc05iRGF5c0FkbWluIiwiaW5mb3NQYXltZW50c0FkbWluIiwiaXNOb3RWYWxpZGVkIiwibWFpbEVuZEZyZWVUaW1lQm9keUhUTUwiLCJtYWlsRW5kRnJlZVRpbWVCb2R5VHh0IiwibWFpbEVuZEZyZWVUaW1lTGlua1R4dCIsIm1haWxFbmRGcmVlVGltZU1lc3NhZ2UiLCJtYWlsRW5kRnJlZVRpbWVTdWJqZWN0IiwibWFpbEV4cGlyYXRpb25Cb2R5SFRNTCIsIm1haWxFeHBpcmF0aW9uQm9keVR4dCIsIm1haWxFeHBpcmF0aW9uTGlua1R4dCIsIm1haWxFeHBpcmF0aW9uTWVzc2FnZSIsIm1haWxFeHBpcmF0aW9uUmVsYXVuY2hUeHQiLCJtYWlsRXhwaXJhdGlvblN1YmplY3QiLCJtYWlsTmV3RWxlbWVudEZvckdyb3VwVHh0IiwibWFpbE5ld1F1ZXN0aW9ubmFpcmVCb2R5VHh0IiwibWFpbFN0b3BNYWlsTGlua1R4dCIsIm5lZWRLbm93SWZOb3RpY2VPayIsIm5lZWRJbnRlZ2VyTnVtYmVyT2ZEYXlzIiwibmVlZE1pbk51bWJlck9mRGF5cyIsIm5lZWROb3RUb29Mb25nRGF5c0xpc3QiLCJuZWVkTnVtYmVyT2ZEYXlzIiwibmVlZFVuaXF1ZURheXNMaXN0IiwibmVlZFZhbGlkRGF5c0xpc3QiLCJub05ld1F1ZXN0aW9ubmFpcmVGb3JVc2VyIiwidW5zdWJzY3JpcHRpb25PayIsInVuc3Vic2NyaXB0aW9uRmFpbCIsImFscmVhZHlDb25uZWN0ZWQiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJiYWRQYXNzd29yZCIsImJ5ZWJ5ZU1lc3NhZ2UiLCJjb25uZWN0aW9uT2siLCJjcmVhdGlvbk9rTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJmb3Jtc0VtYWlsTGFiZWwiLCJmb3Jtc0VtYWlsUGxhY2Vob2xkZXIiLCJmb3Jtc0NHVU9rTGFiZWwiLCJmb3Jtc1N1Ym1pdFR4dCIsImdvZGZhdGhlckZvdW5kIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc1VzZXJOYkdvZENoaWxkcyIsImluZm9zVXNlck5vR29kY2hpbGRzIiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtUeHQiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwibWFpbFVwZGF0ZUxvZ2luTGlua1R4dCIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtUeHQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVMaW5rVHh0IiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibmVlZEJlQ29ubmVjdGVkIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZEVtYWlsIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZFN0YXR1cyIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsInBhc3N3b3JkQ29waWVkIiwic2VhcmNoVXNlcnNXaXRob3V0UmVzdWx0IiwidG9vTWFueUxvZ2luRmFpbHMiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ3ZWxjb21lTWVzc2FnZSIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsImkiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJ0YWdzTGlzdFR4dCIsImFib3V0UGFnZSIsImNndVBhZ2UiLCJkZWxldGVMaW5rUGFnZSIsImxvZ2luTGlua1BhZ2UiLCJuZXdMb2dpbkxpbmtQYWdlIiwic3RvcE1haWxQYWdlIiwidXBkYXRlQWNjb3VudFBhZ2UiLCJ1c2VySG9tZVBhZ2VUeHQiLCJ2YWxpZGF0aW9uTGlua1BhZ2UiLCJtYWlsUmVjaXBpZW50VHh0IiwibGljZW5jZVR4dCIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsIm5ld3NMaXN0VGl0bGUiLCJ0YWdMaXN0VGl0bGUiLCJ0YWdMaXN0TWV0YURlc2MiLCJ0YWdMaXN0SW50cm8iLCJxdWl6RWxlbWVudExpbmtzSW50cm8iLCJxdWl6RWxlbWVudFN1YmNyaXB0aW9uRm9ybVRpdGxlIiwiZXhwbGFuYXRpb25FbGVtZW50VHh0IiwidHdpdHRlckFjY291bnQiLCJtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZSIsImNvbmZpZ1RlbXBsYXRlIiwiY29uZmlnVXNlcnMiLCJkaXZDcmFzaCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZNYWluIiwiZGl2TWVzc2FnZSIsImRpdlJlc3BvbnNlIiwiZGl2R29kY2hpbGRzIiwiZGl2U3Vic2NyaWJlSW50cm8iLCJmb3JtQWNjb3VudCIsInNob3dHRkVtYWlsIiwic2hvd0dGQ29kZSIsImhlbGxvRGV2IiwiaW5pdGlhbGlzZSIsImNoZWNrU2Vzc2lvbiIsIm1lc3NhZ2UiLCJjb2xvciIsIndpbmRvdyIsImxvY2F0aW9uIiwiaXNDb25uZWN0ZWQiLCJzdHlsZSIsImRpc3BsYXkiLCJoYXNoIiwiYXNzaWduIiwiZ2V0TG9jYWx5IiwiYWRkRWxlbWVudCIsInJlbW92ZUxvY2FseSIsInVzZXIiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImdldEluZm9zIiwieGhyR2V0SW5mb3MiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiVXNlciIsIlN1YnNjcmlwdGlvbiIsImRhdGEiLCJlbGVtZW50cyIsImNoZWNrZWQiLCJyZWNlaXB0RGF5cyIsImlubmVySFRNTCIsImJlZ2luU3ViVFMiLCJjcmVhdGVkQXQiLCJnZXRUaW1lIiwibmJEYXlzT2siLCJudW1iZXJPZkRheXMiLCJyb3VuZCIsIm5vdyIsInNldFJlcXVlc3RIZWFkZXIiLCJ0b2tlbiIsInNlbmQiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsInByZXZlbnREZWZhdWx0IiwiZGF0YXMiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJ0aW1lRGlmZmVyZW5jZSIsImdldFRpbWVEaWZmZXJlbmNlIiwieGhyVXNlclVwZGF0ZSIsImRlbGV0ZU9rIiwiQXJyYXkiLCJpc0FycmF5IiwiZXJyb3JzIiwib3V0cHV0Iiwic3RyaW5naWZ5IiwiYWJvOSIsImFibzE4IiwiYWJvMzYiLCJhYm81NCIsIkNHViIsImRpdldQQnRucyIsInVuQ2hlY2tBbGxPdGhlcnMiLCJzaG93QnRuUGF5bWVudCIsInhockdldEdvZGNoaWxkcyIsInR4dEdvZGNoaWxkcyIsIm5iR29kY2hpbGRzIiwiY29uc29sZSIsImVycm9yIiwic2F2ZUxvY2FseSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsImxvZyIsImxpbmsiLCJob21lUGFnZSIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJpZElucHV0IiwiaW5wdXRIVE1MIiwiYXR0cmlidXRlIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImVudHJpZXMiLCJlbnRyaWUiLCJlbXB5Rm9ybSIsInR5cGUiLCJlbXB5QW5kSGlkZUZvcm0iLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIm5iUXVlc3Rpb25zIiwiUXVlc3Rpb25uYWlyZUlkIiwiR3JvdXBJZCIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJ4aHIiLCJvbmxvYWQiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ1cmxBY2NvdW50IiwiaW5kZXhPZiIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwiY2hlY2tCb3hlcyIsImNob2ljZSIsImJ0bnMiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtR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LGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUIsQ0FBQ3VFLE1BQUQsRUFDaEM7QUFDSSxPQUFLLElBQUl2TSxFQUFULElBQWVzTSxVQUFmLEVBQ0E7QUFDSSxRQUFHdE0sRUFBRSxLQUFHdU0sTUFBUixFQUNJRCxVQUFVLENBQUN0TSxFQUFELENBQVYsQ0FBZStGLE9BQWYsR0FBdUIsS0FBdkI7QUFDSmdDLGFBQVMsQ0FBQzFELEtBQVYsQ0FBZ0JDLE9BQWhCLEdBQXdCLE1BQXhCO0FBQ0g7QUFDSixDQVJNO0FBV1AsSUFBTWtJLElBQUksR0FDVjtBQUNJLFVBQVNySixRQUFRLENBQUNDLGNBQVQsQ0FBd0IsUUFBeEIsQ0FEYjtBQUVJLFdBQVVELFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixTQUF4QixDQUZkO0FBR0ksV0FBVUQsUUFBUSxDQUFDQyxjQUFULENBQXdCLFNBQXhCLENBSGQ7QUFJSSxXQUFVRCxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsU0FBeEI7QUFKZCxDQURBLEMsQ0FRQTs7QUFDTyxJQUFNNkUsY0FBYyxHQUFHLFNBQWpCQSxjQUFpQixDQUFDc0UsTUFBRCxFQUM5QjtBQUNJLE9BQUssSUFBSXZNLEVBQVQsSUFBZXdNLElBQWYsRUFDQTtBQUNJLFFBQUd4TSxFQUFFLEtBQUd1TSxNQUFSLEVBQ0lDLElBQUksQ0FBQ3hNLEVBQUQsQ0FBSixDQUFTcUUsS0FBVCxDQUFlQyxPQUFmLEdBQXVCLE1BQXZCLENBREosS0FHSWtJLElBQUksQ0FBQ3hNLEVBQUQsQ0FBSixDQUFTcUUsS0FBVCxDQUFlQyxPQUFmLEdBQXVCLE9BQXZCO0FBQ1A7QUFDSixDQVRNLEMiLCJmaWxlIjoiLi9KUy9hY2NvdW50VXNlci5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9hY2NvdW50VXNlci5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJ3aWtpbGVybmlcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaSAobG9jYWwpXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIldMXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBkZWZhdWx0UmVjZWlwdERheXM6IFwiMTQ3XCIsIC8vIFBhciBkw6lmYXV0LCBxdWVsKHMpIGpvdXIocykgZGUgbGEgc2VtYWluZSwgbCd1dGlsaXNhdGV1ciByZcOnb2l0LWlsIHF1ZWxxdWUgY2hvc2UgPyAoMT1kaW1hbmNoZSwgMj1sdW5kaS4uLiA3PXNhbWVkaSlcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDE1LFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogMyxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxMCxcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogMyxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAyLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEyLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjo3LCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjEsIC8vIGlkZW1cbiAgICBtYXhRdWVzdGlvbm5haXJlU2VuZGVkQXRTYW1lVGltZTogNTAsIC8vIGZvciBzdWJzY3JpcHRpb24ncyBlLW1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICBmaWVsZE5ld1F1ZXN0aW9ubmFpcmVzIDogXCJwdWJsaXNoaW5nQXRcIiwgLy8gZmllbGQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGxpc3Qgb2YgdGhlIGxhc3QgcXVlc3Rpb25uYWlyZXMsIGNhbiBiZSBcImNyZWF0ZWRBdFwiLCBcInVwZGF0ZWRBdFwiIG9yIFwicHVibGlzaGluZ0F0XCJcbiAgICAvLyBHcm91cHMgOlxuICAgIG5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWluOiAyLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWF4OiAwLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAxLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDUwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyBRdWVzdGlvbnMgJiByZXNwb25zZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlc1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsLy8gbGEgYmFzZSDDoCBsYXF1ZWxsZSBzJ2Fqb3V0ZSBsZXMgcm91dGVzIHN1aXZhbnRlc1xuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL2dldHJhbmRvbVwiLCBcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHJlZ2VuZXJhdGVIVE1MOiBcIi9odG1scmVnZW5lcmF0ZWRcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICAvLyAtLSBncm91cGVzIDpcbiAgICBncm91cFJvdXRlczogXCIvZ3JvdXBcIixcbiAgICBnZXRHcm91cFJvdXRlOiBcIi9nZXQvXCIsXG4gICAgcHJldmlld0dyb3VwUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgc2VhcmNoR3JvdXBzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICAvLyAtLSBxdWVzdGlvbnMgJiBjaG9pY2VzIDpcbiAgICBxdWVzdGlvbnNSb3V0ZTogXCIvcXVlc3Rpb24vXCIsXG4gICAgLy8gLS0gdGFncyA6XG4gICAgdGFnc1NlYXJjaFJvdXRlOiBcIi90YWdzL3NlYXJjaC9cIixcbiAgICAvLyAtLSBhbnN3ZXJzIDpcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsLy8gZm9uY3Rpb25uZSBhdXNzaSBwb3VyIGxlcyBncm91cGVzXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLC8vIGlkZW1cbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCBsYWlzc8OpIHZpZGUgZGFucyBsZSBmb3JtdWxhaXJlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIEdyb3VwIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCBsYWlzc8OpIHZpZGUgZGFucyBsZSBmb3JtdWxhaXJlXG4gICAgfSxcbiAgICBRdWVzdGlvbiA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICByYW5rOiB7IHJlcXVpcmVkOiB0cnVlLCBtaW46MSwgZGVmYXVsdFZhbHVlOjEgfVxuICAgIH0sICAgICAgICAgIFxuICAgIENob2ljZSA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2g6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNlYXJjaEdyb3VwczogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgLy8gRW1wbGFjZW1lbnQgZGVzIGZpY2hpZXJzIEpTT04gZ8OpbsOpcsOpcyA6XG4gICAgZGlyQ2FjaGVHcm91cHMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL2dyb3Vwc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICAvLyBFbXBsYWNlbWVudCBkZXMgZmljaGllcnMgSFRNTCBnw6luw6lyw6lzIDpcbiAgICBkaXJIVE1MR3JvdXBzIDogXCJmcm9udC9wdWJsaWMvcXVpei9ncFwiLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlcyA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MTmV3cyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIC8vIElkZW0gbWFpcyBwb3VyIHVybHMgOlxuICAgIGRpcldlYkdyb3VwcyA6IFwicXVpei9ncFwiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmVzIDogXCJxdWl6XCIsXG4gICAgZGlyV2ViTmV3cyA6IFwicXVpenMvXCIsXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenMvXCIsXG4gICAgLy8gbGltaXRlIGRlcyByw6lzdWx0YXQgZHUgbW90ZXVyIGRlIHJlY2hlcmNoZSwgcXVhbmQgZGVtYW5kZSBkZSByw6lzdWx0YXRzIGF1IGhhc2FyZCA6XG4gICAgbmJSYW5kb21SZXN1bHRzIDogMyxcbiAgICAvKiBWYWxldXJzIGVuIGZhaXQgZMOpZmluaWVzIGRhbnMgaW5zdGFuY2UuanMgZG9uYyDDoCBzdXBwcmltZXIgcXVhbmQgcGx1cyB1dGlsaXPDqWVzIGFpbGxldXJzIDogKi9cbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIiwgICBcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLCAgICBcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBnZXRVc2Vyc1F1ZXN0aW9ubmFpcmVzUm91dGU6IFwiL2dldHVzZXJzcXVlc3Rpb25uYWlyZXMvXCIsLy8gbGVzIHF1ZXN0aW9ubmFpcmVzIGF1eHF1ZWxzIGwndXRpbGlzYXRldXIgYSBkw6lqw6AgZXUgYWNjw6hzIHZpYSBzb24gYWJvbm5lbWVudCAgICBcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBzaWdudXBDb21wbGV0aW9uUm91dGU6IFwiL3NpZ251cGNvbXBsZXRpb24vXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNlYXJjaDogeyBtaW5sZW5ndGg6IDEsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6IDg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzV2l0aG91dEFuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL3dpdGhvdXRcIlxufTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvc3Vic2NyaXB0aW9uXCI6IFwiLi4vbGFuZy9mci9zdWJzY3JpcHRpb24uanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9zdWJzY3JpcHRpb24kXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3VzZXJcIjogXCIuLi9sYW5nL2ZyL3VzZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC91c2VyJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhZGRCdG5UeHQ6IFwiQWpvdXRlclwiLFxuICAgIGFkZE9rTWVzc2FnZSA6IFwiTGVzIGRvbm7DqWVzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCIsXG4gICAgYWxlcnROZXdXaW5kb3c6IFwibm91dmVsbGUgZmVuw6p0cmVcIixcbiAgICBiYWRVcmwgOiBcIlRlbnRhdGl2ZSBkJ2FjY8OocyDDoCB1bmUgcGFnZSBuJ2V4aXN0YW50IHBhcyA6XCIsXG4gICAgYnRuTGlua1RvUXVlc3Rpb25uYWlyZSA6IFwiQWZmaWNoZXIgIVwiLFxuICAgIGJ0blByb3Bvc2VDb25uZWN0aW9uOiBcIkplIG1lIGNvbm5lY3RlLlwiLFxuICAgIGJ0blByb3Bvc2VTdWJzY3JpYmU6IFwiSmUgY3LDqWUgbW9uIGNvbXB0ZS5cIixcbiAgICBidG5TaG93T25XZWJTaXRlOiBcIlZvaXIgc3VyICNTSVRFX05BTUUuXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBkZSBsJ2VucmVnaXN0cmVtZW50ICNJRCBhIMOpY2hvdcOpLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIG5leHRQYWdlIDogXCJQYWdlIHN1aXZhbnRlXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgc2VydmVyRXJyb3IgOiBcIkTDqXNvbMOpLiBVbmUgZXJyZXVyIGltcHLDqXZ1ZSBlc3Qgc3VydmVudWUuIFNpIGNlbGEgcGVyc2lzdGUsIG4naMOpc2l0ZXogw6AgcHLDqXZlbmlyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBzZXJ2ZXJFcnJvckFkbWluIDogXCJCdWcgZGUgbCdhcHBsaWNhdGlvbiA6XCIsXG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogbGEgY3VsdHVyZSBnw6luw6lyYWxlIGVuIGxpYmVydMOpXCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQXZlYyBXaWtpTGVybmksIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgZGUgbm91dmVsbGVzIGNob3Nlcy4gVm91cyByZWNldmV6IGRlIGNvdXJ0cyBhcnRpY2xlcyBsaXNpYmxlcyBlbiBxdWVscXVlcyBtaW51dGVzLiBEZXMgcXVpenMgdm91cyBwZXJtZXR0ZW50IGVuc3VpdGUgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGF2ZXogcmV0ZW51LlwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0luZm8gOiBcIkR1csOpZSBkZSBsYSByw6lwb25zZSA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc3RhdHNBZG1pbiA6IFwiRHVyYW50IGxlcyBkZXJuacOocmVzIDI0aCA6IE5CX1VTRVJTXzI0SCBjb21wdGVzIG9udCDDqXTDqSBjcsOpw6lzLCBOQl9TVUJTQ1JJUFRJT05TXzI0SCB2YWxpZMOpcyBldCBOQl9VU0VSU19ERUxFVEVEXzI0SCBzdXBwcmltw6lzLiBOQl9BTlNXRVJTXzI0SCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5FbiB0b3V0LCBpbCB5IGEgOiBOQl9VU0VSU19UT1QgY29tcHRlcywgZG9udCBOQl9TVUJTQ1JJUFRJT05TX1RPVCB2YWxpZMOpcyBldCBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gY29tcHRlcyBwcsOpbWl1bS4gTkJfQU5TV0VSU19UT1QgcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+UGFybWkgbGVzIE5CX1VTRVJTX0RFTEVURURfVE9UIGNvbXB0ZXMgc3VwcHJpbcOpcywgTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIGF2YWllbnQgdmFsaWTDqSBsZXVyIGNvbXB0ZSBldCBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gYXZhaWVudCBzb3VzY3JpdCB1biBjb21wdGUgcHLDqW1pdW0uXCIsXG4gICAgc3Vic2NyaXB0aW9uQ2FsbDogXCJJbnNjcml2ZXotdm91cyAhXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlIDogXCJMYSBtaXNlIMOgIGpvdXIgw6Agam91ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhbGxTdWJzY3JpcHRpb25Qcm9jZXNzZWQgOiBcIlRvdXMgbGVzIGFib25uw6lzIG9udCDDqXTDqSB0cmFpdMOpcyBwb3VyIGxlIG1vbWVudC5cIixcbiAgICBpbmZvc0V4cGlyYXRlZDogXCJWb3RyZSBhYm9ubmVtZW50IGEgZXhwaXLDqSwgbWFpcyBpbCB2b3VzIHJlc3RlIGVuY29yZSBxdWVscXVlcyBqb3VycyBhdmFudCBxdWUgdm90cmUgY29tcHRlIGV0IHZvcyBkb25uw6llcyBuZSBzb2llbnQgY29tcGzDqHRlbWVudCBzdXBwcmltw6llcy48YnI+UG91ciBjZSBmYWlyZSwgc3VpdmV6IHNhbnMgdGFyZGVyIGxlcyBpbmRpY2F0aW9ucyBjaS1kZXNzb3VzIDpcIixcbiAgICBpbmZvc0V4cGlyYXRlZEFkbWluOiBcIkNldCBhYm9ubmVtZW50IGEgZXhwaXLDqS5cIixcbiAgICBpbmZvc05iRGF5czogXCJWb3RyZSBhYm9ubmVtZW50IGVzdCBlbmNvcmUgdmFsYWJsZSA8Yj5wZW5kYW50IE5CX0RBWVMgam91cnM8L2I+Ljxicj5Wb3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCBwcm9sb25nZXIgdm90cmUgYWJvbm5lbWVudCBlbiBzdWl2YW50IGxlcyBpbmRpY2F0aW9ucyBjaS1kZXNzb3VzIDpcIixcbiAgICBpbmZvc05iRGF5c0FkbWluOiBcIkNldCBhYm9ubmVtZW50IGVzdCBlbmNvcmUgdmFsYWJsZSA8Yj5wZW5kYW50IE5CX0RBWVMgam91cnM8L2I+LlwiLFxuICAgIGluZm9zUGF5bWVudHNBZG1pbiA6IFwiREFURV9QQVlNRU5UIDogcGFpZW1lbnQgZGUgQU1PVU5UIOKCrCBhdSBub20gZGUgQ0xJRU5UX05BTUUuXCIsXG4gICAgaXNOb3RWYWxpZGVkIDogXCJDZXQgdXRpbGlzYXRldXIgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLjxicj5Wb3VzIHBvdXZleiBsZSBmYWlyZSDDoCBzYSBwbGFjZSA8YSBocmVmPScjdmFsaWRhdGlvbk9rJz5lbiBjb2NoYW50IGxhIGNhc2UgaW5kaXF1w6llPC9hPiBldCBlbnJlZ2lzdHJhbnQuXCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lQm9keUhUTUw6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm90cmUgYWJvbm5lbWVudCBncmF0dWl0IMOgIFNJVEVfTkFNRSB2YSBleHBpcmVyIGQnaWNpIHF1ZWxxdWVzIGpvdXJzLjxicj48YnI+UG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogc291c2NyaXJlIMOgIHVuIGFib25uZW1lbnQgc2FucyB0YXJkZXIgZW4gY2xpcXVhbnQgc3VyIGxlIGxpZW4gY2ktZGVzc291cy48L3A+XCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lQm9keVR4dDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Wb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuXFxuXFxuUG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogc2FucyBhdHRlbmRyZSBzb3VzY3JpcmUgw6AgdW4gYWJvbm5lbWVudCA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRW5kRnJlZVRpbWVMaW5rVHh0IDogXCJNJ2Fib25uZXIuXCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lTWVzc2FnZTogXCIgcmVsYW5jZXMgZW52b3nDqWVzLlwiLFxuICAgIG1haWxFbmRGcmVlVGltZVN1YmplY3Q6IFwiVm90cmUgYWJvbm5lbWVudCBncmF0dWl0IHZhIGV4cGlyZXJcIixcbiAgICBtYWlsRXhwaXJhdGlvbkJvZHlIVE1MOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIGFib25uZW1lbnQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuPGJyPjxicj5Qb3VyIGNvbnRpbnVlciDDoCB1dGlsaXNlciBTSVRFX05BTUUsIHZvdXMgcG91dmV6IGxlIHByb2xvbmdlciBkw6hzIGF1am91cmQnaHVpIGVuIGNsaXF1YW50IHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMuPC9wPlwiLFxuICAgIG1haWxFeHBpcmF0aW9uQm9keVR4dDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Wb3RyZSBhYm9ubmVtZW50IMOgIFNJVEVfTkFNRSB2YSBleHBpcmVyIGQnaWNpIHF1ZWxxdWVzIGpvdXJzLlxcblxcblBvdXIgY29udGludWVyIMOgIHV0aWxpc2VyIFNJVEVfTkFNRSwgdm91cyBwb3V2ZXogbGUgcHJvbG9uZ2VyIGTDqHMgYXVqb3VyZCdodWkgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbEV4cGlyYXRpb25MaW5rVHh0IDogXCJQcm9sb25nZXIgbW9uIGFib25uZW1lbnQuXCIsXG4gICAgbWFpbEV4cGlyYXRpb25NZXNzYWdlOiBcIkZJUlNUIHByZW1pw6hyZXMgZXQgU0VDT05EIGRldXhpw6htZXMgcmVsYW5jZXMgZW52b3nDqWVzIHBvdXIgZGVzIGFib25uZW1lbnRzIGV4cGlyYW50IGQnaWNpIHBldS5cIixcbiAgICBtYWlsRXhwaXJhdGlvblJlbGF1bmNoVHh0OiBcIltSYXBwZWxdIFwiLFxuICAgIG1haWxFeHBpcmF0aW9uU3ViamVjdDogXCJWb3RyZSBhYm9ubmVtZW50IHZhIGJpZW50w7R0IGV4cGlyZXJcIixcbiAgICBtYWlsTmV3RWxlbWVudEZvckdyb3VwVHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Wb2ljaSBsZSBsaWVuIHZlcnMgbGUgbm91dmVsIGFydGljbGUgw6AgbGlyZSA6XFxuXFxuUVVFU1RJT05OQUlSRV9VUkxcXG5cXG5Cb25uZSBsZWN0dXJlICFcXG5cXG5TdG9wcGVyIGxlcyBlbnZvaXMgP1xcblVOU1VCU0NSSUJFX1VSTFwiLFxuICAgIG1haWxOZXdRdWVzdGlvbm5haXJlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuVm9pY2kgbGUgbGllbiB2ZXJzIGxlIG5vdXZlYXUgcXVpeiA6XFxuXFxuUVVFU1RJT05OQUlSRV9VUkxcXG5cXG5Cb25uZSBsZWN0dXJlICFcXG5cXG5TdG9wcGVyIGxlcyBlbnZvaXMgP1xcblVOU1VCU0NSSUJFX1VSTFwiLFxuICAgIG1haWxTdG9wTWFpbExpbmtUeHQgOiBcIlN0b3BwZXIgbGVzIGVudm9pcy5cIixcbiAgICBuZWVkS25vd0lmTm90aWNlT2sgOiBcIklsIG1hbnF1ZSBsJ2luZm9ybWF0aW9uIHN1ciBsJ2FjY2VwdGF0aW9uIG91IG5vbiBkZSByZWNldm9pciBkZXMgbm90aWZpY2F0aW9ucy5cIixcbiAgICBuZWVkSW50ZWdlck51bWJlck9mRGF5cyA6IFwiTGUgbm9tYnJlIGRlIGpvdXJzIGRlIGwnYWJvbm5lbWVudCBkb2l0IMOqdHJlIHVuIG5vbWJyZSBlbnRpZXIuXCIsXG4gICAgbmVlZE1pbk51bWJlck9mRGF5cyA6IFwiTGUgbm9tYnJlIGRlIGpvdXJzIGRlIGwnYWJvbm5lbWVudCBuZSBwZXV0IMOqdHJlIG7DqWdhdGlmICFcIixcbiAgICBuZWVkTm90VG9vTG9uZ0RheXNMaXN0IDogXCJMYSBsaXN0ZSBkZSBqb3VycyBzw6lsZWN0aW9ubsOpcyBuJ2EgcGFzIGxlIGJvbiBmb3JtYXQgKHRyb3AgbG9uZ3VlKS5cIixcbiAgICBuZWVkTnVtYmVyT2ZEYXlzIDogXCJJbCBmYXV0IHVuIG5vbWJyZSBkZSBqb3VycyBwb3VyIGwnYWJvbm5lbWVudC5cIixcbiAgICBuZWVkVW5pcXVlRGF5c0xpc3QgOiBcIkxhIGxpc3RlIGRlIGpvdXJzIHPDqWxlY3Rpb25uw6lzIG4nYSBwYXMgbGUgYm9uIGZvcm1hdC4gRG91YmxvbiA6IFwiLFxuICAgIG5lZWRWYWxpZERheXNMaXN0IDogXCJMYSBsaXN0ZSBkZSBqb3VycyBzw6lsZWN0aW9ubsOpcyBuJ2EgcGFzIGxlIGJvbiBmb3JtYXQuIENhcmFjdMOocmUgbm9uIHZhbGlkZSA6IFwiLFxuICAgIG5vTmV3UXVlc3Rpb25uYWlyZUZvclVzZXIgOiBcIkF1Y3VuIG5vdXZlYXUgcXVlc3Rpb25uYWlyZSB0cm91dsOpIHBvdXIgdW4gYWJvbm7DqSA6IFwiLFxuICAgIHVuc3Vic2NyaXB0aW9uT2sgOiBcIlZvdHJlIGRlbWFuZGUgYSBiaWVuIMOpdMOpIHByaXNlIGVuIGNvbXB0ZS4gVm91cyBuZSByZWNldnJleiBwbHVzIGRlIG1lc3NhZ2VzIHZlbmFudCBkdSBzaXRlLCBzYXVmIHBvdXIgdm91cyBzaWduYWxlciBsYSBmaW4gZGUgdm90cmUgYWJvbm5lbWVudC48YnI+Tidow6lzaXRleiBwYXMgPGEgaHJlZj0nLyNVUkwnPsOgIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZTwvYT4gcG91ciBkZSBub3V2ZWF1IGF1dG9yaXNlciBjZXJ0YWlucyBlbnZvaXMuXCIsXG4gICAgdW5zdWJzY3JpcHRpb25GYWlsIDogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBsaWVuIGRlIGTDqXNhYm9ubmVtZW50IG5lIGZvbmN0aW9ubmUgcGFzLjxicj5Wb3VzIHBvdXZleiA8YSBocmVmPScvI1VSTCc+YWNjw6lkZXIgw6Agdm90cmUgY29tcHRlPC9hPiBwb3VyIGTDqXNhY3RpdmVyIGxlcyBlbnZvaXMgbWFudWVsbGVtZW50LlwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFscmVhZHlDb25uZWN0ZWQ6IFwiVm91cyDDqnRlcyBkw6lqw6AgY29ubmVjdMOpIGF1IHNpdGUgIVwiLFxuICAgIGJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBuZSBzZW1ibGUgcGFzIHZhbGlkZSBvdSBiaWVuIGlsIGEgZXhwaXLDqS4gVm91cyBwb3V2ZXogZW4gcmVjZXZvaXIgdW4gbm91dmVhdSA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBuZSBjb3JyZXNwb25kIGF1eCBpbmZvcm1hdGlvbnMgc2Fpc2llcy5cIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIiwgXG4gICAgY29ubmVjdGlvbk9rOiBcIkNvbm5leGlvbiByw6l1c3NpZS5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZTogXCJMJ3V0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biBjb21wdGUgdXRpbGlzYXRldXIgbidhIMOpdMOpIHRyb3V2w6kgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBmb3Jtc0VtYWlsTGFiZWw6IFwiRS1tYWlsIDpcIixcbiAgICBmb3Jtc0VtYWlsUGxhY2Vob2xkZXI6IFwiVm90cmUgYWRyZXNzZSBlLW1haWxcIixcbiAgICBmb3Jtc0NHVU9rTGFiZWw6IFwiSidhY2NlcHRlIDxhIGhyZWY9I2xpbmsgdGFyZ2V0PVxcXCJfYmxhbmtcXFwiIHJlbD1cXFwibm9vcGVuZXJcXFwiIHRpdGxlPVxcXCLDgCBsaXJlIDopXFxcIj5sZXMgQ29uZGl0aW9ucyBHw6luw6lyYWxlIGQnVXRpbGlzYXRpb248L2E+IGR1IHNpdGUgKHJlcXVpcykuXCIsXG4gICAgZm9ybXNTdWJtaXRUeHQ6IFwiSmUgbSdhYm9ubmUgIVwiLFxuICAgIGdvZGZhdGhlckZvdW5kOiBcIlZvdHJlIFxcXCJwYXJyYWluXFxcIiBhIGJpZW4gw6l0w6kgdHJvdXbDqS4gQ2V0dGUgcGVyc29ubmUgc2VyYSBhdmVydGllIHF1ZSB2b3VzIGwnYXZleiBkw6lzaWduw6llLlwiLFxuICAgIGdvZGZhdGhlck5vdEZvdW5kOiBcIkTDqXNvbMOpIG1haXMgYXVjdW4gdXRpbGlzYXRldXIgbidhIMOpdMOpIHRyb3V2w6kgcG91ciBjZSBjb2RlIC8gZS1tYWlsIGRlIHBhcnJhaW5hZ2UgOihcIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1bHMgOiBcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zVXNlck5iR29kQ2hpbGRzOiBcIlZvaWNpIGxlcyAjTkIgdXRpbGlzYXRldXIocykgaW5zY3JpdChzKSBlbiB2b3VzIGTDqXNpZ25hbnQgY29tbWUgXFxcInBhcnJhaW5cXFwiIDogXCIsXG4gICAgaW5mb3NVc2VyTm9Hb2RjaGlsZHM6IFwiUG91ciBsJ2luc3RhbnQsIGF1Y3VuZSBwZXJzb25uZSBuZSBzJ2VzdCBpbnNjcml0ZSwgZW4gdm91cyBkw6lzaWduYW50IGNvbW1lIFxcXCJwYXJyYWluXFxcIi5cIixcbiAgICBtYWlsRGVsZXRlQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgY29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciBjb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgYSBleHBpcsOpLlwiLFxuICAgIG1haWxEZWxldGVMaW5rTWVzc2FnZTogXCJWb3RyZSBkZW1hbmRlIGRlIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuIE1lcmNpIGRlIGNsaXF1ZXIgc2FucyB0YXJkZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsIHBvdXIgY29uZmlybWVyLlwiLFxuICAgIG1haWxEZWxldGVMaW5rT2tNZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLiBNZXJjaSBkJ2F2b2lyIHV0aWxpc8OpIG5vcyBzZXJ2aWNlcy5cIixcbiAgICBtYWlsRGVsZXRlTGlua1R4dCA6IFwiQ29uZmlybWVyLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgKlRJTUlORyogIVwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIuXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzLCB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS48YnI+U2kgZGFucyBsJ2F2ZW5pciBjZXR0ZSBwZXJzb25uZSBzb3VzY3JpdCB1biBhYm9ubmVtZW50IHByw6ltaXVtLCB2b3RyZSBwcm9wcmUgYWJvbm5lbWVudCBzZXJhIHByb2xvbmfDqSBkZSAzMCBqb3Vycy48L3A+PHA+RW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuR3LDomNlIMOgIHZvdXMsIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcblNpIGRhbnMgbCdhdmVuaXIgY2V0dGUgcGVyc29ubmUgc291c2NyaXQgdW4gYWJvbm5lbWVudCBwcsOpbWl1bSwgdm90cmUgcHJvcHJlIGFib25uZW1lbnQgc2VyYSBwcm9sb25nw6kgZGUgMzAgam91cnMuXFxuRW5jb3JlIG1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIgw6AgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IDogXCJNZXJjaSAhXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZTogXCJDZXBlbmRhbnQsIHZvdXMgYXZleiBtb2RpZmnDqSBhdSBtb2lucyB1biBkZSB2b3MgaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiAoZS1tYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi48YnI+RW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtUeHQgOiBcIlZhbGlkZXIuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIGV0IGNvbXBsw6l0ZXIgdm90cmUgaW5zY3JpcHRpb24sIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gY2ktZGVzc291cyBkYW5zIGxlcyAyNGguPC9wPlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgZXQgY29tcGzDqXRlciB2b3RyZSBpbnNjcmlwdGlvbiwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aCA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rVHh0IDogXCJWYWxpZGVyIG1vbiBjb21wdGUuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNCBIIHN1ciBsZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm91cyB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLiBNZXJjaSBldCBiaWVudmVudWUgITxicj48YnI+U2kgdm91cyBhdmV6IGxhIG1vaW5kcmUgcXVlc3Rpb24gb3Ugc3VnZ2VzdGlvbiBjb25jZXJuYW50IE5PTV9TSVRFLCBuJ2jDqXNpdGV6IHBhcyDDoCBtZSBjb250YWN0ZXIgZW4gw6ljcml2YW50IMOgIDxiPkVNQUlMPC9iPi48YnI+PGJyPkplIHZvdXMgY29uc2VpbGxlIGQnYWlsbGV1cnMgZCdham91dGVyIDxiPkVNQUlMPC9iPiDDoCB2b3RyZSBjYXJuZXQgZCdhZHJlc3NlcyA8Yj5wb3VyIMOpdml0ZXIgcXVlIGxlcyBwcm9jaGFpbnMgZW52b2lzIGRlIE5PTV9TSVRFIG4nYXJyaXZlbnQgZW4gPGk+c3BhbTwvaT48L2I+Ljxicj48YnI+UGFyIGFpbGxldXJzLCBwb3VyIGfDqXJlciB2b3RyZSBhYm9ubmVtZW50LCBhY2PDqWRlciDDoCB2b3MgaW5mb3JtYXRpb25zIG91IGVuY29yZSBjaGVyY2hlciBwbHVzIGZhY2lsZW1lbnQgcGFybWkgbGUgY29udGVudSBkdSBzaXRlLCB2b3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUgdXRpbGlzYXRldXIuPGJyPjxicj5Qb3VyIGNlIGZhaXJlLCB1dGlsaXNleiBsZSBsaWVuIGNpLWRlc3NvdXMuPGJyPjxicj7DgCBiaWVudMO0dCBzdXIgTk9NX1NJVEUuXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Wb3VzIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuIE1lcmNpIGV0IGJpZW52ZW51ZSAhXFxuXFxuU2kgdm91cyBhdmV6IGxhIG1vaW5kcmUgcXVlc3Rpb24gb3Ugc3VnZ2VzdGlvbiBjb25jZXJuYW50IE5PTV9TSVRFLCBuJ2jDqXNpdGV6IHBhcyDDoCBtZSBjb250YWN0ZXIgZW4gw6ljcml2YW50IMOgIEVNQUlMLlxcblxcbkplIHZvdXMgY29uc2VpbGxlIGQnYWlsbGV1cnMgZCdham91dGVyIEVNQUlMIMOgIHZvdHJlIGNhcm5ldCBkJ2FkcmVzc2VzIHBvdXIgw6l2aXRlciBxdWUgbGVzIHByb2NoYWlucyBlbnZvaXMgZGUgTk9NX1NJVEUgbidhcnJpdmVudCBlbiBcXFwic3BhbVxcXCIuXFxuXFxuUGFyIGFpbGxldXJzLCBwb3VyIGfDqXJlciB2b3RyZSBhYm9ubmVtZW50LCBhY2PDqWRlciDDoCB2b3MgaW5mb3JtYXRpb25zIG91IGVuY29yZSBjaGVyY2hlciBwbHVzIGZhY2lsZW1lbnQgcGFybWkgbGUgY29udGVudSBkdSBzaXRlLCB2b3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUgdXRpbGlzYXRldXIuXFxuXFxuUG91ciBjZSBmYWlyZSwgdXRpbGlzZXogbGUgbGllbiBzdWl2YW50IDogTElOS19VUkxcXG5cXG7DgCBiaWVudMO0dCBzdXIgTk9NX1NJVEUuXCIsXG4gICAgbWFpbFdlbGNvbWVMaW5rVHh0IDogXCJNZSBjb25uZWN0ZXIgw6AgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsV2VsY29tZVN1YmplY3QgOiBcIkJpZW52ZW51ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZEVtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB2b3RyZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRMb25nUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlIGQnYXUgbW9pbnMgTUlOX0xFTkdUSCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkU01UUCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkU01UUE5vdEZvdW5kIDogXCJJbCBtYW5xdWUgdW4gc2VydmV1ciBTTVRQIHZhbGlkZS5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiTWVyY2kgZCdhY2NlcHRlciBsZXMgQ0dVIHBvdXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBuZWVkVW5pcXVlRW1haWw6IFwiTCdhZHJlc3NlIGUtbWFpbCBxdWUgdm91cyBhdmV6IHNhaXNpZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGNvbXB0ZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSBwb3V2b2lyIHZvdXMgY29ubmVjdGVyLiBQb3VyIGNlIGZhaXJlLCB1biBub3V2ZWF1IGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIDogXCJMYSBkYXRlIGRlIGRlcm5pw6hyZSBjb25uZXhpb24gbidlc3QgcGFzIHZhbGlkZS5cIixcbiAgICBwYXNzd29yZENvcGllZDogXCJMZSBtb3QgZGUgcGFzc2UgZ8OpbsOpcsOpIGEgw6l0w6kgY29wacOpIGRhbnMgbGUgcHJlc3NlLXBhcGllciBkZSB2b3RyZSBvcmRpbmF0ZXVyIChvdSBtb2JpbGUpLiBWb3VzIHBvdXZleiBsZSBcXFwiY29sbGVyXFxcIiBvw7kgdm91cyBsZSBzb3VoYWl0ZXouXCIsXG4gICAgc2VhcmNoVXNlcnNXaXRob3V0UmVzdWx0OiBcIkwndXRpbGlzYXRldXIgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIHRvb01hbnlMb2dpbkZhaWxzIDogXCJEw6lzb2zDqSBtYWlzIGlsIHkgYSBldSB0cm9wIGRlIHRlbnRhdGl2ZXMgZGUgY29ubmV4aW9uIGluZnJ1Y3R1ZXVzZXMgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC4gVm91cyBkZXZleiBhdHRlbmRyZSBNSU5VVEVTIG1pbnV0ZXMgcG91ciBlc3NheWVyIGRlIG5vdXZlYXUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBuJ2EgcGFzIHVuIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyOiBcIkwndXRpbGlzYXRldXIgcXVlIHZvdXMgc291aGFpdGV6IG1vZGlmaWVyIG4nZXhpc3RlIHBhcy9wbHVzIG91IG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIlZvcyBpbmZvcm1hdGlvbnMgb250IGJpZW4gw6l0w6kgbWlzZXMgw6Agam91ci5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLiBWb3VzIHBvdXZleiB2b3VzIHkgY29ubmVjdGVyIDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW46IFwiQ2UgY29tcHRlIGEgZMOpasOgIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgY29tcHRlIHZpZW50IGJpZW4gZCfDqnRyZSB2YWxpZMOpLiBNZXJjaSBldCBiaWVudmVudWUgITxicj5Wb3VzIHBvdXZleiBjb21wbMOpdGVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgdm90cmUgYWJvbm5lbWVudCBjaS1kZXNzb3VzLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlQWRtaW46IFwiTGUgY29tcHRlIGEgYmllbiDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxuXG4gICAgLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4gICAgLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG4gICAgc3RhdGljIGdldFBhc3N3b3JkIChuYkNhck1pbiwgbmJDYXJNYXgpXG4gICAge1xuICAgICAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgICAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgICAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICAgICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgICAgICB9XG4gICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgICAgICByZXR1cm4gcGFzc3dvcmQ7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIixcblx0XCIuL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5odG1sXCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbiAgICB0YWdzTGlzdFR4dDogXCJQYXJjb3VyaXIgbGVzIHJ1YnJpcXVlcyA6XCIsXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBsaWVucyBkZSBsJ2ludGVyZmFjZVxuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIlBhcmNvdXJpclwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvcXVpenMvXCIsIGlkOlwiaW5kZXhIZWFkTGlua1wiLCB0aXRsZTpcIkxlcyBkZXJuacOocmVzIHB1YmxpY2F0aW9uc1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmh0bWxcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIsIHRpdGxlOlwiQWNjw6lkZXIgb3UgY3LDqWV6IHZvdHJlIGNvbXB0ZSBXaWtpTGVybmlcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiLCB0aXRsZTpcIkVuIHNhdm9pciArIHN1ciBXaWtpTGVybmlcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiLCB0aXRsZTpcIlBhZ2UgZCdhY2N1ZWlsXCIgfSB9XG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJCbG9nXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcImh0dHBzOi8vZnJhbWFzcGhlcmUub3JnL3Blb3BsZS83ZTU0YjdhMGI1MzIwMTM4OWVlZjJhMDAwMDA1MzYyNVwiLCB0aXRsZTpcIkxlIGJsb2cgV2lraUxlcm5pIHN1ciBkaWFzcG9yYSpcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiwgdGl0bGU6XCJRdWkgYSBjcsOpw6kgV2lraUxlcm5pID8gUXVlbHMgc29udCB2b3MgZHJvaXRzID9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiLCB0aXRsZTpcIlZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMgc3VyIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ0dWICYgQ0dVXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9DR1YtQ0dVLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9XG4gICAgXSxcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIGFib3V0UGFnZTogXCJhLXByb3Bvcy5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZTogXCJhZG1pbi5odG1sXCIsXG4gICAgY2d1UGFnZTogXCJDR1YtQ0dVLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBkZWxldGVMaW5rUGFnZSA6IFwiYXVyZXZvaXIuaHRtbD90PVwiLFxuICAgIGxvZ2luTGlua1BhZ2UgOiBcImxvZ2luLmh0bWw/dD1cIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIG5ld0xvZ2luTGlua1BhZ2UgOiBcIm5ld2xvZ2luLmh0bWw/dD1cIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLCAgICBcbiAgICBzdG9wTWFpbFBhZ2UgOiBcInN0b3AtbWFpbC5odG1sP3Q9XCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIHVwZGF0ZUFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICB1c2VySG9tZVBhZ2VUeHQgOiBcIk1hIHBhZ2UgZCdhY2N1ZWlsLlwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIHZhbGlkYXRpb25MaW5rUGFnZSA6IFwidmFsaWRhdGlvbi5odG1sP3Q9XCIsXG4gICAgLyogVGV4dGVzIChnw6luw6lyYWwpICovXG4gICAgc2l0ZVNsb2dhbjogXCJDdWx0aXZvbnMgbm90cmUgamFyZGluICFcIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxuICAgIG1haWxSZWNpcGllbnRUeHQ6IFwiTWVzc2FnZSBlbnZvecOpIMOgIDpcIixcbiAgICBsaWNlbmNlVHh0OiBcIkBjb3B5bGVmdCBMZSBjb250ZW51IGRlIGNlIHNpdGUgPGEgaHJlZj1cXFwiL2NyZWRpdHMuaHRtbFxcXCIgdGl0bGU9XFxcIkVuIHNhdm9pciBwbHVzID9cXFwiPmVzdCBsaWJyZTwvYT4gZXQgdm91cyBvZmZlcnQgc2FucyBwdWJsaWNpdMOpLiBWb3VzIHBvdXZleiA8YSBocmVmPVxcXCIvcGFydGljaXBlci1maW5hbmNlbWVudC5odG1sXFxcIiB0aXRsZT1cXFwiRmluYW5jZW1lbnQgcGFydGljaXBhdGlmXFxcIj5wYXJ0aWNpcGVyIMOgIHNvbiBmaW5hbmNlbWVudCBlbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIC8qIFBhZ2UgZCdhY2N1ZWlsICovXG4gICAgaG9tZVBhZ2VUeHQ6IFwiUGFnZSBkJ2FjY3VlaWxcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIjxiPkF2ZWMgV2lraUxlcm5pLCB2b3VzIGFsbGV6IGFwcHJlbmRyZSBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzPC9iPi48YnI+Vm91cyByZWNldnJleiBkZSBjb3VydHMgYXJ0aWNsZXMsIGxpc2libGVzIGVuIHF1ZWxxdWVzIG1pbnV0ZXMuPGJyPkRlcyBxdWl6cyB2b3VzIHBlcm1ldHRyb250IGVuc3VpdGUgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGF1cmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIDxiPmRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIGN1bHR1cmUgc29udCBhaW5zaSBzZW3DqWVzIGRhbnMgdm90cmUgamFyZGluPC9iPi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZ8OpbsOpcmFsZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJTdXIgV2lraUxlcm5pIDxiPnBhcyBkZSBmYWl0cyBhbHRlcm5hdGlmczwvYj4sIHRvdXMgbGVzIGNvbnRlbnVzIHNvbnQgPGI+c291cmPDqXMgcGFyIGRlcyBhcnRpY2xlcyBXaWtpcMOpZGlhPC9iPi48YnI+RXQgdG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwdWJsacOpIHN1ciBXaWtpTGVybmkgPGEgaHJlZj1cXFwiL2NyZWRpdHMuaHRtbFxcXCIgdGl0bGU9XFxcIkVuIHNhdm9pciBwbHVzIHN1ciBjZSBzdWpldFxcXCI+c29udCBwYXJ0YWfDqXMgc291cyBsaWNlbmNlcyBsaWJyZXM8L2E+Ljxicj5MZSB0b3V0IHNhbnMgcHVibGljaXTDqSwgbmkgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzLjxicj48Yj5TdXIgV2lraUxlcm5pIHZvdXMgY3VsdGl2ZXogdm90cmUgamFyZGluIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPC9iPlwiLFxuICAgIGhvbWVCdG5BYm91dFR4dDogXCJFbiBzYXZvaXIgcGx1cyBzdXIgV2lraUxlcm5pID9cIixcbiAgICBob21lQnRuU3Vic2NyaWJlVHh0OiBcIlRlc3RlciBXaWtpTGVybmkgZ3JhdHVpdGVtZW50LlwiLFxuICAgIC8qIFBhZ2UgZGVybmnDqHJlcyBwdWJsaWNhdGlvbnMuLi4gKi8gICBcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkN1bHR1cmUgZ8OpbsOpcmFsZSAtIGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIldpa2lMZXJuaSA6IHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgV2lraUxlcm5pLlwiLFxuICAgIG5ld3NMaXN0VGl0bGU6IFwiPHA+PGI+QXZlYyBXaWtpTGVybmksIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgcXVlbHF1ZSBjaG9zZSBkZSBub3V2ZWF1PC9iPjxicj5TaSBkZXNzb3VzIGxlcyBkZXJuacOocmVzIHB1YmxpY2F0aW9ucy4gVm91cyBwb3V2ZXogYXVzc2kgPGEgaHJlZj0nL3F1aXpzL3RoZW1lcy5odG1sJz5wYXJjb3VyaXIgbGUgc2l0ZSBwYXIgdGjDqG1lcyBvdSBtb3RzLWNsw6lzPC9hPi48L3A+XCIsXG4gICAgLyogUGxhbiBkdSBzaXRlLCBsaXN0ZSBkZXMgdGFncyAqLyAgIFxuICAgIHRhZ0xpc3RUaXRsZTogXCJDdWx0dXJlIGfDqW7DqXJhbGUgLSBkZXMgYXJ0aWNsZXMgZXQgcXVpenMgc3VyIGRlIG5vbWJyZXV4IHRow6htZXMgIVwiLFxuICAgIHRhZ0xpc3RNZXRhRGVzYzogXCJXaWtpTGVybmkgOiBkw6ljb3V2cmlyIGxlcyBkaWZmw6lyZW50cyB0aMOobWVzIGFib3Jkw6lzIHBhciBXaWtpTGVybmkuIElueGV4IGR1IHNpdGUuXCIsXG4gICAgdGFnTGlzdEludHJvOiBcIjxoMz5BdmVjIFdpa2lMZXJuaSwgZGV2ZW5leiBmb3J0IGVuIHRow6htZXMuLi4gT3VpIG1haXMgcXVlbHMgdGjDqG1lcyA/IDopPC9oMz48YmxvY2txdW90ZT5BcmlzdG90ZeKArzogwqvigK9M4oCZaG9tbWUgYSBuYXR1cmVsbGVtZW50IGxhIHBhc3Npb24gZGUgY29ubmHDrnRyZeKApuKAr8K7PC9ibG9ja3F1b3RlPlwiLFxuICAgIC8qIFBhZ2UgcXVpenMgKi9cbiAgICBxdWl6RWxlbWVudExpbmtzSW50cm86IFwiU291cmNlKHMpXCIsXG4gICAgcXVpekVsZW1lbnRTdWJjcmlwdGlvbkZvcm1UaXRsZTogXCJSZWNldmV6IGxlcyBwcm9jaGFpbnMgYXJ0aWNsZXMgV2lraUxlcm5pXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5p4oCvP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIjxwPkxlIHByaW5jaXBlIGVzdCBzaW1wbGXigK86IDxiPnZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGzigJlhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpPC9iPi4gUHVpcyB2b3VzIDxiPmFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZTwvYj4uIFN1aXZhbnQgbGVzIHF1ZXN0aW9ucywgPGI+dW5lIG91IHBsdXNpZXVycyByw6lwb25zZXMgcGV1dmVudCDDqnRyZSBjb3JyZWN0ZXM8L2I+IGV0IGRvaXZlbnQgZG9uYyDDqnRyZSBjb2Now6llcy4gQ+KAmWVzdCB0b3Vqb3VycyA8Yj5sZSBjb250ZW51IGRlIGzigJlhcnRpY2xlIFdpa2lww6lkaWEgcXVpIGZhaXQgZm9pPC9iPiBjb25jZXJuYW50IGxlcyDCq+KAr2Jvbm5lc+KAr8K7IHLDqXBvbnNlcy4gQ+KAmWVzdCB1bmUgZmHDp29uIGRlIHRlc3RlciDDoCBsYSBmb2lzIHZvdHJlIGNhcGFjaXTDqSBk4oCZYXR0ZW50aW9uIGV0IHZvdHJlIG3DqW1vaXJlLiBMZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBwZXV2ZW50IMOpdm9sdWVyLCBkb25jIG7igJlow6lzaXRleiBwYXMgPGEgaHJlZj0nL2NvbnRhY3QuaHRtbCc+w6AgbWUgc2lnbmFsZXIgdW5lIGVycmV1cjwvYT4uPC9wPjxwPjxiPldpa2lMZXJuaSB2b3VzIHByb3Bvc2UgZOKAmWF1dHJlcyBzb2x1dGlvbnMgcG91ciBhbcOpbGlvcmVyIHZvdHJlIGN1bHR1cmUgZ8OpbsOpcmFsZTwvYj4uIFBvdXIgZW4gc2F2b2lyIHBsdXMsIGNsaXF1ZXogc3VyIGxlIGJvdXRvbiBjaS1kZXNzb3VzLjwvcD5cIixcbiAgICBleHBsYW5hdGlvbkVsZW1lbnRUeHQ6IFwiPHA+V2lraUxlcm5pIHZvdXMgcHJvcG9zZSBkZSA8Yj5yZWNldm9pciBwYXIgZS1tYWlsIMOgIGxhIGZyw6lxdWVuY2UgY2hvaXNpZSwgZGUgY291cnRzIGFydGljbGVzIGxpc2libGVzIGVuIHF1ZWxxdWVzIG1pbnV0ZXM8L2I+IGV0IHBvcnRhbnQgc3VyIGRlcyBzdWpldHMgdHLDqHMgdmFyacOpcyBkZSBjdWx0dXJlIGfDqW7DqXJhbGUgKGFydHMsIGhpc3RvaXJlLCBsaXR0w6lyYXR1cmUsIHNjaWVuY2VzLCBldGMuKS48L3A+PHA+Q2hhcXVlIHPDqXJpZSBk4oCZYXJ0aWNsZXMgZXN0IDxiPnN1aXZpZSBk4oCZdW4gcXVpejwvYj4gcGVybWV0dGFudCBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUuPC9wPjxwPjxiPlZvdXMgYXBwcmVuZXogYWluc2kgZGUgbm91dmVsbGVzIGNob3NlcyB0csOocyBzaW1wbGVtZW50LjwvYj48L3A+PHA+TOKAmWluc2NyaXB0aW9uIGVzdCBncmF0dWl0ZSBldCB2b3VzIHBlcm1ldCBkZSB0ZXN0ZXIgbGUgc2l0ZSBzYW5zIGVuZ2FnZW1lbnQuPC9wPlwiLFxuICAgIC8qIEF1dHJlcyAqL1xuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICB0d2l0dGVyQWNjb3VudDogXCJXaWtpTGVybmlcIixcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogMTIsXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNTaXRlSG9tZVBhZ2U6IDMsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDMsXG59OyIsIi8vIC0tIEdFU1RJT04gREVTIEZPUk1VTEFJUkVTIFBFUk1FVFRBTlQgQVVYIFVUSUxJU0FURVVSUyBERSBNRVRUUkUgw4AgSk9VUiBMRVVSUyBJTkZPUk1BVElPTlMgKyBMRVVSIEFCT05ORU1FTlRcblxuLy8vIFbDqXJpZmllciBxdWUgbCd1dGlsaXNhdGV1ciBlc3QgYmllbiBjb25uZWN0w6ksIGEgbGUgYm9uIHN0YXR1dCBldCBsZSByZWRpcmlnZXIgdmVycyBsZSBmb3JtdWxhaXJlIGQnaW5zY3JpcHRpb24gc2kgY2Ugbidlc3QgcGFzIGxlIGNhcy5cbi8vLyBTaSBjJ2VzdCBvaywgb24gcsOpY3Vww6hyZSBsZXMgaW5mb3MgZGUgc29uIGNvbXB0ZSBldCBzb24gYWJvbm5lbWVudCBldCBsZXMgYWZmaWNoZSBkYW5zIGxlIGZvcm11bGFpcmUuXG4vLy8gVW5lIGluZm9ybWF0aW9uIGVzdCBhZmZpY2jDqWUgY29uY2VybmFudCBsYSBwb3NzaWJpbGl0w6kgZGUgcGFycmFpbmFnZSBldCBsaXN0ZSBsZXMgZmlsbGV1bHMgZXhpc3RhbnRzLlxuLy8vIFVuIG1lbnUgcGVybWV0IMOgIGwndXRpbGlzYXRldXIgZCdhY2PDqWRlciDDoCBsYSBtb2RpZmljYXRpb24gZGUgc2VzIGluZm9zLCBldGMuXG4vLy8gRGVzIGJvdXRvbnMgZGUgcGFpZW1lbnQgc29udCBhdXNzaSBhZmZpY2jDqXMgc3VpdmFudCBsZSBjaG9peCBkZSBsJ3V0aWxpc2F0ZXVyIHBvdXIgbHVpIHBlcm1ldHRyZSBkZSBwcm9sb25nZXIgc29uIGFib25uZW1lbnQuXG4vLy8gVW4gbWVzc2FnZSB2ZW5hbnQgZCd1bmUgYXV0cmUgcGFnZSBwZXV0IGF1c3NpIMOqdHJlIMOgIGFmZmljaGVyIGxvcnMgZHUgcHJlbWllciBjaGFyZ2VtZW50LlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTsvLyBiZXNvaW4gZGUgdG91dGVzIGxlcyBkw6ljbGFyYXRpb25zIHBvdXIgbGEgZm9uY3Rpb24gOiB1cGRhdGVBY2NvdW50TGluaygpXG5jb25zdCB7IGJlZ2luQ29kZUdvZGZhdGhlciB9ID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZVwiKTtcbmNvbnN0IGNvbmZpZ1VzZXJzID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy91c2Vyc1wiKTsgLy8gYmVzb2luIGRlIHRvdXMgbGUgZmljaGllciBwb3VyIGNvbmZpZ3VyZXIgbGUgZm9ybXVsYWlyZVxuXG4vLyBGb25jdGlvbnMgdXRpbGVzIGF1IHNjcmlwdFxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiwgdXBkYXRlQWNjb3VudExpbmsgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBnZXREYXRhc0Zyb21JbnB1dHMsIHNldEF0dHJpYnV0ZXNUb0lucHV0cyB9IGZyb20gXCIuL3Rvb2xzL2Zvcm1zLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uL3Rvb2xzL21haW5cIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBnZXRUaW1lRGlmZmVyZW5jZSB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIFNww6ljaWZpcXVlIFdlYlBvcnRhZ2UgcG91ciBwYWllbWVudHM6XG5pbXBvcnQgeyBzaG93QnRuUGF5bWVudCwgdW5DaGVja0FsbE90aGVycyB9IGZyb20gXCIuL3Rvb2xzL3dlYnBvcnRhZ2UuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB7IHNlcnZlckVycm9yIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2dlbmVyYWxcIik7XG5jb25zdCB7IGluZm9zVXNlck5iR29kQ2hpbGRzLCBpbmZvc1VzZXJOb0dvZGNoaWxkcywgbmVlZEJlQ29ubmVjdGVkIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5jb25zdCB7IGluZm9zRXhwaXJhdGVkLCBpbmZvc05iRGF5cyB9ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9zdWJzY3JpcHRpb25cIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBkaXZDcmFzaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY3Jhc2hcIik7XG5jb25zdCBkaXZNYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYWluLWNvbnRlbnRcIik7XG5jb25zdCBkaXZNZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXNzYWdlXCIpO1xuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuY29uc3QgZGl2R29kY2hpbGRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJnb2RjaGlsZHNcIik7XG5jb25zdCBkaXZTdWJzY3JpYmVJbnRybyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3Vic2NyaWJlSW50cm9cIik7XG5jb25zdCBmb3JtQWNjb3VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudFVwZGF0ZVwiKTtcbmNvbnN0IG5ld1Bhc3N3b3JkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuZXdQYXNzd29yZFwiKTtcbmNvbnN0IHNob3dHRkVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJnb2RmYXRoZXJFbWFpbFwiKTtcbmNvbnN0IHNob3dHRkNvZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdvZGZhdGhlckNvZGVcIik7XG5cbmhlbGxvRGV2KCk7XG5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgLy8gU2kgbCd1dGlsaXNhdGV1ciBuJ2VzdCBwYXMgY29ubmVjdMOpIGF2ZWMgbGUgYm9uIHN0YXR1dCwgcGFzIGxhIHBlaW5lIGQnYWxsZXIgKyBsb2luIDpcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKFtcInVzZXJcIl0sIFwiL1wiK2NvbmZpZ1RlbXBsYXRlLmNvbm5lY3Rpb25QYWdlLCB7IG1lc3NhZ2U6IG5lZWRCZUNvbm5lY3RlZCwgY29sb3I6XCJlcnJvclwiIH0sIHdpbmRvdy5sb2NhdGlvbik7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBkaXZNYWluLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgLy8gbCfDqXZlbnR1ZWxsZSBhbmNyZSBlc3QgaWdub3LDqWUsIGNhciBhYnNlbnRlIGR1IERPTSBhdmFudCBkJ2F2b2lyIHbDqXJpZmnDqSBsYSBjb25uZXhpb25cbiAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5oYXNoIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24od2luZG93LmxvY2F0aW9uLmhhc2gpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZighaXNFbXB0eShnZXRMb2NhbHkoXCJtZXNzYWdlXCIpKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCBnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLm1lc3NhZ2UsIFwiXCIsIFtnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLmNvbG9yXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcIm1lc3NhZ2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1c2VyPWdldExvY2FseShcInVzZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB1cGRhdGVBY2NvdW50TGluayh1c2VyLnN0YXR1cywgY29uZmlnVGVtcGxhdGUpO1xuICAgICAgICAgICAgLy8gSW5pdGlhbGlzZSBsZSBmb3JtdWxhaXJlIHBlcm1ldHRhbnQgZGUgbWV0dHJlIMOgIGpvdXIgbGVzIGluZm9zIDpcbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWdVc2VycywgZm9ybUFjY291bnQpO1xuICAgICAgICAgICAgLy8gQ2VydGFpbnMgbmF2aWdhdGV1cnMgcmVtcGxpc3NlbnQgbGVzIGNoYW1wcyBwYXNzd29yZCA6XG4gICAgICAgICAgICBuZXdQYXNzd29yZC52YWx1ZT1cIlwiO1xuXG4gICAgICAgICAgICAvLyBGb25jdGlvbiBhZmZpY2hhbnQgbGVzIGluZm9zIGNvbm51ZXMgYXUgcHJlbWllciBhZmZpY2hhZ2UsIHB1aXMgYXByw6hzIGVudm9pIG1pc2Ugw6Agam91clxuICAgICAgICAgICAgY29uc3QgZ2V0SW5mb3MgPSAoKSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhockdldEluZm9zID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyR2V0SW5mb3Mub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnVXNlcnMudXNlclJvdXRlcytjb25maWdVc2Vycy5nZXRVc2VySW5mb3MrdXNlci5pZCk7XG4gICAgICAgICAgICAgICAgeGhyR2V0SW5mb3Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5Vc2VyICE9IHVuZGVmaW5lZCAmJiByZXNwb25zZS5TdWJzY3JpcHRpb24gIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgZGF0YSBpbiByZXNwb25zZS5Vc2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9ybUFjY291bnQuZWxlbWVudHNbZGF0YV0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlVzZXJbZGF0YV0hPT10cnVlICYmIHJlc3BvbnNlLlVzZXJbZGF0YV0hPT1mYWxzZSkvLyBib29sw6llbiA9IGNhc2Ugw6AgY29jaGVyICFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQWNjb3VudC5lbGVtZW50c1tkYXRhXS52YWx1ZT1yZXNwb25zZS5Vc2VyW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuVXNlcltkYXRhXT09dHJ1ZSkgLy8gc2kgZmFsc2UsIG9uIG5lIGZhaXQgcmllbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQWNjb3VudC5lbGVtZW50c1tcIlwiK2RhdGFdLmNoZWNrZWQ9XCJjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gam91cnMgZGUgcsOpY2VwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5TdWJzY3JpcHRpb24ucmVjZWlwdERheXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1BY2NvdW50LmVsZW1lbnRzW1wiZFwiK3Jlc3BvbnNlLlN1YnNjcmlwdGlvbi5yZWNlaXB0RGF5c1tpXV0uY2hlY2tlZD1cImNoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcImNvZGVzXCIgcG9zc2libGVzIMOgIHRyYW5zbWV0dHJlIHBvdXIgcGFycmFpbmVyIGQnYXV0cmVzIHV0aWxpc2F0ZXVycyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93R0ZFbWFpbC5pbm5lckhUTUw9cmVzcG9uc2UuVXNlci5lbWFpbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93R0ZDb2RlLmlubmVySFRNTD1iZWdpbkNvZGVHb2RmYXRoZXIrcmVzcG9uc2UuVXNlci5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlZ2luU3ViVFM9bmV3IERhdGUocmVzcG9uc2UuU3Vic2NyaXB0aW9uLmNyZWF0ZWRBdCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmJEYXlzT2s9cmVzcG9uc2UuU3Vic2NyaXB0aW9uLm51bWJlck9mRGF5cy1NYXRoLnJvdW5kKChEYXRlLm5vdygpLWJlZ2luU3ViVFMpLzEwMDAvMzYwMC8yNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihuYkRheXNPayA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTdWJzY3JpYmVJbnRybywgXCJwXCIsIGluZm9zTmJEYXlzLnJlcGxhY2UoXCJOQl9EQVlTXCIsIG5iRGF5c09rKSwgXCJcIiwgW1wiaW5mb1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTdWJzY3JpYmVJbnRybywgXCJwXCIsIGluZm9zRXhwaXJhdGVkLnJlcGxhY2UoXCJOQl9EQVlTXCIsIG5iRGF5c09rKSwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjc3Vic2NyaWJlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhockdldEluZm9zLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhockdldEluZm9zLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW9udGUgbGVzIGluZm9zIGTDqWrDoCBlbnJlZ2lzdHLDqWVzIDpcbiAgICAgICAgICAgIGdldEluZm9zKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgICAvLyBUcmFpdGVtZW50IGRlIGwnZW52b2kgZCd1bmUgbWlzZSDDoCBqb3VyIGRlcyBpbmZvc1xuICAgICAgICAgICAgZm9ybUFjY291bnQuYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBkaXZSZXNwb25zZS5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YXM9Z2V0RGF0YXNGcm9tSW5wdXRzKGZvcm1BY2NvdW50KTtcbiAgICAgICAgICAgICAgICAvLyByZWNvbXBvc2l0aW9uIGRlcyBqb3VycyB2YWxhYmxlcyBwb3VyIGwnYWJvbm5lbWVudCA6XG4gICAgICAgICAgICAgICAgZGF0YXMucmVjZWlwdERheXM9XCJcIjtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGk9MTsgaTw9NzsgaSsrKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YXNbXCJkXCIraV0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5yZWNlaXB0RGF5cys9XCJcIitpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRhcy50aW1lRGlmZmVyZW5jZT1nZXRUaW1lRGlmZmVyZW5jZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhoclVzZXJVcGRhdGUgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICBpZihkYXRhcy5kZWxldGVPayE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgeGhyVXNlclVwZGF0ZS5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWdVc2Vycy51c2VyUm91dGVzK1wiL1wiK3VzZXIuaWQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgeGhyVXNlclVwZGF0ZS5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWdVc2Vycy51c2VyUm91dGVzK2NvbmZpZ1VzZXJzLnVwZGF0ZVVzZXJJbmZvcyt1c2VyLmlkKTtcbiAgICAgICAgICAgICAgICB4aHJVc2VyVXBkYXRlLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UubWVzc2FnZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGFucyB0b3VzIGxlcyBjYXMsIGplIG1ldHMgw6Agam91ciBsZSBjb250ZW51IGR1IGZvcm11bGFpcmUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5mb3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHJVc2VyVXBkYXRlLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgIHhoclVzZXJVcGRhdGUuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgaWYoZGF0YXMpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkYXRhcy5vdXRwdXQ9XCJodG1sXCI7XG4gICAgICAgICAgICAgICAgICAgIHhoclVzZXJVcGRhdGUuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBvbiBwYXNzZSDDoCBsYSBjYWlzc2UgP1xuICAgICAgICAgICAgY29uc3QgYWJvOT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFibzlcIik7XG4gICAgICAgICAgICBjb25zdCBhYm8xOD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFibzE4XCIpO1xuICAgICAgICAgICAgY29uc3QgYWJvMzY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm8zNlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGFibzU0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvNTRcIik7XG4gICAgICAgICAgICBjb25zdCBDR1Y9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJDR1ZPa1wiKTtcbiAgICAgICAgICAgIGNvbnN0IGRpdldQQnRucz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuc1wiKTtcbiAgICAgICAgICAgIGRpdldQQnRucy5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgYWJvOS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW5DaGVja0FsbE90aGVycyhcImFibzlcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFibzE4LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bkNoZWNrQWxsT3RoZXJzKFwiYWJvMThcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFibzM2LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bkNoZWNrQWxsT3RoZXJzKFwiYWJvMzZcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFibzU0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bkNoZWNrQWxsT3RoZXJzKFwiYWJvNTRcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIENHVi5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoQ0dWLmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGl2V1BCdG5zLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBpZihhYm85LmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0J0blBheW1lbnQoXCJidG45XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGFibzE4LmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0J0blBheW1lbnQoXCJidG4xOFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihhYm8zNi5jaGVja2VkPT09dHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dCdG5QYXltZW50KFwiYnRuMzZcIik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYWJvNTQuY2hlY2tlZD09PXRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QnRuUGF5bWVudChcImJ0bjU0XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdldQQnRucy5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgQ0dWLmNoZWNrZWQ9ZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkaXZXUEJ0bnMuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBMaXN0ZSBkZXMgZmlsbGV1bHMsIHNpIGlsIHkgZW4gYVxuICAgICAgICAgICAgY29uc3QgeGhyR2V0R29kY2hpbGRzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICB4aHJHZXRHb2RjaGlsZHMub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnVXNlcnMudXNlclJvdXRlcytjb25maWdVc2Vycy5nZXRHb2RDaGlsZHMpO1xuICAgICAgICAgICAgeGhyR2V0R29kY2hpbGRzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCksIHR4dEdvZGNoaWxkcz1cIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmJHb2RjaGlsZHM9cmVzcG9uc2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYobmJHb2RjaGlsZHM9PT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dEdvZGNoaWxkcz1pbmZvc1VzZXJOb0dvZGNoaWxkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRHb2RjaGlsZHM9aW5mb3NVc2VyTmJHb2RDaGlsZHMucmVwbGFjZShcIiNOQlwiLCBuYkdvZGNoaWxkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRHb2RjaGlsZHMrPXJlc3BvbnNlW2ldLm5hbWUrXCIgKFwiK3Jlc3BvbnNlW2ldLmVtYWlsK1wiKSBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkdvZGNoaWxkcywgXCJwXCIsIHR4dEdvZGNoaWxkcywgXCJcIiwgW1wiaW5mb1wiXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeGhyR2V0R29kY2hpbGRzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgIHhockdldEdvZGNoaWxkcy5zZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2Q3Jhc2gsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG5cXG5MZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgdm91cyBwb3V2ZXogbGUgdHJvdXZlciBzaSBHaXRsYWIgOlxcbmh0dHBzOi8vZ2l0bGFiLmNvbS9sZWZhYmxhYi93aWtpbGVybmlcXG5cXG5Qb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIC8vIG11bHRpcGxpZXIgcGFyIC0xLCBjYXIgYydlc3QgY2UgcXUnaWwgZmF1dCBcImFqb3V0ZXJcIiDDoCBsJ2hldXJlIFVUQyBwb3VyIHJldmVuaXIgZW4gaGV1cmUgbG9jYWxlIHF1aSBtJ2ludMOpcmVzc2UgZXQgbm9uIGwnaW52ZXJzZVxuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkqLTE7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6IG91IGQndW4gZ3JvdXBlIGRlIHF1aXpzXG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpICYmICghaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSB8fCAhaXNFbXB0eShhbnN3ZXIuR3JvdXBJZCkpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkpXG4gICAgICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZGF0YXMuR3JvdXBJZD1hbnN3ZXIuR3JvdXBJZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBjJ2VzdCBsZSB0b2tlbiBxdWkgc2VydCDDoCB2w6lyaWZpZXIgbGUgc3RhdHV0IMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2UrXCIjc3Vic2NyaWJlXCIpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59IiwiY29uc3QgY2hlY2tCb3hlcz1cbntcbiAgICBcIkNHVlwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJDR1ZPa1wiKSxcbiAgICBcImFibzlcIiA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvOVwiKSxcbiAgICBcImFibzE4XCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFibzE4XCIpLFxuICAgIFwiYWJvMzZcIiA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWJvMzZcIiksXG4gICAgXCJhYm81NFwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhYm81NFwiKVxufVxuY29uc3QgZGl2V1BCdG5zPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG5zXCIpO1xuXG4vLyBMb3JzcXVlIGwnb24gc8OpbGVjdGlvbm5lIHVuIG1vbnRhbnQsIGxlcyBhdXRyZXMgb3B0aW9ucyArIGxlcyBDR1Ygc29udCBkw6lzw6lsZWN0aW9ubsOpc1xuZXhwb3J0IGNvbnN0IHVuQ2hlY2tBbGxPdGhlcnMgPSAoY2hvaWNlKSA9Plxue1xuICAgIGZvciAobGV0IGlkIGluIGNoZWNrQm94ZXMpXG4gICAge1xuICAgICAgICBpZihpZCE9PWNob2ljZSlcbiAgICAgICAgICAgIGNoZWNrQm94ZXNbaWRdLmNoZWNrZWQ9ZmFsc2U7XG4gICAgICAgIGRpdldQQnRucy5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgIH1cbn1cblxuXG5jb25zdCBidG5zPVxue1xuICAgIFwiYnRuOVwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJXUEJ0bjlcIiksXG4gICAgXCJidG4xOFwiIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJXUEJ0bjE4XCIpLFxuICAgIFwiYnRuMzZcIiA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG4zNlwiKSxcbiAgICBcImJ0bjU0XCIgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuNTRcIilcbn1cblxuLy8gQWZmaWNoZSBsZSBib24gYm91dG9uIGRlIHBhaWVtZW50IGV0IGNhY2hlIGxlcyBhdXRyZXNcbmV4cG9ydCBjb25zdCBzaG93QnRuUGF5bWVudCA9IChjaG9pY2UpID0+XG57XG4gICAgZm9yIChsZXQgaWQgaW4gYnRucylcbiAgICB7XG4gICAgICAgIGlmKGlkIT09Y2hvaWNlKVxuICAgICAgICAgICAgYnRuc1tpZF0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYnRuc1tpZF0uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgfVxufSJdLCJzb3VyY2VSb290IjoiIn0=
|