UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

575 lines (571 loc) 69.6 kB
// To parse this data: // // import { Convert, Reunion, Agendas } from "./file"; // // const reunion = Convert.toReunion(json); // const agendas = Convert.toAgendas(json); // // These functions will throw an error if the JSON doesn't // match the expected interface, even if the JSON is valid. export let ReunionXsiType = /*#__PURE__*/function (ReunionXsiType) { ReunionXsiType["ReunionCommissionType"] = "reunionCommission_type"; ReunionXsiType["ReunionInitParlementaireType"] = "reunionInitParlementaire_type"; ReunionXsiType["SeanceType"] = "seance_type"; return ReunionXsiType; }({}); export let PointOdjXsiType = /*#__PURE__*/function (PointOdjXsiType) { PointOdjXsiType["PodjReunionType"] = "podjReunion_type"; PointOdjXsiType["PodjSeanceConfPresType"] = "podjSeanceConfPres_type"; return PointOdjXsiType; }({}); export let EtatCycleDeVie = /*#__PURE__*/function (EtatCycleDeVie) { EtatCycleDeVie["Annul\xE9"] = "Annul\xE9"; EtatCycleDeVie["Confirm\xE9"] = "Confirm\xE9"; EtatCycleDeVie["Eventuel"] = "Eventuel"; EtatCycleDeVie["Supprim\xE9"] = "Supprim\xE9"; return EtatCycleDeVie; }({}); export let NatureTravauxOdj = /*#__PURE__*/function (NatureTravauxOdj) { NatureTravauxOdj["Odjpr"] = "ODJPR"; NatureTravauxOdj["Odjsn"] = "ODJSN"; return NatureTravauxOdj; }({}); export let Procedure = /*#__PURE__*/function (Procedure) { Procedure["DiscussionG\xE9n\xE9raleCommune"] = "discussion g\xE9n\xE9rale commune"; Procedure["Proc\xE9dureDExamenSimplifi\xE9eArticle103"] = "proc\xE9dure d'examen simplifi\xE9e-Article 103"; Procedure["Proc\xE9dureDExamenSimplifi\xE9eArticle106"] = "proc\xE9dure d'examen simplifi\xE9e-Article 106"; Procedure["Proc\xE9dureDExamenSimplifi\xE9eArticle107"] = "proc\xE9dure d'examen simplifi\xE9e-Article 107"; Procedure["Proc\xE9dureDeL\xE9gislationEnCommissionArticle1071"] = "proc\xE9dure de l\xE9gislation en commission-Article 107-1"; return Procedure; }({}); export let TypePointOdj = /*#__PURE__*/function (TypePointOdj) { TypePointOdj["AmendementsArt88"] = "Amendements (Art. 88)"; TypePointOdj["AmendementsArt91"] = "Amendements (Art. 91)"; TypePointOdj["Audition"] = "Audition"; TypePointOdj["AuditionMinistre"] = "Audition ministre"; TypePointOdj["AuditionMinistreOuverte\xC0LaPresse"] = "Audition ministre ouverte \xE0 la presse"; TypePointOdj["AuditionOuverte\xC0LaPresse"] = "Audition ouverte \xE0 la presse"; TypePointOdj["Communication"] = "Communication"; TypePointOdj["ConstitutionDeMissionDInformation"] = "Constitution de mission d'information"; TypePointOdj["Discussion"] = "Discussion"; TypePointOdj["D\xE9batDInitiativeParlementaire"] = "D\xE9bat d'initiative parlementaire"; TypePointOdj["D\xE9clarationDuGouvernementSuivieDUnD\xE9bat"] = "D\xE9claration du Gouvernement suivie d'un d\xE9bat"; TypePointOdj["EchangesDeVues"] = "Echanges de vues"; TypePointOdj["Examen"] = "Examen"; TypePointOdj["ExplicationsDeVoteDesGroupesEtVoteParScrutinPublic"] = "Explications de vote des groupes et vote par scrutin public"; TypePointOdj["ExplicationsDeVoteEtVoteParScrutinPublic"] = "Explications de vote et vote par scrutin public"; TypePointOdj["FixationDeLOrdreDuJour"] = "Fixation de l'ordre du jour"; TypePointOdj["NominationBureau"] = "Nomination bureau"; TypePointOdj["NominationCandidatsOrganismeExtraparlementaire"] = "Nomination candidats organisme extraparlementaire"; TypePointOdj["NominationDUnMembreDUneMissionDInformation"] = "Nomination d'un membre d'une mission d'information"; TypePointOdj["NominationRapporteur"] = "Nomination rapporteur"; TypePointOdj["NominationRapporteurDApplication"] = "Nomination rapporteur d'application"; TypePointOdj["NominationRapporteurDInformation"] = "Nomination rapporteur d'information"; TypePointOdj["NominationRapporteurPourAvis"] = "Nomination rapporteur pour avis"; TypePointOdj["OuvertureEtCl\xF4tureDeSession"] = "Ouverture et cl\xF4ture de session"; TypePointOdj["QuestionsAuGouvernement"] = "Questions au Gouvernement"; TypePointOdj["QuestionsOralesSansD\xE9bat"] = "Questions orales sans d\xE9bat"; TypePointOdj["Rapport"] = "Rapport"; TypePointOdj["RapportDInformation"] = "Rapport d'information"; TypePointOdj["RapportPourAvis"] = "Rapport pour avis"; TypePointOdj["SeancesReserveesGroupeOppositionOuMinoritaire"] = "S\xE9ances r\xE9serv\xE9es \xE0 un groupe de l'opposition ou minoritaire"; TypePointOdj["SuiteDeLaDiscussion"] = "Suite de la discussion"; TypePointOdj["TableRonde"] = "Table ronde"; TypePointOdj["VoteParScrutinPublic"] = "Vote par scrutin public"; TypePointOdj["VoteSolennel"] = "Vote solennel"; return TypePointOdj; }({}); export let FormatReunion = /*#__PURE__*/function (FormatReunion) { FormatReunion["AuditionExterne"] = "AuditionExterne"; FormatReunion["AuditionParPresidentCommission"] = "AuditionParPresidentCommission"; FormatReunion["AuditionParRapporteur"] = "AuditionParRapporteur"; FormatReunion["Ordinaire"] = "Ordinaire"; return FormatReunion; }({}); export let Quantieme = /*#__PURE__*/function (Quantieme) { Quantieme["Deuxi\xE8me"] = "Deuxi\xE8me"; Quantieme["Premi\xE8re"] = "Premi\xE8re"; Quantieme["Troisi\xE8me"] = "Troisi\xE8me"; Quantieme["Unique"] = "Unique"; return Quantieme; }({}); export let Presence = /*#__PURE__*/function (Presence) { Presence["Absent"] = "absent"; Presence["Excus\xE9"] = "excus\xE9"; Presence["Pr\xE9sent"] = "pr\xE9sent"; return Presence; }({}); export let Civ = /*#__PURE__*/function (Civ) { Civ["M"] = "M."; Civ["Mme"] = "Mme"; return Civ; }({}); export let PersonneAuditionneeXsiType = /*#__PURE__*/function (PersonneAuditionneeXsiType) { PersonneAuditionneeXsiType["IdActeurType"] = "IdActeur_type"; PersonneAuditionneeXsiType["IdPersonneExterneType"] = "IdPersonneExterne_type"; return PersonneAuditionneeXsiType; }({}); export let TypeReunion = /*#__PURE__*/function (TypeReunion) { TypeReunion["Dep"] = "DEP"; // Député TypeReunion["Ga"] = "GA"; // Groupe d'amitié TypeReunion["Ge"] = "GE"; // Groupe d'étude TypeReunion["Gevi"] = "GEVI"; // Groupe d'étude à vocation internationale TypeReunion["Gp"] = "GP"; // Groupe parlementaire TypeReunion["H\xE9Aur\xE9lien"] = "H\xC9 Aur\xE9lien"; return TypeReunion; }({}); // Converts JSON strings to/from your types // and asserts the results of JSON.parse at runtime export class Convert { static toAgendas(json) { return cast(JSON.parse(json), r("Agendas")); } static agendasToJson(value) { return JSON.stringify(uncast(value, r("Agendas")), null, 2); } static toReunion(json) { return cast(JSON.parse(json), r("Reunion")); } static reunionToJson(value) { return JSON.stringify(uncast(value, r("Reunion")), null, 2); } } function invalidValue(typ, val, key = "") { if (key) { throw Error(`Invalid value for key "${key}". Expected type ${JSON.stringify(typ)} but got ${JSON.stringify(val)}`); } throw Error(`Invalid value ${JSON.stringify(val)} for type ${JSON.stringify(typ)}`); } function jsonToJSProps(typ) { if (typ.jsonToJS === undefined) { var map = {}; typ.props.forEach(p => map[p.json] = { key: p.js, typ: p.typ }); typ.jsonToJS = map; } return typ.jsonToJS; } function jsToJSONProps(typ) { if (typ.jsToJSON === undefined) { var map = {}; typ.props.forEach(p => map[p.js] = { key: p.json, typ: p.typ }); typ.jsToJSON = map; } return typ.jsToJSON; } function transform(val, typ, getProps, key = "") { function transformPrimitive(typ, val) { if (typeof typ === typeof val) return val; return invalidValue(typ, val, key); } function transformUnion(typs, val) { // val must validate against one typ in typs const l = typs.length; for (let i = 0; i < l; i++) { const typ = typs[i]; try { return transform(val, typ, getProps); } catch (_) {} } return invalidValue(typs, val); } function transformEnum(cases, val) { if (cases.indexOf(val) !== -1) return val; return invalidValue(cases, val); } function transformArray(typ, val) { // val must be an array with no invalid elements if (!Array.isArray(val)) return invalidValue("array", val); return val.map(el => transform(el, typ, getProps)); } function transformDate(val) { if (val === null) { return null; } const d = new Date(val); if (isNaN(d.valueOf())) { return invalidValue("Date", val); } return d; } function transformObject(props, additional, val) { if (val === null || typeof val !== "object" || Array.isArray(val)) { return invalidValue("object", val); } const result = {}; Object.getOwnPropertyNames(props).forEach(key => { const prop = props[key]; const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; result[prop.key] = transform(v, prop.typ, getProps, prop.key); }); Object.getOwnPropertyNames(val).forEach(key => { if (!Object.prototype.hasOwnProperty.call(props, key)) { result[key] = transform(val[key], additional, getProps, key); } }); return result; } if (typ === "any") return val; if (typ === null) { if (val === null) return val; return invalidValue(typ, val); } // if (typ === false) return invalidValue(typ, val) while (typeof typ === "object" && typ.ref !== undefined) { typ = typeMap[typ.ref]; } if (Array.isArray(typ)) return transformEnum(typ, val); if (typeof typ === "object") { return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val) : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val) : invalidValue(typ, val); } // Numbers can be parsed by Date but shouldn't be. if (typ === Date && typeof val !== "number") return transformDate(val); return transformPrimitive(typ, val); } function cast(val, typ) { return transform(val, typ, jsonToJSProps); } function uncast(val, typ) { return transform(val, typ, jsToJSONProps); } function a(typ) { return { arrayItems: typ }; } function u(...typs) { return { unionMembers: typs }; } function o(props, additional) { return { props, additional }; } // function m(additional: any) { // return { props: [], additional } // } function r(name) { return { ref: name }; } const typeMap = { Agendas: o([{ json: "reunions", js: "reunions", typ: a(r("Reunion")) }], false), Reunion: o([{ json: "schemaVersion", js: "schemaVersion", typ: u(undefined, "") }, { json: "xsiType", js: "xsiType", typ: u(undefined, r("ReunionXsiType")) }, { json: "uid", js: "uid", typ: "" }, { json: "timestampDebut", js: "timestampDebut", typ: Date }, { json: "timestampFin", js: "timestampFin", typ: u(undefined, Date) }, { json: "lieu", js: "lieu", typ: u(undefined, r("Lieu")) }, { json: "cycleDeVie", js: "cycleDeVie", typ: r("CycleDeVie") }, { json: "demandeurs", js: "demandeurs", typ: u(undefined, r("Demandeurs")) }, { json: "organeReuniRef", js: "organeReuniRef", typ: u(undefined, "") }, { json: "typeReunion", js: "typeReunion", typ: u(undefined, r("TypeReunion")) }, { json: "participants", js: "participants", typ: u(undefined, r("Participants")) }, { json: "sessionRef", js: "sessionRef", typ: u(undefined, "") }, { json: "ouverturePresse", js: "ouverturePresse", typ: u(undefined, false) }, { json: "odj", js: "odj", typ: u(undefined, r("Odj")) }, { json: "compteRenduRef", js: "compteRenduRef", typ: u(undefined, "") }, { json: "identifiants", js: "identifiants", typ: u(undefined, r("Identifiants")) }, { json: "formatReunion", js: "formatReunion", typ: u(undefined, r("FormatReunion")) }, { json: "infosReunionsInternationale", js: "infosReunionsInternationale", typ: u(undefined, r("InfosReunionsInternationale")) }, { json: "captationVideo", js: "captationVideo", typ: u(undefined, false) }, { json: "visioConference", js: "visioConference", typ: u(undefined, "") }], false), Odj: o([{ json: "convocationOdj", js: "convocationOdj", typ: u(undefined, a("")) }, { json: "resumeOdj", js: "resumeOdj", typ: u(undefined, a("")) }, { json: "pointsOdj", js: "pointsOdj", typ: u(undefined, a(r("PointOdj"))) }], false), PointOdj: o([{ json: "xsiType", js: "xsiType", typ: r("PointOdjXsiType") }, { json: "uid", js: "uid", typ: "" }, { json: "cycleDeVie", js: "cycleDeVie", typ: r("CycleDeVie") }, { json: "objet", js: "objet", typ: "" }, { json: "procedure", js: "procedure", typ: u(undefined, r("Procedure")) }, { json: "dossiersLegislatifsRefs", js: "dossiersLegislatifsRefs", typ: u(undefined, a("")) }, { json: "typePointOdj", js: "typePointOdj", typ: r("TypePointOdj") }, { json: "comiteSecret", js: "comiteSecret", typ: false }, { json: "natureTravauxOdj", js: "natureTravauxOdj", typ: u(undefined, r("NatureTravauxOdj")) }, { json: "dateConfPres", js: "dateConfPres", typ: u(undefined, Date) }, { json: "dateLettreMinistre", js: "dateLettreMinistre", typ: u(undefined, Date) }], false), CycleDeVie: o([{ json: "etat", js: "etat", typ: r("EtatCycleDeVie") }, { json: "chrono", js: "chrono", typ: r("Chrono") }], false), Chrono: o([{ json: "creation", js: "creation", typ: Date }, { json: "cloture", js: "cloture", typ: u(undefined, Date) }], false), Demandeurs: o([{ json: "acteurs", js: "acteurs", typ: u(undefined, a(r("DemandeurActeur"))) }, { json: "organe", js: "organe", typ: u(undefined, r("DemandeurOrgane")) }], false), DemandeurActeur: o([{ json: "nom", js: "nom", typ: u(undefined, "") }, { json: "acteurRef", js: "acteurRef", typ: "" }], false), DemandeurOrgane: o([{ json: "nom", js: "nom", typ: "" }, { json: "organeRef", js: "organeRef", typ: "" }], false), Identifiants: o([{ json: "numSeanceJo", js: "numSeanceJo", typ: u(undefined, "") }, { json: "idJo", js: "idJo", typ: u(undefined, "") }, { json: "quantieme", js: "quantieme", typ: r("Quantieme") }, { json: "dateSeance", js: "dateSeance", typ: Date }], false), InfosReunionsInternationale: o([{ json: "estReunionInternationale", js: "estReunionInternationale", typ: false }, { json: "listePays", js: "listePays", typ: u(undefined, a("")) }, { json: "informationsComplementaires", js: "informationsComplementaires", typ: u(undefined, "") }], false), Lieu: o([{ json: "code", js: "code", typ: u(undefined, "") }, { json: "libelleCourt", js: "libelleCourt", typ: u(undefined, "") }, { json: "libelleLong", js: "libelleLong", typ: u(undefined, "") }, { json: "lieuRef", js: "lieuRef", typ: u(undefined, "") }], false), Participants: o([{ json: "participantsInternes", js: "participantsInternes", typ: u(undefined, a(r("ParticipantInterne"))) }, { json: "personnesAuditionnees", js: "personnesAuditionnees", typ: u(undefined, a(r("PersonneAuditionnee"))) }], false), ParticipantInterne: o([{ json: "acteurRef", js: "acteurRef", typ: "" }, { json: "presence", js: "presence", typ: r("Presence") }], false), PersonneAuditionnee: o([{ json: "xsiType", js: "xsiType", typ: r("PersonneAuditionneeXsiType") }, { json: "uid", js: "uid", typ: "" }, { json: "ident", js: "ident", typ: r("Ident") }, { json: "dateNais", js: "dateNais", typ: u(undefined, Date) }], false), Ident: o([{ json: "civ", js: "civ", typ: r("Civ") }, { json: "prenom", js: "prenom", typ: "" }, { json: "nom", js: "nom", typ: "" }, { json: "alpha", js: "alpha", typ: u(undefined, "") }, { json: "trigramme", js: "trigramme", typ: u(undefined, "") }], false), ReunionXsiType: ["reunionCommission_type", "reunionInitParlementaire_type", "seance_type"], PointOdjXsiType: ["podjReunion_type", "podjSeanceConfPres_type"], EtatCycleDeVie: ["Annulé", "Confirmé", "Eventuel", "Supprimé"], NatureTravauxOdj: ["ODJPR", "ODJSN"], Procedure: ["discussion générale commune", "procédure d'examen simplifiée-Article 103", "procédure d'examen simplifiée-Article 106", "procédure d'examen simplifiée-Article 107", "procédure de législation en commission-Article 107-1"], TypePointOdj: ["Amendements (Art. 88)", "Amendements (Art. 91)", "Audition", "Audition ministre", "Audition ministre ouverte à la presse", "Audition ouverte à la presse", "Communication", "Constitution de mission d'information", "Discussion", "Débat d'initiative parlementaire", "Déclaration du Gouvernement suivie d'un débat", "Echanges de vues", "Examen", "Explications de vote des groupes et vote par scrutin public", "Explications de vote et vote par scrutin public", "Fixation de l'ordre du jour", "Nomination bureau", "Nomination candidats organisme extraparlementaire", "Nomination d'un membre d'une mission d'information", "Nomination rapporteur", "Nomination rapporteur d'application", "Nomination rapporteur d'information", "Nomination rapporteur pour avis", "Ouverture et clôture de session", "Questions au Gouvernement", "Questions orales sans débat", "Rapport", "Rapport d'information", "Rapport pour avis", "Séances réservées à un groupe de l'opposition ou minoritaire", "Suite de la discussion", "Table ronde", "Vote par scrutin public", "Vote solennel"], FormatReunion: ["AuditionExterne", "AuditionParPresidentCommission", "AuditionParRapporteur", "Ordinaire"], Quantieme: ["Deuxième", "Première", "Troisième", "Unique"], Presence: ["absent", "excusé", "présent"], Civ: ["M.", "Mme"], PersonneAuditionneeXsiType: ["IdActeur_type", "IdPersonneExterne_type"], TypeReunion: ["DEP", "GA", "GE", "GEVI", "GP", "HÉ Aurélien"] }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXVuaW9uWHNpVHlwZSIsIlBvaW50T2RqWHNpVHlwZSIsIkV0YXRDeWNsZURlVmllIiwiTmF0dXJlVHJhdmF1eE9kaiIsIlByb2NlZHVyZSIsIlR5cGVQb2ludE9kaiIsIkZvcm1hdFJldW5pb24iLCJRdWFudGllbWUiLCJQcmVzZW5jZSIsIkNpdiIsIlBlcnNvbm5lQXVkaXRpb25uZWVYc2lUeXBlIiwiVHlwZVJldW5pb24iLCJDb252ZXJ0IiwidG9BZ2VuZGFzIiwianNvbiIsImNhc3QiLCJKU09OIiwicGFyc2UiLCJyIiwiYWdlbmRhc1RvSnNvbiIsInZhbHVlIiwic3RyaW5naWZ5IiwidW5jYXN0IiwidG9SZXVuaW9uIiwicmV1bmlvblRvSnNvbiIsImludmFsaWRWYWx1ZSIsInR5cCIsInZhbCIsImtleSIsIkVycm9yIiwianNvblRvSlNQcm9wcyIsImpzb25Ub0pTIiwidW5kZWZpbmVkIiwibWFwIiwicHJvcHMiLCJmb3JFYWNoIiwicCIsImpzIiwianNUb0pTT05Qcm9wcyIsImpzVG9KU09OIiwidHJhbnNmb3JtIiwiZ2V0UHJvcHMiLCJ0cmFuc2Zvcm1QcmltaXRpdmUiLCJ0cmFuc2Zvcm1VbmlvbiIsInR5cHMiLCJsIiwibGVuZ3RoIiwiaSIsIl8iLCJ0cmFuc2Zvcm1FbnVtIiwiY2FzZXMiLCJpbmRleE9mIiwidHJhbnNmb3JtQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJlbCIsInRyYW5zZm9ybURhdGUiLCJkIiwiRGF0ZSIsImlzTmFOIiwidmFsdWVPZiIsInRyYW5zZm9ybU9iamVjdCIsImFkZGl0aW9uYWwiLCJyZXN1bHQiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvcCIsInYiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJyZWYiLCJ0eXBlTWFwIiwidW5pb25NZW1iZXJzIiwiYXJyYXlJdGVtcyIsImEiLCJ1IiwibyIsIm5hbWUiLCJBZ2VuZGFzIiwiUmV1bmlvbiIsIk9kaiIsIlBvaW50T2RqIiwiQ3ljbGVEZVZpZSIsIkNocm9ubyIsIkRlbWFuZGV1cnMiLCJEZW1hbmRldXJBY3RldXIiLCJEZW1hbmRldXJPcmdhbmUiLCJJZGVudGlmaWFudHMiLCJJbmZvc1JldW5pb25zSW50ZXJuYXRpb25hbGUiLCJMaWV1IiwiUGFydGljaXBhbnRzIiwiUGFydGljaXBhbnRJbnRlcm5lIiwiUGVyc29ubmVBdWRpdGlvbm5lZSIsIklkZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2FnZW5kYXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVG8gcGFyc2UgdGhpcyBkYXRhOlxuLy9cbi8vICAgaW1wb3J0IHsgQ29udmVydCwgUmV1bmlvbiwgQWdlbmRhcyB9IGZyb20gXCIuL2ZpbGVcIjtcbi8vXG4vLyAgIGNvbnN0IHJldW5pb24gPSBDb252ZXJ0LnRvUmV1bmlvbihqc29uKTtcbi8vICAgY29uc3QgYWdlbmRhcyA9IENvbnZlcnQudG9BZ2VuZGFzKGpzb24pO1xuLy9cbi8vIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSBKU09OIGRvZXNuJ3Rcbi8vIG1hdGNoIHRoZSBleHBlY3RlZCBpbnRlcmZhY2UsIGV2ZW4gaWYgdGhlIEpTT04gaXMgdmFsaWQuXG5cbmltcG9ydCB7IEFjdGV1ciwgT3JnYW5lIH0gZnJvbSBcIi4vYWN0ZXVyc19ldF9vcmdhbmVzXCJcblxuZXhwb3J0IGludGVyZmFjZSBBZ2VuZGFzIHtcbiAgcmV1bmlvbnM6IFJldW5pb25bXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldW5pb24ge1xuICBzY2hlbWFWZXJzaW9uPzogc3RyaW5nXG4gIHhzaVR5cGU/OiBSZXVuaW9uWHNpVHlwZVxuICB1aWQ6IHN0cmluZ1xuICB0aW1lc3RhbXBEZWJ1dDogRGF0ZVxuICB0aW1lc3RhbXBGaW4/OiBEYXRlXG4gIGxpZXU/OiBMaWV1XG4gIGN5Y2xlRGVWaWU6IEN5Y2xlRGVWaWVcbiAgZGVtYW5kZXVycz86IERlbWFuZGV1cnNcbiAgb3JnYW5lUmV1bmlSZWY/OiBzdHJpbmdcbiAgb3JnYW5lUmV1bmk/OiBPcmdhbmUgLy8gQWRkZWQgYnkgVHJpY290ZXVzZXNcbiAgdHlwZVJldW5pb24/OiBUeXBlUmV1bmlvblxuICBwYXJ0aWNpcGFudHM/OiBQYXJ0aWNpcGFudHNcbiAgc2Vzc2lvblJlZj86IHN0cmluZ1xuICBvdXZlcnR1cmVQcmVzc2U/OiBib29sZWFuXG4gIG9kaj86IE9kalxuICBjb21wdGVSZW5kdVJlZj86IHN0cmluZ1xuICBpZGVudGlmaWFudHM/OiBJZGVudGlmaWFudHNcbiAgZm9ybWF0UmV1bmlvbj86IEZvcm1hdFJldW5pb25cbiAgaW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlPzogSW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlXG4gIGNhcHRhdGlvblZpZGVvPzogYm9vbGVhblxuICB2aXNpb0NvbmZlcmVuY2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGVudW0gUmV1bmlvblhzaVR5cGUge1xuICBSZXVuaW9uQ29tbWlzc2lvblR5cGUgPSBcInJldW5pb25Db21taXNzaW9uX3R5cGVcIixcbiAgUmV1bmlvbkluaXRQYXJsZW1lbnRhaXJlVHlwZSA9IFwicmV1bmlvbkluaXRQYXJsZW1lbnRhaXJlX3R5cGVcIixcbiAgU2VhbmNlVHlwZSA9IFwic2VhbmNlX3R5cGVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPZGoge1xuICBjb252b2NhdGlvbk9kaj86IHN0cmluZ1tdXG4gIHJlc3VtZU9kaj86IHN0cmluZ1tdXG4gIHBvaW50c09kaj86IFBvaW50T2RqW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb2ludE9kaiB7XG4gIHhzaVR5cGU6IFBvaW50T2RqWHNpVHlwZVxuICB1aWQ6IHN0cmluZ1xuICBjeWNsZURlVmllOiBDeWNsZURlVmllXG4gIG9iamV0OiBzdHJpbmdcbiAgcHJvY2VkdXJlPzogUHJvY2VkdXJlXG4gIGRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzPzogc3RyaW5nW11cbiAgdHlwZVBvaW50T2RqOiBUeXBlUG9pbnRPZGpcbiAgY29taXRlU2VjcmV0OiBib29sZWFuXG4gIG5hdHVyZVRyYXZhdXhPZGo/OiBOYXR1cmVUcmF2YXV4T2RqXG4gIGRhdGVDb25mUHJlcz86IERhdGVcbiAgZGF0ZUxldHRyZU1pbmlzdHJlPzogRGF0ZVxufVxuXG5leHBvcnQgZW51bSBQb2ludE9kalhzaVR5cGUge1xuICBQb2RqUmV1bmlvblR5cGUgPSBcInBvZGpSZXVuaW9uX3R5cGVcIixcbiAgUG9kalNlYW5jZUNvbmZQcmVzVHlwZSA9IFwicG9kalNlYW5jZUNvbmZQcmVzX3R5cGVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDeWNsZURlVmllIHtcbiAgZXRhdDogRXRhdEN5Y2xlRGVWaWVcbiAgY2hyb25vOiBDaHJvbm9cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaHJvbm8ge1xuICBjcmVhdGlvbjogRGF0ZVxuICBjbG90dXJlPzogRGF0ZVxufVxuXG5leHBvcnQgZW51bSBFdGF0Q3ljbGVEZVZpZSB7XG4gIEFubnVsw6kgPSBcIkFubnVsw6lcIixcbiAgQ29uZmlybcOpID0gXCJDb25maXJtw6lcIixcbiAgRXZlbnR1ZWwgPSBcIkV2ZW50dWVsXCIsXG4gIFN1cHByaW3DqSA9IFwiU3VwcHJpbcOpXCIsXG59XG5cbmV4cG9ydCBlbnVtIE5hdHVyZVRyYXZhdXhPZGoge1xuICBPZGpwciA9IFwiT0RKUFJcIixcbiAgT2Rqc24gPSBcIk9ESlNOXCIsXG59XG5cbmV4cG9ydCBlbnVtIFByb2NlZHVyZSB7XG4gIERpc2N1c3Npb25Hw6luw6lyYWxlQ29tbXVuZSA9IFwiZGlzY3Vzc2lvbiBnw6luw6lyYWxlIGNvbW11bmVcIixcbiAgUHJvY8OpZHVyZURFeGFtZW5TaW1wbGlmacOpZUFydGljbGUxMDMgPSBcInByb2PDqWR1cmUgZCdleGFtZW4gc2ltcGxpZmnDqWUtQXJ0aWNsZSAxMDNcIixcbiAgUHJvY8OpZHVyZURFeGFtZW5TaW1wbGlmacOpZUFydGljbGUxMDYgPSBcInByb2PDqWR1cmUgZCdleGFtZW4gc2ltcGxpZmnDqWUtQXJ0aWNsZSAxMDZcIixcbiAgUHJvY8OpZHVyZURFeGFtZW5TaW1wbGlmacOpZUFydGljbGUxMDcgPSBcInByb2PDqWR1cmUgZCdleGFtZW4gc2ltcGxpZmnDqWUtQXJ0aWNsZSAxMDdcIixcbiAgUHJvY8OpZHVyZURlTMOpZ2lzbGF0aW9uRW5Db21taXNzaW9uQXJ0aWNsZTEwNzEgPSBcInByb2PDqWR1cmUgZGUgbMOpZ2lzbGF0aW9uIGVuIGNvbW1pc3Npb24tQXJ0aWNsZSAxMDctMVwiLFxufVxuXG5leHBvcnQgZW51bSBUeXBlUG9pbnRPZGoge1xuICBBbWVuZGVtZW50c0FydDg4ID0gXCJBbWVuZGVtZW50cyAoQXJ0LiA4OClcIixcbiAgQW1lbmRlbWVudHNBcnQ5MSA9IFwiQW1lbmRlbWVudHMgKEFydC4gOTEpXCIsXG4gIEF1ZGl0aW9uID0gXCJBdWRpdGlvblwiLFxuICBBdWRpdGlvbk1pbmlzdHJlID0gXCJBdWRpdGlvbiBtaW5pc3RyZVwiLFxuICBBdWRpdGlvbk1pbmlzdHJlT3V2ZXJ0ZcOATGFQcmVzc2UgPSBcIkF1ZGl0aW9uIG1pbmlzdHJlIG91dmVydGUgw6AgbGEgcHJlc3NlXCIsXG4gIEF1ZGl0aW9uT3V2ZXJ0ZcOATGFQcmVzc2UgPSBcIkF1ZGl0aW9uIG91dmVydGUgw6AgbGEgcHJlc3NlXCIsXG4gIENvbW11bmljYXRpb24gPSBcIkNvbW11bmljYXRpb25cIixcbiAgQ29uc3RpdHV0aW9uRGVNaXNzaW9uREluZm9ybWF0aW9uID0gXCJDb25zdGl0dXRpb24gZGUgbWlzc2lvbiBkJ2luZm9ybWF0aW9uXCIsXG4gIERpc2N1c3Npb24gPSBcIkRpc2N1c3Npb25cIixcbiAgRMOpYmF0REluaXRpYXRpdmVQYXJsZW1lbnRhaXJlID0gXCJEw6liYXQgZCdpbml0aWF0aXZlIHBhcmxlbWVudGFpcmVcIixcbiAgRMOpY2xhcmF0aW9uRHVHb3V2ZXJuZW1lbnRTdWl2aWVEVW5Ew6liYXQgPSBcIkTDqWNsYXJhdGlvbiBkdSBHb3V2ZXJuZW1lbnQgc3VpdmllIGQndW4gZMOpYmF0XCIsXG4gIEVjaGFuZ2VzRGVWdWVzID0gXCJFY2hhbmdlcyBkZSB2dWVzXCIsXG4gIEV4YW1lbiA9IFwiRXhhbWVuXCIsXG4gIEV4cGxpY2F0aW9uc0RlVm90ZURlc0dyb3VwZXNFdFZvdGVQYXJTY3J1dGluUHVibGljID0gXCJFeHBsaWNhdGlvbnMgZGUgdm90ZSBkZXMgZ3JvdXBlcyBldCB2b3RlIHBhciBzY3J1dGluIHB1YmxpY1wiLFxuICBFeHBsaWNhdGlvbnNEZVZvdGVFdFZvdGVQYXJTY3J1dGluUHVibGljID0gXCJFeHBsaWNhdGlvbnMgZGUgdm90ZSBldCB2b3RlIHBhciBzY3J1dGluIHB1YmxpY1wiLFxuICBGaXhhdGlvbkRlTE9yZHJlRHVKb3VyID0gXCJGaXhhdGlvbiBkZSBsJ29yZHJlIGR1IGpvdXJcIixcbiAgTm9taW5hdGlvbkJ1cmVhdSA9IFwiTm9taW5hdGlvbiBidXJlYXVcIixcbiAgTm9taW5hdGlvbkNhbmRpZGF0c09yZ2FuaXNtZUV4dHJhcGFybGVtZW50YWlyZSA9IFwiTm9taW5hdGlvbiBjYW5kaWRhdHMgb3JnYW5pc21lIGV4dHJhcGFybGVtZW50YWlyZVwiLFxuICBOb21pbmF0aW9uRFVuTWVtYnJlRFVuZU1pc3Npb25ESW5mb3JtYXRpb24gPSBcIk5vbWluYXRpb24gZCd1biBtZW1icmUgZCd1bmUgbWlzc2lvbiBkJ2luZm9ybWF0aW9uXCIsXG4gIE5vbWluYXRpb25SYXBwb3J0ZXVyID0gXCJOb21pbmF0aW9uIHJhcHBvcnRldXJcIixcbiAgTm9taW5hdGlvblJhcHBvcnRldXJEQXBwbGljYXRpb24gPSBcIk5vbWluYXRpb24gcmFwcG9ydGV1ciBkJ2FwcGxpY2F0aW9uXCIsXG4gIE5vbWluYXRpb25SYXBwb3J0ZXVyREluZm9ybWF0aW9uID0gXCJOb21pbmF0aW9uIHJhcHBvcnRldXIgZCdpbmZvcm1hdGlvblwiLFxuICBOb21pbmF0aW9uUmFwcG9ydGV1clBvdXJBdmlzID0gXCJOb21pbmF0aW9uIHJhcHBvcnRldXIgcG91ciBhdmlzXCIsXG4gIE91dmVydHVyZUV0Q2zDtHR1cmVEZVNlc3Npb24gPSBcIk91dmVydHVyZSBldCBjbMO0dHVyZSBkZSBzZXNzaW9uXCIsXG4gIFF1ZXN0aW9uc0F1R291dmVybmVtZW50ID0gXCJRdWVzdGlvbnMgYXUgR291dmVybmVtZW50XCIsXG4gIFF1ZXN0aW9uc09yYWxlc1NhbnNEw6liYXQgPSBcIlF1ZXN0aW9ucyBvcmFsZXMgc2FucyBkw6liYXRcIixcbiAgUmFwcG9ydCA9IFwiUmFwcG9ydFwiLFxuICBSYXBwb3J0REluZm9ybWF0aW9uID0gXCJSYXBwb3J0IGQnaW5mb3JtYXRpb25cIixcbiAgUmFwcG9ydFBvdXJBdmlzID0gXCJSYXBwb3J0IHBvdXIgYXZpc1wiLFxuICBTZWFuY2VzUmVzZXJ2ZWVzR3JvdXBlT3Bwb3NpdGlvbk91TWlub3JpdGFpcmUgPSBcIlPDqWFuY2VzIHLDqXNlcnbDqWVzIMOgIHVuIGdyb3VwZSBkZSBsJ29wcG9zaXRpb24gb3UgbWlub3JpdGFpcmVcIixcbiAgU3VpdGVEZUxhRGlzY3Vzc2lvbiA9IFwiU3VpdGUgZGUgbGEgZGlzY3Vzc2lvblwiLFxuICBUYWJsZVJvbmRlID0gXCJUYWJsZSByb25kZVwiLFxuICBWb3RlUGFyU2NydXRpblB1YmxpYyA9IFwiVm90ZSBwYXIgc2NydXRpbiBwdWJsaWNcIixcbiAgVm90ZVNvbGVubmVsID0gXCJWb3RlIHNvbGVubmVsXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVtYW5kZXVycyB7XG4gIGFjdGV1cnM/OiBEZW1hbmRldXJBY3RldXJbXVxuICBvcmdhbmU/OiBEZW1hbmRldXJPcmdhbmVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZW1hbmRldXJBY3RldXIge1xuICBub20/OiBzdHJpbmdcbiAgYWN0ZXVyUmVmOiBzdHJpbmdcbiAgYWN0ZXVyPzogQWN0ZXVyIC8vIEFkZGVkIGJ5IFRyaWNvdGV1c2VzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVtYW5kZXVyT3JnYW5lIHtcbiAgbm9tOiBzdHJpbmdcbiAgb3JnYW5lUmVmOiBzdHJpbmdcbiAgb3JnYW5lPzogT3JnYW5lIC8vIEFkZGVkIGJ5IFRyaWNvdGV1c2VzXG59XG5cbmV4cG9ydCBlbnVtIEZvcm1hdFJldW5pb24ge1xuICBBdWRpdGlvbkV4dGVybmUgPSBcIkF1ZGl0aW9uRXh0ZXJuZVwiLFxuICBBdWRpdGlvblBhclByZXNpZGVudENvbW1pc3Npb24gPSBcIkF1ZGl0aW9uUGFyUHJlc2lkZW50Q29tbWlzc2lvblwiLFxuICBBdWRpdGlvblBhclJhcHBvcnRldXIgPSBcIkF1ZGl0aW9uUGFyUmFwcG9ydGV1clwiLFxuICBPcmRpbmFpcmUgPSBcIk9yZGluYWlyZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aWZpYW50cyB7XG4gIG51bVNlYW5jZUpvPzogc3RyaW5nXG4gIGlkSm8/OiBzdHJpbmdcbiAgcXVhbnRpZW1lOiBRdWFudGllbWVcbiAgZGF0ZVNlYW5jZTogc3RyaW5nXG59XG5cbmV4cG9ydCBlbnVtIFF1YW50aWVtZSB7XG4gIERldXhpw6htZSA9IFwiRGV1eGnDqG1lXCIsXG4gIFByZW1pw6hyZSA9IFwiUHJlbWnDqHJlXCIsXG4gIFRyb2lzacOobWUgPSBcIlRyb2lzacOobWVcIixcbiAgVW5pcXVlID0gXCJVbmlxdWVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmZvc1JldW5pb25zSW50ZXJuYXRpb25hbGUge1xuICBlc3RSZXVuaW9uSW50ZXJuYXRpb25hbGU6IGJvb2xlYW5cbiAgbGlzdGVQYXlzPzogc3RyaW5nW11cbiAgaW5mb3JtYXRpb25zQ29tcGxlbWVudGFpcmVzPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlldSB7XG4gIGNvZGU/OiBzdHJpbmdcbiAgbGliZWxsZUNvdXJ0Pzogc3RyaW5nXG4gIGxpYmVsbGVMb25nPzogc3RyaW5nXG4gIGxpZXVSZWY/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWNpcGFudHMge1xuICBwYXJ0aWNpcGFudHNJbnRlcm5lcz86IFBhcnRpY2lwYW50SW50ZXJuZVtdXG4gIHBlcnNvbm5lc0F1ZGl0aW9ubmVlcz86IFBlcnNvbm5lQXVkaXRpb25uZWVbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpY2lwYW50SW50ZXJuZSB7XG4gIGFjdGV1clJlZjogc3RyaW5nXG4gIGFjdGV1cj86IEFjdGV1ciAvLyBBZGRlZCBieSBUcmljb3RldXNlc1xuICBwcmVzZW5jZTogUHJlc2VuY2Vcbn1cblxuZXhwb3J0IGVudW0gUHJlc2VuY2Uge1xuICBBYnNlbnQgPSBcImFic2VudFwiLFxuICBFeGN1c8OpID0gXCJleGN1c8OpXCIsXG4gIFByw6lzZW50ID0gXCJwcsOpc2VudFwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbm5lQXVkaXRpb25uZWUge1xuICB4c2lUeXBlOiBQZXJzb25uZUF1ZGl0aW9ubmVlWHNpVHlwZVxuICB1aWQ6IHN0cmluZ1xuICBpZGVudDogSWRlbnRcbiAgZGF0ZU5haXM/OiBEYXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnQge1xuICBjaXY6IENpdlxuICBwcmVub206IHN0cmluZ1xuICBub206IHN0cmluZ1xuICBhbHBoYT86IHN0cmluZ1xuICB0cmlncmFtbWU/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGVudW0gQ2l2IHtcbiAgTSA9IFwiTS5cIixcbiAgTW1lID0gXCJNbWVcIixcbn1cblxuZXhwb3J0IGVudW0gUGVyc29ubmVBdWRpdGlvbm5lZVhzaVR5cGUge1xuICBJZEFjdGV1clR5cGUgPSBcIklkQWN0ZXVyX3R5cGVcIixcbiAgSWRQZXJzb25uZUV4dGVybmVUeXBlID0gXCJJZFBlcnNvbm5lRXh0ZXJuZV90eXBlXCIsXG59XG5cbmV4cG9ydCBlbnVtIFR5cGVSZXVuaW9uIHtcbiAgRGVwID0gXCJERVBcIiwgLy8gRMOpcHV0w6lcbiAgR2EgPSBcIkdBXCIsIC8vIEdyb3VwZSBkJ2FtaXRpw6lcbiAgR2UgPSBcIkdFXCIsIC8vIEdyb3VwZSBkJ8OpdHVkZVxuICBHZXZpID0gXCJHRVZJXCIsIC8vIEdyb3VwZSBkJ8OpdHVkZSDDoCB2b2NhdGlvbiBpbnRlcm5hdGlvbmFsZVxuICBHcCA9IFwiR1BcIiwgLy8gR3JvdXBlIHBhcmxlbWVudGFpcmVcbiAgSMOpQXVyw6lsaWVuID0gXCJIw4kgQXVyw6lsaWVuXCIsXG59XG5cbi8vIENvbnZlcnRzIEpTT04gc3RyaW5ncyB0by9mcm9tIHlvdXIgdHlwZXNcbi8vIGFuZCBhc3NlcnRzIHRoZSByZXN1bHRzIG9mIEpTT04ucGFyc2UgYXQgcnVudGltZVxuZXhwb3J0IGNsYXNzIENvbnZlcnQge1xuICBwdWJsaWMgc3RhdGljIHRvQWdlbmRhcyhqc29uOiBzdHJpbmcpOiBBZ2VuZGFzIHtcbiAgICByZXR1cm4gY2FzdChKU09OLnBhcnNlKGpzb24pLCByKFwiQWdlbmRhc1wiKSlcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWdlbmRhc1RvSnNvbih2YWx1ZTogQWdlbmRhcyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHVuY2FzdCh2YWx1ZSwgcihcIkFnZW5kYXNcIikpLCBudWxsLCAyKVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1JldW5pb24oanNvbjogc3RyaW5nKTogUmV1bmlvbiB7XG4gICAgcmV0dXJuIGNhc3QoSlNPTi5wYXJzZShqc29uKSwgcihcIlJldW5pb25cIikpXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHJldW5pb25Ub0pzb24odmFsdWU6IFJldW5pb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh1bmNhc3QodmFsdWUsIHIoXCJSZXVuaW9uXCIpKSwgbnVsbCwgMilcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkVmFsdWUodHlwOiBhbnksIHZhbDogYW55LCBrZXk6IGFueSA9IFwiXCIpOiBuZXZlciB7XG4gIGlmIChrZXkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIi4gRXhwZWN0ZWQgdHlwZSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB0eXAsXG4gICAgICApfSBidXQgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsKX1gLFxuICAgIClcbiAgfVxuICB0aHJvdyBFcnJvcihcbiAgICBgSW52YWxpZCB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KHZhbCl9IGZvciB0eXBlICR7SlNPTi5zdHJpbmdpZnkodHlwKX1gLFxuICApXG59XG5cbmZ1bmN0aW9uIGpzb25Ub0pTUHJvcHModHlwOiBhbnkpOiBhbnkge1xuICBpZiAodHlwLmpzb25Ub0pTID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgbWFwOiBhbnkgPSB7fVxuICAgIHR5cC5wcm9wcy5mb3JFYWNoKChwOiBhbnkpID0+IChtYXBbcC5qc29uXSA9IHsga2V5OiBwLmpzLCB0eXA6IHAudHlwIH0pKVxuICAgIHR5cC5qc29uVG9KUyA9IG1hcFxuICB9XG4gIHJldHVybiB0eXAuanNvblRvSlNcbn1cblxuZnVuY3Rpb24ganNUb0pTT05Qcm9wcyh0eXA6IGFueSk6IGFueSB7XG4gIGlmICh0eXAuanNUb0pTT04gPT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBtYXA6IGFueSA9IHt9XG4gICAgdHlwLnByb3BzLmZvckVhY2goKHA6IGFueSkgPT4gKG1hcFtwLmpzXSA9IHsga2V5OiBwLmpzb24sIHR5cDogcC50eXAgfSkpXG4gICAgdHlwLmpzVG9KU09OID0gbWFwXG4gIH1cbiAgcmV0dXJuIHR5cC5qc1RvSlNPTlxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm0odmFsOiBhbnksIHR5cDogYW55LCBnZXRQcm9wczogYW55LCBrZXk6IGFueSA9IFwiXCIpOiBhbnkge1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1QcmltaXRpdmUodHlwOiBzdHJpbmcsIHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodHlwZW9mIHR5cCA9PT0gdHlwZW9mIHZhbCkgcmV0dXJuIHZhbFxuICAgIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwsIGtleSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybVVuaW9uKHR5cHM6IGFueVtdLCB2YWw6IGFueSk6IGFueSB7XG4gICAgLy8gdmFsIG11c3QgdmFsaWRhdGUgYWdhaW5zdCBvbmUgdHlwIGluIHR5cHNcbiAgICBjb25zdCBsID0gdHlwcy5sZW5ndGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgY29uc3QgdHlwID0gdHlwc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybSh2YWwsIHR5cCwgZ2V0UHJvcHMpXG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH1cbiAgICByZXR1cm4gaW52YWxpZFZhbHVlKHR5cHMsIHZhbClcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybUVudW0oY2FzZXM6IHN0cmluZ1tdLCB2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKGNhc2VzLmluZGV4T2YodmFsKSAhPT0gLTEpIHJldHVybiB2YWxcbiAgICByZXR1cm4gaW52YWxpZFZhbHVlKGNhc2VzLCB2YWwpXG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1BcnJheSh0eXA6IGFueSwgdmFsOiBhbnkpOiBhbnkge1xuICAgIC8vIHZhbCBtdXN0IGJlIGFuIGFycmF5IHdpdGggbm8gaW52YWxpZCBlbGVtZW50c1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gaW52YWxpZFZhbHVlKFwiYXJyYXlcIiwgdmFsKVxuICAgIHJldHVybiB2YWwubWFwKChlbCkgPT4gdHJhbnNmb3JtKGVsLCB0eXAsIGdldFByb3BzKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybURhdGUodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWwpXG4gICAgaWYgKGlzTmFOKGQudmFsdWVPZigpKSkge1xuICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZShcIkRhdGVcIiwgdmFsKVxuICAgIH1cbiAgICByZXR1cm4gZFxuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT2JqZWN0KFxuICAgIHByb3BzOiB7IFtrOiBzdHJpbmddOiBhbnkgfSxcbiAgICBhZGRpdGlvbmFsOiBhbnksXG4gICAgdmFsOiBhbnksXG4gICk6IGFueSB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZShcIm9iamVjdFwiLCB2YWwpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge31cbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm9wcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBwcm9wID0gcHJvcHNba2V5XVxuICAgICAgY29uc3QgdiA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGtleSlcbiAgICAgICAgPyB2YWxba2V5XVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgcmVzdWx0W3Byb3Aua2V5XSA9IHRyYW5zZm9ybSh2LCBwcm9wLnR5cCwgZ2V0UHJvcHMsIHByb3Aua2V5KVxuICAgIH0pXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJhbnNmb3JtKHZhbFtrZXldLCBhZGRpdGlvbmFsLCBnZXRQcm9wcywga2V5KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgaWYgKHR5cCA9PT0gXCJhbnlcIikgcmV0dXJuIHZhbFxuICBpZiAodHlwID09PSBudWxsKSB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuIHZhbFxuICAgIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwpXG4gIH1cbiAgLy8gaWYgKHR5cCA9PT0gZmFsc2UpIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwpXG4gIHdoaWxlICh0eXBlb2YgdHlwID09PSBcIm9iamVjdFwiICYmIHR5cC5yZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIHR5cCA9IHR5cGVNYXBbdHlwLnJlZl1cbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh0eXApKSByZXR1cm4gdHJhbnNmb3JtRW51bSh0eXAsIHZhbClcbiAgaWYgKHR5cGVvZiB0eXAgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gdHlwLmhhc093blByb3BlcnR5KFwidW5pb25NZW1iZXJzXCIpXG4gICAgICA/IHRyYW5zZm9ybVVuaW9uKHR5cC51bmlvbk1lbWJlcnMsIHZhbClcbiAgICAgIDogdHlwLmhhc093blByb3BlcnR5KFwiYXJyYXlJdGVtc1wiKVxuICAgICAgICA/IHRyYW5zZm9ybUFycmF5KHR5cC5hcnJheUl0ZW1zLCB2YWwpXG4gICAgICAgIDogdHlwLmhhc093blByb3BlcnR5KFwicHJvcHNcIilcbiAgICAgICAgICA/IHRyYW5zZm9ybU9iamVjdChnZXRQcm9wcyh0eXApLCB0eXAuYWRkaXRpb25hbCwgdmFsKVxuICAgICAgICAgIDogaW52YWxpZFZhbHVlKHR5cCwgdmFsKVxuICB9XG4gIC8vIE51bWJlcnMgY2FuIGJlIHBhcnNlZCBieSBEYXRlIGJ1dCBzaG91bGRuJ3QgYmUuXG4gIGlmICh0eXAgPT09IERhdGUgJiYgdHlwZW9mIHZhbCAhPT0gXCJudW1iZXJcIikgcmV0dXJuIHRyYW5zZm9ybURhdGUodmFsKVxuICByZXR1cm4gdHJhbnNmb3JtUHJpbWl0aXZlKHR5cCwgdmFsKVxufVxuXG5mdW5jdGlvbiBjYXN0PFQ+KHZhbDogYW55LCB0eXA6IGFueSk6IFQge1xuICByZXR1cm4gdHJhbnNmb3JtKHZhbCwgdHlwLCBqc29uVG9KU1Byb3BzKVxufVxuXG5mdW5jdGlvbiB1bmNhc3Q8VD4odmFsOiBULCB0eXA6IGFueSk6IGFueSB7XG4gIHJldHVybiB0cmFuc2Zvcm0odmFsLCB0eXAsIGpzVG9KU09OUHJvcHMpXG59XG5cbmZ1bmN0aW9uIGEodHlwOiBhbnkpIHtcbiAgcmV0dXJuIHsgYXJyYXlJdGVtczogdHlwIH1cbn1cblxuZnVuY3Rpb24gdSguLi50eXBzOiBhbnlbXSkge1xuICByZXR1cm4geyB1bmlvbk1lbWJlcnM6IHR5cHMgfVxufVxuXG5mdW5jdGlvbiBvKHByb3BzOiBhbnlbXSwgYWRkaXRpb25hbDogYW55KSB7XG4gIHJldHVybiB7IHByb3BzLCBhZGRpdGlvbmFsIH1cbn1cblxuLy8gZnVuY3Rpb24gbShhZGRpdGlvbmFsOiBhbnkpIHtcbi8vICAgcmV0dXJuIHsgcHJvcHM6IFtdLCBhZGRpdGlvbmFsIH1cbi8vIH1cblxuZnVuY3Rpb24gcihuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHsgcmVmOiBuYW1lIH1cbn1cblxuY29uc3QgdHlwZU1hcDogYW55ID0ge1xuICBBZ2VuZGFzOiBvKFxuICAgIFt7IGpzb246IFwicmV1bmlvbnNcIiwganM6IFwicmV1bmlvbnNcIiwgdHlwOiBhKHIoXCJSZXVuaW9uXCIpKSB9XSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgUmV1bmlvbjogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwic2NoZW1hVmVyc2lvblwiLCBqczogXCJzY2hlbWFWZXJzaW9uXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwieHNpVHlwZVwiLFxuICAgICAgICBqczogXCJ4c2lUeXBlXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIHIoXCJSZXVuaW9uWHNpVHlwZVwiKSksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcInVpZFwiLCBqczogXCJ1aWRcIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwidGltZXN0YW1wRGVidXRcIiwganM6IFwidGltZXN0YW1wRGVidXRcIiwgdHlwOiBEYXRlIH0sXG4gICAgICB7IGpzb246IFwidGltZXN0YW1wRmluXCIsIGpzOiBcInRpbWVzdGFtcEZpblwiLCB0eXA6IHUodW5kZWZpbmVkLCBEYXRlKSB9LFxuICAgICAgeyBqc29uOiBcImxpZXVcIiwganM6IFwibGlldVwiLCB0eXA6IHUodW5kZWZpbmVkLCByKFwiTGlldVwiKSkgfSxcbiAgICAgIHsganNvbjogXCJjeWNsZURlVmllXCIsIGpzOiBcImN5Y2xlRGVWaWVcIiwgdHlwOiByKFwiQ3ljbGVEZVZpZVwiKSB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImRlbWFuZGV1cnNcIixcbiAgICAgICAganM6IFwiZGVtYW5kZXVyc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCByKFwiRGVtYW5kZXVyc1wiKSksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcIm9yZ2FuZVJldW5pUmVmXCIsIGpzOiBcIm9yZ2FuZVJldW5pUmVmXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwidHlwZVJldW5pb25cIixcbiAgICAgICAganM6IFwidHlwZVJldW5pb25cIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgcihcIlR5cGVSZXVuaW9uXCIpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwicGFydGljaXBhbnRzXCIsXG4gICAgICAgIGpzOiBcInBhcnRpY2lwYW50c1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCByKFwiUGFydGljaXBhbnRzXCIpKSxcbiAgICAgIH0sXG4gICAgICB7IGpzb246IFwic2Vzc2lvblJlZlwiLCBqczogXCJzZXNzaW9uUmVmXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwib3V2ZXJ0dXJlUHJlc3NlXCIsXG4gICAgICAgIGpzOiBcIm91dmVydHVyZVByZXNzZVwiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBmYWxzZSksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcIm9kalwiLCBqczogXCJvZGpcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIk9kalwiKSkgfSxcbiAgICAgIHsganNvbjogXCJjb21wdGVSZW5kdVJlZlwiLCBqczogXCJjb21wdGVSZW5kdVJlZlwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImlkZW50aWZpYW50c1wiLFxuICAgICAgICBqczogXCJpZGVudGlmaWFudHNcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgcihcIklkZW50aWZpYW50c1wiKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImZvcm1hdFJldW5pb25cIixcbiAgICAgICAganM6IFwiZm9ybWF0UmV1bmlvblwiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCByKFwiRm9ybWF0UmV1bmlvblwiKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZVwiLFxuICAgICAgICBqczogXCJpbmZvc1JldW5pb25zSW50ZXJuYXRpb25hbGVcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgcihcIkluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZVwiKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImNhcHRhdGlvblZpZGVvXCIsXG4gICAgICAgIGpzOiBcImNhcHRhdGlvblZpZGVvXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGZhbHNlKSxcbiAgICAgIH0sXG4gICAgICB7IGpzb246IFwidmlzaW9Db25mZXJlbmNlXCIsIGpzOiBcInZpc2lvQ29uZmVyZW5jZVwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIE9kajogbyhcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiY29udm9jYXRpb25PZGpcIixcbiAgICAgICAganM6IFwiY29udm9jYXRpb25PZGpcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgYShcIlwiKSksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcInJlc3VtZU9kalwiLCBqczogXCJyZXN1bWVPZGpcIiwgdHlwOiB1KHVuZGVmaW5lZCwgYShcIlwiKSkgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJwb2ludHNPZGpcIixcbiAgICAgICAganM6IFwicG9pbnRzT2RqXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGEocihcIlBvaW50T2RqXCIpKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIFBvaW50T2RqOiBvKFxuICAgIFtcbiAgICAgIHsganNvbjogXCJ4c2lUeXBlXCIsIGpzOiBcInhzaVR5cGVcIiwgdHlwOiByKFwiUG9pbnRPZGpYc2lUeXBlXCIpIH0sXG4gICAgICB7IGpzb246IFwidWlkXCIsIGpzOiBcInVpZFwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJjeWNsZURlVmllXCIsIGpzOiBcImN5Y2xlRGVWaWVcIiwgdHlwOiByKFwiQ3ljbGVEZVZpZVwiKSB9LFxuICAgICAgeyBqc29uOiBcIm9iamV0XCIsIGpzOiBcIm9iamV0XCIsIHR5cDogXCJcIiB9LFxuICAgICAgeyBqc29uOiBcInByb2NlZHVyZVwiLCBqczogXCJwcm9jZWR1cmVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIlByb2NlZHVyZVwiKSkgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJkb3NzaWVyc0xlZ2lzbGF0aWZzUmVmc1wiLFxuICAgICAgICBqczogXCJkb3NzaWVyc0xlZ2lzbGF0aWZzUmVmc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKFwiXCIpKSxcbiAgICAgIH0sXG4gICAgICB7IGpzb246IFwidHlwZVBvaW50T2RqXCIsIGpzOiBcInR5cGVQb2ludE9kalwiLCB0eXA6IHIoXCJUeXBlUG9pbnRPZGpcIikgfSxcbiAgICAgIHsganNvbjogXCJjb21pdGVTZWNyZXRcIiwganM6IFwiY29taXRlU2VjcmV0XCIsIHR5cDogZmFsc2UgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJuYXR1cmVUcmF2YXV4T2RqXCIsXG4gICAgICAgIGpzOiBcIm5hdHVyZVRyYXZhdXhPZGpcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgcihcIk5hdHVyZVRyYXZhdXhPZGpcIikpLFxuICAgICAgfSxcbiAgICAgIHsganNvbjogXCJkYXRlQ29uZlByZXNcIiwganM6IFwiZGF0ZUNvbmZQcmVzXCIsIHR5cDogdSh1bmRlZmluZWQsIERhdGUpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiZGF0ZUxldHRyZU1pbmlzdHJlXCIsXG4gICAgICAgIGpzOiBcImRhdGVMZXR0cmVNaW5pc3RyZVwiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBEYXRlKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgQ3ljbGVEZVZpZTogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwiZXRhdFwiLCBqczogXCJldGF0XCIsIHR5cDogcihcIkV0YXRDeWNsZURlVmllXCIpIH0sXG4gICAgICB7IGpzb246IFwiY2hyb25vXCIsIGpzOiBcImNocm9ub1wiLCB0eXA6IHIoXCJDaHJvbm9cIikgfSxcbiAgICBdLFxuICAgIGZhbHNlLFxuICApLFxuICBDaHJvbm86IG8oXG4gICAgW1xuICAgICAgeyBqc29uOiBcImNyZWF0aW9uXCIsIGpzOiBcImNyZWF0aW9uXCIsIHR5cDogRGF0ZSB9LFxuICAgICAgeyBqc29uOiBcImNsb3R1cmVcIiwganM6IFwiY2xvdHVyZVwiLCB0eXA6IHUodW5kZWZpbmVkLCBEYXRlKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIERlbWFuZGV1cnM6IG8oXG4gICAgW1xuICAgICAge1xuICAgICAgICBqc29uOiBcImFjdGV1cnNcIixcbiAgICAgICAganM6IFwiYWN0ZXVyc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKHIoXCJEZW1hbmRldXJBY3RldXJcIikpKSxcbiAgICAgIH0sXG4gICAgICB7IGpzb246IFwib3JnYW5lXCIsIGpzOiBcIm9yZ2FuZVwiLCB0eXA6IHUodW5kZWZpbmVkLCByKFwiRGVtYW5kZXVyT3JnYW5lXCIpKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIERlbWFuZGV1ckFjdGV1cjogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwibm9tXCIsIGpzOiBcIm5vbVwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcImFjdGV1clJlZlwiLCBqczogXCJhY3RldXJSZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgRGVtYW5kZXVyT3JnYW5lOiBvKFxuICAgIFtcbiAgICAgIHsganNvbjogXCJub21cIiwganM6IFwibm9tXCIsIHR5cDogXCJcIiB9LFxuICAgICAgeyBqc29uOiBcIm9yZ2FuZVJlZlwiLCBqczogXCJvcmdhbmVSZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgSWRlbnRpZmlhbnRzOiBvKFxuICAgIFtcbiAgICAgIHsganNvbjogXCJudW1TZWFuY2VKb1wiLCBqczogXCJudW1TZWFuY2VKb1wiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcImlkSm9cIiwganM6IFwiaWRKb1wiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcInF1YW50aWVtZVwiLCBqczogXCJxdWFudGllbWVcIiwgdHlwOiByKFwiUXVhbnRpZW1lXCIpIH0sXG4gICAgICB7IGpzb246IFwiZGF0ZVNlYW5jZVwiLCBqczogXCJkYXRlU2VhbmNlXCIsIHR5cDogRGF0ZSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIEluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZTogbyhcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiZXN0UmV1bmlvbkludGVybmF0aW9uYWxlXCIsXG4gICAgICAgIGpzOiBcImVzdFJldW5pb25JbnRlcm5hdGlvbmFsZVwiLFxuICAgICAgICB0eXA6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsganNvbjogXCJsaXN0ZVBheXNcIiwganM6IFwibGlzdGVQYXlzXCIsIHR5cDogdSh1bmRlZmluZWQsIGEoXCJcIikpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiaW5mb3JtYXRpb25zQ29tcGxlbWVudGFpcmVzXCIsXG4gICAgICAgIGpzOiBcImluZm9ybWF0aW9uc0NvbXBsZW1lbnRhaXJlc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgTGlldTogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwiY29kZVwiLCBqczogXCJjb2RlXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7IGpzb246IFwibGliZWxsZUNvdXJ0XCIsIGpzOiBcImxpYmVsbGVDb3VydFwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcImxpYmVsbGVMb25nXCIsIGpzOiBcImxpYmVsbGVMb25nXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7IGpzb246IFwibGlldVJlZlwiLCBqczogXCJsaWV1UmVmXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgUGFydGljaXBhbnRzOiBvKFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJwYXJ0aWNpcGFudHNJbnRlcm5lc1wiLFxuICAgICAgICBqczogXCJwYXJ0aWNpcGFudHNJbnRlcm5lc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKHIoXCJQYXJ0aWNpcGFudEludGVybmVcIikpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwicGVyc29ubmVzQXVkaXRpb25uZWVzXCIsXG4gICAgICAgIGpzOiBcInBlcnNvbm5lc0F1ZGl0aW9ubmVlc1wiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKHIoXCJQZXJzb25uZUF1ZGl0aW9ubmVlXCIpKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIFBhcnRpY2lwYW50SW50ZXJuZTogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwiYWN0ZXVyUmVmXCIsIGpzOiBcImFjdGV1clJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJwcmVzZW5jZVwiLCBqczogXCJwcmVzZW5jZVwiLCB0eXA6IHIoXCJQcmVzZW5jZVwiKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIFBlcnNvbm5lQXVkaXRpb25uZWU6IG8oXG4gICAgW1xuICAgICAgeyBqc29uOiBcInhzaVR5cGVcIiwganM6IFwieHNpVHlwZVwiLCB0eXA6IHIoXCJQZXJzb25uZUF1ZGl0aW9ubmVlWHNpVHlwZVwiKSB9LFxuICAgICAgeyBqc29uOiBcInVpZFwiLCBqczogXCJ1aWRcIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwiaWRlbnRcIiwganM6IFwiaWRlbnRcIiwgdHlwOiByKFwiSWRlbnRcIikgfSxcbiAgICAgIHsganNvbjogXCJkYXRlTmFpc1wiLCBqczogXCJkYXRlTmFpc1wiLCB0eXA6IHUodW5kZWZpbmVkLCBEYXRlKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIElkZW50OiBvKFxuICAgIFtcbiAgICAgIHsganNvbjogXCJjaXZcIiwganM6IFwiY2l2XCIsIHR5cDogcihcIkNpdlwiKSB9LFxuICAgICAgeyBqc29uOiBcInByZW5vbVwiLCBqczogXCJwcmVub21cIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwibm9tXCIsIGpzOiBcIm5vbVwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJhbHBoYVwiLCBqczogXCJhbHBoYVwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgeyBqc29uOiBcInRyaWdyYW1tZVwiLCBqczogXCJ0cmlncmFtbWVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgXCJcIikgfSxcbiAgICBdLFxuICAgIGZhbHNlLFxuICApLFxuICBSZXVuaW9uWHNpVHlwZTogW1xuICAgIFwicmV1bmlvbkNvbW1pc3Npb25fdHlwZVwiLFxuICAgIFwicmV1bmlvbkluaXRQYXJsZW1lbnRhaXJlX3R5cGVcIixcbiAgICBcInNlYW5jZV90eXBlXCIsXG4gIF0sXG4gIFBvaW50T2RqWHNpVHlwZTogW1wicG9kalJldW5pb25fdHlwZVwiLCBcInBvZGpTZWFuY2VDb25mUHJlc190eXBlXCJdLFxuICBFdGF0Q3ljbGVEZVZpZTogW1wiQW5udWzDqVwiLCBcIkNvbmZpcm3DqVwiLCBcIkV2ZW50dWVsXCIsIFwiU3VwcHJpbcOpXCJdLFxuICBOYXR1cmVUcmF2YXV4T2RqOiBbXCJPREpQUlwiLCBcIk9ESlNOXCJdLFxuICBQcm9jZWR1cmU6IFtcbiAgICBcImRpc2N1c3Npb24gZ8OpbsOpcmFsZSBjb21tdW5lXCIsXG4gICAgXCJwcm9jw6lkdXJlIGQnZXhhbWVuIHNpbXBsaWZpw6llLUFydGljbGUgMTAzXCIsXG4gICAgXCJwcm9jw6lkdXJlIGQnZXhhbWVuIHNpbXBsaWZpw6llLUFydGljbGUgMTA2XCIsXG4gICAgXCJwcm9jw6lkdXJlIGQnZXhhbWVuIHNpbXBsaWZpw6llLUFydGljbGUgMTA3XCIsXG4gICAgXCJwcm9jw6lkdXJlIGRlIGzDqWdpc2xhdGlvbiBlbiBjb21taXNzaW9uLUFydGljbGUgMTA3LTFcIixcbiAgXSxcbiAgVHlwZVBvaW50T2RqOiBbXG4gICAgXCJBbWVuZGVtZW50cyAoQXJ0LiA4OClcIixcbiAgICBcIkFtZW5kZW1lbnRzIChBcnQuIDkxKVwiLFxuICAgIFwiQXVkaXRpb25cIixcbiAgICBcIkF1ZGl0aW9uIG1pbmlzdHJlXCIsXG4gICAgXCJBdWRpdGlvbiBtaW5pc3RyZSBvdXZlcnRlIMOgIGxhIHByZXNzZVwiLFxuICAgIFwiQXVkaXRpb24gb3V2ZXJ0ZSDDoCBsYSBwcmVzc2VcIixcbiAgICBcIkNvbW11bmljYXRpb25cIixcbiAgICBcIkNvbnN0aXR1dGlvbiBkZSBtaXNzaW9uIGQnaW5mb3JtYXRpb25cIixcbiAgICBcIkRpc2N1c3Npb25cIixcbiAgICBcIkTDqWJhdCBkJ2luaXRpYXRpdmUgcGFybGVtZW50YWlyZVwiLFxuICAgIFwiRMOpY2xhcmF0aW9uIGR1IEdvdXZlcm5lbWVudCBzdWl2aWUgZCd1biBkw6liYXRcIixcbiAgICBcIkVjaGFuZ2VzIGRlIHZ1ZXNcIixcbiAgICBcIkV4YW1lblwiLFxuICAgIFwiRXhwbGljYXRpb25zIGRlIHZvdGUgZGVzIGdyb3VwZXMgZXQgdm90ZSBwYXIgc2NydXRpbiBwdWJsaWNcIixcbiAgICBcIkV4cGxpY2F0aW9ucyBkZSB2b3RlIGV0IHZvdGUgcGFyIHNjcnV0aW4gcHVibGljXCIsXG4gICAgXCJGaXhhdGlvbiBkZSBsJ29yZHJlIGR1IGpvdXJcIixcbiAgICBcIk5vbWluYXRpb24gYnVyZWF1XCIsXG4gICAgXCJOb21pbmF0aW9uIGNhbmRpZGF0cyBvcmdhbmlzbWUgZXh0cmFwYXJsZW1lbnRhaXJlXCIsXG4gICAgXCJOb21pbmF0aW9uIGQndW4gbWVtYnJlIGQndW5lIG1pc3Npb24gZCdpbmZvcm1hdGlvblwiLFxuICAgIFwiTm9taW5hdGlvbiByYXBwb3J0ZXVyXCIsXG4gICAgXCJOb21pbmF0aW9uIHJhcHBvcnRldXIgZCdhcHBsaWNhdGlvblwiLFxuICAgIFwiTm9taW5hdGlvbiByYXBwb3J0ZXVyIGQnaW5mb3JtYXRpb25cIixcbiAgICBcIk5vbWluYXRpb24gcmFwcG9ydGV1ciBwb3VyIGF2aXNcIixcbiAgICBcIk91dmVydHVyZSBldCBjbMO0dHVyZSBkZSBzZXNzaW9uXCIsXG4gICAgXCJRdWVzdGlvbnMgYXUgR291dmVybmVtZW50XCIsXG4gICAgXCJRdWVzdGlvbnMgb3JhbGVzIHNhbnMgZMOpYmF0XCIsXG4gICAgXCJSYXBwb3J0XCIsXG4gICAgXCJSYXBwb3J0IGQnaW5mb3JtYXRpb25cIixcbiAgICBcIlJhcHBvcnQgcG91ciBhdmlzXCIsXG4gICAgXCJTw6lhbmNlcyByw6lzZXJ2w6llcyDDoCB1biBncm91cGUgZGUgbCdvcHBvc2l0aW9uIG91IG1pbm9yaXRhaXJlXCIsXG4gICAgXCJTdWl0ZSBkZSBsYSBkaXNjdXNzaW9uXCIsXG4gICAgXCJUYWJsZSByb25kZVwiLFxuICAgIFwiVm90ZSBwYXIgc2NydXRpbiBwdWJsaWNcIixcbiAgICBcIlZvdGUgc29sZW5uZWxcIixcbiAgXSxcbiAgRm9ybWF0UmV1bmlvbjogW1xuICAgIFwiQXVkaXRpb25FeHRlcm5lXCIsXG4gICAgXCJBdWRpdGlvblBhclByZXNpZGVudENvbW1pc3Npb25cIixcbiAgICBcIkF1ZGl0aW9uUGFyUmFwcG9ydGV1clwiLFxuICAgIFwiT3JkaW5haXJlXCIsXG4gIF0sXG4gIFF1YW50aWVtZTogW1wiRGV1eGnDqG1lXCIsIFwiUHJlbWnDqHJlXCIsIFwiVHJvaXNpw6htZVwiLCBcIlVuaXF1ZVwiXSxcbiAgUHJlc2VuY2U6IFtcImFic2VudFwiLCBcImV4Y3Vzw6lcIiwgXCJwcsOpc2VudFwiXSxcbiAgQ2l2OiBbXCJNLlwiLCBcIk1tZVwiXSxcbiAgUGVyc29ubmVBdWRpdGlvbm5lZVhzaVR5cGU6IFtcIklkQWN0ZXVyX3R5cGVcIiwgXCJJZFBlcnNvbm5lRXh0ZXJuZV90eXBlXCJdLFxuICBUeXBlUmV1bmlvbjogW1wiREVQXCIsIFwiR0FcIiwgXCJHRVwiLCBcIkdFVklcIiwgXCJHUFwiLCBcIkjDiSBBdXLDqWxpZW5cIl0sXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFnQ0EsV0FBWUEsY0FBYywwQkFBZEEsY0FBYztFQUFkQSxjQUFjO0VBQWRBLGNBQWM7RUFBZEEsY0FBYztFQUFBLE9BQWRBLGNBQWM7QUFBQTtBQTBCMUIsV0FBWUMsZUFBZSwwQkFBZkEsZUFBZTtFQUFmQSxlQUFlO0VBQWZBLGVBQWU7RUFBQSxPQUFmQSxlQUFlO0FBQUE7QUFlM0IsV0FBWUMsY0FBYywwQkFBZEEsY0FBYztFQUFkQSxjQUFjO0VBQWRBLGNBQWM7RUFBZEEsY0FBYztFQUFkQSxjQUFjO0VBQUEsT0FBZEEsY0FBYztBQUFBO0FBTzFCLFdBQVlDLGdCQUFnQiwwQkFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQWhCQSxnQkFBZ0I7RUFBQSxPQUFoQkEsZ0JBQWdCO0FBQUE7QUFLNUIsV0FBWUMsU0FBUywwQkFBVEEsU0FBUztFQUFUQSxTQUFTO0VBQVRBLFNBQVM7RUFBVEEsU0FBUztFQUFUQSxTQUFTO0VBQVRBLFNBQVM7RUFBQSxPQUFUQSxTQUFTO0FBQUE7QUFRckIsV0FBWUMsWUFBWSwwQkFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQUEsT0FBWkEsWUFBWTtBQUFBO0FBc0R4QixXQUFZQyxhQUFhLDBCQUFiQSxhQUFhO0VBQWJBLGFBQWE7RUFBYkEsYUFBYTtFQUFiQSxhQUFhO0VBQWJBLGFBQWE7RUFBQSxPQUFiQSxhQUFhO0FBQUE7QUFjekIsV0FBWUMsU0FBUywwQkFBVEEsU0FBUztFQUFUQSxTQUFTO0VBQVRBLFNBQVM7RUFBVEEsU0FBUztFQUFUQSxTQUFTO0VBQUEsT0FBVEEsU0FBUztBQUFBO0FBK0JyQixXQUFZQyxRQUFRLDBCQUFSQSxRQUFRO0VBQVJBLFFBQVE7RUFBUkEsUUFBUTtFQUFSQSxRQUFRO0VBQUEsT0FBUkEsUUFBUTtBQUFBO0FBcUJwQixXQUFZQyxHQUFHLDBCQUFIQSxHQUFHO0VBQUhBLEdBQUc7RUF