");
+ next();
+ }
+ catch(e)
+ {
+ next(e);
+ }
+}
+
+
+// FONCTIONS UTILITAIRES
+
+const creaQuestionnaireJson = async (id) =>
+{
+ const db = require("../models/index");
+ const Questionnaire=await db["Questionnaire"].findByPk(id);
+ if(Questionnaire)
+ {
+ let datas={ Questionnaire };
+ const Tags=await db["QuestionnaireClassification"].findAll({ where: { QuestionnaireId: Questionnaire.id }, attributes: ["TagId"] });
+ if(Tags)
+ datas.Tags=Tags;
+ const Illustrations=await db["Illustration"].findAll({ where: { QuestionnaireId: Questionnaire.id } });
+ if(Illustrations)
+ datas.Illustrations=Illustrations;
+ const Links=await db["Link"].findAll({ where: { QuestionnaireId: Questionnaire.id } });
+ if(Links)
+ datas.Links=Links;
+ const Questions=await db["Question"].findAll({ where: { QuestionnaireId: Questionnaire.id }, order: [["rank", "ASC"], ["createdAt", "ASC"]], attributes: ["id"] });
+ if(Questions)
+ datas.Questions=Questions;
+ const wasPublished=datas.Questionnaire.isPublished;
+ datas.Questionnaire.isPublished=checkQuestionnaireIsPublishable(datas);
+ // important d'écrire le fichier ici, car il est nécessaire aux autres fonctions appelées ci-dessous
+ await toolFile.createJSON(config.dirCacheQuestionnaires, id, datas);
+ if(datas.Questionnaire.isPublished!==wasPublished)
+ {
+ await db["Questionnaire"].update({ isPublished:datas.Questionnaire.isPublished }, { where: { id : id } , fields: ["isPublished"], limit:1 });
+ // + liste des tags utilisés :
+ tagCtrl.creaUsedTagsJson();
+ // si le quiz était publié jusqu'ici, il me faut supprimer son fichier HTML (revenir pour réactiver)
+ /*if(wasPublished)
+ toolFile.deleteFile(config.dirHTMLQuestionnaire, Questionnaire.slug+".html");*/
+ }
+ // peut impacter la liste des derniers si des informations affichées ont changé
+ creaNewQuestionnairesJson();// peut avoir été impacté
+ // + les listes de quizs / tags :
+ for(let i in Tags)
+ tagCtrl.creaQuestionnairesTagJson(Tags[i].TagId) // ! Json + HTML, donc potentiellement long.
+ if(datas.Questionnaire.isPublished)
+ await creaQuestionnaireHTML(id);
+ return datas;
+ }
+ else
+ return false;
+}
+exports.creaQuestionnaireJson = creaQuestionnaireJson;
+
+const checkQuestionnaireIsPublishable = (datas, checkDate=true) =>
+{
+ if(checkDate)
+ {
+ if(datas.Questionnaire.publishingAt===null)
+ return false;
+ else
+ {
+ const today=new Date();
+ today.setHours(0,0,0,0);// !! attention au décalage horaire du fait de l'enregistrement en UTC dans mysql
+ const publishingAt=new Date(datas.Questionnaire.publishingAt);
+ if (publishingAt.getTime() > today.getTime())
+ return false;
+ }
+ }
+ if(datas.Questions==undefined || datas.Questions.length < config.nbQuestionsMin) // le nombre de réponses mini étant contrôlé au moment de l'enregistrement de la question
+ return false;
+ if(datas.Tags==undefined || datas.Tags.length < configTags.nbTagsMin)
+ return false;
+ if(datas.Links==undefined || datas.Links.length < configLinks.nbLinksMin)
+ return false;
+ if(datas.Illustrations==undefined || datas.Illustrations.length < configIllustrations.nbIllustrationsMin)
+ return false;
+ return true;
+}
+
+const creaQuestionnaireHTML = async (id, preview=false) =>
+{
+ // besoin de toutes les infos concernant le questionnaire pour les transmettre à la vue
+ // à terme : séparer la création de la partie body pouvant être retournée pour recharger page, de la génération complète pour créer le fichier html
+ const questionnaire=await searchQuestionnaireById(id, true);
+ if(!questionnaire)
+ return false;
+ if(questionnaire.Questionnaire.isPublished===false && preview===false)
+ return false;
+ const compiledFunction = pug.compileFile("./views/"+config.theme+"/quiz.pug");
+ const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js");
+ const pageDatas=
+ {
+ config: config,
+ configTpl: configTpl,
+ tool: tool,
+ txtGeneral : txtGeneral,
+ txtQuestionnaire: txtQuestionnaire,
+ txtIllustration: txtIllustration,
+ pageLang: questionnaire.Questionnaire.language,
+ metaDescription: tool.shortenIfLongerThan(config.siteName+" : "+striptags(questionnaire.Questionnaire.introduction.replace(" ", " ").replace("
", " ")), 200),
+ author: questionnaire.Questionnaire.CreatorName,
+ pageTitle: questionnaire.Questionnaire.title+" ("+txtQuestionnaire.questionnairesName+")",
+ contentTitle: questionnaire.Questionnaire.title,
+ questionnaire: questionnaire,
+ linkCanonical: config.siteUrl+"/"+config.dirHTMLQuestionnaire+"/"+questionnaire.Questionnaire.slug+".html"
+ }
+ const html=await compiledFunction(pageDatas);
+ if(preview===false)
+ {
+ await toolFile.createHTML(config.dirHTMLQuestionnaire, questionnaire.Questionnaire.slug, html);
+ return true;
+ }
+ else
+ return html;
+}
+
+const searchQuestionnaireById = async (id, reassemble=false) =>
+{
+ let questionnaire=await toolFile.readJSON(config.dirCacheQuestionnaires, id);
+ if(!questionnaire)
+ questionnaire=await creaQuestionnaireJson(id);
+ if(!questionnaire)
+ return false;
+ if(reassemble)
+ {
+ let question; Questions=[];
+ const author=await userCtrl.searchUserById(questionnaire.Questionnaire.CreatorId);
+ if(author)
+ questionnaire.Questionnaire.CreatorName=author.User.name;
+ for(i in questionnaire.Questions)
+ {
+ question=await questionCtrl.searchQuestionById(questionnaire.Questions[i].id);
+ if(question)
+ Questions.push(question);
+ }
+ questionnaire.Questions=Questions;
+ const tags=await tagCtrl.getTagsQuestionnaire(id);
+ if(tags)
+ questionnaire.Tags=tags;
+ }
+ return questionnaire;
+}
+exports.searchQuestionnaireById = searchQuestionnaireById;
+
+// Cherche si il y a des questionnaires dont la date de publication est passée mais qui ne sont pas notés comme publiés
+// Vérifie si ils sont publiables et si oui change leur statut et réactualise le cache json
+const checkQuestionnairesNeedToBePublished = async () =>
+{
+ const db = require("../models/index");
+ const questionnaires= await db.sequelize.query("SELECT `id` FROM `Questionnaires` WHERE `publishingAt` < NOW() AND `isPublished` = false", { type: QueryTypes.SELECT });
+ let questionnaireDatas;
+ for(let i in questionnaires)
+ {
+ questionnaireDatas=await searchQuestionnaireById(questionnaires[i].id, true);
+ if(checkQuestionnaireIsPublishable(questionnaireDatas))
+ {
+ await db["Questionnaire"].update({ isPublished:true }, { where: { id : questionnaires[i].id } , fields: ["isPublished"], limit:1 });
+ creaQuestionnaireJson(questionnaires[i].id);// provoque normalement la création du HTML
+ }
+ }
+}
+
+// Contrôle si tous les fichiers devant être publiés ont bien leur fichier HTML, sinon le génère
+// Si regenerate true, tous les fichiers sont générés, même si ils existent déjà (évolution template...)
+// Retourne le nombre de fichiers ayant été régénérés
+const checkQuestionnairesPublishedHaveHTML = async (regenerate=false) =>
+{
+ const db = require("../models/index");
+ const questionnaires= await db.sequelize.query("SELECT `id`,`slug` FROM `Questionnaires` WHERE `isPublished` = true", { type: QueryTypes.SELECT });
+ let nb=0;
+ for(let i in questionnaires)
+ {
+ if(regenerate)
+ {
+ await creaQuestionnaireHTML(questionnaires[i].id);
+ nb++;
+ }
+ else if(await toolFile.checkIfFileExist(config.dirHTMLQuestionnaire, questionnaires[i].slug+".html")===false)
+ {
+ await creaQuestionnaireHTML(questionnaires[i].id);
+ console.log("je viens de publier le questionnaire :"+questionnaires[i].slug);
+ await toolMail.sendMail(0, config.adminEmail, "Publication d'un article", "Je viens de publier le quiz : "+config.siteUrl+"/quizs/"+questionnaires[i].slug+".html", "
Je viens de publier le quiz : "+config.siteUrl+"/quizs/"+questionnaires[i].slug+".html
");
+ nb++;
+ }
+ }
+ return nb;
+}
+
+// Liste des derniers questionnaires publiés (utile pour page d'accueil, flux rss, etc.)
+const creaNewQuestionnairesJson = async () =>
+{
+ const db = require("../models/index");
+ const Questionnaires=await db["Questionnaire"].findAll({ where: { isPublished : true }, order: [["updatedAt", "DESC"], ["id", "DESC"]], attributes: ["id"], limit: config.nbNewQuestionnaires });
+ if(Questionnaires)
+ {
+ await toolFile.createJSON(config.dirCacheQuestionnaires, "last", Questionnaires);
+ creaNewQuestionnairesHTML(Questionnaires);
+ return Questionnaires;
+ }
+ else
+ return false;
+}
+exports.creaNewQuestionnairesJson = creaNewQuestionnairesJson;
+
+// Se limite à compter le nombre total de questionnaires et à le stocker pour éviter de lancer une requête sql à chaque fois
+const creaStatsQuestionnairesJson = async () =>
+{
+ const db = require("../models/index");
+ const Questionnaires=await db["Questionnaire"].findAll({ attributes: ["id"] });
+ const QuestionnairesPublished=await db["Questionnaire"].findAll({ where: { isPublished : true }, attributes: ["id"] });
+ if(Questionnaires && QuestionnairesPublished)
+ {
+ const stats =
+ {
+ nbTot : Questionnaires.length,
+ nbPublished : QuestionnairesPublished.length
+ }
+ await toolFile.createJSON(config.dirCacheQuestionnaires, "stats", stats);
+ return stats;
+ }
+ else
+ return false;
+}
+exports.creaStatsQuestionnairesJson = creaStatsQuestionnairesJson;
+
+// Retourne les données créées par la fonction précédente
+const getStatsQuestionnaires = async () =>
+{
+ let stats=await toolFile.readJSON(config.dirCacheQuestionnaires, "stats");
+ if(!stats)
+ stats=await creaStatsQuestionnairesJson();
+ if(!stats)
+ return false;
+ else
+ return stats;
+}
+exports.getStatsQuestionnaires = getStatsQuestionnaires;
+
+// Quelle est la prochaine date pour laquelle aucun questionnaire n'a été publié ?
+const getDateNewQuestionnaireNeeded = async (maxDays) =>
+{
+ const db = require("../models/index");
+ let dateNeed="", checkDate, addMin=0, addMax=1;
+ while(dateNeed==="")
+ {
+ checkDate = await db.sequelize.query("SELECT ADDDATE(CURDATE(), :addMin) as `dateNeeded` FROM `Questionnaires` WHERE `isPublished`=1 AND `publishingAt` > ADDDATE(CURDATE(), :addMin) AND `publishingAt`< ADDDATE(CURDATE(), :addMax) ORDER BY `publishingAt` LIMIT 1", { replacements: { addMin: addMin, addMax: addMax }, type: QueryTypes.SELECT });
+ if(checkDate && getSubscriptions24H.length>0)
+ dateNeed=checkDate.dateNeeded;
+ else
+ {
+ addMin++;
+ addMax++;
+ }
+ if(addMin>maxDays)
+ return false;
+ }
+ return dateNeed;
+}
+exports.getDateNewQuestionnaireNeeded = getDateNewQuestionnaireNeeded;
+
+// Les prochains questionnaires devant être publiés (permet aux gestionnaires de voir les dates vides)
+const getNextQuestionnaires = async () =>
+{
+ const db = require("../models/index");
+ const questionnaires= await db.sequelize.query("SELECT `id`,`title`, `publishingAt` as `datePublishing` FROM `Questionnaires` WHERE `publishingAt` > NOW() order by `publishingAt`", { type: QueryTypes.SELECT });
+ return questionnaires;
+}
+exports.getNextQuestionnaires = getNextQuestionnaires;
+
+const creaNewQuestionnairesHTML = async (Questionnaires) =>
+{
+ // On regénère la page d'accueil avec le(s) dernier(s) questionnaire(s) mis en avant :
+ let compiledFunction = pug.compileFile("./views/"+config.theme+"/home.pug");
+ const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js");
+ let questionnaires=[];
+ for(let i in Questionnaires)
+ questionnaires.push(await searchQuestionnaireById(Questionnaires[i].id));
+ let pageDatas=
+ {
+ config: config,
+ configTpl: configTpl,
+ tool: tool,
+ striptags: striptags,
+ txtGeneral : txtGeneral,
+ txtQuestionnaire: txtQuestionnaire,
+ txtIllustration: txtIllustration,
+ pageLang: config.adminLang,
+ metaDescription: txtGeneral.siteMetaDescription,
+ pageTitle: txtGeneral.siteHTMLTitle,
+ contentTitle: config.siteName,
+ questionnaires: questionnaires,
+ linkCanonical: config.siteUrl
+ }
+ let html=await compiledFunction(pageDatas);
+ await toolFile.createHTML(config.dirHTML, "index", html);
+ // + la page listant les X derniers quizs + liste des tags
+ compiledFunction=pug.compileFile("./views/"+config.theme+"/newQuestionnaires.pug");
+ pageDatas.metaDescription=configTpl.newQuestionnairesIntro;
+ pageDatas.pageTitle=configTpl.newQuestionnairesTitle;
+ pageDatas.linkCanonical=config.siteUrl+"/"+configQuestionnaires.dirWebTags;
+ pageDatas.tags=await tagCtrl.getUsedTags();
+ html=await compiledFunction(pageDatas);
+ await toolFile.createHTML(configQuestionnaires.dirHTMLTags, "index", html);
+ return true;
+}
+
+// À partir d'une liste d'id questionnaires fournis, retourne la liste complète ou partielle (pagination) avec les infos de chaque questionnaire
+// Retour en html ou json suivant les cas
+const getListingsQuestionnairesOuput = async (Questionnaires, begin=0, end=null, output="") =>
+{
+ const datas= { nbTot: Questionnaires.length, questionnaires: [], html: "" };
+ if(datas.nbTot!==0)
+ {
+ if(end===null)
+ end=datas.nbTot;
+ for (let i = begin; i <= end; i++)
+ {
+ if(Questionnaires[i]===undefined)
+ break;
+ else
+ datas.questionnaires.push(await searchQuestionnaireById(Questionnaires[i].id));
+ }
+ // Utiles pour savoir où j'en suis rendu dans le front :
+ datas.begin=begin;
+ datas.end=end;
+ if(output==="html")
+ {
+ const compiledFunction = pug.compileFile("./views/"+config.theme+"/includes/listing-questionnaires.pug");
+ const pageDatas=
+ {
+ tool: tool,
+ striptags: striptags,
+ txtGeneral: txtGeneral,
+ txtIllustration: txtIllustration,
+ questionnaires: datas.questionnaires,
+ nbQuestionnairesList:configTpl.nbQuestionnairesUserHomePage
+ }
+ datas.html=await compiledFunction(pageDatas);
+ datas.questionnaires=null;// allège un peu le contenu retourné...
+ }
+ }
+ return datas;
+}
+exports.getListingsQuestionnairesOuput = getListingsQuestionnairesOuput;
\ No newline at end of file
diff --git a/controllers/subscription.js b/controllers/subscription.js
new file mode 100644
index 0000000..aa56b2b
--- /dev/null
+++ b/controllers/subscription.js
@@ -0,0 +1,391 @@
+// Contrôleurs gérant l'abonnement de l'utilisateur mais aussi les questionnaires auxquels il a accès
+
+const { Op, QueryTypes } = require("sequelize");// pour certaines requêtes sql
+const jwt = require("jsonwebtoken");
+
+const config = require("../config/main");
+const configQuestionnaires = require("../config/questionnaires");
+const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js");
+
+const tool = require("../tools/main");
+const toolFile = require("../tools/file");
+const toolMail = require("../tools/mail");
+
+const txt = require("../lang/"+config.adminLang+"/subscription");
+const txtQuestionnaire= require("../lang/"+config.adminLang+"/questionnaire");
+const txtQuestionnaireAccess= require("../lang/"+config.adminLang+"/questionnaireaccess");
+const txtGeneral= require("../lang/"+config.adminLang+"/general");
+
+const answerCtrl = require("./answer");
+const questionnaireCtrl = require("./questionnaire");
+const userCtrl = require("./user");
+
+// Clic sur lien de désabonnement aux alertes email
+exports.unsubscribeLink = async (req, res, next) =>
+{
+ try
+ {
+ const db = require("../models/index");
+ const userDatas= await userCtrl.checkTokenUser(req.params.token);
+ await db["User"].update({ newsletterOk: false }, { where: { id : userDatas.User.id }, limit:1 });
+ await db["Subscription"].update({ noticeOk: false }, { where: { UserId : userDatas.User.id }, limit:1 });
+ userCtrl.creaUserJson(userDatas.User.id);
+ res.status(200).json({ message: txt.unsubscriptionOk });
+ next();
+ }
+ catch(e)
+ {
+ next(e);
+ }
+}
+
+// CRONS
+
+// + une autre notification le jour "J" ??? vérifier si l'utilisateur actif les dernières 48H et laisser les autres tranquilles ?
+exports.notifyExpirationFreeAccount= async(req, res, next) =>
+{
+ try
+ {
+ const db = require("../models/index");
+ const dateExpirationMin=new Date(new Date().getTime()-(config.freeAccountTimingInDays-config.freeAccountExpirationNotificationInDays+1)*24*3600*1000);
+ const dateExpirationMax=new Date(new Date().getTime()-(config.freeAccountTimingInDays-config.freeAccountExpirationNotificationInDays)*24*3600*1000);
+ console.log("je cherche les utilisateurs freemium dont l'abonnement a été créé entre le "+dateExpirationMin+" et le "+dateExpirationMax+".");
+ const users=await db["Subscription"].findAll(
+ {
+ where:
+ {
+ [Op.and]:
+ [
+ { numberOfDays: config.freeAccountTimingInDays },
+ { createdAt: { [Op.gte]: dateExpirationMin } },
+ { createdAt: { [Op.lt]: dateExpirationMax } }
+ ]
+ },
+ attributes: ["UserId"]
+ });
+ const sendNotification = async (user) =>
+ {
+ let userInfos=await userCtrl.searchUserById(user.UserId);
+ if(userInfos && userInfos.User.status=="user")
+ {
+ //const token=jwt.sign({ userId: userInfos.User.id }, config.tokenPrivateKey, { expiresIn: config.tokenLoginLinkTimeInHours });
+ const mapMail =
+ {
+ SITE_NAME: config.siteName,
+ USER_NAME: userInfos.User.name,
+ LINK_URL : config.siteUrl+"/"+configTpl.updateAccountPage+"#abo"
+ };
+ const mailDatas=
+ {
+ mailSubject: txt.mailEndFreeTimeSubject,
+ mailPreheader: txt.mailEndFreeTimeSubject,
+ mailTitle: txt.mailEndFreeTimeSubject,
+ mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.updateAccountPage+"#abo",
+ mailHeaderLinkTxt: txt.mailEndFreeTimeLinkTxt,
+ mailMainContent: tool.replaceAll(txt.mailEndFreeTimeBodyHTML, mapMail),
+ linksCTA: [{ url:config.siteUrl+"/"+configTpl.updateAccountPage+"#abo", txt:txt.mailEndFreeTimeLinkTxt }],
+ mailRecipientAddress: userInfos.User.email
+ }
+ await toolMail.sendMail(userInfos.User.smtp, userInfos.User.email, txt.mailEndFreeTimeSubject, tool.replaceAll(txt.mailEndFreeTimeBodyTxt, mapMail), "", mailDatas);
+ }
+ }
+ for(let i in users)
+ sendNotification(users[i]);
+ if(res.message)
+ res.message+="\n"+users.length+txt.mailEndFreeTimeMessage;
+ else
+ res.message=users.length+txt.mailEndFreeTimeMessage;
+ res.status(200).json(true);
+ console.log(users.length+txt.mailEndFreeTimeMessage);
+ next();
+ }
+ catch(e)
+ {
+ next(e);
+ }
+}
+
+exports.notifyExpirationAccount= async(req, res, next) =>
+{ // utiliser la vue puis des recherches en sql natif ou ajouter un modèle : https://stackoverflow.com/questions/48407329/cant-able-to-create-views-in-mysql-using-sequelize-orm
+ try
+ {
+ const db = require("../models/index");
+ const getUsers= async (nbDays) =>
+ {
+ const dateExpirationMin=new Date(new Date().getTime()+nbDays*24*3600*1000);
+ const dateExpirationMax=new Date(new Date().getTime()+(nbDays+1)*24*3600*1000);
+ const users=await db["Subscription"].findAll(
+ {
+ where:
+ {
+ [Op.and]:
+ [
+ { numberOfDays: { [Op.gt]: config.freeAccountTimingInDays } },
+ db.sequelize.where(db.sequelize.fn('ADDDATE', db.sequelize.col('createdAt'), db.sequelize.literal('INTERVAL `numberOfDays` DAY')), { [Op.gte]: dateExpirationMin }),
+ db.sequelize.where(db.sequelize.fn('ADDDATE', db.sequelize.col('createdAt'), db.sequelize.literal('INTERVAL `numberOfDays` DAY')), { [Op.lt]: dateExpirationMax })
+ ]
+ },
+ attributes: ["UserId"],
+ });
+ return users;
+ }
+ const sendNotification= async (user, mail) => // utiliser la paramètre "mail" pour adapter le texte du mail !
+ {
+ let userInfos=await searchUserById(user.UserId);
+ if(userInfos && userInfos.User.status=="user")
+ {
+ //const token=jwt.sign({ userId: userInfos.User.id }, config.tokenPrivateKey, { expiresIn: config.tokenLoginLinkTimeInHours });
+ const mapMail =
+ {
+ SITE_NAME: config.siteName,
+ USER_NAME: userInfos.User.name,
+ LINK_URL : config.siteUrl+"/"+configTpl.updateAccountPage+"#abo"
+ };
+ const mailDatas=
+ {
+ mailSubject: txt.mailExpirationSubject,
+ mailPreheader: txt.mailExpirationSubject,
+ mailTitle: txt.mailExpirationSubject,
+ mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.updateAccountPage+"#abo",
+ mailHeaderLinkTxt: txt.mailExpirationLinkTxt,
+ mailMainContent: tool.replaceAll(txt.mailExpirationBodyHTML, mapMail),
+ linksCTA: [{ url:config.siteUrl+"/"+configTpl.updateAccountPage+"#abo", txt:txt.mailExpirationLinkTxt }],
+ mailRecipientAddress: userInfos.User.email
+ }
+ await toolMail.sendMail(userInfos.User.smtp, userInfos.User.email, txt.mailExpirationSubject, tool.replaceAll(txt.mailExpirationBodyTxt, mapMail), "", mailDatas);
+ }
+ }
+ // première salve :
+ let users1=await getUsers(config.accountExpirationFirstNotificationInDays);
+ for(i in users1)
+ sendNotification(users1[i], "first");
+ // deuxième relance :
+ let users2=await getUsers(config.accountExpirationSecondNotificationInDays);
+ for(i in users2)
+ sendNotification(users2[i], "second");
+ if(res.message)
+ res.message+="\n"+tool.replaceAll(txt.mailExpirationMessage, { FIRST:users1.length , SECOND:users2.length });
+ else
+ res.message=tool.replaceAll(txt.mailExpirationMessage, { FIRST:users1.length , SECOND:users2.length });
+ res.status(200).json(true);
+ next();
+ }
+ catch(e)
+ {
+ next(e);
+ }
+}
+
+// CRON donnant accès à l'utilisateur à nouveau quiz suivant son choix
+exports.addNewQuestionnaireUsers = async(req, res, next) =>
+{
+ try
+ {
+ const db = require("../models/index");
+ // Utilisateurs dont l'abonnement est toujours actif et souhaitant recevoir un nouveau quiz le jour de l'appel de cette méthode.
+ // Le tout en heure locale et en ignorant ceux qui ont déjà été servis ce jour.
+ const subscriptionsOk = await db.sequelize.query("SELECT `Subscriptions`.`id` as SubscriptionId, `UserId`, `name`, `email`, `smtp`, `language`, `noticeOk`, `receiptDays`, ADDDATE(UTC_TIMESTAMP, INTERVAL `timeDifference` MINUTE) AS localDate FROM `Subscriptions` INNER JOIN `Users` ON `Subscriptions`.`UserId`=`Users`.`id` WHERE `status`='user' AND ADDDATE(`Subscriptions`.`createdAt`, `numberOfDays`) > UTC_TIMESTAMP HAVING HOUR(localDate) > "+config.hourGiveNewQuestionnaireBegin+" AND HOUR(localDate) < "+config.hourGiveNewQuestionnaireEnd+" AND LOCATE(DAYOFWEEK(localDate),receiptDays)!=0 AND SubscriptionId NOT IN (SELECT DISTINCT `SubscriptionId` FROM `Pauses` WHERE ADDDATE(`startingAt`, INTERVAL `timeDifference` MINUTE) <= localDate AND ADDDATE(`endingAT`, INTERVAL `timeDifference` MINUTE) > localDate) AND `UserId` NOT IN (SELECT DISTINCT `UserId` FROM `QuestionnaireAccesses` WHERE DATEDIFF(NOW(),`createdAt`) < 1 AND `selfCreatedOk` = false) LIMIT "+config.numberNewQuestionnaireAtSameTime, { type: QueryTypes.SELECT });
+ if(subscriptionsOk.length===0)
+ {
+ res.status(200).json({ message: txt.allSubscriptionProcessed });
+ //console.log(txt.allSubscriptionProcessed);
+ }
+ else
+ {
+ await toolMail.sendMail(0, config.adminEmail, "Abonnements à traiter", subscriptionsOk.length+" abonnements à traiter.", "
"+subscriptionsOk.length+" abonnements à traiter.
");
+ let newQuestionnaire, access, questionnaire, token;
+ for (let i in subscriptionsOk)
+ {
+ newQuestionnaire=await db.sequelize.query("SELECT `Questionnaires`.`id`, `title`, `slug`, `introduction`, `url`, `anchor`,`estimatedTime` FROM `Questionnaires` INNER JOIN `Links` ON `Links`.`QuestionnaireId`=`Questionnaires`.`id` WHERE `isPublished`=1 AND `language`='"+subscriptionsOk[i].language+"' AND `Questionnaires`.`id` NOT IN (SELECT `QuestionnaireId` FROM `QuestionnaireAccesses` WHERE `UserId`="+subscriptionsOk[i].UserId+") ORDER BY `id` LIMIT 1", { type: QueryTypes.SELECT });
+ if(newQuestionnaire.length!==0)
+ {
+ access=await db["QuestionnaireAccess"].create({ QuestionnaireId: newQuestionnaire[0].id, UserId: subscriptionsOk[i].UserId, selfCreatedOk: false });
+ if(access)
+ {
+ answerCtrl.creaUserQuestionnairesWithoutAnswerJson(subscriptionsOk[i].UserId);
+ if(subscriptionsOk[i].noticeOk)
+ {
+ token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays });
+ const mapMail =
+ {
+ USER_NAME: subscriptionsOk[i].name,
+ QUESTIONNAIRE_URL: config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+newQuestionnaire[0].slug+".html#questionnaire",
+ UNSUBSCRIBE_URL: config.siteUrl+"/"+configTpl.stopMailPage+token
+ };
+ const mailDatas=
+ {
+ mailSubject: newQuestionnaire[0].title,
+ mailPreheader: newQuestionnaire[0].title,
+ mailTitle: newQuestionnaire[0].title,
+ mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.stopMailPage+token,
+ mailHeaderLinkTxt: txt.mailStopMailLinkTxt,
+ mailMainContent: newQuestionnaire[0].introduction+"
",
+ noNewQuestionnaireForUser: "Aucun nouveau questionnaire trouvé pour un abonné : ",
+ mailEndFreeTimeSubject: "Votre abonnement gratuit va expirer",
+ mailEndFreeTimeBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui :\nLINK_URL",
+ mailEndFreeTimeBodyHTML: "
Bonjour USER_NAME,
Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours. Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui en cliquez ici sans tarder.
",
+ mailEndFreeTimeMessage: " relances envoyées.",
+ mailExpirationSubject: "Votre abonnement va bientôt expirer",
+ mailExpirationBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui :\nLINK_URL",
+ mailExpirationBodyHTML: "
Bonjour USER_NAME,
Votre abonnement à SITE_NAME va expirer d'ici quelques jours. Pour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui en cliquant ici.
",
+ mailExpirationMessage: "FIRST premières et SECOND deuxièmes relances envoyées pour des abonnements expirant d'ici peu.",
+ infosNbDays: "Votre abonnement est encore valable pendant NB_DAYS jours. Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :",
+ infosExpirated: "Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées. Pour ce faire, suivez sans tarder les indications ci-dessous :",
+ infosNbDaysAdmin: "Cet abonnement est encore valable pendant NB_DAYS jours.",
+ infosExpiratedAdmin: "Cet abonnement a expiré.",
+ isNotValided: "Cet utilisateur n'a pas encore validé son compte. Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.",
+ infosPaymentsAdmin: "DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME."
+};
+
+/***/ }),
+
+/***/ "../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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/accountUser.js":
+/*!****************************!*\
+ !*** ./src/accountUser.js ***!
+ \****************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+// -- GESTION DES FORMULAIRES PERMETTANT AUX UTILISATEURS DE METTRE À JOUR LEURS INFORMATIONS + LEUR ABONNEMENT
+/// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas.
+/// Si c'est ok, on récupère les infos de son compte et son abonnement et les affiche dans le formulaire.
+/// Une information est affichée concernant la possibilité de parrainage et les listes les filleuils existants.
+/// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, etc.
+/// Des boutons de paiement sont aussi affichés suivant le choix de l'utilisateur pour lui permettre de prolonger son abonnement.
+/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement.
+/// Ajout test email en doublon avant envoi ?
+// Fichier de configuration côté client :
+
+var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
+
+var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : !! revoir quand le rest sera fini pour vérifier si tout est utile
+
+
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
+
+var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user");
+
+var txtSubscriptions = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/subscription$")("./" + lang + "/subscription"); // Principaux éléments du DOM manipulés :
+
+
+var divMain = document.getElementById("main-content");
+var divMessage = document.getElementById("message");
+var divResponse = document.getElementById("response");
+var divGodchilds = document.getElementById("godchilds");
+var divSubscribeIntro = document.getElementById("subscribeIntro");
+var formAccount = document.getElementById("accountUpdate");
+var newPassword = document.getElementById("newPassword");
+var showGFEmail = document.getElementById("godfatherEmail");
+var showGFCode = document.getElementById("godfatherCode");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var config, isConnected, user, getInfos, divCGV, div180, div365, divWP180, divWP365, divWPNone, xhrGetGodchilds;
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ _context.prev = 0;
+ _context.next = 3;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+
+ if (config) {
+ _context.next = 8;
+ break;
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ _context.next = 12;
+ break;
+
+ case 8:
+ _context.next = 10;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(["user"], "/" + configFrontEnd.connectionPage, {
+ message: txtUsers.needBeConnected,
+ color: "error"
+ }, window.location);
+
+ case 10:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ divMain.style.display = "block";
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
+ }
+
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
+ Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd); // Initialise le formulaire permettant de mettre à jour les infos :
+
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formAccount); // Certains navigateurs ont tendance à remplir tout seul les champs password
+
+ newPassword.value = ""; // Fonction affichant les infos connues au premier affichage puis après envoi mise à jour
+
+ getInfos = function getInfos() {
+ var xhrGetInfos = new XMLHttpRequest();
+ xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getUserInfos + user.id);
+
+ xhrGetInfos.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && response.User != undefined && response.Subscription != undefined) {
+ for (var data in response.User) {
+ if (formAccount.elements[data] !== undefined) {
+ if (response.User[data] !== true && response.User[data] !== false) // booléen = case à cocher !
+ formAccount.elements[data].value = response.User[data];else if (response.User[data] == true) // si false, on ne fait rien
+ formAccount.elements["" + data].checked = "checked";
+ }
+ } // infos de l'abonnement
+
+
+ if (response.Subscription.noticeOk == true) formAccount.elements["noticeOk"].checked = "checked"; // jours de réception
+
+ for (var i in response.Subscription.receiptDays) {
+ formAccount.elements["d" + response.Subscription.receiptDays[i]].checked = "checked";
+ }
+
+ showGFEmail.innerHTML = response.User.email;
+ showGFCode.innerHTML = config.beginCodeGodfather + response.User.id;
+ }
+
+ var beginSubTS = new Date(response.Subscription.createdAt).getTime();
+ var nbDaysOk = response.Subscription.numberOfDays - Math.round((Date.now() - beginSubTS) / 1000 / 3600 / 24);
+ if (nbDaysOk > 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", txtSubscriptions.infosNbDays.replace("NB_DAYS", nbDaysOk), "", ["information"]);else {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", txtSubscriptions.infosExpirated.replace("NB_DAYS", nbDaysOk), "", ["error"]);
+ window.location.assign("#subscribe");
+ }
+ }
+ };
+
+ xhrGetInfos.setRequestHeader("Authorization", "Bearer " + user.token);
+ xhrGetInfos.send();
+ }; // Remonte les infos déjà enregistrées :
+
+
+ getInfos(); // Traitement de l'envoi d'une mise à jour des infos
+
+ formAccount.addEventListener("submit", function (e) {
+ e.preventDefault();
+ divResponse.innerHTML = "";
+ var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formAccount); // recomposition des jours valables pour l'abonnement :
+
+ datas.receiptDays = "";
+
+ for (var i = 1; i <= 7; i++) {
+ if (datas["d" + i] !== undefined) datas.receiptDays += "" + i;
+ }
+
+ if (datas.noticeOk === undefined) datas.noticeOk = "false";
+ if (datas.newsletterOk === undefined) datas.newsletterOk = "false";
+ datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getTimeDifference"])(config);
+ var xhrUserUpdate = new XMLHttpRequest();
+ if (datas.deleteOk !== undefined) xhrUserUpdate.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + "/" + user.id);else xhrUserUpdate.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.updateUserInfos + user.id);
+
+ xhrUserUpdate.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && response.message != undefined) {
+ if (Array.isArray(response.message)) response.message = response.message.join(" ");else response.message = response.message;
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]);
+ } else if (response.errors) {
+ if (Array.isArray(response.errors)) response.errors = response.errors.join(" ");else response.errors = txt.serverError;
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]); // dans tous les cas, je mets à jour le contenu du formulaire :
+
+
+ getInfos();
+ }
+ };
+
+ xhrUserUpdate.setRequestHeader("Content-Type", "application/json");
+ xhrUserUpdate.setRequestHeader("Authorization", "Bearer " + user.token);
+
+ if (datas) {
+ datas.output = "html";
+ xhrUserUpdate.send(JSON.stringify(datas));
+ }
+ }); // on passe à la caisse ?
+
+ divCGV = document.getElementById("CGVOk");
+ div180 = document.getElementById("180Ok");
+ div365 = document.getElementById("365Ok");
+ divWP180 = document.getElementById("WPBtn180");
+ divWP365 = document.getElementById("WPBtn365");
+ divWPNone = document.getElementById("WPNone");
+ divCGV.addEventListener("change", function (e) {
+ // on commence par tout (re)cacher :
+ divWP180.style.display = "none";
+ divWP365.style.display = "none";
+ divWPNone.style.display = "none";
+
+ if (divCGV.checked === true) {
+ if (div180.checked === true) divWP180.style.display = "block";else if (div365.checked === true) divWP365.style.display = "block";else {
+ divWPNone.style.display = "block";
+ divCGV.checked = false;
+ }
+ }
+ }); // Liste des filleuils, si il y en a - revoir afficher un code parrainage en plus de l'email
+
+ xhrGetGodchilds = new XMLHttpRequest();
+ xhrGetGodchilds.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getGodChilds);
+
+ xhrGetGodchilds.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText),
+ txtGodchilds = "";
+
+ if (this.status === 200) {
+ var nbGodchilds = response.length;
+ if (nbGodchilds === 0) txtGodchilds = "Pas encore d'utilisateur associés à votre compte."; // revoir : utiliser le dictionnaire User
+ else {
+ txtGodchilds = nbGodchilds + " utilisateur(s) inscrit(s) grâce à vous : ";
+
+ for (var i in response) {
+ txtGodchilds += response[i].name + " (" + response[i].email + ") ";
+ }
+ }
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divGodchilds, "p", txtGodchilds, "", ["information"]);
+ }
+ };
+
+ xhrGetGodchilds.setRequestHeader("Authorization", "Bearer " + user.token);
+ xhrGetGodchilds.send();
+ }
+
+ case 12:
+ _context.next = 17;
+ break;
+
+ case 14:
+ _context.prev = 14;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]);
+
+ case 17:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 14]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+
+/***/ }),
+
+/***/ "./src/tools/clientstorage.js":
+/*!************************************!*\
+ !*** ./src/tools/clientstorage.js ***!
+ \************************************/
+/*! exports provided: saveLocaly, getLocaly, removeLocaly */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
+// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
+// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
+var saveLocaly = function saveLocaly(name, data) {
+ localStorage.setItem(name, JSON.stringify(data));
+};
+var getLocaly = function getLocaly(name) {
+ var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
+};
+var removeLocaly = function removeLocaly(name) {
+ localStorage.removeItem(name);
+};
+
+/***/ }),
+
+/***/ "./src/tools/dom.js":
+/*!**************************!*\
+ !*** ./src/tools/dom.js ***!
+ \**************************/
+/*! exports provided: addElement */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var addElement = function addElement(eltParent, eltType) {
+ var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
+ var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
+ var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
+ var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
+ var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
+ var newElement = document.createElement(eltType);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
+ newElement.id = eltId;
+
+ if (Array.isArray(eltClass) && eltClass.length != 0) {
+ for (var i in eltClass) {
+ newElement.classList.add(eltClass[i]);
+ }
+ }
+
+ if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
+ {
+ for (var attributName in eltAttributes) {
+ newElement.setAttribute(attributName, eltAttributes[attributName]);
+ }
+ }
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, " "); // 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 est lisible sur gitlab : \n Bonne lecture :-) \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/forms.js":
+/*!****************************!*\
+ !*** ./src/tools/forms.js ***!
+ \****************************/
+/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) {
+ for (var i in myForm.elements) {
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) {
+ var idInput = myForm.elements[i].id;
+
+ if (inputsConf[idInput] !== undefined) {
+ var inputHTML = document.getElementById(idInput);
+
+ for (var attribute in inputsConf[idInput]) {
+ inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);
+ }
+ }
+ }
+ }
+
+ return true;
+}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.
+
+var getDatasFromInputs = function getDatasFromInputs(myForm) {
+ var datas = {};
+ var formData = new FormData(myForm);
+
+ var _iterator = _createForOfIteratorHelper(formData.entries()),
+ _step;
+
+ try {
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
+ var entrie = _step.value;
+ datas[entrie[0]] = entrie[1];
+ }
+ } catch (err) {
+ _iterator.e(err);
+ } finally {
+ _iterator.f();
+ }
+
+ return datas;
+}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
+// Revoir pour les select
+
+var empyForm = function empyForm(myForm) {
+ var formData = new FormData(myForm);
+
+ var _iterator2 = _createForOfIteratorHelper(formData.entries()),
+ _step2;
+
+ try {
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+ var entrie = _step2.value;
+ if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = "";
+ }
+ } catch (err) {
+ _iterator2.e(err);
+ } finally {
+ _iterator2.f();
+ }
+
+ return true;
+}; // Vide et cache le formulaire
+
+var empyAndHideForm = function empyAndHideForm(myForm) {
+ empyForm(myForm);
+ myForm.style.display = "none";
+};
+
+/***/ }),
+
+/***/ "./src/tools/users.js":
+/*!****************************!*\
+ !*** ./src/tools/users.js ***!
+ \****************************/
+/*! exports provided: 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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3N1YnNjcmlwdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC91c2VyJCIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci91c2VyLmpzIiwid2VicGFjazovLy8uLi90b29scy9tYWluLmpzIiwid2VicGFjazovLy8uLi92aWV3cyBzeW5jIF5cXC5cXC8uKlxcLmpzJCIsIndlYnBhY2s6Ly8vLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FjY291bnRVc2VyLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Zvcm1zLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZSIsImRpcldlYlF1ZXN0aW9ubmFpcmUiLCJxdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsInByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzIiwicHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcyIsInNhdmVBbnN3ZXJzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwic2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlciIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsImdldEFkbWluU3RhdHMiLCJRdWVzdGlvbm5haXJlIiwidGl0bGUiLCJtYXhsZW5ndGgiLCJyZXF1aXJlZCIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIlF1ZXN0aW9uIiwidGV4dCIsInJhbmsiLCJtaW4iLCJkZWZhdWx0VmFsdWUiLCJDaG9pY2UiLCJuYlRhZ3NNaW4iLCJuYlRhZ3NNYXgiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MVGFncyIsImRpcldlYlRhZ3MiLCJ1c2VyUm91dGVzIiwic3Vic2NyaWJlUm91dGUiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiZ2V0TG9naW5MaW5rUm91dGUiLCJjb25uZWN0aW9uV2l0aExpbmtSb3V0ZSIsImdldFVzZXJJbmZvcyIsImNyZWF0ZVVzZXJSb3V0ZSIsInZhbGlkYXRlVXNlclJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwic2VhcmNoVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJ1bnN1YnNjcmliZVJvdXRlIiwibmFtZSIsImVtYWlsIiwibmV3UGFzc3dvcmQiLCJjb2RlR29kZmF0aGVyIiwiY2d1T2siLCJ2YWx1ZSIsInRpbWVEaWZmZXJlbmNlTWluIiwidGltZURpZmZlcmVuY2VNYXgiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5lZWROdW1iZXJPZkRheXMiLCJuZWVkSW50ZWdlck51bWJlck9mRGF5cyIsIm5lZWRNaW5OdW1iZXJPZkRheXMiLCJuZWVkTm90VG9vTG9uZ0RheXNMaXN0IiwibmVlZFZhbGlkRGF5c0xpc3QiLCJuZWVkVW5pcXVlRGF5c0xpc3QiLCJuZWVkS25vd0lmTm90aWNlT2siLCJ1bnN1YnNjcmlwdGlvbk9rIiwidW5zdWJzY3JpcHRpb25GYWlsIiwiYWxsU3Vic2NyaXB0aW9uUHJvY2Vzc2VkIiwibWFpbE5ld1F1ZXN0aW9ubmFpcmVTdWJqZWN0IiwibWFpbE5ld1F1ZXN0aW9ubmFpcmVCb2R5VHh0IiwibWFpbE5ld1F1ZXN0aW9ubmFpcmVCb2R5SFRNTCIsIm5vTmV3UXVlc3Rpb25uYWlyZUZvclVzZXIiLCJtYWlsRW5kRnJlZVRpbWVTdWJqZWN0IiwibWFpbEVuZEZyZWVUaW1lQm9keVR4dCIsIm1haWxFbmRGcmVlVGltZUJvZHlIVE1MIiwibWFpbEVuZEZyZWVUaW1lTWVzc2FnZSIsIm1haWxFeHBpcmF0aW9uU3ViamVjdCIsIm1haWxFeHBpcmF0aW9uQm9keVR4dCIsIm1haWxFeHBpcmF0aW9uQm9keUhUTUwiLCJtYWlsRXhwaXJhdGlvbk1lc3NhZ2UiLCJpbmZvc05iRGF5cyIsImluZm9zRXhwaXJhdGVkIiwiaW5mb3NOYkRheXNBZG1pbiIsImluZm9zRXhwaXJhdGVkQWRtaW4iLCJpc05vdFZhbGlkZWQiLCJpbmZvc1BheW1lbnRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJ0eHRVc2VycyIsInR4dFN1YnNjcmlwdGlvbnMiLCJkaXZNYWluIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRpdk1lc3NhZ2UiLCJkaXZSZXNwb25zZSIsImRpdkdvZGNoaWxkcyIsImRpdlN1YnNjcmliZUludHJvIiwiZm9ybUFjY291bnQiLCJzaG93R0ZFbWFpbCIsInNob3dHRkNvZGUiLCJoZWxsb0RldiIsImluaXRpYWxpc2UiLCJnZXRDb25maWciLCJjb25maWciLCJhZGRFbGVtZW50IiwiY2hlY2tTZXNzaW9uIiwibWVzc2FnZSIsImNvbG9yIiwid2luZG93IiwibG9jYXRpb24iLCJpc0Nvbm5lY3RlZCIsInN0eWxlIiwiZGlzcGxheSIsImdldExvY2FseSIsInJlbW92ZUxvY2FseSIsInVzZXIiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImdldEluZm9zIiwieGhyR2V0SW5mb3MiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiVXNlciIsIlN1YnNjcmlwdGlvbiIsImRhdGEiLCJlbGVtZW50cyIsImNoZWNrZWQiLCJub3RpY2VPayIsImkiLCJyZWNlaXB0RGF5cyIsImlubmVySFRNTCIsImJlZ2luU3ViVFMiLCJjcmVhdGVkQXQiLCJnZXRUaW1lIiwibmJEYXlzT2siLCJudW1iZXJPZkRheXMiLCJyb3VuZCIsIm5vdyIsImFzc2lnbiIsInNldFJlcXVlc3RIZWFkZXIiLCJ0b2tlbiIsInNlbmQiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsInByZXZlbnREZWZhdWx0IiwiZGF0YXMiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJuZXdzbGV0dGVyT2siLCJ0aW1lRGlmZmVyZW5jZSIsImdldFRpbWVEaWZmZXJlbmNlIiwieGhyVXNlclVwZGF0ZSIsImRlbGV0ZU9rIiwiQXJyYXkiLCJpc0FycmF5IiwiZXJyb3JzIiwib3V0cHV0Iiwic3RyaW5naWZ5IiwiZGl2Q0dWIiwiZGl2MTgwIiwiZGl2MzY1IiwiZGl2V1AxODAiLCJkaXZXUDM2NSIsImRpdldQTm9uZSIsInhockdldEdvZGNoaWxkcyIsInR4dEdvZGNoaWxkcyIsIm5iR29kY2hpbGRzIiwic2F2ZUxvY2FseSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsImNvbnNvbGUiLCJsb2ciLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJpZElucHV0IiwiaW5wdXRIVE1MIiwiYXR0cmlidXRlIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImVudHJpZXMiLCJlbnRyaWUiLCJlbXB5Rm9ybSIsInR5cGUiLCJlbXB5QW5kSGlkZUZvcm0iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsIm9ubG9hZCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJzZXRTZXNzaW9uIiwidXNlcklkIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJjaGVja0Fuc3dlckRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidXJsQWNjb3VudCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkEsSUFBTUEsS0FBSyxHQUFHQyxtQkFBTyxDQUFDLG1DQUFELENBQXJCOztBQUNBLElBQU1DLGNBQWMsR0FBR0QsbUJBQU8sQ0FBQyxxREFBRCxDQUE5Qjs7QUFFQUUsTUFBTSxDQUFDQyxPQUFQO0FB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MEYsY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9hY2NvdW50VXNlci5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9hY2NvdW50VXNlci5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9zdWJzY3JpcHRpb25cIjogXCIuLi9sYW5nL2ZyL3N1YnNjcmlwdGlvbi5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3N1YnNjcmlwdGlvbiRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIHNpdGVIVE1MVGl0bGUgOiBcIldpa2lMZXJuaSA6IHF1J2FsbGV6LXZvdXMgYXBwcmVuZHJlIGF1am91cmQnaHVpID9cIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJDaGFxdWUgam91ciwgdGVzdGV6IHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmkuXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzY3JpcHRUaW1pbmdBbGVydCA6IFwiKioqIFNjcmlwdCBsZW50IDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBub3RWYWxpZEZvcm1hdCA6IFwiRm9ybWF0IG5vbiB2YWxpZGUuXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIHVwZGF0ZUJ0blR4dDogXCJNb2RpZmllclwiLFxuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGFkZE9rTWVzc2FnZSA6IFwiTGVzIGRvbm7DqWVzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlIDogXCJMYSBtaXNlIMOgIGpvdXIgw6Agam91ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aEhlYWRlciA6IFwiQWJzZW5jZSBkZSBoZWFkZXIgQXV0aG9yaXphdGlvbi5cIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBmYWlsQXV0aElkIDogXCJJZGVudGlmaWFudCBub24gdmFsaWRlIDogXCIsXG4gICAgZmFpbEF1dGhDcm9uIDogXCJUZW50YXRpdmUgZGUgbGFuY2VtZW50IGQndW4gY3JvbiBzYW5zIGxlIGJvbiB0b2tlbi5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBbGxlciBhdSBxdWl6ICFcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbmVlZE51bWJlck9mRGF5cyA6IFwiSWwgZmF1dCB1biBub21icmUgZGUgam91cnMgcG91ciBsJ2Fib25uZW1lbnQuXCIsXG4gICAgbmVlZEludGVnZXJOdW1iZXJPZkRheXMgOiBcIkxlIG5vbWJyZSBkZSBqb3VycyBkZSBsJ2Fib25uZW1lbnQgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJPZkRheXMgOiBcIkxlIG5vbWJyZSBkZSBqb3VycyBkZSBsJ2Fib25uZW1lbnQgbmUgcGV1dCDDqnRyZSBuw6lnYXRpZiAhXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdEYXlzTGlzdCA6IFwiTGEgbGlzdGUgZGUgam91cnMgc8OpbGVjdGlvbm7DqXMgbidhIHBhcyBsZSBib24gZm9ybWF0ICh0cm9wIGxvbmd1ZSkuXCIsXG4gICAgbmVlZFZhbGlkRGF5c0xpc3QgOiBcIkxhIGxpc3RlIGRlIGpvdXJzIHPDqWxlY3Rpb25uw6lzIG4nYSBwYXMgbGUgYm9uIGZvcm1hdC4gQ2FyYWN0w6hyZSBub24gdmFsaWRlIDogXCIsXG4gICAgbmVlZFVuaXF1ZURheXNMaXN0IDogXCJMYSBsaXN0ZSBkZSBqb3VycyBzw6lsZWN0aW9ubsOpcyBuJ2EgcGFzIGxlIGJvbiBmb3JtYXQuIERvdWJsb24gOiBcIixcbiAgICBuZWVkS25vd0lmTm90aWNlT2sgOiBcIklsIG1hbnF1ZSBsJ2luZm9ybWF0aW9uIHN1ciBsJ2FjY2VwdGF0aW9uIG91IG5vbiBkZSByZWNldm9pciBkZXMgbm90aWZpY2F0aW9ucy5cIixcbiAgICB1bnN1YnNjcmlwdGlvbk9rIDogXCJWb3RyZSBkZW1hbmRlIGEgYmllbiDDqXTDqSBwcmlzZSBlbiBjb21wdGUuIFZvdXMgbmUgcmVjZXZyZXogcGx1cyBkZSBtZXNzYWdlcyB2ZW5hbnQgZHUgc2l0ZSwgc2F1ZiBwb3VyIHZvdXMgc2lnbmFsZXIgbGEgZmluIGRlIHZvdHJlIGFib25uZW1lbnQuPGJyPk4naMOpc2l0ZXogcGFzIDxhIGhyZWY9Jy8jVVJMJz7DoCBhY2PDqWRlciDDoCB2b3RyZSBjb21wdGU8L2E+IHBvdXIgZGUgbm91dmVhdSBhdXRvcmlzZXIgY2VydGFpbnMgZW52b2lzLlwiLFxuICAgIHVuc3Vic2NyaXB0aW9uRmFpbCA6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgbGllbiBkZSBkw6lzYWJvbm5lbWVudCBuZSBmb25jdGlvbm5lIHBhcy48YnI+Vm91cyBwb3V2ZXogPGEgaHJlZj0nLyNVUkwnPmFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZTwvYT4gcG91ciBkw6lzYWN0aXZlciBsZXMgZW52b2lzIG1hbnVlbGxlbWVudC5cIixcbiAgICBhbGxTdWJzY3JpcHRpb25Qcm9jZXNzZWQgOiBcIlRvdXMgbGVzIGFib25uw6lzIG9udCDDqXTDqSB0cmFpdMOpcyBwb3VyIGxlIG1vbWVudC5cIixcbiAgICBtYWlsTmV3UXVlc3Rpb25uYWlyZVN1YmplY3QgOiBcIlF1J2FsbGV6LXZvdXMgYXBwcmVuZHJlIGF1am91cmQnaHVpID9cIixcbiAgICBtYWlsTmV3UXVlc3Rpb25uYWlyZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblVuIG5vdXZlYXUgcXVpeiB2aWVudCBkZSB2b3VzIMOqdHJlIHByb3Bvc8OpIDpcXG5RVUVTVElPTk5BSVJFX1VSTFxcblxcbkJvbm5lIGxlY3R1cmUgIVxcblxcblN0b3BwZXIgbGVzIGVudm9pcyA/XFxuVU5TVUJTQ1JJQkVfVVJMXCIsXG4gICAgbWFpbE5ld1F1ZXN0aW9ubmFpcmVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+TUFJTF9JTlRST0RVQ1RJT048dWw+PGxpPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIiB0aXRsZT1cXFwiTElOS19USVRMRVxcXCI+TGlyZSBsJ2FydGljbGUuPC9hPjwvbGk+PGxpPjxhIGhyZWY9XFxcIlFVRVNUSU9OTkFJUkVfVVJMXFxcIj5BbGxleiBhdSBxdWl6LjwvYT48L2xpPjwvdWw+PHA+PGEgaHJlZj1cXFwiVU5TVUJTQ1JJQkVfVVJMXFxcIj5TdG9wcGVyIGxlcyBlbnZvaXMuPC9hPjwvcD5cIixcbiAgICBub05ld1F1ZXN0aW9ubmFpcmVGb3JVc2VyIDogXCJBdWN1biBub3V2ZWF1IHF1ZXN0aW9ubmFpcmUgdHJvdXbDqSBwb3VyIHVuIGFib25uw6kgOiBcIixcbiAgICBtYWlsRW5kRnJlZVRpbWVTdWJqZWN0OiBcIlZvdHJlIGFib25uZW1lbnQgZ3JhdHVpdCB2YSBleHBpcmVyXCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lQm9keVR4dDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Wb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuXFxuUG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogc291c2NyaXJlIMOgIHVuIGFib25uZW1lbnQgZMOocyBhdWpvdXJkJ2h1aSA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRW5kRnJlZVRpbWVCb2R5SFRNTDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuIFBvdXIgY29udGludWVyIMOgIHV0aWxpc2VyIGxlIHNpdGUsIHZvdXMgcG91dmV6IHNvdXNjcmlyZSDDoCB1biBhYm9ubmVtZW50IGTDqHMgYXVqb3VyZCdodWkgZW4gPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbEVuZEZyZWVUaW1lTWVzc2FnZTogXCIgcmVsYW5jZXMgZW52b3nDqWVzLlwiLFxuICAgIG1haWxFeHBpcmF0aW9uU3ViamVjdDogXCJWb3RyZSBhYm9ubmVtZW50IHZhIGJpZW50w7R0IGV4cGlyZXJcIixcbiAgICBtYWlsRXhwaXJhdGlvbkJvZHlUeHQ6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuVm90cmUgYWJvbm5lbWVudCBncmF0dWl0IMOgIFNJVEVfTkFNRSB2YSBleHBpcmVyIGQnaWNpIHF1ZWxxdWVzIGpvdXJzLlxcblBvdXIgY29udGludWVyIMOgIHV0aWxpc2VyIGxlIHNpdGUsIHZvdXMgcG91dmV6IGxlIHByb2xvbmdlciBkw6hzIGF1am91cmQnaHVpIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxFeHBpcmF0aW9uQm9keUhUTUw6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm90cmUgYWJvbm5lbWVudCDDoCBTSVRFX05BTUUgdmEgZXhwaXJlciBkJ2ljaSBxdWVscXVlcyBqb3Vycy48YnI+UG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogbGUgcHJvbG9uZ2VyIGTDqHMgYXVqb3VyZCdodWkgZW4gPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1YW50IGljaTwvYT4uPC9wPlwiLFxuICAgIG1haWxFeHBpcmF0aW9uTWVzc2FnZTogXCJGSVJTVCBwcmVtacOocmVzIGV0IFNFQ09ORCBkZXV4acOobWVzIHJlbGFuY2VzIGVudm95w6llcyBwb3VyIGRlcyBhYm9ubmVtZW50cyBleHBpcmFudCBkJ2ljaSBwZXUuXCIsXG4gICAgaW5mb3NOYkRheXM6IFwiVm90cmUgYWJvbm5lbWVudCBlc3QgZW5jb3JlIHZhbGFibGUgPGI+cGVuZGFudCBOQl9EQVlTIGpvdXJzPC9iPi48YnI+Vm91cyBwb3V2ZXogw6AgdG91dCBtb21lbnQgcHJvbG9uZ2VyIHZvdHJlIGFib25uZW1lbnQgZW4gc3VpdmFudCBsZXMgaW5kaWNhdGlvbnMgY2ktZGVzc291cyA6XCIsXG4gICAgaW5mb3NFeHBpcmF0ZWQ6IFwiVm90cmUgYWJvbm5lbWVudCBhIGV4cGlyw6ksIG1haXMgaWwgdm91cyByZXN0ZSBlbmNvcmUgcXVlbHF1ZXMgam91cnMgYXZhbnQgcXVlIHZvdHJlIGNvbXB0ZSBldCB2b3MgZG9ubsOpZXMgbmUgc29pZW50IGNvbXBsw6h0ZW1lbnQgc3VwcHJpbcOpZXMuPGJyPlBvdXIgY2UgZmFpcmUsIHN1aXZleiBzYW5zIHRhcmRlciBsZXMgaW5kaWNhdGlvbnMgY2ktZGVzc291cyA6XCIsXG4gICAgaW5mb3NOYkRheXNBZG1pbjogXCJDZXQgYWJvbm5lbWVudCBlc3QgZW5jb3JlIHZhbGFibGUgPGI+cGVuZGFudCBOQl9EQVlTIGpvdXJzPC9iPi5cIixcbiAgICBpbmZvc0V4cGlyYXRlZEFkbWluOiBcIkNldCBhYm9ubmVtZW50IGEgZXhwaXLDqS5cIiwgIFxuICAgIGlzTm90VmFsaWRlZCA6IFwiQ2V0IHV0aWxpc2F0ZXVyIG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS48YnI+Vm91cyBwb3V2ZXogbGUgZmFpcmUgw6Agc2EgcGxhY2UgPGEgaHJlZj0nI3ZhbGlkYXRpb25Payc+ZW4gY29jaGFudCBsYSBjYXNlIGluZGlxdcOpZTwvYT4gZXQgZW5yZWdpc3RyYW50LlwiLFxuICAgIGluZm9zUGF5bWVudHNBZG1pbiA6IFwiREFURV9QQVlNRU5UIDogcGFpZW1lbnQgZGUgQU1PVU5UIOKCrCBhdSBub20gZGUgQ0xJRU5UX05BTUUuXCIsXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5vdEZvdW5kOiBcIkwndXRpbGlzYXRldXIgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWROYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdOYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgNzAgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEVtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB2b3RyZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBuZWVkVW5pcXVlRW1haWw6IFwiTCdhZHJlc3NlIGUtbWFpbCBxdWUgdm91cyBhdmV6IHNhaXNpZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwYXIgdW4gYXV0cmUgdXRpbGlzYXRldXIuIFNpIHZvdXMgYXZleiBkw6lqw6AgdW4gY29tcHRlLCA8YSBocmVmPScvI1VSTCc+Y2xpcXVlei1pY2kgcG91ciB2b3VzIGNvbm5lY3RlcjwvYT4uXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdW5lIGFkcmVzc2UgZS1tYWlsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlLlwiLFxuICAgIG5lZWRMb25nUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlIGQnYXUgbW9pbnMgTUlOX0xFTkdUSCBjYXJhY3TDqHJlcy5cIixcbiAgICBwYXNzd29yZENvcGllZDogXCJMZSBtb3QgZGUgcGFzc2UgZ8OpbsOpcsOpIGEgw6l0w6kgY29wacOpIGRhbnMgbGUgcHJlc3NlLXBhcGllci4gVm91cyBwb3V2ZXogbGUgcmVjb3BpZXIgb8O5IHZvdXMgbGUgc291aGFpdGVyLlwiLFxuICAgIG5lZWRTdGF0dXMgOiBcIklsIG1hbnF1ZSBsZSBzdGF0dXQuXCIsXG4gICAgbmVlZExhbmd1YWdlIDogXCJJbCBtYW5xdWUgbGUgY29kZSBsYW5ndWUuXCIsXG4gICAgbmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIDogXCJMYSBkYXRlIGRlIGRlcm5pw6hyZSBjb25uZXhpb24gbidlc3QgcGFzIHZhbGlkZS5cIixcbiAgICBuZWVkU01UUCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkU01UUE5vdEZvdW5kIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRLbm93TmV3c2xldHRlck9rIDogXCJJbCBmYXV0IHNhdm9pciBzaSBsJ3V0aWxpc2F0ZXVyIGFjY2VwdGUgb3UgcmVmdXNlIGRlIHJlY2V2b2lyIGxhIG5ld3NsZXR0ZXIuXCIsXG4gICAgbmVlZFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGNvbm5hw650cmUgbGUgbm9tYnJlIGRlIG1pbnV0ZXMgZHUgZMOpY2FsYWdlIGhvcmFpcmUuXCIsXG4gICAgbmVlZE1pblRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgZW5sZXZlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA3MjAuXCIsXG4gICAgbmVlZE1heFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgYWpvdXRlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA4NDAuXCIsXG4gICAgbmVlZFVHQ09rIDogXCJWb3VzIGRldmV6IGFjY2VwdGVyIGxlcyBDR1UgcG91ciBwb3V2b2lyIGNyw6llciB2b3RyZSBjb21wdGUuIFwiLFxuICAgIGdvZGZhdGhlck5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIHZhbGlkZSB0cm91dsOpIHBvdXIgY2UgY29kZSBwYXJyYWluLlwiLFxuICAgIGdvZGZhdGhlckZvdW5kOiBcIlZvdHJlIHBhcnJhaW4gYSBiaWVuIMOpdMOpIHRyb3V2w6kgIVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBpbnNjcmlwdGlvbiBlc3QgYmllbiBlbnJlZ2lzdHLDqWUuXFxuUG91ciBsYSBmaW5hbGlzZXIsIG1lcmNpIGRlIGNsaXF1ZXIgZGFucyBsZXMgMjRIIHN1ciBsZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3RyZSBjb21wdGVcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2YWxpZGVyIHZvdHJlIGNvbXB0ZSwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aCA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGguPC9wPjxwPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5WYWxpZGVyLjwvYT48L3A+XCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgY29tcHRlIHZpZW50IGJpZW4gZCfDqnRyZSB2YWxpZMOpLiBNZXJjaSBldCBiaWVudmVudWUgITxicj5Wb3VzIHBvdXZleiBzYW5zIHRhcmRlciB2b3VzIGNvbm5lY3RlciBjaS1kZXNzb3VzIHBvdXIgYWNjw6lkZXIgw6Agdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlQWRtaW46IFwiTGUgY29tcHRlIGEgYmllbiDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW46IFwiQ2UgY29tcHRlIGEgZMOpasOgIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgbWFpbFdlbGNvbWVTdWJqZWN0IDogXCJCaWVudmVudWUgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuVm90cmUgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm90cmUgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS48L3A+PHA+TWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IDogXCJNZXJjaSAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuR3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS48L3A+PHA+TWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBjb25maXJtYXRpb24gbmUgc2VtYmxlIHBhcyB2YWxpZGUgb3UgYmllbiBpbCBhIGV4cGlyw6kuIFZvdXMgcG91dmV6IGVuIHJlY2V2b2lyIHVuIG5vdXZlYXUgPGEgaHJlZj0nI1VSTCc+ZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICBlbWFpbE5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIHRyb3V2w6kgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBhbHJlYWR5Q29ubmVjdGVkOiBcIlZvdXMgw6p0ZXMgZMOpasOgIGNvbm5lY3TDqShlKSBhdSBzaXRlICFcIixcbiAgICBuZWVkQmVDb25uZWN0ZWQ6IFwiVm91cyBkZXZleiDDqnRyZSBjb25uZWN0w6koZSkgcG91ciBhY2PDqWRlciDDoCBjZXR0ZSBwYWdlLlwiLFxuICAgIGNvbm5lY3Rpb25PazogXCJDb25uZXhpb24gcsOpdXNzaWUuXCIsXG4gICAgbmVlZENob29zZUxvZ2luV2F5OiBcIlZvdXMgZGV2ZXogc29pdCBzYWlzaXIgdm90cmUgbW90IGRlIHBhc3NlLCBzb2l0IGNvY2hlciBsYSBjYXNlIHZvdXMgcGVybWV0dGFudCBkZSByZWNldm9pciB1biBsaWVuIGRlIGNvbm5leGlvbiBwYXIgZS1tYWlsLlwiLFxuICAgIG5lZWRWYWxpZGF0aW9uVG9Mb2dpbiA6IFwiVm91cyBkZXZleiBkJ2Fib3JkIHZhbGlkZXIgdm90cmUgY29tcHRlIGF2YW50IGRlIHZvdXMgY29ubmVjdGVyLiBQb3VyIGNlIGZhaXJlLCB1biBsaWVuIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIHRvb01hbnlMb2dpbkZhaWxzIDogXCJUcm9wIGRlIHRlbnRhdGl2ZXMgZGUgY29ubmV4aW9uIGluZnJ1Y3R1ZXVzZXMgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC4gVm91cyBkZXZleiBhdHRlbmRyZSBNSU5VVEVTIG1pbnV0ZXMgcG91ciBlc3NheWVyIGRlIG5vdXZlYXUuXCIsXG4gICAgYmFkUGFzc3dvcmQ6IFwiTGUgbW90IGRlIHBhc3NlIG4nZXN0IHBhcyBsZSBib24uXCIsXG4gICAgbWFpbExvZ2luTGlua1N1YmplY3QgOiBcIlZvdHJlIGxpZW4gZGUgY29ubmV4aW9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDogTElOS19VUkxcIixcbiAgICBtYWlsTG9naW5MaW5rQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJWb3MgaW5mb3JtYXRpb25zIG9udCBiaWVuIMOpdMOpIG1pc2VzIMOgIGpvdXIuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSBjYXIgZWxsZSBuJ2EgcGFzIHVuZSBmb3JtYXQgY29ycmVjdC5cIixcbiAgICB1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIHNhaXNpZSAoTkVXX0VNQUlMKSBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGF1dHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5TdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2U6IFwiQ2VwZW5kYW50LCB2b3VzIGF2ZXogbW9kaWZpw6kgYXUgbW9pbnMgdW4gZGUgdm9zIGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24gKGVtYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi4gRW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIHVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlcjogXCJMJ3V0aWxpc2F0ZXVyIHF1ZSB2b3VzIHNvdWhhaXTDqSBtb2RpZmllciBuJ2V4aXN0ZSBwYXMvcGx1cyBvdSBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIDogXCJNYWlzIGxlIG5vdXZlYXUgY29kZSBwYXJyYWluIG4nYSBwdSDDqnRyZSByZXRlbnUsIGNhciBpbCBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBvdSDDoCBsJ3V0aWxpc2F0ZXVyIGx1aS1tw6ptZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2U6IFwiTGEgbWlzZSDDoCBqb3VyIGRlIHZvcyBpZGVudGlmaWFudHMgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICB1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQgOiBcIkwnaWRlbnRpZmlhbnQgZm91cm5pIHBvdXIgbGUgcGFycmFpbiBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIHV0aWxpc2F0ZXVyLlwiLFxuICAgIGNyZWF0aW9uT2tNZXNzYWdlOiBcIkxlIG5vdXZlbCB1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6kuXCIsXG4gICAgbWFpbERlbGV0ZVN1YmplY3QgOiBcIkNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRGVsZXRlQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxEZWxldGVMaW5rTWVzc2FnZTogXCJWb3RyZSBkZW1hbmRlIGRlIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuIE1lcmNpIGRlIGNsaXF1ZXIgc2FucyB0YXJkZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsIHBvdXIgY29uZmlybWVyLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZTogXCJMJ3V0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2U6IFwiVGVudGF0aXZlIGRlIHN1cHByZXNzaW9uIGQndW4gdXRpbGlzYXRldXIgaW5leGlzdGFudCA6IFwiLFxuICAgIG1haWxEZWxldGVMaW5rT2tNZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLiBNZXJjaSBkJ2F2b2lyIHV0aWxpc8OpIG5vcyBzZXJ2aWNlcy5cIixcbiAgICBtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgc3VwcHJlc3Npb24gbidlc3QgcGFzIHZhbGlkZSBvdSBhbG9ycyBpbCBuJ2VzdCBwbHVzIHZhbGFibGUuXCIsXG4gICAgY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgbm9uIHZhbGlkw6lzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIGRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBpbmFjdGlmcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICB3ZWxjb21lTWVzc2FnZTogXCJCaWVudmVudWUgI05BTUUgIVwiLFxuICAgIGJ5ZWJ5ZU1lc3NhZ2U6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgZMOpY29ubmV4aW9uIHMnZXN0IGJpZW4gZMOpcm91bMOpZS48YnI+w4AgYmllbnTDtHQgIVwiLFxuICAgIGluZm9zVXNlckZvckFkbWluOiBcIkNldCB1dGlsaXNhdGV1ciAoaWQ6IElEX1VTRVIpIGEgPGI+Y3LDqcOpIHNvbiBjb21wdGUgbGUgREFURV9DUkVBPC9iPiwgbGEgZGVybmnDqHJlIG1pc2Ugw6Agam91ciBkYXRhbnQgZHUgREFURV9VUERBVEUuPGJyPjxiPkRhdGUgZGUgc2EgZGVybmnDqHJlIGNvbm5leGlvbiA6IERBVEVfQ09OTkVDVElPTi48L2I+XCIsXG4gICAgaW5mb3NBZG1pbkdvZGZhdGhlcjogXCJDZXQgdXRpbGlzYXRldXIgYSDDqXTDqSBwYXJyYWluw6kgcGFyIFwiLFxuICAgIGluZm9zQWRtaW5OYkdvZENoaWxkczogXCJTZXMgI05CIGZpbGxldWlscyA6IFwiXG59OyIsIi8vIFF1ZWxxdWVzIGZvbmN0aW9ucyB1dGlsZXMgcG91ciBsZXMgY2hhw65uZXNcblxuY2xhc3MgVG9vbFxue1xuICAgIHN0YXRpYyBpc0VtcHR5KG15VmFyKVxuICAgIHtcbiAgICAgICAgaWYobXlWYXI9PT11bmRlZmluZWQgfHwgbXlWYXI9PT1udWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlWYXIrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlWYXI9bXlWYXIudHJpbSgpO1xuICAgICAgICAgICAgaWYobXlWYXI9PT1cIlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgdHJpbUlmTm90TnVsbChteVN0cmluZylcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShteVN0cmluZykpXG4gICAgICAgICAgICBteVN0cmluZz1udWxsO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgc2hvcnRlbklmTG9uZ2VyVGhhbihteVN0cmluZywgbWF4KVxuICAgIHtcbiAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gYXUgY2FzIG/DuSBjZWxhIG5lIHNlcmFpdCBwYXMgdW5lIGNoYcOubmUuLi5cbiAgICAgICBpZihteVN0cmluZy5sZW5ndGggPiBtYXgpXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy5zdWJzdHJpbmcoMCwgKG1heC0zKSkrXCIuLi5cIjtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE1NjA0MTQwL3JlcGxhY2UtbXVsdGlwbGUtc3RyaW5ncy13aXRoLW11bHRpcGxlLW90aGVyLXN0cmluZ3NcbiAgICBzdGF0aWMgcmVwbGFjZUFsbChteVN0cmluZywgbWFwT2JqKVxuICAgIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZUVsdHMgPSBuZXcgUmVnRXhwKE9iamVjdC5rZXlzKG1hcE9iaikuam9pbihcInxcIiksXCJnaVwiKTtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nLnJlcGxhY2UocmVwbGFjZUVsdHMsIChtYXRjaGVkKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbWFwT2JqW21hdGNoZWRdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PYmpldHNfZ2xvYmF1eC9NYXRoL3JhbmRvbVxuICAgIHN0YXRpYyBnZXRSYW5kb21JbnQobWluLCBtYXgpXG4gICAge1xuICAgICAgICBtaW4gPSBNYXRoLmNlaWwobWluKTtcbiAgICAgICAgbWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluO1xuICAgIH1cblxuICAgIC8vIMOgIGNvbXBsw6l0ZXIgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EYXRlX2Zvcm1hdF9ieV9jb3VudHJ5XG4gICAgc3RhdGljIGRhdGVGb3JtYXQoZGF0ZVN0cmluZywgbGFuZz1cImZyXCIpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkoZGF0ZVN0cmluZykpXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG15RGF0ZT1uZXcgRGF0ZShkYXRlU3RyaW5nKTtcbiAgICAgICAgbGV0IG15RGF5PW15RGF0ZS5nZXREYXRlKCkrXCJcIjtcbiAgICAgICAgaWYobXlEYXkubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15RGF5PVwiMFwiK215RGF5O1xuICAgICAgICBsZXQgbXlNb3VudGg9KG15RGF0ZS5nZXRNb250aCgpKzEpK1wiXCI7XG4gICAgICAgIGlmKG15TW91bnRoLmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteU1vdW50aD1cIjBcIitteU1vdW50aDtcbiAgICAgICAgbGV0IG15WWVhcj1teURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgaWYobGFuZz09PVwiZnJcIilcbiAgICAgICAgICAgIHJldHVybiBteURheStcIi9cIitteU1vdW50aCtcIi9cIitteVllYXI7XG4gICAgICAgIGVsc2UgaWYgKGxhbmc9PT1cImZvcm1cIikvLyAyMDE0LTAyLTA5XG4gICAgICAgICAgICByZXR1cm4gbXlZZWFyK1wiLVwiK215TW91bnRoK1wiLVwiK215RGF5O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbXlNb3VudGgrXCIvXCIrbXlEYXkrXCIvXCIrbXlZZWFyO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUb29sOyIsInZhciBtYXAgPSB7XG5cdFwiLi9kZWZhdWx0L2NvbmZpZy9mci5qc1wiOiBcIi4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5obXRcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCLDgCBwcm9wb3NcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2EtcHJvcG9zLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiIH0gfSxcbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlUuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5WLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d2Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDEwLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhICgqKSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwYXJ0YWfDqSBzdXIgV2lraUxlcm5pIHNvbnQgbGlicmVzLjxicj5Wb3VzIHBvdXZleiBsZXMgdXRpbGlzZXIsIGxlcyBtb2RpZmllciBldCBsZXMgZGlmZnVzZXIgc2Vsb24gdm90cmUgc291aGFpdC48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48YnI+PGJyPjxzbWFsbD48ZW0+KCopIEJpZW4gcXVlIHBhcnRhZ2VhbnQgc2VzIHZhbGV1cnMsIFdpa2lMZXJuaSBlc3QgdW4gcHJvamV0IGluZMOpcGVuZGFudCBkZSBsYSBmb25kYXRpb24gV2lraXDDqWRpYS48L2VtPjwvc21hbGw+XCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNUaXRsZTogXCJMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiTGlzdGUgZGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmkuXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5pID9cIixcbiAgICBleHBsYW5hdGlvblR4dDogXCJMZSBwcmluY2lwZSBlc3Qgc2ltcGxlIDogdm91cyBjb21tZW5jZXogcGFyIGxpcmUgbCdhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpLjxicj5QdWlzIHZvdXMgYWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlLiBWb3VzIG9idGVuZXogYWxvcnMgdm90cmUgcsOpc3VsdGF0IGltbcOpZGlhdGVtZW50Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlczwvYj4sIG1haXMgbGlicmUgw6Agdm91cyBkJ2Vzc2F5ZXIgZCd5IHLDqXBvbmRyZSBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuPGJyPkNlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IHBsdXNpZXVycyBqb3Vycywgc2VtYWluZXMsIG1vaXMuLi4gRXQgZGUgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBzdWdnZXN0aW9ucyBkZSBsZWN0dXJlcy48YnI+PGJyPk1haXMgPGI+bGEgY3LDqWF0aW9uIGRlIGNlIGNvbXB0ZSBlc3QgZmFjdWx0YXRpdmU8L2I+IGV0IDxhIGhyZWY9Jy9xdWl6cy8nIHRpdGxlPSdMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMnPnZvdXMgcG91dmV6IHBhcmNvdXJpciBXaWtpTGVybmkgbGlicmVtZW50PC9hPi5cIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxufTsiLCIvLyAtLSBHRVNUSU9OIERFUyBGT1JNVUxBSVJFUyBQRVJNRVRUQU5UIEFVWCBVVElMSVNBVEVVUlMgREUgTUVUVFJFIMOAIEpPVVIgTEVVUlMgSU5GT1JNQVRJT05TICsgTEVVUiBBQk9OTkVNRU5UXG5cbi8vLyBWw6lyaWZpZXIgcXVlIGwndXRpbGlzYXRldXIgZXN0IGJpZW4gY29ubmVjdMOpLCBhIGxlIGJvbiBzdGF0dXQgZXQgbGUgcmVkaXJpZ2VyIHZlcnMgbGUgZm9ybXVsYWlyZSBkJ2luc2NyaXB0aW9uIHNpIGNlIG4nZXN0IHBhcyBsZSBjYXMuXG4vLy8gU2kgYydlc3Qgb2ssIG9uIHLDqWN1cMOocmUgbGVzIGluZm9zIGRlIHNvbiBjb21wdGUgZXQgc29uIGFib25uZW1lbnQgZXQgbGVzIGFmZmljaGUgZGFucyBsZSBmb3JtdWxhaXJlLlxuLy8vIFVuZSBpbmZvcm1hdGlvbiBlc3QgYWZmaWNow6llIGNvbmNlcm5hbnQgbGEgcG9zc2liaWxpdMOpIGRlIHBhcnJhaW5hZ2UgZXQgbGVzIGxpc3RlcyBsZXMgZmlsbGV1aWxzIGV4aXN0YW50cy5cbi8vLyBVbiBtZW51IHBlcm1ldCDDoCBsJ3V0aWxpc2F0ZXVyIGQnYWNjw6lkZXIgw6AgbGEgbW9kaWZpY2F0aW9uIGRlIHNlcyBpbmZvcywgZXRjLlxuLy8vIERlcyBib3V0b25zIGRlIHBhaWVtZW50IHNvbnQgYXVzc2kgYWZmaWNow6lzIHN1aXZhbnQgbGUgY2hvaXggZGUgbCd1dGlsaXNhdGV1ciBwb3VyIGx1aSBwZXJtZXR0cmUgZGUgcHJvbG9uZ2VyIHNvbiBhYm9ubmVtZW50LlxuLy8vIFVuIG1lc3NhZ2UgdmVuYW50IGQndW5lIGF1dHJlIHBhZ2UgcGV1dCBhdXNzaSDDqnRyZSDDoCBhZmZpY2hlciBsb3JzIGR1IHByZW1pZXIgY2hhcmdlbWVudC5cblxuLy8vIEFqb3V0IHRlc3QgZW1haWwgZW4gZG91YmxvbiBhdmFudCBlbnZvaSA/XG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBjw7R0w6kgY2xpZW50IDpcbmltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHRoZW1lIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcbmNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG4vLyBGb25jdGlvbnMgdXRpbGVzIGF1IHNjcmlwdCA6ICEhIHJldm9pciBxdWFuZCBsZSByZXN0IHNlcmEgZmluaSBwb3VyIHbDqXJpZmllciBzaSB0b3V0IGVzdCB1dGlsZVxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiwgdXBkYXRlQWNjb3VudExpbmsgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBnZXREYXRhc0Zyb21JbnB1dHMsIHNldEF0dHJpYnV0ZXNUb0lucHV0cyB9IGZyb20gXCIuL3Rvb2xzL2Zvcm1zLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5LCByZXBsYWNlQWxsIH0gZnJvbSBcIi4uLy4uL3Rvb2xzL21haW5cIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBnZXRUaW1lRGlmZmVyZW5jZSB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5jb25zdCB0eHRTdWJzY3JpcHRpb25zID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9zdWJzY3JpcHRpb25cIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBkaXZNYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYWluLWNvbnRlbnRcIik7XG5jb25zdCBkaXZNZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXNzYWdlXCIpO1xuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuY29uc3QgZGl2R29kY2hpbGRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJnb2RjaGlsZHNcIik7XG5jb25zdCBkaXZTdWJzY3JpYmVJbnRybyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3Vic2NyaWJlSW50cm9cIik7XG5jb25zdCBmb3JtQWNjb3VudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudFVwZGF0ZVwiKTtcbmNvbnN0IG5ld1Bhc3N3b3JkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJuZXdQYXNzd29yZFwiKTtcbmNvbnN0IHNob3dHRkVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJnb2RmYXRoZXJFbWFpbFwiKTtcbmNvbnN0IHNob3dHRkNvZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdvZGZhdGhlckNvZGVcIik7XG5cbmhlbGxvRGV2KCk7XG5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHsgICAgICAgIFxuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRDb25maWcoKTtcbiAgICAgICAgaWYoIWNvbmZpZylcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBTaSBsJ3V0aWxpc2F0ZXVyIG4nZXN0IHBhcyBjb25uZWN0w6kgYXZlYyBsZSBib24gc3RhdHV0LCBwYXMgbGEgcGVpbmUgZCdhbGxlciArIGxvaW4gOlxuICAgICAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKFtcInVzZXJcIl0sIFwiL1wiK2NvbmZpZ0Zyb250RW5kLmNvbm5lY3Rpb25QYWdlLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLm5lZWRCZUNvbm5lY3RlZCwgY29sb3I6XCJlcnJvclwiIH0sIHdpbmRvdy5sb2NhdGlvbik7XG4gICAgICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXZNYWluLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KGdldExvY2FseShcIm1lc3NhZ2VcIikpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5tZXNzYWdlLCBcIlwiLCBbZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5jb2xvcl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibWVzc2FnZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdGcm9udEVuZCk7XG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbGlzZSBsZSBmb3JtdWxhaXJlIHBlcm1ldHRhbnQgZGUgbWV0dHJlIMOgIGpvdXIgbGVzIGluZm9zIDpcbiAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMoY29uZmlnLCBmb3JtQWNjb3VudCk7XG4gICAgICAgICAgICAgICAgLy8gQ2VydGFpbnMgbmF2aWdhdGV1cnMgb250IHRlbmRhbmNlIMOgIHJlbXBsaXIgdG91dCBzZXVsIGxlcyBjaGFtcHMgcGFzc3dvcmRcbiAgICAgICAgICAgICAgICBuZXdQYXNzd29yZC52YWx1ZT1cIlwiO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9uY3Rpb24gYWZmaWNoYW50IGxlcyBpbmZvcyBjb25udWVzIGF1IHByZW1pZXIgYWZmaWNoYWdlIHB1aXMgYXByw6hzIGVudm9pIG1pc2Ugw6Agam91clxuICAgICAgICAgICAgICAgIGNvbnN0IGdldEluZm9zID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhockdldEluZm9zID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy5nZXRVc2VySW5mb3MrdXNlci5pZCk7XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5Vc2VyICE9IHVuZGVmaW5lZCAmJiByZXNwb25zZS5TdWJzY3JpcHRpb24gIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIHJlc3BvbnNlLlVzZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1BY2NvdW50LmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlVzZXJbZGF0YV0hPT10cnVlICYmIHJlc3BvbnNlLlVzZXJbZGF0YV0hPT1mYWxzZSkvLyBib29sw6llbiA9IGNhc2Ugw6AgY29jaGVyICFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUFjY291bnQuZWxlbWVudHNbZGF0YV0udmFsdWU9cmVzcG9uc2UuVXNlcltkYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5Vc2VyW2RhdGFdPT10cnVlKSAvLyBzaSBmYWxzZSwgb24gbmUgZmFpdCByaWVuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQWNjb3VudC5lbGVtZW50c1tcIlwiK2RhdGFdLmNoZWNrZWQ9XCJjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3MgZGUgbCdhYm9ubmVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLlN1YnNjcmlwdGlvbi5ub3RpY2VPaz09dHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1BY2NvdW50LmVsZW1lbnRzW1wibm90aWNlT2tcIl0uY2hlY2tlZD1cImNoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gam91cnMgZGUgcsOpY2VwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UuU3Vic2NyaXB0aW9uLnJlY2VpcHREYXlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUFjY291bnQuZWxlbWVudHNbXCJkXCIrcmVzcG9uc2UuU3Vic2NyaXB0aW9uLnJlY2VpcHREYXlzW2ldXS5jaGVja2VkPVwiY2hlY2tlZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93R0ZFbWFpbC5pbm5lckhUTUw9cmVzcG9uc2UuVXNlci5lbWFpbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0dGQ29kZS5pbm5lckhUTUw9Y29uZmlnLmJlZ2luQ29kZUdvZGZhdGhlcityZXNwb25zZS5Vc2VyLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWdpblN1YlRTPW5ldyBEYXRlKHJlc3BvbnNlLlN1YnNjcmlwdGlvbi5jcmVhdGVkQXQpLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYkRheXNPaz1yZXNwb25zZS5TdWJzY3JpcHRpb24ubnVtYmVyT2ZEYXlzLU1hdGgucm91bmQoKERhdGUubm93KCktYmVnaW5TdWJUUykvMTAwMC8zNjAwLzI0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuYkRheXNPaz4wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlN1YnNjcmliZUludHJvLCBcInBcIiwgdHh0U3Vic2NyaXB0aW9ucy5pbmZvc05iRGF5cy5yZXBsYWNlKFwiTkJfREFZU1wiLCBuYkRheXNPayksIFwiXCIsIFtcImluZm9ybWF0aW9uXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlN1YnNjcmliZUludHJvLCBcInBcIiwgdHh0U3Vic2NyaXB0aW9ucy5pbmZvc0V4cGlyYXRlZC5yZXBsYWNlKFwiTkJfREFZU1wiLCBuYkRheXNPayksIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNzdWJzY3JpYmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhockdldEluZm9zLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICAgICAgeGhyR2V0SW5mb3Muc2VuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW1vbnRlIGxlcyBpbmZvcyBkw6lqw6AgZW5yZWdpc3Ryw6llcyA6XG4gICAgICAgICAgICAgICAgZ2V0SW5mb3MoKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gVHJhaXRlbWVudCBkZSBsJ2Vudm9pIGQndW5lIG1pc2Ugw6Agam91ciBkZXMgaW5mb3NcbiAgICAgICAgICAgICAgICBmb3JtQWNjb3VudC5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGRpdlJlc3BvbnNlLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YXM9Z2V0RGF0YXNGcm9tSW5wdXRzKGZvcm1BY2NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wb3NpdGlvbiBkZXMgam91cnMgdmFsYWJsZXMgcG91ciBsJ2Fib25uZW1lbnQgOlxuICAgICAgICAgICAgICAgICAgICBkYXRhcy5yZWNlaXB0RGF5cz1cIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MTsgaTw9NzsgaSsrKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhc1tcImRcIitpXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5yZWNlaXB0RGF5cys9XCJcIitpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzLm5vdGljZU9rPT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMubm90aWNlT2s9XCJmYWxzZVwiO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcy5uZXdzbGV0dGVyT2s9PT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5uZXdzbGV0dGVyT2s9XCJmYWxzZVwiO1xuICAgICAgICAgICAgICAgICAgICBkYXRhcy50aW1lRGlmZmVyZW5jZT1nZXRUaW1lRGlmZmVyZW5jZShjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHJVc2VyVXBkYXRlID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzLmRlbGV0ZU9rIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyVXNlclVwZGF0ZS5vcGVuKFwiREVMRVRFXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytcIi9cIit1c2VyLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyVXNlclVwZGF0ZS5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcudXBkYXRlVXNlckluZm9zK3VzZXIuaWQpO1xuICAgICAgICAgICAgICAgICAgICB4aHJVc2VyVXBkYXRlLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhbnMgdG91cyBsZXMgY2FzLCBqZSBtZXRzIMOgIGpvdXIgbGUgY29udGVudSBkdSBmb3JtdWxhaXJlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmZvcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclVzZXJVcGRhdGUuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclVzZXJVcGRhdGUuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhcy5vdXRwdXQ9XCJodG1sXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB4aHJVc2VyVXBkYXRlLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gb24gcGFzc2Ugw6AgbGEgY2Fpc3NlID9cbiAgICAgICAgICAgICAgICBjb25zdCBkaXZDR1Y9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJDR1ZPa1wiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYxODA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIxODBPa1wiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYzNjU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCIzNjVPa1wiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXZXUDE4MD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIldQQnRuMTgwXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpdldQMzY1PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BCdG4zNjVcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZGl2V1BOb25lPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiV1BOb25lXCIpO1xuICAgICAgICAgICAgICAgIGRpdkNHVi5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBjb21tZW5jZSBwYXIgdG91dCAocmUpY2FjaGVyIDpcbiAgICAgICAgICAgICAgICAgICAgZGl2V1AxODAuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgZGl2V1AzNjUuc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgZGl2V1BOb25lLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRpdkNHVi5jaGVja2VkPT09dHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGl2MTgwLmNoZWNrZWQ9PT10cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdldQMTgwLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihkaXYzNjUuY2hlY2tlZD09PXRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2V1AzNjUuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2V1BOb25lLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkNHVi5jaGVja2VkPWZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBMaXN0ZSBkZXMgZmlsbGV1aWxzLCBzaSBpbCB5IGVuIGEgLSByZXZvaXIgYWZmaWNoZXIgdW4gY29kZSBwYXJyYWluYWdlIGVuIHBsdXMgZGUgbCdlbWFpbFxuICAgICAgICAgICAgICAgIGNvbnN0IHhockdldEdvZGNoaWxkcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhockdldEdvZGNoaWxkcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcuZ2V0R29kQ2hpbGRzKTtcbiAgICAgICAgICAgICAgICB4aHJHZXRHb2RjaGlsZHMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCksIHR4dEdvZGNoaWxkcz1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmJHb2RjaGlsZHM9cmVzcG9uc2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5iR29kY2hpbGRzPT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0R29kY2hpbGRzPVwiUGFzIGVuY29yZSBkJ3V0aWxpc2F0ZXVyIGFzc29jacOpcyDDoCB2b3RyZSBjb21wdGUuXCI7Ly8gcmV2b2lyIDogdXRpbGlzZXIgbGUgZGljdGlvbm5haXJlIFVzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRHb2RjaGlsZHM9bmJHb2RjaGlsZHMrXCIgdXRpbGlzYXRldXIocykgaW5zY3JpdChzKSBncsOiY2Ugw6Agdm91cyA6IFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRHb2RjaGlsZHMrPXJlc3BvbnNlW2ldLm5hbWUrXCIgKFwiK3Jlc3BvbnNlW2ldLmVtYWlsK1wiKSBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkdvZGNoaWxkcywgXCJwXCIsIHR4dEdvZGNoaWxkcywgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhockdldEdvZGNoaWxkcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTsgXG4gICAgICAgICAgICAgICAgeGhyR2V0R29kY2hpbGRzLnNlbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/front/public/JS/connection.app.js b/front/public/JS/connection.app.js
new file mode 100644
index 0000000..eb54c21
--- /dev/null
+++ b/front/public/JS/connection.app.js
@@ -0,0 +1,1294 @@
+/******/ (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/connection.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",
+ senderEmail: "bonjour@wikilerni.com",
+ adminLang: "fr",
+ theme: "default",
+ // 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",
+ beginCodeGodfather: "wikilerni",
+ // 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: 10,
+ // 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",
+ searchAdminQuestionnairesRoute: "/searchadmin",
+ getListNextQuestionnaires: "/getlistnextquestionnaires/",
+ // -- 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: 10,
+ 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
+
+};
+
+/***/ }),
+
+/***/ "../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 : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/connection.js":
+/*!***************************!*\
+ !*** ./src/connection.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_forms_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __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); }); }; }
+
+// -- GESTION DU FORMULAIRE PERMETTANT DE SE CONNECTER
+/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page de connexion
+/// Dans ce cas il faut enregistrer son résultat en même temps, une fois la connexion validée
+/// Le connexion peut se faire directement ici via la saisie d'un mot de passe
+/// Ou via l'envoi d'un token par e-mail
+// Fichier de configuration tirés du backend :
+
+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 utile au script :
+
+
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
+
+var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); // Principaux éléments du DOM manipulés :
+
+
+var myForm = document.getElementById("connection");
+var divMessage = document.getElementById("message");
+var divResponse = document.getElementById("response");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["helloDev"])(); // Test de connexion de l'utilisateur + affichage formulaire d'inscription.
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var isConnected, user, homePage;
+ 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_7__["checkSession"])();
+
+ case 3:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", {
+ message: txtUsers.alreadyConnected,
+ color: "information"
+ }); // pour l'afficher sur la page suivante
+
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user", true);
+ homePage = user.status + "HomePage";
+ window.location.assign("/" + configTemplate[homePage]);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txtUsers.alreadyConnected, "", ["information"]); // au cas où blocage redirection
+ } else {
+ myForm.style.display = "block";
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("message"))) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("message", true).color]);
+ ;
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("message");
+ }
+ }
+
+ _context.next = 10;
+ break;
+
+ case 7:
+ _context.prev = 7;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+
+ case 10:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 7]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise(); // Traitement de l'envoi des données de connexion :
+
+myForm.addEventListener("submit", function (e) {
+ try {
+ e.preventDefault();
+ divResponse.innerHTML = ""; // efface d'éventuels messages déj à affichés
+
+ var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_5__["getDatasFromInputs"])(myForm);
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(datas.password) && Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(datas.getLoginLink)) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txtUsers.needChooseLoginWay, "", ["error"]);else {
+ var xhr = new XMLHttpRequest();
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(datas.getLoginLink)) xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["getLoginLinkRoute"]);else xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["connectionRoute"]);
+
+ xhr.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200) {
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(response.message)) {
+ // cas d'une demande de lien de connexion
+ myForm.style.display = "none";
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", response.message, "", ["success"]);
+ } else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(response.userId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(response.connexionTime) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(response.token)) {
+ // cas d'une connexion directe, on créé une session de connexion et redirige l'utilisateur
+ var connexionMaxTime = Date.now();
+ if (response.connexionTime.endsWith("days")) connexionMaxTime += parseInt(response.connexionTime, 10) * 24 * 3600 * 1000;else connexionMaxTime += parseInt(response.connexionTime, 10) * 3600 * 1000;
+ Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["setSession"])(response.userId, response.token, connexionMaxTime);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("lastAnswer"); // ! important pour ne pas enregister plusieurs fois le résultat
+
+ myForm.style.display = "none";
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txtUsers.connectionOk, "", ["success"]); // au cas où blocage redirection
+ // l'utilisateur peut avoir tenté d'accéder à une autre page que sa page d'acceuil :
+
+ var url = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("url", true);
+ console.log(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"]);
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(url) && url.href.indexOf(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"]) !== -1) {
+ url = url.href;
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("url");
+ } else url = configTemplate[response.status + "HomePage"];
+
+ console.log(url);
+ window.location.assign(url);
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ } else if (response.errors) {
+ if (Array.isArray(response.errors)) response.errors = response.errors.join(" ");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", txt.serverError, "", ["error"]);
+ }
+ };
+
+ xhr.setRequestHeader("Content-Type", "application/json");
+
+ if (datas) {
+ datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["getTimeDifference"])(); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat :
+
+ datas = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkAnswerDatas"])(datas);
+ xhr.send(JSON.stringify(datas));
+ }
+ }
+ } catch (e) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ }
+});
+
+/***/ }),
+
+/***/ "./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, " "); // 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 est lisible sur gitlab : \n Bonne lecture :-) \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/forms.js":
+/*!****************************!*\
+ !*** ./src/tools/forms.js ***!
+ \****************************/
+/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) {
+ for (var i in myForm.elements) {
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) {
+ var idInput = myForm.elements[i].id;
+
+ if (inputsConf[idInput] !== undefined) {
+ var inputHTML = document.getElementById(idInput);
+
+ for (var attribute in inputsConf[idInput]) {
+ inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);
+ }
+ }
+ }
+ }
+
+ return true;
+}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.
+
+var getDatasFromInputs = function getDatasFromInputs(myForm) {
+ var datas = {};
+ var formData = new FormData(myForm);
+
+ var _iterator = _createForOfIteratorHelper(formData.entries()),
+ _step;
+
+ try {
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
+ var entrie = _step.value;
+ datas[entrie[0]] = entrie[1];
+ }
+ } catch (err) {
+ _iterator.e(err);
+ } finally {
+ _iterator.f();
+ }
+
+ return datas;
+}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
+// Revoir pour les select
+
+var empyForm = function empyForm(myForm) {
+ var formData = new FormData(myForm);
+
+ var _iterator2 = _createForOfIteratorHelper(formData.entries()),
+ _step2;
+
+ try {
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+ var entrie = _step2.value;
+ if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = "";
+ }
+ } catch (err) {
+ _iterator2.e(err);
+ } finally {
+ _iterator2.f();
+ }
+
+ return true;
+}; // Vide et cache le formulaire
+
+var empyAndHideForm = function empyAndHideForm(myForm) {
+ empyForm(myForm);
+ myForm.style.display = "none";
+};
+
+/***/ }),
+
+/***/ "./src/tools/users.js":
+/*!****************************!*\
+ !*** ./src/tools/users.js ***!
+ \****************************/
+/*! exports provided: 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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9jb25uZWN0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2Zvcm1zLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZSIsImRpcldlYlF1ZXN0aW9ubmFpcmUiLCJxdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsInByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzIiwicHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcyIsInNhdmVBbnN3ZXJzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwic2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlciIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsImdldEFkbWluU3RhdHMiLCJRdWVzdGlvbm5haXJlIiwidGl0bGUiLCJtYXhsZW5ndGgiLCJyZXF1aXJlZCIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIlF1ZXN0aW9uIiwidGV4dCIsInJhbmsiLCJtaW4iLCJkZWZhdWx0VmFsdWUiLCJDaG9pY2UiLCJuYlRhZ3NNaW4iLCJuYlRhZ3NNYXgiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MVGFncyIsImRpcldlYlRhZ3MiLCJ1c2VyUm91dGVzIiwic3Vic2NyaWJlUm91dGUiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiZ2V0TG9naW5MaW5rUm91dGUiLCJjb25uZWN0aW9uV2l0aExpbmtSb3V0ZSIsImdldFVzZXJJbmZvcyIsImNyZWF0ZVVzZXJSb3V0ZSIsInZhbGlkYXRlVXNlclJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwic2VhcmNoVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJ1bnN1YnNjcmliZVJvdXRlIiwibmFtZSIsImVtYWlsIiwibmV3UGFzc3dvcmQiLCJjb2RlR29kZmF0aGVyIiwiY2d1T2siLCJ2YWx1ZSIsInRpbWVEaWZmZXJlbmNlTWluIiwidGltZURpZmZlcmVuY2VNYXgiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5vdEZvdW5kIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRMYW5ndWFnZSIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwiY3JlYXRpb25Pa01lc3NhZ2UiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwid2VsY29tZU1lc3NhZ2UiLCJieWVieWVNZXNzYWdlIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiVG9vbCIsIm15VmFyIiwidW5kZWZpbmVkIiwidHJpbSIsIm15U3RyaW5nIiwiaXNFbXB0eSIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJjb25maWdUZW1wbGF0ZSIsInR4dCIsInR4dFVzZXJzIiwibXlGb3JtIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRpdk1lc3NhZ2UiLCJkaXZSZXNwb25zZSIsImhlbGxvRGV2IiwiaW5pdGlhbGlzZSIsImNoZWNrU2Vzc2lvbiIsImlzQ29ubmVjdGVkIiwic2F2ZUxvY2FseSIsIm1lc3NhZ2UiLCJjb2xvciIsInVzZXIiLCJnZXRMb2NhbHkiLCJob21lUGFnZSIsInN0YXR1cyIsIndpbmRvdyIsImxvY2F0aW9uIiwiYXNzaWduIiwiYWRkRWxlbWVudCIsInN0eWxlIiwiZGlzcGxheSIsInJlbW92ZUxvY2FseSIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwicHJldmVudERlZmF1bHQiLCJpbm5lckhUTUwiLCJkYXRhcyIsImdldERhdGFzRnJvbUlucHV0cyIsImdldExvZ2luTGluayIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJ1c2VySWQiLCJjb25uZXhpb25UaW1lIiwidG9rZW4iLCJjb25uZXhpb25NYXhUaW1lIiwibm93IiwiZW5kc1dpdGgiLCJwYXJzZUludCIsInNldFNlc3Npb24iLCJ1cmwiLCJjb25zb2xlIiwibG9nIiwiaW5kZXhPZiIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInNldFJlcXVlc3RIZWFkZXIiLCJ0aW1lRGlmZmVyZW5jZSIsImdldFRpbWVEaWZmZXJlbmNlIiwiY2hlY2tBbnN3ZXJEYXRhcyIsInNlbmQiLCJzdHJpbmdpZnkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJhcHBlbmRDaGlsZCIsInVwZGF0ZUFjY291bnRMaW5rIiwibGluayIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImlucHV0c0NvbmYiLCJlbGVtZW50cyIsImlkSW5wdXQiLCJpbnB1dEhUTUwiLCJhdHRyaWJ1dGUiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiZW50cmllcyIsImVudHJpZSIsImVtcHlGb3JtIiwidHlwZSIsImNoZWNrZWQiLCJlbXB5QW5kSGlkZUZvcm0iLCJnZXRDb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9ubG9hZCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsImlzVmFsaWQiLCJsYW5ndWFnZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ2xGQSxJQUFNQSxLQUFLLEdBQUdDLG1CQUFPLENBQUMsbUNBQUQsQ0FBckI7O0FBQ0EsSUFBTUMsY0FBYyxHQUFHRCxtQkFBTyxDQUFDLHFEQUFELENBQTlCOztBQUVBRSxNQUFNLENBQUNDLE9BQVA7QUFFSUMsUUFBTSxFQUFFLDJCQUZaO0FBR0lDLFNBQU8sRUFBRSx1QkFIYjtBQUlJQyxXQUFTLEVBQUUsU0FKZjtBQUtJQyxZQUFVLEVBQUUsbUJBTGhCO0FBTUlDLFlBQVUsRUFBRSxXQU5oQjtBQU9JQyxhQUFXLEVBQUUsdUJBUGpCO0FBUUlDLFdBQVMsRUFBRSxJQVJmO0FBU0lDLE9BQUssRUFBRSxTQVRYO0FBU3NCO0FB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LEtBQUQsQ0FBUDtBQUNIO0FBQ0oscUJBbENELE1Bb0NBO0FBQ0k3RSw0RkFBWSxDQUFDLE1BQUQsQ0FBWjtBQUNBcUcsa0NBQVksQ0FBQ0gsY0FBRCxFQUFpQjlHLE9BQWpCLEVBQTBCK0csU0FBMUIsQ0FBWjtBQUNBdEIsNkJBQU8sQ0FBQyxLQUFELENBQVA7QUFDSDtBQUNKLG1CQTVDRDs7QUE2Q0FyRSxxQkFBRyxDQUFDd0UsT0FBSixHQUFjO0FBQUEsMkJBQU1GLE1BQU0sQ0FBQ3RFLEdBQUcsQ0FBQ3lFLFVBQUwsQ0FBWjtBQUFBLG1CQUFkOztBQUNBekUscUJBQUcsQ0FBQzZCLElBQUo7QUFDSDtBQUNKO0FBQ0osYUF0RU0sQ0FGaUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBSDs7QUFBQSxrQkFBWnBELFlBQVk7QUFBQTtBQUFBO0FBQUEsR0FBbEIsQyxDQTBFUDs7QUFDQSxJQUFNb0gsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQjlHLE9BQWpCLEVBQTBCK0csU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUNsTCwyREFBTyxDQUFDbUUsT0FBRCxDQUFYLEVBQ0lELG9FQUFVLENBQUMsU0FBRCxFQUFZQyxPQUFaLENBQVY7QUFDSixNQUFHLENBQUNuRSwyREFBTyxDQUFDa0wsU0FBRCxDQUFYLEVBQ0loSCxvRUFBVSxDQUFDLEtBQUQsRUFBUWdILFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQ2xMLDJEQUFPLENBQUNpTCxjQUFELENBQVgsRUFDSXhHLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsTUFBaEIsQ0FBdUJzRyxjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2Nvbm5lY3Rpb24uYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvY29ubmVjdGlvbi5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBEVSBGT1JNVUxBSVJFIFBFUk1FVFRBTlQgREUgU0UgQ09OTkVDVEVSXG5cbi8vLyBMJ3V0aWxpc2F0ZXVyIHBldXQgYXZvaXIgcsOpcG9uZHUgw6AgdW4gcXVpeiBhdmFudCBkJ2Fycml2ZXIgc3VyIGxhIHBhZ2UgZGUgY29ubmV4aW9uXG4vLy8gRGFucyBjZSBjYXMgaWwgZmF1dCBlbnJlZ2lzdHJlciBzb24gcsOpc3VsdGF0IGVuIG3Dqm1lIHRlbXBzLCB1bmUgZm9pcyBsYSBjb25uZXhpb24gdmFsaWTDqWVcblxuLy8vIExlIGNvbm5leGlvbiBwZXV0IHNlIGZhaXJlIGRpcmVjdGVtZW50IGljaSB2aWEgbGEgc2Fpc2llIGQndW4gbW90IGRlIHBhc3NlXG4vLy8gT3UgdmlhIGwnZW52b2kgZCd1biB0b2tlbiBwYXIgZS1tYWlsXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiB0aXLDqXMgZHUgYmFja2VuZCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmltcG9ydCB7IGNvbm5lY3Rpb25Sb3V0ZSwgZ2V0TG9naW5MaW5rUm91dGUsIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZSBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldERhdGFzRnJvbUlucHV0cyB9IGZyb20gXCIuL3Rvb2xzL2Zvcm1zLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uL3Rvb2xzL21haW5cIjtcbmltcG9ydCB7IGNoZWNrQW5zd2VyRGF0YXMsIGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBnZXRUaW1lRGlmZmVyZW5jZSwgc2V0U2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBteUZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbm5lY3Rpb25cIik7XG5jb25zdCBkaXZNZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXNzYWdlXCIpO1xuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuXG5oZWxsb0RldigpO1xuXG4vLyBUZXN0IGRlIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyICsgYWZmaWNoYWdlIGZvcm11bGFpcmUgZCdpbnNjcmlwdGlvbi5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKCk7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLmFscmVhZHlDb25uZWN0ZWQsIGNvbG9yOlwiaW5mb3JtYXRpb25cIiB9KTsvLyBwb3VyIGwnYWZmaWNoZXIgc3VyIGxhIHBhZ2Ugc3VpdmFudGVcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdKTtcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5hbHJlYWR5Q29ubmVjdGVkLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7Ly8gYXUgY2FzIG/DucKgYmxvY2FnZSByZWRpcmVjdGlvblxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgaWYoIWlzRW1wdHkoZ2V0TG9jYWx5KFwibWVzc2FnZVwiKSkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5tZXNzYWdlLCBcIlwiLCBbZ2V0TG9jYWx5KFwibWVzc2FnZVwiLCB0cnVlKS5jb2xvcl0pOztcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJtZXNzYWdlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7XG5cbi8vIFRyYWl0ZW1lbnQgZGUgbCdlbnZvaSBkZXMgZG9ubsOpZXMgZGUgY29ubmV4aW9uIDpcbm15Rm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGRpdlJlc3BvbnNlLmlubmVySFRNTD1cIlwiOy8vIGVmZmFjZSBkJ8OpdmVudHVlbHMgbWVzc2FnZXMgZMOpaiDDoCBhZmZpY2jDqXNcbiAgICAgICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhteUZvcm0pO1xuICAgICAgICBpZihpc0VtcHR5KGRhdGFzLnBhc3N3b3JkKSAmJiBpc0VtcHR5KGRhdGFzLmdldExvZ2luTGluaykpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0VXNlcnMubmVlZENob29zZUxvZ2luV2F5LCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5nZXRMb2dpbkxpbmspKVxuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrdXNlclJvdXRlcytnZXRMb2dpbkxpbmtSb3V0ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIGFwaVVybCt1c2VyUm91dGVzK2Nvbm5lY3Rpb25Sb3V0ZSk7XG4gICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KHJlc3BvbnNlLm1lc3NhZ2UpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgLy8gY2FzIGQndW5lIGRlbWFuZGUgZGUgbGllbiBkZSBjb25uZXhpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc0VtcHR5KHJlc3BvbnNlLnVzZXJJZCkgJiYgIWlzRW1wdHkocmVzcG9uc2UuY29ubmV4aW9uVGltZSkgJiYgIWlzRW1wdHkocmVzcG9uc2UudG9rZW4pKVxuICAgICAgICAgICAgICAgICAgICAgICAgeyAgIC8vIGNhcyBkJ3VuZSBjb25uZXhpb24gZGlyZWN0ZSwgb24gY3LDqcOpIHVuZSBzZXNzaW9uIGRlIGNvbm5leGlvbiBldCByZWRpcmlnZSBsJ3V0aWxpc2F0ZXVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbm5leGlvbk1heFRpbWU9RGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5jb25uZXhpb25UaW1lLmVuZHNXaXRoKFwiZGF5c1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmV4aW9uTWF4VGltZSs9cGFyc2VJbnQocmVzcG9uc2UuY29ubmV4aW9uVGltZSwxMCkqMjQqMzYwMCoxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmV4aW9uTWF4VGltZSs9cGFyc2VJbnQocmVzcG9uc2UuY29ubmV4aW9uVGltZSwxMCkqMzYwMCoxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlc3Npb24ocmVzcG9uc2UudXNlcklkLCByZXNwb25zZS50b2tlbiwgY29ubmV4aW9uTWF4VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibGFzdEFuc3dlclwiKTsvLyAhIGltcG9ydGFudCBwb3VyIG5lIHBhcyBlbnJlZ2lzdGVyIHBsdXNpZXVycyBmb2lzIGxlIHLDqXN1bHRhdCAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5jb25uZWN0aW9uT2ssIFwiXCIsIFtcInN1Y2Nlc3NcIl0pOy8vIGF1IGNhcyBvw7kgYmxvY2FnZSByZWRpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGwndXRpbGlzYXRldXIgcGV1dCBhdm9pciB0ZW50w6kgZCdhY2PDqWRlciDDoCB1bmUgYXV0cmUgcGFnZSBxdWUgc2EgcGFnZSBkJ2FjY2V1aWwgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmw9Z2V0TG9jYWx5KFwidXJsXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHNpdGVVcmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KHVybCkgJiYgdXJsLmhyZWYuaW5kZXhPZihzaXRlVXJsKSE9PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsPXVybC5ocmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1cmxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsPWNvbmZpZ1RlbXBsYXRlW3Jlc3BvbnNlLnN0YXR1cytcIkhvbWVQYWdlXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9ycylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgIGlmKGRhdGFzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGFzLnRpbWVEaWZmZXJlbmNlPWdldFRpbWVEaWZmZXJlbmNlKCk7XG4gICAgICAgICAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBhIHByw6ljw6lkZW1lbnQgcsOpcG9uZHUgw6AgdW4gcXVpeiwgaidham91dGUgbGVzIGluZm9zIGRlIHNvbiByw6lzdWx0YXQgOlxuICAgICAgICAgICAgICAgIGRhdGFzPWNoZWNrQW5zd2VyRGF0YXMoZGF0YXMpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59KTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG4gTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IGVzdCBsaXNpYmxlIHN1ciBnaXRsYWIgOiBcXG4gQm9ubmUgbGVjdHVyZSA6LSkgXFxuIFBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3Qgc2V0QXR0cmlidXRlc1RvSW5wdXRzID0gKGlucHV0c0NvbmYsIG15Rm9ybSkgPT5cbntcbiAgICBmb3IobGV0IGkgaW4gbXlGb3JtLmVsZW1lbnRzKVxuICAgIHtcbiAgICAgICAgaWYoIWlzRW1wdHkobXlGb3JtLmVsZW1lbnRzW2ldLmlkKSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGlkSW5wdXQ9bXlGb3JtLmVsZW1lbnRzW2ldLmlkO1xuICAgICAgICAgICAgaWYoaW5wdXRzQ29uZltpZElucHV0XSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRIVE1MPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkSW5wdXQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGF0dHJpYnV0ZSBpbiBpbnB1dHNDb25mW2lkSW5wdXRdKVxuICAgICAgICAgICAgICAgICAgICBpbnB1dEhUTUwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5wdXRzQ29uZltpZElucHV0XVthdHRyaWJ1dGVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gUsOpY3Vww6hyZSB0b3V0ZXMgbGVzIHZhbGV1cnMgZGUgY2hhbXBzIGVuIG9tZXR0YW50IGxlcyBjaGVja2JveCBub24gY29jaMOpZXMsIGV0Yy5cbmV4cG9ydCBjb25zdCBnZXREYXRhc0Zyb21JbnB1dHMgPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGRhdGFzPXt9O1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgICAgIGRhdGFzW2VudHJpZVswXV09ZW50cmllWzFdO1xuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gVmlkZSB0b3VzIGxlcyBjaGFtcHMgZCd1biBmb3JtdWxhaXJlLCB5IGNvbXByaXMgaGlkZGVuLCBjaGVja2JveCwgZXRjLlxuLy8gUmV2b2lyIHBvdXIgbGVzIHNlbGVjdFxuZXhwb3J0IGNvbnN0IGVtcHlGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICB7XG4gICAgICAgIGlmKG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwiY2hlY2tib3hcIiB8fCBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cInJhZGlvXCIpXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS5jaGVja2VkPWZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS52YWx1ZT1cIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFZpZGUgZXQgY2FjaGUgbGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGVtcHlBbmRIaWRlRm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgZW1weUZvcm0obXlGb3JtKTtcbiAgICBteUZvcm0uc3R5bGUuZGlzcGxheT1cIm5vbmVcIjtcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBSw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkZSBjb25maWd1cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnNcbi8vIMOAIHRlcm1lLCB1biBmaWNoaWVyIHN0YXRpcXVlIGltcG9ydGFibGUgY29tbWUgbW9kdWxlIGRldnJhaXQgw6l2aXRlciB1bmUgcmVxdcOqdGUgYWpheFxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9ICBhc3luYyAoKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCtcIi91c2VyL2dldGNvbmZpZ1wiKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKCkgPT5cbntcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmKHRpbWVMb2NhbCA+IHRpbWVEaWZmZXJlbmNlTWF4IHx8IHRpbWVMb2NhbCA8IHRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG5leHBvcnQgY29uc3QgZ2V0UGFzc3dvcmQgPSAobmJDYXJNaW4sIG5iQ2FyTWF4KSA9Plxue1xuICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICB7XG4gICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgfVxuICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIHJldHVybiBwYXNzd29yZDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6XG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja0xvZ2luUm91dGUrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5pc1ZhbGlkICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuaWQ9PT11c2VyLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubmFtZT1yZXNwb25zZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubGFuZ3VhZ2U9cmVzcG9uc2UubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci50aW1lRGlmZmVyZW5jZT1yZXNwb25zZS50aW1lRGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7Ly8gbGUgdG9rZW4gZXQgZGUgdG91dGUgZmHDp29uIHbDqXJpZmllciDDoCBjaGFxdWUgcmVxdcOqdGUgw6AgbCdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwidXNlclwiLCB1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBpbCBzJ2FnaXQgZCd1biBcInVzZXJcIiBldCBxdWUgc29uIGFib25uZW1lbnQgYSBleHBpcsOpLCBqZSBsZSByZWRpcmlnZSB2ZXJzIGxhIGNhaXNzZSA6LSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXM9PT1cInVzZXJcIiAmJiByZXNwb25zZS5uYkRheXNPayA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQWNjb3VudD1zaXRlVXJsK1wiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/front/public/JS/deconnection.app.js b/front/public/JS/deconnection.app.js
new file mode 100644
index 0000000..f70fdb6
--- /dev/null
+++ b/front/public/JS/deconnection.app.js
@@ -0,0 +1,1113 @@
+/******/ (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/deconnection.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",
+ senderEmail: "bonjour@wikilerni.com",
+ adminLang: "fr",
+ theme: "default",
+ // 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",
+ beginCodeGodfather: "wikilerni",
+ // 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: 10,
+ // 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",
+ searchAdminQuestionnairesRoute: "/searchadmin",
+ getListNextQuestionnaires: "/getlistnextquestionnaires/",
+ // -- 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: 10,
+ 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
+
+};
+
+/***/ }),
+
+/***/ "../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 : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/deconnection.js":
+/*!*****************************!*\
+ !*** ./src/deconnection.js ***!
+ \*****************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_4__ = __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); }); }; }
+
+// -- GESTION DE LA PAGE DE DÉCONNEXION
+/// On se contente ici de supprimer la session stockée côté client
+// Fichier de configuration côté client :
+
+var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
+
+var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile au script :
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
+
+var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user");
+
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
+var divResponse = document.getElementById("response");
+var config;
+
+var initialise = /*#__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:
+ _context.prev = 0;
+ _context.next = 3;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_4__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+ if (!config) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);else {
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("user");
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("url");
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtUsers.byebyeMessage, "", ["success"]);
+ }
+ _context.next = 10;
+ break;
+
+ case 7:
+ _context.prev = 7;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+
+ case 10:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 7]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+
+/***/ }),
+
+/***/ "./src/tools/clientstorage.js":
+/*!************************************!*\
+ !*** ./src/tools/clientstorage.js ***!
+ \************************************/
+/*! exports provided: saveLocaly, getLocaly, removeLocaly */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
+// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
+// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
+var saveLocaly = function saveLocaly(name, data) {
+ localStorage.setItem(name, JSON.stringify(data));
+};
+var getLocaly = function getLocaly(name) {
+ var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
+};
+var removeLocaly = function removeLocaly(name) {
+ localStorage.removeItem(name);
+};
+
+/***/ }),
+
+/***/ "./src/tools/dom.js":
+/*!**************************!*\
+ !*** ./src/tools/dom.js ***!
+ \**************************/
+/*! exports provided: addElement */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var addElement = function addElement(eltParent, eltType) {
+ var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
+ var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
+ var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
+ var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
+ var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
+ var newElement = document.createElement(eltType);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
+ newElement.id = eltId;
+
+ if (Array.isArray(eltClass) && eltClass.length != 0) {
+ for (var i in eltClass) {
+ newElement.classList.add(eltClass[i]);
+ }
+ }
+
+ if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
+ {
+ for (var attributName in eltAttributes) {
+ newElement.setAttribute(attributName, eltAttributes[attributName]);
+ }
+ }
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, " "); // 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 est lisible sur gitlab : \n Bonne lecture :-) \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/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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9kZWNvbm5lY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJ0eHRVc2VycyIsImhlbGxvRGV2IiwiZGl2UmVzcG9uc2UiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiY29uZmlnIiwiaW5pdGlhbGlzZSIsImdldENvbmZpZyIsImFkZEVsZW1lbnQiLCJyZW1vdmVMb2NhbHkiLCJzYXZlTG9jYWx5IiwiZGF0YSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0TG9jYWx5IiwianNvbiIsInBhcnNlIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJBcnJheSIsImlzQXJyYXkiLCJpIiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwic2V0QXR0cmlidXRlIiwiaW5uZXJIVE1MIiwiYXBwZW5kQ2hpbGQiLCJjb25zb2xlIiwibG9nIiwidXBkYXRlQWNjb3VudExpbmsiLCJzdGF0dXMiLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25sb2FkIiwicmVzcG9uc2VUZXh0Iiwib25lcnJvciIsInN0YXR1c1RleHQiLCJzZW5kIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsImNoZWNrU2Vzc2lvbiIsInVybFJlZGlyZWN0aW9uIiwibWVzc2FnZSIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsInVzZXIiLCJub3ciLCJyZXNwb25zZSIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInRpbWVEaWZmZXJlbmNlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50Iiwid2luZG93IiwibG9jYXRpb24iLCJpbmRleE9mIiwiYXNzaWduIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFB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QyxTQUFELEVBQVlzRSxPQUFaLENBQVY7QUFDSixNQUFHLENBQUN4SSwyREFBTyxDQUFDeUksU0FBRCxDQUFYLEVBQ0l2RSxvRUFBVSxDQUFDLEtBQUQsRUFBUXVFLFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQ3pJLDJEQUFPLENBQUN1SSxjQUFELENBQVgsRUFDSWEsTUFBTSxDQUFDQyxRQUFQLENBQWdCRSxNQUFoQixDQUF1QmhCLGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvZGVjb25uZWN0aW9uLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2RlY29ubmVjdGlvbi5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBERSBMQSBQQUdFIERFIETDiUNPTk5FWElPTlxuXG4vLy8gT24gc2UgY29udGVudGUgaWNpIGRlIHN1cHByaW1lciBsYSBzZXNzaW9uIHN0b2Nrw6llIGPDtHTDqSBjbGllbnRcblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEltcG9ydGF0aW9uIGRlcyBmb25jdGlvbnMgdXRpbGUgYXUgc2NyaXB0IDpcbmltcG9ydCB7IHJlbW92ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2IH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB0eHQgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2dlbmVyYWxcIik7XG5jb25zdCB0eHRVc2VycyA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvdXNlclwiKTtcblxuaGVsbG9EZXYoKTtcblxuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xubGV0IGNvbmZpZztcbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVybFwiKTtcbiAgICAgICAgICAgIHJlbW92ZUxvY2FseShcIm1lc3NhZ2VcIik7XG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0VXNlcnMuYnllYnllTWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/front/public/JS/deleteValidation.app.js b/front/public/JS/deleteValidation.app.js
new file mode 100644
index 0000000..7b1d026
--- /dev/null
+++ b/front/public/JS/deleteValidation.app.js
@@ -0,0 +1,1168 @@
+/******/ (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/deleteValidation.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",
+ senderEmail: "bonjour@wikilerni.com",
+ adminLang: "fr",
+ theme: "default",
+ // 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",
+ beginCodeGodfather: "wikilerni",
+ // 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: 10,
+ // 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",
+ searchAdminQuestionnairesRoute: "/searchadmin",
+ getListNextQuestionnaires: "/getlistnextquestionnaires/",
+ // -- 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: 10,
+ 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
+
+};
+
+/***/ }),
+
+/***/ "../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 : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/deleteValidation.js":
+/*!*********************************!*\
+ !*** ./src/deleteValidation.js ***!
+ \*********************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __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); }); }; }
+
+// -- GESTION DE LA PAGE PERMETTANT DE VALIDER UN CHANGEMENT D'EMAIL OU DE MOT DE PASSE
+/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps.
+/// Si le token est ok, on valide la suppression, supprime la session de l'utilisateur et affiche un message de confirmation
+// Fichier de configuration côté client :
+
+var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
+
+var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile 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");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
+var config;
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var 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_5__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+ if (!config) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);else {
+ datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_4__["getUrlParams"])();
+
+ if (datas && datas.t !== undefined) {
+ xhr = new XMLHttpRequest();
+ xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.checkDeleteLinkRoute + datas.t);
+
+ xhr.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && response.message != undefined) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("user");
+ } else if (this.status === 400 && response.errors != undefined) {
+ if (Array.isArray(response.errors)) response.errors = response.errors.join(" ");else response.errors = txt.serverError;
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.accountPage), "", ["error"]);
+ }
+ };
+
+ xhr.setRequestHeader("Authorization", "Bearer " + datas.t);
+ xhr.send();
+ }
+ }
+ _context.next = 11;
+ break;
+
+ case 7:
+ _context.prev = 7;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ console.error(_context.t0);
+
+ case 11:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 7]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+
+/***/ }),
+
+/***/ "./src/tools/clientstorage.js":
+/*!************************************!*\
+ !*** ./src/tools/clientstorage.js ***!
+ \************************************/
+/*! exports provided: saveLocaly, getLocaly, removeLocaly */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
+// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
+// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
+var saveLocaly = function saveLocaly(name, data) {
+ localStorage.setItem(name, JSON.stringify(data));
+};
+var getLocaly = function getLocaly(name) {
+ var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
+};
+var removeLocaly = function removeLocaly(name) {
+ localStorage.removeItem(name);
+};
+
+/***/ }),
+
+/***/ "./src/tools/dom.js":
+/*!**************************!*\
+ !*** ./src/tools/dom.js ***!
+ \**************************/
+/*! exports provided: addElement */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var addElement = function addElement(eltParent, eltType) {
+ var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
+ var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
+ var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
+ var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
+ var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
+ var newElement = document.createElement(eltType);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
+ newElement.id = eltId;
+
+ if (Array.isArray(eltClass) && eltClass.length != 0) {
+ for (var i in eltClass) {
+ newElement.classList.add(eltClass[i]);
+ }
+ }
+
+ if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
+ {
+ for (var attributName in eltAttributes) {
+ newElement.setAttribute(attributName, eltAttributes[attributName]);
+ }
+ }
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, " "); // 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 est lisible sur gitlab : \n Bonne lecture :-) \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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9kZWxldGVWYWxpZGF0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnRnJvbnRFbmQiLCJ0eHQiLCJ0eHRVc2VycyIsImRpdlJlc3BvbnNlIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImhlbGxvRGV2IiwiY29uZmlnIiwiaW5pdGlhbGlzZSIsImdldENvbmZpZyIsImFkZEVsZW1lbnQiLCJkYXRhcyIsImdldFVybFBhcmFtcyIsInQiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0Iiwic3RhdHVzIiwibWVzc2FnZSIsInJlbW92ZUxvY2FseSIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInNldFJlcXVlc3RIZWFkZXIiLCJzZW5kIiwiY29uc29sZSIsImVycm9yIiwic2F2ZUxvY2FseSIsImRhdGEiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiZ2V0TG9jYWx5IiwianNvbiIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZWx0UGFyZW50IiwiZWx0VHlwZSIsImVsdENvbnRlbnQiLCJlbHRJZCIsImVsdENsYXNzIiwiZWx0QXR0cmlidXRlcyIsIm5ld0VsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaSIsImNsYXNzTGlzdCIsImFkZCIsImF0dHJpYnV0TmFtZSIsInNldEF0dHJpYnV0ZSIsImlubmVySFRNTCIsImFwcGVuZENoaWxkIiwibG9nIiwidXBkYXRlQWNjb3VudExpbmsiLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsImxvY2F0aW9uIiwic2VhcmNoIiwicGFyYW1ldGVycyIsInNwbGl0IiwicGFyYW0iLCJkZWNvZGVVUkkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9ubG9hZCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJjaGVja1Nlc3Npb24iLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsInVzZXIiLCJub3ciLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsIndpbmRvdyIsImluZGV4T2YiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNB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QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVppRSxZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTUksWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ0gsY0FBRCxFQUFpQnhFLE9BQWpCLEVBQTBCeUUsU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUN4SiwyREFBTyxDQUFDK0UsT0FBRCxDQUFYLEVBQ0lTLG9FQUFVLENBQUMsU0FBRCxFQUFZVCxPQUFaLENBQVY7QUFDSixNQUFHLENBQUMvRSwyREFBTyxDQUFDd0osU0FBRCxDQUFYLEVBQ0loRSxvRUFBVSxDQUFDLEtBQUQsRUFBUWdFLFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQ3hKLDJEQUFPLENBQUN1SixjQUFELENBQVgsRUFDSVcsTUFBTSxDQUFDN0MsUUFBUCxDQUFnQitDLE1BQWhCLENBQXVCYixjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2RlbGV0ZVZhbGlkYXRpb24uYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvZGVsZXRlVmFsaWRhdGlvbi5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBERSBMQSBQQUdFIFBFUk1FVFRBTlQgREUgVkFMSURFUiBVTiBDSEFOR0VNRU5UIEQnRU1BSUwgT1UgREUgTU9UIERFIFBBU1NFXG5cbi8vLyBVbiB0b2tlbiBlc3QgdHJhbnNtaXMgZW4gcGFyYW3DqHRyZSBkZSBsJ1VybC4gSWwgYSB1bmUgdmFsaWRpdMOpIGxpbWl0w6kgZGFucyBsZSB0ZW1wcy5cbi8vLyBTaSBsZSB0b2tlbiBlc3Qgb2ssIG9uIHZhbGlkZSBsYSBzdXBwcmVzc2lvbiwgc3VwcHJpbWUgbGEgc2Vzc2lvbiBkZSBsJ3V0aWxpc2F0ZXVyIGV0IGFmZmljaGUgdW4gbWVzc2FnZSBkZSBjb25maXJtYXRpb25cblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEltcG9ydGF0aW9uIGRlcyBmb25jdGlvbnMgdXRpbGUgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgYWRkRWxlbWVudCB9IGZyb20gXCIuL3Rvb2xzL2RvbS5qc1wiO1xuaW1wb3J0IHsgaGVsbG9EZXYgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tIFwiLi90b29scy91cmwuanNcIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBzZXRTZXNzaW9uIH0gZnJvbSBcIi4vdG9vbHMvdXNlcnMuanNcIjtcblxuLy8gRGljdGlvbm5haXJlcyA6XG5jb25zdCB0eHQgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2dlbmVyYWxcIik7XG5jb25zdCB0eHRVc2VycyA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvdXNlclwiKTtcblxuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuXG5oZWxsb0RldigpO1xuXG5sZXQgY29uZmlnO1xuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICBjb25maWcgPSBhd2FpdCBnZXRDb25maWcoKTtcbiAgICAgICAgaWYoIWNvbmZpZylcbiAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7ICAgICAgXG4gICAgICAgICAgICBjb25zdCBkYXRhcz1nZXRVcmxQYXJhbXMoKTtcbiAgICAgICAgICAgIGlmKGRhdGFzICYmIGRhdGFzLnQhPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy5jaGVja0RlbGV0ZUxpbmtSb3V0ZStkYXRhcy50KTtcbiAgICAgICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5tZXNzYWdlICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdHVzID09PSA0MDAgJiYgcmVzcG9uc2UuZXJyb3JzICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5iYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UucmVwbGFjZShcIiNVUkxcIiwgY29uZmlnRnJvbnRFbmQuYWNjb3VudFBhZ2UpLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK2RhdGFzLnQpOyBcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxufVxuaW5pdGlhbGlzZSgpOyIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcbiBMZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgZXN0IGxpc2libGUgc3VyIGdpdGxhYiA6IFxcbiBCb25uZSBsZWN0dXJlIDotKSBcXG4gUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiByw6ljdXDDqXJhbnQgbGVzIHBhcmFtw6h0cmVzIHBhc3PDqXMgcGFyIGwndXJsXG5leHBvcnQgY29uc3QgZ2V0VXJsUGFyYW1zID0gKCkgPT5cbntcbiAgICBpZihpc0VtcHR5KGxvY2F0aW9uLnNlYXJjaCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KFwiJlwiKTtcbiAgICBpZighQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJzKSB8fCBwYXJhbWV0ZXJzLmxlbmd0aD09PTApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgbGV0IHBhcmFtLCBkYXRhcz17fTtcbiAgICBmb3IobGV0IGkgaW4gcGFyYW1ldGVycylcbiAgICB7XG4gICAgICAgIHBhcmFtID0gcGFyYW1ldGVyc1tpXS5zcGxpdChcIj1cIik7XG4gICAgICAgIGlmKHBhcmFtLmxlbmd0aD09PTIpXG4gICAgICAgICAgICBkYXRhc1twYXJhbVswXV09ZGVjb2RlVVJJKHBhcmFtWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufSIsImltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHNpdGVVcmwsIHRoZW1lIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK1wiL3VzZXIvZ2V0Y29uZmlnXCIpO1xuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBsZSB0b2tlbiBldCBkZSB0b3V0ZSBmYcOnb24gdsOpcmlmaWVyIMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2UpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/front/public/JS/homeManager.app.js b/front/public/JS/homeManager.app.js
new file mode 100644
index 0000000..66cca7d
--- /dev/null
+++ b/front/public/JS/homeManager.app.js
@@ -0,0 +1,1278 @@
+/******/ (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/homeManager.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",
+ senderEmail: "bonjour@wikilerni.com",
+ adminLang: "fr",
+ theme: "default",
+ // 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",
+ beginCodeGodfather: "wikilerni",
+ // 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: 10,
+ // 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",
+ searchAdminQuestionnairesRoute: "/searchadmin",
+ getListNextQuestionnaires: "/getlistnextquestionnaires/",
+ // -- 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: 10,
+ 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
+
+};
+
+/***/ }),
+
+/***/ "../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 ^\\.\\/.*\\/questionnaire$":
+/*!********************************************!*\
+ !*** ../lang sync ^\.\/.*\/questionnaire$ ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var map = {
+ "./fr/questionnaire": "../lang/fr/questionnaire.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 ^\\.\\/.*\\/questionnaire$";
+
+/***/ }),
+
+/***/ "../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 : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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/questionnaire.js":
+/*!***********************************!*\
+ !*** ../lang/fr/questionnaire.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ needTitle: "Merci de fournir un titre à votre quiz.",
+ needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.",
+ needUrl: "Merci de fournir l'url à votre quiz.",
+ needUniqueUrl: "L'url du quiz doit être unique.",
+ needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.",
+ needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.",
+ needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.",
+ needLanguage: "Vous devez sélectionner la langue de ce quiz.",
+ needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.",
+ notFound: "Aucun quiz n'a pas été trouvé.",
+ searchResultTitle: "Résultat pour votre recherche",
+ searchNoResult: "Aucun résultat n'a été trouvé pour votre recherche",
+ searchWithResult: "#NB quizs correspondent à votre recherche :",
+ publishedBy: "Publié par",
+ publishedAt: ", le",
+ lastUpdated: "Dernière mise à jour, le ",
+ estimatedTime: "Durée de lecture estimée : ",
+ btnSendResponse: "Envoyez vos réponses",
+ btnProposeSubscribe: "Ok, je crée mon compte !",
+ btnProposeConnection: "J'ai déjà un compte, je me connecte.",
+ btnShowQuestionnaire: "Afficher le quiz !",
+ nextQuestionnairesList: "Les #NB prochains quizs devant être publiés",
+ needBeCompleted: "Quiz incomplet",
+ nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ",
+ haveBeenPublished: ":NB nouveaux questionnaires ont été publiés."
+};
+
+/***/ }),
+
+/***/ "../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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/homeManager.js":
+/*!****************************!*\
+ !*** ./src/homeManager.js ***!
+ \****************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __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 D'ACCUEIL POUR LES GESTIONNAIRES
+/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas.
+/// Si c'est ok, on récupère les stats générales et des dernières 24H et les affiche
+/// On liste ensuite les prochains quizs devant être publiés en faisant ressortir ceux devant être complétés + la prochaine date sans quiz
+/// Un menu permet à l'utilisateur d'accéder aux formulaires permettant de gérer les quizs et les comptes utilisateurs et abonnements
+/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement.
+// Fichier de configuration côté client :
+
+var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
+
+var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // 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 txtQuestionnaire = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire"); // Principaux éléments du DOM manipulés :
+
+
+var divMain = document.getElementById("main-content");
+var divMessage = document.getElementById("message");
+var divQuestionnaires = document.getElementById("questionnaires");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var config, isConnected, user, xhrStats, xhrNextQuestionnaires;
+ 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_5__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+
+ if (config) {
+ _context.next = 8;
+ break;
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ _context.next = 12;
+ break;
+
+ case 8:
+ _context.next = 10;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["checkSession"])(["manager", "admin"], "/" + configFrontEnd.connectionPage, {
+ message: txt.notAllowed,
+ color: "error"
+ });
+
+ case 10:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
+ Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "h4", txtUsers.welcomeMessage.replace("#NAME", user.name));
+ divMain.style.display = "block";
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
+ } // Les stats :
+
+
+ xhrStats = new XMLHttpRequest();
+ xhrStats.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getAdminStats);
+
+ xhrStats.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200) {
+ var mapText = {
+ NB_USERS_24H: response.nbNewUsers24H,
+ NB_SUBSCRIPTIONS_24H: response.Subscriptions.nbSubscriptions24H,
+ NB_USERS_DELETED_24H: response.nbDeletedUsers24H,
+ NB_ANSWERS_24H: response.Answers.nbAnswers24H,
+ NB_USERS_TOT: response.nbNewUsersTot,
+ NB_SUBSCRIPTIONS_TOT: response.Subscriptions.nbSubscriptionsTot,
+ NB_SUBSCRIPTIONS_PREMIUM: response.Subscriptions.nbSubscriptionsPremium,
+ NB_ANSWERS_TOT: response.Answers.nbAnswersTot,
+ NB_USERS_DELETED_TOT: response.nbDeletedUsersTot,
+ NB_USERS_DELETED_VALIDED: response.nbDeletedUsersWasValided,
+ NB_USERS_DELETED_PREMIUM: response.nbDeletedUsersTotWasPremium
+ };
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["replaceAll"])(txt.statsAdmin, mapText), "", "", "", false);
+ }
+ }
+ };
+
+ xhrStats.setRequestHeader("Authorization", "Bearer " + user.token);
+ xhrStats.send(); // Les questionnaires bientôt publiés :
+
+ xhrNextQuestionnaires = new XMLHttpRequest();
+ xhrNextQuestionnaires.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getListNextQuestionnaires);
+
+ xhrNextQuestionnaires.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && Array.isArray(response.questionnaires)) {
+ var listHTML = "";
+
+ for (var i in response.questionnaires) {
+ listHTML += "
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/homeUser.js":
+/*!*************************!*\
+ !*** ./src/homeUser.js ***!
+ \*************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
+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 D'ACCUEIL DE L'UTILISATEUR
+/// Vérifier que l'utilisateur est bien connecté, a le bon statut et le rediriger vers le formulaire d'inscription si ce n'est pas le cas.
+/// Si c'est ok, on récupère ses infos et stats + les derniers quizs auxquels il a accès, mais n'a pas répondu.
+/// Un moteur de recherche permet d'obtenir d'autres quizs parmi ceux publiés.
+/// Pour l'affichage des listings de quiz, l'API retourne directement du html.
+/// Un menu permet à l'utilisateur d'accéder à la modification de ses infos, de son abonnement, etc.
+/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement.
+/// Ajouter affichage anciens quizs à retentés si pas de quizs en attente ?
+/// Un quiz au hasard ?
+// Fichier de configuration côté client :
+
+var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
+
+var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // 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 txtAnwers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + lang + "/answer");
+
+var txtQuestionnaire = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire"); // Principaux éléments du DOM manipulés :
+
+
+var divMain = document.getElementById("main-content");
+var divMessage = document.getElementById("message");
+var quizTitle = document.getElementById("quizsTitle");
+var quizIntro = document.getElementById("quizsIntro");
+var quizListing = document.getElementById("quizsList");
+var quizPagination = document.getElementById("quizsPagination");
+var formSearch = document.getElementById("search");
+var inputBegin = document.getElementById("begin");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var config, isConnected, user, xhrStats, xhrLastQuizs, sendSearch;
+ 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__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+
+ if (config) {
+ _context.next = 8;
+ break;
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ _context.next = 12;
+ break;
+
+ case 8:
+ _context.next = 10;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])(["user"], "/" + configFrontEnd.connectionPage, {
+ message: txtUsers.needBeConnected,
+ color: "error"
+ }, window.location);
+
+ case 10:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
+ Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "h4", txtUsers.welcomeMessage.replace("#NAME", user.name));
+ divMain.style.display = "block";
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
+ } // Initialisation du formulaire de recherche :
+
+
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formSearch); // Les stats :
+
+ xhrStats = new XMLHttpRequest();
+ xhrStats.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getStatsAnswers + user.id);
+
+ xhrStats.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response.nbAnswers) && response.nbAnswers !== 0) // pas de stats si aucune réponse !
+ {
+ var mapText = {
+ NBANSWERS: response.nbAnswers,
+ NBQUESTIONNAIRES: response.nbQuestionnaires,
+ NBTOTQUESTIONNAIRES: response.general.nbPublished,
+ AVGDURATION: response.avgDuration,
+ AVGCORRECTANSWERS: response.avgCorrectAnswers
+ };
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["replaceAll"])(txtAnwers.statsUser, mapText), "", "", "", false);
+ }
+ }
+ };
+
+ xhrStats.setRequestHeader("Authorization", "Bearer " + user.token);
+ xhrStats.send(); // Par défaut, on affiche des derniers quizs proposés sans réponse :
+
+ xhrLastQuizs = new XMLHttpRequest();
+ xhrLastQuizs.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getQuestionnairesWithoutAnswer + "" + user.id + "/" + 0 + "/" + configFrontEnd.nbQuestionnairesUserHomePage + "/html");
+
+ xhrLastQuizs.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200) {
+ if (response.nbTot === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtAnwers.noQuestionnaireWithoudAnswer, "", ["success"]);else if (response.html) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtAnwers.nbQuestionnaireWithoudAnswer.replace("#NB", response.questionnaires.length), "", ["information"]);
+ quizListing.innerHTML = response.html;
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]);
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]);
+ }
+ };
+
+ xhrLastQuizs.setRequestHeader("Authorization", "Bearer " + user.token);
+ xhrLastQuizs.send(); // Traitement du lancement d'une recherche
+ // La recherche peut être lancée via la bouton submit ou un lien de pagination
+
+ sendSearch = function sendSearch() {
+ quizTitle.innerHTML = txtQuestionnaire.searchResultTitle;
+ quizListing.innerHTML = "";
+ var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formSearch);
+ var xhrSearch = new XMLHttpRequest();
+ xhrSearch.open("POST", config.apiUrl + config.questionnaireRoutes + config.searchQuestionnairesRoute);
+
+ xhrSearch.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response.nbTot)) {
+ if (response.nbTot === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtQuestionnaire.notFound, "", ["information"]);else if (response.html) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizIntro, "p", txtQuestionnaire.searchWithResult.replace("#NB", response.nbTot), "", ["success"]);
+ quizListing.innerHTML = response.html; // Pagination nécessaire ?
+
+ quizPagination.innerHTML = ""; // on commence par vider...
+
+ if (response.begin != 0) // peut retourner "0" et non 0 !
+ {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizPagination, "a", txt.previousPage, "previousRes", "", {
+ href: "#search"
+ });
+ var previousPage = document.getElementById("previousRes"); // le retour à la page précédente peut se faire en cliquant sur le bouton ou via l'historique du navigateur
+
+ var goBackRes = function goBackRes() {
+ var newBegin = response.begin - configFrontEnd.nbQuestionnairesUserHomePage;
+ if (newBegin < 0) // ne devrait pas être possible..
+ newBegin = 0;
+ document.getElementById("begin").value = newBegin;
+ sendSearch();
+ window.location.assign("#search");
+ };
+
+ previousPage.addEventListener("click", function (e) {
+ e.preventDefault();
+ goBackRes();
+ });
+
+ window.onpopstate = function (e) {
+ e.preventDefault();
+ goBackRes();
+ };
+ }
+
+ if (response.end < response.nbTot - 1) // -1, car tableau commence à 0 !
+ {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizPagination, "a", txt.nextPage, "nextRes", "", {
+ href: "#search"
+ }, false);
+ var nextPage = document.getElementById("nextRes");
+ nextPage.addEventListener("click", function (e) {
+ e.preventDefault();
+ document.getElementById("begin").value = response.end + 1;
+ sendSearch();
+ window.location.assign("#search");
+ });
+ }
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]);
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(quizs, "p", txt.serverError, "", ["error"]);
+ }
+ };
+
+ xhrSearch.setRequestHeader("Content-Type", "application/json");
+ xhrSearch.setRequestHeader("Authorization", "Bearer " + user.token);
+
+ if (datas) {
+ datas.output = "html";
+ xhrSearch.send(JSON.stringify(datas));
+ }
+ };
+
+ formSearch.addEventListener("submit", function (e) {
+ e.preventDefault();
+ document.getElementById("begin").value = 0;
+ sendSearch();
+ });
+ }
+
+ case 12:
+ _context.next = 18;
+ break;
+
+ case 14:
+ _context.prev = 14;
+ _context.t0 = _context["catch"](0);
+ console.error(_context.t0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]);
+
+ case 18:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 14]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+
+/***/ }),
+
+/***/ "./src/tools/clientstorage.js":
+/*!************************************!*\
+ !*** ./src/tools/clientstorage.js ***!
+ \************************************/
+/*! exports provided: saveLocaly, getLocaly, removeLocaly */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
+// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
+// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
+var saveLocaly = function saveLocaly(name, data) {
+ localStorage.setItem(name, JSON.stringify(data));
+};
+var getLocaly = function getLocaly(name) {
+ var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
+};
+var removeLocaly = function removeLocaly(name) {
+ localStorage.removeItem(name);
+};
+
+/***/ }),
+
+/***/ "./src/tools/dom.js":
+/*!**************************!*\
+ !*** ./src/tools/dom.js ***!
+ \**************************/
+/*! exports provided: addElement */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var addElement = function addElement(eltParent, eltType) {
+ var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
+ var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
+ var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
+ var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
+ var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
+ var newElement = document.createElement(eltType);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
+ newElement.id = eltId;
+
+ if (Array.isArray(eltClass) && eltClass.length != 0) {
+ for (var i in eltClass) {
+ newElement.classList.add(eltClass[i]);
+ }
+ }
+
+ if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
+ {
+ for (var attributName in eltAttributes) {
+ newElement.setAttribute(attributName, eltAttributes[attributName]);
+ }
+ }
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, " "); // 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 est lisible sur gitlab : \n Bonne lecture :-) \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/forms.js":
+/*!****************************!*\
+ !*** ./src/tools/forms.js ***!
+ \****************************/
+/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) {
+ for (var i in myForm.elements) {
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) {
+ var idInput = myForm.elements[i].id;
+
+ if (inputsConf[idInput] !== undefined) {
+ var inputHTML = document.getElementById(idInput);
+
+ for (var attribute in inputsConf[idInput]) {
+ inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);
+ }
+ }
+ }
+ }
+
+ return true;
+}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.
+
+var getDatasFromInputs = function getDatasFromInputs(myForm) {
+ var datas = {};
+ var formData = new FormData(myForm);
+
+ var _iterator = _createForOfIteratorHelper(formData.entries()),
+ _step;
+
+ try {
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
+ var entrie = _step.value;
+ datas[entrie[0]] = entrie[1];
+ }
+ } catch (err) {
+ _iterator.e(err);
+ } finally {
+ _iterator.f();
+ }
+
+ return datas;
+}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
+// Revoir pour les select
+
+var empyForm = function empyForm(myForm) {
+ var formData = new FormData(myForm);
+
+ var _iterator2 = _createForOfIteratorHelper(formData.entries()),
+ _step2;
+
+ try {
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+ var entrie = _step2.value;
+ if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = "";
+ }
+ } catch (err) {
+ _iterator2.e(err);
+ } finally {
+ _iterator2.f();
+ }
+
+ return true;
+}; // Vide et cache le formulaire
+
+var empyAndHideForm = function empyAndHideForm(myForm) {
+ empyForm(myForm);
+ myForm.style.display = "none";
+};
+
+/***/ }),
+
+/***/ "./src/tools/users.js":
+/*!****************************!*\
+ !*** ./src/tools/users.js ***!
+ \****************************/
+/*! exports provided: 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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9hbnN3ZXIkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvZ2VuZXJhbCQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9xdWVzdGlvbm5haXJlJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2Fuc3dlci5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3F1ZXN0aW9ubmFpcmUuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9ob21lVXNlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvY2xpZW50c3RvcmFnZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZG9tLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9ldmVyeXdoZXJlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9mb3Jtcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4IiwibmVlZE51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkSW50ZWdlck51bWJlclVzZXJSZXNwb25zZXMiLCJuZWVkTWluTnVtYmVyVXNlclJlc3BvbnNlcyIsIm5lZWRNYXhOdW1iZXJVc2VyUmVzcG9uc2VzIiwibmVlZE51bWJlckNvcnJlY3RSZXNwb25zZXMiLCJuZWVkSW50ZWdlck51bWJlckNvcnJlY3RSZXNwb25zZXMiLCJuZWVkTWluTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyIsIm5lZWRNYXhOdW1iZXJDb3JyZWN0UmVzcG9uc2VzIiwibmVlZEludGVnZXJOdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIiwibmVlZE1pbk51bWJlclNlY29uZGVzUmVzcG9uc2UiLCJjaGVja1Jlc3BvbnNlc091cHV0RmFpbCIsImNoZWNrUmVzcG9uc2VzT3VwdXRNZWRpdW0iLCJjaGVja1Jlc3BvbnNlc091cHV0U3VjY2VzcyIsIndhbnRUb1NhdmVSZXNwb25zZXMiLCJyZXNwb25zZVNhdmVkTWVzc2FnZSIsInJlc3BvbnNlU2F2ZWRFcnJvciIsIm5vUXVlc3Rpb25uYWlyZVdpdGhvdWRBbnN3ZXIiLCJuYlF1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyIiwic3RhdHNVc2VyIiwicHJldmlvdXNBbnN3ZXJzVGl0bGUiLCJwcmV2aW91c0Fuc3dlcnNTdGF0cyIsInByZXZpb3VzQW5zd2Vyc0xpbmUiLCJub1ByZXZpb3VzQW5zd2VyIiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJuZWVkVGl0bGUiLCJuZWVkTm90VG9vTG9uZ1RpdGxlIiwibmVlZFVybCIsIm5lZWRVbmlxdWVVcmwiLCJuZWVkSW50cm9kdWN0aW9uIiwibmVlZENvcnJlY3RQdWJsaXNoaW5nRGF0ZSIsIm5lZWRLbm93SWZJc1B1Ymxpc2hlZCIsIm5lZWRMYW5ndWFnZSIsIm5lZWRFc3RpbWF0ZWRUaW1lIiwibm90Rm91bmQiLCJzZWFyY2hSZXN1bHRUaXRsZSIsInNlYXJjaE5vUmVzdWx0Iiwic2VhcmNoV2l0aFJlc3VsdCIsInB1Ymxpc2hlZEJ5IiwicHVibGlzaGVkQXQiLCJsYXN0VXBkYXRlZCIsImVzdGltYXRlZFRpbWUiLCJidG5TZW5kUmVzcG9uc2UiLCJidG5Qcm9wb3NlU3Vic2NyaWJlIiwiYnRuUHJvcG9zZUNvbm5lY3Rpb24iLCJidG5TaG93UXVlc3Rpb25uYWlyZSIsIm5leHRRdWVzdGlvbm5haXJlc0xpc3QiLCJuZWVkQmVDb21wbGV0ZWQiLCJuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlIiwiaGF2ZUJlZW5QdWJsaXNoZWQiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWRFbWFpbCIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwicGFzc3dvcmRDb3BpZWQiLCJuZWVkU3RhdHVzIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJnb2RmYXRoZXJOb3RGb3VuZCIsImdvZGZhdGhlckZvdW5kIiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJtYWlsV2VsY29tZVN1YmplY3QiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJhbHJlYWR5Q29ubmVjdGVkIiwibmVlZEJlQ29ubmVjdGVkIiwiY29ubmVjdGlvbk9rIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZFZhbGlkYXRpb25Ub0xvZ2luIiwidG9vTWFueUxvZ2luRmFpbHMiLCJiYWRQYXNzd29yZCIsIm1haWxMb2dpbkxpbmtTdWJqZWN0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWRPa01lc3NhZ2UiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlIiwiZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2UiLCJ3ZWxjb21lTWVzc2FnZSIsImJ5ZWJ5ZU1lc3NhZ2UiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwiam9pbiIsInJlcGxhY2UiLCJtYXRjaGVkIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsImNvbmZpZ0Zyb250RW5kIiwidHh0IiwidHh0VXNlcnMiLCJ0eHRBbndlcnMiLCJ0eHRRdWVzdGlvbm5haXJlIiwiZGl2TWFpbiIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZNZXNzYWdlIiwicXVpelRpdGxlIiwicXVpekludHJvIiwicXVpekxpc3RpbmciLCJxdWl6UGFnaW5hdGlvbiIsImZvcm1TZWFyY2giLCJpbnB1dEJlZ2luIiwiaGVsbG9EZXYiLCJpbml0aWFsaXNlIiwiZ2V0Q29uZmlnIiwiY29uZmlnIiwiYWRkRWxlbWVudCIsImRpdlJlc3BvbnNlIiwiY2hlY2tTZXNzaW9uIiwibWVzc2FnZSIsImNvbG9yIiwid2luZG93IiwibG9jYXRpb24iLCJpc0Nvbm5lY3RlZCIsInVzZXIiLCJnZXRMb2NhbHkiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsInN0eWxlIiwiZGlzcGxheSIsInJlbW92ZUxvY2FseSIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsInhoclN0YXRzIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJyZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsIm5iQW5zd2VycyIsIm1hcFRleHQiLCJOQkFOU1dFUlMiLCJOQlFVRVNUSU9OTkFJUkVTIiwibmJRdWVzdGlvbm5haXJlcyIsIk5CVE9UUVVFU1RJT05OQUlSRVMiLCJnZW5lcmFsIiwibmJQdWJsaXNoZWQiLCJBVkdEVVJBVElPTiIsImF2Z0R1cmF0aW9uIiwiQVZHQ09SUkVDVEFOU1dFUlMiLCJhdmdDb3JyZWN0QW5zd2VycyIsInJlcGxhY2VBbGwiLCJzZXRSZXF1ZXN0SGVhZGVyIiwidG9rZW4iLCJzZW5kIiwieGhyTGFzdFF1aXpzIiwibmJUb3QiLCJodG1sIiwiaW5uZXJIVE1MIiwicXVpenMiLCJzZW5kU2VhcmNoIiwiZGF0YXMiLCJnZXREYXRhc0Zyb21JbnB1dHMiLCJ4aHJTZWFyY2giLCJiZWdpbiIsImdvQmFja1JlcyIsIm5ld0JlZ2luIiwiYXNzaWduIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsIm9ucG9wc3RhdGUiLCJlbmQiLCJvdXRwdXQiLCJzdHJpbmdpZnkiLCJjb25zb2xlIiwiZXJyb3IiLCJzYXZlTG9jYWx5IiwiZGF0YSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJBcnJheSIsImlzQXJyYXkiLCJpIiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwic2V0QXR0cmlidXRlIiwiYXBwZW5kQ2hpbGQiLCJsb2ciLCJjb25maWdUZW1wbGF0ZSIsImxpbmsiLCJob21lUGFnZSIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJlbGVtZW50cyIsImlkSW5wdXQiLCJpbnB1dEhUTUwiLCJhdHRyaWJ1dGUiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiZW50cmllcyIsImVudHJpZSIsImVtcHlGb3JtIiwidHlwZSIsImNoZWNrZWQiLCJlbXB5QW5kSGlkZUZvcm0iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsIm9ubG9hZCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0IiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJub3ciLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtR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LFNBQUQsRUFBWTdELE9BQVosQ0FBVjtBQUNKLE1BQUcsQ0FBQzVFLDJEQUFPLENBQUM4TSxTQUFELENBQVgsRUFDSXJFLG9FQUFVLENBQUMsS0FBRCxFQUFRcUUsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDOU0sMkRBQU8sQ0FBQzZNLGNBQUQsQ0FBWCxFQUNJL0gsTUFBTSxDQUFDQyxRQUFQLENBQWdCZ0QsTUFBaEIsQ0FBdUI4RSxjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2hvbWVVc2VyLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2hvbWVVc2VyLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvYW5zd2VyXCI6IFwiLi4vbGFuZy9mci9hbnN3ZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9hbnN3ZXIkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9xdWVzdGlvbm5haXJlXCI6IFwiLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvcXVlc3Rpb25uYWlyZSRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5lZWROdW1iZXJVc2VyUmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcXVlc3Rpb25zIGF1eHF1ZWxsZXMgbCd1dGlsaXNhdGV1ciBhIHLDqXBvbmR1IGRvaXQgw6p0cmUgZm91cm5pLlwiLFxuICAgIG5lZWRJbnRlZ2VyTnVtYmVyVXNlclJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHF1ZXN0aW9ucyBhdXhxdWVsbGVzIGwndXRpbGlzYXRldXIgYSByw6lwb25kdSBkb2l0IMOqdHJlIHVuIG5vbWJyZSBlbnRpZXIuXCIsXG4gICAgbmVlZE1pbk51bWJlclVzZXJSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYXV4cXVlbGxlcyBsJ3V0aWxpc2F0ZXVyIGEgcsOpcG9uZHUgbmUgcGV1dCDDqnRyZSBpbmbDqXJpZXVyIMOgIDEuXCIsXG4gICAgbmVlZE1heE51bWJlclVzZXJSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSBxdWVzdGlvbnMgYXV4cXVlbGxlcyBsJ3V0aWxpc2F0ZXVyIGEgcsOpcG9uZHUgbmUgcGV1dCDDqnRyZSBhdXNzaSDDqWxldsOpLlwiLFxuICAgIG5lZWROdW1iZXJDb3JyZWN0UmVzcG9uc2VzIDogXCJMZSBub21icmUgZGUgcsOpcG9uc2VzIGNvcnJlY3RlcyBkb2l0IMOqdHJlIGZvdXJuaS5cIixcbiAgICBuZWVkSW50ZWdlck51bWJlckNvcnJlY3RSZXNwb25zZXMgOiBcIkxlIG5vbWJyZSBkZSByw6lwb25zZXMgY29ycmVjdGVzIGRvaXQgw6p0cmUgdW4gbm9tYnJlIGVudGllci5cIixcbiAgICBuZWVkTWluTnVtYmVyQ29ycmVjdFJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHLDqXBvbnNlcyBjb3JyZWN0ZXMgbmUgcGV1dCDDqnRyZSBuw6lnYXRpZi5cIixcbiAgICBuZWVkTWF4TnVtYmVyQ29ycmVjdFJlc3BvbnNlcyA6IFwiTGUgbm9tYnJlIGRlIHLDqXBvbnNlcyBjb3JyZWN0ZXMgbmUgcGV1dCDDqnRyZSBzdXDDqXJpZXVyIGF1IG5vbWJyZSBkZSBxdWVzdGlvbnMuXCIsXG4gICAgbmVlZEludGVnZXJOdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIDogXCJMYSBkdXLDqWUgZGUgbGEgcsOpcG9uc2UgZG9pdCDDqnRyZSB1biBub21icmUgZW50aWVyIGRlIHNlY29uZGVzLlwiLFxuICAgIG5lZWRNaW5OdW1iZXJTZWNvbmRlc1Jlc3BvbnNlIDogXCJMYSBkdXLDqWUgZGUgbGEgcsOpcG9uc2UgbmUgcGV1dCDDqnRyZSBuw6lnYXRpdmUuXCIsXG4gICAgY2hlY2tSZXNwb25zZXNPdXB1dEZhaWwgOiBcIlZvdXMgYXZleiByw6lwb25kdSBlbiBEVVJBVElPTiBzZWNvbmRlcyBldCBhdmV6IE5CQ09SUkVDVEFOU1dFUlMgYm9ubmUocykgcsOpcG9uc2Uocykgc3VyIE5CUVVFU1RJT05TLiBDJ2VzdCBjZXJ0YWluLCB2b3VzIGZlcmV6IG1pZXV4IGxhIHByb2NoYWluZSBmb2lzICFcIixcbiAgICBjaGVja1Jlc3BvbnNlc091cHV0TWVkaXVtIDogXCJWb3VzIGF2ZXogcsOpcG9uZHUgZW4gRFVSQVRJT04gc2Vjb25kZXMgZXQgYXZleiBOQkNPUlJFQ1RBTlNXRVJTIGJvbm5lKHMpIHLDqXBvbnNlKHMpIHN1ciBOQlFVRVNUSU9OUy4gQydlc3QgcGFzIG1hbCBkdSB0b3V0ICFcIixcbiAgICBjaGVja1Jlc3BvbnNlc091cHV0U3VjY2VzcyA6IFwiVm91cyBhdmV6IHLDqXBvbmR1IGVuIERVUkFUSU9OIHNlY29uZGVzIGV0IGF2ZXogTkJDT1JSRUNUQU5TV0VSUyBib25uZShzKSByw6lwb25zZShzKSBzdXIgTkJRVUVTVElPTlMuIEJyYXZvICEgUmllbiBuZSB2b3VzIMOpY2hhcHBlICFcIixcbiAgICB3YW50VG9TYXZlUmVzcG9uc2VzOiBcIlNpIHZvdXMgbGUgc291aGFpdGV6LCB2b3VzIHBvdXZleiBzYXV2ZWdhcmRlciB2b3RyZSByw6lzdWx0YXQgZW4gY3LDqWFudCB2b3RyZSBjb21wdGUuXFxuQ2VsYSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IGRhbnMgbCdhdmVuaXIgcG91ciB2b2lyIHNpIHZvdXMgYXZleiBtw6ltb3Jpc2VyIGxlcyBib25uZXMgcsOpcG9uc2VzLiBWb3VzIHBvdXJyZXogYWluc2kgYXVzc2kgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlYXV4IHF1aXpzLlwiLFxuICAgIHJlc3BvbnNlU2F2ZWRNZXNzYWdlIDogXCJWb3RyZSByw6lzdWx0YXQgYSDDqXTDqSBlbnJlZ2lzdHLDqS4gPGEgaHJlZj0nLyNVUkwnPkFjY8OoZGVyIMOgIHRvdXMgdm9zIHF1aXpzPC9hPi5cIixcbiAgICByZXNwb25zZVNhdmVkRXJyb3IgOiBcIkNlcGVuZGFudCB1bmUgZXJyZXVyIGEgw6l0w6kgcmVuY29udHLDqWUgZHVyYW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgdm90cmUgcsOpc3VsdGF0LiA8YSBocmVmPScvI1VSTCc+QWNjw6hkZXIgw6AgdG91cyB2b3MgcXVpenM8L2E+LlwiLFxuICAgIG5vUXVlc3Rpb25uYWlyZVdpdGhvdWRBbnN3ZXI6IFwiQnJhdm8gISBWb3VzIGF2ZXogcsOpcG9uZHUgw6AgdG91cyBsZXMgcXVpenMgcXVpIHZvdXMgb24gw6l0w6kgcHJvcG9zw6lzICE8YnI+SWwgeSBlbiBhIGRlcyBub3V2ZWF1eCBwdWJsacOpcyByw6lndWxpw6hyZW1lbnQgZXQgcXVpIHZvdXMgc2Vyb250IHByb3Bvc8Opcy48YnI+RW4gYXR0ZW5kYW50IHZvdXMgcG91dmV6IHBldXQtw6p0cmUgZXNzYXllciBkZSByw6lwb25kcmUgZGUgbm91dmVhdSDDoCBjZXJ0YWluIHF1aXogcG91ciB2b2lyIHNpIHZvdXMgdm91cyBzb3V2ZW5leiBkZXMgYm9ubmVzIHLDqXBvbnNlcyA/XCIsXG4gICAgbmJRdWVzdGlvbm5haXJlV2l0aG91ZEFuc3dlcjogXCJJbCB5IGEgI05CIHF1aXpzIHF1aSB2b3VzIG9udCDDqXTDqSBwcm9wb3PDqXMgZXQgYXV4cXVlbHMgdm91cyBuJ2F2ZXogcGFzIHLDqXBvbmR1LiBWb2ljaSBsZXMgZGVybmllcnMgOiFcIixcbiAgICBzdGF0c1VzZXI6IFwiVm91cyBhdmV6IGVucmVnaXN0csOpIE5CQU5TV0VSUyByw6lwb25zZXMgw6AgPGI+TkJRVUVTVElPTk5BSVJFUyBxdWVzdGlvbm5haXJlcyBkaWZmw6lyZW50czwvYj4gc3VyIGxlcyBOQlRPVFFVRVNUSU9OTkFJUkVTIHByb3Bvc8OpcyBwYXIgbGUgc2l0ZS48YnI+RW4gbW95ZW5uZSwgdm91cyBhdmV6IG1pcyBBVkdEVVJBVElPTiBzZWNvbmRlcyDDoCByw6lwb25kcmUgZXQgYXZleiA8Yj5jb3JyZWN0ZW1lbnQgcsOpcG9uZHUgw6AgQVZHQ09SUkVDVEFOU1dFUlMgJSBkZXMgcXVlc3Rpb25zPC9iPi5cIixcbiAgICBwcmV2aW91c0Fuc3dlcnNUaXRsZTogXCJCb25qb3VyICNOT00sIHZvaWNpIHZvcyBwcsOpY8OpZGVudHMgcsOpc3VsdGF0cyDDoCBjZSBxdWl6XCIsXG4gICAgcHJldmlvdXNBbnN3ZXJzU3RhdHM6IFwiRW4gbW95ZW5uZSwgdm91cyBhdmV6IHLDqXBvbmR1IMOgIGNlIHF1aXogZW4gQVZHRFVSQVRJT04gc2Vjb25kZXMsIGVuIGF5YW50IDxiPkFWR0NPUlJFQ1RBTlNXRVJTICUgZGUgYm9ubmVzIHLDqXBvbnNlczwvYj4uXCIsXG4gICAgcHJldmlvdXNBbnN3ZXJzTGluZTogXCJMZSBEQVRFQU5TV0VSLCB2b3VzIGF2ZXogcsOpcG9uZHUgY29ycmVjdGVtZW50IMOgIE5CQ09SUkVDVEFOU1dFUlMgcXVlc3Rpb25zIGVuIEFWR0RVUkFUSU9OIHNlY29uZGVzLlwiLFxuICAgIG5vUHJldmlvdXNBbnN3ZXI6IFwiQm9uam91ciAjTk9NLCBjJ2VzdCBsYSBwcmVtacOocmUgZm9pcyBxdWUgdm91cyByw6lwb25kZXogw6AgY2UgcXVpei4gQm9ubmUgbGVjdHVyZSAhXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkVGl0bGU6IFwiTWVyY2kgZGUgZm91cm5pciB1biB0aXRyZSDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWROb3RUb29Mb25nVGl0bGU6IFwiTGUgdGl0cmUgZHUgcXVpeiBuZSBkb2l0IHBhcyBjb21wdGVyIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRVcmw6IFwiTWVyY2kgZGUgZm91cm5pciBsJ3VybCDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5lZWRVbmlxdWVVcmw6IFwiTCd1cmwgZHUgcXVpeiBkb2l0IMOqdHJlIHVuaXF1ZS5cIixcbiAgICBuZWVkSW50cm9kdWN0aW9uOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gdGV4dGUgZCdpbnRyb2R1Y3Rpb24gw6Agdm90cmUgcXVpei5cIixcbiAgICBuZWVkQ29ycmVjdFB1Ymxpc2hpbmdEYXRlOiBcIkxhIGRhdGUgZGUgcHVibGljYXRpb24gZm91cm5pZSBuJ2EgcGFzIHVuIGZvcm1hdCB2YWxpZGUuXCIsXG4gICAgbmVlZEtub3dJZklzUHVibGlzaGVkOiBcIklsIGZhdXQgc2F2b2lyIHNpIGNlIHF1aXogZXN0IHB1Ymxpw6kuXCIsXG4gICAgbmVlZExhbmd1YWdlOiBcIlZvdXMgZGV2ZXogc8OpbGVjdGlvbm5lciBsYSBsYW5ndWUgZGUgY2UgcXVpei5cIixcbiAgICBuZWVkRXN0aW1hdGVkVGltZTogXCJNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIHVuZSBlc3RpbWF0aW9uIGRlIGxhIGR1csOpZSBkZSBjZSBxdWl6LlwiLFxuICAgIG5vdEZvdW5kIDogXCJBdWN1biBxdWl6IG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBzZWFyY2hSZXN1bHRUaXRsZSA6IFwiUsOpc3VsdGF0IHBvdXIgdm90cmUgcmVjaGVyY2hlXCIsXG4gICAgc2VhcmNoTm9SZXN1bHQgOiBcIkF1Y3VuIHLDqXN1bHRhdCBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIHZvdHJlIHJlY2hlcmNoZVwiLFxuICAgIHNlYXJjaFdpdGhSZXN1bHQgOiBcIiNOQiBxdWl6cyBjb3JyZXNwb25kZW50IMOgIHZvdHJlIHJlY2hlcmNoZSA6XCIsXG4gICAgcHVibGlzaGVkQnk6IFwiUHVibGnDqSBwYXJcIixcbiAgICBwdWJsaXNoZWRBdDogXCIsIGxlXCIsXG4gICAgbGFzdFVwZGF0ZWQ6IFwiRGVybmnDqHJlIG1pc2Ugw6Agam91ciwgbGUgXCIsXG4gICAgZXN0aW1hdGVkVGltZTogXCJEdXLDqWUgZGUgbGVjdHVyZSBlc3RpbcOpZSA6IFwiLFxuICAgIGJ0blNlbmRSZXNwb25zZTogXCJFbnZveWV6IHZvcyByw6lwb25zZXNcIixcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIk9rLCBqZSBjcsOpZSBtb24gY29tcHRlICFcIixcbiAgICBidG5Qcm9wb3NlQ29ubmVjdGlvbjogXCJKJ2FpIGTDqWrDoCB1biBjb21wdGUsIGplIG1lIGNvbm5lY3RlLlwiLFxuICAgIGJ0blNob3dRdWVzdGlvbm5haXJlOiBcIkFmZmljaGVyIGxlIHF1aXogIVwiLFxuICAgIG5leHRRdWVzdGlvbm5haXJlc0xpc3Q6IFwiTGVzICNOQiBwcm9jaGFpbnMgcXVpenMgZGV2YW50IMOqdHJlIHB1Ymxpw6lzXCIsXG4gICAgbmVlZEJlQ29tcGxldGVkOiBcIlF1aXogaW5jb21wbGV0XCIsXG4gICAgbmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZTogXCJQcm9jaGFpbmUgZGF0ZSBzYW5zIHF1aXogcHJvZ3JhbW3DqSA6IFwiLFxuICAgIGhhdmVCZWVuUHVibGlzaGVkIDogXCI6TkIgbm91dmVhdXggcXVlc3Rpb25uYWlyZXMgb250IMOpdMOpIHB1Ymxpw6lzLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gUEFHRSBEJ0FDQ1VFSUwgREUgTCdVVElMSVNBVEVVUlxuXG4vLy8gVsOpcmlmaWVyIHF1ZSBsJ3V0aWxpc2F0ZXVyIGVzdCBiaWVuIGNvbm5lY3TDqSwgYSBsZSBib24gc3RhdHV0IGV0IGxlIHJlZGlyaWdlciB2ZXJzIGxlIGZvcm11bGFpcmUgZCdpbnNjcmlwdGlvbiBzaSBjZSBuJ2VzdCBwYXMgbGUgY2FzLlxuLy8vIFNpIGMnZXN0IG9rLCBvbiByw6ljdXDDqHJlIHNlcyBpbmZvcyBldCBzdGF0cyArIGxlcyBkZXJuaWVycyBxdWl6cyBhdXhxdWVscyBpbCBhIGFjY8OocywgbWFpcyBuJ2EgcGFzIHLDqXBvbmR1LlxuLy8vIFVuIG1vdGV1ciBkZSByZWNoZXJjaGUgcGVybWV0IGQnb2J0ZW5pciBkJ2F1dHJlcyBxdWl6cyBwYXJtaSBjZXV4IHB1Ymxpw6lzLlxuLy8vIFBvdXIgbCdhZmZpY2hhZ2UgZGVzIGxpc3RpbmdzIGRlIHF1aXosIGwnQVBJIHJldG91cm5lIGRpcmVjdGVtZW50IGR1IGh0bWwuXG4vLy8gVW4gbWVudSBwZXJtZXQgw6AgbCd1dGlsaXNhdGV1ciBkJ2FjY8OpZGVyIMOgIGxhIG1vZGlmaWNhdGlvbiBkZSBzZXMgaW5mb3MsIGRlIHNvbiBhYm9ubmVtZW50LCBldGMuXG4vLy8gVW4gbWVzc2FnZSB2ZW5hbnQgZCd1bmUgYXV0cmUgcGFnZSBwZXV0IGF1c3NpIMOqdHJlIMOgIGFmZmljaGVyIGxvcnMgZHUgcHJlbWllciBjaGFyZ2VtZW50LlxuXG4vLy8gQWpvdXRlciBhZmZpY2hhZ2UgYW5jaWVucyBxdWl6cyDDoCByZXRlbnTDqXMgc2kgcGFzIGRlIHF1aXpzIGVuIGF0dGVudGUgP1xuLy8vIFVuIHF1aXogYXUgaGFzYXJkID9cblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbi8vIEZvbmN0aW9ucyB1dGlsZXMgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vdG9vbHMvY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgYWRkRWxlbWVudCB9IGZyb20gXCIuL3Rvb2xzL2RvbS5qc1wiO1xuaW1wb3J0IHsgaGVsbG9EZXYsIHVwZGF0ZUFjY291bnRMaW5rIH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGF0YXNGcm9tSW5wdXRzLCBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMgfSBmcm9tIFwiLi90b29scy9mb3Jtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSwgcmVwbGFjZUFsbCB9IGZyb20gXCIuLi8uLi90b29scy9tYWluXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24sIGdldENvbmZpZyB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5jb25zdCB0eHRBbndlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2Fuc3dlclwiKTtcbmNvbnN0IHR4dFF1ZXN0aW9ubmFpcmUgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3F1ZXN0aW9ubmFpcmVcIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBkaXZNYWluPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1haW4tY29udGVudFwiKTtcbmNvbnN0IGRpdk1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1lc3NhZ2VcIik7XG5jb25zdCBxdWl6VGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1aXpzVGl0bGVcIik7XG5jb25zdCBxdWl6SW50cm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1aXpzSW50cm9cIik7XG5jb25zdCBxdWl6TGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVpenNMaXN0XCIpO1xuY29uc3QgcXVpelBhZ2luYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1aXpzUGFnaW5hdGlvblwiKTtcbmNvbnN0IGZvcm1TZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNlYXJjaFwiKTtcbmNvbnN0IGlucHV0QmVnaW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJlZ2luXCIpO1xuXG5oZWxsb0RldigpO1xuXG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7ICAgICAgICBcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gU2kgbCd1dGlsaXNhdGV1ciBuJ2VzdCBwYXMgY29ubmVjdMOpLCBwYXMgbGEgcGVpbmUgZCdhbGxlciArIGxvaW4gOlxuICAgICAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKFtcInVzZXJcIl0sIFwiL1wiK2NvbmZpZ0Zyb250RW5kLmNvbm5lY3Rpb25QYWdlLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLm5lZWRCZUNvbm5lY3RlZCwgY29sb3I6XCJlcnJvclwiIH0sIHdpbmRvdy5sb2NhdGlvbik7XG4gICAgICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyPWdldExvY2FseShcInVzZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlQWNjb3VudExpbmsodXNlci5zdGF0dXMsIGNvbmZpZ0Zyb250RW5kKTtcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwiaDRcIiwgdHh0VXNlcnMud2VsY29tZU1lc3NhZ2UucmVwbGFjZShcIiNOQU1FXCIsIHVzZXIubmFtZSkpO1xuICAgICAgICAgICAgICAgIGRpdk1haW4uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgaWYoIWlzRW1wdHkoZ2V0TG9jYWx5KFwibWVzc2FnZVwiKSkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCBnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLm1lc3NhZ2UsIFwiXCIsIFtnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLmNvbG9yXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJtZXNzYWdlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXNhdGlvbiBkdSBmb3JtdWxhaXJlIGRlIHJlY2hlcmNoZSA6XG4gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZywgZm9ybVNlYXJjaCk7ICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBMZXMgc3RhdHMgOiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHhoclN0YXRzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyU3RhdHMub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLmdldFN0YXRzQW5zd2Vycyt1c2VyLmlkKTtcbiAgICAgICAgICAgICAgICB4aHJTdGF0cy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmICFpc0VtcHR5KHJlc3BvbnNlLm5iQW5zd2VycykgJiYgcmVzcG9uc2UubmJBbnN3ZXJzIT09MCkvLyBwYXMgZGUgc3RhdHMgc2kgYXVjdW5lIHLDqXBvbnNlICFcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBUZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBTlNXRVJTIDogcmVzcG9uc2UubmJBbnN3ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CUVVFU1RJT05OQUlSRVMgOiByZXNwb25zZS5uYlF1ZXN0aW9ubmFpcmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CVE9UUVVFU1RJT05OQUlSRVMgOiByZXNwb25zZS5nZW5lcmFsLm5iUHVibGlzaGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWR0RVUkFUSU9OIDogcmVzcG9uc2UuYXZnRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZHQ09SUkVDVEFOU1dFUlMgOiByZXNwb25zZS5hdmdDb3JyZWN0QW5zd2Vyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcInBcIiwgcmVwbGFjZUFsbCh0eHRBbndlcnMuc3RhdHNVc2VyLCBtYXBUZXh0KSwgXCJcIiwgXCJcIiwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoclN0YXRzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pOyBcbiAgICAgICAgICAgICAgICB4aHJTdGF0cy5zZW5kKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gUGFyIGTDqWZhdXQsIG9uIGFmZmljaGUgZGVzIGRlcm5pZXJzIHF1aXpzIHByb3Bvc8OpcyBzYW5zIHLDqXBvbnNlIDpcbiAgICAgICAgICAgICAgICBjb25zdCB4aHJMYXN0UXVpenMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHJMYXN0UXVpenMub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnLmdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcitcIlwiK3VzZXIuaWQrXCIvXCIrMCtcIi9cIitjb25maWdGcm9udEVuZC5uYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlK1wiL2h0bWxcIik7XG4gICAgICAgICAgICAgICAgeGhyTGFzdFF1aXpzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UubmJUb3Q9PT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpJbnRybywgXCJwXCIsIHR4dEFud2Vycy5ub1F1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHJlc3BvbnNlLmh0bWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpJbnRybywgXCJwXCIsIHR4dEFud2Vycy5uYlF1ZXN0aW9ubmFpcmVXaXRob3VkQW5zd2VyLnJlcGxhY2UoXCIjTkJcIiwgcmVzcG9uc2UucXVlc3Rpb25uYWlyZXMubGVuZ3RoKSwgXCJcIiwgW1wiaW5mb3JtYXRpb25cIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWl6TGlzdGluZy5pbm5lckhUTUw9cmVzcG9uc2UuaHRtbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpzLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6cywgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhockxhc3RRdWl6cy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHJMYXN0UXVpenMuc2VuZCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gVHJhaXRlbWVudCBkdSBsYW5jZW1lbnQgZCd1bmUgcmVjaGVyY2hlXG4gICAgICAgICAgICAgICAgLy8gTGEgcmVjaGVyY2hlIHBldXQgw6p0cmUgbGFuY8OpZSB2aWEgbGEgYm91dG9uIHN1Ym1pdCBvdSB1biBsaWVuIGRlIHBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCBzZW5kU2VhcmNoID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHF1aXpUaXRsZS5pbm5lckhUTUw9dHh0UXVlc3Rpb25uYWlyZS5zZWFyY2hSZXN1bHRUaXRsZTtcbiAgICAgICAgICAgICAgICAgICAgcXVpekxpc3RpbmcuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVNlYXJjaCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclNlYXJjaCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2gub3BlbihcIlBPU1RcIiwgY29uZmlnLmFwaVVybCtjb25maWcucXVlc3Rpb25uYWlyZVJvdXRlcytjb25maWcuc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgIWlzRW1wdHkocmVzcG9uc2UubmJUb3QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UubmJUb3Q9PT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6SW50cm8sIFwicFwiLCB0eHRRdWVzdGlvbm5haXJlLm5vdEZvdW5kLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocmVzcG9uc2UuaHRtbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6SW50cm8sIFwicFwiLCB0eHRRdWVzdGlvbm5haXJlLnNlYXJjaFdpdGhSZXN1bHQucmVwbGFjZShcIiNOQlwiLCByZXNwb25zZS5uYlRvdCkgLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aXpMaXN0aW5nLmlubmVySFRNTD1yZXNwb25zZS5odG1sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFnaW5hdGlvbiBuw6ljZXNzYWlyZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWl6UGFnaW5hdGlvbi5pbm5lckhUTUw9XCJcIjsvLyBvbiBjb21tZW5jZSBwYXIgdmlkZXIuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmJlZ2luICE9IDApLy8gcGV1dCByZXRvdXJuZXIgXCIwXCIgZXQgbm9uIDAgIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQocXVpelBhZ2luYXRpb24sIFwiYVwiLCB0eHQucHJldmlvdXNQYWdlICwgXCJwcmV2aW91c1Jlc1wiLCBcIlwiLCB7IGhyZWY6IFwiI3NlYXJjaFwiIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUGFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInByZXZpb3VzUmVzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlIHJldG91ciDDoCBsYSBwYWdlIHByw6ljw6lkZW50ZSBwZXV0IHNlIGZhaXJlIGVuIGNsaXF1YW50IHN1ciBsZSBib3V0b24gb3UgdmlhIGwnaGlzdG9yaXF1ZSBkdSBuYXZpZ2F0ZXVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29CYWNrUmVzID0gKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdCZWdpbj1yZXNwb25zZS5iZWdpbi1jb25maWdGcm9udEVuZC5uYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXdCZWdpbjwwKSAvLyBuZSBkZXZyYWl0IHBhcyDDqnRyZSBwb3NzaWJsZS4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCZWdpbj0wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJlZ2luXCIpLnZhbHVlPW5ld0JlZ2luO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kU2VhcmNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjc2VhcmNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1BhZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvQmFja1JlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29CYWNrUmVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmVuZCA8IChyZXNwb25zZS5uYlRvdC0xKSkvLyAtMSwgY2FyIHRhYmxlYXUgY29tbWVuY2Ugw6AgMCAhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6UGFnaW5hdGlvbiwgXCJhXCIsIHR4dC5uZXh0UGFnZSwgXCJuZXh0UmVzXCIsIFwiXCIsIHsgaHJlZjogXCIjc2VhcmNoXCIgfSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQYWdlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmV4dFJlc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGFnZS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiZWdpblwiKS52YWx1ZT1yZXNwb25zZS5lbmQrMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFNlYXJjaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3NlYXJjaFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KHF1aXpzLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChxdWl6cywgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaC5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMub3V0cHV0PVwiaHRtbFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtU2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiZWdpblwiKS52YWx1ZT0wO1xuICAgICAgICAgICAgICAgICAgICBzZW5kU2VhcmNoKCk7XG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/front/public/JS/index.app.js b/front/public/JS/index.app.js
new file mode 100644
index 0000000..a12ee9a
--- /dev/null
+++ b/front/public/JS/index.app.js
@@ -0,0 +1,864 @@
+/******/ (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/index.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",
+ senderEmail: "bonjour@wikilerni.com",
+ adminLang: "fr",
+ theme: "default",
+ // 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",
+ beginCodeGodfather: "wikilerni",
+ // 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: 10,
+ // 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",
+ searchAdminQuestionnairesRoute: "/searchadmin",
+ getListNextQuestionnaires: "/getlistnextquestionnaires/",
+ // -- 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: 10,
+ 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
+
+};
+
+/***/ }),
+
+/***/ "../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"
+};
+
+/***/ }),
+
+/***/ "../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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/index.js":
+/*!**********************!*\
+ !*** ./src/index.js ***!
+ \**********************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_3__ = __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); }); }; }
+
+// -- SCRIPT DE BASE APPELÉ DANS LES PAGES TYPE ACCUEIL DU SITE
+// 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");
+
+
+
+
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["helloDev"])(); // Test de connexion de l'utilisateur pour adapter le lien du menu...
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var isConnected, user;
+ 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_3__["checkSession"])();
+
+ case 3:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ // on change le lien du compte en haut
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
+ Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["updateAccountLink"])(user.status, configTemplate);
+ } else {// ici on pourra éventuellement charger matomo, etc.
+ }
+
+ _context.next = 10;
+ break;
+
+ case 7:
+ _context.prev = 7;
+ _context.t0 = _context["catch"](0);
+ console.error(_context.t0);
+
+ case 10:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 7]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+
+/***/ }),
+
+/***/ "./src/tools/clientstorage.js":
+/*!************************************!*\
+ !*** ./src/tools/clientstorage.js ***!
+ \************************************/
+/*! exports provided: saveLocaly, getLocaly, removeLocaly */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
+// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
+// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
+var saveLocaly = function saveLocaly(name, data) {
+ localStorage.setItem(name, JSON.stringify(data));
+};
+var getLocaly = function getLocaly(name) {
+ var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
+};
+var removeLocaly = function removeLocaly(name) {
+ localStorage.removeItem(name);
+};
+
+/***/ }),
+
+/***/ "./src/tools/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 est lisible sur gitlab : \n Bonne lecture :-) \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/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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VzZXJzLmpzIl0sIm5hbWVzIjpbInVzZXJzIiwicmVxdWlyZSIsInF1ZXN0aW9ubmFpcmVzIiwibW9kdWxlIiwiZXhwb3J0cyIsImFwaVVybCIsInNpdGVVcmwiLCJhZG1pbk5hbWUiLCJhZG1pbkVtYWlsIiwic2VuZGVyTmFtZSIsInNlbmRlckVtYWlsIiwiYWRtaW5MYW5nIiwidGhlbWUiLCJhdmFpbGFibGVMYW5ncyIsInNpdGVOYW1lIiwiYmVnaW5Db2RlR29kZmF0aGVyIiwiY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwicmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZSIsInRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzIiwidG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXMiLCJ0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VycyIsInRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzIiwidG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzIiwiZnJlZUFjY291bnRUaW1pbmdJbkRheXMiLCJmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXMiLCJpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXMiLCJuYlF1ZXN0aW9uc01pbiIsIm5iUXVlc3Rpb25zTWF4IiwibmJDaG9pY2VzTWF4IiwibmJOZXdRdWVzdGlvbm5haXJlcyIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kIiwibnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWUiLCJtaW5TZWFyY2hRdWVzdGlvbm5haXJlcyIsIm5iSWxsdXN0cmF0aW9uc01pbiIsIm5iSWxsdXN0cmF0aW9uc01heCIsIm1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0IiwibWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uIiwiaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeCIsImlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4IiwibmJMaW5rc01pbiIsIm5iTGlua3NNYXgiLCJwYXNzd29yZCIsIm1pbmxlbmd0aCIsImRpckNhY2hlVXNlcnMiLCJkaXJDYWNoZVVzZXJzQW5zd2VycyIsImRpckNhY2hlUXVlc3Rpb25uYWlyZXMiLCJkaXJDYWNoZVF1ZXN0aW9ucyIsImRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyIsImRpckhUTUxRdWVzdGlvbm5haXJlIiwiZGlyV2ViUXVlc3Rpb25uYWlyZSIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwic2F2ZUFuc3dlcnNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyIiwiZ2V0UHJldmlvdXNBbnN3ZXJzIiwiZ2V0U3RhdHNBbnN3ZXJzIiwiZ2V0QWRtaW5TdGF0cyIsIlF1ZXN0aW9ubmFpcmUiLCJ0aXRsZSIsIm1heGxlbmd0aCIsInJlcXVpcmVkIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsImRpckNhY2hlVGFncyIsImRpckhUTUxUYWdzIiwiZGlyV2ViVGFncyIsInVzZXJSb3V0ZXMiLCJzdWJzY3JpYmVSb3V0ZSIsImdldEdvZGZhdGhlclJvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjb25uZWN0aW9uUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiZ2V0VXNlckluZm9zIiwiY3JlYXRlVXNlclJvdXRlIiwidmFsaWRhdGVVc2VyUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJzZWFyY2hVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tEZWxldGVMaW5rUm91dGUiLCJnZXRQYXltZW50cyIsInVuc3Vic2NyaWJlUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnVGVtcGxhdGUiLCJoZWxsb0RldiIsImluaXRpYWxpc2UiLCJjaGVja1Nlc3Npb24iLCJpc0Nvbm5lY3RlZCIsInVzZXIiLCJnZXRMb2NhbHkiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsImNvbnNvbGUiLCJlcnJvciIsInNhdmVMb2NhbHkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJqc29uIiwicGFyc2UiLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImxvZyIsImxpbmsiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaG9tZVBhZ2UiLCJnZXRDb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInJlc3BvbnNlVGV4dCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImdldFRpbWVEaWZmZXJlbmNlIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJpIiwic2V0U2Vzc2lvbiIsInVzZXJJZCIsInRva2VuIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJjaGVja0Fuc3dlckRhdGFzIiwiZGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwidXJsUmVkaXJlY3Rpb24iLCJtZXNzYWdlIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwibm93IiwicmVzcG9uc2UiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaW5kZXhPZiIsImFzc2lnbiJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFD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SjtBQUNIO0FBQ0o7QUFDSixhQXRFTSxDQUZpQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFabkMsWUFBWTtBQUFBO0FBQUE7QUFBQSxHQUFsQixDLENBMEVQOztBQUNBLElBQU0rRCxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDSixjQUFELEVBQWlCQyxPQUFqQixFQUEwQkMsU0FBMUIsRUFDckI7QUFDSSxNQUFHLENBQUN0SCwyREFBTyxDQUFDcUgsT0FBRCxDQUFYLEVBQ0lwRCxvRUFBVSxDQUFDLFNBQUQsRUFBWW9ELE9BQVosQ0FBVjtBQUNKLE1BQUcsQ0FBQ3JILDJEQUFPLENBQUNzSCxTQUFELENBQVgsRUFDSXJELG9FQUFVLENBQUMsS0FBRCxFQUFRcUQsU0FBUixDQUFWO0FBQ0osTUFBRyxDQUFDdEgsMkRBQU8sQ0FBQ29ILGNBQUQsQ0FBWCxFQUNJWSxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JFLE1BQWhCLENBQXVCZixjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2luZGV4LmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gU0NSSVBUIERFIEJBU0UgQVBQRUzDiSBEQU5TIExFUyBQQUdFUyBUWVBFIEFDQ1VFSUwgRFUgU0lURVxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gdGlyw6lzIGR1IGJhY2tlbmQgOlxuaW1wb3J0IHsgYXZhaWxhYmxlTGFuZ3MsIHRoZW1lIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbmltcG9ydCB7IGdldExvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2LCB1cGRhdGVBY2NvdW50TGluayB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbmhlbGxvRGV2KCk7XG5cbi8vIFRlc3QgZGUgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgcG91ciBhZGFwdGVyIGxlIGxpZW4gZHUgbWVudS4uLlxuY29uc3QgaW5pdGlhbGlzZSA9IGFzeW5jICgpID0+XG57XG4gICAgdHJ5XG4gICAge1xuICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oKTtcbiAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIG9uIGNoYW5nZSBsZSBsaWVuIGR1IGNvbXB0ZSBlbiBoYXV0XG4gICAgICAgICAgICBjb25zdCB1c2VyPWdldExvY2FseShcInVzZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB1cGRhdGVBY2NvdW50TGluayh1c2VyLnN0YXR1cywgY29uZmlnVGVtcGxhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gaWNpIG9uIHBvdXJyYSDDqXZlbnR1ZWxsZW1lbnQgY2hhcmdlciBtYXRvbW8sIGV0Yy5cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcbiBMZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgZXN0IGxpc2libGUgc3VyIGdpdGxhYiA6IFxcbiBCb25uZSBsZWN0dXJlIDotKSBcXG4gUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHNpdGVVcmwsIHRoZW1lIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK1wiL3VzZXIvZ2V0Y29uZmlnXCIpO1xuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBsZSB0b2tlbiBldCBkZSB0b3V0ZSBmYcOnb24gdsOpcmlmaWVyIMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2UpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/front/public/JS/loginLink.app.js b/front/public/JS/loginLink.app.js
new file mode 100644
index 0000000..4dff161
--- /dev/null
+++ b/front/public/JS/loginLink.app.js
@@ -0,0 +1,1210 @@
+/******/ (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/loginLink.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",
+ senderEmail: "bonjour@wikilerni.com",
+ adminLang: "fr",
+ theme: "default",
+ // 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",
+ beginCodeGodfather: "wikilerni",
+ // 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: 10,
+ // 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",
+ searchAdminQuestionnairesRoute: "/searchadmin",
+ getListNextQuestionnaires: "/getlistnextquestionnaires/",
+ // -- 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: 10,
+ 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
+
+};
+
+/***/ }),
+
+/***/ "../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 : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/loginLink.js":
+/*!**************************!*\
+ !*** ./src/loginLink.js ***!
+ \**************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_4__);
+/* 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 TESTER UN LIEN DE CONNEXION REÇU PAR E-MAIL
+/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps.
+/// Dans ce cas, on peut rediriger l'utilisateur vers la page de connexion pour obtenir un nouveau lien de validation
+/// Si le token est ok, on crée une session suivant la durée retournée par l'API et redirige l'utilisateur vers sa page d'accueil
+/// Un résultat de quiz peut aussi avoir été enregistré côté client et est alors à transmettre à l'API.
+/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige également vers sa page d'accueil.
+// Fichier de configuration côté client :
+
+var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
+
+var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile 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");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
+var config;
+
+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__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+
+ if (config) {
+ _context.next = 8;
+ break;
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ _context.next = 12;
+ break;
+
+ case 8:
+ _context.next = 10;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkSession"])();
+
+ case 10:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["saveLocaly"])("message", {
+ message: txtUsers.alreadyConnected,
+ color: "information"
+ }); // pour l'afficher sur la page suivante
+
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
+ homePage = user.status + "HomePage";
+ window.location.assign("/" + configFrontEnd[homePage]);
+ } else {
+ datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_5__["getUrlParams"])();
+
+ if (datas && datas.t !== undefined) {
+ xhr = new XMLHttpRequest();
+ xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.connectionWithLinkRoute);
+
+ xhr.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["isEmpty"])(response.userId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["isEmpty"])(response.connexionTime) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_4__["isEmpty"])(response.token)) {
+ var connexionMaxTime = Date.now();
+ if (response.connexionTime.endsWith("days")) connexionMaxTime += parseInt(response.connexionTime, 10) * 24 * 3600 * 1000;else connexionMaxTime += parseInt(response.connexionTime, 10) * 3600 * 1000;
+ Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["setSession"])(response.userId, response.token, connexionMaxTime);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("lastAnswer"); // ! important pour ne pas enregister plusieurs fois le résultat
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtUsers.validationMessage, "", ["success"]); // au cas où blocage redirection
+
+ window.location.assign("/" + configFrontEnd.userHomePage); // connexion par lien ne concerne que les simples "user"
+ } else if ((this.status === 401 || this.status === 403) && response.errors != undefined) {
+ if (Array.isArray(response.errors)) response.errors = response.errors.join(" ");else response.errors = txt.serverError;
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.connectionPage), "", ["error"]);
+ }
+ };
+
+ datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["getTimeDifference"])(config); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat :
+
+ datas = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_6__["checkAnswerDatas"])(datas);
+ xhr.setRequestHeader("Content-Type", "application/json");
+ xhr.send(JSON.stringify(datas));
+ }
+ }
+
+ case 12:
+ _context.next = 17;
+ break;
+
+ case 14:
+ _context.prev = 14;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+
+ case 17:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 14]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+
+/***/ }),
+
+/***/ "./src/tools/clientstorage.js":
+/*!************************************!*\
+ !*** ./src/tools/clientstorage.js ***!
+ \************************************/
+/*! exports provided: saveLocaly, getLocaly, removeLocaly */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
+// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
+// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
+var saveLocaly = function saveLocaly(name, data) {
+ localStorage.setItem(name, JSON.stringify(data));
+};
+var getLocaly = function getLocaly(name) {
+ var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
+};
+var removeLocaly = function removeLocaly(name) {
+ localStorage.removeItem(name);
+};
+
+/***/ }),
+
+/***/ "./src/tools/dom.js":
+/*!**************************!*\
+ !*** ./src/tools/dom.js ***!
+ \**************************/
+/*! exports provided: addElement */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var addElement = function addElement(eltParent, eltType) {
+ var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
+ var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
+ var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
+ var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
+ var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
+ var newElement = document.createElement(eltType);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
+ newElement.id = eltId;
+
+ if (Array.isArray(eltClass) && eltClass.length != 0) {
+ for (var i in eltClass) {
+ newElement.classList.add(eltClass[i]);
+ }
+ }
+
+ if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
+ {
+ for (var attributName in eltAttributes) {
+ newElement.setAttribute(attributName, eltAttributes[attributName]);
+ }
+ }
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, " "); // 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 est lisible sur gitlab : \n Bonne lecture :-) \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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9sb2dpbkxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXJsLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyJdLCJuYW1lcyI6WyJ1c2VycyIsInJlcXVpcmUiLCJxdWVzdGlvbm5haXJlcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJhcGlVcmwiLCJzaXRlVXJsIiwiYWRtaW5OYW1lIiwiYWRtaW5FbWFpbCIsInNlbmRlck5hbWUiLCJzZW5kZXJFbWFpbCIsImFkbWluTGFuZyIsInRoZW1lIiwiYXZhaWxhYmxlTGFuZ3MiLCJzaXRlTmFtZSIsImJlZ2luQ29kZUdvZGZhdGhlciIsImNyb25UaW1pbmdBbGVydEluU2Vjb25kZSIsInJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGUiLCJ0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VycyIsInRva2VuTG9naW5MaW5rVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzIiwidG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnMiLCJ0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VycyIsInRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5cyIsImZyZWVBY2NvdW50VGltaW5nSW5EYXlzIiwiZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzIiwiaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzIiwibmJRdWVzdGlvbnNNaW4iLCJuYlF1ZXN0aW9uc01heCIsIm5iQ2hvaWNlc01heCIsIm5iTmV3UXVlc3Rpb25uYWlyZXMiLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbiIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZCIsIm51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lIiwibWluU2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZSIsImRpcldlYlF1ZXN0aW9ubmFpcmUiLCJxdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsInByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzIiwicHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlcyIsInNhdmVBbnN3ZXJzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwic2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlciIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsImdldEFkbWluU3RhdHMiLCJRdWVzdGlvbm5haXJlIiwidGl0bGUiLCJtYXhsZW5ndGgiLCJyZXF1aXJlZCIsInNsdWciLCJpbnRyb2R1Y3Rpb24iLCJzZWFyY2hRdWVzdGlvbm5haXJlcyIsIlF1ZXN0aW9uIiwidGV4dCIsInJhbmsiLCJtaW4iLCJkZWZhdWx0VmFsdWUiLCJDaG9pY2UiLCJuYlRhZ3NNaW4iLCJuYlRhZ3NNYXgiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MVGFncyIsImRpcldlYlRhZ3MiLCJ1c2VyUm91dGVzIiwic3Vic2NyaWJlUm91dGUiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY2hlY2tMb2dpblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiZ2V0TG9naW5MaW5rUm91dGUiLCJjb25uZWN0aW9uV2l0aExpbmtSb3V0ZSIsImdldFVzZXJJbmZvcyIsImNyZWF0ZVVzZXJSb3V0ZSIsInZhbGlkYXRlVXNlclJvdXRlIiwidXBkYXRlVXNlckluZm9zIiwic2VhcmNoVXNlclJvdXRlIiwiZ2V0R29kQ2hpbGRzIiwiY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZSIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJ1bnN1YnNjcmliZVJvdXRlIiwibmFtZSIsImVtYWlsIiwibmV3UGFzc3dvcmQiLCJjb2RlR29kZmF0aGVyIiwiY2d1T2siLCJ2YWx1ZSIsInRpbWVEaWZmZXJlbmNlTWluIiwidGltZURpZmZlcmVuY2VNYXgiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5vdEZvdW5kIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRMYW5ndWFnZSIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwiY3JlYXRpb25Pa01lc3NhZ2UiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwid2VsY29tZU1lc3NhZ2UiLCJieWVieWVNZXNzYWdlIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiVG9vbCIsIm15VmFyIiwidW5kZWZpbmVkIiwidHJpbSIsIm15U3RyaW5nIiwiaXNFbXB0eSIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJjb25maWdGcm9udEVuZCIsInR4dCIsInR4dFVzZXJzIiwiZGl2UmVzcG9uc2UiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaGVsbG9EZXYiLCJjb25maWciLCJpbml0aWFsaXNlIiwiZ2V0Q29uZmlnIiwiYWRkRWxlbWVudCIsImNoZWNrU2Vzc2lvbiIsImlzQ29ubmVjdGVkIiwic2F2ZUxvY2FseSIsIm1lc3NhZ2UiLCJjb2xvciIsInVzZXIiLCJnZXRMb2NhbHkiLCJob21lUGFnZSIsInN0YXR1cyIsIndpbmRvdyIsImxvY2F0aW9uIiwiYXNzaWduIiwiZGF0YXMiLCJnZXRVcmxQYXJhbXMiLCJ0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJyZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsInVzZXJJZCIsImNvbm5leGlvblRpbWUiLCJ0b2tlbiIsImNvbm5leGlvbk1heFRpbWUiLCJub3ciLCJlbmRzV2l0aCIsInBhcnNlSW50Iiwic2V0U2Vzc2lvbiIsInJlbW92ZUxvY2FseSIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInRpbWVEaWZmZXJlbmNlIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJjaGVja0Fuc3dlckRhdGFzIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJzdHJpbmdpZnkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImNvbnNvbGUiLCJsb2ciLCJ1cGRhdGVBY2NvdW50TGluayIsImNvbmZpZ1RlbXBsYXRlIiwibGluayIsInNlYXJjaCIsInBhcmFtZXRlcnMiLCJzcGxpdCIsInBhcmFtIiwiZGVjb2RlVVJJIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0IiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7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QUNJMUMsNEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQWtFLGtDQUFZLENBQUNILGNBQUQsRUFBaUI3RixPQUFqQixFQUEwQjhGLFNBQTFCLENBQVo7QUFDQXRCLDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBNUQscUJBQUcsQ0FBQytELE9BQUosR0FBYztBQUFBLDJCQUFNRixNQUFNLENBQUM3RCxHQUFHLENBQUNnRSxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQWhFLHFCQUFHLENBQUMwQixJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVp6QyxZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTW1HLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNILGNBQUQsRUFBaUI3RixPQUFqQixFQUEwQjhGLFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDbEssMkRBQU8sQ0FBQ29FLE9BQUQsQ0FBWCxFQUNJRCxvRUFBVSxDQUFDLFNBQUQsRUFBWUMsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDcEUsMkRBQU8sQ0FBQ2tLLFNBQUQsQ0FBWCxFQUNJL0Ysb0VBQVUsQ0FBQyxLQUFELEVBQVErRixTQUFSLENBQVY7QUFDSixNQUFHLENBQUNsSywyREFBTyxDQUFDaUssY0FBRCxDQUFYLEVBQ0l2RixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCcUYsY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9sb2dpbkxpbmsuYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvbG9naW5MaW5rLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvZ2VuZXJhbFwiOiBcIi4uL2xhbmcvZnIvZ2VuZXJhbC5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2dlbmVyYWwkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3VzZXJcIjogXCIuLi9sYW5nL2ZyL3VzZXIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC91c2VyJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBzaXRlSFRNTFRpdGxlIDogXCJXaWtpTGVybmkgOiBxdSdhbGxlei12b3VzIGFwcHJlbmRyZSBhdWpvdXJkJ2h1aSA/XCIsXG4gICAgc2l0ZU1ldGFEZXNjcmlwdGlvbiA6IFwiQ2hhcXVlIGpvdXIsIHRlc3RleiB2b3MgY29ubmFpc3NhbmNlcyBldCBhcHByZW5leiBkZSBub3V2ZWxsZXMgY2hvc2VzIGF2ZWMgV2lraUxlcm5pLlwiLFxuICAgIHNjcmlwdFRpbWluZ0luZm8gOiBcIkR1csOpZSBkZSBsYSByw6lwb25zZSA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2VydmVyRXJyb3IgOiBcIkTDqXNvbMOpLiBVbmUgZXJyZXVyIGltcHLDqXZ1ZSBlc3Qgc3VydmVudWUuIFNpIGNlbGEgcGVyc2lzdGUsIG4naMOpc2l0ZXogw6AgcHLDqXZlbmlyIGwnYWRtaW5pc3RyYXRldXIgZHUgc2l0ZS5cIixcbiAgICBzZXJ2ZXJFcnJvckFkbWluIDogXCJCdWcgZGUgbCdhcHBsaWNhdGlvbiA6XCIsXG4gICAgbmVlZGVkUGFyYW1zIDogXCJEZXMgcGFyYW3DqHRyZXMgbsOpY2Vzc2FpcmVzIG1hbnF1YW50cyBzb250IG1hbnF1YW50cy5cIixcbiAgICBiYWRVcmwgOiBcIlRlbnRhdGl2ZSBkJ2FjY8OocyDDoCB1bmUgcGFnZSBuJ2V4aXN0YW50IHBhcyA6XCIsXG4gICAgbm90VmFsaWRGb3JtYXQgOiBcIkZvcm1hdCBub24gdmFsaWRlLlwiLFxuICAgIG5vdEFsbG93ZWQgOiBcIlZvdXMgbidhdmV6IHBhcyBsZXMgZHJvaXRzIG7DqWNlc3NhaXJlcyBwb3VyIGNldHRlIGFjdGlvbi5cIixcbiAgICBub3RSZXF1aXJlZCA6IFwiRmFjdWx0YXRpZi5cIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICBhZGRCdG5UeHQ6IFwiQWpvdXRlclwiLFxuICAgIGRlbGV0ZUJ0blR4dDogXCJTdXBwcmltZXJcIixcbiAgICBhZGRPa01lc3NhZ2UgOiBcIkxlcyBkb25uw6llcyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWVzLlwiLFxuICAgIHVwZGF0ZU9rTWVzc2FnZSA6IFwiTGEgbWlzZSDDoCBqb3VyIMOgIGpvdXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBkZWxldGVPa01lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZmFpbEF1dGggOiBcIkVycmV1ciBkJ2F1dGhlbnRpZmljYXRpb24uXCIsXG4gICAgZmFpbEF1dGhIZWFkZXIgOiBcIkFic2VuY2UgZGUgaGVhZGVyIEF1dGhvcml6YXRpb24uXCIsXG4gICAgZmFpbEF1dGhUb2tlbiA6IFwiVG9rZW4gaW52YWxpZGUgb3UgdXRpbGlzYXRldXIgbm9uIHRyb3V2w6kuXCIsXG4gICAgZmFpbEF1dGhJZCA6IFwiSWRlbnRpZmlhbnQgbm9uIHZhbGlkZSA6IFwiLFxuICAgIGZhaWxBdXRoQ3JvbiA6IFwiVGVudGF0aXZlIGRlIGxhbmNlbWVudCBkJ3VuIGNyb24gc2FucyBsZSBib24gdG9rZW4uXCIsXG4gICAgcHJldmlvdXNQYWdlIDogXCJQYWdlIHByw6ljw6lkZW50ZVwiLFxuICAgIG5leHRQYWdlIDogXCJQYWdlIHN1aXZhbnRlXCIsXG4gICAgYnRuTGlua1RvUXVlc3Rpb25uYWlyZSA6IFwiQWxsZXIgYXUgcXVpeiAhXCIsXG4gICAgc3RhdHNBZG1pbiA6IFwiRHVyYW50IGxlcyBkZXJuacOocmVzIDI0aCA6IE5CX1VTRVJTXzI0SCBjb21wdGVzIG9udCDDqXTDqSBjcsOpw6lzLCBOQl9TVUJTQ1JJUFRJT05TXzI0SCB2YWxpZMOpcyBldCBOQl9VU0VSU19ERUxFVEVEXzI0SCBzdXBwcmltw6lzLiBOQl9BTlNXRVJTXzI0SCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5FbiB0b3V0LCBpbCB5IGEgOiBOQl9VU0VSU19UT1QgY29tcHRlcywgZG9udCBOQl9TVUJTQ1JJUFRJT05TX1RPVCB2YWxpZMOpcyBldCBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gY29tcHRlcyBwcsOpbWl1bS4gTkJfQU5TV0VSU19UT1QgcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+UGFybWkgbGVzIE5CX1VTRVJTX0RFTEVURURfVE9UIGNvbXB0ZXMgc3VwcHJpbcOpcywgTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIGF2YWllbnQgdmFsaWTDqSBsZXVyIGNvbXB0ZSBldCBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gYXZhaWVudCBzb3VzY3JpdCB1biBjb21wdGUgcHLDqW1pdW0uXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIG5vdEZvdW5kOiBcIkwndXRpbGlzYXRldXIgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWROYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdOYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgNzAgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEVtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB2b3RyZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBuZWVkVW5pcXVlRW1haWw6IFwiTCdhZHJlc3NlIGUtbWFpbCBxdWUgdm91cyBhdmV6IHNhaXNpZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwYXIgdW4gYXV0cmUgdXRpbGlzYXRldXIuIFNpIHZvdXMgYXZleiBkw6lqw6AgdW4gY29tcHRlLCA8YSBocmVmPScvI1VSTCc+Y2xpcXVlei1pY2kgcG91ciB2b3VzIGNvbm5lY3RlcjwvYT4uXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdW5lIGFkcmVzc2UgZS1tYWlsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlLlwiLFxuICAgIG5lZWRMb25nUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlIGQnYXUgbW9pbnMgTUlOX0xFTkdUSCBjYXJhY3TDqHJlcy5cIixcbiAgICBwYXNzd29yZENvcGllZDogXCJMZSBtb3QgZGUgcGFzc2UgZ8OpbsOpcsOpIGEgw6l0w6kgY29wacOpIGRhbnMgbGUgcHJlc3NlLXBhcGllci4gVm91cyBwb3V2ZXogbGUgcmVjb3BpZXIgb8O5IHZvdXMgbGUgc291aGFpdGVyLlwiLFxuICAgIG5lZWRTdGF0dXMgOiBcIklsIG1hbnF1ZSBsZSBzdGF0dXQuXCIsXG4gICAgbmVlZExhbmd1YWdlIDogXCJJbCBtYW5xdWUgbGUgY29kZSBsYW5ndWUuXCIsXG4gICAgbmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIDogXCJMYSBkYXRlIGRlIGRlcm5pw6hyZSBjb25uZXhpb24gbidlc3QgcGFzIHZhbGlkZS5cIixcbiAgICBuZWVkU01UUCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkU01UUE5vdEZvdW5kIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRLbm93TmV3c2xldHRlck9rIDogXCJJbCBmYXV0IHNhdm9pciBzaSBsJ3V0aWxpc2F0ZXVyIGFjY2VwdGUgb3UgcmVmdXNlIGRlIHJlY2V2b2lyIGxhIG5ld3NsZXR0ZXIuXCIsXG4gICAgbmVlZFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGNvbm5hw650cmUgbGUgbm9tYnJlIGRlIG1pbnV0ZXMgZHUgZMOpY2FsYWdlIGhvcmFpcmUuXCIsXG4gICAgbmVlZE1pblRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgZW5sZXZlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA3MjAuXCIsXG4gICAgbmVlZE1heFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGZvdXJuaXIgdW4gbm9tYnJlIGRlIG1pbnV0ZXMgw6AgYWpvdXRlciDDoCBsJ2hldXJlIEdNVCBuZSBkw6lwYXNzYW50IHBhcyA4NDAuXCIsXG4gICAgbmVlZFVHQ09rIDogXCJWb3VzIGRldmV6IGFjY2VwdGVyIGxlcyBDR1UgcG91ciBwb3V2b2lyIGNyw6llciB2b3RyZSBjb21wdGUuIFwiLFxuICAgIGdvZGZhdGhlck5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIHZhbGlkZSB0cm91dsOpIHBvdXIgY2UgY29kZSBwYXJyYWluLlwiLFxuICAgIGdvZGZhdGhlckZvdW5kOiBcIlZvdHJlIHBhcnJhaW4gYSBiaWVuIMOpdMOpIHRyb3V2w6kgIVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBpbnNjcmlwdGlvbiBlc3QgYmllbiBlbnJlZ2lzdHLDqWUuXFxuUG91ciBsYSBmaW5hbGlzZXIsIG1lcmNpIGRlIGNsaXF1ZXIgZGFucyBsZXMgMjRIIHN1ciBsZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3RyZSBjb21wdGVcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuUG91ciB2YWxpZGVyIHZvdHJlIGNvbXB0ZSwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aCA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGguPC9wPjxwPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5WYWxpZGVyLjwvYT48L3A+XCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgY29tcHRlIHZpZW50IGJpZW4gZCfDqnRyZSB2YWxpZMOpLiBNZXJjaSBldCBiaWVudmVudWUgITxicj5Wb3VzIHBvdXZleiBzYW5zIHRhcmRlciB2b3VzIGNvbm5lY3RlciBjaS1kZXNzb3VzIHBvdXIgYWNjw6lkZXIgw6Agdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlQWRtaW46IFwiTGUgY29tcHRlIGEgYmllbiDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW46IFwiQ2UgY29tcHRlIGEgZMOpasOgIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgbWFpbFdlbGNvbWVTdWJqZWN0IDogXCJCaWVudmVudWUgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuVm90cmUgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+Vm90cmUgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS48L3A+PHA+TWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IDogXCJNZXJjaSAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuR3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS48L3A+PHA+TWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBjb25maXJtYXRpb24gbmUgc2VtYmxlIHBhcyB2YWxpZGUgb3UgYmllbiBpbCBhIGV4cGlyw6kuIFZvdXMgcG91dmV6IGVuIHJlY2V2b2lyIHVuIG5vdXZlYXUgPGEgaHJlZj0nI1VSTCc+ZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICBlbWFpbE5vdEZvdW5kOiBcIkF1Y3VuIHV0aWxpc2F0ZXVyIHRyb3V2w6kgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC5cIixcbiAgICBhbHJlYWR5Q29ubmVjdGVkOiBcIlZvdXMgw6p0ZXMgZMOpasOgIGNvbm5lY3TDqShlKSBhdSBzaXRlICFcIixcbiAgICBuZWVkQmVDb25uZWN0ZWQ6IFwiVm91cyBkZXZleiDDqnRyZSBjb25uZWN0w6koZSkgcG91ciBhY2PDqWRlciDDoCBjZXR0ZSBwYWdlLlwiLFxuICAgIGNvbm5lY3Rpb25PazogXCJDb25uZXhpb24gcsOpdXNzaWUuXCIsXG4gICAgbmVlZENob29zZUxvZ2luV2F5OiBcIlZvdXMgZGV2ZXogc29pdCBzYWlzaXIgdm90cmUgbW90IGRlIHBhc3NlLCBzb2l0IGNvY2hlciBsYSBjYXNlIHZvdXMgcGVybWV0dGFudCBkZSByZWNldm9pciB1biBsaWVuIGRlIGNvbm5leGlvbiBwYXIgZS1tYWlsLlwiLFxuICAgIG5lZWRWYWxpZGF0aW9uVG9Mb2dpbiA6IFwiVm91cyBkZXZleiBkJ2Fib3JkIHZhbGlkZXIgdm90cmUgY29tcHRlIGF2YW50IGRlIHZvdXMgY29ubmVjdGVyLiBQb3VyIGNlIGZhaXJlLCB1biBsaWVuIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIHRvb01hbnlMb2dpbkZhaWxzIDogXCJUcm9wIGRlIHRlbnRhdGl2ZXMgZGUgY29ubmV4aW9uIGluZnJ1Y3R1ZXVzZXMgcG91ciBjZXR0ZSBhZHJlc3NlIGUtbWFpbC4gVm91cyBkZXZleiBhdHRlbmRyZSBNSU5VVEVTIG1pbnV0ZXMgcG91ciBlc3NheWVyIGRlIG5vdXZlYXUuXCIsXG4gICAgYmFkUGFzc3dvcmQ6IFwiTGUgbW90IGRlIHBhc3NlIG4nZXN0IHBhcyBsZSBib24uXCIsXG4gICAgbWFpbExvZ2luTGlua1N1YmplY3QgOiBcIlZvdHJlIGxpZW4gZGUgY29ubmV4aW9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDogTElOS19VUkxcIixcbiAgICBtYWlsTG9naW5MaW5rQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIG1haWxMb2dpbkxpbmtNZXNzYWdlIDogXCJVbiBsaWVuIGRlIGNvbm5leGlvbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLiBOZSB0YXJkZXogcGFzIMOgIGwndXRpbGlzZXIsIGNhciBpbCBuJ2VzdCB2YWxhYmxlIHF1ZSBkdXJhbnQgXCIsXG4gICAgdXBkYXRlZE9rTWVzc2FnZTogXCJWb3MgaW5mb3JtYXRpb25zIG9udCBiaWVuIMOpdMOpIG1pc2VzIMOgIGpvdXIuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSBjYXIgZWxsZSBuJ2EgcGFzIHVuZSBmb3JtYXQgY29ycmVjdC5cIixcbiAgICB1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIHNhaXNpZSAoTkVXX0VNQUlMKSBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGF1dHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5TdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2U6IFwiQ2VwZW5kYW50LCB2b3VzIGF2ZXogbW9kaWZpw6kgYXUgbW9pbnMgdW4gZGUgdm9zIGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24gKGVtYWlsIGV0L291IG1vdCBkZSBwYXNzZSkgZXQgPGI+dm91cyBkZXZleiBjbGlxdWVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlcyBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIChORVdfRU1BSUwpIHBvdXIgdmFsaWRlciBjZSBjaGFuZ2VtZW50PC9iPi4gRW4gYXR0ZW5kYW50LCBtZXJjaSBkZSBjb250aW51ZXIgw6AgdXRpbGlzZXIgdm9zIGFuY2llbnMgaWRlbnRpZmlhbnRzLlwiLFxuICAgIHVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlcjogXCJMJ3V0aWxpc2F0ZXVyIHF1ZSB2b3VzIHNvdWhhaXTDqSBtb2RpZmllciBuJ2V4aXN0ZSBwYXMvcGx1cyBvdSBuJ2EgcGFzIGVuY29yZSB2YWxpZMOpIHNvbiBjb21wdGUuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIDogXCJNYWlzIGxlIG5vdXZlYXUgY29kZSBwYXJyYWluIG4nYSBwdSDDqnRyZSByZXRlbnUsIGNhciBpbCBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBvdSDDoCBsJ3V0aWxpc2F0ZXVyIGx1aS1tw6ptZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2U6IFwiTGEgbWlzZSDDoCBqb3VyIGRlIHZvcyBpZGVudGlmaWFudHMgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICB1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQgOiBcIkwnaWRlbnRpZmlhbnQgZm91cm5pIHBvdXIgbGUgcGFycmFpbiBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIHV0aWxpc2F0ZXVyLlwiLFxuICAgIGNyZWF0aW9uT2tNZXNzYWdlOiBcIkxlIG5vdXZlbCB1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6kuXCIsXG4gICAgbWFpbERlbGV0ZVN1YmplY3QgOiBcIkNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRGVsZXRlQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlBvdXIgdmFsaWRlciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxEZWxldGVMaW5rTWVzc2FnZTogXCJWb3RyZSBkZW1hbmRlIGRlIHN1cHByZXNzaW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuIE1lcmNpIGRlIGNsaXF1ZXIgc2FucyB0YXJkZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsIHBvdXIgY29uZmlybWVyLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZTogXCJMJ3V0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2U6IFwiVGVudGF0aXZlIGRlIHN1cHByZXNzaW9uIGQndW4gdXRpbGlzYXRldXIgaW5leGlzdGFudCA6IFwiLFxuICAgIG1haWxEZWxldGVMaW5rT2tNZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLiBNZXJjaSBkJ2F2b2lyIHV0aWxpc8OpIG5vcyBzZXJ2aWNlcy5cIixcbiAgICBtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgc3VwcHJlc3Npb24gbidlc3QgcGFzIHZhbGlkZSBvdSBhbG9ycyBpbCBuJ2VzdCBwbHVzIHZhbGFibGUuXCIsXG4gICAgY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgbm9uIHZhbGlkw6lzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIGRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBpbmFjdGlmcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICB3ZWxjb21lTWVzc2FnZTogXCJCaWVudmVudWUgI05BTUUgIVwiLFxuICAgIGJ5ZWJ5ZU1lc3NhZ2U6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgZMOpY29ubmV4aW9uIHMnZXN0IGJpZW4gZMOpcm91bMOpZS48YnI+w4AgYmllbnTDtHQgIVwiLFxuICAgIGluZm9zVXNlckZvckFkbWluOiBcIkNldCB1dGlsaXNhdGV1ciAoaWQ6IElEX1VTRVIpIGEgPGI+Y3LDqcOpIHNvbiBjb21wdGUgbGUgREFURV9DUkVBPC9iPiwgbGEgZGVybmnDqHJlIG1pc2Ugw6Agam91ciBkYXRhbnQgZHUgREFURV9VUERBVEUuPGJyPjxiPkRhdGUgZGUgc2EgZGVybmnDqHJlIGNvbm5leGlvbiA6IERBVEVfQ09OTkVDVElPTi48L2I+XCIsXG4gICAgaW5mb3NBZG1pbkdvZGZhdGhlcjogXCJDZXQgdXRpbGlzYXRldXIgYSDDqXTDqSBwYXJyYWluw6kgcGFyIFwiLFxuICAgIGluZm9zQWRtaW5OYkdvZENoaWxkczogXCJTZXMgI05CIGZpbGxldWlscyA6IFwiXG59OyIsIi8vIFF1ZWxxdWVzIGZvbmN0aW9ucyB1dGlsZXMgcG91ciBsZXMgY2hhw65uZXNcblxuY2xhc3MgVG9vbFxue1xuICAgIHN0YXRpYyBpc0VtcHR5KG15VmFyKVxuICAgIHtcbiAgICAgICAgaWYobXlWYXI9PT11bmRlZmluZWQgfHwgbXlWYXI9PT1udWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlWYXIrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlWYXI9bXlWYXIudHJpbSgpO1xuICAgICAgICAgICAgaWYobXlWYXI9PT1cIlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgdHJpbUlmTm90TnVsbChteVN0cmluZylcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShteVN0cmluZykpXG4gICAgICAgICAgICBteVN0cmluZz1udWxsO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgc2hvcnRlbklmTG9uZ2VyVGhhbihteVN0cmluZywgbWF4KVxuICAgIHtcbiAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gYXUgY2FzIG/DuSBjZWxhIG5lIHNlcmFpdCBwYXMgdW5lIGNoYcOubmUuLi5cbiAgICAgICBpZihteVN0cmluZy5sZW5ndGggPiBtYXgpXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy5zdWJzdHJpbmcoMCwgKG1heC0zKSkrXCIuLi5cIjtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE1NjA0MTQwL3JlcGxhY2UtbXVsdGlwbGUtc3RyaW5ncy13aXRoLW11bHRpcGxlLW90aGVyLXN0cmluZ3NcbiAgICBzdGF0aWMgcmVwbGFjZUFsbChteVN0cmluZywgbWFwT2JqKVxuICAgIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZUVsdHMgPSBuZXcgUmVnRXhwKE9iamVjdC5rZXlzKG1hcE9iaikuam9pbihcInxcIiksXCJnaVwiKTtcbiAgICAgICAgcmV0dXJuIG15U3RyaW5nLnJlcGxhY2UocmVwbGFjZUVsdHMsIChtYXRjaGVkKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbWFwT2JqW21hdGNoZWRdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PYmpldHNfZ2xvYmF1eC9NYXRoL3JhbmRvbVxuICAgIHN0YXRpYyBnZXRSYW5kb21JbnQobWluLCBtYXgpXG4gICAge1xuICAgICAgICBtaW4gPSBNYXRoLmNlaWwobWluKTtcbiAgICAgICAgbWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpICsgbWluO1xuICAgIH1cblxuICAgIC8vIMOgIGNvbXBsw6l0ZXIgOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EYXRlX2Zvcm1hdF9ieV9jb3VudHJ5XG4gICAgc3RhdGljIGRhdGVGb3JtYXQoZGF0ZVN0cmluZywgbGFuZz1cImZyXCIpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkoZGF0ZVN0cmluZykpXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG15RGF0ZT1uZXcgRGF0ZShkYXRlU3RyaW5nKTtcbiAgICAgICAgbGV0IG15RGF5PW15RGF0ZS5nZXREYXRlKCkrXCJcIjtcbiAgICAgICAgaWYobXlEYXkubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15RGF5PVwiMFwiK215RGF5O1xuICAgICAgICBsZXQgbXlNb3VudGg9KG15RGF0ZS5nZXRNb250aCgpKzEpK1wiXCI7XG4gICAgICAgIGlmKG15TW91bnRoLmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteU1vdW50aD1cIjBcIitteU1vdW50aDtcbiAgICAgICAgbGV0IG15WWVhcj1teURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgaWYobGFuZz09PVwiZnJcIilcbiAgICAgICAgICAgIHJldHVybiBteURheStcIi9cIitteU1vdW50aCtcIi9cIitteVllYXI7XG4gICAgICAgIGVsc2UgaWYgKGxhbmc9PT1cImZvcm1cIikvLyAyMDE0LTAyLTA5XG4gICAgICAgICAgICByZXR1cm4gbXlZZWFyK1wiLVwiK215TW91bnRoK1wiLVwiK215RGF5O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbXlNb3VudGgrXCIvXCIrbXlEYXkrXCIvXCIrbXlZZWFyO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUb29sOyIsInZhciBtYXAgPSB7XG5cdFwiLi9kZWZhdWx0L2NvbmZpZy9mci5qc1wiOiBcIi4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL3ZpZXdzIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcLmpzJFwiOyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBoZWFkTGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJBY2N1ZWlsXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9cIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1vbiBjb21wdGVcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nvbm5leGlvbi5obXRcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCLDgCBwcm9wb3NcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2EtcHJvcG9zLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiIH0gfSxcbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlUuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5WLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d2Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDEwLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhICgqKSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwYXJ0YWfDqSBzdXIgV2lraUxlcm5pIHNvbnQgbGlicmVzLjxicj5Wb3VzIHBvdXZleiBsZXMgdXRpbGlzZXIsIGxlcyBtb2RpZmllciBldCBsZXMgZGlmZnVzZXIgc2Vsb24gdm90cmUgc291aGFpdC48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48YnI+PGJyPjxzbWFsbD48ZW0+KCopIEJpZW4gcXVlIHBhcnRhZ2VhbnQgc2VzIHZhbGV1cnMsIFdpa2lMZXJuaSBlc3QgdW4gcHJvamV0IGluZMOpcGVuZGFudCBkZSBsYSBmb25kYXRpb24gV2lraXDDqWRpYS48L2VtPjwvc21hbGw+XCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNUaXRsZTogXCJMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiTGlzdGUgZGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmkuXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5pID9cIixcbiAgICBleHBsYW5hdGlvblR4dDogXCJMZSBwcmluY2lwZSBlc3Qgc2ltcGxlIDogdm91cyBjb21tZW5jZXogcGFyIGxpcmUgbCdhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpLjxicj5QdWlzIHZvdXMgYWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlLiBWb3VzIG9idGVuZXogYWxvcnMgdm90cmUgcsOpc3VsdGF0IGltbcOpZGlhdGVtZW50Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlczwvYj4sIG1haXMgbGlicmUgw6Agdm91cyBkJ2Vzc2F5ZXIgZCd5IHLDqXBvbmRyZSBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuPGJyPkNlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IHBsdXNpZXVycyBqb3Vycywgc2VtYWluZXMsIG1vaXMuLi4gRXQgZGUgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBzdWdnZXN0aW9ucyBkZSBsZWN0dXJlcy48YnI+PGJyPk1haXMgPGI+bGEgY3LDqWF0aW9uIGRlIGNlIGNvbXB0ZSBlc3QgZmFjdWx0YXRpdmU8L2I+IGV0IDxhIGhyZWY9Jy9xdWl6cy8nIHRpdGxlPSdMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMnPnZvdXMgcG91dmV6IHBhcmNvdXJpciBXaWtpTGVybmkgbGlicmVtZW50PC9hPi5cIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxufTsiLCIvLyAtLSBQQUdFIFBFUk1FVFRBTlQgREUgVEVTVEVSIFVOIExJRU4gREUgQ09OTkVYSU9OIFJFw4dVIFBBUiBFLU1BSUxcblxuLy8vIFVuIHRva2VuIGVzdCB0cmFuc21pcyBlbiBwYXJhbcOodHJlIGRlIGwnVXJsLiBJbCBhIHVuZSB2YWxpZGl0w6kgbGltaXTDqSBkYW5zIGxlIHRlbXBzLlxuLy8vIERhbnMgY2UgY2FzLCBvbiBwZXV0IHJlZGlyaWdlciBsJ3V0aWxpc2F0ZXVyIHZlcnMgbGEgcGFnZSBkZSBjb25uZXhpb24gcG91ciBvYnRlbmlyIHVuIG5vdXZlYXUgbGllbiBkZSB2YWxpZGF0aW9uXG4vLy8gU2kgbGUgdG9rZW4gZXN0IG9rLCBvbiBjcsOpZSB1bmUgc2Vzc2lvbiBzdWl2YW50IGxhIGR1csOpZSByZXRvdXJuw6llIHBhciBsJ0FQSSBldCByZWRpcmlnZSBsJ3V0aWxpc2F0ZXVyIHZlcnMgc2EgcGFnZSBkJ2FjY3VlaWxcbi8vLyBVbiByw6lzdWx0YXQgZGUgcXVpeiBwZXV0IGF1c3NpIGF2b2lyIMOpdMOpIGVucmVnaXN0csOpIGPDtHTDqSBjbGllbnQgZXQgZXN0IGFsb3JzIMOgIHRyYW5zbWV0dHJlIMOgIGwnQVBJLlxuLy8vIFNpIGwndXRpbGlzYXRldXIgYSBkw6lqw6AgdW5lIHNlc3Npb24gYWN0aXZlIHZhbGlkZSwgYydlc3QgcXUnaWwgYSBkw6lqw6AgY2xpcXXDqSBzdXIgbGUgbGllbi4gT24gbGUgcmVkaXJpZ2Ugw6lnYWxlbWVudCB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5jb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZSBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vdG9vbHMvbWFpblwiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW1zIH0gZnJvbSBcIi4vdG9vbHMvdXJsLmpzXCI7XG5pbXBvcnQgeyBjaGVja0Fuc3dlckRhdGFzLCBjaGVja1Nlc3Npb24sIGdldENvbmZpZywgZ2V0VGltZURpZmZlcmVuY2UsIHNldFNlc3Npb24gfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5cbmhlbGxvRGV2KCk7XG5cbmxldCBjb25maWc7XG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGNvbmZpZyA9IGF3YWl0IGdldENvbmZpZygpO1xuICAgICAgICBpZighY29uZmlnKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIHNpIGwndXRpbGlzYXRldXIgZXN0IGTDqWrDoCBjb25uZWN0w6ksIHBhcyBsYSBwZWluZSBkJ2FsbGVyICsgbG9pbiA6XG4gICAgICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oKTtcbiAgICAgICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIHsgbWVzc2FnZTogdHh0VXNlcnMuYWxyZWFkeUNvbm5lY3RlZCwgY29sb3I6XCJpbmZvcm1hdGlvblwiIH0pOy8vIHBvdXIgbCdhZmZpY2hlciBzdXIgbGEgcGFnZSBzdWl2YW50ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBob21lUGFnZT11c2VyLnN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdGcm9udEVuZFtob21lUGFnZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXRVcmxQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICBpZihkYXRhcyAmJiBkYXRhcy50IT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnLnVzZXJSb3V0ZXMrY29uZmlnLmNvbm5lY3Rpb25XaXRoTGlua1JvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiAhaXNFbXB0eShyZXNwb25zZS51c2VySWQpICYmICFpc0VtcHR5KHJlc3BvbnNlLmNvbm5leGlvblRpbWUpICYmICFpc0VtcHR5KHJlc3BvbnNlLnRva2VuKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25uZXhpb25NYXhUaW1lPURhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmNvbm5leGlvblRpbWUuZW5kc1dpdGgoXCJkYXlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmV4aW9uTWF4VGltZSs9cGFyc2VJbnQocmVzcG9uc2UuY29ubmV4aW9uVGltZSwxMCkqMjQqMzYwMCoxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZXhpb25NYXhUaW1lKz1wYXJzZUludChyZXNwb25zZS5jb25uZXhpb25UaW1lLDEwKSozNjAwKjEwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlc3Npb24ocmVzcG9uc2UudXNlcklkLCByZXNwb25zZS50b2tlbiwgY29ubmV4aW9uTWF4VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcImxhc3RBbnN3ZXJcIik7Ly8gISBpbXBvcnRhbnQgcG91ciBuZSBwYXMgZW5yZWdpc3RlciBwbHVzaWV1cnMgZm9pcyBsZSByw6lzdWx0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy52YWxpZGF0aW9uTWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7Ly8gYXUgY2FzIG/DuSBibG9jYWdlIHJlZGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnRnJvbnRFbmQudXNlckhvbWVQYWdlKTsvLyBjb25uZXhpb24gcGFyIGxpZW4gbmUgY29uY2VybmUgcXVlIGxlcyBzaW1wbGVzIFwidXNlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh0aGlzLnN0YXR1cyA9PT0gNDAxIHx8IHRoaXMuc3RhdHVzID09PSA0MDMpICYmIHJlc3BvbnNlLmVycm9ycyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0VXNlcnMuYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ0Zyb250RW5kLmNvbm5lY3Rpb25QYWdlKSwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzLnRpbWVEaWZmZXJlbmNlPWdldFRpbWVEaWZmZXJlbmNlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNpIGwndXRpbGlzYXRldXIgYSBwcsOpY8OpZGVtZW50IHLDqXBvbmR1IMOgIHVuIHF1aXosIGonYWpvdXRlIGxlcyBpbmZvcyBkZSBzb24gcsOpc3VsdGF0IDpcbiAgICAgICAgICAgICAgICAgICAgZGF0YXM9Y2hlY2tBbnN3ZXJEYXRhcyhkYXRhcyk7XG4gICAgICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIHLDqWN1cMOpcmFudCBsZXMgcGFyYW3DqHRyZXMgcGFzc8OpcyBwYXIgbCd1cmxcbmV4cG9ydCBjb25zdCBnZXRVcmxQYXJhbXMgPSAoKSA9Plxue1xuICAgIGlmKGlzRW1wdHkobG9jYXRpb24uc2VhcmNoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IGxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoXCImXCIpO1xuICAgIGlmKCFBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpIHx8IHBhcmFtZXRlcnMubGVuZ3RoPT09MClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICBsZXQgcGFyYW0sIGRhdGFzPXt9O1xuICAgIGZvcihsZXQgaSBpbiBwYXJhbWV0ZXJzKVxuICAgIHtcbiAgICAgICAgcGFyYW0gPSBwYXJhbWV0ZXJzW2ldLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgaWYocGFyYW0ubGVuZ3RoPT09MilcbiAgICAgICAgICAgIGRhdGFzW3BhcmFtWzBdXT1kZWNvZGVVUkkocGFyYW1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/front/public/JS/loginlink.app.js b/front/public/JS/loginlink.app.js
new file mode 100644
index 0000000..071c378
--- /dev/null
+++ b/front/public/JS/loginlink.app.js
@@ -0,0 +1,872 @@
+/******/ (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/loginlink.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "../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 : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !",
+ 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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;
+
+/***/ }),
+
+/***/ "./src/config/general.js":
+/*!*******************************!*\
+ !*** ./src/config/general.js ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ apiUrl: "http://localhost:3000/api",
+ usersGetConfigUrl: "/user/getconfig",
+ lang: "fr",
+ 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/"
+}; // à terme fusionner avec les déclarations backend concernant le front, tout étant saisi dans l'admin
+
+/***/ }),
+
+/***/ "./src/loginlink.js":
+/*!**************************!*\
+ !*** ./src/loginlink.js ***!
+ \**************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.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__);
+/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __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); }); }; }
+
+// -- GESTION DE LA PAGE PERMETTANT DE TESTER UN LIEN DE CONNEXION REÇU PAR E-MAIL
+/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps.
+/// Dans ce cas, on peut rediriger l'utilisateur vers la page de connexion pour obtenir un nouveau lien de validation
+/// Si le token est ok, on crée une session suivant la durée retournée par l'API et redirige l'utilisateur vers sa page d'accueil
+/// Un résultat de quiz peut aussi avoir été enregistré côté client et est alors à transmettre à l'API
+/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige également vers sa page d'accueil.
+// Fichier de configuration côté client :
+var configFrontEnd = __webpack_require__(/*! ./config/general */ "./src/config/general.js"); // Importation des fonctions utile au script :
+
+
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + configFrontEnd.lang + "/general");
+
+var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + configFrontEnd.lang + "/user");
+
+var divResponse = document.getElementById("response");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["helloDev"])();
+var config;
+
+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_5__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+
+ if (config) {
+ _context.next = 8;
+ break;
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ _context.next = 12;
+ break;
+
+ case 8:
+ _context.next = 10;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["checkSession"])(config);
+
+ case 10:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", {
+ message: txtUsers.alreadyConnected,
+ color: "information"
+ }); // pour l'afficher sur la page suivante
+
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("user", true);
+ homePage = user.status + "HomePage";
+ window.location.assign("/" + configFrontEnd[homePage]);
+ } else {
+ datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_4__["getUrlParams"])();
+
+ if (datas && datas.t !== undefined) {
+ xhr = new XMLHttpRequest();
+ xhr.open("POST", configFrontEnd.apiUrl + config.userRoutes + config.connectionWithLinkRoute);
+
+ xhr.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(response.userId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(response.connexionTime) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(response.token)) {
+ var connexionMaxTime = Date.now();
+ if (response.connexionTime.endsWith("days")) connexionMaxTime += parseInt(response.connexionTime, 10) * 24 * 3600 * 1000;else connexionMaxTime += parseInt(response.connexionTime, 10) * 3600 * 1000;
+ Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["setSession"])(response.userId, response.token, connexionMaxTime);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("lastAnswer"); // ! important pour ne pas enregister plusieurs fois le résultat
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.validationMessage, "", ["success"]); // au cas où blocage redirection
+
+ window.location.assign("/" + configFrontEnd.userHomePage); // connexion par lien ne concerne que les simples "user"
+ } else if ((this.status === 401 || this.status === 403) && response.errors != undefined) {
+ if (Array.isArray(response.errors)) response.errors = response.errors.join(" ");else response.errors = txt.serverError;
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.connectionPage), "", ["error"]);
+ }
+ };
+
+ datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getTimeDifference"])(config); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat :
+
+ datas = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["checkAnswerDatas"])(datas);
+ xhr.setRequestHeader("Content-Type", "application/json");
+ xhr.send(JSON.stringify(datas));
+ }
+ }
+
+ case 12:
+ _context.next = 17;
+ break;
+
+ case 14:
+ _context.prev = 14;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+
+ case 17:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 14]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+
+/***/ }),
+
+/***/ "./src/tools/clientstorage.js":
+/*!************************************!*\
+ !*** ./src/tools/clientstorage.js ***!
+ \************************************/
+/*! exports provided: saveLocaly, getLocaly, removeLocaly */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
+// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
+// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
+var saveLocaly = function saveLocaly(name, data) {
+ localStorage.setItem(name, JSON.stringify(data));
+};
+var getLocaly = function getLocaly(name) {
+ var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
+};
+var removeLocaly = function removeLocaly(name) {
+ localStorage.removeItem(name);
+};
+
+/***/ }),
+
+/***/ "./src/tools/dom.js":
+/*!**************************!*\
+ !*** ./src/tools/dom.js ***!
+ \**************************/
+/*! exports provided: addElement */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var addElement = function addElement(eltParent, eltType) {
+ var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
+ var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
+ var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
+ var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
+ var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
+ var newElement = document.createElement(eltType);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
+ newElement.id = eltId;
+
+ if (Array.isArray(eltClass) && eltClass.length != 0) {
+ for (var i in eltClass) {
+ newElement.classList.add(eltClass[i]);
+ }
+ }
+
+ if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
+ {
+ for (var attributName in eltAttributes) {
+ newElement.setAttribute(attributName, eltAttributes[attributName]);
+ }
+ }
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, " "); // 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 */
+/***/ (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; });
+// 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 est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****");
+ return true;
+};
+
+/***/ }),
+
+/***/ "./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 _clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_1__);
+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 configFrontEnd = __webpack_require__(/*! ../config/general */ "./src/config/general.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", configFrontEnd.apiUrl + configFrontEnd.usersGetConfigUrl);
+
+ 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(config) {
+ var timeLocal = new Date().getTimezoneOffset();
+ if (timeLocal > config.timeDifferenceMax || timeLocal < config.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_0__["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_0__["getLocaly"])("lastAnswer");
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(lastAnswer)) {
+ var answer = JSON.parse(lastAnswer);
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["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(config) {
+ 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 > 1 && _args2[1] !== undefined ? _args2[1] : [];
+ urlRedirection = _args2.length > 2 ? _args2[2] : undefined;
+ message = _args2.length > 3 ? _args2[3] : undefined;
+ urlWanted = _args2.length > 4 ? _args2[4] : undefined;
+ return _context2.abrupt("return", new Promise(function (resolve, reject) {
+ var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("user");
+
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(userDatas)) {
+ redirectUser(urlRedirection, message, urlWanted);
+ resolve(false);
+ } else {
+ var user = JSON.parse(userDatas);
+
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.duration) || user.duration < Date.now()) {
+ Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user");
+ redirectUser(urlRedirection, message, urlWanted);
+ resolve(false);
+ } else {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", configFrontEnd.apiUrl + config.userRoutes + config.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; // le token et de toute façon vérifier à chaque requête à l'API
+
+ Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["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.siteUrl + "/" + configFrontEnd.accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configFrontEnd.accountPage); // 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_0__["removeLocaly"])("user");
+ redirectUser(urlRedirection, message, urlWanted);
+ resolve(false);
+ }
+ } else {
+ Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["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(_x) {
+ 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_1__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", message);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("url", urlWanted);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection);
+};
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZmlnL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvZ2lubGluay5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvY2xpZW50c3RvcmFnZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZG9tLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9ldmVyeXdoZXJlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91cmwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VzZXJzLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJzaXRlSFRNTFRpdGxlIiwic2l0ZU1ldGFEZXNjcmlwdGlvbiIsInNjcmlwdFRpbWluZ0luZm8iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsIm5lZWRlZFBhcmFtcyIsImJhZFVybCIsIm5vdFZhbGlkRm9ybWF0Iiwibm90QWxsb3dlZCIsIm5vdFJlcXVpcmVkIiwidXBkYXRlQnRuVHh0IiwiYWRkQnRuVHh0IiwiZGVsZXRlQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwidXBkYXRlT2tNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoVG9rZW4iLCJmYWlsQXV0aElkIiwiZmFpbEF1dGhDcm9uIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwic3RhdHNBZG1pbiIsIm5vdEZvdW5kIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkRW1haWwiLCJuZWVkVW5pcXVlRW1haWwiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZExvbmdQYXNzV29yZCIsInBhc3N3b3JkQ29waWVkIiwibmVlZFN0YXR1cyIsIm5lZWRMYW5ndWFnZSIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsIm5lZWRTTVRQIiwibmVlZFNNVFBOb3RGb3VuZCIsIm5lZWRLbm93TmV3c2xldHRlck9rIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJnb2RmYXRoZXJGb3VuZCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsInZhbGlkYXRpb25NZXNzYWdlIiwidmFsaWRhdGlvbk1lc3NhZ2VBZG1pbiIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlclN1YmplY3QiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJlbWFpbE5vdEZvdW5kIiwiYWxyZWFkeUNvbm5lY3RlZCIsIm5lZWRCZUNvbm5lY3RlZCIsImNvbm5lY3Rpb25PayIsIm5lZWRDaG9vc2VMb2dpbldheSIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsInRvb01hbnlMb2dpbkZhaWxzIiwiYmFkUGFzc3dvcmQiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidXBkYXRlZE5lZWRHb29kRW1haWwiLCJ1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlUeHQiLCJtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwidXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIiwiY3JlYXRpb25Pa01lc3NhZ2UiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxEZWxldGVCb2R5VHh0IiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua09rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwid2VsY29tZU1lc3NhZ2UiLCJieWVieWVNZXNzYWdlIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiVG9vbCIsIm15VmFyIiwidW5kZWZpbmVkIiwidHJpbSIsIm15U3RyaW5nIiwiaXNFbXB0eSIsIm1heCIsImxlbmd0aCIsInN1YnN0cmluZyIsIm1hcE9iaiIsInJlcGxhY2VFbHRzIiwiUmVnRXhwIiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJyZXBsYWNlIiwibWF0Y2hlZCIsIm1pbiIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJyYW5kb20iLCJkYXRlU3RyaW5nIiwibGFuZyIsIm15RGF0ZSIsIkRhdGUiLCJteURheSIsImdldERhdGUiLCJteU1vdW50aCIsImdldE1vbnRoIiwibXlZZWFyIiwiZ2V0RnVsbFllYXIiLCJhcGlVcmwiLCJ1c2Vyc0dldENvbmZpZ1VybCIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsImNvbmZpZ0Zyb250RW5kIiwicmVxdWlyZSIsInR4dCIsInR4dFVzZXJzIiwiZGl2UmVzcG9uc2UiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaGVsbG9EZXYiLCJjb25maWciLCJpbml0aWFsaXNlIiwiZ2V0Q29uZmlnIiwiYWRkRWxlbWVudCIsImNoZWNrU2Vzc2lvbiIsImlzQ29ubmVjdGVkIiwic2F2ZUxvY2FseSIsIm1lc3NhZ2UiLCJjb2xvciIsInVzZXIiLCJnZXRMb2NhbHkiLCJob21lUGFnZSIsInN0YXR1cyIsIndpbmRvdyIsImxvY2F0aW9uIiwiYXNzaWduIiwiZGF0YXMiLCJnZXRVcmxQYXJhbXMiLCJ0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwidXNlclJvdXRlcyIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJyZXNwb25zZSIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsInVzZXJJZCIsImNvbm5leGlvblRpbWUiLCJ0b2tlbiIsImNvbm5leGlvbk1heFRpbWUiLCJub3ciLCJlbmRzV2l0aCIsInBhcnNlSW50Iiwic2V0U2Vzc2lvbiIsInJlbW92ZUxvY2FseSIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInRpbWVEaWZmZXJlbmNlIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJjaGVja0Fuc3dlckRhdGFzIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJzdHJpbmdpZnkiLCJuYW1lIiwiZGF0YSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpZCIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImNvbnNvbGUiLCJsb2ciLCJzZWFyY2giLCJwYXJhbWV0ZXJzIiwic3BsaXQiLCJwYXJhbSIsImRlY29kZVVSSSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib25sb2FkIiwib25lcnJvciIsInN0YXR1c1RleHQiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsInRpbWVEaWZmZXJlbmNlTWF4IiwidGltZURpZmZlcmVuY2VNaW4iLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJwYXNzd29yZCIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwiY2hlY2tMb2dpblJvdXRlIiwiaXNWYWxpZCIsImxhbmd1YWdlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50Iiwic2l0ZVVybCIsImhyZWYiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7QUNsRkE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0U7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEOzs7Ozs7Ozs7OztBQ3RCQUEsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSUMsZUFBYSxFQUFHLG1EQURwQjtBQUVJQyxxQkFBbUIsRUFBRyx1RkFGMUI7QUFHSUMsa0JB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NEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQW9FLGtDQUFZLENBQUNILGNBQUQsRUFBaUJqRyxPQUFqQixFQUEwQmtHLFNBQTFCLENBQVo7QUFDQXpCLDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBN0QscUJBQUcsQ0FBQ2dFLE9BQUosR0FBYztBQUFBLDJCQUFNRixNQUFNLENBQUM5RCxHQUFHLENBQUNpRSxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQWpFLHFCQUFHLENBQUM0QixJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVozQyxZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTXVHLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNILGNBQUQsRUFBaUJqRyxPQUFqQixFQUEwQmtHLFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDeEosMkRBQU8sQ0FBQ3NELE9BQUQsQ0FBWCxFQUNJRCxvRUFBVSxDQUFDLFNBQUQsRUFBWUMsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDdEQsMkRBQU8sQ0FBQ3dKLFNBQUQsQ0FBWCxFQUNJbkcsb0VBQVUsQ0FBQyxLQUFELEVBQVFtRyxTQUFSLENBQVY7QUFDSixNQUFHLENBQUN4SiwyREFBTyxDQUFDdUosY0FBRCxDQUFYLEVBQ0kzRixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCeUYsY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9sb2dpbmxpbmsuYXBwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvbG9naW5saW5rLmpzXCIpO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICFcIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsIDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgdXNlcnNHZXRDb25maWdVcmwgOiBcIi91c2VyL2dldGNvbmZpZ1wiLFxuICAgIGxhbmcgOiBcImZyXCIsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCJcbn07XG4vLyDDoCB0ZXJtZSBmdXNpb25uZXIgYXZlYyBsZXMgZMOpY2xhcmF0aW9ucyBiYWNrZW5kIGNvbmNlcm5hbnQgbGUgZnJvbnQsIHRvdXQgw6l0YW50IHNhaXNpIGRhbnMgbCdhZG1pbiIsIi8vIC0tIEdFU1RJT04gREUgTEEgUEFHRSBQRVJNRVRUQU5UIERFIFRFU1RFUiBVTiBMSUVOIERFIENPTk5FWElPTiBSRcOHVSBQQVIgRS1NQUlMXG5cbi8vLyBVbiB0b2tlbiBlc3QgdHJhbnNtaXMgZW4gcGFyYW3DqHRyZSBkZSBsJ1VybC4gSWwgYSB1bmUgdmFsaWRpdMOpIGxpbWl0w6kgZGFucyBsZSB0ZW1wcy5cbi8vLyBEYW5zIGNlIGNhcywgb24gcGV1dCByZWRpcmlnZXIgbCd1dGlsaXNhdGV1ciB2ZXJzIGxhIHBhZ2UgZGUgY29ubmV4aW9uIHBvdXIgb2J0ZW5pciB1biBub3V2ZWF1IGxpZW4gZGUgdmFsaWRhdGlvblxuLy8vIFNpIGxlIHRva2VuIGVzdCBvaywgb24gY3LDqWUgdW5lIHNlc3Npb24gc3VpdmFudCBsYSBkdXLDqWUgcmV0b3VybsOpZSBwYXIgbCdBUEkgZXQgcmVkaXJpZ2UgbCd1dGlsaXNhdGV1ciB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsXG4vLy8gVW4gcsOpc3VsdGF0IGRlIHF1aXogcGV1dCBhdXNzaSBhdm9pciDDqXTDqSBlbnJlZ2lzdHLDqSBjw7R0w6kgY2xpZW50IGV0IGVzdCBhbG9ycyDDoCB0cmFuc21ldHRyZSDDoCBsJ0FQSVxuLy8vIFNpIGwndXRpbGlzYXRldXIgYSBkw6lqw6AgdW5lIHNlc3Npb24gYWN0aXZlIHZhbGlkZSwgYydlc3QgcXUnaWwgYSBkw6lqw6AgY2xpcXXDqSBzdXIgbGUgbGllbi4gT24gbGUgcmVkaXJpZ2Ugw6lnYWxlbWVudCB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5jb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuL2NvbmZpZy9nZW5lcmFsXCIpO1xuXG4vLyBJbXBvcnRhdGlvbiBkZXMgZm9uY3Rpb25zIHV0aWxlIGF1IHNjcmlwdCA6XG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2IH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi90b29scy9tYWluXCI7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbXMgfSBmcm9tIFwiLi90b29scy91cmwuanNcIjtcbmltcG9ydCB7IGNoZWNrQW5zd2VyRGF0YXMsIGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBnZXRUaW1lRGlmZmVyZW5jZSwgc2V0U2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrY29uZmlnRnJvbnRFbmQubGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitjb25maWdGcm9udEVuZC5sYW5nK1wiL3VzZXJcIik7XG5cbmNvbnN0IGRpdlJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcblxuaGVsbG9EZXYoKTtcblxubGV0IGNvbmZpZztcbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBlc3QgZMOpasOgIGNvbm5lY3TDqSwgcGFzIGxhIHBlaW5lIGQnYWxsZXIgKyBsb2luIDpcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbihjb25maWcpO1xuICAgICAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgeyBtZXNzYWdlOiB0eHRVc2Vycy5hbHJlYWR5Q29ubmVjdGVkLCBjb2xvcjpcImluZm9ybWF0aW9uXCIgfSk7Ly8gcG91ciBsJ2FmZmljaGVyIHN1ciBsYSBwYWdlIHN1aXZhbnRlXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ0Zyb250RW5kW2hvbWVQYWdlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGFzPWdldFVybFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIGlmKGRhdGFzICYmIGRhdGFzLnQhPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIGNvbmZpZ0Zyb250RW5kLmFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcuY29ubmVjdGlvbldpdGhMaW5rUm91dGUpO1xuICAgICAgICAgICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmICFpc0VtcHR5KHJlc3BvbnNlLnVzZXJJZCkgJiYgIWlzRW1wdHkocmVzcG9uc2UuY29ubmV4aW9uVGltZSkgJiYgIWlzRW1wdHkocmVzcG9uc2UudG9rZW4pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbm5leGlvbk1heFRpbWU9RGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuY29ubmV4aW9uVGltZS5lbmRzV2l0aChcImRheXNcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZXhpb25NYXhUaW1lKz1wYXJzZUludChyZXNwb25zZS5jb25uZXhpb25UaW1lLDEwKSoyNCozNjAwKjEwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5leGlvbk1heFRpbWUrPXBhcnNlSW50KHJlc3BvbnNlLmNvbm5leGlvblRpbWUsMTApKjM2MDAqMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2Vzc2lvbihyZXNwb25zZS51c2VySWQsIHJlc3BvbnNlLnRva2VuLCBjb25uZXhpb25NYXhUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibGFzdEFuc3dlclwiKTsvLyAhIGltcG9ydGFudCBwb3VyIG5lIHBhcyBlbnJlZ2lzdGVyIHBsdXNpZXVycyBmb2lzIGxlIHLDqXN1bHRhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFVzZXJzLnZhbGlkYXRpb25NZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTsvLyBhdSBjYXMgb8O5IGJsb2NhZ2UgcmVkaXJlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdGcm9udEVuZC51c2VySG9tZVBhZ2UpOy8vIGNvbm5leGlvbiBwYXIgbGllbiBuZSBjb25jZXJuZSBxdWUgbGVzIHNpbXBsZXMgXCJ1c2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHRoaXMuc3RhdHVzID09PSA0MDEgfHwgdGhpcy5zdGF0dXMgPT09IDQwMykgJiYgcmVzcG9uc2UuZXJyb3JzICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHR4dC5zZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5iYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UucmVwbGFjZShcIiNVUkxcIiwgY29uZmlnRnJvbnRFbmQuY29ubmVjdGlvblBhZ2UpLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGF0YXMudGltZURpZmZlcmVuY2U9Z2V0VGltZURpZmZlcmVuY2UoY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBhIHByw6ljw6lkZW1lbnQgcsOpcG9uZHUgw6AgdW4gcXVpeiwgaidham91dGUgbGVzIGluZm9zIGRlIHNvbiByw6lzdWx0YXQgOlxuICAgICAgICAgICAgICAgICAgICBkYXRhcz1jaGVja0Fuc3dlckRhdGFzKGRhdGFzKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG4gTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IGVzdCBsaXNpYmxlIHN1ciBnaXRsYWIgOiBcXG4gQm9ubmUgbGVjdHVyZSA6LSkgXFxuIFBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiByw6ljdXDDqXJhbnQgbGVzIHBhcmFtw6h0cmVzIHBhc3PDqXMgcGFyIGwndXJsXG5leHBvcnQgY29uc3QgZ2V0VXJsUGFyYW1zID0gKCkgPT5cbntcbiAgICBpZihpc0VtcHR5KGxvY2F0aW9uLnNlYXJjaCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KFwiJlwiKTtcbiAgICBpZighQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJzKSB8fCBwYXJhbWV0ZXJzLmxlbmd0aD09PTApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgbGV0IHBhcmFtLCBkYXRhcz17fTtcbiAgICBmb3IobGV0IGkgaW4gcGFyYW1ldGVycylcbiAgICB7XG4gICAgICAgIHBhcmFtID0gcGFyYW1ldGVyc1tpXS5zcGxpdChcIj1cIik7XG4gICAgICAgIGlmKHBhcmFtLmxlbmd0aD09PTIpXG4gICAgICAgICAgICBkYXRhc1twYXJhbVswXV09ZGVjb2RlVVJJKHBhcmFtWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufSIsImNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4uL2NvbmZpZy9nZW5lcmFsXCIpO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBSw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkZSBjb25maWd1cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnNcbi8vIMOAIHRlcm1lLCB1biBmaWNoaWVyIHN0YXRpcXVlIGltcG9ydGFibGUgY29tbWUgbW9kdWxlIGRldnJhaXQgw6l2aXRlciB1bmUgcmVxdcOqdGUgYWpheFxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9ICBhc3luYyAoKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGNvbmZpZ0Zyb250RW5kLmFwaVVybCtjb25maWdGcm9udEVuZC51c2Vyc0dldENvbmZpZ1VybCk7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9IChjb25maWcpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiBjb25maWcudGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgY29uZmlnLnRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG5leHBvcnQgY29uc3QgZ2V0UGFzc3dvcmQgPSAobmJDYXJNaW4sIG5iQ2FyTWF4KSA9Plxue1xuICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICB7XG4gICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgfVxuICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIHJldHVybiBwYXNzd29yZDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb24gOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKGNvbmZpZywgc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBjb25maWdGcm9udEVuZC5hcGlVcmwrY29uZmlnLnVzZXJSb3V0ZXMrY29uZmlnLmNoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBsZSB0b2tlbiBldCBkZSB0b3V0ZSBmYcOnb24gdsOpcmlmaWVyIMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PWNvbmZpZy5zaXRlVXJsK1wiL1wiK2NvbmZpZ0Zyb250RW5kLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ0Zyb250RW5kLmFjY291bnRQYWdlKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/front/public/JS/manageQuestionnaires.app.js b/front/public/JS/manageQuestionnaires.app.js
new file mode 100644
index 0000000..e448352
--- /dev/null
+++ b/front/public/JS/manageQuestionnaires.app.js
@@ -0,0 +1,2070 @@
+/******/ (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/manageQuestionnaires.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",
+ senderEmail: "bonjour@wikilerni.com",
+ adminLang: "fr",
+ theme: "default",
+ // 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",
+ beginCodeGodfather: "wikilerni",
+ // 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: 10,
+ // 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",
+ searchAdminQuestionnairesRoute: "/searchadmin",
+ getListNextQuestionnaires: "/getlistnextquestionnaires/",
+ // -- 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: 10,
+ 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
+
+};
+
+/***/ }),
+
+/***/ "../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 ^\\.\\/.*\\/illustration$":
+/*!*******************************************!*\
+ !*** ../lang sync ^\.\/.*\/illustration$ ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var map = {
+ "./fr/illustration": "../lang/fr/illustration.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 ^\\.\\/.*\\/illustration$";
+
+/***/ }),
+
+/***/ "../lang sync recursive ^\\.\\/.*\\/link$":
+/*!***********************************!*\
+ !*** ../lang sync ^\.\/.*\/link$ ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var map = {
+ "./fr/link": "../lang/fr/link.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 ^\\.\\/.*\\/link$";
+
+/***/ }),
+
+/***/ "../lang sync recursive ^\\.\\/.*\\/question$":
+/*!***************************************!*\
+ !*** ../lang sync ^\.\/.*\/question$ ***!
+ \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var map = {
+ "./fr/question": "../lang/fr/question.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 ^\\.\\/.*\\/question$";
+
+/***/ }),
+
+/***/ "../lang sync recursive ^\\.\\/.*\\/questionnaire$":
+/*!********************************************!*\
+ !*** ../lang sync ^\.\/.*\/questionnaire$ ***!
+ \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var map = {
+ "./fr/questionnaire": "../lang/fr/questionnaire.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 ^\\.\\/.*\\/questionnaire$";
+
+/***/ }),
+
+/***/ "../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 : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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/illustration.js":
+/*!**********************************!*\
+ !*** ../lang/fr/illustration.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ needUrl: "Merci de fournir une url pour l'image.",
+ needUniqueUrl: "L'url est déjà utilisée par une autre image.",
+ needGoodLongUrl: "L'url de l'image doit contenir entre 5 et 255 caractères.",
+ needGoodLongAlt: "Le texte de la propriété 'alt' ne doit pas compter plus de 255 caractères.",
+ needGoodLongTitle: "Le texte de la propriété 'title' ne doit pas compter plus de 255 caractères.",
+ needGoodLongCaption: "Le texte de la légende de l'image ne doit pas compter plus de 255 caractères.",
+ needGoodFile: "Votre fichier n'a pas été accepté.",
+ needQuestionnaireForIllustration: "Tentative d'ajout/mise à jour/suppreession d'une illustration pour un questionnaire n'ayant pas été trouvé.",
+ needMaxIllustrationsForQuestionnaire: "Vous avez déjà atteint le nombre maximal d'illustrations pour ce questionnaire.",
+ notFound: "L'enregistrement de l'illustration n'a pas été trouvé : ",
+ addedOkMessage: "L'illustration a bien été enregistrée.",
+ updatedOkMessage: "L'illustration a bien été modifiée.",
+ deletedOkMessage: "L'illustration a bien été supprimée.",
+ defaultAlt: "Illustration du quiz",
+ introTitle: "Illustrations du quiz",
+ introNoIllustration: "Aucune illustration pour l'instant."
+};
+
+/***/ }),
+
+/***/ "../lang/fr/link.js":
+/*!**************************!*\
+ !*** ../lang/fr/link.js ***!
+ \**************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ needUrl: "Merci de saisir l'url du lien.",
+ needValidUrl: "Merci de saisir un url ayant un format valide.",
+ needNotTooLongUrl: "Merci de saisir un url ne comptant pas plus de 255 caractères.",
+ needAnchor: "Merci de fournir une ancre pour ce lien.",
+ needGoodLongAnchor: "Merci de fournir une ancre pour ce lien comptant entre 5 et 150 caractères.",
+ needQuestionnaire: "Le questionnaire du lien n'a pas été trouvé.",
+ needMaxLinksForQuestionnaire: "Vous avez déjà atteint le nombre maximal de liens pour ce questionnaire.",
+ updatedOkMessage: "Le lien a bien été modifié.",
+ addedOkMessage: "Le lien a bien été ajouté.",
+ deletedOkMessage: "Le lien a bien été supprimé.",
+ notFound: "L'enregistrement du lien n'a pas été trouvé.",
+ introTitle: "Lectures proposées",
+ introNoLink: "Aucun lien pour l'instant.",
+ defaultValue: "Lire l'article sur Wikipédia."
+};
+
+/***/ }),
+
+/***/ "../lang/fr/question.js":
+/*!******************************!*\
+ !*** ../lang/fr/question.js ***!
+ \******************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ needText: "Merci de saisir le texte de la question !",
+ needNotTooLongText: "La question ne doit pas compter plus de 255 caractères.",
+ needQuestionnaire: "Le questionnaire concerné n'a pas été trouvé.",
+ needMaxQuestions: "Vous avez déjà atteint le nombre maximal de questions pour ce questionnaire : ",
+ notFound: "L'enregistrement de la question n'a pas été trouvé.",
+ addOkMessage: "La question a bien été ajoutée.",
+ updateOkMessage: "La question a bien été modifiée.",
+ deleteOkMessage: "La question a bien été supprimée.",
+ introTitle: "Les questions enregistrées",
+ introNoQuestion: "Aucune question n'a été saisie pour l'instant",
+ needNumberForRank: "Vous devez fournir un nombre supérieur ou égal à 1 pour le rang de cette question."
+};
+
+/***/ }),
+
+/***/ "../lang/fr/questionnaire.js":
+/*!***********************************!*\
+ !*** ../lang/fr/questionnaire.js ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ needTitle: "Merci de fournir un titre à votre quiz.",
+ needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.",
+ needUrl: "Merci de fournir l'url à votre quiz.",
+ needUniqueUrl: "L'url du quiz doit être unique.",
+ needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.",
+ needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.",
+ needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.",
+ needLanguage: "Vous devez sélectionner la langue de ce quiz.",
+ needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.",
+ notFound: "Aucun quiz n'a pas été trouvé.",
+ searchResultTitle: "Résultat pour votre recherche",
+ searchNoResult: "Aucun résultat n'a été trouvé pour votre recherche",
+ searchWithResult: "#NB quizs correspondent à votre recherche :",
+ publishedBy: "Publié par",
+ publishedAt: ", le",
+ lastUpdated: "Dernière mise à jour, le ",
+ estimatedTime: "Durée de lecture estimée : ",
+ btnSendResponse: "Envoyez vos réponses",
+ btnProposeSubscribe: "Ok, je crée mon compte !",
+ btnProposeConnection: "J'ai déjà un compte, je me connecte.",
+ btnShowQuestionnaire: "Afficher le quiz !",
+ nextQuestionnairesList: "Les #NB prochains quizs devant être publiés",
+ needBeCompleted: "Quiz incomplet",
+ nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ",
+ haveBeenPublished: ":NB nouveaux questionnaires ont été publiés."
+};
+
+/***/ }),
+
+/***/ "../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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/manageQuestionnaires.js":
+/*!*************************************!*\
+ !*** ./src/manageQuestionnaires.js ***!
+ \*************************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __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); }); }; }
+
+// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES QUIZS ET LEURS DÉPENDANCES (LIENS, IMAGES, TAGS, ETC.)
+/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas.
+/// Si c'est ok, propose un moteur de recherche permettant de chercher un quiz
+/// Si un id est passé par l'url on affiche les informations du quiz dans un formulaire permettant de l'éditer/supprimer avec une liste des éléments liés (liens, illustrations, questions...) pouvant eux-mêmes être édités/supprimés.
+/// Si le nombre max configuré pour chacun de ses éléments n'est pas atteint, il est aussi proposé d'ajouter un nouvel élément.
+/// Sinon pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouveau avec ses tags.
+// Fichier de configuration côté client :
+
+var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
+
+var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : !! revoir quand le reste sera fini pour vérifier si tout est utile
+
+
+
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
+
+var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user");
+
+var txtQuestionnaire = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire");
+
+var txtQuestion = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/question$")("./" + lang + "/question");
+
+var txtLink = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/link$")("./" + lang + "/link");
+
+var txtIllustration = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/illustration$")("./" + lang + "/illustration");
+
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); // Principaux éléments du DOM manipulés :
+
+var divMain = document.getElementById("main-content");
+var divMessage = document.getElementById("message");
+var divResponse = document.getElementById("response");
+var formQuestionnaire = document.getElementById("questionnaires");
+var inputClassification = document.getElementById("classification");
+var helpClassification = document.getElementById("helpClassification");
+var helpPublishingAt = document.getElementById("helpPublishingAt");
+var deleteCheckBox = document.getElementById("deleteOkLabel");
+var btnNewQuestionnaire = document.getElementById("wantNewQuestionnaire");
+var btnPreviewQuestionnaire = document.getElementById("previewQuestionnaire");
+var divQuestionnaires = document.getElementById("questionnairesList");
+var formSearch = document.getElementById("search");
+var divSearchResult = document.getElementById("searchResult");
+var formLink = document.getElementById("links");
+var formIllustration = document.getElementById("illustrations");
+var formQuestion = document.getElementById("questions");
+var divLinks = document.getElementById("linksList");
+var divIllustrations = document.getElementById("illustrationsList");
+var divQuestions = document.getElementById("questionsList");
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var config, isConnected, user, hideAllForms, showLinkInfos, showIllustrationInfos, showQuestionInfos, showFormLinkInfos, showFormIllustrationInfos, showFormQuestionInfos, showFormQuestionnaireInfos, urlDatas, showNextQuestionnaires, sendLinkForm, sendIllustrationForm, sendQuestionForm;
+ 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_7__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+
+ if (config) {
+ _context.next = 8;
+ break;
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]);
+ _context.next = 12;
+ break;
+
+ case 8:
+ _context.next = 10;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkSession"])(["manager", "admin"], "/" + configFrontEnd.connectionPage, {
+ message: txtUsers.needBeConnected,
+ color: "error"
+ }, window.location);
+
+ case 10:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ divMain.style.display = "block";
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
+ }
+
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
+ Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd); // Initialisation du formulaire de recherche :
+
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formSearch); // Initialise le formulaire permettant de mettre à jour les infos de base du questionnaire :
+
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Questionnaire, formQuestionnaire); // Case de suppression cachée par défaut, car inutile pour formulaire de création
+
+ deleteCheckBox.style.display = "none"; // Fonction vidant et cachant tous les formulaires annexes
+
+ hideAllForms = function hideAllForms() {
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formLink);
+ if (txtLink.defaultValue != 0) document.getElementById("anchor").value = txtLink.defaultValue;
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formIllustration);
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formQuestion);
+ };
+
+ hideAllForms(); // Affiche les infos connues concernant les liens
+
+ showLinkInfos = function showLinkInfos(Links) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "h4", txtLink.introTitle); // remplace l'existant dans divLinks
+
+ var listLinks = "";
+
+ for (var i in Links) {
+ listLinks += "
";
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "ul", listQuestions, "", ["information"], "", false); // à intégrer dans le DOM pour pouvoir ajouter des addEventListener ensuite
+
+ var _loop3 = function _loop3(_i3) {
+ document.getElementById("#updateQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) {
+ e.preventDefault();
+ showFormQuestionInfos(Questions[_i3]);
+ window.location.assign("#links");
+ });
+ document.getElementById("#deleteQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) {
+ e.preventDefault();
+ showFormQuestionInfos(Questions[_i3]);
+ formQuestion.elements["deleteOk"].value = true;
+ sendQuestionForm();
+ });
+ };
+
+ for (var _i3 in Questions) {
+ _loop3(_i3);
+ }
+
+ if (config.nbQuestionsMax > Questions.length || config.nbQuestionsMax === 0) {
+ if (Questions.length < config.nbQuestionsMin) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "a", txt.addBtnTxt, "#newQuestion", ["error"], {
+ href: "#newQuestion"
+ }, false);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "a", txt.addBtnTxt, "#newQuestion", ["information"], {
+ href: "#newQuestion"
+ }, false);
+ document.getElementById("#newQuestion").addEventListener("click", function (e) {
+ e.preventDefault();
+ hideAllForms();
+ formQuestion.style.display = "block";
+ formQuestion.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
+ formQuestion.elements["rank"].value = config.Question.rank.defaultValue;
+ window.location.assign("#questions");
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Question, formQuestion);
+ });
+ }
+ }; // Fonction affichant les infos d'un lien dans le formulaire adhoc
+
+
+ showFormLinkInfos = function showFormLinkInfos(Link) {
+ // on commence par cacher et vider tous les formulaires annexes
+ hideAllForms(); // puis on affiche celui dont l'id est passé avec ses données connues
+
+ formLink.style.display = "block";
+
+ for (var data in Link) {
+ if (formLink.elements[data] !== undefined) formLink.elements[data].value = Link[data];
+ } // + les contraintes de champ :
+
+
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Link, formLink);
+ }; // Fonction affichant les infos d'une illustration dans le formulaire adhoc
+
+
+ showFormIllustrationInfos = function showFormIllustrationInfos(Illustration) {
+ // on commence par cacher et vider tous les formulaires annexes
+ hideAllForms(); // puis on affiche celui dont l'id est passé avec ses données connues
+
+ formIllustration.style.display = "block";
+
+ for (var data in Illustration) {
+ if (formIllustration.elements[data] !== undefined) formIllustration.elements[data].value = Illustration[data];
+ } // + les contraintes de champ :
+
+
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Illustration, formIllustration); // sauf le champ file qui n'est plus requis quand un fichier existe déjà !
+
+ formIllustration.elements["image"].removeAttribute("required");
+ }; // Fonction affichant les infos d'une question + ses réponses possibles dans le formulaire adhoc
+
+
+ showFormQuestionInfos = function showFormQuestionInfos(Question) {
+ // on commence par cacher et vider tous les formulaires annexes
+ hideAllForms(); // puis on affiche celui dont l'id est passé avec ses données connues
+
+ formQuestion.style.display = "block";
+
+ for (var data in Question.Question) {
+ if (formQuestion.elements[data] !== undefined) formQuestion.elements[data].value = Question.Question[data];
+ }
+
+ for (var _data in Question.Choices) {
+ if (formQuestion.elements["choiceText" + _data] !== undefined) {
+ formQuestion.elements["choiceText" + _data].value = Question.Choices[_data].text;
+ if (Question.Choices[_data].isCorrect == true) formQuestion.elements["choiceIsCorrect" + _data].checked = true;
+ formQuestion.elements["idChoice" + _data].value = Question.Choices[_data].id;
+ }
+ } // + les contraintes de champ :
+
+
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config.Question, formQuestion);
+ }; // Fonction affichant les infos connues concernant un questionnaire et ses dépendances
+
+
+ showFormQuestionnaireInfos = function showFormQuestionnaireInfos(id) {
+ var xhrGetInfos = new XMLHttpRequest();
+ xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getQuestionnaireRoutes + "/" + id);
+
+ xhrGetInfos.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && response.Questionnaire != undefined) {
+ formQuestionnaire.reset(); // pour ne pas garder données déjà affichées si vide dans ce qui est retourné
+
+ for (var data in response.Questionnaire) {
+ if (formQuestionnaire.elements[data] !== undefined) {
+ if (data === "publishingAt" && response.Questionnaire[data] !== null) formQuestionnaire.elements[data].value = Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.Questionnaire[data], "form"); // !! revoir car format pouvant poser soucis si navigateur ne gère pas les champs de type "date"
+ else formQuestionnaire.elements[data].value = response.Questionnaire[data];
+ }
+ }
+
+ deleteCheckBox.style.display = "block";
+ }
+
+ if (response.Tags != undefined) {
+ var classification = "";
+
+ for (var i in response.Tags) {
+ if (i == 0) classification += response.Tags[i].name;else classification += "," + response.Tags[i].name;
+ }
+
+ formQuestionnaire.elements["classification"].value = classification;
+ }
+
+ divLinks.style.display = "block";
+ divQuestions.style.display = "block";
+ divIllustrations.style.display = "block";
+ if (response.Links != undefined) showLinkInfos(response.Links);
+ if (response.Questions != undefined) showQuestionInfos(response.Questions);
+ if (response.Illustrations != undefined) showIllustrationInfos(response.Illustrations);
+ helpPublishingAt.style.display = "none"; // info utile pour "placer" un nouveau quiz
+ // à revoir : remplacer lien pour un bouton + reset complet du formulaire, y compris champs hidden :
+
+ btnNewQuestionnaire.style.display = "block";
+ btnNewQuestionnaire.setAttribute("href", configFrontEnd.questionnairesManagementPage);
+ btnPreviewQuestionnaire.style.display = "block";
+ if (response.Questionnaire["isPublished"] === false) btnPreviewQuestionnaire.setAttribute("href", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.previewQuestionnaireRoutes + "/" + id + "/" + user.token);else btnPreviewQuestionnaire.setAttribute("href", config.siteUrl + config.publishedQuestionnaireRoutes + response.Questionnaire["slug"] + ".html");
+ }
+ };
+
+ xhrGetInfos.send();
+ }; // Si un id est passé par l'url, on essaye d'afficher le questionnaire :
+
+
+ urlDatas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_6__["getUrlParams"])();
+ if (urlDatas && urlDatas.id !== undefined) showFormQuestionnaireInfos(urlDatas.id); // Traitement du lancement d'une recherche
+
+ formSearch.addEventListener("submit", function (e) {
+ e.preventDefault();
+ var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formSearch);
+ var xhrSearch = new XMLHttpRequest();
+ xhrSearch.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.searchAdminQuestionnairesRoute);
+
+ xhrSearch.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && Array.isArray(response)) {
+ if (response.length === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", txtQuestionnaire.notFound, "", ["information"]);else {
+ var selectHTML = "";
+
+ for (var i in response) {
+ selectHTML += "";
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "select", selectHTML, "selectSearch");
+ var searchSelect = document.getElementById("selectSearch");
+ searchSelect.addEventListener("change", function () {
+ if (searchSelect.value !== "") showFormQuestionnaireInfos(searchSelect.value);
+ });
+ }
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", txt.serverError, "", ["error"]);
+ }
+ };
+
+ xhrSearch.setRequestHeader("Content-Type", "application/json");
+ xhrSearch.setRequestHeader("Authorization", "Bearer " + user.token);
+ if (datas) xhrSearch.send(JSON.stringify(datas));
+ }); // Les questionnaires bientôt publiés. Dans une fonction car devant être rechargé.
+
+ showNextQuestionnaires = function showNextQuestionnaires() {
+ var xhrNextQuestionnaires = new XMLHttpRequest();
+ xhrNextQuestionnaires.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.questionnaireRoutes + config.getListNextQuestionnaires);
+
+ xhrNextQuestionnaires.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && Array.isArray(response.questionnaires)) {
+ var listHTML = "";
+
+ for (var i in response.questionnaires) {
+ listHTML += "
",
+ noNewQuestionnaireForUser: "Aucun nouveau questionnaire trouvé pour un abonné : ",
+ mailEndFreeTimeSubject: "Votre abonnement gratuit va expirer",
+ mailEndFreeTimeBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui :\nLINK_URL",
+ mailEndFreeTimeBodyHTML: "
Bonjour USER_NAME,
Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours. Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui en cliquez ici sans tarder.
",
+ mailEndFreeTimeMessage: " relances envoyées.",
+ mailExpirationSubject: "Votre abonnement va bientôt expirer",
+ mailExpirationBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui :\nLINK_URL",
+ mailExpirationBodyHTML: "
Bonjour USER_NAME,
Votre abonnement à SITE_NAME va expirer d'ici quelques jours. Pour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui en cliquant ici.
",
+ mailExpirationMessage: "FIRST premières et SECOND deuxièmes relances envoyées pour des abonnements expirant d'ici peu.",
+ infosNbDays: "Votre abonnement est encore valable pendant NB_DAYS jours. Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :",
+ infosExpirated: "Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées. Pour ce faire, suivez sans tarder les indications ci-dessous :",
+ infosNbDaysAdmin: "Cet abonnement est encore valable pendant NB_DAYS jours.",
+ infosExpiratedAdmin: "Cet abonnement a expiré.",
+ isNotValided: "Cet utilisateur n'a pas encore validé son compte. Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.",
+ infosPaymentsAdmin: "DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME."
+};
+
+/***/ }),
+
+/***/ "../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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/manageUsers.js":
+/*!****************************!*\
+ !*** ./src/manageUsers.js ***!
+ \****************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __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); }); }; }
+
+// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES INFOS DES UTILISATEURS ET DE LEUR ABONNEMENT
+/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas.
+/// Si c'est ok, propose un moteur de recherche permettant de chercher un utilisateur
+/// Si un id est passé par l'url on affiche les informations de l'utilisateur dans un formulaire permettant de l'éditer/supprimer.
+/// Si pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouvel utilisateur
+/// À ajouter :
+/// - importation liste de comptes utilisateur à créer
+/// - attribution d'un parrain à un utilisateur (via un moteur de recherche). Prévu par le contrôleur.
+// Fichier de configuration côté client :
+
+var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
+
+var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions utiles au script : !! revoir quand le reste sera fini pour vérifier si tout est utile
+
+
+
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
+
+var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user");
+
+var txtSubscriptions = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/subscription$")("./" + lang + "/subscription");
+
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); // Principaux éléments du DOM manipulés :
+
+var divMain = document.getElementById("main-content");
+var divMessage = document.getElementById("message");
+var divResponse = document.getElementById("response");
+var divSubscribeIntro = document.getElementById("subscribeIntro");
+var divPaymentsInfos = document.getElementById("infosPayments");
+var divGodchildsInfos = document.getElementById("infosGodchilds");
+var formUser = document.getElementById("users");
+var deleteCheckBox = document.getElementById("deleteOkLabel");
+var validationCheckBox = document.getElementById("validationOkLabel");
+var btnNewUser = document.getElementById("wantNewUser");
+var newPassword = document.getElementById("newPassword");
+var timeDifference = document.getElementById("timeDifference");
+var formSearch = document.getElementById("search");
+var divSearchResult = document.getElementById("searchResult");
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var config, isConnected, user, emptyUserForm, showFormUserInfos, urlDatas;
+ 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_7__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+
+ if (config) {
+ _context.next = 8;
+ break;
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", txt.serverError, "", ["error"]);
+ _context.next = 12;
+ break;
+
+ case 8:
+ _context.next = 10;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkSession"])(["manager", "admin"], "/" + configFrontEnd.connectionPage, {
+ message: txtUsers.needBeConnected,
+ color: "error"
+ }, window.location);
+
+ case 10:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
+ Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configFrontEnd);
+ divMain.style.display = "block";
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
+ } // Initialisation du formulaire de recherche :
+
+
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formSearch); // Fonction utile pour vider le formulaire, y compris les champs hidden, etc.
+ // Cache aussi certains champs en mode création
+
+ emptyUserForm = function emptyUserForm() {
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyForm"])(formUser); // Case de suppression cachée par défaut, car inutile pour formulaire de création
+
+ deleteCheckBox.style.display = "none"; // Case de validation cachée par défaut, car utile que dans certains cas
+
+ validationCheckBox.style.display = "none";
+ divSubscribeIntro.innerHTML = "";
+ divPaymentsInfos.innerHTML = "";
+ divGodchildsInfos.innerHTML = ""; // Certains navigateurs ont tendance à remplir tout seul les champs password
+
+ newPassword.value = ""; // En mode création, pas de champ pour changer le mot de passe
+
+ newPassword.parentNode.style.display = "none"; // Inutile en mode création
+
+ timeDifference.parentNode.style.display = "none";
+ };
+
+ emptyUserForm(); // Initialise les contraintes du formulaire :
+
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(config, formUser); // Fonction affichant les infos connues concernant un utilisateur et son abonnement
+
+ showFormUserInfos = function showFormUserInfos(id) {
+ // on commence par tout vider, des fois que... :
+ emptyUserForm();
+ var xhrGetInfos = new XMLHttpRequest();
+ xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.getUserInfos + id);
+
+ xhrGetInfos.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && response.User != undefined) {
+ newPassword.parentNode.style.display = "block";
+ timeDifference.parentNode.style.display = "block";
+ var mapText = {
+ ID_USER: response.User.id,
+ DATE_CREA: Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.User.createdAt),
+ DATE_UPDATE: Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.User.updatedAt),
+ DATE_CONNECTION: Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.User.connectedAt)
+ };
+ var subscribeIntro = Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["replaceAll"])(txtUsers.infosUserForAdmin, mapText);
+
+ for (var data in response.User) {
+ if (formUser.elements[data] !== undefined) {
+ if (response.User[data] !== true && response.User[data] !== false) // booléen = case à cocher !
+ formUser.elements[data].value = response.User[data];else if (response.User[data] == true) // si false, on ne fait rien
+ formUser.elements["" + data].checked = "checked";
+ }
+ }
+
+ if (response.Subscription != undefined) {
+ // nombre de jours de l'abonnement
+ formUser.elements["numberOfDays"].value = response.Subscription["numberOfDays"]; // infos de l'abonnement
+
+ if (response.Subscription.noticeOk == true) formUser.elements["noticeOk"].checked = "checked"; // jours de réception
+
+ for (var i in response.Subscription.receiptDays) {
+ formUser.elements["d" + response.Subscription.receiptDays[i]].checked = "checked";
+ }
+
+ var beginSubTS = new Date(response.Subscription.createdAt).getTime();
+ var nbDaysOk = response.Subscription.numberOfDays - Math.round((Date.now() - beginSubTS) / 1000 / 3600 / 24);
+ if (nbDaysOk > 0) subscribeIntro += " " + txtSubscriptions.infosNbDaysAdmin.replace("NB_DAYS", nbDaysOk);else subscribeIntro += " " + txtSubscriptions.infosExpiratedAdmin;
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", subscribeIntro, "", ["information"], "", false);
+ } else {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSubscribeIntro, "p", txtSubscriptions.isNotValided, "", ["error"]);
+ validationCheckBox.style.display = "block";
+ }
+
+ deleteCheckBox.style.display = "block"; // Infos de paiements via API WP
+
+ var xhrGetPaymentsInfos = new XMLHttpRequest();
+ xhrGetPaymentsInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.getPayments + response.User.id);
+
+ xhrGetPaymentsInfos.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var responsePay = JSON.parse(this.responseText);
+
+ if (this.status === 200) {
+ if (responsePay.length !== 0) {
+ var txtPayments = "";
+
+ for (var _i in responsePay) {
+ var _mapText = {
+ DATE_PAYMENT: Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(responsePay[_i].createdAt, "fr"),
+ AMOUNT: responsePay[_i].amount,
+ CLIENT_NAME: responsePay[_i].clientName
+ };
+ txtPayments += "
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/config/general.js":
+/*!*******************************!*\
+ !*** ./src/config/general.js ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// à supprimer une fois que tout récupérer du backend :
+module.exports = {
+ apiUrl: "http://localhost:3000/api",
+ usersGetConfigUrl: "/user/getconfig",
+ lang: "fr",
+ 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/"
+};
+
+/***/ }),
+
+/***/ "./src/questionnaire.js":
+/*!******************************!*\
+ !*** ./src/questionnaire.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_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config/questionnaires.js */ "../config/questionnaires.js");
+/* harmony import */ var _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _tools_answers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/answers.js */ "./src/tools/answers.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_clientstorage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_8__ = __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); }); }; }
+
+// -- GESTION DU FORMULAIRE PERMETTANT D'AFFICHER ET RÉPONDRE À UN QUIZ
+/// Il n'est pas nécessaire d'être connecté pour répondre au quiz et voir son résultat.
+/// Mais si pas connecté, on propose à l'internaute de se connecter ou de créer un compte pour sauvegarder son résultat.
+/// Dans ce but son résultat est stocké dans son navigateur.
+/// Si il est connecté, l'enregistrement de son résultat se fait automatiquement côté serveur et ses éventuels précédents résultats sont affichés.
+// 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");
+
+
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
+
+var txtAnswers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/answer$")("./" + lang + "/answer"); // Principaux éléments du DOM manipulés :
+
+
+var myForm = document.getElementById("questionnaire");
+var divResponse = document.getElementById("response");
+var btnShow = document.getElementById("showQuestionnaire");
+var btnSubmit = document.getElementById("checkResponses");
+var explanationsTitle = document.getElementById("explanationsTitle");
+var explanationsContent = document.getElementById("explanationsContent");
+var isConnected, user;
+
+var initialise = /*#__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:
+ _context.prev = 0;
+ btnShow.style.display = "inline"; // bouton caché si JS inactif, car JS nécessaire pour vérifier les réponses
+
+ _context.next = 4;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_8__["checkSession"])(["user"]);
+
+ case 4:
+ isConnected = _context.sent;
+
+ // seuls les utilisateurs de base peuvent répondre aux quizs
+ // Si l'utilisateur est connecté et a déjà répondu à ce quiz, on affiche ses précédentes réponses à la place du texte servant à expliquer le topo aux nouveaux
+ if (isConnected) {
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_5__["getLocaly"])("user", true);
+ Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["updateAccountLink"])(user.status, configTemplate);
+ checkPreviousResponses(user);
+ }
+
+ _context.next = 11;
+ break;
+
+ case 8:
+ _context.prev = 8;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+
+ case 11:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 8]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_4__["helloDev"])(); // Affichage du questionnaire quand l'utilisateur clique sur le bouton ou si l'id du formulaire est passée par l'url
+// Déclenche en même temps le chronomètre mesurant la durée de la réponse aux questions.
+
+var showQuestionnaire = function showQuestionnaire() {
+ chronoBegin = Date.now();
+ myForm.style.display = "block";
+ btnShow.setAttribute("disabled", true);
+ var here = window.location; // window.location à ajouter pour ne pas quitter la page en mode "preview"...
+
+ window.location.assign(here + "#questionnaire");
+};
+
+var chronoBegin = 0;
+btnShow.addEventListener("click", function (e) {
+ try {
+ e.preventDefault();
+ showQuestionnaire();
+ } catch (e) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ }
+}); // Lien passé par mail pour voir directement le quiz
+
+if (location.hash != undefined && location.hash === "#questionnaire") showQuestionnaire(); // Traitement de l'envoi de la réponse de l'utilisateur :
+
+var answer = {};
+myForm.addEventListener("submit", function (e) {
+ try {
+ e.preventDefault();
+ btnSubmit.setAttribute("disabled", true); // seulement un envoi à la fois :)
+
+ divResponse.innerHTML = ""; // supprime les éventuels messages déjà affichés
+
+ var userResponses = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_6__["getDatasFromInputs"])(myForm);
+ answer.duration = Math.round((Date.now() - chronoBegin) / 1000);
+ answer.nbQuestions = 0;
+ answer.nbCorrectAnswers = 0;
+ answer.QuestionnaireId = document.getElementById("questionnaireId").value; // Les réponses sont regroupées par question, donc quand l'idQuestion change, on connaît le résultat pour la question précédente
+ // Pour qu'une réponse soit bonne, il faut cocher toutes les bonnes réponses (si QCM) à une question et cocher aucune des mauvaises
+
+ var idChoice,
+ idQuestion = "",
+ goodResponse = false;
+
+ for (var item in userResponses) {
+ if (item.startsWith("isCorrect_response_")) // = nouvelle réponse possible
+ {
+ idChoice = item.substring(item.lastIndexOf("_") + 1); // si on change de queston
+
+ if (userResponses["question_id_response_" + idChoice] != idQuestion) // on commence à traiter une nouvelle question
+ {
+ idQuestion = userResponses["question_id_response_" + idChoice];
+ answer.nbQuestions++;
+ if (goodResponse) // résultat pour la question précédente
+ answer.nbCorrectAnswers++;
+ goodResponse = true; // réponse bonne jusqu'à la première erreur...
+ }
+
+ if (userResponses[item] == "true") {
+ document.getElementById("response_" + idChoice).parentNode.classList.add("success");
+ if (userResponses["response_" + idChoice] === undefined) // bonne réponse non sélectionnée
+ goodResponse = false;
+ } else {
+ if (userResponses["response_" + idChoice] === "on") // réponse cochée n'étant pas une des bonnes
+ {
+ goodResponse = false;
+ document.getElementById("response_" + idChoice).parentNode.classList.add("error");
+ }
+ }
+ }
+ } // si j'ai bien répondu à la dernière question, il faut le traiter ici, car je suis sorti de la boucle :
+
+
+ if (goodResponse) answer.nbCorrectAnswers++; // Affichage du résultat, suivant si l'utilisateur est connecté ou pas et son score :
+
+ var getOuput = Object(_tools_answers_js__WEBPACK_IMPORTED_MODULE_2__["checkAnswerOuput"])(answer);
+
+ if (isConnected) {
+ // Si l'utilisateur est connecté on enregistre son résultat sur le serveur.
+ var xhrSaveAnswer = new XMLHttpRequest();
+ xhrSaveAnswer.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["questionnaireRoutes"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["saveAnswersRoute"]);
+
+ xhrSaveAnswer.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var xhrResponse = JSON.parse(this.responseText);
+
+ if (this.status === 201 && xhrResponse.message) {
+ getOuput += " " + xhrResponse.message.replace("#URL", configTemplate.userHomePage);
+ checkPreviousResponses(user);
+ } else getOuput += " " + txtAnswers.responseSavedError.replace("#URL", configTemplate.userHomePage);
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", getOuput, "", ["information"]);
+ }
+ };
+
+ xhrSaveAnswer.setRequestHeader("Authorization", "Bearer " + user.token);
+ xhrSaveAnswer.setRequestHeader("Content-Type", "application/json");
+ answer.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_8__["getTimeDifference"])(); // on en profite pour mettre les pendules à l'heure
+
+ xhrSaveAnswer.send(JSON.stringify(answer));
+ } else {
+ // si pas connecté, on enregistre le résultat côté client pour permettre de le retrouver au moment de la création du compte ou de la connexion
+ if (Object(_tools_answers_js__WEBPACK_IMPORTED_MODULE_2__["saveAnswer"])(answer)) {
+ getOuput += " " + txtAnswers.wantToSaveResponses;
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", getOuput, "", ["information"]);
+ document.querySelector(".subcribeBtns").style.display = "block";
+ } else // pas la peine de proposer de créer un compte si le stockage local ne fonctionne pas
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", getOuput, "", ["information"]);
+ } // affichage des textes d'explications pour chaque question
+
+
+ var explanations = document.querySelectorAll(".help");
+
+ for (var i in explanations) {
+ if (explanations[i].style != undefined) // sinon, la console affiche une erreur "TypeError: explanations[i].style is undefined", bien que tout fonctionne (?)
+ explanations[i].style.display = "block";
+ }
+ } catch (e) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ console.error(e);
+ }
+}); // Fonction vérifiant les précédentes réponses de l'utilisateur
+// Utile si connecté lors du premier chargement de la page, puis après une nouvelle réponse
+
+var checkPreviousResponses = function checkPreviousResponses(user) {
+ var xhrPreviousRes = new XMLHttpRequest();
+ xhrPreviousRes.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["questionnaireRoutes"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_1__["getPreviousAnswers"] + user.id + "/" + document.getElementById("questionnaireId").value);
+
+ xhrPreviousRes.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200) {
+ var nbResponses = response.length;
+ var previousAnswersContent = "";
+
+ if (nbResponses !== 0) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_3__["addElement"])(explanationsTitle, "span", txtAnswers.previousAnswersTitle.replace("#NOM", user.name));
+ var totNbQuestions = 0,
+ totNbCorrectAnswers = 0,
+ totDuration = 0,
+ mapLineContent;
+
+ for (var i in response) {
+ totNbQuestions += response[i].nbQuestions;
+ totNbCorrectAnswers += response[i].nbCorrectAnswers;
+ totDuration += response[i].duration;
+ mapLineContent = {
+ DATEANSWER: Object(_tools_main__WEBPACK_IMPORTED_MODULE_7__["dateFormat"])(response[i].createdAt),
+ // revoir problème de la langue
+ NBCORRECTANSWERS: response[i].nbCorrectAnswers,
+ AVGDURATION: response[i].duration
+ };
+ previousAnswersContent += "
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./src/subscribe.js":
+/*!**************************!*\
+ !*** ./src/subscribe.js ***!
+ \**************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __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); }); }; }
+
+// -- GESTION DU FORMULAIRE PERMETTANT DE CRÉER SON COMPTE
+/// L'utilisateur peut avoir répondu à un quiz avant d'arriver sur la page d'inscription
+/// Des ce cas il faut enregistrer son résultat en même temps que les informations de son compte
+// 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");
+
+var configUsers = __webpack_require__(/*! ../../config/users */ "../config/users.js"); // Importation des fonctions utile au script :
+
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
+
+var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"); // Principaux éléments du DOM manipulés :
+
+
+var myForm = document.getElementById("subscription");
+var divResponse = document.getElementById("response");
+var passwordInput = document.getElementById("password");
+var passwordLink = document.getElementById("getPassword");
+var passwordHelp = document.getElementById("passwordMessage");
+var emailInput = document.getElementById("email");
+var btnSubmit = document.getElementById("submitDatas");
+var codeGodfatherInput = document.getElementById("codeGodfather");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])(); // Test de connexion de l'utilisateur + affichage formulaire d'inscription.
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var isConnected, user, homePage;
+ 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_5__["checkSession"])();
+
+ case 3:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["saveLocaly"])("message", {
+ message: txtUsers.alreadyConnected,
+ color: "information"
+ }); // pour l'afficher sur la page suivante
+
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true);
+ homePage = user.status + "HomePage";
+ window.location.assign("/" + configTemplate[homePage]);
+ } else {
+ Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configUsers, myForm);
+ myForm.style.display = "block";
+ }
+
+ _context.next = 11;
+ break;
+
+ case 7:
+ _context.prev = 7;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ console.error(_context.t0);
+
+ case 11:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 7]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise(); // Générateur de mot de passe "aléatoire"
+
+passwordLink.addEventListener("click", function (e) {
+ e.preventDefault();
+ passwordInput.type = "text";
+ passwordInput.value = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getPassword"])(8, 12); // copie du mot de passe généré dans le presse-papier
+
+ passwordInput.select();
+ document.execCommand("copy");
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(passwordHelp, "em", txtUsers.passwordCopied, "", ["success"]);
+}); // Test si l'e-mail saisi est déjà utilisé pour un compte déjà existant.
+// Si c'est le cas, la validation du formulaire est bloquée.
+
+emailInput.addEventListener("focus", function (e) {
+ document.getElementById("emailMessage").innerHTML = ""; // pour supprimer l'éventuel message d'erreur déjà affiché
+});
+emailInput.addEventListener("blur", function (e) {
+ var emailValue = emailInput.value.trim();
+
+ if (emailValue !== "") {
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.checkIfIsEmailfreeRoute);
+
+ xhr.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 200 && response.free !== undefined && response.free === false) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(document.getElementById("emailMessage"), "b", txtUsers.needUniqueEmail.replace("#URL", configTemplate.connectionPage), "", ["error"]);
+ btnSubmit.setAttribute("disabled", true);
+ } else btnSubmit.removeAttribute("disabled");
+ }
+ };
+
+ xhr.setRequestHeader("Content-Type", "application/json");
+ var datas = {
+ emailTest: emailValue
+ };
+ xhr.send(JSON.stringify(datas));
+ }
+}); // Vérification que le code de parrainage saisi est valide.
+// Si ce n'est pas le cas, cela n'est pas bloquant.
+
+codeGodfatherInput.addEventListener("focus", function (e) {
+ // on efface l'éventuel message d'erreur si on revient sur le champ pour rectifier le tir
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(document.getElementById("codeGodfatherMessage"), "i", txt.notRequired, "", ["information"]);
+});
+codeGodfatherInput.addEventListener("blur", function (e) {
+ var codeValue = codeGodfatherInput.value.trim();
+
+ if (codeValue !== "") {
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.getGodfatherRoute);
+
+ xhr.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ if (this.status === 204) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(document.getElementById("codeGodfatherMessage"), "b", txtUsers.godfatherNotFound, "", ["error"]);else // !! à revoir car cela peut permettre de savoir qu'une adresse e-mail est présente dans le bd
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(document.getElementById("codeGodfatherMessage"), "b", txtUsers.godfatherFound, "", ["success"]);
+ }
+ };
+
+ xhr.setRequestHeader("Content-Type", "application/json");
+ var datas = {
+ codeTest: codeValue
+ };
+ xhr.send(JSON.stringify(datas));
+ }
+}); // Traitement de l'envoi des données d'inscription :
+
+myForm.addEventListener("submit", function (e) {
+ try {
+ e.preventDefault();
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configUsers.userRoutes + configUsers.subscribeRoute);
+
+ xhr.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+
+ if (this.status === 201) {
+ myForm.style.display = "none";
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("lastAnswer"); // ! important pour ne pas enregister plusieurs fois le résultat
+ } else if (response.errors) {
+ if (Array.isArray(response.errors)) response.errors = response.errors.join(" ");else response.errors = txt.serverError;
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ }
+ };
+
+ xhr.setRequestHeader("Content-Type", "application/json");
+ var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(myForm);
+
+ if (datas) {
+ datas.timeDifference = Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_5__["getTimeDifference"])(configUsers); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat :
+
+ xhr.send(JSON.stringify(datas));
+ }
+ } catch (e) {
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ console.error(e);
+ }
+});
+
+/***/ }),
+
+/***/ "./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, " "); // 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 est lisible sur gitlab : \n Bonne lecture :-) \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/forms.js":
+/*!****************************!*\
+ !*** ./src/tools/forms.js ***!
+ \****************************/
+/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; });
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
+function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+ // Fonction associant les attributs fournis à un champ de formulaire
+
+var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) {
+ for (var i in myForm.elements) {
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) {
+ var idInput = myForm.elements[i].id;
+
+ if (inputsConf[idInput] !== undefined) {
+ var inputHTML = document.getElementById(idInput);
+
+ for (var attribute in inputsConf[idInput]) {
+ inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);
+ }
+ }
+ }
+ }
+
+ return true;
+}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.
+
+var getDatasFromInputs = function getDatasFromInputs(myForm) {
+ var datas = {};
+ var formData = new FormData(myForm);
+
+ var _iterator = _createForOfIteratorHelper(formData.entries()),
+ _step;
+
+ try {
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
+ var entrie = _step.value;
+ datas[entrie[0]] = entrie[1];
+ }
+ } catch (err) {
+ _iterator.e(err);
+ } finally {
+ _iterator.f();
+ }
+
+ return datas;
+}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
+// Revoir pour les select
+
+var empyForm = function empyForm(myForm) {
+ var formData = new FormData(myForm);
+
+ var _iterator2 = _createForOfIteratorHelper(formData.entries()),
+ _step2;
+
+ try {
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+ var entrie = _step2.value;
+ if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = "";
+ }
+ } catch (err) {
+ _iterator2.e(err);
+ } finally {
+ _iterator2.f();
+ }
+
+ return true;
+}; // Vide et cache le formulaire
+
+var empyAndHideForm = function empyAndHideForm(myForm) {
+ empyForm(myForm);
+ myForm.style.display = "none";
+};
+
+/***/ }),
+
+/***/ "./src/tools/users.js":
+/*!****************************!*\
+ !*** ./src/tools/users.js ***!
+ \****************************/
+/*! exports provided: 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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9zdWJzY3JpYmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VzZXJzLmpzIl0sIm5hbWVzIjpbInVzZXJzIiwicmVxdWlyZSIsInF1ZXN0aW9ubmFpcmVzIiwibW9kdWxlIiwiZXhwb3J0cyIsImFwaVVybCIsInNpdGVVcmwiLCJhZG1pbk5hbWUiLCJhZG1pbkVtYWlsIiwic2VuZGVyTmFtZSIsInNlbmRlckVtYWlsIiwiYWRtaW5MYW5nIiwidGhlbWUiLCJhdmFpbGFibGVMYW5ncyIsInNpdGVOYW1lIiwiYmVnaW5Db2RlR29kZmF0aGVyIiwiY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwicmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZSIsInRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzIiwidG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnMiLCJ0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXMiLCJ0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VycyIsInRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzIiwidG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzIiwiZnJlZUFjY291bnRUaW1pbmdJbkRheXMiLCJmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzIiwiYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXMiLCJpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXMiLCJuYlF1ZXN0aW9uc01pbiIsIm5iUXVlc3Rpb25zTWF4IiwibmJDaG9pY2VzTWF4IiwibmJOZXdRdWVzdGlvbm5haXJlcyIsImhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kIiwibnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWUiLCJtaW5TZWFyY2hRdWVzdGlvbm5haXJlcyIsIm5iSWxsdXN0cmF0aW9uc01pbiIsIm5iSWxsdXN0cmF0aW9uc01heCIsIm1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0IiwibWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uIiwiaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeCIsImlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4IiwibmJMaW5rc01pbiIsIm5iTGlua3NNYXgiLCJwYXNzd29yZCIsIm1pbmxlbmd0aCIsImRpckNhY2hlVXNlcnMiLCJkaXJDYWNoZVVzZXJzQW5zd2VycyIsImRpckNhY2hlUXVlc3Rpb25uYWlyZXMiLCJkaXJDYWNoZVF1ZXN0aW9ucyIsImRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyIsImRpckhUTUxRdWVzdGlvbm5haXJlIiwiZGlyV2ViUXVlc3Rpb25uYWlyZSIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwic2F2ZUFuc3dlcnNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIiwic2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIiwiZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcyIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyIiwiZ2V0UHJldmlvdXNBbnN3ZXJzIiwiZ2V0U3RhdHNBbnN3ZXJzIiwiZ2V0QWRtaW5TdGF0cyIsIlF1ZXN0aW9ubmFpcmUiLCJ0aXRsZSIsIm1heGxlbmd0aCIsInJlcXVpcmVkIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiUXVlc3Rpb24iLCJ0ZXh0IiwicmFuayIsIm1pbiIsImRlZmF1bHRWYWx1ZSIsIkNob2ljZSIsIm5iVGFnc01pbiIsIm5iVGFnc01heCIsImRpckNhY2hlVGFncyIsImRpckhUTUxUYWdzIiwiZGlyV2ViVGFncyIsInVzZXJSb3V0ZXMiLCJzdWJzY3JpYmVSb3V0ZSIsImdldEdvZGZhdGhlclJvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjb25uZWN0aW9uUm91dGUiLCJnZXRMb2dpbkxpbmtSb3V0ZSIsImNvbm5lY3Rpb25XaXRoTGlua1JvdXRlIiwiZ2V0VXNlckluZm9zIiwiY3JlYXRlVXNlclJvdXRlIiwidmFsaWRhdGVVc2VyUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJzZWFyY2hVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tEZWxldGVMaW5rUm91dGUiLCJnZXRQYXltZW50cyIsInVuc3Vic2NyaWJlUm91dGUiLCJuYW1lIiwiZW1haWwiLCJuZXdQYXNzd29yZCIsImNvZGVHb2RmYXRoZXIiLCJjZ3VPayIsInZhbHVlIiwidGltZURpZmZlcmVuY2VNaW4iLCJ0aW1lRGlmZmVyZW5jZU1heCIsInNpdGVIVE1MVGl0bGUiLCJzaXRlTWV0YURlc2NyaXB0aW9uIiwic2NyaXB0VGltaW5nSW5mbyIsInNjcmlwdFRpbWluZ0FsZXJ0Iiwic2VydmVyRXJyb3IiLCJzZXJ2ZXJFcnJvckFkbWluIiwibmVlZGVkUGFyYW1zIiwiYmFkVXJsIiwibm90VmFsaWRGb3JtYXQiLCJub3RBbGxvd2VkIiwibm90UmVxdWlyZWQiLCJ1cGRhdGVCdG5UeHQiLCJhZGRCdG5UeHQiLCJkZWxldGVCdG5UeHQiLCJhZGRPa01lc3NhZ2UiLCJ1cGRhdGVPa01lc3NhZ2UiLCJkZWxldGVPa01lc3NhZ2UiLCJmYWlsQXV0aCIsImZhaWxBdXRoSGVhZGVyIiwiZmFpbEF1dGhUb2tlbiIsImZhaWxBdXRoSWQiLCJmYWlsQXV0aENyb24iLCJwcmV2aW91c1BhZ2UiLCJuZXh0UGFnZSIsImJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUiLCJzdGF0c0FkbWluIiwibm90Rm91bmQiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWRFbWFpbCIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwicGFzc3dvcmRDb3BpZWQiLCJuZWVkU3RhdHVzIiwibmVlZExhbmd1YWdlIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJnb2RmYXRoZXJOb3RGb3VuZCIsImdvZGZhdGhlckZvdW5kIiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJtYWlsV2VsY29tZVN1YmplY3QiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJhbHJlYWR5Q29ubmVjdGVkIiwibmVlZEJlQ29ubmVjdGVkIiwiY29ubmVjdGlvbk9rIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZFZhbGlkYXRpb25Ub0xvZ2luIiwidG9vTWFueUxvZ2luRmFpbHMiLCJiYWRQYXNzd29yZCIsIm1haWxMb2dpbkxpbmtTdWJqZWN0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWRPa01lc3NhZ2UiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlIiwiZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2UiLCJ3ZWxjb21lTWVzc2FnZSIsImJ5ZWJ5ZU1lc3NhZ2UiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwiam9pbiIsInJlcGxhY2UiLCJtYXRjaGVkIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsImNvbmZpZ1RlbXBsYXRlIiwiY29uZmlnVXNlcnMiLCJ0eHQiLCJ0eHRVc2VycyIsIm15Rm9ybSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZSZXNwb25zZSIsInBhc3N3b3JkSW5wdXQiLCJwYXNzd29yZExpbmsiLCJwYXNzd29yZEhlbHAiLCJlbWFpbElucHV0IiwiYnRuU3VibWl0IiwiY29kZUdvZGZhdGhlcklucHV0IiwiaGVsbG9EZXYiLCJpbml0aWFsaXNlIiwiY2hlY2tTZXNzaW9uIiwiaXNDb25uZWN0ZWQiLCJzYXZlTG9jYWx5IiwibWVzc2FnZSIsImNvbG9yIiwidXNlciIsImdldExvY2FseSIsImhvbWVQYWdlIiwic3RhdHVzIiwid2luZG93IiwibG9jYXRpb24iLCJhc3NpZ24iLCJzZXRBdHRyaWJ1dGVzVG9JbnB1dHMiLCJzdHlsZSIsImRpc3BsYXkiLCJhZGRFbGVtZW50IiwiY29uc29sZSIsImVycm9yIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInR5cGUiLCJnZXRQYXNzd29yZCIsInNlbGVjdCIsImV4ZWNDb21tYW5kIiwiaW5uZXJIVE1MIiwiZW1haWxWYWx1ZSIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJmcmVlIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0UmVxdWVzdEhlYWRlciIsImRhdGFzIiwiZW1haWxUZXN0Iiwic2VuZCIsInN0cmluZ2lmeSIsImNvZGVWYWx1ZSIsImNvZGVUZXN0IiwicmVtb3ZlTG9jYWx5IiwiZXJyb3JzIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0RGF0YXNGcm9tSW5wdXRzIiwidGltZURpZmZlcmVuY2UiLCJnZXRUaW1lRGlmZmVyZW5jZSIsImRhdGEiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwianNvbiIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZWx0UGFyZW50IiwiZWx0VHlwZSIsImVsdENvbnRlbnQiLCJlbHRJZCIsImVsdENsYXNzIiwiZWx0QXR0cmlidXRlcyIsIm5ld0VsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaSIsImNsYXNzTGlzdCIsImFkZCIsImF0dHJpYnV0TmFtZSIsImFwcGVuZENoaWxkIiwibG9nIiwidXBkYXRlQWNjb3VudExpbmsiLCJsaW5rIiwiaW5wdXRzQ29uZiIsImVsZW1lbnRzIiwiaWRJbnB1dCIsImlucHV0SFRNTCIsImF0dHJpYnV0ZSIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJlbnRyaWVzIiwiZW50cmllIiwiZW1weUZvcm0iLCJjaGVja2VkIiwiZW1weUFuZEhpZGVGb3JtIiwiZ2V0Q29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsInRpbWVMb2NhbCIsImdldFRpbWV6b25lT2Zmc2V0IiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJ1cmxSZWRpcmVjdGlvbiIsInVybFdhbnRlZCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsIm5vdyIsImlzVmFsaWQiLCJsYW5ndWFnZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkEsSUFBTUEsS0FBSyxHQUFHQyxtQkFBTyxDQUFDLG1DQUFELENBQXJCOztBQUNBLElBQU1DLGNBQWMsR0FBR0QsbUJBQU8sQ0FBQyxxREFBRCxDQUE5Qjs7QUFFQUUsTUFBTSxDQUFDQyxPQUFQO0FBRUlDLFFBQU0sRUFBRSwyQkFGWjtBQUdJQyxTQUFPLEVBQUUsdUJBSGI7QUFJSUMsV0FBUyxFQUFFLFNBSmY7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LGNBQXZCO0FBQ1AsQ0FSRCxDIiwiZmlsZSI6Ii4vSlMvc3Vic2NyaWJlLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3N1YnNjcmliZS5qc1wiKTtcbiIsImNvbnN0IHVzZXJzID0gcmVxdWlyZShcIi4vdXNlcnNcIik7XG5jb25zdCBxdWVzdGlvbm5haXJlcyA9IHJlcXVpcmUoXCIuL3F1ZXN0aW9ubmFpcmVzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9hcGlcIixcbiAgICBzaXRlVXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiLFxuICAgIGFkbWluTmFtZTogXCJGYWJyaWNlXCIsXG4gICAgYWRtaW5FbWFpbDogXCJkZXZAd2lraWxlcm5pLmNvbVwiLFxuICAgIHNlbmRlck5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwiZGVmYXVsdFwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pXCIsXG4gICAgYmVnaW5Db2RlR29kZmF0aGVyOiBcIndpa2lsZXJuaVwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxMCxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTQsICAgIFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLCAvLyBpZiAwID0gbm90IG1heGltdW1cbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iTmV3UXVlc3Rpb25uYWlyZXM6IDEwLC8vIGZvciBSU1MsIGV0Yy5cbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVCZWdpbjoxLCAvLyBpbiB1c2VyIGxvY2FsIHRpbWVcbiAgICBob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQ6MjQsIC8vIGlkZW1cbiAgICBudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZTogNTAsIC8vIGZvciBtYXNzIG1haWxpbmdcbiAgICBtaW5TZWFyY2hRdWVzdGlvbm5haXJlczogMyxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMCxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA0MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgbmJRdWVzdGlvbnNNaW46IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWluLFxuICAgIG5iUXVlc3Rpb25zTWF4OiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01heCxcbiAgICBuYkNob2ljZXNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iQ2hvaWNlc01heCxcbiAgICBwYXNzd29yZE1pbkxlbmd0aDogdXNlcnMucGFzc3dvcmQubWlubGVuZ3RoLFxuICAgIGRpckNhY2hlVXNlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnMsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnM6IHVzZXJzLmRpckNhY2hlVXNlcnNBbnN3ZXJzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlUXVlc3Rpb25zLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZSxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlOiBxdWVzdGlvbm5haXJlcy5kaXJXZWJRdWVzdGlvbm5haXJlXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgc2F2ZUFuc3dlcnNSb3V0ZTogXCIvYW5zd2VyL1wiLFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoXCIsXG4gICAgc2VhcmNoQWRtaW5RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvc2VhcmNoYWRtaW5cIixcbiAgICBnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzOiBcIi9nZXRsaXN0bmV4dHF1ZXN0aW9ubmFpcmVzL1wiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldFF1ZXN0aW9ubmFpcmVzV2l0aG91dEFuc3dlcjogXCIvd2l0aG91dGFuc3dlci91c2VyL1wiLFxuICAgIGdldFByZXZpb3VzQW5zd2VyczogXCIvdXNlci9hbnN3ZXJzL1wiLFxuICAgIGdldFN0YXRzQW5zd2VycyA6IFwiL3VzZXIvYW53c3dlcnMvc3RhdHMvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBRdWVzdGlvbm5haXJlIDpcbiAgICB7XG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBzbHVnOiB7IG1heGxlbmd0aDogMTUwIH0sIC8vIGNoYW1wIHJlcXVpcyBtYWlzIGNhbGN1bMOpIMOgIHBhcnRpciBkdSB0aXRyZSBxZCB2aWRlXG4gICAgICAgIGludHJvZHVjdGlvbjogeyByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSxcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlcyA6IHsgbWlubGVuZ3RoOiAzLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYlRhZ3NNaW46IDAsXG4gICAgbmJUYWdzTWF4OiAwLCAvLyAwID0gbm90IG1heCAgICBcbiAgICAvLyBKU09OIGFuZCBIVE1MIGRpclxuICAgIGRpckNhY2hlUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbnMgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3F1ZXN0aW9uc1wiLFxuICAgIGRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVRhZ3MgOiBcImRhdGFzL3F1ZXN0aW9ubmFpcmVzL3RhZ3NcIiwgIFxuICAgIGRpckhUTUxRdWVzdGlvbm5haXJlIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxUYWdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlIDogXCJxdWl6XCIsLy9wb3VyIHVybCBwYWdlXG4gICAgZGlyV2ViVGFncyA6IFwicXVpenNcIi8vIGlkZW1cbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICB1c2VyUm91dGVzOiBcIi91c2VyXCIsXG4gICAgc3Vic2NyaWJlUm91dGU6IFwiL3NpZ251cFwiLFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZTogXCIvdmFsaWRhdGlvbi9cIixcbiAgICBjaGVja0xvZ2luUm91dGU6IFwiL2NoZWNrbG9naW4vXCIsXG4gICAgY29ubmVjdGlvblJvdXRlOiBcIi9sb2dpblwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBnZXRVc2VySW5mb3M6IFwiL2dldC9cIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIHZhbGlkYXRlVXNlclJvdXRlOiBcIi92YWxpZGF0ZS9cIixcbiAgICB1cGRhdGVVc2VySW5mb3M6IFwiL21vZGlmeS9cIixcbiAgICBzZWFyY2hVc2VyUm91dGU6IFwiL3NlYXJjaC9cIixcbiAgICBnZXRHb2RDaGlsZHM6IFwiL2dldGdvZGNoaWxkcy9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tEZWxldGVMaW5rUm91dGU6IFwiL2NvbmZpcm1kZWxldGUvXCIsXG4gICAgZ2V0UGF5bWVudHM6IFwiL3BheW1lbnQvZ2V0Zm9yb25ldXNlci9cIixcbiAgICB1bnN1YnNjcmliZVJvdXRlOiBcIi9zdWJzY3JpcHRpb24vc3RvcC9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGltZURpZmZlcmVuY2VNaW46IC03MjAsXG4gICAgdGltZURpZmZlcmVuY2VNYXg6ODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICE8YnI+Vm91cyBwb3V2ZXogc2FucyB0YXJkZXIgdm91cyBjb25uZWN0ZXIgY2ktZGVzc291cyBwb3VyIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi92aWV3cyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC5qcyRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaG10XCIsIGlkOiBcImFjY291bnRIZWFkTGlua1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDb250YWN0XCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb250YWN0Lmh0bWxcIiB9IH0sXG4gICAgXSxcbiAgICBmb290TGlua3M6XG4gICAgW1xuICAgICAgICB7IGFuY2hvcjogXCJDcsOpZGl0c1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY3JlZGl0cy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNZW50aW9ucyBsw6lnYWxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvbWVudGlvbnMtbGVnYWxlcy5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiRG9ubsOpZXMgcGVyc29ubmVsbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9kb25uZWVzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5VLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d1Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVi5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Nndi5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICBdLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMCxcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIGFkbWluSG9tZVBhZ2UgOiBcImFkbWluLmh0bWxcIixcbiAgICBtYW5hZ2VySG9tZVBhZ2UgOiBcImdlc3Rpb24uaHRtbFwiLFxuICAgIHN1YnNjcmliZVBhZ2UgOiBcImluc2NyaXB0aW9uLmh0bWxcIixcbiAgICBjb25uZWN0aW9uUGFnZSA6IFwiY29ubmV4aW9uLmh0bWxcIixcbiAgICBhY2NvdW50UGFnZTogXCJjb21wdGUuaHRtbFwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgbmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSA6IDEwLFxuICAgIGlsbHVzdHJhdGlvbkRpciA6IFwiL2ltZy9xdWl6cy9cIixcbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiQXZlYyBXaWtpTGVybmkgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLjxicj5EZXMgYXJ0aWNsZXMgZGUgV2lraXDDqWRpYSBzb250IHPDqWxlY3Rpb25uw6lzIHBvdXIgdm91cyBldCBzb250IHN1aXZpcyBkJ3VuIHF1aXogdm91cyBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48YnI+RGUgam91ciBlbiBqb3VyIGRlIG5vdXZlbGxlcyBncmFpbmVzIGRlIHNhdm9pciBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBcXFwiamFyZGluXFxcIi5cIixcbiAgICBob21lVGl0bGUyOiBcIkxhIGN1bHR1cmUgZW4gbGliZXJ0w6lcIixcbiAgICBob21lUDI6IFwiVG91dCBjb21tZSBzdXIgV2lraXDDqWRpYSAoKiksIGxlIGxvZ2ljaWVsIGV0IGxlIGNvbnRlbnUgcGFydGFnw6kgc3VyIFdpa2lMZXJuaSBzb250IGxpYnJlcy48YnI+Vm91cyBwb3V2ZXogbGVzIHV0aWxpc2VyLCBsZXMgbW9kaWZpZXIgZXQgbGVzIGRpZmZ1c2VyIHNlbG9uIHZvdHJlIHNvdWhhaXQuPGJyPlN1ciBXaWtpTGVybmksIHBhcyBkZSBwdWJsaWNpdMOpLCBuaSBkZSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMgcGVyc29ubmVsbGVzLjxicj5Wb3VzIHBvdXZleiB2ZW5pciB5IFxcXCJjdWx0aXZlciB2b3RyZSBqYXJkaW5cXFwiIGVuIHRvdXRlIHRyYW5xdWlsbGl0w6kuPGJyPjxicj48c21hbGw+PGVtPigqKSBCaWVuIHF1ZSBwYXJ0YWdlYW50IHNlcyB2YWxldXJzLCBXaWtpTGVybmkgZXN0IHVuIHByb2pldCBpbmTDqXBlbmRhbnQgZGUgbGEgZm9uZGF0aW9uIFdpa2lww6lkaWEuPC9lbT48L3NtYWxsPlwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmlcIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc0ludHJvOiBcIkxpc3RlIGRlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pLlwiLFxuICAgIGV4cGxhbmF0aW9uVGl0bGU6IFwiVm91cyBkw6ljb3V2cmV6IFdpa2lMZXJuaSA/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiTGUgcHJpbmNpcGUgZXN0IHNpbXBsZSA6IHZvdXMgY29tbWVuY2V6IHBhciBsaXJlIGwnYXJ0aWNsZSBXaWtpcMOpZGlhIGRvbnQgbGUgbGllbiB2b3VzIGVzdCBwcm9wb3PDqS48YnI+UHVpcyB2b3VzIGFmZmljaGVyIGxlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgZGUgdm90cmUgbGVjdHVyZS4gVm91cyBvYnRlbmV6IGFsb3JzIHZvdHJlIHLDqXN1bHRhdCBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlRvdXRlcyBsZXMgcsOpcG9uc2VzIHNlIHRyb3V2ZW50IGRhbnMgbCdhcnRpY2xlIHByb3Bvc8OpIMOgIGxhIGxlY3R1cmUuIDxiPlZvdXMgw6p0ZXMgaWNpIHBvdXIgYXBwcmVuZHJlIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+LCBtYWlzIGxpYnJlIMOgIHZvdXMgZCdlc3NheWVyIGQneSByw6lwb25kcmUgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5RdWFuZCBsZSBzdWpldCBzJ3kgcHLDqnRlLCBuZSB2b3VzIMOpdG9ubmV6IHBhcyBzaSBjZXJ0YWluZXMgZGVzIHLDqXBvbnNlcyBwcm9wb3PDqWVzIHBldXZlbnQgw6p0cmUgdW4gcGV1IGTDqWNhbMOpZXMsIGFic3VyZGVzLi4uIE9uIHBldXQgYXBwcmVuZHJlIGF2ZWMgbGUgc291cmlyZSwgbm9uID8gOi0pPGJyPjxicj5VbmUgZm9pcyB2b3RyZSByw6lzdWx0YXQgb2J0ZW51LCBpbCB2b3VzIHNlcmEgcHJvcG9zw6kgZGUgY3LDqWVyIHVuIGNvbXB0ZSBwb3VyIGxlIHNhdXZlZ2FyZGVyLjxicj5DZSBjb21wdGUgdm91cyBwZXJtZXR0cmEgZGUgdGVzdGVyIGRlIG5vdXZlYXUgY2UgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBwbHVzaWV1cnMgam91cnMsIHNlbWFpbmVzLCBtb2lzLi4uIEV0IGRlIHJlY2V2b2lyIHLDqWd1bGnDqHJlbWVudCBkZSBub3V2ZWxsZXMgc3VnZ2VzdGlvbnMgZGUgbGVjdHVyZXMuPGJyPjxicj5NYWlzIDxiPmxhIGNyw6lhdGlvbiBkZSBjZSBjb21wdGUgZXN0IGZhY3VsdGF0aXZlPC9iPiBldCA8YSBocmVmPScvcXVpenMvJyB0aXRsZT0nTGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzJz52b3VzIHBvdXZleiBwYXJjb3VyaXIgV2lraUxlcm5pIGxpYnJlbWVudDwvYT4uXCIsXG4gICAgbm9KU05vdGlmaWNhdGlvbjogXCJEw6lzb2zDqSwgbWFpcyBwb3VyIGwnaW5zdGFudCwgbCd1dGlsaXNhdGlvbiBkZSBXaWtpTGVybmkgbsOpY2Vzc2l0ZSBsJ2FjdGl2YXRpb24gZHUgSmF2YVNjcmlwdC5cIixcbn07IiwiLy8gLS0gR0VTVElPTiBEVSBGT1JNVUxBSVJFIFBFUk1FVFRBTlQgREUgQ1LDiUVSIFNPTiBDT01QVEVcblxuLy8vIEwndXRpbGlzYXRldXIgcGV1dCBhdm9pciByw6lwb25kdSDDoCB1biBxdWl6IGF2YW50IGQnYXJyaXZlciBzdXIgbGEgcGFnZSBkJ2luc2NyaXB0aW9uXG4vLy8gRGVzIGNlIGNhcyBpbCBmYXV0IGVucmVnaXN0cmVyIHNvbiByw6lzdWx0YXQgZW4gbcOqbWUgdGVtcHMgcXVlIGxlcyBpbmZvcm1hdGlvbnMgZGUgc29uIGNvbXB0ZVxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gdGlyw6lzIGR1IGJhY2tlbmQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmNvbnN0IGNvbmZpZ1VzZXJzID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy91c2Vyc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZSBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldERhdGFzRnJvbUlucHV0cywgc2V0QXR0cmlidXRlc1RvSW5wdXRzIH0gZnJvbSBcIi4vdG9vbHMvZm9ybXMuanNcIjtcbmltcG9ydCB7IGNoZWNrQW5zd2VyRGF0YXMsIGNoZWNrU2Vzc2lvbiwgZ2V0Q29uZmlnLCBnZXRQYXNzd29yZCwgZ2V0VGltZURpZmZlcmVuY2UgfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG4vLyBQcmluY2lwYXV4IMOpbMOpbWVudHMgZHUgRE9NIG1hbmlwdWzDqXMgOlxuY29uc3QgbXlGb3JtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3Vic2NyaXB0aW9uXCIpO1xuY29uc3QgZGl2UmVzcG9uc2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcbmNvbnN0IHBhc3N3b3JkSW5wdXQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwYXNzd29yZFwiKTtcbmNvbnN0IHBhc3N3b3JkTGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImdldFBhc3N3b3JkXCIpO1xuY29uc3QgcGFzc3dvcmRIZWxwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicGFzc3dvcmRNZXNzYWdlXCIpO1xuY29uc3QgZW1haWxJbnB1dD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVtYWlsXCIpO1xuY29uc3QgYnRuU3VibWl0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3VibWl0RGF0YXNcIik7XG5jb25zdCBjb2RlR29kZmF0aGVySW5wdXQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2RlR29kZmF0aGVyXCIpO1xuXG5oZWxsb0RldigpO1xuXG4vLyBUZXN0IGRlIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyICsgYWZmaWNoYWdlIGZvcm11bGFpcmUgZCdpbnNjcmlwdGlvbi5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKCk7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLmFscmVhZHlDb25uZWN0ZWQsIGNvbG9yOlwiaW5mb3JtYXRpb25cIiB9KTsvLyBwb3VyIGwnYWZmaWNoZXIgc3VyIGxhIHBhZ2Ugc3VpdmFudGVcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWdVc2VycywgbXlGb3JtKTtcbiAgICAgICAgICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTtcblxuLy8gR8OpbsOpcmF0ZXVyIGRlIG1vdCBkZSBwYXNzZSBcImFsw6lhdG9pcmVcIlxucGFzc3dvcmRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxue1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBwYXNzd29yZElucHV0LnR5cGU9XCJ0ZXh0XCI7XG4gICAgcGFzc3dvcmRJbnB1dC52YWx1ZT1nZXRQYXNzd29yZCg4LCAxMik7XG4gICAgLy8gY29waWUgZHUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXJcbiAgICBwYXNzd29yZElucHV0LnNlbGVjdCgpO1xuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY29weVwiKTtcbiAgICBhZGRFbGVtZW50KHBhc3N3b3JkSGVscCwgXCJlbVwiLCB0eHRVc2Vycy5wYXNzd29yZENvcGllZCwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG59KTtcblxuLy8gVGVzdCBzaSBsJ2UtbWFpbCBzYWlzaSBlc3QgZMOpasOgIHV0aWxpc8OpIHBvdXIgdW4gY29tcHRlIGTDqWrDoCBleGlzdGFudC5cbi8vIFNpIGMnZXN0IGxlIGNhcywgbGEgdmFsaWRhdGlvbiBkdSBmb3JtdWxhaXJlIGVzdCBibG9xdcOpZS5cbmVtYWlsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGZ1bmN0aW9uKGUpXG57XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlbWFpbE1lc3NhZ2VcIikuaW5uZXJIVE1MPVwiXCI7Ly8gcG91ciBzdXBwcmltZXIgbCfDqXZlbnR1ZWwgbWVzc2FnZSBkJ2VycmV1ciBkw6lqw6AgYWZmaWNow6lcbn0pO1xuZW1haWxJbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBmdW5jdGlvbihlKVxue1xuICAgIGNvbnN0IGVtYWlsVmFsdWU9ZW1haWxJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYoZW1haWxWYWx1ZSE9PVwiXCIpXG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdVc2Vycy51c2VyUm91dGVzK2NvbmZpZ1VzZXJzLmNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlKTtcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5mcmVlIT09dW5kZWZpbmVkICYmIHJlc3BvbnNlLmZyZWUgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVtYWlsTWVzc2FnZVwiKSwgXCJiXCIsIHR4dFVzZXJzLm5lZWRVbmlxdWVFbWFpbC5yZXBsYWNlKFwiI1VSTFwiLCBjb25maWdUZW1wbGF0ZS5jb25uZWN0aW9uUGFnZSksIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgYnRuU3VibWl0LnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJ0blN1Ym1pdC5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgIGNvbnN0IGRhdGFzPXsgZW1haWxUZXN0OmVtYWlsVmFsdWUgfTtcbiAgICAgICAgeGhyLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YXMpKTtcbiAgICB9XG59KTtcblxuLy8gVsOpcmlmaWNhdGlvbiBxdWUgbGUgY29kZSBkZSBwYXJyYWluYWdlIHNhaXNpIGVzdCB2YWxpZGUuXG4vLyBTaSBjZSBuJ2VzdCBwYXMgbGUgY2FzLCBjZWxhIG4nZXN0IHBhcyBibG9xdWFudC5cbmNvZGVHb2RmYXRoZXJJbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgZnVuY3Rpb24oZSlcbnsgICAvLyBvbiBlZmZhY2UgbCfDqXZlbnR1ZWwgbWVzc2FnZSBkJ2VycmV1ciBzaSBvbiByZXZpZW50IHN1ciBsZSBjaGFtcCBwb3VyIHJlY3RpZmllciBsZSB0aXJcbiAgICBhZGRFbGVtZW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29kZUdvZGZhdGhlck1lc3NhZ2VcIiksIFwiaVwiLCB0eHQubm90UmVxdWlyZWQsIFwiXCIsIFtcImluZm9ybWF0aW9uXCJdKTtcbn0pO1xuY29kZUdvZGZhdGhlcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGZ1bmN0aW9uKGUpXG57XG4gICAgY29uc3QgY29kZVZhbHVlPWNvZGVHb2RmYXRoZXJJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYoY29kZVZhbHVlIT09XCJcIilcbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ1VzZXJzLnVzZXJSb3V0ZXMrY29uZmlnVXNlcnMuZ2V0R29kZmF0aGVyUm91dGUpO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDQpXG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb2RlR29kZmF0aGVyTWVzc2FnZVwiKSwgXCJiXCIsIHR4dFVzZXJzLmdvZGZhdGhlck5vdEZvdW5kLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgZWxzZSAvLyAhISDDoCByZXZvaXIgY2FyIGNlbGEgcGV1dCBwZXJtZXR0cmUgZGUgc2F2b2lyIHF1J3VuZSBhZHJlc3NlIGUtbWFpbCBlc3QgcHLDqXNlbnRlIGRhbnMgbGUgYmRcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvZGVHb2RmYXRoZXJNZXNzYWdlXCIpLCBcImJcIiwgdHh0VXNlcnMuZ29kZmF0aGVyRm91bmQsIFwiXCIsIFtcInN1Y2Nlc3NcIl0pOyAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICBjb25zdCBkYXRhcz17IGNvZGVUZXN0OmNvZGVWYWx1ZSB9O1xuICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgIH1cbn0pO1xuXG4vLyBUcmFpdGVtZW50IGRlIGwnZW52b2kgZGVzIGRvbm7DqWVzIGQnaW5zY3JpcHRpb24gOlxubXlGb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24oZSlcbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgICAgICAgIFxuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdVc2Vycy51c2VyUm91dGVzK2NvbmZpZ1VzZXJzLnN1YnNjcmliZVJvdXRlKTtcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcImxhc3RBbnN3ZXJcIik7Ly8gISBpbXBvcnRhbnQgcG91ciBuZSBwYXMgZW5yZWdpc3RlciBwbHVzaWV1cnMgZm9pcyBsZSByw6lzdWx0YXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSB0eHQuc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5lcnJvcnMsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICBsZXQgZGF0YXM9Z2V0RGF0YXNGcm9tSW5wdXRzKG15Rm9ybSk7XG4gICAgICAgIGlmKGRhdGFzKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy50aW1lRGlmZmVyZW5jZT1nZXRUaW1lRGlmZmVyZW5jZShjb25maWdVc2Vycyk7XG4gICAgICAgICAgICAvLyBzaSBsJ3V0aWxpc2F0ZXVyIGEgcHLDqWPDqWRlbWVudCByw6lwb25kdSDDoCB1biBxdWl6LCBqJ2Fqb3V0ZSBsZXMgaW5mb3MgZGUgc29uIHLDqXN1bHRhdCA6XG4gICAgICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxufSk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuIExlIGNvZGUgZGUgV2lraUxlcm5pIGVzdCBsaWJyZSBldCBlc3QgbGlzaWJsZSBzdXIgZ2l0bGFiIDogXFxuIEJvbm5lIGxlY3R1cmUgOi0pIFxcbiBQb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IHNldEF0dHJpYnV0ZXNUb0lucHV0cyA9IChpbnB1dHNDb25mLCBteUZvcm0pID0+XG57XG4gICAgZm9yKGxldCBpIGluIG15Rm9ybS5lbGVtZW50cylcbiAgICB7XG4gICAgICAgIGlmKCFpc0VtcHR5KG15Rm9ybS5lbGVtZW50c1tpXS5pZCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBpZElucHV0PW15Rm9ybS5lbGVtZW50c1tpXS5pZDtcbiAgICAgICAgICAgIGlmKGlucHV0c0NvbmZbaWRJbnB1dF0hPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0SFRNTD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZElucHV0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgaW4gaW5wdXRzQ29uZltpZElucHV0XSlcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRIVE1MLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGlucHV0c0NvbmZbaWRJbnB1dF1bYXR0cmlidXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIFLDqWN1cMOocmUgdG91dGVzIGxlcyB2YWxldXJzIGRlIGNoYW1wcyBlbiBvbWV0dGFudCBsZXMgY2hlY2tib3ggbm9uIGNvY2jDqWVzLCBldGMuXG5leHBvcnQgY29uc3QgZ2V0RGF0YXNGcm9tSW5wdXRzID0gKG15Rm9ybSkgPT5cbntcbiAgICBjb25zdCBkYXRhcz17fTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShteUZvcm0pO1xuICAgIGZvcihsZXQgZW50cmllIG9mIGZvcm1EYXRhLmVudHJpZXMoKSlcbiAgICAgICBkYXRhc1tlbnRyaWVbMF1dPWVudHJpZVsxXTtcbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIFZpZGUgdG91cyBsZXMgY2hhbXBzIGQndW4gZm9ybXVsYWlyZSwgeSBjb21wcmlzIGhpZGRlbiwgY2hlY2tib3gsIGV0Yy5cbi8vIFJldm9pciBwb3VyIGxlcyBzZWxlY3RcbmV4cG9ydCBjb25zdCBlbXB5Rm9ybSA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAge1xuICAgICAgICBpZihteUZvcm0uZWxlbWVudHNbZW50cmllWzBdXS50eXBlPT1cImNoZWNrYm94XCIgfHwgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJyYWRpb1wiKVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0uY2hlY2tlZD1mYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udmFsdWU9XCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBWaWRlIGV0IGNhY2hlIGxlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBlbXB5QW5kSGlkZUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGVtcHlGb3JtKG15Rm9ybSk7XG4gICAgbXlGb3JtLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gUsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgY29uZmlndXJhdGlvbiBkZXMgdXRpbGlzYXRldXJzXG4vLyDDgCB0ZXJtZSwgdW4gZmljaGllciBzdGF0aXF1ZSBpbXBvcnRhYmxlIGNvbW1lIG1vZHVsZSBkZXZyYWl0IMOpdml0ZXIgdW5lIHJlcXXDqnRlIGFqYXhcbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAgYXN5bmMgKCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrXCIvdXNlci9nZXRjb25maWdcIik7XG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpO1xuICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaW1lRGlmZmVyZW5jZSA9ICgpID0+XG57XG4gICAgY29uc3QgdGltZUxvY2FsPW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZih0aW1lTG9jYWwgPiB0aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCB0aW1lRGlmZmVyZW5jZU1pbilcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSByZXR1cm4gdGltZUxvY2FsO1xufVxuXG4vLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbi8vIEV0IG1pZXV4IHZhdXQgYXVzc2kgZMOpYnV0ZXIgZXQgZmluaXIgcGFyIHVuZSBsZXR0cmUgc2ltcGxlLlxuZXhwb3J0IGNvbnN0IGdldFBhc3N3b3JkID0gKG5iQ2FyTWluLCBuYkNhck1heCkgPT5cbntcbiAgICBjb25zdCBuYkNhcj1uYkNhck1pbitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKG5iQ2FyTWF4LW5iQ2FyTWluKSk7XG4gICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgY29uc3Qgb3RoZXJzPVwiMTIzNDU2Nzg5IT8uKi1fJUAmw4nDgMOIw5nigqwkw4LDisObw45cIjtcbiAgICBsZXQgcGFzc3dvcmQ9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAge1xuICAgICAgICBpZigoaSAlIDIpID09PTEpXG4gICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldOyAgIFxuICAgIH1cbiAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpelxuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn1cblxuLy8gQ2V0dGUgZm9uY3Rpb24gdGVzdGUgbGEgY29ubmV4aW9uIGRlIGwndXRpbGlzYXRldXIgZCd1bmUgcGFnZVxuLy8gT24gcGV1dCBmb3VybmlzIHVuZSBsaXN0ZSBkZSBzdGF0dXRzIGFjY2VwdMOpcyAoc2kgdmlkZSA9IHRvdXMpLCBhaW5zaSBxdSd1bmUgdXJsIGRlIHJlZGlyZWN0aW9uIHNpIG5vbiBjb25uZWN0w6ksIHVuIG1lc3NhZ2UgZCdlcnJldXIgw6AgYWZmaWNoZXIgc3VyIGxhIHBhZ2UgZGUgZGVzdGluYXRpb24gZXQgbCd1cmwgc3VyIGxhcXVlbGxlIHJldmVuaXIgdW5lIGZvaXMgY29ubmVjdMOpXG5leHBvcnQgY29uc3QgY2hlY2tTZXNzaW9uID0gYXN5bmMgKHN0YXR1cz1bXSwgdXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhcz1nZXRMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICBpZihpc0VtcHR5KHVzZXJEYXRhcykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgdXNlcj1KU09OLnBhcnNlKHVzZXJEYXRhcyk7XG4gICAgICAgICAgICBpZihpc0VtcHR5KHVzZXIuaWQpIHx8wqBpc0VtcHR5KHVzZXIudG9rZW4pIHx8IGlzRW1wdHkodXNlci5kdXJhdGlvbikgfHwgdXNlci5kdXJhdGlvbiA8IERhdGUubm93KCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK3VzZXJSb3V0ZXMrY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9c2l0ZVVybCtcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZih1cmxBY2NvdW50KT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZVtsYW5nXS5hY2NvdW50UGFnZSk7Ly8gcGFzc8OpZSBkaXJlY3RlbWVudCBpY2ksIGwnYW5jcmUgI3N1YnNjcmliZSBuZSBmb25jdGlvbm5lIHBhcyAhP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMubGVuZ3RoIT09MCAmJiBzdGF0dXMuaW5kZXhPZihyZXNwb25zZS5zdGF0dXMpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBDZXR0ZSBmb25jdGlvbiBzZXJ0IMOgIGxhIHByw6ljw6lkZW50ZSBlbiBjYXMgZGUgY29ubmV4aW9uIG5vbiB2YWxpZGVcbmNvbnN0IHJlZGlyZWN0VXNlciA9ICh1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIGlmKCFpc0VtcHR5KG1lc3NhZ2UpKVxuICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICBpZighaXNFbXB0eSh1cmxXYW50ZWQpKVxuICAgICAgICBzYXZlTG9jYWx5KFwidXJsXCIsIHVybFdhbnRlZCk7XG4gICAgaWYoIWlzRW1wdHkodXJsUmVkaXJlY3Rpb24pKVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybFJlZGlyZWN0aW9uKTtcbn0iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/front/public/JS/subscribeValidation.app.js b/front/public/JS/subscribeValidation.app.js
new file mode 100644
index 0000000..33dd172
--- /dev/null
+++ b/front/public/JS/subscribeValidation.app.js
@@ -0,0 +1,1186 @@
+/******/ (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",
+ senderEmail: "bonjour@wikilerni.com",
+ adminLang: "fr",
+ theme: "default",
+ // 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",
+ beginCodeGodfather: "wikilerni",
+ // 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: 10,
+ // 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",
+ searchAdminQuestionnairesRoute: "/searchadmin",
+ getListNextQuestionnaires: "/getlistnextquestionnaires/",
+ // -- 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: 10,
+ 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
+
+};
+
+/***/ }),
+
+/***/ "../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 : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./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(" ");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, " "); // 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 est lisible sur gitlab : \n Bonne lecture :-) \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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mgc3luYyBeXFwuXFwvLipcXC5qcyQiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovLy8uL3NyYy9zdWJzY3JpYmVWYWxpZGF0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9jbGllbnRzdG9yYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy9kb20uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2V2ZXJ5d2hlcmUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiaGVhZExpbmtzIiwiYW5jaG9yIiwiYXR0cmlidXRlcyIsImhyZWYiLCJpZCIsImZvb3RMaW5rcyIsInJlbCIsIm1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlIiwidXNlckhvbWVQYWdlIiwiYWRtaW5Ib21lUGFnZSIsIm1hbmFnZXJIb21lUGFnZSIsInN1YnNjcmliZVBhZ2UiLCJjb25uZWN0aW9uUGFnZSIsImFjY291bnRQYWdlIiwicXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZSIsInVzZXJzTWFuYWdlbWVudFBhZ2UiLCJuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIiwiaWxsdXN0cmF0aW9uRGlyIiwic2l0ZVNsb2dhbiIsImhvbWVUaXRsZTEiLCJob21lUDEiLCJob21lVGl0bGUyIiwiaG9tZVAyIiwibmV3UXVlc3Rpb25uYWlyZXNUaXRsZSIsIm5ld1F1ZXN0aW9ubmFpcmVzSW50cm8iLCJleHBsYW5hdGlvblRpdGxlIiwiZXhwbGFuYXRpb25UeHQiLCJub0pTTm90aWZpY2F0aW9uIiwiY29uZmlnVGVtcGxhdGUiLCJ0eHQiLCJ0eHRVc2VycyIsImRpdlJlc3BvbnNlIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImluaXRpYWxpc2UiLCJjaGVja1Nlc3Npb24iLCJpc0Nvbm5lY3RlZCIsInNhdmVMb2NhbHkiLCJtZXNzYWdlIiwiY29sb3IiLCJ1c2VyIiwiZ2V0TG9jYWx5IiwiaG9tZVBhZ2UiLCJzdGF0dXMiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImFzc2lnbiIsImRhdGFzIiwiZ2V0VXJsUGFyYW1zIiwidCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJ1c2VySWQiLCJ0b2tlbiIsImVycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsImFkZEVsZW1lbnQiLCJzZW5kIiwiY29uc29sZSIsImVycm9yIiwiaGVsbG9EZXYiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImxvZyIsInVwZGF0ZUFjY291bnRMaW5rIiwibGluayIsInNlYXJjaCIsInBhcmFtZXRlcnMiLCJzcGxpdCIsInBhcmFtIiwiZGVjb2RlVVJJIiwiZ2V0Q29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbmxvYWQiLCJvbmVycm9yIiwic3RhdHVzVGV4dCIsImdldFRpbWVEaWZmZXJlbmNlIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRQYXNzd29yZCIsIm5iQ2FyTWluIiwibmJDYXJNYXgiLCJuYkNhciIsImxldHRlcnMiLCJvdGhlcnMiLCJzZXRTZXNzaW9uIiwiZHVyYXRpb25UUyIsInN0b3JhZ2VVc2VyIiwiZHVyYXRpb24iLCJjaGVja0Fuc3dlckRhdGFzIiwibGFzdEFuc3dlciIsImFuc3dlciIsIm5iQ29ycmVjdEFuc3dlcnMiLCJRdWVzdGlvbm5haXJlSWQiLCJuYlF1ZXN0aW9ucyIsInVybFJlZGlyZWN0aW9uIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwibm93IiwiaXNWYWxpZCIsImxhbmd1YWdlIiwidGltZURpZmZlcmVuY2UiLCJuYkRheXNPayIsInVybEFjY291bnQiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFF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LDZCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0g7QUFDSixtQkE1Q0Q7O0FBNkNBckQscUJBQUcsQ0FBQ3dELE9BQUosR0FBYztBQUFBLDJCQUFNRixNQUFNLENBQUN0RCxHQUFHLENBQUN5RCxVQUFMLENBQVo7QUFBQSxtQkFBZDs7QUFDQXpELHFCQUFHLENBQUNnQixJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVovQixZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTStGLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNILGNBQUQsRUFBaUJ6RixPQUFqQixFQUEwQjBGLFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDMUosMkRBQU8sQ0FBQ2dFLE9BQUQsQ0FBWCxFQUNJRCxvRUFBVSxDQUFDLFNBQUQsRUFBWUMsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDaEUsMkRBQU8sQ0FBQzBKLFNBQUQsQ0FBWCxFQUNJM0Ysb0VBQVUsQ0FBQyxLQUFELEVBQVEyRixTQUFSLENBQVY7QUFDSixNQUFHLENBQUMxSiwyREFBTyxDQUFDeUosY0FBRCxDQUFYLEVBQ0luRixNQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCaUYsY0FBdkI7QUFDUCxDQVJELEMiLCJmaWxlIjoiLi9KUy9zdWJzY3JpYmVWYWxpZGF0aW9uLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3N1YnNjcmliZVZhbGlkYXRpb24uanNcIik7XG4iLCJjb25zdCB1c2VycyA9IHJlcXVpcmUoXCIuL3VzZXJzXCIpO1xuY29uc3QgcXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi9xdWVzdGlvbm5haXJlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgc2l0ZVVybDogXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIixcbiAgICBhZG1pbk5hbWU6IFwiRmFicmljZVwiLFxuICAgIGFkbWluRW1haWw6IFwiZGV2QHdpa2lsZXJuaS5jb21cIixcbiAgICBzZW5kZXJOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcImRlZmF1bHRcIiwgLy8gbGUgdGjDqG1lIHV0aWxpc8OpIChkYW5zIC92aWV3cykgcG91ciBnw6luw6lyZXIgbGVzIHBhZ2VzIEhUTUwuIENvbnRpZW50IHNlcyBwcm9wcmVzIGZpY2hpZXJzIGRlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXZhaWxhYmxlTGFuZ3M6IFtcImZyXCJdLC8vIExhbmd1YWdlcyBpbiB3aGljaCB0aGUgc2l0ZSBpcyBhdmFpbGFibGUuIFRoZSBmaXJzdCBvbmUgaXMgdGhlIGRlZmF1bHQgb25lLlxuICAgIHNpdGVOYW1lOiBcIldpa2lMZXJuaVwiLFxuICAgIGJlZ2luQ29kZUdvZGZhdGhlcjogXCJ3aWtpbGVybmlcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMTAsXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiA1LFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDE0LCAgICBcbiAgICBhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBpbmFjdGl2ZUFjY291bnRUaW1lVG9EZWxldGVJbkRheXM6IDE4MCxcbiAgICAvLyBRdWVzdGlvbm5haXJlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSwgLy8gbWluaW11bSBudW1iZXIgb2YgcXVlc3Rpb25zIGZvciB0aGUgcXVlc3Rpb25uYWlyZSB0byBiZSBwdWJsaXNoYWJsZVxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCwgLy8gaWYgMCA9IG5vdCBtYXhpbXVtXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYk5ld1F1ZXN0aW9ubmFpcmVzOiAxMCwvLyBmb3IgUlNTLCBldGMuXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW46MSwgLy8gaW4gdXNlciBsb2NhbCB0aW1lXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kOjI0LCAvLyBpZGVtXG4gICAgbnVtYmVyTmV3UXVlc3Rpb25uYWlyZUF0U2FtZVRpbWU6IDUwLCAvLyBmb3IgbWFzcyBtYWlsaW5nXG4gICAgbWluU2VhcmNoUXVlc3Rpb25uYWlyZXM6IDMsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDAsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNDAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAxLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIG5iUXVlc3Rpb25zTWluOiBxdWVzdGlvbm5haXJlcy5uYlF1ZXN0aW9uc01pbixcbiAgICBuYlF1ZXN0aW9uc01heDogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNYXgsXG4gICAgbmJDaG9pY2VzTWF4OiBxdWVzdGlvbm5haXJlcy5uYkNob2ljZXNNYXgsXG4gICAgcGFzc3dvcmRNaW5MZW5ndGg6IHVzZXJzLnBhc3N3b3JkLm1pbmxlbmd0aCxcbiAgICBkaXJDYWNoZVVzZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzQW5zd2VycyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ucyxcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlySFRNTFF1ZXN0aW9ubmFpcmUsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZTogcXVlc3Rpb25uYWlyZXMuZGlyV2ViUXVlc3Rpb25uYWlyZVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57ICAgIFxuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBxdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWVzdGlvbm5haXJlXCIsXG4gICAgZ2V0UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvZ2V0XCIsXG4gICAgcHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9xdWl6L1wiLFxuICAgIHNhdmVBbnN3ZXJzUm91dGU6IFwiL2Fuc3dlci9cIixcbiAgICBnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIDogXCIvc3RhdHMvXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICAvLyAtLSBxdWVzdGlvbnMgJiBjaG9pY2VzIDpcbiAgICBxdWVzdGlvbnNSb3V0ZTogXCIvcXVlc3Rpb24vXCIsXG4gICAgLy8gLS0gdGFncyA6XG4gICAgdGFnc1NlYXJjaFJvdXRlOiBcIi90YWdzL3NlYXJjaC9cIixcbiAgICAvLyAtLSBhbnN3ZXJzIDpcbiAgICBnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXI6IFwiL3dpdGhvdXRhbnN3ZXIvdXNlci9cIixcbiAgICBnZXRQcmV2aW91c0Fuc3dlcnM6IFwiL3VzZXIvYW5zd2Vycy9cIixcbiAgICBnZXRTdGF0c0Fuc3dlcnMgOiBcIi91c2VyL2Fud3N3ZXJzL3N0YXRzL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgUXVlc3Rpb25uYWlyZSA6XG4gICAge1xuICAgICAgICB0aXRsZTogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgc2x1ZzogeyBtYXhsZW5ndGg6IDE1MCB9LCAvLyBjaGFtcCByZXF1aXMgbWFpcyBjYWxjdWzDqSDDoCBwYXJ0aXIgZHUgdGl0cmUgcWQgdmlkZVxuICAgICAgICBpbnRyb2R1Y3Rpb246IHsgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXMgOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBRdWVzdGlvbiA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICByYW5rOiB7IHJlcXVpcmVkOiB0cnVlLCBtaW46MSwgZGVmYXVsdFZhbHVlOjEgfVxuICAgIH0sICAgICAgICAgIFxuICAgIENob2ljZSA6XG4gICAge1xuICAgICAgICB0ZXh0OiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgbmJRdWVzdGlvbnNNaW46IDEsXG4gICAgbmJRdWVzdGlvbnNNYXg6IDEwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG4gICAgLy8gSlNPTiBhbmQgSFRNTCBkaXJcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy9xdWVzdGlvbnNcIixcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsICBcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZSA6IFwiZnJvbnQvcHVibGljL3F1aXpcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZSA6IFwicXVpelwiLC8vcG91ciB1cmwgcGFnZVxuICAgIGRpcldlYlRhZ3MgOiBcInF1aXpzXCIvLyBpZGVtXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIHN1YnNjcmliZVJvdXRlOiBcIi9zaWdudXBcIixcbiAgICBnZXRHb2RmYXRoZXJSb3V0ZTogXCIvZ2V0Z29kZmF0aGVyaWRcIixcbiAgICBjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZTogXCIvaXNlbWFpbGZyZWVcIixcbiAgICBjaGVja1N1YnNjcmliZVRva2VuUm91dGU6IFwiL3ZhbGlkYXRpb24vXCIsXG4gICAgY2hlY2tMb2dpblJvdXRlOiBcIi9jaGVja2xvZ2luL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBnZXRMb2dpbkxpbmtSb3V0ZTogXCIvZ2V0bG9naW5saW5rXCIsXG4gICAgY29ubmVjdGlvbldpdGhMaW5rUm91dGU6IFwiL2NoZWNrbG9naW5saW5rXCIsXG4gICAgZ2V0VXNlckluZm9zOiBcIi9nZXQvXCIsXG4gICAgY3JlYXRlVXNlclJvdXRlOiBcIi9jcmVhdGVcIixcbiAgICB2YWxpZGF0ZVVzZXJSb3V0ZTogXCIvdmFsaWRhdGUvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgc2VhcmNoVXNlclJvdXRlOiBcIi9zZWFyY2gvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsXG4gICAgY2hlY2tOZXdMb2dpbkxpbmtSb3V0ZTogXCIvY29uZmlybW5ld2xvZ2luL1wiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLFxuICAgIGdldFBheW1lbnRzOiBcIi9wYXltZW50L2dldGZvcm9uZXVzZXIvXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgZ2V0QWRtaW5TdGF0czogXCIvZ2V0YWRtaW5zdGF0cy9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBuYW1lOiB7IG1heGxlbmd0aDogNzAsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZW1haWw6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIsIHJlcXVpcmVkOiB0cnVlIH0sIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JjcnlwdCNzZWN1cml0eS1pc3N1ZXMtYW5kLWNvbmNlcm5zXG4gICAgbmV3UGFzc3dvcmQ6IHsgbWlubGVuZ3RoOiA4LCBtYXhsZW5ndGg6NzIgfSxcbiAgICBjb2RlR29kZmF0aGVyOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgY2d1T2s6IHsgdmFsdWU6IFwidHJ1ZVwiLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRpbWVEaWZmZXJlbmNlTWluOiAtNzIwLFxuICAgIHRpbWVEaWZmZXJlbmNlTWF4Ojg0MCxcbiAgICAvLyBKU09OIGRpclxuICAgIGRpckNhY2hlVXNlcnMgOiBcImRhdGFzL3VzZXJzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMgOiBcImRhdGFzL3VzZXJzL3F1ZXN0aW9ubmFpcmVzL2Fuc3dlcnNcIlxufTtcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9nZW5lcmFsXCI6IFwiLi4vbGFuZy9mci9nZW5lcmFsLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvZ2VuZXJhbCRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIHNpdGVIVE1MVGl0bGUgOiBcIldpa2lMZXJuaSA6IHF1J2FsbGV6LXZvdXMgYXBwcmVuZHJlIGF1am91cmQnaHVpID9cIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJDaGFxdWUgam91ciwgdGVzdGV6IHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmkuXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzY3JpcHRUaW1pbmdBbGVydCA6IFwiKioqIFNjcmlwdCBsZW50IDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBuZWVkZWRQYXJhbXMgOiBcIkRlcyBwYXJhbcOodHJlcyBuw6ljZXNzYWlyZXMgbWFucXVhbnRzIHNvbnQgbWFucXVhbnRzLlwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBub3RWYWxpZEZvcm1hdCA6IFwiRm9ybWF0IG5vbiB2YWxpZGUuXCIsXG4gICAgbm90QWxsb3dlZCA6IFwiVm91cyBuJ2F2ZXogcGFzIGxlcyBkcm9pdHMgbsOpY2Vzc2FpcmVzIHBvdXIgY2V0dGUgYWN0aW9uLlwiLFxuICAgIG5vdFJlcXVpcmVkIDogXCJGYWN1bHRhdGlmLlwiLFxuICAgIHVwZGF0ZUJ0blR4dDogXCJNb2RpZmllclwiLFxuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgZGVsZXRlQnRuVHh0OiBcIlN1cHByaW1lclwiLFxuICAgIGFkZE9rTWVzc2FnZSA6IFwiTGVzIGRvbm7DqWVzIG9udCBiaWVuIMOpdMOpIGVucmVnaXN0csOpZXMuXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlIDogXCJMYSBtaXNlIMOgIGpvdXIgw6Agam91ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGRlbGV0ZU9rTWVzc2FnZSA6IFwiTGEgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBmYWlsQXV0aCA6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvbi5cIixcbiAgICBmYWlsQXV0aEhlYWRlciA6IFwiQWJzZW5jZSBkZSBoZWFkZXIgQXV0aG9yaXphdGlvbi5cIixcbiAgICBmYWlsQXV0aFRva2VuIDogXCJUb2tlbiBpbnZhbGlkZSBvdSB1dGlsaXNhdGV1ciBub24gdHJvdXbDqS5cIixcbiAgICBmYWlsQXV0aElkIDogXCJJZGVudGlmaWFudCBub24gdmFsaWRlIDogXCIsXG4gICAgZmFpbEF1dGhDcm9uIDogXCJUZW50YXRpdmUgZGUgbGFuY2VtZW50IGQndW4gY3JvbiBzYW5zIGxlIGJvbiB0b2tlbi5cIixcbiAgICBwcmV2aW91c1BhZ2UgOiBcIlBhZ2UgcHLDqWPDqWRlbnRlXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBbGxlciBhdSBxdWl6ICFcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbm90Rm91bmQ6IFwiTCd1dGlsaXNhdGV1ciBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE5hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ci5cIixcbiAgICBuZWVkTm90VG9vTG9uZ05hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ciBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSA3MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIG5lZWRVbmlxdWVFbWFpbDogXCJMJ2FkcmVzc2UgZS1tYWlsIHF1ZSB2b3VzIGF2ZXogc2Fpc2llIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBhciB1biBhdXRyZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkTm90VG9vTG9uZ0VtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB1bmUgYWRyZXNzZSBlLW1haWwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UuXCIsXG4gICAgbmVlZExvbmdQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UgZCdhdSBtb2lucyBNSU5fTEVOR1RIIGNhcmFjdMOocmVzLlwiLFxuICAgIHBhc3N3b3JkQ29waWVkOiBcIkxlIG1vdCBkZSBwYXNzZSBnw6luw6lyw6kgYSDDqXTDqSBjb3Bpw6kgZGFucyBsZSBwcmVzc2UtcGFwaWVyLiBWb3VzIHBvdXZleiBsZSByZWNvcGllciBvw7kgdm91cyBsZSBzb3VoYWl0ZXIuXCIsXG4gICAgbmVlZFN0YXR1cyA6IFwiSWwgbWFucXVlIGxlIHN0YXR1dC5cIixcbiAgICBuZWVkTGFuZ3VhZ2UgOiBcIklsIG1hbnF1ZSBsZSBjb2RlIGxhbmd1ZS5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZEtub3dOZXdzbGV0dGVyT2sgOiBcIklsIGZhdXQgc2F2b2lyIHNpIGwndXRpbGlzYXRldXIgYWNjZXB0ZSBvdSByZWZ1c2UgZGUgcmVjZXZvaXIgbGEgbmV3c2xldHRlci5cIixcbiAgICBuZWVkVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgY29ubmHDrnRyZSBsZSBub21icmUgZGUgbWludXRlcyBkdSBkw6ljYWxhZ2UgaG9yYWlyZS5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkVUdDT2sgOiBcIlZvdXMgZGV2ZXogYWNjZXB0ZXIgbGVzIENHVSBwb3VyIHBvdXZvaXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS4gXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdmFsaWRlIHRyb3V2w6kgcG91ciBjZSBjb2RlIHBhcnJhaW4uXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgcGFycmFpbiBhIGJpZW4gw6l0w6kgdHJvdXbDqSAhXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvdHJlIGNvbXB0ZVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvdHJlIGNvbXB0ZSwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aC48L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgdmllbnQgYmllbiBkJ8OqdHJlIHZhbGlkw6kuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPlZvdXMgcG91dmV6IHNhbnMgdGFyZGVyIHZvdXMgY29ubmVjdGVyIGNpLWRlc3NvdXMgcG91ciBhY2PDqWRlciDDoCB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VBZG1pbjogXCJMZSBjb21wdGUgYSBiaWVuIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbjogXCJDZSBjb21wdGUgYSBkw6lqw6Agw6l0w6kgdmFsaWTDqS5cIixcbiAgICBtYWlsV2VsY29tZVN1YmplY3QgOiBcIkJpZW52ZW51ZSAhXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlclN1YmplY3QgOiBcIk1lcmNpICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIGJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBuZSBzZW1ibGUgcGFzIHZhbGlkZSBvdSBiaWVuIGlsIGEgZXhwaXLDqS4gVm91cyBwb3V2ZXogZW4gcmVjZXZvaXIgdW4gbm91dmVhdSA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIGVtYWlsTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdHJvdXbDqSBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIGFscmVhZHlDb25uZWN0ZWQ6IFwiVm91cyDDqnRlcyBkw6lqw6AgY29ubmVjdMOpKGUpIGF1IHNpdGUgIVwiLFxuICAgIG5lZWRCZUNvbm5lY3RlZDogXCJWb3VzIGRldmV6IMOqdHJlIGNvbm5lY3TDqShlKSBwb3VyIGFjY8OpZGVyIMOgIGNldHRlIHBhZ2UuXCIsXG4gICAgY29ubmVjdGlvbk9rOiBcIkNvbm5leGlvbiByw6l1c3NpZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkYXRpb25Ub0xvZ2luIDogXCJWb3VzIGRldmV6IGQnYWJvcmQgdmFsaWRlciB2b3RyZSBjb21wdGUgYXZhbnQgZGUgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgdG9vTWFueUxvZ2luRmFpbHMgOiBcIlRyb3AgZGUgdGVudGF0aXZlcyBkZSBjb25uZXhpb24gaW5mcnVjdHVldXNlcyBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLiBWb3VzIGRldmV6IGF0dGVuZHJlIE1JTlVURVMgbWludXRlcyBwb3VyIGVzc2F5ZXIgZGUgbm91dmVhdS5cIixcbiAgICBiYWRQYXNzd29yZDogXCJMZSBtb3QgZGUgcGFzc2Ugbidlc3QgcGFzIGxlIGJvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rU3ViamVjdCA6IFwiVm90cmUgbGllbiBkZSBjb25uZXhpb24uXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOiBMSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPjxwPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5WYWxpZGVyLjwvYT48L3A+XCIsXG4gICAgbWFpbExvZ2luTGlua01lc3NhZ2UgOiBcIlVuIGxpZW4gZGUgY29ubmV4aW9uIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSBlLW1haWwuIE5lIHRhcmRleiBwYXMgw6AgbCd1dGlsaXNlciwgY2FyIGlsIG4nZXN0IHZhbGFibGUgcXVlIGR1cmFudCBcIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIlZvcyBpbmZvcm1hdGlvbnMgb250IGJpZW4gw6l0w6kgbWlzZXMgw6Agam91ci5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llIGNhciBlbGxlIG4nYSBwYXMgdW5lIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkVW5pcXVlRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgc2Fpc2llIChORVdfRU1BSUwpIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gYXV0cmUgY29tcHRlLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpblN1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cy5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZTogXCJDZXBlbmRhbnQsIHZvdXMgYXZleiBtb2RpZmnDqSBhdSBtb2lucyB1biBkZSB2b3MgaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiAoZW1haWwgZXQvb3UgbW90IGRlIHBhc3NlKSBldCA8Yj52b3VzIGRldmV6IGNsaXF1ZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmVzIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgKE5FV19FTUFJTCkgcG91ciB2YWxpZGVyIGNlIGNoYW5nZW1lbnQ8L2I+LiBFbiBhdHRlbmRhbnQsIG1lcmNpIGRlIGNvbnRpbnVlciDDoCB1dGlsaXNlciB2b3MgYW5jaWVucyBpZGVudGlmaWFudHMuXCIsXG4gICAgdXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyOiBcIkwndXRpbGlzYXRldXIgcXVlIHZvdXMgc291aGFpdMOpIG1vZGlmaWVyIG4nZXhpc3RlIHBhcy9wbHVzIG91IG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIgOiBcIk1haXMgbGUgbm91dmVhdSBjb2RlIHBhcnJhaW4gbidhIHB1IMOqdHJlIHJldGVudSwgY2FyIGlsIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG91IMOgIGwndXRpbGlzYXRldXIgbHVpLW3Dqm1lLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZTogXCJMYSBtaXNlIMOgIGpvdXIgZGUgdm9zIGlkZW50aWZpYW50cyBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIHVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCA6IFwiTCdpZGVudGlmaWFudCBmb3VybmkgcG91ciBsZSBwYXJyYWluIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gdXRpbGlzYXRldXIuXCIsXG4gICAgY3JlYXRpb25Pa01lc3NhZ2U6IFwiTGUgbm91dmVsIHV0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqS5cIixcbiAgICBtYWlsRGVsZXRlU3ViamVjdCA6IFwiQ29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxEZWxldGVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBzdXBwcmVzc2lvbiBuJ2VzdCBwYXMgdmFsaWRlIG91IGFsb3JzIGlsIG4nZXN0IHBsdXMgdmFsYWJsZS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsXG4gICAgaW5mb3NVc2VyRm9yQWRtaW46IFwiQ2V0IHV0aWxpc2F0ZXVyIChpZDogSURfVVNFUikgYSA8Yj5jcsOpw6kgc29uIGNvbXB0ZSBsZSBEQVRFX0NSRUE8L2I+LCBsYSBkZXJuacOocmUgbWlzZSDDoCBqb3VyIGRhdGFudCBkdSBEQVRFX1VQREFURS48YnI+PGI+RGF0ZSBkZSBzYSBkZXJuacOocmUgY29ubmV4aW9uIDogREFURV9DT05ORUNUSU9OLjwvYj5cIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1aWxzIDogXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vdmlld3Mgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwuanMkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmhtdFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIgfSB9LFxuICAgIF0sXG4gICAgZm9vdExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVS5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NndS5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlYuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3YuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgXSxcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogMTAsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCIsXG4gICAgc2l0ZVNsb2dhbjogXCJDdWx0aXZvbnMgbm90cmUgamFyZGluICFcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgZGUgbm91dmVsbGVzIGNob3Nlcy48YnI+RGVzIGFydGljbGVzIGRlIFdpa2lww6lkaWEgc29udCBzw6lsZWN0aW9ubsOpcyBwb3VyIHZvdXMgZXQgc29udCBzdWl2aXMgZCd1biBxdWl6IHZvdXMgcGVybWV0dGFudCBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUuPGJyPkRlIGpvdXIgZW4gam91ciBkZSBub3V2ZWxsZXMgZ3JhaW5lcyBkZSBzYXZvaXIgc29udCBhaW5zaSBzZW3DqWVzIGRhbnMgdm90cmUgXFxcImphcmRpblxcXCIuXCIsXG4gICAgaG9tZVRpdGxlMjogXCJMYSBjdWx0dXJlIGVuIGxpYmVydMOpXCIsXG4gICAgaG9tZVAyOiBcIlRvdXQgY29tbWUgc3VyIFdpa2lww6lkaWEgKCopLCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHBhcnRhZ8OpIHN1ciBXaWtpTGVybmkgc29udCBsaWJyZXMuPGJyPlZvdXMgcG91dmV6IGxlcyB1dGlsaXNlciwgbGVzIG1vZGlmaWVyIGV0IGxlcyBkaWZmdXNlciBzZWxvbiB2b3RyZSBzb3VoYWl0Ljxicj5TdXIgV2lraUxlcm5pLCBwYXMgZGUgcHVibGljaXTDqSwgbmkgZGUgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcy48YnI+Vm91cyBwb3V2ZXogdmVuaXIgeSBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLjxicj48YnI+PHNtYWxsPjxlbT4oKikgQmllbiBxdWUgcGFydGFnZWFudCBzZXMgdmFsZXVycywgV2lraUxlcm5pIGVzdCB1biBwcm9qZXQgaW5kw6lwZW5kYW50IGRlIGxhIGZvbmRhdGlvbiBXaWtpcMOpZGlhLjwvZW0+PC9zbWFsbD5cIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkxlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pXCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNJbnRybzogXCJMaXN0ZSBkZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaS5cIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmkgP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIkxlIHByaW5jaXBlIGVzdCBzaW1wbGUgOiB2b3VzIGNvbW1lbmNleiBwYXIgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6kuPGJyPlB1aXMgdm91cyBhZmZpY2hlciBsZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IGRlIHZvdHJlIGxlY3R1cmUuIFZvdXMgb2J0ZW5leiBhbG9ycyB2b3RyZSByw6lzdWx0YXQgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5Ub3V0ZXMgbGVzIHLDqXBvbnNlcyBzZSB0cm91dmVudCBkYW5zIGwnYXJ0aWNsZSBwcm9wb3PDqSDDoCBsYSBsZWN0dXJlLiA8Yj5Wb3VzIMOqdGVzIGljaSBwb3VyIGFwcHJlbmRyZSBkZSBub3V2ZWxsZXMgY2hvc2VzPC9iPiwgbWFpcyBsaWJyZSDDoCB2b3VzIGQnZXNzYXllciBkJ3kgcsOpcG9uZHJlIGltbcOpZGlhdGVtZW50Ljxicj48YnI+UXVhbmQgbGUgc3VqZXQgcyd5IHByw6p0ZSwgbmUgdm91cyDDqXRvbm5leiBwYXMgc2kgY2VydGFpbmVzIGRlcyByw6lwb25zZXMgcHJvcG9zw6llcyBwZXV2ZW50IMOqdHJlIHVuIHBldSBkw6ljYWzDqWVzLCBhYnN1cmRlcy4uLiBPbiBwZXV0IGFwcHJlbmRyZSBhdmVjIGxlIHNvdXJpcmUsIG5vbiA/IDotKTxicj48YnI+VW5lIGZvaXMgdm90cmUgcsOpc3VsdGF0IG9idGVudSwgaWwgdm91cyBzZXJhIHByb3Bvc8OpIGRlIGNyw6llciB1biBjb21wdGUgcG91ciBsZSBzYXV2ZWdhcmRlci48YnI+Q2UgY29tcHRlIHZvdXMgcGVybWV0dHJhIGRlIHRlc3RlciBkZSBub3V2ZWF1IGNlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgcGx1c2lldXJzIGpvdXJzLCBzZW1haW5lcywgbW9pcy4uLiBFdCBkZSByZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIHN1Z2dlc3Rpb25zIGRlIGxlY3R1cmVzLjxicj48YnI+TWFpcyA8Yj5sYSBjcsOpYXRpb24gZGUgY2UgY29tcHRlIGVzdCBmYWN1bHRhdGl2ZTwvYj4gZXQgPGEgaHJlZj0nL3F1aXpzLycgdGl0bGU9J0xlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyc+dm91cyBwb3V2ZXogcGFyY291cmlyIFdpa2lMZXJuaSBsaWJyZW1lbnQ8L2E+LlwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG59OyIsIi8vIC0tIFBBR0UgUEVSTUVUVEFOVCBERSBWQUxJREVSIExBIENSw4lBVElPTiBERSBTT04gQ09NUFRFXG5cbi8vLyBVbiB0b2tlbiBlc3QgdHJhbnNtaXMgZW4gcGFyYW3DqHRyZSBkZSBsJ1VybC4gSWwgYSB1bmUgdmFsaWRpdMOpIGxpbWl0w6kgZGFucyBsZSB0ZW1wcy5cbi8vLyBTaSBsZSB0b2tlbiBuJ2VzdCBwYXMvcGx1cyB2YWxpZGUsIG9uIHJlZGlyaWdlIGwndXRpbGlzYXRldXIgdmVycyBsYSBwYWdlIGRlIGNvbm5leGlvbiBwb3VyIG9idGVuaXIgdW4gbm91dmVhdSBsaWVuLlxuLy8vIFNpIGxlIHRva2VuIGVzdCBvaywgb24gbCdpbmZvcm1lIHF1ZSB0b3V0IGVzdCBvayBldCBsdWkgcHJvcG9zZSBkZSBzZSBjb25uZWN0ZXIuXG4vLy8gU2kgbCd1dGlsaXNhdGV1ciBhIGTDqWrDoCB1bmUgc2Vzc2lvbiBhY3RpdmUgdmFsaWRlLCBjJ2VzdCBxdSdpbCBhIGTDqWrDoCBjbGlxdcOpIHN1ciBsZSBsaWVuLiBPbiBsZSByZWRpcmlnZSB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsLlxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gdGlyw6lzIGR1IGJhY2tlbmQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5pbXBvcnQgeyBjaGVja1N1YnNjcmliZVRva2VuUm91dGUsIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZXMgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2IH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW1zIH0gZnJvbSBcIi4vdG9vbHMvdXJsLmpzXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24gfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBlc3QgZMOpasOgIGNvbm5lY3TDqSwgcGFzIGxhIHBlaW5lIGQnYWxsZXIgKyBsb2luIDpcbiAgICAgICAgY29uc3QgaXNDb25uZWN0ZWQ9YXdhaXQgY2hlY2tTZXNzaW9uKCk7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLmFscmVhZHlDb25uZWN0ZWQsIGNvbG9yOlwiaW5mb3JtYXRpb25cIiB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjsvLyBsb3JzIGRlIGxhIGNyw6lhdGlvbiwgc2V1bCBsZSBzdGF0dXQgJ3VzZXJcIiBlc3QgcG9zc2libGVcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFzPWdldFVybFBhcmFtcygpO1xuICAgICAgICAgICAgaWYoZGF0YXMgJiYgZGF0YXMudCE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja1N1YnNjcmliZVRva2VuUm91dGUrZGF0YXMudCk7XG4gICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UudXNlcklkICE9IHVuZGVmaW5lZCAmJiByZXNwb25zZS50b2tlbiAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgeyBtZXNzYWdlOiB0eHRVc2Vycy52YWxpZGF0aW9uTWVzc2FnZSwgY29sb3I6XCJzdWNjZXNzXCIgfSk7Ly8gcG91ciBsJ2FmZmljaGVyIHN1ciBsYSBwYWdlIHN1aXZhbnRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdUZW1wbGF0ZS5jb25uZWN0aW9uUGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gNDA0KSAmJiByZXNwb25zZS5lcnJvcnMgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHR4dC5zZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFVzZXJzLmJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZS5yZXBsYWNlKFwiI1VSTFwiLCBjb25maWdUZW1wbGF0ZS5jb25uZWN0aW9uUGFnZSksIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGUpXG4gICAge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgfVxufVxuaW5pdGlhbGlzZSgpO1xuaGVsbG9EZXYoKTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG4gTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IGVzdCBsaXNpYmxlIHN1ciBnaXRsYWIgOiBcXG4gQm9ubmUgbGVjdHVyZSA6LSkgXFxuIFBvdXIgbGVzIHN1Z2dlc3Rpb25zIGQnYW3DqWxpb3JhdGlvbiBvdSBxdWVzdGlvbnMgOiBkZXZAd2lsaWxlcm5pLmNvbSAqKioqXCIpO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlQWNjb3VudExpbmsgPSAoc3RhdHVzLCBjb25maWdUZW1wbGF0ZSkgPT5cbntcbiAgICBjb25zdCBsaW5rPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYWNjb3VudEhlYWRMaW5rXCIpO1xuICAgIGNvbnN0IGhvbWVQYWdlPXN0YXR1cytcIkhvbWVQYWdlXCI7XG4gICAgbGluay5ocmVmPVwiL1wiK2NvbmZpZ1RlbXBsYXRlW2hvbWVQYWdlXTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gcsOpY3Vww6lyYW50IGxlcyBwYXJhbcOodHJlcyBwYXNzw6lzIHBhciBsJ3VybFxuZXhwb3J0IGNvbnN0IGdldFVybFBhcmFtcyA9ICgpID0+XG57XG4gICAgaWYoaXNFbXB0eShsb2NhdGlvbi5zZWFyY2gpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gICAgaWYoIUFycmF5LmlzQXJyYXkocGFyYW1ldGVycykgfHwgcGFyYW1ldGVycy5sZW5ndGg9PT0wKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgIGxldCBwYXJhbSwgZGF0YXM9e307XG4gICAgZm9yKGxldCBpIGluIHBhcmFtZXRlcnMpXG4gICAge1xuICAgICAgICBwYXJhbSA9IHBhcmFtZXRlcnNbaV0uc3BsaXQoXCI9XCIpO1xuICAgICAgICBpZihwYXJhbS5sZW5ndGg9PT0yKVxuICAgICAgICAgICAgZGF0YXNbcGFyYW1bMF1dPWRlY29kZVVSSShwYXJhbVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhcztcbn0iLCJpbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCBzaXRlVXJsLCB0aGVtZSB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5cbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBSw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkZSBjb25maWd1cmF0aW9uIGRlcyB1dGlsaXNhdGV1cnNcbi8vIMOAIHRlcm1lLCB1biBmaWNoaWVyIHN0YXRpcXVlIGltcG9ydGFibGUgY29tbWUgbW9kdWxlIGRldnJhaXQgw6l2aXRlciB1bmUgcmVxdcOqdGUgYWpheFxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9ICBhc3luYyAoKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCtcIi91c2VyL2dldGNvbmZpZ1wiKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKCkgPT5cbntcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmKHRpbWVMb2NhbCA+IHRpbWVEaWZmZXJlbmNlTWF4IHx8IHRpbWVMb2NhbCA8IHRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIE9uIGVubMOodmUgdm9sb250YWlyZW1lbnQgbGVzIDAvTyBwb3VyIMOpdml0ZXIgbGVzIGNvbmZ1c2lvbnMgIVxuLy8gRXQgbWlldXggdmF1dCBhdXNzaSBkw6lidXRlciBldCBmaW5pciBwYXIgdW5lIGxldHRyZSBzaW1wbGUuXG5leHBvcnQgY29uc3QgZ2V0UGFzc3dvcmQgPSAobmJDYXJNaW4sIG5iQ2FyTWF4KSA9Plxue1xuICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICBjb25zdCBsZXR0ZXJzPVwiQUJDREVGR0hJSktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ucHFyc3R1dnd4eXpcIjtcbiAgICBjb25zdCBvdGhlcnM9XCIxMjM0NTY3ODkhPy4qLV8lQCbDicOAw4jDmeKCrCTDgsOKw5vDjlwiO1xuICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIGZvcihsZXQgaT0xO2k8KG5iQ2FyLTEpO2krKylcbiAgICB7XG4gICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgIHBhc3N3b3JkKz1vdGhlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm90aGVycy5sZW5ndGgpXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgfVxuICAgIHBhc3N3b3JkKz1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgIHJldHVybiBwYXNzd29yZDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6XG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja0xvZ2luUm91dGUrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5pc1ZhbGlkICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuaWQ9PT11c2VyLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubmFtZT1yZXNwb25zZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubGFuZ3VhZ2U9cmVzcG9uc2UubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci50aW1lRGlmZmVyZW5jZT1yZXNwb25zZS50aW1lRGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7Ly8gbGUgdG9rZW4gZXQgZGUgdG91dGUgZmHDp29uIHbDqXJpZmllciDDoCBjaGFxdWUgcmVxdcOqdGUgw6AgbCdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwidXNlclwiLCB1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBpbCBzJ2FnaXQgZCd1biBcInVzZXJcIiBldCBxdWUgc29uIGFib25uZW1lbnQgYSBleHBpcsOpLCBqZSBsZSByZWRpcmlnZSB2ZXJzIGxhIGNhaXNzZSA6LSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXM9PT1cInVzZXJcIiAmJiByZXNwb25zZS5uYkRheXNPayA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQWNjb3VudD1zaXRlVXJsK1wiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ1RlbXBsYXRlW2xhbmddLmFjY291bnRQYWdlKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/front/public/JS/unsubscribe.app.js b/front/public/JS/unsubscribe.app.js
new file mode 100644
index 0000000..4a27948
--- /dev/null
+++ b/front/public/JS/unsubscribe.app.js
@@ -0,0 +1,1235 @@
+/******/ (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/unsubscribe.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",
+ senderEmail: "bonjour@wikilerni.com",
+ adminLang: "fr",
+ theme: "default",
+ // 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",
+ beginCodeGodfather: "wikilerni",
+ // 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: 10,
+ // 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",
+ searchAdminQuestionnairesRoute: "/searchadmin",
+ getListNextQuestionnaires: "/getlistnextquestionnaires/",
+ // -- 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: 10,
+ 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
+
+};
+
+/***/ }),
+
+/***/ "../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 ^\\.\\/.*\\/subscription$":
+/*!*******************************************!*\
+ !*** ../lang sync ^\.\/.*\/subscription$ ***!
+ \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var map = {
+ "./fr/subscription": "../lang/fr/subscription.js"
+};
+
+
+function webpackContext(req) {
+ var id = webpackContextResolve(req);
+ return __webpack_require__(id);
+}
+function webpackContextResolve(req) {
+ if(!__webpack_require__.o(map, req)) {
+ var e = new Error("Cannot find module '" + req + "'");
+ e.code = 'MODULE_NOT_FOUND';
+ throw e;
+ }
+ return map[req];
+}
+webpackContext.keys = function webpackContextKeys() {
+ return Object.keys(map);
+};
+webpackContext.resolve = webpackContextResolve;
+module.exports = webpackContext;
+webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/subscription$";
+
+/***/ }),
+
+/***/ "../lang sync recursive ^\\.\\/.*\\/user$":
+/*!***********************************!*\
+ !*** ../lang sync ^\.\/.*\/user$ ***!
+ \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var map = {
+ "./fr/user": "../lang/fr/user.js"
+};
+
+
+function webpackContext(req) {
+ var id = webpackContextResolve(req);
+ return __webpack_require__(id);
+}
+function webpackContextResolve(req) {
+ if(!__webpack_require__.o(map, req)) {
+ var e = new Error("Cannot find module '" + req + "'");
+ e.code = 'MODULE_NOT_FOUND';
+ throw e;
+ }
+ return map[req];
+}
+webpackContext.keys = function webpackContextKeys() {
+ return Object.keys(map);
+};
+webpackContext.resolve = webpackContextResolve;
+module.exports = webpackContext;
+webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$";
+
+/***/ }),
+
+/***/ "../lang/fr/general.js":
+/*!*****************************!*\
+ !*** ../lang/fr/general.js ***!
+ \*****************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ siteHTMLTitle: "WikiLerni : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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/subscription.js":
+/*!**********************************!*\
+ !*** ../lang/fr/subscription.js ***!
+ \**********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ needNumberOfDays: "Il faut un nombre de jours pour l'abonnement.",
+ needIntegerNumberOfDays: "Le nombre de jours de l'abonnement doit être un nombre entier.",
+ needMinNumberOfDays: "Le nombre de jours de l'abonnement ne peut être négatif !",
+ needNotTooLongDaysList: "La liste de jours sélectionnés n'a pas le bon format (trop longue).",
+ needValidDaysList: "La liste de jours sélectionnés n'a pas le bon format. Caractère non valide : ",
+ needUniqueDaysList: "La liste de jours sélectionnés n'a pas le bon format. Doublon : ",
+ needKnowIfNoticeOk: "Il manque l'information sur l'acceptation ou non de recevoir des notifications.",
+ unsubscriptionOk: "Votre demande a bien été prise en compte. Vous ne recevrez plus de messages venant du site, sauf pour vous signaler la fin de votre abonnement. N'hésitez pas à accéder à votre compte pour de nouveau autoriser certains envois.",
+ unsubscriptionFail: "Si vous voyez ce message, c'est que votre lien de désabonnement ne fonctionne pas. Vous pouvez accéder à votre compte pour désactiver les envois manuellement.",
+ allSubscriptionProcessed: "Tous les abonnés ont été traités pour le moment.",
+ mailNewQuestionnaireSubject: "Qu'allez-vous apprendre aujourd'hui ?",
+ mailNewQuestionnaireBodyTxt: "Bonjour USER_NAME,\n\nUn nouveau quiz vient de vous être proposé :\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL",
+ mailNewQuestionnaireBodyHTML: "
",
+ noNewQuestionnaireForUser: "Aucun nouveau questionnaire trouvé pour un abonné : ",
+ mailEndFreeTimeSubject: "Votre abonnement gratuit va expirer",
+ mailEndFreeTimeBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui :\nLINK_URL",
+ mailEndFreeTimeBodyHTML: "
Bonjour USER_NAME,
Votre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours. Pour continuer à utiliser le site, vous pouvez souscrire à un abonnement dès aujourd'hui en cliquez ici sans tarder.
",
+ mailEndFreeTimeMessage: " relances envoyées.",
+ mailExpirationSubject: "Votre abonnement va bientôt expirer",
+ mailExpirationBodyTxt: "Bonjour USER_NAME,\nVotre abonnement gratuit à SITE_NAME va expirer d'ici quelques jours.\nPour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui :\nLINK_URL",
+ mailExpirationBodyHTML: "
Bonjour USER_NAME,
Votre abonnement à SITE_NAME va expirer d'ici quelques jours. Pour continuer à utiliser le site, vous pouvez le prolonger dès aujourd'hui en cliquant ici.
",
+ mailExpirationMessage: "FIRST premières et SECOND deuxièmes relances envoyées pour des abonnements expirant d'ici peu.",
+ infosNbDays: "Votre abonnement est encore valable pendant NB_DAYS jours. Vous pouvez à tout moment prolonger votre abonnement en suivant les indications ci-dessous :",
+ infosExpirated: "Votre abonnement a expiré, mais il vous reste encore quelques jours avant que votre compte et vos données ne soient complètement supprimées. Pour ce faire, suivez sans tarder les indications ci-dessous :",
+ infosNbDaysAdmin: "Cet abonnement est encore valable pendant NB_DAYS jours.",
+ infosExpiratedAdmin: "Cet abonnement a expiré.",
+ isNotValided: "Cet utilisateur n'a pas encore validé son compte. Vous pouvez le faire à sa place en cochant la case indiquée et enregistrant.",
+ infosPaymentsAdmin: "DATE_PAYMENT : paiement de AMOUNT € au nom de CLIENT_NAME."
+};
+
+/***/ }),
+
+/***/ "../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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue ! 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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"
+};
+
+
+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.hmt",
+ 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. 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. 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. Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait. Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles. Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.",
+ 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é. 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.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
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 ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder. 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.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",
+ noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript."
+};
+
+/***/ }),
+
+/***/ "./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, " "); // 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 est lisible sur gitlab : \n Bonne lecture :-) \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() {
+ var timeLocal = new Date().getTimezoneOffset();
+ 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; // le token et de toute façon vérifier à 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[lang].accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate[lang].accountPage); // 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);
+};
+
+/***/ }),
+
+/***/ "./src/unsubscribe.js":
+/*!****************************!*\
+ !*** ./src/unsubscribe.js ***!
+ \****************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
+/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_5__ = __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); }); }; }
+
+// -- GESTION DE LA PAGE PERMETTANT DE SE DÉBONNER DE TOUS LES ENVOIS
+/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. Si le token est ok, il n'est pas nécessaire d'être connecté.
+/// Dans le cas où il n'est plus valide, on peut proposer à l'utilisateur de se connecter à son compte pour se désabonner.
+/// Si le token est ok, on valide enregistrement le désabonnement et affiche un message de confirmation
+// Fichier de configuration côté client :
+
+var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
+
+var configFrontEnd = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Importation des fonctions utile au script :
+
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general");
+
+var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user");
+
+var txtSubscriptions = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/subscription$")("./" + lang + "/subscription");
+
+var divResponse = document.getElementById("response");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
+var config;
+
+var initialise = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var 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_5__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+ if (!config) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);else {
+ datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_4__["getUrlParams"])();
+
+ if (datas && datas.t !== undefined) {
+ xhr = new XMLHttpRequest();
+ xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + config.userRoutes + config.unsubscribeRoute + datas.t);
+
+ xhr.onreadystatechange = function () {
+ if (this.readyState == XMLHttpRequest.DONE) {
+ var response = JSON.parse(this.responseText);
+ if (this.status === 200 && response.message != undefined) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message.replace("#URL", configFrontEnd.accountPage), "", ["success"]);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txtSubscriptions.unsubscriptionFail.replace("#URL", configFrontEnd.accountPage), "", ["error"]);
+ }
+ };
+
+ xhr.send();
+ }
+ }
+ _context.next = 10;
+ break;
+
+ case 7:
+ _context.prev = 7;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+
+ case 10:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 7]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3N1YnNjcmlwdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC91c2VyJCIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9nZW5lcmFsLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci91c2VyLmpzIiwid2VicGFjazovLy8uLi90b29scy9tYWluLmpzIiwid2VicGFjazovLy8uLi92aWV3cyBzeW5jIF5cXC5cXC8uKlxcLmpzJCIsIndlYnBhY2s6Ly8vLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXJsLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdW5zdWJzY3JpYmUuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJudW1iZXJOZXdRdWVzdGlvbm5haXJlQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwibmJJbGx1c3RyYXRpb25zTWluIiwibmJJbGx1c3RyYXRpb25zTWF4IiwibWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4IiwiaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHgiLCJuYkxpbmtzTWluIiwibmJMaW5rc01heCIsInBhc3N3b3JkIiwibWlubGVuZ3RoIiwiZGlyQ2FjaGVVc2VycyIsImRpckNhY2hlVXNlcnNBbnN3ZXJzIiwiZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyIsImRpckNhY2hlUXVlc3Rpb25zIiwiZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIiwiZGlySFRNTFF1ZXN0aW9ubmFpcmUiLCJkaXJXZWJRdWVzdGlvbm5haXJlIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwicXVlc3Rpb25zUm91dGUiLCJ0YWdzU2VhcmNoUm91dGUiLCJnZXRRdWVzdGlvbm5haXJlc1dpdGhvdXRBbnN3ZXIiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJnZXRBZG1pblN0YXRzIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwiZGlyQ2FjaGVUYWdzIiwiZGlySFRNTFRhZ3MiLCJkaXJXZWJUYWdzIiwidXNlclJvdXRlcyIsInN1YnNjcmliZVJvdXRlIiwiZ2V0R29kZmF0aGVyUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrU3Vic2NyaWJlVG9rZW5Sb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNvbm5lY3Rpb25Sb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJnZXRVc2VySW5mb3MiLCJjcmVhdGVVc2VyUm91dGUiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInNlYXJjaFVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja0RlbGV0ZUxpbmtSb3V0ZSIsImdldFBheW1lbnRzIiwidW5zdWJzY3JpYmVSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4Iiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJuZWVkTnVtYmVyT2ZEYXlzIiwibmVlZEludGVnZXJOdW1iZXJPZkRheXMiLCJuZWVkTWluTnVtYmVyT2ZEYXlzIiwibmVlZE5vdFRvb0xvbmdEYXlzTGlzdCIsIm5lZWRWYWxpZERheXNMaXN0IiwibmVlZFVuaXF1ZURheXNMaXN0IiwibmVlZEtub3dJZk5vdGljZU9rIiwidW5zdWJzY3JpcHRpb25PayIsInVuc3Vic2NyaXB0aW9uRmFpbCIsImFsbFN1YnNjcmlwdGlvblByb2Nlc3NlZCIsIm1haWxOZXdRdWVzdGlvbm5haXJlU3ViamVjdCIsIm1haWxOZXdRdWVzdGlvbm5haXJlQm9keVR4dCIsIm1haWxOZXdRdWVzdGlvbm5haXJlQm9keUhUTUwiLCJub05ld1F1ZXN0aW9ubmFpcmVGb3JVc2VyIiwibWFpbEVuZEZyZWVUaW1lU3ViamVjdCIsIm1haWxFbmRGcmVlVGltZUJvZHlUeHQiLCJtYWlsRW5kRnJlZVRpbWVCb2R5SFRNTCIsIm1haWxFbmRGcmVlVGltZU1lc3NhZ2UiLCJtYWlsRXhwaXJhdGlvblN1YmplY3QiLCJtYWlsRXhwaXJhdGlvbkJvZHlUeHQiLCJtYWlsRXhwaXJhdGlvbkJvZHlIVE1MIiwibWFpbEV4cGlyYXRpb25NZXNzYWdlIiwiaW5mb3NOYkRheXMiLCJpbmZvc0V4cGlyYXRlZCIsImluZm9zTmJEYXlzQWRtaW4iLCJpbmZvc0V4cGlyYXRlZEFkbWluIiwiaXNOb3RWYWxpZGVkIiwiaW5mb3NQYXltZW50c0FkbWluIiwibm90Rm91bmQiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWRFbWFpbCIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkTG9uZ1Bhc3NXb3JkIiwicGFzc3dvcmRDb3BpZWQiLCJuZWVkU3RhdHVzIiwibmVlZExhbmd1YWdlIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkVGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkVUdDT2siLCJnb2RmYXRoZXJOb3RGb3VuZCIsImdvZGZhdGhlckZvdW5kIiwibWFpbFZhbGlkYXRpb25NZXNzYWdlIiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJtYWlsV2VsY29tZVN1YmplY3QiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJhbHJlYWR5Q29ubmVjdGVkIiwibmVlZEJlQ29ubmVjdGVkIiwiY29ubmVjdGlvbk9rIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZFZhbGlkYXRpb25Ub0xvZ2luIiwidG9vTWFueUxvZ2luRmFpbHMiLCJiYWRQYXNzd29yZCIsIm1haWxMb2dpbkxpbmtTdWJqZWN0IiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rQm9keUhUTUwiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWRPa01lc3NhZ2UiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJtYWlsVXBkYXRlTG9naW5TdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIiLCJtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2UiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJjcmVhdGlvbk9rTWVzc2FnZSIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlTGlua01lc3NhZ2UiLCJkZWxldGVGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZSIsIm1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2UiLCJjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlIiwiZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2UiLCJ3ZWxjb21lTWVzc2FnZSIsImJ5ZWJ5ZU1lc3NhZ2UiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwiam9pbiIsInJlcGxhY2UiLCJtYXRjaGVkIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsInJhbmRvbSIsImRhdGVTdHJpbmciLCJsYW5nIiwibXlEYXRlIiwiRGF0ZSIsIm15RGF5IiwiZ2V0RGF0ZSIsIm15TW91bnRoIiwiZ2V0TW9udGgiLCJteVllYXIiLCJnZXRGdWxsWWVhciIsImhlYWRMaW5rcyIsImFuY2hvciIsImF0dHJpYnV0ZXMiLCJocmVmIiwiaWQiLCJmb290TGlua3MiLCJyZWwiLCJtYXhRdWVzdGlvbm5haXJlc0J5UGFnZSIsInVzZXJIb21lUGFnZSIsImFkbWluSG9tZVBhZ2UiLCJtYW5hZ2VySG9tZVBhZ2UiLCJzdWJzY3JpYmVQYWdlIiwiY29ubmVjdGlvblBhZ2UiLCJhY2NvdW50UGFnZSIsInF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2UiLCJ1c2Vyc01hbmFnZW1lbnRQYWdlIiwibmJRdWVzdGlvbm5haXJlc1VzZXJIb21lUGFnZSIsImlsbHVzdHJhdGlvbkRpciIsInNpdGVTbG9nYW4iLCJob21lVGl0bGUxIiwiaG9tZVAxIiwiaG9tZVRpdGxlMiIsImhvbWVQMiIsIm5ld1F1ZXN0aW9ubmFpcmVzVGl0bGUiLCJuZXdRdWVzdGlvbm5haXJlc0ludHJvIiwiZXhwbGFuYXRpb25UaXRsZSIsImV4cGxhbmF0aW9uVHh0Iiwibm9KU05vdGlmaWNhdGlvbiIsInNhdmVMb2NhbHkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRMb2NhbHkiLCJqc29uIiwicGFyc2UiLCJnZXRJdGVtIiwicmVtb3ZlTG9jYWx5IiwicmVtb3ZlSXRlbSIsImFkZEVsZW1lbnQiLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsIkFycmF5IiwiaXNBcnJheSIsImkiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJzZXRBdHRyaWJ1dGUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImhlbGxvRGV2IiwiY29uc29sZSIsImxvZyIsInVwZGF0ZUFjY291bnRMaW5rIiwic3RhdHVzIiwiY29uZmlnVGVtcGxhdGUiLCJsaW5rIiwiZ2V0RWxlbWVudEJ5SWQiLCJob21lUGFnZSIsImdldFVybFBhcmFtcyIsImxvY2F0aW9uIiwic2VhcmNoIiwicGFyYW1ldGVycyIsInNwbGl0IiwicGFyYW0iLCJkYXRhcyIsImRlY29kZVVSSSIsImdldENvbmZpZyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25sb2FkIiwicmVzcG9uc2VUZXh0Iiwib25lcnJvciIsInN0YXR1c1RleHQiLCJzZW5kIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsImdldFBhc3N3b3JkIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJ0b2tlbiIsImR1cmF0aW9uVFMiLCJzdG9yYWdlVXNlciIsImR1cmF0aW9uIiwiY2hlY2tBbnN3ZXJEYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwiUXVlc3Rpb25uYWlyZUlkIiwibmJRdWVzdGlvbnMiLCJjaGVja1Nlc3Npb24iLCJ1cmxSZWRpcmVjdGlvbiIsIm1lc3NhZ2UiLCJ1cmxXYW50ZWQiLCJ1c2VyRGF0YXMiLCJyZWRpcmVjdFVzZXIiLCJ1c2VyIiwibm93IiwicmVzcG9uc2UiLCJpc1ZhbGlkIiwibGFuZ3VhZ2UiLCJ0aW1lRGlmZmVyZW5jZSIsIm5iRGF5c09rIiwidXJsQWNjb3VudCIsIndpbmRvdyIsImluZGV4T2YiLCJhc3NpZ24iLCJjb25maWdGcm9udEVuZCIsInR4dCIsInR4dFVzZXJzIiwidHh0U3Vic2NyaXB0aW9ucyIsImRpdlJlc3BvbnNlIiwiY29uZmlnIiwiaW5pdGlhbGlzZSIsInQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1C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QUFDckYsSUFBSSxDQUFDSSxLQUFMLENBQVcsS0FBS2dELFlBQWhCLENBQWI7QUFDQSx3QkFBSSxLQUFLckIsTUFBTCxLQUFnQixHQUFoQixJQUF1QnNELFFBQVEsQ0FBQ04sT0FBVCxJQUFvQjVJLFNBQS9DLEVBQ0lxRSxnRUFBVSxDQUFDMEYsV0FBRCxFQUFjLEdBQWQsRUFBbUJiLFFBQVEsQ0FBQ04sT0FBVCxDQUFpQi9ILE9BQWpCLENBQXlCLE1BQXpCLEVBQWlDOEksY0FBYyxDQUFDakgsV0FBaEQsQ0FBbkIsRUFBaUYsRUFBakYsRUFBcUYsQ0FBQyxTQUFELENBQXJGLENBQVYsQ0FESixLQUdJMkIsZ0VBQVUsQ0FBQzBGLFdBQUQsRUFBYyxHQUFkLEVBQW1CRCxnQkFBZ0IsQ0FBQy9QLGtCQUFqQixDQUFvQzhHLE9BQXBDLENBQTRDLE1BQTVDLEVBQW9EOEksY0FBYyxDQUFDakgsV0FBbkUsQ0FBbkIsRUFBb0csRUFBcEcsRUFBd0csQ0FBQyxPQUFELENBQXhHLENBQVY7QUFDUDtBQUNKLGlCQVZEOztBQVdBbUUsbUJBQUcsQ0FBQ08sSUFBSjtBQUNIO0FBQ0o7QUEzQlU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUErQlgvQyw0RUFBVSxDQUFDMEYsV0FBRCxFQUFjLEdBQWQsRUFBbUJILEdBQUcsQ0FBQzNSLFdBQXZCLEVBQW9DLEVBQXBDLEVBQXdDLENBQUMsT0FBRCxDQUF4QyxDQUFWOztBQS9CVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFIOztBQUFBLGtCQUFWZ1MsVUFBVTtBQUFBO0FBQUE7QUFBQSxHQUFoQjs7QUFrQ0FBLFVBQVUsRyIsImZpbGUiOiIuL0pTL3Vuc3Vic2NyaWJlLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL3Vuc3Vic2NyaWJlLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBzZW5kZXJFbWFpbDogXCJib25qb3VyQHdpa2lsZXJuaS5jb21cIixcbiAgICBhZG1pbkxhbmc6IFwiZnJcIixcbiAgICB0aGVtZTogXCJkZWZhdWx0XCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmlcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwid2lraWxlcm5pXCIsIC8vIGNhc2Utc2Vuc2l0aXZlIGFuZCBjYW4ndCBjb250YWluIFwiQFwiICFcbiAgICBjcm9uVGltaW5nQWxlcnRJblNlY29uZGU6IDEyMCwgLy8gZm9yIGxvZ3NcbiAgICByZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAzLCAvLyBpZGVtXG4gICAgdG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnM6IFwiNDhoXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZWl0L21zXG4gICAgdG9rZW5Mb2dpbkxpbmtUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWluVGltZUluSG91cnM6IFwiMjRoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NYXhUaW1lSW5EYXlzOiBcIjE4MCBkYXlzXCIsXG4gICAgdG9rZW5Mb2dpbkNoYW5naW5nVGltZUluSG91cnM6IFwiMWhcIiwvLyBmb3IgZW1haWwgJiBwYXNzd29yZCBjaGFuZ2luZ1xuICAgIHRva2VuRGVsZXRlVXNlclRpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5VbnN1YnNjcmliZUxpbmtUaW1lSW5EYXlzOiBcIjcgZGF5c1wiLCAvLyB0b2tlbiBzZW5kIHdpdGggc3Vic2NyaXB0aW9uJ3MgZW1haWxzXG4gICAgZnJlZUFjY291bnRUaW1pbmdJbkRheXM6IDEwLFxuICAgIGZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5czogNSxcbiAgICBhY2NvdW50RXhwaXJhdGlvbkZpcnN0Tm90aWZpY2F0aW9uSW5EYXlzOiAxNCwgICAgXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDUsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMTAsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTAsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjEsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyNCwgLy8gaWRlbVxuICAgIG51bWJlck5ld1F1ZXN0aW9ubmFpcmVBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIG1hc3MgbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIC8vIElsbHVzdHJhdGlvbnM6XG4gICAgbmJJbGx1c3RyYXRpb25zTWluOiAwLFxuICAgIG5iSWxsdXN0cmF0aW9uc01heDogMSxcbiAgICBtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldDogMTAwMDAwMCwvLyBwYXMgY29udHLDtGzDqSBwb3VyIGwnaW5zdGFudC4gw4AgcmV2b2lyLlxuICAgIG1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbjogWyBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIiwgXCJpbWFnZS9wbmdcIiBdLFxuICAgIC8vIC0tIFVwbG9hZCBhbmQgcmVzaXplOlxuICAgIGlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHg6IDQwMCxcbiAgICBpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeDogMjAwLFxuICAgIC8vIExpbmtzOlxuICAgIG5iTGlua3NNaW46IDEsXG4gICAgbmJMaW5rc01heDogMSxcbiAgICAvLyDDoCBzdXBwcmltZXIgcXVhbmQgdG91cyBsZXMgXCJyZXF1aXJlXCIgw6Agam91cjpcbiAgICBuYlF1ZXN0aW9uc01pbjogcXVlc3Rpb25uYWlyZXMubmJRdWVzdGlvbnNNaW4sXG4gICAgbmJRdWVzdGlvbnNNYXg6IHF1ZXN0aW9ubmFpcmVzLm5iUXVlc3Rpb25zTWF4LFxuICAgIG5iQ2hvaWNlc01heDogcXVlc3Rpb25uYWlyZXMubmJDaG9pY2VzTWF4LFxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmU6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxueyAgICBcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgcXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVlc3Rpb25uYWlyZVwiLFxuICAgIGdldFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL2dldFwiLFxuICAgIHByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9wcmV2aWV3XCIsXG4gICAgcHVibGlzaGVkUXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcXVpei9cIixcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsXG4gICAgZ2V0U3RhdHNRdWVzdGlvbm5haXJlcyA6IFwiL3N0YXRzL1wiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hcIixcbiAgICBzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUgOiBcIi9zZWFyY2hhZG1pblwiLFxuICAgIGdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXM6IFwiL2dldGxpc3RuZXh0cXVlc3Rpb25uYWlyZXMvXCIsXG4gICAgLy8gLS0gcXVlc3Rpb25zICYgY2hvaWNlcyA6XG4gICAgcXVlc3Rpb25zUm91dGU6IFwiL3F1ZXN0aW9uL1wiLFxuICAgIC8vIC0tIHRhZ3MgOlxuICAgIHRhZ3NTZWFyY2hSb3V0ZTogXCIvdGFncy9zZWFyY2gvXCIsXG4gICAgLy8gLS0gYW5zd2VycyA6XG4gICAgZ2V0UXVlc3Rpb25uYWlyZXNXaXRob3V0QW5zd2VyOiBcIi93aXRob3V0YW5zd2VyL3VzZXIvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIixcbiAgICBnZXRBZG1pblN0YXRzOiBcIi9nZXRhZG1pbnN0YXRzL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIHZpZGVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgUXVlc3Rpb24gOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgcmFuazogeyByZXF1aXJlZDogdHJ1ZSwgbWluOjEsIGRlZmF1bHRWYWx1ZToxIH1cbiAgICB9LCAgICAgICAgICBcbiAgICBDaG9pY2UgOlxuICAgIHtcbiAgICAgICAgdGV4dDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfVxuICAgIH0sICAgICAgICAgIFxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAxMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIG5iVGFnc01pbjogMCxcbiAgICBuYlRhZ3NNYXg6IDAsIC8vIDAgPSBub3QgbWF4ICAgIFxuICAgIC8vIEpTT04gYW5kIEhUTUwgZGlyXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIGRpckNhY2hlVGFncyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvdGFnc1wiLCAgXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmUgOiBcImZyb250L3B1YmxpYy9xdWl6XCIsXG4gICAgZGlySFRNTFRhZ3MgOiBcImZyb250L3B1YmxpYy9xdWl6c1wiLFxuICAgIGRpcldlYlF1ZXN0aW9ubmFpcmUgOiBcInF1aXpcIiwvL3BvdXIgdXJsIHBhZ2VcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6c1wiLy8gaWRlbVxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHVzZXJSb3V0ZXM6IFwiL3VzZXJcIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgZ2V0R29kZmF0aGVyUm91dGU6IFwiL2dldGdvZGZhdGhlcmlkXCIsXG4gICAgY2hlY2tJZklzRW1haWxmcmVlUm91dGU6IFwiL2lzZW1haWxmcmVlXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjb25uZWN0aW9uUm91dGU6IFwiL2xvZ2luXCIsXG4gICAgZ2V0TG9naW5MaW5rUm91dGU6IFwiL2dldGxvZ2lubGlua1wiLFxuICAgIGNvbm5lY3Rpb25XaXRoTGlua1JvdXRlOiBcIi9jaGVja2xvZ2lubGlua1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGNyZWF0ZVVzZXJSb3V0ZTogXCIvY3JlYXRlXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIHVwZGF0ZVVzZXJJbmZvczogXCIvbW9kaWZ5L1wiLFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIGdldEdvZENoaWxkczogXCIvZ2V0Z29kY2hpbGRzL1wiLFxuICAgIGNoZWNrTmV3TG9naW5MaW5rUm91dGU6IFwiL2NvbmZpcm1uZXdsb2dpbi9cIixcbiAgICBjaGVja0RlbGV0ZUxpbmtSb3V0ZTogXCIvY29uZmlybWRlbGV0ZS9cIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIHVuc3Vic2NyaWJlUm91dGU6IFwiL3N1YnNjcmlwdGlvbi9zdG9wL1wiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgLy8gZm9ybXMgOiDDoCBjb21wbMOpdGVyIGF2ZWMgdmFsZXVycyBwYXIgZMOpZmF1dCwgZXRjLiBjZiBtb2TDqGxlXG4gICAgbmFtZTogeyBtYXhsZW5ndGg6IDcwLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGVtYWlsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyLCByZXF1aXJlZDogdHJ1ZSB9LCAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iY3J5cHQjc2VjdXJpdHktaXNzdWVzLWFuZC1jb25jZXJuc1xuICAgIG5ld1Bhc3N3b3JkOiB7IG1pbmxlbmd0aDogOCwgbWF4bGVuZ3RoOjcyIH0sXG4gICAgY29kZUdvZGZhdGhlcjogeyBtYXhsZW5ndGg6IDI1NSB9LFxuICAgIGNndU9rOiB7IHZhbHVlOiBcInRydWVcIiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDo4NDAsXG4gICAgLy8gSlNPTiBkaXJcbiAgICBkaXJDYWNoZVVzZXJzIDogXCJkYXRhcy91c2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlcy9hbnN3ZXJzXCJcbn07XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvZ2VuZXJhbFwiOiBcIi4uL2xhbmcvZnIvZ2VuZXJhbC5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2dlbmVyYWwkXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3N1YnNjcmlwdGlvblwiOiBcIi4uL2xhbmcvZnIvc3Vic2NyaXB0aW9uLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvc3Vic2NyaXB0aW9uJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBuZWVkTnVtYmVyT2ZEYXlzIDogXCJJbCBmYXV0IHVuIG5vbWJyZSBkZSBqb3VycyBwb3VyIGwnYWJvbm5lbWVudC5cIixcbiAgICBuZWVkSW50ZWdlck51bWJlck9mRGF5cyA6IFwiTGUgbm9tYnJlIGRlIGpvdXJzIGRlIGwnYWJvbm5lbWVudCBkb2l0IMOqdHJlIHVuIG5vbWJyZSBlbnRpZXIuXCIsXG4gICAgbmVlZE1pbk51bWJlck9mRGF5cyA6IFwiTGUgbm9tYnJlIGRlIGpvdXJzIGRlIGwnYWJvbm5lbWVudCBuZSBwZXV0IMOqdHJlIG7DqWdhdGlmICFcIixcbiAgICBuZWVkTm90VG9vTG9uZ0RheXNMaXN0IDogXCJMYSBsaXN0ZSBkZSBqb3VycyBzw6lsZWN0aW9ubsOpcyBuJ2EgcGFzIGxlIGJvbiBmb3JtYXQgKHRyb3AgbG9uZ3VlKS5cIixcbiAgICBuZWVkVmFsaWREYXlzTGlzdCA6IFwiTGEgbGlzdGUgZGUgam91cnMgc8OpbGVjdGlvbm7DqXMgbidhIHBhcyBsZSBib24gZm9ybWF0LiBDYXJhY3TDqHJlIG5vbiB2YWxpZGUgOiBcIixcbiAgICBuZWVkVW5pcXVlRGF5c0xpc3QgOiBcIkxhIGxpc3RlIGRlIGpvdXJzIHPDqWxlY3Rpb25uw6lzIG4nYSBwYXMgbGUgYm9uIGZvcm1hdC4gRG91YmxvbiA6IFwiLFxuICAgIG5lZWRLbm93SWZOb3RpY2VPayA6IFwiSWwgbWFucXVlIGwnaW5mb3JtYXRpb24gc3VyIGwnYWNjZXB0YXRpb24gb3Ugbm9uIGRlIHJlY2V2b2lyIGRlcyBub3RpZmljYXRpb25zLlwiLFxuICAgIHVuc3Vic2NyaXB0aW9uT2sgOiBcIlZvdHJlIGRlbWFuZGUgYSBiaWVuIMOpdMOpIHByaXNlIGVuIGNvbXB0ZS4gVm91cyBuZSByZWNldnJleiBwbHVzIGRlIG1lc3NhZ2VzIHZlbmFudCBkdSBzaXRlLCBzYXVmIHBvdXIgdm91cyBzaWduYWxlciBsYSBmaW4gZGUgdm90cmUgYWJvbm5lbWVudC48YnI+Tidow6lzaXRleiBwYXMgPGEgaHJlZj0nLyNVUkwnPsOgIGFjY8OpZGVyIMOgIHZvdHJlIGNvbXB0ZTwvYT4gcG91ciBkZSBub3V2ZWF1IGF1dG9yaXNlciBjZXJ0YWlucyBlbnZvaXMuXCIsXG4gICAgdW5zdWJzY3JpcHRpb25GYWlsIDogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBsaWVuIGRlIGTDqXNhYm9ubmVtZW50IG5lIGZvbmN0aW9ubmUgcGFzLjxicj5Wb3VzIHBvdXZleiA8YSBocmVmPScvI1VSTCc+YWNjw6lkZXIgw6Agdm90cmUgY29tcHRlPC9hPiBwb3VyIGTDqXNhY3RpdmVyIGxlcyBlbnZvaXMgbWFudWVsbGVtZW50LlwiLFxuICAgIGFsbFN1YnNjcmlwdGlvblByb2Nlc3NlZCA6IFwiVG91cyBsZXMgYWJvbm7DqXMgb250IMOpdMOpIHRyYWl0w6lzIHBvdXIgbGUgbW9tZW50LlwiLFxuICAgIG1haWxOZXdRdWVzdGlvbm5haXJlU3ViamVjdCA6IFwiUXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIG1haWxOZXdRdWVzdGlvbm5haXJlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuXFxuVW4gbm91dmVhdSBxdWl6IHZpZW50IGRlIHZvdXMgw6p0cmUgcHJvcG9zw6kgOlxcblFVRVNUSU9OTkFJUkVfVVJMXFxuXFxuQm9ubmUgbGVjdHVyZSAhXFxuXFxuU3RvcHBlciBsZXMgZW52b2lzID9cXG5VTlNVQlNDUklCRV9VUkxcIixcbiAgICBtYWlsTmV3UXVlc3Rpb25uYWlyZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz5NQUlMX0lOVFJPRFVDVElPTjx1bD48bGk+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiIHRpdGxlPVxcXCJMSU5LX1RJVExFXFxcIj5MaXJlIGwnYXJ0aWNsZS48L2E+PC9saT48bGk+PGEgaHJlZj1cXFwiUVVFU1RJT05OQUlSRV9VUkxcXFwiPkFsbGV6IGF1IHF1aXouPC9hPjwvbGk+PC91bD48cD48YSBocmVmPVxcXCJVTlNVQlNDUklCRV9VUkxcXFwiPlN0b3BwZXIgbGVzIGVudm9pcy48L2E+PC9wPlwiLFxuICAgIG5vTmV3UXVlc3Rpb25uYWlyZUZvclVzZXIgOiBcIkF1Y3VuIG5vdXZlYXUgcXVlc3Rpb25uYWlyZSB0cm91dsOpIHBvdXIgdW4gYWJvbm7DqSA6IFwiLFxuICAgIG1haWxFbmRGcmVlVGltZVN1YmplY3Q6IFwiVm90cmUgYWJvbm5lbWVudCBncmF0dWl0IHZhIGV4cGlyZXJcIixcbiAgICBtYWlsRW5kRnJlZVRpbWVCb2R5VHh0OiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIGFib25uZW1lbnQgZ3JhdHVpdCDDoCBTSVRFX05BTUUgdmEgZXhwaXJlciBkJ2ljaSBxdWVscXVlcyBqb3Vycy5cXG5Qb3VyIGNvbnRpbnVlciDDoCB1dGlsaXNlciBsZSBzaXRlLCB2b3VzIHBvdXZleiBzb3VzY3JpcmUgw6AgdW4gYWJvbm5lbWVudCBkw6hzIGF1am91cmQnaHVpIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxFbmRGcmVlVGltZUJvZHlIVE1MOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIGFib25uZW1lbnQgZ3JhdHVpdCDDoCBTSVRFX05BTUUgdmEgZXhwaXJlciBkJ2ljaSBxdWVscXVlcyBqb3Vycy4gUG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogc291c2NyaXJlIMOgIHVuIGFib25uZW1lbnQgZMOocyBhdWpvdXJkJ2h1aSBlbiA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRW5kRnJlZVRpbWVNZXNzYWdlOiBcIiByZWxhbmNlcyBlbnZvecOpZXMuXCIsXG4gICAgbWFpbEV4cGlyYXRpb25TdWJqZWN0OiBcIlZvdHJlIGFib25uZW1lbnQgdmEgYmllbnTDtHQgZXhwaXJlclwiLFxuICAgIG1haWxFeHBpcmF0aW9uQm9keVR4dDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Wb3RyZSBhYm9ubmVtZW50IGdyYXR1aXQgw6AgU0lURV9OQU1FIHZhIGV4cGlyZXIgZCdpY2kgcXVlbHF1ZXMgam91cnMuXFxuUG91ciBjb250aW51ZXIgw6AgdXRpbGlzZXIgbGUgc2l0ZSwgdm91cyBwb3V2ZXogbGUgcHJvbG9uZ2VyIGTDqHMgYXVqb3VyZCdodWkgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbEV4cGlyYXRpb25Cb2R5SFRNTDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSBhYm9ubmVtZW50IMOgIFNJVEVfTkFNRSB2YSBleHBpcmVyIGQnaWNpIHF1ZWxxdWVzIGpvdXJzLjxicj5Qb3VyIGNvbnRpbnVlciDDoCB1dGlsaXNlciBsZSBzaXRlLCB2b3VzIHBvdXZleiBsZSBwcm9sb25nZXIgZMOocyBhdWpvdXJkJ2h1aSBlbiA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVhbnQgaWNpPC9hPi48L3A+XCIsXG4gICAgbWFpbEV4cGlyYXRpb25NZXNzYWdlOiBcIkZJUlNUIHByZW1pw6hyZXMgZXQgU0VDT05EIGRldXhpw6htZXMgcmVsYW5jZXMgZW52b3nDqWVzIHBvdXIgZGVzIGFib25uZW1lbnRzIGV4cGlyYW50IGQnaWNpIHBldS5cIixcbiAgICBpbmZvc05iRGF5czogXCJWb3RyZSBhYm9ubmVtZW50IGVzdCBlbmNvcmUgdmFsYWJsZSA8Yj5wZW5kYW50IE5CX0RBWVMgam91cnM8L2I+Ljxicj5Wb3VzIHBvdXZleiDDoCB0b3V0IG1vbWVudCBwcm9sb25nZXIgdm90cmUgYWJvbm5lbWVudCBlbiBzdWl2YW50IGxlcyBpbmRpY2F0aW9ucyBjaS1kZXNzb3VzIDpcIixcbiAgICBpbmZvc0V4cGlyYXRlZDogXCJWb3RyZSBhYm9ubmVtZW50IGEgZXhwaXLDqSwgbWFpcyBpbCB2b3VzIHJlc3RlIGVuY29yZSBxdWVscXVlcyBqb3VycyBhdmFudCBxdWUgdm90cmUgY29tcHRlIGV0IHZvcyBkb25uw6llcyBuZSBzb2llbnQgY29tcGzDqHRlbWVudCBzdXBwcmltw6llcy48YnI+UG91ciBjZSBmYWlyZSwgc3VpdmV6IHNhbnMgdGFyZGVyIGxlcyBpbmRpY2F0aW9ucyBjaS1kZXNzb3VzIDpcIixcbiAgICBpbmZvc05iRGF5c0FkbWluOiBcIkNldCBhYm9ubmVtZW50IGVzdCBlbmNvcmUgdmFsYWJsZSA8Yj5wZW5kYW50IE5CX0RBWVMgam91cnM8L2I+LlwiLFxuICAgIGluZm9zRXhwaXJhdGVkQWRtaW46IFwiQ2V0IGFib25uZW1lbnQgYSBleHBpcsOpLlwiLCAgXG4gICAgaXNOb3RWYWxpZGVkIDogXCJDZXQgdXRpbGlzYXRldXIgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLjxicj5Wb3VzIHBvdXZleiBsZSBmYWlyZSDDoCBzYSBwbGFjZSA8YSBocmVmPScjdmFsaWRhdGlvbk9rJz5lbiBjb2NoYW50IGxhIGNhc2UgaW5kaXF1w6llPC9hPiBldCBlbnJlZ2lzdHJhbnQuXCIsXG4gICAgaW5mb3NQYXltZW50c0FkbWluIDogXCJEQVRFX1BBWU1FTlQgOiBwYWllbWVudCBkZSBBTU9VTlQg4oKsIGF1IG5vbSBkZSBDTElFTlRfTkFNRS5cIixcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgbm90Rm91bmQ6IFwiTCd1dGlsaXNhdGV1ciBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZE5hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ci5cIixcbiAgICBuZWVkTm90VG9vTG9uZ05hbWU6IFwiTWVyY2kgZGUgY2hvaXNpciB1biBub20gZCd1dGlsaXNhdGV1ciBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSA3MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIG5lZWRVbmlxdWVFbWFpbDogXCJMJ2FkcmVzc2UgZS1tYWlsIHF1ZSB2b3VzIGF2ZXogc2Fpc2llIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBhciB1biBhdXRyZSB1dGlsaXNhdGV1ci4gU2kgdm91cyBhdmV6IGTDqWrDoCB1biBjb21wdGUsIDxhIGhyZWY9Jy8jVVJMJz5jbGlxdWV6LWljaSBwb3VyIHZvdXMgY29ubmVjdGVyPC9hPi5cIixcbiAgICBuZWVkTm90VG9vTG9uZ0VtYWlsOiBcIk1lcmNpIGRlIHNhaXNpciB1bmUgYWRyZXNzZSBlLW1haWwgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgMjU1IGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UuXCIsXG4gICAgbmVlZExvbmdQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UgZCdhdSBtb2lucyBNSU5fTEVOR1RIIGNhcmFjdMOocmVzLlwiLFxuICAgIHBhc3N3b3JkQ29waWVkOiBcIkxlIG1vdCBkZSBwYXNzZSBnw6luw6lyw6kgYSDDqXTDqSBjb3Bpw6kgZGFucyBsZSBwcmVzc2UtcGFwaWVyLiBWb3VzIHBvdXZleiBsZSByZWNvcGllciBvw7kgdm91cyBsZSBzb3VoYWl0ZXIuXCIsXG4gICAgbmVlZFN0YXR1cyA6IFwiSWwgbWFucXVlIGxlIHN0YXR1dC5cIixcbiAgICBuZWVkTGFuZ3VhZ2UgOiBcIklsIG1hbnF1ZSBsZSBjb2RlIGxhbmd1ZS5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZEtub3dOZXdzbGV0dGVyT2sgOiBcIklsIGZhdXQgc2F2b2lyIHNpIGwndXRpbGlzYXRldXIgYWNjZXB0ZSBvdSByZWZ1c2UgZGUgcmVjZXZvaXIgbGEgbmV3c2xldHRlci5cIixcbiAgICBuZWVkVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgY29ubmHDrnRyZSBsZSBub21icmUgZGUgbWludXRlcyBkdSBkw6ljYWxhZ2UgaG9yYWlyZS5cIixcbiAgICBuZWVkTWluVGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBlbmxldmVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDcyMC5cIixcbiAgICBuZWVkTWF4VGltZURpZmZlcmVuY2UgOiBcIklsIGZhdXQgZm91cm5pciB1biBub21icmUgZGUgbWludXRlcyDDoCBham91dGVyIMOgIGwnaGV1cmUgR01UIG5lIGTDqXBhc3NhbnQgcGFzIDg0MC5cIixcbiAgICBuZWVkVUdDT2sgOiBcIlZvdXMgZGV2ZXogYWNjZXB0ZXIgbGVzIENHVSBwb3VyIHBvdXZvaXIgY3LDqWVyIHZvdHJlIGNvbXB0ZS4gXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdmFsaWRlIHRyb3V2w6kgcG91ciBjZSBjb2RlIHBhcnJhaW4uXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgcGFycmFpbiBhIGJpZW4gw6l0w6kgdHJvdXbDqSAhXCIsXG4gICAgbWFpbFZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGluc2NyaXB0aW9uIGVzdCBiaWVuIGVucmVnaXN0csOpZS5cXG5Qb3VyIGxhIGZpbmFsaXNlciwgbWVyY2kgZGUgY2xpcXVlciBkYW5zIGxlcyAyNEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvdHJlIGNvbXB0ZVwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvdHJlIGNvbXB0ZSwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBzdWl2YW50IGRhbnMgbGVzIDI0aC48L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgdmllbnQgYmllbiBkJ8OqdHJlIHZhbGlkw6kuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPlZvdXMgcG91dmV6IHNhbnMgdGFyZGVyIHZvdXMgY29ubmVjdGVyIGNpLWRlc3NvdXMgcG91ciBhY2PDqWRlciDDoCB2b3RyZSBjb21wdGUuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VBZG1pbjogXCJMZSBjb21wdGUgYSBiaWVuIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgdmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIHZvdHJlIGNvbXB0ZS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbjogXCJDZSBjb21wdGUgYSBkw6lqw6Agw6l0w6kgdmFsaWTDqS5cIixcbiAgICBtYWlsV2VsY29tZVN1YmplY3QgOiBcIkJpZW52ZW51ZSAhXCIsXG4gICAgbWFpbFdlbGNvbWVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3RyZSB2ZW5leiBkZSB2YWxpZGVyIHZvdHJlIGluc2NyaXB0aW9uIMOgIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlclN1YmplY3QgOiBcIk1lcmNpICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5HcsOiY2Ugw6Agdm91cyB1biBub3V2ZWwgdXRpbGlzYXRldXIgKEVNQUlMKSB2aWVudCBkZSBzJ2luc2NyaXJlIHN1ciBOT01fU0lURS5cXG5NZXJjaSBldCDDoCBiaWVudMO0dCAhXCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLjwvcD48cD5NZXJjaSBldCDDoCBiaWVudMO0dCAhPC9wPlwiLFxuICAgIGJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIGNvbmZpcm1hdGlvbiBuZSBzZW1ibGUgcGFzIHZhbGlkZSBvdSBiaWVuIGlsIGEgZXhwaXLDqS4gVm91cyBwb3V2ZXogZW4gcmVjZXZvaXIgdW4gbm91dmVhdSA8YSBocmVmPScjVVJMJz5lbiBjbGlxdWFudCBpY2k8L2E+LlwiLFxuICAgIGVtYWlsTm90Rm91bmQ6IFwiQXVjdW4gdXRpbGlzYXRldXIgdHJvdXbDqSBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIGFscmVhZHlDb25uZWN0ZWQ6IFwiVm91cyDDqnRlcyBkw6lqw6AgY29ubmVjdMOpKGUpIGF1IHNpdGUgIVwiLFxuICAgIG5lZWRCZUNvbm5lY3RlZDogXCJWb3VzIGRldmV6IMOqdHJlIGNvbm5lY3TDqShlKSBwb3VyIGFjY8OpZGVyIMOgIGNldHRlIHBhZ2UuXCIsXG4gICAgY29ubmVjdGlvbk9rOiBcIkNvbm5leGlvbiByw6l1c3NpZS5cIixcbiAgICBuZWVkQ2hvb3NlTG9naW5XYXk6IFwiVm91cyBkZXZleiBzb2l0IHNhaXNpciB2b3RyZSBtb3QgZGUgcGFzc2UsIHNvaXQgY29jaGVyIGxhIGNhc2Ugdm91cyBwZXJtZXR0YW50IGRlIHJlY2V2b2lyIHVuIGxpZW4gZGUgY29ubmV4aW9uIHBhciBlLW1haWwuXCIsXG4gICAgbmVlZFZhbGlkYXRpb25Ub0xvZ2luIDogXCJWb3VzIGRldmV6IGQnYWJvcmQgdmFsaWRlciB2b3RyZSBjb21wdGUgYXZhbnQgZGUgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIGxpZW4gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwuXCIsXG4gICAgdG9vTWFueUxvZ2luRmFpbHMgOiBcIlRyb3AgZGUgdGVudGF0aXZlcyBkZSBjb25uZXhpb24gaW5mcnVjdHVldXNlcyBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLiBWb3VzIGRldmV6IGF0dGVuZHJlIE1JTlVURVMgbWludXRlcyBwb3VyIGVzc2F5ZXIgZGUgbm91dmVhdS5cIixcbiAgICBiYWRQYXNzd29yZDogXCJMZSBtb3QgZGUgcGFzc2Ugbidlc3QgcGFzIGxlIGJvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rU3ViamVjdCA6IFwiVm90cmUgbGllbiBkZSBjb25uZXhpb24uXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOiBMSU5LX1VSTFwiLFxuICAgIG1haWxMb2dpbkxpbmtCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6PC9wPjxwPjxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5WYWxpZGVyLjwvYT48L3A+XCIsXG4gICAgbWFpbExvZ2luTGlua01lc3NhZ2UgOiBcIlVuIGxpZW4gZGUgY29ubmV4aW9uIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSBlLW1haWwuIE5lIHRhcmRleiBwYXMgw6AgbCd1dGlsaXNlciwgY2FyIGlsIG4nZXN0IHZhbGFibGUgcXVlIGR1cmFudCBcIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIlZvcyBpbmZvcm1hdGlvbnMgb250IGJpZW4gw6l0w6kgbWlzZXMgw6Agam91ci5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llIGNhciBlbGxlIG4nYSBwYXMgdW5lIGZvcm1hdCBjb3JyZWN0LlwiLFxuICAgIHVwZGF0ZWROZWVkVW5pcXVlRW1haWwgOiBcIk1haXMgbGEgbm91dmVsbGUgYWRyZXNzZSBlLW1haWwgc2Fpc2llIChORVdfRU1BSUwpIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gYXV0cmUgY29tcHRlLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpblN1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cy5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZTogXCJDZXBlbmRhbnQsIHZvdXMgYXZleiBtb2RpZmnDqSBhdSBtb2lucyB1biBkZSB2b3MgaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiAoZW1haWwgZXQvb3UgbW90IGRlIHBhc3NlKSBldCA8Yj52b3VzIGRldmV6IGNsaXF1ZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmVzIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgKE5FV19FTUFJTCkgcG91ciB2YWxpZGVyIGNlIGNoYW5nZW1lbnQ8L2I+LiBFbiBhdHRlbmRhbnQsIG1lcmNpIGRlIGNvbnRpbnVlciDDoCB1dGlsaXNlciB2b3MgYW5jaWVucyBpZGVudGlmaWFudHMuXCIsXG4gICAgdXBkYXRlZE5lZWRWYWxpZGF0ZWRVc2VyOiBcIkwndXRpbGlzYXRldXIgcXVlIHZvdXMgc291aGFpdMOpIG1vZGlmaWVyIG4nZXhpc3RlIHBhcy9wbHVzIG91IG4nYSBwYXMgZW5jb3JlIHZhbGlkw6kgc29uIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkTmVlZEdvb2RHb2RmYXRoZXIgOiBcIk1haXMgbGUgbm91dmVhdSBjb2RlIHBhcnJhaW4gbidhIHB1IMOqdHJlIHJldGVudSwgY2FyIGlsIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG91IMOgIGwndXRpbGlzYXRldXIgbHVpLW3Dqm1lLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZTogXCJMYSBtaXNlIMOgIGpvdXIgZGUgdm9zIGlkZW50aWZpYW50cyBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIHVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCA6IFwiTCdpZGVudGlmaWFudCBmb3VybmkgcG91ciBsZSBwYXJyYWluIG5lIGNvcnJlc3BvbmQgw6AgYXVjdW4gdXRpbGlzYXRldXIuXCIsXG4gICAgY3JlYXRpb25Pa01lc3NhZ2U6IFwiTGUgbm91dmVsIHV0aWxpc2F0ZXVyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqS5cIixcbiAgICBtYWlsRGVsZXRlU3ViamVjdCA6IFwiQ29uZmlybWVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxEZWxldGVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZSwgPGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPmNsaXF1ZXogaWNpPC9hPiBzYW5zIHRhcmRlci48L3A+XCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBkZWxldGVGYWlsTWVzc2FnZTogXCJUZW50YXRpdmUgZGUgc3VwcHJlc3Npb24gZCd1biB1dGlsaXNhdGV1ciBpbmV4aXN0YW50IDogXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVMaW5rRmFpbE1lc3NhZ2U6IFwiVm90cmUgbGllbiBkZSBzdXBwcmVzc2lvbiBuJ2VzdCBwYXMgdmFsaWRlIG91IGFsb3JzIGlsIG4nZXN0IHBsdXMgdmFsYWJsZS5cIixcbiAgICBjcm9uRGVsZXRlVW52YWxpZGVkVXNlcnNNZXNzYWdlOiBcIiBjb21wdGVzIHV0aWxpc2F0ZXVycyBub24gdmFsaWTDqXMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlSW5hY3RpdmVVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIGluYWN0aWZzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIHdlbGNvbWVNZXNzYWdlOiBcIkJpZW52ZW51ZSAjTkFNRSAhXCIsXG4gICAgYnllYnllTWVzc2FnZTogXCJTaSB2b3VzIHZveWV6IGNlIG1lc3NhZ2UsIGMnZXN0IHF1ZSB2b3RyZSBkw6ljb25uZXhpb24gcydlc3QgYmllbiBkw6lyb3Vsw6llLjxicj7DgCBiaWVudMO0dCAhXCIsXG4gICAgaW5mb3NVc2VyRm9yQWRtaW46IFwiQ2V0IHV0aWxpc2F0ZXVyIChpZDogSURfVVNFUikgYSA8Yj5jcsOpw6kgc29uIGNvbXB0ZSBsZSBEQVRFX0NSRUE8L2I+LCBsYSBkZXJuacOocmUgbWlzZSDDoCBqb3VyIGRhdGFudCBkdSBEQVRFX1VQREFURS48YnI+PGI+RGF0ZSBkZSBzYSBkZXJuacOocmUgY29ubmV4aW9uIDogREFURV9DT05ORUNUSU9OLjwvYj5cIixcbiAgICBpbmZvc0FkbWluR29kZmF0aGVyOiBcIkNldCB1dGlsaXNhdGV1ciBhIMOpdMOpIHBhcnJhaW7DqSBwYXIgXCIsXG4gICAgaW5mb3NBZG1pbk5iR29kQ2hpbGRzOiBcIlNlcyAjTkIgZmlsbGV1aWxzIDogXCJcbn07IiwiLy8gUXVlbHF1ZXMgZm9uY3Rpb25zIHV0aWxlcyBwb3VyIGxlcyBjaGHDrm5lc1xuXG5jbGFzcyBUb29sXG57XG4gICAgc3RhdGljIGlzRW1wdHkobXlWYXIpXG4gICAge1xuICAgICAgICBpZihteVZhcj09PXVuZGVmaW5lZCB8fCBteVZhcj09PW51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVZhcis9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVZhcj1teVZhci50cmltKCk7XG4gICAgICAgICAgICBpZihteVZhcj09PVwiXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyB0cmltSWZOb3ROdWxsKG15U3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KG15U3RyaW5nKSlcbiAgICAgICAgICAgIG15U3RyaW5nPW51bGw7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgbXlTdHJpbmcrPVwiXCI7Ly8gc2kgYXV0cmUgY2hvc2UgcXUndW5lIGNoYcOubmUgZW52b3nDqS4uLlxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cblxuICAgIHN0YXRpYyBzaG9ydGVuSWZMb25nZXJUaGFuKG15U3RyaW5nLCBtYXgpXG4gICAge1xuICAgICAgICBteVN0cmluZys9XCJcIjsvLyBhdSBjYXMgb8O5IGNlbGEgbmUgc2VyYWl0IHBhcyB1bmUgY2hhw65uZS4uLlxuICAgICAgIGlmKG15U3RyaW5nLmxlbmd0aCA+IG1heClcbiAgICAgICAgICAgIG15U3RyaW5nPW15U3RyaW5nLnN1YnN0cmluZygwLCAobWF4LTMpKStcIi4uLlwiO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU2MDQxNDAvcmVwbGFjZS1tdWx0aXBsZS1zdHJpbmdzLXdpdGgtbXVsdGlwbGUtb3RoZXItc3RyaW5nc1xuICAgIHN0YXRpYyByZXBsYWNlQWxsKG15U3RyaW5nLCBtYXBPYmopXG4gICAge1xuICAgICAgICBjb25zdCByZXBsYWNlRWx0cyA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXMobWFwT2JqKS5qb2luKFwifFwiKSxcImdpXCIpO1xuICAgICAgICByZXR1cm4gbXlTdHJpbmcucmVwbGFjZShyZXBsYWNlRWx0cywgKG1hdGNoZWQpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBPYmpbbWF0Y2hlZF07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHNvdXJjZSA6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2ZyL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09iamV0c19nbG9iYXV4L01hdGgvcmFuZG9tXG4gICAgc3RhdGljIGdldFJhbmRvbUludChtaW4sIG1heClcbiAgICB7XG4gICAgICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgICAgICBtYXggPSBNYXRoLmZsb29yKG1heCk7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy8gw6AgY29tcGzDqXRlciA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhdGVfZm9ybWF0X2J5X2NvdW50cnlcbiAgICBzdGF0aWMgZGF0ZUZvcm1hdChkYXRlU3RyaW5nLCBsYW5nPVwiZnJcIilcbiAgICB7XG4gICAgICAgIGlmKFRvb2wuaXNFbXB0eShkYXRlU3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgbXlEYXRlPW5ldyBEYXRlKGRhdGVTdHJpbmcpO1xuICAgICAgICBsZXQgbXlEYXk9bXlEYXRlLmdldERhdGUoKStcIlwiO1xuICAgICAgICBpZihteURheS5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlEYXk9XCIwXCIrbXlEYXk7XG4gICAgICAgIGxldCBteU1vdW50aD0obXlEYXRlLmdldE1vbnRoKCkrMSkrXCJcIjtcbiAgICAgICAgaWYobXlNb3VudGgubGVuZ3RoPT09MSlcbiAgICAgICAgICAgIG15TW91bnRoPVwiMFwiK215TW91bnRoO1xuICAgICAgICBsZXQgbXlZZWFyPW15RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBpZihsYW5nPT09XCJmclwiKVxuICAgICAgICAgICAgcmV0dXJuIG15RGF5K1wiL1wiK215TW91bnRoK1wiL1wiK215WWVhcjtcbiAgICAgICAgZWxzZSBpZiAobGFuZz09PVwiZm9ybVwiKS8vIDIwMTQtMDItMDlcbiAgICAgICAgICAgIHJldHVybiBteVllYXIrXCItXCIrbXlNb3VudGgrXCItXCIrbXlEYXk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBteU1vdW50aCtcIi9cIitteURheStcIi9cIitteVllYXI7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvb2w7IiwidmFyIG1hcCA9IHtcblx0XCIuL2RlZmF1bHQvY29uZmlnL2ZyLmpzXCI6IFwiLi4vdmlld3MvZGVmYXVsdC9jb25maWcvZnIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vdmlld3Mgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwuanMkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmhtdFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIsOAIHByb3Bvc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvYS1wcm9wb3MuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIgfSB9LFxuICAgIF0sXG4gICAgZm9vdExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDLkcuVS5cIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NndS5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlYuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3YuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgXSxcbiAgICBtYXhRdWVzdGlvbm5haXJlc0J5UGFnZTogMTAsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCIsXG4gICAgc2l0ZVNsb2dhbjogXCJDdWx0aXZvbnMgbm90cmUgamFyZGluICFcIixcbiAgICBob21lVGl0bGUxOiBcIkRlIG5hdHVyZSBjdXJpZXVzZSA/XCIsXG4gICAgaG9tZVAxOiBcIkF2ZWMgV2lraUxlcm5pIHZvdXMgYXBwcmVuZXogY2hhcXVlIGpvdXIgZGUgbm91dmVsbGVzIGNob3Nlcy48YnI+RGVzIGFydGljbGVzIGRlIFdpa2lww6lkaWEgc29udCBzw6lsZWN0aW9ubsOpcyBwb3VyIHZvdXMgZXQgc29udCBzdWl2aXMgZCd1biBxdWl6IHZvdXMgcGVybWV0dGFudCBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUuPGJyPkRlIGpvdXIgZW4gam91ciBkZSBub3V2ZWxsZXMgZ3JhaW5lcyBkZSBzYXZvaXIgc29udCBhaW5zaSBzZW3DqWVzIGRhbnMgdm90cmUgXFxcImphcmRpblxcXCIuXCIsXG4gICAgaG9tZVRpdGxlMjogXCJMYSBjdWx0dXJlIGVuIGxpYmVydMOpXCIsXG4gICAgaG9tZVAyOiBcIlRvdXQgY29tbWUgc3VyIFdpa2lww6lkaWEgKCopLCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHBhcnRhZ8OpIHN1ciBXaWtpTGVybmkgc29udCBsaWJyZXMuPGJyPlZvdXMgcG91dmV6IGxlcyB1dGlsaXNlciwgbGVzIG1vZGlmaWVyIGV0IGxlcyBkaWZmdXNlciBzZWxvbiB2b3RyZSBzb3VoYWl0Ljxicj5TdXIgV2lraUxlcm5pLCBwYXMgZGUgcHVibGljaXTDqSwgbmkgZGUgY29tbWVyY2lhbGlzYXRpb24gZGUgdm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcy48YnI+Vm91cyBwb3V2ZXogdmVuaXIgeSBcXFwiY3VsdGl2ZXIgdm90cmUgamFyZGluXFxcIiBlbiB0b3V0ZSB0cmFucXVpbGxpdMOpLjxicj48YnI+PHNtYWxsPjxlbT4oKikgQmllbiBxdWUgcGFydGFnZWFudCBzZXMgdmFsZXVycywgV2lraUxlcm5pIGVzdCB1biBwcm9qZXQgaW5kw6lwZW5kYW50IGRlIGxhIGZvbmRhdGlvbiBXaWtpcMOpZGlhLjwvZW0+PC9zbWFsbD5cIixcbiAgICBuZXdRdWVzdGlvbm5haXJlc1RpdGxlOiBcIkxlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyBzdXIgV2lraUxlcm5pXCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNJbnRybzogXCJMaXN0ZSBkZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaS5cIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmkgP1wiLFxuICAgIGV4cGxhbmF0aW9uVHh0OiBcIkxlIHByaW5jaXBlIGVzdCBzaW1wbGUgOiB2b3VzIGNvbW1lbmNleiBwYXIgbGlyZSBsJ2FydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6kuPGJyPlB1aXMgdm91cyBhZmZpY2hlciBsZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IGRlIHZvdHJlIGxlY3R1cmUuIFZvdXMgb2J0ZW5leiBhbG9ycyB2b3RyZSByw6lzdWx0YXQgaW1tw6lkaWF0ZW1lbnQuPGJyPjxicj5Ub3V0ZXMgbGVzIHLDqXBvbnNlcyBzZSB0cm91dmVudCBkYW5zIGwnYXJ0aWNsZSBwcm9wb3PDqSDDoCBsYSBsZWN0dXJlLiA8Yj5Wb3VzIMOqdGVzIGljaSBwb3VyIGFwcHJlbmRyZSBkZSBub3V2ZWxsZXMgY2hvc2VzPC9iPiwgbWFpcyBsaWJyZSDDoCB2b3VzIGQnZXNzYXllciBkJ3kgcsOpcG9uZHJlIGltbcOpZGlhdGVtZW50Ljxicj48YnI+UXVhbmQgbGUgc3VqZXQgcyd5IHByw6p0ZSwgbmUgdm91cyDDqXRvbm5leiBwYXMgc2kgY2VydGFpbmVzIGRlcyByw6lwb25zZXMgcHJvcG9zw6llcyBwZXV2ZW50IMOqdHJlIHVuIHBldSBkw6ljYWzDqWVzLCBhYnN1cmRlcy4uLiBPbiBwZXV0IGFwcHJlbmRyZSBhdmVjIGxlIHNvdXJpcmUsIG5vbiA/IDotKTxicj48YnI+VW5lIGZvaXMgdm90cmUgcsOpc3VsdGF0IG9idGVudSwgaWwgdm91cyBzZXJhIHByb3Bvc8OpIGRlIGNyw6llciB1biBjb21wdGUgcG91ciBsZSBzYXV2ZWdhcmRlci48YnI+Q2UgY29tcHRlIHZvdXMgcGVybWV0dHJhIGRlIHRlc3RlciBkZSBub3V2ZWF1IGNlIHF1aXogcG91ciB2w6lyaWZpZXIgY2UgcXVlIHZvdXMgZW4gYXZleiByZXRlbnUgcGx1c2lldXJzIGpvdXJzLCBzZW1haW5lcywgbW9pcy4uLiBFdCBkZSByZWNldm9pciByw6lndWxpw6hyZW1lbnQgZGUgbm91dmVsbGVzIHN1Z2dlc3Rpb25zIGRlIGxlY3R1cmVzLjxicj48YnI+TWFpcyA8Yj5sYSBjcsOpYXRpb24gZGUgY2UgY29tcHRlIGVzdCBmYWN1bHRhdGl2ZTwvYj4gZXQgPGEgaHJlZj0nL3F1aXpzLycgdGl0bGU9J0xlcyBkZXJuaWVycyBxdWl6cyBwdWJsacOpcyc+dm91cyBwb3V2ZXogcGFyY291cmlyIFdpa2lMZXJuaSBsaWJyZW1lbnQ8L2E+LlwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG59OyIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcbiBMZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgZXN0IGxpc2libGUgc3VyIGdpdGxhYiA6IFxcbiBCb25uZSBsZWN0dXJlIDotKSBcXG4gUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiByw6ljdXDDqXJhbnQgbGVzIHBhcmFtw6h0cmVzIHBhc3PDqXMgcGFyIGwndXJsXG5leHBvcnQgY29uc3QgZ2V0VXJsUGFyYW1zID0gKCkgPT5cbntcbiAgICBpZihpc0VtcHR5KGxvY2F0aW9uLnNlYXJjaCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KFwiJlwiKTtcbiAgICBpZighQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJzKSB8fCBwYXJhbWV0ZXJzLmxlbmd0aD09PTApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgbGV0IHBhcmFtLCBkYXRhcz17fTtcbiAgICBmb3IobGV0IGkgaW4gcGFyYW1ldGVycylcbiAgICB7XG4gICAgICAgIHBhcmFtID0gcGFyYW1ldGVyc1tpXS5zcGxpdChcIj1cIik7XG4gICAgICAgIGlmKHBhcmFtLmxlbmd0aD09PTIpXG4gICAgICAgICAgICBkYXRhc1twYXJhbVswXV09ZGVjb2RlVVJJKHBhcmFtWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufSIsImltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHNpdGVVcmwsIHRoZW1lIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5pbXBvcnQgeyAgY2hlY2tMb2dpblJvdXRlLCB0aW1lRGlmZmVyZW5jZU1heCwgdGltZURpZmZlcmVuY2VNaW4sIHVzZXJSb3V0ZXMgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL3VzZXJzLmpzXCI7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK1wiL3VzZXIvZ2V0Y29uZmlnXCIpO1xuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25UU1xuICAgIH1cbiAgICBzYXZlTG9jYWx5KFwidXNlclwiLCBzdG9yYWdlVXNlcik7XG59XG5cbi8vIFbDqXJpZmllIHF1J2lsIHkgYSBkZXMgZG9ubsOpZXMgbG9jYWxlcyBjb25jZXJuYW50IGxlIHLDqXN1bHRhdCBkJ3VuIHF1aXpcbi8vIEV0IGxlcyBham91dGUgYXV4IGRvbm7DqWVzIGVudm95w6llcyBwYXIgbGVzIGZvcm11bGFpcmVzIGQnaW5zY3JpcHRpb24vY29ubmV4aW9uIHNpIGMnZXN0IGxlIGNhc1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5zd2VyRGF0YXMgPSAoZGF0YXMpID0+XG57XG4gICAgY29uc3QgbGFzdEFuc3dlcj1nZXRMb2NhbHkoXCJsYXN0QW5zd2VyXCIpO1xuICAgIGlmKCFpc0VtcHR5KGxhc3RBbnN3ZXIpKVxuICAgIHtcbiAgICAgICAgY29uc3QgYW5zd2VyPUpTT04ucGFyc2UobGFzdEFuc3dlcik7XG4gICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5kdXJhdGlvbikgJiYgIWlzRW1wdHkoYW5zd2VyLm5iQ29ycmVjdEFuc3dlcnMpICYmICFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpICYmICFpc0VtcHR5KGFuc3dlci5uYlF1ZXN0aW9ucykpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFzLmR1cmF0aW9uPWFuc3dlci5kdXJhdGlvbjtcbiAgICAgICAgICAgIGRhdGFzLm5iQ29ycmVjdEFuc3dlcnM9YW5zd2VyLm5iQ29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgICBkYXRhcy5RdWVzdGlvbm5haXJlSWQ9YW5zd2VyLlF1ZXN0aW9ubmFpcmVJZDtcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBsZSB0b2tlbiBldCBkZSB0b3V0ZSBmYcOnb24gdsOpcmlmaWVyIMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGVbbGFuZ10uYWNjb3VudFBhZ2UpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59IiwiLy8gLS0gR0VTVElPTiBERSBMQSBQQUdFIFBFUk1FVFRBTlQgREUgU0UgRMOJQk9OTkVSIERFIFRPVVMgTEVTIEVOVk9JU1xuXG4vLy8gVW4gdG9rZW4gZXN0IHRyYW5zbWlzIGVuIHBhcmFtw6h0cmUgZGUgbCdVcmwuIElsIGEgdW5lIHZhbGlkaXTDqSBsaW1pdMOpIGRhbnMgbGUgdGVtcHMuIFNpIGxlIHRva2VuIGVzdCBvaywgaWwgbidlc3QgcGFzIG7DqWNlc3NhaXJlIGQnw6p0cmUgY29ubmVjdMOpLlxuLy8vIERhbnMgbGUgY2FzIG/DuSBpbCBuJ2VzdCBwbHVzIHZhbGlkZSwgb24gcGV1dCBwcm9wb3NlciDDoCBsJ3V0aWxpc2F0ZXVyIGRlIHNlIGNvbm5lY3RlciDDoCBzb24gY29tcHRlIHBvdXIgc2UgZMOpc2Fib25uZXIuXG4vLy8gU2kgbGUgdG9rZW4gZXN0IG9rLCBvbiB2YWxpZGUgZW5yZWdpc3RyZW1lbnQgbGUgZMOpc2Fib25uZW1lbnQgZXQgYWZmaWNoZSB1biBtZXNzYWdlIGRlIGNvbmZpcm1hdGlvblxuXG4vLyBGaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gY8O0dMOpIGNsaWVudCA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5jb25zdCBjb25maWdGcm9udEVuZCA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gSW1wb3J0YXRpb24gZGVzIGZvbmN0aW9ucyB1dGlsZSBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiB9IGZyb20gXCIuL3Rvb2xzL2V2ZXJ5d2hlcmUuanNcIjtcbmltcG9ydCB7IGdldFVybFBhcmFtcyB9IGZyb20gXCIuL3Rvb2xzL3VybC5qc1wiO1xuaW1wb3J0IHsgY2hlY2tTZXNzaW9uLCBnZXRDb25maWcsIHNldFNlc3Npb24gfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHR4dCA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHR4dFVzZXJzID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuY29uc3QgdHh0U3Vic2NyaXB0aW9ucyA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvc3Vic2NyaXB0aW9uXCIpO1xuXG5jb25zdCBkaXZSZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVzcG9uc2VcIik7XG5cbmhlbGxvRGV2KCk7XG5cbmxldCBjb25maWc7XG5jb25zdCBpbml0aWFsaXNlID0gYXN5bmMgKCkgPT5cbntcbiAgICB0cnlcbiAgICB7XG4gICAgICAgIGNvbmZpZyA9IGF3YWl0IGdldENvbmZpZygpO1xuICAgICAgICBpZighY29uZmlnKVxuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBlbHNlXG4gICAgICAgIHsgXG4gICAgICAgICAgICBjb25zdCBkYXRhcz1nZXRVcmxQYXJhbXMoKTtcbiAgICAgICAgICAgIGlmKGRhdGFzICYmIGRhdGFzLnQhPT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy51bnN1YnNjcmliZVJvdXRlK2RhdGFzLnQpO1xuICAgICAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLm1lc3NhZ2UgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ0Zyb250RW5kLmFjY291bnRQYWdlKSwgXCJcIiwgW1wic3VjY2Vzc1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFN1YnNjcmlwdGlvbnMudW5zdWJzY3JpcHRpb25GYWlsLnJlcGxhY2UoXCIjVVJMXCIsIGNvbmZpZ0Zyb250RW5kLmFjY291bnRQYWdlKSwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHQuc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICB9XG59XG5pbml0aWFsaXNlKCk7Il0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/front/public/JS/validation.app.js b/front/public/JS/validation.app.js
new file mode 100644
index 0000000..8e33f60
--- /dev/null
+++ b/front/public/JS/validation.app.js
@@ -0,0 +1,868 @@
+/******/ (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/validation.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "../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 : qu'allez-vous apprendre aujourd'hui ?",
+ siteMetaDescription: "Chaque jour, testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
+ 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",
+ 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. 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. 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, cliquez-ici pour vous connecter.",
+ 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 le presse-papier. Vous pouvez le recopier où vous le souhaiter.",
+ 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 valide 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 compte",
+ mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider votre compte, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
+ mailValidationLinkSBodyHTML: "
Bonjour USER_NAME,
Pour valider votre compte, merci de cliquer sur le lien suivant dans les 24h.
",
+ validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !",
+ 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 !",
+ mailWelcomeBodyTxt: "Bonjour USER_NAME,\nVotre venez de valider votre inscription à NOM_SITE.\nMerci et à bientôt !",
+ mailWelcomeBodyHTML: "
Bonjour USER_NAME,
Votre venez de valider votre inscription à NOM_SITE.
Merci et à bientôt !
",
+ mailThankGodfatherSubject: "Merci !",
+ mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nMerci et à bientôt !",
+ mailThankGodfatherBodyHTML: "
Bonjour USER_NAME,
Grâce à vous un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.
Merci et à bientôt !
",
+ badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.",
+ 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.",
+ mailLoginLinkBodyTxt: "Bonjour USER_NAME,\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder : LINK_URL",
+ mailLoginLinkBodyHTML: "
Bonjour USER_NAME,
Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :
",
+ 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 une 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.",
+ mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailUpdateLoginBodyHTML: "
Bonjour USER_NAME,
Pour valider vos nouveaux identifiants de connexion, cliquez ici sans tarder.
",
+ mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (email et/ou mot de passe) et vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement. 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.",
+ mailDeleteBodyTxt: "Bonjour USER_NAME,\nPour valider la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
+ mailDeleteBodyHTML: "
Bonjour USER_NAME,
Pour valider la suppression de votre compte, cliquez ici sans tarder.
",
+ 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. À bientôt !",
+ infosUserForAdmin: "Cet utilisateur (id: ID_USER) a créé son compte le DATE_CREA, la dernière mise à jour datant du DATE_UPDATE. Date de sa dernière connexion : DATE_CONNECTION.",
+ 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;
+
+/***/ }),
+
+/***/ "./src/config/general.js":
+/*!*******************************!*\
+ !*** ./src/config/general.js ***!
+ \*******************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = {
+ apiUrl: "http://localhost:3000/api",
+ usersGetConfigUrl: "/user/getconfig",
+ lang: "fr",
+ 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/"
+}; // à terme fusionner avec les déclarations backend concernant le front, tout étant saisi dans l'admin
+
+/***/ }),
+
+/***/ "./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, " "); // 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 */
+/***/ (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; });
+// 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 est lisible sur gitlab : \n Bonne lecture :-) \n Pour les suggestions d'amélioration ou questions : dev@wililerni.com ****");
+ return true;
+};
+
+/***/ }),
+
+/***/ "./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 _clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
+/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_1__);
+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 configFrontEnd = __webpack_require__(/*! ../config/general */ "./src/config/general.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", configFrontEnd.apiUrl + configFrontEnd.usersGetConfigUrl);
+
+ 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(config) {
+ var timeLocal = new Date().getTimezoneOffset();
+ if (timeLocal > config.timeDifferenceMax || timeLocal < config.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_0__["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_0__["getLocaly"])("lastAnswer");
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(lastAnswer)) {
+ var answer = JSON.parse(lastAnswer);
+
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(answer.QuestionnaireId) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["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(config) {
+ 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 > 1 && _args2[1] !== undefined ? _args2[1] : [];
+ urlRedirection = _args2.length > 2 ? _args2[2] : undefined;
+ message = _args2.length > 3 ? _args2[3] : undefined;
+ urlWanted = _args2.length > 4 ? _args2[4] : undefined;
+ return _context2.abrupt("return", new Promise(function (resolve, reject) {
+ var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("user");
+
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(userDatas)) {
+ redirectUser(urlRedirection, message, urlWanted);
+ resolve(false);
+ } else {
+ var user = JSON.parse(userDatas);
+
+ if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(user.duration) || user.duration < Date.now()) {
+ Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["removeLocaly"])("user");
+ redirectUser(urlRedirection, message, urlWanted);
+ resolve(false);
+ } else {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", configFrontEnd.apiUrl + config.userRoutes + config.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; // le token et de toute façon vérifier à chaque requête à l'API
+
+ Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["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.siteUrl + "/" + configFrontEnd.accountPage;
+ if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configFrontEnd.accountPage); // 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_0__["removeLocaly"])("user");
+ redirectUser(urlRedirection, message, urlWanted);
+ resolve(false);
+ }
+ } else {
+ Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["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(_x) {
+ 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_1__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", message);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("url", urlWanted);
+ if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_1__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection);
+};
+
+/***/ }),
+
+/***/ "./src/validation.js":
+/*!***************************!*\
+ !*** ./src/validation.js ***!
+ \***************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
+/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
+/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
+/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
+/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_4__ = __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); }); }; }
+
+// -- GESTION DE LA 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.
+/// Dans ce cas, on peut rediriger l'utilisateur vers la page de connexion pour obtenir un nouveau lien de validation
+/// Si le token est ok, on crée une session de courte durée et redirige l'utilisateur vers sa page d'accueil
+/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige également vers sa page d'accueil.
+// Fichier de configuration côté client :
+var configFrontEnd = __webpack_require__(/*! ./config/general */ "./src/config/general.js"); // Importation des fonctions utile au script :
+
+
+
+
+
+
+ // Dictionnaires :
+
+var txt = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + configFrontEnd.lang + "/general");
+
+var txtUsers = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + configFrontEnd.lang + "/user");
+
+var divResponse = document.getElementById("response");
+Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_2__["helloDev"])();
+var config;
+
+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_4__["getConfig"])();
+
+ case 3:
+ config = _context.sent;
+
+ if (config) {
+ _context.next = 8;
+ break;
+ }
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+ _context.next = 12;
+ break;
+
+ case 8:
+ _context.next = 10;
+ return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_4__["checkSession"])(config);
+
+ case 10:
+ isConnected = _context.sent;
+
+ if (isConnected) {
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", {
+ message: txtUsers.alreadyConnected,
+ color: "information"
+ }); // pour l'afficher sur la page suivante
+
+ user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["getLocaly"])("user", true);
+ homePage = user.status + "HomePage"; // ne devrait pouvoir être que user ici
+
+ window.location.assign("/" + configFrontEnd[homePage]);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.alreadyConnected, "", ["information"]); // au cas où blocage redirection
+ } else {
+ datas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_3__["getUrlParams"])();
+
+ if (datas && datas.t !== undefined) {
+ xhr = new XMLHttpRequest();
+ xhr.open("GET", configFrontEnd.apiUrl + config.userRoutes + config.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) {
+ var connexionMaxTime = Date.now() + parseInt(config.connexionMinTimeInHours, 10) * 3600 * 1000;
+ Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_4__["setSession"])(response.userId, response.token, connexionMaxTime);
+ Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_0__["saveLocaly"])("message", {
+ message: txtUsers.validationMessage,
+ color: "success"
+ }); // pour l'afficher sur la page suivante
+
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.validationMessage, "", ["success"]); // au cas où blocage redirection
+
+ window.location.assign("/" + configFrontEnd.userHomePage); // que user possible lors de la création
+ } else if ((this.status === 200 || this.status === 404) && response.errors != undefined) {
+ if (Array.isArray(response.errors)) response.errors = response.errors.join(" ");else response.errors = txt.serverError;
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
+ } else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txtUsers.badLinkValidationMessage.replace("#URL", configFrontEnd.connectionPage), "", ["error"]);
+ }
+ };
+
+ xhr.send();
+ }
+ }
+
+ case 12:
+ _context.next = 17;
+ break;
+
+ case 14:
+ _context.prev = 14;
+ _context.t0 = _context["catch"](0);
+ Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_1__["addElement"])(divResponse, "p", txt.serverError, "", ["error"]);
+
+ case 17:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, null, [[0, 14]]);
+ }));
+
+ return function initialise() {
+ return _ref.apply(this, arguments);
+ };
+}();
+
+initialise();
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3VzZXIkIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvdXNlci5qcyIsIndlYnBhY2s6Ly8vLi4vdG9vbHMvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZmlnL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXJsLmpzIiwid2VicGFjazovLy8uL3NyYy90b29scy91c2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdmFsaWRhdGlvbi5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdJbmZvIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzZXJ2ZXJFcnJvciIsInNlcnZlckVycm9yQWRtaW4iLCJuZWVkZWRQYXJhbXMiLCJiYWRVcmwiLCJub3RWYWxpZEZvcm1hdCIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsInVwZGF0ZUJ0blR4dCIsImFkZEJ0blR4dCIsImRlbGV0ZUJ0blR4dCIsImFkZE9rTWVzc2FnZSIsInVwZGF0ZU9rTWVzc2FnZSIsImRlbGV0ZU9rTWVzc2FnZSIsImZhaWxBdXRoIiwiZmFpbEF1dGhIZWFkZXIiLCJmYWlsQXV0aFRva2VuIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoQ3JvbiIsInByZXZpb3VzUGFnZSIsIm5leHRQYWdlIiwiYnRuTGlua1RvUXVlc3Rpb25uYWlyZSIsInN0YXRzQWRtaW4iLCJub3RGb3VuZCIsIm5lZWROYW1lIiwibmVlZE5vdFRvb0xvbmdOYW1lIiwibmVlZEVtYWlsIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZE5vdFRvb0xvbmdFbWFpbCIsIm5lZWRQYXNzV29yZCIsIm5lZWRMb25nUGFzc1dvcmQiLCJwYXNzd29yZENvcGllZCIsIm5lZWRTdGF0dXMiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRNaW5UaW1lRGlmZmVyZW5jZSIsIm5lZWRNYXhUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsImdvZGZhdGhlck5vdEZvdW5kIiwiZ29kZmF0aGVyRm91bmQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsVmFsaWRhdGlvbkxpbmtTdWJqZWN0IiwibWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2UiLCJ2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbiIsIm1haWxXZWxjb21lU3ViamVjdCIsIm1haWxXZWxjb21lQm9keVR4dCIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwiYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImFscmVhZHlDb25uZWN0ZWQiLCJuZWVkQmVDb25uZWN0ZWQiLCJjb25uZWN0aW9uT2siLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkVmFsaWRhdGlvblRvTG9naW4iLCJ0b29NYW55TG9naW5GYWlscyIsImJhZFBhc3N3b3JkIiwibWFpbExvZ2luTGlua1N1YmplY3QiLCJtYWlsTG9naW5MaW5rQm9keVR4dCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtNZXNzYWdlIiwidXBkYXRlZE9rTWVzc2FnZSIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5MaW5rTWVzc2FnZSIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsImNyZWF0aW9uT2tNZXNzYWdlIiwibWFpbERlbGV0ZVN1YmplY3QiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVCb2R5SFRNTCIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsImRlbGV0ZUZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsIndlbGNvbWVNZXNzYWdlIiwiYnllYnllTWVzc2FnZSIsImluZm9zVXNlckZvckFkbWluIiwiaW5mb3NBZG1pbkdvZGZhdGhlciIsImluZm9zQWRtaW5OYkdvZENoaWxkcyIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJtaW4iLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwiYXBpVXJsIiwidXNlcnNHZXRDb25maWdVcmwiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzYXZlTG9jYWx5IiwibmFtZSIsImRhdGEiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldExvY2FseSIsImpzb24iLCJwYXJzZSIsImdldEl0ZW0iLCJyZW1vdmVMb2NhbHkiLCJyZW1vdmVJdGVtIiwiYWRkRWxlbWVudCIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaWQiLCJBcnJheSIsImlzQXJyYXkiLCJpIiwiY2xhc3NMaXN0IiwiYWRkIiwiYXR0cmlidXROYW1lIiwic2V0QXR0cmlidXRlIiwiaW5uZXJIVE1MIiwiYXBwZW5kQ2hpbGQiLCJoZWxsb0RldiIsImNvbnNvbGUiLCJsb2ciLCJnZXRVcmxQYXJhbXMiLCJsb2NhdGlvbiIsInNlYXJjaCIsInBhcmFtZXRlcnMiLCJzcGxpdCIsInBhcmFtIiwiZGF0YXMiLCJkZWNvZGVVUkkiLCJjb25maWdGcm9udEVuZCIsInJlcXVpcmUiLCJnZXRDb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInJlc3BvbnNlVGV4dCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2VuZCIsImdldFRpbWVEaWZmZXJlbmNlIiwiY29uZmlnIiwidGltZUxvY2FsIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJ0aW1lRGlmZmVyZW5jZU1heCIsInRpbWVEaWZmZXJlbmNlTWluIiwiZ2V0UGFzc3dvcmQiLCJuYkNhck1pbiIsIm5iQ2FyTWF4IiwibmJDYXIiLCJsZXR0ZXJzIiwib3RoZXJzIiwicGFzc3dvcmQiLCJzZXRTZXNzaW9uIiwidXNlcklkIiwidG9rZW4iLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIlF1ZXN0aW9ubmFpcmVJZCIsIm5iUXVlc3Rpb25zIiwiY2hlY2tTZXNzaW9uIiwic3RhdHVzIiwidXJsUmVkaXJlY3Rpb24iLCJtZXNzYWdlIiwidXJsV2FudGVkIiwidXNlckRhdGFzIiwicmVkaXJlY3RVc2VyIiwidXNlciIsIm5vdyIsInVzZXJSb3V0ZXMiLCJjaGVja0xvZ2luUm91dGUiLCJyZXNwb25zZSIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInRpbWVEaWZmZXJlbmNlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50Iiwic2l0ZVVybCIsIndpbmRvdyIsImhyZWYiLCJpbmRleE9mIiwiYXNzaWduIiwidHh0IiwidHh0VXNlcnMiLCJkaXZSZXNwb25zZSIsImdldEVsZW1lbnRCeUlkIiwiaW5pdGlhbGlzZSIsImlzQ29ubmVjdGVkIiwiY29sb3IiLCJob21lUGFnZSIsInQiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsImNvbm5leGlvbk1h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QVUsQ0FBQzhGLFdBQUQsRUFBYyxHQUFkLEVBQW1CRCxRQUFRLENBQUM5TCx3QkFBVCxDQUFrQ3VELE9BQWxDLENBQTBDLE1BQTFDLEVBQWtEeUUsY0FBYyxDQUFDbEQsY0FBakUsQ0FBbkIsRUFBcUcsRUFBckcsRUFBeUcsQ0FBQyxPQUFELENBQXpHLENBQVY7QUFDUDtBQUNKLGlCQXhCRDs7QUF5QkF3RCxtQkFBRyxDQUFDTyxJQUFKO0FBQ0g7QUFDSjs7QUFyRE07QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQTBEWDVDLDRFQUFVLENBQUM4RixXQUFELEVBQWMsR0FBZCxFQUFtQkYsR0FBRyxDQUFDdFAsV0FBdkIsRUFBb0MsRUFBcEMsRUFBd0MsQ0FBQyxPQUFELENBQXhDLENBQVY7O0FBMURXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVYwUCxVQUFVO0FBQUE7QUFBQTtBQUFBLEdBQWhCOztBQTZEQUEsVUFBVSxHIiwiZmlsZSI6Ii4vSlMvdmFsaWRhdGlvbi5hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy92YWxpZGF0aW9uLmpzXCIpO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci91c2VyXCI6IFwiLi4vbGFuZy9mci91c2VyLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvdXNlciRcIjsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgc2l0ZUhUTUxUaXRsZSA6IFwiV2lraUxlcm5pIDogcXUnYWxsZXotdm91cyBhcHByZW5kcmUgYXVqb3VyZCdodWkgP1wiLFxuICAgIHNpdGVNZXRhRGVzY3JpcHRpb24gOiBcIkNoYXF1ZSBqb3VyLCB0ZXN0ZXogdm9zIGNvbm5haXNzYW5jZXMgZXQgYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaS5cIixcbiAgICBzY3JpcHRUaW1pbmdJbmZvIDogXCJEdXLDqWUgZGUgbGEgcsOpcG9uc2UgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNjcmlwdFRpbWluZ0FsZXJ0IDogXCIqKiogU2NyaXB0IGxlbnQgOiBTQ1JJUFRfVElNSU5HIG1pbGxpc2Vjb25kZXMsIHJvdXRlIDogU0NSSVBUX1VSTFwiLFxuICAgIHNlcnZlckVycm9yIDogXCJEw6lzb2zDqS4gVW5lIGVycmV1ciBpbXByw6l2dWUgZXN0IHN1cnZlbnVlLiBTaSBjZWxhIHBlcnNpc3RlLCBuJ2jDqXNpdGV6IMOgIHByw6l2ZW5pciBsJ2FkbWluaXN0cmF0ZXVyIGR1IHNpdGUuXCIsXG4gICAgc2VydmVyRXJyb3JBZG1pbiA6IFwiQnVnIGRlIGwnYXBwbGljYXRpb24gOlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgYmFkVXJsIDogXCJUZW50YXRpdmUgZCdhY2PDqHMgw6AgdW5lIHBhZ2UgbidleGlzdGFudCBwYXMgOlwiLFxuICAgIG5vdFZhbGlkRm9ybWF0IDogXCJGb3JtYXQgbm9uIHZhbGlkZS5cIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgdXBkYXRlQnRuVHh0OiBcIk1vZGlmaWVyXCIsXG4gICAgYWRkQnRuVHh0OiBcIkFqb3V0ZXJcIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoSGVhZGVyIDogXCJBYnNlbmNlIGRlIGhlYWRlciBBdXRob3JpemF0aW9uLlwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIGZhaWxBdXRoSWQgOiBcIklkZW50aWZpYW50IG5vbiB2YWxpZGUgOiBcIixcbiAgICBmYWlsQXV0aENyb24gOiBcIlRlbnRhdGl2ZSBkZSBsYW5jZW1lbnQgZCd1biBjcm9uIHNhbnMgbGUgYm9uIHRva2VuLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBuZXh0UGFnZSA6IFwiUGFnZSBzdWl2YW50ZVwiLFxuICAgIGJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUgOiBcIkFsbGVyIGF1IHF1aXogIVwiLFxuICAgIHN0YXRzQWRtaW4gOiBcIkR1cmFudCBsZXMgZGVybmnDqHJlcyAyNGggOiBOQl9VU0VSU18yNEggY29tcHRlcyBvbnQgw6l0w6kgY3LDqcOpcywgTkJfU1VCU0NSSVBUSU9OU18yNEggdmFsaWTDqXMgZXQgTkJfVVNFUlNfREVMRVRFRF8yNEggc3VwcHJpbcOpcy4gTkJfQU5TV0VSU18yNEggcsOpcG9uc2VzIGF1eCBxdWl6cyBvbnQgw6l0w6kgZW5yZWdpc3Ryw6llcy48YnI+RW4gdG91dCwgaWwgeSBhIDogTkJfVVNFUlNfVE9UIGNvbXB0ZXMsIGRvbnQgTkJfU1VCU0NSSVBUSU9OU19UT1QgdmFsaWTDqXMgZXQgTkJfU1VCU0NSSVBUSU9OU19QUkVNSVVNIGNvbXB0ZXMgcHLDqW1pdW0uIE5CX0FOU1dFUlNfVE9UIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPlBhcm1pIGxlcyBOQl9VU0VSU19ERUxFVEVEX1RPVCBjb21wdGVzIHN1cHByaW3DqXMsIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCBhdmFpZW50IHZhbGlkw6kgbGV1ciBjb21wdGUgZXQgTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIGF2YWllbnQgc291c2NyaXQgdW4gY29tcHRlIHByw6ltaXVtLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBub3RGb3VuZDogXCJMJ3V0aWxpc2F0ZXVyIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyLlwiLFxuICAgIG5lZWROb3RUb29Mb25nTmFtZTogXCJNZXJjaSBkZSBjaG9pc2lyIHVuIG5vbSBkJ3V0aWxpc2F0ZXVyIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDcwIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdm90cmUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgbmVlZFVuaXF1ZUVtYWlsOiBcIkwnYWRyZXNzZSBlLW1haWwgcXVlIHZvdXMgYXZleiBzYWlzaWUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcGFyIHVuIGF1dHJlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWROb3RUb29Mb25nRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHVuZSBhZHJlc3NlIGUtbWFpbCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFBhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZS5cIixcbiAgICBuZWVkTG9uZ1Bhc3NXb3JkIDogXCJNZXJjaSBkZSBmb3VybmlyIHVuIG1vdCBkZSBwYXNzZSBkJ2F1IG1vaW5zIE1JTl9MRU5HVEggY2FyYWN0w6hyZXMuXCIsXG4gICAgcGFzc3dvcmRDb3BpZWQ6IFwiTGUgbW90IGRlIHBhc3NlIGfDqW7DqXLDqSBhIMOpdMOpIGNvcGnDqSBkYW5zIGxlIHByZXNzZS1wYXBpZXIuIFZvdXMgcG91dmV6IGxlIHJlY29waWVyIG/DuSB2b3VzIGxlIHNvdWhhaXRlci5cIixcbiAgICBuZWVkU3RhdHVzIDogXCJJbCBtYW5xdWUgbGUgc3RhdHV0LlwiLFxuICAgIG5lZWRMYW5ndWFnZSA6IFwiSWwgbWFucXVlIGxlIGNvZGUgbGFuZ3VlLlwiLFxuICAgIG5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSA6IFwiTGEgZGF0ZSBkZSBkZXJuacOocmUgY29ubmV4aW9uIG4nZXN0IHBhcyB2YWxpZGUuXCIsXG4gICAgbmVlZFNNVFAgOiBcIklsIG1hbnF1ZSBsZSBzZXJ2ZXVyIFNNVFAuXCIsXG4gICAgbmVlZFNNVFBOb3RGb3VuZCA6IFwiSWwgbWFucXVlIGxlIHNlcnZldXIgU01UUC5cIixcbiAgICBuZWVkS25vd05ld3NsZXR0ZXJPayA6IFwiSWwgZmF1dCBzYXZvaXIgc2kgbCd1dGlsaXNhdGV1ciBhY2NlcHRlIG91IHJlZnVzZSBkZSByZWNldm9pciBsYSBuZXdzbGV0dGVyLlwiLFxuICAgIG5lZWRUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBjb25uYcOudHJlIGxlIG5vbWJyZSBkZSBtaW51dGVzIGR1IGTDqWNhbGFnZSBob3JhaXJlLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRVR0NPayA6IFwiVm91cyBkZXZleiBhY2NlcHRlciBsZXMgQ0dVIHBvdXIgcG91dm9pciBjcsOpZXIgdm90cmUgY29tcHRlLiBcIixcbiAgICBnb2RmYXRoZXJOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB2YWxpZGUgdHJvdXbDqSBwb3VyIGNlIGNvZGUgcGFycmFpbi5cIixcbiAgICBnb2RmYXRoZXJGb3VuZDogXCJWb3RyZSBwYXJyYWluIGEgYmllbiDDqXTDqSB0cm91dsOpICFcIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0SCBzdXIgbGUgbGllbiBkZSBjb25maXJtYXRpb24gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBwYXIgZS1tYWlsLlwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgY29tcHRlXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3RyZSBjb21wdGUsIG1lcmNpIGRlIGNsaXF1ZXIgc3VyIGxlIGxpZW4gc3VpdmFudCBkYW5zIGxlcyAyNGggOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm90cmUgY29tcHRlLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoLjwvcD48cD48YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+VmFsaWRlci48L2E+PC9wPlwiLFxuICAgIHZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGNvbXB0ZSB2aWVudCBiaWVuIGQnw6p0cmUgdmFsaWTDqS4gTWVyY2kgZXQgYmllbnZlbnVlICFcIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZUFkbWluOiBcIkxlIGNvbXB0ZSBhIGJpZW4gw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2U6IFwiSWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogZMOpasOgIHZhbGlkw6kgdm90cmUgY29tcHRlLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluOiBcIkNlIGNvbXB0ZSBhIGTDqWrDoCDDqXTDqSB2YWxpZMOpLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuXFxuTWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxXZWxjb21lQm9keUhUTUwgOiBcIjxoMz5Cb25qb3VyIFVTRVJfTkFNRSw8L2gzPjxwPlZvdHJlIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgbWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCA6IFwiTWVyY2kgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcbkdyw6JjZSDDoCB2b3VzIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLlxcbk1lcmNpIGV0IMOgIGJpZW50w7R0ICFcIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuPC9wPjxwPk1lcmNpIGV0IMOgIGJpZW50w7R0ICE8L3A+XCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgZW1haWxOb3RGb3VuZDogXCJBdWN1biB1dGlsaXNhdGV1ciB0cm91dsOpIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuXCIsXG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6koZSkgYXUgc2l0ZSAhXCIsXG4gICAgbmVlZEJlQ29ubmVjdGVkOiBcIlZvdXMgZGV2ZXogw6p0cmUgY29ubmVjdMOpKGUpIHBvdXIgYWNjw6lkZXIgw6AgY2V0dGUgcGFnZS5cIixcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRhdGlvblRvTG9naW4gOiBcIlZvdXMgZGV2ZXogZCdhYm9yZCB2YWxpZGVyIHZvdHJlIGNvbXB0ZSBhdmFudCBkZSB2b3VzIGNvbm5lY3Rlci4gUG91ciBjZSBmYWlyZSwgdW4gbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICB0b29NYW55TG9naW5GYWlscyA6IFwiVHJvcCBkZSB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiBpbmZydWN0dWV1c2VzIHBvdXIgY2V0dGUgYWRyZXNzZSBlLW1haWwuIFZvdXMgZGV2ZXogYXR0ZW5kcmUgTUlOVVRFUyBtaW51dGVzIHBvdXIgZXNzYXllciBkZSBub3V2ZWF1LlwiLFxuICAgIGJhZFBhc3N3b3JkOiBcIkxlIG1vdCBkZSBwYXNzZSBuJ2VzdCBwYXMgbGUgYm9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtTdWJqZWN0IDogXCJWb3RyZSBsaWVuIGRlIGNvbm5leGlvbi5cIixcbiAgICBtYWlsTG9naW5MaW5rQm9keVR4dCA6IFwiQm9uam91ciBVU0VSX05BTUUsXFxuUG91ciB2b3VzIGNvbm5lY3RlciDDoCB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6IExJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+PHA+PGEgaHJlZj1cXFwiTElOS19VUkxcXFwiPlZhbGlkZXIuPC9hPjwvcD5cIixcbiAgICBtYWlsTG9naW5MaW5rTWVzc2FnZSA6IFwiVW4gbGllbiBkZSBjb25uZXhpb24gdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHN1ciB2b3RyZSBhZHJlc3NlIGUtbWFpbC4gTmUgdGFyZGV6IHBhcyDDoCBsJ3V0aWxpc2VyLCBjYXIgaWwgbidlc3QgdmFsYWJsZSBxdWUgZHVyYW50IFwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUgY2FyIGVsbGUgbidhIHBhcyB1bmUgZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRVbmlxdWVFbWFpbCA6IFwiTWFpcyBsYSBub3V2ZWxsZSBhZHJlc3NlIGUtbWFpbCBzYWlzaWUgKE5FV19FTUFJTCkgbidhIHB1IMOqdHJlIGVucmVnaXN0csOpZSwgY2FyIGVsbGUgZXN0IGTDqWrDoCB1dGlsaXPDqWUgcG91ciB1biBhdXRyZSBjb21wdGUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luU3ViamVjdCA6IFwiTWVyY2kgZGUgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzLlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgdm9zIG5vdXZlYXV4IGlkZW50aWZpYW50cyBkZSBjb25uZXhpb24sIDxhIGhyZWY9XFxcIkxJTktfVVJMXFxcIj5jbGlxdWV6IGljaTwvYT4gc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlbWFpbCBldC9vdSBtb3QgZGUgcGFzc2UpIGV0IDxiPnZvdXMgZGV2ZXogY2xpcXVlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZXMgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSAoTkVXX0VNQUlMKSBwb3VyIHZhbGlkZXIgY2UgY2hhbmdlbWVudDwvYj4uIEVuIGF0dGVuZGFudCwgbWVyY2kgZGUgY29udGludWVyIMOgIHV0aWxpc2VyIHZvcyBhbmNpZW5zIGlkZW50aWZpYW50cy5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0w6kgbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciA6IFwiTWFpcyBsZSBub3V2ZWF1IGNvZGUgcGFycmFpbiBuJ2EgcHUgw6p0cmUgcmV0ZW51LCBjYXIgaWwgbmUgY29ycmVzcG9uZCDDoCBhdWN1biBjb21wdGUgdXRpbGlzYXRldXIgb3Ugw6AgbCd1dGlsaXNhdGV1ciBsdWktbcOqbWUuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlOiBcIkxhIG1pc2Ugw6Agam91ciBkZSB2b3MgaWRlbnRpZmlhbnRzIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgdXBkYXRlZEZhaWxlZEdvZGZhdGhlck5vdEZvdW5kIDogXCJMJ2lkZW50aWZpYW50IGZvdXJuaSBwb3VyIGxlIHBhcnJhaW4gbmUgY29ycmVzcG9uZCDDoCBhdWN1biB1dGlsaXNhdGV1ci5cIixcbiAgICBjcmVhdGlvbk9rTWVzc2FnZTogXCJMZSBub3V2ZWwgdXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpLlwiLFxuICAgIG1haWxEZWxldGVTdWJqZWN0IDogXCJDb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbERlbGV0ZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCA8YSBocmVmPVxcXCJMSU5LX1VSTFxcXCI+Y2xpcXVleiBpY2k8L2E+IHNhbnMgdGFyZGVyLjwvcD5cIixcbiAgICBtYWlsRGVsZXRlTGlua01lc3NhZ2U6IFwiVm90cmUgZGVtYW5kZSBkZSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLiBNZXJjaSBkZSBjbGlxdWVyIHNhbnMgdGFyZGVyIHN1ciBsZSBsaWVuIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbCBwb3VyIGNvbmZpcm1lci5cIixcbiAgICBkZWxldGVPa01lc3NhZ2U6IFwiTCd1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBtYWlsRGVsZXRlTGlua09rTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS4gTWVyY2kgZCdhdm9pciB1dGlsaXPDqSBub3Mgc2VydmljZXMuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtBbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZTogXCJWb3RyZSBsaWVuIGRlIHN1cHByZXNzaW9uIG4nZXN0IHBhcyB2YWxpZGUgb3UgYWxvcnMgaWwgbidlc3QgcGx1cyB2YWxhYmxlLlwiLFxuICAgIGNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2U6IFwiIGNvbXB0ZXMgdXRpbGlzYXRldXJzIG5vbiB2YWxpZMOpcyBvbnQgw6l0w6kgc3VwcHJpbcOpcy5cIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIixcbiAgICBieWVieWVNZXNzYWdlOiBcIlNpIHZvdXMgdm95ZXogY2UgbWVzc2FnZSwgYydlc3QgcXVlIHZvdHJlIGTDqWNvbm5leGlvbiBzJ2VzdCBiaWVuIGTDqXJvdWzDqWUuPGJyPsOAIGJpZW50w7R0ICFcIixcbiAgICBpbmZvc1VzZXJGb3JBZG1pbjogXCJDZXQgdXRpbGlzYXRldXIgKGlkOiBJRF9VU0VSKSBhIDxiPmNyw6nDqSBzb24gY29tcHRlIGxlIERBVEVfQ1JFQTwvYj4sIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgZGF0YW50IGR1IERBVEVfVVBEQVRFLjxicj48Yj5EYXRlIGRlIHNhIGRlcm5pw6hyZSBjb25uZXhpb24gOiBEQVRFX0NPTk5FQ1RJT04uPC9iPlwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVpbHMgOiBcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYXBpVXJsIDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgdXNlcnNHZXRDb25maWdVcmwgOiBcIi91c2VyL2dldGNvbmZpZ1wiLFxuICAgIGxhbmcgOiBcImZyXCIsXG4gICAgdXNlckhvbWVQYWdlIDogXCJhY2N1ZWlsLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlIDogXCJhZG1pbi5odG1sXCIsXG4gICAgbWFuYWdlckhvbWVQYWdlIDogXCJnZXN0aW9uLmh0bWxcIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgY29ubmVjdGlvblBhZ2UgOiBcImNvbm5leGlvbi5odG1sXCIsXG4gICAgYWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICBxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tcXVpenMuaHRtbFwiLFxuICAgIHVzZXJzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi11dGlsaXNhdGV1cnMuaHRtbFwiLFxuICAgIG5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UgOiAxMCxcbiAgICBpbGx1c3RyYXRpb25EaXIgOiBcIi9pbWcvcXVpenMvXCJcbn07XG4vLyDDoCB0ZXJtZSBmdXNpb25uZXIgYXZlYyBsZXMgZMOpY2xhcmF0aW9ucyBiYWNrZW5kIGNvbmNlcm5hbnQgbGUgZnJvbnQsIHRvdXQgw6l0YW50IHNhaXNpIGRhbnMgbCdhZG1pbiIsIi8vIEZPTkNUSU9OUyBVVElMRVMgQVUgU1RPQ0tBR0UgTE9DQUwgKFNFU1NJT04sIENPT0tJRVMsIElOREVYREIsIEVUQy4pXG4vLyBSZXZlbmlyIHBvdXIgZ8OpcmVyIGxlIGNhcyBvw7kgbG9jYWwuc3RvcmFnZSBuJ2VzdCBwYXMgY29ubnUgcG91ciB1dGlsaXNlciBjb29raWVcbiAgICBcbmV4cG9ydCBjb25zdCBzYXZlTG9jYWx5ID0gKG5hbWUsIGRhdGEpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWx5ID0gKG5hbWUsIGpzb249ZmFsc2UpID0+XG57XG4gICAgaWYoanNvbilcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSkpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlTG9jYWx5ID0gKG5hbWUpID0+XG57XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSk7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIGFzc29jaWFudCBsZXMgYXR0cmlidXRzIGZvdXJuaXMgw6AgdW4gY2hhbXAgZGUgZm9ybXVsYWlyZVxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnQgPSAoZWx0UGFyZW50LCBlbHRUeXBlLCBlbHRDb250ZW50PVwiXCIsIGVsdElkPVwiXCIsIGVsdENsYXNzPVtdLCBlbHRBdHRyaWJ1dGVzPXt9LCByZXBsYWNlPXRydWUpID0+XG57XG4gICAgaWYoaXNFbXB0eShlbHRUeXBlKSB8fCBpc0VtcHR5KGVsdFBhcmVudCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBlbHNlXG4gICAge1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWx0VHlwZSk7XG4gICAgICAgIFxuICAgICAgICBpZighaXNFbXB0eShlbHRJZCkpLy8gdGVzdGVyIHNpIGwnaWQgbidlc3QgcGFzIGTDqWrDoCB1dGlsaXPDqSBkYW5zIGxlIERPTSA/XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlkPWVsdElkO1xuXG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZWx0Q2xhc3MpICYmIGVsdENsYXNzLmxlbmd0aCE9MClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBpIGluIGVsdENsYXNzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChlbHRDbGFzc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgZWx0QXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikgLy8gISEgdG91cyBsZXMgb2JqZXRzIG5lIHNvbnQgcGFzIG9rXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgYXR0cmlidXROYW1lIGluIGVsdEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXROYW1lLCBlbHRBdHRyaWJ1dGVzW2F0dHJpYnV0TmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0Q29udGVudCkpXG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTD1lbHRDb250ZW50LnJlcGxhY2UoL1xcbi9nLFwiPGJyPlwiKTsvLyBpbm5lckhUTUwgcGVybWV0IGQnYWpvdXRlciBkdSB0ZXh0ZSBheWFudCBsdWktbcOqbWUgZGVzIGJhbGlzZXMsIGV0Yy5cbiAgICAgICAgICAgIFxuICAgICAgICBpZihyZXBsYWNlKVxuICAgICAgICAgICAgZWx0UGFyZW50LmlubmVySFRNTD1cIlwiO1xuICAgICAgICBlbHRQYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgfSAgICBcbn0iLCIvLyBDZSBzY3JpcHQgZm91cm5pdCBkZXMgZm9uY3Rpb25zIHV0aWxpc8OpZXMgc3VyIHRvdXRlcyBsZXMgcGFnZXMgZHUgc2l0ZVxuXG5leHBvcnQgY29uc3QgaGVsbG9EZXYgPSAoKSA9Plxue1xuICAgIGNvbnNvbGUubG9nKFwiKioqKiBIZWxsbyBhbWkgZMOpdmVsb3BwZXVyIDotKVxcbiBMZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgZXN0IGxpc2libGUgc3VyIGdpdGxhYiA6IFxcbiBCb25uZSBsZWN0dXJlIDotKSBcXG4gUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59IiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIEZvbmN0aW9uIHLDqWN1cMOpcmFudCBsZXMgcGFyYW3DqHRyZXMgcGFzc8OpcyBwYXIgbCd1cmxcbmV4cG9ydCBjb25zdCBnZXRVcmxQYXJhbXMgPSAoKSA9Plxue1xuICAgIGlmKGlzRW1wdHkobG9jYXRpb24uc2VhcmNoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IGxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkuc3BsaXQoXCImXCIpO1xuICAgIGlmKCFBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpIHx8IHBhcmFtZXRlcnMubGVuZ3RoPT09MClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICBsZXQgcGFyYW0sIGRhdGFzPXt9O1xuICAgIGZvcihsZXQgaSBpbiBwYXJhbWV0ZXJzKVxuICAgIHtcbiAgICAgICAgcGFyYW0gPSBwYXJhbWV0ZXJzW2ldLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgaWYocGFyYW0ubGVuZ3RoPT09MilcbiAgICAgICAgICAgIGRhdGFzW3BhcmFtWzBdXT1kZWNvZGVVUkkocGFyYW1bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59IiwiY29uc3QgY29uZmlnRnJvbnRFbmQgPSByZXF1aXJlKFwiLi4vY29uZmlnL2dlbmVyYWxcIik7XG5cbmltcG9ydCB7IGdldExvY2FseSwgcmVtb3ZlTG9jYWx5LCBzYXZlTG9jYWx5IH0gZnJvbSBcIi4vY2xpZW50c3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCIuLi8uLi8uLi90b29scy9tYWluXCI7XG5cbi8vIFLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGNvbmZpZ3VyYXRpb24gZGVzIHV0aWxpc2F0ZXVyc1xuLy8gw4AgdGVybWUsIHVuIGZpY2hpZXIgc3RhdGlxdWUgaW1wb3J0YWJsZSBjb21tZSBtb2R1bGUgZGV2cmFpdCDDqXZpdGVyIHVuZSByZXF1w6p0ZSBhamF4XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gIGFzeW5jICgpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgY29uZmlnRnJvbnRFbmQuYXBpVXJsK2NvbmZpZ0Zyb250RW5kLnVzZXJzR2V0Q29uZmlnVXJsKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKGNvbmZpZykgPT5cbntcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmKHRpbWVMb2NhbCA+IGNvbmZpZy50aW1lRGlmZmVyZW5jZU1heCB8fCB0aW1lTG9jYWwgPCBjb25maWcudGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2UgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gT24gZW5sw6h2ZSB2b2xvbnRhaXJlbWVudCBsZXMgMC9PIHBvdXIgw6l2aXRlciBsZXMgY29uZnVzaW9ucyAhXG4vLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbmV4cG9ydCBjb25zdCBnZXRQYXNzd29yZCA9IChuYkNhck1pbiwgbmJDYXJNYXgpID0+XG57XG4gICAgY29uc3QgbmJDYXI9bmJDYXJNaW4rTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihuYkNhck1heC1uYkNhck1pbikpO1xuICAgIGNvbnN0IGxldHRlcnM9XCJBQkNERUZHSElKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5wcXJzdHV2d3h5elwiO1xuICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgbGV0IHBhc3N3b3JkPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgZm9yKGxldCBpPTE7aTwobmJDYXItMSk7aSsrKVxuICAgIHtcbiAgICAgICAgaWYoKGkgJSAyKSA9PT0xKVxuICAgICAgICAgICAgcGFzc3dvcmQrPW90aGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqb3RoZXJzLmxlbmd0aCldO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYXNzd29yZCs9bGV0dGVyc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbGV0dGVycy5sZW5ndGgpXTsgICBcbiAgICB9XG4gICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xufVxuXG4vLyBKJ3V0aWxpc2UgbGUgc3RvY2thZ2UgbG9jYWwgZHUgbmF2aWdhdGV1ciBwb3VyIGVucmVnaXN0cmVyIGxlcyBkb25uw6llcyBwZXJtZXR0YW50IGRlIHJlY29ubmHDrnRyZSBsJ3V0aWxpc2F0ZXVyIHBhciBsYSBzdWl0ZVxuLy8gU2V1bCBsZSBzZXJ2ZXVyIHBvdXJyYSB2w6lyaWZpZXIgcXVlIGxlcyBpZGVudGlmaWFudHMgc29udCAodG91am91cnMpIHZhbGlkZXMuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvbiA9ICh1c2VySWQsIHRva2VuLCBkdXJhdGlvblRTKSA9Plxue1xuICAgIGNvbnN0IHN0b3JhZ2VVc2VyPVxuICAgIHtcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICBkdXJhdGlvbiA6IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6XG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBkYXRhcy5uYlF1ZXN0aW9ucz1hbnN3ZXIubmJRdWVzdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoY29uZmlnLCBzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGNvbmZpZ0Zyb250RW5kLmFwaVVybCtjb25maWcudXNlclJvdXRlcytjb25maWcuY2hlY2tMb2dpblJvdXRlK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UuaXNWYWxpZCAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLmlkPT09dXNlci5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWU9cmVzcG9uc2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhbmd1YWdlPXJlc3BvbnNlLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudGltZURpZmZlcmVuY2U9cmVzcG9uc2UudGltZURpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5zdGF0dXM9cmVzcG9uc2Uuc3RhdHVzOy8vIGxlIHRva2VuIGV0IGRlIHRvdXRlIGZhw6dvbiB2w6lyaWZpZXIgw6AgY2hhcXVlIHJlcXXDqnRlIMOgIGwnQVBJXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcInVzZXJcIiwgdXNlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2kgaWwgcydhZ2l0IGQndW4gXCJ1c2VyXCIgZXQgcXVlIHNvbiBhYm9ubmVtZW50IGEgZXhwaXLDqSwgamUgbGUgcmVkaXJpZ2UgdmVycyBsYSBjYWlzc2UgOi0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzPT09XCJ1c2VyXCIgJiYgcmVzcG9uc2UubmJEYXlzT2sgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybEFjY291bnQ9Y29uZmlnLnNpdGVVcmwrXCIvXCIrY29uZmlnRnJvbnRFbmQuYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnRnJvbnRFbmQuYWNjb3VudFBhZ2UpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59IiwiLy8gLS0gR0VTVElPTiBERSBMQSBQQUdFIFBFUk1FVFRBTlQgREUgVkFMSURFUiBMQSBDUsOJQVRJT04gREUgU09OIENPTVBURVxuXG4vLy8gVW4gdG9rZW4gZXN0IHRyYW5zbWlzIGVuIHBhcmFtw6h0cmUgZGUgbCdVcmwuIElsIGEgdW5lIHZhbGlkaXTDqSBsaW1pdMOpIGRhbnMgbGUgdGVtcHMuXG4vLy8gRGFucyBjZSBjYXMsIG9uIHBldXQgcmVkaXJpZ2VyIGwndXRpbGlzYXRldXIgdmVycyBsYSBwYWdlIGRlIGNvbm5leGlvbiBwb3VyIG9idGVuaXIgdW4gbm91dmVhdSBsaWVuIGRlIHZhbGlkYXRpb25cbi8vLyBTaSBsZSB0b2tlbiBlc3Qgb2ssIG9uIGNyw6llIHVuZSBzZXNzaW9uIGRlIGNvdXJ0ZSBkdXLDqWUgZXQgcmVkaXJpZ2UgbCd1dGlsaXNhdGV1ciB2ZXJzIHNhIHBhZ2UgZCdhY2N1ZWlsXG4vLy8gU2kgbCd1dGlsaXNhdGV1ciBhIGTDqWrDoCB1bmUgc2Vzc2lvbiBhY3RpdmUgdmFsaWRlLCBjJ2VzdCBxdSdpbCBhIGTDqWrDoCBjbGlxdcOpIHN1ciBsZSBsaWVuLiBPbiBsZSByZWRpcmlnZSDDqWdhbGVtZW50IHZlcnMgc2EgcGFnZSBkJ2FjY3VlaWwuXG5cbi8vIEZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBjw7R0w6kgY2xpZW50IDpcbmNvbnN0IGNvbmZpZ0Zyb250RW5kID0gcmVxdWlyZShcIi4vY29uZmlnL2dlbmVyYWxcIik7XG5cbi8vIEltcG9ydGF0aW9uIGRlcyBmb25jdGlvbnMgdXRpbGUgYXUgc2NyaXB0IDpcbmltcG9ydCB7IGdldExvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGFkZEVsZW1lbnQgfSBmcm9tIFwiLi90b29scy9kb20uanNcIjtcbmltcG9ydCB7IGhlbGxvRGV2IH0gZnJvbSBcIi4vdG9vbHMvZXZlcnl3aGVyZS5qc1wiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW1zIH0gZnJvbSBcIi4vdG9vbHMvdXJsLmpzXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24sIGdldENvbmZpZywgc2V0U2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgdHh0ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrY29uZmlnRnJvbnRFbmQubGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgdHh0VXNlcnMgPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitjb25maWdGcm9udEVuZC5sYW5nK1wiL3VzZXJcIik7XG5cbmNvbnN0IGRpdlJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVwiKTtcblxuaGVsbG9EZXYoKTtcblxubGV0IGNvbmZpZztcbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKCk7XG4gICAgICAgIGlmKCFjb25maWcpXG4gICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgdHh0LnNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gc2kgbCd1dGlsaXNhdGV1ciBlc3QgZMOpasOgIGNvbm5lY3TDqSwgcGFzIGxhIHBlaW5lIGQnYWxsZXIgKyBsb2luIDpcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkPWF3YWl0IGNoZWNrU2Vzc2lvbihjb25maWcpO1xuICAgICAgICAgICAgaWYoaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgeyBtZXNzYWdlOiB0eHRVc2Vycy5hbHJlYWR5Q29ubmVjdGVkLCBjb2xvcjpcImluZm9ybWF0aW9uXCIgfSk7Ly8gcG91ciBsJ2FmZmljaGVyIHN1ciBsYSBwYWdlIHN1aXZhbnRlXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcj1nZXRMb2NhbHkoXCJ1c2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvbWVQYWdlPXVzZXIuc3RhdHVzK1wiSG9tZVBhZ2VcIjsvLyBuZSBkZXZyYWl0IHBvdXZvaXIgw6p0cmUgcXVlIHVzZXIgaWNpXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIi9cIitjb25maWdGcm9udEVuZFtob21lUGFnZV0pO1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCB0eHRVc2Vycy5hbHJlYWR5Q29ubmVjdGVkLCBcIlwiLCBbXCJpbmZvcm1hdGlvblwiXSk7Ly8gYXUgY2FzIG/DucKgYmxvY2FnZSByZWRpcmVjdGlvblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzPWdldFVybFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIGlmKGRhdGFzICYmIGRhdGFzLnQhPT11bmRlZmluZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgY29uZmlnRnJvbnRFbmQuYXBpVXJsK2NvbmZpZy51c2VyUm91dGVzK2NvbmZpZy5jaGVja1N1YnNjcmliZVRva2VuUm91dGUrZGF0YXMudCk7XG4gICAgICAgICAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UudXNlcklkICE9IHVuZGVmaW5lZCAmJiByZXNwb25zZS50b2tlbiAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29ubmV4aW9uTWF4VGltZT1EYXRlLm5vdygpK3BhcnNlSW50KGNvbmZpZy5jb25uZXhpb25NaW5UaW1lSW5Ib3VycywxMCkqMzYwMCoxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uKHJlc3BvbnNlLnVzZXJJZCwgcmVzcG9uc2UudG9rZW4sIGNvbm5leGlvbk1heFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwibWVzc2FnZVwiLCB7IG1lc3NhZ2U6IHR4dFVzZXJzLnZhbGlkYXRpb25NZXNzYWdlLCBjb2xvcjpcInN1Y2Nlc3NcIiB9KTsvLyBwb3VyIGwnYWZmaWNoZXIgc3VyIGxhIHBhZ2Ugc3VpdmFudGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFVzZXJzLnZhbGlkYXRpb25NZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTsvLyBhdSBjYXMgb8O5wqBibG9jYWdlIHJlZGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnRnJvbnRFbmQudXNlckhvbWVQYWdlKTsvLyBxdWUgdXNlciBwb3NzaWJsZSBsb3JzIGRlIGxhIGNyw6lhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gNDA0KSAmJiByZXNwb25zZS5lcnJvcnMgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHJlc3BvbnNlLmVycm9ycy5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gdHh0LnNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dFVzZXJzLmJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZS5yZXBsYWNlKFwiI1VSTFwiLCBjb25maWdGcm9udEVuZC5jb25uZWN0aW9uUGFnZSksIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlKVxuICAgIHtcbiAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHR4dC5zZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/front/public/a-propos.html b/front/public/a-propos.html
new file mode 100644
index 0000000..5163c56
--- /dev/null
+++ b/front/public/a-propos.html
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+ Tout savoir sur WikiLerni
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
WikiLerni vous propose de lire une sélection d'articles de Wikipédia.
+ Suite à chaque lecture, une série de questions vous permet de tester ce que vous avez retenu.
+ Toutes les réponses à ce quiz se trouvent dans l'article proposé à la lecture.
+ Vous pouvez sauvegarder vos résultats au quiz en créant un compte WikiLerni.
+ Vous pourrez ensuite répondre de nouveau aux mêmes questions plusieurs semaines, mois... après avoir lu l'article.
+ De quoi tester votre mémoire à plus en moins long terme !
+
+
Que signifie "WikiLerni" ?
+
+
Le nom "WikiLerni" est composé de deux parties :
+
+
« Wiki » fait évidemment référence à l'encyclopédie en ligne Wikipédia. Comme je vous sais curieux, sachez que le terme « wiki » vient lui-même du mot hawaïen « wikiwiki » signifiant « rapide », « vite » ou « informel ».
+
« Lerni » est un verbe espéranto signifiant « apprendre » ou encore « étudier ». Vous pouvez penser à « learn » en anglais ou encore « lernen » en allemand.
+
+
Bref, WikiLerni vous invite à apprendre de nouvelles choses avec Wikipédia !
+ Et en lisant ces quelques lignes, vous venez peut-être déjà d'apprendre quelque chose :-)
+
+
À qui s'adresse WikiLerni ?
+
+
À toute personne curieuse aimant apprendre de nouvelles choses !
+ Contrairement à d'autres sites de quiz testant votre culture générale, WikiLerni ne vous demande pas d'être déjà très "savants", même si vous l'êtes forcément, au moins dans certains domaines. Si ! Si !
+ Vous êtes ici pour apprendre et toutes les réponses aux questions des quizs se trouvent dans l'article qui vous est proposé à la lecture.
+ C'est donc une façon ludique d'apprendre de nouvelles choses sur des sujets auxquels vous ne vous seriez peut-être jamais intéressé par vous-même.
+
+
Est-il nécessaire de créer un compte pour utiliser WikiLerni ?
+
+
Non, vous pouvez parcourir librement WikiLerni sans avoir besoin d'être connecté au site.
+ Votre compte vous permettra de :
+
+
Sauvegarder vos résultats aux quizs
+
Recevoir des suggestions de nouvelles lectures, directement par e-mail
+
Faciliter votre navigation via un moteur de recherche interne à WikiLerni
+
+ d'autres fonctionnalités à venir...
+
+
+
Comment sont sélectionnés les articles proposés par WikiLerni ?
+
+
Tout comme Wikipédia, WikiLerni se veut éclectique.
+ Donc il vous sera proposé des articles sur des sujets très variés : sciences, arts, histoire, littérature, mythologie, géographie, culture populaire, etc.
+ Il n'y aucun sujet qui ne soit pas digne d'intérêt à priori. Seront évités des articles indiqués par Wikipédia comme de faible qualité ou encore sujets à polémique.
+
+
Les articles proposés à la lecture peuvent être de longueurs variées.
+ Une estimation de la durée de lecture vous est indiquée sur la page du quiz ou encore dans les e-mails que vous recevez si vous êtes abonné.
+ Vous pourrez ainsi choisir de laisser de côté un article un peu long pour y revenir quand vous aurez plus de temps.
+
+
Pour l'instant, les articles proposés sont uniquement francophones.
+ Mais suivant le succès du site, des versions dans d'autres langues pourront être envisagées.
+ Si vous souhaitez vous-même lancer une version dans une autre langue, mais n'avez pas les compétences techniques pour le faire, n'hésitez à me contacter pour un éventuel partenariat.
+
+
Quel lien entre WikiLerni et Wikipédia ?
+
+
Puisque toutes les suggestions de lecture de WikiLerni vous amènent sur Wikipédia, le lien est évident.
+ Pour autant, WikiLerni n'est pas un projet porté par la fondation Wikipédia, ni par une de ses associations locales, mais est un projet indépendant.
+ Au-delà de ce lien pratique, WikiLerni se veut très proche de l'esprit de Wikipédia en partageant son attrait pour la culture libre et le "libre" en général.
+ L'application faisant fonctionner WikiLerni est un logiciel libre, c'est-à-dire que toute personne peut l'utiliser, étudier son code, le modifier, le distribuer selon son souhait. Ceci est également vrai pour le graphisme du site et les quizs eux-mêmes : texte d'introduction, questions/réponses, illustrations... Sauf exceptions indiquées.
+
+
Est-ce que WikiLerni est gratuit ?
+
+
Oui.. et non ! Réponse de normand venant d'un breton ? :-) Vous pouvez tout à fait parcourir WikiLerni, lire les articles proposés et répondre aux quizs.
+ Tout cela se fait sans avoir besoin de vous abonner et donc gratuitement. Par contre, si vous souhaitez garder vos résultats, recevoir par mail de nouvelles suggestions de lectures... vous devrez vous abonner au site. Vous pourrez alors tester gratuitement l'abonnement pendant une période de découverte. Ensuite, vous serez invité à souscrire à un abonnement, mais à un prix "libre", c'est-à-dire que différentes possibilités vous seront proposées. Tout le monde n'a pas les mêmes moyens, ni le même intérêt pour le WikiLerni, donc à vous de choisir en conscience.
+ Vous aimez WikiLerni, mais ne pouvez vraiment pas payer pour ce service ? Contactez-moi. Vous n'avez pas à vous justifier.
+ De même, si aucune des options ne vous convient ou encore si vous préférez un autre moyen de paiement (chèque, virement...), contactez-moi pour me dire ce que vous souhaitez. Des abonnements de groupe (famille, écoles, associations...) ou autres formules peuvent aussi être envisagées, dans la mesure où cela sera techniquement possible. Bref, nous sommes ici plus dans l'esprit d'un financement participatif que dans celui d'un abonnement classique. En souscrivant à un abonnement, vous permettez à WikiLerni d'exister.
+
+
À quoi va servir l'argent de mon abonnement ?
+
Cet argent va principalement servir à :
+
+
Payer les frais techniques liés au site : serveurs, routeurs e-mail, paiement en ligne...
+
Développer le logiciel libre permettant à WikiLerni de fonctionner.
+
Consacrer du temps à sélectionner les articles Wikipédia et préparer les questions.
+
Gérer le site au quotidien : répondre à vos courriels, communiquer, etc.
+
+
Tout cela sans vous imposer de publicités ou faire commerce de vos données personnelles.
+ Par ailleurs, une partie des bénéfices nets de WikiLerni seront distribués sous forme de dons à l'association Wikimédia France et aux développeurs des logiciels libres utilisés par WikiLerni. Je parle de bénéfices "nets", car au-delà des frais de fonctionnement, mon activité étant déclarée, il faut y soustraire TVA, cotisations, etc.
+ Pas de publicité, respect de vos données personnelles, activité déclarée en France... cela change, non ?
+
+
Comment puis-je aider WikiLerni ?
+
+
Tout d'abord en l'utilisant et me retournant vos éventuelles remarques/suggestions.
+ Un bug ? Une erreur d'orthographe ? Une suggestion de fonctionnalité ? Quelque chose que vous ne comprenez pas ? N'hésitez pas à me le dire, cela m'intéresse.
+ Ensuite, si vous avez les moyens, vous pouvez souscrire un abonnement payant pour permettre au projet de perdurer.
+ Et WikiLerni n'ayant pas les moyens des grandes sociétés pour communiquer, vous pouvez aussi en parler autour de vous, en ligne ou dans la vie de tous les jours.
+ Vous le savez sans doute, rien ne vaut le bouche à oreille !
+ Un système de parrainage est d'ailleurs prévu pour vous récompenser : à chaque fois qu'une personne inscrite en vous désignant comme "parrain" souscrit un abonnement payant, votre propre abonnement se trouve prolongé de 30 jours.
Paiement de votre abonnement annuel prémium à 12 € TTC/an.
+
+
+
+
Paiement de votre abonnement annuel prémium à 24 € TTC/an.
+
+
+
+
Paiement de votre abonnement annuel prémium à 60 € TTC/an.
+
+
+
+
Paiement de votre abonnement annuel prémium à 120 € TTC/an.
+
+
+
En cliquant sur le bouton de paiement, vous serez dirigé vers l'outil de facturation et de paiement en ligne. Lors de votre premier abonnement, vous devrez y créer un compte client qui est distinct de votre compte utilisateur WikiLerni. Vous pouvez y utiliser un mot de passe différent. Les années suivantes, lors de vos renouvellements, vous pourrez vous reconnecter à ce compte client.
+
+
+
+
+
Prix libre ?
+
WikiLerni pratique le "prix libre", c'est-à-dire que vous pouvez choisir quel montant vous êtes prêt à payer pour continuer à utiliser WikiLerni.
+
Cependant, il ne s'agit pas vraiment d'un don, car sans ce financement participatif, le site WikiLerni cessera son activité et vous ne pourrez donc plus l'utiliser.
+
Vous pouvez donc choisir en conscience ce que vous pouvez et souhaitez payer cette année pour WikiLerni, sachant que ce choix ne vous engagera pas pour les futurs renouvellements.
+
Une fois sélectionné le montant qui vous convient, il vous faudra cocher la case de validation des Conditions Générales de Vente, pour voir apparaître un bouton de paiement qui vous mènera sur l'outil de facturation et paiement en ligne de la société WebPortage.
+
Vous aimez WikiLerni, mais ne pouvez vraiment pas payer ? Vous préférez un autre montant ou un autre moyen de paiement (chèque, virement) ? Ou encore vous avez besoin d'explications ? Alors contactez-moi. Je me ferai un plaisir de vous répondre et d'essayer de m'adapter à chaque situation.
+
+
+
Les utilisateurs que vous avez parrainés
+
+
Vous pouvez parrainer d'autres utilisateurs. Pour ce faire, demandez-leur de saisir lors de l'inscription votre adresse e-mail ou encore le code suivant : .
+
À chaque fois qu'un utilisateur que vous avez parrainé souscrit ou renouvelle un abonnement payant, son abonnement comme le vôtre se trouve prolongé gratuitement de 30 jours. Cet avantage restera valable tant que cet utilisateur et vous-mêmes garderez votre compte WikiLerni.
+
+
Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme "parrain".
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/public/connexion.html b/front/public/connexion.html
new file mode 100644
index 0000000..928cffa
--- /dev/null
+++ b/front/public/connexion.html
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+ Se connecter à WikiLerni
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Si vous avez oublié votre mot de passe, il vous suffit de cocher la case "Je souhaite recevoir un lien de connexion par e-mail". Un lien valide pendant une courte durée vous permettra de vous connecter au site.
+
Si vous ne vous souvenez pas non plus de l'adresse e-mail utilisée sur ce site ou que vous n'y avez plus accès, vous pouvez nous contacter en fournissant des informations permettant de vous identifier.
+
La case "Je souhaite ne pas avoir à me connecter à chaque fois." vous permettra de rester connecté.e jusqu'à 6 mois, pour peu que vous utilisiez le même navigateur internet.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/public/contact.html b/front/public/contact.html
new file mode 100644
index 0000000..93445d4
--- /dev/null
+++ b/front/public/contact.html
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ WikiLerni : page de contact
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pour me contacter, le plus simple est de m'écrire sur l'adresse suivante : bonjour@wikilerni.com J'essayerai de vous répondre au plus tôt.
+
Je vous conseille d'ailleurs d'ajouter cette adresse à votre carnet d'adresse. Cela limitera le risque que les messages de WikiLerni finissent dans votre dossier "spam", voire soient complètement bloqués ...
+
Si vous souhaitez échanger par téléphone, merci d'indiquer vos coordonnées téléphoniques, ainsi que les créneaux horaires où vous êtes généralement disponibles.
+
D'une manière générale, merci de préciser votre demande dans votre message ! Ma boule de cristal fonctionne fort mal :)
+
Si vous êtes adepte du chiffrement de e-mails, vous pouvez télécharger ma clé OpenPGP publique. Si vous ne savez pas de quoi il s'agit, ne vous en préoccupez pas, mais je sais que les intéressés apprécieront :)
+
+
+
+
+
\ No newline at end of file
diff --git a/front/public/credits.html b/front/public/credits.html
new file mode 100644
index 0000000..3018575
--- /dev/null
+++ b/front/public/credits.html
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+ Qui sont les créateurs de WikiLerni et avec quelles licences ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Le logiciel servant à faire fonctionner WikiLerni est un logiciel libre. J'en suis le créateur et pour l'instant le principal développeur. Je me nomme Fabrice PENHOËT et pour en savoir plus sur moi, vous pouvez consulter mon CV en ligne. La licence utilisée est la GNU GENERAL PUBLIC LICENSE (GNU/GPLv3) dont vous pouvez lire la version officielle (en anglais). Pour des explications en français, évidemment, Wikipédia y consacre un article !
+
+
Le graphisme du site est la création de Denis SALEM. Les éléments graphiques sont soumis à la licence CC-By-SA. La partie logicielle (CSS...) étant de nouveau soumise à la licence GNU/GPLv3.
+
+
Les textes du site, et notamment les quizs et leur introduction sont eux-mêmes libres. Cette fois, la licence utilisée est la CC BY-SA 3.0, par cohérence avec celle utilisée par Wikipédia.
+
+
Les illustrations du site, notamment celles des quizs viennent principalement de Wikipédia. Les licences d'utilisation sont variables et un lien est généralement fourni. Les extraits des articles Wikipédia sont eux soumis à la licence CC BY-SA 3.0.
+
+
Si vous avez des doutes sur ce que vous pouvez faire ou pas du contenu de WikiLerni, n'hésitez pas à me demander. De même, si le logiciel utilisé par WikiLerni vous intéresse pour vos propres projets, mais que vous avez besoin d'aide pour le prendre en main, je peux vous fournir un devis sur demande.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/public/donnees.html b/front/public/donnees.html
new file mode 100644
index 0000000..0f0e157
--- /dev/null
+++ b/front/public/donnees.html
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+ WikiLerni et vos données personnelles
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
CNIL, RGPD... aujourd'hui toutes les organisations souhaitent montrer patte blanche quant au bon usage qu'elles font de vos données personnelles. Cela avec plus ou moins de sincérité et de pédagogie. Ici, je vous explique quelles données sont traitées par WikiLerni et pourquoi. Néanmoins, pour la responsabilité légale du site, merci de vous reporter aux CGU & CGV du site qui sont les seuls textes valables.
+
+
Les données liées à votre abonnement
+
+
Lorsque vous créez votre compte, vous devez choisir un pseudonyme qui est complètement libre, donc vous n'êtes pas obligé de saisir votre vrai nom.
+
+
De même, votre adresse e-mail est libre. Vous devez juste y avoir accès pour pouvoir valider la création de votre compte.
+ Pour l'instant, WikiLerni ne bloque pas les adresses e-mail jetables. Toutefois, sachez qu'elles peuvent fragiliser la sécurité de votre compte.
+ Par ailleurs, certains fournisseurs d'adresses e-mail rejettent sytématiquement les courriels venant de sites internet et vous ne pourrez donc pas valider votre compte, etc. Ce n'est pas un choix de WikiLerni.
+
+
Le mot de passe que vous choisissez est évidemment chiffré. Personne n'y a accès et je ne pourrai donc vous le redonner si vous l'avez oublié.
+ Mais vous pouvez vous connecter sans mot de passe en demandant à recevoir sur votre adresse e-mail un lien valable pendant une courte durée.
+
+
En résumé, je peux donc accéder à votre e-mail, le pseudonyme que vous avez choisi, ainsi que quelques informations telles que les dates de création/modification de vos informations ou encore la date de votre dernière connexion au site. Ceci est utile au bon fonctionnement du site.
+
+
J'ai aussi évidemment accès aux informations concernant votre abonnement (durée de votre abonnement, jours où vous souhaitez recevoir de nouveaux quizs, période de pauses, etc.). De nouveau, il s'agit d'informations nécessaires au site et que vous pouvez modifier vous-mêmes.
+
+
Lorsque que vous supprimez votre compte, toutes les données sont supprimées immédiatement et définitivement.
+ De même, si vous n'avez plus d'abonnement actif et que vous ne vous connectez pendant un certain nombre de mois, votre compte et ses informations sont supprimés définitivement.
+
+
En fait, vos données peuvent toujours apparaître un certain temps dans les sauvegardes du site, mais ne comptez pas dessus pour récupérer votre compte après une suppression. Ses sauvegardes existent pour permettre de remettre en route l'ensemble du site en cas d'incident.
+
+
Il existe quelques informations vous concernant auxquelles vous n'avez pas directement accès. Le décalage horaire de votre compte qui est détecté périodiquement lorsque vous vous connectez au site. En effet, pour WikiLerni vous envoi en général ces messages durant la nuit, mais l'heure n'est pas la même suivant si vous habitez en Nouvelle-Calédonie ou en métropole. Un champ mémo me permet d’enregistrer des données libres concernant votre compte. Il est vide dans 99 % des cas et ne contient rien de personnel. Mais vous pouvez me demander cette information si vous le souhaitez.
+
+
Les prestataires
+
+
Le site WikiLerni est hébergé sur un serveur situé en France et appartenant à une entreprise elle-même française (alwaysdata).
+
+
Pour envoyer ses e-mails en essayant d'éviter de se retrouver en "spam", WikiLerni utilise les services d'un routeur e-mail.
+ De nouveau, il s'agit d'une société française (Spirion), ses serveurs étant eux-mêmes situés en France (OVH) au moment où j'écris ce texte. Je l'ai choisie pour ça.
+ Donc, en théorie, ce prestataire peut avoir accès à votre adresse e-mail, mais à aucune autre information.
+ Il n'y aucun pistage des affichages ou clics des messages envoyés par WikiLerni, ce qui est chose rare !
+
Les données de facturation
+
+
Si vous optez pour un abonnement prémium, vous devrez passer par le site de la société WebPortage/Nodalys qui est une société de portage salarial me permettant d'avoir une activité déclarée en France. Les employés de Nodalys ont donc accès à vos données de facturation et paiement. Pour en savoir plus sur ce sujet cliquez-ici.
+
+
Ce logiciel de facturation est séparé de WikiLerni, tout comme ceux de Paypal ou Paybox qui vous permettrons de payer votre abonnement en ligne.
+ Si vous souhaitez éviter de passer par Paypal ou Paybox, vous pouvez me contacter pour demander un paiement par chèque ou virement.
+
Les statistiques de visite
+
+
Lorsque l'on gère un site internet, il est difficile de naviguer complètement à vue et avoir certaines informations sur les visites de son site est utile.
+ Pour ce faire WikiLerni privilégie en toute cohérence un logiciel libre nommé Matomo.
+ Ce logiciel est configuré conformément aux préconisations de la CNIL, c'est-à-dire entre autres pour ne pas collecter votre adresse IP, qui est une information permettant de vous identifier sur internet.
+ Par ailleurs, Matomo est inactif lorsque vous êtes connecté à votre compte WikiLerni.
+ Cet outil est installé sur un serveur internet situé en France et je suis la seule personne à avoir accès à ces informations.
+
+
Si vous souhaitez vous opposer à ce suivi statistique, vous pouvez utiliser le lien suivant :
+
+
+
Pour toutes questions/réclamations concernant vos données personnelles sur WikiLerni, n'hésitez pas à me contacter.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/front/public/gestion-quizs.html b/front/public/gestion-quizs.html
new file mode 100644
index 0000000..4665818
--- /dev/null
+++ b/front/public/gestion-quizs.html
@@ -0,0 +1,261 @@
+
+
+
+
+
+
+
+ Les quizs
+
+
+
+
+
+
+
+
+
+
+
+
+