WikiLerni/front/public/JS/subscribeValidation.app.js

1301 lines
168 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/subscribeValidation.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 "@" !
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: 10,
freeAccountExpirationNotificationInDays: 5,
accountExpirationFirstNotificationInDays: 14,
accountExpirationSecondNotificationInDays: 5,
inactiveAccountTimeToDeleteInDays: 180,
// Questionnaires:
nbQuestionsMin: 1,
// minimum number of questions for the questionnaire to be publishable
nbQuestionsMax: 2,
// if 0 = not maximum
nbChoicesMax: 10,
nbNewQuestionnaires: 10,
// for RSS, etc.
hourGiveNewQuestionnaireBegin: 1,
// in user local time
hourGiveNewQuestionnaireEnd: 24,
// idem
numberNewQuestionnaireAtSameTime: 50,
// for mass mailing
minSearchQuestionnaires: 3,
// Illustrations:
nbIllustrationsMin: 0,
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: 400,
illustrationsMiniaturesWidthMaxInPx: 200,
// Links:
nbLinksMin: 1,
nbLinksMax: 1
}, _defineProperty(_module$exports, "nbQuestionsMin", questionnaires.nbQuestionsMin), _defineProperty(_module$exports, "nbQuestionsMax", questionnaires.nbQuestionsMax), _defineProperty(_module$exports, "nbChoicesMax", questionnaires.nbChoicesMax), _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, "dirHTMLQuestionnaire", questionnaires.dirHTMLQuestionnaire), _defineProperty(_module$exports, "dirWebQuestionnaire", questionnaires.dirWebQuestionnaire), _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",
getQuestionnaireRoutes: "/get",
previewQuestionnaireRoutes: "/preview",
publishedQuestionnaireRoutes: "/quiz/",
saveAnswersRoute: "/answer/",
getStatsQuestionnaires: "/stats/",
searchQuestionnairesRoute: "/search",
getRandomQuestionnairesRoute: "/getrandom",
searchAdminQuestionnairesRoute: "/searchadmin",
getListNextQuestionnaires: "/getlistnextquestionnaires/",
regenerateHTML: "/htmlregenerated",
// -- questions & choices :
questionsRoute: "/question/",
// -- tags :
tagsSearchRoute: "/tags/search/",
// -- answers :
getQuestionnairesWithoutAnswer: "/withoutanswer/user/",
getPreviousAnswers: "/user/answers/",
getStatsAnswers: "/user/anwswers/stats/",
getAdminStats: "/getadminstats/",
// 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 vide
introduction: {
required: true
}
},
searchQuestionnaires: {
minlength: 3,
required: true
},
Question: {
text: {
maxlength: 255,
required: true
},
rank: {
required: true,
min: 1,
defaultValue: 1
}
},
Choice: {
text: {
maxlength: 255,
required: true
}
},
nbQuestionsMin: 1,
nbQuestionsMax: 0,
nbChoicesMax: 10,
nbTagsMin: 0,
nbTagsMax: 0,
// 0 = not max
// JSON and HTML dir
dirCacheQuestionnaires: "datas/questionnaires",
dirCacheQuestions: "datas/questionnaires/questions",
dirCacheUsersQuestionnaires: "datas/users/questionnaires",
dirCacheTags: "datas/questionnaires/tags",
dirHTMLQuestionnaire: "front/public/quiz",
dirHTMLTags: "front/public/quizs",
dirWebQuestionnaire: "quiz",
//pour url page
dirWebTags: "quizs",
// idem
nbRandomResults: 3 // limite les résultat du moteur de recherche quand demande de résultats au hasard
};
/***/ }),
/***/ "../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",
subscribeRoute: "/signup",
getGodfatherRoute: "/getgodfatherid",
checkIfIsEmailfreeRoute: "/isemailfree",
checkSubscribeTokenRoute: "/validation/",
checkLoginRoute: "/checklogin/",
connectionRoute: "/login",
getLoginLinkRoute: "/getloginlink",
connectionWithLinkRoute: "/checkloginlink",
getUserInfos: "/get/",
createUserRoute: "/create",
validateUserRoute: "/validate/",
updateUserInfos: "/modify/",
searchUserRoute: "/search/",
getGodChilds: "/getgodchilds/",
checkNewLoginLinkRoute: "/confirmnewlogin/",
checkDeleteLinkRoute: "/confirmdelete/",
getPayments: "/payment/getforoneuser/",
unsubscribeRoute: "/subscription/stop/",
getAdminStats: "/getadminstats/",
// 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
},
timeDifferenceMin: -720,
timeDifferenceMax: 840,
// JSON dir
dirCacheUsers: "datas/users",
dirCacheUsersAnswers: "datas/users/questionnaires/answers"
};
/***/ }),
/***/ "../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 ^\\.\\/.*\\/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 = {
siteHTMLTitle: "WikiLerni : Wikipédia en questions",
siteMetaDescription: "Avec WikiLerni, recevez chaque jour de nouveaux quizs pour tester vos connaissances et apprendre de nouvelles choses.",
scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
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 :",
neededParams: "Des paramètres nécessaires manquants sont manquants.",
badUrl: "Tentative d'accès à une page n'existant pas :",
notValidFormat: "Format non valide.",
notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.",
notRequired: "Facultatif.",
updateBtnTxt: "Modifier",
addBtnTxt: "Ajouter",
deleteBtnTxt: "Supprimer",
addOkMessage: "Les données ont bien été enregistrées.",
updateOkMessage: "La mise à jour à jour a bien été enregistrée.",
deleteOkMessage: "La suppression a bien été enregistrée.",
failAuth: "Erreur d'authentification.",
failAuthHeader: "Absence de header Authorization.",
failAuthToken: "Token invalide ou utilisateur non trouvé.",
failAuthId: "Identifiant non valide : ",
failAuthCron: "Tentative de lancement d'un cron sans le bon token.",
previousPage: "Page précédente",
nextPage: "Page suivante",
alertNewWindow: "nouvelle fenêtre",
btnLinkToQuestionnaire: "Aller au quiz !",
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."
};
/***/ }),
/***/ "../lang/fr/user.js":
/*!**************************!*\
!*** ../lang/fr/user.js ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
notFound: "L'utilisateur n'a pas été trouvé.",
needName: "Merci de choisir un nom d'utilisateur.",
needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",
needEmail: "Merci de saisir votre adresse e-mail.",
needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée par un autre utilisateur. Si vous avez déjà un compte, <a href='/#URL'>cliquez-ici pour vous connecter</a>.",
needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",
needPassWord: "Merci de fournir un mot de passe.",
needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",
passwordCopied: "Le mot de passe généré a été copié dans votre presse-papier. Vous pouvez le recopier (Ctrl+V) où vous le souhaitez.",
needStatus: "Il manque le statut.",
needLanguage: "Il manque le code langue.",
needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.",
needSMTP: "Il manque le serveur SMTP.",
needSMTPNotFound: "Il manque le serveur SMTP.",
needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",
needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.",
needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",
needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",
needUGCOk: "Vous devez accepter les CGU pour pouvoir créer votre compte. ",
godfatherNotFound: "Aucun utilisateur n'a été trouvé pour ce code parrain.",
godfatherFound: "Votre parrain a bien été trouvé !",
mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24H sur le lien de confirmation qui vient de vous être envoyé par e-mail.",
mailValidationLinkSubject: "Merci de valider votre inscription",
mailValidationLinkTxt: "Valider mon compte.",
mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
mailValidationLinkSBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.</p>",
validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !<br>Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre compte.",
validationMessageAdmin: "Le compte a bien été validé.",
validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.",
validationAlreadyMessageAdmin: "Ce compte a déjà été validé.",
mailWelcomeSubject: "Bienvenue !",
mailWelcomeLinkTxt: "Me connecter à mon compte.",
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 du site n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nEncore merci et à bientôt.",
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 pour éviter que les prochains envois du site n'arrivent en <i>spam</i>.<br><br>Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.<br><br>Pour ce faire, utilisez le lien ci-dessous.<br><br>Encore merci et à bientôt.",
mailThankGodfatherSubject: "Merci !",
mailThankGodfatherLinkTxt: "Me connecter à mon compte.",
mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
mailThankGodfatherBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.</p><p>Merci et à bientôt !</p>",
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>.",
emailNotFound: "Aucun utilisateur trouvé pour cette adresse e-mail.",
alreadyConnected: "Vous êtes déjà connecté(e) au site !",
needBeConnected: "Vous devez être connecté(e) pour accéder à cette page.",
connectionOk: "Connexion réussie.",
needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",
needValidationToLogin: "Vous devez d'abord valider votre compte avant de vous connecter. Pour ce faire, un lien vient de vous être envoyé par e-mail.",
tooManyLoginFails: "Trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",
badPassword: "Le mot de passe n'est pas le bon.",
mailLoginLinkSubject: "Votre lien de connexion.",
mailLoginLinkTxt: "Me connecter.",
mailLoginLinkBodyTxt: "Bonjour USER_NAME,\n\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailLoginLinkBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :</p>",
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 ",
updatedOkMessage: "Vos informations ont bien été mises à jour.",
updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée car elle n'a pas un format correct.",
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.",
mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.",
mailUpdateLoginLinkTxt: "Valider.",
mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\n\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailUpdateLoginBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.</p>",
mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email 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>. En attendant, merci de continuer à utiliser vos anciens identifiants.",
updatedNeedValidatedUser: "L'utilisateur que vous souhaité modifier n'existe pas/plus ou n'a pas encore validé son compte.",
updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",
mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.",
updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",
creationOkMessage: "Le nouvel utilisateur a bien été enregistré.",
mailDeleteSubject: "Confirmer la suppression de votre compte.",
mailDeleteLinkTxt: "Confirmer.",
mailDeleteBodyTxt: "Bonjour USER_NAME,\n\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailDeleteBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.</p>",
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.",
deleteOkMessage: "L'utilisateur a bien été supprimé.",
deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ",
mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.",
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 n'est plus valable.",
cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.",
deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.",
welcomeMessage: "Bienvenue #NAME !",
byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.<br>À bientôt !",
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>",
infosAdminGodfather: "Cet utilisateur a été parrainé par ",
infosAdminNbGodChilds: "Ses #NB filleuils : "
};
/***/ }),
/***/ "../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;
}
}]);
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 = {
headLinks: [{
anchor: "Contact",
attributes: {
href: "/contact.html",
rel: "nofollow"
}
}, {
anchor: "Parcourir",
attributes: {
href: "/quizs/",
id: "indexHeadLink",
title: "Les derniers quizs"
}
}, {
anchor: "Mon compte",
attributes: {
href: "/connexion.html",
id: "accountHeadLink"
}
}, {
anchor: "À propos",
attributes: {
href: "/a-propos.html"
}
}],
footLinks: [{
anchor: "Blog",
attributes: {
href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625",
title: "Blog WikiLerni sur diaspora*"
}
}, {
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: "CGV & CGU",
attributes: {
href: "/CGV-CGU.html",
rel: "nofollow"
}
}],
maxQuestionnairesSiteHomePage: 3,
maxQuestionnairesByPage: 9,
nbQuestionnairesUserHomePage: 3,
userHomePage: "accueil.html",
adminHomePage: "admin.html",
managerHomePage: "gestion.html",
subscribePage: "inscription.html",
connectionPage: "connexion.html",
validationLinkPage: "validation.html?t=",
loginLinkPage: "login.html?t=",
newLoginLinkPage: "newlogin.html?t=",
deleteLinkPage: "aurevoir.html?t=",
stopMailPage: "stop-mail.html?t=",
accountPage: "compte.html",
updateAccountPage: "mon-compte.html",
questionnairesManagementPage: "gestion-quizs.html",
usersManagementPage: "gestion-utilisateurs.html",
aboutPage: "a-propos.html",
illustrationDir: "/img/quizs/",
siteSlogan: "Cultivons notre jardin !",
homePageTxt: "Page d'accueil",
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 <span class='postscriptum'>(*)</span>, 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><span class='postscriptum'>(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.</span>",
homeBtnAboutTxt: "En savoir plus sur WikiLerni !",
homeBtnSubscribeTxt: "Tester WikiLerni gratuitement.",
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 avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.<br><br>Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. <b>C'est toujours le contenu de l'article Wikipédia qui fait foi concernant les \"bonnes\" réponses</b>. Mais les articles de Wikipédia peuvent évoluer, donc n'hésitez pas <a href='/contact.html'>à me signaler une erreur</a>.<br><br>Toutes les réponses se trouvent dans l'article proposé à la lecture. <b>Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement</b>.<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. Ce compte vous permettra de <b>tester de nouveau ce quiz</b> pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Grâce à ce compte, vous pourrez aussi <b>recevoir régulièrement de nouveaux quizs</b> pour continuer à \"cultiver votre jardin\".<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.",
newsListTitle: "Les dernières graines de savoir",
tagsListTxt: "Parcourir les rubriques",
mailRecipientTxt: "Message envoyé à :"
};
/***/ }),
/***/ "./src/subscribeValidation.js":
/*!************************************!*\
!*** ./src/subscribeValidation.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 _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/users.js */ "../config/users.js");
/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.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); }); }; }
// -- PAGE PERMETTANT DE VALIDER LA CRÉATION DE SON COMPTE
/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps.
/// Si le token n'est pas/plus valide, on redirige l'utilisateur vers la page de connexion pour obtenir un nouveau lien.
/// Si le token est ok, on l'informe que tout est ok et lui propose de se connecter.
/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige vers sa page d'accueil.
// Fichier de configuration tirés du backend :
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"); // Importation des fonctions utiles au script :
// Dictionnaires :
var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user");
var divResponse = document.getElementById("response");
var initialise = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var isConnected, user, homePage, datas, xhr;
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"])();
case 3:
isConnected = _context.sent;
if (isConnected) {
Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", {
message: txtUsers.alreadyConnected,
color: "information"
});
user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user", true);
homePage = user.status + "HomePage"; // lors de la création, seul le statut 'user" est possible
window.location.assign("/" + configTemplate[homePage]);
} else {
datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_5__["getUrlParams"])();
if (datas && datas.t !== undefined) {
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__["checkSubscribeTokenRoute"] + datas.t);
xhr.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && response.userId != undefined && response.token != undefined) {
Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", {
message: txtUsers.validationMessage,
color: "success"
}); // pour l'afficher sur la page suivante
window.location.assign("/" + configTemplate.connectionPage);
} else if ((this.status === 200 || this.status === 404) && response.errors != undefined) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = txt.serverError;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configTemplate.connectionPage), "", ["error"]);
}
};
xhr.send();
}
}
_context.next = 11;
break;
case 7:
_context.prev = 7;
_context.t0 = _context["catch"](0);
console.error(_context.t0);
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
case 11:
case "end":
return _context.stop();
}
}
}, _callee, null, [[0, 7]]);
}));
return function initialise() {
return _ref.apply(this, arguments);
};
}();
initialise();
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["helloDev"])();
/***/ }),
/***/ "./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 Le code de WikiLerni est libre et sera bientôt lisible sur Gitlab.\n Pour 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/url.js":
/*!**************************!*\
!*** ./src/tools/url.js ***!
\**************************/
/*! exports provided: getUrlParams */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
// Fonction récupérant les paramètres passés par l'url
var getUrlParams = function getUrlParams() {
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false;
var parameters = location.search.substring(1).split("&");
if (!Array.isArray(parameters) || parameters.length === 0) return false;
var param,
datas = {};
for (var i in parameters) {
param = parameters[i].split("=");
if (param.length === 2) datas[param[0]] = decodeURI(param[1]);
}
return datas;
};
/***/ }),
/***/ "./src/tools/users.js":
/*!****************************!*\
!*** ./src/tools/users.js ***!
\****************************/
/*! exports provided: getConfig, getTimeDifference, getPassword, setSession, checkAnswerDatas, checkSession */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; });
/* 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");
// Récupère les données de configuration des utilisateurs
// À terme, un fichier statique importable comme module devrait éviter une requête ajax
var getConfig = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + "/user/getconfig");
xhr.onload = function () {
return resolve(JSON.parse(xhr.responseText));
};
xhr.onerror = function () {
return reject(xhr.statusText);
};
xhr.send();
}));
case 1:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function getConfig() {
return _ref.apply(this, arguments);
};
}();
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;
}; // On enlève volontairement les 0/O pour éviter les confusions !
// Et mieux vaut aussi débuter et finir par une lettre simple.
var getPassword = 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;
}; // 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
// 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.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions)) {
datas.duration = answer.duration;
datas.nbCorrectAnswers = answer.nbCorrectAnswers;
datas.QuestionnaireId = answer.QuestionnaireId;
datas.nbQuestions = answer.nbQuestions;
}
}
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 _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
var status,
urlRedirection,
message,
urlWanted,
_args2 = arguments;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
status = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : [];
urlRedirection = _args2.length > 1 ? _args2[1] : undefined;
message = _args2.length > 2 ? _args2[2] : undefined;
urlWanted = _args2.length > 3 ? _args2[3] : undefined;
return _context2.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 _context2.stop();
}
}
}, _callee2);
}));
return function checkSession() {
return _ref2.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);
};
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9zdWJzY3JpYmVWYWxpZGF0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRSYW5kb21RdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInJlZ2VuZXJhdGVIVE1MIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwibmJSYW5kb21SZXN1bHRzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYWxlcnROZXdXaW5kb3ciLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5vdEZvdW5kIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRMYW5ndWFnZSIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVMaW5rVHh0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rVHh0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWRPa01lc3NhZ2UiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luTGlua1R4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwiY3JlYXRpb25Pa01lc3NhZ2UiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxEZWxldGVMaW5rVHh0IiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlIiwiZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2UiLCJ3ZWxjb21lTWVzc2FnZSIsImJ5ZWJ5ZU1lc3NhZ2UiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwiam9pbiIsInJlcGxhY2UiLCJtYXRjaGVkIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsInRhZ3NMaXN0VHh0IiwibWF4UXVlc3Rpb25uYWlyZXNTaXRlSG9tZVBhZ2UiLCJ2YWxpZGF0aW9uTGlua1BhZ2UiLCJsb2dpbkxpbmtQYWdlIiwibmV3TG9naW5MaW5rUGFnZSIsImRlbGV0ZUxpbmtQYWdlIiwic3RvcE1haWxQYWdlIiwidXBkYXRlQWNjb3VudFBhZ2UiLCJhYm91dFBhZ2UiLCJob21lUGFnZVR4dCIsImhvbWVCdG5BYm91dFR4dCIsImhvbWVCdG5TdWJzY3JpYmVUeHQiLCJuZXdzTGlzdFRpdGxlIiwibWFpbFJlY2lwaWVudFR4dCIsImNvbmZpZ1RlbXBsYXRlIiwidHh0IiwidHh0VXNlcnMiLCJkaXZSZXNwb25zZSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJpbml0aWFsaXNlIiwiY2hlY2tTZXNzaW9uIiwiaXNDb25uZWN0ZWQiLCJzYXZlTG9jYWx5IiwibWVzc2FnZSIsImNvbG9yIiwidXNlciIsImdldExvY2FseSIsImhvbWVQYWdlIiwic3RhdHVzIiwid2luZG93IiwibG9jYXRpb24iLCJhc3NpZ24iLCJkYXRhcyIsImdldFVybFBhcmFtcyIsInQiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwidXNlcklkIiwidG9rZW4iLCJlcnJvcnMiLCJBcnJheSIsImlzQXJyYXkiLCJhZGRFbGVtZW50Iiwic2VuZCIsImNvbnNvbGUiLCJlcnJvciIsImhlbGxvRGV2IiwiZGF0YSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUxvY2FseSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpIiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwic2V0QXR0cmlidXRlIiwiaW5uZXJIVE1MIiwiYXBwZW5kQ2hpbGQiLCJsb2ciLCJ1cGRhdGVBY2NvdW50TGluayIsImxpbmsiLCJzZWFyY2giLCJwYXJhbWV0ZXJzIiwic3BsaXQiLCJwYXJhbSIsImRlY29kZVVSSSIsImdldENvbmZpZyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib25sb2FkIiwib25lcnJvciIsInN0YXR1c1RleHQiLCJnZXRUaW1lRGlmZmVyZW5jZSIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0IiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwic2V0U2Vzc2lvbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsIm5vdyIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInRpbWVEaWZmZXJlbmNlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50IiwiaW5kZXhPZiJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2xGQSxJQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsbUNBQUQsQ0FBckI7O0FBQ0EsSUFBTUMsY0FB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RCxxQkFBRyxDQUFDd0QsT0FBSixHQUFjO0FBQUEsMkJBQU1GLE1BQU0sQ0FBQ3RELEdBQUcsQ0FBQ3lELFVBQUwsQ0FBWjtBQUFBLG1CQUFkOztBQUNBekQscUJBQUcsQ0FBQ2dCLElBQUo7QUFDSDtBQUNKO0FBQ0osYUF0RU0sQ0FGaUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSDs7QUFBQSxrQkFBWi9CLFlBQVk7QUFBQTtBQUFBO0FBQUEsR0FBbEIsQyxDQTBFUDs7QUFDQSxJQUFNK0YsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQnpGLE9BQWpCLEVBQTBCMEYsU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUN4SywyREFBTyxDQUFDOEUsT0FBRCxDQUFYLEVBQ0lELG9FQUFVLENBQUMsU0FBRCxFQUFZQyxPQUFaLENBQVY7QUFDSixNQUFHLENBQUM5RSwyREFBTyxDQUFDd0ssU0FBRCxDQUFYLEVBQ0kzRixvRUFBVSxDQUFDLEtBQUQsRUFBUTJGLFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQ3hLLDJEQUFPLENBQUN1SyxjQUFELENBQVgsRUFDSW5GLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsTUFBaEIsQ0FBdUJpRixjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL3N1YnNjcmliZVZhbGlkYXRpb24uYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvc3Vic2NyaWJlVmFsaWRhdGlvbi5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJ3aWtpbGVybmlcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaSAobG9jYWwpXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIldMXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCxcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAyLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL2dldHJhbmRvbVwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICByZWdlbmVyYXRlSFRNTDogXCIvaHRtbHJlZ2VuZXJhdGVkXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG4gICAgLy8gSlNPTiBhbmQgSFRNTCBkaXJcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsICBcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZSA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZSA6IFwicXVpelwiLC8vcG91ciB1cmwgcGFnZVxuICAgIGRpcldlYlRhZ3MgOiBcInF1aXpzXCIsLy8gaWRlbVxuICAgIG5iUmFuZG9tUmVzdWx0cyA6IDMvLyBsaW1pdGUgbGVzIHLDqXN1bHRhdCBkdSBtb3RldXIgZGUgcmVjaGVyY2hlIHF1YW5kIGRlbWFuZGUgZGUgcsOpc3VsdGF0cyBhdSBoYXNhcmRcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogV2lraXDDqWRpYSBlbiBxdWVzdGlvbnNcIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJBdmVjIFdpa2lMZXJuaSwgcmVjZXZleiBjaGFxdWUgam91ciBkZSBub3V2ZWF1eCBxdWl6cyBwb3VyIHRlc3RlciB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3Nlcy5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGFsZXJ0TmV3V2luZG93OiBcIm5vdXZlbGxlIGZlbsOqdHJlXCIsXG4gICAgYnRuTGlua1RvUXVlc3Rpb25uYWlyZSA6IFwiQWxsZXIgYXUgcXVpeiAhXCIsXG4gICAgc3RhdHNBZG1pbiA6IFwiRHVyYW50IGxlcyBkZXJuacOocmVzIDI0aCA6IE5CX1VTRVJTXzI0SCBjb21wdGVzIG9udCDDqXTDqSBjcsOpw6lzLCBOQl9TVUJTQ1JJUFRJT05TXzI0SCB2YWxpZMOpcyBldCBOQl9VU0VSU19ERUxFVEVEXzI0SCBzdXBwcmltw6lzLiBOQl9BTlNXRVJTXzI0SCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5FbiB0b3V0LCBpbCB5IGEgOiBOQl9VU0VSU19UT1QgY29tcHRlcywgZG9udCBOQl9TVUJTQ1JJUFRJT05TX1RPVCB2YWxpZMOpcyBldCBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gY29tcHRlcyBwcsOpbWl1bS4gTkJfQU5TV0VSU19UT1QgcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+UGFybWkgbGVzIE5CX1VTRVJTX0RFTEVURURfVE9UIGNvbXB0ZXMgc3VwcHJpbcOpcywgTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIGF2YWllbnQgdmFsaWTDqSBsZXVyIGNvbXB0ZSBldCBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gYXZhaWVudCBzb3VzY3JpdCB1biBjb21wdGUgcHLDqW1pdW0uXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5vdEZvdW5kOiBcIkwndXRpbGlzYXRldXIgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWROYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdOYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgNzAgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEVtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB2b3RyZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBuZWVkVW5pcXVlRW1haWw6IFwiTCdhZHJlc3NlIGUtbWFpbCBxdWUgdm91cyBhdmV6IHNhaXNpZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwYXIgdW4gYXV0cmUgdXRpbGlzYXRldXIuIFNpIHZvdXMgYXZleiBkw6lqw6AgdW4gY29tcHRlLCA8YSBocmVmPScvI1VSTCc+Y2xpcXVlei1pY2kgcG91ciB2b3VzIGNvbm5lY3RlcjwvYT4uXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdW5lIGFkcmVzc2UgZS1tYWlsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlLlwiLFxuICAgIG5lZWRMb25nUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlIGQnYXUgbW9pbnMgTUlOX0xFTkdUSCBjYXJhY3TDqHJlcy5cIixcbiAgICBwYXNzd29yZENvcGllZDogXCJMZSBtb3QgZGUgcGFzc2UgZ8OpbsOpcsOpIGEgw6l0w6kgY29wacOpIGRhbnMgdm90cmUgcHJlc3NlLXBhcGllci4gVm91cyBwb3V2ZXogbGUgcmVjb3BpZXIgKEN0cmwrVikgb8O5IHZvdXMgbGUgc291aGFpdGV6LlwiLFxuICAgIG5lZWRTdGF0dXMgOiBcIklsIG1hbnF1ZSBsZSBzdGF0dXQuXCIsXG4gICAgbmVlZExhbmd1YWdlIDogXCJJbCBtYW5xdWUgbGUgY29kZSBsYW5ndWUuXCIsXG4gICAgbmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIDogXCJMYSBkYXRlIGRlIGRlcm5pw6hyZSBjb25uZXhpb24gbidlc3QgcGFzIHZhbGlkZS5cIixcbiAgICBuZWVkU01UUCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkU01UUE5vdEZvdW5kIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRLbm93TmV3c2xldHRlck9rIDogXCJJbCBmYXV0IHNhdm9pciBzaSBsJ3V0aWxpc2F0ZXVyIGFjY2VwdGUgb3UgcmVmdXNlIGRlIHJlY2V2b2lyIGxhIG5ld3NsZXR0ZXIuXCIsXG4gICAgbmVlZFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGNvbm5hw650cmUgbGUgbm9tYnJlIGRlIG1pbnV0ZXMgZHUgZMOpY2FsYWdlIGhvcmFpcmUuXCIsXG4gICAgbmVlZE1pblRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgZW5sZXZlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA3MjAuXCIsXG4gICAgbmVlZE1heFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgYWpvdXRlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA4NDAuXCIsXG4gICAgbmVlZFVHQ09rIDogXCJWb3VzIGRldmV6IGFjY2VwdGVyIGxlcyBDR1UgcG91ciBwb3V2b2lyIGNyw6llciB2b3RyZSBjb21wdGUuIFwiLFxuICAgIGdvZGZhdGhlck5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIG4nYSDDqXTDqSB0cm91dsOpIHBvdXIgY2UgY29kZSBwYXJyYWluLlwiLFxuICAgIGdvZGZhdGhlckZvdW5kOiBcIlZvdHJlIHBhcnJhaW4gYSBiaWVuIMOpdMOpIHRyb3V2w6kgIVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBpbnNjcmlwdGlvbiBlc3QgYmllbiBlbnJlZ2lzdHLDqWUuXFxuUG91ciBsYSBmaW5hbGlzZXIsIG1lcmNpIGRlIGNsaXF1ZXIgZGFucyBsZXMgMjRIIHN1ciBsZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvblwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1R4dCA6IFwiVmFsaWRlciBtb24gY29tcHRlLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24sIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24sIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gY2ktZGVzc291cyBkYW5zIGxlcyAyNGguPC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUxpbmtUeHQgOiBcIk1lIGNvbm5lY3RlciDDoCBtb24gY29tcHRlLlwiLFxuICAgIG1haWxXZWxjb21lQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuVm91cyB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLiBNZXJjaSBldCBiaWVudmVudWUgIVxcblxcblNpIHZvdXMgYXZleiBsYSBtb2luZHJlIHF1ZXN0aW9uIG91IHN1Z2dlc3Rpb24gY29uY2VybmFudCBOT01fU0lURSwgbidow6lzaXRleiBwYXMgw6AgbWUgY29udGFjdGVyIGVuIMOpY3JpdmFudCDDoCBFTUFJTC5cXG5cXG5KZSB2b3VzIGNvbnNlaWxsZSBkJ2FpbGxldXJzIGQnYWpvdXRlciBFTUFJTCDDoCB2b3RyZSBjYXJuZXQgZCdhZHJlc3NlcyBwb3VyIMOpdml0ZXIgcXVlIGxlcyBwcm9jaGFpbnMgZW52b2lzIGR1IHNpdGUgbidhcnJpdmVudCBlbiBcXFwic3BhbVxcXCIuXFxuXFxuUGFyIGFpbGxldXJzLCBwb3VyIGfDqXJlciB2b3RyZSBhYm9ubmVtZW50LCBhY2PDqWRlciDDoCB2b3MgaW5mb3JtYXRpb25zIG91IGVuY29yZSBjaGVyY2hlciBwbHVzIGZhY2lsZW1lbnQgcGFybWkgbGVzIHF1aXpzIGR1IHNpdGUsIHZvdXMgcG91dmV6IMOgIHRvdXQgbW9tZW50IHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSB1dGlsaXNhdGV1ci5cXG5cXG5Qb3VyIGNlIGZhaXJlLCB1dGlsaXNleiBsZSBsaWVuIHN1aXZhbnQgOiBMSU5LX1VSTFxcblxcbkVuY29yZSBtZXJjaSBldCDDoCBiaWVudMO0dC5cIixcbiAgICBtYWlsV2VsY29tZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3VzIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPjxicj5TaSB2b3VzIGF2ZXogbGEgbW9pbmRyZSBxdWVzdGlvbiBvdSBzdWdnZXN0aW9uIGNvbmNlcm5hbnQgTk9NX1NJVEUsIG4naMOpc2l0ZXogcGFzIMOgIG1lIGNvbnRhY3RlciBlbiDDqWNyaXZhbnQgw6AgPGI+RU1BSUw8L2I+Ljxicj48YnI+SmUgdm91cyBjb25zZWlsbGUgZCdhaWxsZXVycyBkJ2Fqb3V0ZXIgPGI+RU1BSUw8L2I+IMOgIHZvdHJlIGNhcm5ldCBkJ2FkcmVzc2VzIHBvdXIgw6l2aXRlciBxdWUgbGVzIHByb2NoYWlucyBlbnZvaXMgZHUgc2l0ZSBuJ2Fycml2ZW50IGVuIDxpPnNwYW08L2k+Ljxicj48YnI+UGFyIGFpbGxldXJzLCBwb3VyIGfDqXJlciB2b3RyZSBhYm9ubmVtZW50LCBhY2PDqWRlciDDoCB2b3MgaW5mb3JtYXRpb25zIG91IGVuY29yZSBjaGVyY2hlciBwbHVzIGZhY2lsZW1lbnQgcGFybWkgbGVzIHF1aXpzIGR1IHNpdGUsIHZvdXMgcG91dmV6IMOgIHRvdXQgbW9tZW50IHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSB1dGlsaXNhdGV1ci48YnI+PGJyPlBvdXIgY2UgZmFpcmUsIHV0aWxpc2V6IGxlIGxpZW4gY2ktZGVzc291cy48YnI+PGJyPkVuY29yZSBtZXJjaSBldCDDoCBiaWVudMO0dC5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IDogXCJNZXJjaSAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyTGlua1R4dCA6IFwiTWUgY29ubmVjdGVyIMOgIG1vbiBjb21wdGUuXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuR3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS48L3A+PHA+TWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBjb25maXJtYXRpb24gbmUgc2VtYmxlIHBhcyB2YWxpZGUgb3UgYmllbiBpbCBhIGV4cGlyw6kuIFZvdXMgcG91dmV6IGVuIHJlY2V2b2lyIHVuIG5vdXZlYXUgPGEgaHJlZj0nI1VSTCc+ZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICBlbWFpbE5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIHRyb3V2w6kgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBhbHJlYWR5Q29ubmVjdGVkOiBcIlZvdXMgw6p0ZXMgZMOpasOgIGNvbm5lY3TDqShlKSBhdSBzaXRlICFcIixcbiAgICBuZWVkQmVDb25uZWN0ZWQ6IFwiVm91cyBkZXZleiDDqnRyZSBjb25uZWN0w6koZSkgcG91ciBhY2PDqWRlciDDoCBjZXR0ZSBwYWdlLlwiLFxuICAgIGNvbm5lY3Rpb25PazogXCJDb25uZXhpb24gcsOpdXNzaWUuXCIsXG4gICAgbmVlZENob29zZUxvZ2luV2F5OiBcIlZvdXMgZGV2ZXogc29pdCBzYWlzaXIgdm90cmUgbW90IGRlIHBhc3NlLCBzb2l0IGNvY2hlciBsYSBjYXNlIHZvdXMgcGVybWV0dGFudCBkZSByZWNldm9pciB1biBsaWVuIGRlIGNvbm5leGlvbiBwYXIgZS1tYWlsLlwiLFxuICAgIG5lZWRWYWxpZGF0aW9uVG9Mb2dpbiA6IFwiVm91cyBkZXZleiBkJ2Fib3JkIHZhbGlkZXIgdm90cmUgY29tcHRlIGF2YW50IGRlIHZvdXMgY29ubmVjdGVyLiBQb3VyIGNlIGZhaXJlLCB1biBsaWVuIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIHRvb01hbnlMb2dpbkZhaWxzIDogXCJUcm9wIGRlIHRlbnRhdGl2ZXMgZGUgY29ubmV4aW9uIGluZnJ1Y3R1ZXVzZXMgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC4gVm91cyBkZXZleiBhdHRlbmRyZSBNSU5VVEVTIG1pbnV0ZXMgcG91ciBlc3NheWVyIGRlIG5vdXZlYXUuXCIsXG4gICAgYmFkUGFzc3dvcmQ6IFwiTGUgbW90IGRlIHBhc3NlIG4nZXN0IHBhcyBsZSBib24uXCIsXG4gICAgbWFpbExvZ2luTGlua1N1YmplY3QgOiBcIlZvdHJlIGxpZW4gZGUgY29ubmV4aW9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtUeHQgOiBcIk1lIGNvbm5lY3Rlci5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsTG9naW5MaW5rQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1biBmb3JtYXQgY29ycmVjdC5cIixcbiAgICB1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIHNhaXNpZSAoTkVXX0VNQUlMKSBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGF1dHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5TdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua1R4dCA6IFwiVmFsaWRlci5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCBjbGlxdWV6IHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMgc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rVHh0IDogXCJDb25maXJtZXIuXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgY29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxEZWxldGVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciBjb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMgc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxEZWxldGVMaW5rTWVzc2FnZTogXCJWb3RyZSBkZW1hbmRlIGRlIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuIE1lcmNpIGRlIGNsaXF1ZXIgc2FucyB0YXJkZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsIHBvdXIgY29uZmlybWVyLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZTogXCJMJ3V0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2U6IFwiVGVudGF0aXZlIGRlIHN1cHByZXNzaW9uIGQndW4gdXRpbGlzYXRldXIgaW5leGlzdGFudCA6IFwiLFxuICAgIG1haWxEZWxldGVMaW5rT2tNZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLiBNZXJjaSBkJ2F2b2lyIHV0aWxpc8OpIG5vcyBzZXJ2aWNlcy5cIixcbiAgICBtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgc3VwcHJlc3Npb24gbidlc3QgcGFzIHZhbGlkZSBvdSBhbG9ycyBpbCBuJ2VzdCBwbHVzIHZhbGFibGUuXCIsXG4gICAgY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgbm9uIHZhbGlkw6lzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIGRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBpbmFjdGlmcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICB3ZWxjb21lTWVzc2FnZTogXCJCaWVudmVudWUgI05BTUUgIVwiLFxuICAgIGJ5ZWJ5ZU1lc3NhZ2U6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgZMOpY29ubmV4aW9uIHMnZXN0IGJpZW4gZMOpcm91bMOpZS48YnI+w4AgYmllbnTDtHQgIVwiLFxuICAgIGluZm9zVXNlckZvckFkbWluOiBcIkNldCB1dGlsaXNhdGV1ciAoaWQ6IElEX1VTRVIpIGEgPGI+Y3LDqcOpIHNvbiBjb21wdGUgbGUgREFURV9DUkVBPC9iPiwgbGEgZGVybmnDqHJlIG1pc2Ugw6Agam91ciBkYXRhbnQgZHUgREFURV9VUERBVEUuPGJyPjxiPkRhdGUgZGUgc2EgZGVybmnDqHJlIGNvbm5leGlvbiA6IERBVEVfQ09OTkVDVElPTi48L2I+XCIsXG4gICAgaW5mb3NBZG1pbkdvZGZhdGhlcjogXCJDZXQgdXRpbGlzYXRldXIgYSDDqXTDqSBwYXJyYWluw6kgcGFyIFwiLFxuICAgIGluZm9zQWRtaW5OYkdvZENoaWxkczogXCJTZXMgI05CIGZpbGxldWlscyA6IFwiXG59OyIsIi8vIFF1ZWxxdWVzIGZvbmN0aW9ucyB1dGlsZXMgcG91ciBsZXMgY2hhw65uZXNcblxuY2xhc3MgVG9vbFxue1xuICAgIHN0YXRpYyBpc0VtcHR5KG15VmFyKVxuICAgIHtcbiAgICAgICAgaWYobXlWYXI9PT11bmRlZmluZWQgfHwgbXlWYXI9PT1udWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlWYXIrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlWYXI9bXlWYXIudHJpbSgpO1xuICAgICAgICAgICAgaWYobXlWYXI9PT1cIlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgdHJpbUlmTm90TnVsbChteVN0cmluZylcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShteVN0cmluZykpXG4gICAgICAgICAgICBteVN0cmluZz1udWxsO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgc2hvcnRlbklmTG9uZ2VyVGhhbihteVN0cmluZywgbWF4KVxuICAgIHtcbiAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gYXUgY2FzIG/DuSBjZWxhIG5lIHNlcmFpdCBwYXMgdW5lIGNoYcOubmUuLi5cbiAgICAgICBpZihteVN0cmluZy5sZW5ndGggPiBtYXgpXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy5zdWJzdHJpbmcoMCwgKG1heC0zKSkrXCIuLi5cIjtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE1NjA0MTQwL3JlcGxhY2UtbXVsdGlwbGUtc3RyaW5ncy13aXRoLW11bHRpcGxlLW90aGVyLXN0cmluZ3NcbiAgICBzdGF0aWMgcmVwbGFjZUFsbChteVN0cmluZywgbWFwT2JqKVxuICAgIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZUVsdHMgPSBuZXcgUmVnRXhwKE9iamVjdC5rZXlzKG1hcE9iaikuam9pbihcInxcIiksXCJnaVwiKTtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nLnJlcGxhY2UocmVwbGFjZUVsdHMsIChtYXRjaGVkKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbWFwT2JqW21hdGNoZWRdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PYmpldHNfZ2xvYmF1eC9NYXRoL3JhbmRvbVxuICAgIHN0YXRpYyBnZXRSYW5kb21JbnQobWluLCBtYXgpXG4gICAge1xuICAgICAgICBtaW4gPSBNYXRoLmNlaWwobWluKTtcbiAgICAgICAgbWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluO1xuICAgIH1cblxuICAgIC8vIMOgIGNvbXBsw6l0ZXIgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EYXRlX2Zvcm1hdF9ieV9jb3VudHJ5XG4gICAgc3RhdGljIGRhdGVGb3JtYXQoZGF0ZVN0cmluZywgbGFuZz1cImZyXCIpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkoZGF0ZVN0cmluZykpXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG15RGF0ZT1uZXcgRGF0ZShkYXRlU3RyaW5nKTtcbiAgICAgICAgbGV0IG15RGF5PW15RGF0ZS5nZXREYXRlKCkrXCJcIjtcbiAgICAgICAgaWYobXlEYXkubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15RGF5PVwiMFwiK215RGF5O1xuICAgICAgICBsZXQgbXlNb3VudGg9KG15RGF0ZS5nZXRNb250aCgpKzEpK1wiXCI7XG4gICAgICAgIGlmKG15TW91bnRoLmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteU1vdW50aD1cIjBcIitteU1vdW50aDtcbiAgICAgICAgbGV0IG15WWVhcj1teURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgaWYobGFuZz09PVwiZnJcIilcbiAgICAgICAgICAgIHJldHVybiBteURheStcIi9cIitteU1vdW50aCtcIi9cIitteVllYXI7XG4gICAgICAgIGVsc2UgaWYgKGxhbmc9PT1cImZvcm1cIikvLyAyMDE0LTAyLTA5XG4gICAgICAgICAgICByZXR1cm4gbXlZZWFyK1wiLVwiK215TW91bnRoK1wiLVwiK215RGF5O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbXlNb3VudGgrXCIvXCIrbXlEYXkrXCIvXCIrbXlZZWFyO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUb29sOyIsInZhciBtYXAgPSB7XG5cdFwiLi9kZWZhdWx0L2NvbmZpZy9mci5qc1wiOiBcIi4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCIsXG5cdFwiLi93aWtpbGVybmkvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3Mvd2lraWxlcm5pL2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaHRtbFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIgfSB9LFxuICAgIF0sXG4gICAgZm9vdExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVS5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NndS5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlYuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3YuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgXSxcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogMTAsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCIsXG4gICAgc2l0ZVNsb2dhbjogXCJDdWx0aXZvbnMgbm90cmUgamFyZGluICFcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgZGUgbm91dmVsbGVzIGNob3Nlcy48YnI+RGVzIGFydGljbGVzIGRlIFdpa2lww6lkaWEgc29udCBzw6lsZWN0aW9ubsOpcyBwb3VyIHZvdXMgZXQgc29udCBzdWl2aXMgZCd1biBxdWl6IHZvdXMgcGVybWV0dGFudCBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUuPGJyPkRlIGpvdXIgZW4gam91ciBkZSBub3V2ZWxsZXMgZ3JhaW5lcyBkZSBzYXZvaXIgc29udCBhaW5zaSBzZW3DqWVzIGRhbnMgdm90cmUgXFxcImphcmRpblxcXCIuXCIsXG4gICAgaG9tZVRpdGxlMjogXCJMYSBjdWx0dXJlIGVuIGxpYmVydMOpXCIsXG4gICAgaG9tZVAyOiBcIlRvdXQgY29tbWUgc3VyIFdpa2lww6lkaWEgKCopLCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHBhcnRhZ8OpIHN1ciBXaWtpTGVybmkgc29udCBsaWJyZXMuPGJyPlZvdXMgcG91dmV6IGxlcyB1dGlsaXNlciwgbGVzIG1vZGlmaWVyIGV0IGxlcyBkaWZmdXNlciBzZWxvbiB2b3RyZSBzb3VoYWl0Ljxicj5TdXIgV2lraUxlcm5pLCBwYXMgZGUgcHVibGljaXTDqSwgbmkgZGUgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcy48YnI+Vm91cyBwb3V2ZXogdmVuaXIgeSBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLjxicj48YnI+PHNtYWxsPjxlbT4oKikgQmllbiBxdWUgcGFydGFnZWFudCBzZXMgdmFsZXVycywgV2lraUxlcm5pIGVzdCB1biBwcm9qZXQgaW5kw6lwZW5kYW50IGRlIGxhIGZvbmRhdGlvbiBXaWtpcMOpZGlhLjwvZW0+PC9zbWFsbD5cIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkxlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pXCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNJbnRybzogXCJMaXN0ZSBkZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaS5cIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmkgP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIkxlIHByaW5jaXBlIGVzdCBzaW1wbGUgOiB2b3VzIGNvbW1lbmNleiBwYXIgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6kuPGJyPlB1aXMgdm91cyBhZmZpY2hlciBsZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IGRlIHZvdHJlIGxlY3R1cmUuIFZvdXMgb2J0ZW5leiBhbG9ycyB2b3RyZSByw6lzdWx0YXQgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5Ub3V0ZXMgbGVzIHLDqXBvbnNlcyBzZSB0cm91dmVudCBkYW5zIGwnYXJ0aWNsZSBwcm9wb3PDqSDDoCBsYSBsZWN0dXJlLiA8Yj5Wb3VzIMOqdGVzIGljaSBwb3VyIGFwcHJlbmRyZSBkZSBub3V2ZWxsZXMgY2hvc2VzPC9iPiwgbWFpcyBsaWJyZSDDoCB2b3VzIGQnZXNzYXllciBkJ3kgcsOpcG9uZHJlIGltbcOpZGlhdGVtZW50Ljxicj48YnI+UXVhbmQgbGUgc3VqZXQgcyd5IHByw6p0ZSwgbmUgdm91cyDDqXRvbm5leiBwYXMgc2kgY2VydGFpbmVzIGRlcyByw6lwb25zZXMgcHJvcG9zw6llcyBwZXV2ZW50IMOqdHJlIHVuIHBldSBkw6ljYWzDqWVzLCBhYnN1cmRlcy4uLiBPbiBwZXV0IGFwcHJlbmRyZSBhdmVjIGxlIHNvdXJpcmUsIG5vbiA/IDotKTxicj48YnI+VW5lIGZvaXMgdm90cmUgcsOpc3VsdGF0IG9idGVudSwgaWwgdm91cyBzZXJhIHByb3Bvc8OpIGRlIGNyw6llciB1biBjb21wdGUgcG91ciBsZSBzYXV2ZWdhcmRlci48YnI+Q2UgY29tcHRlIHZvdXMgcGVybWV0dHJhIGRlIHRlc3RlciBkZSBub3V2ZWF1IGNlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgcGx1c2lldXJzIGpvdXJzLCBzZW1haW5lcywgbW9pcy4uLiBFdCBkZSByZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIHN1Z2dlc3Rpb25zIGRlIGxlY3R1cmVzLjxicj48YnI+TWFpcyA8Yj5sYSBjcsOpYXRpb24gZGUgY2UgY29tcHRlIGVzdCBmYWN1bHRhdGl2ZTwvYj4gZXQgPGEgaHJlZj0nL3F1aXpzLycgdGl0bGU9J0xlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyc+dm91cyBwb3V2ZXogcGFyY291cmlyIFdpa2lMZXJuaSBsaWJyZW1lbnQ8L2E+LlwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG4gICAgdGFnc0xpc3RUeHQ6IFwiUGFyY291cmlyIGxlcyBydWJyaXF1ZXMgOlwiLFxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiUGFyY291cmlyXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9xdWl6cy9cIiwgaWQ6XCJpbmRleEhlYWRMaW5rXCIsIHRpdGxlOlwiTGVzIGRlcm5pZXJzIHF1aXpzXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaHRtbFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiIH0gfVxuICAgIF0sXG4gICAgZm9vdExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQmxvZ1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCJodHRwczovL2ZyYW1hc3BoZXJlLm9yZy9wZW9wbGUvN2U1NGI3YTBiNTMyMDEzODllZWYyYTAwMDAwNTM2MjVcIiwgdGl0bGU6XCJCbG9nIFdpa2lMZXJuaSBzdXIgZGlhc3BvcmEqXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNHViAmIENHVVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvQ0dWLUNHVS5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfVxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNTaXRlSG9tZVBhZ2U6IDMsXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDksXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDMsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgdmFsaWRhdGlvbkxpbmtQYWdlIDogXCJ2YWxpZGF0aW9uLmh0bWw/dD1cIixcbiAgICBsb2dpbkxpbmtQYWdlIDogXCJsb2dpbi5odG1sP3Q9XCIsXG4gICAgbmV3TG9naW5MaW5rUGFnZSA6IFwibmV3bG9naW4uaHRtbD90PVwiLFxuICAgIGRlbGV0ZUxpbmtQYWdlIDogXCJhdXJldm9pci5odG1sP3Q9XCIsXG4gICAgc3RvcE1haWxQYWdlIDogXCJzdG9wLW1haWwuaHRtbD90PVwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgdXBkYXRlQWNjb3VudFBhZ2U6IFwibW9uLWNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBhYm91dFBhZ2U6IFwiYS1wcm9wb3MuaHRtbFwiLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVQYWdlVHh0OiBcIlBhZ2UgZCdhY2N1ZWlsXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSA8c3BhbiBjbGFzcz0ncG9zdHNjcmlwdHVtJz4oKik8L3NwYW4+LCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHBhcnRhZ8OpIHN1ciBXaWtpTGVybmkgc29udCBsaWJyZXMuPGJyPlZvdXMgcG91dmV6IGxlcyB1dGlsaXNlciwgbGVzIG1vZGlmaWVyIGV0IGxlcyBkaWZmdXNlciBzZWxvbiB2b3RyZSBzb3VoYWl0Ljxicj5TdXIgV2lraUxlcm5pLCBwYXMgZGUgcHVibGljaXTDqSwgbmkgZGUgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcy48YnI+Vm91cyBwb3V2ZXogdmVuaXIgeSBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLjxicj48YnI+PHNwYW4gY2xhc3M9J3Bvc3RzY3JpcHR1bSc+KCopIEJpZW4gcXVlIHBhcnRhZ2VhbnQgc2VzIHZhbGV1cnMsIFdpa2lMZXJuaSBlc3QgdW4gcHJvamV0IGluZMOpcGVuZGFudCBkZSBsYSBmb25kYXRpb24gV2lraXDDqWRpYS48L3NwYW4+XCIsXG4gICAgaG9tZUJ0bkFib3V0VHh0OiBcIkVuIHNhdm9pciBwbHVzIHN1ciBXaWtpTGVybmkgIVwiLFxuICAgIGhvbWVCdG5TdWJzY3JpYmVUeHQ6IFwiVGVzdGVyIFdpa2lMZXJuaSBncmF0dWl0ZW1lbnQuXCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNUaXRsZTogXCJMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiTGlzdGUgZGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmkuXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5pID9cIixcbiAgICBleHBsYW5hdGlvblR4dDogXCJMZSBwcmluY2lwZSBlc3Qgc2ltcGxlIDogdm91cyBjb21tZW5jZXogcGFyIGxpcmUgbCdhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpLjxicj5QdWlzIHZvdXMgYWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlLiBWb3VzIG9idGVuZXogYWxvcnMgdm90cmUgcsOpc3VsdGF0IGltbcOpZGlhdGVtZW50Ljxicj48YnI+U3VpdmFudCBsZXMgcXVlc3Rpb25zLCB1bmUgb3UgcGx1c2lldXJzIHLDqXBvbnNlcyBwZXV2ZW50IMOqdHJlIGNvcnJlY3RlcyBldCBkb2l2ZW50IGRvbmMgw6p0cmUgY29jaMOpZXMuIDxiPkMnZXN0IHRvdWpvdXJzIGxlIGNvbnRlbnUgZGUgbCdhcnRpY2xlIFdpa2lww6lkaWEgcXVpIGZhaXQgZm9pIGNvbmNlcm5hbnQgbGVzIFxcXCJib25uZXNcXFwiIHLDqXBvbnNlczwvYj4uIE1haXMgbGVzIGFydGljbGVzIGRlIFdpa2lww6lkaWEgcGV1dmVudCDDqXZvbHVlciwgZG9uYyBuJ2jDqXNpdGV6IHBhcyA8YSBocmVmPScvY29udGFjdC5odG1sJz7DoCBtZSBzaWduYWxlciB1bmUgZXJyZXVyPC9hPi48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXMsIG1haXMgbGlicmUgw6Agdm91cyBkJ2Vzc2F5ZXIgZCd5IHLDqXBvbmRyZSBpbW3DqWRpYXRlbWVudDwvYj4uPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLiBDZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgPGI+dGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpejwvYj4gcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgcGx1c2lldXJzIGpvdXJzLCBzZW1haW5lcywgbW9pcy4uLiBHcsOiY2Ugw6AgY2UgY29tcHRlLCB2b3VzIHBvdXJyZXogYXVzc2kgPGI+cmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlYXV4IHF1aXpzPC9iPiBwb3VyIGNvbnRpbnVlciDDoCBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIi48YnI+PGJyPk1haXMgPGI+bGEgY3LDqWF0aW9uIGRlIGNlIGNvbXB0ZSBlc3QgZmFjdWx0YXRpdmU8L2I+IGV0IDxhIGhyZWY9Jy9xdWl6cy8nIHRpdGxlPSdMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMnPnZvdXMgcG91dmV6IHBhcmNvdXJpciBXaWtpTGVybmkgbGlicmVtZW50PC9hPi5cIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxuICAgIG5ld3NMaXN0VGl0bGU6IFwiTGVzIGRlcm5pw6hyZXMgZ3JhaW5lcyBkZSBzYXZvaXJcIixcbiAgICB0YWdzTGlzdFR4dDogXCJQYXJjb3VyaXIgbGVzIHJ1YnJpcXVlc1wiLFxuICAgIG1haWxSZWNpcGllbnRUeHQ6IFwiTWVzc2FnZSBlbnZvecOpIMOgIDpcIixcbn07IiwiLy8gLS0gUEFHRSBQRVJNRVRUQU5UIERFIFZBTElERVIgTEEgQ1LDiUFUSU9OIERFIFNPTiBDT01QVEVcblxuLy8vIFVuIHRva2VuIGVzdCB0cmFuc21pcyBlbiBwYXJhbcOodHJlIGRlIGwnVXJsLiBJbCBhIHVuZSB2YWxpZGl0w6kgbGltaXTDqSBkYW5zIGxlIHRlbXBzLlxuLy8vIFNpIGxlIHRva2VuIG4nZXN0IHBhcy9wbHVzIHZhbGlkZSwgb24gcmVkaXJpZ2UgbCd1dGlsaXNhdGV1ciB2ZXJzIGxhIHBhZ2UgZGUgY29ubmV4aW9uIHBvdXIgb2J0ZW5pciB1biBub3V2ZWF1IGxpZW4uXG4vLy8gU2kgbGUgdG9rZW4gZXN0IG9rLCBvbiBsJ2luZm9ybWUgcXVlIHRvdXQgZXN0IG9rIGV0IGx1aSBwcm9wb3NlIGRlIHNlIGNvbm5lY3Rlci5cbi8vLyBTaSBsJ3V0aWxpc2F0ZXVyIGEgZMOpasOgIHVuZSBzZXNzaW9uIGFjdGl2ZSB2YWxpZGUsIGMnZXN0IHF1J2lsIGEgZMOpasOgIGNsaXF1w6kgc3VyIGxlIGxpZW4uIE9uIGxlIHJlZGlyaWdlIHZlcnMgc2EgcGFnZSBkJ2FjY3VlaWwuXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiB0aXLDqXMgZHUgYmFja2VuZCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmltcG9ydCB7IGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi9jb25maWcvdXNlcnMuanNcIjtcbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG4vLyBJbXBvcnRhdGlvbiBkZXMgZm9uY3Rpb25zIHV0aWxlcyBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgYWRkRWxlbWVudCB9IGZyb20gXCIuL3Rvb2xzL2RvbS5qc1wiO1xuaW1wb3J0IHsgaGVsbG9EZXYgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tIFwiLi90b29scy91cmwuanNcIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5cbmNvbnN0IGRpdlJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcblxuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICAvLyBzaSBsJ3V0aWxpc2F0ZXVyIGVzdCBkw6lqw6AgY29ubmVjdMOpLCBwYXMgbGEgcGVpbmUgZCdhbGxlciArIGxvaW4gOlxuICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oKTtcbiAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIHsgbWVzc2FnZTogdHh0VXNlcnMuYWxyZWFkeUNvbm5lY3RlZCwgY29sb3I6XCJpbmZvcm1hdGlvblwiIH0pO1xuICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgY29uc3QgaG9tZVBhZ2U9dXNlci5zdGF0dXMrXCJIb21lUGFnZVwiOy8vIGxvcnMgZGUgbGEgY3LDqWF0aW9uLCBzZXVsIGxlIHN0YXR1dCAndXNlclwiIGVzdCBwb3NzaWJsZVxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZGF0YXM9Z2V0VXJsUGFyYW1zKCk7XG4gICAgICAgICAgICBpZihkYXRhcyAmJiBkYXRhcy50IT09dW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZStkYXRhcy50KTtcbiAgICAgICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS51c2VySWQgIT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlLnRva2VuICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLnZhbGlkYXRpb25NZXNzYWdlLCBjb2xvcjpcInN1Y2Nlc3NcIiB9KTsvLyBwb3VyIGwnYWZmaWNoZXIgc3VyIGxhIHBhZ2Ugc3VpdmFudGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ1RlbXBsYXRlLmNvbm5lY3Rpb25QYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSA0MDQpICYmIHJlc3BvbnNlLmVycm9ycyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0VXNlcnMuYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ1RlbXBsYXRlLmNvbm5lY3Rpb25QYWdlKSwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7XG5oZWxsb0RldigpOyIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcbiBMZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgc2VyYSBiaWVudMO0dCBsaXNpYmxlIHN1ciBHaXRsYWIuXFxuIFBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gcsOpY3Vww6lyYW50IGxlcyBwYXJhbcOodHJlcyBwYXNzw6lzIHBhciBsJ3VybFxuZXhwb3J0IGNvbnN0IGdldFVybFBhcmFtcyA9ICgpID0+XG57XG4gICAgaWYoaXNFbXB0eShsb2NhdGlvbi5zZWFyY2gpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gICAgaWYoIUFycmF5LmlzQXJyYXkocGFyYW1ldGVycykgfHwgcGFyYW1ldGVycy5sZW5ndGg9PT0wKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgIGxldCBwYXJhbSwgZGF0YXM9e307XG4gICAgZm9yKGxldCBpIGluIHBhcmFtZXRlcnMpXG4gICAge1xuICAgICAgICBwYXJhbSA9IHBhcmFtZXRlcnNbaV0uc3BsaXQoXCI9XCIpO1xuICAgICAgICBpZihwYXJhbS5sZW5ndGg9PT0yKVxuICAgICAgICAgICAgZGF0YXNbcGFyYW1bMF1dPWRlY29kZVVSSShwYXJhbVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK1wiL3VzZXIvZ2V0Y29uZmlnXCIpO1xuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIC8vIG11bHRpcGxpZXIgcGFyIC0xLCBjYXIgYydlc3QgY2UgcXUnaWwgZmF1dCBcImFqb3V0ZXJcIiDDoCBsJ2hldXJlIFVUQyBwb3VyIHJldmVuaXIgZW4gaGV1cmUgbG9jYWxlIHF1aSBtJ2ludMOpcmVzc2UgZXQgbm9uIGwnaW52ZXJzZVxuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkqLTE7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBjJ2VzdCBsZSB0b2tlbiBxdWkgc2VydCDDoCB2w6lyaWZpZXIgbGUgc3RhdHV0IMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2UrXCIjc3Vic2NyaWJlXCIpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==