body{background-color:#f3c}

/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5jc3MiLCJzb3VyY2VzIjpbIm1haW4uc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3MvX3N1c3kuc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9sYW5ndWFnZS9fc3VzeS5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L19zdS5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L3N1L191dGlsaXRpZXMuc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9zdS9fc2V0dGluZ3Muc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9zdS9fdmFsaWRhdGlvbi5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L3N1L19ncmlkLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvb3V0cHV0L19mbG9hdC5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L291dHB1dC9fc2hhcmVkLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvb3V0cHV0L19zdXBwb3J0LnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvb3V0cHV0L3N1cHBvcnQvX3N1cHBvcnQuc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9vdXRwdXQvc3VwcG9ydC9fcHJlZml4LnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvb3V0cHV0L3N1cHBvcnQvX2JhY2tncm91bmQuc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9vdXRwdXQvc3VwcG9ydC9fYm94LXNpemluZy5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L291dHB1dC9zdXBwb3J0L19yZW0uc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9vdXRwdXQvc3VwcG9ydC9fY2xlYXJmaXguc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9vdXRwdXQvc2hhcmVkL19pbnNwZWN0LnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvb3V0cHV0L3NoYXJlZC9fb3V0cHV0LnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvb3V0cHV0L3NoYXJlZC9fZGlyZWN0aW9uLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvb3V0cHV0L3NoYXJlZC9fYmFja2dyb3VuZC5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L291dHB1dC9zaGFyZWQvX2NvbnRhaW5lci5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L291dHB1dC9zaGFyZWQvX21hcmdpbnMuc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9vdXRwdXQvc2hhcmVkL19wYWRkaW5nLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvb3V0cHV0L2Zsb2F0L19jb250YWluZXIuc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9vdXRwdXQvZmxvYXQvX3NwYW4uc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9vdXRwdXQvZmxvYXQvX2VuZC5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L291dHB1dC9mbG9hdC9faXNvbGF0ZS5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L2xhbmd1YWdlL3N1c3kvX3NldHRpbmdzLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvbGFuZ3VhZ2Uvc3VzeS9fdmFsaWRhdGlvbi5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L2xhbmd1YWdlL3N1c3kvX2dyaWRzLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvbGFuZ3VhZ2Uvc3VzeS9fYm94LXNpemluZy5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L2xhbmd1YWdlL3N1c3kvX2NvbnRleHQuc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9sYW5ndWFnZS9zdXN5L19iYWNrZ3JvdW5kLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvbGFuZ3VhZ2Uvc3VzeS9fY29udGFpbmVyLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvbGFuZ3VhZ2Uvc3VzeS9fc3Bhbi5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L2xhbmd1YWdlL3N1c3kvX2d1dHRlcnMuc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9sYW5ndWFnZS9zdXN5L19pc29sYXRlLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvbGFuZ3VhZ2Uvc3VzeS9fZ2FsbGVyeS5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L2xhbmd1YWdlL3N1c3kvX3Jvd3Muc2NzcyIsIi4uL25vZGVfbW9kdWxlcy9zdXN5L3Nhc3Mvc3VzeS9sYW5ndWFnZS9zdXN5L19tYXJnaW5zLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvbGFuZ3VhZ2Uvc3VzeS9fcGFkZGluZy5zY3NzIiwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5L2xhbmd1YWdlL3N1c3kvX2JsZWVkLnNjc3MiLCIuLi9ub2RlX21vZHVsZXMvc3VzeS9zYXNzL3N1c3kvbGFuZ3VhZ2Uvc3VzeS9fYnJlYWtwb2ludC1wbHVnaW4uc2NzcyJdLCJzb3VyY2VzQ29udGVudCI6WyJAaW1wb3J0IFwiLi4vbm9kZV9tb2R1bGVzL3N1c3kvc2Fzcy9zdXN5XCI7XG5cbiR0ZXN0LXZhcjogI2YzYztcblxuYm9keSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICR0ZXN0LXZhcjtcbn1cbiIsIi8vIFN1c3lcbi8vID09PT1cblxuQGltcG9ydCAnc3VzeS9sYW5ndWFnZS9zdXN5JztcbiIsIi8vIFN1c3kgTmV4dCBTeW50YXhcbi8vID09PT09PT09PT09PT09PT1cblxuJHN1c3ktdmVyc2lvbjogMi4xO1xuXG5AaW1wb3J0IFwiLi4vc3VcIjtcbkBpbXBvcnQgXCIuLi9vdXRwdXQvZmxvYXRcIjtcblxuQGltcG9ydCBcInN1c3kvc2V0dGluZ3NcIjtcbkBpbXBvcnQgXCJzdXN5L3ZhbGlkYXRpb25cIjtcbkBpbXBvcnQgXCJzdXN5L2dyaWRzXCI7XG5AaW1wb3J0IFwic3VzeS9ib3gtc2l6aW5nXCI7XG5AaW1wb3J0IFwic3VzeS9jb250ZXh0XCI7XG5AaW1wb3J0IFwic3VzeS9iYWNrZ3JvdW5kXCI7XG5AaW1wb3J0IFwic3VzeS9jb250YWluZXJcIjtcbkBpbXBvcnQgXCJzdXN5L3NwYW5cIjtcbkBpbXBvcnQgXCJzdXN5L2d1dHRlcnNcIjtcbkBpbXBvcnQgXCJzdXN5L2lzb2xhdGVcIjtcbkBpbXBvcnQgXCJzdXN5L2dhbGxlcnlcIjtcbkBpbXBvcnQgXCJzdXN5L3Jvd3NcIjtcbkBpbXBvcnQgXCJzdXN5L21hcmdpbnNcIjtcbkBpbXBvcnQgXCJzdXN5L3BhZGRpbmdcIjtcbkBpbXBvcnQgXCJzdXN5L2JsZWVkXCI7XG5AaW1wb3J0IFwic3VzeS9icmVha3BvaW50LXBsdWdpblwiO1xuIiwiLy8gU3Vcbi8vID09XG5cbkBpbXBvcnQgXCJzdS91dGlsaXRpZXNcIjtcbkBpbXBvcnQgXCJzdS9zZXR0aW5nc1wiO1xuQGltcG9ydCBcInN1L3ZhbGlkYXRpb25cIjtcbkBpbXBvcnQgXCJzdS9ncmlkXCI7XG4iLCIvLyBNYXAgRnVuY3Rpb25zXG4vLyA9PT09PT09PT09PT09XG5cblxuLy8gVHJ1bmNhdGUgTGlzdFxuLy8gLS0tLS0tLS0tLS0tLVxuLy8gLSBSZXR1cm4gYSBsaXN0LCB0cnVuY2F0ZWQgdG8gYSBnaXZlbiBsZW5ndGhcbkBmdW5jdGlvbiBfc3VzeS10cnVuY2F0ZS1saXN0KFxuICAkbGlzdCxcbiAgJGxlbmd0aFxuKSB7XG4gICRfcmV0dXJuOiAoKTtcblxuICBAZm9yICRpIGZyb20gMSB0aHJvdWdoIGxlbmd0aCgkbGlzdCkge1xuICAgICRfcmV0dXJuOiBpZigkaSA8PSAkbGVuZ3RoLCBhcHBlbmQoJF9yZXR1cm4sIG50aCgkbGlzdCwgJGkpKSwgJF9yZXR1cm4pO1xuICB9XG5cbiAgQHJldHVybiAkX3JldHVybjtcbn1cblxuXG4vLyBEZWVwIEdldFxuLy8gLS0tLS0tLS1cbi8vIC0gUmV0dXJuIGEgdmFsdWUgZGVlcCBpbiBuZXN0ZWQgbWFwc1xuQGZ1bmN0aW9uIF9zdXN5LWRlZXAtZ2V0KFxuICAkbWFwLFxuICAka2V5cy4uLlxuKSB7XG4gICRfcmV0dXJuOiAkbWFwO1xuXG4gIEBlYWNoICRrZXkgaW4gJGtleXMge1xuICAgIEBpZiB0eXBlLW9mKCRfcmV0dXJuKSA9PSBtYXAge1xuICAgICAgJF9yZXR1cm46IG1hcC1nZXQoJF9yZXR1cm4sICRrZXkpO1xuICAgIH1cbiAgfVxuXG4gIEByZXR1cm4gJF9yZXR1cm47XG59XG5cblxuLy8gRGVlcCBTZXRcbi8vIC0tLS0tLS0tXG4vLyAtIFNldCBhIHZhbHVlIGRlZXAgaW4gbmVzdGVkIG1hcHNcbkBmdW5jdGlvbiBfc3VzeS1kZWVwLXNldChcbiAgJG1hcCxcbiAgJGtleXMtdmFsdWUuLi5cbikge1xuICAkX3ZhbHVlOiBudGgoJGtleXMtdmFsdWUsIC0xKTtcbiAgJF9rZXlzOiBfc3VzeS10cnVuY2F0ZS1saXN0KCRrZXlzLXZhbHVlLCBsZW5ndGgoJGtleXMtdmFsdWUpIC0gMSk7XG4gICRfbGVuZ3RoOiBsZW5ndGgoJF9rZXlzKTtcbiAgJF9yZXR1cm46ICgpO1xuXG4gIEBmb3IgJGkgZnJvbSAxIHRocm91Z2ggJF9sZW5ndGgge1xuICAgICRfbjogMCAtICRpO1xuICAgICRfbGV2ZWw6IF9zdXN5LXRydW5jYXRlLWxpc3QoJF9rZXlzLCAkX2xlbmd0aCArICRfbik7XG4gICAgJF9sZXZlbDogX3N1c3ktZGVlcC1nZXQoJG1hcCwgJF9sZXZlbC4uLik7XG4gICAgJF9tZXJnZTogbnRoKCRfa2V5cywgJF9uKTtcbiAgICAkX21lcmdlOiAoJF9tZXJnZTogJF92YWx1ZSk7XG4gICAgJF9yZXR1cm46IGlmKCRfbGV2ZWwsIG1hcC1tZXJnZSgkX2xldmVsLCAkX21lcmdlKSwgJF9tZXJnZSk7XG4gICAgJF92YWx1ZTogJF9yZXR1cm47XG4gIH1cblxuICBAcmV0dXJuICRfcmV0dXJuO1xufVxuXG5cbi8vIERlZXAgTWVyZ2Vcbi8vIC0tLS0tLS0tLS1cbi8vIFJldHVybiAyIG9iamVjdHMgb2YgYW55IGRlcHRoLCBtZXJnZWRcbkBmdW5jdGlvbiBfc3VzeS1kZWVwLW1lcmdlKFxuICAkbWFwMSxcbiAgJG1hcDJcbikge1xuXG4gIEBpZiB0eXBlLW9mKCRtYXAxKSAhPSBtYXAgb3IgdHlwZS1vZigkbWFwMikgIT0gbWFwIHtcbiAgICAkbWFwMTogJG1hcDI7XG4gIH0gQGVsc2Uge1xuICAgIEBlYWNoICRrZXksICR2YWx1ZSBpbiAkbWFwMiB7XG4gICAgICAkX25ldzogKCRrZXk6IF9zdXN5X2RlZXAtbWVyZ2UobWFwLWdldCgkbWFwMSwgJGtleSksICR2YWx1ZSkpO1xuICAgICAgJG1hcDE6IG1hcC1tZXJnZSgkbWFwMSwgJF9uZXcpO1xuICAgIH1cbiAgfVxuXG4gIEByZXR1cm4gJG1hcDE7XG59XG5cblxuLy8gRGVlcCBIYXMtS2V5XG4vLyAtLS0tLS0tLS0tLS1cbi8vIC0gUmV0dXJuIHRydWUgaWYgYSBkZWVwIGtleSBleGlzdHNcbkBmdW5jdGlvbiBfc3VzeS1kZWVwLWhhcy1rZXkoXG4gICRtYXAsXG4gICRrZXlzLi4uXG4pIHtcbiAgJF9yZXR1cm46IG51bGw7XG4gICRfc3RvcDogZmFsc2U7XG5cbiAgQGVhY2ggJGtleSBpbiAka2V5cyB7XG4gICAgQGlmIG5vdCgkX3N0b3ApIHtcbiAgICAgICRfcmV0dXJuOiBtYXAtaGFzLWtleSgkbWFwLCAka2V5KTtcbiAgICB9XG5cbiAgICBAaWYgJF9yZXR1cm4ge1xuICAgICAgJG1hcDogbWFwLWdldCgkbWFwLCAka2V5KTtcbiAgICB9IEBlbHNlIHtcbiAgICAgICRfc3RvcDogdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBAcmV0dXJuICRfcmV0dXJuO1xufVxuIiwiLy8gU2V0dGluZ3Ncbi8vID09PT09PT09XG5cbi8vIFZlcnNpb25cbi8vIC0tLS0tLS1cbiRzdS12ZXJzaW9uOiAxLjE7XG5cblxuLy8gRGVmYXVsdCBTZXR0aW5nc1xuLy8gLS0tLS0tLS0tLS0tLS0tLVxuLy8gUFJJVkFURTogVGhlIGJhc2ljIHNldHRpbmdzXG4kc3VzeS1kZWZhdWx0czogKFxuICBjb2x1bW5zOiA0LFxuICBndXR0ZXJzOiAuMjUsXG4pO1xuXG5cbi8vIFVzZXIgU2V0dGluZ3Ncbi8vIC0tLS0tLS0tLS0tLS1cbi8vIC0gRGVmaW5lIHRoZSAkc3VzeSB2YXJpYWJsZSB3aXRoIGEgbWFwIG9mIHlvdXIgb3duIHNldHRpbmdzLlxuLy8gLSBTZXQgRUlUSEVSICRjb2x1bW4td2lkdGggT1IgJGNvbnRhaW5lclxuLy8gLSBVc2UgJGNvbHVtbi13aWR0aCBmb3Igc3RhdGljIGxheW91dHNcbiRzdXN5OiAoKSAhZGVmYXVsdDtcblxuXG4vLyBTdXN5IERlZmF1bHRzXG4vLyAtLS0tLS0tLS0tLS0tXG4vLyBQUklWQVRFOiBBZGQgZGVmYXVsdHMgdG8gU3VzeVxuQG1peGluIHN1c3ktZGVmYXVsdHMoXG4gICRkZWZhdWx0c1xuKSB7XG4gICRzdXN5LWRlZmF1bHRzOiBtYXAtbWVyZ2UoJHN1c3ktZGVmYXVsdHMsICRkZWZhdWx0cykgIWdsb2JhbDtcbn1cblxuXG4vLyBTdXN5IFNldFxuLy8gLS0tLS0tLS1cbi8vIENoYW5nZSBvbmUgc2V0dGluZ1xuLy8gLSAka2V5ICAgOiBzZXR0aW5nIG5hbWVcbi8vIC0gJHZhbHVlIDogc2V0dGluZyB2YWx1ZVxuQG1peGluIHN1c3ktc2V0KFxuICAka2V5LXZhbHVlLi4uXG4pIHtcbiAgJHN1c3k6IF9zdXN5LWRlZXAtc2V0KCRzdXN5LCAka2V5LXZhbHVlLi4uKSAhZ2xvYmFsO1xufVxuXG5cbi8vIFN1c3kgR2V0XG4vLyAtLS0tLS0tLVxuLy8gUmV0dXJuIG9uZSBzZXR0aW5nIGZyb20gYSBncmlkXG4vLyAtICRrZXkgICAgIDogPGtleXdvcmQ+XG4vLyAtICRsYXlvdXQgIDogPHNldHRpbmdzPlxuQGZ1bmN0aW9uIHN1c3ktZ2V0KFxuICAka2V5LFxuICAkbGF5b3V0OiBtYXAtbWVyZ2UoJHN1c3ktZGVmYXVsdHMsICRzdXN5KVxuKSB7XG4gICRsYXlvdXQ6IHBhcnNlLWdyaWQoJGxheW91dCk7XG4gICRfb3B0aW9uczogJGxheW91dCAkc3VzeSAkc3VzeS1kZWZhdWx0cztcbiAgJF9icmVhazogZmFsc2U7XG4gICRfcmV0dXJuOiBudWxsO1xuXG4gIEBlYWNoICRvcHQgaW4gJF9vcHRpb25zIHtcbiAgICBAaWYgdHlwZS1vZigkb3B0KSA9PSBtYXAgYW5kIG5vdCgkX2JyZWFrKSB7XG4gICAgICAkX2tleXNldDogX3N1c3ktZGVlcC1oYXMta2V5KCRvcHQsICRrZXkuLi4pO1xuICAgICAgQGlmICRfa2V5c2V0IHtcbiAgICAgICAgJF9yZXR1cm46IF9zdXN5LWRlZXAtZ2V0KCRvcHQsICRrZXkuLi4pO1xuICAgICAgICAkX2JyZWFrOiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEByZXR1cm4gJF9yZXR1cm47XG59XG4iLCIvLyBNYXRoIFZhbGlkYXRpb25cbi8vID09PT09PT09PT09PT09PVxuXG5cbi8vIFZhbGlkIENvbHVtbnNcbi8vIC0tLS0tLS0tLS0tLS1cbi8vIENoZWNrIHRoYXQgYSBjb2x1bW4gc2V0dGluZyBpcyB2YWxpZC5cbkBmdW5jdGlvbiB2YWxpZC1jb2x1bW5zKFxuICAkY29sdW1ucyxcbiAgJHNpbGVudDogZmFsc2Vcbikge1xuICAkdHlwZTogdHlwZS1vZigkY29sdW1ucyk7XG4gICRyZXR1cm46IG51bGw7XG5cbiAgQGlmICR0eXBlID09IG51bWJlciBhbmQgdW5pdGxlc3MoJGNvbHVtbnMpIHtcbiAgICAkcmV0dXJuOiAkY29sdW1ucztcbiAgfSBAZWxzZSBpZiAkdHlwZSA9PSBsaXN0IHtcbiAgICAkZmFpbDogbnVsbDtcbiAgICBAZWFjaCAkY29sIGluICRjb2x1bW5zIHtcbiAgICAgIEBpZiB0eXBlLW9mKCRjb2wpID09IG51bWJlciB7XG4gICAgICAgICRmYWlsOiAkZmFpbCBvciBpZih1bml0bGVzcygkY29sKSwgbnVsbCwgdHJ1ZSk7XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgJGZhaWw6IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgICRyZXR1cm46IGlmKCRmYWlsLCAkcmV0dXJuLCAkY29sdW1ucyk7XG4gIH1cblxuICBAaWYgJHJldHVybiAhPSAkY29sdW1ucyBhbmQgbm90KCRzaWxlbnQpIHtcbiAgICAkcmV0dXJuOiBudWxsO1xuICAgICR3YXJuOiAnJGNvbHVtbnMgbXVzdCBiZSBhIHVuaXRsZXNzIG51bWJlciBvciBsaXN0IG9mIHVuaXRsZXNzIG51bWJlcnMuJztcbiAgICBAd2FybiAkd2FybiArICcgQ3VycmVudCB2YWx1ZSBbI3skdHlwZX1dOiAjeyRjb2x1bW5zfSc7XG4gIH1cblxuICBAcmV0dXJuICRyZXR1cm47XG59XG5cblxuLy8gVmFsaWQgR3V0dGVyc1xuLy8gLS0tLS0tLS0tLS0tLVxuLy8gQ2hlY2sgdGhhdCBhIGd1dHRlciBzZXR0aW5nIGlzIHZhbGlkLlxuQGZ1bmN0aW9uIHZhbGlkLWd1dHRlcnMoXG4gICRndXR0ZXJzLFxuICAkc2lsZW50OiBmYWxzZVxuKSB7XG4gICR0eXBlOiB0eXBlLW9mKCRndXR0ZXJzKTtcbiAgJHJldHVybjogbnVsbDtcblxuICBAaWYgJHR5cGUgPT0gbnVtYmVyIGFuZCB1bml0bGVzcygkZ3V0dGVycykge1xuICAgICRyZXR1cm46ICRndXR0ZXJzO1xuICB9IEBlbHNlIGlmIG5vdCgkc2lsZW50KSB7XG4gICAgJHdhcm46ICckZ3V0dGVycyBtdXN0IGJlIGEgdW5pdGxlc3MgbnVtYmVyLic7XG4gICAgQHdhcm4gJHdhcm4gKyAnIEN1cnJlbnQgdmFsdWUgWyN7JHR5cGV9XTogI3skZ3V0dGVyc30nO1xuICB9XG5cbiAgQHJldHVybiAkcmV0dXJuO1xufVxuIiwiLy8gQ29sdW1uIG1hdGhcbi8vID09PT09PT09PT09XG5cblxuLy8gSXMgU3ltbWV0cmljYWxcbi8vIC0tLS0tLS0tLS0tLS0tXG4vLyBSZXR1cm5zIHRydWUgaWYgYSBncmlkIGlzIHN5bW1ldHJpY2FsLlxuLy8gLSBbJGNvbHVtbnNdICAgOiA8bnVtYmVyPiB8IDxsaXN0PlxuQGZ1bmN0aW9uIGlzLXN5bW1ldHJpY2FsKFxuICAkY29sdW1uczogc3VzeS1nZXQoY29sdW1ucylcbikge1xuICAkY29sdW1uczogdmFsaWQtY29sdW1ucygkY29sdW1ucyk7XG4gIEByZXR1cm4gaWYodHlwZS1vZigkY29sdW1ucykgPT0gbnVtYmVyLCAkY29sdW1ucywgbnVsbCk7XG59XG5cblxuLy8gU3VzeSBDb3VudFxuLy8gLS0tLS0tLS0tLVxuLy8gRmluZCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSBnaXZlbiBsYXlvdXRcbi8vIC0gWyRjb2x1bW5zXSAgIDogPG51bWJlcj4gfCA8bGlzdD5cbkBmdW5jdGlvbiBzdXN5LWNvdW50KFxuICAkY29sdW1uczogc3VzeS1nZXQoY29sdW1ucylcbikge1xuICAkY29sdW1uczogdmFsaWQtY29sdW1ucygkY29sdW1ucyk7XG4gIEByZXR1cm4gaXMtc3ltbWV0cmljYWwoJGNvbHVtbnMpIG9yIGxlbmd0aCgkY29sdW1ucyk7XG59XG5cblxuLy8gU3VzeSBTdW1cbi8vIC0tLS0tLS0tXG4vLyBGaW5kIHRoZSB0b3RhbCBzdW0gb2YgY29sdW1uLXVuaXRzIGluIGEgbGF5b3V0XG4vLyAtIFskY29sdW1uc10gICA6IDxudW1iZXI+IHwgPGxpc3Q+XG4vLyAtIFskZ3V0dGVyc10gICA6IDxyYXRpbz5cbi8vIC0gWyRzcHJlYWRdICAgIDogZmFsc2UvbmFycm93IHwgd2lkZSB8IHdpZGVyXG5AZnVuY3Rpb24gc3VzeS1zdW0oXG4gICRjb2x1bW5zICA6IHN1c3ktZ2V0KGNvbHVtbnMpLFxuICAkZ3V0dGVycyAgOiBzdXN5LWdldChndXR0ZXJzKSxcbiAgJHNwcmVhZCAgIDogZmFsc2Vcbikge1xuICAkY29sdW1uczogdmFsaWQtY29sdW1ucygkY29sdW1ucyk7XG4gICRndXR0ZXJzOiB2YWxpZC1ndXR0ZXJzKCRndXR0ZXJzKTtcblxuICAkc3ByZWFkOiBpZigkc3ByZWFkID09IHdpZGUsIDAsIGlmKCRzcHJlYWQgPT0gd2lkZXIsIDEsIC0xKSk7XG4gICRndXR0ZXItc3VtOiAoc3VzeS1jb3VudCgkY29sdW1ucykgKyAkc3ByZWFkKSAqICRndXR0ZXJzO1xuICAkY29sdW1uLXN1bTogaXMtc3ltbWV0cmljYWwoJGNvbHVtbnMpO1xuXG4gIEBpZiBub3QoJGNvbHVtbi1zdW0pIHtcbiAgICBAZWFjaCAkY29sdW1uIGluICRjb2x1bW5zIHtcbiAgICAgICRjb2x1bW4tc3VtOiAoJGNvbHVtbi1zdW0gb3IgMCkgKyAkY29sdW1uO1xuICAgIH1cbiAgfVxuXG4gIEByZXR1cm4gJGNvbHVtbi1zdW0gKyAkZ3V0dGVyLXN1bTtcbn1cblxuXG4vLyBTdXN5IFNsaWNlXG4vLyAtLS0tLS0tLS0tXG4vLyBSZXR1cm4gYSBzdWJzZXQgb2YgY29sdW1ucyBhdCBhIGdpdmVuIGxvY2F0aW9uLlxuLy8gLSAkc3BhbiAgICAgICAgOiA8bnVtYmVyPlxuLy8gLSAkbG9jYXRpb24gICAgOiA8bnVtYmVyPlxuLy8gLSBbJGNvbHVtbnNdICAgOiA8bnVtYmVyPiB8IDxsaXN0PlxuQGZ1bmN0aW9uIHN1c3ktc2xpY2UoXG4gICRzcGFuLFxuICAkbG9jYXRpb24sXG4gICRjb2x1bW5zOiBzdXN5LWdldChjb2x1bW5zKVxuKSB7XG4gICRjb2x1bW5zOiB2YWxpZC1jb2x1bW5zKCRjb2x1bW5zKTtcbiAgJHN1Yi1jb2x1bW5zOiAkc3BhbjtcblxuICBAaWYgbm90KGlzLXN5bW1ldHJpY2FsKCRjb2x1bW5zKSkge1xuICAgICRsb2NhdGlvbjogJGxvY2F0aW9uIG9yIDE7XG4gICAgJHN1Yi1jb2x1bW5zOiAoKTtcbiAgICBAZm9yICRpIGZyb20gJGxvY2F0aW9uIHRvICgkbG9jYXRpb24gKyAkc3Bhbikge1xuICAgICAgJHN1Yi1jb2x1bW5zOiBhcHBlbmQoJHN1Yi1jb2x1bW5zLCBudGgoJGNvbHVtbnMsICRpKSk7XG4gICAgfVxuICB9XG5cbiAgQHJldHVybiAkc3ViLWNvbHVtbnM7XG59XG5cblxuLy8gU3VzeVxuLy8gLS0tLVxuLy8gRmluZCB0aGUgc3VtIG9mIGEgY29sdW1uLXNwYW4uXG4vLyAtICRzcGFuICAgICAgICA6IDxudW1iZXI+XG4vLyAtICRsb2NhdGlvbiAgICA6IDxudW1iZXI+XG4vLyAtIFskY29sdW1uc10gICA6IDxudW1iZXI+IHwgPGxpc3Q+XG4vLyAtIFskZ3V0dGVyc10gICA6IDxyYXRpbz5cbi8vIC0gWyRzcHJlYWRdICAgIDogZmFsc2UvbmFycm93IHwgd2lkZSB8IHdpZGVyXG5AZnVuY3Rpb24gc3VzeShcbiAgJHNwYW4sXG4gICRsb2NhdGlvbiAgICAgOiBmYWxzZSxcbiAgJGNvbHVtbnMgICAgICA6IHN1c3ktZ2V0KGNvbHVtbnMpLFxuICAkZ3V0dGVycyAgICAgIDogc3VzeS1nZXQoZ3V0dGVycyksXG4gICRzcHJlYWQgICAgICAgOiBmYWxzZVxuKSB7XG4gICRjb2x1bW5zOiB2YWxpZC1jb2x1bW5zKCRjb2x1bW5zKTtcbiAgJGd1dHRlcnM6IHZhbGlkLWd1dHRlcnMoJGd1dHRlcnMpO1xuICAkc3Bhbjogc3VzeS1zbGljZSgkc3BhbiwgJGxvY2F0aW9uLCAkY29sdW1ucyk7XG5cbiAgQHJldHVybiBzdXN5LXN1bSgkc3BhbiwgJGd1dHRlcnMsICRzcHJlYWQpO1xufVxuIiwiLy8gRmxvYXQgQVBJXG4vLyA9PT09PT09PT1cblxuQGltcG9ydCBcInNoYXJlZFwiO1xuXG5AaW1wb3J0IFwiZmxvYXQvY29udGFpbmVyXCI7XG5AaW1wb3J0IFwiZmxvYXQvc3BhblwiO1xuQGltcG9ydCBcImZsb2F0L2VuZFwiO1xuQGltcG9ydCBcImZsb2F0L2lzb2xhdGVcIjtcbiIsIi8vIFNoYXJlZCBBUElcbi8vID09PT09PT09PT1cblxuQGltcG9ydCBcInN1cHBvcnRcIjtcblxuQGltcG9ydCBcInNoYXJlZC9pbnNwZWN0XCI7XG5AaW1wb3J0IFwic2hhcmVkL291dHB1dFwiO1xuQGltcG9ydCBcInNoYXJlZC9kaXJlY3Rpb25cIjtcbkBpbXBvcnQgXCJzaGFyZWQvYmFja2dyb3VuZFwiO1xuQGltcG9ydCBcInNoYXJlZC9jb250YWluZXJcIjtcbkBpbXBvcnQgXCJzaGFyZWQvbWFyZ2luc1wiO1xuQGltcG9ydCBcInNoYXJlZC9wYWRkaW5nXCI7XG5cblxuXG4iLCIvLyBTdXN5IEJyb3dzZXIgU3VwcG9ydFxuLy8gPT09PT09PT09PT09PT09PT09PT1cblxuQGltcG9ydCBcInN1cHBvcnQvc3VwcG9ydFwiO1xuQGltcG9ydCBcInN1cHBvcnQvcHJlZml4XCI7XG5AaW1wb3J0IFwic3VwcG9ydC9iYWNrZ3JvdW5kXCI7XG5AaW1wb3J0IFwic3VwcG9ydC9ib3gtc2l6aW5nXCI7XG5AaW1wb3J0IFwic3VwcG9ydC9yZW1cIjtcbkBpbXBvcnQgXCJzdXBwb3J0L2NsZWFyZml4XCI7XG4iLCIvLyBCcm93c2VyIFN1cHBvcnRcbi8vID09PT09PT09PT09PT09PVxuXG4vLyBTdXN5IFN1cHBvcnQgRGVmYXVsdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQGluY2x1ZGUgc3VzeS1kZWZhdWx0cygoXG4gIHVzZS1jdXN0b206IChcbiAgICBjbGVhcmZpeDogZmFsc2UsXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdHJ1ZSxcbiAgICBiYWNrZ3JvdW5kLW9wdGlvbnM6IGZhbHNlLFxuICAgIGJyZWFrcG9pbnQ6IHRydWUsXG4gICAgYm94LXNpemluZzogdHJ1ZSxcbiAgICByZW06IHRydWUsXG4gICksXG4pKTtcblxuXG4vLyBTdXN5IFN1cHBvcnQgW21peGluXVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlbmQgcHJvcGVydHktdmFsdWUgcGFpcnMgdG8gdGhlIHByb3BlciBzdXBwb3J0IG1vZHVsZXMuXG4vLyAtICRwcm9wICA6IDxjc3MgcHJvcGVydHk+XG4vLyAtICR2YWwgICA6IDxjc3MgdmFsdWU+XG5AbWl4aW4gc3VzeS1zdXBwb3J0KFxuICAkcHJvcCxcbiAgJHZhbFxuKSB7XG4gIC8vIEJhY2tncm91bmQgU3VwcG9ydFxuICBAaWYgJHByb3AgPT0gYmFja2dyb3VuZC1pbWFnZSB7XG4gICAgQGluY2x1ZGUgc3VzeS1iYWNrZ3JvdW5kLWltYWdlKCR2YWwpO1xuICB9IEBlbHNlIGlmICRwcm9wID09IGJhY2tncm91bmQtc2l6ZSB7XG4gICAgQGluY2x1ZGUgc3VzeS1iYWNrZ3JvdW5kLXNpemUoJHZhbCk7XG4gIH0gQGVsc2UgaWYgJHByb3AgPT0gYmFja2dyb3VuZC1vcmlnaW4ge1xuICAgIEBpbmNsdWRlIHN1c3ktYmFja2dyb3VuZC1vcmlnaW4oJHZhbCk7XG4gIH0gQGVsc2UgaWYgJHByb3AgPT0gYmFja2dyb3VuZC1jbGlwIHtcbiAgICBAaW5jbHVkZSBzdXN5LWJhY2tncm91bmQtY2xpcCgkdmFsKTtcbiAgfVxuXG4gIC8vIEJveC1TaXppbmcgU3VwcG9ydFxuICBAZWxzZSBpZiAkcHJvcCA9PSBib3gtc2l6aW5nIHtcbiAgICBAaW5jbHVkZSBzdXN5LWJveC1zaXppbmcoJHZhbCk7XG4gIH1cblxuICAvLyBSZW0gU3VwcG9ydFxuICBAZWxzZSB7XG4gICAgQGluY2x1ZGUgc3VzeS1yZW0oJHByb3AsICR2YWwpO1xuICB9XG59XG5cblxuLy8gU3VzeSBTdXBwb3J0IFtmdW5jdGlvbl1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDaGVjayBmb3Igc3VwcG9ydCBvZiBhIGZlYXR1cmUuXG4vLyAtICRmZWF0dXJlICAgICAgIDogPHN0cmluZz5cbi8vICAgICAgICAgICAgICAgICAgICAtIGUuZyBcInJlbVwiIG9yIFwiYm94LXNpemluZ1wiXG4vLyAtICRyZXF1aXJlbWVudHMgIDogPG1hcD5cbi8vICAgICAgICAgICAgICAgICAgICAtIGUuZyAodmFyaWFibGU6IHJlbS13aXRoLXB4LWZhbGxiYWNrLCBtaXhpbjogcmVtKVxuLy8gLSAkd2FybiAgICAgICAgICA6IDxib29sPlxuQGZ1bmN0aW9uIHN1c3ktc3VwcG9ydChcbiAgJGZlYXR1cmUsXG4gICRyZXF1aXJlbWVudHM6ICgpLFxuICAkd2FybjogdHJ1ZVxuKSB7XG4gICRfc3VwcG9ydDogc3VzeS1nZXQodXNlLWN1c3RvbSAkZmVhdHVyZSk7XG5cbiAgQGlmICRfc3VwcG9ydCB7XG4gICAgJF9mYWlsOiBmYWxzZTtcblxuICAgIEBlYWNoICRfdHlwZSwgJF9yZXEgaW4gJHJlcXVpcmVtZW50cyB7XG4gICAgICBAZWFjaCAkX2kgaW4gJF9yZXEge1xuICAgICAgICAkX3Bhc3M6IGNhbGwodW5xdW90ZShcIiN7JF90eXBlfS1leGlzdHNcIiksICRfaSk7XG5cbiAgICAgICAgQGlmIG5vdCgkX3Bhc3MpIHtcbiAgICAgICAgICAkX2ZhaWw6IHRydWU7XG4gICAgICAgICAgQGlmICR3YXJuIHtcbiAgICAgICAgICAgIEB3YXJuIFwiWW91IHJlcXVlc3RlZCBjdXN0b20gc3VwcG9ydCBvZiAjeyRmZWF0dXJlfSwgYnV0IHRoZSAjeyRfaX0gI3skX3R5cGV9IGlzIG5vdCBhdmFpbGFibGUuXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgJF9zdXBwb3J0OiBpZigkX2ZhaWwsIGZhbHNlLCAkX3N1cHBvcnQpO1xuICB9XG5cbiAgQHJldHVybiAkX3N1cHBvcnQ7XG59XG4iLCIvLyBTdXN5IFByZWZpeFxuLy8gPT09PT09PT09PT1cblxuLy8gUHJlZml4XG4vLyAtLS0tLS1cbi8vIE91dHB1dCBzaW1wbGUgcHJlZml4ZWQgcHJvcGVydGllcy5cbi8vIC0gJHByb3AgICAgICA6IDxjc3MgcHJvcGVydHk+XG4vLyAtICR2YWwgICAgICAgOiA8Y3NzIHZhbHVlPlxuLy8gLSBbJHByZWZpeF0gIDogPGJyb3dzZXIgcHJlZml4IGxpc3Q+XG5AbWl4aW4gc3VzeS1wcmVmaXgoXG4gICRwcm9wLFxuICAkdmFsLFxuICAkcHJlZml4OiBvZmZpY2lhbFxuKSB7XG4gIEBlYWNoICRmaXggaW4gJHByZWZpeCB7XG4gICAgJGZpeDogaWYoJGZpeCA9PSBvZmZpY2lhbCBvciBub3QoJGZpeCksICRwcm9wLCAnLSN7JGZpeH0tI3skcHJvcH0nKTtcbiAgICBAaW5jbHVkZSBzdXN5LXJlbSgkZml4LCAkdmFsKTtcbiAgfVxufVxuIiwiLy8gQmFja2dyb3VuZCBQcm9wZXJ0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT1cblxuLy8gU3VzeSBCYWNrZ3JvdW5kIEltYWdlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENoZWNrIGZvciBhbiBleGlzdGluZyBzdXBwb3J0IG1peGluLCBvciBwcm92aWRlIGEgc2ltcGxlIGZhbGxiYWNrLlxuLy8gLSAkaW1hZ2U6IDxiYWNrZ3JvdW5kLWltYWdlPlxuQG1peGluIHN1c3ktYmFja2dyb3VuZC1pbWFnZShcbiAgJGltYWdlXG4pIHtcbiAgQGlmIHN1c3ktc3VwcG9ydChiYWNrZ3JvdW5kLWltYWdlLCAobWl4aW46IGJhY2tncm91bmQtaW1hZ2UpLCAkd2FybjogZmFsc2UpIHtcbiAgICBAaW5jbHVkZSBiYWNrZ3JvdW5kLWltYWdlKCRpbWFnZS4uLik7XG4gIH0gQGVsc2Uge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6ICRpbWFnZTtcbiAgfVxufVxuXG4vLyBTdXN5IEJhY2tncm91bmQgU2l6ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDaGVjayBmb3IgYW4gZXhpc3Rpbmcgc3VwcG9ydCBtaXhpbiwgb3IgcHJvdmlkZSBhIHNpbXBsZSBmYWxsYmFjay5cbi8vIC0gJGltYWdlOiA8YmFja2dyb3VuZC1zaXplPlxuQG1peGluIHN1c3ktYmFja2dyb3VuZC1zaXplKFxuICAkc2l6ZVxuKSB7XG4gIEBpZiBzdXN5LXN1cHBvcnQoYmFja2dyb3VuZC1vcHRpb25zLCAobWl4aW46IGJhY2tncm91bmQtc2l6ZSkpIHtcbiAgICBAaW5jbHVkZSBiYWNrZ3JvdW5kLXNpemUoJHNpemUpO1xuICB9IEBlbHNlIHtcbiAgICBiYWNrZ3JvdW5kLXNpemU6ICRzaXplO1xuICB9XG59XG5cbi8vIFN1c3kgQmFja2dyb3VuZCBPcmlnaW5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENoZWNrIGZvciBhbiBleGlzdGluZyBzdXBwb3J0IG1peGluLCBvciBwcm92aWRlIGEgc2ltcGxlIGZhbGxiYWNrLlxuLy8gLSAkaW1hZ2U6IDxiYWNrZ3JvdW5kLW9yaWdpbj5cbkBtaXhpbiBzdXN5LWJhY2tncm91bmQtb3JpZ2luKFxuICAkb3JpZ2luXG4pIHtcbiAgQGlmIHN1c3ktc3VwcG9ydChiYWNrZ3JvdW5kLW9wdGlvbnMsIChtaXhpbjogYmFja2dyb3VuZC1vcmlnaW4pKSB7XG4gICAgQGluY2x1ZGUgYmFja2dyb3VuZC1vcmlnaW4oJG9yaWdpbik7XG4gIH0gQGVsc2Uge1xuICAgIGJhY2tncm91bmQtb3JpZ2luOiAkb3JpZ2luO1xuICB9XG59XG5cbi8vIFN1c3kgQmFja2dyb3VuZCBDbGlwXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIHN1cHBvcnQgbWl4aW4sIG9yIHByb3ZpZGUgYSBzaW1wbGUgZmFsbGJhY2suXG4vLyAtICRpbWFnZTogPGJhY2tncm91bmQtY2xpcD5cbkBtaXhpbiBzdXN5LWJhY2tncm91bmQtY2xpcChcbiAgJGNsaXBcbikge1xuICBAaWYgc3VzeS1zdXBwb3J0KGJhY2tncm91bmQtb3B0aW9ucywgKG1peGluOiBiYWNrZ3JvdW5kLWNsaXApKSB7XG4gICAgQGluY2x1ZGUgYmFja2dyb3VuZC1jbGlwKCRjbGlwKTtcbiAgfSBAZWxzZSB7XG4gICAgYmFja2dyb3VuZC1jbGlwOiAkY2xpcDtcbiAgfVxufVxuIiwiLy8gQm94IFNpemluZ1xuLy8gPT09PT09PT09PVxuXG4vLyBCb3ggU2l6aW5nXG4vLyAtLS0tLS0tLS0tXG4vLyBDaGVjayBmb3IgYW4gZXhpc3Rpbmcgc3VwcG9ydCBtaXhpbiwgb3IgcHJvdmlkZSBhIHNpbXBsZSBmYWxsYmFjay5cbi8vIC0gJG1vZGVsOiA8Ym94LXNpemluZz5cbkBtaXhpbiBzdXN5LWJveC1zaXppbmcoXG4gICRtb2RlbDogY29udGVudC1ib3hcbikge1xuICBAaWYgJG1vZGVsIHtcbiAgICBAaWYgc3VzeS1zdXBwb3J0KGJveC1zaXppbmcsIChtaXhpbjogYm94LXNpemluZyksICR3YXJuOiBmYWxzZSkge1xuICAgICAgQGluY2x1ZGUgYm94LXNpemluZygkbW9kZWwpO1xuICAgIH0gQGVsc2Uge1xuICAgICAgJHByZWZpeDogKG1veiwgd2Via2l0LCBvZmZpY2lhbCk7XG4gICAgICBAaW5jbHVkZSBzdXN5LXByZWZpeChib3gtc2l6aW5nLCAkbW9kZWwsICRwcmVmaXgpO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gcmVtIFN1cHBvcnRcbi8vID09PT09PT09PT09XG5cbi8vIHJlbVxuLy8gLS0tXG4vLyBDaGVjayBmb3IgYW4gZXhpc3Rpbmcgc3VwcG9ydCBtaXhpbiwgb3Igb3V0cHV0IGRpcmVjdGx5LlxuLy8gLSAkcHJvcCAgOiA8Y3NzIHByb3BlcnR5PlxuLy8gLSAkdmFsICAgOiA8Y3NzIHZhbHVlPlxuQG1peGluIHN1c3ktcmVtKFxuICAkcHJvcCxcbiAgJHZhbFxuKSB7XG4gICRfcmVxczogKFxuICAgIHZhcmlhYmxlOiByaHl0aG0tdW5pdCByZW0td2l0aC1weC1mYWxsYmFjayxcbiAgICBtaXhpbjogcmVtLFxuICApO1xuICBAaWYgc3VzeS1zdXBwb3J0KHJlbSwgJF9yZXFzLCAkd2FybjogZmFsc2UpIGFuZCAkcmh5dGhtLXVuaXQgPT0gcmVtIHtcbiAgICBAaW5jbHVkZSByZW0oJHByb3AsICR2YWwpO1xuICB9IEBlbHNlIHtcbiAgICAjeyRwcm9wfTogJHZhbDtcbiAgfVxufVxuIiwiLy8gU3VzeSBGYWxsYmFjayBDbGVhcmZpeFxuLy8gPT09PT09PT09PT09PT09PT09PT09PVxuXG5cbi8vIENsZWFyZml4XG4vLyAtLS0tLS0tLVxuLy8gQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIHN1cHBvcnQgbWl4aW4sIG9yIHByb3ZpZGUgYSBzaW1wbGUgZmFsbGJhY2suXG5AbWl4aW4gc3VzeS1jbGVhcmZpeCB7XG4gIEBpZiBzdXN5LXN1cHBvcnQoY2xlYXJmaXgsIChtaXhpbjogY2xlYXJmaXgpKSB7XG4gICAgQGluY2x1ZGUgY2xlYXJmaXg7XG4gIH0gQGVsc2Uge1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGNsZWFyOiBib3RoO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gRGVidWdnaW5nXG4vLyA9PT09PT09PT1cblxuLy8gU3VzeSBJbnNwZWN0XG4vLyAtLS0tLS0tLS0tLS1cbi8vIE91dHB1dCBhcmd1bWVudHMgcGFzc2VkIHRvIGEgaW5zcGVjdC5cbi8vIC0gJG1peGluICA6IDxzdXN5IG1peGluPlxuLy8gLSAkaW5zcGVjICAgOiA8bWl4aW4gYXJndW1lbnRzPlxuXG5AbWl4aW4gc3VzeS1pbnNwZWN0KFxuICAkbWl4aW4sXG4gICRpbnNwZWN0XG4pIHtcbiAgJHNob3c6IGZhbHNlO1xuXG4gIEBlYWNoICRpdGVtIGluICRpbnNwZWN0IHtcbiAgICBAaWYgaW5kZXgoJGl0ZW0sIGluc3BlY3QpIHtcbiAgICAgICRzaG93OiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIEBpZiAkc2hvdyBvciBzdXN5LWdldChkZWJ1ZyBpbnNwZWN0KSB7XG4gICAgLXN1c3ktI3skbWl4aW59OiBpbnNwZWN0KCRpbnNwZWN0KTtcbiAgfVxufVxuIiwiLy8gT3V0cHV0XG4vLyA9PT09PT1cblxuLy8gT3V0cHV0XG4vLyAtLS0tLS1cbi8vIE91dHB1dCBDU1Mgd2l0aCBwcm9wZXIgYnJvd3NlciBzdXBwb3J0LlxuLy8gLSAkc3R5bGVzICA6IDxtYXAgb2YgY3NzIHByb3BlcnR5LXZhbHVlIHBhaXJzPlxuQG1peGluIG91dHB1dChcbiAgJHN0eWxlc1xuKSB7XG4gIEBlYWNoICRwcm9wLCAkdmFsIGluICRzdHlsZXMge1xuICAgIEBpbmNsdWRlIHN1c3ktc3VwcG9ydCgkcHJvcCwgJHZhbCk7XG4gIH1cbn1cbiIsIi8vIERpcmVjdGlvbiBIZWxwZXJzXG4vLyA9PT09PT09PT09PT09PT09PVxuXG4vLyBTdXN5IEZsb3cgRGVmYXVsdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gLSBQUklWQVRFXG5AaW5jbHVkZSBzdXN5LWRlZmF1bHRzKChcbiAgZmxvdzogbHRyLFxuKSk7XG5cbi8vIEdldCBEaXJlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS1cbi8vIFJldHVybiB0aGUgJ2Zyb20nIG9yICd0bycgZGlyZWN0aW9uIG9mIGEgbHRyIG9yIHJ0bCBmbG93LlxuLy8gLSBbJGZsb3ddICA6IGx0ciB8IHJ0bFxuLy8gLSBbJGtleV0gICA6IGZyb20gfCB0b1xuQGZ1bmN0aW9uIGdldC1kaXJlY3Rpb24oXG4gICRmbG93OiBtYXAtZ2V0KCRzdXN5LWRlZmF1bHRzLCBmbG93KSxcbiAgJGtleTogZnJvbVxuKSB7XG4gICRyZXR1cm46IGlmKCRmbG93ID09IHJ0bCwgKGZyb206IHJpZ2h0LCB0bzogbGVmdCksIChmcm9tOiBsZWZ0LCB0bzogcmlnaHQpKTtcbiAgQHJldHVybiBtYXAtZ2V0KCRyZXR1cm4sICRrZXkpO1xufVxuXG4vLyBUb1xuLy8gLS1cbi8vIFJldHVybiB0aGUgJ3RvJyBkaXJlY3Rpb24gb2YgYSBmbG93XG4vLyAtIFskZmxvd10gIDogbHRyIHwgcnRsXG5AZnVuY3Rpb24gdG8oXG4gICRmbG93OiBtYXAtZ2V0KCRzdXN5LWRlZmF1bHRzLCBmbG93KVxuKSB7XG4gIEByZXR1cm4gZ2V0LWRpcmVjdGlvbigkZmxvdywgdG8pO1xufVxuXG4vLyBGcm9tXG4vLyAtLS0tXG4vLyBSZXR1cm4gdGhlICdmcm9tJyBkaXJlY3Rpb24gb2YgYSBmbG93XG4vLyAtIFskZmxvd10gIDogbHRyIHwgcnRsXG5AZnVuY3Rpb24gZnJvbShcbiAgJGZsb3c6IG1hcC1nZXQoJHN1c3ktZGVmYXVsdHMsIGZsb3cpXG4pIHtcbiAgQHJldHVybiBnZXQtZGlyZWN0aW9uKCRmbG93LCBmcm9tKTtcbn1cbiIsIi8vIEdyaWQgQmFja2dyb3VuZCBBUElcbi8vID09PT09PT09PT09PT09PT09PT1cbi8vIC0gU3ViLXBpeGVsIHJvdW5kaW5nIGNhbiBsZWFkIHRvIHNldmVyYWwgcGl4ZWxzIHZhcmlhdGlvbiBiZXR3ZWVuIGJyb3dzZXJzLlxuXG4vLyBHcmlkIEJhY2tncm91bmQgT3V0cHV0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyAtICRpbWFnZTogYmFja2dyb3VuZC1pbWFnZVxuLy8gLSAkc2l6ZTogYmFja2dyb3VuZC1zaXplXG4vLyAtICRjbGlwOiBiYWNrZ3JvdW5kLWNsaXBcbi8vIC0gWyRmbG93XTogbHRyIHwgcnRsXG5AbWl4aW4gYmFja2dyb3VuZC1ncmlkLW91dHB1dCAoXG4gICRpbWFnZSxcbiAgJHNpemU6IG51bGwsXG4gICRjbGlwOiBudWxsLFxuICAkZmxvdzogbWFwLWdldCgkc3VzeS1kZWZhdWx0cywgZmxvdylcbikge1xuICAkb3V0cHV0OiAoXG4gICAgYmFja2dyb3VuZC1pbWFnZTogJGltYWdlLFxuICAgIGJhY2tncm91bmQtc2l6ZTogJHNpemUsXG4gICAgYmFja2dyb3VuZC1vcmlnaW46ICRjbGlwLFxuICAgIGJhY2tncm91bmQtY2xpcDogJGNsaXAsXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogZnJvbSgkZmxvdykgdG9wLFxuICApO1xuXG4gIEBpbmNsdWRlIG91dHB1dCgkb3V0cHV0KTtcbn1cbiIsIi8vIFNoYXJlZCBDb250YWluZXIgQVBJXG4vLyA9PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb250YWluZXIgT3V0cHV0XG4vLyAtLS0tLS0tLS0tLS0tLS0tXG4vLyAtIFskd2lkdGhdICAgICAgICAgOiA8bGVuZ3RoPlxuLy8gLSBbJGp1c3RpZnldICAgICAgIDogbGVmdCB8IGNlbnRlciB8IHJpZ2h0XG4vLyAtIFskbWF0aF0gICAgICAgICAgOiBmbHVpZCB8IHN0YXRpY1xuQG1peGluIGNvbnRhaW5lci1vdXRwdXQoXG4gICR3aWR0aCxcbiAgJGp1c3RpZnk6IGF1dG8gYXV0byxcbiAgJHByb3BlcnR5OiBtYXgtd2lkdGhcbikge1xuICAkb3V0cHV0OiAoXG4gICAgI3skcHJvcGVydHl9OiAkd2lkdGggb3IgMTAwJSxcbiAgICBtYXJnaW4tbGVmdDogbnRoKCRqdXN0aWZ5LCAxKSxcbiAgICBtYXJnaW4tcmlnaHQ6IG50aCgkanVzdGlmeSwgMiksXG4gICk7XG5cbiAgQGluY2x1ZGUgb3V0cHV0KCRvdXRwdXQpO1xufVxuIiwiLy8gTWFyZ2lucyBBUElcbi8vID09PT09PT09PT09XG5cbi8vIE1hcmdpbiBPdXRwdXRcbi8vIC0tLS0tLS0tLS0tLS1cbi8vIC0gJGJlZm9yZSAgOiA8bGVuZ3RoPlxuLy8gLSAkYWZ0ZXIgICA6IDxsZW5ndGg+XG4vLyAtIFskZmxvd10gIDogbHRyIHwgcnRsXG5AbWl4aW4gbWFyZ2luLW91dHB1dChcbiAgJGJlZm9yZSxcbiAgJGFmdGVyLFxuICAkZmxvdzogbWFwLWdldCgkc3VzeS1kZWZhdWx0cywgZmxvdylcbikge1xuICAkdG86IHRvKCRmbG93KTtcbiAgJGZyb206IGZyb20oJGZsb3cpO1xuXG4gICRvdXRwdXQ6IChcbiAgICBtYXJnaW4tI3skZnJvbX06ICRiZWZvcmUsXG4gICAgbWFyZ2luLSN7JHRvfTogJGFmdGVyLFxuICApO1xuXG4gIEBpbmNsdWRlIG91dHB1dCgkb3V0cHV0KTtcbn1cbiIsIi8vIFBhZGRpbmcgQVBJXG4vLyA9PT09PT09PT09PVxuXG4vLyBQYWRkaW5nIE91dHB1dFxuLy8gLS0tLS0tLS0tLS0tLS1cbi8vIC0gJGJlZm9yZSAgOiA8bGVuZ3RoPlxuLy8gLSAkYWZ0ZXIgICA6IDxsZW5ndGg+XG4vLyAtIFskZmxvd10gIDogbHRyIHwgcnRsXG5AbWl4aW4gcGFkZGluZy1vdXRwdXQoXG4gICRiZWZvcmUsXG4gICRhZnRlcixcbiAgJGZsb3c6IG1hcC1nZXQoJHN1c3ktZGVmYXVsdHMsIGZsb3cpXG4pIHtcbiAgJHRvOiB0bygkZmxvdyk7XG4gICRmcm9tOiBmcm9tKCRmbG93KTtcblxuICAkb3V0cHV0OiAoXG4gICAgcGFkZGluZy0jeyRmcm9tfTogJGJlZm9yZSxcbiAgICBwYWRkaW5nLSN7JHRvfTogJGFmdGVyLFxuICApO1xuXG4gIEBpbmNsdWRlIG91dHB1dCgkb3V0cHV0KTtcbn1cbiIsIi8vIEZsb2F0IENvbnRhaW5lciBBUElcbi8vID09PT09PT09PT09PT09PT09PT1cblxuLy8gRmxvYXQgQ29udGFpbmVyXG4vLyAtLS0tLS0tLS0tLS0tLS1cbi8vIC0gWyR3aWR0aF0gICAgICAgICA6IDxsZW5ndGg+XG4vLyAtIFskanVzdGlmeV0gICAgICAgOiBsZWZ0IHwgY2VudGVyIHwgcmlnaHRcbi8vIC0gWyRtYXRoXSAgIDogZmx1aWQgfCBzdGF0aWNcbkBtaXhpbiBmbG9hdC1jb250YWluZXIoXG4gICR3aWR0aCxcbiAgJGp1c3RpZnk6IGF1dG8gYXV0byxcbiAgJHByb3BlcnR5OiBtYXgtd2lkdGhcbikge1xuICBAaW5jbHVkZSBzdXN5LWNsZWFyZml4O1xuICBAaW5jbHVkZSBjb250YWluZXItb3V0cHV0KCR3aWR0aCwgJGp1c3RpZnksICRwcm9wZXJ0eSk7XG59XG4iLCIvLyBGbG9hdCBTcGFuIEFQSVxuLy8gPT09PT09PT09PT09PT1cblxuLy8gRmxvYXQgU3BhbiBPdXRwdXRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tXG4vLyAtICR3aWR0aCAgICAgICAgICAgICA6IDxsZW5ndGg+XG4vLyAtIFskZmxvYXRdICAgICAgICAgICA6IGZyb20gfCB0b1xuLy8gLSBbJG1hcmdpbi1iZWZvcmVdICAgOiA8bGVuZ3RoPlxuLy8gLSBbJG1hcmdpbi1hZnRlcl0gICAgOiA8bGVuZ3RoPlxuLy8gLSBbJHBhZGRpbmctYmVmb3JlXSAgOiA8bGVuZ3RoPlxuLy8gLSBbJHBhZGRpbmctYWZ0ZXJdICAgOiA8bGVuZ3RoPlxuLy8gLSBbJGZsb3ddICAgICAgICAgICAgOiBsdHIgfCBydGxcbkBtaXhpbiBmbG9hdC1zcGFuLW91dHB1dChcbiAgJHdpZHRoLFxuICAkZmxvYXQgICAgICAgICAgICA6IGZyb20sXG4gICRtYXJnaW4tYmVmb3JlICAgIDogbnVsbCxcbiAgJG1hcmdpbi1hZnRlciAgICAgOiBudWxsLFxuICAkcGFkZGluZy1iZWZvcmUgICA6IG51bGwsXG4gICRwYWRkaW5nLWFmdGVyICAgIDogbnVsbCxcbiAgJGZsb3cgICAgICAgICAgICAgOiBtYXAtZ2V0KCRzdXN5LWRlZmF1bHRzLCBmbG93KVxuKSB7XG4gICR0byAgICAgOiB0bygkZmxvdyk7XG4gICRmcm9tICAgOiBmcm9tKCRmbG93KTtcblxuICAkb3V0cHV0OiAoXG4gICAgd2lkdGg6ICR3aWR0aCxcbiAgICBmbG9hdDogaWYoJGZsb2F0ID09IHRvLCAkdG8sIG51bGwpIG9yIGlmKCRmbG9hdCA9PSBmcm9tLCAkZnJvbSwgbnVsbCksXG4gICAgbWFyZ2luLSN7JGZyb219OiAkbWFyZ2luLWJlZm9yZSxcbiAgICBtYXJnaW4tI3skdG99OiAkbWFyZ2luLWFmdGVyLFxuICAgIHBhZGRpbmctI3skZnJvbX06ICRwYWRkaW5nLWJlZm9yZSxcbiAgICBwYWRkaW5nLSN7JHRvfTogJHBhZGRpbmctYWZ0ZXIsXG4gICk7XG5cbiAgQGluY2x1ZGUgb3V0cHV0KCRvdXRwdXQpO1xufVxuIiwiLy8gRmxvYXQgRW5kcyBBUElcbi8vID09PT09PT09PT09PT09XG5cbi8vIFN1c3kgRW5kIERlZmF1bHRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLVxuLy8gLSBQUklWQVRFXG5AaW5jbHVkZSBzdXN5LWRlZmF1bHRzKChcbiAgbGFzdC1mbG93OiB0byxcbikpO1xuXG4vLyBGbG9hdCBMYXN0XG4vLyAtLS0tLS0tLS0tXG4vLyAtIFskZmxvd10gIDogbHRyIHwgcnRsXG5AbWl4aW4gZmxvYXQtbGFzdChcbiAgJGZsb3c6IG1hcC1nZXQoJHN1c3ktZGVmYXVsdHMsIGZsb3cpLFxuICAkbGFzdC1mbG93OiBtYXAtZ2V0KCRzdXN5LWRlZmF1bHRzLCBsYXN0LWZsb3cpLFxuICAkbWFyZ2luOiAwXG4pIHtcbiAgJHRvOiB0bygkZmxvdyk7XG5cbiAgJG91dHB1dDogKFxuICAgIGZsb2F0OiBpZigkbGFzdC1mbG93ID09IHRvLCAkdG8sIG51bGwpLFxuICAgIG1hcmdpbi0jeyR0b306ICRtYXJnaW4sXG4gICk7XG5cbiAgQGluY2x1ZGUgb3V0cHV0KCRvdXRwdXQpO1xufVxuXG4vLyBGbG9hdCBGaXJzdFxuLy8gLS0tLS0tLS0tLS1cbi8vIC0gWyRmbG93XSAgOiBsdHIgfCBydGxcbkBtaXhpbiBmbG9hdC1maXJzdChcbiAgJGZsb3c6IG1hcC1nZXQoJHN1c3ktZGVmYXVsdHMsIGZsb3cpXG4pIHtcbiAgJG91dHB1dDogKFxuICAgIG1hcmdpbi0je2Zyb20oJGZsb3cpfTogMCxcbiAgKTtcblxuICBAaW5jbHVkZSBvdXRwdXQoJG91dHB1dCk7XG59XG4iLCIvLyBGbG9hdCBJc29sYXRpb24gQVBJXG4vLyA9PT09PT09PT09PT09PT09PT09XG5cbi8vIElzb2xhdGUgT3V0cHV0XG4vLyAtLS0tLS0tLS0tLS0tLVxuLy8gLSAkcHVzaCAgICA6IDxsZW5ndGg+XG4vLyAtIFskZmxvd10gIDogbHRyIHwgcnRsXG5AbWl4aW4gaXNvbGF0ZS1vdXRwdXQoXG4gICRwdXNoLFxuICAkZmxvdzogbWFwLWdldCgkc3VzeS1kZWZhdWx0cywgZmxvdylcbikge1xuICAkdG86IHRvKCRmbG93KTtcbiAgJGZyb206IGZyb20oJGZsb3cpO1xuXG4gICRvdXRwdXQ6IChcbiAgICBmbG9hdDogJGZyb20sXG4gICAgbWFyZ2luLSN7JGZyb219OiAkcHVzaCxcbiAgICBtYXJnaW4tI3skdG99OiAtMTAwJSxcbiAgKTtcblxuICBAaW5jbHVkZSBvdXRwdXQoJG91dHB1dCk7XG59XG4iLCIvLyBTdXN5IFNldHRpbmdzXG4vLyA9PT09PT09PT09PT09XG5cbi8vIFN1c3kgTGFuZ3VhZ2UgRGVmYXVsdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIC0gUFJJVkFURVxuQGluY2x1ZGUgc3VzeS1kZWZhdWx0cygoXG4gIGNvbnRhaW5lcjogYXV0byxcbiAgbWF0aDogZmx1aWQsXG4gIG91dHB1dDogZmxvYXQsXG4gIGNvbnRhaW5lci1wb3NpdGlvbjogY2VudGVyLFxuICBndXR0ZXItcG9zaXRpb246IGFmdGVyLFxuICBnbG9iYWwtYm94LXNpemluZzogY29udGVudC1ib3gsXG4gIGRlYnVnOiAoXG4gICAgaW1hZ2U6IGhpZGUsXG4gICAgY29sb3I6IHJnYmEoIzY2ZiwgLjI1KSxcbiAgICBvdXRwdXQ6IGJhY2tncm91bmQsXG4gICAgdG9nZ2xlOiB0b3AgcmlnaHQsXG4gICksXG4pKTtcblxuXG4vLyBWYWxpZCBLZXl3b3JkIFZhbHVlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIC0gUFJJVkFURTogRE9OVCdUIFRPVUNIXG4kc3VzeS1rZXl3b3JkczogKFxuICBjb250YWluZXI6IGF1dG8sXG4gIG1hdGg6IHN0YXRpYyBmbHVpZCxcbiAgb3V0cHV0OiBpc29sYXRlIGZsb2F0LFxuICBjb250YWluZXItcG9zaXRpb246IGxlZnQgY2VudGVyIHJpZ2h0LFxuICBmbG93OiBsdHIgcnRsLFxuICBndXR0ZXItcG9zaXRpb246IGJlZm9yZSBhZnRlciBzcGxpdCBpbnNpZGUgaW5zaWRlLXN0YXRpYyxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveCBjb250ZW50LWJveCxcbiAgc3BhbjogZnVsbCxcbiAgZWRnZTogZmlyc3QgYWxwaGEgbGFzdCBvbWVnYSBmdWxsLFxuICBzcHJlYWQ6IG5hcnJvdyB3aWRlIHdpZGVyLFxuICBndXR0ZXItb3ZlcnJpZGU6IG5vLWd1dHRlcnMgbm8tZ3V0dGVyLFxuICByb2xlOiBuZXN0LFxuICBjbGVhcjogYnJlYWsgbm9icmVhayxcbiAgZGVidWcgaW1hZ2U6IHNob3cgaGlkZSBzaG93LWNvbHVtbnMgc2hvdy1iYXNlbGluZSxcbiAgZGVidWcgb3V0cHV0OiBiYWNrZ3JvdW5kIG92ZXJsYXksXG4pO1xuXG5cbi8vIFBhcnNlIFN1c3kgS2V5d29yZHMgYW5kIE1hcHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkBmdW5jdGlvbiBwYXJzZS1zZXR0aW5ncyhcbiAgJHNob3J0OiAkc3VzeVxuKSB7XG4gICRfcmV0dXJuOiAoKTtcblxuICBAaWYgdHlwZS1vZigkc2hvcnQpID09IG1hcCB7XG4gICAgJF9yZXR1cm46ICRzaG9ydDtcbiAgfSBAZWxzZSB7XG4gICAgQGVhY2ggJGl0ZW0gaW4gJHNob3J0IHtcbiAgICAgIC8vIHN0cmluZ3NcbiAgICAgIEBpZiB0eXBlLW9mKCRpdGVtKSA9PSBzdHJpbmcge1xuICAgICAgICBAZWFjaCAka2V5LCAkdmFsdWUgaW4gJHN1c3kta2V5d29yZHMge1xuICAgICAgICAgIEBpZiBpbmRleCgkdmFsdWUsICRpdGVtKSB7XG4gICAgICAgICAgICAkX2tleS12YWx1ZTogYXBwZW5kKCRrZXksICRpdGVtKTtcbiAgICAgICAgICAgICRfcmV0dXJuOiBfc3VzeS1kZWVwLXNldCgkX3JldHVybiwgJF9rZXktdmFsdWUuLi4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgLy8gbWFwc1xuICAgICAgfSBAZWxzZSBpZiB0eXBlLW9mKCRpdGVtKSA9PSBtYXAge1xuICAgICAgICAkX3JldHVybjogbWFwLW1lcmdlKCRfcmV0dXJuLCAkaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQHJldHVybiAkX3JldHVybjtcbn1cblxuXG4vLyBQYXJzZSBDb2x1bW5zICYgR3V0dGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkBmdW5jdGlvbiBwYXJzZS1sYXlvdXQoXG4gICRzaG9ydFxuKSB7XG4gICRfcmV0dXJuOiAoKTtcbiAgJF9jb2x1bW5zOiAoKTtcbiAgJF9ndXR0ZXJzOiBudWxsO1xuXG4gIEBpZiBub3QodW5pdGxlc3MobnRoKG50aCgkc2hvcnQsIDEpLCAxKSkpIHtcbiAgICAkX2d1dHRlcnM6IG50aCgkc2hvcnQsIDEpO1xuICB9IEBlbHNlIHtcbiAgICAkX2NvbHVtbnM6IChjb2x1bW5zOiBudGgoJHNob3J0LCAxKSk7XG4gICAgJF9ndXR0ZXJzOiBpZihsZW5ndGgoJHNob3J0KSA+IDEsIG50aCgkc2hvcnQsIDIpLCAkX2d1dHRlcnMpO1xuICB9XG5cbiAgQGlmIHR5cGUtb2YoJF9ndXR0ZXJzKSA9PSBsaXN0IGFuZCBsZW5ndGgoJF9ndXR0ZXJzKSA+IDAge1xuICAgICRfZ3V0dGVyczogKFxuICAgICAgZ3V0dGVyczogbnRoKCRfZ3V0dGVycywgMikgLyBudGgoJF9ndXR0ZXJzLCAxKSxcbiAgICAgIGNvbHVtbi13aWR0aDogbnRoKCRfZ3V0dGVycywgMSksXG4gICAgKTtcbiAgfSBAZWxzZSB7XG4gICAgJF9ndXR0ZXJzOiBpZigkX2d1dHRlcnMsIChndXR0ZXJzOiAkX2d1dHRlcnMpLCAoKSk7XG4gIH1cblxuICAkX3JldHVybjogbWFwLW1lcmdlKCRfcmV0dXJuLCAkX2NvbHVtbnMpO1xuICAkX3JldHVybjogbWFwLW1lcmdlKCRfcmV0dXJuLCAkX2d1dHRlcnMpO1xuXG4gIEByZXR1cm4gJF9yZXR1cm47XG59XG5cblxuLy8gUGFyc2UgR3JpZC9Db250ZXh0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS1cbkBmdW5jdGlvbiBwYXJzZS1ncmlkKFxuICAkc2hvcnQ6ICRzdXN5XG4pIHtcbiAgJF9yZXR1cm46IHBhcnNlLXNldHRpbmdzKCRzaG9ydCk7XG4gICRfbGF5b3V0OiAoKTtcblxuICBAaWYgdHlwZS1vZigkc2hvcnQpID09IG1hcCB7XG4gICAgJF9yZXR1cm46ICRzaG9ydDtcbiAgfSBAZWxzZSB7XG4gICAgQGVhY2ggJGl0ZW0gaW4gJHNob3J0IHtcbiAgICAgIC8vIG51bWJlciBvciBsaXN0XG4gICAgICBAaWYgdHlwZS1vZigkaXRlbSkgPT0gbnVtYmVyIG9yIHR5cGUtb2YoJGl0ZW0pID09IGxpc3Qge1xuICAgICAgICBAaWYgdHlwZS1vZigkaXRlbSkgPT0gbGlzdCBvciB1bml0bGVzcygkaXRlbSkge1xuICAgICAgICAgICRfbGF5b3V0OiBhcHBlbmQoJF9sYXlvdXQsICRpdGVtKTtcbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgJF9yZXR1cm46IG1hcC1tZXJnZSgkX3JldHVybiwgKGNvbnRhaW5lcjogJGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgICRfbGF5b3V0OiBpZihsZW5ndGgoJF9sYXlvdXQpID4gMCwgcGFyc2UtbGF5b3V0KCRfbGF5b3V0KSwgJF9sYXlvdXQpO1xuICB9XG5cbiAgQHJldHVybiBtYXAtbWVyZ2UoJF9yZXR1cm4sICRfbGF5b3V0KTtcbn1cblxuXG4vLyBQYXJzZSBTcGFuXG4vLyAtLS0tLS0tLS0tXG5AZnVuY3Rpb24gcGFyc2Utc3BhbihcbiAgJHNob3J0LFxuICAka2V5OiBzcGFuXG4pIHtcbiAgJF9yZXR1cm46ICgpO1xuXG4gIEBpZiB0eXBlLW9mKCRzaG9ydCkgPT0gbWFwIHtcbiAgICAkX3JldHVybjogJHNob3J0O1xuICB9IEBlbHNlIHtcbiAgICAkX2F0OiBpbmRleCgkc2hvcnQsIGF0KTtcblxuICAgIEBpZiAkX2F0IHtcbiAgICAgICRfbG9jaTogJF9hdCArIDE7XG4gICAgICAkX2xvY2F0aW9uOiBudGgoJHNob3J0LCAkX2xvY2kpO1xuICAgICAgJF9yZXR1cm46IG1hcC1tZXJnZSgkX3JldHVybiwgKGxvY2F0aW9uOiAkX2xvY2F0aW9uKSk7XG4gICAgICAkc2hvcnQ6IHNldC1udGgoJHNob3J0LCAkX2F0LCBudWxsKTtcbiAgICAgICRzaG9ydDogc2V0LW50aCgkc2hvcnQsICRfbG9jaSwgbnVsbCk7XG4gICAgfVxuXG4gICAgJF9pOiAxO1xuICAgICRfc3BhbjogKCk7XG5cbiAgICBAd2hpbGUgJF9pIDw9IGxlbmd0aCgkc2hvcnQpIHtcbiAgICAgICRfdGhpczogbnRoKCRzaG9ydCwgJF9pKTtcblxuICAgICAgQGlmIHR5cGUtb2YoJF90aGlzKSA9PSBudW1iZXIge1xuICAgICAgICAkX3NwYW46IGFwcGVuZCgkX3NwYW4sICRfdGhpcyk7XG4gICAgICAgICRzaG9ydDogc2V0LW50aCgkc2hvcnQsICRfaSwgbnVsbCk7XG4gICAgICB9IEBlbHNlIGlmICRfdGhpcyA9PSBvZiB7XG4gICAgICAgICRzaG9ydDogc2V0LW50aCgkc2hvcnQsICRfaSwgbnVsbCk7XG4gICAgICAgICRfaTogbGVuZ3RoKCRzaG9ydCkgKyAxO1xuICAgICAgfVxuXG4gICAgICAkX2k6ICRfaSArIDE7XG4gICAgfVxuXG4gICAgQGlmIGxlbmd0aCgkX3NwYW4pID4gMCB7XG4gICAgICAkX3NwYW46IGlmKGxlbmd0aCgkX3NwYW4pID09IDEsIG50aCgkX3NwYW4sIDEpLCAkX3NwYW4pO1xuICAgICAgJF9yZXR1cm46IG1hcC1tZXJnZSgkX3JldHVybiwgKCRrZXk6ICRfc3BhbikpO1xuICAgIH1cblxuICAgICRfcmV0dXJuOiBtYXAtbWVyZ2UoJF9yZXR1cm4sIHBhcnNlLWdyaWQoJHNob3J0KSk7XG4gIH1cblxuICBAcmV0dXJuICRfcmV0dXJuO1xufVxuXG5cbi8vIFBhcnNlIEd1dHRlcnNcbi8vIC0tLS0tLS0tLS0tLS1cbkBmdW5jdGlvbiBwYXJzZS1ndXR0ZXJzKFxuICAkc2hvcnQ6ICRzdXN5XG4pIHtcbiAgJF9ndXR0ZXJzOiBwYXJzZS1zcGFuKCRzaG9ydCwgZ3V0dGVyLW92ZXJyaWRlKTtcbiAgJF9zcGFuOiBzdXN5LWdldChndXR0ZXItb3ZlcnJpZGUsICRfZ3V0dGVycyk7XG5cbiAgQGlmICRfc3BhbiBhbmQgbm90KG1hcC1nZXQoJF9ndXR0ZXJzLCBjb2x1bW5zKSkge1xuICAgICRfY29udGV4dDogKCk7XG4gICAgJF9uZXc6ICgpO1xuXG4gICAgQGVhY2ggJGl0ZW0gaW4gJF9zcGFuIHtcbiAgICAgIEBpZiB0eXBlLW9mKCRpdGVtKSA9PSBudW1iZXIgYW5kIHVuaXRsZXNzKCRpdGVtKSB7XG4gICAgICAgICRfY29udGV4dDogYXBwZW5kKCRfY29udGV4dCwgJGl0ZW0pO1xuICAgICAgfSBAZWxzZSB7XG4gICAgICAgICRfbmV3OiBhcHBlbmQoJF9uZXcsICRpdGVtKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAkX2NvbnRleHQ6IHBhcnNlLWdyaWQoJF9jb250ZXh0KTtcbiAgICAkX25ldzogaWYobGVuZ3RoKCRfbmV3KSA9PSAwLCBudWxsLCAkX25ldyk7XG4gICAgJF9uZXc6IGlmKGxlbmd0aCgkX25ldykgPT0gMSwgbnRoKCRfbmV3LCAxKSwgJF9uZXcpO1xuICAgICRfbmV3OiAoZ3V0dGVyLW92ZXJyaWRlOiBpZigkX25ldyAhPSAkX3NwYW4sICRfbmV3LCAkX3NwYW4pKTtcblxuICAgICRfZ3V0dGVyczogbWFwLW1lcmdlKCRfZ3V0dGVycywgJF9uZXcpO1xuICAgICRfZ3V0dGVyczogbWFwLW1lcmdlKCRfZ3V0dGVycywgJF9jb250ZXh0KTtcbiAgfVxuXG4gIEByZXR1cm4gJF9ndXR0ZXJzO1xufVxuIiwiLy8gVmFsaWRhdGlvblxuLy8gPT09PT09PT09PVxuXG5cbi8vIFZhbGlkYXRlIENvbHVtbiBNYXRoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuQGZ1bmN0aW9uIHZhbGlkLWNvbHVtbi1tYXRoKFxuICAkbWF0aCxcbiAgJGNvbHVtbi13aWR0aFxuKSB7XG4gIEBpZiAkbWF0aCA9PSBzdGF0aWMgYW5kIG5vdCgkY29sdW1uLXdpZHRoKSB7XG4gICAgQGVycm9yICdTdGF0aWMgbWF0aCByZXF1aXJlcyBhIHZhbGlkIGNvbHVtbi13aWR0aCBzZXR0aW5nLic7XG4gIH1cblxuICBAcmV0dXJuICRjb2x1bW4td2lkdGg7XG59XG4iLCIvLyBHcmlkIFN5bnRheFxuLy8gPT09PT09PT09PT1cblxuXG4vLyBMYXlvdXRcbi8vIC0tLS0tLVxuLy8gU2V0IGEgbmV3IGxheW91dCB1c2luZyBhIHNob3J0aGFuZFxuLy8gLSAkbGF5b3V0OiA8c2V0dGluZ3M+XG4vLyAtICRjbGVhbjogYm9vbGVhblxuQG1peGluIGxheW91dChcbiAgJGxheW91dCxcbiAgJGNsZWFuOiBmYWxzZVxuKSB7XG4gICRpbnNwZWN0ICA6ICRsYXlvdXQ7XG4gICRzdXN5ICAgICA6IF9nZXQtbGF5b3V0KCRsYXlvdXQsICRjbGVhbikgIWdsb2JhbDtcblxuICBAaW5jbHVkZSBzdXN5LWluc3BlY3QobGF5b3V0LCAkaW5zcGVjdCk7XG59XG5cblxuLy8gVXNlIEdyaWRcbi8vIC0tLS0tLS0tXG4vLyBVc2UgYW4gYXJiaXRyYXJ5IGxheW91dCBmb3IgYSBzZWN0aW9uIG9mIGNvZGVcbi8vIC0gJGxheW91dDogPHNldHRpbmdzPlxuLy8gLSAkY2xlYW46IGJvb2xlYW5cbkBtaXhpbiB3aXRoLWxheW91dChcbiAgJGxheW91dCxcbiAgJGNsZWFuOiBmYWxzZVxuKSB7XG4gICRpbnNwZWN0ICA6ICRsYXlvdXQ7XG4gICRvbGQgICAgICA6ICRzdXN5O1xuICAkc3VzeSAgICAgOiBfZ2V0LWxheW91dCgkbGF5b3V0LCAkY2xlYW4pICFnbG9iYWw7XG5cbiAgQGluY2x1ZGUgc3VzeS1pbnNwZWN0KHdpdGgtbGF5b3V0LCAkaW5zcGVjdCk7XG5cbiAgQGNvbnRlbnQ7XG5cbiAgJHN1c3k6ICRvbGQgIWdsb2JhbDtcbn1cblxuXG4vLyBMYXlvdXRcbi8vIC0tLS0tLVxuLy8gUmV0dXJuIGEgcGFyc2VkIGxheW91dCBtYXAgYmFzZWQgb24gc2hvcnRoYW5kIHN5bnRheFxuLy8gLSAkbGF5b3V0OiA8c2V0dGluZ3M+XG5AZnVuY3Rpb24gbGF5b3V0KFxuICAkbGF5b3V0OiAkc3VzeVxuKSB7XG4gIEByZXR1cm4gcGFyc2UtZ3JpZCgkbGF5b3V0KTtcbn1cblxuXG4vLyBHZXQgTGF5b3V0XG4vLyAtLS0tLS0tLS0tXG4vLyBSZXR1cm4gYSBuZXcgbGF5b3V0IGJhc2VkIG9uIGN1cnJlbnQgYW5kIGdpdmVuIHNldHRpbmdzXG4vLyAtICRsYXlvdXQ6IDxzZXR0aW5ncz5cbi8vIC0gJGNsZWFuOiBib29sZWFuXG5AZnVuY3Rpb24gX2dldC1sYXlvdXQoXG4gICRsYXlvdXQsXG4gICRjbGVhbjogZmFsc2Vcbikge1xuICAkbGF5b3V0OiBsYXlvdXQoJGxheW91dCk7XG4gIEByZXR1cm4gaWYoJGNsZWFuLCAkbGF5b3V0LCBfc3VzeS1kZWVwLW1lcmdlKCRzdXN5LCAkbGF5b3V0KSk7XG59XG4iLCIvLyBTdXN5IEJveCBTaXppbmdcbi8vID09PT09PT09PT09PT09PT09XG5cbi8vIEdsb2JhbCBCb3ggU2l6aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2V0IGEgYm94IG1vZGVsIGdsb2JhbGx5IG9uIGFsbCBlbGVtZW50cy5cbi8vIC0gWyRib3hdOiBib3JkZXItYm94IHwgY29udGVudC1ib3hcbi8vIC0gWyRpbmhlcml0XTogdHJ1ZSB8IGZhbHNlXG5AbWl4aW4gZ2xvYmFsLWJveC1zaXppbmcoXG4gICRib3g6IHN1c3ktZ2V0KGdsb2JhbC1ib3gtc2l6aW5nKSxcbiAgJGluaGVyaXQ6IGZhbHNlXG4pIHtcbiAgJGluc3BlY3Q6ICRib3g7XG5cbiAgQGlmICRpbmhlcml0IHtcbiAgICBAYXQtcm9vdCB7XG4gICAgICAgaHRtbCB7IEBpbmNsdWRlIG91dHB1dCgoYm94LXNpemluZzogJGJveCkpOyB9XG4gICAgICAgKiwgKjpiZWZvcmUsICo6YWZ0ZXIgeyBib3gtc2l6aW5nOiBpbmhlcml0OyB9XG4gICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgKiwgKjpiZWZvcmUsICo6YWZ0ZXIgeyBAaW5jbHVkZSBvdXRwdXQoKGJveC1zaXppbmc6ICRib3gpKTsgfVxuICB9XG5cbiAgQGluY2x1ZGUgc3VzeS1pbnNwZWN0KGdsb2JhbC1ib3gtc2l6aW5nLCAkaW5zcGVjdCk7XG4gIEBpbmNsdWRlIHVwZGF0ZS1ib3gtbW9kZWwoJGJveCk7XG59XG5cbi8vIEJvcmRlciBCb3ggU2l6aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLVxuLy8gQSBsZWdhY3kgc2hvcnRjdXQuLi5cbi8vIC0gWyRpbmhlcml0XTogdHJ1ZSB8IGZhbHNlXG5AbWl4aW4gYm9yZGVyLWJveC1zaXppbmcoXG4gICRpbmhlcml0OiBmYWxzZVxuKSB7XG4gIEBpbmNsdWRlIGdsb2JhbC1ib3gtc2l6aW5nKGJvcmRlci1ib3gsICRpbmhlcml0KTtcbn1cblxuLy8gVXBkYXRlIEJveCBNb2RlbFxuLy8gLS0tLS0tLS0tLS0tLS0tLVxuLy8gUFJJVkFURTogVXBkYXRlcyBnbG9iYWwgYm94IG1vZGVsIHNldHRpbmdcbkBtaXhpbiB1cGRhdGUtYm94LW1vZGVsKFxuICAkYm94XG4pIHtcbiAgQGlmICRib3ggIT0gc3VzeS1nZXQoZ2xvYmFsLWJveC1zaXppbmcpIHtcbiAgQGluY2x1ZGUgc3VzeS1zZXQoZ2xvYmFsLWJveC1zaXppbmcsICRib3gpO1xuICB9XG59XG4iLCIvLyBDb250ZXh0IFN5bnRheFxuLy8gPT09PT09PT09PT09PT1cblxuLy8gTmVzdGVkIFtmdW5jdGlvbl1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXR1cm4gYSBzdWJzZXQgZ3JpZCBmb3IgbmVzdGVkIGNvbnRleHQuXG4vLyAtICRjb250ZXh0ICAgOiA8c3Bhbj5cbkBmdW5jdGlvbiBuZXN0ZWQoXG4gICRjb250ZXh0XG4pIHtcbiAgJGNvbnRleHQgICAgOiBwYXJzZS1zcGFuKCRjb250ZXh0KTtcbiAgJHNwYW4gICAgICAgOiBzdXN5LWdldChzcGFuLCAkY29udGV4dCk7XG4gICRsb2NhdGlvbiAgIDogZ2V0LWxvY2F0aW9uKCRjb250ZXh0KTtcbiAgJGNvbHVtbnMgICAgOiBzdXN5LWdldChjb2x1bW5zLCAkY29udGV4dCk7XG5cbiAgQHJldHVybiBzdXN5LXNsaWNlKCRzcGFuLCAkbG9jYXRpb24sICRjb2x1bW5zKTtcbn1cblxuLy8gTmVzdGVkIFttaXhpbl1cbi8vIC0tLS0tLS0tLS0tLS0tXG4vLyBVc2UgYSBzdWJzZXQgZ3JpZCBmb3IgYSBuZXN0ZWQgY29udGV4dFxuLy8gLSAkY29udGV4dCAgIDogPHNwYW4+XG4vLyAtIEBjb250ZW50ICAgOiA8Y29udGVudD5cbkBtaXhpbiBuZXN0ZWQoXG4gICRjb250ZXh0XG4pIHtcbiAgJGluc3BlY3QgIDogJGNvbnRleHQ7XG4gICRjb250ZXh0ICA6IHBhcnNlLXNwYW4oJGNvbnRleHQpO1xuICAkb2xkICAgICAgOiBzdXN5LWdldChjb2x1bW5zKTtcbiAgJHN1c3kgICAgIDogbWFwLW1lcmdlKCRzdXN5LCAoY29sdW1uczogbmVzdGVkKCRjb250ZXh0KSkpICFnbG9iYWw7XG5cbiAgQGluY2x1ZGUgc3VzeS1pbnNwZWN0KG5lc3RlZCwgJGluc3BlY3QpO1xuICBAY29udGVudDtcblxuICAkc3VzeSAgICAgOiBtYXAtbWVyZ2UoJHN1c3ksIChjb2x1bW5zOiAkb2xkKSkgIWdsb2JhbDtcbn1cbiIsIi8vIEJhY2tncm91bmQgR3JpZCBTeW50YXhcbi8vID09PT09PT09PT09PT09PT09PT09PT1cblxuJHN1c3ktb3ZlcmxheS1ncmlkLWhlYWQtZXhpc3RzOiBmYWxzZTtcblxuXG4vLyBTaG93IEdyaWQvc1xuLy8gLS0tLS0tLS0tLS1cbi8vIFNob3cgZ3JpZCBvbiBhbnkgZWxlbWVudCB1c2luZyBlaXRoZXIgYmFja2dyb3VuZCBvciBvdmVybGF5LlxuLy8gLSBbJGdyaWRdICA6IDxzZXR0aW5ncz5cbkBtaXhpbiBzaG93LWdyaWQoXG4gICRncmlkOiAkc3VzeVxuKSB7XG4gICRpbnNwZWN0OiAkZ3JpZDtcbiAgJF9vdXRwdXQ6IGRlYnVnLWdldChvdXRwdXQsICRncmlkKTtcblxuICBAaW5jbHVkZSBzdXN5LWluc3BlY3Qoc2hvdy1ncmlkLCAkaW5zcGVjdCk7XG4gIEBpZiAkX291dHB1dCA9PSBvdmVybGF5IGFuZCBzdXN5LWdldChkZWJ1ZyBpbWFnZSwgJGdyaWQpICE9IGhpZGUge1xuICAgIEBpbmNsdWRlIG92ZXJsYXktZ3JpZCgkZ3JpZCk7XG4gIH0gQGVsc2Uge1xuICAgIEBpbmNsdWRlIGJhY2tncm91bmQtZ3JpZCgkZ3JpZCk7XG4gIH1cbn1cblxuQG1peGluIHNob3ctZ3JpZHMoXG4gICRncmlkOiAkc3VzeVxuKSB7XG4gIEBpbmNsdWRlIHNob3ctZ3JpZCgkZ3JpZCk7XG59XG5cbi8vIEJhY2tncm91bmQgR3JpZFxuLy8gLS0tLS0tLS0tLS0tLS0tXG4vLyBTaG93IGEgZ3JpZCBiYWNrZ3JvdW5kIG9uIGFueSBlbGVtZW50LlxuLy8gLSBbJGdyaWRdICA6IDxzZXR0aW5ncz5cbkBtaXhpbiBiYWNrZ3JvdW5kLWdyaWQoXG4gICRncmlkOiAkc3VzeVxuKSB7XG4gICRpbnNwZWN0ICA6ICRncmlkO1xuICAkX291dHB1dCAgOiBnZXQtYmFja2dyb3VuZCgkZ3JpZCk7XG5cbiAgQGlmIGxlbmd0aCgkX291dHB1dCkgPiAwIHtcbiAgICAkX2Zsb3c6IHN1c3ktZ2V0KGZsb3csICRncmlkKTtcblxuICAgICRfaW1hZ2U6ICgpO1xuICAgIEBlYWNoICRuYW1lLCAkbGF5ZXIgaW4gbWFwLWdldCgkX291dHB1dCwgaW1hZ2UpIHtcbiAgICAgICRfZGlyZWN0aW9uOiBpZigkbmFtZSA9PSBiYXNlbGluZSwgdG8gYm90dG9tLCB0byB0bygkX2Zsb3cpKTtcbiAgICAgICRfaW1hZ2U6IGFwcGVuZCgkX2ltYWdlLCBsaW5lYXItZ3JhZGllbnQoJF9kaXJlY3Rpb24sICRsYXllciksIGNvbW1hKTtcbiAgICB9XG4gICAgJF9vdXRwdXQ6IG1hcC1tZXJnZSgkX291dHB1dCwgKGltYWdlOiAkX2ltYWdlKSk7XG5cbiAgICBAaW5jbHVkZSBiYWNrZ3JvdW5kLWdyaWQtb3V0cHV0KCRfb3V0cHV0Li4uKTtcbiAgICBAaW5jbHVkZSBzdXN5LWluc3BlY3QoYmFja2dyb3VuZC1ncmlkLCAkaW5zcGVjdCk7XG4gIH1cbn1cblxuXG4vLyBPdmVybGF5IEdyaWRcbi8vIC0tLS0tLS0tLS0tLVxuLy8gR2VuZXJhdGUgYW4gaWNvbiB0byB0cmlnZ2VyIGdyaWQtb3ZlcmxheXMgb24gYW55IGdpdmVuIGVsZW1lbnRzLlxuLy8gJGdyaWRzLi4uICA6IDxzZWxlY3Rvcj4gWzxzZXR0aW5ncz5dIFssIDxzZWxlY3Rvcj5dKlxuQG1peGluIG92ZXJsYXktZ3JpZCAoXG4gICRncmlkOiAkc3VzeVxuKSB7XG4gIEBpZiBub3QoJHN1c3ktb3ZlcmxheS1ncmlkLWhlYWQtZXhpc3RzKSB7XG4gICAgQGF0LXJvb3QgaGVhZCB7IEBpbmNsdWRlIG92ZXJsYXktaGVhZCgkZ3JpZCk7IH1cbiAgICBAYXQtcm9vdCBoZWFkOmJlZm9yZSB7IEBpbmNsdWRlIG92ZXJsYXktdHJpZ2dlcjsgfVxuICAgIEBhdC1yb290IGhlYWQ6aG92ZXIgeyBAaW5jbHVkZSBvdmVybGF5LXRyaWdnZXItaG92ZXI7IH1cbiAgICAkc3VzeS1vdmVybGF5LWdyaWQtaGVhZC1leGlzdHM6IHRydWUgIWdsb2JhbDtcbiAgfVxuXG4gIGhlYWQ6aG92ZXIgfiAmLFxuICBoZWFkOmhvdmVyIH4gYm9keSAmIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgJjpiZWZvcmUge1xuICAgICAgQGluY2x1ZGUgZ3JpZC1vdmVybGF5LWJhc2U7XG4gICAgICBAaW5jbHVkZSBiYWNrZ3JvdW5kLWdyaWQoJGdyaWQpO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIFtQcml2YXRlXSBPdmVybGF5IFRyaWdnZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkBtaXhpbiBvdmVybGF5LXRyaWdnZXIge1xuICBjb250ZW50OiBcInx8fFwiO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIGZvbnQ6IHtcbiAgICBmYW1pbHk6IHNhbnMtc2VyaWY7XG4gICAgc2l6ZTogMTZweDtcbiAgICB3ZWlnaHQ6IGJvbGQ7XG4gIH1cbn1cblxuXG4vLyBbUHJpdmF0ZV0gT3ZlcmxheSBUcmlnZ2VyIEhvdmVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5AbWl4aW4gb3ZlcmxheS10cmlnZ2VyLWhvdmVyIHtcbiAgYmFja2dyb3VuZDogcmdiYSh3aGl0ZSwgLjUpO1xuICBjb2xvcjogcmVkO1xufVxuXG5cbi8vIFtQcml2YXRlXSBPdmVybGF5IEhlYWRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIDxoZWFkPiBzdHlsZXMgdG8gY3JlYXRlIGdyaWQgb3ZlcmxheSB0b2dnbGVcbkBtaXhpbiBvdmVybGF5LWhlYWQgKFxuICAkZ3JpZDogJHN1c3lcbikge1xuICAkX3RvZ2dsZTogZGVidWctZ2V0KHRvZ2dsZSwgJGdyaWQpO1xuICAkX2hvcno6IG51bGw7XG4gICRfdmVydDogbnVsbDtcblxuICBAZWFjaCAkc2lkZSBpbiAkX3RvZ2dsZSB7XG4gICAgJF9ob3J6OiBpZigkc2lkZSA9PSBsZWZ0IG9yICRzaWRlID09IHJpZ2h0LCAkc2lkZSwgJF9ob3J6KTtcbiAgICAkX3ZlcnQ6IGlmKCRzaWRlID09IHRvcCBvciAkc2lkZSA9PSBib3R0b20sICRzaWRlLCAkX3ZlcnQpO1xuICB9XG5cbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgI3skX2hvcnp9OiAxMHB4O1xuICAjeyRfdmVydH06IDEwcHg7XG4gIHotaW5kZXg6IDk5OTtcbiAgY29sb3I6ICMzMzM7XG4gIGJhY2tncm91bmQ6IHJnYmEod2hpdGUsIC4yNSk7XG59XG5cblxuLy8gW1ByaXZhdGVdIEdyaWQgT3ZlcmxheSBCYXNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJhc2Ugc3R5bGVzIGZvciBnZW5lcmF0aW5nIGEgZ3JpZCBvdmVybGF5XG5AbWl4aW4gZ3JpZC1vdmVybGF5LWJhc2UoKSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBib3R0b206IDA7XG4gIHJpZ2h0OiAwO1xuICBjb250ZW50OiBcIiBcIjtcbiAgei1pbmRleDogOTk4O1xufVxuXG5cbi8vIEdldCBTeW1tZXRyaWNhbCBCYWNrZ3JvdW5kXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gLSAkZ3JpZDogPG1hcD5cbkBmdW5jdGlvbiBnZXQtYmFja2dyb3VuZC1zeW0oXG4gICRncmlkXG4pIHtcbiAgJGdyaWQgICAgICAgICAgIDogcGFyc2UtZ3JpZCgkZ3JpZCk7XG4gICRfZ3V0dGVycyAgICAgICA6IHN1c3ktZ2V0KGd1dHRlcnMsICRncmlkKTtcbiAgJF9jb2x1bW4td2lkdGggIDogc3VzeS1nZXQoY29sdW1uLXdpZHRoLCAkZ3JpZCk7XG4gICRfbWF0aCAgICAgICAgICA6IHN1c3ktZ2V0KG1hdGgsICRncmlkKTtcblxuICAkX2NvbG9yICAgICAgICAgOiBkZWJ1Zy1nZXQoY29sb3IpO1xuICAkX3RyYW5zICAgICAgICAgOiB0cmFuc3BhcmVudDtcbiAgJF9saWdodCAgICAgICAgIDogbGlnaHRlbigkX2NvbG9yLCAxNSUpO1xuXG4gICRfZW5kICAgICAgICAgICA6IDEgKyAkX2d1dHRlcnM7XG4gICRfYWZ0ZXIgICAgICAgICA6IHBlcmNlbnRhZ2UoMS8kX2VuZCk7XG4gICRfc3RvcHMgICAgICAgICA6ICgpO1xuICAkX3NpemUgICAgICAgICAgOiBzcGFuKDEgJGdyaWQgd2lkZSk7XG5cbiAgQGlmIGlzLWluc2lkZSgkZ3JpZCkge1xuICAgICRfc3RvcHM6ICRfY29sb3IsICRfbGlnaHQ7XG4gIH0gQGVsc2UgaWYgaXMtc3BsaXQoJGdyaWQpIHtcbiAgICAkX3NwbGl0OiAkX2d1dHRlcnMvMjtcbiAgICAkX2JlZm9yZTogcGVyY2VudGFnZSgkX3NwbGl0LyRfZW5kKTtcbiAgICAkX2FmdGVyOiBwZXJjZW50YWdlKCgxICsgJF9zcGxpdCkvJF9lbmQpO1xuICAgICRfc3RvcHM6ICRfdHJhbnMgJF9iZWZvcmUsICRfY29sb3IgJF9iZWZvcmUsICRfbGlnaHQgJF9hZnRlciwgJF90cmFucyAkX2FmdGVyO1xuICB9IEBlbHNlIHtcbiAgICAkX3N0b3BzOiAkX2NvbG9yLCAkX2xpZ2h0ICRfYWZ0ZXIsICRfdHJhbnMgJF9hZnRlcjtcbiAgfVxuXG4gIEBpZiAkX21hdGggPT0gc3RhdGljIHtcbiAgICAkX3NpemU6IHZhbGlkLWNvbHVtbi1tYXRoKCRfbWF0aCwgJF9jb2x1bW4td2lkdGgpICogJF9lbmQ7XG4gIH1cblxuICAkX291dHB1dDogKFxuICAgIGltYWdlOiAoY29sdW1uczogJF9zdG9wcyksXG4gICAgc2l6ZTogJF9zaXplLFxuICApO1xuXG4gIEByZXR1cm4gJF9vdXRwdXQ7XG59XG5cblxuLy8gR2V0IEFzeW1tZXRyaWNhbCBJbnNpZGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyAtICRncmlkOiA8c2V0dGluZ3M+XG5AZnVuY3Rpb24gZ2V0LWFzeW0taW5zaWRlKFxuICAkZ3JpZFxuKSB7XG4gICRncmlkICAgICA6IHBhcnNlLWdyaWQoJGdyaWQpO1xuICAkX2NvbHVtbnMgOiBzdXN5LWdldChjb2x1bW5zLCAkZ3JpZCk7XG5cbiAgJF9jb2xvciAgIDogZGVidWctZ2V0KGNvbG9yKTtcbiAgJF9saWdodCAgIDogbGlnaHRlbigkX2NvbG9yLCAxNSUpO1xuICAkX3N0b3BzICAgOiAoKTtcblxuICBAZm9yICRsb2NhdGlvbiBmcm9tIDEgdGhyb3VnaCBzdXN5LWNvdW50KCRfY29sdW1ucykge1xuICAgICR0aGlzLXN0b3A6ICgpO1xuXG4gICAgQGlmICRsb2NhdGlvbiA9PSAxIHtcbiAgICAgICR0aGlzLXN0b3A6IGFwcGVuZCgkdGhpcy1zdG9wLCAkX2NvbG9yLCBjb21tYSk7XG4gICAgfSBAZWxzZSB7XG4gICAgICAkc3RhcnQ6IHBhcnNlLXNwYW4oMSBhdCAkbG9jYXRpb24gJGdyaWQpO1xuICAgICAgJHN0YXJ0OiBnZXQtaXNvbGF0aW9uKCRzdGFydCk7XG4gICAgICAkdGhpcy1zdG9wOiBhcHBlbmQoJHRoaXMtc3RvcCwgJF9jb2xvciAkc3RhcnQsIGNvbW1hKTtcbiAgICB9XG5cbiAgICBAaWYgJGxvY2F0aW9uID09IHN1c3ktY291bnQoJF9jb2x1bW5zKSB7XG4gICAgICAkdGhpcy1zdG9wOiBhcHBlbmQoJHRoaXMtc3RvcCwgJF9saWdodCwgY29tbWEpO1xuICAgIH0gQGVsc2Uge1xuICAgICAgJF9lbmQ6IHBhcnNlLXNwYW4oMSBhdCAoJGxvY2F0aW9uICsgMSkgJGdyaWQpO1xuICAgICAgJF9lbmQ6IGdldC1pc29sYXRpb24oJF9lbmQpO1xuICAgICAgJHRoaXMtc3RvcDogYXBwZW5kKCR0aGlzLXN0b3AsICRfbGlnaHQgJF9lbmQsIGNvbW1hKTtcbiAgICB9XG5cbiAgICAkX3N0b3BzOiBqb2luKCRfc3RvcHMsICR0aGlzLXN0b3AsIGNvbW1hKTtcbiAgfVxuXG4gIEByZXR1cm4gJF9zdG9wcztcbn1cblxuXG4vLyBHZXQgQXN5bW1ldHJpY2FsIFNwbGl0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyAtICRncmlkOiA8c2V0dGluZ3M+XG5AZnVuY3Rpb24gZ2V0LWFzeW0tc3BsaXQoXG4gICRncmlkXG4pIHtcbiAgJGdyaWQgICAgIDogcGFyc2UtZ3JpZCgkZ3JpZCk7XG4gICRfY29sdW1ucyA6IHN1c3ktZ2V0KGNvbHVtbnMsICRncmlkKTtcblxuICAkX2NvbG9yICAgOiBkZWJ1Zy1nZXQoY29sb3IpO1xuICAkX2xpZ2h0ICAgOiBsaWdodGVuKCRfY29sb3IsIDE1JSk7XG4gICRfc3RvcHMgICA6ICgpO1xuXG4gIEBmb3IgJGxvY2F0aW9uIGZyb20gMSB0aHJvdWdoIHN1c3ktY291bnQoJF9jb2x1bW5zKSB7XG4gICAgJHRoaXMtc3RvcDogKCk7XG5cbiAgICAkc3RhcnQ6IHBhcnNlLXNwYW4oMSBhdCAkbG9jYXRpb24gJGdyaWQpO1xuICAgICRzdGFydDogZ2V0LWlzb2xhdGlvbigkc3RhcnQpO1xuICAgICR0aGlzLXN0b3A6IGFwcGVuZCgkdGhpcy1zdG9wLCB0cmFuc3BhcmVudCAkc3RhcnQsIGNvbW1hKTtcbiAgICAkdGhpcy1zdG9wOiBhcHBlbmQoJHRoaXMtc3RvcCwgJF9jb2xvciAkc3RhcnQsIGNvbW1hKTtcblxuICAgICRfZW5kOiAkc3RhcnQgKyBzcGFuKDEgYXQgJGxvY2F0aW9uICRncmlkKTtcbiAgICAkdGhpcy1zdG9wOiBhcHBlbmQoJHRoaXMtc3RvcCwgJF9saWdodCAkX2VuZCwgY29tbWEpO1xuICAgICR0aGlzLXN0b3A6IGFwcGVuZCgkdGhpcy1zdG9wLCB0cmFuc3BhcmVudCAkX2VuZCwgY29tbWEpO1xuXG4gICAgJF9zdG9wczogam9pbigkX3N0b3BzLCAkdGhpcy1zdG9wLCBjb21tYSk7XG4gIH1cblxuICBAcmV0dXJuICRfc3RvcHM7XG59XG5cblxuLy8gR2V0IEFzeW1tZXRyaWNhbCBPdXRzaWRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIC0gJGdyaWQ6IDxzZXR0aW5ncz5cbkBmdW5jdGlvbiBnZXQtYXN5bS1vdXRzaWRlKFxuICAkZ3JpZFxuKSB7XG4gICRncmlkICAgICA6IHBhcnNlLWdyaWQoJGdyaWQpO1xuICAkX2NvbHVtbnMgOiBzdXN5LWdldChjb2x1bW5zLCAkZ3JpZCk7XG5cbiAgJF9jb2xvciAgIDogZGVidWctZ2V0KGNvbG9yKTtcbiAgJF9saWdodCAgIDogbGlnaHRlbigkX2NvbG9yLCAxNSUpO1xuICAkX3RyYW5zICAgOiB0cmFuc3BhcmVudDtcbiAgJF9zdG9wcyAgIDogKCk7XG5cbiAgQGZvciAkbG9jYXRpb24gZnJvbSAxIHRocm91Z2ggc3VzeS1jb3VudCgkX2NvbHVtbnMpIHtcbiAgICAkdGhpcy1zdG9wOiAoKTtcblxuICAgIEBpZiAkbG9jYXRpb24gPT0gMSB7XG4gICAgICAkdGhpcy1zdG9wOiBhcHBlbmQoJHRoaXMtc3RvcCwgJF9jb2xvciwgY29tbWEpO1xuICAgIH0gQGVsc2Uge1xuICAgICAgJHN0YXJ0OiBwYXJzZS1zcGFuKDEgYXQgJGxvY2F0aW9uICRncmlkKTtcbiAgICAgICRzdGFydDogZ2V0LWlzb2xhdGlvbigkc3RhcnQpO1xuICAgICAgJHRoaXMtc3RvcDogYXBwZW5kKCR0aGlzLXN0b3AsICRfY29sb3IgJHN0YXJ0LCBjb21tYSk7XG4gICAgfVxuXG4gICAgQGlmICRsb2NhdGlvbiA9PSBzdXN5LWNvdW50KCRfY29sdW1ucykge1xuICAgICAgJHRoaXMtc3RvcDogYXBwZW5kKCR0aGlzLXN0b3AsICRfbGlnaHQsIGNvbW1hKTtcbiAgICB9IEBlbHNlIHtcbiAgICAgICRndXR0ZXI6IGdldC1zcGFuLXdpZHRoKGZpcnN0ICRsb2NhdGlvbiAkZ3JpZCk7XG5cbiAgICAgICRfZW5kOiBwYXJzZS1zcGFuKDEgYXQgKCRsb2NhdGlvbiArIDEpICRncmlkKTtcbiAgICAgICRfZW5kOiBnZXQtaXNvbGF0aW9uKCRfZW5kKTtcblxuICAgICAgJGd1dHRlcjogJF9saWdodCAkZ3V0dGVyLCAkX3RyYW5zICRndXR0ZXIsICRfdHJhbnMgJF9lbmQ7XG4gICAgICAkdGhpcy1zdG9wOiBqb2luKCR0aGlzLXN0b3AsICRndXR0ZXIsIGNvbW1hKTtcbiAgICB9XG5cbiAgICAkX3N0b3BzOiBqb2luKCRfc3RvcHMsICR0aGlzLXN0b3AsIGNvbW1hKTtcbiAgfVxuXG4gIEByZXR1cm4gJF9zdG9wcztcbn1cblxuXG4vLyBHZXQgQXN5bW1ldHJpY2FsIEJhY2tncm91bmRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gLSAkZ3JpZDogPHNldHRpbmdzPlxuQGZ1bmN0aW9uIGdldC1iYWNrZ3JvdW5kLWFzeW0oXG4gICRncmlkXG4pIHtcbiAgJF9zdG9wczogKCk7XG5cbiAgQGlmIGlzLWluc2lkZSgkZ3JpZCkge1xuICAgICRfc3RvcHM6IGdldC1hc3ltLWluc2lkZSgkZ3JpZCk7XG4gIH0gQGVsc2UgaWYgaXMtc3BsaXQoJGdyaWQpIHtcbiAgICAkX3N0b3BzOiBnZXQtYXN5bS1zcGxpdCgkZ3JpZCk7XG4gIH0gQGVsc2Uge1xuICAgICRfc3RvcHM6IGdldC1hc3ltLW91dHNpZGUoJGdyaWQpO1xuICB9XG5cbiAgQHJldHVybiAoaW1hZ2U6IChjb2x1bW5zOiAkX3N0b3BzKSk7XG59XG5cblxuLy8gR2V0IEJhY2tncm91bmRcbi8vIC0tLS0tLS0tLS0tLS0tXG4vLyAtICRncmlkOiA8c2V0dGluZ3M+XG5AZnVuY3Rpb24gZ2V0LWJhY2tncm91bmQoXG4gICRncmlkXG4pIHtcbiAgJGdyaWQgICAgIDogcGFyc2UtZ3JpZCgkZ3JpZCk7XG4gICRfc2hvdyAgICA6IHN1c3ktZ2V0KGRlYnVnIGltYWdlLCAkZ3JpZCk7XG4gICRfcmV0dXJuICA6ICgpO1xuXG4gIEBpZiAkX3Nob3cgYW5kICRfc2hvdyAhPSAnaGlkZScge1xuICAgICRfY29sdW1uczogc3VzeS1nZXQoY29sdW1ucywgJGdyaWQpO1xuXG4gICAgQGlmICRfc2hvdyAhPSAnc2hvdy1iYXNlbGluZScge1xuICAgICAgJF9zeW06IGlzLXN5bW1ldHJpY2FsKCRfY29sdW1ucyk7XG4gICAgICAkX3JldHVybjogaWYoJF9zeW0sIGdldC1iYWNrZ3JvdW5kLXN5bSgkZ3JpZCksIGdldC1iYWNrZ3JvdW5kLWFzeW0oJGdyaWQpKTtcbiAgICAgICRfcmV0dXJuOiBtYXAtbWVyZ2UoJF9yZXR1cm4sIChjbGlwOiBjb250ZW50LWJveCkpO1xuICAgIH1cblxuICAgIEBpZiAkX3Nob3cgIT0gJ3Nob3ctY29sdW1ucydcbiAgICAgIGFuZCBnbG9iYWwtdmFyaWFibGUtZXhpc3RzKGJhc2UtbGluZS1oZWlnaHQpXG4gICAgICBhbmQgdHlwZS1vZigkYmFzZS1saW5lLWhlaWdodCkgPT0gJ251bWJlcidcbiAgICAgIGFuZCBub3QgdW5pdGxlc3MoJGJhc2UtbGluZS1oZWlnaHQpIHtcbiAgICAgICRfY29sb3I6IHZhcmlhYmxlLWV4aXN0cygnZ3JpZC1iYWNrZ3JvdW5kLWJhc2VsaW5lLWNvbG9yJyk7XG4gICAgICAkX2NvbG9yOiBpZigkX2NvbG9yLCAkZ3JpZC1iYWNrZ3JvdW5kLWJhc2VsaW5lLWNvbG9yLCAjMDAwKTtcblxuICAgICAgJF9pbWFnZTogbWFwLWdldCgkX3JldHVybiwgaW1hZ2UpO1xuICAgICAgJF9zaXplOiBtYXAtZ2V0KCRfcmV0dXJuLCBzaXplKTtcbiAgICAgICRfYmFzZWxpbmU6IChiYXNlbGluZTogKCRfY29sb3IgMXB4LCB0cmFuc3BhcmVudCAxcHgpKTtcbiAgICAgICRfYmFzZWxpbmUtc2l6ZTogMTAwJSAkYmFzZS1saW5lLWhlaWdodDtcblxuICAgICAgJF9yZXR1cm46IG1hcC1tZXJnZSgkX3JldHVybiwgKFxuICAgICAgICBpbWFnZTogaWYoJF9pbWFnZSwgbWFwLW1lcmdlKCRfaW1hZ2UsICRfYmFzZWxpbmUpLCAkX2Jhc2VsaW5lKSxcbiAgICAgICAgc2l6ZTogaWYoJF9zaXplLCAoJF9zaXplLCAkX2Jhc2VsaW5lLXNpemUpLCAkX2Jhc2VsaW5lLXNpemUpLFxuICAgICAgKSk7XG5cbiAgICAgIEBpZiAkX3Nob3cgPT0gJ3Nob3cnIHtcbiAgICAgICAgJF9jbGlwOiBtYXAtZ2V0KCRfcmV0dXJuLCBjbGlwKTtcbiAgICAgICAgJF9yZXR1cm46IG1hcC1tZXJnZSgkX3JldHVybiwgKGNsaXA6IGpvaW4oJF9jbGlwLCBib3JkZXItYm94LCBjb21tYSkpKTtcbiAgICAgIH1cbiAgICB9IEBlbHNlIGlmICRfc2hvdyA9PSAnc2hvdy1iYXNlbGluZScge1xuICAgICAgQHdhcm4gJ1BsZWFzZSBwcm92aWRlIGEgJGJhc2UtbGluZS1oZWlnaHQgd2l0aCB0aGUgZGVzaXJlZCBoZWlnaHQgYW5kIHVuaXRzJztcbiAgICB9XG4gIH1cblxuICBAaWYgbWFwLWdldCgkX3JldHVybiwgaW1hZ2UpIHtcbiAgICAkX3JldHVybjogbWFwLW1lcmdlKCRfcmV0dXJuLCAoZmxvdzogc3VzeS1nZXQoZmxvdywgJGdyaWQpKSk7XG4gIH1cblxuICBAcmV0dXJuICRfcmV0dXJuO1xufVxuXG5cbi8vIEdldCBEZWJ1Z1xuLy8gLS0tLS0tLS0tXG4vLyBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgZGVidWcgc2V0dGluZ1xuLy8gLSAka2V5OiA8c2V0dGluZz5cbkBmdW5jdGlvbiBkZWJ1Zy1nZXQoXG4gICRrZXksXG4gICRncmlkOiAkc3VzeVxuKSB7XG4gICRrZXk6IGpvaW4oZGVidWcsICRrZXksIHNwYWNlKTtcbiAgQHJldHVybiBzdXN5LWdldCgka2V5LCAkZ3JpZCk7XG59XG4iLCIvLyBDb250YWluZXIgU3ludGF4XG4vLyA9PT09PT09PT09PT09PT09XG5cbi8vIENvbnRhaW5lciBbbWl4aW5dXG4vLyAtLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2V0IGEgY29udGFpbmVyIGVsZW1lbnRcbi8vIC0gWyRsYXlvdXRdICA6IDxzZXR0aW5ncz5cbkBtaXhpbiBjb250YWluZXIoXG4gICRsYXlvdXQ6ICRzdXN5XG4pIHtcbiAgJGluc3BlY3QgICAgOiAkbGF5b3V0O1xuICAkbGF5b3V0ICAgICA6IHBhcnNlLWdyaWQoJGxheW91dCk7XG5cbiAgJF93aWR0aCAgICAgOiBnZXQtY29udGFpbmVyLXdpZHRoKCRsYXlvdXQpO1xuICAkX2p1c3RpZnkgICA6IHBhcnNlLWNvbnRhaW5lci1wb3NpdGlvbihzdXN5LWdldChjb250YWluZXItcG9zaXRpb24sICRsYXlvdXQpKTtcbiAgJF9wcm9wZXJ0eSAgOiBpZihzdXN5LWdldChtYXRoLCAkbGF5b3V0KSA9PSBzdGF0aWMsIHdpZHRoLCBtYXgtd2lkdGgpO1xuXG4gICRfYm94ICAgICAgIDogc3VzeS1nZXQoYm94LXNpemluZywgJGxheW91dCk7XG5cbiAgQGlmICRfYm94IHtcbiAgICBAaW5jbHVkZSBvdXRwdXQoKGJveC1zaXppbmc6ICRfYm94KSk7XG4gIH1cblxuICBAaW5jbHVkZSBzdXN5LWluc3BlY3QoY29udGFpbmVyLCAkaW5zcGVjdCk7XG4gIEBpbmNsdWRlIGZsb2F0LWNvbnRhaW5lcigkX3dpZHRoLCAkX2p1c3RpZnksICRfcHJvcGVydHkpO1xuICBAaW5jbHVkZSBzaG93LWdyaWQoJGxheW91dCk7XG59XG5cbi8vIENvbnRhaW5lciBbZnVuY3Rpb25dXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmV0dXJuIGNvbnRhaW5lciB3aWR0aFxuLy8gLSBbJGxheW91dF0gIDogPHNldHRpbmdzPlxuQGZ1bmN0aW9uIGNvbnRhaW5lcihcbiAgJGxheW91dDogJHN1c3lcbikge1xuICAkbGF5b3V0OiBwYXJzZS1ncmlkKCRsYXlvdXQpO1xuICBAcmV0dXJuIGdldC1jb250YWluZXItd2lkdGgoJGxheW91dCk7XG59XG5cbi8vIEdldCBDb250YWluZXIgV2lkdGhcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENhbGN1bGF0ZSB0aGUgY29udGFpbmVyIHdpZHRoXG4vLyAtIFskbGF5b3V0XTogPHNldHRpbmdzPlxuQGZ1bmN0aW9uIGdldC1jb250YWluZXItd2lkdGgoXG4gICRsYXlvdXQ6ICRzdXN5XG4pIHtcbiAgJGxheW91dCAgICAgICAgIDogcGFyc2UtZ3JpZCgkbGF5b3V0KTtcbiAgJF93aWR0aCAgICAgICAgIDogc3VzeS1nZXQoY29udGFpbmVyLCAkbGF5b3V0KTtcbiAgJF9jb2x1bW4td2lkdGggIDogc3VzeS1nZXQoY29sdW1uLXdpZHRoLCAkbGF5b3V0KTtcbiAgJF9tYXRoICAgICAgICAgIDogc3VzeS1nZXQobWF0aCwgJGxheW91dCk7XG5cbiAgQGlmIG5vdCgkX3dpZHRoKSBvciAkX3dpZHRoID09IGF1dG8ge1xuICAgIEBpZiB2YWxpZC1jb2x1bW4tbWF0aCgkX21hdGgsICRfY29sdW1uLXdpZHRoKSB7XG4gICAgICAkX2NvbHVtbnMgICA6IHN1c3ktZ2V0KGNvbHVtbnMsICRsYXlvdXQpO1xuICAgICAgJF9ndXR0ZXJzICAgOiBzdXN5LWdldChndXR0ZXJzLCAkbGF5b3V0KTtcbiAgICAgICRfc3ByZWFkICAgIDogaWYoaXMtc3BsaXQoJGxheW91dCksIHdpZGUsIG5hcnJvdyk7XG4gICAgICAkX3dpZHRoICAgICA6IHN1c3ktc3VtKCRfY29sdW1ucywgJF9ndXR0ZXJzLCAkX3NwcmVhZCkgKiAkX2NvbHVtbi13aWR0aDtcbiAgICB9IEBlbHNlIHtcbiAgICAgICRfd2lkdGg6IDEwMCU7XG4gICAgfVxuICB9XG5cbiAgQHJldHVybiAkX3dpZHRoO1xufVxuXG4vLyBQYXJzZSBDb250YWluZXIgUG9zaXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGFyc2UgdGhlICRjb250YWluZXItcG9zaXRpb24gaW50byBtYXJnaW4gdmFsdWVzLlxuLy8gLSBbJGp1c3RpZnldICAgOiBsZWZ0IHwgY2VudGVyIHwgcmlnaHQgfCA8bGVuZ3RoPiBbPGxlbmd0aD5dXG5AZnVuY3Rpb24gcGFyc2UtY29udGFpbmVyLXBvc2l0aW9uKFxuICAkanVzdGlmeTogbWFwLWdldCgkc3VzeS1kZWZhdWx0cywgY29udGFpbmVyLXBvc2l0aW9uKVxuKSB7XG4gICRfcmV0dXJuOiBpZigkanVzdGlmeSA9PSBsZWZ0LCAwLCBhdXRvKSBpZigkanVzdGlmeSA9PSByaWdodCwgMCwgYXV0byk7XG5cbiAgQGlmIG5vdChpbmRleChsZWZ0IHJpZ2h0IGNlbnRlciwgJGp1c3RpZnkpKSB7XG4gICAgJF9yZXR1cm46IG50aCgkanVzdGlmeSwgMSk7XG4gICAgJF9yZXR1cm46ICRfcmV0dXJuIGlmKGxlbmd0aCgkanVzdGlmeSkgPiAxLCBudGgoJGp1c3RpZnksIDIpLCAkX3JldHVybik7XG4gIH1cblxuICBAcmV0dXJuICRfcmV0dXJuO1xufVxuIiwiLy8gU3BhbiBTeW50YXhcbi8vID09PT09PT09PT09XG5cbi8vIFNwYW4gW21peGluXVxuLy8gLS0tLS0tLS0tLS0tXG4vLyBTZXQgYSBzcGFubmluZyBlbGVtZW50IHVzaW5nIHNob3J0aGFuZCBzeW50YXguXG4vLyAtICRzcGFuICA6IDxzcGFuPlxuQG1peGluIHNwYW4oXG4gICRzcGFuXG4pIHtcbiAgJGluc3BlY3Q6ICRzcGFuO1xuICAkc3BhbjogcGFyc2Utc3Bhbigkc3Bhbik7XG4gICRvdXRwdXQ6IHNwYW4tbWF0aCgkc3Bhbik7XG4gICRuZXN0aW5nOiBzdXN5LWdldChzcGFuLCAkc3Bhbik7XG4gICRjbGVhcjogc3VzeS1nZXQoY2xlYXIsICRzcGFuKTtcblxuICAkYm94OiBzdXN5LWdldChib3gtc2l6aW5nLCAkc3Bhbik7XG4gICRjb250ZW50LWJveDogaWYoc3VzeS1nZXQoZ2xvYmFsLWJveC1zaXppbmcpICE9ICdib3JkZXItYm94JywgdHJ1ZSwgZmFsc2UpO1xuICAkYm94OiAkYm94IG9yIGlmKGlzLWluc2lkZSgkc3BhbikgYW5kICRjb250ZW50LWJveCwgYm9yZGVyLWJveCwgbnVsbCk7XG5cbiAgQGlmICRjbGVhciA9PSBicmVhayB7XG4gICAgQGluY2x1ZGUgYnJlYWs7XG4gIH0gQGVsc2UgaWYgJGNsZWFyID09IG5vYnJlYWsge1xuICAgIEBpbmNsdWRlIG5vYnJlYWs7XG4gIH1cblxuICBAaW5jbHVkZSBzdXN5LWluc3BlY3Qoc3BhbiwgJGluc3BlY3QpO1xuICBAaW5jbHVkZSBvdXRwdXQoKGJveC1zaXppbmc6ICRib3gpKTtcbiAgQGluY2x1ZGUgZmxvYXQtc3Bhbi1vdXRwdXQoJG91dHB1dC4uLik7XG5cbiAgQGlmIHZhbGlkLWNvbHVtbnMoJG5lc3RpbmcsIHNpbGVudCkge1xuICAgIEBpbmNsdWRlIG5lc3RlZCgkc3BhbikgeyBAY29udGVudDsgfVxuICB9IEBlbHNlIHtcbiAgICBAY29udGVudDtcbiAgfVxufVxuXG4vLyBTcGFuIFtmdW5jdGlvbl1cbi8vIC0tLS0tLS0tLS0tLS0tLVxuLy8gUmV0dXJuIHRoZSB3aWR0aCBvZiBhIHNwYW4uXG4vLyAtICRzcGFuICA6IDxzcGFuPlxuQGZ1bmN0aW9uIHNwYW4oXG4gICRzcGFuXG4pIHtcbiAgQHJldHVybiBnZXQtc3Bhbi13aWR0aCgkc3Bhbik7XG59XG5cbi8vIFNwYW4gTWF0aFxuLy8gLS0tLS0tLS0tXG4vLyBHZXQgYWxsIHRoZSBzcGFuIHJlc3VsdHMuXG4vLyAtICRzcGFuOiA8bWFwPlxuQGZ1bmN0aW9uIHNwYW4tbWF0aChcbiAgJHNwYW5cbikge1xuICAkbmVzdCAgICAgICAgICAgICA6IGlmKHN1c3ktZ2V0KHJvbGUsICRzcGFuKSA9PSBuZXN0LCB0cnVlLCBmYWxzZSk7XG4gICRzcGxpdC1uZXN0ICAgICAgIDogaWYoaXMtc3BsaXQoJHNwYW4pIGFuZCAkbmVzdCwgdHJ1ZSwgZmFsc2UpO1xuICAkZWRnZSAgICAgICAgICAgICA6IGdldC1lZGdlKCRzcGFuKTtcbiAgJGxvY2F0aW9uICAgICAgICAgOiBnZXQtbG9jYXRpb24oJHNwYW4pO1xuXG4gICRmbG9hdCAgICAgICAgICAgIDogZnJvbTtcbiAgJHBhZGRpbmctYmVmb3JlICAgOiBudWxsO1xuICAkcGFkZGluZy1hZnRlciAgICA6IG51bGw7XG4gICRtYXJnaW4tYmVmb3JlICAgIDogbnVsbDtcbiAgJG1hcmdpbi1hZnRlciAgICAgOiBudWxsO1xuXG4gIC8vIGNhbGN1bGF0ZSB3aWR0aHNcbiAgJHNwcmVhZDogaW5kZXgobWFwLXZhbHVlcygkc3BhbiksIHNwcmVhZCk7XG4gICRzcGFuOiBpZigkc3BsaXQtbmVzdCBhbmQgbm90KCRzcHJlYWQpLCBtYXAtbWVyZ2UoJHNwYW4sIChzcHJlYWQ6IHdpZGUpKSwgJHNwYW4pO1xuICAkd2lkdGg6IGdldC1zcGFuLXdpZHRoKCRzcGFuKTtcbiAgJGd1dHRlcnM6IGdldC1ndXR0ZXJzKCRzcGFuKTtcblxuICAvLyBhcHBseSBndXR0ZXJzXG4gIEBpZiBpcy1pbnNpZGUoJHNwYW4pIHtcbiAgICBAaWYgbm90KHN1c3ktZ2V0KHJvbGUsICRzcGFuKSkge1xuICAgICAgJHBhZGRpbmctYmVmb3JlOiBtYXAtZ2V0KCRndXR0ZXJzLCBiZWZvcmUpO1xuICAgICAgJHBhZGRpbmctYWZ0ZXI6IG1hcC1nZXQoJGd1dHRlcnMsIGFmdGVyKTtcbiAgICB9XG4gIH0gQGVsc2Uge1xuICAgIEBpZiBub3QoJHNwbGl0LW5lc3QpIHtcbiAgICAgICRtYXJnaW4tYmVmb3JlOiBtYXAtZ2V0KCRndXR0ZXJzLCBiZWZvcmUpO1xuICAgICAgJG1hcmdpbi1hZnRlcjogbWFwLWdldCgkZ3V0dGVycywgYWZ0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNwZWNpYWwgbWFyZ2luIGhhbmRsaW5nXG4gIEBpZiBzdXN5LWdldChvdXRwdXQsICRzcGFuKSA9PSBpc29sYXRlIGFuZCAkbG9jYXRpb24ge1xuICAgICRtYXJnaW4tYmVmb3JlOiBnZXQtaXNvbGF0aW9uKCRzcGFuKTtcbiAgICAkbWFyZ2luLWFmdGVyOiAtMTAwJTtcbiAgfSBAZWxzZSBpZiAkZWRnZSB7XG4gICAgJGlzLXNwbGl0OiBpcy1zcGxpdCgkc3Bhbik7XG4gICAgJHBvczogc3VzeS1nZXQoZ3V0dGVyLXBvc2l0aW9uLCAkc3Bhbik7XG5cbiAgICBAaWYgJGVkZ2UgPT0gbGFzdCB7XG4gICAgICAkZmxvYXQ6IHN1c3ktZ2V0KGxhc3QtZmxvdywgJHNwYW4pO1xuICAgIH1cblxuICAgIEBpZiBub3QoJGlzLXNwbGl0KSB7XG4gICAgICBAaWYgJGVkZ2UgPT0gZnVsbCBvciAoJGVkZ2UgPT0gZmlyc3QgYW5kICRwb3MgPT0gYmVmb3JlKSB7XG4gICAgICAgICRtYXJnaW4tYmVmb3JlOiAwO1xuICAgICAgfVxuICAgICAgQGlmICRlZGdlID09IGZ1bGwgb3IgKCRlZGdlID09IGxhc3QgYW5kICRwb3MgPT0gYWZ0ZXIpIHtcbiAgICAgICAgJG1hcmdpbi1hZnRlcjogMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIEByZXR1cm4gKFxuICAgIHdpZHRoICAgICAgICAgICA6ICR3aWR0aCxcbiAgICBmbG9hdCAgICAgICAgICAgOiAkZmxvYXQsXG4gICAgbWFyZ2luLWJlZm9yZSAgIDogJG1hcmdpbi1iZWZvcmUsXG4gICAgbWFyZ2luLWFmdGVyICAgIDogJG1hcmdpbi1hZnRlcixcbiAgICBwYWRkaW5nLWJlZm9yZSAgOiAkcGFkZGluZy1iZWZvcmUsXG4gICAgcGFkZGluZy1hZnRlciAgIDogJHBhZGRpbmctYWZ0ZXIsXG4gICAgZmxvdyAgICAgICAgICAgIDogc3VzeS1nZXQoZmxvdywgJHNwYW4pLFxuICApO1xufVxuXG4vLyBHZXQgU3BhbiBXaWR0aFxuLy8gLS0tLS0tLS0tLS0tLS1cbi8vIFJldHVybiBzcGFuIHdpZHRoLlxuLy8gLSAkc3BhbjogPG1hcD5cbkBmdW5jdGlvbiBnZXQtc3Bhbi13aWR0aChcbiAgJHNwYW5cbikge1xuICAkc3BhbiAgICAgOiBwYXJzZS1zcGFuKCRzcGFuKTtcblxuICAkbiAgICAgICAgOiBzdXN5LWdldChzcGFuLCAkc3Bhbik7XG4gICRsb2NhdGlvbiA6IGdldC1sb2NhdGlvbigkc3Bhbik7XG4gICRjb2x1bW5zICA6IHN1c3ktZ2V0KGNvbHVtbnMsICRzcGFuKTtcbiAgJGd1dHRlcnMgIDogc3VzeS1nZXQoZ3V0dGVycywgJHNwYW4pO1xuICAkc3ByZWFkICAgOiBzdXN5LWdldChzcHJlYWQsICRzcGFuKTtcblxuICAkY29udGV4dCAgOiBudWxsO1xuICAkc3Bhbi1zdW0gOiBudWxsO1xuICAkd2lkdGggICAgOiBudWxsO1xuXG4gIEBpZiAkbiA9PSAnZnVsbCcge1xuICAgICRwb3M6IHN1c3ktZ2V0KGd1dHRlci1wb3NpdGlvbiwgJHNwYW4pO1xuICAgICRyb2xlOiBzdXN5LWdldChyb2xlLCAkc3Bhbik7XG4gICAgJG46IGlmKCRwb3MgPT0gc3BsaXQgYW5kICRyb2xlICE9IG5lc3QsIHN1c3ktY291bnQoJGNvbHVtbnMpLCAxMDAlKTtcbiAgfVxuXG4gIEBpZiB0eXBlLW9mKCRuKSAhPSBudW1iZXIge1xuICAgIEB3YXJuIFwiKCN7dHlwZS1vZigkbil9KSAjeyRufSBpcyBub3QgYSB2YWxpZCBzcGFuLlwiO1xuICB9IEBlbHNlIGlmIHVuaXRsZXNzKCRuKSB7XG4gICAgJGNvbnRleHQ6IHN1c3ktc3VtKCRjb2x1bW5zLCAkZ3V0dGVycywgaWYoaXMtc3BsaXQoJHNwYW4pLCB3aWRlLCBuYXJyb3cpKTtcbiAgICAkc3ByZWFkOiBpZihpcy1pbnNpZGUoJHNwYW4pLCAkc3ByZWFkIG9yIHdpZGUsICRzcHJlYWQpO1xuICAgICRzcGFuLXN1bTogc3VzeSgkbiwgJGxvY2F0aW9uLCAkY29sdW1ucywgJGd1dHRlcnMsICRzcHJlYWQpO1xuXG4gICAgJF9tYXRoOiBzdXN5LWdldChtYXRoLCAkc3Bhbik7XG4gICAgJF9jb2x1bW4td2lkdGg6IHN1c3ktZ2V0KGNvbHVtbi13aWR0aCwgJHNwYW4pO1xuICAgIEBpZiAkX21hdGggPT0gc3RhdGljIHtcbiAgICAgICR3aWR0aDogJHNwYW4tc3VtICogdmFsaWQtY29sdW1uLW1hdGgoJF9tYXRoLCAkX2NvbHVtbi13aWR0aCk7XG4gICAgfSBAZWxzZSB7XG4gICAgICAkd2lkdGg6IHBlcmNlbnRhZ2UoJHNwYW4tc3VtIC8gJGNvbnRleHQpO1xuICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgJHdpZHRoOiAkbjtcbiAgfVxuXG4gIEByZXR1cm4gJHdpZHRoO1xufVxuIiwiLy8gR3V0dGVyIFN5bnRheFxuLy8gPT09PT09PT09PT09PVxuXG5cbi8vIEd1dHRlcnNcbi8vIC0tLS0tLS1cbi8vIFNldCBndXR0ZXJzIG9uIGFuIGVsZW1lbnQuXG4vLyAtIFskc3Bhbl0gICA6IDxzZXR0aW5ncz5cbkBtaXhpbiBndXR0ZXJzKFxuICAkc3BhbjogJHN1c3lcbikge1xuICAkaW5zcGVjdCAgOiAkc3BhbjtcbiAgJHNwYW4gICAgIDogcGFyc2UtZ3V0dGVycygkc3Bhbik7XG4gICRfZ3V0dGVycyA6IGdldC1ndXR0ZXJzKCRzcGFuKTtcblxuICAkX291dHB1dDogKFxuICAgIGJlZm9yZTogbWFwLWdldCgkX2d1dHRlcnMsIGJlZm9yZSksXG4gICAgYWZ0ZXI6IG1hcC1nZXQoJF9ndXR0ZXJzLCBhZnRlciksXG4gICAgZmxvdzogc3VzeS1nZXQoZmxvdywgJHNwYW4pLFxuICApO1xuXG4gIEBpbmNsdWRlIHN1c3ktaW5zcGVjdChndXR0ZXJzLCAkaW5zcGVjdCk7XG5cbiAgQGlmIGlzLWluc2lkZSgkc3Bhbikge1xuICAgIEBpbmNsdWRlIHBhZGRpbmctb3V0cHV0KCRfb3V0cHV0Li4uKTtcbiAgfSBAZWxzZSB7XG4gICAgQGluY2x1ZGUgbWFyZ2luLW91dHB1dCgkX291dHB1dC4uLik7XG4gIH1cbn1cblxuQG1peGluIGd1dHRlcihcbiAgJHNwYW46ICRzdXN5XG4pIHtcbiAgQGluY2x1ZGUgZ3V0dGVycygkc3Bhbik7XG59XG5cblxuLy8gR3V0dGVyXG4vLyAtLS0tLS1cbi8vIFJldHVybiB0aGUgd2lkdGggb2YgYSBndXR0ZXIuXG4vLyAtIFskc3Bhbl0gICA6IDxzZXR0aW5ncz5cbkBmdW5jdGlvbiBndXR0ZXIoXG4gICRzcGFuOiAkc3VzeVxuKSB7XG4gICRzcGFuOiBwYXJzZS1ndXR0ZXJzKCRzcGFuKTtcblxuICAkX2d1dHRlcnM6IGdldC1ndXR0ZXJzKCRzcGFuKTtcbiAgJF9ndXR0ZXJzOiBtYXAtZ2V0KCRfZ3V0dGVycywgYmVmb3JlKSBvciBtYXAtZ2V0KCRfZ3V0dGVycywgYWZ0ZXIpO1xuXG4gIEByZXR1cm4gJF9ndXR0ZXJzO1xufVxuXG5AZnVuY3Rpb24gZ3V0dGVycyhcbiAgJHNwYW46ICRzdXN5XG4pIHtcbiAgQHJldHVybiBndXR0ZXIoJHNwYW4pO1xufVxuXG5cbi8vIEdldCBHdXR0ZXIgV2lkdGhcbi8vIC0tLS0tLS0tLS0tLS0tLS1cbi8vIFJldHVybiBndXR0ZXIgd2lkdGguXG4vLyAtIFskY29udGV4dF06IDxjb250ZXh0PlxuQGZ1bmN0aW9uIGdldC1ndXR0ZXItd2lkdGgoXG4gICRjb250ZXh0OiAkc3VzeVxuKSB7XG4gICRjb250ZXh0ICA6IHBhcnNlLWd1dHRlcnMoJGNvbnRleHQpO1xuXG4gICRfZ3V0dGVycyA6IHN1c3ktZ2V0KGd1dHRlcnMsICRjb250ZXh0KTtcbiAgJF9ndXR0ZXIgIDogc3VzeS1nZXQoZ3V0dGVyLW92ZXJyaWRlLCAkY29udGV4dCk7XG5cbiAgQGlmICRfZ3V0dGVycyBhbmQgKCRfZ3V0dGVycyA+IDApIGFuZCBub3QoJF9ndXR0ZXIpIHtcbiAgICAkX2NvbHVtbi13aWR0aDogc3VzeS1nZXQoY29sdW1uLXdpZHRoLCAkY29udGV4dCk7XG4gICAgJF9tYXRoOiBndXR0ZXItbWF0aCgkY29udGV4dCk7XG4gICAgQGlmICRfbWF0aCA9PSBzdGF0aWMge1xuICAgICAgJF9ndXR0ZXI6ICRfZ3V0dGVycyAqIHZhbGlkLWNvbHVtbi1tYXRoKCRfbWF0aCwgJF9jb2x1bW4td2lkdGgpO1xuICAgIH0gQGVsc2Uge1xuICAgICAgJF9jb2x1bW5zIDogc3VzeS1nZXQoY29sdW1ucywgJGNvbnRleHQpO1xuICAgICAgJF9zcHJlYWQgIDogaWYoaXMtc3BsaXQoJGNvbnRleHQpLCB3aWRlLCBzdXN5LWdldChzcHJlYWQsICRjb250ZXh0KSk7XG4gICAgICAkX2d1dHRlciAgOiBwZXJjZW50YWdlKCRfZ3V0dGVycyAvIHN1c3ktc3VtKCRfY29sdW1ucywgJF9ndXR0ZXJzLCAkX3NwcmVhZCkpO1xuICAgIH1cbiAgfVxuXG4gICRfZ3V0dGVyOiBpZigkX2d1dHRlciA9PSAnbm8tZ3V0dGVycycgb3IgJF9ndXR0ZXIgPT0gJ25vLWd1dHRlcicsIG51bGwsICRfZ3V0dGVyKTtcblxuICBAcmV0dXJuICRfZ3V0dGVyO1xufVxuXG5cbi8vIEdldCBHdXR0ZXJzXG4vLyAtLS0tLS0tLS0tLVxuLy8gUmV0dXJuIGJlZm9yZSBhbmQgYWZ0ZXIgZ3V0dGVyIHZhbHVlcy5cbi8vIC0gWyRjb250ZXh0XTogPGNvbnRleHQ+XG5AZnVuY3Rpb24gZ2V0LWd1dHRlcnMoXG4gICRjb250ZXh0OiAkc3VzeVxuKSB7XG4gICRjb250ZXh0ICAgICAgICAgICAgOiBwYXJzZS1ndXR0ZXJzKCRjb250ZXh0KTtcblxuICAkX2d1dHRlci1wb3NpdGlvbiAgIDogc3VzeS1nZXQoZ3V0dGVyLXBvc2l0aW9uLCAkY29udGV4dCk7XG4gICRfZ3V0dGVyICAgICAgICAgICAgOiBnZXQtZ3V0dGVyLXdpZHRoKCRjb250ZXh0KTtcblxuICAkX3JldHVybiAgICAgICAgICAgIDogKGJlZm9yZTogbnVsbCwgYWZ0ZXI6IG51bGwpO1xuXG4gIEBpZiBpcy1zcGxpdCgkY29udGV4dCkgYW5kICRfZ3V0dGVyIHtcbiAgICAkX2d1dHRlcjogJF9ndXR0ZXIgLyAyO1xuICAgICRfcmV0dXJuOiBtYXAtbWVyZ2UoJF9yZXR1cm4sIChiZWZvcmU6ICRfZ3V0dGVyLCBhZnRlcjogJF9ndXR0ZXIpKTtcbiAgfSBAZWxzZSB7XG4gICAgJF9yZXR1cm46IG1hcC1tZXJnZSgkX3JldHVybiwgKCRfZ3V0dGVyLXBvc2l0aW9uOiAkX2d1dHRlcikpO1xuICB9XG5cbiAgQHJldHVybiAkX3JldHVybjtcbn1cblxuXG4vLyBJcyBJbnNpZGVcbi8vIC0tLS0tLS0tLVxuLy8gUmV0dXJucyB0cnVlIGlmIGd1dHRlcnMgYXJlIGluc2lkZS5cbi8vICRjb250ZXh0OiA8Y29udGV4dD5cbkBmdW5jdGlvbiBpcy1pbnNpZGUoXG4gICRjb250ZXh0XG4pIHtcbiAgJF9pbnNpZGU6IGluc2lkZSBpbnNpZGUtc3RhdGljO1xuICAkX2d1dHRlci1wb3NpdGlvbjogc3VzeS1nZXQoZ3V0dGVyLXBvc2l0aW9uLCAkY29udGV4dCk7XG5cbiAgQHJldHVybiBpZihpbmRleCgkX2luc2lkZSwgJF9ndXR0ZXItcG9zaXRpb24pLCB0cnVlLCBmYWxzZSk7XG59XG5cblxuLy8gSXMgU3BsaXRcbi8vIC0tLS0tLS0tXG4vLyBSZXR1cm5zIHRydWUgaWYgZ3V0dGVycyBhcmUgc3BsaXQuXG4vLyAkY29udGV4dDogPGNvbnRleHQ+XG5AZnVuY3Rpb24gaXMtc3BsaXQoXG4gICRjb250ZXh0XG4pIHtcbiAgJF9zcGxpdDogc3BsaXQgaW5zaWRlIGluc2lkZS1zdGF0aWM7XG4gICRfZ3V0dGVyLXBvc2l0aW9uOiBzdXN5LWdldChndXR0ZXItcG9zaXRpb24sICRjb250ZXh0KTtcblxuICBAcmV0dXJuIGlmKGluZGV4KCRfc3BsaXQsICRfZ3V0dGVyLXBvc2l0aW9uKSwgdHJ1ZSwgZmFsc2UpO1xufVxuXG5cbi8vIEd1dHRlciBNYXRoXG4vLyAtLS0tLS0tLS0tLVxuLy8gUmV0dXJuIHRoZSBtYXRoIHRvIHVzZSBmb3IgZ3V0dGVyIGNhbGN1bGF0aW9uc1xuLy8gJGNvbnRleHQ6IDxjb250ZXh0PlxuQGZ1bmN0aW9uIGd1dHRlci1tYXRoKFxuICAkY29udGV4dDogJHN1c3lcbikge1xuICAkX3JldHVybiAgOiBzdXN5LWdldChtYXRoLCAkY29udGV4dCk7XG4gICRfcmV0dXJuICA6IGlmKHN1c3ktZ2V0KGd1dHRlci1wb3NpdGlvbiwgJGNvbnRleHQpID09IGluc2lkZS1zdGF0aWMsIHN0YXRpYywgJF9yZXR1cm4pO1xuXG4gIEByZXR1cm4gJF9yZXR1cm47XG59XG4iLCIvLyBJc29sYXRpb24gU3ludGF4XG4vLyA9PT09PT09PT09PT09PT09XG5cblxuLy8gSXNvbGF0ZSBbTWl4aW5dXG4vLyAtLS0tLS0tLS0tLS0tLS1cbi8vIFNldCBpc29sYXRpb24gYXMgYW4gb3ZlcnJpZGUuXG4vLyAtICRsb2NhdGlvbjogPHNwYW4+XG5AbWl4aW4gaXNvbGF0ZShcbiAgJGlzb2xhdGU6IDFcbikge1xuICAkaW5zcGVjdDogJGlzb2xhdGU7XG5cbiAgJG91dHB1dDogKFxuICAgIHB1c2g6IGlzb2xhdGUoJGlzb2xhdGUpLFxuICAgIGZsb3c6IHN1c3ktZ2V0KGZsb3csICRpc29sYXRlKSxcbiAgKTtcblxuICBAaW5jbHVkZSBzdXN5LWluc3BlY3QoaXNvbGF0ZSwgJGluc3BlY3QpO1xuICBAaW5jbHVkZSBpc29sYXRlLW91dHB1dCgkb3V0cHV0Li4uKTtcbn1cblxuXG4vLyBJc29sYXRlIFtmdW5jdGlvbl1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmV0dXJuIGFuIGlzb2xhdGlvbiBvZmZzZXQgd2lkdGguXG4vLyAtICRsb2NhdGlvbjogPHNwYW4+XG5AZnVuY3Rpb24gaXNvbGF0ZShcbiAgJGlzb2xhdGU6IDFcbikge1xuICAkaXNvbGF0ZTogcGFyc2Utc3BhbigkaXNvbGF0ZSk7XG4gICRpc29sYXRpb246IHN1c3ktZ2V0KHNwYW4sICRpc29sYXRlKTtcblxuICBAaWYgJGlzb2xhdGlvbiBhbmQgbm90KGdldC1sb2NhdGlvbigkaXNvbGF0ZSkpIHtcbiAgICAkbmV3OiAoXG4gICAgICBzcGFuOiBudWxsLFxuICAgICAgbG9jYXRpb246ICRpc29sYXRpb24sXG4gICAgKTtcbiAgICAkaXNvbGF0ZTogbWFwLW1lcmdlKCRpc29sYXRlLCAkbmV3KTtcbiAgfVxuXG4gIEByZXR1cm4gZ2V0LWlzb2xhdGlvbigkaXNvbGF0ZSk7XG59XG5cblxuLy8gR2V0IElzb2xhdGlvblxuLy8gLS0tLS0tLS0tLS0tLVxuLy8gUmV0dXJuIHRoZSBpc29sYXRpb24gb2Zmc2V0IHdpZHRoXG4vLyAtICRpbnB1dDogPG1hcD5cbkBmdW5jdGlvbiBnZXQtaXNvbGF0aW9uKFxuICAkaW5wdXRcbikge1xuICAkbG9jYXRpb24gICA6IGdldC1sb2NhdGlvbigkaW5wdXQpO1xuICAkY29sdW1ucyAgICA6IHN1c3ktZ2V0KGNvbHVtbnMsICRpbnB1dCk7XG4gICR3aWR0aCAgICAgIDogbnVsbDtcblxuICBAaWYgdHlwZS1vZigkbG9jYXRpb24pID09IG51bWJlciBhbmQgbm90KHVuaXRsZXNzKCRsb2NhdGlvbikpIHtcbiAgICAkd2lkdGg6ICRsb2NhdGlvbjtcbiAgfSBAZWxzZSBpZiAkbG9jYXRpb24ge1xuICAgICRwdXNoOiAkbG9jYXRpb24gLSAxO1xuICAgIEBpZiAkcHVzaCA+IDAge1xuICAgICAgJHB1c2g6IG1hcC1tZXJnZSgkaW5wdXQsIChcbiAgICAgICAgc3BhbjogJHB1c2gsXG4gICAgICAgIGxvY2F0aW9uOiAxLFxuICAgICAgICBzcHJlYWQ6IHdpZGUsXG4gICAgICApKTtcbiAgICAgICR3aWR0aDogZ2V0LXNwYW4td2lkdGgoJHB1c2gpO1xuICAgIH1cbiAgfVxuXG4gIEBpZiBzdXN5LWdldChndXR0ZXItcG9zaXRpb24sICRpbnB1dCkgPT0gc3BsaXRcbiAgICAgIGFuZCBzdXN5LWdldChndXR0ZXJzLCAkaW5wdXQpID4gMCB7XG4gICAgJHdpZHRoOiBpZigkd2lkdGggPT0gbnVsbCwgZ3V0dGVycygkaW5wdXQpLCAkd2lkdGggKyBndXR0ZXJzKCRpbnB1dCkpO1xuICB9XG5cbiAgQHJldHVybiAkd2lkdGggb3IgMDtcbn1cbiIsIi8vIEdhbGxlcnkgU3ludGF4XG4vLyA9PT09PT09PT09PT09PVxuXG4vLyBHYWxsZXJ5XG4vLyAtLS0tLS0tXG4vLyBDcmVhdGUgYW4gaXNvbGF0ZWQgZ2FsbGVyeVxuLy8gLSAkc3BhbiAgICAgICAgOiA8c3Bhbj5cbi8vIC0gWyRzZWxlY3Rvcl0gIDogY2hpbGQgfCBvZi10eXBlXG5AbWl4aW4gZ2FsbGVyeShcbiAgJHNwYW4sXG4gICRzZWxlY3RvcjogY2hpbGRcbikge1xuICAkaW5zcGVjdCAgICA6ICRzcGFuO1xuICAkc3BhbiAgICAgICA6IHBhcnNlLXNwYW4oJHNwYW4pO1xuICAkc3BhbiAgICAgICA6IG1hcC1tZXJnZSgkc3BhbiwgKGxvY2F0aW9uOiAxKSk7XG5cbiAgJG4gICAgICAgICAgICA6IHN1c3ktZ2V0KHNwYW4sICRzcGFuKTtcbiAgJGNvbHVtbnMgICAgICA6IHN1c3ktZ2V0KGNvbHVtbnMsICRzcGFuKTtcbiAgJGNvbnRleHQgICAgICA6IHN1c3ktY291bnQoJGNvbHVtbnMpO1xuICAkZmxvdyAgICAgICAgIDogc3VzeS1nZXQoZmxvdywgJHNwYW4pO1xuXG4gICRpbnNpZGUgICAgICAgOiBpcy1pbnNpZGUoJHNwYW4pO1xuICAkZnJvbSAgICAgICAgIDogZnJvbSgkZmxvdyk7XG4gICRsaW5lICAgICAgICAgOiBmbG9vcigkY29udGV4dCAvICRuKTtcbiAgJHN5bW1ldHJpY2FsICA6IGlzLXN5bW1ldHJpY2FsKCRjb2x1bW5zKTtcblxuICAkb3V0cHV0OiAoXG4gICAgd2lkdGggICAgICAgICAgICAgOiBudWxsLFxuICAgIGZsb2F0ICAgICAgICAgICAgIDogZnJvbSxcbiAgICBtYXJnaW4tYmVmb3JlICAgICA6IG51bGwsXG4gICAgbWFyZ2luLWFmdGVyICAgICAgOiBudWxsLFxuICAgIHBhZGRpbmctYmVmb3JlICAgIDogbnVsbCxcbiAgICBwYWRkaW5nLWFmdGVyICAgICA6IG51bGwsXG4gICAgZmxvdyAgICAgICAgICAgICAgOiAkZmxvdyxcbiAgKTtcblxuICBAaWYgJGluc2lkZSB7XG4gICAgJGd1dHRlcnM6IGdldC1ndXR0ZXJzKCRzcGFuKTtcbiAgICAkb3V0cHV0OiBtYXAtbWVyZ2UoJG91dHB1dCwgKFxuICAgICAgcGFkZGluZy1iZWZvcmU6IG1hcC1nZXQoJGd1dHRlcnMsIGJlZm9yZSksXG4gICAgICBwYWRkaW5nLWFmdGVyOiBtYXAtZ2V0KCRndXR0ZXJzLCBhZnRlciksXG4gICAgKSk7XG4gIH1cblxuICBAaWYgJHN5bW1ldHJpY2FsIHtcbiAgICAkb3V0cHV0OiBtYXAtbWVyZ2UoJG91dHB1dCwgKHdpZHRoOiBnZXQtc3Bhbi13aWR0aCgkc3BhbikpKTtcbiAgfVxuXG4gICRib3ggICAgICAgICAgOiBzdXN5LWdldChib3gtc2l6aW5nLCAkc3Bhbik7XG4gICRnbG9iYWwtYm94ICAgOiBpZihzdXN5LWdldChnbG9iYWwtYm94LXNpemluZykgPT0gJ2JvcmRlci1ib3gnLCB0cnVlLCBmYWxzZSk7XG5cbiAgQGluY2x1ZGUgc3VzeS1pbnNwZWN0KGdhbGxlcnksICRpbnNwZWN0KTtcblxuICAvLyBDb2xsZWN0aXZlIE91dHB1dFxuICBAaWYgJGJveCA9PSBib3JkZXItYm94IG9yICgkaW5zaWRlIGFuZCBub3QoJGJveCkgYW5kIG5vdCgkZ2xvYmFsLWJveCkpIHtcbiAgICBAaW5jbHVkZSBvdXRwdXQoKGJveC1zaXppbmc6IGJvcmRlci1ib3gpKTtcbiAgfSBAZWxzZSBpZiAkYm94ID09IGNvbnRlbnQtYm94IHtcbiAgICBAaW5jbHVkZSBvdXRwdXQoKGJveC1zaXppbmc6IGNvbnRlbnQtYm94KSk7XG4gIH1cblxuICBAaW5jbHVkZSBmbG9hdC1zcGFuLW91dHB1dCgkb3V0cHV0Li4uKTtcblxuICAvLyBJbmRpdmlkdWFsIExvb3BcbiAgQGZvciAkaXRlbSBmcm9tIDEgdGhyb3VnaCAkbGluZSB7XG4gICAgJG50aDogJyN7JGxpbmV9biArICN7JGl0ZW19JztcbiAgICAmOm50aC0jeyRzZWxlY3Rvcn0oI3skbnRofSkge1xuICAgICAgLy8gSW5kaXZpZHVhbCBQcmVwXG4gICAgICAkb3V0cHV0OiAoXG4gICAgICAgIHdpZHRoICAgICAgICAgICAgIDogaWYoJHN5bW1ldHJpY2FsLCBudWxsLCBnZXQtc3Bhbi13aWR0aCgkc3BhbikpLFxuICAgICAgICBmbG9hdCAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIG1hcmdpbi1iZWZvcmUgICAgIDogZ2V0LWlzb2xhdGlvbigkc3BhbiksXG4gICAgICAgIG1hcmdpbi1hZnRlciAgICAgIDogLTEwMCUsXG4gICAgICAgIHBhZGRpbmctYmVmb3JlICAgIDogbnVsbCxcbiAgICAgICAgcGFkZGluZy1hZnRlciAgICAgOiBudWxsLFxuICAgICAgICBmbG93ICAgICAgICAgICAgICA6ICRmbG93LFxuICAgICAgKTtcblxuICAgICAgLy8gSW5kaXZpZHVhbCBPdXRwdXRcbiAgICAgIEBpbmNsdWRlIGZsb2F0LXNwYW4tb3V0cHV0KCRvdXRwdXQuLi4pO1xuXG4gICAgICBAaWYgZ2V0LWVkZ2UoJHNwYW4pID09IGZpcnN0IHtcbiAgICAgICAgQGluY2x1ZGUgYnJlYWs7XG4gICAgICAgIEBpbmNsdWRlIGZpcnN0KCRzcGFuKTtcbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICBAaW5jbHVkZSBub2JyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBJbmRpdmlkdWFsIExvY2F0aW9uIEluY3JlbWVudFxuICAgICAgJGxvY2F0aW9uOiBnZXQtbG9jYXRpb24oJHNwYW4pICsgJG47XG4gICAgICAkbG9jYXRpb246IGlmKCRsb2NhdGlvbiA+ICRjb250ZXh0LCAxLCAkbG9jYXRpb24pO1xuICAgICAgJHNwYW46IG1hcC1tZXJnZSgkc3BhbiwgKGxvY2F0aW9uOiAkbG9jYXRpb24pKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIFJvdyBTdGFydCAmIEVuZFxuLy8gPT09PT09PT09PT09PT09XG5cbi8vIEJyZWFrXG4vLyAtLS0tLVxuLy8gQXBwbHkgdG8gYW55IGVsZW1lbnQgdGhhdCBzaG91bGQgZm9yY2UgYSBsaW5lIGJyZWFrLlxuQG1peGluIGJyZWFrIHtcbiAgQGluY2x1ZGUgb3V0cHV0KChjbGVhcjogYm90aCkpO1xufVxuXG5cbi8vIE5vQnJlYWtcbi8vIC0tLS0tLS1cbi8vIENhbmNlbCB0aGUgYnJlYWsoKSBlZmZlY3QsIGUuZy4gd2hlbiB1c2luZyBtZWRpYSBxdWVyaWVzLlxuQG1peGluIG5vYnJlYWsge1xuICBAaW5jbHVkZSBvdXRwdXQoKGNsZWFyOiBub25lKSk7XG59XG5cblxuLy8gRnVsbFxuLy8gLS0tLVxuLy8gLSBbJGNvbnRleHRdOiA8bGF5b3V0IHNob3J0aGFuZD5cbkBtaXhpbiBmdWxsKFxuICAkY29udGV4dDogJHN1c3lcbikge1xuICAkaW5zcGVjdCA6ICRjb250ZXh0O1xuICBAaW5jbHVkZSBzdXN5LWluc3BlY3QoZnVsbCwgJGluc3BlY3QpO1xuICBAaW5jbHVkZSBzcGFuKGZ1bGwgb2YgcGFyc2UtZ3JpZCgkY29udGV4dCkgYnJlYWspO1xufVxuXG5cbi8vIEZpcnN0XG4vLyAtLS0tLVxuLy8gLSBbJGNvbnRleHRdOiA8c2V0dGluZ3M+XG5AbWl4aW4gZmlyc3QoXG4gICRjb250ZXh0OiAkc3VzeVxuKSB7XG4gICRpbnNwZWN0ICA6ICRjb250ZXh0O1xuICAkY29udGV4dCAgOiBwYXJzZS1ncmlkKCRjb250ZXh0KTtcbiAgJGZsb3cgICAgIDogc3VzeS1nZXQoZmxvdywgJGNvbnRleHQpO1xuXG4gIEBpbmNsdWRlIHN1c3ktaW5zcGVjdChmaXJzdCwgJGluc3BlY3QpO1xuICBAaWYgbm90KGlzLXNwbGl0KCRjb250ZXh0KSkge1xuICAgIEBpbmNsdWRlIGZsb2F0LWZpcnN0KCRmbG93KTtcbiAgfVxufVxuXG5AbWl4aW4gYWxwaGEoXG4gICRjb250ZXh0OiAkc3VzeVxuKSB7XG4gIEBpbmNsdWRlIGZpcnN0KCRjb250ZXh0KTtcbn1cblxuXG4vLyBMYXN0XG4vLyAtLS0tXG4vLyAtIFskY29udGV4dF06IDxzZXR0aW5ncz5cbkBtaXhpbiBsYXN0KFxuICAkY29udGV4dDogJHN1c3lcbikge1xuICAkaW5zcGVjdCAgOiAkY29udGV4dDtcbiAgJGNvbnRleHQgIDogcGFyc2UtZ3JpZCgkY29udGV4dCk7XG5cbiAgQGluY2x1ZGUgc3VzeS1pbnNwZWN0KGxhc3QsICRpbnNwZWN0KTtcblxuICAkb3V0cHV0OiAoXG4gICAgZmxvdzogc3VzeS1nZXQoZmxvdywgJGNvbnRleHQpLFxuICAgIGxhc3QtZmxvdzogc3VzeS1nZXQobGFzdC1mbG93LCAkY29udGV4dCksXG4gICAgbWFyZ2luOiBpZihpcy1zcGxpdCgkY29udGV4dCksIG51bGwsIDApLFxuICApO1xuXG4gIEBpbmNsdWRlIGZsb2F0LWxhc3QoJG91dHB1dC4uLik7XG59XG5cbkBtaXhpbiBvbWVnYShcbiAgJGNvbnRleHQ6ICRzdXN5XG4pIHtcbiAgQGluY2x1ZGUgbGFzdCgkY29udGV4dCk7XG59XG5cblxuLy8gR2V0IEVkZ2Vcbi8vIC0tLS0tLS0tXG4vLyBDYWxjdWxhdGUgZWRnZSB2YWx1ZSBiYXNlZCBvbiBsb2NhdGlvbiwgaWYgcG9zc2libGVcbkBmdW5jdGlvbiBnZXQtZWRnZShcbiAgJHNwYW5cbikge1xuICAkc3BhbiAgICAgICA6IHBhcnNlLXNwYW4oJHNwYW4pO1xuICAkZWRnZSAgICAgICA6IHN1c3ktZ2V0KGVkZ2UsICRzcGFuKTtcblxuICBAaWYgbm90KCRlZGdlKSB7XG4gICAgJGNvdW50OiBzdXN5LWNvdW50KHN1c3ktZ2V0KGNvbHVtbnMsICRzcGFuKSk7XG4gICAgJGxvY2F0aW9uOiBzdXN5LWdldChsb2NhdGlvbiwgJHNwYW4pO1xuICAgICRuOiBzdXN5LWdldChzcGFuLCAkc3Bhbik7XG5cbiAgICAkbnVtYmVyOiBpZih0eXBlLW9mKCRsb2NhdGlvbikgPT0gbnVtYmVyLCB0cnVlLCBmYWxzZSk7XG4gICAgJGluZGV4OiBpZigkbnVtYmVyIGFuZCB1bml0bGVzcygkbG9jYXRpb24pLCB0cnVlLCBmYWxzZSk7XG5cbiAgICBAaWYgJG4gPT0gJGNvdW50IHtcbiAgICAgICRlZGdlOiBmdWxsO1xuICAgIH0gQGVsc2UgaWYgJGxvY2F0aW9uIGFuZCAkbiBhbmQgJGluZGV4IHtcbiAgICAgIEBpZiAkbG9jYXRpb24gPT0gMSB7XG4gICAgICAgICRlZGdlOiBpZigkbiA9PSAkY291bnQsIGZ1bGwsIGZpcnN0KTtcbiAgICAgIH0gQGVsc2UgaWYgJGxvY2F0aW9uICsgJG4gLSAxID09ICRjb3VudCB7XG4gICAgICAgICRlZGdlOiBsYXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBpZiAkZWRnZSA9PSBhbHBoYSBvciAkZWRnZSA9PSBvbWVnYSB7XG4gICAgJGVkZ2U6IGlmKCRlZGdlID09IGFscGhhLCBmaXJzdCwgbGFzdCk7XG4gIH1cblxuICBAcmV0dXJuICRlZGdlO1xufVxuXG5cbi8vIEdldCBMb2NhdGlvblxuLy8gLS0tLS0tLS0tLS0tXG4vLyBDYWxjdWxhdGUgbG9jYXRpb24gdmFsdWUgYmFzZWQgb24gZWRnZSwgaWYgcG9zc2libGVcbkBmdW5jdGlvbiBnZXQtbG9jYXRpb24oXG4gICRzcGFuXG4pIHtcbiAgJHNwYW4gICAgICAgOiBwYXJzZS1zcGFuKCRzcGFuKTtcbiAgJGxvY2F0aW9uICAgOiBzdXN5LWdldChsb2NhdGlvbiwgJHNwYW4pO1xuICAkZWRnZSAgICAgICA6IGdldC1lZGdlKCRzcGFuKTtcbiAgJG4gICAgICAgICAgOiBzdXN5LWdldChzcGFuLCAkc3Bhbik7XG5cbiAgQGlmICRlZGdlIGFuZCBub3QoJGxvY2F0aW9uKSBhbmQgdHlwZS1vZigkbikgPT0gbnVtYmVyIGFuZCB1bml0bGVzcygkbikge1xuICAgIEBpZiAkZWRnZSA9PSBmaXJzdCB7XG4gICAgICAkbG9jYXRpb246IDE7XG4gICAgfSBAZWxzZSBpZiAkZWRnZSA9PSBsYXN0IHtcbiAgICAgICRsb2NhdGlvbjogc3VzeS1jb3VudChzdXN5LWdldChjb2x1bW5zLCAkc3BhbikpIC0gJG4gKyAxO1xuICAgIH1cbiAgfVxuXG4gIEByZXR1cm4gJGxvY2F0aW9uXG59XG4iLCIvLyBNYXJnaW4gU3ludGF4XG4vLyA9PT09PT09PT09PT09XG5cbi8vIFByZVxuLy8gLS0tXG4vLyBBZGQgc3Bhbm5pbmctbWFyZ2lucyBiZWZvcmUgYW4gZWxlbWVudC5cbi8vIC0gJHNwYW4gIDogPHNwYW4+XG5AbWl4aW4gcHJlKFxuICAkc3BhblxuKSB7XG4gICRpbnNwZWN0OiAkc3BhbjtcbiAgJHNwYW4gICA6IG1hcC1tZXJnZSgoc3ByZWFkOiB3aWRlKSwgcGFyc2Utc3Bhbigkc3BhbikpO1xuICAkZmxvdyAgIDogc3VzeS1nZXQoZmxvdywgJHNwYW4pO1xuICAkc3BsaXQgIDogaWYoc3VzeS1nZXQoZ3V0dGVyLXBvc2l0aW9uLCAkc3BhbikgPT0gc3BsaXQsIHRydWUsIGZhbHNlKTtcbiAgJGd1dHRlciA6IGd1dHRlcigkc3Bhbik7XG4gICRzcGFuICAgOiBzcGFuKCRzcGFuKTtcbiAgJHdpZHRoICA6IGlmKCRzcGxpdCBhbmQgJGd1dHRlciwgJHNwYW4gKyAkZ3V0dGVyLCAkc3Bhbik7XG5cbiAgQGluY2x1ZGUgc3VzeS1pbnNwZWN0KHByZSwgJGluc3BlY3QpO1xuICBAaW5jbHVkZSBtYXJnaW4tb3V0cHV0KCR3aWR0aCwgbnVsbCwgJGZsb3cpO1xufVxuXG4vLyBQb3N0XG4vLyAtLS0tXG4vLyBBZGQgc3Bhbm5pbmctbWFyZ2lucyBhZnRlciBhbiBlbGVtZW50LlxuLy8gLSAkc3BhbiAgOiA8c3Bhbj5cbkBtaXhpbiBwb3N0KFxuICAkc3BhblxuKSB7XG4gICRpbnNwZWN0ICA6ICRzcGFuO1xuICAkc3BhbiAgICAgOiBtYXAtbWVyZ2UoKHNwcmVhZDogd2lkZSksIHBhcnNlLXNwYW4oJHNwYW4pKTtcbiAgJGZsb3cgICAgIDogc3VzeS1nZXQoZmxvdywgJHNwYW4pO1xuICAkc3BsaXQgICAgOiBpZihzdXN5LWdldChndXR0ZXItcG9zaXRpb24sICRzcGFuKSA9PSBzcGxpdCwgdHJ1ZSwgZmFsc2UpO1xuICAkd2lkdGggICAgOiBpZigkc3BsaXQsIHNwYW4oJHNwYW4pICsgZ3V0dGVyKCRzcGFuKSwgc3Bhbigkc3BhbikpO1xuXG4gIEBpbmNsdWRlIHN1c3ktaW5zcGVjdChwb3N0LCAkaW5zcGVjdCk7XG4gIEBpbmNsdWRlIG1hcmdpbi1vdXRwdXQobnVsbCwgJHdpZHRoLCAkZmxvdyk7XG59XG5cbi8vIFB1c2hcbi8vIC0tLS1cbi8vIFNpbXBsZSBzeW5vbnltbiBmb3IgcHJlLlxuLy8gLSAkc3BhbiAgOiA8c3Bhbj5cbkBtaXhpbiBwdXNoKFxuICAkc3BhblxuKSB7XG4gIEBpbmNsdWRlIHByZSgkc3Bhbik7XG59XG5cbi8vIFB1bGxcbi8vIC0tLS1cbi8vIEFkZCBuZWdhdGl2ZSBzcGFubmluZy1tYXJnaW5zIGJlZm9yZSBhbiBlbGVtZW50LlxuLy8gLSAkc3BhbiAgOiA8c3Bhbj5cbkBtaXhpbiBwdWxsKFxuICAkc3BhblxuKSB7XG4gICRpbnNwZWN0ICA6ICRzcGFuO1xuICAkc3BhbiAgICAgOiBtYXAtbWVyZ2UoKHNwcmVhZDogd2lkZSksIHBhcnNlLXNwYW4oJHNwYW4pKTtcbiAgJGZsb3cgICAgIDogc3VzeS1nZXQoZmxvdywgJHNwYW4pO1xuICAkc3BsaXQgICAgOiBpZihzdXN5LWdldChndXR0ZXItcG9zaXRpb24sICRzcGFuKSA9PSBzcGxpdCwgdHJ1ZSwgZmFsc2UpO1xuICAkd2lkdGggICAgOiBpZigkc3BsaXQsIDAgLSBzcGFuKCRzcGFuKSArIGd1dHRlcigkc3BhbiksIDAgLSBzcGFuKCRzcGFuKSk7XG5cbiAgQGluY2x1ZGUgc3VzeS1pbnNwZWN0KHB1bGwsICRpbnNwZWN0KTtcbiAgQGluY2x1ZGUgbWFyZ2luLW91dHB1dCgkd2lkdGgsIG51bGwsICRmbG93KTtcbn1cblxuLy8gU3F1aXNoXG4vLyAtLS0tLS1cbi8vIEFkZCBzcGFubmluZy1tYXJnaW5zIGJlZm9yZSBhbmQgYWZ0ZXIgYW4gZWxlbWVudC5cbi8vIC0gJHByZSAgICAgOiA8c3Bhbj5cbi8vIC0gWyRwb3N0XSAgOiA8c3Bhbj5cbkBtaXhpbiBzcXVpc2goXG4gICRwcmUsXG4gICRwb3N0OiBmYWxzZVxuKSB7XG4gICRpbnNwZWN0ICAgICAgOiAoJHByZSwgJHBvc3QpO1xuICAkcHJlICAgICAgICAgIDogbWFwLW1lcmdlKChzcHJlYWQ6IHdpZGUpLCBwYXJzZS1zcGFuKCRwcmUpKTtcblxuICBAaWYgJHBvc3Qge1xuICAgICRwb3N0OiBtYXAtbWVyZ2UoKHNwcmVhZDogd2lkZSksIHBhcnNlLXNwYW4oJHBvc3QpKTtcbiAgfSBAZWxzZSB7XG4gICAgJHNwYW46IHN1c3ktZ2V0KHNwYW4sICRwcmUpO1xuICAgIEBpZiBsZW5ndGgoJHNwYW4pID4gMSB7XG4gICAgICAkcHJlOiBtYXAtbWVyZ2UoJHByZSwgKHNwYW46IG50aCgkc3BhbiwgMSkpKTtcbiAgICAgICRwb3N0OiBtYXAtbWVyZ2UoJHByZSwgKHNwYW46IG50aCgkc3BhbiwgMikpKTtcbiAgICB9IEBlbHNlIHtcbiAgICAgICRwb3N0OiAkcHJlO1xuICAgIH1cbiAgfVxuXG4gIEBpbmNsdWRlIHN1c3ktaW5zcGVjdChzcXVpc2gsICRpbnNwZWN0KTtcbiAgQGluY2x1ZGUgcHJlKCRwcmUpO1xuICBAaW5jbHVkZSBwb3N0KCRwb3N0KTtcbn1cbiIsIi8vIFBhZGRpbmcgU3ludGF4XG4vLyA9PT09PT09PT09PT09PVxuXG4vLyBQcmVmaXhcbi8vIC0tLS0tLVxuLy8gQWRkIHNwYW5uaW5nLXBhZGRpbmcgYmVmb3JlIGFuIGVsZW1lbnQuXG4vLyAtICRzcGFuICA6IDxzcGFuPlxuQG1peGluIHByZWZpeChcbiAgJHNwYW5cbikge1xuICAkaW5zcGVjdCAgOiAkc3BhbjtcbiAgJHNwYW4gICAgIDogbWFwLW1lcmdlKChzcHJlYWQ6IHdpZGUpLCBwYXJzZS1zcGFuKCRzcGFuKSk7XG4gICRmbG93ICAgICA6IHN1c3ktZ2V0KGZsb3csICRzcGFuKTtcbiAgJHdpZHRoICAgIDogc3Bhbigkc3Bhbik7XG5cbiAgQGlmIGlzLWluc2lkZSgkc3Bhbikge1xuICAgICRndXR0ZXI6IGd1dHRlcigkc3Bhbik7XG4gICAgJHdpZHRoOiBpZigkZ3V0dGVyIGFuZCBjb21wYXJhYmxlKCR3aWR0aCwgJGd1dHRlciksICR3aWR0aCArICRndXR0ZXIsICR3aWR0aCk7XG4gIH1cblxuICBAaW5jbHVkZSBzdXN5LWluc3BlY3QocHJlZml4LCAkaW5zcGVjdCk7XG4gIEBpbmNsdWRlIHBhZGRpbmctb3V0cHV0KCR3aWR0aCwgbnVsbCwgJGZsb3cpO1xufVxuXG4vLyBTdWZmaXhcbi8vIC0tLS0tLVxuLy8gQWRkIHNwYW5uaW5nLXBhZGRpbmcgYWZ0ZXIgYW4gZWxlbWVudC5cbi8vIC0gJHNwYW4gIDogPHNwYW4+XG5AbWl4aW4gc3VmZml4KFxuICAkc3BhblxuKSB7XG4gICRpbnNwZWN0ICA6ICRzcGFuO1xuICAkc3BhbiAgICAgOiBtYXAtbWVyZ2UoKHNwcmVhZDogd2lkZSksIHBhcnNlLXNwYW4oJHNwYW4pKTtcbiAgJGZsb3cgICAgIDogc3VzeS1nZXQoZmxvdywgJHNwYW4pO1xuICAkd2lkdGggICAgOiBzcGFuKCRzcGFuKTtcblxuICBAaWYgaXMtaW5zaWRlKCRzcGFuKSB7XG4gICAgJGd1dHRlcjogZ3V0dGVyKCRzcGFuKTtcbiAgICAkd2lkdGg6IGlmKCRndXR0ZXIgYW5kIGNvbXBhcmFibGUoJHdpZHRoLCAkZ3V0dGVyKSwgJHdpZHRoICsgJGd1dHRlciwgJHdpZHRoKTtcbiAgfVxuXG4gIEBpbmNsdWRlIHN1c3ktaW5zcGVjdChzdWZmaXgsICRpbnNwZWN0KTtcbiAgQGluY2x1ZGUgcGFkZGluZy1vdXRwdXQobnVsbCwgJHdpZHRoLCAkZmxvdyk7XG59XG5cbi8vIFBhZFxuLy8gLS0tXG4vLyBBZGQgc3Bhbm5pbmctcGFkZGluZyBiZWZvcmUgYW5kIGFmdGVyIGFuIGVsZW1lbnQuXG4vLyAtICRwcmUgICAgIDogPHNwYW4+XG4vLyAtIFskcG9zdF0gIDogPHNwYW4+XG5AbWl4aW4gcGFkKFxuICAkcHJlLFxuICAkcG9zdDogZmFsc2Vcbikge1xuICAkaW5zcGVjdCAgOiAoJHByZSwgJHBvc3QpO1xuICAkcHJlICAgICAgOiBtYXAtbWVyZ2UoKHNwcmVhZDogd2lkZSksIHBhcnNlLXNwYW4oJHByZSkpO1xuXG4gIEBpZiAkcG9zdCB7XG4gICAgJHBvc3Q6IG1hcC1tZXJnZSgoc3ByZWFkOiB3aWRlKSwgcGFyc2Utc3BhbigkcG9zdCkpO1xuICB9IEBlbHNlIHtcbiAgICAkc3Bhbjogc3VzeS1nZXQoc3BhbiwgJHByZSk7XG4gICAgQGlmIGxlbmd0aCgkc3BhbikgPiAxIHtcbiAgICAgICRwcmU6IG1hcC1tZXJnZSgkcHJlLCAoc3BhbjogbnRoKCRzcGFuLCAxKSkpO1xuICAgICAgJHBvc3Q6IG1hcC1tZXJnZSgkcHJlLCAoc3BhbjogbnRoKCRzcGFuLCAyKSkpO1xuICAgIH0gQGVsc2Uge1xuICAgICAgJHBvc3Q6ICRwcmU7XG4gICAgfVxuICB9XG5cbiAgQGluY2x1ZGUgc3VzeS1pbnNwZWN0KHBhZCwgJGluc3BlY3QpO1xuICBAaW5jbHVkZSBwcmVmaXgoJHByZSk7XG4gIEBpbmNsdWRlIHN1ZmZpeCgkcG9zdCk7XG5cbn1cbiIsIi8vIEJsZWVkIFN5bnRheFxuLy8gPT09PT09PT09PT09XG5cbi8vIEJsZWVkXG4vLyAtLS0tLVxuLy8gQWRkIG5lZ2F0aXZlIG1hcmdpbnMsIGFuZCBlcXVhbCBwb3NpdGl2ZSBwYWRkaW5nIHRvIGNyZWF0ZSBibGVlZC5cbi8vIC0gJGJsZWVkICA6IDxzcGFuPlxuQG1peGluIGJsZWVkKFxuICAkYmxlZWQ6IDAgZ3V0dGVyKClcbikge1xuICAkaW5zcGVjdCAgOiAkYmxlZWQ7XG4gICRvdXRwdXQgICA6IGdldC1ibGVlZCgkYmxlZWQpO1xuXG4gIEBpZiBzdXN5LWdldChnbG9iYWwtYm94LXNpemluZykgIT0gY29udGVudC1ib3gge1xuICAgICRvdXRwdXQ6IG1hcC1tZXJnZSgoYm94LXNpemluZzogY29udGVudC1ib3gpLCAkb3V0cHV0KTtcbiAgfVxuXG4gIEBpbmNsdWRlIHN1c3ktaW5zcGVjdChibGVlZCwgJGluc3BlY3QpO1xuICBAaW5jbHVkZSBvdXRwdXQoJG91dHB1dCk7XG59XG5cblxuLy8gQmxlZWQteFxuLy8gLS0tLS0tLVxuLy8gU2hvcnRjdXQgZm9yIGhvcml6b250YWwgYmxlZWQuXG4vLyAtICRibGVlZCAgOiA8c3Bhbj5cbkBtaXhpbiBibGVlZC14KFxuICAkYmxlZWQ6IGd1dHRlcigpXG4pIHtcbiAgJGJsZWVkICA6IHBhcnNlLXNwYW4oJGJsZWVkKTtcbiAgJHRyYmwgICA6IHN1c3ktZ2V0KHNwYW4sICRibGVlZCk7XG5cbiAgQGlmIGxlbmd0aCgkdHJibCkgPT0gMSB7XG4gICAgJGJsZWVkOiBtYXAtbWVyZ2UoJGJsZWVkLCAoc3BhbjogMCBudGgoJHRyYmwsIDEpKSk7XG4gIH0gQGVsc2UgaWYgbGVuZ3RoKCR0cmJsKSA9PSAyIHtcbiAgICAkYmxlZWQ6IG1hcC1tZXJnZSgkYmxlZWQsIChzcGFuOiAwIG50aCgkdHJibCwgMikgMCBudGgoJHRyYmwsIDEpKSk7XG4gIH0gQGVsc2Uge1xuICAgIEB3YXJuICdibGVlZC14IG9ubHkgdGFrZXMgMiBsZW5ndGhzLCBidXQgI3tsZW5ndGgoJHRyYmwpfSB3ZXJlIHBhc3NlZC4nO1xuICB9XG5cbiAgQGluY2x1ZGUgYmxlZWQoJGJsZWVkKTtcbn1cblxuXG4vLyBCbGVlZC15XG4vLyAtLS0tLS0tXG4vLyBTaG9ydGN1dCBmb3IgdmVydGljYWwgYmxlZWQuXG4vLyAtICRibGVlZCAgOiA8c3Bhbj5cbkBtaXhpbiBibGVlZC15KFxuICAkYmxlZWQ6IGlmKGZ1bmN0aW9uLWV4aXN0cyhyaHl0aG0pLCByaHl0aG0oMSksIDFlbSlcbikge1xuICAkYmxlZWQgIDogcGFyc2Utc3BhbigkYmxlZWQpO1xuICAkdHJibCAgIDogc3VzeS1nZXQoc3BhbiwgJGJsZWVkKTtcblxuICBAaWYgbGVuZ3RoKCR0cmJsKSA9PSAxIHtcbiAgICAkYmxlZWQ6IG1hcC1tZXJnZSgkYmxlZWQsIChzcGFuOiBudGgoJHRyYmwsIDEpIDApKTtcbiAgfSBAZWxzZSBpZiBsZW5ndGgoJHRyYmwpID09IDIge1xuICAgICRibGVlZDogbWFwLW1lcmdlKCRibGVlZCwgKHNwYW46IG50aCgkdHJibCwgMSkgMCBudGgoJHRyYmwsIDIpIDApKTtcbiAgfSBAZWxzZSB7XG4gICAgQHdhcm4gJ2JsZWVkLXkgb25seSB0YWtlcyAyIGxlbmd0aHMsIGJ1dCAje2xlbmd0aCgkdHJibCl9IHdlcmUgcGFzc2VkLic7XG4gIH1cblxuICBAaW5jbHVkZSBibGVlZCgkYmxlZWQpO1xufVxuXG5cbi8vIEdldCBCbGVlZFxuLy8gLS0tLS0tLS0tXG4vLyBSZXR1cm4gYmxlZWQgb3V0cHV0IHZhbHVlc1xuLy8gLSAkYmxlZWQ6IDxzcGFuPlxuQGZ1bmN0aW9uIGdldC1ibGVlZChcbiAgJGJsZWVkXG4pIHtcbiAgJGJsZWVkICAgIDogbWFwLW1lcmdlKChzcHJlYWQ6IHdpZGUpLCBwYXJzZS1zcGFuKCRibGVlZCkpO1xuICAkdHJibCAgICAgOiBzdXN5LWdldChzcGFuLCAkYmxlZWQpO1xuICAkc2hvcnQgICAgOiBudWxsO1xuICAkb3V0cHV0ICAgOiAoKTtcblxuICBAZm9yICRpIGZyb20gMSB0aHJvdWdoIGxlbmd0aCgkdHJibCkge1xuICAgICR0aGlzOiBudGgoJHRyYmwsICRpKTtcbiAgICAkbmV3OiAoKTtcbiAgICAkbWFyZ2luOiBudWxsO1xuICAgICRwYWRkaW5nOiBudWxsO1xuICAgICRwYWRkaW5nLXg6IG51bGw7XG5cbiAgICBAaWYgJHRoaXMgPiAwIHtcbiAgICAgICR0aGlzOiBtYXAtbWVyZ2UoJGJsZWVkLCAoc3BhbjogJHRoaXMpKTtcbiAgICAgICRtYXJnaW46IHNwYW4oJHRoaXMpO1xuICAgICAgJHBhZGRpbmc6ICRtYXJnaW47XG4gICAgICAkcGFkZGluZy14OiAkcGFkZGluZztcbiAgICB9XG5cbiAgICBAaWYgJG1hcmdpbiBhbmQgJG1hcmdpbiA+IDAge1xuICAgICAgJG1hcmdpbjogLSAkbWFyZ2luO1xuXG4gICAgICBAaWYgaXMtaW5zaWRlKCR0aGlzKSB7XG4gICAgICAgICRndXR0ZXI6IGd1dHRlcigkdGhpcyk7XG4gICAgICAgICRqb2luOiBpZigkZ3V0dGVyIGFuZCBjb21wYXJhYmxlKCRwYWRkaW5nLCAkZ3V0dGVyKSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAkcGFkZGluZy14OiBpZigkam9pbiBhbmQgJHBhZGRpbmcgPiAwLCAkcGFkZGluZyArICRndXR0ZXIsICRwYWRkaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBAaWYgJGkgPT0gMSB7XG4gICAgICAkbmV3OiAoXG4gICAgICAgIG1hcmdpbi10b3A6ICRtYXJnaW4sXG4gICAgICAgIHBhZGRpbmctdG9wOiAkcGFkZGluZyxcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAkbWFyZ2luLFxuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAkcGFkZGluZy14LFxuICAgICAgICBtYXJnaW4tYm90dG9tOiAkbWFyZ2luLFxuICAgICAgICBwYWRkaW5nLWJvdHRvbTogJHBhZGRpbmcsXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAkbWFyZ2luLFxuICAgICAgICBwYWRkaW5nLWxlZnQ6ICRwYWRkaW5nLXgsXG4gICAgICApO1xuICAgIH0gQGVsc2UgaWYgJGkgPT0gMiB7XG4gICAgICAkbmV3OiAoXG4gICAgICAgIG1hcmdpbi1yaWdodDogJG1hcmdpbixcbiAgICAgICAgcGFkZGluZy1yaWdodDogJHBhZGRpbmcteCxcbiAgICAgICAgbWFyZ2luLWxlZnQ6ICRtYXJnaW4sXG4gICAgICAgIHBhZGRpbmctbGVmdDogJHBhZGRpbmcteCxcbiAgICAgICk7XG4gICAgfSBAZWxzZSBpZiAkaSA9PSAzIHtcbiAgICAgICRuZXc6IChcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogJG1hcmdpbixcbiAgICAgICAgcGFkZGluZy1ib3R0b206ICRwYWRkaW5nLFxuICAgICAgKTtcbiAgICB9IEBlbHNlIGlmICRpID09IDQge1xuICAgICAgJG5ldzogKFxuICAgICAgICBtYXJnaW4tbGVmdDogJG1hcmdpbixcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAkcGFkZGluZy14LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAkb3V0cHV0OiBtYXAtbWVyZ2UoJG91dHB1dCwgJG5ldyk7XG4gIH1cblxuICBAZWFjaCAkcHJvcCwgJHZhbHVlIGluICRvdXRwdXQge1xuICAgICRvdXRwdXQ6IGlmKCR2YWx1ZSA9PSAwLCBtYXAtbWVyZ2UoJG91dHB1dCwgKCRwcm9wOiBudWxsKSksICRvdXRwdXQpO1xuICB9XG5cbiAgQHJldHVybiBibGVlZC1zaG9ydGhhbmQoJG91dHB1dCk7XG59XG5cbi8vIEJsZWVkIFNob3J0aGFuZFxuLy8gLS0tLS0tLS0tLS0tLS0tXG4vLyBDb252ZXJ0IGJsZWVkIG91dHB1dCBpbnRvIHNob3J0aGFuZCB3aGVuIHBvc3NpYmxlLlxuLy8gLSAkYmxlZWQ6IDxvdXRwdXQgbWFwPlxuQGZ1bmN0aW9uIGJsZWVkLXNob3J0aGFuZChcbiAgJGJsZWVkXG4pIHtcbiAgJG1hcmdpbjogKCk7XG4gICRwYWRkaW5nOiAoKTtcbiAgJHJldHVybjogKCk7XG5cbiAgQGVhY2ggJGtleSwgJHZhbHVlIGluICRibGVlZCB7XG4gICAgQGlmIHN0ci1pbmRleCgka2V5LCBtYXJnaW4pIHtcbiAgICAgICRtYXJnaW46IG1hcC1tZXJnZSgkbWFyZ2luLCAoJGtleTogJHZhbHVlKSk7XG4gICAgfSBAZWxzZSBpZiBzdHItaW5kZXgoJGtleSwgcGFkZGluZykgPiAwIHtcbiAgICAgICRwYWRkaW5nOiBtYXAtbWVyZ2UoJHBhZGRpbmcsICgka2V5OiAkdmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICAkcHJvcHM6IChcbiAgICBtYXJnaW46ICRtYXJnaW4sXG4gICAgcGFkZGluZzogJHBhZGRpbmcsXG4gICk7XG5cbiAgQGVhY2ggJG5hbWUsICRtYXAgaW4gJHByb3BzIHtcbiAgICAkZm91cjogaWYobGVuZ3RoKG1hcC1rZXlzKCRtYXApKSA9PSA0LCB0cnVlLCBmYWxzZSk7XG4gICAgJG51bGw6IGlmKGluZGV4KG1hcC12YWx1ZXMoJG1hcCksIG51bGwpLCB0cnVlLCBmYWxzZSk7XG5cbiAgICBAaWYgJGZvdXIgYW5kIG5vdCgkbnVsbCkge1xuICAgICAgJHRvcDogbWFwLWdldCgkbWFwLCAnI3skbmFtZX0tdG9wJyk7XG4gICAgICAkcmlnaHQ6IG1hcC1nZXQoJG1hcCwgJyN7JG5hbWV9LXJpZ2h0Jyk7XG4gICAgICAkYm90dG9tOiBtYXAtZ2V0KCRtYXAsICcjeyRuYW1lfS1ib3R0b20nKTtcbiAgICAgICRsZWZ0OiBtYXAtZ2V0KCRtYXAsICcjeyRuYW1lfS1sZWZ0Jyk7XG5cbiAgICAgICR0YjogaWYoJHRvcCA9PSAkYm90dG9tLCAkdG9wLCBudWxsKTtcbiAgICAgICRybDogaWYoJHJpZ2h0ID09ICRsZWZ0LCAkcmlnaHQsIG51bGwpO1xuICAgICAgJGFsbDogaWYoJHRiID09ICRybCwgJHRiLCBudWxsKTtcblxuICAgICAgJG5ldzogaWYoJGFsbCwgJGFsbCwgbnVsbCk7XG5cbiAgICAgIEBpZiBub3QoJG5ldykge1xuICAgICAgICBAaWYgJHRiIGFuZCAkcmwge1xuICAgICAgICAgICRuZXc6ICR0YiAkcmw7XG4gICAgICAgIH0gQGVsc2UgaWYgJHJsIHtcbiAgICAgICAgICAkbmV3OiAkdG9wICRybCAkYm90dG9tO1xuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAkbmV3OiAkdG9wICRyaWdodCAkYm90dG9tICRsZWZ0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICRyZXR1cm46IG1hcC1tZXJnZSgkcmV0dXJuLCAoJG5hbWU6ICRuZXcpKTtcbiAgICB9IEBlbHNlIHtcbiAgICAgICRyZXR1cm46IG1hcC1tZXJnZSgkcmV0dXJuLCAkbWFwKTtcbiAgICB9XG4gIH1cblxuICBAcmV0dXJuICRyZXR1cm47XG59XG4iLCIvLyBCcmVha3BvaW50IEludGVncmF0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09XG5cbiRzdXN5LW1lZGlhOiAoKSAhZGVmYXVsdDtcbiRzdXN5LW1lZGlhLWZhbGxiYWNrOiBmYWxzZSAhZGVmYXVsdDtcblxuJF9zdXN5LW1lZGlhLWNvbnRleHQ6ICgpO1xuXG5cbi8vIFN1c3kgQnJlYWtwb2ludFxuLy8gLS0tLS0tLS0tLS0tLS0tXG4vLyBDaGFuZ2UgZ3JpZHMgYXQgZGlmZmVyZW50IG1lZGlhIHF1ZXJ5IGJyZWFrcG9pbnRzLlxuLy8gLSAkcXVlcnkgICAgIDogPG1pbi13aWR0aD4gWzxtYXgtd2lkdGg+XSB8IDxwcm9wZXJ0eT4gPHZhbHVlPiB8IDxtYXA+XG4vLyAtICRsYXlvdXQgICAgOiA8c2V0dGluZ3M+XG4vLyAtICRuby1xdWVyeSAgOiA8Ym9vbGVhbj4gfCA8c2VsZWN0b3I+XG5AbWl4aW4gc3VzeS1icmVha3BvaW50KFxuICAkcXVlcnksXG4gICRsYXlvdXQ6IGZhbHNlLFxuICAkbm8tcXVlcnk6ICRzdXN5LW1lZGlhLWZhbGxiYWNrXG4pIHtcbiAgQGluY2x1ZGUgc3VzeS1tZWRpYS1yb3V0ZXIoJHF1ZXJ5LCAkbm8tcXVlcnkpIHtcbiAgICBAaWYgJGxheW91dCB7XG4gICAgICBAaW5jbHVkZSB3aXRoLWxheW91dCgkbGF5b3V0KSB7XG4gICAgICAgIEBjb250ZW50O1xuICAgICAgfVxuICAgIH0gQGVsc2Uge1xuICAgICAgQGNvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5cblxuLy8gU3VzeSBNZWRpYVxuLy8gLS0tLS0tLS0tLVxuLy8gLSAkcXVlcnk6IDxtaW4td2lkdGg+IFs8bWF4LXdpZHRoPl0gfCA8cHJvcGVydHk+IDx2YWx1ZT5cbi8vIC0gJG5vLXF1ZXJ5OiA8Ym9vbGVhbj4gfCA8c2VsZWN0b3I+XG5AbWl4aW4gc3VzeS1tZWRpYShcbiAgJHF1ZXJ5LFxuICAkbm8tcXVlcnk6ICRzdXN5LW1lZGlhLWZhbGxiYWNrXG4pIHtcbiAgJG9sZC1jb250ZXh0OiAkX3N1c3ktbWVkaWEtY29udGV4dDtcbiAgJG5hbWU6IGlmKG1hcC1oYXMta2V5KCRzdXN5LW1lZGlhLCAkcXVlcnkpLCAkcXVlcnksIG51bGwpO1xuICAkcXVlcnk6IHN1c3ktZ2V0LW1lZGlhKCRxdWVyeSk7XG4gICRxdWVyeTogc3VzeS1wYXJzZS1tZWRpYSgkcXVlcnkpO1xuXG4gIEBpbmNsdWRlIHN1c3ktbWVkaWEtY29udGV4dCgkcXVlcnksICRuYW1lKTtcblxuICBAaWYgJG5vLXF1ZXJ5IGFuZCB0eXBlLW9mKCRuby1xdWVyeSkgIT0gc3RyaW5nIHtcbiAgICBAY29udGVudDtcbiAgfSBAZWxzZSB7XG4gICAgQG1lZGlhICN7c3VzeS1yZW5kZXItbWVkaWEoJHF1ZXJ5KX0ge1xuICAgICAgQGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgQGlmIHR5cGUtb2YoJG5vLXF1ZXJ5KSA9PSBzdHJpbmcge1xuICAgICAgI3skbm8tcXVlcnl9ICYge1xuICAgICAgICBAY29udGVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAaW5jbHVkZSBzdXN5LW1lZGlhLWNvbnRleHQoJG9sZC1jb250ZXh0LCAkY2xlYW46IHRydWUpO1xufVxuXG5cbi8vIE1lZGlhIFJvdXRlclxuLy8gLS0tLS0tLS0tLS0tXG4vLyBSb3V0IG1lZGlhIGFyZ3VtZW50cyB0byB0aGUgY29ycmVjdCBtaXhpbi5cbkBtaXhpbiBzdXN5LW1lZGlhLXJvdXRlcihcbiAgJHF1ZXJ5LFxuICAkbm8tcXVlcnk6ICRzdXN5LW1lZGlhLWZhbGxiYWNrXG4pIHtcbiAgQGlmIHN1c3ktc3VwcG9ydChicmVha3BvaW50LCAobWl4aW46IGJyZWFrcG9pbnQpLCAkd2FybjogZmFsc2UpIHtcbiAgICBAaW5jbHVkZSBicmVha3BvaW50KCRxdWVyeSwgJG5vLXF1ZXJ5KSB7XG4gICAgICBAY29udGVudDtcbiAgICB9XG4gIH0gQGVsc2Uge1xuICAgIEBpbmNsdWRlIHN1c3ktbWVkaWEoJHF1ZXJ5LCAkbm8tcXVlcnkpIHtcbiAgICAgIEBjb250ZW50O1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIFVwZGF0ZSBDb250ZXh0XG4vLyAtLS0tLS0tLS0tLS0tXG4vLyBTZXQgdGhlIG5ldyBtZWRpYSBjb250ZXh0XG5AbWl4aW4gc3VzeS1tZWRpYS1jb250ZXh0KFxuICAkcXVlcnksXG4gICRuYW1lOiBudWxsLFxuICAkY2xlYW46IGZhbHNlXG4pIHtcbiAgJHF1ZXJ5OiBtYXAtbWVyZ2UoKG5hbWU6ICRuYW1lKSwgJHF1ZXJ5KTtcblxuICBAaWYgJGNsZWFuIHtcbiAgICAkX3N1c3ktbWVkaWEtY29udGV4dDogJHF1ZXJ5ICFnbG9iYWw7XG4gIH0gQGVsc2Uge1xuICAgICRfc3VzeS1tZWRpYS1jb250ZXh0OiBtYXAtbWVyZ2UoJF9zdXN5LW1lZGlhLWNvbnRleHQsICRxdWVyeSkgIWdsb2JhbDtcbiAgfVxufVxuXG5cbi8vIE1lZGlhIENvbnRleHRcbi8vIC0tLS0tLS0tLS0tLS1cbi8vIFJldHVybiB0aGUgZnVsbCBtZWRpYSBjb250ZXh0LCBvciBhIHNpbmdsZSBtZWRpYSBwcm9wZXJ0eSAoZS5nLiBtaW4td2lkdGgpXG5AZnVuY3Rpb24gc3VzeS1tZWRpYS1jb250ZXh0KFxuICAkcHJvcGVydHk6IGZhbHNlXG4pIHtcbiAgQGlmICRwcm9wZXJ0eSB7XG4gICAgQHJldHVybiBtYXAtZ2V0KCRfc3VzeS1tZWRpYS1jb250ZXh0LCAkcHJvcGVydHkpO1xuICB9IEBlbHNlIHtcbiAgICBAcmV0dXJuICRfc3VzeS1tZWRpYS1jb250ZXh0O1xuICB9XG59XG5cblxuLy8gR2V0IE1lZGlhXG4vLyAtLS0tLS0tLS1cbi8vIFJldHVybiBhIG5hbWVkIG1lZGlhLXF1ZXJ5IGZyb20gJHN1c3ktbWVkaWEuXG4vLyAtICRuYW1lOiA8a2V5PlxuQGZ1bmN0aW9uIHN1c3ktZ2V0LW1lZGlhKFxuICAkbmFtZVxuKSB7XG4gIEBpZiBtYXAtaGFzLWtleSgkc3VzeS1tZWRpYSwgJG5hbWUpIHtcbiAgICAkbWFwLXZhbHVlOiBtYXAtZ2V0KCRzdXN5LW1lZGlhLCAkbmFtZSk7XG4gICAgQGlmICgkbmFtZSA9PSAkbWFwLXZhbHVlKSB7XG4gICAgICAkbmFtZTogJG1hcC12YWx1ZTtcbiAgICB9IEBlbHNlIHtcbiAgICAgICRuYW1lOiBzdXN5LWdldC1tZWRpYSgkbWFwLXZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBAcmV0dXJuICRuYW1lO1xufVxuXG5cbi8vIFJlbmRlciBNZWRpYVxuLy8gLS0tLS0tLS0tLS0tXG4vLyBCdWlsZCBhIG1lZGlhLXF1ZXJ5IHN0cmluZyBmcm9tIHZhcmlvdXMgbWVkaWEgc2V0dGluZ3NcbkBmdW5jdGlvbiBzdXN5LXJlbmRlci1tZWRpYShcbiAgJHF1ZXJ5XG4pIHtcbiAgJG91dHB1dDogbnVsbDtcbiAgQGVhY2ggJHByb3BlcnR5LCAkdmFsdWUgaW4gJHF1ZXJ5IHtcbiAgICAkc3RyaW5nOiBudWxsO1xuXG4gICAgQGlmICRwcm9wZXJ0eSA9PSBtZWRpYSB7XG4gICAgICAkc3RyaW5nOiAkdmFsdWU7XG4gICAgfSBAZWxzZSB7XG4gICAgICAkc3RyaW5nOiAnKCN7JHByb3BlcnR5fTogI3skdmFsdWV9KSc7XG4gICAgfVxuXG4gICAgJG91dHB1dDogaWYoJG91dHB1dCwgJyN7JG91dHB1dH0gYW5kICN7JHN0cmluZ30nLCAkc3RyaW5nKTtcbiAgfVxuXG4gIEByZXR1cm4gJG91dHB1dDtcbn1cblxuXG4vLyBQYXJzZSBNZWRpYVxuLy8gLS0tLS0tLS0tLS1cbi8vIFJldHVybiBwYXJzZWQgbWVkaWEtcXVlcnkgc2V0dGluZ3MgYmFzZWQgb24gc2hvcnRoYW5kXG5AZnVuY3Rpb24gc3VzeS1wYXJzZS1tZWRpYShcbiAgJHF1ZXJ5XG4pIHtcbiAgJG1xOiBudWxsO1xuICBAaWYgdHlwZS1vZigkcXVlcnkpID09IG1hcCB7XG4gICAgJG1xOiAkcXVlcnk7XG4gIH0gQGVsc2UgaWYgdHlwZS1vZigkcXVlcnkpID09IG51bWJlciB7XG4gICAgJG1xOiAobWluLXdpZHRoOiAkcXVlcnkpO1xuICB9IEBlbHNlIGlmIHR5cGUtb2YoJHF1ZXJ5KSA9PSBsaXN0IGFuZCBsZW5ndGgoJHF1ZXJ5KSA9PSAyIHtcbiAgICBAaWYgdHlwZS1vZihudGgoJHF1ZXJ5LCAxKSkgPT0gbnVtYmVyIHtcbiAgICAgICRtcTogKFxuICAgICAgICBtaW4td2lkdGg6IG1pbigkcXVlcnkuLi4pLFxuICAgICAgICBtYXgtd2lkdGg6IG1heCgkcXVlcnkuLi4pLFxuICAgICAgKTtcbiAgICB9IEBlbHNlIHtcbiAgICAgICRtcTogKG50aCgkcXVlcnksIDEpOiBudGgoJHF1ZXJ5LCAyKSk7XG4gICAgfVxuICB9IEBlbHNlIHtcbiAgICAkbXE6IChtZWRpYTogJyN7JHF1ZXJ5fScpO1xuICB9XG5cbiAgQHJldHVybiAkbXE7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsQUFBQSxJQUFJLEFBQUMsQ0FDSCxnQkFBZ0IsQ0FIUCxJQUFJLENBSWQifQ== */
